From nobody Tue Jun 23 23:43:20 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 6A8E0C433F5 for ; Thu, 24 Feb 2022 13:31:51 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234993AbiBXNcS (ORCPT ); Thu, 24 Feb 2022 08:32:18 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47534 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234974AbiBXNcN (ORCPT ); Thu, 24 Feb 2022 08:32:13 -0500 Received: from mail-wr1-x42b.google.com (mail-wr1-x42b.google.com [IPv6:2a00:1450:4864:20::42b]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D620B29825 for ; Thu, 24 Feb 2022 05:31:42 -0800 (PST) Received: by mail-wr1-x42b.google.com with SMTP id s13so3068696wrb.6 for ; Thu, 24 Feb 2022 05:31:42 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=f6LhfPN/SlOriyUCx5aiYoAtJnBZB9YS0GDCnHT6f88=; b=EfdhZXTEGqY1j92s5JYbuFYEn91qdFGhaA46MqbZjZp9mzNAT1OMXzHKhfDqV05yV0 uCuCBgS7G8mSrjNVL74V7Y3Bh01ayomtmVO/lxHub3IdItKh9q93BajdGyZWgkcYUtCo sZz5ak3OWcChl8Y99qU0smTYsjchB+/BnhEEv/GAmwq5NFS377BPMA/d/XIx2juyRtIk StDnsm5t84Q8/n1Q+DzLn6cPQGqavzjbnYmf0CVOwr4TIK8NsFdxa3MXVpqWr/GiXSIR Ancgac0hiprCiS89g7MoolC0qVPpfqFuqwT9X57kJBgRiAif4DQLuTYhor0uCB96/bVJ XEJQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=f6LhfPN/SlOriyUCx5aiYoAtJnBZB9YS0GDCnHT6f88=; b=xVVqw1JyKFxW2+y6NUeyQwAk4dxwTM9DU5Qun0hxn/HJTaHyAkv00E60J6F0d3Ue01 4QJUzVHGNeG+vTRQKGaMptqfCl/U01vYWdDyTKL7lOFjOPd/YysYHlv/93BYFV8UNcio mEy5xBCqCd5aCoFFZ4R7AgFLAr67xBRu2gUEpl56egpeY3x1ZYQZLdIR6cAUx2+duafw UXgRUThdOmIFsDMTofnsikSCe+DLcE26dGeX75Ab7PLdNvp0WXR+moP38gxpdhvexwfk wcbdSoTYr2Ys6MZgh1gaNOi8H6+MpNZLY5J3Mx+Ca4GUpcLU3t7Rh2zeGlMIu7P8rhD2 JfRg== X-Gm-Message-State: AOAM5321/eyLKdTWJI/+tML7CXi8SPiJa8rwqsRMC4D+3rioeHJLSskT l7sQNgVZIQdpRRctDZuFOOk5DA== X-Google-Smtp-Source: ABdhPJzqdDrMGga4YXRiYQAa+nqP28LY06kj5k8ZXC3G38EGYBbrjixS3jW+OajRPpeIxjgp5yZk2w== X-Received: by 2002:a5d:4d4a:0:b0:1ec:fab3:61bb with SMTP id a10-20020a5d4d4a000000b001ecfab361bbmr433380wru.50.1645709501377; Thu, 24 Feb 2022 05:31:41 -0800 (PST) Received: from srini-hackbox.lan (cpc90716-aztw32-2-0-cust825.18-1.cable.virginm.net. [86.26.103.58]) by smtp.gmail.com with ESMTPSA id e33-20020a05600c4ba100b003810c690ba2sm2019142wmp.3.2022.02.24.05.31.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 24 Feb 2022 05:31:40 -0800 (PST) From: Srinivas Kandagatla To: robh+dt@kernel.org, vkoul@kernel.org, yung-chuan.liao@linux.intel.com Cc: pierre-louis.bossart@linux.intel.com, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, alsa-devel@alsa-project.org, quic_srivasam@quicinc.com, Srinivas Kandagatla Subject: [PATCH v2 1/3] soundwire: qcom: add runtime pm support Date: Thu, 24 Feb 2022 13:31:23 +0000 Message-Id: <20220224133125.6674-2-srinivas.kandagatla@linaro.org> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20220224133125.6674-1-srinivas.kandagatla@linaro.org> References: <20220224133125.6674-1-srinivas.kandagatla@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Add support to runtime PM using SoundWire clock stop Mode0 on supported controller instances and soft reset on instances that do not support clock stop. Signed-off-by: Srinivas Kandagatla --- drivers/soundwire/qcom.c | 152 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 151 insertions(+), 1 deletion(-) diff --git a/drivers/soundwire/qcom.c b/drivers/soundwire/qcom.c index 54813417ef8e..2c763a9f088f 100644 --- a/drivers/soundwire/qcom.c +++ b/drivers/soundwire/qcom.c @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #include @@ -20,6 +21,9 @@ #include #include "bus.h" =20 +#define SWRM_COMP_SW_RESET 0x008 +#define SWRM_COMP_STATUS 0x014 +#define SWRM_FRM_GEN_ENABLED BIT(0) #define SWRM_COMP_HW_VERSION 0x00 #define SWRM_COMP_CFG_ADDR 0x04 #define SWRM_COMP_CFG_IRQ_LEVEL_OR_PULSE_MSK BIT(1) @@ -29,6 +33,7 @@ #define SWRM_COMP_PARAMS_RD_FIFO_DEPTH GENMASK(19, 15) #define SWRM_COMP_PARAMS_DOUT_PORTS_MASK GENMASK(4, 0) #define SWRM_COMP_PARAMS_DIN_PORTS_MASK GENMASK(9, 5) +#define SWRM_COMP_MASTER_ID 0x104 #define SWRM_INTERRUPT_STATUS 0x200 #define SWRM_INTERRUPT_STATUS_RMSK GENMASK(16, 0) #define SWRM_INTERRUPT_STATUS_SLAVE_PEND_IRQ BIT(0) @@ -111,6 +116,13 @@ #define SWR_MAX_CMD_ID 14 #define MAX_FIFO_RD_RETRY 3 #define SWR_OVERFLOW_RETRY_COUNT 30 +#define SWRM_LINK_STATUS_RETRY_CNT 100 + +enum { + MASTER_ID_WSA =3D 1, + MASTER_ID_RX, + MASTER_ID_TX +}; =20 struct qcom_swrm_port_config { u8 si; @@ -159,6 +171,7 @@ struct qcom_swrm_ctrl { u32 slave_status; u32 wr_fifo_depth; u32 rd_fifo_depth; + bool clock_stop_not_supported; }; =20 struct qcom_swrm_data { @@ -497,6 +510,7 @@ static irqreturn_t qcom_swrm_irq_handler(int irq, void = *dev_id) u32 i; int devnum; int ret =3D IRQ_HANDLED; + clk_prepare_enable(swrm->hclk); =20 swrm->reg_read(swrm, SWRM_INTERRUPT_STATUS, &intr_sts); intr_sts_masked =3D intr_sts & swrm->intr_mask; @@ -604,6 +618,7 @@ static irqreturn_t qcom_swrm_irq_handler(int irq, void = *dev_id) intr_sts_masked =3D intr_sts & swrm->intr_mask; } while (intr_sts_masked); =20 + clk_disable_unprepare(swrm->hclk); return ret; } =20 @@ -1017,6 +1032,15 @@ static int qcom_swrm_startup(struct snd_pcm_substrea= m *substream, struct snd_soc_dai *codec_dai; int ret, i; =20 + ret =3D pm_runtime_get_sync(ctrl->dev); + if (ret < 0 && ret !=3D -EACCES) { + dev_err_ratelimited(ctrl->dev, + "pm_runtime_get_sync failed in %s, ret %d\n", + __func__, ret); + pm_runtime_put_noidle(ctrl->dev); + return ret; + } + sruntime =3D sdw_alloc_stream(dai->name); if (!sruntime) return -ENOMEM; @@ -1044,6 +1068,9 @@ static void qcom_swrm_shutdown(struct snd_pcm_substre= am *substream, =20 sdw_release_stream(ctrl->sruntime[dai->id]); ctrl->sruntime[dai->id] =3D NULL; + pm_runtime_mark_last_busy(ctrl->dev); + pm_runtime_put_autosuspend(ctrl->dev); + } =20 static const struct snd_soc_dai_ops qcom_swrm_pdm_dai_ops =3D { @@ -1197,12 +1224,23 @@ static int qcom_swrm_get_port_config(struct qcom_sw= rm_ctrl *ctrl) static int swrm_reg_show(struct seq_file *s_file, void *data) { struct qcom_swrm_ctrl *swrm =3D s_file->private; - int reg, reg_val; + int reg, reg_val, ret; + + ret =3D pm_runtime_get_sync(swrm->dev); + if (ret < 0 && ret !=3D -EACCES) { + dev_err_ratelimited(swrm->dev, + "pm_runtime_get_sync failed in %s, ret %d\n", + __func__, ret); + pm_runtime_put_noidle(swrm->dev); + } =20 for (reg =3D 0; reg <=3D SWR_MSTR_MAX_REG_ADDR; reg +=3D 4) { swrm->reg_read(swrm, reg, ®_val); seq_printf(s_file, "0x%.3x: 0x%.2x\n", reg, reg_val); } + pm_runtime_mark_last_busy(swrm->dev); + pm_runtime_put_autosuspend(swrm->dev); + =20 return 0; } @@ -1267,6 +1305,7 @@ static int qcom_swrm_probe(struct platform_device *pd= ev) ctrl->bus.ops =3D &qcom_swrm_ops; ctrl->bus.port_ops =3D &qcom_swrm_port_ops; ctrl->bus.compute_params =3D &qcom_swrm_compute_params; + ctrl->bus.clk_stop_timeout =3D 300; =20 ret =3D qcom_swrm_get_port_config(ctrl); if (ret) @@ -1319,6 +1358,21 @@ static int qcom_swrm_probe(struct platform_device *p= dev) (ctrl->version >> 24) & 0xff, (ctrl->version >> 16) & 0xff, ctrl->version & 0xffff); =20 + pm_runtime_set_autosuspend_delay(dev, 3000); + pm_runtime_use_autosuspend(dev); + pm_runtime_mark_last_busy(dev); + pm_runtime_set_active(dev); + pm_runtime_enable(dev); + + /* Clk stop is not supported on WSA Soundwire masters */ + if (ctrl->version <=3D 0x01030000) { + ctrl->clock_stop_not_supported =3D true; + } else { + ctrl->reg_read(ctrl, SWRM_COMP_MASTER_ID, &val); + if (val =3D=3D MASTER_ID_WSA) + ctrl->clock_stop_not_supported =3D true; + } + #ifdef CONFIG_DEBUG_FS ctrl->debugfs =3D debugfs_create_dir("qualcomm-sdw", ctrl->bus.debugfs); debugfs_create_file("qualcomm-registers", 0400, ctrl->debugfs, ctrl, @@ -1345,6 +1399,101 @@ static int qcom_swrm_remove(struct platform_device = *pdev) return 0; } =20 +static bool swrm_wait_for_frame_gen_enabled(struct qcom_swrm_ctrl *swrm) +{ + int retry =3D SWRM_LINK_STATUS_RETRY_CNT; + int comp_sts; + + do { + swrm->reg_read(swrm, SWRM_COMP_STATUS, &comp_sts); + + if (comp_sts & SWRM_FRM_GEN_ENABLED) + return true; + + usleep_range(500, 510); + } while (retry--); + + dev_err(swrm->dev, "%s: link status not %s\n", __func__, + comp_sts && SWRM_FRM_GEN_ENABLED ? "connected" : "disconnected"); + + return false; +} + +static int swrm_runtime_resume(struct device *dev) +{ + struct qcom_swrm_ctrl *ctrl =3D dev_get_drvdata(dev); + int ret; + + clk_prepare_enable(ctrl->hclk); + + if (ctrl->clock_stop_not_supported) { + reinit_completion(&ctrl->enumeration); + ctrl->reg_write(ctrl, SWRM_COMP_SW_RESET, 0x01); + usleep_range(100, 105); + qcom_swrm_init(ctrl); + /* wait for hw enumeration to complete */ + wait_for_completion_timeout(&ctrl->enumeration, + msecs_to_jiffies(TIMEOUT_MS)); + qcom_swrm_get_device_status(ctrl); + sdw_handle_slave_status(&ctrl->bus, ctrl->status); + } else { + ctrl->reg_write(ctrl, SWRM_MCP_BUS_CTRL, SWRM_MCP_BUS_CLK_START); + ctrl->reg_write(ctrl, SWRM_INTERRUPT_CLEAR, + SWRM_INTERRUPT_STATUS_MASTER_CLASH_DET); + + ctrl->intr_mask |=3D SWRM_INTERRUPT_STATUS_MASTER_CLASH_DET; + ctrl->reg_write(ctrl, SWRM_INTERRUPT_MASK_ADDR, ctrl->intr_mask); + ctrl->reg_write(ctrl, SWRM_INTERRUPT_CPU_EN, ctrl->intr_mask); + + usleep_range(100, 105); + } + + if (!swrm_wait_for_frame_gen_enabled(ctrl)) + dev_err(ctrl->dev, "link failed to connect\n"); + + usleep_range(300, 305); + ret =3D sdw_bus_exit_clk_stop(&ctrl->bus); + if (ret < 0) + dev_err(ctrl->dev, "bus failed to exit clock stop %d\n", ret); + + return 0; +} + +static int __maybe_unused swrm_runtime_suspend(struct device *dev) +{ + struct qcom_swrm_ctrl *ctrl =3D dev_get_drvdata(dev); + int ret; + + if (!ctrl->clock_stop_not_supported) { + /* Mask bus clash interrupt */ + ctrl->intr_mask &=3D ~SWRM_INTERRUPT_STATUS_MASTER_CLASH_DET; + ctrl->reg_write(ctrl, SWRM_INTERRUPT_MASK_ADDR, ctrl->intr_mask); + ctrl->reg_write(ctrl, SWRM_INTERRUPT_CPU_EN, ctrl->intr_mask); + } + /* Prepare slaves for clock stop */ + ret =3D sdw_bus_prep_clk_stop(&ctrl->bus); + if (ret < 0) { + dev_err(dev, "prepare clock stop failed %d", ret); + return ret; + } + + ret =3D sdw_bus_clk_stop(&ctrl->bus); + if (ret < 0 && ret !=3D -ENODATA) { + dev_err(dev, "bus clock stop failed %d", ret); + return ret; + } + + clk_disable_unprepare(ctrl->hclk); + + usleep_range(300, 305); + + return 0; +} + +static const struct dev_pm_ops swrm_dev_pm_ops =3D { + SET_RUNTIME_PM_OPS(swrm_runtime_suspend, swrm_runtime_resume, NULL) +}; + static const struct of_device_id qcom_swrm_of_match[] =3D { { .compatible =3D "qcom,soundwire-v1.3.0", .data =3D &swrm_v1_3_data }, { .compatible =3D "qcom,soundwire-v1.5.1", .data =3D &swrm_v1_5_data }, @@ -1359,6 +1508,7 @@ static struct platform_driver qcom_swrm_driver =3D { .driver =3D { .name =3D "qcom-soundwire", .of_match_table =3D qcom_swrm_of_match, + .pm =3D &swrm_dev_pm_ops, } }; module_platform_driver(qcom_swrm_driver); --=20 2.21.0 From nobody Tue Jun 23 23:43:20 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 45919C433EF for ; Thu, 24 Feb 2022 13:31:56 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234998AbiBXNcX (ORCPT ); Thu, 24 Feb 2022 08:32:23 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47616 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234981AbiBXNcO (ORCPT ); Thu, 24 Feb 2022 08:32:14 -0500 Received: from mail-wr1-x433.google.com (mail-wr1-x433.google.com [IPv6:2a00:1450:4864:20::433]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 032A731928 for ; Thu, 24 Feb 2022 05:31:44 -0800 (PST) Received: by mail-wr1-x433.google.com with SMTP id r10so2058290wrp.3 for ; Thu, 24 Feb 2022 05:31:43 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=o+5vqkQXPirAu/1Sjt7YkAPFccDLqMMWnr+8F22imTk=; b=cveEpeC81vvyATlkuSNHZClxmN73VpdpV7cvx4KhuPNSXWLkSePXj8HvRs4Hzk5Xmn 4Osni1BnGxlG/kqDZ/3sSnNKKtA20bo6ofouvDh4jP/B8pBvek21tXUjHYJBbOvf00Zj r6mvOQ9jEaxSzwJDpmHcYbPFUT24PJXftt0abfrKZnNScUbcDFowiikG0aS8qNi9iZvX wv5AMMVVg/71236+PkpaTnBlCc+7tAdhj7bW5uyEtZI2CtkDCdZeas4eb2mjWMDghITx dlW+57qXlU5uCPl5EfZH/R+5rKjlcb8Lwn5YX00zCpbG6goQmD+7WpDkAYX0qlT9xQho reow== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=o+5vqkQXPirAu/1Sjt7YkAPFccDLqMMWnr+8F22imTk=; b=2yTeVIlZ3sLRqKZWFaoICA0AMpU9X8EBq6TA3JNluzpzqQh3gWTLKuQ9Bv91ySApLc OLA51y7C61L+E7whcWf6H1pIIWKuo08ErSrEo+8RP8gI3DcwyPTthDAd8PTjJAJSGPtk HkiXyEnpjGQkeIDSlc+Hym7SM36g1HfaJjuYEnhofufXvp0D5p9OgH50HkW1/uJ6k9ld N+XDWSobqMrbrPVm3kNi1r1GNkWE/p8OAFRwgX9zW5UyRMeyhpdJZwB1SYZeQlyuDivA rD5PbDUpH9OuSH7HoZIUupP1Kra+votvsoi7rUwYarxFo3CHZ09UYHpmimIIF/sGagMa V5kQ== X-Gm-Message-State: AOAM530ug/hamYJUESDGQgi6T7/LkYBJJPkgnWCM+u3t4cFDHuu+JUNB CtgjBQYcoaMeZZdoNP2jGQrHLQ== X-Google-Smtp-Source: ABdhPJy3Isxl3JRAACJsHIBGlKSiYremn17jHDKeNcB+aafXuJygUeIR+72g6AjkXfnX8baSTfP+Jg== X-Received: by 2002:a5d:5252:0:b0:1e3:7f5:8312 with SMTP id k18-20020a5d5252000000b001e307f58312mr2313128wrc.89.1645709502639; Thu, 24 Feb 2022 05:31:42 -0800 (PST) Received: from srini-hackbox.lan (cpc90716-aztw32-2-0-cust825.18-1.cable.virginm.net. [86.26.103.58]) by smtp.gmail.com with ESMTPSA id e33-20020a05600c4ba100b003810c690ba2sm2019142wmp.3.2022.02.24.05.31.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 24 Feb 2022 05:31:42 -0800 (PST) From: Srinivas Kandagatla To: robh+dt@kernel.org, vkoul@kernel.org, yung-chuan.liao@linux.intel.com Cc: pierre-louis.bossart@linux.intel.com, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, alsa-devel@alsa-project.org, quic_srivasam@quicinc.com, Srinivas Kandagatla Subject: [PATCH v2 2/3] dt-bindings: soundwire: qcom: document optional wake irq Date: Thu, 24 Feb 2022 13:31:24 +0000 Message-Id: <20220224133125.6674-3-srinivas.kandagatla@linaro.org> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20220224133125.6674-1-srinivas.kandagatla@linaro.org> References: <20220224133125.6674-1-srinivas.kandagatla@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Wake IRQ is optional interrupt that can be wired up on SoundWire controller instances like RX path along with MBHC(Multi Button Headset connection). Document this in bindings. Signed-off-by: Srinivas Kandagatla --- Documentation/devicetree/bindings/soundwire/qcom,sdw.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Documentation/devicetree/bindings/soundwire/qcom,sdw.txt b/Doc= umentation/devicetree/bindings/soundwire/qcom,sdw.txt index b93a2b3e029d..bade68f429b0 100644 --- a/Documentation/devicetree/bindings/soundwire/qcom,sdw.txt +++ b/Documentation/devicetree/bindings/soundwire/qcom,sdw.txt @@ -22,7 +22,7 @@ board specific bus parameters. - interrupts: Usage: required Value type: - Definition: should specify the SoundWire Controller IRQ + Definition: should specify the SoundWire Controller and optional wake IRQ =20 - clock-names: Usage: required --=20 2.21.0 From nobody Tue Jun 23 23:43:20 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 423BCC433FE for ; Thu, 24 Feb 2022 13:32:01 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235028AbiBXNc2 (ORCPT ); Thu, 24 Feb 2022 08:32:28 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47718 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234989AbiBXNcQ (ORCPT ); Thu, 24 Feb 2022 08:32:16 -0500 Received: from mail-wr1-x42b.google.com (mail-wr1-x42b.google.com [IPv6:2a00:1450:4864:20::42b]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 4F28A34B92 for ; Thu, 24 Feb 2022 05:31:45 -0800 (PST) Received: by mail-wr1-x42b.google.com with SMTP id d3so3089972wrf.1 for ; Thu, 24 Feb 2022 05:31:45 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=eOe0YnAdLFHik7V4l++pHUQcqVB92bCJ4fKDKTqumAI=; b=d3jWz7NM9/ixBCcxoiUKpPidsC8v0hfIQsWzpdfC+4pBY+imxCFSOqqq0RtNqsOIPm bMjX1hp0/EPg3KY5TNxy3Srbo5ts/6mU9Pxpi1cLRuBajCRHjpBYDFtgRQ85nnLiRSOi 1+e5AYWvfQwTROpUGj6H+KIzBPwtSKv1DeU1KvZdnZgg7HBdtujX2ynmNE9fyZUv1Atp hAWwtZziOokMcVvmZsIuOhVi4Q6zcu32p9XnrEMa4TAKgEtmfdBkk+wRJDYROvOHCU9C yinaiGAAhxNInMFlwYjzRzvE/54mZ4aufUuu5coiwfiJSbzUmqtYphDBLHzpdGcU+WBj U0Cg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=eOe0YnAdLFHik7V4l++pHUQcqVB92bCJ4fKDKTqumAI=; b=XCypYhcScI56xcilJ1Up8OrL6kAdJWl+2AatWJ5rYZ2718R1oviVLtnC1CfTW1YQDY Tl3ywrf8R5q1LY1Qrj951Eq9x9f2oaPutovMFvDjqdgznXsAfZ802Ycv7fjuzwhio6/p tlsvK/jyeBhENvbVkk0IRKdLbhhkyFh75Iw4HlCjqNh2uKrjmYUq61Z9l/b8i8ScAxHS 5jMpi0CI+aPCKud8yg3yZwpMf2XyejAeGZbHZQBVyiwoezDzGskvyWlXeDJi8poGV5FP dR7M0pao0YJhAzCPz/1JtddY2dIrpvdLPLPPcLc/autlXfC4gh1RNaqvpqr8S2cAeJ+g ggXQ== X-Gm-Message-State: AOAM5300zzED1ItUo0m7GzltymyogY4bCY5YblnIZgAbqSQmR+YRMd8k BZwAICiPAeQure+fBJIBNTvIbA== X-Google-Smtp-Source: ABdhPJyxZhsO/2C3JbMTC+G1EMu26FRFHXVbiK+TxK/F2Y5ihVCIuofd5+7GeozbNaaelrqIwQxNBA== X-Received: by 2002:a05:6000:8b:b0:1ee:1c9d:92a0 with SMTP id m11-20020a056000008b00b001ee1c9d92a0mr1414602wrx.677.1645709503861; Thu, 24 Feb 2022 05:31:43 -0800 (PST) Received: from srini-hackbox.lan (cpc90716-aztw32-2-0-cust825.18-1.cable.virginm.net. [86.26.103.58]) by smtp.gmail.com with ESMTPSA id e33-20020a05600c4ba100b003810c690ba2sm2019142wmp.3.2022.02.24.05.31.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 24 Feb 2022 05:31:43 -0800 (PST) From: Srinivas Kandagatla To: robh+dt@kernel.org, vkoul@kernel.org, yung-chuan.liao@linux.intel.com Cc: pierre-louis.bossart@linux.intel.com, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, alsa-devel@alsa-project.org, quic_srivasam@quicinc.com, Srinivas Kandagatla Subject: [PATCH v2 3/3] soundwire: qcom: add in-band wake up interrupt support Date: Thu, 24 Feb 2022 13:31:25 +0000 Message-Id: <20220224133125.6674-4-srinivas.kandagatla@linaro.org> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20220224133125.6674-1-srinivas.kandagatla@linaro.org> References: <20220224133125.6674-1-srinivas.kandagatla@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Some of the Qualcomm SoundWire Controller instances like the ones that are connected to RX path along with Headset connections support Waking up Controller from Low power clock stop state using SoundWire In-band interrup= t. SoundWire Slave on the bus would intiate this by pulling the data line high, during clock stop condition. Add support to this wake up interrupt. Signed-off-by: Srinivas Kandagatla --- drivers/soundwire/qcom.c | 50 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/drivers/soundwire/qcom.c b/drivers/soundwire/qcom.c index 2c763a9f088f..27cfe4e05206 100644 --- a/drivers/soundwire/qcom.c +++ b/drivers/soundwire/qcom.c @@ -14,6 +14,7 @@ #include #include #include +#include #include #include #include @@ -154,6 +155,7 @@ struct qcom_swrm_ctrl { u8 rd_cmd_id; int irq; unsigned int version; + int wake_irq; int num_din_ports; int num_dout_ports; int cols_index; @@ -503,6 +505,31 @@ static int qcom_swrm_enumerate(struct sdw_bus *bus) return 0; } =20 +static irqreturn_t qcom_swrm_wake_irq_handler(int irq, void *dev_id) +{ + struct qcom_swrm_ctrl *swrm =3D dev_id; + int ret; + + ret =3D pm_runtime_get_sync(swrm->dev); + if (ret < 0 && ret !=3D -EACCES) { + dev_err_ratelimited(swrm->dev, + "pm_runtime_get_sync failed in %s, ret %d\n", + __func__, ret); + pm_runtime_put_noidle(swrm->dev); + } + + if (swrm->wake_irq > 0) { + if (!irqd_irq_disabled(irq_get_irq_data(swrm->wake_irq))) + disable_irq_nosync(swrm->wake_irq); + } + + pm_runtime_mark_last_busy(swrm->dev); + pm_runtime_put_autosuspend(swrm->dev); + + return IRQ_HANDLED; +} + + static irqreturn_t qcom_swrm_irq_handler(int irq, void *dev_id) { struct qcom_swrm_ctrl *swrm =3D dev_id; @@ -1340,6 +1367,19 @@ static int qcom_swrm_probe(struct platform_device *p= dev) goto err_clk; } =20 + ctrl->wake_irq =3D of_irq_get(dev->of_node, 1); + if (ctrl->wake_irq > 0) { + ret =3D 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; + } + } + + ret =3D sdw_bus_master_add(&ctrl->bus, dev, dev->fwnode); if (ret) { dev_err(dev, "Failed to register Soundwire controller (%d)\n", @@ -1424,6 +1464,11 @@ static int swrm_runtime_resume(struct device *dev) struct qcom_swrm_ctrl *ctrl =3D dev_get_drvdata(dev); int ret; =20 + if (ctrl->wake_irq > 0) { + if (!irqd_irq_disabled(irq_get_irq_data(ctrl->wake_irq))) + disable_irq_nosync(ctrl->wake_irq); + } + clk_prepare_enable(ctrl->hclk); =20 if (ctrl->clock_stop_not_supported) { @@ -1487,6 +1532,11 @@ static int __maybe_unused swrm_runtime_suspend(struc= t device *dev) =20 usleep_range(300, 305); =20 + if (ctrl->wake_irq > 0) { + if (irqd_irq_disabled(irq_get_irq_data(ctrl->wake_irq))) + enable_irq(ctrl->wake_irq); + } + return 0; } =20 --=20 2.21.0