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

Commit 35bdbfc5 authored by Chris Lew's avatar Chris Lew
Browse files

soc: qcom: qsee_ipc_irq_bridge: Rearrange parsing property



It is possible to receive an interrupt from QSEE before the character
device is initialized. Do not register for interrupts and subsystem
restart notifications until the character device is initialized.

Change-Id: Ife207f817fd4bd5783c430f16de2a6d56edb9f06
Signed-off-by: default avatarChris Lew <clew@codeaurora.org>
parent e2039f3b
Loading
Loading
Loading
Loading
+33 −19
Original line number Diff line number Diff line
@@ -349,22 +349,41 @@ static irqreturn_t qiib_irq_handler(int irq, void *priv)
 */
static int qiib_parse_node(struct device_node *node, struct qiib_dev *devp)
{
	char *key;
	const char *subsys_name;
	const char *dev_name;
	uint32_t irqtype;
	uint32_t irq_clear[2];
	struct irq_data *irqtype_data;
	int ret = -ENODEV;
	char *key;
	int ret;

	key = "qcom,dev-name";
	ret = of_property_read_string(node, key, &dev_name);
	if (ret) {
		QIIB_ERR("%s: missing key: %s\n", __func__, key);
		goto missing_key;
		return ret;
	}
	QIIB_DBG("%s: %s = %s\n", __func__, key, dev_name);

	key = "label";
	ret = of_property_read_string(node, key, &subsys_name);
	if (ret) {
		QIIB_ERR("%s: missing key: %s\n", __func__, key);
		return ret;
	}
	QIIB_DBG("%s: %s = %s\n", __func__, key, subsys_name);

	devp->dev_name = dev_name;
	devp->ssr_name = subsys_name;

	return ret;
}

static int qiib_init_notifs(struct device_node *node, struct qiib_dev *devp)
{
	struct irq_data *irqtype_data;
	uint32_t irq_clear[2];
	uint32_t irqtype;
	char *key;
	int ret = -ENODEV;

	key = "interrupts";
	devp->irq_line = irq_of_parse_and_map(node, 0);
	if (!devp->irq_line) {
@@ -381,14 +400,6 @@ static int qiib_parse_node(struct device_node *node, struct qiib_dev *devp)
	irqtype = irqd_get_trigger_type(irqtype_data);
	QIIB_DBG("%s: irqtype = %d\n", __func__, irqtype);

	key = "label";
	ret = of_property_read_string(node, key, &subsys_name);
	if (ret) {
		QIIB_ERR("%s: missing key: %s\n", __func__, key);
		goto missing_key;
	}
	QIIB_DBG("%s: %s = %s\n", __func__, key, subsys_name);

	if (irqtype & IRQF_TRIGGER_HIGH) {
		key = "qcom,rx-irq-clr-mask";
		ret = of_property_read_u32(node, key, &devp->irq_mask);
@@ -417,10 +428,7 @@ static int qiib_parse_node(struct device_node *node, struct qiib_dev *devp)
		}
	}

	devp->dev_name = dev_name;
	devp->ssr_name = subsys_name;
	devp->nb.notifier_call = qiib_restart_notifier_cb;

	devp->notifier_handle = subsys_notif_register_notifier(devp->ssr_name,
								&devp->nb);
	if (IS_ERR_OR_NULL(devp->notifier_handle)) {
@@ -543,7 +551,6 @@ static int qsee_ipc_irq_bridge_probe(struct platform_device *pdev)
		ret = qiib_parse_node(node, devp);
		if (ret) {
			QIIB_ERR("%s:qiib_parse_node failed %d\n", __func__, i);
			kfree(devp);
			goto error;
		}

@@ -551,9 +558,16 @@ static int qsee_ipc_irq_bridge_probe(struct platform_device *pdev)
		if (ret < 0) {
			QIIB_ERR("%s: add [%s] device failed ret=%d\n",
					__func__, devp->dev_name, ret);
			kfree(devp);
			goto error;
		}

		ret = qiib_init_notifs(node, devp);
		if (ret < 0) {
			QIIB_ERR("%s: qiib_init_notifs failed ret=%d\n",
					__func__, ret);
			goto error;
		}

		i++;
	}