aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSrinivas Kandagatla <srinivas.kandagatla@linaro.org>2021-02-15 17:07:52 +0000
committerSrinivas Kandagatla <srinivas.kandagatla@linaro.org>2021-02-16 15:47:15 +0000
commit59fea638c7efcc88a788f091752a769906729a62 (patch)
tree09214676b736ce872aa55dea843cd5d840758ac8
parent2b80d0f35fd71669ee88eb96e4a973a746ec812d (diff)
soundwire: qcom: add wake irq support
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
-rw-r--r--drivers/soundwire/qcom.c37
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",