aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Documentation/driver-api/soundwire/locking.rst4
-rw-r--r--drivers/soundwire/bus.c6
-rw-r--r--drivers/soundwire/cadence_master.c30
-rw-r--r--drivers/soundwire/intel.c17
-rw-r--r--drivers/soundwire/intel.h2
-rw-r--r--drivers/soundwire/intel_init.c25
-rw-r--r--drivers/soundwire/mipi_disco.c35
-rw-r--r--drivers/soundwire/stream.c8
-rw-r--r--include/linux/soundwire/sdw.h88
-rw-r--r--include/linux/soundwire/sdw_type.h11
10 files changed, 162 insertions, 64 deletions
diff --git a/Documentation/driver-api/soundwire/locking.rst b/Documentation/driver-api/soundwire/locking.rst
index 253f73555255..3a7ffb3d87f3 100644
--- a/Documentation/driver-api/soundwire/locking.rst
+++ b/Documentation/driver-api/soundwire/locking.rst
@@ -44,7 +44,9 @@ Message transfer.
44 b. Transfer message (Read/Write) to Slave1 or broadcast message on 44 b. Transfer message (Read/Write) to Slave1 or broadcast message on
45 Bus in case of bank switch. 45 Bus in case of bank switch.
46 46
47 c. Release Message lock :: 47 c. Release Message lock
48
49 ::
48 50
49 +----------+ +---------+ 51 +----------+ +---------+
50 | | | | 52 | | | |
diff --git a/drivers/soundwire/bus.c b/drivers/soundwire/bus.c
index aac35fc3cf22..fe745830a261 100644
--- a/drivers/soundwire/bus.c
+++ b/drivers/soundwire/bus.c
@@ -87,7 +87,7 @@ int sdw_add_bus_master(struct sdw_bus *bus)
87 87
88 /* 88 /*
89 * Initialize clock values based on Master properties. The max 89 * Initialize clock values based on Master properties. The max
90 * frequency is read from max_freq property. Current assumption 90 * frequency is read from max_clk_freq property. Current assumption
91 * is that the bus will start at highest clock frequency when 91 * is that the bus will start at highest clock frequency when
92 * powered on. 92 * powered on.
93 * 93 *
@@ -95,7 +95,7 @@ int sdw_add_bus_master(struct sdw_bus *bus)
95 * to start with bank 0 (Table 40 of Spec) 95 * to start with bank 0 (Table 40 of Spec)
96 */ 96 */
97 prop = &bus->prop; 97 prop = &bus->prop;
98 bus->params.max_dr_freq = prop->max_freq * SDW_DOUBLE_RATE_FACTOR; 98 bus->params.max_dr_freq = prop->max_clk_freq * SDW_DOUBLE_RATE_FACTOR;
99 bus->params.curr_dr_freq = bus->params.max_dr_freq; 99 bus->params.curr_dr_freq = bus->params.max_dr_freq;
100 bus->params.curr_bank = SDW_BANK0; 100 bus->params.curr_bank = SDW_BANK0;
101 bus->params.next_bank = SDW_BANK1; 101 bus->params.next_bank = SDW_BANK1;
@@ -648,7 +648,7 @@ static int sdw_initialize_slave(struct sdw_slave *slave)
648 return 0; 648 return 0;
649 649
650 /* Enable DP0 interrupts */ 650 /* Enable DP0 interrupts */
651 val = prop->dp0_prop->device_interrupts; 651 val = prop->dp0_prop->imp_def_interrupts;
652 val |= SDW_DP0_INT_PORT_READY | SDW_DP0_INT_BRA_FAILURE; 652 val |= SDW_DP0_INT_PORT_READY | SDW_DP0_INT_BRA_FAILURE;
653 653
654 ret = sdw_update(slave, SDW_DP0_INTMASK, val, val); 654 ret = sdw_update(slave, SDW_DP0_INTMASK, val, val);
diff --git a/drivers/soundwire/cadence_master.c b/drivers/soundwire/cadence_master.c
index 682789bb8ab3..ff4badc9b3de 100644
--- a/drivers/soundwire/cadence_master.c
+++ b/drivers/soundwire/cadence_master.c
@@ -9,6 +9,7 @@
9#include <linux/delay.h> 9#include <linux/delay.h>
10#include <linux/device.h> 10#include <linux/device.h>
11#include <linux/interrupt.h> 11#include <linux/interrupt.h>
12#include <linux/io.h>
12#include <linux/module.h> 13#include <linux/module.h>
13#include <linux/mod_devicetable.h> 14#include <linux/mod_devicetable.h>
14#include <linux/soundwire/sdw_registers.h> 15#include <linux/soundwire/sdw_registers.h>
@@ -236,19 +237,19 @@ cdns_fill_msg_resp(struct sdw_cdns *cdns,
236 for (i = 0; i < count; i++) { 237 for (i = 0; i < count; i++) {
237 if (!(cdns->response_buf[i] & CDNS_MCP_RESP_ACK)) { 238 if (!(cdns->response_buf[i] & CDNS_MCP_RESP_ACK)) {
238 no_ack = 1; 239 no_ack = 1;
239 dev_dbg(cdns->dev, "Msg Ack not received\n"); 240 dev_dbg_ratelimited(cdns->dev, "Msg Ack not received\n");
240 if (cdns->response_buf[i] & CDNS_MCP_RESP_NACK) { 241 if (cdns->response_buf[i] & CDNS_MCP_RESP_NACK) {
241 nack = 1; 242 nack = 1;
242 dev_err(cdns->dev, "Msg NACK received\n"); 243 dev_err_ratelimited(cdns->dev, "Msg NACK received\n");
243 } 244 }
244 } 245 }
245 } 246 }
246 247
247 if (nack) { 248 if (nack) {
248 dev_err(cdns->dev, "Msg NACKed for Slave %d\n", msg->dev_num); 249 dev_err_ratelimited(cdns->dev, "Msg NACKed for Slave %d\n", msg->dev_num);
249 return SDW_CMD_FAIL; 250 return SDW_CMD_FAIL;
250 } else if (no_ack) { 251 } else if (no_ack) {
251 dev_dbg(cdns->dev, "Msg ignored for Slave %d\n", msg->dev_num); 252 dev_dbg_ratelimited(cdns->dev, "Msg ignored for Slave %d\n", msg->dev_num);
252 return SDW_CMD_IGNORED; 253 return SDW_CMD_IGNORED;
253 } 254 }
254 255
@@ -356,12 +357,12 @@ cdns_program_scp_addr(struct sdw_cdns *cdns, struct sdw_msg *msg)
356 357
357 /* For NACK, NO ack, don't return err if we are in Broadcast mode */ 358 /* For NACK, NO ack, don't return err if we are in Broadcast mode */
358 if (nack) { 359 if (nack) {
359 dev_err(cdns->dev, 360 dev_err_ratelimited(cdns->dev,
360 "SCP_addrpage NACKed for Slave %d\n", msg->dev_num); 361 "SCP_addrpage NACKed for Slave %d\n", msg->dev_num);
361 return SDW_CMD_FAIL; 362 return SDW_CMD_FAIL;
362 } else if (no_ack) { 363 } else if (no_ack) {
363 dev_dbg(cdns->dev, 364 dev_dbg_ratelimited(cdns->dev,
364 "SCP_addrpage ignored for Slave %d\n", msg->dev_num); 365 "SCP_addrpage ignored for Slave %d\n", msg->dev_num);
365 return SDW_CMD_IGNORED; 366 return SDW_CMD_IGNORED;
366 } 367 }
367 368
@@ -486,7 +487,8 @@ static int cdns_update_slave_status(struct sdw_cdns *cdns,
486{ 487{
487 enum sdw_slave_status status[SDW_MAX_DEVICES + 1]; 488 enum sdw_slave_status status[SDW_MAX_DEVICES + 1];
488 bool is_slave = false; 489 bool is_slave = false;
489 u64 slave, mask; 490 u64 slave;
491 u32 mask;
490 int i, set_status; 492 int i, set_status;
491 493
492 /* combine the two status */ 494 /* combine the two status */
@@ -524,9 +526,9 @@ static int cdns_update_slave_status(struct sdw_cdns *cdns,
524 526
525 /* first check if Slave reported multiple status */ 527 /* first check if Slave reported multiple status */
526 if (set_status > 1) { 528 if (set_status > 1) {
527 dev_warn(cdns->dev, 529 dev_warn_ratelimited(cdns->dev,
528 "Slave reported multiple Status: %d\n", 530 "Slave reported multiple Status: %d\n",
529 status[i]); 531 mask);
530 /* 532 /*
531 * TODO: we need to reread the status here by 533 * TODO: we need to reread the status here by
532 * issuing a PING cmd 534 * issuing a PING cmd
@@ -612,7 +614,7 @@ irqreturn_t sdw_cdns_thread(int irq, void *dev_id)
612 struct sdw_cdns *cdns = dev_id; 614 struct sdw_cdns *cdns = dev_id;
613 u32 slave0, slave1; 615 u32 slave0, slave1;
614 616
615 dev_dbg(cdns->dev, "Slave status change\n"); 617 dev_dbg_ratelimited(cdns->dev, "Slave status change\n");
616 618
617 slave0 = cdns_readl(cdns, CDNS_MCP_SLAVE_INTSTAT0); 619 slave0 = cdns_readl(cdns, CDNS_MCP_SLAVE_INTSTAT0);
618 slave1 = cdns_readl(cdns, CDNS_MCP_SLAVE_INTSTAT1); 620 slave1 = cdns_readl(cdns, CDNS_MCP_SLAVE_INTSTAT1);
@@ -716,6 +718,8 @@ int sdw_cdns_pdi_init(struct sdw_cdns *cdns,
716 stream = &cdns->pcm; 718 stream = &cdns->pcm;
717 719
718 /* First two PDIs are reserved for bulk transfers */ 720 /* First two PDIs are reserved for bulk transfers */
721 if (stream->num_bd < CDNS_PCM_PDI_OFFSET)
722 return -EINVAL;
719 stream->num_bd -= CDNS_PCM_PDI_OFFSET; 723 stream->num_bd -= CDNS_PCM_PDI_OFFSET;
720 offset = CDNS_PCM_PDI_OFFSET; 724 offset = CDNS_PCM_PDI_OFFSET;
721 725
diff --git a/drivers/soundwire/intel.c b/drivers/soundwire/intel.c
index 60293a00a14e..317873bc0555 100644
--- a/drivers/soundwire/intel.c
+++ b/drivers/soundwire/intel.c
@@ -263,6 +263,9 @@ static void intel_pdi_init(struct sdw_intel *sdw,
263 config->pcm_out = (pcm_cap & SDW_SHIM_PCMSCAP_OSS) >> 263 config->pcm_out = (pcm_cap & SDW_SHIM_PCMSCAP_OSS) >>
264 SDW_REG_SHIFT(SDW_SHIM_PCMSCAP_OSS); 264 SDW_REG_SHIFT(SDW_SHIM_PCMSCAP_OSS);
265 265
266 dev_dbg(sdw->cdns.dev, "PCM cap bd:%d in:%d out:%d\n",
267 config->pcm_bd, config->pcm_in, config->pcm_out);
268
266 /* PDM Stream Capability */ 269 /* PDM Stream Capability */
267 pdm_cap = intel_readw(shim, SDW_SHIM_PDMSCAP(link_id)); 270 pdm_cap = intel_readw(shim, SDW_SHIM_PDMSCAP(link_id));
268 271
@@ -272,6 +275,9 @@ static void intel_pdi_init(struct sdw_intel *sdw,
272 SDW_REG_SHIFT(SDW_SHIM_PDMSCAP_ISS); 275 SDW_REG_SHIFT(SDW_SHIM_PDMSCAP_ISS);
273 config->pdm_out = (pdm_cap & SDW_SHIM_PDMSCAP_OSS) >> 276 config->pdm_out = (pdm_cap & SDW_SHIM_PDMSCAP_OSS) >>
274 SDW_REG_SHIFT(SDW_SHIM_PDMSCAP_OSS); 277 SDW_REG_SHIFT(SDW_SHIM_PDMSCAP_OSS);
278
279 dev_dbg(sdw->cdns.dev, "PDM cap bd:%d in:%d out:%d\n",
280 config->pdm_bd, config->pdm_in, config->pdm_out);
275} 281}
276 282