diff options
author | Srinivas Kandagatla <srinivas.kandagatla@linaro.org> | 2021-02-15 17:07:52 +0000 |
---|---|---|
committer | Srinivas Kandagatla <srinivas.kandagatla@linaro.org> | 2021-02-16 15:47:15 +0000 |
commit | 59fea638c7efcc88a788f091752a769906729a62 (patch) | |
tree | 09214676b736ce872aa55dea843cd5d840758ac8 | |
parent | 2b80d0f35fd71669ee88eb96e4a973a746ec812d (diff) |
soundwire: qcom: add wake irq support
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
-rw-r--r-- | drivers/soundwire/qcom.c | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/drivers/soundwire/qcom.c b/drivers/soundwire/qcom.c index 5be8ee445c742..7777da7545e32 100644 --- a/drivers/soundwire/qcom.c +++ b/drivers/soundwire/qcom.c @@ -127,6 +127,7 @@ struct qcom_swrm_ctrl { u8 wr_cmd_id; u8 rd_cmd_id; int irq; + int wake_irq; u8 version_major; u8 version_minor; u8 version_step; @@ -435,6 +436,25 @@ static void qcom_swrm_get_device_status(struct qcom_swrm_ctrl *ctrl) } } +static irqreturn_t qcom_swrm_wake_irq_handler(int irq, void *dev_id) +{ + struct qcom_swrm_ctrl *swrm = dev_id; + int ret = IRQ_HANDLED; + + if (swrm->wake_irq > 0) { + if (unlikely(!irq_get_irq_data(swrm->wake_irq))) { + pr_err("%s: irq data is NULL\n", __func__); + return IRQ_NONE; + } + if (!irqd_irq_disabled( + irq_get_irq_data(swrm->wake_irq))) + disable_irq_nosync(swrm->wake_irq); + } + + return ret; +} + + static irqreturn_t qcom_swrm_irq_handler(int irq, void *dev_id) { struct qcom_swrm_ctrl *swrm = dev_id; @@ -1220,6 +1240,23 @@ static int qcom_swrm_probe(struct platform_device *pdev) goto err_clk; } + ctrl->wake_irq = of_irq_get(dev->of_node, 1); + if (ctrl->wake_irq < 0) { + dev_err(dev, "No wake irq\n"); + } else { + ret = devm_request_threaded_irq(dev, ctrl->wake_irq, NULL, + qcom_swrm_wake_irq_handler, + IRQF_TRIGGER_HIGH | + IRQF_ONESHOT, + "swr_wake_irq", ctrl); + if (ret) { + dev_err(dev, "Failed to request soundwire wake irq\n"); + goto err_init; + } + disable_irq_nosync(ctrl->wake_irq); + } + + ret = sdw_bus_master_add(&ctrl->bus, dev, dev->fwnode); if (ret) { dev_err(dev, "Failed to register Soundwire controller (%d)\n", |