Skip to contentSkip to conversation

soundwire: qcom: add mmio support

PATCH Superseded Jonathan Marek 5 participants 27 messages Jun 8, 2020 – Aug 27, 2020

Subsystems (3)

v1 of 2 Superseded Latest is v2 →

lore
Share & tools
lore
#0 lore raw

cover soundwire: qcom: add mmio support

This adds initial support for soundwire device on sm8250.

Tested with the "wsa" sdw device, which is simpler than the others.

Jonathan Marek (5):
soundwire: qcom: fix abh/ahb typo
soundwire: qcom: add support for mmio soundwire devices
soundwire: qcom: add v1.5.1 compatible
soundwire: qcom: avoid dependency on CONFIG_SLIMBUS
soundwire: qcom: enable CPU interrupts for mmio devices

 drivers/soundwire/Kconfig |  1 -
 drivers/soundwire/qcom.c  | 42 +++++++++++++++++++++++++++++++++++----
 2 files changed, 38 insertions(+), 5 deletions(-)
Signature · 1 line
2.26.1
#1 lore raw

PATCH 1/5 soundwire: qcom: fix abh/ahb typo

The function name qcom_swrm_abh_reg_read should say ahb, fix that.

---
 drivers/soundwire/qcom.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/soundwire/qcom.c +2 -2
index a1c2a44a3b4d..f38d1fd3679f 100644
@@ -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)
Signature · 1 line
2.26.1
Reviewed-by on v1 1/5
#2 lore raw

Re: [PATCH 1/5] soundwire: qcom: fix abh/ahb typo

Quoted 4 lines · Jonathan Marek

The function name qcom_swrm_abh_reg_read should say ahb, fix that.

---

Quoted 26 lines
  drivers/soundwire/qcom.c | 4 ++--
  1 file changed, 2 insertions(+), 2 deletions(-)
drivers/soundwire/qcom.c +2 -2
index a1c2a44a3b4d..f38d1fd3679f 100644
@@ -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)
#3 lore raw

PATCH 2/5 soundwire: qcom: add support for mmio soundwire devices

In reply to Jonathan Marek

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

---
 drivers/soundwire/qcom.c | 25 +++++++++++++++++++++++--
 1 file changed, 23 insertions(+), 2 deletions(-)
drivers/soundwire/qcom.c +23 -2
index f38d1fd3679f..628747df1c75 100644
@@ -90,6 +90,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 +155,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)
 {
@@ -746,6 +761,7 @@ static int qcom_swrm_probe(struct platform_device *pdev)
 	struct sdw_master_prop *prop;
 	struct sdw_bus_params *params;
 	struct qcom_swrm_ctrl *ctrl;
+	struct resource *res;
 	int ret;
 	u32 val;
 
@@ -760,8 +776,13 @@ static int qcom_swrm_probe(struct platform_device *pdev)
 		if (!ctrl->regmap)
 			return -EINVAL;
 	} else {
-		/* Only WCD based SoundWire controller is supported */
-		return -ENOTSUPP;
+		res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+
+		ctrl->reg_read = qcom_swrm_cpu_reg_read;
+		ctrl->reg_write = qcom_swrm_cpu_reg_write;
+		ctrl->mmio = devm_ioremap_resource(dev, res);
+		if (IS_ERR(ctrl->mmio))
+			return PTR_ERR(ctrl->mmio);
 	}
 
 	ctrl->irq = of_irq_get(dev->of_node, 0);
Signature · 1 line
2.26.1
#4 lore raw

Re: [PATCH 2/5] soundwire: qcom: add support for mmio soundwire devices

Quoted 1 line · Jonathan Marek

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

'device' is an ambiguous term for SoundWire.

Seems to me this is a SoundWire Master device directly accessed with mmio registers instead of over a SLIMbus link?

Quoted 48 lines
---
  drivers/soundwire/qcom.c | 25 +++++++++++++++++++++++--
  1 file changed, 23 insertions(+), 2 deletions(-)
drivers/soundwire/qcom.c +16 -0
index f38d1fd3679f..628747df1c75 100644
@@ -90,6 +90,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 +155,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)
  {
@@ -746,6 +761,7 @@ static int qcom_swrm_probe(struct platform_device *pdev)
  	struct sdw_master_prop *prop;
  	struct sdw_bus_params *params;
  	struct qcom_swrm_ctrl *ctrl;
+	struct resource *res;
  	int ret;
  	u32 val;
 

drivers/soundwire/qcom.c static int qcom_swrm_probe(struct platform_device *pdev) · line 764

Quoted 5 lines
drivers/soundwire/qcom.c +0 -2
@@ -760,8 +776,13 @@ static int qcom_swrm_probe(struct platform_device *pdev)
  		if (!ctrl->regmap)
  			return -EINVAL;
  	} else {
-		/* Only WCD based SoundWire controller is supported */
-		return -ENOTSUPP;

I would move patch4 before this one, and add the functionality *after* removing the SLIMbus dependency.

drivers/soundwire/qcom.c static int qcom_swrm_probe(struct platform_device *pdev) · line 785

Quoted 7 lines
drivers/soundwire/qcom.c +7 -0
+		res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+
+		ctrl->reg_read = qcom_swrm_cpu_reg_read;
+		ctrl->reg_write = qcom_swrm_cpu_reg_write;
+		ctrl->mmio = devm_ioremap_resource(dev, res);
+		if (IS_ERR(ctrl->mmio))
+			return PTR_ERR(ctrl->mmio);

maybe deal with the resource checks before setting callbacks?

There are quite a few drivers who do things this way:

clk/qcom/common.c- res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
clk/qcom/common.c: base = devm_ioremap_resource(dev, res);
--

Quoted 4 lines
drivers/soundwire/qcom.c +0 -0
  	}
 
  	ctrl->irq = of_irq_get(dev->of_node, 0);
maintainer
#5 lore raw

Re: [PATCH 2/5] soundwire: qcom: add support for mmio soundwire devices

In reply to Jonathan Marek

Hi Jonathan,

Quoted 1 line · Jonathan Marek

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

Please use 'SoundWire Master devices' instead :)

Quoted 25 lines
---
 drivers/soundwire/qcom.c | 25 +++++++++++++++++++++++--
 1 file changed, 23 insertions(+), 2 deletions(-)
drivers/soundwire/qcom.c +4 -0
index f38d1fd3679f..628747df1c75 100644
@@ -90,6 +90,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 +155,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)
+{

drivers/soundwire/qcom.c static int qcom_swrm_ahb_reg_write(struct qcom_swrm_ctrl *ctrl, · line 170

Quoted 10 lines
drivers/soundwire/qcom.c +10 -0
+	*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;
+}

this looks fine but regmap supports mmio also, so I am thinking we should remove these and set regmap (mmio/slim)... Srini..?

Signature · 1 line
~Vinod
#6 lore raw

Re: [PATCH 2/5] soundwire: qcom: add support for mmio soundwire devices

Quoted 29 lines · Vinod Koul

Hi Jonathan,

Quoted 1 line · Jonathan Marek

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

Please use 'SoundWire Master devices' instead :)

Quoted 22 lines
---
  drivers/soundwire/qcom.c | 25 +++++++++++++++++++++++--
  1 file changed, 23 insertions(+), 2 deletions(-)
drivers/soundwire/qcom.c +1 -0
index f38d1fd3679f..628747df1c75 100644
@@ -90,6 +90,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 +155,20 @@ static int qcom_swrm_ahb_reg_write(struct qcom_swrm_ctrl *ctrl,
  	return SDW_CMD_OK;
  }
 
Quoted 16 lines

drivers/soundwire/qcom.c static int qcom_swrm_ahb_reg_write(struct qcom_swrm_ctrl *ctrl, · line 170

Quoted 13 lines
drivers/soundwire/qcom.c +13 -0
+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;
+}

this looks fine but regmap supports mmio also, so I am thinking we should remove these and set regmap (mmio/slim)... Srini..?

That is doable, but not going to add great value in this case, unless we are having another layer of abstraction. So keeping it as readl/writel seems okay to me.

--srini

Quoted 1 line
#7 lore raw

Re: [PATCH 2/5] soundwire: qcom: add support for mmio soundwire devices

Quoted 50 lines · Srinivas Kandagatla
Quoted 38 lines · Vinod Koul

Hi Jonathan,

Quoted 1 line · Jonathan Marek

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

Please use 'SoundWire Master devices' instead :)

Quoted 31 lines

---
  drivers/soundwire/qcom.c | 25 +++++++++++++++++++++++--

  1 file changed, 23 insertions(+), 2 deletions(-)
drivers/soundwire/qcom.c +9 -0
index f38d1fd3679f..628747df1c75 100644
@@ -90,6 +90,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 +155,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,
Quoted 8 lines

drivers/soundwire/qcom.c static int qcom_swrm_ahb_reg_write(struct qcom_swrm_ctrl *ctrl, · line 170

Quoted 5 lines
drivers/soundwire/qcom.c +5 -0
+                   int val)
+{
+    writel(val, ctrl->mmio + reg);
+    return SDW_CMD_OK;
+}

this looks fine but regmap supports mmio also, so I am thinking we should remove these and set regmap (mmio/slim)... Srini..?

Quoted 2 lines

That is doable, but not going to add great value in this case, unless we are having another layer of abstraction. So keeping it as readl/writel seems okay to me.

Adding to this, the slim case doesn't use the regmap directly, it goes through AHB_BRIDGE registers. So using a single regmap path is not "doable" (at least not in a nice way IMO).

Quoted 4 lines

--srini

Quoted 1 line
#8 lore raw

Re: [PATCH 2/5] soundwire: qcom: add support for mmio soundwire devices

In reply to Jonathan Marek
Quoted 4 lines · Jonathan Marek

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

---

In general patch itself looks pretty trivial, but I would like to see what 1.5.1 controller provides in terms of error reporting of SoundWire slave register reads/writes. On WCD based controller we did not have a mechanism to report things like if the read is ignored or not. I was hoping that this version of controller would be able to report that.

I will be nice to those patches if that is something which is supported in this version.

--srini

Quoted 61 lines
  drivers/soundwire/qcom.c | 25 +++++++++++++++++++++++--
  1 file changed, 23 insertions(+), 2 deletions(-)
drivers/soundwire/qcom.c +23 -2
index f38d1fd3679f..628747df1c75 100644
@@ -90,6 +90,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 +155,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)
  {
@@ -746,6 +761,7 @@ static int qcom_swrm_probe(struct platform_device *pdev)
  	struct sdw_master_prop *prop;
  	struct sdw_bus_params *params;
  	struct qcom_swrm_ctrl *ctrl;
+	struct resource *res;
  	int ret;
  	u32 val;
 
@@ -760,8 +776,13 @@ static int qcom_swrm_probe(struct platform_device *pdev)
  		if (!ctrl->regmap)
  			return -EINVAL;
  	} else {
-		/* Only WCD based SoundWire controller is supported */
-		return -ENOTSUPP;
+		res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+
+		ctrl->reg_read = qcom_swrm_cpu_reg_read;
+		ctrl->reg_write = qcom_swrm_cpu_reg_write;
+		ctrl->mmio = devm_ioremap_resource(dev, res);
+		if (IS_ERR(ctrl->mmio))
+			return PTR_ERR(ctrl->mmio);
  	}
 
  	ctrl->irq = of_irq_get(dev->of_node, 0);
#9 lore raw

Re: [PATCH 2/5] soundwire: qcom: add support for mmio soundwire devices

Quoted 5 lines · Srinivas Kandagatla
Quoted 2 lines · Jonathan Marek

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

Quoted 9 lines
Quoted 2 lines

---

In general patch itself looks pretty trivial, but I would like to see what 1.5.1 controller provides in terms of error reporting of SoundWire slave register reads/writes. On WCD based controller we did not have a mechanism to report things like if the read is ignored or not. I was hoping that this version of controller would be able to report that.

I will be nice to those patches if that is something which is supported in this version.

--srini

It does seem to support additional error reporting (it gets an error during enumeration after finding the 2 WSA slaves). However the downstream driver seems to disable this by setting BIT(31) in FIFO_CFG_ADDR (the comment says "For SWR master version 1.5.1, continue execute on command ignore"). Outside of the initial enumeration, it doesn't seem to produce any extra errors (still relying on the timeout mechanism to know if read/write is ignored).

Quoted 61 lines
Quoted 61 lines

  drivers/soundwire/qcom.c | 25 +++++++++++++++++++++++--

  1 file changed, 23 insertions(+), 2 deletions(-)
drivers/soundwire/qcom.c +23 -2
index f38d1fd3679f..628747df1c75 100644
@@ -90,6 +90,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 +155,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)
   {
@@ -746,6 +761,7 @@ static int qcom_swrm_probe(struct platform_device 
 *pdev)
       struct sdw_master_prop *prop;
       struct sdw_bus_params *params;
       struct qcom_swrm_ctrl *ctrl;
+    struct resource *res;
       int ret;
       u32 val;
@@ -760,8 +776,13 @@ static int qcom_swrm_probe(struct platform_device 
 *pdev)
           if (!ctrl->regmap)
               return -EINVAL;
       } else {
-        /* Only WCD based SoundWire controller is supported */
-        return -ENOTSUPP;
+        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+
+        ctrl->reg_read = qcom_swrm_cpu_reg_read;
+        ctrl->reg_write = qcom_swrm_cpu_reg_write;
+        ctrl->mmio = devm_ioremap_resource(dev, res);
+        if (IS_ERR(ctrl->mmio))
+            return PTR_ERR(ctrl->mmio);
       }
       ctrl->irq = of_irq_get(dev->of_node, 0);
#10 lore raw

Re: [PATCH 2/5] soundwire: qcom: add support for mmio soundwire devices

Quoted 9 lines · Jonathan Marek
Quoted 8 lines · Srinivas Kandagatla
Quoted 4 lines · Jonathan Marek

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

---

Quoted 8 lines
Quoted 6 lines

In general patch itself looks pretty trivial, but I would like to see what 1.5.1 controller provides in terms of error reporting of SoundWire slave register reads/writes. On WCD based controller we did not have a mechanism to report things like if the read is ignored or not. I was hoping that this version of controller would be able to report that.

I will be nice to those patches if that is something which is supported in this version.

--srini

It does seem to support additional error reporting (it gets an error during enumeration after finding the 2 WSA slaves). However the downstream driver seems to disable this by setting BIT(31) in FIFO_CFG_ADDR (the comment says "For SWR master version 1.5.1, continue execute on command ignore"). Outside of the initial enumeration, it doesn't seem to produce any extra errors (still relying on the timeout mechanism to know if read/write is ignored).

1.5.* versions support reporting CMD_NACKED in FIFO_STATUS register, so you should use that instead of timeout mechanism which is used for 1.3.0 which did not have support for this.

thanks,
srini

Quoted 63 lines
Quoted 63 lines
Quoted 63 lines

  drivers/soundwire/qcom.c | 25 +++++++++++++++++++++++--

  1 file changed, 23 insertions(+), 2 deletions(-)
drivers/soundwire/qcom.c +15 -0
index f38d1fd3679f..628747df1c75 100644
@@ -90,6 +90,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 +155,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)

  {

drivers/soundwire/qcom.c +8 -2
@@ -746,6 +761,7 @@ static int qcom_swrm_probe(struct platform_device 
 *pdev)
       struct sdw_master_prop *prop;
       struct sdw_bus_params *params;
       struct qcom_swrm_ctrl *ctrl;
+    struct resource *res;
       int ret;
       u32 val;
@@ -760,8 +776,13 @@ static int qcom_swrm_probe(struct 
 platform_device *pdev)
           if (!ctrl->regmap)
               return -EINVAL;
       } else {
-        /* Only WCD based SoundWire controller is supported */
-        return -ENOTSUPP;
+        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+
+        ctrl->reg_read = qcom_swrm_cpu_reg_read;
+        ctrl->reg_write = qcom_swrm_cpu_reg_write;
+        ctrl->mmio = devm_ioremap_resource(dev, res);
+        if (IS_ERR(ctrl->mmio))
+            return PTR_ERR(ctrl->mmio);
       }
       ctrl->irq = of_irq_get(dev->of_node, 0);
#11 lore raw

PATCH 3/5 soundwire: qcom: add v1.5.1 compatible

In reply to Jonathan Marek

Add a compatible string for HW version v1.5.1 on sm8250 SoCs.

---
 drivers/soundwire/qcom.c | 1 +
 1 file changed, 1 insertion(+)
drivers/soundwire/qcom.c +1 -0
index 628747df1c75..14334442615f 100644
@@ -880,6 +880,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 */},
 };
 
Signature · 1 line
2.26.1
maintainer
#12 lore raw

Re: [PATCH 3/5] soundwire: qcom: add v1.5.1 compatible

Quoted 1 line · Jonathan Marek

Add a compatible string for HW version v1.5.1 on sm8250 SoCs.

Please document this new compatible

Signature · 1 line
~Vinod
#13 lore raw

Re: [PATCH 3/5] soundwire: qcom: add v1.5.1 compatible

Quoted 5 lines · Vinod Koul
Quoted 1 line · Jonathan Marek

Add a compatible string for HW version v1.5.1 on sm8250 SoCs.

Please document this new compatible

Does it really need to be documented? The documentation already says the compatible should be "qcom,soundwire-v<MAJOR>.<MINOR>.<STEP>". It gives "qcom,soundwire-v1.5.0" as an example, which is not actually a supported compatible, so my understanding is we don't need to update the list of examples with every possible compatible.

#14 lore raw

Re: [PATCH 3/5] soundwire: qcom: add v1.5.1 compatible

Quoted 8 lines · Jonathan Marek
Quoted 5 lines · Vinod Koul
Quoted 1 line · Jonathan Marek

Add a compatible string for HW version v1.5.1 on sm8250 SoCs.

Please document this new compatible

Does it really need to be documented? The documentation already says the compatible should be "qcom,soundwire-v<MAJOR>.<MINOR>.<STEP>". It gives "qcom,soundwire-v1.5.0" as an example, which is not actually a supported compatible, so my understanding is we don't need to update the list of examples with every possible compatible.

checkpatch should have reported about this, and in future once we convert to yaml and list the compatible strings then dt_binding_check would fail too. So there is no harm in adding an additional compatible string for this new entry.

--srini

#15 lore raw

PATCH 4/5 soundwire: qcom: avoid dependency on CONFIG_SLIMBUS

In reply to Jonathan Marek

The driver may be used without slimbus, so don't depend on slimbus.

---
 drivers/soundwire/Kconfig | 1 -
 drivers/soundwire/qcom.c  | 5 +++++
 2 files changed, 5 insertions(+), 1 deletion(-)
drivers/soundwire/Kconfig +0 -1
index fa2b4ab92ed9..d121cf739090 100644
@@ -33,7 +33,6 @@ config SOUNDWIRE_INTEL
 
 config SOUNDWIRE_QCOM
 	tristate "Qualcomm SoundWire Master driver"
-	depends on SLIMBUS
 	depends on SND_SOC
 	help
 	  SoundWire Qualcomm Master driver.
drivers/soundwire/qcom.c +5 -0
index 14334442615f..ac81c64768ea 100644
@@ -769,13 +769,18 @@ static int qcom_swrm_probe(struct platform_device *pdev)
 	if (!ctrl)
 		return -ENOMEM;
 
+#ifdef CONFIG_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);
 		if (!ctrl->regmap)
 			return -EINVAL;
 	} else {
+
 		res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 
 		ctrl->reg_read = qcom_swrm_cpu_reg_read;
Signature · 1 line
2.26.1
#16 lore raw

Re: [PATCH 4/5] soundwire: qcom: avoid dependency on CONFIG_SLIMBUS

Quoted 30 lines · Jonathan Marek

The driver may be used without slimbus, so don't depend on slimbus.

---
  drivers/soundwire/Kconfig | 1 -
  drivers/soundwire/qcom.c  | 5 +++++
  2 files changed, 5 insertions(+), 1 deletion(-)
drivers/soundwire/Kconfig +0 -1
index fa2b4ab92ed9..d121cf739090 100644
@@ -33,7 +33,6 @@ config SOUNDWIRE_INTEL
 
  config SOUNDWIRE_QCOM
  	tristate "Qualcomm SoundWire Master driver"
-	depends on SLIMBUS
  	depends on SND_SOC
  	help
  	  SoundWire Qualcomm Master driver.
drivers/soundwire/qcom.c +1 -0
index 14334442615f..ac81c64768ea 100644
@@ -769,13 +769,18 @@ static int qcom_swrm_probe(struct platform_device *pdev)
  	if (!ctrl)
  		return -ENOMEM;
 
+#ifdef CONFIG_SLIMBUS
  	if (dev->parent->bus == &slimbus_bus) {

drivers/soundwire/qcom.c static int qcom_swrm_probe(struct platform_device *pdev) · line 783

Quoted 10 lines
drivers/soundwire/qcom.c +4 -0
+#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);
  		if (!ctrl->regmap)
  			return -EINVAL;
  	} else {
+

Oops, ended up with a stray whitespace here, will fix for v2.

Quoted 4 lines
drivers/soundwire/qcom.c +0 -0
  		res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 
  		ctrl->reg_read = qcom_swrm_cpu_reg_read;
#17 lore raw

Re: [PATCH 4/5] soundwire: qcom: avoid dependency on CONFIG_SLIMBUS

In reply to Jonathan Marek
Quoted 25 lines · Jonathan Marek

The driver may be used without slimbus, so don't depend on slimbus.

---
  drivers/soundwire/Kconfig | 1 -
  drivers/soundwire/qcom.c  | 5 +++++
  2 files changed, 5 insertions(+), 1 deletion(-)
drivers/soundwire/Kconfig +0 -1
index fa2b4ab92ed9..d121cf739090 100644
@@ -33,7 +33,6 @@ config SOUNDWIRE_INTEL
 
  config SOUNDWIRE_QCOM
  	tristate "Qualcomm SoundWire Master driver"
-	depends on SLIMBUS
  	depends on SND_SOC
  	help
  	  SoundWire Qualcomm Master driver.
drivers/soundwire/qcom.c +0 -0
index 14334442615f..ac81c64768ea 100644

drivers/soundwire/qcom.c static int qcom_swrm_probe(struct platform_device *pdev) · line 776

Quoted 8 lines
drivers/soundwire/qcom.c +4 -0
@@ -769,13 +769,18 @@ static int qcom_swrm_probe(struct platform_device *pdev)
  	if (!ctrl)
  		return -ENOMEM;
 
+#ifdef CONFIG_SLIMBUS
  	if (dev->parent->bus == &slimbus_bus) {
+#else
+	if (false) {
+#endif

maybe:

if (IS_ENABLED(CONFIG_SLIMBUS) &&

    dev->parent->bus == &slimbus_bus)
Quoted 11 lines
drivers/soundwire/qcom.c +1 -0
  		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)
  			return -EINVAL;
  	} else {
+
  		res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 
  		ctrl->reg_read = qcom_swrm_cpu_reg_read;
#18 lore raw

Re: [PATCH 4/5] soundwire: qcom: avoid dependency on CONFIG_SLIMBUS

Quoted 39 lines · Pierre-Louis Bossart
Quoted 24 lines · Jonathan Marek

The driver may be used without slimbus, so don't depend on slimbus.

---
  drivers/soundwire/Kconfig | 1 -
  drivers/soundwire/qcom.c  | 5 +++++

  2 files changed, 5 insertions(+), 1 deletion(-)
drivers/soundwire/Kconfig +0 -0
index fa2b4ab92ed9..d121cf739090 100644
@@ -33,7 +33,6 @@ config SOUNDWIRE_INTEL

  config SOUNDWIRE_QCOM
      tristate "Qualcomm SoundWire Master driver"
-    depends on SLIMBUS
      depends on SND_SOC
      help
        SoundWire Qualcomm Master driver.

drivers/soundwire/qcom.c +0 -0
index 14334442615f..ac81c64768ea 100644

drivers/soundwire/qcom.c static int qcom_swrm_probe(struct · line 776

Quoted 8 lines
drivers/soundwire/qcom.c +4 -0
@@ -769,13 +769,18 @@ static int qcom_swrm_probe(struct 
 platform_device *pdev)
       if (!ctrl)
           return -ENOMEM;
+#ifdef CONFIG_SLIMBUS
       if (dev->parent->bus == &slimbus_bus) {
+#else
+    if (false) {
+#endif

maybe:

Quoted 4 lines

if (IS_ENABLED(CONFIG_SLIMBUS) &&
    dev->parent->bus == &slimbus_bus)

It won't compile like this, because "slimbus_bus" is not defined when CONFIG_SLIMBUS is disabled.

Quoted 10 lines
Quoted 10 lines
drivers/soundwire/qcom.c +1 -0
           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)
               return -EINVAL;
       } else {
+
           res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
           ctrl->reg_read = qcom_swrm_cpu_reg_read;
 
#19 lore raw

Re: [PATCH 4/5] soundwire: qcom: avoid dependency on CONFIG_SLIMBUS

In reply to Jonathan Marek
Quoted 13 lines · Jonathan Marek

The driver may be used without slimbus, so don't depend on slimbus.

---
  drivers/soundwire/Kconfig | 1 -
  drivers/soundwire/qcom.c  | 5 +++++
  2 files changed, 5 insertions(+), 1 deletion(-)
drivers/soundwire/Kconfig +0 -0
index fa2b4ab92ed9..d121cf739090 100644

drivers/soundwire/Kconfig config SOUNDWIRE_INTEL · line 36

Quoted 5 lines
drivers/soundwire/Kconfig +0 -1
@@ -33,7 +33,6 @@ config SOUNDWIRE_INTEL
 
  config SOUNDWIRE_QCOM
  	tristate "Qualcomm SoundWire Master driver"
-	depends on SLIMBUS
  	depends on SND_SOC

Why not move this to imply SLIMBUS this will give more flexibility!

Quoted 7 lines
drivers/soundwire/Kconfig +0 -0
  	help
  	  SoundWire Qualcomm Master driver.
drivers/soundwire/qcom.c +0 -0
index 14334442615f..ac81c64768ea 100644

drivers/soundwire/qcom.c static int qcom_swrm_probe(struct platform_device *pdev) · line 776

Quoted 8 lines
drivers/soundwire/qcom.c +4 -0
@@ -769,13 +769,18 @@ static int qcom_swrm_probe(struct platform_device *pdev)
  	if (!ctrl)
  		return -ENOMEM;
 
+#ifdef CONFIG_SLIMBUS
  	if (dev->parent->bus == &slimbus_bus) {
+#else
+	if (false) {
+#endif

May be you can do bit more cleanup here, which could endup like:

ctrl->regmap = dev_get_regmap(dev->parent, NULL);

if (!ctrl->regmap) {
	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
	if (res) {
		ctrl->mmio = devm_ioremap_resource(dev, res);
		if (IS_ERR(ctrl->mmio)) {
			dev_err(dev, "No valid mem resource found\n");
			return PTR_ERR(ctrl->mmio);
		}

		ctrl->reg_read = qcom_swrm_cpu_reg_read;
		ctrl->reg_write = qcom_swrm_cpu_reg_write;
	} else {
		dev_err(dev, "No valid slim resource found\n");
		return -EINVAL;
	}
} else {
	ctrl->reg_read = qcom_swrm_ahb_reg_read;
	ctrl->reg_write = qcom_swrm_ahb_reg_write;
}

thanks,
srini

Quoted 11 lines
drivers/soundwire/qcom.c +1 -0
  		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)
  			return -EINVAL;
  	} else {
+
  		res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 
  		ctrl->reg_read = qcom_swrm_cpu_reg_read;
#20 lore raw

Re: [PATCH 4/5] soundwire: qcom: avoid dependency on CONFIG_SLIMBUS

Quoted 11 lines · Srinivas Kandagatla
Quoted 8 lines · Jonathan Marek

The driver may be used without slimbus, so don't depend on slimbus.

---
  drivers/soundwire/Kconfig | 1 -
  drivers/soundwire/qcom.c  | 5 +++++

  2 files changed, 5 insertions(+), 1 deletion(-)
Quoted 13 lines
Quoted 9 lines
drivers/soundwire/Kconfig +0 -0
index fa2b4ab92ed9..d121cf739090 100644
@@ -33,7 +33,6 @@ config SOUNDWIRE_INTEL

  config SOUNDWIRE_QCOM
      tristate "Qualcomm SoundWire Master driver"
-    depends on SLIMBUS
      depends on SND_SOC

Why not move this to imply SLIMBUS this will give more flexibility!

If you mean to change it to "select SLIMBUS", I'd prefer not to, because this would increase code size unnecessarily in my kernel.

Quoted 42 lines
Quoted 7 lines

      help
        SoundWire Qualcomm Master driver.

drivers/soundwire/qcom.c +0 -0
index 14334442615f..ac81c64768ea 100644

drivers/soundwire/qcom.c static int qcom_swrm_probe(struct · line 776

Quoted 8 lines
drivers/soundwire/qcom.c +4 -0
@@ -769,13 +769,18 @@ static int qcom_swrm_probe(struct 
 platform_device *pdev)
       if (!ctrl)
           return -ENOMEM;
+#ifdef CONFIG_SLIMBUS
       if (dev->parent->bus == &slimbus_bus) {
+#else
+    if (false) {
+#endif

May be you can do bit more cleanup here, which could endup like:

ctrl->regmap = dev_get_regmap(dev->parent, NULL); if (!ctrl->regmap) {
    res = platform_get_resource(pdev, IORESOURCE_MEM, 0); if (res) {
        ctrl->mmio = devm_ioremap_resource(dev, res); if (IS_ERR(ctrl->mmio)) {
            dev_err(dev, "No valid mem resource found\n"); return PTR_ERR(ctrl->mmio);
        }

        ctrl->reg_read = qcom_swrm_cpu_reg_read; ctrl->reg_write = qcom_swrm_cpu_reg_write; } else {
        dev_err(dev, "No valid slim resource found\n"); return -EINVAL;
    }
} else {
    ctrl->reg_read = qcom_swrm_ahb_reg_read; ctrl->reg_write = qcom_swrm_ahb_reg_write;
}

Quoted 2 lines

thanks,
srini

I don't think this is better, it feels more obfuscated, and I think its possible we may end up with the mmio sdw having a parent with a regmap. (it is not how I did things up in my upstream stack, but in downstream the sdw nodes are inside the "macro" codec nodes)

I understand the '#ifdef CONFIG_SLIMBUS'/'dev->parent->bus == &slimbus_bus' is ugly, but at least its clear what's going on. Unless you have a better suggestion?

Quoted 10 lines
Quoted 10 lines
drivers/soundwire/qcom.c +1 -0
           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)
               return -EINVAL;
       } else {
+
           res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
           ctrl->reg_read = qcom_swrm_cpu_reg_read;
 
#21 lore raw

Re: [PATCH 4/5] soundwire: qcom: avoid dependency on CONFIG_SLIMBUS

Quoted 26 lines · Jonathan Marek
Quoted 11 lines · Srinivas Kandagatla
Quoted 8 lines · Jonathan Marek

The driver may be used without slimbus, so don't depend on slimbus.

---
  drivers/soundwire/Kconfig | 1 -
  drivers/soundwire/qcom.c  | 5 +++++

  2 files changed, 5 insertions(+), 1 deletion(-)
Quoted 13 lines
Quoted 9 lines
drivers/soundwire/Kconfig +0 -0
index fa2b4ab92ed9..d121cf739090 100644
@@ -33,7 +33,6 @@ config SOUNDWIRE_INTEL

  config SOUNDWIRE_QCOM
      tristate "Qualcomm SoundWire Master driver"
-    depends on SLIMBUS
      depends on SND_SOC

Why not move this to imply SLIMBUS this will give more flexibility!

Quoted 1 line

If you mean to change it to "select SLIMBUS", I'd prefer not to, because this would increase code size unnecessarily in my kernel.

imply is week select, which means that this driver can be built without SLIMBus selected. So removing reference to slimbus_bus is necessary in this case.

On the other hand, SLIMBus is going to be used sm8250 for BT audio, so this would not be unnecessary. Also mostly these are build as modules, so not sure why kernel size will increase here!

Am not 100% sure if SLIMBus will be kept on all SoCs, but keeping depends or imply in place would enforce or spell out some level of dependency on this.

Quoted 43 lines
Quoted 43 lines
Quoted 8 lines

      help
        SoundWire Qualcomm Master driver.

drivers/soundwire/qcom.c +0 -0
index 14334442615f..ac81c64768ea 100644

drivers/soundwire/qcom.c static int qcom_swrm_probe(struct · line 776

Quoted 8 lines
drivers/soundwire/qcom.c +4 -0
@@ -769,13 +769,18 @@ static int qcom_swrm_probe(struct 
 platform_device *pdev)
       if (!ctrl)
           return -ENOMEM;
+#ifdef CONFIG_SLIMBUS
       if (dev->parent->bus == &slimbus_bus) {
+#else
+    if (false) {
+#endif

May be you can do bit more cleanup here, which could endup like:

ctrl->regmap = dev_get_regmap(dev->parent, NULL); if (!ctrl->regmap) {
     res = platform_get_resource(pdev, IORESOURCE_MEM, 0); if (res) {
         ctrl->mmio = devm_ioremap_resource(dev, res); if (IS_ERR(ctrl->mmio)) {
             dev_err(dev, "No valid mem resource found\n"); return PTR_ERR(ctrl->mmio);
         }

         ctrl->reg_read = qcom_swrm_cpu_reg_read; ctrl->reg_write = qcom_swrm_cpu_reg_write; } else {
         dev_err(dev, "No valid slim resource found\n"); return -EINVAL;
     }
} else {
     ctrl->reg_read = qcom_swrm_ahb_reg_read; ctrl->reg_write = qcom_swrm_ahb_reg_write; }

Quoted 6 lines
Quoted 2 lines

thanks,
srini

I don't think this is better, it feels more obfuscated, and I think its possible we may end up with the mmio sdw having a parent with a regmap. (it is not how I did things up in my upstream stack, but in downstream the sdw nodes are inside the "macro" codec nodes)

I understand the '#ifdef CONFIG_SLIMBUS'/'dev->parent->bus == &slimbus_bus' is ugly, but at least its clear what's going on. Unless you have a better suggestion?

Other suggestion I had in my mind was to use compatible strings to get reg_read, reg_write callbacks + some flags like (if_type) populated. This can help looking up resources correctly.

Thanks,
srini

Quoted 11 lines
Quoted 11 lines
Quoted 11 lines
drivers/soundwire/qcom.c +1 -0
           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)
               return -EINVAL;
       } else {
+
           res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
           ctrl->reg_read = qcom_swrm_cpu_reg_read;
 
#22 lore raw

Re: [PATCH 4/5] soundwire: qcom: avoid dependency on CONFIG_SLIMBUS

Quoted 29 lines · Srinivas Kandagatla
Quoted 26 lines · Jonathan Marek
Quoted 24 lines · Srinivas Kandagatla
Quoted 13 lines · Jonathan Marek

The driver may be used without slimbus, so don't depend on slimbus.

---
  drivers/soundwire/Kconfig | 1 -
  drivers/soundwire/qcom.c  | 5 +++++

  2 files changed, 5 insertions(+), 1 deletion(-)
drivers/soundwire/Kconfig +0 -0
index fa2b4ab92ed9..d121cf739090 100644
@@ -33,7 +33,6 @@ config SOUNDWIRE_INTEL
Quoted 4 lines

  config SOUNDWIRE_QCOM
      tristate "Qualcomm SoundWire Master driver"
-    depends on SLIMBUS
      depends on SND_SOC

Why not move this to imply SLIMBUS this will give more flexibility!

Quoted 4 lines
Quoted 1 line

If you mean to change it to "select SLIMBUS", I'd prefer not to, because this would increase code size unnecessarily in my kernel.

imply is week select, which means that this driver can be built without SLIMBus selected. So removing reference to slimbus_bus is necessary in this case.

Will change it to "imply", I wasn't aware of this keyword.

Quoted 2 lines

On the other hand, SLIMBus is going to be used sm8250 for BT audio, so this would not be unnecessary. Also mostly these are build as modules, so not sure why kernel size will increase here!

Not everyone uses modules. I am using a config with CONFIG_MODULES=n and only relevant drivers enabled.

Quoted 45 lines

Am not 100% sure if SLIMBus will be kept on all SoCs, but keeping depends or imply in place would enforce or spell out some level of dependency on this.

Quoted 43 lines
Quoted 43 lines
Quoted 8 lines

      help
        SoundWire Qualcomm Master driver.

drivers/soundwire/qcom.c +0 -0
index 14334442615f..ac81c64768ea 100644

drivers/soundwire/qcom.c static int qcom_swrm_probe(struct · line 776

Quoted 8 lines
drivers/soundwire/qcom.c +4 -0
@@ -769,13 +769,18 @@ static int qcom_swrm_probe(struct 
 platform_device *pdev)
       if (!ctrl)
           return -ENOMEM;
+#ifdef CONFIG_SLIMBUS
       if (dev->parent->bus == &slimbus_bus) {
+#else
+    if (false) {
+#endif

May be you can do bit more cleanup here, which could endup like:

ctrl->regmap = dev_get_regmap(dev->parent, NULL); if (!ctrl->regmap) {
     res = platform_get_resource(pdev, IORESOURCE_MEM, 0); if (res) {
         ctrl->mmio = devm_ioremap_resource(dev, res); if (IS_ERR(ctrl->mmio)) {
             dev_err(dev, "No valid mem resource found\n"); return PTR_ERR(ctrl->mmio);
         }

         ctrl->reg_read = qcom_swrm_cpu_reg_read; ctrl->reg_write = qcom_swrm_cpu_reg_write; } else {
         dev_err(dev, "No valid slim resource found\n"); return -EINVAL;
     }
} else {
     ctrl->reg_read = qcom_swrm_ahb_reg_read; ctrl->reg_write = qcom_swrm_ahb_reg_write; }

Quoted 9 lines
Quoted 6 lines
Quoted 2 lines

thanks,
srini

I don't think this is better, it feels more obfuscated, and I think its possible we may end up with the mmio sdw having a parent with a regmap. (it is not how I did things up in my upstream stack, but in downstream the sdw nodes are inside the "macro" codec nodes)

I understand the '#ifdef CONFIG_SLIMBUS'/'dev->parent->bus == &slimbus_bus' is ugly, but at least its clear what's going on. Unless you have a better suggestion?

Other suggestion I had in my mind was to use compatible strings to get reg_read, reg_write callbacks + some flags like (if_type) populated. This can help looking up resources correctly.

This is better than the previous suggestion, but is it safe to say that specific versions will always be used with MMIO or slimbus? (I guess the answer is yes, but I want to confirm)

Quoted 14 lines

Thanks,
srini

Quoted 11 lines
Quoted 11 lines
Quoted 11 lines
drivers/soundwire/qcom.c +1 -0
           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)
               return -EINVAL;
       } else {
+
           res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
           ctrl->reg_read = qcom_swrm_cpu_reg_read;
 
#23 lore raw

Re: [PATCH 4/5] soundwire: qcom: avoid dependency on CONFIG_SLIMBUS

In reply to Jonathan Marek
Quoted 13 lines · Jonathan Marek

The driver may be used without slimbus, so don't depend on slimbus.

---
  drivers/soundwire/Kconfig | 1 -
  drivers/soundwire/qcom.c  | 5 +++++
  2 files changed, 5 insertions(+), 1 deletion(-)
drivers/soundwire/Kconfig +0 -0
index fa2b4ab92ed9..d121cf739090 100644

drivers/soundwire/Kconfig config SOUNDWIRE_INTEL · line 36

Quoted 4 lines
drivers/soundwire/Kconfig +0 -1
@@ -33,7 +33,6 @@ config SOUNDWIRE_INTEL
 
  config SOUNDWIRE_QCOM
  	tristate "Qualcomm SoundWire Master driver"
-	depends on SLIMBUS

I'd suggest:
depends on SLIMBUS || !SLIMBUS #if SLIMBUS=m, this can not be builtin

This would allow building both SLIMBUS and SOUNDWIRE_QCOM as modules

drivers/soundwire/qcom.c static int qcom_swrm_probe(struct platform_device *pdev) · line 772

Quoted 12 lines
drivers/soundwire/Kconfig +0 -0
  	depends on SND_SOC
  	help
  	  SoundWire Qualcomm Master driver.
drivers/soundwire/qcom.c +1 -0
index 14334442615f..ac81c64768ea 100644
@@ -769,13 +769,18 @@ static int qcom_swrm_probe(struct platform_device *pdev)
  	if (!ctrl)
  		return -ENOMEM;
 
+#ifdef CONFIG_SLIMBUS

and then #if IS_ENABLED(CONFIG_SLIBMUS) here

Quoted 15 lines
drivers/soundwire/qcom.c +4 -0
  	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);
  		if (!ctrl->regmap)
  			return -EINVAL;
  	} else {
+
  		res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 
  		ctrl->reg_read = qcom_swrm_cpu_reg_read;
Signature · 2 lines
With best wishes
Dmitry
#24 lore raw

PATCH 5/5 soundwire: qcom: enable CPU interrupts for mmio devices

In reply to Jonathan Marek

This allows the CPU to receive interrupts.

---
 drivers/soundwire/qcom.c | 7 +++++++
 1 file changed, 7 insertions(+)
drivers/soundwire/qcom.c +7 -0
index ac81c64768ea..58ffb46e0d64 100644
@@ -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
@@ -325,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;
 }
 
Signature · 1 line
2.26.1
#25 lore raw
In reply to Jonathan Marek

Thanks Jonathan for the patches,

Quoted 2 lines · Jonathan Marek

This adds initial support for soundwire device on sm8250.

One thing off my list!!

Quoted 1 line

Tested with the "wsa" sdw device, which is simpler than the others.

WSA881x?

did you test both enumeration and streaming?

Are you planing to add any new WSA or WCD codec support for this SoC?

thanks,
srini

Quoted 12 lines

Jonathan Marek (5):
soundwire: qcom: fix abh/ahb typo
soundwire: qcom: add support for mmio soundwire devices
soundwire: qcom: add v1.5.1 compatible
soundwire: qcom: avoid dependency on CONFIG_SLIMBUS
soundwire: qcom: enable CPU interrupts for mmio devices

  drivers/soundwire/Kconfig |  1 -
  drivers/soundwire/qcom.c  | 42 +++++++++++++++++++++++++++++++++++----
  2 files changed, 38 insertions(+), 5 deletions(-)
#26 lore raw
Quoted 10 lines · Srinivas Kandagatla

Thanks Jonathan for the patches,

Quoted 2 lines · Jonathan Marek

This adds initial support for soundwire device on sm8250.

One thing off my list!!

Quoted 1 line

Tested with the "wsa" sdw device, which is simpler than the others.

Quoted 9 lines

WSA881x?

did you test both enumeration and streaming?

Are you planing to add any new WSA or WCD codec support for this SoC?

thanks,
srini

Yes, dual WSA881x. I tested streaming, however for the dual WSA881x case I need specific amixer settings and an extra hack to make it work (seems to port config stuff is broken, especially around VISENSE, it tries to use it in the wrong direction I think). For a single WSA881x, it can work without any extra hack.

The SoC has at least 4 codec drivers to add ("wsa macro", "rx macro", "tx macro", "wcd938x"), with what I am doing right now I only need the "wsa macro" codec which I've ported over from downstream. For now I am only looking at sending patches for the required ADSP changes, but may consider doing something with the "wsa macro" driver at some point.

Quoted 12 lines
Quoted 12 lines

Jonathan Marek (5):
   soundwire: qcom: fix abh/ahb typo
   soundwire: qcom: add support for mmio soundwire devices
   soundwire: qcom: add v1.5.1 compatible
   soundwire: qcom: avoid dependency on CONFIG_SLIMBUS
   soundwire: qcom: enable CPU interrupts for mmio devices

  drivers/soundwire/Kconfig |  1 -
  drivers/soundwire/qcom.c  | 42 +++++++++++++++++++++++++++++++++++----

  2 files changed, 38 insertions(+), 5 deletions(-)