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

soundwire: bus: export broadcast read/write capability for tests

Provide prototype and export symbol to enable tests. The bus lock is
handled externally to avoid conflicts e.g. between kernel-generated
traffic and test traffic.

Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Signed-off-by: Bard Liao <yung-chuan.liao@linux.intel.com>
Reviewed-by: Kai Vehmanen <kai.vehmanen@linux.intel.com>
Reviewed-by: Guennadi Liakhovetski <guennadi.liakhovetski@linux.intel.com>
Link: https://lore.kernel.org/r/20200908134521.6781-7-yung-chuan.liao@linux.intel.com
Signed-off-by: Vinod Koul <vkoul@kernel.org>

authored by

Pierre-Louis Bossart and committed by
Vinod Koul
a350aff4 38edbfae

+53 -7
+49 -7
drivers/soundwire/bus.c
··· 255 255 return ret; 256 256 } 257 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 + 258 273 /** 259 274 * sdw_transfer() - Synchronous transfer message to a SDW Slave device 260 275 * @bus: SDW bus ··· 281 266 282 267 mutex_lock(&bus->msg_lock); 283 268 284 - ret = do_transfer(bus, msg); 285 - if (ret != 0 && ret != -ENODATA) 286 - dev_err(bus->dev, "trf on Slave %d failed:%d\n", 287 - msg->dev_num, ret); 288 - 289 - if (msg->page) 290 - sdw_reset_page(bus, msg->dev_num); 269 + ret = sdw_transfer_unlocked(bus, msg); 291 270 292 271 mutex_unlock(&bus->msg_lock); 293 272 ··· 436 427 437 428 return sdw_transfer(bus, &msg); 438 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); 439 463 440 464 static int 441 465 sdw_read_no_pm(struct sdw_slave *slave, u32 addr)
+4
drivers/soundwire/bus.h
··· 168 168 return sdw_write(slave, addr, tmp); 169 169 } 170 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); 174 + 171 175 /* 172 176 * At the moment we only track Master-initiated hw_reset. 173 177 * Additional fields can be added as needed