[PATCH v2 0/4] soundwire: qcom: add support for mmio soundwire master
This adds initial support for soundwire device on sm8250.
Tested with the "wsa" sdw device, which is simpler than the others.
v2 addresses some feedback, but I kept this series as simple as possible. In particular, I didn't implement CMD_NACKED from FIFO_STATUS, because the downstream driver doesn't define this bit, so I can't implement it. Soundwire works without it and It shouldn't be difficult to implement later.
Jonathan Marek (4): soundwire: qcom: fix abh/ahb typo soundwire: qcom: avoid dependency on CONFIG_SLIMBUS soundwire: qcom: add support for mmio soundwire master devices soundwire: qcom: add v1.5.1 compatible
.../bindings/soundwire/qcom,sdw.txt | 1 + drivers/soundwire/Kconfig | 2 +- drivers/soundwire/qcom.c | 38 +++++++++++++++++-- 3 files changed, 36 insertions(+), 5 deletions(-)
The function name qcom_swrm_abh_reg_read should say ahb, fix that.
Signed-off-by: Jonathan Marek jonathan@marek.ca Reviewed-by: Srinivas Kandagatla srinivas.kandagatla@linaro.org --- drivers/soundwire/qcom.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/soundwire/qcom.c b/drivers/soundwire/qcom.c index 915c2cf0c274..d1e33ef1afac 100644 --- a/drivers/soundwire/qcom.c +++ b/drivers/soundwire/qcom.c @@ -114,7 +114,7 @@ struct qcom_swrm_ctrl {
#define to_qcom_sdw(b) container_of(b, struct qcom_swrm_ctrl, bus)
-static int qcom_swrm_abh_reg_read(struct qcom_swrm_ctrl *ctrl, int reg, +static int qcom_swrm_ahb_reg_read(struct qcom_swrm_ctrl *ctrl, int reg, u32 *val) { struct regmap *wcd_regmap = ctrl->regmap; @@ -754,7 +754,7 @@ static int qcom_swrm_probe(struct platform_device *pdev) return -ENOMEM;
if (dev->parent->bus == &slimbus_bus) { - ctrl->reg_read = qcom_swrm_abh_reg_read; + ctrl->reg_read = qcom_swrm_ahb_reg_read; ctrl->reg_write = qcom_swrm_ahb_reg_write; ctrl->regmap = dev_get_regmap(dev->parent, NULL); if (!ctrl->regmap)
The driver may be used without slimbus, so don't depend on slimbus.
Signed-off-by: Jonathan Marek jonathan@marek.ca --- drivers/soundwire/Kconfig | 2 +- drivers/soundwire/qcom.c | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-)
diff --git a/drivers/soundwire/Kconfig b/drivers/soundwire/Kconfig index fa2b4ab92ed9..f83d02c9c60a 100644 --- a/drivers/soundwire/Kconfig +++ b/drivers/soundwire/Kconfig @@ -33,7 +33,7 @@ config SOUNDWIRE_INTEL
config SOUNDWIRE_QCOM tristate "Qualcomm SoundWire Master driver" - depends on SLIMBUS + imply SLIMBUS depends on SND_SOC help SoundWire Qualcomm Master driver. diff --git a/drivers/soundwire/qcom.c b/drivers/soundwire/qcom.c index d1e33ef1afac..6401ad451eee 100644 --- a/drivers/soundwire/qcom.c +++ b/drivers/soundwire/qcom.c @@ -753,7 +753,11 @@ static int qcom_swrm_probe(struct platform_device *pdev) if (!ctrl) return -ENOMEM;
+#if IS_ENABLED(CONFIG_SLIBMUS) if (dev->parent->bus == &slimbus_bus) { +#else + if (false) { +#endif ctrl->reg_read = qcom_swrm_ahb_reg_read; ctrl->reg_write = qcom_swrm_ahb_reg_write; ctrl->regmap = dev_get_regmap(dev->parent, NULL);
On 9/5/20 12:39 PM, Jonathan Marek wrote:
The driver may be used without slimbus, so don't depend on slimbus.
Signed-off-by: Jonathan Marek jonathan@marek.ca
drivers/soundwire/Kconfig | 2 +- drivers/soundwire/qcom.c | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-)
diff --git a/drivers/soundwire/Kconfig b/drivers/soundwire/Kconfig index fa2b4ab92ed9..f83d02c9c60a 100644 --- a/drivers/soundwire/Kconfig +++ b/drivers/soundwire/Kconfig @@ -33,7 +33,7 @@ config SOUNDWIRE_INTEL
config SOUNDWIRE_QCOM tristate "Qualcomm SoundWire Master driver"
- depends on SLIMBUS
- imply SLIMBUS depends on SND_SOC help SoundWire Qualcomm Master driver.
diff --git a/drivers/soundwire/qcom.c b/drivers/soundwire/qcom.c index d1e33ef1afac..6401ad451eee 100644 --- a/drivers/soundwire/qcom.c +++ b/drivers/soundwire/qcom.c @@ -753,7 +753,11 @@ static int qcom_swrm_probe(struct platform_device *pdev) if (!ctrl) return -ENOMEM;
+#if IS_ENABLED(CONFIG_SLIBMUS)
typo: SLIMBUS.
if (dev->parent->bus == &slimbus_bus) { +#else
- if (false) {
+#endif ctrl->reg_read = qcom_swrm_ahb_reg_read; ctrl->reg_write = qcom_swrm_ahb_reg_write; ctrl->regmap = dev_get_regmap(dev->parent, NULL);
Adds support for qcom soundwire devices with memory mapped IO registers.
Signed-off-by: Jonathan Marek jonathan@marek.ca --- drivers/soundwire/qcom.c | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-)
diff --git a/drivers/soundwire/qcom.c b/drivers/soundwire/qcom.c index 6401ad451eee..ff28794868ca 100644 --- a/drivers/soundwire/qcom.c +++ b/drivers/soundwire/qcom.c @@ -34,6 +34,7 @@ #define SWRM_INTERRUPT_STATUS_SPECIAL_CMD_ID_FINISHED BIT(10) #define SWRM_INTERRUPT_MASK_ADDR 0x204 #define SWRM_INTERRUPT_CLEAR 0x208 +#define SWRM_INTERRUPT_CPU_EN 0x210 #define SWRM_CMD_FIFO_WR_CMD 0x300 #define SWRM_CMD_FIFO_RD_CMD 0x304 #define SWRM_CMD_FIFO_CMD 0x308 @@ -90,6 +91,7 @@ struct qcom_swrm_ctrl { struct sdw_bus bus; struct device *dev; struct regmap *regmap; + void __iomem *mmio; struct completion *comp; struct work_struct slave_work; /* read/write lock */ @@ -154,6 +156,20 @@ static int qcom_swrm_ahb_reg_write(struct qcom_swrm_ctrl *ctrl, return SDW_CMD_OK; }
+static int qcom_swrm_cpu_reg_read(struct qcom_swrm_ctrl *ctrl, int reg, + u32 *val) +{ + *val = readl(ctrl->mmio + reg); + return SDW_CMD_OK; +} + +static int qcom_swrm_cpu_reg_write(struct qcom_swrm_ctrl *ctrl, int reg, + int val) +{ + writel(val, ctrl->mmio + reg); + return SDW_CMD_OK; +} + static int qcom_swrm_cmd_fifo_wr_cmd(struct qcom_swrm_ctrl *ctrl, u8 cmd_data, u8 dev_addr, u16 reg_addr) { @@ -310,6 +326,12 @@ static int qcom_swrm_init(struct qcom_swrm_ctrl *ctrl) ctrl->reg_write(ctrl, SWRM_COMP_CFG_ADDR, SWRM_COMP_CFG_IRQ_LEVEL_OR_PULSE_MSK | SWRM_COMP_CFG_ENABLE_MSK); + + /* enable CPU IRQs */ + if (ctrl->mmio) { + ctrl->reg_write(ctrl, SWRM_INTERRUPT_CPU_EN, + SWRM_INTERRUPT_STATUS_RMSK); + } return 0; }
@@ -764,8 +786,11 @@ static int qcom_swrm_probe(struct platform_device *pdev) if (!ctrl->regmap) return -EINVAL; } else { - /* Only WCD based SoundWire controller is supported */ - return -ENOTSUPP; + ctrl->reg_read = qcom_swrm_cpu_reg_read; + ctrl->reg_write = qcom_swrm_cpu_reg_write; + ctrl->mmio = devm_platform_ioremap_resource(pdev, 0); + if (IS_ERR(ctrl->mmio)) + return PTR_ERR(ctrl->mmio); }
ctrl->irq = of_irq_get(dev->of_node, 0);
@@ -764,8 +786,11 @@ static int qcom_swrm_probe(struct platform_device *pdev) if (!ctrl->regmap) return -EINVAL; } else {
/* Only WCD based SoundWire controller is supported */
return -ENOTSUPP;
ctrl->reg_read = qcom_swrm_cpu_reg_read;
ctrl->reg_write = qcom_swrm_cpu_reg_write;
ctrl->mmio = devm_platform_ioremap_resource(pdev, 0);
if (IS_ERR(ctrl->mmio))
return PTR_ERR(ctrl->mmio);
Shouldn't this be conditional on SLIMBUS being enabled, as done in your patch2?
}
ctrl->irq = of_irq_get(dev->of_node, 0);
On 9/8/20 9:56 AM, Pierre-Louis Bossart wrote:
@@ -764,8 +786,11 @@ static int qcom_swrm_probe(struct platform_device *pdev) if (!ctrl->regmap) return -EINVAL; } else { - /* Only WCD based SoundWire controller is supported */ - return -ENOTSUPP; + ctrl->reg_read = qcom_swrm_cpu_reg_read; + ctrl->reg_write = qcom_swrm_cpu_reg_write; + ctrl->mmio = devm_platform_ioremap_resource(pdev, 0); + if (IS_ERR(ctrl->mmio)) + return PTR_ERR(ctrl->mmio);
Shouldn't this be conditional on SLIMBUS being enabled, as done in your patch2?
No, the case above is the SLIMBUS case. This patch is adding support for the non-SLIMBUS case.
} ctrl->irq = of_irq_get(dev->of_node, 0);
Add a compatible string for HW version v1.5.1 on sm8250 SoCs.
Signed-off-by: Jonathan Marek jonathan@marek.ca --- Documentation/devicetree/bindings/soundwire/qcom,sdw.txt | 1 + drivers/soundwire/qcom.c | 1 + 2 files changed, 2 insertions(+)
diff --git a/Documentation/devicetree/bindings/soundwire/qcom,sdw.txt b/Documentation/devicetree/bindings/soundwire/qcom,sdw.txt index 436547f3b155..b104be131235 100644 --- a/Documentation/devicetree/bindings/soundwire/qcom,sdw.txt +++ b/Documentation/devicetree/bindings/soundwire/qcom,sdw.txt @@ -11,6 +11,7 @@ board specific bus parameters. Example: "qcom,soundwire-v1.3.0" "qcom,soundwire-v1.5.0" + "qcom,soundwire-v1.5.1" "qcom,soundwire-v1.6.0" - reg: Usage: required diff --git a/drivers/soundwire/qcom.c b/drivers/soundwire/qcom.c index ff28794868ca..41dda3b85413 100644 --- a/drivers/soundwire/qcom.c +++ b/drivers/soundwire/qcom.c @@ -888,6 +888,7 @@ static int qcom_swrm_remove(struct platform_device *pdev)
static const struct of_device_id qcom_swrm_of_match[] = { { .compatible = "qcom,soundwire-v1.3.0", }, + { .compatible = "qcom,soundwire-v1.5.1", }, {/* sentinel */}, };
On 05/09/2020 18:39, Jonathan Marek wrote:
This adds initial support for soundwire device on sm8250.
Tested with the "wsa" sdw device, which is simpler than the others.
v2 addresses some feedback, but I kept this series as simple as possible. In particular, I didn't implement CMD_NACKED from FIFO_STATUS, because the downstream driver doesn't define this bit, so I can't implement it. Soundwire works without it and It shouldn't be difficult to implement later.
Jonathan Marek (4): soundwire: qcom: fix abh/ahb typo soundwire: qcom: avoid dependency on CONFIG_SLIMBUS soundwire: qcom: add support for mmio soundwire master devices soundwire: qcom: add v1.5.1 compatible
Hi Jonathan, I have tested these patches on RB5 with WSA8810 and they work fine.
I can try to add support to command ignored in future, but for now these look good to me!
Reviewed-by: Srinivas Kandagatla srinivas.kandagatla@linaro.org Tested-by: Srinivas Kandagatla srinivas.kandagatla@linaro.org
Thanks, srini
.../bindings/soundwire/qcom,sdw.txt | 1 + drivers/soundwire/Kconfig | 2 +- drivers/soundwire/qcom.c | 38 +++++++++++++++++-- 3 files changed, 36 insertions(+), 5 deletions(-)
On 05-09-20, 13:39, Jonathan Marek wrote:
This adds initial support for soundwire device on sm8250.
Tested with the "wsa" sdw device, which is simpler than the others.
v2 addresses some feedback, but I kept this series as simple as possible. In particular, I didn't implement CMD_NACKED from FIFO_STATUS, because the downstream driver doesn't define this bit, so I can't implement it. Soundwire works without it and It shouldn't be difficult to implement later.
Applied all, thanks
participants (4)
-
Jonathan Marek
-
Pierre-Louis Bossart
-
Srinivas Kandagatla
-
Vinod Koul