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

Commit 718a8e49 authored by Kyle Yan's avatar Kyle Yan Committed by Gerrit - the friendly Code Review server
Browse files

Merge "soc: qcom: Check err_ready before returning from subsys_generic_handler()" into msm-4.8

parents 53a726ed 557f5290
Loading
Loading
Loading
Loading
+23 −18
Original line number Diff line number Diff line
@@ -917,7 +917,7 @@ static irqreturn_t subsys_stop_ack_intr_handler(int irq, void *dev_id)
	return IRQ_HANDLED;
}

static void check_pbl_done(struct pil_tz_data *d)
static void clear_pbl_done(struct pil_tz_data *d)
{
	uint32_t err_value;

@@ -944,17 +944,18 @@ static void check_pbl_done(struct pil_tz_data *d)
	__raw_writel(BIT(d->bits_arr[PBL_DONE]), d->irq_clear);
}

static void check_err_ready(struct pil_tz_data *d)
static void clear_err_ready(struct pil_tz_data *d)
{
	uint32_t err_value;

	err_value =  __raw_readl(d->err_status_spare);
	if (!err_value) {
		pr_debug("Subsystem error services up received from %s!\n",
	pr_debug("Subsystem error services up received from %s\n",
							d->subsys_desc.name);
	__raw_writel(BIT(d->bits_arr[ERR_READY]), d->irq_clear);
	complete_err_ready(d->subsys);
	} else if (err_value == 0x44554d50) {
}

static void clear_wdog(struct pil_tz_data *d)
{
	/* Check crash status to know if device is restarting*/
	if (!subsys_get_crash_status(d->subsys)) {
		pr_err("wdog bite received from %s!\n", d->subsys_desc.name);
		__raw_writel(BIT(d->bits_arr[ERR_READY]), d->irq_clear);
		subsys_set_crash_status(d->subsys, true);
@@ -966,17 +967,21 @@ static void check_err_ready(struct pil_tz_data *d)
static irqreturn_t subsys_generic_handler(int irq, void *dev_id)
{
	struct pil_tz_data *d = subsys_to_data(dev_id);
	uint32_t status_val;

	if (subsys_get_crash_status(d->subsys))
		return IRQ_HANDLED;
	uint32_t status_val, err_value;

	err_value =  __raw_readl(d->err_status_spare);
	status_val = __raw_readl(d->irq_status);

	if (status_val & BIT(d->bits_arr[ERR_READY]))
		check_err_ready(d);
	else if (status_val & BIT(d->bits_arr[PBL_DONE]))
		check_pbl_done(d);
	if ((status_val & BIT(d->bits_arr[ERR_READY])) && !err_value)
		clear_err_ready(d);

	if ((status_val & BIT(d->bits_arr[ERR_READY])) &&
					err_value == 0x44554d50)
		clear_wdog(d);

	if (status_val & BIT(d->bits_arr[PBL_DONE]))
		clear_pbl_done(d);

	return IRQ_HANDLED;
}