1 // SPDX-License-Identifier: (GPL-2.0 OR BSD-3-Clause)
2 // Copyright(c) 2015-17 Intel Corporation.
5 * Cadence SoundWire Master module
6 * Used by Master driver
9 #include <linux/delay.h>
10 #include <linux/device.h>
11 #include <linux/debugfs.h>
12 #include <linux/interrupt.h>
14 #include <linux/module.h>
15 #include <linux/mod_devicetable.h>
16 #include <linux/pm_runtime.h>
17 #include <linux/soundwire/sdw_registers.h>
18 #include <linux/soundwire/sdw.h>
19 #include <sound/pcm_params.h>
20 #include <sound/soc.h>
21 #include <linux/workqueue.h>
23 #include "cadence_master.h"
25 static int interrupt_mask
;
26 module_param_named(cnds_mcp_int_mask
, interrupt_mask
, int, 0444);
27 MODULE_PARM_DESC(cdns_mcp_int_mask
, "Cadence MCP IntMask");
29 #define CDNS_MCP_CONFIG 0x0
31 #define CDNS_MCP_CONFIG_MCMD_RETRY GENMASK(27, 24)
32 #define CDNS_MCP_CONFIG_MPREQ_DELAY GENMASK(20, 16)
33 #define CDNS_MCP_CONFIG_MMASTER BIT(7)
34 #define CDNS_MCP_CONFIG_BUS_REL BIT(6)
35 #define CDNS_MCP_CONFIG_SNIFFER BIT(5)
36 #define CDNS_MCP_CONFIG_SSPMOD BIT(4)
37 #define CDNS_MCP_CONFIG_CMD BIT(3)
38 #define CDNS_MCP_CONFIG_OP GENMASK(2, 0)
39 #define CDNS_MCP_CONFIG_OP_NORMAL 0
41 #define CDNS_MCP_CONTROL 0x4
43 #define CDNS_MCP_CONTROL_RST_DELAY GENMASK(10, 8)
44 #define CDNS_MCP_CONTROL_CMD_RST BIT(7)
45 #define CDNS_MCP_CONTROL_SOFT_RST BIT(6)
46 #define CDNS_MCP_CONTROL_SW_RST BIT(5)
47 #define CDNS_MCP_CONTROL_HW_RST BIT(4)
48 #define CDNS_MCP_CONTROL_CLK_PAUSE BIT(3)
49 #define CDNS_MCP_CONTROL_CLK_STOP_CLR BIT(2)
50 #define CDNS_MCP_CONTROL_CMD_ACCEPT BIT(1)
51 #define CDNS_MCP_CONTROL_BLOCK_WAKEUP BIT(0)
53 #define CDNS_MCP_CMDCTRL 0x8
55 #define CDNS_MCP_CMDCTRL_INSERT_PARITY_ERR BIT(2)
57 #define CDNS_MCP_SSPSTAT 0xC
58 #define CDNS_MCP_FRAME_SHAPE 0x10
59 #define CDNS_MCP_FRAME_SHAPE_INIT 0x14
60 #define CDNS_MCP_FRAME_SHAPE_COL_MASK GENMASK(2, 0)
61 #define CDNS_MCP_FRAME_SHAPE_ROW_MASK GENMASK(7, 3)
63 #define CDNS_MCP_CONFIG_UPDATE 0x18
64 #define CDNS_MCP_CONFIG_UPDATE_BIT BIT(0)
66 #define CDNS_MCP_PHYCTRL 0x1C
67 #define CDNS_MCP_SSP_CTRL0 0x20
68 #define CDNS_MCP_SSP_CTRL1 0x28
69 #define CDNS_MCP_CLK_CTRL0 0x30
70 #define CDNS_MCP_CLK_CTRL1 0x38
71 #define CDNS_MCP_CLK_MCLKD_MASK GENMASK(7, 0)
73 #define CDNS_MCP_STAT 0x40
75 #define CDNS_MCP_STAT_ACTIVE_BANK BIT(20)
76 #define CDNS_MCP_STAT_CLK_STOP BIT(16)
78 #define CDNS_MCP_INTSTAT 0x44
79 #define CDNS_MCP_INTMASK 0x48
81 #define CDNS_MCP_INT_IRQ BIT(31)
82 #define CDNS_MCP_INT_RESERVED1 GENMASK(30, 17)
83 #define CDNS_MCP_INT_WAKEUP BIT(16)
84 #define CDNS_MCP_INT_SLAVE_RSVD BIT(15)
85 #define CDNS_MCP_INT_SLAVE_ALERT BIT(14)
86 #define CDNS_MCP_INT_SLAVE_ATTACH BIT(13)
87 #define CDNS_MCP_INT_SLAVE_NATTACH BIT(12)
88 #define CDNS_MCP_INT_SLAVE_MASK GENMASK(15, 12)
89 #define CDNS_MCP_INT_DPINT BIT(11)
90 #define CDNS_MCP_INT_CTRL_CLASH BIT(10)
91 #define CDNS_MCP_INT_DATA_CLASH BIT(9)
92 #define CDNS_MCP_INT_PARITY BIT(8)
93 #define CDNS_MCP_INT_CMD_ERR BIT(7)
94 #define CDNS_MCP_INT_RESERVED2 GENMASK(6, 4)
95 #define CDNS_MCP_INT_RX_NE BIT(3)
96 #define CDNS_MCP_INT_RX_WL BIT(2)
97 #define CDNS_MCP_INT_TXE BIT(1)
98 #define CDNS_MCP_INT_TXF BIT(0)
99 #define CDNS_MCP_INT_RESERVED (CDNS_MCP_INT_RESERVED1 | CDNS_MCP_INT_RESERVED2)
101 #define CDNS_MCP_INTSET 0x4C
103 #define CDNS_MCP_SLAVE_STAT 0x50
104 #define CDNS_MCP_SLAVE_STAT_MASK GENMASK(1, 0)
106 #define CDNS_MCP_SLAVE_INTSTAT0 0x54
107 #define CDNS_MCP_SLAVE_INTSTAT1 0x58
108 #define CDNS_MCP_SLAVE_INTSTAT_NPRESENT BIT(0)
109 #define CDNS_MCP_SLAVE_INTSTAT_ATTACHED BIT(1)
110 #define CDNS_MCP_SLAVE_INTSTAT_ALERT BIT(2)
111 #define CDNS_MCP_SLAVE_INTSTAT_RESERVED BIT(3)
112 #define CDNS_MCP_SLAVE_STATUS_BITS GENMASK(3, 0)
113 #define CDNS_MCP_SLAVE_STATUS_NUM 4
115 #define CDNS_MCP_SLAVE_INTMASK0 0x5C
116 #define CDNS_MCP_SLAVE_INTMASK1 0x60
118 #define CDNS_MCP_SLAVE_INTMASK0_MASK GENMASK(31, 0)
119 #define CDNS_MCP_SLAVE_INTMASK1_MASK GENMASK(15, 0)
121 #define CDNS_MCP_PORT_INTSTAT 0x64
122 #define CDNS_MCP_PDI_STAT 0x6C
124 #define CDNS_MCP_FIFOLEVEL 0x78
125 #define CDNS_MCP_FIFOSTAT 0x7C
126 #define CDNS_MCP_RX_FIFO_AVAIL GENMASK(5, 0)
128 #define CDNS_MCP_CMD_BASE 0x80
129 #define CDNS_MCP_RESP_BASE 0x80
130 #define CDNS_MCP_CMD_LEN 0x20
131 #define CDNS_MCP_CMD_WORD_LEN 0x4
133 #define CDNS_MCP_CMD_SSP_TAG BIT(31)
134 #define CDNS_MCP_CMD_COMMAND GENMASK(30, 28)
135 #define CDNS_MCP_CMD_DEV_ADDR GENMASK(27, 24)
136 #define CDNS_MCP_CMD_REG_ADDR GENMASK(23, 8)
137 #define CDNS_MCP_CMD_REG_DATA GENMASK(7, 0)
139 #define CDNS_MCP_CMD_READ 2
140 #define CDNS_MCP_CMD_WRITE 3
142 #define CDNS_MCP_RESP_RDATA GENMASK(15, 8)
143 #define CDNS_MCP_RESP_ACK BIT(0)
144 #define CDNS_MCP_RESP_NACK BIT(1)
146 #define CDNS_DP_SIZE 128
148 #define CDNS_DPN_B0_CONFIG(n) (0x100 + CDNS_DP_SIZE * (n))
149 #define CDNS_DPN_B0_CH_EN(n) (0x104 + CDNS_DP_SIZE * (n))
150 #define CDNS_DPN_B0_SAMPLE_CTRL(n) (0x108 + CDNS_DP_SIZE * (n))
151 #define CDNS_DPN_B0_OFFSET_CTRL(n) (0x10C + CDNS_DP_SIZE * (n))
152 #define CDNS_DPN_B0_HCTRL(n) (0x110 + CDNS_DP_SIZE * (n))
153 #define CDNS_DPN_B0_ASYNC_CTRL(n) (0x114 + CDNS_DP_SIZE * (n))
155 #define CDNS_DPN_B1_CONFIG(n) (0x118 + CDNS_DP_SIZE * (n))
156 #define CDNS_DPN_B1_CH_EN(n) (0x11C + CDNS_DP_SIZE * (n))
157 #define CDNS_DPN_B1_SAMPLE_CTRL(n) (0x120 + CDNS_DP_SIZE * (n))
158 #define CDNS_DPN_B1_OFFSET_CTRL(n) (0x124 + CDNS_DP_SIZE * (n))
159 #define CDNS_DPN_B1_HCTRL(n) (0x128 + CDNS_DP_SIZE * (n))
160 #define CDNS_DPN_B1_ASYNC_CTRL(n) (0x12C + CDNS_DP_SIZE * (n))
162 #define CDNS_DPN_CONFIG_BPM BIT(18)
163 #define CDNS_DPN_CONFIG_BGC GENMASK(17, 16)
164 #define CDNS_DPN_CONFIG_WL GENMASK(12, 8)
165 #define CDNS_DPN_CONFIG_PORT_DAT GENMASK(3, 2)
166 #define CDNS_DPN_CONFIG_PORT_FLOW GENMASK(1, 0)
168 #define CDNS_DPN_SAMPLE_CTRL_SI GENMASK(15, 0)
170 #define CDNS_DPN_OFFSET_CTRL_1 GENMASK(7, 0)
171 #define CDNS_DPN_OFFSET_CTRL_2 GENMASK(15, 8)
173 #define CDNS_DPN_HCTRL_HSTOP GENMASK(3, 0)
174 #define CDNS_DPN_HCTRL_HSTART GENMASK(7, 4)
175 #define CDNS_DPN_HCTRL_LCTRL GENMASK(10, 8)
177 #define CDNS_PORTCTRL 0x130
178 #define CDNS_PORTCTRL_TEST_FAILED BIT(1)
179 #define CDNS_PORTCTRL_DIRN BIT(7)
180 #define CDNS_PORTCTRL_BANK_INVERT BIT(8)
182 #define CDNS_PORT_OFFSET 0x80
184 #define CDNS_PDI_CONFIG(n) (0x1100 + (n) * 16)
186 #define CDNS_PDI_CONFIG_SOFT_RESET BIT(24)
187 #define CDNS_PDI_CONFIG_CHANNEL GENMASK(15, 8)
188 #define CDNS_PDI_CONFIG_PORT GENMASK(4, 0)
190 /* Driver defaults */
191 #define CDNS_TX_TIMEOUT 2000
193 #define CDNS_SCP_RX_FIFOLEVEL 0x2
196 * register accessor helpers
198 static inline u32
cdns_readl(struct sdw_cdns
*cdns
, int offset
)
200 return readl(cdns
->registers
+ offset
);
203 static inline void cdns_writel(struct sdw_cdns
*cdns
, int offset
, u32 value
)
205 writel(value
, cdns
->registers
+ offset
);
208 static inline void cdns_updatel(struct sdw_cdns
*cdns
,
209 int offset
, u32 mask
, u32 val
)
213 tmp
= cdns_readl(cdns
, offset
);
214 tmp
= (tmp
& ~mask
) | val
;
215 cdns_writel(cdns
, offset
, tmp
);
218 static int cdns_set_wait(struct sdw_cdns
*cdns
, int offset
, u32 mask
, u32 value
)
223 /* Wait for bit to be set */
225 reg_read
= readl(cdns
->registers
+ offset
);
226 if ((reg_read
& mask
) == value
)
230 usleep_range(50, 100);
231 } while (timeout
!= 0);
236 static int cdns_clear_bit(struct sdw_cdns
*cdns
, int offset
, u32 value
)
238 writel(value
, cdns
->registers
+ offset
);
240 /* Wait for bit to be self cleared */
241 return cdns_set_wait(cdns
, offset
, value
, 0);
245 * all changes to the MCP_CONFIG, MCP_CONTROL, MCP_CMDCTRL and MCP_PHYCTRL
246 * need to be confirmed with a write to MCP_CONFIG_UPDATE
248 static int cdns_config_update(struct sdw_cdns
*cdns
)
252 if (sdw_cdns_is_clock_stop(cdns
)) {
253 dev_err(cdns
->dev
, "Cannot program MCP_CONFIG_UPDATE in ClockStopMode\n");
257 ret
= cdns_clear_bit(cdns
, CDNS_MCP_CONFIG_UPDATE
,
258 CDNS_MCP_CONFIG_UPDATE_BIT
);
260 dev_err(cdns
->dev
, "Config update timedout\n");
268 #ifdef CONFIG_DEBUG_FS
270 #define RD_BUF (2 * PAGE_SIZE)
272 static ssize_t
cdns_sprintf(struct sdw_cdns
*cdns
,
273 char *buf
, size_t pos
, unsigned int reg
)
275 return scnprintf(buf
+ pos
, RD_BUF
- pos
,
276 "%4x\t%8x\n", reg
, cdns_readl(cdns
, reg
));
279 static int cdns_reg_show(struct seq_file
*s
, void *data
)
281 struct sdw_cdns
*cdns
= s
->private;
287 buf
= kzalloc(RD_BUF
, GFP_KERNEL
);
291 ret
= scnprintf(buf
, RD_BUF
, "Register Value\n");
292 ret
+= scnprintf(buf
+ ret
, RD_BUF
- ret
, "\nMCP Registers\n");
293 /* 8 MCP registers */
294 for (i
= CDNS_MCP_CONFIG
; i
<= CDNS_MCP_PHYCTRL
; i
+= sizeof(u32
))
295 ret
+= cdns_sprintf(cdns
, buf
, ret
, i
);
297 ret
+= scnprintf(buf
+ ret
, RD_BUF
- ret
,
298 "\nStatus & Intr Registers\n");
299 /* 13 Status & Intr registers (offsets 0x70 and 0x74 not defined) */
300 for (i
= CDNS_MCP_STAT
; i
<= CDNS_MCP_FIFOSTAT
; i
+= sizeof(u32
))
301 ret
+= cdns_sprintf(cdns
, buf
, ret
, i
);
303 ret
+= scnprintf(buf
+ ret
, RD_BUF
- ret
,
304 "\nSSP & Clk ctrl Registers\n");
305 ret
+= cdns_sprintf(cdns
, buf
, ret
, CDNS_MCP_SSP_CTRL0
);
306 ret
+= cdns_sprintf(cdns
, buf
, ret
, CDNS_MCP_SSP_CTRL1
);
307 ret
+= cdns_sprintf(cdns
, buf
, ret
, CDNS_MCP_CLK_CTRL0
);
308 ret
+= cdns_sprintf(cdns
, buf
, ret
, CDNS_MCP_CLK_CTRL1
);
310 ret
+= scnprintf(buf
+ ret
, RD_BUF
- ret
,
311 "\nDPn B0 Registers\n");
313 num_ports
= cdns
->num_ports
;
315 for (i
= 0; i
< num_ports
; i
++) {
316 ret
+= scnprintf(buf
+ ret
, RD_BUF
- ret
,
318 for (j
= CDNS_DPN_B0_CONFIG(i
);
319 j
< CDNS_DPN_B0_ASYNC_CTRL(i
); j
+= sizeof(u32
))
320 ret
+= cdns_sprintf(cdns
, buf
, ret
, j
);
323 ret
+= scnprintf(buf
+ ret
, RD_BUF
- ret
,
324 "\nDPn B1 Registers\n");
325 for (i
= 0; i
< num_ports
; i
++) {
326 ret
+= scnprintf(buf
+ ret
, RD_BUF
- ret
,
329 for (j
= CDNS_DPN_B1_CONFIG(i
);
330 j
< CDNS_DPN_B1_ASYNC_CTRL(i
); j
+= sizeof(u32
))
331 ret
+= cdns_sprintf(cdns
, buf
, ret
, j
);
334 ret
+= scnprintf(buf
+ ret
, RD_BUF
- ret
,
335 "\nDPn Control Registers\n");
336 for (i
= 0; i
< num_ports
; i
++)
337 ret
+= cdns_sprintf(cdns
, buf
, ret
,
338 CDNS_PORTCTRL
+ i
* CDNS_PORT_OFFSET
);
340 ret
+= scnprintf(buf
+ ret
, RD_BUF
- ret
,
341 "\nPDIn Config Registers\n");
343 /* number of PDI and ports is interchangeable */
344 for (i
= 0; i
< num_ports
; i
++)
345 ret
+= cdns_sprintf(cdns
, buf
, ret
, CDNS_PDI_CONFIG(i
));
347 seq_printf(s
, "%s", buf
);
352 DEFINE_SHOW_ATTRIBUTE(cdns_reg
);
354 static int cdns_hw_reset(void *data
, u64 value
)
356 struct sdw_cdns
*cdns
= data
;
362 /* Userspace changed the hardware state behind the kernel's back */
363 add_taint(TAINT_USER
, LOCKDEP_STILL_OK
);
365 ret
= sdw_cdns_exit_reset(cdns
);
367 dev_dbg(cdns
->dev
, "link hw_reset done: %d\n", ret
);
372 DEFINE_DEBUGFS_ATTRIBUTE(cdns_hw_reset_fops
, NULL
, cdns_hw_reset
, "%llu\n");
374 static int cdns_parity_error_injection(void *data
, u64 value
)
376 struct sdw_cdns
*cdns
= data
;
386 * Resume Master device. If this results in a bus reset, the
387 * Slave devices will re-attach and be re-enumerated.
389 ret
= pm_runtime_get_sync(bus
->dev
);
390 if (ret
< 0 && ret
!= -EACCES
) {
391 dev_err_ratelimited(cdns
->dev
,
392 "pm_runtime_get_sync failed in %s, ret %d\n",
394 pm_runtime_put_noidle(bus
->dev
);
399 * wait long enough for Slave(s) to be in steady state. This
400 * does not need to be super precise.
405 * Take the bus lock here to make sure that any bus transactions
406 * will be queued while we inject a parity error on a dummy read
408 mutex_lock(&bus
->bus_lock
);
410 /* program hardware to inject parity error */
411 cdns_updatel(cdns
, CDNS_MCP_CMDCTRL
,
412 CDNS_MCP_CMDCTRL_INSERT_PARITY_ERR
,
413 CDNS_MCP_CMDCTRL_INSERT_PARITY_ERR
);
416 cdns_updatel(cdns
, CDNS_MCP_CONFIG_UPDATE
,
417 CDNS_MCP_CONFIG_UPDATE_BIT
,
418 CDNS_MCP_CONFIG_UPDATE_BIT
);
420 /* do a broadcast dummy read to avoid bus clashes */
421 ret
= sdw_bread_no_pm_unlocked(&cdns
->bus
, 0xf, SDW_SCP_DEVID_0
);
422 dev_info(cdns
->dev
, "parity error injection, read: %d\n", ret
);
424 /* program hardware to disable parity error */
425 cdns_updatel(cdns
, CDNS_MCP_CMDCTRL
,
426 CDNS_MCP_CMDCTRL_INSERT_PARITY_ERR
,
430 cdns_updatel(cdns
, CDNS_MCP_CONFIG_UPDATE
,
431 CDNS_MCP_CONFIG_UPDATE_BIT
,
432 CDNS_MCP_CONFIG_UPDATE_BIT
);
434 /* Continue bus operation with parity error injection disabled */
435 mutex_unlock(&bus
->bus_lock
);
437 /* Userspace changed the hardware state behind the kernel's back */
438 add_taint(TAINT_USER
, LOCKDEP_STILL_OK
);
441 * allow Master device to enter pm_runtime suspend. This may
442 * also result in Slave devices suspending.
444 pm_runtime_mark_last_busy(bus
->dev
);
445 pm_runtime_put_autosuspend(bus
->dev
);
450 DEFINE_DEBUGFS_ATTRIBUTE(cdns_parity_error_fops
, NULL
,
451 cdns_parity_error_injection
, "%llu\n");
454 * sdw_cdns_debugfs_init() - Cadence debugfs init
455 * @cdns: Cadence instance
456 * @root: debugfs root
458 void sdw_cdns_debugfs_init(struct sdw_cdns
*cdns
, struct dentry
*root
)
460 debugfs_create_file("cdns-registers", 0400, root
, cdns
, &cdns_reg_fops
);
462 debugfs_create_file("cdns-hw-reset", 0200, root
, cdns
,
463 &cdns_hw_reset_fops
);
465 debugfs_create_file("cdns-parity-error-injection", 0200, root
, cdns
,
466 &cdns_parity_error_fops
);
468 EXPORT_SYMBOL_GPL(sdw_cdns_debugfs_init
);
470 #endif /* CONFIG_DEBUG_FS */
475 static enum sdw_command_response
476 cdns_fill_msg_resp(struct sdw_cdns
*cdns
,
477 struct sdw_msg
*msg
, int count
, int offset
)
479 int nack
= 0, no_ack
= 0;
482 /* check message response */
483 for (i
= 0; i
< count
; i
++) {
484 if (!(cdns
->response_buf
[i
] & CDNS_MCP_RESP_ACK
)) {
486 dev_dbg_ratelimited(cdns
->dev
, "Msg Ack not received\n");
487 if (cdns
->response_buf
[i
] & CDNS_MCP_RESP_NACK
) {
489 dev_err_ratelimited(cdns
->dev
, "Msg NACK received\n");
495 dev_err_ratelimited(cdns
->dev
, "Msg NACKed for Slave %d\n", msg
->dev_num
);
500 dev_dbg_ratelimited(cdns
->dev
, "Msg ignored for Slave %d\n", msg
->dev_num
);
501 return SDW_CMD_IGNORED
;
505 for (i
= 0; i
< count
; i
++)
506 msg
->buf
[i
+ offset
] = FIELD_GET(CDNS_MCP_RESP_RDATA
, cdns
->response_buf
[i
]);
511 static enum sdw_command_response
512 _cdns_xfer_msg(struct sdw_cdns
*cdns
, struct sdw_msg
*msg
, int cmd
,
513 int offset
, int count
, bool defer
)
519 /* Program the watermark level for RX FIFO */
520 if (cdns
->msg_count
!= count
) {
521 cdns_writel(cdns
, CDNS_MCP_FIFOLEVEL
, count
);
522 cdns
->msg_count
= count
;
525 base
= CDNS_MCP_CMD_BASE
;
528 for (i
= 0; i
< count
; i
++) {
529 data
= FIELD_PREP(CDNS_MCP_CMD_DEV_ADDR
, msg
->dev_num
);
530 data
|= FIELD_PREP(CDNS_MCP_CMD_COMMAND
, cmd
);
531 data
|= FIELD_PREP(CDNS_MCP_CMD_REG_ADDR
, addr
);
534 if (msg
->flags
== SDW_MSG_FLAG_WRITE
)
535 data
|= msg
->buf
[i
+ offset
];
537 data
|= FIELD_PREP(CDNS_MCP_CMD_SSP_TAG
, msg
->ssp_sync
);
538 cdns_writel(cdns
, base
, data
);
539 base
+= CDNS_MCP_CMD_WORD_LEN
;
545 /* wait for timeout or response */
546 time
= wait_for_completion_timeout(&cdns
->tx_complete
,
547 msecs_to_jiffies(CDNS_TX_TIMEOUT
));
549 dev_err(cdns
->dev
, "IO transfer timed out, cmd %d device %d addr %x len %d\n",
550 cmd
, msg
->dev_num
, msg
->addr
, msg
->len
);
552 return SDW_CMD_TIMEOUT
;
555 return cdns_fill_msg_resp(cdns
, msg
, count
, offset
);
558 static enum sdw_command_response
559 cdns_program_scp_addr(struct sdw_cdns
*cdns
, struct sdw_msg
*msg
)
561 int nack
= 0, no_ack
= 0;
566 /* Program the watermark level for RX FIFO */
567 if (cdns
->msg_count
!= CDNS_SCP_RX_FIFOLEVEL
) {
568 cdns_writel(cdns
, CDNS_MCP_FIFOLEVEL
, CDNS_SCP_RX_FIFOLEVEL
);
569 cdns
->msg_count
= CDNS_SCP_RX_FIFOLEVEL
;
572 data
[0] = FIELD_PREP(CDNS_MCP_CMD_DEV_ADDR
, msg
->dev_num
);
573 data
[0] |= FIELD_PREP(CDNS_MCP_CMD_COMMAND
, 0x3);
576 data
[0] |= FIELD_PREP(CDNS_MCP_CMD_REG_ADDR
, SDW_SCP_ADDRPAGE1
);
577 data
[1] |= FIELD_PREP(CDNS_MCP_CMD_REG_ADDR
, SDW_SCP_ADDRPAGE2
);
579 data
[0] |= msg
->addr_page1
;
580 data
[1] |= msg
->addr_page2
;
582 base
= CDNS_MCP_CMD_BASE
;
583 cdns_writel(cdns
, base
, data
[0]);
584 base
+= CDNS_MCP_CMD_WORD_LEN
;
585 cdns_writel(cdns
, base
, data
[1]);
587 time
= wait_for_completion_timeout(&cdns
->tx_complete
,
588 msecs_to_jiffies(CDNS_TX_TIMEOUT
));
590 dev_err(cdns
->dev
, "SCP Msg trf timed out\n");
592 return SDW_CMD_TIMEOUT
;
595 /* check response the writes */
596 for (i
= 0; i
< 2; i
++) {
597 if (!(cdns
->response_buf
[i
] & CDNS_MCP_RESP_ACK
)) {
599 dev_err(cdns
->dev
, "Program SCP Ack not received\n");
600 if (cdns
->response_buf
[i
] & CDNS_MCP_RESP_NACK
) {
602 dev_err(cdns
->dev
, "Program SCP NACK received\n");
607 /* For NACK, NO ack, don't return err if we are in Broadcast mode */
609 dev_err_ratelimited(cdns
->dev
,
610 "SCP_addrpage NACKed for Slave %d\n", msg
->dev_num
);
615 dev_dbg_ratelimited(cdns
->dev
,
616 "SCP_addrpage ignored for Slave %d\n", msg
->dev_num
);
617 return SDW_CMD_IGNORED
;
623 static int cdns_prep_msg(struct sdw_cdns
*cdns
, struct sdw_msg
*msg
, int *cmd
)
628 ret
= cdns_program_scp_addr(cdns
, msg
);
635 switch (msg
->flags
) {
636 case SDW_MSG_FLAG_READ
:
637 *cmd
= CDNS_MCP_CMD_READ
;
640 case SDW_MSG_FLAG_WRITE
:
641 *cmd
= CDNS_MCP_CMD_WRITE
;
645 dev_err(cdns
->dev
, "Invalid msg cmd: %d\n", msg
->flags
);
652 enum sdw_command_response
653 cdns_xfer_msg(struct sdw_bus
*bus
, struct sdw_msg
*msg
)
655 struct sdw_cdns
*cdns
= bus_to_cdns(bus
);
658 ret
= cdns_prep_msg(cdns
, msg
, &cmd
);
660 return SDW_CMD_FAIL_OTHER
;
662 for (i
= 0; i
< msg
->len
/ CDNS_MCP_CMD_LEN
; i
++) {
663 ret
= _cdns_xfer_msg(cdns
, msg
, cmd
, i
* CDNS_MCP_CMD_LEN
,
664 CDNS_MCP_CMD_LEN
, false);
669 if (!(msg
->len
% CDNS_MCP_CMD_LEN
))
672 ret
= _cdns_xfer_msg(cdns
, msg
, cmd
, i
* CDNS_MCP_CMD_LEN
,
673 msg
->len
% CDNS_MCP_CMD_LEN
, false);
678 EXPORT_SYMBOL(cdns_xfer_msg
);
680 enum sdw_command_response
681 cdns_xfer_msg_defer(struct sdw_bus
*bus
,
682 struct sdw_msg
*msg
, struct sdw_defer
*defer
)
684 struct sdw_cdns
*cdns
= bus_to_cdns(bus
);
687 /* for defer only 1 message is supported */
691 ret
= cdns_prep_msg(cdns
, msg
, &cmd
);
693 return SDW_CMD_FAIL_OTHER
;
696 cdns
->defer
->length
= msg
->len
;
698 return _cdns_xfer_msg(cdns
, msg
, cmd
, 0, msg
->len
, true);
700 EXPORT_SYMBOL(cdns_xfer_msg_defer
);
702 enum sdw_command_response
703 cdns_reset_page_addr(struct sdw_bus
*bus
, unsigned int dev_num
)
705 struct sdw_cdns
*cdns
= bus_to_cdns(bus
);
708 /* Create dummy message with valid device number */
709 memset(&msg
, 0, sizeof(msg
));
710 msg
.dev_num
= dev_num
;
712 return cdns_program_scp_addr(cdns
, &msg
);
714 EXPORT_SYMBOL(cdns_reset_page_addr
);
720 static void cdns_read_response(struct sdw_cdns
*cdns
)
722 u32 num_resp
, cmd_base
;
725 num_resp
= cdns_readl(cdns
, CDNS_MCP_FIFOSTAT
);
726 num_resp
&= CDNS_MCP_RX_FIFO_AVAIL
;
728 cmd_base
= CDNS_MCP_CMD_BASE
;
730 for (i
= 0; i
< num_resp
; i
++) {
731 cdns
->response_buf
[i
] = cdns_readl(cdns
, cmd_base
);
732 cmd_base
+= CDNS_MCP_CMD_WORD_LEN
;
736 static int cdns_update_slave_status(struct sdw_cdns
*cdns
,
737 u32 slave0
, u32 slave1
)
739 enum sdw_slave_status status
[SDW_MAX_DEVICES
+ 1];
740 bool is_slave
= false;
745 /* combine the two status */
746 slave
= ((u64
)slave1
<< 32) | slave0
;
747 memset(status
, 0, sizeof(status
));
749 for (i
= 0; i
<= SDW_MAX_DEVICES
; i
++) {
750 mask
= (slave
>> (i
* CDNS_MCP_SLAVE_STATUS_NUM
)) &
751 CDNS_MCP_SLAVE_STATUS_BITS
;
758 if (mask
& CDNS_MCP_SLAVE_INTSTAT_RESERVED
) {
759 status
[i
] = SDW_SLAVE_RESERVED
;
763 if (mask
& CDNS_MCP_SLAVE_INTSTAT_ATTACHED
) {
764 status
[i
] = SDW_SLAVE_ATTACHED
;
768 if (mask
& CDNS_MCP_SLAVE_INTSTAT_ALERT
) {
769 status
[i
] = SDW_SLAVE_ALERT
;
773 if (mask
& CDNS_MCP_SLAVE_INTSTAT_NPRESENT
) {
774 status
[i
] = SDW_SLAVE_UNATTACHED
;
778 /* first check if Slave reported multiple status */
779 if (set_status
> 1) {
782 dev_warn_ratelimited(cdns
->dev
,
783 "Slave %d reported multiple Status: %d\n",
786 /* check latest status extracted from PING commands */
787 val
= cdns_readl(cdns
, CDNS_MCP_SLAVE_STAT
);
792 status
[i
] = SDW_SLAVE_UNATTACHED
;
795 status
[i
] = SDW_SLAVE_ATTACHED
;
798 status
[i
] = SDW_SLAVE_ALERT
;
802 status
[i
] = SDW_SLAVE_RESERVED
;
806 dev_warn_ratelimited(cdns
->dev
,
807 "Slave %d status updated to %d\n",
814 return sdw_handle_slave_status(&cdns
->bus
, status
);
820 * sdw_cdns_irq() - Cadence interrupt handler
822 * @dev_id: irq context
824 irqreturn_t
sdw_cdns_irq(int irq
, void *dev_id
)
826 struct sdw_cdns
*cdns
= dev_id
;
828 int ret
= IRQ_HANDLED
;
830 /* Check if the link is up */
834 int_status
= cdns_readl(cdns
, CDNS_MCP_INTSTAT
);
836 /* check for reserved values read as zero */
837 if (int_status
& CDNS_MCP_INT_RESERVED
)
840 if (!(int_status
& CDNS_MCP_INT_IRQ
))
843 if (int_status
& CDNS_MCP_INT_RX_WL
) {
844 cdns_read_response(cdns
);
847 cdns_fill_msg_resp(cdns
, cdns
->defer
->msg
,
848 cdns
->defer
->length
, 0);
849 complete(&cdns
->defer
->complete
);
852 complete(&cdns
->tx_complete
);
856 if (int_status
& CDNS_MCP_INT_PARITY
) {
857 /* Parity error detected by Master */
858 dev_err_ratelimited(cdns
->dev
, "Parity error\n");
861 if (int_status
& CDNS_MCP_INT_CTRL_CLASH
) {
862 /* Slave is driving bit slot during control word */
863 dev_err_ratelimited(cdns
->dev
, "Bus clash for control word\n");
866 if (int_status
& CDNS_MCP_INT_DATA_CLASH
) {
868 * Multiple slaves trying to drive bit slot, or issue with
869 * ownership of data bits or Slave gone bonkers
871 dev_err_ratelimited(cdns
->dev
, "Bus clash for data word\n");
874 if (cdns
->bus
.params
.m_data_mode
!= SDW_PORT_DATA_MODE_NORMAL
&&
875 int_status
& CDNS_MCP_INT_DPINT
) {
878 /* just log which ports report an error */
879 port_intstat
= cdns_readl(cdns
, CDNS_MCP_PORT_INTSTAT
);
880 dev_err_ratelimited(cdns
->dev
, "DP interrupt: PortIntStat %8x\n",
883 /* clear status w/ write1 */
884 cdns_writel(cdns
, CDNS_MCP_PORT_INTSTAT
, port_intstat
);
887 if (int_status
& CDNS_MCP_INT_SLAVE_MASK
) {
888 /* Mask the Slave interrupt and wake thread */
889 cdns_updatel(cdns
, CDNS_MCP_INTMASK
,
890 CDNS_MCP_INT_SLAVE_MASK
, 0);
892 int_status
&= ~CDNS_MCP_INT_SLAVE_MASK
;
895 * Deal with possible race condition between interrupt
896 * handling and disabling interrupts on suspend.
898 * If the master is in the process of disabling
899 * interrupts, don't schedule a workqueue
901 if (cdns
->interrupt_enabled
)
902 schedule_work(&cdns
->work
);
905 cdns_writel(cdns
, CDNS_MCP_INTSTAT
, int_status
);
908 EXPORT_SYMBOL(sdw_cdns_irq
);
911 * To update slave status in a work since we will need to handle
912 * other interrupts eg. CDNS_MCP_INT_RX_WL during the update slave
914 * @work: cdns worker thread
916 static void cdns_update_slave_status_work(struct work_struct
*work
)
918 struct sdw_cdns
*cdns
=
919 container_of(work
, struct sdw_cdns
, work
);
922 dev_dbg_ratelimited(cdns
->dev
, "Slave status change\n");
924 slave0
= cdns_readl(cdns
, CDNS_MCP_SLAVE_INTSTAT0
);
925 slave1
= cdns_readl(cdns
, CDNS_MCP_SLAVE_INTSTAT1
);
927 cdns_update_slave_status(cdns
, slave0
, slave1
);
928 cdns_writel(cdns
, CDNS_MCP_SLAVE_INTSTAT0
, slave0
);
929 cdns_writel(cdns
, CDNS_MCP_SLAVE_INTSTAT1
, slave1
);
931 /* clear and unmask Slave interrupt now */
932 cdns_writel(cdns
, CDNS_MCP_INTSTAT
, CDNS_MCP_INT_SLAVE_MASK
);
933 cdns_updatel(cdns
, CDNS_MCP_INTMASK
,
934 CDNS_MCP_INT_SLAVE_MASK
, CDNS_MCP_INT_SLAVE_MASK
);
943 * sdw_cdns_exit_reset() - Program reset parameters and start bus operations
944 * @cdns: Cadence instance
946 int sdw_cdns_exit_reset(struct sdw_cdns
*cdns
)
948 /* program maximum length reset to be safe */
949 cdns_updatel(cdns
, CDNS_MCP_CONTROL
,
950 CDNS_MCP_CONTROL_RST_DELAY
,
951 CDNS_MCP_CONTROL_RST_DELAY
);
953 /* use hardware generated reset */
954 cdns_updatel(cdns
, CDNS_MCP_CONTROL
,
955 CDNS_MCP_CONTROL_HW_RST
,
956 CDNS_MCP_CONTROL_HW_RST
);
959 cdns_updatel(cdns
, CDNS_MCP_CONFIG_UPDATE
,
960 CDNS_MCP_CONFIG_UPDATE_BIT
,
961 CDNS_MCP_CONFIG_UPDATE_BIT
);
963 /* don't wait here */
967 EXPORT_SYMBOL(sdw_cdns_exit_reset
);
970 * sdw_cdns_enable_slave_interrupt() - Enable SDW slave interrupts
971 * @cdns: Cadence instance
972 * @state: boolean for true/false
974 static void cdns_enable_slave_interrupts(struct sdw_cdns
*cdns
, bool state
)
978 mask
= cdns_readl(cdns
, CDNS_MCP_INTMASK
);
980 mask
|= CDNS_MCP_INT_SLAVE_MASK
;
982 mask
&= ~CDNS_MCP_INT_SLAVE_MASK
;
984 cdns_writel(cdns
, CDNS_MCP_INTMASK
, mask
);
988 * sdw_cdns_enable_interrupt() - Enable SDW interrupts
989 * @cdns: Cadence instance
990 * @state: True if we are trying to enable interrupt.
992 int sdw_cdns_enable_interrupt(struct sdw_cdns
*cdns
, bool state
)
994 u32 slave_intmask0
= 0;
995 u32 slave_intmask1
= 0;
1001 slave_intmask0
= CDNS_MCP_SLAVE_INTMASK0_MASK
;
1002 slave_intmask1
= CDNS_MCP_SLAVE_INTMASK1_MASK
;
1004 /* enable detection of all slave state changes */
1005 mask
= CDNS_MCP_INT_SLAVE_MASK
;
1007 /* enable detection of bus issues */
1008 mask
|= CDNS_MCP_INT_CTRL_CLASH
| CDNS_MCP_INT_DATA_CLASH
|
1009 CDNS_MCP_INT_PARITY
;
1011 /* port interrupt limited to test modes for now */
1012 if (cdns
->bus
.params
.m_data_mode
!= SDW_PORT_DATA_MODE_NORMAL
)
1013 mask
|= CDNS_MCP_INT_DPINT
;
1015 /* enable detection of RX fifo level */
1016 mask
|= CDNS_MCP_INT_RX_WL
;
1019 * CDNS_MCP_INT_IRQ needs to be set otherwise all previous
1020 * settings are irrelevant
1022 mask
|= CDNS_MCP_INT_IRQ
;
1024 if (interrupt_mask
) /* parameter override */
1025 mask
= interrupt_mask
;
1028 /* clear slave interrupt status before enabling interrupt */
1032 slave_state
= cdns_readl(cdns
, CDNS_MCP_SLAVE_INTSTAT0
);
1033 cdns_writel(cdns
, CDNS_MCP_SLAVE_INTSTAT0
, slave_state
);
1034 slave_state
= cdns_readl(cdns
, CDNS_MCP_SLAVE_INTSTAT1
);
1035 cdns_writel(cdns
, CDNS_MCP_SLAVE_INTSTAT1
, slave_state
);
1037 cdns
->interrupt_enabled
= state
;
1040 * Complete any on-going status updates before updating masks,
1041 * and cancel queued status updates.
1043 * There could be a race with a new interrupt thrown before
1044 * the 3 mask updates below are complete, so in the interrupt
1045 * we use the 'interrupt_enabled' status to prevent new work
1046 * from being queued.
1049 cancel_work_sync(&cdns
->work
);
1051 cdns_writel(cdns
, CDNS_MCP_SLAVE_INTMASK0
, slave_intmask0
);
1052 cdns_writel(cdns
, CDNS_MCP_SLAVE_INTMASK1
, slave_intmask1
);
1053 cdns_writel(cdns
, CDNS_MCP_INTMASK
, mask
);
1057 EXPORT_SYMBOL(sdw_cdns_enable_interrupt
);
1059 static int cdns_allocate_pdi(struct sdw_cdns
*cdns
,
1060 struct sdw_cdns_pdi
**stream
,
1061 u32 num
, u32 pdi_offset
)
1063 struct sdw_cdns_pdi
*pdi
;
1069 pdi
= devm_kcalloc(cdns
->dev
, num
, sizeof(*pdi
), GFP_KERNEL
);
1073 for (i
= 0; i
< num
; i
++) {
1074 pdi
[i
].num
= i
+ pdi_offset
;
1082 * sdw_cdns_pdi_init() - PDI initialization routine
1084 * @cdns: Cadence instance
1085 * @config: Stream configurations
1087 int sdw_cdns_pdi_init(struct sdw_cdns
*cdns
,
1088 struct sdw_cdns_stream_config config
)
1090 struct sdw_cdns_streams
*stream
;
1094 cdns
->pcm
.num_bd
= config
.pcm_bd
;
1095 cdns
->pcm
.num_in
= config
.pcm_in
;
1096 cdns
->pcm
.num_out
= config
.pcm_out
;
1097 cdns
->pdm
.num_bd
= config
.pdm_bd
;
1098 cdns
->pdm
.num_in
= config
.pdm_in
;
1099 cdns
->pdm
.num_out
= config
.pdm_out
;
1101 /* Allocate PDIs for PCMs */
1102 stream
= &cdns
->pcm
;
1104 /* we allocate PDI0 and PDI1 which are used for Bulk */
1107 ret
= cdns_allocate_pdi(cdns
, &stream
->bd
,
1108 stream
->num_bd
, offset
);
1112 offset
+= stream
->num_bd
;
1114 ret
= cdns_allocate_pdi(cdns
, &stream
->in
,
1115 stream
->num_in
, offset
);
1119 offset
+= stream
->num_in
;
1121 ret
= cdns_allocate_pdi(cdns
, &stream
->out
,
1122 stream
->num_out
, offset
);
1126 /* Update total number of PCM PDIs */
1127 stream
->num_pdi
= stream
->num_bd
+ stream
->num_in
+ stream
->num_out
;
1128 cdns
->num_ports
= stream
->num_pdi
;
1130 /* Allocate PDIs for PDMs */
1131 stream
= &cdns
->pdm
;
1132 ret
= cdns_allocate_pdi(cdns
, &stream
->bd
,
1133 stream
->num_bd
, offset
);
1137 offset
+= stream
->num_bd
;
1139 ret
= cdns_allocate_pdi(cdns
, &stream
->in
,
1140 stream
->num_in
, offset
);
1144 offset
+= stream
->num_in
;
1146 ret
= cdns_allocate_pdi(cdns
, &stream
->out
,
1147 stream
->num_out
, offset
);
1152 /* Update total number of PDM PDIs */
1153 stream
->num_pdi
= stream
->num_bd
+ stream
->num_in
+ stream
->num_out
;
1154 cdns
->num_ports
+= stream
->num_pdi
;
1158 EXPORT_SYMBOL(sdw_cdns_pdi_init
);
1160 static u32
cdns_set_initial_frame_shape(int n_rows
, int n_cols
)
1166 r
= sdw_find_row_index(n_rows
);
1167 c
= sdw_find_col_index(n_cols
);
1169 val
= FIELD_PREP(CDNS_MCP_FRAME_SHAPE_ROW_MASK
, r
);
1170 val
|= FIELD_PREP(CDNS_MCP_FRAME_SHAPE_COL_MASK
, c
);
1175 static void cdns_init_clock_ctrl(struct sdw_cdns
*cdns
)
1177 struct sdw_bus
*bus
= &cdns
->bus
;
1178 struct sdw_master_prop
*prop
= &bus
->prop
;
1183 /* Set clock divider */
1184 divider
= (prop
->mclk_freq
/ prop
->max_clk_freq
) - 1;
1186 cdns_updatel(cdns
, CDNS_MCP_CLK_CTRL0
,
1187 CDNS_MCP_CLK_MCLKD_MASK
, divider
);
1188 cdns_updatel(cdns
, CDNS_MCP_CLK_CTRL1
,
1189 CDNS_MCP_CLK_MCLKD_MASK
, divider
);
1192 * Frame shape changes after initialization have to be done
1193 * with the bank switch mechanism
1195 val
= cdns_set_initial_frame_shape(prop
->default_row
,
1197 cdns_writel(cdns
, CDNS_MCP_FRAME_SHAPE_INIT
, val
);
1199 /* Set SSP interval to default value */
1200 ssp_interval
= prop
->default_frame_rate
/ SDW_CADENCE_GSYNC_HZ
;
1201 cdns_writel(cdns
, CDNS_MCP_SSP_CTRL0
, ssp_interval
);
1202 cdns_writel(cdns
, CDNS_MCP_SSP_CTRL1
, ssp_interval
);
1206 * sdw_cdns_init() - Cadence initialization
1207 * @cdns: Cadence instance
1209 int sdw_cdns_init(struct sdw_cdns
*cdns
)
1213 cdns_init_clock_ctrl(cdns
);
1215 /* reset msg_count to default value of FIFOLEVEL */
1216 cdns
->msg_count
= cdns_readl(cdns
, CDNS_MCP_FIFOLEVEL
);
1218 /* flush command FIFOs */
1219 cdns_updatel(cdns
, CDNS_MCP_CONTROL
, CDNS_MCP_CONTROL_CMD_RST
,
1220 CDNS_MCP_CONTROL_CMD_RST
);
1222 /* Set cmd accept mode */
1223 cdns_updatel(cdns
, CDNS_MCP_CONTROL
, CDNS_MCP_CONTROL_CMD_ACCEPT
,
1224 CDNS_MCP_CONTROL_CMD_ACCEPT
);
1226 /* Configure mcp config */
1227 val
= cdns_readl(cdns
, CDNS_MCP_CONFIG
);
1229 /* enable bus operations with clock and data */
1230 val
&= ~CDNS_MCP_CONFIG_OP
;
1231 val
|= CDNS_MCP_CONFIG_OP_NORMAL
;
1233 /* Set cmd mode for Tx and Rx cmds */
1234 val
&= ~CDNS_MCP_CONFIG_CMD
;
1236 /* Disable sniffer mode */
1237 val
&= ~CDNS_MCP_CONFIG_SNIFFER
;
1239 /* Disable auto bus release */
1240 val
&= ~CDNS_MCP_CONFIG_BUS_REL
;
1242 if (cdns
->bus
.multi_link
)
1243 /* Set Multi-master mode to take gsync into account */
1244 val
|= CDNS_MCP_CONFIG_MMASTER
;
1246 /* leave frame delay to hardware default of 0x1F */
1248 /* leave command retry to hardware default of 0 */
1250 cdns_writel(cdns
, CDNS_MCP_CONFIG
, val
);
1252 /* changes will be committed later */
1255 EXPORT_SYMBOL(sdw_cdns_init
);
1257 int cdns_bus_conf(struct sdw_bus
*bus
, struct sdw_bus_params
*params
)
1259 struct sdw_master_prop
*prop
= &bus
->prop
;
1260 struct sdw_cdns
*cdns
= bus_to_cdns(bus
);
1261 int mcp_clkctrl_off
;
1264 if (!params
->curr_dr_freq
) {
1265 dev_err(cdns
->dev
, "NULL curr_dr_freq\n");
1269 divider
= prop
->mclk_freq
* SDW_DOUBLE_RATE_FACTOR
/
1270 params
->curr_dr_freq
;
1271 divider
--; /* divider is 1/(N+1) */
1273 if (params
->next_bank
)
1274 mcp_clkctrl_off
= CDNS_MCP_CLK_CTRL1
;
1276 mcp_clkctrl_off
= CDNS_MCP_CLK_CTRL0
;
1278 cdns_updatel(cdns
, mcp_clkctrl_off
, CDNS_MCP_CLK_MCLKD_MASK
, divider
);
1282 EXPORT_SYMBOL(cdns_bus_conf
);
1284 static int cdns_port_params(struct sdw_bus
*bus
,
1285 struct sdw_port_params
*p_params
, unsigned int bank
)
1287 struct sdw_cdns
*cdns
= bus_to_cdns(bus
);
1288 int dpn_config
= 0, dpn_config_off
;
1291 dpn_config_off
= CDNS_DPN_B1_CONFIG(p_params
->num
);
1293 dpn_config_off
= CDNS_DPN_B0_CONFIG(p_params
->num
);
1295 dpn_config
= cdns_readl(cdns
, dpn_config_off
);
1297 u32p_replace_bits(&dpn_config
, (p_params
->bps
- 1), CDNS_DPN_CONFIG_WL
);
1298 u32p_replace_bits(&dpn_config
, p_params
->flow_mode
, CDNS_DPN_CONFIG_PORT_FLOW
);
1299 u32p_replace_bits(&dpn_config
, p_params
->data_mode
, CDNS_DPN_CONFIG_PORT_DAT
);
1301 cdns_writel(cdns
, dpn_config_off
, dpn_config
);
1306 static int cdns_transport_params(struct sdw_bus
*bus
,
1307 struct sdw_transport_params
*t_params
,
1308 enum sdw_reg_bank bank
)
1310 struct sdw_cdns
*cdns
= bus_to_cdns(bus
);
1311 int dpn_offsetctrl
= 0, dpn_offsetctrl_off
;
1312 int dpn_config
= 0, dpn_config_off
;
1313 int dpn_hctrl
= 0, dpn_hctrl_off
;
1314 int num
= t_params
->port_num
;
1315 int dpn_samplectrl_off
;
1318 * Note: Only full data port is supported on the Master side for
1319 * both PCM and PDM ports.
1323 dpn_config_off
= CDNS_DPN_B1_CONFIG(num
);
1324 dpn_samplectrl_off
= CDNS_DPN_B1_SAMPLE_CTRL(num
);
1325 dpn_hctrl_off
= CDNS_DPN_B1_HCTRL(num
);
1326 dpn_offsetctrl_off
= CDNS_DPN_B1_OFFSET_CTRL(num
);
1328 dpn_config_off
= CDNS_DPN_B0_CONFIG(num
);
1329 dpn_samplectrl_off
= CDNS_DPN_B0_SAMPLE_CTRL(num
);
1330 dpn_hctrl_off
= CDNS_DPN_B0_HCTRL(num
);
1331 dpn_offsetctrl_off
= CDNS_DPN_B0_OFFSET_CTRL(num
);
1334 dpn_config
= cdns_readl(cdns
, dpn_config_off
);
1335 u32p_replace_bits(&dpn_config
, t_params
->blk_grp_ctrl
, CDNS_DPN_CONFIG_BGC
);
1336 u32p_replace_bits(&dpn_config
, t_params
->blk_pkg_mode
, CDNS_DPN_CONFIG_BPM
);
1337 cdns_writel(cdns
, dpn_config_off
, dpn_config
);
1339 u32p_replace_bits(&dpn_offsetctrl
, t_params
->offset1
, CDNS_DPN_OFFSET_CTRL_1
);
1340 u32p_replace_bits(&dpn_offsetctrl
, t_params
->offset2
, CDNS_DPN_OFFSET_CTRL_2
);
1341 cdns_writel(cdns
, dpn_offsetctrl_off
, dpn_offsetctrl
);
1343 u32p_replace_bits(&dpn_hctrl
, t_params
->hstart
, CDNS_DPN_HCTRL_HSTART
);
1344 u32p_replace_bits(&dpn_hctrl
, t_params
->hstop
, CDNS_DPN_HCTRL_HSTOP
);
1345 u32p_replace_bits(&dpn_hctrl
, t_params
->lane_ctrl
, CDNS_DPN_HCTRL_LCTRL
);
1347 cdns_writel(cdns
, dpn_hctrl_off
, dpn_hctrl
);
1348 cdns_writel(cdns
, dpn_samplectrl_off
, (t_params
->sample_interval
- 1));
1353 static int cdns_port_enable(struct sdw_bus
*bus
,
1354 struct sdw_enable_ch
*enable_ch
, unsigned int bank
)
1356 struct sdw_cdns
*cdns
= bus_to_cdns(bus
);
1357 int dpn_chnen_off
, ch_mask
;
1360 dpn_chnen_off
= CDNS_DPN_B1_CH_EN(enable_ch
->port_num
);
1362 dpn_chnen_off
= CDNS_DPN_B0_CH_EN(enable_ch
->port_num
);
1364 ch_mask
= enable_ch
->ch_mask
* enable_ch
->enable
;
1365 cdns_writel(cdns
, dpn_chnen_off
, ch_mask
);
1370 static const struct sdw_master_port_ops cdns_port_ops
= {
1371 .dpn_set_port_params
= cdns_port_params
,
1372 .dpn_set_port_transport_params
= cdns_transport_params
,
1373 .dpn_port_enable_ch
= cdns_port_enable
,
1377 * sdw_cdns_is_clock_stop: Check clock status
1379 * @cdns: Cadence instance
1381 bool sdw_cdns_is_clock_stop(struct sdw_cdns
*cdns
)
1383 return !!(cdns_readl(cdns
, CDNS_MCP_STAT
) & CDNS_MCP_STAT_CLK_STOP
);
1385 EXPORT_SYMBOL(sdw_cdns_is_clock_stop
);
1388 * sdw_cdns_clock_stop: Cadence clock stop configuration routine
1390 * @cdns: Cadence instance
1391 * @block_wake: prevent wakes if required by the platform
1393 int sdw_cdns_clock_stop(struct sdw_cdns
*cdns
, bool block_wake
)
1395 bool slave_present
= false;
1396 struct sdw_slave
*slave
;
1399 /* Check suspend status */
1400 if (sdw_cdns_is_clock_stop(cdns
)) {
1401 dev_dbg(cdns
->dev
, "Clock is already stopped\n");
1406 * Before entering clock stop we mask the Slave
1407 * interrupts. This helps avoid having to deal with e.g. a
1408 * Slave becoming UNATTACHED while the clock is being stopped
1410 cdns_enable_slave_interrupts(cdns
, false);
1413 * For specific platforms, it is required to be able to put
1414 * master into a state in which it ignores wake-up trials
1415 * in clock stop state
1418 cdns_updatel(cdns
, CDNS_MCP_CONTROL
,
1419 CDNS_MCP_CONTROL_BLOCK_WAKEUP
,
1420 CDNS_MCP_CONTROL_BLOCK_WAKEUP
);
1422 list_for_each_entry(slave
, &cdns
->bus
.slaves
, node
) {
1423 if (slave
->status
== SDW_SLAVE_ATTACHED
||
1424 slave
->status
== SDW_SLAVE_ALERT
) {
1425 slave_present
= true;
1431 * This CMD_ACCEPT should be used when there are no devices
1432 * attached on the link when entering clock stop mode. If this is
1433 * not set and there is a broadcast write then the command ignored
1434 * will be treated as a failure
1437 cdns_updatel(cdns
, CDNS_MCP_CONTROL
,
1438 CDNS_MCP_CONTROL_CMD_ACCEPT
,
1439 CDNS_MCP_CONTROL_CMD_ACCEPT
);
1441 cdns_updatel(cdns
, CDNS_MCP_CONTROL
,
1442 CDNS_MCP_CONTROL_CMD_ACCEPT
, 0);
1444 /* commit changes */
1445 ret
= cdns_config_update(cdns
);
1447 dev_err(cdns
->dev
, "%s: config_update failed\n", __func__
);
1451 /* Prepare slaves for clock stop */
1452 ret
= sdw_bus_prep_clk_stop(&cdns
->bus
);
1454 dev_err(cdns
->dev
, "prepare clock stop failed %d", ret
);
1459 * Enter clock stop mode and only report errors if there are
1460 * Slave devices present (ALERT or ATTACHED)
1462 ret
= sdw_bus_clk_stop(&cdns
->bus
);
1463 if (ret
< 0 && slave_present
&& ret
!= -ENODATA
) {
1464 dev_err(cdns
->dev
, "bus clock stop failed %d", ret
);
1468 ret
= cdns_set_wait(cdns
, CDNS_MCP_STAT
,
1469 CDNS_MCP_STAT_CLK_STOP
,
1470 CDNS_MCP_STAT_CLK_STOP
);
1472 dev_err(cdns
->dev
, "Clock stop failed %d\n", ret
);
1476 EXPORT_SYMBOL(sdw_cdns_clock_stop
);
1479 * sdw_cdns_clock_restart: Cadence PM clock restart configuration routine
1481 * @cdns: Cadence instance
1482 * @bus_reset: context may be lost while in low power modes and the bus
1483 * may require a Severe Reset and re-enumeration after a wake.
1485 int sdw_cdns_clock_restart(struct sdw_cdns
*cdns
, bool bus_reset
)
1489 /* unmask Slave interrupts that were masked when stopping the clock */
1490 cdns_enable_slave_interrupts(cdns
, true);
1492 ret
= cdns_clear_bit(cdns
, CDNS_MCP_CONTROL
,
1493 CDNS_MCP_CONTROL_CLK_STOP_CLR
);
1495 dev_err(cdns
->dev
, "Couldn't exit from clock stop\n");
1499 ret
= cdns_set_wait(cdns
, CDNS_MCP_STAT
, CDNS_MCP_STAT_CLK_STOP
, 0);
1501 dev_err(cdns
->dev
, "clock stop exit failed %d\n", ret
);
1505 cdns_updatel(cdns
, CDNS_MCP_CONTROL
,
1506 CDNS_MCP_CONTROL_BLOCK_WAKEUP
, 0);
1509 * clear CMD_ACCEPT so that the command ignored
1510 * will be treated as a failure during a broadcast write
1512 cdns_updatel(cdns
, CDNS_MCP_CONTROL
, CDNS_MCP_CONTROL_CMD_ACCEPT
, 0);
1516 /* enable bus operations with clock and data */
1517 cdns_updatel(cdns
, CDNS_MCP_CONFIG
,
1519 CDNS_MCP_CONFIG_OP_NORMAL
);
1521 ret
= cdns_config_update(cdns
);
1523 dev_err(cdns
->dev
, "%s: config_update failed\n", __func__
);
1527 ret
= sdw_bus_exit_clk_stop(&cdns
->bus
);
1529 dev_err(cdns
->dev
, "bus failed to exit clock stop %d\n", ret
);
1534 EXPORT_SYMBOL(sdw_cdns_clock_restart
);
1537 * sdw_cdns_probe() - Cadence probe routine
1538 * @cdns: Cadence instance
1540 int sdw_cdns_probe(struct sdw_cdns
*cdns
)
1542 init_completion(&cdns
->tx_complete
);
1543 cdns
->bus
.port_ops
= &cdns_port_ops
;
1545 INIT_WORK(&cdns
->work
, cdns_update_slave_status_work
);
1548 EXPORT_SYMBOL(sdw_cdns_probe
);
1550 int cdns_set_sdw_stream(struct snd_soc_dai
*dai
,
1551 void *stream
, bool pcm
, int direction
)
1553 struct sdw_cdns
*cdns
= snd_soc_dai_get_drvdata(dai
);
1554 struct sdw_cdns_dma_data
*dma
;
1557 /* first paranoia check */
1558 if (direction
== SNDRV_PCM_STREAM_PLAYBACK
)
1559 dma
= dai
->playback_dma_data
;
1561 dma
= dai
->capture_dma_data
;
1565 "dma_data already allocated for dai %s\n",
1570 /* allocate and set dma info */
1571 dma
= kzalloc(sizeof(*dma
), GFP_KERNEL
);
1576 dma
->stream_type
= SDW_STREAM_PCM
;
1578 dma
->stream_type
= SDW_STREAM_PDM
;
1580 dma
->bus
= &cdns
->bus
;
1581 dma
->link_id
= cdns
->instance
;
1583 dma
->stream
= stream
;
1585 if (direction
== SNDRV_PCM_STREAM_PLAYBACK
)
1586 dai
->playback_dma_data
= dma
;
1588 dai
->capture_dma_data
= dma
;
1590 /* for NULL stream we release allocated dma_data */
1591 if (direction
== SNDRV_PCM_STREAM_PLAYBACK
) {
1592 kfree(dai
->playback_dma_data
);
1593 dai
->playback_dma_data
= NULL
;
1595 kfree(dai
->capture_dma_data
);
1596 dai
->capture_dma_data
= NULL
;
1601 EXPORT_SYMBOL(cdns_set_sdw_stream
);
1604 * cdns_find_pdi() - Find a free PDI
1606 * @cdns: Cadence instance
1607 * @offset: Starting offset
1608 * @num: Number of PDIs
1609 * @pdi: PDI instances
1612 * Find a PDI for a given PDI array. The PDI num and dai_id are
1613 * expected to match, return NULL otherwise.
1615 static struct sdw_cdns_pdi
*cdns_find_pdi(struct sdw_cdns
*cdns
,
1616 unsigned int offset
,
1618 struct sdw_cdns_pdi
*pdi
,
1623 for (i
= offset
; i
< offset
+ num
; i
++)
1624 if (pdi
[i
].num
== dai_id
)
1631 * sdw_cdns_config_stream: Configure a stream
1633 * @cdns: Cadence instance
1634 * @ch: Channel count
1635 * @dir: Data direction
1636 * @pdi: PDI to be used
1638 void sdw_cdns_config_stream(struct sdw_cdns
*cdns
,
1639 u32 ch
, u32 dir
, struct sdw_cdns_pdi
*pdi
)
1641 u32 offset
, val
= 0;
1643 if (dir
== SDW_DATA_DIR_RX
) {
1644 val
= CDNS_PORTCTRL_DIRN
;
1646 if (cdns
->bus
.params
.m_data_mode
!= SDW_PORT_DATA_MODE_NORMAL
)
1647 val
|= CDNS_PORTCTRL_TEST_FAILED
;
1649 offset
= CDNS_PORTCTRL
+ pdi
->num
* CDNS_PORT_OFFSET
;
1650 cdns_updatel(cdns
, offset
,
1651 CDNS_PORTCTRL_DIRN
| CDNS_PORTCTRL_TEST_FAILED
,
1655 val
|= CDNS_PDI_CONFIG_SOFT_RESET
;
1656 val
|= FIELD_PREP(CDNS_PDI_CONFIG_CHANNEL
, (1 << ch
) - 1);
1657 cdns_writel(cdns
, CDNS_PDI_CONFIG(pdi
->num
), val
);
1659 EXPORT_SYMBOL(sdw_cdns_config_stream
);
1662 * sdw_cdns_alloc_pdi() - Allocate a PDI
1664 * @cdns: Cadence instance
1665 * @stream: Stream to be allocated
1666 * @ch: Channel count
1667 * @dir: Data direction
1670 struct sdw_cdns_pdi
*sdw_cdns_alloc_pdi(struct sdw_cdns
*cdns
,
1671 struct sdw_cdns_streams
*stream
,
1672 u32 ch
, u32 dir
, int dai_id
)
1674 struct sdw_cdns_pdi
*pdi
= NULL
;
1676 if (dir
== SDW_DATA_DIR_RX
)
1677 pdi
= cdns_find_pdi(cdns
, 0, stream
->num_in
, stream
->in
,
1680 pdi
= cdns_find_pdi(cdns
, 0, stream
->num_out
, stream
->out
,
1683 /* check if we found a PDI, else find in bi-directional */
1685 pdi
= cdns_find_pdi(cdns
, 2, stream
->num_bd
, stream
->bd
,
1690 pdi
->h_ch_num
= ch
- 1;
1697 EXPORT_SYMBOL(sdw_cdns_alloc_pdi
);
1699 MODULE_LICENSE("Dual BSD/GPL");
1700 MODULE_DESCRIPTION("Cadence Soundwire Library");