Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'soundwire-5.10-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/vkoul/soundwire into char-misc-next

Vinod writes:

soundwire updates for 5.10-rc1

This round of update includes:
- Generic bandwidth allocation algorithm from Intel folks
- PM support for Intel chipsets
- Updates to Intel drivers which makes sdw usable on latest laptops
- Support for MMIO SDW controllers found in QC chipsets
- Update to subsystem to use helpers in bitfield.h to manage register
bits

* tag 'soundwire-5.10-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/vkoul/soundwire: (66 commits)
soundwire: sysfs: add slave status and device number before probe
soundwire: bus: add enumerated Slave device to device list
soundwire: remove an unnecessary NULL check
soundwire: cadence: add data port test fail interrupt
soundwire: intel: enable test modes
soundwire: enable Data Port test modes
soundwire: intel: use {u32|u16}p_replace_bits
soundwire: cadence: use u32p_replace_bits
soundwire: qcom: get max rows and cols info from compatible
soundwire: qcom: add support to block packing mode
soundwire: qcom: clear BIT FIELDs before value set.
soundwire: Add generic bandwidth allocation algorithm
soundwire: cadence: add parity error injection through debugfs
soundwire: bus: export broadcast read/write capability for tests
ASoC: codecs: realtek-soundwire: ignore initial PARITY errors
soundwire: bus: use quirk to filter out invalid parity errors
soundwire: slave: add first_interrupt_done status
soundwire: bus: filter-out unwanted interrupt reports
ASoC/soundwire: bus: use property to set interrupt masks
soundwire: qcom: fix SLIBMUS/SLIMBUS typo
...

+1765 -354
+18
Documentation/ABI/testing/sysfs-bus-soundwire-slave
··· 1 + What: /sys/bus/soundwire/devices/sdw:.../status 2 + /sys/bus/soundwire/devices/sdw:.../device_number 3 + 4 + Date: September 2020 5 + 6 + Contact: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> 7 + Bard Liao <yung-chuan.liao@linux.intel.com> 8 + Vinod Koul <vkoul@kernel.org> 9 + 10 + Description: SoundWire Slave status 11 + 12 + These properties report the Slave status, e.g. if it 13 + is UNATTACHED or not, and in the latter case show the 14 + device_number. This status information is useful to 15 + detect devices exposed by platform firmware but not 16 + physically present on the bus, and conversely devices 17 + not exposed in platform firmware but enumerated. 18 + 1 19 What: /sys/bus/soundwire/devices/sdw:.../dev-properties/mipi_revision 2 20 /sys/bus/soundwire/devices/sdw:.../dev-properties/wake_capable 3 21 /sys/bus/soundwire/devices/sdw:.../dev-properties/test_mode_capable
+1
Documentation/devicetree/bindings/soundwire/qcom,sdw.txt
··· 11 11 Example: 12 12 "qcom,soundwire-v1.3.0" 13 13 "qcom,soundwire-v1.5.0" 14 + "qcom,soundwire-v1.5.1" 14 15 "qcom,soundwire-v1.6.0" 15 16 - reg: 16 17 Usage: required
+6 -1
drivers/soundwire/Kconfig
··· 24 24 config SOUNDWIRE_INTEL 25 25 tristate "Intel SoundWire Master driver" 26 26 select SOUNDWIRE_CADENCE 27 + select SOUNDWIRE_GENERIC_ALLOCATION 27 28 depends on ACPI && SND_SOC 28 29 help 29 30 SoundWire Intel Master driver. ··· 34 33 35 34 config SOUNDWIRE_QCOM 36 35 tristate "Qualcomm SoundWire Master driver" 37 - depends on SLIMBUS 36 + imply SLIMBUS 38 37 depends on SND_SOC 39 38 help 40 39 SoundWire Qualcomm Master driver. 41 40 If you have an Qualcomm platform which has a SoundWire Master then 42 41 enable this config option to get the SoundWire support for that 43 42 device 43 + 44 + config SOUNDWIRE_GENERIC_ALLOCATION 45 + tristate 46 + 44 47 endif
+3
drivers/soundwire/Makefile
··· 8 8 sysfs_slave.o sysfs_slave_dpn.o 9 9 obj-$(CONFIG_SOUNDWIRE) += soundwire-bus.o 10 10 11 + soundwire-generic-allocation-objs := generic_bandwidth_allocation.o 12 + obj-$(CONFIG_SOUNDWIRE_GENERIC_ALLOCATION) += soundwire-generic-allocation.o 13 + 11 14 ifdef CONFIG_DEBUG_FS 12 15 soundwire-bus-y += debugfs.o 13 16 endif
+99 -21
drivers/soundwire/bus.c
··· 61 61 return -EINVAL; 62 62 } 63 63 64 + if (!bus->compute_params) { 65 + dev_err(bus->dev, 66 + "Bandwidth allocation not configured, compute_params no set\n"); 67 + return -EINVAL; 68 + } 69 + 64 70 mutex_init(&bus->msg_lock); 65 71 mutex_init(&bus->bus_lock); 66 72 INIT_LIST_HEAD(&bus->slaves); ··· 261 255 return ret; 262 256 } 263 257 258 + static int sdw_transfer_unlocked(struct sdw_bus *bus, struct sdw_msg *msg) 259 + { 260 + int ret; 261 + 262 + ret = do_transfer(bus, msg); 263 + if (ret != 0 && ret != -ENODATA) 264 + dev_err(bus->dev, "trf on Slave %d failed:%d\n", 265 + msg->dev_num, ret); 266 + 267 + if (msg->page) 268 + sdw_reset_page(bus, msg->dev_num); 269 + 270 + return ret; 271 + } 272 + 264 273 /** 265 274 * sdw_transfer() - Synchronous transfer message to a SDW Slave device 266 275 * @bus: SDW bus ··· 287 266 288 267 mutex_lock(&bus->msg_lock); 289 268 290 - ret = do_transfer(bus, msg); 291 - if (ret != 0 && ret != -ENODATA) 292 - dev_err(bus->dev, "trf on Slave %d failed:%d\n", 293 - msg->dev_num, ret); 294 - 295 - if (msg->page) 296 - sdw_reset_page(bus, msg->dev_num); 269 + ret = sdw_transfer_unlocked(bus, msg); 297 270 298 271 mutex_unlock(&bus->msg_lock); 299 272 ··· 362 347 return -EINVAL; 363 348 } 364 349 365 - msg->addr_page1 = (addr >> SDW_REG_SHIFT(SDW_SCP_ADDRPAGE1_MASK)); 366 - msg->addr_page2 = (addr >> SDW_REG_SHIFT(SDW_SCP_ADDRPAGE2_MASK)); 350 + msg->addr_page1 = FIELD_GET(SDW_SCP_ADDRPAGE1_MASK, addr); 351 + msg->addr_page2 = FIELD_GET(SDW_SCP_ADDRPAGE2_MASK, addr); 367 352 msg->addr |= BIT(15); 368 353 msg->page = true; 369 354 ··· 442 427 443 428 return sdw_transfer(bus, &msg); 444 429 } 430 + 431 + int sdw_bread_no_pm_unlocked(struct sdw_bus *bus, u16 dev_num, u32 addr) 432 + { 433 + struct sdw_msg msg; 434 + u8 buf; 435 + int ret; 436 + 437 + ret = sdw_fill_msg(&msg, NULL, addr, 1, dev_num, 438 + SDW_MSG_FLAG_READ, &buf); 439 + if (ret) 440 + return ret; 441 + 442 + ret = sdw_transfer_unlocked(bus, &msg); 443 + if (ret < 0) 444 + return ret; 445 + 446 + return buf; 447 + } 448 + EXPORT_SYMBOL(sdw_bread_no_pm_unlocked); 449 + 450 + int sdw_bwrite_no_pm_unlocked(struct sdw_bus *bus, u16 dev_num, u32 addr, u8 value) 451 + { 452 + struct sdw_msg msg; 453 + int ret; 454 + 455 + ret = sdw_fill_msg(&msg, NULL, addr, 1, dev_num, 456 + SDW_MSG_FLAG_WRITE, &value); 457 + if (ret) 458 + return ret; 459 + 460 + return sdw_transfer_unlocked(bus, &msg); 461 + } 462 + EXPORT_SYMBOL(sdw_bwrite_no_pm_unlocked); 445 463 446 464 static int 447 465 sdw_read_no_pm(struct sdw_slave *slave, u32 addr) ··· 747 699 748 700 if (!found) { 749 701 /* TODO: Park this device in Group 13 */ 702 + 703 + /* 704 + * add Slave device even if there is no platform 705 + * firmware description. There will be no driver probe 706 + * but the user/integration will be able to see the 707 + * device, enumeration status and device number in sysfs 708 + */ 709 + sdw_slave_add(bus, &id, NULL); 710 + 750 711 dev_err(bus->dev, "Slave Entry not found\n"); 751 712 } 752 713 ··· 1108 1051 int ret; 1109 1052 u8 val = 0; 1110 1053 1054 + if (slave->bus->params.s_data_mode != SDW_PORT_DATA_MODE_NORMAL) { 1055 + dev_dbg(&slave->dev, "TEST FAIL interrupt %s\n", 1056 + enable ? "on" : "off"); 1057 + mask |= SDW_DPN_INT_TEST_FAIL; 1058 + } 1059 + 1111 1060 addr = SDW_DPN_INTMASK(port); 1112 1061 1113 1062 /* Set/Clear port ready interrupt mask */ ··· 1247 1184 return ret; 1248 1185 1249 1186 /* 1250 - * Set bus clash, parity and SCP implementation 1251 - * defined interrupt mask 1252 - * TODO: Read implementation defined interrupt mask 1253 - * from Slave property 1187 + * Set SCP_INT1_MASK register, typically bus clash and 1188 + * implementation-defined interrupt mask. The Parity detection 1189 + * may not always be correct on startup so its use is 1190 + * device-dependent, it might e.g. only be enabled in 1191 + * steady-state after a couple of frames. 1254 1192 */ 1255 - val = SDW_SCP_INT1_IMPL_DEF | SDW_SCP_INT1_BUS_CLASH | 1256 - SDW_SCP_INT1_PARITY; 1193 + val = slave->prop.scp_int1_mask; 1257 1194 1258 1195 /* Enable SCP interrupts */ 1259 1196 ret = sdw_update(slave, SDW_SCP_INTMASK1, val, val); ··· 1425 1362 unsigned long port; 1426 1363 bool slave_notify = false; 1427 1364 u8 buf, buf2[2], _buf, _buf2[2]; 1365 + bool parity_check; 1366 + bool parity_quirk; 1428 1367 1429 1368 sdw_modify_slave_status(slave, SDW_SLAVE_ALERT); 1430 1369 ··· 1459 1394 * interrupt 1460 1395 */ 1461 1396 if (buf & SDW_SCP_INT1_PARITY) { 1462 - dev_err(&slave->dev, "Parity error detected\n"); 1397 + parity_check = slave->prop.scp_int1_mask & SDW_SCP_INT1_PARITY; 1398 + parity_quirk = !slave->first_interrupt_done && 1399 + (slave->prop.quirks & SDW_SLAVE_QUIRKS_INVALID_INITIAL_PARITY); 1400 + 1401 + if (parity_check && !parity_quirk) 1402 + dev_err(&slave->dev, "Parity error detected\n"); 1463 1403 clear |= SDW_SCP_INT1_PARITY; 1464 1404 } 1465 1405 1466 1406 if (buf & SDW_SCP_INT1_BUS_CLASH) { 1467 - dev_err(&slave->dev, "Bus clash error detected\n"); 1407 + if (slave->prop.scp_int1_mask & SDW_SCP_INT1_BUS_CLASH) 1408 + dev_err(&slave->dev, "Bus clash detected\n"); 1468 1409 clear |= SDW_SCP_INT1_BUS_CLASH; 1469 1410 } 1470 1411 ··· 1482 1411 */ 1483 1412 1484 1413 if (buf & SDW_SCP_INT1_IMPL_DEF) { 1485 - dev_dbg(&slave->dev, "Slave impl defined interrupt\n"); 1414 + if (slave->prop.scp_int1_mask & SDW_SCP_INT1_IMPL_DEF) { 1415 + dev_dbg(&slave->dev, "Slave impl defined interrupt\n"); 1416 + slave_notify = true; 1417 + } 1486 1418 clear |= SDW_SCP_INT1_IMPL_DEF; 1487 - slave_notify = true; 1488 1419 } 1489 1420 1490 1421 /* Check port 0 - 3 interrupts */ 1491 1422 port = buf & SDW_SCP_INT1_PORT0_3; 1492 1423 1493 1424 /* To get port number corresponding to bits, shift it */ 1494 - port = port >> SDW_REG_SHIFT(SDW_SCP_INT1_PORT0_3); 1425 + port = FIELD_GET(SDW_SCP_INT1_PORT0_3, port); 1495 1426 for_each_set_bit(bit, &port, 8) { 1496 1427 sdw_handle_port_interrupt(slave, bit, 1497 1428 &port_status[bit]); ··· 1540 1467 "SDW_SCP_INT1 write failed:%d\n", ret); 1541 1468 goto io_err; 1542 1469 } 1470 + 1471 + /* at this point all initial interrupt sources were handled */ 1472 + slave->first_interrupt_done = true; 1543 1473 1544 1474 /* 1545 1475 * Read status again to ensure no new interrupts arrived ··· 1746 1670 if (!slave) 1747 1671 continue; 1748 1672 1749 - if (slave->status != SDW_SLAVE_UNATTACHED) 1673 + if (slave->status != SDW_SLAVE_UNATTACHED) { 1750 1674 sdw_modify_slave_status(slave, SDW_SLAVE_UNATTACHED); 1675 + slave->first_interrupt_done = false; 1676 + } 1751 1677 1752 1678 /* keep track of request, used in pm_runtime resume */ 1753 1679 slave->unattach_request = request;
+50 -2
drivers/soundwire/bus.h
··· 19 19 int sdw_of_find_slaves(struct sdw_bus *bus); 20 20 void sdw_extract_slave_id(struct sdw_bus *bus, 21 21 u64 addr, struct sdw_slave_id *id); 22 + int sdw_slave_add(struct sdw_bus *bus, struct sdw_slave_id *id, 23 + struct fwnode_handle *fwnode); 22 24 int sdw_master_device_add(struct sdw_bus *bus, struct device *parent, 23 25 struct fwnode_handle *fwnode); 24 26 int sdw_master_device_del(struct sdw_bus *bus); ··· 71 69 }; 72 70 73 71 #define SDW_DOUBLE_RATE_FACTOR 2 72 + #define SDW_STRM_RATE_GROUPING 1 74 73 75 74 extern int sdw_rows[SDW_FRAME_ROWS]; 76 75 extern int sdw_cols[SDW_FRAME_COLS]; ··· 157 154 int sdw_fill_msg(struct sdw_msg *msg, struct sdw_slave *slave, 158 155 u32 addr, size_t count, u16 dev_num, u8 flags, u8 *buf); 159 156 157 + /* Retrieve and return channel count from channel mask */ 158 + static inline int sdw_ch_mask_to_ch(int ch_mask) 159 + { 160 + int c = 0; 161 + 162 + for (c = 0; ch_mask; ch_mask >>= 1) 163 + c += ch_mask & 1; 164 + 165 + return c; 166 + } 167 + 168 + /* Fill transport parameter data structure */ 169 + static inline void sdw_fill_xport_params(struct sdw_transport_params *params, 170 + int port_num, bool grp_ctrl_valid, 171 + int grp_ctrl, int sample_int, 172 + int off1, int off2, 173 + int hstart, int hstop, 174 + int pack_mode, int lane_ctrl) 175 + { 176 + params->port_num = port_num; 177 + params->blk_grp_ctrl_valid = grp_ctrl_valid; 178 + params->blk_grp_ctrl = grp_ctrl; 179 + params->sample_interval = sample_int; 180 + params->offset1 = off1; 181 + params->offset2 = off2; 182 + params->hstart = hstart; 183 + params->hstop = hstop; 184 + params->blk_pkg_mode = pack_mode; 185 + params->lane_ctrl = lane_ctrl; 186 + } 187 + 188 + /* Fill port parameter data structure */ 189 + static inline void sdw_fill_port_params(struct sdw_port_params *params, 190 + int port_num, int bps, 191 + int flow_mode, int data_mode) 192 + { 193 + params->num = port_num; 194 + params->bps = bps; 195 + params->flow_mode = flow_mode; 196 + params->data_mode = data_mode; 197 + } 198 + 160 199 /* Read-Modify-Write Slave register */ 161 - static inline int 162 - sdw_update(struct sdw_slave *slave, u32 addr, u8 mask, u8 val) 200 + static inline int sdw_update(struct sdw_slave *slave, u32 addr, u8 mask, u8 val) 163 201 { 164 202 int tmp; 165 203 ··· 211 167 tmp = (tmp & ~mask) | val; 212 168 return sdw_write(slave, addr, tmp); 213 169 } 170 + 171 + /* broadcast read/write for tests */ 172 + int sdw_bread_no_pm_unlocked(struct sdw_bus *bus, u16 dev_num, u32 addr); 173 + int sdw_bwrite_no_pm_unlocked(struct sdw_bus *bus, u16 dev_num, u32 addr, u8 value); 214 174 215 175 /* 216 176 * At the moment we only track Master-initiated hw_reset.
+9
drivers/soundwire/bus_type.c
··· 84 84 const struct sdw_device_id *id; 85 85 int ret; 86 86 87 + /* 88 + * fw description is mandatory to bind 89 + */ 90 + if (!dev->fwnode) 91 + return -ENODEV; 92 + 93 + if (!IS_ENABLED(CONFIG_ACPI) && !dev->of_node) 94 + return -ENODEV; 95 + 87 96 id = sdw_get_device_id(slave, drv); 88 97 if (!id) 89 98 return -ENODEV;
+159 -40
drivers/soundwire/cadence_master.c
··· 13 13 #include <linux/io.h> 14 14 #include <linux/module.h> 15 15 #include <linux/mod_devicetable.h> 16 + #include <linux/pm_runtime.h> 16 17 #include <linux/soundwire/sdw_registers.h> 17 18 #include <linux/soundwire/sdw.h> 18 19 #include <sound/pcm_params.h> ··· 51 50 #define CDNS_MCP_CONTROL_BLOCK_WAKEUP BIT(0) 52 51 53 52 #define CDNS_MCP_CMDCTRL 0x8 53 + 54 + #define CDNS_MCP_CMDCTRL_INSERT_PARITY_ERR BIT(2) 55 + 54 56 #define CDNS_MCP_SSPSTAT 0xC 55 57 #define CDNS_MCP_FRAME_SHAPE 0x10 56 58 #define CDNS_MCP_FRAME_SHAPE_INIT 0x14 57 59 #define CDNS_MCP_FRAME_SHAPE_COL_MASK GENMASK(2, 0) 58 - #define CDNS_MCP_FRAME_SHAPE_ROW_OFFSET 3 60 + #define CDNS_MCP_FRAME_SHAPE_ROW_MASK GENMASK(7, 3) 59 61 60 62 #define CDNS_MCP_CONFIG_UPDATE 0x18 61 63 #define CDNS_MCP_CONFIG_UPDATE_BIT BIT(0) ··· 133 129 #define CDNS_MCP_CMD_SSP_TAG BIT(31) 134 130 #define CDNS_MCP_CMD_COMMAND GENMASK(30, 28) 135 131 #define CDNS_MCP_CMD_DEV_ADDR GENMASK(27, 24) 136 - #define CDNS_MCP_CMD_REG_ADDR_H GENMASK(23, 16) 137 - #define CDNS_MCP_CMD_REG_ADDR_L GENMASK(15, 8) 132 + #define CDNS_MCP_CMD_REG_ADDR GENMASK(23, 8) 138 133 #define CDNS_MCP_CMD_REG_DATA GENMASK(7, 0) 139 134 140 135 #define CDNS_MCP_CMD_READ 2 ··· 175 172 #define CDNS_DPN_HCTRL_LCTRL GENMASK(10, 8) 176 173 177 174 #define CDNS_PORTCTRL 0x130 175 + #define CDNS_PORTCTRL_TEST_FAILED BIT(1) 178 176 #define CDNS_PORTCTRL_DIRN BIT(7) 179 177 #define CDNS_PORTCTRL_BANK_INVERT BIT(8) 180 178 ··· 371 367 372 368 DEFINE_DEBUGFS_ATTRIBUTE(cdns_hw_reset_fops, NULL, cdns_hw_reset, "%llu\n"); 373 369 370 + static int cdns_parity_error_injection(void *data, u64 value) 371 + { 372 + struct sdw_cdns *cdns = data; 373 + struct sdw_bus *bus; 374 + int ret; 375 + 376 + if (value != 1) 377 + return -EINVAL; 378 + 379 + bus = &cdns->bus; 380 + 381 + /* 382 + * Resume Master device. If this results in a bus reset, the 383 + * Slave devices will re-attach and be re-enumerated. 384 + */ 385 + ret = pm_runtime_get_sync(bus->dev); 386 + if (ret < 0 && ret != -EACCES) { 387 + dev_err_ratelimited(cdns->dev, 388 + "pm_runtime_get_sync failed in %s, ret %d\n", 389 + __func__, ret); 390 + pm_runtime_put_noidle(bus->dev); 391 + return ret; 392 + } 393 + 394 + /* 395 + * wait long enough for Slave(s) to be in steady state. This 396 + * does not need to be super precise. 397 + */ 398 + msleep(200); 399 + 400 + /* 401 + * Take the bus lock here to make sure that any bus transactions 402 + * will be queued while we inject a parity error on a dummy read 403 + */ 404 + mutex_lock(&bus->bus_lock); 405 + 406 + /* program hardware to inject parity error */ 407 + cdns_updatel(cdns, CDNS_MCP_CMDCTRL, 408 + CDNS_MCP_CMDCTRL_INSERT_PARITY_ERR, 409 + CDNS_MCP_CMDCTRL_INSERT_PARITY_ERR); 410 + 411 + /* commit changes */ 412 + cdns_updatel(cdns, CDNS_MCP_CONFIG_UPDATE, 413 + CDNS_MCP_CONFIG_UPDATE_BIT, 414 + CDNS_MCP_CONFIG_UPDATE_BIT); 415 + 416 + /* do a broadcast dummy read to avoid bus clashes */ 417 + ret = sdw_bread_no_pm_unlocked(&cdns->bus, 0xf, SDW_SCP_DEVID_0); 418 + dev_info(cdns->dev, "parity error injection, read: %d\n", ret); 419 + 420 + /* program hardware to disable parity error */ 421 + cdns_updatel(cdns, CDNS_MCP_CMDCTRL, 422 + CDNS_MCP_CMDCTRL_INSERT_PARITY_ERR, 423 + 0); 424 + 425 + /* commit changes */ 426 + cdns_updatel(cdns, CDNS_MCP_CONFIG_UPDATE, 427 + CDNS_MCP_CONFIG_UPDATE_BIT, 428 + CDNS_MCP_CONFIG_UPDATE_BIT); 429 + 430 + /* Continue bus operation with parity error injection disabled */ 431 + mutex_unlock(&bus->bus_lock); 432 + 433 + /* Userspace changed the hardware state behind the kernel's back */ 434 + add_taint(TAINT_USER, LOCKDEP_STILL_OK); 435 + 436 + /* 437 + * allow Master device to enter pm_runtime suspend. This may 438 + * also result in Slave devices suspending. 439 + */ 440 + pm_runtime_mark_last_busy(bus->dev); 441 + pm_runtime_put_autosuspend(bus->dev); 442 + 443 + return 0; 444 + } 445 + 446 + DEFINE_DEBUGFS_ATTRIBUTE(cdns_parity_error_fops, NULL, 447 + cdns_parity_error_injection, "%llu\n"); 448 + 374 449 /** 375 450 * sdw_cdns_debugfs_init() - Cadence debugfs init 376 451 * @cdns: Cadence instance ··· 461 378 462 379 debugfs_create_file("cdns-hw-reset", 0200, root, cdns, 463 380 &cdns_hw_reset_fops); 381 + 382 + debugfs_create_file("cdns-parity-error-injection", 0200, root, cdns, 383 + &cdns_parity_error_fops); 464 384 } 465 385 EXPORT_SYMBOL_GPL(sdw_cdns_debugfs_init); 466 386 ··· 503 417 504 418 /* fill response */ 505 419 for (i = 0; i < count; i++) 506 - msg->buf[i + offset] = cdns->response_buf[i] >> 507 - SDW_REG_SHIFT(CDNS_MCP_RESP_RDATA); 420 + msg->buf[i + offset] = FIELD_GET(CDNS_MCP_RESP_RDATA, cdns->response_buf[i]); 508 421 509 422 return SDW_CMD_OK; 510 423 } ··· 526 441 addr = msg->addr; 527 442 528 443 for (i = 0; i < count; i++) { 529 - data = msg->dev_num << SDW_REG_SHIFT(CDNS_MCP_CMD_DEV_ADDR); 530 - data |= cmd << SDW_REG_SHIFT(CDNS_MCP_CMD_COMMAND); 531 - data |= addr++ << SDW_REG_SHIFT(CDNS_MCP_CMD_REG_ADDR_L); 444 + data = FIELD_PREP(CDNS_MCP_CMD_DEV_ADDR, msg->dev_num); 445 + data |= FIELD_PREP(CDNS_MCP_CMD_COMMAND, cmd); 446 + data |= FIELD_PREP(CDNS_MCP_CMD_REG_ADDR, addr); 447 + addr++; 532 448 533 449 if (msg->flags == SDW_MSG_FLAG_WRITE) 534 450 data |= msg->buf[i + offset]; 535 451 536 - data |= msg->ssp_sync << SDW_REG_SHIFT(CDNS_MCP_CMD_SSP_TAG); 452 + data |= FIELD_PREP(CDNS_MCP_CMD_SSP_TAG, msg->ssp_sync); 537 453 cdns_writel(cdns, base, data); 538 454 base += CDNS_MCP_CMD_WORD_LEN; 539 455 } ··· 569 483 cdns->msg_count = CDNS_SCP_RX_FIFOLEVEL; 570 484 } 571 485 572 - data[0] = msg->dev_num << SDW_REG_SHIFT(CDNS_MCP_CMD_DEV_ADDR); 573 - data[0] |= 0x3 << SDW_REG_SHIFT(CDNS_MCP_CMD_COMMAND); 486 + data[0] = FIELD_PREP(CDNS_MCP_CMD_DEV_ADDR, msg->dev_num); 487 + data[0] |= FIELD_PREP(CDNS_MCP_CMD_COMMAND, 0x3); 574 488 data[1] = data[0]; 575 489 576 - data[0] |= SDW_SCP_ADDRPAGE1 << SDW_REG_SHIFT(CDNS_MCP_CMD_REG_ADDR_L); 577 - data[1] |= SDW_SCP_ADDRPAGE2 << SDW_REG_SHIFT(CDNS_MCP_CMD_REG_ADDR_L); 490 + data[0] |= FIELD_PREP(CDNS_MCP_CMD_REG_ADDR, SDW_SCP_ADDRPAGE1); 491 + data[1] |= FIELD_PREP(CDNS_MCP_CMD_REG_ADDR, SDW_SCP_ADDRPAGE2); 578 492 579 493 data[0] |= msg->addr_page1; 580 494 data[1] |= msg->addr_page2; ··· 871 785 dev_err_ratelimited(cdns->dev, "Bus clash for data word\n"); 872 786 } 873 787 788 + if (cdns->bus.params.m_data_mode != SDW_PORT_DATA_MODE_NORMAL && 789 + int_status & CDNS_MCP_INT_DPINT) { 790 + u32 port_intstat; 791 + 792 + /* just log which ports report an error */ 793 + port_intstat = cdns_readl(cdns, CDNS_MCP_PORT_INTSTAT); 794 + dev_err_ratelimited(cdns->dev, "DP interrupt: PortIntStat %8x\n", 795 + port_intstat); 796 + 797 + /* clear status w/ write1 */ 798 + cdns_writel(cdns, CDNS_MCP_PORT_INTSTAT, port_intstat); 799 + } 800 + 874 801 if (int_status & CDNS_MCP_INT_SLAVE_MASK) { 875 802 /* Mask the Slave interrupt and wake thread */ 876 803 cdns_updatel(cdns, CDNS_MCP_INTMASK, 877 804 CDNS_MCP_INT_SLAVE_MASK, 0); 878 805 879 806 int_status &= ~CDNS_MCP_INT_SLAVE_MASK; 880 - schedule_work(&cdns->work); 807 + 808 + /* 809 + * Deal with possible race condition between interrupt 810 + * handling and disabling interrupts on suspend. 811 + * 812 + * If the master is in the process of disabling 813 + * interrupts, don't schedule a workqueue 814 + */ 815 + if (cdns->interrupt_enabled) 816 + schedule_work(&cdns->work); 881 817 } 882 818 883 819 cdns_writel(cdns, CDNS_MCP_INTSTAT, int_status); ··· 1008 900 mask |= CDNS_MCP_INT_CTRL_CLASH | CDNS_MCP_INT_DATA_CLASH | 1009 901 CDNS_MCP_INT_PARITY; 1010 902 1011 - /* no detection of port interrupts for now */ 903 + /* port interrupt limited to test modes for now */ 904 + if (cdns->bus.params.m_data_mode != SDW_PORT_DATA_MODE_NORMAL) 905 + mask |= CDNS_MCP_INT_DPINT; 1012 906 1013 907 /* enable detection of RX fifo level */ 1014 908 mask |= CDNS_MCP_INT_RX_WL; ··· 1034 924 slave_state = cdns_readl(cdns, CDNS_MCP_SLAVE_INTSTAT1); 1035 925 cdns_writel(cdns, CDNS_MCP_SLAVE_INTSTAT1, slave_state); 1036 926 } 927 + cdns->interrupt_enabled = state; 928 + 929 + /* 930 + * Complete any on-going status updates before updating masks, 931 + * and cancel queued status updates. 932 + * 933 + * There could be a race with a new interrupt thrown before 934 + * the 3 mask updates below are complete, so in the interrupt 935 + * we use the 'interrupt_enabled' status to prevent new work 936 + * from being queued. 937 + */ 938 + if (!state) 939 + cancel_work_sync(&cdns->work); 1037 940 1038 941 cdns_writel(cdns, CDNS_MCP_SLAVE_INTMASK0, slave_intmask0); 1039 942 cdns_writel(cdns, CDNS_MCP_SLAVE_INTMASK1, slave_intmask1); ··· 1164 1041 int r; 1165 1042 1166 1043 r = sdw_find_row_index(n_rows); 1167 - c = sdw_find_col_index(n_cols) & CDNS_MCP_FRAME_SHAPE_COL_MASK; 1044 + c = sdw_find_col_index(n_cols); 1168 1045 1169 - val = (r << CDNS_MCP_FRAME_SHAPE_ROW_OFFSET) | c; 1046 + val = FIELD_PREP(CDNS_MCP_FRAME_SHAPE_ROW_MASK, r); 1047 + val |= FIELD_PREP(CDNS_MCP_FRAME_SHAPE_COL_MASK, c); 1170 1048 1171 1049 return val; 1172 1050 } ··· 1294 1170 1295 1171 dpn_config = cdns_readl(cdns, dpn_config_off); 1296 1172 1297 - dpn_config |= ((p_params->bps - 1) << 1298 - SDW_REG_SHIFT(CDNS_DPN_CONFIG_WL)); 1299 - dpn_config |= (p_params->flow_mode << 1300 - SDW_REG_SHIFT(CDNS_DPN_CONFIG_PORT_FLOW)); 1301 - dpn_config |= (p_params->data_mode << 1302 - SDW_REG_SHIFT(CDNS_DPN_CONFIG_PORT_DAT)); 1173 + u32p_replace_bits(&dpn_config, (p_params->bps - 1), CDNS_DPN_CONFIG_WL); 1174 + u32p_replace_bits(&dpn_config, p_params->flow_mode, CDNS_DPN_CONFIG_PORT_FLOW); 1175 + u32p_replace_bits(&dpn_config, p_params->data_mode, CDNS_DPN_CONFIG_PORT_DAT); 1303 1176 1304 1177 cdns_writel(cdns, dpn_config_off, dpn_config); 1305 1178 ··· 1332 1211 } 1333 1212 1334 1213 dpn_config = cdns_readl(cdns, dpn_config_off); 1335 - 1336 - dpn_config |= (t_params->blk_grp_ctrl << 1337 - SDW_REG_SHIFT(CDNS_DPN_CONFIG_BGC)); 1338 - dpn_config |= (t_params->blk_pkg_mode << 1339 - SDW_REG_SHIFT(CDNS_DPN_CONFIG_BPM)); 1214 + u32p_replace_bits(&dpn_config, t_params->blk_grp_ctrl, CDNS_DPN_CONFIG_BGC); 1215 + u32p_replace_bits(&dpn_config, t_params->blk_pkg_mode, CDNS_DPN_CONFIG_BPM); 1340 1216 cdns_writel(cdns, dpn_config_off, dpn_config); 1341 1217 1342 - dpn_offsetctrl |= (t_params->offset1 << 1343 - SDW_REG_SHIFT(CDNS_DPN_OFFSET_CTRL_1)); 1344 - dpn_offsetctrl |= (t_params->offset2 << 1345 - SDW_REG_SHIFT(CDNS_DPN_OFFSET_CTRL_2)); 1218 + u32p_replace_bits(&dpn_offsetctrl, t_params->offset1, CDNS_DPN_OFFSET_CTRL_1); 1219 + u32p_replace_bits(&dpn_offsetctrl, t_params->offset2, CDNS_DPN_OFFSET_CTRL_2); 1346 1220 cdns_writel(cdns, dpn_offsetctrl_off, dpn_offsetctrl); 1347 1221 1348 - dpn_hctrl |= (t_params->hstart << 1349 - SDW_REG_SHIFT(CDNS_DPN_HCTRL_HSTART)); 1350 - dpn_hctrl |= (t_params->hstop << SDW_REG_SHIFT(CDNS_DPN_HCTRL_HSTOP)); 1351 - dpn_hctrl |= (t_params->lane_ctrl << 1352 - SDW_REG_SHIFT(CDNS_DPN_HCTRL_LCTRL)); 1222 + u32p_replace_bits(&dpn_hctrl, t_params->hstart, CDNS_DPN_HCTRL_HSTART); 1223 + u32p_replace_bits(&dpn_hctrl, t_params->hstop, CDNS_DPN_HCTRL_HSTOP); 1224 + u32p_replace_bits(&dpn_hctrl, t_params->lane_ctrl, CDNS_DPN_HCTRL_LCTRL); 1353 1225 1354 1226 cdns_writel(cdns, dpn_hctrl_off, dpn_hctrl); 1355 1227 cdns_writel(cdns, dpn_samplectrl_off, (t_params->sample_interval - 1)); ··· 1640 1526 { 1641 1527 u32 offset, val = 0; 1642 1528 1643 - if (dir == SDW_DATA_DIR_RX) 1529 + if (dir == SDW_DATA_DIR_RX) { 1644 1530 val = CDNS_PORTCTRL_DIRN; 1645 1531 1532 + if (cdns->bus.params.m_data_mode != SDW_PORT_DATA_MODE_NORMAL) 1533 + val |= CDNS_PORTCTRL_TEST_FAILED; 1534 + } 1646 1535 offset = CDNS_PORTCTRL + pdi->num * CDNS_PORT_OFFSET; 1647 - cdns_updatel(cdns, offset, CDNS_PORTCTRL_DIRN, val); 1536 + cdns_updatel(cdns, offset, 1537 + CDNS_PORTCTRL_DIRN | CDNS_PORTCTRL_TEST_FAILED, 1538 + val); 1648 1539 1649 1540 val = pdi->num; 1650 1541 val |= CDNS_PDI_CONFIG_SOFT_RESET; 1651 - val |= ((1 << ch) - 1) << SDW_REG_SHIFT(CDNS_PDI_CONFIG_CHANNEL); 1542 + val |= FIELD_PREP(CDNS_PDI_CONFIG_CHANNEL, (1 << ch) - 1); 1652 1543 cdns_writel(cdns, CDNS_PDI_CONFIG(pdi->num), val); 1653 1544 } 1654 1545 EXPORT_SYMBOL(sdw_cdns_config_stream);
+5
drivers/soundwire/cadence_master.h
··· 84 84 * @bus: Bus handle 85 85 * @stream_type: Stream type 86 86 * @link_id: Master link id 87 + * @hw_params: hw_params to be applied in .prepare step 88 + * @suspended: status set when suspended, to be used in .prepare 87 89 */ 88 90 struct sdw_cdns_dma_data { 89 91 char *name; ··· 94 92 struct sdw_bus *bus; 95 93 enum sdw_stream_type stream_type; 96 94 int link_id; 95 + struct snd_pcm_hw_params *hw_params; 96 + bool suspended; 97 97 }; 98 98 99 99 /** ··· 133 129 134 130 bool link_up; 135 131 unsigned int msg_count; 132 + bool interrupt_enabled; 136 133 137 134 struct work_struct work; 138 135
+425
drivers/soundwire/generic_bandwidth_allocation.c
··· 1 + // SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause) 2 + // Copyright(c) 2015-2020 Intel Corporation. 3 + 4 + /* 5 + * Bandwidth management algorithm based on 2^n gears 6 + * 7 + */ 8 + 9 + #include <linux/device.h> 10 + #include <linux/module.h> 11 + #include <linux/mod_devicetable.h> 12 + #include <linux/slab.h> 13 + #include <linux/soundwire/sdw.h> 14 + #include "bus.h" 15 + 16 + #define SDW_STRM_RATE_GROUPING 1 17 + 18 + struct sdw_group_params { 19 + unsigned int rate; 20 + int full_bw; 21 + int payload_bw; 22 + int hwidth; 23 + }; 24 + 25 + struct sdw_group { 26 + unsigned int count; 27 + unsigned int max_size; 28 + unsigned int *rates; 29 + }; 30 + 31 + struct sdw_transport_data { 32 + int hstart; 33 + int hstop; 34 + int block_offset; 35 + int sub_block_offset; 36 + }; 37 + 38 + static void sdw_compute_slave_ports(struct sdw_master_runtime *m_rt, 39 + struct sdw_transport_data *t_data) 40 + { 41 + struct sdw_slave_runtime *s_rt = NULL; 42 + struct sdw_port_runtime *p_rt; 43 + int port_bo, sample_int; 44 + unsigned int rate, bps, ch = 0; 45 + unsigned int slave_total_ch; 46 + struct sdw_bus_params *b_params = &m_rt->bus->params; 47 + 48 + port_bo = t_data->block_offset; 49 + 50 + list_for_each_entry(s_rt, &m_rt->slave_rt_list, m_rt_node) { 51 + rate = m_rt->stream->params.rate; 52 + bps = m_rt->stream->params.bps; 53 + sample_int = (m_rt->bus->params.curr_dr_freq / rate); 54 + slave_total_ch = 0; 55 + 56 + list_for_each_entry(p_rt, &s_rt->port_list, port_node) { 57 + ch = sdw_ch_mask_to_ch(p_rt->ch_mask); 58 + 59 + sdw_fill_xport_params(&p_rt->transport_params, 60 + p_rt->num, false, 61 + SDW_BLK_GRP_CNT_1, 62 + sample_int, port_bo, port_bo >> 8, 63 + t_data->hstart, 64 + t_data->hstop, 65 + (SDW_BLK_GRP_CNT_1 * ch), 0x0); 66 + 67 + sdw_fill_port_params(&p_rt->port_params, 68 + p_rt->num, bps, 69 + SDW_PORT_FLOW_MODE_ISOCH, 70 + b_params->s_data_mode); 71 + 72 + port_bo += bps * ch; 73 + slave_total_ch += ch; 74 + } 75 + 76 + if (m_rt->direction == SDW_DATA_DIR_TX && 77 + m_rt->ch_count == slave_total_ch) { 78 + /* 79 + * Slave devices were configured to access all channels 80 + * of the stream, which indicates that they operate in 81 + * 'mirror mode'. Make sure we reset the port offset for 82 + * the next device in the list 83 + */ 84 + port_bo = t_data->block_offset; 85 + } 86 + } 87 + } 88 + 89 + static void sdw_compute_master_ports(struct sdw_master_runtime *m_rt, 90 + struct sdw_group_params *params, 91 + int port_bo, int hstop) 92 + { 93 + struct sdw_transport_data t_data = {0}; 94 + struct sdw_port_runtime *p_rt; 95 + struct sdw_bus *bus = m_rt->bus; 96 + struct sdw_bus_params *b_params = &bus->params; 97 + int sample_int, hstart = 0; 98 + unsigned int rate, bps, ch, no_ch; 99 + 100 + rate = m_rt->stream->params.rate; 101 + bps = m_rt->stream->params.bps; 102 + ch = m_rt->ch_count; 103 + sample_int = (bus->params.curr_dr_freq / rate); 104 + 105 + if (rate != params->rate) 106 + return; 107 + 108 + t_data.hstop = hstop; 109 + hstart = hstop - params->hwidth + 1; 110 + t_data.hstart = hstart; 111 + 112 + list_for_each_entry(p_rt, &m_rt->port_list, port_node) { 113 + no_ch = sdw_ch_mask_to_ch(p_rt->ch_mask); 114 + 115 + sdw_fill_xport_params(&p_rt->transport_params, p_rt->num, 116 + false, SDW_BLK_GRP_CNT_1, sample_int, 117 + port_bo, port_bo >> 8, hstart, hstop, 118 + (SDW_BLK_GRP_CNT_1 * no_ch), 0x0); 119 + 120 + sdw_fill_port_params(&p_rt->port_params, 121 + p_rt->num, bps, 122 + SDW_PORT_FLOW_MODE_ISOCH, 123 + b_params->m_data_mode); 124 + 125 + /* Check for first entry */ 126 + if (!(p_rt == list_first_entry(&m_rt->port_list, 127 + struct sdw_port_runtime, 128 + port_node))) { 129 + port_bo += bps * ch; 130 + continue; 131 + } 132 + 133 + t_data.hstart = hstart; 134 + t_data.hstop = hstop; 135 + t_data.block_offset = port_bo; 136 + t_data.sub_block_offset = 0; 137 + port_bo += bps * ch; 138 + } 139 + 140 + sdw_compute_slave_ports(m_rt, &t_data); 141 + } 142 + 143 + static void _sdw_compute_port_params(struct sdw_bus *bus, 144 + struct sdw_group_params *params, int count) 145 + { 146 + struct sdw_master_runtime *m_rt = NULL; 147 + int hstop = bus->params.col - 1; 148 + int block_offset, port_bo, i; 149 + 150 + /* Run loop for all groups to compute transport parameters */ 151 + for (i = 0; i < count; i++) { 152 + port_bo = 1; 153 + block_offset = 1; 154 + 155 + list_for_each_entry(m_rt, &bus->m_rt_list, bus_node) { 156 + sdw_compute_master_ports(m_rt, &params[i], 157 + port_bo, hstop); 158 + 159 + block_offset += m_rt->ch_count * 160 + m_rt->stream->params.bps; 161 + port_bo = block_offset; 162 + } 163 + 164 + hstop = hstop - params[i].hwidth; 165 + } 166 + } 167 + 168 + static int sdw_compute_group_params(struct sdw_bus *bus, 169 + struct sdw_group_params *params, 170 + int *rates, int count) 171 + { 172 + struct sdw_master_runtime *m_rt = NULL; 173 + int sel_col = bus->params.col; 174 + unsigned int rate, bps, ch; 175 + int i, column_needed = 0; 176 + 177 + /* Calculate bandwidth per group */ 178 + for (i = 0; i < count; i++) { 179 + params[i].rate = rates[i]; 180 + params[i].full_bw = bus->params.curr_dr_freq / params[i].rate; 181 + } 182 + 183 + list_for_each_entry(m_rt, &bus->m_rt_list, bus_node) { 184 + rate = m_rt->stream->params.rate; 185 + bps = m_rt->stream->params.bps; 186 + ch = m_rt->ch_count; 187 + 188 + for (i = 0; i < count; i++) { 189 + if (rate == params[i].rate) 190 + params[i].payload_bw += bps * ch; 191 + } 192 + } 193 + 194 + for (i = 0; i < count; i++) { 195 + params[i].hwidth = (sel_col * 196 + params[i].payload_bw + params[i].full_bw - 1) / 197 + params[i].full_bw; 198 + 199 + column_needed += params[i].hwidth; 200 + } 201 + 202 + if (column_needed > sel_col - 1) 203 + return -EINVAL; 204 + 205 + return 0; 206 + } 207 + 208 + static int sdw_add_element_group_count(struct sdw_group *group, 209 + unsigned int rate) 210 + { 211 + int num = group->count; 212 + int i; 213 + 214 + for (i = 0; i <= num; i++) { 215 + if (rate == group->rates[i]) 216 + break; 217 + 218 + if (i != num) 219 + continue; 220 + 221 + if (group->count >= group->max_size) { 222 + unsigned int *rates; 223 + 224 + group->max_size += 1; 225 + rates = krealloc(group->rates, 226 + (sizeof(int) * group->max_size), 227 + GFP_KERNEL); 228 + if (!rates) 229 + return -ENOMEM; 230 + group->rates = rates; 231 + } 232 + 233 + group->rates[group->count++] = rate; 234 + } 235 + 236 + return 0; 237 + } 238 + 239 + static int sdw_get_group_count(struct sdw_bus *bus, 240 + struct sdw_group *group) 241 + { 242 + struct sdw_master_runtime *m_rt; 243 + unsigned int rate; 244 + int ret = 0; 245 + 246 + group->count = 0; 247 + group->max_size = SDW_STRM_RATE_GROUPING; 248 + group->rates = kcalloc(group->max_size, sizeof(int), GFP_KERNEL); 249 + if (!group->rates) 250 + return -ENOMEM; 251 + 252 + list_for_each_entry(m_rt, &bus->m_rt_list, bus_node) { 253 + rate = m_rt->stream->params.rate; 254 + if (m_rt == list_first_entry(&bus->m_rt_list, 255 + struct sdw_master_runtime, 256 + bus_node)) { 257 + group->rates[group->count++] = rate; 258 + 259 + } else { 260 + ret = sdw_add_element_group_count(group, rate); 261 + if (ret < 0) { 262 + kfree(group->rates); 263 + return ret; 264 + } 265 + } 266 + } 267 + 268 + return ret; 269 + } 270 + 271 + /** 272 + * sdw_compute_port_params: Compute transport and port parameters 273 + * 274 + * @bus: SDW Bus instance 275 + */ 276 + static int sdw_compute_port_params(struct sdw_bus *bus) 277 + { 278 + struct sdw_group_params *params = NULL; 279 + struct sdw_group group; 280 + int ret; 281 + 282 + ret = sdw_get_group_count(bus, &group); 283 + if (ret < 0) 284 + return ret; 285 + 286 + if (group.count == 0) 287 + goto out; 288 + 289 + params = kcalloc(group.count, sizeof(*params), GFP_KERNEL); 290 + if (!params) { 291 + ret = -ENOMEM; 292 + goto out; 293 + } 294 + 295 + /* Compute transport parameters for grouped streams */ 296 + ret = sdw_compute_group_params(bus, params, 297 + &group.rates[0], group.count); 298 + if (ret < 0) 299 + goto free_params; 300 + 301 + _sdw_compute_port_params(bus, params, group.count); 302 + 303 + free_params: 304 + kfree(params); 305 + out: 306 + kfree(group.rates); 307 + 308 + return ret; 309 + } 310 + 311 + static int sdw_select_row_col(struct sdw_bus *bus, int clk_freq) 312 + { 313 + struct sdw_master_prop *prop = &bus->prop; 314 + int frame_int, frame_freq; 315 + int r, c; 316 + 317 + for (c = 0; c < SDW_FRAME_COLS; c++) { 318 + for (r = 0; r < SDW_FRAME_ROWS; r++) { 319 + if (sdw_rows[r] != prop->default_row || 320 + sdw_cols[c] != prop->default_col) 321 + continue; 322 + 323 + frame_int = sdw_rows[r] * sdw_cols[c]; 324 + frame_freq = clk_freq / frame_int; 325 + 326 + if ((clk_freq - (frame_freq * SDW_FRAME_CTRL_BITS)) < 327 + bus->params.bandwidth) 328 + continue; 329 + 330 + bus->params.row = sdw_rows[r]; 331 + bus->params.col = sdw_cols[c]; 332 + return 0; 333 + } 334 + } 335 + 336 + return -EINVAL; 337 + } 338 + 339 + /** 340 + * sdw_compute_bus_params: Compute bus parameters 341 + * 342 + * @bus: SDW Bus instance 343 + */ 344 + static int sdw_compute_bus_params(struct sdw_bus *bus) 345 + { 346 + unsigned int max_dr_freq, curr_dr_freq = 0; 347 + struct sdw_master_prop *mstr_prop = &bus->prop; 348 + int i, clk_values, ret; 349 + bool is_gear = false; 350 + u32 *clk_buf; 351 + 352 + if (mstr_prop->num_clk_gears) { 353 + clk_values = mstr_prop->num_clk_gears; 354 + clk_buf = mstr_prop->clk_gears; 355 + is_gear = true; 356 + } else if (mstr_prop->num_clk_freq) { 357 + clk_values = mstr_prop->num_clk_freq; 358 + clk_buf = mstr_prop->clk_freq; 359 + } else { 360 + clk_values = 1; 361 + clk_buf = NULL; 362 + } 363 + 364 + max_dr_freq = mstr_prop->max_clk_freq * SDW_DOUBLE_RATE_FACTOR; 365 + 366 + for (i = 0; i < clk_values; i++) { 367 + if (!clk_buf) 368 + curr_dr_freq = max_dr_freq; 369 + else 370 + curr_dr_freq = (is_gear) ? 371 + (max_dr_freq >> clk_buf[i]) : 372 + clk_buf[i] * SDW_DOUBLE_RATE_FACTOR; 373 + 374 + if (curr_dr_freq <= bus->params.bandwidth) 375 + continue; 376 + 377 + break; 378 + 379 + /* 380 + * TODO: Check all the Slave(s) port(s) audio modes and find 381 + * whether given clock rate is supported with glitchless 382 + * transition. 383 + */ 384 + } 385 + 386 + if (i == clk_values) 387 + return -EINVAL; 388 + 389 + ret = sdw_select_row_col(bus, curr_dr_freq); 390 + if (ret < 0) 391 + return -EINVAL; 392 + 393 + bus->params.curr_dr_freq = curr_dr_freq; 394 + return 0; 395 + } 396 + 397 + /** 398 + * sdw_compute_params: Compute bus, transport and port parameters 399 + * 400 + * @bus: SDW Bus instance 401 + */ 402 + int sdw_compute_params(struct sdw_bus *bus) 403 + { 404 + int ret; 405 + 406 + /* Computes clock frequency, frame shape and frame frequency */ 407 + ret = sdw_compute_bus_params(bus); 408 + if (ret < 0) { 409 + dev_err(bus->dev, "Compute bus params failed: %d", ret); 410 + return ret; 411 + } 412 + 413 + /* Compute transport and port params */ 414 + ret = sdw_compute_port_params(bus); 415 + if (ret < 0) { 416 + dev_err(bus->dev, "Compute transport params failed: %d", ret); 417 + return ret; 418 + } 419 + 420 + return 0; 421 + } 422 + EXPORT_SYMBOL(sdw_compute_params); 423 + 424 + MODULE_LICENSE("Dual BSD/GPL"); 425 + MODULE_DESCRIPTION("SoundWire Generic Bandwidth Allocation");
+704 -103
drivers/soundwire/intel.c
··· 22 22 #include "bus.h" 23 23 #include "intel.h" 24 24 25 + #define INTEL_MASTER_SUSPEND_DELAY_MS 3000 26 + 27 + /* 28 + * debug/config flags for the Intel SoundWire Master. 29 + * 30 + * Since we may have multiple masters active, we can have up to 8 31 + * flags reused in each byte, with master0 using the ls-byte, etc. 32 + */ 33 + 34 + #define SDW_INTEL_MASTER_DISABLE_PM_RUNTIME BIT(0) 35 + #define SDW_INTEL_MASTER_DISABLE_CLOCK_STOP BIT(1) 36 + #define SDW_INTEL_MASTER_DISABLE_PM_RUNTIME_IDLE BIT(2) 37 + #define SDW_INTEL_MASTER_DISABLE_MULTI_LINK BIT(3) 38 + 39 + static int md_flags; 40 + module_param_named(sdw_md_flags, md_flags, int, 0444); 41 + MODULE_PARM_DESC(sdw_md_flags, "SoundWire Intel Master device flags (0x0 all off)"); 42 + 25 43 /* Intel SHIM Registers Definition */ 26 44 #define SDW_SHIM_LCAP 0x0 27 45 #define SDW_SHIM_LCTL 0x4 ··· 63 45 #define SDW_SHIM_WAKESTS 0x192 64 46 65 47 #define SDW_SHIM_LCTL_SPA BIT(0) 48 + #define SDW_SHIM_LCTL_SPA_MASK GENMASK(3, 0) 66 49 #define SDW_SHIM_LCTL_CPA BIT(8) 50 + #define SDW_SHIM_LCTL_CPA_MASK GENMASK(11, 8) 67 51 68 52 #define SDW_SHIM_SYNC_SYNCPRD_VAL_24 (24000 / SDW_CADENCE_GSYNC_KHZ - 1) 69 53 #define SDW_SHIM_SYNC_SYNCPRD_VAL_38_4 (38400 / SDW_CADENCE_GSYNC_KHZ - 1) ··· 262 242 } 263 243 DEFINE_SHOW_ATTRIBUTE(intel_reg); 264 244 245 + static int intel_set_m_datamode(void *data, u64 value) 246 + { 247 + struct sdw_intel *sdw = data; 248 + struct sdw_bus *bus = &sdw->cdns.bus; 249 + 250 + if (value > SDW_PORT_DATA_MODE_STATIC_1) 251 + return -EINVAL; 252 + 253 + /* Userspace changed the hardware state behind the kernel's back */ 254 + add_taint(TAINT_USER, LOCKDEP_STILL_OK); 255 + 256 + bus->params.m_data_mode = value; 257 + 258 + return 0; 259 + } 260 + DEFINE_DEBUGFS_ATTRIBUTE(intel_set_m_datamode_fops, NULL, 261 + intel_set_m_datamode, "%llu\n"); 262 + 263 + static int intel_set_s_datamode(void *data, u64 value) 264 + { 265 + struct sdw_intel *sdw = data; 266 + struct sdw_bus *bus = &sdw->cdns.bus; 267 + 268 + if (value > SDW_PORT_DATA_MODE_STATIC_1) 269 + return -EINVAL; 270 + 271 + /* Userspace changed the hardware state behind the kernel's back */ 272 + add_taint(TAINT_USER, LOCKDEP_STILL_OK); 273 + 274 + bus->params.s_data_mode = value; 275 + 276 + return 0; 277 + } 278 + DEFINE_DEBUGFS_ATTRIBUTE(intel_set_s_datamode_fops, NULL, 279 + intel_set_s_datamode, "%llu\n"); 280 + 265 281 static void intel_debugfs_init(struct sdw_intel *sdw) 266 282 { 267 283 struct dentry *root = sdw->cdns.bus.debugfs; ··· 309 253 310 254 debugfs_create_file("intel-registers", 0400, sdw->debugfs, sdw, 311 255 &intel_reg_fops); 256 + 257 + debugfs_create_file("intel-m-datamode", 0200, sdw->debugfs, sdw, 258 + &intel_set_m_datamode_fops); 259 + 260 + debugfs_create_file("intel-s-datamode", 0200, sdw->debugfs, sdw, 261 + &intel_set_s_datamode_fops); 312 262 313 263 sdw_cdns_debugfs_init(&sdw->cdns, sdw->debugfs); 314 264 } ··· 339 277 u32 *shim_mask = sdw->link_res->shim_mask; 340 278 struct sdw_bus *bus = &sdw->cdns.bus; 341 279 struct sdw_master_prop *prop = &bus->prop; 342 - int spa_mask, cpa_mask; 343 - int link_control; 280 + u32 spa_mask, cpa_mask; 281 + u32 link_control; 344 282 int ret = 0; 345 283 u32 syncprd; 346 284 u32 sync_reg; ··· 363 301 syncprd = SDW_SHIM_SYNC_SYNCPRD_VAL_24; 364 302 365 303 if (!*shim_mask) { 304 + dev_dbg(sdw->cdns.dev, "%s: powering up all links\n", __func__); 305 + 366 306 /* we first need to program the SyncPRD/CPU registers */ 367 307 dev_dbg(sdw->cdns.dev, 368 308 "%s: first link up, programming SYNCPRD\n", __func__); 369 309 370 310 /* set SyncPRD period */ 371 311 sync_reg = intel_readl(shim, SDW_SHIM_SYNC); 372 - sync_reg |= (syncprd << 373 - SDW_REG_SHIFT(SDW_SHIM_SYNC_SYNCPRD)); 312 + u32p_replace_bits(&sync_reg, syncprd, SDW_SHIM_SYNC_SYNCPRD); 374 313 375 314 /* Set SyncCPU bit */ 376 315 sync_reg |= SDW_SHIM_SYNC_SYNCCPU; 377 316 intel_writel(shim, SDW_SHIM_SYNC, sync_reg); 378 - } 379 317 380 - /* Link power up sequence */ 381 - link_control = intel_readl(shim, SDW_SHIM_LCTL); 382 - spa_mask = (SDW_SHIM_LCTL_SPA << link_id); 383 - cpa_mask = (SDW_SHIM_LCTL_CPA << link_id); 384 - link_control |= spa_mask; 318 + /* Link power up sequence */ 319 + link_control = intel_readl(shim, SDW_SHIM_LCTL); 385 320 386 - ret = intel_set_bit(shim, SDW_SHIM_LCTL, link_control, cpa_mask); 387 - if (ret < 0) { 388 - dev_err(sdw->cdns.dev, "Failed to power up link: %d\n", ret); 389 - goto out; 390 - } 321 + /* only power-up enabled links */ 322 + spa_mask = FIELD_PREP(SDW_SHIM_LCTL_SPA_MASK, sdw->link_res->link_mask); 323 + cpa_mask = FIELD_PREP(SDW_SHIM_LCTL_CPA_MASK, sdw->link_res->link_mask); 391 324 392 - if (!*shim_mask) { 325 + link_control |= spa_mask; 326 + 327 + ret = intel_set_bit(shim, SDW_SHIM_LCTL, link_control, cpa_mask); 328 + if (ret < 0) { 329 + dev_err(sdw->cdns.dev, "Failed to power up link: %d\n", ret); 330 + goto out; 331 + } 332 + 393 333 /* SyncCPU will change once link is active */ 394 334 ret = intel_wait_bit(shim, SDW_SHIM_SYNC, 395 335 SDW_SHIM_SYNC_SYNCCPU, 0); ··· 490 426 491 427 intel_shim_glue_to_master_ip(sdw); 492 428 493 - act |= 0x1 << SDW_REG_SHIFT(SDW_SHIM_CTMCTL_DOAIS); 429 + u16p_replace_bits(&act, 0x1, SDW_SHIM_CTMCTL_DOAIS); 494 430 act |= SDW_SHIM_CTMCTL_DACTQE; 495 431 act |= SDW_SHIM_CTMCTL_DODS; 496 432 intel_writew(shim, SDW_SHIM_CTMCTL(link_id), act); ··· 527 463 mutex_unlock(sdw->link_res->shim_lock); 528 464 } 529 465 530 - static int __maybe_unused intel_link_power_down(struct sdw_intel *sdw) 466 + static int intel_link_power_down(struct sdw_intel *sdw) 531 467 { 532 - int link_control, spa_mask, cpa_mask; 468 + u32 link_control, spa_mask, cpa_mask; 533 469 unsigned int link_id = sdw->instance; 534 470 void __iomem *shim = sdw->link_res->shim; 535 471 u32 *shim_mask = sdw->link_res->shim_mask; ··· 539 475 540 476 intel_shim_master_ip_to_glue(sdw); 541 477 542 - /* Link power down sequence */ 543 - link_control = intel_readl(shim, SDW_SHIM_LCTL); 544 - spa_mask = ~(SDW_SHIM_LCTL_SPA << link_id); 545 - cpa_mask = (SDW_SHIM_LCTL_CPA << link_id); 546 - link_control &= spa_mask; 547 - 548 - ret = intel_clear_bit(shim, SDW_SHIM_LCTL, link_control, cpa_mask); 549 - 550 478 if (!(*shim_mask & BIT(link_id))) 551 479 dev_err(sdw->cdns.dev, 552 480 "%s: Unbalanced power-up/down calls\n", __func__); 553 481 554 482 *shim_mask &= ~BIT(link_id); 555 483 484 + if (!*shim_mask) { 485 + 486 + dev_dbg(sdw->cdns.dev, "%s: powering down all links\n", __func__); 487 + 488 + /* Link power down sequence */ 489 + link_control = intel_readl(shim, SDW_SHIM_LCTL); 490 + 491 + /* only power-down enabled links */ 492 + spa_mask = FIELD_PREP(SDW_SHIM_LCTL_SPA_MASK, ~sdw->link_res->link_mask); 493 + cpa_mask = FIELD_PREP(SDW_SHIM_LCTL_CPA_MASK, sdw->link_res->link_mask); 494 + 495 + link_control &= spa_mask; 496 + 497 + ret = intel_clear_bit(shim, SDW_SHIM_LCTL, link_control, cpa_mask); 498 + } 499 + 500 + link_control = intel_readl(shim, SDW_SHIM_LCTL); 501 + 556 502 mutex_unlock(sdw->link_res->shim_lock); 557 503 558 - if (ret < 0) 504 + if (ret < 0) { 505 + dev_err(sdw->cdns.dev, "%s: could not power down link\n", __func__); 506 + 559 507 return ret; 508 + } 560 509 561 510 sdw->cdns.link_up = false; 562 511 return 0; ··· 615 538 return ret; 616 539 } 617 540 541 + static int intel_shim_sync_go(struct sdw_intel *sdw) 542 + { 543 + int ret; 544 + 545 + mutex_lock(sdw->link_res->shim_lock); 546 + 547 + ret = intel_shim_sync_go_unlocked(sdw); 548 + 549 + mutex_unlock(sdw->link_res->shim_lock); 550 + 551 + return ret; 552 + } 553 + 618 554 /* 619 555 * PDI routines 620 556 */ ··· 641 551 /* PCM Stream Capability */ 642 552 pcm_cap = intel_readw(shim, SDW_SHIM_PCMSCAP(link_id)); 643 553 644 - config->pcm_bd = (pcm_cap & SDW_SHIM_PCMSCAP_BSS) >> 645 - SDW_REG_SHIFT(SDW_SHIM_PCMSCAP_BSS); 646 - config->pcm_in = (pcm_cap & SDW_SHIM_PCMSCAP_ISS) >> 647 - SDW_REG_SHIFT(SDW_SHIM_PCMSCAP_ISS); 648 - config->pcm_out = (pcm_cap & SDW_SHIM_PCMSCAP_OSS) >> 649 - SDW_REG_SHIFT(SDW_SHIM_PCMSCAP_OSS); 554 + config->pcm_bd = FIELD_GET(SDW_SHIM_PCMSCAP_BSS, pcm_cap); 555 + config->pcm_in = FIELD_GET(SDW_SHIM_PCMSCAP_ISS, pcm_cap); 556 + config->pcm_out = FIELD_GET(SDW_SHIM_PCMSCAP_OSS, pcm_cap); 650 557 651 558 dev_dbg(sdw->cdns.dev, "PCM cap bd:%d in:%d out:%d\n", 652 559 config->pcm_bd, config->pcm_in, config->pcm_out); ··· 651 564 /* PDM Stream Capability */ 652 565 pdm_cap = intel_readw(shim, SDW_SHIM_PDMSCAP(link_id)); 653 566 654 - config->pdm_bd = (pdm_cap & SDW_SHIM_PDMSCAP_BSS) >> 655 - SDW_REG_SHIFT(SDW_SHIM_PDMSCAP_BSS); 656 - config->pdm_in = (pdm_cap & SDW_SHIM_PDMSCAP_ISS) >> 657 - SDW_REG_SHIFT(SDW_SHIM_PDMSCAP_ISS); 658 - config->pdm_out = (pdm_cap & SDW_SHIM_PDMSCAP_OSS) >> 659 - SDW_REG_SHIFT(SDW_SHIM_PDMSCAP_OSS); 567 + config->pdm_bd = FIELD_GET(SDW_SHIM_PDMSCAP_BSS, pdm_cap); 568 + config->pdm_in = FIELD_GET(SDW_SHIM_PDMSCAP_ISS, pdm_cap); 569 + config->pdm_out = FIELD_GET(SDW_SHIM_PDMSCAP_OSS, pdm_cap); 660 570 661 571 dev_dbg(sdw->cdns.dev, "PDM cap bd:%d in:%d out:%d\n", 662 572 config->pdm_bd, config->pdm_in, config->pdm_out); ··· 680 596 681 597 } else { 682 598 count = intel_readw(shim, SDW_SHIM_PDMSCAP(link_id)); 683 - count = ((count & SDW_SHIM_PDMSCAP_CPSS) >> 684 - SDW_REG_SHIFT(SDW_SHIM_PDMSCAP_CPSS)); 599 + count = FIELD_GET(SDW_SHIM_PDMSCAP_CPSS, count); 685 600 } 686 601 687 602 /* zero based values for channel count in register */ ··· 754 671 else 755 672 pdi_conf &= ~(SDW_SHIM_PCMSYCM_DIR); 756 673 757 - pdi_conf |= (pdi->intel_alh_id << 758 - SDW_REG_SHIFT(SDW_SHIM_PCMSYCM_STREAM)); 759 - pdi_conf |= (pdi->l_ch_num << SDW_REG_SHIFT(SDW_SHIM_PCMSYCM_LCHN)); 760 - pdi_conf |= (pdi->h_ch_num << SDW_REG_SHIFT(SDW_SHIM_PCMSYCM_HCHN)); 674 + u32p_replace_bits(&pdi_conf, pdi->intel_alh_id, SDW_SHIM_PCMSYCM_STREAM); 675 + u32p_replace_bits(&pdi_conf, pdi->l_ch_num, SDW_SHIM_PCMSYCM_LCHN); 676 + u32p_replace_bits(&pdi_conf, pdi->h_ch_num, SDW_SHIM_PCMSYCM_HCHN); 761 677 762 678 intel_writew(shim, SDW_SHIM_PCMSYCHM(link_id, pdi->num), pdi_conf); 763 679 } ··· 776 694 /* Program Stream config ALH register */ 777 695 conf = intel_readl(alh, SDW_ALH_STRMZCFG(pdi->intel_alh_id)); 778 696 779 - conf |= (SDW_ALH_STRMZCFG_DMAT_VAL << 780 - SDW_REG_SHIFT(SDW_ALH_STRMZCFG_DMAT)); 781 - 782 - conf |= ((pdi->ch_count - 1) << 783 - SDW_REG_SHIFT(SDW_ALH_STRMZCFG_CHN)); 697 + u32p_replace_bits(&conf, SDW_ALH_STRMZCFG_DMAT_VAL, SDW_ALH_STRMZCFG_DMAT); 698 + u32p_replace_bits(&conf, pdi->ch_count - 1, SDW_ALH_STRMZCFG_CHN); 784 699 785 700 intel_writel(alh, SDW_ALH_STRMZCFG(pdi->intel_alh_id), conf); 786 701 } ··· 886 807 static int intel_startup(struct snd_pcm_substream *substream, 887 808 struct snd_soc_dai *dai) 888 809 { 889 - /* 890 - * TODO: add pm_runtime support here, the startup callback 891 - * will make sure the IP is 'active' 892 - */ 810 + struct sdw_cdns *cdns = snd_soc_dai_get_drvdata(dai); 811 + int ret; 812 + 813 + ret = pm_runtime_get_sync(cdns->dev); 814 + if (ret < 0 && ret != -EACCES) { 815 + dev_err_ratelimited(cdns->dev, 816 + "pm_runtime_get_sync failed in %s, ret %d\n", 817 + __func__, ret); 818 + pm_runtime_put_noidle(cdns->dev); 819 + return ret; 820 + } 893 821 return 0; 894 822 } 895 823 ··· 942 856 intel_pdi_alh_configure(sdw, pdi); 943 857 sdw_cdns_config_stream(cdns, ch, dir, pdi); 944 858 859 + /* store pdi and hw_params, may be needed in prepare step */ 860 + dma->suspended = false; 861 + dma->pdi = pdi; 862 + dma->hw_params = params; 945 863 946 864 /* Inform DSP about PDI stream number */ 947 865 ret = intel_params_stream(sdw, substream, dai, params, ··· 989 899 static int intel_prepare(struct snd_pcm_substream *substream, 990 900 struct snd_soc_dai *dai) 991 901 { 902 + struct sdw_cdns *cdns = snd_soc_dai_get_drvdata(dai); 903 + struct sdw_intel *sdw = cdns_to_intel(cdns); 992 904 struct sdw_cdns_dma_data *dma; 905 + int ch, dir; 906 + int ret = 0; 993 907 994 908 dma = snd_soc_dai_get_dma_data(dai, substream); 995 909 if (!dma) { ··· 1002 908 return -EIO; 1003 909 } 1004 910 1005 - return sdw_prepare_stream(dma->stream); 1006 - } 911 + if (dma->suspended) { 912 + dma->suspended = false; 1007 913 1008 - static int intel_trigger(struct snd_pcm_substream *substream, int cmd, 1009 - struct snd_soc_dai *dai) 1010 - { 1011 - struct sdw_cdns_dma_data *dma; 1012 - int ret; 914 + /* 915 + * .prepare() is called after system resume, where we 916 + * need to reinitialize the SHIM/ALH/Cadence IP. 917 + * .prepare() is also called to deal with underflows, 918 + * but in those cases we cannot touch ALH/SHIM 919 + * registers 920 + */ 1013 921 1014 - dma = snd_soc_dai_get_dma_data(dai, substream); 1015 - if (!dma) { 1016 - dev_err(dai->dev, "failed to get dma data in %s", __func__); 1017 - return -EIO; 922 + /* configure stream */ 923 + ch = params_channels(dma->hw_params); 924 + if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) 925 + dir = SDW_DATA_DIR_RX; 926 + else 927 + dir = SDW_DATA_DIR_TX; 928 + 929 + intel_pdi_shim_configure(sdw, dma->pdi); 930 + intel_pdi_alh_configure(sdw, dma->pdi); 931 + sdw_cdns_config_stream(cdns, ch, dir, dma->pdi); 932 + 933 + /* Inform DSP about PDI stream number */ 934 + ret = intel_params_stream(sdw, substream, dai, 935 + dma->hw_params, 936 + sdw->instance, 937 + dma->pdi->intel_alh_id); 1018 938 } 1019 939 1020 - switch (cmd) { 1021 - case SNDRV_PCM_TRIGGER_START: 1022 - case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: 1023 - case SNDRV_PCM_TRIGGER_RESUME: 1024 - ret = sdw_enable_stream(dma->stream); 1025 - break; 1026 - 1027 - case SNDRV_PCM_TRIGGER_PAUSE_PUSH: 1028 - case SNDRV_PCM_TRIGGER_SUSPEND: 1029 - case SNDRV_PCM_TRIGGER_STOP: 1030 - ret = sdw_disable_stream(dma->stream); 1031 - break; 1032 - 1033 - default: 1034 - ret = -EINVAL; 1035 - break; 1036 - } 1037 - 1038 - if (ret) 1039 - dev_err(dai->dev, 1040 - "%s trigger %d failed: %d", 1041 - __func__, cmd, ret); 1042 940 return ret; 1043 941 } 1044 942 ··· 1046 960 if (!dma) 1047 961 return -EIO; 1048 962 1049 - ret = sdw_deprepare_stream(dma->stream); 1050 - if (ret) { 1051 - dev_err(dai->dev, "sdw_deprepare_stream: failed %d", ret); 1052 - return ret; 1053 - } 1054 - 963 + /* 964 + * The sdw stream state will transition to RELEASED when stream-> 965 + * master_list is empty. So the stream state will transition to 966 + * DEPREPARED for the first cpu-dai and to RELEASED for the last 967 + * cpu-dai. 968 + */ 1055 969 ret = sdw_stream_remove_master(&cdns->bus, dma->stream); 1056 970 if (ret < 0) { 1057 971 dev_err(dai->dev, "remove master from stream %s failed: %d\n", ··· 1065 979 return ret; 1066 980 } 1067 981 982 + dma->hw_params = NULL; 983 + dma->pdi = NULL; 984 + 1068 985 return 0; 1069 986 } 1070 987 1071 988 static void intel_shutdown(struct snd_pcm_substream *substream, 1072 989 struct snd_soc_dai *dai) 1073 990 { 991 + struct sdw_cdns *cdns = snd_soc_dai_get_drvdata(dai); 1074 992 993 + pm_runtime_mark_last_busy(cdns->dev); 994 + pm_runtime_put_autosuspend(cdns->dev); 995 + } 996 + 997 + static int intel_component_dais_suspend(struct snd_soc_component *component) 998 + { 999 + struct sdw_cdns_dma_data *dma; 1000 + struct snd_soc_dai *dai; 1001 + 1002 + for_each_component_dais(component, dai) { 1003 + /* 1004 + * we don't have a .suspend dai_ops, and we don't have access 1005 + * to the substream, so let's mark both capture and playback 1006 + * DMA contexts as suspended 1007 + */ 1008 + dma = dai->playback_dma_data; 1009 + if (dma) 1010 + dma->suspended = true; 1011 + 1012 + dma = dai->capture_dma_data; 1013 + if (dma) 1014 + dma->suspended = true; 1015 + } 1016 + 1017 + return 0; 1075 1018 } 1076 1019 1077 1020 static int intel_pcm_set_sdw_stream(struct snd_soc_dai *dai, ··· 1126 1011 dma = dai->capture_dma_data; 1127 1012 1128 1013 if (!dma) 1129 - return NULL; 1014 + return ERR_PTR(-EINVAL); 1130 1015 1131 1016 return dma->stream; 1132 1017 } ··· 1135 1020 .startup = intel_startup, 1136 1021 .hw_params = intel_hw_params, 1137 1022 .prepare = intel_prepare, 1138 - .trigger = intel_trigger, 1139 1023 .hw_free = intel_hw_free, 1140 1024 .shutdown = intel_shutdown, 1141 1025 .set_sdw_stream = intel_pcm_set_sdw_stream, ··· 1145 1031 .startup = intel_startup, 1146 1032 .hw_params = intel_hw_params, 1147 1033 .prepare = intel_prepare, 1148 - .trigger = intel_trigger, 1149 1034 .hw_free = intel_hw_free, 1150 1035 .shutdown = intel_shutdown, 1151 1036 .set_sdw_stream = intel_pdm_set_sdw_stream, ··· 1153 1040 1154 1041 static const struct snd_soc_component_driver dai_component = { 1155 1042 .name = "soundwire", 1043 + .suspend = intel_component_dais_suspend 1156 1044 }; 1157 1045 1158 1046 static int intel_create_dai(struct sdw_cdns *cdns, ··· 1321 1207 1322 1208 intel_shim_init(sdw, clock_stop); 1323 1209 1324 - if (clock_stop) 1325 - return 0; 1326 - 1327 - return sdw_cdns_init(&sdw->cdns); 1210 + return 0; 1328 1211 } 1329 1212 1330 1213 /* ··· 1360 1249 /* set driver data, accessed by snd_soc_dai_get_drvdata() */ 1361 1250 dev_set_drvdata(dev, cdns); 1362 1251 1252 + /* use generic bandwidth allocation algorithm */ 1253 + sdw->cdns.bus.compute_params = sdw_compute_params; 1254 + 1363 1255 ret = sdw_bus_master_add(bus, dev, dev->fwnode); 1364 1256 if (ret) { 1365 1257 dev_err(dev, "sdw_bus_master_add fail: %d\n", ret); ··· 1373 1259 dev_info(dev, 1374 1260 "SoundWire master %d is disabled, will be ignored\n", 1375 1261 bus->link_id); 1262 + /* 1263 + * Ignore BIOS err_threshold, it's a really bad idea when dealing 1264 + * with multiple hardware synchronized links 1265 + */ 1266 + bus->prop.err_threshold = 0; 1376 1267 1377 1268 return 0; 1378 1269 } ··· 1389 1270 struct sdw_cdns *cdns = dev_get_drvdata(dev); 1390 1271 struct sdw_intel *sdw = cdns_to_intel(cdns); 1391 1272 struct sdw_bus *bus = &cdns->bus; 1273 + int link_flags; 1274 + bool multi_link; 1275 + u32 clock_stop_quirks; 1392 1276 int ret; 1393 1277 1394 1278 if (bus->prop.hw_disabled) { ··· 1401 1279 return 0; 1402 1280 } 1403 1281 1404 - /* Initialize shim, controller and Cadence IP */ 1282 + link_flags = md_flags >> (bus->link_id * 8); 1283 + multi_link = !(link_flags & SDW_INTEL_MASTER_DISABLE_MULTI_LINK); 1284 + if (!multi_link) { 1285 + dev_dbg(dev, "Multi-link is disabled\n"); 1286 + bus->multi_link = false; 1287 + } else { 1288 + /* 1289 + * hardware-based synchronization is required regardless 1290 + * of the number of segments used by a stream: SSP-based 1291 + * synchronization is gated by gsync when the multi-master 1292 + * mode is set. 1293 + */ 1294 + bus->multi_link = true; 1295 + bus->hw_sync_min_links = 1; 1296 + } 1297 + 1298 + /* Initialize shim, controller */ 1405 1299 ret = intel_init(sdw); 1406 1300 if (ret) 1407 1301 goto err_init; ··· 1436 1298 goto err_init; 1437 1299 } 1438 1300 1301 + /* 1302 + * follow recommended programming flows to avoid timeouts when 1303 + * gsync is enabled 1304 + */ 1305 + if (multi_link) 1306 + intel_shim_sync_arm(sdw); 1307 + 1308 + ret = sdw_cdns_init(cdns); 1309 + if (ret < 0) { 1310 + dev_err(dev, "unable to initialize Cadence IP\n"); 1311 + goto err_interrupt; 1312 + } 1313 + 1439 1314 ret = sdw_cdns_exit_reset(cdns); 1440 1315 if (ret < 0) { 1441 1316 dev_err(dev, "unable to exit bus reset sequence\n"); 1442 1317 goto err_interrupt; 1318 + } 1319 + 1320 + if (multi_link) { 1321 + ret = intel_shim_sync_go(sdw); 1322 + if (ret < 0) { 1323 + dev_err(dev, "sync go failed: %d\n", ret); 1324 + goto err_interrupt; 1325 + } 1443 1326 } 1444 1327 1445 1328 /* Register DAIs */ ··· 1472 1313 } 1473 1314 1474 1315 intel_debugfs_init(sdw); 1316 + 1317 + /* Enable runtime PM */ 1318 + if (!(link_flags & SDW_INTEL_MASTER_DISABLE_PM_RUNTIME)) { 1319 + pm_runtime_set_autosuspend_delay(dev, 1320 + INTEL_MASTER_SUSPEND_DELAY_MS); 1321 + pm_runtime_use_autosuspend(dev); 1322 + pm_runtime_mark_last_busy(dev); 1323 + 1324 + pm_runtime_set_active(dev); 1325 + pm_runtime_enable(dev); 1326 + } 1327 + 1328 + clock_stop_quirks = sdw->link_res->clock_stop_quirks; 1329 + if (clock_stop_quirks & SDW_INTEL_CLK_STOP_NOT_ALLOWED) { 1330 + /* 1331 + * To keep the clock running we need to prevent 1332 + * pm_runtime suspend from happening by increasing the 1333 + * reference count. 1334 + * This quirk is specified by the parent PCI device in 1335 + * case of specific latency requirements. It will have 1336 + * no effect if pm_runtime is disabled by the user via 1337 + * a module parameter for testing purposes. 1338 + */ 1339 + pm_runtime_get_noresume(dev); 1340 + } 1341 + 1342 + /* 1343 + * The runtime PM status of Slave devices is "Unsupported" 1344 + * until they report as ATTACHED. If they don't, e.g. because 1345 + * there are no Slave devices populated or if the power-on is 1346 + * delayed or dependent on a power switch, the Master will 1347 + * remain active and prevent its parent from suspending. 1348 + * 1349 + * Conditionally force the pm_runtime core to re-evaluate the 1350 + * Master status in the absence of any Slave activity. A quirk 1351 + * is provided to e.g. deal with Slaves that may be powered on 1352 + * with a delay. A more complete solution would require the 1353 + * definition of Master properties. 1354 + */ 1355 + if (!(link_flags & SDW_INTEL_MASTER_DISABLE_PM_RUNTIME_IDLE)) 1356 + pm_runtime_idle(dev); 1475 1357 1476 1358 return 0; 1477 1359 ··· 1529 1329 struct sdw_intel *sdw = cdns_to_intel(cdns); 1530 1330 struct sdw_bus *bus = &cdns->bus; 1531 1331 1332 + /* 1333 + * Since pm_runtime is already disabled, we don't decrease 1334 + * the refcount when the clock_stop_quirk is 1335 + * SDW_INTEL_CLK_STOP_NOT_ALLOWED 1336 + */ 1532 1337 if (!bus->prop.hw_disabled) { 1533 1338 intel_debugfs_exit(sdw); 1534 1339 sdw_cdns_enable_interrupt(cdns, false); ··· 1581 1376 return 0; 1582 1377 } 1583 1378 1379 + /* 1380 + * PM calls 1381 + */ 1382 + 1383 + #ifdef CONFIG_PM 1384 + 1385 + static int __maybe_unused intel_suspend(struct device *dev) 1386 + { 1387 + struct sdw_cdns *cdns = dev_get_drvdata(dev); 1388 + struct sdw_intel *sdw = cdns_to_intel(cdns); 1389 + struct sdw_bus *bus = &cdns->bus; 1390 + u32 clock_stop_quirks; 1391 + int ret; 1392 + 1393 + if (bus->prop.hw_disabled) { 1394 + dev_dbg(dev, "SoundWire master %d is disabled, ignoring\n", 1395 + bus->link_id); 1396 + return 0; 1397 + } 1398 + 1399 + if (pm_runtime_suspended(dev)) { 1400 + dev_dbg(dev, "%s: pm_runtime status: suspended\n", __func__); 1401 + 1402 + clock_stop_quirks = sdw->link_res->clock_stop_quirks; 1403 + 1404 + if ((clock_stop_quirks & SDW_INTEL_CLK_STOP_BUS_RESET || 1405 + !clock_stop_quirks) && 1406 + !pm_runtime_suspended(dev->parent)) { 1407 + 1408 + /* 1409 + * if we've enabled clock stop, and the parent 1410 + * is still active, disable shim wake. The 1411 + * SHIM registers are not accessible if the 1412 + * parent is already pm_runtime suspended so 1413 + * it's too late to change that configuration 1414 + */ 1415 + 1416 + intel_shim_wake(sdw, false); 1417 + } 1418 + 1419 + return 0; 1420 + } 1421 + 1422 + ret = sdw_cdns_enable_interrupt(cdns, false); 1423 + if (ret < 0) { 1424 + dev_err(dev, "cannot disable interrupts on suspend\n"); 1425 + return ret; 1426 + } 1427 + 1428 + ret = intel_link_power_down(sdw); 1429 + if (ret) { 1430 + dev_err(dev, "Link power down failed: %d", ret); 1431 + return ret; 1432 + } 1433 + 1434 + intel_shim_wake(sdw, false); 1435 + 1436 + return 0; 1437 + } 1438 + 1439 + static int intel_suspend_runtime(struct device *dev) 1440 + { 1441 + struct sdw_cdns *cdns = dev_get_drvdata(dev); 1442 + struct sdw_intel *sdw = cdns_to_intel(cdns); 1443 + struct sdw_bus *bus = &cdns->bus; 1444 + u32 clock_stop_quirks; 1445 + int ret; 1446 + 1447 + if (bus->prop.hw_disabled) { 1448 + dev_dbg(dev, "SoundWire master %d is disabled, ignoring\n", 1449 + bus->link_id); 1450 + return 0; 1451 + } 1452 + 1453 + clock_stop_quirks = sdw->link_res->clock_stop_quirks; 1454 + 1455 + if (clock_stop_quirks & SDW_INTEL_CLK_STOP_TEARDOWN) { 1456 + 1457 + ret = sdw_cdns_enable_interrupt(cdns, false); 1458 + if (ret < 0) { 1459 + dev_err(dev, "cannot disable interrupts on suspend\n"); 1460 + return ret; 1461 + } 1462 + 1463 + ret = intel_link_power_down(sdw); 1464 + if (ret) { 1465 + dev_err(dev, "Link power down failed: %d", ret); 1466 + return ret; 1467 + } 1468 + 1469 + intel_shim_wake(sdw, false); 1470 + 1471 + } else if (clock_stop_quirks & SDW_INTEL_CLK_STOP_BUS_RESET || 1472 + !clock_stop_quirks) { 1473 + ret = sdw_cdns_clock_stop(cdns, true); 1474 + if (ret < 0) { 1475 + dev_err(dev, "cannot enable clock stop on suspend\n"); 1476 + return ret; 1477 + } 1478 + 1479 + ret = sdw_cdns_enable_interrupt(cdns, false); 1480 + if (ret < 0) { 1481 + dev_err(dev, "cannot disable interrupts on suspend\n"); 1482 + return ret; 1483 + } 1484 + 1485 + ret = intel_link_power_down(sdw); 1486 + if (ret) { 1487 + dev_err(dev, "Link power down failed: %d", ret); 1488 + return ret; 1489 + } 1490 + 1491 + intel_shim_wake(sdw, true); 1492 + } else { 1493 + dev_err(dev, "%s clock_stop_quirks %x unsupported\n", 1494 + __func__, clock_stop_quirks); 1495 + ret = -EINVAL; 1496 + } 1497 + 1498 + return ret; 1499 + } 1500 + 1501 + static int __maybe_unused intel_resume(struct device *dev) 1502 + { 1503 + struct sdw_cdns *cdns = dev_get_drvdata(dev); 1504 + struct sdw_intel *sdw = cdns_to_intel(cdns); 1505 + struct sdw_bus *bus = &cdns->bus; 1506 + int link_flags; 1507 + bool multi_link; 1508 + int ret; 1509 + 1510 + if (bus->prop.hw_disabled) { 1511 + dev_dbg(dev, "SoundWire master %d is disabled, ignoring\n", 1512 + bus->link_id); 1513 + return 0; 1514 + } 1515 + 1516 + link_flags = md_flags >> (bus->link_id * 8); 1517 + multi_link = !(link_flags & SDW_INTEL_MASTER_DISABLE_MULTI_LINK); 1518 + 1519 + if (pm_runtime_suspended(dev)) { 1520 + dev_dbg(dev, "%s: pm_runtime status was suspended, forcing active\n", __func__); 1521 + 1522 + /* follow required sequence from runtime_pm.rst */ 1523 + pm_runtime_disable(dev); 1524 + pm_runtime_set_active(dev); 1525 + pm_runtime_mark_last_busy(dev); 1526 + pm_runtime_enable(dev); 1527 + 1528 + link_flags = md_flags >> (bus->link_id * 8); 1529 + 1530 + if (!(link_flags & SDW_INTEL_MASTER_DISABLE_PM_RUNTIME_IDLE)) 1531 + pm_runtime_idle(dev); 1532 + } 1533 + 1534 + ret = intel_init(sdw); 1535 + if (ret) { 1536 + dev_err(dev, "%s failed: %d", __func__, ret); 1537 + return ret; 1538 + } 1539 + 1540 + /* 1541 + * make sure all Slaves are tagged as UNATTACHED and provide 1542 + * reason for reinitialization 1543 + */ 1544 + sdw_clear_slave_status(bus, SDW_UNATTACH_REQUEST_MASTER_RESET); 1545 + 1546 + ret = sdw_cdns_enable_interrupt(cdns, true); 1547 + if (ret < 0) { 1548 + dev_err(dev, "cannot enable interrupts during resume\n"); 1549 + return ret; 1550 + } 1551 + 1552 + /* 1553 + * follow recommended programming flows to avoid timeouts when 1554 + * gsync is enabled 1555 + */ 1556 + if (multi_link) 1557 + intel_shim_sync_arm(sdw); 1558 + 1559 + ret = sdw_cdns_init(&sdw->cdns); 1560 + if (ret < 0) { 1561 + dev_err(dev, "unable to initialize Cadence IP during resume\n"); 1562 + return ret; 1563 + } 1564 + 1565 + ret = sdw_cdns_exit_reset(cdns); 1566 + if (ret < 0) { 1567 + dev_err(dev, "unable to exit bus reset sequence during resume\n"); 1568 + return ret; 1569 + } 1570 + 1571 + if (multi_link) { 1572 + ret = intel_shim_sync_go(sdw); 1573 + if (ret < 0) { 1574 + dev_err(dev, "sync go failed during resume\n"); 1575 + return ret; 1576 + } 1577 + } 1578 + 1579 + /* 1580 + * after system resume, the pm_runtime suspend() may kick in 1581 + * during the enumeration, before any children device force the 1582 + * master device to remain active. Using pm_runtime_get() 1583 + * routines is not really possible, since it'd prevent the 1584 + * master from suspending. 1585 + * A reasonable compromise is to update the pm_runtime 1586 + * counters and delay the pm_runtime suspend by several 1587 + * seconds, by when all enumeration should be complete. 1588 + */ 1589 + pm_runtime_mark_last_busy(dev); 1590 + 1591 + return ret; 1592 + } 1593 + 1594 + static int intel_resume_runtime(struct device *dev) 1595 + { 1596 + struct sdw_cdns *cdns = dev_get_drvdata(dev); 1597 + struct sdw_intel *sdw = cdns_to_intel(cdns); 1598 + struct sdw_bus *bus = &cdns->bus; 1599 + u32 clock_stop_quirks; 1600 + bool clock_stop0; 1601 + int link_flags; 1602 + bool multi_link; 1603 + int status; 1604 + int ret; 1605 + 1606 + if (bus->prop.hw_disabled) { 1607 + dev_dbg(dev, "SoundWire master %d is disabled, ignoring\n", 1608 + bus->link_id); 1609 + return 0; 1610 + } 1611 + 1612 + link_flags = md_flags >> (bus->link_id * 8); 1613 + multi_link = !(link_flags & SDW_INTEL_MASTER_DISABLE_MULTI_LINK); 1614 + 1615 + clock_stop_quirks = sdw->link_res->clock_stop_quirks; 1616 + 1617 + if (clock_stop_quirks & SDW_INTEL_CLK_STOP_TEARDOWN) { 1618 + ret = intel_init(sdw); 1619 + if (ret) { 1620 + dev_err(dev, "%s failed: %d", __func__, ret); 1621 + return ret; 1622 + } 1623 + 1624 + /* 1625 + * make sure all Slaves are tagged as UNATTACHED and provide 1626 + * reason for reinitialization 1627 + */ 1628 + sdw_clear_slave_status(bus, SDW_UNATTACH_REQUEST_MASTER_RESET); 1629 + 1630 + ret = sdw_cdns_enable_interrupt(cdns, true); 1631 + if (ret < 0) { 1632 + dev_err(dev, "cannot enable interrupts during resume\n"); 1633 + return ret; 1634 + } 1635 + 1636 + /* 1637 + * follow recommended programming flows to avoid 1638 + * timeouts when gsync is enabled 1639 + */ 1640 + if (multi_link) 1641 + intel_shim_sync_arm(sdw); 1642 + 1643 + ret = sdw_cdns_init(&sdw->cdns); 1644 + if (ret < 0) { 1645 + dev_err(dev, "unable to initialize Cadence IP during resume\n"); 1646 + return ret; 1647 + } 1648 + 1649 + ret = sdw_cdns_exit_reset(cdns); 1650 + if (ret < 0) { 1651 + dev_err(dev, "unable to exit bus reset sequence during resume\n"); 1652 + return ret; 1653 + } 1654 + 1655 + if (multi_link) { 1656 + ret = intel_shim_sync_go(sdw); 1657 + if (ret < 0) { 1658 + dev_err(dev, "sync go failed during resume\n"); 1659 + return ret; 1660 + } 1661 + } 1662 + } else if (clock_stop_quirks & SDW_INTEL_CLK_STOP_BUS_RESET) { 1663 + ret = intel_init(sdw); 1664 + if (ret) { 1665 + dev_err(dev, "%s failed: %d", __func__, ret); 1666 + return ret; 1667 + } 1668 + 1669 + /* 1670 + * An exception condition occurs for the CLK_STOP_BUS_RESET 1671 + * case if one or more masters remain active. In this condition, 1672 + * all the masters are powered on for they are in the same power 1673 + * domain. Master can preserve its context for clock stop0, so 1674 + * there is no need to clear slave status and reset bus. 1675 + */ 1676 + clock_stop0 = sdw_cdns_is_clock_stop(&sdw->cdns); 1677 + 1678 + if (!clock_stop0) { 1679 + 1680 + /* 1681 + * make sure all Slaves are tagged as UNATTACHED and 1682 + * provide reason for reinitialization 1683 + */ 1684 + 1685 + status = SDW_UNATTACH_REQUEST_MASTER_RESET; 1686 + sdw_clear_slave_status(bus, status); 1687 + 1688 + ret = sdw_cdns_enable_interrupt(cdns, true); 1689 + if (ret < 0) { 1690 + dev_err(dev, "cannot enable interrupts during resume\n"); 1691 + return ret; 1692 + } 1693 + 1694 + /* 1695 + * follow recommended programming flows to avoid 1696 + * timeouts when gsync is enabled 1697 + */ 1698 + if (multi_link) 1699 + intel_shim_sync_arm(sdw); 1700 + 1701 + /* 1702 + * Re-initialize the IP since it was powered-off 1703 + */ 1704 + sdw_cdns_init(&sdw->cdns); 1705 + 1706 + } else { 1707 + ret = sdw_cdns_enable_interrupt(cdns, true); 1708 + if (ret < 0) { 1709 + dev_err(dev, "cannot enable interrupts during resume\n"); 1710 + return ret; 1711 + } 1712 + } 1713 + 1714 + ret = sdw_cdns_clock_restart(cdns, !clock_stop0); 1715 + if (ret < 0) { 1716 + dev_err(dev, "unable to restart clock during resume\n"); 1717 + return ret; 1718 + } 1719 + 1720 + if (!clock_stop0) { 1721 + ret = sdw_cdns_exit_reset(cdns); 1722 + if (ret < 0) { 1723 + dev_err(dev, "unable to exit bus reset sequence during resume\n"); 1724 + return ret; 1725 + } 1726 + 1727 + if (multi_link) { 1728 + ret = intel_shim_sync_go(sdw); 1729 + if (ret < 0) { 1730 + dev_err(sdw->cdns.dev, "sync go failed during resume\n"); 1731 + return ret; 1732 + } 1733 + } 1734 + } 1735 + } else if (!clock_stop_quirks) { 1736 + 1737 + clock_stop0 = sdw_cdns_is_clock_stop(&sdw->cdns); 1738 + if (!clock_stop0) 1739 + dev_err(dev, "%s invalid configuration, clock was not stopped", __func__); 1740 + 1741 + ret = intel_init(sdw); 1742 + if (ret) { 1743 + dev_err(dev, "%s failed: %d", __func__, ret); 1744 + return ret; 1745 + } 1746 + 1747 + ret = sdw_cdns_enable_interrupt(cdns, true); 1748 + if (ret < 0) { 1749 + dev_err(dev, "cannot enable interrupts during resume\n"); 1750 + return ret; 1751 + } 1752 + 1753 + ret = sdw_cdns_clock_restart(cdns, false); 1754 + if (ret < 0) { 1755 + dev_err(dev, "unable to resume master during resume\n"); 1756 + return ret; 1757 + } 1758 + } else { 1759 + dev_err(dev, "%s clock_stop_quirks %x unsupported\n", 1760 + __func__, clock_stop_quirks); 1761 + ret = -EINVAL; 1762 + } 1763 + 1764 + return ret; 1765 + } 1766 + 1767 + #endif 1768 + 1769 + static const struct dev_pm_ops intel_pm = { 1770 + SET_SYSTEM_SLEEP_PM_OPS(intel_suspend, intel_resume) 1771 + SET_RUNTIME_PM_OPS(intel_suspend_runtime, intel_resume_runtime, NULL) 1772 + }; 1773 + 1584 1774 static struct platform_driver sdw_intel_drv = { 1585 1775 .probe = intel_master_probe, 1586 1776 .remove = intel_master_remove, 1587 1777 .driver = { 1588 1778 .name = "intel-sdw", 1589 - }, 1779 + .pm = &intel_pm, 1780 + } 1590 1781 }; 1591 1782 1592 1783 module_platform_driver(sdw_intel_drv);
+4
drivers/soundwire/intel.h
··· 17 17 * @dev: device implementing hw_params and free callbacks 18 18 * @shim_lock: mutex to handle access to shared SHIM registers 19 19 * @shim_mask: global pointer to check SHIM register initialization 20 + * @clock_stop_quirks: mask defining requested behavior on pm_suspend 21 + * @link_mask: global mask needed for power-up/down sequences 20 22 * @cdns: Cadence master descriptor 21 23 * @list: used to walk-through all masters exposed by the same controller 22 24 */ ··· 33 31 struct device *dev; 34 32 struct mutex *shim_lock; /* protect shared registers */ 35 33 u32 *shim_mask; 34 + u32 clock_stop_quirks; 35 + u32 link_mask; 36 36 struct sdw_cdns *cdns; 37 37 struct list_head list; 38 38 };
+20 -2
drivers/soundwire/intel_init.c
··· 13 13 #include <linux/io.h> 14 14 #include <linux/module.h> 15 15 #include <linux/platform_device.h> 16 + #include <linux/pm_runtime.h> 16 17 #include <linux/soundwire/sdw_intel.h> 17 18 #include "cadence_master.h" 18 19 #include "intel.h" ··· 69 68 if (!(link_mask & BIT(i))) 70 69 continue; 71 70 72 - if (link->pdev) 71 + if (link->pdev) { 72 + pm_runtime_disable(&link->pdev->dev); 73 73 platform_device_unregister(link->pdev); 74 + } 75 + 76 + if (!link->clock_stop_quirks) 77 + pm_runtime_put_noidle(link->dev); 74 78 } 75 79 76 80 return 0; ··· 252 246 link->ops = res->ops; 253 247 link->dev = res->dev; 254 248 249 + link->clock_stop_quirks = res->clock_stop_quirks; 255 250 link->shim_lock = &ctx->shim_lock; 256 251 link->shim_mask = &ctx->shim_mask; 252 + link->link_mask = link_mask; 257 253 258 254 memset(&pdevinfo, 0, sizeof(pdevinfo)); 259 255 ··· 342 334 continue; 343 335 344 336 intel_master_startup(link->pdev); 337 + 338 + if (!link->clock_stop_quirks) { 339 + /* 340 + * we need to prevent the parent PCI device 341 + * from entering pm_runtime suspend, so that 342 + * power rails to the SoundWire IP are not 343 + * turned off. 344 + */ 345 + pm_runtime_get_noresume(link->dev); 346 + } 345 347 } 346 348 347 349 return 0; ··· 383 365 * Name(_ADR, 0x40000000), with bits 31..28 representing the 384 366 * SoundWire link so filter accordingly 385 367 */ 386 - if ((adr & GENMASK(31, 28)) >> 28 != SDW_LINK_TYPE) 368 + if (FIELD_GET(GENMASK(31, 28), adr) != SDW_LINK_TYPE) 387 369 return AE_OK; /* keep going */ 388 370 389 371 /* device found, stop namespace walk */
+2
drivers/soundwire/master.c
··· 154 154 bus->dev = &md->dev; 155 155 bus->md = md; 156 156 157 + pm_runtime_enable(&bus->md->dev); 157 158 device_register_err: 158 159 return ret; 159 160 } ··· 167 166 */ 168 167 int sdw_master_device_del(struct sdw_bus *bus) 169 168 { 169 + pm_runtime_disable(&bus->md->dev); 170 170 device_unregister(bus->dev); 171 171 172 172 return 0;
+1 -17
drivers/soundwire/mipi_disco.c
··· 289 289 struct sdw_slave_prop *prop = &slave->prop; 290 290 struct device *dev = &slave->dev; 291 291 struct fwnode_handle *port; 292 - int num_of_ports, nval, i, dp0 = 0; 292 + int nval; 293 293 294 294 device_property_read_u32(dev, "mipi-sdw-sw-interface-revision", 295 295 &prop->mipi_revision); ··· 352 352 return -ENOMEM; 353 353 354 354 sdw_slave_read_dp0(slave, port, prop->dp0_prop); 355 - dp0 = 1; 356 355 } 357 356 358 357 /* ··· 381 382 /* Read dpn properties for sink port(s) */ 382 383 sdw_slave_read_dpn(slave, prop->sink_dpn_prop, nval, 383 384 prop->sink_ports, "sink"); 384 - 385 - /* some ports are bidirectional so check total ports by ORing */ 386 - nval = prop->source_ports | prop->sink_ports; 387 - num_of_ports = hweight32(nval) + dp0; /* add DP0 */ 388 - 389 - /* Allocate port_ready based on num_of_ports */ 390 - slave->port_ready = devm_kcalloc(&slave->dev, num_of_ports, 391 - sizeof(*slave->port_ready), 392 - GFP_KERNEL); 393 - if (!slave->port_ready) 394 - return -ENOMEM; 395 - 396 - /* Initialize completion */ 397 - for (i = 0; i < num_of_ports; i++) 398 - init_completion(&slave->port_ready[i]); 399 385 400 386 return 0; 401 387 }
+86 -32
drivers/soundwire/qcom.c
··· 34 34 #define SWRM_INTERRUPT_STATUS_SPECIAL_CMD_ID_FINISHED BIT(10) 35 35 #define SWRM_INTERRUPT_MASK_ADDR 0x204 36 36 #define SWRM_INTERRUPT_CLEAR 0x208 37 + #define SWRM_INTERRUPT_CPU_EN 0x210 37 38 #define SWRM_CMD_FIFO_WR_CMD 0x300 38 39 #define SWRM_CMD_FIFO_RD_CMD 0x304 39 40 #define SWRM_CMD_FIFO_CMD 0x308 ··· 44 43 #define SWRM_CMD_FIFO_RD_FIFO_ADDR 0x318 45 44 #define SWRM_ENUMERATOR_CFG_ADDR 0x500 46 45 #define SWRM_MCP_FRAME_CTRL_BANK_ADDR(m) (0x101C + 0x40 * (m)) 47 - #define SWRM_MCP_FRAME_CTRL_BANK_ROW_CTRL_SHFT 3 48 46 #define SWRM_MCP_FRAME_CTRL_BANK_COL_CTRL_BMSK GENMASK(2, 0) 49 47 #define SWRM_MCP_FRAME_CTRL_BANK_ROW_CTRL_BMSK GENMASK(7, 3) 50 - #define SWRM_MCP_FRAME_CTRL_BANK_COL_CTRL_SHFT 0 51 48 #define SWRM_MCP_CFG_ADDR 0x1048 52 49 #define SWRM_MCP_CFG_MAX_NUM_OF_CMD_NO_PINGS_BMSK GENMASK(21, 17) 53 - #define SWRM_MCP_CFG_MAX_NUM_OF_CMD_NO_PINGS_SHFT 0x11 54 50 #define SWRM_DEF_CMD_NO_PINGS 0x1f 55 51 #define SWRM_MCP_STATUS 0x104C 56 52 #define SWRM_MCP_STATUS_BANK_NUM_MASK BIT(0) 57 53 #define SWRM_MCP_SLV_STATUS 0x1090 58 54 #define SWRM_MCP_SLV_STATUS_MASK GENMASK(1, 0) 59 55 #define SWRM_DP_PORT_CTRL_BANK(n, m) (0x1124 + 0x100 * (n - 1) + 0x40 * m) 56 + #define SWRM_DP_BLOCK_CTRL3_BANK(n, m) (0x1138 + 0x100 * (n - 1) + 0x40 * m) 60 57 #define SWRM_DP_PORT_CTRL_EN_CHAN_SHFT 0x18 61 58 #define SWRM_DP_PORT_CTRL_OFFSET2_SHFT 0x10 62 59 #define SWRM_DP_PORT_CTRL_OFFSET1_SHFT 0x08 ··· 66 67 #define SWRM_REG_VAL_PACK(data, dev, id, reg) \ 67 68 ((reg) | ((id) << 16) | ((dev) << 20) | ((data) << 24)) 68 69 69 - #define SWRM_MAX_ROW_VAL 0 /* Rows = 48 */ 70 - #define SWRM_DEFAULT_ROWS 48 71 - #define SWRM_MIN_COL_VAL 0 /* Cols = 2 */ 72 - #define SWRM_DEFAULT_COL 16 73 - #define SWRM_MAX_COL_VAL 7 74 70 #define SWRM_SPECIAL_CMD_ID 0xF 75 71 #define MAX_FREQ_NUM 1 76 72 #define TIMEOUT_MS (2 * HZ) ··· 78 84 u8 si; 79 85 u8 off1; 80 86 u8 off2; 87 + u8 bp_mode; 81 88 }; 82 89 83 90 struct qcom_swrm_ctrl { 84 91 struct sdw_bus bus; 85 92 struct device *dev; 86 93 struct regmap *regmap; 94 + void __iomem *mmio; 87 95 struct completion *comp; 88 96 struct work_struct slave_work; 89 97 /* read/write lock */ ··· 99 103 unsigned int version; 100 104 int num_din_ports; 101 105 int num_dout_ports; 106 + int cols_index; 107 + int rows_index; 102 108 unsigned long dout_port_mask; 103 109 unsigned long din_port_mask; 104 110 struct qcom_swrm_port_config pconfig[QCOM_SDW_MAX_PORTS]; ··· 110 112 int (*reg_write)(struct qcom_swrm_ctrl *ctrl, int reg, int val); 111 113 }; 112 114 115 + struct qcom_swrm_data { 116 + u32 default_cols; 117 + u32 default_rows; 118 + }; 119 + 120 + static struct qcom_swrm_data swrm_v1_3_data = { 121 + .default_rows = 48, 122 + .default_cols = 16, 123 + }; 124 + 125 + static struct qcom_swrm_data swrm_v1_5_data = { 126 + .default_rows = 50, 127 + .default_cols = 16, 128 + }; 129 + 113 130 #define to_qcom_sdw(b) container_of(b, struct qcom_swrm_ctrl, bus) 114 131 115 - static int qcom_swrm_abh_reg_read(struct qcom_swrm_ctrl *ctrl, int reg, 132 + static int qcom_swrm_ahb_reg_read(struct qcom_swrm_ctrl *ctrl, int reg, 116 133 u32 *val) 117 134 { 118 135 struct regmap *wcd_regmap = ctrl->regmap; ··· 164 151 if (ret) 165 152 return SDW_CMD_FAIL; 166 153 154 + return SDW_CMD_OK; 155 + } 156 + 157 + static int qcom_swrm_cpu_reg_read(struct qcom_swrm_ctrl *ctrl, int reg, 158 + u32 *val) 159 + { 160 + *val = readl(ctrl->mmio + reg); 161 + return SDW_CMD_OK; 162 + } 163 + 164 + static int qcom_swrm_cpu_reg_write(struct qcom_swrm_ctrl *ctrl, int reg, 165 + int val) 166 + { 167 + writel(val, ctrl->mmio + reg); 167 168 return SDW_CMD_OK; 168 169 } 169 170 ··· 311 284 u32 val; 312 285 313 286 /* Clear Rows and Cols */ 314 - val = (SWRM_MAX_ROW_VAL << SWRM_MCP_FRAME_CTRL_BANK_ROW_CTRL_SHFT | 315 - SWRM_MIN_COL_VAL << SWRM_MCP_FRAME_CTRL_BANK_COL_CTRL_SHFT); 287 + val = FIELD_PREP(SWRM_MCP_FRAME_CTRL_BANK_ROW_CTRL_BMSK, ctrl->rows_index); 288 + val |= FIELD_PREP(SWRM_MCP_FRAME_CTRL_BANK_COL_CTRL_BMSK, ctrl->cols_index); 316 289 317 290 ctrl->reg_write(ctrl, SWRM_MCP_FRAME_CTRL_BANK_ADDR(0), val); 318 291 ··· 325 298 326 299 /* Configure No pings */ 327 300 ctrl->reg_read(ctrl, SWRM_MCP_CFG_ADDR, &val); 328 - val &= ~SWRM_MCP_CFG_MAX_NUM_OF_CMD_NO_PINGS_BMSK; 329 - val |= (SWRM_DEF_CMD_NO_PINGS << 330 - SWRM_MCP_CFG_MAX_NUM_OF_CMD_NO_PINGS_SHFT); 301 + u32p_replace_bits(&val, SWRM_DEF_CMD_NO_PINGS, SWRM_MCP_CFG_MAX_NUM_OF_CMD_NO_PINGS_BMSK); 331 302 ctrl->reg_write(ctrl, SWRM_MCP_CFG_ADDR, val); 332 303 333 304 /* Configure number of retries of a read/write cmd */ ··· 335 310 ctrl->reg_write(ctrl, SWRM_COMP_CFG_ADDR, 336 311 SWRM_COMP_CFG_IRQ_LEVEL_OR_PULSE_MSK | 337 312 SWRM_COMP_CFG_ENABLE_MSK); 313 + 314 + /* enable CPU IRQs */ 315 + if (ctrl->mmio) { 316 + ctrl->reg_write(ctrl, SWRM_INTERRUPT_CPU_EN, 317 + SWRM_INTERRUPT_STATUS_RMSK); 318 + } 338 319 return 0; 339 320 } 340 321 ··· 386 355 387 356 ctrl->reg_read(ctrl, reg, &val); 388 357 389 - val &= ~SWRM_MCP_FRAME_CTRL_BANK_COL_CTRL_BMSK; 390 - val &= ~SWRM_MCP_FRAME_CTRL_BANK_ROW_CTRL_BMSK; 391 - 392 - val |= (SWRM_MAX_ROW_VAL << SWRM_MCP_FRAME_CTRL_BANK_ROW_CTRL_SHFT | 393 - SWRM_MAX_COL_VAL << SWRM_MCP_FRAME_CTRL_BANK_COL_CTRL_SHFT); 358 + u32p_replace_bits(&val, ctrl->cols_index, SWRM_MCP_FRAME_CTRL_BANK_COL_CTRL_BMSK); 359 + u32p_replace_bits(&val, ctrl->rows_index, SWRM_MCP_FRAME_CTRL_BANK_ROW_CTRL_BMSK); 394 360 395 361 return ctrl->reg_write(ctrl, reg, val); 396 362 } ··· 406 378 { 407 379 struct qcom_swrm_ctrl *ctrl = to_qcom_sdw(bus); 408 380 u32 value; 381 + int reg = SWRM_DP_PORT_CTRL_BANK((params->port_num), bank); 382 + int ret; 409 383 410 384 value = params->offset1 << SWRM_DP_PORT_CTRL_OFFSET1_SHFT; 411 385 value |= params->offset2 << SWRM_DP_PORT_CTRL_OFFSET2_SHFT; 412 386 value |= params->sample_interval - 1; 413 387 414 - return ctrl->reg_write(ctrl, 415 - SWRM_DP_PORT_CTRL_BANK((params->port_num), bank), 416 - value); 388 + ret = ctrl->reg_write(ctrl, reg, value); 389 + 390 + if (!ret && params->blk_pkg_mode) { 391 + reg = SWRM_DP_BLOCK_CTRL3_BANK(params->port_num, bank); 392 + 393 + ret = ctrl->reg_write(ctrl, reg, 1); 394 + } 395 + 396 + return ret; 417 397 } 418 398 419 399 static int qcom_swrm_port_enable(struct sdw_bus *bus, ··· 469 433 p_rt->transport_params.sample_interval = pcfg->si + 1; 470 434 p_rt->transport_params.offset1 = pcfg->off1; 471 435 p_rt->transport_params.offset2 = pcfg->off2; 436 + p_rt->transport_params.blk_pkg_mode = pcfg->bp_mode; 472 437 } 473 438 474 439 list_for_each_entry(s_rt, &m_rt->slave_rt_list, m_rt_node) { ··· 480 443 pcfg->si + 1; 481 444 p_rt->transport_params.offset1 = pcfg->off1; 482 445 p_rt->transport_params.offset2 = pcfg->off2; 446 + p_rt->transport_params.blk_pkg_mode = pcfg->bp_mode; 483 447 i++; 484 448 } 485 449 } ··· 727 689 u8 off1[QCOM_SDW_MAX_PORTS]; 728 690 u8 off2[QCOM_SDW_MAX_PORTS]; 729 691 u8 si[QCOM_SDW_MAX_PORTS]; 692 + u8 bp_mode[QCOM_SDW_MAX_PORTS] = { 0, }; 730 693 int i, ret, nports, val; 731 694 732 695 ctrl->reg_read(ctrl, SWRM_COMP_PARAMS, &val); 733 696 734 - ctrl->num_dout_ports = val & SWRM_COMP_PARAMS_DOUT_PORTS_MASK; 735 - ctrl->num_din_ports = (val & SWRM_COMP_PARAMS_DIN_PORTS_MASK) >> 5; 697 + ctrl->num_dout_ports = FIELD_GET(SWRM_COMP_PARAMS_DOUT_PORTS_MASK, val); 698 + ctrl->num_din_ports = FIELD_GET(SWRM_COMP_PARAMS_DIN_PORTS_MASK, val); 736 699 737 700 ret = of_property_read_u32(np, "qcom,din-ports", &val); 738 701 if (ret) ··· 770 731 if (ret) 771 732 return ret; 772 733 734 + ret = of_property_read_u8_array(np, "qcom,ports-block-pack-mode", 735 + bp_mode, nports); 773 736 for (i = 0; i < nports; i++) { 774 737 ctrl->pconfig[i].si = si[i]; 775 738 ctrl->pconfig[i].off1 = off1[i]; 776 739 ctrl->pconfig[i].off2 = off2[i]; 740 + ctrl->pconfig[i].bp_mode = bp_mode[i]; 777 741 } 778 742 779 743 return 0; ··· 788 746 struct sdw_master_prop *prop; 789 747 struct sdw_bus_params *params; 790 748 struct qcom_swrm_ctrl *ctrl; 749 + const struct qcom_swrm_data *data; 791 750 int ret; 792 751 u32 val; 793 752 ··· 796 753 if (!ctrl) 797 754 return -ENOMEM; 798 755 756 + data = of_device_get_match_data(dev); 757 + ctrl->rows_index = sdw_find_row_index(data->default_rows); 758 + ctrl->cols_index = sdw_find_col_index(data->default_cols); 759 + #if IS_ENABLED(CONFIG_SLIMBUS) 799 760 if (dev->parent->bus == &slimbus_bus) { 800 - ctrl->reg_read = qcom_swrm_abh_reg_read; 761 + #else 762 + if (false) { 763 + #endif 764 + ctrl->reg_read = qcom_swrm_ahb_reg_read; 801 765 ctrl->reg_write = qcom_swrm_ahb_reg_write; 802 766 ctrl->regmap = dev_get_regmap(dev->parent, NULL); 803 767 if (!ctrl->regmap) 804 768 return -EINVAL; 805 769 } else { 806 - /* Only WCD based SoundWire controller is supported */ 807 - return -ENOTSUPP; 770 + ctrl->reg_read = qcom_swrm_cpu_reg_read; 771 + ctrl->reg_write = qcom_swrm_cpu_reg_write; 772 + ctrl->mmio = devm_platform_ioremap_resource(pdev, 0); 773 + if (IS_ERR(ctrl->mmio)) 774 + return PTR_ERR(ctrl->mmio); 808 775 } 809 776 810 777 ctrl->irq = of_irq_get(dev->of_node, 0); ··· 848 795 params = &ctrl->bus.params; 849 796 params->max_dr_freq = DEFAULT_CLK_FREQ; 850 797 params->curr_dr_freq = DEFAULT_CLK_FREQ; 851 - params->col = SWRM_DEFAULT_COL; 852 - params->row = SWRM_DEFAULT_ROWS; 798 + params->col = data->default_cols; 799 + params->row = data->default_rows; 853 800 ctrl->reg_read(ctrl, SWRM_MCP_STATUS, &val); 854 801 params->curr_bank = val & SWRM_MCP_STATUS_BANK_NUM_MASK; 855 802 params->next_bank = !params->curr_bank; ··· 859 806 prop->num_clk_gears = 0; 860 807 prop->num_clk_freq = MAX_FREQ_NUM; 861 808 prop->clk_freq = &qcom_swrm_freq_tbl[0]; 862 - prop->default_col = SWRM_DEFAULT_COL; 863 - prop->default_row = SWRM_DEFAULT_ROWS; 809 + prop->default_col = data->default_cols; 810 + prop->default_row = data->default_rows; 864 811 865 812 ctrl->reg_read(ctrl, SWRM_COMP_HW_VERSION, &ctrl->version); 866 813 ··· 911 858 } 912 859 913 860 static const struct of_device_id qcom_swrm_of_match[] = { 914 - { .compatible = "qcom,soundwire-v1.3.0", }, 861 + { .compatible = "qcom,soundwire-v1.3.0", .data = &swrm_v1_3_data }, 862 + { .compatible = "qcom,soundwire-v1.5.1", .data = &swrm_v1_5_data }, 915 863 {/* sentinel */}, 916 864 }; 917 865
+10 -3
drivers/soundwire/slave.c
··· 6 6 #include <linux/soundwire/sdw.h> 7 7 #include <linux/soundwire/sdw_type.h> 8 8 #include "bus.h" 9 + #include "sysfs_local.h" 9 10 10 11 static void sdw_slave_release(struct device *dev) 11 12 { ··· 21 20 .uevent = sdw_slave_uevent, 22 21 }; 23 22 24 - static int sdw_slave_add(struct sdw_bus *bus, 25 - struct sdw_slave_id *id, struct fwnode_handle *fwnode) 23 + int sdw_slave_add(struct sdw_bus *bus, 24 + struct sdw_slave_id *id, struct fwnode_handle *fwnode) 26 25 { 27 26 struct sdw_slave *slave; 28 27 int ret; 28 + int i; 29 29 30 30 slave = kzalloc(sizeof(*slave), GFP_KERNEL); 31 31 if (!slave) ··· 52 50 slave->dev.bus = &sdw_bus_type; 53 51 slave->dev.of_node = of_node_get(to_of_node(fwnode)); 54 52 slave->dev.type = &sdw_slave_type; 53 + slave->dev.groups = sdw_slave_status_attr_groups; 55 54 slave->bus = bus; 56 55 slave->status = SDW_SLAVE_UNATTACHED; 57 56 init_completion(&slave->enumeration_complete); ··· 60 57 slave->dev_num = 0; 61 58 init_completion(&slave->probe_complete); 62 59 slave->probed = false; 60 + slave->first_interrupt_done = false; 61 + 62 + for (i = 0; i < SDW_MAX_PORTS; i++) 63 + init_completion(&slave->port_ready[i]); 63 64 64 65 mutex_lock(&bus->bus_lock); 65 66 list_add_tail(&slave->node, &bus->slaves); ··· 109 102 } 110 103 111 104 /* Extract link id from ADR, Bit 51 to 48 (included) */ 112 - link_id = (addr >> 48) & GENMASK(3, 0); 105 + link_id = SDW_DISCO_LINK_ID(addr); 113 106 114 107 /* Check for link_id match */ 115 108 if (link_id != bus->link_id)
+29 -16
drivers/soundwire/stream.c
··· 25 25 int sdw_rows[SDW_FRAME_ROWS] = {48, 50, 60, 64, 75, 80, 125, 147, 26 26 96, 100, 120, 128, 150, 160, 250, 0, 27 27 192, 200, 240, 256, 72, 144, 90, 180}; 28 + EXPORT_SYMBOL(sdw_rows); 28 29 29 30 int sdw_cols[SDW_FRAME_COLS] = {2, 4, 6, 8, 10, 12, 14, 16}; 31 + EXPORT_SYMBOL(sdw_cols); 30 32 31 33 int sdw_find_col_index(int col) 32 34 { ··· 102 100 return ret; 103 101 104 102 /* Program DPN_SampleCtrl2 register */ 105 - wbuf = (t_params->sample_interval - 1); 106 - wbuf &= SDW_DPN_SAMPLECTRL_HIGH; 107 - wbuf >>= SDW_REG_SHIFT(SDW_DPN_SAMPLECTRL_HIGH); 103 + wbuf = FIELD_GET(SDW_DPN_SAMPLECTRL_HIGH, t_params->sample_interval - 1); 108 104 109 105 ret = sdw_write(slave, addr3, wbuf); 110 106 if (ret < 0) { ··· 111 111 } 112 112 113 113 /* Program DPN_HCtrl register */ 114 - wbuf = t_params->hstart; 115 - wbuf <<= SDW_REG_SHIFT(SDW_DPN_HCTRL_HSTART); 116 - wbuf |= t_params->hstop; 114 + wbuf = FIELD_PREP(SDW_DPN_HCTRL_HSTART, t_params->hstart); 115 + wbuf |= FIELD_PREP(SDW_DPN_HCTRL_HSTOP, t_params->hstop); 117 116 118 117 ret = sdw_write(slave, addr4, wbuf); 119 118 if (ret < 0) ··· 156 157 } 157 158 158 159 /* Program DPN_PortCtrl register */ 159 - wbuf = p_params->data_mode << SDW_REG_SHIFT(SDW_DPN_PORTCTRL_DATAMODE); 160 - wbuf |= p_params->flow_mode; 160 + wbuf = FIELD_PREP(SDW_DPN_PORTCTRL_DATAMODE, p_params->data_mode); 161 + wbuf |= FIELD_PREP(SDW_DPN_PORTCTRL_FLOWMODE, p_params->flow_mode); 161 162 162 163 ret = sdw_update(s_rt->slave, addr1, 0xF, wbuf); 163 164 if (ret < 0) { ··· 443 444 444 445 prep_ch.bank = bus->params.next_bank; 445 446 446 - if (dpn_prop->imp_def_interrupts || !dpn_prop->simple_ch_prep_sm) 447 + if (dpn_prop->imp_def_interrupts || !dpn_prop->simple_ch_prep_sm || 448 + bus->params.s_data_mode != SDW_PORT_DATA_MODE_NORMAL) 447 449 intr = true; 448 450 449 451 /* ··· 689 689 690 690 /* 691 691 * Set the multi_link flag only when both the hardware supports 692 - * and there is a stream handled by multiple masters 692 + * and hardware-based sync is required 693 693 */ 694 - multi_link = bus->multi_link && (m_rt_count > 1); 694 + multi_link = bus->multi_link && (m_rt_count >= bus->hw_sync_min_links); 695 695 696 696 if (multi_link) 697 697 ret = sdw_transfer_defer(bus, wr_msg, &bus->defer_msg); ··· 761 761 const struct sdw_master_ops *ops; 762 762 struct sdw_bus *bus; 763 763 bool multi_link = false; 764 + int m_rt_count; 764 765 int ret = 0; 766 + 767 + m_rt_count = stream->m_rt_count; 765 768 766 769 list_for_each_entry(m_rt, &stream->master_list, stream_node) { 767 770 bus = m_rt->bus; 768 771 ops = bus->ops; 769 772 770 - if (bus->multi_link) { 773 + if (bus->multi_link && m_rt_count >= bus->hw_sync_min_links) { 771 774 multi_link = true; 772 775 mutex_lock(&bus->msg_lock); 773 776 } ··· 791 788 * synchronized across all Masters and happens later as a 792 789 * part of post_bank_switch ops. 793 790 */ 794 - ret = sdw_bank_switch(bus, stream->m_rt_count); 791 + ret = sdw_bank_switch(bus, m_rt_count); 795 792 if (ret < 0) { 796 793 dev_err(bus->dev, "Bank switch failed: %d\n", ret); 797 794 goto error; ··· 817 814 ret); 818 815 goto error; 819 816 } 820 - } else if (bus->multi_link && stream->m_rt_count > 1) { 817 + } else if (multi_link) { 821 818 dev_err(bus->dev, 822 819 "Post bank switch ops not implemented\n"); 823 820 goto error; ··· 835 832 goto error; 836 833 } 837 834 838 - if (bus->multi_link) 835 + if (multi_link) 839 836 mutex_unlock(&bus->msg_lock); 840 837 } 841 838 ··· 1787 1784 bus->params.bandwidth -= m_rt->stream->params.rate * 1788 1785 m_rt->ch_count * m_rt->stream->params.bps; 1789 1786 1787 + /* Compute params */ 1788 + if (bus->compute_params) { 1789 + ret = bus->compute_params(bus); 1790 + if (ret < 0) { 1791 + dev_err(bus->dev, "Compute params failed: %d", 1792 + ret); 1793 + return ret; 1794 + } 1795 + } 1796 + 1790 1797 /* Program params */ 1791 1798 ret = sdw_program_params(bus, false); 1792 1799 if (ret < 0) { ··· 1926 1913 1927 1914 sdw_stream = snd_soc_dai_get_sdw_stream(dai, substream->stream); 1928 1915 1929 - if (!sdw_stream) { 1916 + if (IS_ERR(sdw_stream)) { 1930 1917 dev_err(rtd->dev, "no stream found for DAI %s", dai->name); 1931 1918 return; 1932 1919 }
+4
drivers/soundwire/sysfs_local.h
··· 8 8 * SDW sysfs APIs - 9 9 */ 10 10 11 + /* basic attributes to report status of Slave (attachment, dev_num) */ 12 + extern const struct attribute_group *sdw_slave_status_attr_groups[]; 13 + 14 + /* additional device-managed properties reported after driver probe */ 11 15 int sdw_slave_sysfs_init(struct sdw_slave *slave); 12 16 int sdw_slave_sysfs_dpn_init(struct sdw_slave *slave); 13 17
+57 -1
drivers/soundwire/sysfs_slave.c
··· 16 16 17 17 /* 18 18 * The sysfs for Slave reflects the MIPI description as given 19 - * in the MIPI DisCo spec 19 + * in the MIPI DisCo spec. 20 + * status and device_number come directly from the MIPI SoundWire 21 + * 1.x specification. 20 22 * 21 23 * Base file is device 24 + * |---- status 25 + * |---- device_number 22 26 * |---- modalias 23 27 * |---- dev-properties 24 28 * |---- mipi_revision ··· 216 212 217 213 return 0; 218 214 } 215 + 216 + /* 217 + * the status is shown in capital letters for UNATTACHED and RESERVED 218 + * on purpose, to highligh users to the fact that these status values 219 + * are not expected. 220 + */ 221 + static const char *const slave_status[] = { 222 + [SDW_SLAVE_UNATTACHED] = "UNATTACHED", 223 + [SDW_SLAVE_ATTACHED] = "Attached", 224 + [SDW_SLAVE_ALERT] = "Alert", 225 + [SDW_SLAVE_RESERVED] = "RESERVED", 226 + }; 227 + 228 + static ssize_t status_show(struct device *dev, 229 + struct device_attribute *attr, char *buf) 230 + { 231 + struct sdw_slave *slave = dev_to_sdw_dev(dev); 232 + 233 + return sprintf(buf, "%s\n", slave_status[slave->status]); 234 + } 235 + static DEVICE_ATTR_RO(status); 236 + 237 + static ssize_t device_number_show(struct device *dev, 238 + struct device_attribute *attr, char *buf) 239 + { 240 + struct sdw_slave *slave = dev_to_sdw_dev(dev); 241 + 242 + if (slave->status == SDW_SLAVE_UNATTACHED) 243 + return sprintf(buf, "%s", "N/A"); 244 + else 245 + return sprintf(buf, "%d", slave->dev_num); 246 + } 247 + static DEVICE_ATTR_RO(device_number); 248 + 249 + static struct attribute *slave_status_attrs[] = { 250 + &dev_attr_status.attr, 251 + &dev_attr_device_number.attr, 252 + NULL, 253 + }; 254 + 255 + /* 256 + * we don't use ATTRIBUTES_GROUP here since the group is used in a 257 + * separate file and can't be handled as a static. 258 + */ 259 + static const struct attribute_group sdw_slave_status_attr_group = { 260 + .attrs = slave_status_attrs, 261 + }; 262 + 263 + const struct attribute_group *sdw_slave_status_attr_groups[] = { 264 + &sdw_slave_status_attr_group, 265 + NULL 266 + };
+40 -8
include/linux/soundwire/sdw.h
··· 5 5 #define __SOUNDWIRE_H 6 6 7 7 #include <linux/mod_devicetable.h> 8 + #include <linux/bitfield.h> 8 9 9 10 struct sdw_bus; 10 11 struct sdw_slave; ··· 39 38 #define SDW_FRAME_CTRL_BITS 48 40 39 #define SDW_MAX_DEVICES 11 41 40 42 - #define SDW_VALID_PORT_RANGE(n) ((n) <= 14 && (n) >= 1) 41 + #define SDW_MAX_PORTS 15 42 + #define SDW_VALID_PORT_RANGE(n) ((n) < SDW_MAX_PORTS && (n) >= 1) 43 43 44 44 enum { 45 45 SDW_PORT_DIRN_SINK = 0, ··· 357 355 * @dp0_prop: Data Port 0 properties 358 356 * @src_dpn_prop: Source Data Port N properties 359 357 * @sink_dpn_prop: Sink Data Port N properties 358 + * @scp_int1_mask: SCP_INT1_MASK desired settings 359 + * @quirks: bitmask identifying deltas from the MIPI specification 360 360 */ 361 361 struct sdw_slave_prop { 362 362 u32 mipi_revision; ··· 380 376 struct sdw_dp0_prop *dp0_prop; 381 377 struct sdw_dpn_prop *src_dpn_prop; 382 378 struct sdw_dpn_prop *sink_dpn_prop; 379 + u8 scp_int1_mask; 380 + u32 quirks; 383 381 }; 382 + 383 + #define SDW_SLAVE_QUIRKS_INVALID_INITIAL_PARITY BIT(0) 384 384 385 385 /** 386 386 * struct sdw_master_prop - Master properties ··· 463 455 * 464 456 * The MIPI DisCo for SoundWire defines in addition the link_id as bits 51:48 465 457 */ 458 + #define SDW_DISCO_LINK_ID_MASK GENMASK_ULL(51, 48) 459 + #define SDW_VERSION_MASK GENMASK_ULL(47, 44) 460 + #define SDW_UNIQUE_ID_MASK GENMASK_ULL(43, 40) 461 + #define SDW_MFG_ID_MASK GENMASK_ULL(39, 24) 462 + #define SDW_PART_ID_MASK GENMASK_ULL(23, 8) 463 + #define SDW_CLASS_ID_MASK GENMASK_ULL(7, 0) 466 464 467 - #define SDW_DISCO_LINK_ID(adr) (((adr) >> 48) & GENMASK(3, 0)) 468 - #define SDW_VERSION(adr) (((adr) >> 44) & GENMASK(3, 0)) 469 - #define SDW_UNIQUE_ID(adr) (((adr) >> 40) & GENMASK(3, 0)) 470 - #define SDW_MFG_ID(adr) (((adr) >> 24) & GENMASK(15, 0)) 471 - #define SDW_PART_ID(adr) (((adr) >> 8) & GENMASK(15, 0)) 472 - #define SDW_CLASS_ID(adr) ((adr) & GENMASK(7, 0)) 465 + #define SDW_DISCO_LINK_ID(addr) FIELD_GET(SDW_DISCO_LINK_ID_MASK, addr) 466 + #define SDW_VERSION(addr) FIELD_GET(SDW_VERSION_MASK, addr) 467 + #define SDW_UNIQUE_ID(addr) FIELD_GET(SDW_UNIQUE_ID_MASK, addr) 468 + #define SDW_MFG_ID(addr) FIELD_GET(SDW_MFG_ID_MASK, addr) 469 + #define SDW_PART_ID(addr) FIELD_GET(SDW_PART_ID_MASK, addr) 470 + #define SDW_CLASS_ID(addr) FIELD_GET(SDW_CLASS_ID_MASK, addr) 473 471 474 472 /** 475 473 * struct sdw_slave_intr_status - Slave interrupt status ··· 554 540 * @bandwidth: Current bandwidth 555 541 * @col: Active columns 556 542 * @row: Active rows 543 + * @s_data_mode: NORMAL, STATIC or PRBS mode for all Slave ports 544 + * @m_data_mode: NORMAL, STATIC or PRBS mode for all Master ports. The value 545 + * should be the same to detect transmission issues, but can be different to 546 + * test the interrupt reports 557 547 */ 558 548 struct sdw_bus_params { 559 549 enum sdw_reg_bank curr_bank; ··· 567 549 unsigned int bandwidth; 568 550 unsigned int col; 569 551 unsigned int row; 552 + int s_data_mode; 553 + int m_data_mode; 570 554 }; 571 555 572 556 /** ··· 626 606 * between the Master suspending and the codec resuming, and make sure that 627 607 * when the Master triggered a reset the Slave is properly enumerated and 628 608 * initialized 609 + * @first_interrupt_done: status flag tracking if the interrupt handling 610 + * for a Slave happens for the first time after enumeration 629 611 */ 630 612 struct sdw_slave { 631 613 struct sdw_slave_id id; ··· 640 618 struct dentry *debugfs; 641 619 #endif 642 620 struct list_head node; 643 - struct completion *port_ready; 621 + struct completion port_ready[SDW_MAX_PORTS]; 644 622 enum sdw_clk_stop_mode curr_clk_stop_mode; 645 623 u16 dev_num; 646 624 u16 dev_num_sticky; ··· 649 627 struct completion enumeration_complete; 650 628 struct completion initialization_complete; 651 629 u32 unattach_request; 630 + bool first_interrupt_done; 652 631 }; 653 632 654 633 #define dev_to_sdw_dev(_dev) container_of(_dev, struct sdw_slave, dev) ··· 850 827 * @multi_link: Store bus property that indicates if multi links 851 828 * are supported. This flag is populated by drivers after reading 852 829 * appropriate firmware (ACPI/DT). 830 + * @hw_sync_min_links: Number of links used by a stream above which 831 + * hardware-based synchronization is required. This value is only 832 + * meaningful if multi_link is set. If set to 1, hardware-based 833 + * synchronization will be used even if a stream only uses a single 834 + * SoundWire segment. 853 835 */ 854 836 struct sdw_bus { 855 837 struct device *dev; ··· 878 850 unsigned int clk_stop_timeout; 879 851 u32 bank_switch_timeout; 880 852 bool multi_link; 853 + int hw_sync_min_links; 881 854 }; 882 855 883 856 int sdw_bus_master_add(struct sdw_bus *bus, struct device *parent, ··· 970 941 971 942 struct sdw_stream_runtime *sdw_alloc_stream(const char *stream_name); 972 943 void sdw_release_stream(struct sdw_stream_runtime *stream); 944 + 945 + int sdw_compute_params(struct sdw_bus *bus); 946 + 973 947 int sdw_stream_add_master(struct sdw_bus *bus, 974 948 struct sdw_stream_config *stream_config, 975 949 struct sdw_port_config *port_config,
-7
include/linux/soundwire/sdw_registers.h
··· 5 5 #define __SDW_REGISTERS_H 6 6 7 7 /* 8 - * typically we define register and shifts but if one observes carefully, 9 - * the shift can be generated from MASKS using few bit primitaives like ffs 10 - * etc, so we use that and avoid defining shifts 11 - */ 12 - #define SDW_REG_SHIFT(n) (ffs(n) - 1) 13 - 14 - /* 15 8 * SDW registers as defined by MIPI 1.2 Spec 16 9 */ 17 10 #define SDW_REGADDR GENMASK(14, 0)
+4 -14
sound/soc/codecs/max98373-sdw.c
··· 15 15 #include <linux/of.h> 16 16 #include <linux/soundwire/sdw.h> 17 17 #include <linux/soundwire/sdw_type.h> 18 + #include <linux/soundwire/sdw_registers.h> 18 19 #include "max98373.h" 19 20 #include "max98373-sdw.h" 20 21 ··· 283 282 static int max98373_read_prop(struct sdw_slave *slave) 284 283 { 285 284 struct sdw_slave_prop *prop = &slave->prop; 286 - int nval, i, num_of_ports; 285 + int nval, i; 287 286 u32 bit; 288 287 unsigned long addr; 289 288 struct sdw_dpn_prop *dpn; 289 + 290 + prop->scp_int1_mask = SDW_SCP_INT1_BUS_CLASH | SDW_SCP_INT1_PARITY; 290 291 291 292 /* BITMAP: 00001000 Dataport 3 is active */ 292 293 prop->source_ports = BIT(3); ··· 298 295 prop->clk_stop_timeout = 20; 299 296 300 297 nval = hweight32(prop->source_ports); 301 - num_of_ports = nval; 302 298 prop->src_dpn_prop = devm_kcalloc(&slave->dev, nval, 303 299 sizeof(*prop->src_dpn_prop), 304 300 GFP_KERNEL); ··· 317 315 318 316 /* do this again for sink now */ 319 317 nval = hweight32(prop->sink_ports); 320 - num_of_ports += nval; 321 318 prop->sink_dpn_prop = devm_kcalloc(&slave->dev, nval, 322 319 sizeof(*prop->sink_dpn_prop), 323 320 GFP_KERNEL); ··· 333 332 dpn[i].ch_prep_timeout = 10; 334 333 i++; 335 334 } 336 - 337 - /* Allocate port_ready based on num_of_ports */ 338 - slave->port_ready = devm_kcalloc(&slave->dev, num_of_ports, 339 - sizeof(*slave->port_ready), 340 - GFP_KERNEL); 341 - if (!slave->port_ready) 342 - return -ENOMEM; 343 - 344 - /* Initialize completion */ 345 - for (i = 0; i < num_of_ports; i++) 346 - init_completion(&slave->port_ready[i]); 347 335 348 336 /* set the timeout values */ 349 337 prop->clk_stop_timeout = 20;
+4 -13
sound/soc/codecs/rt1308-sdw.c
··· 118 118 static int rt1308_read_prop(struct sdw_slave *slave) 119 119 { 120 120 struct sdw_slave_prop *prop = &slave->prop; 121 - int nval, i, num_of_ports = 1; 121 + int nval, i; 122 122 u32 bit; 123 123 unsigned long addr; 124 124 struct sdw_dpn_prop *dpn; 125 + 126 + prop->scp_int1_mask = SDW_SCP_INT1_BUS_CLASH | SDW_SCP_INT1_PARITY; 127 + prop->quirks = SDW_SLAVE_QUIRKS_INVALID_INITIAL_PARITY; 125 128 126 129 prop->paging_support = true; 127 130 ··· 134 131 135 132 /* for sink */ 136 133 nval = hweight32(prop->sink_ports); 137 - num_of_ports += nval; 138 134 prop->sink_dpn_prop = devm_kcalloc(&slave->dev, nval, 139 135 sizeof(*prop->sink_dpn_prop), 140 136 GFP_KERNEL); ··· 150 148 dpn[i].ch_prep_timeout = 10; 151 149 i++; 152 150 } 153 - 154 - /* Allocate port_ready based on num_of_ports */ 155 - slave->port_ready = devm_kcalloc(&slave->dev, num_of_ports, 156 - sizeof(*slave->port_ready), 157 - GFP_KERNEL); 158 - if (!slave->port_ready) 159 - return -ENOMEM; 160 - 161 - /* Initialize completion */ 162 - for (i = 0; i < num_of_ports; i++) 163 - init_completion(&slave->port_ready[i]); 164 151 165 152 /* set the timeout values */ 166 153 prop->clk_stop_timeout = 20;
+6 -14
sound/soc/codecs/rt5682-sdw.c
··· 19 19 #include <linux/mutex.h> 20 20 #include <linux/soundwire/sdw.h> 21 21 #include <linux/soundwire/sdw_type.h> 22 + #include <linux/soundwire/sdw_registers.h> 22 23 #include <sound/core.h> 23 24 #include <sound/pcm.h> 24 25 #include <sound/pcm_params.h> ··· 538 537 static int rt5682_read_prop(struct sdw_slave *slave) 539 538 { 540 539 struct sdw_slave_prop *prop = &slave->prop; 541 - int nval, i, num_of_ports = 1; 540 + int nval, i; 542 541 u32 bit; 543 542 unsigned long addr; 544 543 struct sdw_dpn_prop *dpn; 544 + 545 + prop->scp_int1_mask = SDW_SCP_INT1_IMPL_DEF | SDW_SCP_INT1_BUS_CLASH | 546 + SDW_SCP_INT1_PARITY; 547 + prop->quirks = SDW_SLAVE_QUIRKS_INVALID_INITIAL_PARITY; 545 548 546 549 prop->paging_support = false; 547 550 ··· 554 549 prop->sink_ports = 0x2; /* BITMAP: 00000010 */ 555 550 556 551 nval = hweight32(prop->source_ports); 557 - num_of_ports += nval; 558 552 prop->src_dpn_prop = devm_kcalloc(&slave->dev, nval, 559 553 sizeof(*prop->src_dpn_prop), 560 554 GFP_KERNEL); ··· 573 569 574 570 /* do this again for sink now */ 575 571 nval = hweight32(prop->sink_ports); 576 - num_of_ports += nval; 577 572 prop->sink_dpn_prop = devm_kcalloc(&slave->dev, nval, 578 573 sizeof(*prop->sink_dpn_prop), 579 574 GFP_KERNEL); ··· 589 586 dpn[i].ch_prep_timeout = 10; 590 587 i++; 591 588 } 592 - 593 - /* Allocate port_ready based on num_of_ports */ 594 - slave->port_ready = devm_kcalloc(&slave->dev, num_of_ports, 595 - sizeof(*slave->port_ready), 596 - GFP_KERNEL); 597 - if (!slave->port_ready) 598 - return -ENOMEM; 599 - 600 - /* Initialize completion */ 601 - for (i = 0; i < num_of_ports; i++) 602 - init_completion(&slave->port_ready[i]); 603 589 604 590 /* set the timeout values */ 605 591 prop->clk_stop_timeout = 20;
+6 -14
sound/soc/codecs/rt700-sdw.c
··· 11 11 #include <linux/mod_devicetable.h> 12 12 #include <linux/soundwire/sdw.h> 13 13 #include <linux/soundwire/sdw_type.h> 14 + #include <linux/soundwire/sdw_registers.h> 14 15 #include <linux/module.h> 15 16 #include <linux/regmap.h> 16 17 #include <sound/soc.h> ··· 334 333 static int rt700_read_prop(struct sdw_slave *slave) 335 334 { 336 335 struct sdw_slave_prop *prop = &slave->prop; 337 - int nval, i, num_of_ports = 1; 336 + int nval, i; 338 337 u32 bit; 339 338 unsigned long addr; 340 339 struct sdw_dpn_prop *dpn; 340 + 341 + prop->scp_int1_mask = SDW_SCP_INT1_IMPL_DEF | SDW_SCP_INT1_BUS_CLASH | 342 + SDW_SCP_INT1_PARITY; 343 + prop->quirks = SDW_SLAVE_QUIRKS_INVALID_INITIAL_PARITY; 341 344 342 345 prop->paging_support = false; 343 346 ··· 350 345 prop->sink_ports = 0xA; /* BITMAP: 00001010 */ 351 346 352 347 nval = hweight32(prop->source_ports); 353 - num_of_ports += nval; 354 348 prop->src_dpn_prop = devm_kcalloc(&slave->dev, nval, 355 349 sizeof(*prop->src_dpn_prop), 356 350 GFP_KERNEL); ··· 369 365 370 366 /* do this again for sink now */ 371 367 nval = hweight32(prop->sink_ports); 372 - num_of_ports += nval; 373 368 prop->sink_dpn_prop = devm_kcalloc(&slave->dev, nval, 374 369 sizeof(*prop->sink_dpn_prop), 375 370 GFP_KERNEL); ··· 385 382 dpn[i].ch_prep_timeout = 10; 386 383 i++; 387 384 } 388 - 389 - /* Allocate port_ready based on num_of_ports */ 390 - slave->port_ready = devm_kcalloc(&slave->dev, num_of_ports, 391 - sizeof(*slave->port_ready), 392 - GFP_KERNEL); 393 - if (!slave->port_ready) 394 - return -ENOMEM; 395 - 396 - /* Initialize completion */ 397 - for (i = 0; i < num_of_ports; i++) 398 - init_completion(&slave->port_ready[i]); 399 385 400 386 /* set the timeout values */ 401 387 prop->clk_stop_timeout = 20;
+6 -14
sound/soc/codecs/rt711-sdw.c
··· 11 11 #include <linux/mod_devicetable.h> 12 12 #include <linux/soundwire/sdw.h> 13 13 #include <linux/soundwire/sdw_type.h> 14 + #include <linux/soundwire/sdw_registers.h> 14 15 #include <linux/module.h> 15 16 #include <linux/regmap.h> 16 17 #include <sound/soc.h> ··· 338 337 static int rt711_read_prop(struct sdw_slave *slave) 339 338 { 340 339 struct sdw_slave_prop *prop = &slave->prop; 341 - int nval, i, num_of_ports = 1; 340 + int nval, i; 342 341 u32 bit; 343 342 unsigned long addr; 344 343 struct sdw_dpn_prop *dpn; 344 + 345 + prop->scp_int1_mask = SDW_SCP_INT1_IMPL_DEF | SDW_SCP_INT1_BUS_CLASH | 346 + SDW_SCP_INT1_PARITY; 347 + prop->quirks = SDW_SLAVE_QUIRKS_INVALID_INITIAL_PARITY; 345 348 346 349 prop->paging_support = false; 347 350 ··· 354 349 prop->sink_ports = 0x8; /* BITMAP: 00001000 */ 355 350 356 351 nval = hweight32(prop->source_ports); 357 - num_of_ports += nval; 358 352 prop->src_dpn_prop = devm_kcalloc(&slave->dev, nval, 359 353 sizeof(*prop->src_dpn_prop), 360 354 GFP_KERNEL); ··· 373 369 374 370 /* do this again for sink now */ 375 371 nval = hweight32(prop->sink_ports); 376 - num_of_ports += nval; 377 372 prop->sink_dpn_prop = devm_kcalloc(&slave->dev, nval, 378 373 sizeof(*prop->sink_dpn_prop), 379 374 GFP_KERNEL); ··· 389 386 dpn[i].ch_prep_timeout = 10; 390 387 i++; 391 388 } 392 - 393 - /* Allocate port_ready based on num_of_ports */ 394 - slave->port_ready = devm_kcalloc(&slave->dev, num_of_ports, 395 - sizeof(*slave->port_ready), 396 - GFP_KERNEL); 397 - if (!slave->port_ready) 398 - return -ENOMEM; 399 - 400 - /* Initialize completion */ 401 - for (i = 0; i < num_of_ports; i++) 402 - init_completion(&slave->port_ready[i]); 403 389 404 390 /* set the timeout values */ 405 391 prop->clk_stop_timeout = 20;
+6 -32
sound/soc/codecs/rt715-sdw.c
··· 12 12 #include <linux/mod_devicetable.h> 13 13 #include <linux/soundwire/sdw.h> 14 14 #include <linux/soundwire/sdw_type.h> 15 + #include <linux/soundwire/sdw_registers.h> 15 16 #include <linux/module.h> 16 17 #include <linux/of.h> 17 18 #include <linux/regmap.h> ··· 432 431 static int rt715_read_prop(struct sdw_slave *slave) 433 432 { 434 433 struct sdw_slave_prop *prop = &slave->prop; 435 - int nval, i, num_of_ports = 1; 434 + int nval, i; 436 435 u32 bit; 437 436 unsigned long addr; 438 437 struct sdw_dpn_prop *dpn; 438 + 439 + prop->scp_int1_mask = SDW_SCP_INT1_IMPL_DEF | SDW_SCP_INT1_BUS_CLASH | 440 + SDW_SCP_INT1_PARITY; 441 + prop->quirks = SDW_SLAVE_QUIRKS_INVALID_INITIAL_PARITY; 439 442 440 443 prop->paging_support = false; 441 444 ··· 448 443 prop->sink_ports = 0x0; /* BITMAP: 00000000 */ 449 444 450 445 nval = hweight32(prop->source_ports); 451 - num_of_ports += nval; 452 446 prop->src_dpn_prop = devm_kcalloc(&slave->dev, nval, 453 447 sizeof(*prop->src_dpn_prop), 454 448 GFP_KERNEL); ··· 463 459 dpn[i].ch_prep_timeout = 10; 464 460 i++; 465 461 } 466 - 467 - /* do this again for sink now */ 468 - nval = hweight32(prop->sink_ports); 469 - num_of_ports += nval; 470 - prop->sink_dpn_prop = devm_kcalloc(&slave->dev, nval, 471 - sizeof(*prop->sink_dpn_prop), 472 - GFP_KERNEL); 473 - if (!prop->sink_dpn_prop) 474 - return -ENOMEM; 475 - 476 - dpn = prop->sink_dpn_prop; 477 - i = 0; 478 - addr = prop->sink_ports; 479 - for_each_set_bit(bit, &addr, 32) { 480 - dpn[i].num = bit; 481 - dpn[i].simple_ch_prep_sm = true; 482 - dpn[i].ch_prep_timeout = 10; 483 - i++; 484 - } 485 - 486 - /* Allocate port_ready based on num_of_ports */ 487 - slave->port_ready = devm_kcalloc(&slave->dev, num_of_ports, 488 - sizeof(*slave->port_ready), 489 - GFP_KERNEL); 490 - if (!slave->port_ready) 491 - return -ENOMEM; 492 - 493 - /* Initialize completion */ 494 - for (i = 0; i < num_of_ports; i++) 495 - init_completion(&slave->port_ready[i]); 496 462 497 463 /* set the timeout values */ 498 464 prop->clk_stop_timeout = 20;
+1
sound/soc/codecs/wsa881x.c
··· 1112 1112 wsa881x->sconfig.type = SDW_STREAM_PDM; 1113 1113 pdev->prop.sink_ports = GENMASK(WSA881X_MAX_SWR_PORTS, 0); 1114 1114 pdev->prop.sink_dpn_prop = wsa_sink_dpn_prop; 1115 + pdev->prop.scp_int1_mask = SDW_SCP_INT1_BUS_CLASH | SDW_SCP_INT1_PARITY; 1115 1116 gpiod_direction_output(wsa881x->sd_n, 1); 1116 1117 1117 1118 wsa881x->regmap = devm_regmap_init_sdw(pdev, &wsa881x_regmap_config);