Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit fa66d014 authored by Satya Durga Srinivasu Prabhala's avatar Satya Durga Srinivasu Prabhala Committed by Gerrit - the friendly Code Review server
Browse files

soc: qcom: pil-loaders: move pil loading of ADSP & SLPI to workqueue



When pil loading done through user space helper, there is a possibility
that signal could be pending on thread that initiated the pil, which would
lead to pil failure. To avoid this issue, move pil loading for ADSP and
SLPI to separate workqueue in respective loader drivers.

Change-Id: Ie60a7eba7c52ac1565ce166d0e367379cce0b03e
Signed-off-by: default avatarSatya Durga Srinivasu Prabhala <satyap@codeaurora.org>
Signed-off-by: default avatarSwetha Chikkaboraiah <schikk@codeaurora.org>
parent cefbc175
Loading
Loading
Loading
Loading
+14 −3
Original line number Diff line number Diff line
/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved.
/* Copyright (c) 2012-2017, The Linux Foundation. All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 and
@@ -26,6 +26,8 @@
#include <linux/err.h>
#include <linux/delay.h>
#include <linux/sysfs.h>
#include <linux/workqueue.h>

#include <soc/qcom/subsystem_restart.h>

#define IMAGE_LOAD_CMD 1
@@ -110,10 +112,11 @@ static struct attribute *attrs[] = {
};

static struct platform_device *slpi_private;
static struct work_struct slpi_ldr_work;

static void slpi_loader_do(struct platform_device *pdev)
static void slpi_load_fw(struct work_struct *slpi_ldr_work)
{

	struct platform_device *pdev = slpi_private;
	struct slpi_loader_private *priv = NULL;

	if (!pdev) {
@@ -148,6 +151,12 @@ fail:
	dev_err(&pdev->dev, "%s: SLPI image loading failed\n", __func__);
}

static void slpi_loader_do(struct platform_device *pdev)
{
	dev_info(&pdev->dev, "%s: scheduling work to load SLPI fw\n", __func__);
	schedule_work(&slpi_ldr_work);
}

static void slpi_loader_unload(struct platform_device *pdev)
{
	struct slpi_loader_private *priv = NULL;
@@ -426,6 +435,8 @@ static int sensors_ssc_probe(struct platform_device *pdev)
		goto cdev_add_err;
	}

	INIT_WORK(&slpi_ldr_work, slpi_load_fw);

	return 0;

cdev_add_err:
+14 −3
Original line number Diff line number Diff line
/*
 * Copyright (c) 2012-2014,2016 The Linux Foundation. All rights reserved.
 * Copyright (c) 2012-2014, 2016,
 * 2017, The Linux Foundation. All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 and
@@ -20,6 +21,8 @@
#include <linux/qdsp6v2/apr.h>
#include <linux/of_device.h>
#include <linux/sysfs.h>
#include <linux/workqueue.h>

#include <soc/qcom/subsystem_restart.h>

#define Q6_PIL_GET_DELAY_MS 100
@@ -44,12 +47,13 @@ static struct attribute *attrs[] = {
	NULL,
};

static struct work_struct adsp_ldr_work;
static struct platform_device *adsp_private;
static void adsp_loader_unload(struct platform_device *pdev);

static void adsp_loader_do(struct platform_device *pdev)
static void adsp_load_fw(struct work_struct *adsp_ldr_work)
{

	struct platform_device *pdev = adsp_private;
	struct adsp_loader_private *priv = NULL;

	const char *adsp_dt = "qcom,adsp-state";
@@ -146,6 +150,11 @@ fail:
	return;
}

static void adsp_loader_do(struct platform_device *pdev)
{
	dev_info(&pdev->dev, "%s: scheduling work to load ADSP fw\n", __func__);
	schedule_work(&adsp_ldr_work);
}

static ssize_t adsp_boot_store(struct kobject *kobj,
	struct kobj_attribute *attr,
@@ -270,6 +279,8 @@ static int adsp_loader_probe(struct platform_device *pdev)
		return ret;
	}

	INIT_WORK(&adsp_ldr_work, adsp_load_fw);

	return 0;
}