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

Commit a0696088 authored by Deepak Katragadda's avatar Deepak Katragadda
Browse files

msm: pil: Enable/disable irq's on subsystem powerup/shutdown



The current implementation enables most IRQs when the subsystems
are registered.

This change disables these irqs for a subsystem when it is being
shutdown and enables them again on powering up. This way, we do
not need to worry about multiple interrupts during a subsystem
restart or having to deal with spurious interrupts when a subsystem
is already shutdown.

Change-Id: I2768e4efc13688ed43b80ded8a5eef98d9d6bf06
Signed-off-by: default avatarDeepak Katragadda <dkatraga@codeaurora.org>
parent c99f9b85
Loading
Loading
Loading
Loading
+0 −2
Original line number Original line Diff line number Diff line
@@ -350,7 +350,6 @@ static int wcnss_shutdown(const struct subsys_desc *subsys, bool force_stop)
{
{
	struct pronto_data *drv = subsys_to_drv(subsys);
	struct pronto_data *drv = subsys_to_drv(subsys);


	disable_irq(drv->subsys_desc.wdog_bite_irq);
	pil_shutdown(&drv->desc);
	pil_shutdown(&drv->desc);
	return 0;
	return 0;
}
}
@@ -365,7 +364,6 @@ static int wcnss_powerup(const struct subsys_desc *subsys)
		return ret;
		return ret;


	drv->restart_inprogress = false;
	drv->restart_inprogress = false;
	enable_irq(drv->subsys_desc.wdog_bite_irq);
	return ret;
	return ret;
}
}


+0 −2
Original line number Original line Diff line number Diff line
@@ -338,7 +338,6 @@ static int adsp_shutdown(const struct subsys_desc *subsys, bool force_stop)
		mb();
		mb();
	}
	}
	pil_shutdown(&drv->q6->desc);
	pil_shutdown(&drv->q6->desc);
	disable_irq(drv->subsys_desc.wdog_bite_irq);


	pr_debug("ADSP is Down\n");
	pr_debug("ADSP is Down\n");
	adsp_set_state("OFFLINE");
	adsp_set_state("OFFLINE");
@@ -350,7 +349,6 @@ static int adsp_powerup(const struct subsys_desc *subsys)
	struct lpass_data *drv = subsys_to_lpass(subsys);
	struct lpass_data *drv = subsys_to_lpass(subsys);
	int ret = 0;
	int ret = 0;
	ret = pil_boot(&drv->q6->desc);
	ret = pil_boot(&drv->q6->desc);
	enable_irq(drv->subsys_desc.wdog_bite_irq);


	pr_debug("ADSP is back online\n");
	pr_debug("ADSP is back online\n");
	adsp_set_state("ONLINE");
	adsp_set_state("ONLINE");
+2 −2
Original line number Original line Diff line number Diff line
@@ -127,7 +127,7 @@ static int modem_shutdown(const struct subsys_desc *subsys, bool force_stop)


	pil_shutdown(&drv->mba->desc);
	pil_shutdown(&drv->mba->desc);
	pil_shutdown(&drv->q6->desc);
	pil_shutdown(&drv->q6->desc);
	disable_irq(drv->subsys_desc.wdog_bite_irq);

	return 0;
	return 0;
}
}


@@ -151,7 +151,7 @@ static int modem_powerup(const struct subsys_desc *subsys)
	ret = pil_boot(&drv->mba->desc);
	ret = pil_boot(&drv->mba->desc);
	if (ret)
	if (ret)
		pil_shutdown(&drv->q6->desc);
		pil_shutdown(&drv->q6->desc);
	enable_irq(drv->subsys_desc.wdog_bite_irq);

	return ret;
	return ret;
}
}


+33 −0
Original line number Original line Diff line number Diff line
@@ -421,6 +421,30 @@ static void notify_each_subsys_device(struct subsys_device **list,
	}
	}
}
}


static void enable_all_irqs(struct subsys_device *dev)
{
	if (dev->desc->err_ready_irq)
		enable_irq(dev->desc->err_ready_irq);
	if (dev->desc->wdog_bite_irq && dev->desc->wdog_bite_handler)
		enable_irq(dev->desc->wdog_bite_irq);
	if (dev->desc->err_fatal_irq && dev->desc->err_fatal_handler)
		enable_irq(dev->desc->err_fatal_irq);
	if (dev->desc->stop_ack_irq && dev->desc->stop_ack_handler)
		enable_irq(dev->desc->stop_ack_irq);
}

static void disable_all_irqs(struct subsys_device *dev)
{
	if (dev->desc->err_ready_irq)
		disable_irq(dev->desc->err_ready_irq);
	if (dev->desc->wdog_bite_irq && dev->desc->wdog_bite_handler)
		disable_irq(dev->desc->wdog_bite_irq);
	if (dev->desc->err_fatal_irq && dev->desc->err_fatal_handler)
		disable_irq(dev->desc->err_fatal_irq);
	if (dev->desc->stop_ack_irq && dev->desc->stop_ack_handler)
		disable_irq(dev->desc->stop_ack_irq);
}

static int wait_for_err_ready(struct subsys_device *subsys)
static int wait_for_err_ready(struct subsys_device *subsys)
{
{
	int ret;
	int ret;
@@ -447,6 +471,7 @@ static void subsystem_shutdown(struct subsys_device *dev, void *data)
		panic("subsys-restart: [%p]: Failed to shutdown %s!",
		panic("subsys-restart: [%p]: Failed to shutdown %s!",
			current, name);
			current, name);
	subsys_set_state(dev, SUBSYS_OFFLINE);
	subsys_set_state(dev, SUBSYS_OFFLINE);
	disable_all_irqs(dev);
}
}


static void subsystem_ramdump(struct subsys_device *dev, void *data)
static void subsystem_ramdump(struct subsys_device *dev, void *data)
@@ -466,8 +491,10 @@ static void subsystem_powerup(struct subsys_device *dev, void *data)


	pr_info("[%p]: Powering up %s\n", current, name);
	pr_info("[%p]: Powering up %s\n", current, name);
	init_completion(&dev->err_ready);
	init_completion(&dev->err_ready);

	if (dev->desc->powerup(dev->desc) < 0)
	if (dev->desc->powerup(dev->desc) < 0)
		panic("[%p]: Powerup error: %s!", current, name);
		panic("[%p]: Powerup error: %s!", current, name);
	enable_all_irqs(dev);


	ret = wait_for_err_ready(dev);
	ret = wait_for_err_ready(dev);
	if (ret)
	if (ret)
@@ -505,6 +532,7 @@ static int subsys_start(struct subsys_device *subsys)
	ret = subsys->desc->powerup(subsys->desc);
	ret = subsys->desc->powerup(subsys->desc);
	if (ret)
	if (ret)
		return ret;
		return ret;
	enable_all_irqs(subsys);


	if (subsys->desc->is_not_loadable) {
	if (subsys->desc->is_not_loadable) {
		subsys_set_state(subsys, SUBSYS_ONLINE);
		subsys_set_state(subsys, SUBSYS_ONLINE);
@@ -517,6 +545,7 @@ static int subsys_start(struct subsys_device *subsys)
		 * the device because error ready timed out.
		 * the device because error ready timed out.
		 */
		 */
		subsys->desc->shutdown(subsys->desc, false);
		subsys->desc->shutdown(subsys->desc, false);
		disable_all_irqs(subsys);
		return ret;
		return ret;
	} else {
	} else {
		subsys_set_state(subsys, SUBSYS_ONLINE);
		subsys_set_state(subsys, SUBSYS_ONLINE);
@@ -532,6 +561,7 @@ static void subsys_stop(struct subsys_device *subsys)
	notify_each_subsys_device(&subsys, 1, SUBSYS_BEFORE_SHUTDOWN, NULL);
	notify_each_subsys_device(&subsys, 1, SUBSYS_BEFORE_SHUTDOWN, NULL);
	subsys->desc->shutdown(subsys->desc, false);
	subsys->desc->shutdown(subsys->desc, false);
	subsys_set_state(subsys, SUBSYS_OFFLINE);
	subsys_set_state(subsys, SUBSYS_OFFLINE);
	disable_all_irqs(subsys);
	notify_each_subsys_device(&subsys, 1, SUBSYS_AFTER_SHUTDOWN, NULL);
	notify_each_subsys_device(&subsys, 1, SUBSYS_AFTER_SHUTDOWN, NULL);
}
}


@@ -1083,6 +1113,7 @@ static int subsys_setup_irqs(struct subsys_device *subsys)
				desc->name, ret);
				desc->name, ret);
			return ret;
			return ret;
		}
		}
		disable_irq(desc->err_fatal_irq);
	}
	}


	if (desc->stop_ack_irq && desc->stop_ack_handler) {
	if (desc->stop_ack_irq && desc->stop_ack_handler) {
@@ -1094,6 +1125,7 @@ static int subsys_setup_irqs(struct subsys_device *subsys)
				desc->name, ret);
				desc->name, ret);
			return ret;
			return ret;
		}
		}
		disable_irq(desc->stop_ack_irq);
	}
	}


	if (desc->wdog_bite_irq && desc->wdog_bite_handler) {
	if (desc->wdog_bite_irq && desc->wdog_bite_handler) {
@@ -1120,6 +1152,7 @@ static int subsys_setup_irqs(struct subsys_device *subsys)
				desc->name);
				desc->name);
			return ret;
			return ret;
		}
		}
		disable_irq(desc->err_ready_irq);
	}
	}


	return 0;
	return 0;