diff options
| -rw-r--r-- | Documentation/driver-api/soundwire/locking.rst | 4 | ||||
| -rw-r--r-- | drivers/soundwire/bus.c | 6 | ||||
| -rw-r--r-- | drivers/soundwire/cadence_master.c | 30 | ||||
| -rw-r--r-- | drivers/soundwire/intel.c | 17 | ||||
| -rw-r--r-- | drivers/soundwire/intel.h | 2 | ||||
| -rw-r--r-- | drivers/soundwire/intel_init.c | 25 | ||||
| -rw-r--r-- | drivers/soundwire/mipi_disco.c | 35 | ||||
| -rw-r--r-- | drivers/soundwire/stream.c | 8 | ||||
| -rw-r--r-- | include/linux/soundwire/sdw.h | 88 | ||||
| -rw-r--r-- | include/linux/soundwire/sdw_type.h | 11 |
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 | ||
