2020-09-05 17:43:00

by Jonathan Marek

[permalink] [raw]
Subject: [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(-)

--
2.26.1


2020-09-05 17:43:05

by Jonathan Marek

[permalink] [raw]
Subject: [PATCH v2 1/4] soundwire: qcom: fix abh/ahb typo

The function name qcom_swrm_abh_reg_read should say ahb, fix that.

Signed-off-by: Jonathan Marek <[email protected]>
Reviewed-by: Srinivas Kandagatla <[email protected]>
---
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)
--
2.26.1

2020-09-05 17:43:21

by Jonathan Marek

[permalink] [raw]
Subject: [PATCH v2 3/4] soundwire: qcom: add support for mmio soundwire master devices

Adds support for qcom soundwire devices with memory mapped IO registers.

Signed-off-by: Jonathan Marek <[email protected]>
---
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);
--
2.26.1

2020-09-07 08:21:11

by Srinivas Kandagatla

[permalink] [raw]
Subject: Re: [PATCH v2 0/4] soundwire: qcom: add support for mmio soundwire master



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 <[email protected]>
Tested-by: Srinivas Kandagatla <[email protected]>


Thanks,
srini

> .../bindings/soundwire/qcom,sdw.txt | 1 +
> drivers/soundwire/Kconfig | 2 +-
> drivers/soundwire/qcom.c | 38 +++++++++++++++++--
> 3 files changed, 36 insertions(+), 5 deletions(-)
>

2020-09-07 16:30:44

by Vinod Koul

[permalink] [raw]
Subject: Re: [PATCH v2 0/4] soundwire: qcom: add support for mmio soundwire master

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

--
~Vinod

2020-09-08 14:54:19

by Pierre-Louis Bossart

[permalink] [raw]
Subject: Re: [PATCH v2 3/4] soundwire: qcom: add support for mmio soundwire master devices




> @@ -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);
>

2020-09-08 19:08:40

by Jonathan Marek

[permalink] [raw]
Subject: Re: [PATCH v2 3/4] soundwire: qcom: add support for mmio soundwire master devices



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);
>>