3838#define SWRM_CMD_FIFO_WR_CMD 0x300
3939#define SWRM_CMD_FIFO_RD_CMD 0x304
4040#define SWRM_CMD_FIFO_CMD 0x308
41+ #define SWRM_CMD_FIFO_FLUSH 0x1
4142#define SWRM_CMD_FIFO_STATUS 0x30C
4243#define SWRM_CMD_FIFO_CFG_ADDR 0x314
4344#define SWRM_CONTINUE_EXEC_ON_CMD_IGNORE BIT(31)
4445#define SWRM_RD_WR_CMD_RETRIES 0x7
4546#define SWRM_CMD_FIFO_RD_FIFO_ADDR 0x318
47+ #define SWRM_RD_FIFO_CMD_ID_MASK GENMASK(11, 8)
4648#define SWRM_ENUMERATOR_CFG_ADDR 0x500
4749#define SWRM_MCP_FRAME_CTRL_BANK_ADDR (m ) (0x101C + 0x40 * (m))
4850#define SWRM_MCP_FRAME_CTRL_BANK_COL_CTRL_BMSK GENMASK(2, 0)
7880#define SWRM_SPECIAL_CMD_ID 0xF
7981#define MAX_FREQ_NUM 1
8082#define TIMEOUT_MS (2 * HZ)
81- #define QCOM_SWRM_MAX_RD_LEN 0xf
83+ #define QCOM_SWRM_MAX_RD_LEN 0x1
8284#define QCOM_SDW_MAX_PORTS 14
8385#define DEFAULT_CLK_FREQ 9600000
8486#define SWRM_MAX_DAIS 0xF
8587#define SWR_INVALID_PARAM 0xFF
8688#define SWR_HSTOP_MAX_VAL 0xF
8789#define SWR_HSTART_MIN_VAL 0x0
90+ #define SWR_BROADCAST_CMD_ID 0x0F
91+ #define SWR_MAX_CMD_ID 14
92+ #define MAX_FIFO_RD_RETRY 3
8893
8994struct qcom_swrm_port_config {
9095 u8 si ;
@@ -103,10 +108,8 @@ struct qcom_swrm_ctrl {
103108 struct device * dev ;
104109 struct regmap * regmap ;
105110 void __iomem * mmio ;
106- struct completion * comp ;
111+ struct completion broadcast ;
107112 struct work_struct slave_work ;
108- /* read/write lock */
109- spinlock_t comp_lock ;
110113 /* Port alloc/free lock */
111114 struct mutex port_lock ;
112115 struct clk * hclk ;
@@ -120,6 +123,8 @@ struct qcom_swrm_ctrl {
120123 int rows_index ;
121124 unsigned long dout_port_mask ;
122125 unsigned long din_port_mask ;
126+ u8 rcmd_id ;
127+ u8 wcmd_id ;
123128 struct qcom_swrm_port_config pconfig [QCOM_SDW_MAX_PORTS ];
124129 struct sdw_stream_runtime * sruntime [SWRM_MAX_DAIS ];
125130 enum sdw_slave_status status [SDW_MAX_DEVICES ];
@@ -198,77 +203,106 @@ static int qcom_swrm_cpu_reg_write(struct qcom_swrm_ctrl *ctrl, int reg,
198203 return SDW_CMD_OK ;
199204}
200205
201- static int qcom_swrm_cmd_fifo_wr_cmd ( struct qcom_swrm_ctrl * ctrl , u8 cmd_data ,
202- u8 dev_addr , u16 reg_addr )
206+ static u32 swrm_get_packed_reg_val ( u8 * cmd_id , u8 cmd_data ,
207+ u8 dev_addr , u16 reg_addr )
203208{
204- DECLARE_COMPLETION_ONSTACK (comp );
205- unsigned long flags ;
206209 u32 val ;
207- int ret ;
208-
209- spin_lock_irqsave (& ctrl -> comp_lock , flags );
210- ctrl -> comp = & comp ;
211- spin_unlock_irqrestore (& ctrl -> comp_lock , flags );
212- val = SWRM_REG_VAL_PACK (cmd_data , dev_addr ,
213- SWRM_SPECIAL_CMD_ID , reg_addr );
214- ret = ctrl -> reg_write (ctrl , SWRM_CMD_FIFO_WR_CMD , val );
215- if (ret )
216- goto err ;
217-
218- ret = wait_for_completion_timeout (ctrl -> comp ,
219- msecs_to_jiffies (TIMEOUT_MS ));
210+ u8 id = * cmd_id ;
220211
221- if (! ret )
222- ret = SDW_CMD_IGNORED ;
223- else
224- ret = SDW_CMD_OK ;
225- err :
226- spin_lock_irqsave ( & ctrl -> comp_lock , flags ) ;
227- ctrl -> comp = NULL ;
228- spin_unlock_irqrestore ( & ctrl -> comp_lock , flags );
212+ if (id != SWR_BROADCAST_CMD_ID ) {
213+ if ( id < SWR_MAX_CMD_ID )
214+ id += 1 ;
215+ else
216+ id = 0 ;
217+ * cmd_id = id ;
218+ }
219+ val = SWRM_REG_VAL_PACK ( cmd_data , dev_addr , id , reg_addr );
229220
230- return ret ;
221+ return val ;
231222}
232223
233- static int qcom_swrm_cmd_fifo_rd_cmd ( struct qcom_swrm_ctrl * ctrl ,
234- u8 dev_addr , u16 reg_addr ,
235- u32 len , u8 * rval )
224+
225+ static int qcom_swrm_cmd_fifo_wr_cmd ( struct qcom_swrm_ctrl * swrm , u8 cmd_data ,
226+ u8 dev_addr , u16 reg_addr )
236227{
237- int i , ret ;
238- u32 val ;
239- DECLARE_COMPLETION_ONSTACK (comp );
240- unsigned long flags ;
241228
242- spin_lock_irqsave ( & ctrl -> comp_lock , flags ) ;
243- ctrl -> comp = & comp ;
244- spin_unlock_irqrestore ( & ctrl -> comp_lock , flags ) ;
229+ u32 val ;
230+ int ret = 0 ;
231+ u8 cmd_id = 0x0 ;
245232
246- val = SWRM_REG_VAL_PACK (len , dev_addr , SWRM_SPECIAL_CMD_ID , reg_addr );
247- ret = ctrl -> reg_write (ctrl , SWRM_CMD_FIFO_RD_CMD , val );
248- if (ret )
249- goto err ;
233+ if (dev_addr == SDW_BROADCAST_DEV_NUM ) {
234+ cmd_id = SWR_BROADCAST_CMD_ID ;
235+ val = swrm_get_packed_reg_val (& cmd_id , cmd_data ,
236+ dev_addr , reg_addr );
237+ } else {
238+ val = swrm_get_packed_reg_val (& swrm -> wcmd_id , cmd_data ,
239+ dev_addr , reg_addr );
240+ }
250241
251- ret = wait_for_completion_timeout (ctrl -> comp ,
252- msecs_to_jiffies (TIMEOUT_MS ));
242+ /* Its assumed that write is okay as we do not get any status back */
243+ swrm -> reg_write (swrm , SWRM_CMD_FIFO_WR_CMD , val );
244+
245+ /* version 1.3 or less */
246+ if (swrm -> version <= 0x01030000 )
247+ usleep_range (150 , 155 );
248+
249+ if (cmd_id == SWR_BROADCAST_CMD_ID ) {
250+ /*
251+ * sleep for 10ms for MSM soundwire variant to allow broadcast
252+ * command to complete.
253+ */
254+ ret = wait_for_completion_timeout (& swrm -> broadcast ,
255+ msecs_to_jiffies (TIMEOUT_MS ));
256+ if (!ret )
257+ ret = SDW_CMD_IGNORED ;
258+ else
259+ ret = SDW_CMD_OK ;
253260
254- if (!ret ) {
255- ret = SDW_CMD_IGNORED ;
256- goto err ;
257261 } else {
258262 ret = SDW_CMD_OK ;
259263 }
264+ return ret ;
265+ }
260266
261- for (i = 0 ; i < len ; i ++ ) {
262- ctrl -> reg_read (ctrl , SWRM_CMD_FIFO_RD_FIFO_ADDR , & val );
263- rval [i ] = val & 0xFF ;
264- }
267+ static int qcom_swrm_cmd_fifo_rd_cmd (struct qcom_swrm_ctrl * swrm ,
268+ u8 dev_addr , u16 reg_addr ,
269+ u32 len , u8 * rval )
270+ {
271+ u32 cmd_data , cmd_id , val , retry_attempt = 0 ;
272+
273+ val = swrm_get_packed_reg_val (& swrm -> rcmd_id , len , dev_addr , reg_addr );
274+
275+ /* wait for FIFO RD to complete to avoid overflow */
276+ usleep_range (100 , 105 );
277+ swrm -> reg_write (swrm , SWRM_CMD_FIFO_RD_CMD , val );
278+ /* wait for FIFO RD CMD complete to avoid overflow */
279+ usleep_range (250 , 255 );
280+
281+ do {
282+ swrm -> reg_read (swrm , SWRM_CMD_FIFO_RD_FIFO_ADDR , & cmd_data );
283+ rval [0 ] = cmd_data & 0xFF ;
284+ cmd_id = FIELD_GET (SWRM_RD_FIFO_CMD_ID_MASK , cmd_data );
285+
286+ if (cmd_id != swrm -> rcmd_id ) {
287+ if (retry_attempt < (MAX_FIFO_RD_RETRY - 1 )) {
288+ /* wait 500 us before retry on fifo read failure */
289+ usleep_range (500 , 505 );
290+ swrm -> reg_write (swrm , SWRM_CMD_FIFO_CMD ,
291+ SWRM_CMD_FIFO_FLUSH );
292+ swrm -> reg_write (swrm , SWRM_CMD_FIFO_RD_CMD , val );
293+ }
294+ retry_attempt ++ ;
295+ } else {
296+ return SDW_CMD_OK ;
297+ }
265298
266- err :
267- spin_lock_irqsave (& ctrl -> comp_lock , flags );
268- ctrl -> comp = NULL ;
269- spin_unlock_irqrestore (& ctrl -> comp_lock , flags );
299+ } while (retry_attempt < MAX_FIFO_RD_RETRY );
270300
271- return ret ;
301+ dev_err (swrm -> dev , "failed to read fifo: reg: 0x%x, rcmd_id: 0x%x,\
302+ dev_num: 0x%x, cmd_data: 0x%x\n" ,
303+ reg_addr , swrm -> rcmd_id , dev_addr , cmd_data );
304+
305+ return SDW_CMD_IGNORED ;
272306}
273307
274308static void qcom_swrm_get_device_status (struct qcom_swrm_ctrl * ctrl )
@@ -291,7 +325,6 @@ static irqreturn_t qcom_swrm_irq_handler(int irq, void *dev_id)
291325{
292326 struct qcom_swrm_ctrl * ctrl = dev_id ;
293327 u32 sts , value ;
294- unsigned long flags ;
295328
296329 ctrl -> reg_read (ctrl , SWRM_INTERRUPT_STATUS , & sts );
297330
@@ -304,8 +337,10 @@ static irqreturn_t qcom_swrm_irq_handler(int irq, void *dev_id)
304337 }
305338
306339 if ((sts & SWRM_INTERRUPT_STATUS_NEW_SLAVE_ATTACHED ) ||
307- sts & SWRM_INTERRUPT_STATUS_CHANGE_ENUM_SLAVE_STATUS )
308- schedule_work (& ctrl -> slave_work );
340+ sts & SWRM_INTERRUPT_STATUS_CHANGE_ENUM_SLAVE_STATUS ) {
341+ qcom_swrm_get_device_status (ctrl );
342+ sdw_handle_slave_status (& ctrl -> bus , ctrl -> status );
343+ }
309344
310345 /**
311346 * clear the interrupt before complete() is called, as complete can
@@ -314,15 +349,12 @@ static irqreturn_t qcom_swrm_irq_handler(int irq, void *dev_id)
314349 */
315350 ctrl -> reg_write (ctrl , SWRM_INTERRUPT_CLEAR , sts );
316351
317- if (sts & SWRM_INTERRUPT_STATUS_SPECIAL_CMD_ID_FINISHED ) {
318- spin_lock_irqsave (& ctrl -> comp_lock , flags );
319- if (ctrl -> comp )
320- complete (ctrl -> comp );
321- spin_unlock_irqrestore (& ctrl -> comp_lock , flags );
322- }
352+ if (sts & SWRM_INTERRUPT_STATUS_SPECIAL_CMD_ID_FINISHED )
353+ complete (& ctrl -> broadcast );
323354
324355 return IRQ_HANDLED ;
325356}
357+
326358static int qcom_swrm_init (struct qcom_swrm_ctrl * ctrl )
327359{
328360 u32 val ;
@@ -562,16 +594,6 @@ static u32 qcom_swrm_freq_tbl[MAX_FREQ_NUM] = {
562594 DEFAULT_CLK_FREQ ,
563595};
564596
565- static void qcom_swrm_slave_wq (struct work_struct * work )
566- {
567- struct qcom_swrm_ctrl * ctrl =
568- container_of (work , struct qcom_swrm_ctrl , slave_work );
569-
570- qcom_swrm_get_device_status (ctrl );
571- sdw_handle_slave_status (& ctrl -> bus , ctrl -> status );
572- }
573-
574-
575597static void qcom_swrm_stream_free_ports (struct qcom_swrm_ctrl * ctrl ,
576598 struct sdw_stream_runtime * stream )
577599{
@@ -930,9 +952,8 @@ static int qcom_swrm_probe(struct platform_device *pdev)
930952
931953 ctrl -> dev = dev ;
932954 dev_set_drvdata (& pdev -> dev , ctrl );
933- spin_lock_init (& ctrl -> comp_lock );
934955 mutex_init (& ctrl -> port_lock );
935- INIT_WORK (& ctrl -> slave_work , qcom_swrm_slave_wq );
956+ init_completion (& ctrl -> broadcast );
936957
937958 ctrl -> bus .ops = & qcom_swrm_ops ;
938959 ctrl -> bus .port_ops = & qcom_swrm_port_ops ;
0 commit comments