History

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

Linus Torvalds committed 3 years ago

Commit 595fa4e2 parents 8ff99ad 66f95de13 files · +207 −167Browse files

Unified · Split

13 files
  1. drivers/soundwire/bus.c +16 −40
  2. drivers/soundwire/bus.h +1 −2
  3. drivers/soundwire/bus_type.c +3 −6
  4. drivers/soundwire/cadence_master.c +39 −41
  5. drivers/soundwire/cadence_master.h +13 −9
  6. drivers/soundwire/debugfs.c +12 −1
  7. drivers/soundwire/intel.c +0 −27
  8. drivers/soundwire/intel_auxdevice.c +0 −1
  9. drivers/soundwire/stream.c +19 −19
  10. include/linux/soundwire/sdw.h +104 −18
  11. sound/soc/codecs/rt1316-sdw.c +0 −1
  12. sound/soc/codecs/rt1318-sdw.c +0 −1
  13. sound/soc/codecs/rt711-sdca-sdw.c +0 −1
drivers/soundwire/bus.c+16−40
@@ -225,9 +225,9 @@ static inline int do_transfer(struct sdw_bus *bus, struct sdw_msg *msg) · 224 unmodified lines
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, · 3 unmodified lines
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) · 14 unmodified lines
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); · 51 unmodified lines
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, · 53 unmodified lines
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) · 8 unmodified lines
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) · 8 unmodified lines
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, · 761 unmodified lines
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) · 12 unmodified lines
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) · 344 unmodified lines
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) · 130 unmodified lines
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+1−2
@@ -151,8 +151,7 @@ int sdw_configure_dpn_intr(struct sdw_slave *slave, int port, · 150 unmodified lines
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+3−6
@@ -105,20 +105,19 @@ static int sdw_drv_probe(struct device *dev) · 104 unmodified lines
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) · 42 unmodified lines
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+39−41
@@ -127,7 +127,8 @@ MODULE_PARM_DESC(cdns_mcp_int_mask, "Cadence MCP IntMask"); · 126 unmodified lines
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, · 420 unmodified lines
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, · 35 unmodified lines
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) · 120 unmodified lines
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, · 4 unmodified lines
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); · 6 unmodified lines
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) · 91 unmodified lines
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+13−9
@@ -8,6 +8,12 @@ · 7 unmodified lines
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 { · 89 unmodified lines
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 { · 7 unmodified lines
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 { · 21 unmodified lines
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, · 18 unmodified lines
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
drivers/soundwire/debugfs.c+12−1
@@ -4,6 +4,7 @@ · 3 unmodified lines
44 #include <linux/device.h>
55 #include <linux/debugfs.h>
66 #include <linux/mod_devicetable.h>
7+#include <linux/pm_runtime.h>
78 #include <linux/slab.h>
89 #include <linux/soundwire/sdw.h>
910 #include <linux/soundwire/sdw_registers.h>
@@ -35,7 +36,7 @@ static ssize_t sdw_sprintf(struct sdw_slave *slave, · 25 unmodified lines
3536 {
3637 int value;
3738
38− value = sdw_read(slave, reg);
39+ value = sdw_read_no_pm(slave, reg);
3940
4041 if (value < 0)
4142 return scnprintf(buf + pos, RD_BUF - pos, "%3x\tXX\n", reg);
@@ -55,6 +56,12 @@ static int sdw_slave_reg_show(struct seq_file *s_file, void *data) · 13 unmodified lines
5556 if (!buf)
5657 return -ENOMEM;
5758
59+ ret = pm_runtime_resume_and_get(&slave->dev);
60+ if (ret < 0 && ret != -EACCES) {
61+ kfree(buf);
62+ return ret;
63+ }
64+
5865 ret = scnprintf(buf, RD_BUF, "Register Value\n");
5966
6067 /* DP0 non-banked registers */
@@ -112,6 +119,10 @@ static int sdw_slave_reg_show(struct seq_file *s_file, void *data) · 51 unmodified lines
112119 }
113120
114121 seq_printf(s_file, "%s", buf);
122+
123+ pm_runtime_mark_last_busy(&slave->dev);
124+ pm_runtime_put(&slave->dev);
125+
115126 kfree(buf);
116127
117128 return 0;
drivers/soundwire/intel.c+0−27
@@ -778,22 +778,6 @@ unlock: · 777 unmodified lines
778778 * DAI routines
779779 */
780780
781−static int intel_startup(struct snd_pcm_substream *substream,
782− struct snd_soc_dai *dai)
783−{
784− struct sdw_cdns *cdns = snd_soc_dai_get_drvdata(dai);
785− int ret;
786−
787− ret = pm_runtime_resume_and_get(cdns->dev);
788− if (ret < 0 && ret != -EACCES) {
789− dev_err_ratelimited(cdns->dev,
790− "pm_runtime_resume_and_get failed in %s, ret %d\n",
791− __func__, ret);
792− return ret;
793− }
794− return 0;
795−}
796−
797781 static int intel_hw_params(struct snd_pcm_substream *substream,
798782 struct snd_pcm_hw_params *params,
799783 struct snd_soc_dai *dai)
@@ -954,15 +938,6 @@ intel_hw_free(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) · 154 unmodified lines
954938 return 0;
955939 }
956940
957−static void intel_shutdown(struct snd_pcm_substream *substream,
958− struct snd_soc_dai *dai)
959−{
960− struct sdw_cdns *cdns = snd_soc_dai_get_drvdata(dai);
961−
962− pm_runtime_mark_last_busy(cdns->dev);
963− pm_runtime_put_autosuspend(cdns->dev);
964−}
965−
966941 static int intel_pcm_set_sdw_stream(struct snd_soc_dai *dai,
967942 void *stream, int direction)
968943 {
@@ -1088,12 +1063,10 @@ static int intel_component_dais_suspend(struct snd_soc_component *component) · 119 unmodified lines
10881063 }
10891064
10901065 static const struct snd_soc_dai_ops intel_pcm_dai_ops = {
1091− .startup = intel_startup,
10921066 .hw_params = intel_hw_params,
10931067 .prepare = intel_prepare,
10941068 .hw_free = intel_hw_free,
10951069 .trigger = intel_trigger,
1096− .shutdown = intel_shutdown,
10971070 .set_stream = intel_pcm_set_sdw_stream,
10981071 .get_stream = intel_get_sdw_stream,
10991072 };
drivers/soundwire/intel_auxdevice.c+0−1
@@ -113,7 +113,6 @@ static struct sdw_master_ops sdw_intel_ops = { · 112 unmodified lines
113113 .override_adr = sdw_dmi_override_adr,
114114 .xfer_msg = cdns_xfer_msg,
115115 .xfer_msg_defer = cdns_xfer_msg_defer,
116− .reset_page_addr = cdns_reset_page_addr,
117116 .set_bus_conf = cdns_bus_conf,
118117 .pre_bank_switch = generic_pre_bank_switch,
119118 .post_bank_switch = generic_post_bank_switch,
drivers/soundwire/stream.c+19−19
@@ -81,14 +81,14 @@ static int _sdw_program_slave_port_params(struct sdw_bus *bus, · 80 unmodified lines
8181 }
8282
8383 /* Program DPN_OffsetCtrl2 registers */
84− ret = sdw_write(slave, addr1, t_params->offset2);
84+ ret = sdw_write_no_pm(slave, addr1, t_params->offset2);
8585 if (ret < 0) {
8686 dev_err(bus->dev, "DPN_OffsetCtrl2 register write failed\n");
8787 return ret;
8888 }
8989
9090 /* Program DPN_BlockCtrl3 register */
91− ret = sdw_write(slave, addr2, t_params->blk_pkg_mode);
91+ ret = sdw_write_no_pm(slave, addr2, t_params->blk_pkg_mode);
9292 if (ret < 0) {
9393 dev_err(bus->dev, "DPN_BlockCtrl3 register write failed\n");
9494 return ret;
@@ -105,7 +105,7 @@ static int _sdw_program_slave_port_params(struct sdw_bus *bus, · 10 unmodified lines
105105 /* Program DPN_SampleCtrl2 register */
106106 wbuf = FIELD_GET(SDW_DPN_SAMPLECTRL_HIGH, t_params->sample_interval - 1);
107107
108− ret = sdw_write(slave, addr3, wbuf);
108+ ret = sdw_write_no_pm(slave, addr3, wbuf);
109109 if (ret < 0) {
110110 dev_err(bus->dev, "DPN_SampleCtrl2 register write failed\n");
111111 return ret;
@@ -115,7 +115,7 @@ static int _sdw_program_slave_port_params(struct sdw_bus *bus, · 3 unmodified lines
115115 wbuf = FIELD_PREP(SDW_DPN_HCTRL_HSTART, t_params->hstart);
116116 wbuf |= FIELD_PREP(SDW_DPN_HCTRL_HSTOP, t_params->hstop);
117117
118− ret = sdw_write(slave, addr4, wbuf);
118+ ret = sdw_write_no_pm(slave, addr4, wbuf);
119119 if (ret < 0)
120120 dev_err(bus->dev, "DPN_HCtrl register write failed\n");
121121
@@ -163,7 +163,7 @@ static int sdw_program_slave_port_params(struct sdw_bus *bus, · 41 unmodified lines
163163 wbuf = FIELD_PREP(SDW_DPN_PORTCTRL_DATAMODE, p_params->data_mode);
164164 wbuf |= FIELD_PREP(SDW_DPN_PORTCTRL_FLOWMODE, p_params->flow_mode);
165165
166− ret = sdw_update(s_rt->slave, addr1, 0xF, wbuf);
166+ ret = sdw_update_no_pm(s_rt->slave, addr1, 0xF, wbuf);
167167 if (ret < 0) {
168168 dev_err(&s_rt->slave->dev,
169169 "DPN_PortCtrl register write failed for port %d\n",
@@ -173,7 +173,7 @@ static int sdw_program_slave_port_params(struct sdw_bus *bus, · 3 unmodified lines
173173
174174 if (!dpn_prop->read_only_wordlength) {
175175 /* Program DPN_BlockCtrl1 register */
176− ret = sdw_write(s_rt->slave, addr2, (p_params->bps - 1));
176+ ret = sdw_write_no_pm(s_rt->slave, addr2, (p_params->bps - 1));
177177 if (ret < 0) {
178178 dev_err(&s_rt->slave->dev,
179179 "DPN_BlockCtrl1 register write failed for port %d\n",
@@ -184,7 +184,7 @@ static int sdw_program_slave_port_params(struct sdw_bus *bus, · 4 unmodified lines
184184
185185 /* Program DPN_SampleCtrl1 register */
186186 wbuf = (t_params->sample_interval - 1) & SDW_DPN_SAMPLECTRL_LOW;
187− ret = sdw_write(s_rt->slave, addr3, wbuf);
187+ ret = sdw_write_no_pm(s_rt->slave, addr3, wbuf);
188188 if (ret < 0) {
189189 dev_err(&s_rt->slave->dev,
190190 "DPN_SampleCtrl1 register write failed for port %d\n",
@@ -193,7 +193,7 @@ static int sdw_program_slave_port_params(struct sdw_bus *bus, · 2 unmodified lines
193193 }
194194
195195 /* Program DPN_OffsetCtrl1 registers */
196− ret = sdw_write(s_rt->slave, addr4, t_params->offset1);
196+ ret = sdw_write_no_pm(s_rt->slave, addr4, t_params->offset1);
197197 if (ret < 0) {
198198 dev_err(&s_rt->slave->dev,
199199 "DPN_OffsetCtrl1 register write failed for port %d\n",
@@ -203,7 +203,7 @@ static int sdw_program_slave_port_params(struct sdw_bus *bus, · 3 unmodified lines
203203
204204 /* Program DPN_BlockCtrl2 register*/
205205 if (t_params->blk_grp_ctrl_valid) {
206− ret = sdw_write(s_rt->slave, addr5, t_params->blk_grp_ctrl);
206+ ret = sdw_write_no_pm(s_rt->slave, addr5, t_params->blk_grp_ctrl);
207207 if (ret < 0) {
208208 dev_err(&s_rt->slave->dev,
209209 "DPN_BlockCtrl2 reg write failed for port %d\n",
@@ -214,7 +214,7 @@ static int sdw_program_slave_port_params(struct sdw_bus *bus, · 4 unmodified lines
214214
215215 /* program DPN_LaneCtrl register */
216216 if (slave_prop->lane_control_support) {
217− ret = sdw_write(s_rt->slave, addr6, t_params->lane_ctrl);
217+ ret = sdw_write_no_pm(s_rt->slave, addr6, t_params->lane_ctrl);
218218 if (ret < 0) {
219219 dev_err(&s_rt->slave->dev,
220220 "DPN_LaneCtrl register write failed for port %d\n",
@@ -319,9 +319,9 @@ static int sdw_enable_disable_slave_ports(struct sdw_bus *bus, · 98 unmodified lines
319319 * it is safe to reset this register
320320 */
321321 if (en)
322− ret = sdw_write(s_rt->slave, addr, p_rt->ch_mask);
322+ ret = sdw_write_no_pm(s_rt->slave, addr, p_rt->ch_mask);
323323 else
324− ret = sdw_write(s_rt->slave, addr, 0x0);
324+ ret = sdw_write_no_pm(s_rt->slave, addr, 0x0);
325325
326326 if (ret < 0)
327327 dev_err(&s_rt->slave->dev,
@@ -476,9 +476,9 @@ static int sdw_prep_deprep_slave_ports(struct sdw_bus *bus, · 148 unmodified lines
476476 addr = SDW_DPN_PREPARECTRL(p_rt->num);
477477
478478 if (prep)
479− ret = sdw_write(s_rt->slave, addr, p_rt->ch_mask);
479+ ret = sdw_write_no_pm(s_rt->slave, addr, p_rt->ch_mask);
480480 else
481− ret = sdw_write(s_rt->slave, addr, 0x0);
481+ ret = sdw_write_no_pm(s_rt->slave, addr, 0x0);
482482
483483 if (ret < 0) {
484484 dev_err(&s_rt->slave->dev,
@@ -491,7 +491,7 @@ static int sdw_prep_deprep_slave_ports(struct sdw_bus *bus, · 6 unmodified lines
491491 wait_for_completion_timeout(port_ready,
492492 msecs_to_jiffies(dpn_prop->ch_prep_timeout));
493493
494− val = sdw_read(s_rt->slave, SDW_DPN_PREPARESTATUS(p_rt->num));
494+ val = sdw_read_no_pm(s_rt->slave, SDW_DPN_PREPARESTATUS(p_rt->num));
495495 if ((val < 0) || (val & p_rt->ch_mask)) {
496496 ret = (val < 0) ? val : -ETIMEDOUT;
497497 dev_err(&s_rt->slave->dev,
@@ -684,8 +684,6 @@ static int sdw_bank_switch(struct sdw_bus *bus, int m_rt_count) · 186 unmodified lines
684684 if (!wr_msg)
685685 return -ENOMEM;
686686
687− bus->defer_msg.msg = wr_msg;
688−
689687 wbuf = kzalloc(sizeof(*wbuf), GFP_KERNEL);
690688 if (!wbuf) {
691689 ret = -ENOMEM;
@@ -713,7 +711,7 @@ static int sdw_bank_switch(struct sdw_bus *bus, int m_rt_count) · 21 unmodified lines
713711 multi_link = bus->multi_link && (m_rt_count >= bus->hw_sync_min_links);
714712
715713 if (multi_link)
716− ret = sdw_transfer_defer(bus, wr_msg, &bus->defer_msg);
714+ ret = sdw_transfer_defer(bus, wr_msg);
717715 else
718716 ret = sdw_transfer(bus, wr_msg);
719717
@@ -723,8 +721,8 @@ static int sdw_bank_switch(struct sdw_bus *bus, int m_rt_count) · 3 unmodified lines
723721 }
724722
725723 if (!multi_link) {
726− kfree(wr_msg);
727724 kfree(wbuf);
725+ kfree(wr_msg);
728726 bus->defer_msg.msg = NULL;
729727 bus->params.curr_bank = !bus->params.curr_bank;
730728 bus->params.next_bank = !bus->params.next_bank;
@@ -769,6 +767,7 @@ static int sdw_ml_sync_bank_switch(struct sdw_bus *bus) · 38 unmodified lines
769767 if (bus->defer_msg.msg) {
770768 kfree(bus->defer_msg.msg->buf);
771769 kfree(bus->defer_msg.msg);
770+ bus->defer_msg.msg = NULL;
772771 }
773772
774773 return 0;
@@ -867,6 +866,7 @@ error: · 92 unmodified lines
867866 if (bus->defer_msg.msg) {
868867 kfree(bus->defer_msg.msg->buf);
869868 kfree(bus->defer_msg.msg);
869+ bus->defer_msg.msg = NULL;
870870 }
871871 }
872872
include/linux/soundwire/sdw.h+104−18
@@ -4,6 +4,7 @@ · 3 unmodified lines
44 #ifndef __SOUNDWIRE_H
55 #define __SOUNDWIRE_H
66
7+#include <linux/bug.h>
78 #include <linux/mod_devicetable.h>
89 #include <linux/bitfield.h>
910
@@ -365,7 +366,9 @@ struct sdw_dpn_prop { · 355 unmodified lines
365366 * @sink_dpn_prop: Sink Data Port N properties
366367 * @scp_int1_mask: SCP_INT1_MASK desired settings
367368 * @quirks: bitmask identifying deltas from the MIPI specification
368− * @is_sdca: the Slave supports the SDCA specification
369+ * @clock_reg_supported: the Peripheral implements the clock base and scale
370+ * registers introduced with the SoundWire 1.2 specification. SDCA devices
371+ * do not need to set this boolean property as the registers are required.
369372 */
370373 struct sdw_slave_prop {
371374 u32 mipi_revision;
@@ -389,7 +392,7 @@ struct sdw_slave_prop { · 17 unmodified lines
389392 struct sdw_dpn_prop *sink_dpn_prop;
390393 u8 scp_int1_mask;
391394 u32 quirks;
392− bool is_sdca;
395+ bool clock_reg_supported;
393396 };
394397
395398 #define SDW_SLAVE_QUIRKS_INVALID_INITIAL_PARITY BIT(0)
@@ -836,8 +839,8 @@ struct sdw_defer { · 440 unmodified lines
836839 * @read_prop: Read Master properties
837840 * @override_adr: Override value read from firmware (quirk for buggy firmware)
838841 * @xfer_msg: Transfer message callback
839− * @xfer_msg_defer: Defer version of transfer message callback
840− * @reset_page_addr: Reset the SCP page address registers
842+ * @xfer_msg_defer: Defer version of transfer message callback. The message is handled with the
843+ * bus struct @sdw_defer
841844 * @set_bus_conf: Set the bus configuration
842845 * @pre_bank_switch: Callback for pre bank switch
843846 * @post_bank_switch: Callback for post bank switch
@@ -851,10 +854,7 @@ struct sdw_master_ops { · 7 unmodified lines
851854 enum sdw_command_response (*xfer_msg)
852855 (struct sdw_bus *bus, struct sdw_msg *msg);
853856 enum sdw_command_response (*xfer_msg_defer)
854− (struct sdw_bus *bus, struct sdw_msg *msg,
855− struct sdw_defer *defer);
856− enum sdw_command_response (*reset_page_addr)
857− (struct sdw_bus *bus, unsigned int dev_num);
857+ (struct sdw_bus *bus);
858858 int (*set_bus_conf)(struct sdw_bus *bus,
859859 struct sdw_bus_params *params);
860860 int (*pre_bank_switch)(struct sdw_bus *bus);
@@ -1023,15 +1023,8 @@ int sdw_stream_add_master(struct sdw_bus *bus, · 162 unmodified lines
10231023 struct sdw_port_config *port_config,
10241024 unsigned int num_ports,
10251025 struct sdw_stream_runtime *stream);
1026−int sdw_stream_add_slave(struct sdw_slave *slave,
1027− struct sdw_stream_config *stream_config,
1028− struct sdw_port_config *port_config,
1029− unsigned int num_ports,
1030− struct sdw_stream_runtime *stream);
10311026 int sdw_stream_remove_master(struct sdw_bus *bus,
10321027 struct sdw_stream_runtime *stream);
1033−int sdw_stream_remove_slave(struct sdw_slave *slave,
1034− struct sdw_stream_runtime *stream);
10351028 int sdw_startup_stream(void *sdw_substream);
10361029 int sdw_prepare_stream(struct sdw_stream_runtime *stream);
10371030 int sdw_enable_stream(struct sdw_stream_runtime *stream);
@@ -1042,18 +1035,111 @@ int sdw_bus_prep_clk_stop(struct sdw_bus *bus); · 4 unmodified lines
10421035 int sdw_bus_clk_stop(struct sdw_bus *bus);
10431036 int sdw_bus_exit_clk_stop(struct sdw_bus *bus);
10441037
1045−/* messaging and data APIs */
1038+int sdw_compare_devid(struct sdw_slave *slave, struct sdw_slave_id id);
1039+void sdw_extract_slave_id(struct sdw_bus *bus, u64 addr, struct sdw_slave_id *id);
10461040
1041+#if IS_ENABLED(CONFIG_SOUNDWIRE)
1042+
1043+int sdw_stream_add_slave(struct sdw_slave *slave,
1044+ struct sdw_stream_config *stream_config,
1045+ struct sdw_port_config *port_config,
1046+ unsigned int num_ports,
1047+ struct sdw_stream_runtime *stream);
1048+int sdw_stream_remove_slave(struct sdw_slave *slave,
1049+ struct sdw_stream_runtime *stream);
1050+
1051+/* messaging and data APIs */
10471052 int sdw_read(struct sdw_slave *slave, u32 addr);
10481053 int sdw_write(struct sdw_slave *slave, u32 addr, u8 value);
10491054 int sdw_write_no_pm(struct sdw_slave *slave, u32 addr, u8 value);
10501055 int sdw_read_no_pm(struct sdw_slave *slave, u32 addr);
10511056 int sdw_nread(struct sdw_slave *slave, u32 addr, size_t count, u8 *val);
1057+int sdw_nread_no_pm(struct sdw_slave *slave, u32 addr, size_t count, u8 *val);
10521058 int sdw_nwrite(struct sdw_slave *slave, u32 addr, size_t count, const u8 *val);
1059+int sdw_nwrite_no_pm(struct sdw_slave *slave, u32 addr, size_t count, const u8 *val);
10531060 int sdw_update(struct sdw_slave *slave, u32 addr, u8 mask, u8 val);
10541061 int sdw_update_no_pm(struct sdw_slave *slave, u32 addr, u8 mask, u8 val);
10551062
1056−int sdw_compare_devid(struct sdw_slave *slave, struct sdw_slave_id id);
1057−void sdw_extract_slave_id(struct sdw_bus *bus, u64 addr, struct sdw_slave_id *id);
1063+#else
1064+
1065+static inline int sdw_stream_add_slave(struct sdw_slave *slave,
1066+ struct sdw_stream_config *stream_config,
1067+ struct sdw_port_config *port_config,
1068+ unsigned int num_ports,
1069+ struct sdw_stream_runtime *stream)
1070+{
1071+ WARN_ONCE(1, "SoundWire API is disabled");
1072+ return -EINVAL;
1073+}
1074+
1075+static inline int sdw_stream_remove_slave(struct sdw_slave *slave,
1076+ struct sdw_stream_runtime *stream)
1077+{
1078+ WARN_ONCE(1, "SoundWire API is disabled");
1079+ return -EINVAL;
1080+}
1081+
1082+/* messaging and data APIs */
1083+static inline int sdw_read(struct sdw_slave *slave, u32 addr)
1084+{
1085+ WARN_ONCE(1, "SoundWire API is disabled");
1086+ return -EINVAL;
1087+}
1088+
1089+static inline int sdw_write(struct sdw_slave *slave, u32 addr, u8 value)
1090+{
1091+ WARN_ONCE(1, "SoundWire API is disabled");
1092+ return -EINVAL;
1093+}
1094+
1095+static inline int sdw_write_no_pm(struct sdw_slave *slave, u32 addr, u8 value)
1096+{
1097+ WARN_ONCE(1, "SoundWire API is disabled");
1098+ return -EINVAL;
1099+}
1100+
1101+static inline int sdw_read_no_pm(struct sdw_slave *slave, u32 addr)
1102+{
1103+ WARN_ONCE(1, "SoundWire API is disabled");
1104+ return -EINVAL;
1105+}
1106+
1107+static inline int sdw_nread(struct sdw_slave *slave, u32 addr, size_t count, u8 *val)
1108+{
1109+ WARN_ONCE(1, "SoundWire API is disabled");
1110+ return -EINVAL;
1111+}
1112+
1113+static inline int sdw_nread_no_pm(struct sdw_slave *slave, u32 addr, size_t count, u8 *val)
1114+{
1115+ WARN_ONCE(1, "SoundWire API is disabled");
1116+ return -EINVAL;
1117+}
1118+
1119+static inline int sdw_nwrite(struct sdw_slave *slave, u32 addr, size_t count, const u8 *val)
1120+{
1121+ WARN_ONCE(1, "SoundWire API is disabled");
1122+ return -EINVAL;
1123+}
1124+
1125+static inline int sdw_nwrite_no_pm(struct sdw_slave *slave, u32 addr, size_t count, const u8 *val)
1126+{
1127+ WARN_ONCE(1, "SoundWire API is disabled");
1128+ return -EINVAL;
1129+}
1130+
1131+static inline int sdw_update(struct sdw_slave *slave, u32 addr, u8 mask, u8 val)
1132+{
1133+ WARN_ONCE(1, "SoundWire API is disabled");
1134+ return -EINVAL;
1135+}
1136+
1137+static inline int sdw_update_no_pm(struct sdw_slave *slave, u32 addr, u8 mask, u8 val)
1138+{
1139+ WARN_ONCE(1, "SoundWire API is disabled");
1140+ return -EINVAL;
1141+}
1142+
1143+#endif /* CONFIG_SOUNDWIRE */
10581144
10591145 #endif /* __SOUNDWIRE_H */
sound/soc/codecs/rt1316-sdw.c+0−1
@@ -204,7 +204,6 @@ static int rt1316_read_prop(struct sdw_slave *slave) · 203 unmodified lines
204204
205205 prop->scp_int1_mask = SDW_SCP_INT1_BUS_CLASH | SDW_SCP_INT1_PARITY;
206206 prop->quirks = SDW_SLAVE_QUIRKS_INVALID_INITIAL_PARITY;
207− prop->is_sdca = true;
208207
209208 prop->paging_support = true;
210209
sound/soc/codecs/rt1318-sdw.c+0−1
@@ -353,7 +353,6 @@ static int rt1318_read_prop(struct sdw_slave *slave) · 352 unmodified lines
353353
354354 prop->scp_int1_mask = SDW_SCP_INT1_BUS_CLASH | SDW_SCP_INT1_PARITY;
355355 prop->quirks = SDW_SLAVE_QUIRKS_INVALID_INITIAL_PARITY;
356− prop->is_sdca = true;
357356
358357 prop->paging_support = true;
359358
sound/soc/codecs/rt711-sdca-sdw.c+0−1
@@ -186,7 +186,6 @@ static int rt711_sdca_read_prop(struct sdw_slave *slave) · 185 unmodified lines
186186
187187 prop->scp_int1_mask = SDW_SCP_INT1_BUS_CLASH | SDW_SCP_INT1_PARITY;
188188 prop->quirks = SDW_SLAVE_QUIRKS_INVALID_INITIAL_PARITY;
189− prop->is_sdca = true;
190189
191190 prop->paging_support = true;
192191

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t