Skip to content

Commit 595fa4e

Browse files
committed
Merge tag 'soundwire-6.3-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/vkoul/soundwire
Pull soundwire updates from Vinod Koul: "This is a small update which features a bit of core changes and driver updates in Intel and cadence driver. Core: - sdw_transfer_defer() API change to drop an argument - Reset page address rework - Export sdw_nwrite_no_pm and sdw_nread_no_pm APIs Drivers: - Cadence and related intel driver updates for FIFO handling and low level msg transfers" * tag 'soundwire-6.3-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/vkoul/soundwire: soundwire: cadence: further simplify low-level xfer_msg_defer() callback soundwire: cadence: use directly bus sdw_defer structure soundwire: bus: remove sdw_defer argument in sdw_transfer_defer() soundwire: stream: use consistent pattern for freeing buffers soundwire: bus: Remove unused reset_page_addr() callback soundwire: bus: Don't zero page registers after every transaction soundwire: bus_type: Avoid lockdep assert in sdw_drv_probe() soundwire: stream: Move remaining register accesses over to no_pm soundwire: debugfs: Switch to sdw_read_no_pm soundwire: Provide build stubs for common functions soundwire: bus: export sdw_nwrite_no_pm and sdw_nread_no_pm functions soundwire: cadence: remove unused sdw_cdns_master_ops declaration soundwire: enable optional clock registers for SoundWire 1.2 devices ASoC/soundwire: remove is_sdca boolean property soundwire: cadence: Drain the RX FIFO after an IO timeout soundwire: cadence: Remove wasted space in response_buf soundwire: cadence: Don't overflow the command FIFOs soundwire: intel: remove DAI startup/shutdown
2 parents 8ff99ad + 66f95de commit 595fa4e

File tree

13 files changed

+207
-167
lines changed

13 files changed

+207
-167
lines changed

drivers/soundwire/bus.c

Lines changed: 16 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -225,9 +225,9 @@ static inline int do_transfer(struct sdw_bus *bus, struct sdw_msg *msg)
225225
}
226226

227227
static inline int do_transfer_defer(struct sdw_bus *bus,
228-
struct sdw_msg *msg,
229-
struct sdw_defer *defer)
228+
struct sdw_msg *msg)
230229
{
230+
struct sdw_defer *defer = &bus->defer_msg;
231231
int retry = bus->prop.err_threshold;
232232
enum sdw_command_response resp;
233233
int ret = 0, i;
@@ -237,24 +237,7 @@ static inline int do_transfer_defer(struct sdw_bus *bus,
237237
init_completion(&defer->complete);
238238

239239
for (i = 0; i <= retry; i++) {
240-
resp = bus->ops->xfer_msg_defer(bus, msg, defer);
241-
ret = find_response_code(resp);
242-
/* if cmd is ok or ignored return */
243-
if (ret == 0 || ret == -ENODATA)
244-
return ret;
245-
}
246-
247-
return ret;
248-
}
249-
250-
static int sdw_reset_page(struct sdw_bus *bus, u16 dev_num)
251-
{
252-
int retry = bus->prop.err_threshold;
253-
enum sdw_command_response resp;
254-
int ret = 0, i;
255-
256-
for (i = 0; i <= retry; i++) {
257-
resp = bus->ops->reset_page_addr(bus, dev_num);
240+
resp = bus->ops->xfer_msg_defer(bus);
258241
ret = find_response_code(resp);
259242
/* if cmd is ok or ignored return */
260243
if (ret == 0 || ret == -ENODATA)
@@ -275,9 +258,6 @@ static int sdw_transfer_unlocked(struct sdw_bus *bus, struct sdw_msg *msg)
275258
(msg->flags & SDW_MSG_FLAG_WRITE) ? "write" : "read",
276259
msg->addr, msg->len);
277260

278-
if (msg->page)
279-
sdw_reset_page(bus, msg->dev_num);
280-
281261
return ret;
282262
}
283263

@@ -335,26 +315,21 @@ EXPORT_SYMBOL(sdw_show_ping_status);
335315
* sdw_transfer_defer() - Asynchronously transfer message to a SDW Slave device
336316
* @bus: SDW bus
337317
* @msg: SDW message to be xfered
338-
* @defer: Defer block for signal completion
339318
*
340319
* Caller needs to hold the msg_lock lock while calling this
341320
*/
342-
int sdw_transfer_defer(struct sdw_bus *bus, struct sdw_msg *msg,
343-
struct sdw_defer *defer)
321+
int sdw_transfer_defer(struct sdw_bus *bus, struct sdw_msg *msg)
344322
{
345323
int ret;
346324

347325
if (!bus->ops->xfer_msg_defer)
348326
return -ENOTSUPP;
349327

350-
ret = do_transfer_defer(bus, msg, defer);
328+
ret = do_transfer_defer(bus, msg);
351329
if (ret != 0 && ret != -ENODATA)
352330
dev_err(bus->dev, "Defer trf on Slave %d failed:%d\n",
353331
msg->dev_num, ret);
354332

355-
if (msg->page)
356-
sdw_reset_page(bus, msg->dev_num);
357-
358333
return ret;
359334
}
360335

@@ -414,8 +389,7 @@ int sdw_fill_msg(struct sdw_msg *msg, struct sdw_slave *slave,
414389
* all clients need to use the pm versions
415390
*/
416391

417-
static int
418-
sdw_nread_no_pm(struct sdw_slave *slave, u32 addr, size_t count, u8 *val)
392+
int sdw_nread_no_pm(struct sdw_slave *slave, u32 addr, size_t count, u8 *val)
419393
{
420394
struct sdw_msg msg;
421395
int ret;
@@ -430,9 +404,9 @@ sdw_nread_no_pm(struct sdw_slave *slave, u32 addr, size_t count, u8 *val)
430404
ret = 0;
431405
return ret;
432406
}
407+
EXPORT_SYMBOL(sdw_nread_no_pm);
433408

434-
static int
435-
sdw_nwrite_no_pm(struct sdw_slave *slave, u32 addr, size_t count, const u8 *val)
409+
int sdw_nwrite_no_pm(struct sdw_slave *slave, u32 addr, size_t count, const u8 *val)
436410
{
437411
struct sdw_msg msg;
438412
int ret;
@@ -447,6 +421,7 @@ sdw_nwrite_no_pm(struct sdw_slave *slave, u32 addr, size_t count, const u8 *val)
447421
ret = 0;
448422
return ret;
449423
}
424+
EXPORT_SYMBOL(sdw_nwrite_no_pm);
450425

451426
int sdw_write_no_pm(struct sdw_slave *slave, u32 addr, u8 value)
452427
{
@@ -1214,7 +1189,7 @@ int sdw_configure_dpn_intr(struct sdw_slave *slave,
12141189
val &= ~SDW_DPN_INT_PORT_READY;
12151190
}
12161191

1217-
ret = sdw_update(slave, addr, (mask | SDW_DPN_INT_PORT_READY), val);
1192+
ret = sdw_update_no_pm(slave, addr, (mask | SDW_DPN_INT_PORT_READY), val);
12181193
if (ret < 0)
12191194
dev_err(&slave->dev,
12201195
"SDW_DPN_INTMASK write failed:%d\n", val);
@@ -1233,10 +1208,11 @@ static int sdw_slave_set_frequency(struct sdw_slave *slave)
12331208

12341209
/*
12351210
* frequency base and scale registers are required for SDCA
1236-
* devices. They may also be used for 1.2+/non-SDCA devices,
1237-
* but we will need a DisCo property to cover this case
1211+
* devices. They may also be used for 1.2+/non-SDCA devices.
1212+
* Driver can set the property, we will need a DisCo property
1213+
* to discover this case from platform firmware.
12381214
*/
1239-
if (!slave->id.class_id)
1215+
if (!slave->id.class_id && !slave->prop.clock_reg_supported)
12401216
return 0;
12411217

12421218
if (!mclk_freq) {
@@ -1587,7 +1563,7 @@ static int sdw_handle_slave_alerts(struct sdw_slave *slave)
15871563
goto io_err;
15881564
}
15891565

1590-
if (slave->prop.is_sdca) {
1566+
if (slave->id.class_id) {
15911567
ret = sdw_read_no_pm(slave, SDW_DP0_INT);
15921568
if (ret < 0) {
15931569
dev_err(&slave->dev,
@@ -1724,7 +1700,7 @@ static int sdw_handle_slave_alerts(struct sdw_slave *slave)
17241700
goto io_err;
17251701
}
17261702

1727-
if (slave->prop.is_sdca) {
1703+
if (slave->id.class_id) {
17281704
ret = sdw_read_no_pm(slave, SDW_DP0_INT);
17291705
if (ret < 0) {
17301706
dev_err(&slave->dev,

drivers/soundwire/bus.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -151,8 +151,7 @@ int sdw_configure_dpn_intr(struct sdw_slave *slave, int port,
151151
bool enable, int mask);
152152

153153
int sdw_transfer(struct sdw_bus *bus, struct sdw_msg *msg);
154-
int sdw_transfer_defer(struct sdw_bus *bus, struct sdw_msg *msg,
155-
struct sdw_defer *defer);
154+
int sdw_transfer_defer(struct sdw_bus *bus, struct sdw_msg *msg);
156155

157156
#define SDW_READ_INTR_CLEAR_RETRY 10
158157

drivers/soundwire/bus_type.c

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -105,20 +105,19 @@ static int sdw_drv_probe(struct device *dev)
105105
if (ret)
106106
return ret;
107107

108-
mutex_lock(&slave->sdw_dev_lock);
109-
110108
ret = drv->probe(slave, id);
111109
if (ret) {
112110
name = drv->name;
113111
if (!name)
114112
name = drv->driver.name;
115-
mutex_unlock(&slave->sdw_dev_lock);
116113

117114
dev_err(dev, "Probe of %s failed: %d\n", name, ret);
118115
dev_pm_domain_detach(dev, false);
119116
return ret;
120117
}
121118

119+
mutex_lock(&slave->sdw_dev_lock);
120+
122121
/* device is probed so let's read the properties now */
123122
if (drv->ops && drv->ops->read_prop)
124123
drv->ops->read_prop(slave);
@@ -167,14 +166,12 @@ static int sdw_drv_remove(struct device *dev)
167166
int ret = 0;
168167

169168
mutex_lock(&slave->sdw_dev_lock);
170-
171169
slave->probed = false;
170+
mutex_unlock(&slave->sdw_dev_lock);
172171

173172
if (drv->remove)
174173
ret = drv->remove(slave);
175174

176-
mutex_unlock(&slave->sdw_dev_lock);
177-
178175
dev_pm_domain_detach(dev, false);
179176

180177
return ret;

drivers/soundwire/cadence_master.c

Lines changed: 39 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,8 @@ MODULE_PARM_DESC(cdns_mcp_int_mask, "Cadence MCP IntMask");
127127

128128
#define CDNS_MCP_CMD_BASE 0x80
129129
#define CDNS_MCP_RESP_BASE 0x80
130-
#define CDNS_MCP_CMD_LEN 0x20
130+
/* FIFO can hold 8 commands */
131+
#define CDNS_MCP_CMD_LEN 8
131132
#define CDNS_MCP_CMD_WORD_LEN 0x4
132133

133134
#define CDNS_MCP_CMD_SSP_TAG BIT(31)
@@ -554,6 +555,29 @@ cdns_fill_msg_resp(struct sdw_cdns *cdns,
554555
return SDW_CMD_OK;
555556
}
556557

558+
static void cdns_read_response(struct sdw_cdns *cdns)
559+
{
560+
u32 num_resp, cmd_base;
561+
int i;
562+
563+
/* RX_FIFO_AVAIL can be 2 entries more than the FIFO size */
564+
BUILD_BUG_ON(ARRAY_SIZE(cdns->response_buf) < CDNS_MCP_CMD_LEN + 2);
565+
566+
num_resp = cdns_readl(cdns, CDNS_MCP_FIFOSTAT);
567+
num_resp &= CDNS_MCP_RX_FIFO_AVAIL;
568+
if (num_resp > ARRAY_SIZE(cdns->response_buf)) {
569+
dev_warn(cdns->dev, "RX AVAIL %d too long\n", num_resp);
570+
num_resp = ARRAY_SIZE(cdns->response_buf);
571+
}
572+
573+
cmd_base = CDNS_MCP_CMD_BASE;
574+
575+
for (i = 0; i < num_resp; i++) {
576+
cdns->response_buf[i] = cdns_readl(cdns, cmd_base);
577+
cmd_base += CDNS_MCP_CMD_WORD_LEN;
578+
}
579+
}
580+
557581
static enum sdw_command_response
558582
_cdns_xfer_msg(struct sdw_cdns *cdns, struct sdw_msg *msg, int cmd,
559583
int offset, int count, bool defer)
@@ -595,6 +619,10 @@ _cdns_xfer_msg(struct sdw_cdns *cdns, struct sdw_msg *msg, int cmd,
595619
dev_err(cdns->dev, "IO transfer timed out, cmd %d device %d addr %x len %d\n",
596620
cmd, msg->dev_num, msg->addr, msg->len);
597621
msg->len = 0;
622+
623+
/* Drain anything in the RX_FIFO */
624+
cdns_read_response(cdns);
625+
598626
return SDW_CMD_TIMEOUT;
599627
}
600628

@@ -721,10 +749,11 @@ cdns_xfer_msg(struct sdw_bus *bus, struct sdw_msg *msg)
721749
EXPORT_SYMBOL(cdns_xfer_msg);
722750

723751
enum sdw_command_response
724-
cdns_xfer_msg_defer(struct sdw_bus *bus,
725-
struct sdw_msg *msg, struct sdw_defer *defer)
752+
cdns_xfer_msg_defer(struct sdw_bus *bus)
726753
{
727754
struct sdw_cdns *cdns = bus_to_cdns(bus);
755+
struct sdw_defer *defer = &bus->defer_msg;
756+
struct sdw_msg *msg = defer->msg;
728757
int cmd = 0, ret;
729758

730759
/* for defer only 1 message is supported */
@@ -735,27 +764,10 @@ cdns_xfer_msg_defer(struct sdw_bus *bus,
735764
if (ret)
736765
return SDW_CMD_FAIL_OTHER;
737766

738-
cdns->defer = defer;
739-
cdns->defer->length = msg->len;
740-
741767
return _cdns_xfer_msg(cdns, msg, cmd, 0, msg->len, true);
742768
}
743769
EXPORT_SYMBOL(cdns_xfer_msg_defer);
744770

745-
enum sdw_command_response
746-
cdns_reset_page_addr(struct sdw_bus *bus, unsigned int dev_num)
747-
{
748-
struct sdw_cdns *cdns = bus_to_cdns(bus);
749-
struct sdw_msg msg;
750-
751-
/* Create dummy message with valid device number */
752-
memset(&msg, 0, sizeof(msg));
753-
msg.dev_num = dev_num;
754-
755-
return cdns_program_scp_addr(cdns, &msg);
756-
}
757-
EXPORT_SYMBOL(cdns_reset_page_addr);
758-
759771
u32 cdns_read_ping_status(struct sdw_bus *bus)
760772
{
761773
struct sdw_cdns *cdns = bus_to_cdns(bus);
@@ -768,22 +780,6 @@ EXPORT_SYMBOL(cdns_read_ping_status);
768780
* IRQ handling
769781
*/
770782

771-
static void cdns_read_response(struct sdw_cdns *cdns)
772-
{
773-
u32 num_resp, cmd_base;
774-
int i;
775-
776-
num_resp = cdns_readl(cdns, CDNS_MCP_FIFOSTAT);
777-
num_resp &= CDNS_MCP_RX_FIFO_AVAIL;
778-
779-
cmd_base = CDNS_MCP_CMD_BASE;
780-
781-
for (i = 0; i < num_resp; i++) {
782-
cdns->response_buf[i] = cdns_readl(cdns, cmd_base);
783-
cmd_base += CDNS_MCP_CMD_WORD_LEN;
784-
}
785-
}
786-
787783
static int cdns_update_slave_status(struct sdw_cdns *cdns,
788784
u64 slave_intstat)
789785
{
@@ -881,13 +877,15 @@ irqreturn_t sdw_cdns_irq(int irq, void *dev_id)
881877
return IRQ_NONE;
882878

883879
if (int_status & CDNS_MCP_INT_RX_WL) {
880+
struct sdw_bus *bus = &cdns->bus;
881+
struct sdw_defer *defer = &bus->defer_msg;
882+
884883
cdns_read_response(cdns);
885884

886-
if (cdns->defer) {
887-
cdns_fill_msg_resp(cdns, cdns->defer->msg,
888-
cdns->defer->length, 0);
889-
complete(&cdns->defer->complete);
890-
cdns->defer = NULL;
885+
if (defer && defer->msg) {
886+
cdns_fill_msg_resp(cdns, defer->msg,
887+
defer->length, 0);
888+
complete(&defer->complete);
891889
} else {
892890
complete(&cdns->tx_complete);
893891
}

drivers/soundwire/cadence_master.h

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,12 @@
88
#define SDW_CADENCE_GSYNC_KHZ 4 /* 4 kHz */
99
#define SDW_CADENCE_GSYNC_HZ (SDW_CADENCE_GSYNC_KHZ * 1000)
1010

11+
/*
12+
* The Cadence IP supports up to 32 entries in the FIFO, though implementations
13+
* can configure the IP to have a smaller FIFO.
14+
*/
15+
#define CDNS_MCP_IP_MAX_CMD_LEN 32
16+
1117
/**
1218
* struct sdw_cdns_pdi: PDI (Physical Data Interface) instance
1319
*
@@ -103,7 +109,6 @@ struct sdw_cdns_dai_runtime {
103109
* @instance: instance number
104110
* @response_buf: SoundWire response buffer
105111
* @tx_complete: Tx completion
106-
* @defer: Defer pointer
107112
* @ports: Data ports
108113
* @num_ports: Total number of data ports
109114
* @pcm: PCM streams
@@ -117,9 +122,13 @@ struct sdw_cdns {
117122
struct sdw_bus bus;
118123
unsigned int instance;
119124

120-
u32 response_buf[0x80];
125+
/*
126+
* The datasheet says the RX FIFO AVAIL can be 2 entries more
127+
* than the FIFO capacity, so allow for this.
128+
*/
129+
u32 response_buf[CDNS_MCP_IP_MAX_CMD_LEN + 2];
130+
121131
struct completion tx_complete;
122-
struct sdw_defer *defer;
123132

124133
struct sdw_cdns_port *ports;
125134
int num_ports;
@@ -147,7 +156,6 @@ struct sdw_cdns {
147156
/* Exported symbols */
148157

149158
int sdw_cdns_probe(struct sdw_cdns *cdns);
150-
extern struct sdw_master_ops sdw_cdns_master_ops;
151159

152160
irqreturn_t sdw_cdns_irq(int irq, void *dev_id);
153161
irqreturn_t sdw_cdns_thread(int irq, void *dev_id);
@@ -172,15 +180,11 @@ struct sdw_cdns_pdi *sdw_cdns_alloc_pdi(struct sdw_cdns *cdns,
172180
void sdw_cdns_config_stream(struct sdw_cdns *cdns,
173181
u32 ch, u32 dir, struct sdw_cdns_pdi *pdi);
174182

175-
enum sdw_command_response
176-
cdns_reset_page_addr(struct sdw_bus *bus, unsigned int dev_num);
177-
178183
enum sdw_command_response
179184
cdns_xfer_msg(struct sdw_bus *bus, struct sdw_msg *msg);
180185

181186
enum sdw_command_response
182-
cdns_xfer_msg_defer(struct sdw_bus *bus,
183-
struct sdw_msg *msg, struct sdw_defer *defer);
187+
cdns_xfer_msg_defer(struct sdw_bus *bus);
184188

185189
u32 cdns_read_ping_status(struct sdw_bus *bus);
186190

0 commit comments

Comments
 (0)