@@ -75,15 +75,11 @@ struct cmdq {
7575 struct mbox_controller mbox ;
7676 void __iomem * base ;
7777 int irq ;
78- u32 thread_nr ;
7978 u32 irq_mask ;
79+ const struct gce_plat * pdata ;
8080 struct cmdq_thread * thread ;
8181 struct clk_bulk_data clocks [CMDQ_GCE_NUM_MAX ];
8282 bool suspended ;
83- u8 shift_pa ;
84- bool control_by_sw ;
85- bool sw_ddr_en ;
86- u32 gce_num ;
8783};
8884
8985struct gce_plat {
@@ -96,21 +92,21 @@ struct gce_plat {
9692
9793static void cmdq_sw_ddr_enable (struct cmdq * cmdq , bool enable )
9894{
99- WARN_ON (clk_bulk_enable (cmdq -> gce_num , cmdq -> clocks ));
95+ WARN_ON (clk_bulk_enable (cmdq -> pdata -> gce_num , cmdq -> clocks ));
10096
10197 if (enable )
10298 writel (GCE_DDR_EN | GCE_CTRL_BY_SW , cmdq -> base + GCE_GCTL_VALUE );
10399 else
104100 writel (GCE_CTRL_BY_SW , cmdq -> base + GCE_GCTL_VALUE );
105101
106- clk_bulk_disable (cmdq -> gce_num , cmdq -> clocks );
102+ clk_bulk_disable (cmdq -> pdata -> gce_num , cmdq -> clocks );
107103}
108104
109105u8 cmdq_get_shift_pa (struct mbox_chan * chan )
110106{
111107 struct cmdq * cmdq = container_of (chan -> mbox , struct cmdq , mbox );
112108
113- return cmdq -> shift_pa ;
109+ return cmdq -> pdata -> shift ;
114110}
115111EXPORT_SYMBOL (cmdq_get_shift_pa );
116112
@@ -144,10 +140,10 @@ static void cmdq_init(struct cmdq *cmdq)
144140 int i ;
145141 u32 gctl_regval = 0 ;
146142
147- WARN_ON (clk_bulk_enable (cmdq -> gce_num , cmdq -> clocks ));
148- if (cmdq -> control_by_sw )
143+ WARN_ON (clk_bulk_enable (cmdq -> pdata -> gce_num , cmdq -> clocks ));
144+ if (cmdq -> pdata -> control_by_sw )
149145 gctl_regval = GCE_CTRL_BY_SW ;
150- if (cmdq -> sw_ddr_en )
146+ if (cmdq -> pdata -> sw_ddr_en )
151147 gctl_regval |= GCE_DDR_EN ;
152148
153149 if (gctl_regval )
@@ -156,7 +152,7 @@ static void cmdq_init(struct cmdq *cmdq)
156152 writel (CMDQ_THR_ACTIVE_SLOT_CYCLES , cmdq -> base + CMDQ_THR_SLOT_CYCLES );
157153 for (i = 0 ; i <= CMDQ_MAX_EVENT ; i ++ )
158154 writel (i , cmdq -> base + CMDQ_SYNC_TOKEN_UPDATE );
159- clk_bulk_disable (cmdq -> gce_num , cmdq -> clocks );
155+ clk_bulk_disable (cmdq -> pdata -> gce_num , cmdq -> clocks );
160156}
161157
162158static int cmdq_thread_reset (struct cmdq * cmdq , struct cmdq_thread * thread )
@@ -201,7 +197,7 @@ static void cmdq_task_insert_into_thread(struct cmdq_task *task)
201197 prev_task -> pkt -> cmd_buf_size , DMA_TO_DEVICE );
202198 prev_task_base [CMDQ_NUM_CMD (prev_task -> pkt ) - 1 ] =
203199 (u64 )CMDQ_JUMP_BY_PA << 32 |
204- (task -> pa_base >> task -> cmdq -> shift_pa );
200+ (task -> pa_base >> task -> cmdq -> pdata -> shift );
205201 dma_sync_single_for_device (dev , prev_task -> pa_base ,
206202 prev_task -> pkt -> cmd_buf_size , DMA_TO_DEVICE );
207203
@@ -235,7 +231,7 @@ static void cmdq_task_handle_error(struct cmdq_task *task)
235231 next_task = list_first_entry_or_null (& thread -> task_busy_list ,
236232 struct cmdq_task , list_entry );
237233 if (next_task )
238- writel (next_task -> pa_base >> cmdq -> shift_pa ,
234+ writel (next_task -> pa_base >> cmdq -> pdata -> shift ,
239235 thread -> base + CMDQ_THR_CURR_ADDR );
240236 cmdq_thread_resume (thread );
241237}
@@ -266,7 +262,7 @@ static void cmdq_thread_irq_handler(struct cmdq *cmdq,
266262 else
267263 return ;
268264
269- curr_pa = readl (thread -> base + CMDQ_THR_CURR_ADDR ) << cmdq -> shift_pa ;
265+ curr_pa = readl (thread -> base + CMDQ_THR_CURR_ADDR ) << cmdq -> pdata -> shift ;
270266
271267 list_for_each_entry_safe (task , tmp , & thread -> task_busy_list ,
272268 list_entry ) {
@@ -289,7 +285,7 @@ static void cmdq_thread_irq_handler(struct cmdq *cmdq,
289285
290286 if (list_empty (& thread -> task_busy_list )) {
291287 cmdq_thread_disable (cmdq , thread );
292- clk_bulk_disable (cmdq -> gce_num , cmdq -> clocks );
288+ clk_bulk_disable (cmdq -> pdata -> gce_num , cmdq -> clocks );
293289 }
294290}
295291
@@ -303,7 +299,7 @@ static irqreturn_t cmdq_irq_handler(int irq, void *dev)
303299 if (!(irq_status ^ cmdq -> irq_mask ))
304300 return IRQ_NONE ;
305301
306- for_each_clear_bit (bit , & irq_status , cmdq -> thread_nr ) {
302+ for_each_clear_bit (bit , & irq_status , cmdq -> pdata -> thread_nr ) {
307303 struct cmdq_thread * thread = & cmdq -> thread [bit ];
308304
309305 spin_lock_irqsave (& thread -> chan -> lock , flags );
@@ -323,7 +319,7 @@ static int cmdq_suspend(struct device *dev)
323319
324320 cmdq -> suspended = true;
325321
326- for (i = 0 ; i < cmdq -> thread_nr ; i ++ ) {
322+ for (i = 0 ; i < cmdq -> pdata -> thread_nr ; i ++ ) {
327323 thread = & cmdq -> thread [i ];
328324 if (!list_empty (& thread -> task_busy_list )) {
329325 task_running = true;
@@ -334,10 +330,10 @@ static int cmdq_suspend(struct device *dev)
334330 if (task_running )
335331 dev_warn (dev , "exist running task(s) in suspend\n" );
336332
337- if (cmdq -> sw_ddr_en )
333+ if (cmdq -> pdata -> sw_ddr_en )
338334 cmdq_sw_ddr_enable (cmdq , false);
339335
340- clk_bulk_unprepare (cmdq -> gce_num , cmdq -> clocks );
336+ clk_bulk_unprepare (cmdq -> pdata -> gce_num , cmdq -> clocks );
341337
342338 return 0 ;
343339}
@@ -346,10 +342,10 @@ static int cmdq_resume(struct device *dev)
346342{
347343 struct cmdq * cmdq = dev_get_drvdata (dev );
348344
349- WARN_ON (clk_bulk_prepare (cmdq -> gce_num , cmdq -> clocks ));
345+ WARN_ON (clk_bulk_prepare (cmdq -> pdata -> gce_num , cmdq -> clocks ));
350346 cmdq -> suspended = false;
351347
352- if (cmdq -> sw_ddr_en )
348+ if (cmdq -> pdata -> sw_ddr_en )
353349 cmdq_sw_ddr_enable (cmdq , true);
354350
355351 return 0 ;
@@ -359,10 +355,10 @@ static int cmdq_remove(struct platform_device *pdev)
359355{
360356 struct cmdq * cmdq = platform_get_drvdata (pdev );
361357
362- if (cmdq -> sw_ddr_en )
358+ if (cmdq -> pdata -> sw_ddr_en )
363359 cmdq_sw_ddr_enable (cmdq , false);
364360
365- clk_bulk_unprepare (cmdq -> gce_num , cmdq -> clocks );
361+ clk_bulk_unprepare (cmdq -> pdata -> gce_num , cmdq -> clocks );
366362 return 0 ;
367363}
368364
@@ -388,7 +384,7 @@ static int cmdq_mbox_send_data(struct mbox_chan *chan, void *data)
388384 task -> pkt = pkt ;
389385
390386 if (list_empty (& thread -> task_busy_list )) {
391- WARN_ON (clk_bulk_enable (cmdq -> gce_num , cmdq -> clocks ));
387+ WARN_ON (clk_bulk_enable (cmdq -> pdata -> gce_num , cmdq -> clocks ));
392388
393389 /*
394390 * The thread reset will clear thread related register to 0,
@@ -398,9 +394,9 @@ static int cmdq_mbox_send_data(struct mbox_chan *chan, void *data)
398394 */
399395 WARN_ON (cmdq_thread_reset (cmdq , thread ) < 0 );
400396
401- writel (task -> pa_base >> cmdq -> shift_pa ,
397+ writel (task -> pa_base >> cmdq -> pdata -> shift ,
402398 thread -> base + CMDQ_THR_CURR_ADDR );
403- writel ((task -> pa_base + pkt -> cmd_buf_size ) >> cmdq -> shift_pa ,
399+ writel ((task -> pa_base + pkt -> cmd_buf_size ) >> cmdq -> pdata -> shift ,
404400 thread -> base + CMDQ_THR_END_ADDR );
405401
406402 writel (thread -> priority , thread -> base + CMDQ_THR_PRIORITY );
@@ -409,20 +405,20 @@ static int cmdq_mbox_send_data(struct mbox_chan *chan, void *data)
409405 } else {
410406 WARN_ON (cmdq_thread_suspend (cmdq , thread ) < 0 );
411407 curr_pa = readl (thread -> base + CMDQ_THR_CURR_ADDR ) <<
412- cmdq -> shift_pa ;
408+ cmdq -> pdata -> shift ;
413409 end_pa = readl (thread -> base + CMDQ_THR_END_ADDR ) <<
414- cmdq -> shift_pa ;
410+ cmdq -> pdata -> shift ;
415411 /* check boundary */
416412 if (curr_pa == end_pa - CMDQ_INST_SIZE ||
417413 curr_pa == end_pa ) {
418414 /* set to this task directly */
419- writel (task -> pa_base >> cmdq -> shift_pa ,
415+ writel (task -> pa_base >> cmdq -> pdata -> shift ,
420416 thread -> base + CMDQ_THR_CURR_ADDR );
421417 } else {
422418 cmdq_task_insert_into_thread (task );
423419 smp_mb (); /* modify jump before enable thread */
424420 }
425- writel ((task -> pa_base + pkt -> cmd_buf_size ) >> cmdq -> shift_pa ,
421+ writel ((task -> pa_base + pkt -> cmd_buf_size ) >> cmdq -> pdata -> shift ,
426422 thread -> base + CMDQ_THR_END_ADDR );
427423 cmdq_thread_resume (thread );
428424 }
@@ -461,7 +457,7 @@ static void cmdq_mbox_shutdown(struct mbox_chan *chan)
461457 }
462458
463459 cmdq_thread_disable (cmdq , thread );
464- clk_bulk_disable (cmdq -> gce_num , cmdq -> clocks );
460+ clk_bulk_disable (cmdq -> pdata -> gce_num , cmdq -> clocks );
465461
466462done :
467463 /*
@@ -501,7 +497,7 @@ static int cmdq_mbox_flush(struct mbox_chan *chan, unsigned long timeout)
501497
502498 cmdq_thread_resume (thread );
503499 cmdq_thread_disable (cmdq , thread );
504- clk_bulk_disable (cmdq -> gce_num , cmdq -> clocks );
500+ clk_bulk_disable (cmdq -> pdata -> gce_num , cmdq -> clocks );
505501
506502out :
507503 spin_unlock_irqrestore (& thread -> chan -> lock , flags );
@@ -548,7 +544,6 @@ static int cmdq_probe(struct platform_device *pdev)
548544 struct device * dev = & pdev -> dev ;
549545 struct cmdq * cmdq ;
550546 int err , i ;
551- struct gce_plat * plat_data ;
552547 struct device_node * phandle = dev -> of_node ;
553548 struct device_node * node ;
554549 int alias_id = 0 ;
@@ -567,18 +562,13 @@ static int cmdq_probe(struct platform_device *pdev)
567562 if (cmdq -> irq < 0 )
568563 return cmdq -> irq ;
569564
570- plat_data = ( struct gce_plat * ) of_device_get_match_data (dev );
571- if (!plat_data ) {
565+ cmdq -> pdata = device_get_match_data (dev );
566+ if (!cmdq -> pdata ) {
572567 dev_err (dev , "failed to get match data\n" );
573568 return - EINVAL ;
574569 }
575570
576- cmdq -> thread_nr = plat_data -> thread_nr ;
577- cmdq -> shift_pa = plat_data -> shift ;
578- cmdq -> control_by_sw = plat_data -> control_by_sw ;
579- cmdq -> sw_ddr_en = plat_data -> sw_ddr_en ;
580- cmdq -> gce_num = plat_data -> gce_num ;
581- cmdq -> irq_mask = GENMASK (cmdq -> thread_nr - 1 , 0 );
571+ cmdq -> irq_mask = GENMASK (cmdq -> pdata -> thread_nr - 1 , 0 );
582572 err = devm_request_irq (dev , cmdq -> irq , cmdq_irq_handler , IRQF_SHARED ,
583573 "mtk_cmdq" , cmdq );
584574 if (err < 0 ) {
@@ -589,10 +579,10 @@ static int cmdq_probe(struct platform_device *pdev)
589579 dev_dbg (dev , "cmdq device: addr:0x%p, va:0x%p, irq:%d\n" ,
590580 dev , cmdq -> base , cmdq -> irq );
591581
592- if (cmdq -> gce_num > 1 ) {
582+ if (cmdq -> pdata -> gce_num > 1 ) {
593583 for_each_child_of_node (phandle -> parent , node ) {
594584 alias_id = of_alias_get_id (node , clk_name );
595- if (alias_id >= 0 && alias_id < cmdq -> gce_num ) {
585+ if (alias_id >= 0 && alias_id < cmdq -> pdata -> gce_num ) {
596586 cmdq -> clocks [alias_id ].id = clk_names [alias_id ];
597587 cmdq -> clocks [alias_id ].clk = of_clk_get (node , 0 );
598588 if (IS_ERR (cmdq -> clocks [alias_id ].clk )) {
@@ -614,25 +604,25 @@ static int cmdq_probe(struct platform_device *pdev)
614604 }
615605
616606 cmdq -> mbox .dev = dev ;
617- cmdq -> mbox .chans = devm_kcalloc (dev , cmdq -> thread_nr ,
607+ cmdq -> mbox .chans = devm_kcalloc (dev , cmdq -> pdata -> thread_nr ,
618608 sizeof (* cmdq -> mbox .chans ), GFP_KERNEL );
619609 if (!cmdq -> mbox .chans )
620610 return - ENOMEM ;
621611
622- cmdq -> mbox .num_chans = cmdq -> thread_nr ;
612+ cmdq -> mbox .num_chans = cmdq -> pdata -> thread_nr ;
623613 cmdq -> mbox .ops = & cmdq_mbox_chan_ops ;
624614 cmdq -> mbox .of_xlate = cmdq_xlate ;
625615
626616 /* make use of TXDONE_BY_ACK */
627617 cmdq -> mbox .txdone_irq = false;
628618 cmdq -> mbox .txdone_poll = false;
629619
630- cmdq -> thread = devm_kcalloc (dev , cmdq -> thread_nr ,
620+ cmdq -> thread = devm_kcalloc (dev , cmdq -> pdata -> thread_nr ,
631621 sizeof (* cmdq -> thread ), GFP_KERNEL );
632622 if (!cmdq -> thread )
633623 return - ENOMEM ;
634624
635- for (i = 0 ; i < cmdq -> thread_nr ; i ++ ) {
625+ for (i = 0 ; i < cmdq -> pdata -> thread_nr ; i ++ ) {
636626 cmdq -> thread [i ].base = cmdq -> base + CMDQ_THR_BASE +
637627 CMDQ_THR_SIZE * i ;
638628 INIT_LIST_HEAD (& cmdq -> thread [i ].task_busy_list );
@@ -647,7 +637,7 @@ static int cmdq_probe(struct platform_device *pdev)
647637
648638 platform_set_drvdata (pdev , cmdq );
649639
650- WARN_ON (clk_bulk_prepare (cmdq -> gce_num , cmdq -> clocks ));
640+ WARN_ON (clk_bulk_prepare (cmdq -> pdata -> gce_num , cmdq -> clocks ));
651641
652642 cmdq_init (cmdq );
653643
0 commit comments