@@ -75,15 +75,11 @@ struct cmdq {
75
75
struct mbox_controller mbox ;
76
76
void __iomem * base ;
77
77
int irq ;
78
- u32 thread_nr ;
79
78
u32 irq_mask ;
79
+ const struct gce_plat * pdata ;
80
80
struct cmdq_thread * thread ;
81
81
struct clk_bulk_data clocks [CMDQ_GCE_NUM_MAX ];
82
82
bool suspended ;
83
- u8 shift_pa ;
84
- bool control_by_sw ;
85
- bool sw_ddr_en ;
86
- u32 gce_num ;
87
83
};
88
84
89
85
struct gce_plat {
@@ -96,21 +92,21 @@ struct gce_plat {
96
92
97
93
static void cmdq_sw_ddr_enable (struct cmdq * cmdq , bool enable )
98
94
{
99
- WARN_ON (clk_bulk_enable (cmdq -> gce_num , cmdq -> clocks ));
95
+ WARN_ON (clk_bulk_enable (cmdq -> pdata -> gce_num , cmdq -> clocks ));
100
96
101
97
if (enable )
102
98
writel (GCE_DDR_EN | GCE_CTRL_BY_SW , cmdq -> base + GCE_GCTL_VALUE );
103
99
else
104
100
writel (GCE_CTRL_BY_SW , cmdq -> base + GCE_GCTL_VALUE );
105
101
106
- clk_bulk_disable (cmdq -> gce_num , cmdq -> clocks );
102
+ clk_bulk_disable (cmdq -> pdata -> gce_num , cmdq -> clocks );
107
103
}
108
104
109
105
u8 cmdq_get_shift_pa (struct mbox_chan * chan )
110
106
{
111
107
struct cmdq * cmdq = container_of (chan -> mbox , struct cmdq , mbox );
112
108
113
- return cmdq -> shift_pa ;
109
+ return cmdq -> pdata -> shift ;
114
110
}
115
111
EXPORT_SYMBOL (cmdq_get_shift_pa );
116
112
@@ -144,10 +140,10 @@ static void cmdq_init(struct cmdq *cmdq)
144
140
int i ;
145
141
u32 gctl_regval = 0 ;
146
142
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 )
149
145
gctl_regval = GCE_CTRL_BY_SW ;
150
- if (cmdq -> sw_ddr_en )
146
+ if (cmdq -> pdata -> sw_ddr_en )
151
147
gctl_regval |= GCE_DDR_EN ;
152
148
153
149
if (gctl_regval )
@@ -156,7 +152,7 @@ static void cmdq_init(struct cmdq *cmdq)
156
152
writel (CMDQ_THR_ACTIVE_SLOT_CYCLES , cmdq -> base + CMDQ_THR_SLOT_CYCLES );
157
153
for (i = 0 ; i <= CMDQ_MAX_EVENT ; i ++ )
158
154
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 );
160
156
}
161
157
162
158
static 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)
201
197
prev_task -> pkt -> cmd_buf_size , DMA_TO_DEVICE );
202
198
prev_task_base [CMDQ_NUM_CMD (prev_task -> pkt ) - 1 ] =
203
199
(u64 )CMDQ_JUMP_BY_PA << 32 |
204
- (task -> pa_base >> task -> cmdq -> shift_pa );
200
+ (task -> pa_base >> task -> cmdq -> pdata -> shift );
205
201
dma_sync_single_for_device (dev , prev_task -> pa_base ,
206
202
prev_task -> pkt -> cmd_buf_size , DMA_TO_DEVICE );
207
203
@@ -235,7 +231,7 @@ static void cmdq_task_handle_error(struct cmdq_task *task)
235
231
next_task = list_first_entry_or_null (& thread -> task_busy_list ,
236
232
struct cmdq_task , list_entry );
237
233
if (next_task )
238
- writel (next_task -> pa_base >> cmdq -> shift_pa ,
234
+ writel (next_task -> pa_base >> cmdq -> pdata -> shift ,
239
235
thread -> base + CMDQ_THR_CURR_ADDR );
240
236
cmdq_thread_resume (thread );
241
237
}
@@ -266,7 +262,7 @@ static void cmdq_thread_irq_handler(struct cmdq *cmdq,
266
262
else
267
263
return ;
268
264
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 ;
270
266
271
267
list_for_each_entry_safe (task , tmp , & thread -> task_busy_list ,
272
268
list_entry ) {
@@ -289,7 +285,7 @@ static void cmdq_thread_irq_handler(struct cmdq *cmdq,
289
285
290
286
if (list_empty (& thread -> task_busy_list )) {
291
287
cmdq_thread_disable (cmdq , thread );
292
- clk_bulk_disable (cmdq -> gce_num , cmdq -> clocks );
288
+ clk_bulk_disable (cmdq -> pdata -> gce_num , cmdq -> clocks );
293
289
}
294
290
}
295
291
@@ -303,7 +299,7 @@ static irqreturn_t cmdq_irq_handler(int irq, void *dev)
303
299
if (!(irq_status ^ cmdq -> irq_mask ))
304
300
return IRQ_NONE ;
305
301
306
- for_each_clear_bit (bit , & irq_status , cmdq -> thread_nr ) {
302
+ for_each_clear_bit (bit , & irq_status , cmdq -> pdata -> thread_nr ) {
307
303
struct cmdq_thread * thread = & cmdq -> thread [bit ];
308
304
309
305
spin_lock_irqsave (& thread -> chan -> lock , flags );
@@ -323,7 +319,7 @@ static int cmdq_suspend(struct device *dev)
323
319
324
320
cmdq -> suspended = true;
325
321
326
- for (i = 0 ; i < cmdq -> thread_nr ; i ++ ) {
322
+ for (i = 0 ; i < cmdq -> pdata -> thread_nr ; i ++ ) {
327
323
thread = & cmdq -> thread [i ];
328
324
if (!list_empty (& thread -> task_busy_list )) {
329
325
task_running = true;
@@ -334,10 +330,10 @@ static int cmdq_suspend(struct device *dev)
334
330
if (task_running )
335
331
dev_warn (dev , "exist running task(s) in suspend\n" );
336
332
337
- if (cmdq -> sw_ddr_en )
333
+ if (cmdq -> pdata -> sw_ddr_en )
338
334
cmdq_sw_ddr_enable (cmdq , false);
339
335
340
- clk_bulk_unprepare (cmdq -> gce_num , cmdq -> clocks );
336
+ clk_bulk_unprepare (cmdq -> pdata -> gce_num , cmdq -> clocks );
341
337
342
338
return 0 ;
343
339
}
@@ -346,10 +342,10 @@ static int cmdq_resume(struct device *dev)
346
342
{
347
343
struct cmdq * cmdq = dev_get_drvdata (dev );
348
344
349
- WARN_ON (clk_bulk_prepare (cmdq -> gce_num , cmdq -> clocks ));
345
+ WARN_ON (clk_bulk_prepare (cmdq -> pdata -> gce_num , cmdq -> clocks ));
350
346
cmdq -> suspended = false;
351
347
352
- if (cmdq -> sw_ddr_en )
348
+ if (cmdq -> pdata -> sw_ddr_en )
353
349
cmdq_sw_ddr_enable (cmdq , true);
354
350
355
351
return 0 ;
@@ -359,10 +355,10 @@ static int cmdq_remove(struct platform_device *pdev)
359
355
{
360
356
struct cmdq * cmdq = platform_get_drvdata (pdev );
361
357
362
- if (cmdq -> sw_ddr_en )
358
+ if (cmdq -> pdata -> sw_ddr_en )
363
359
cmdq_sw_ddr_enable (cmdq , false);
364
360
365
- clk_bulk_unprepare (cmdq -> gce_num , cmdq -> clocks );
361
+ clk_bulk_unprepare (cmdq -> pdata -> gce_num , cmdq -> clocks );
366
362
return 0 ;
367
363
}
368
364
@@ -388,7 +384,7 @@ static int cmdq_mbox_send_data(struct mbox_chan *chan, void *data)
388
384
task -> pkt = pkt ;
389
385
390
386
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 ));
392
388
393
389
/*
394
390
* 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)
398
394
*/
399
395
WARN_ON (cmdq_thread_reset (cmdq , thread ) < 0 );
400
396
401
- writel (task -> pa_base >> cmdq -> shift_pa ,
397
+ writel (task -> pa_base >> cmdq -> pdata -> shift ,
402
398
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 ,
404
400
thread -> base + CMDQ_THR_END_ADDR );
405
401
406
402
writel (thread -> priority , thread -> base + CMDQ_THR_PRIORITY );
@@ -409,20 +405,20 @@ static int cmdq_mbox_send_data(struct mbox_chan *chan, void *data)
409
405
} else {
410
406
WARN_ON (cmdq_thread_suspend (cmdq , thread ) < 0 );
411
407
curr_pa = readl (thread -> base + CMDQ_THR_CURR_ADDR ) <<
412
- cmdq -> shift_pa ;
408
+ cmdq -> pdata -> shift ;
413
409
end_pa = readl (thread -> base + CMDQ_THR_END_ADDR ) <<
414
- cmdq -> shift_pa ;
410
+ cmdq -> pdata -> shift ;
415
411
/* check boundary */
416
412
if (curr_pa == end_pa - CMDQ_INST_SIZE ||
417
413
curr_pa == end_pa ) {
418
414
/* set to this task directly */
419
- writel (task -> pa_base >> cmdq -> shift_pa ,
415
+ writel (task -> pa_base >> cmdq -> pdata -> shift ,
420
416
thread -> base + CMDQ_THR_CURR_ADDR );
421
417
} else {
422
418
cmdq_task_insert_into_thread (task );
423
419
smp_mb (); /* modify jump before enable thread */
424
420
}
425
- writel ((task -> pa_base + pkt -> cmd_buf_size ) >> cmdq -> shift_pa ,
421
+ writel ((task -> pa_base + pkt -> cmd_buf_size ) >> cmdq -> pdata -> shift ,
426
422
thread -> base + CMDQ_THR_END_ADDR );
427
423
cmdq_thread_resume (thread );
428
424
}
@@ -461,7 +457,7 @@ static void cmdq_mbox_shutdown(struct mbox_chan *chan)
461
457
}
462
458
463
459
cmdq_thread_disable (cmdq , thread );
464
- clk_bulk_disable (cmdq -> gce_num , cmdq -> clocks );
460
+ clk_bulk_disable (cmdq -> pdata -> gce_num , cmdq -> clocks );
465
461
466
462
done :
467
463
/*
@@ -501,7 +497,7 @@ static int cmdq_mbox_flush(struct mbox_chan *chan, unsigned long timeout)
501
497
502
498
cmdq_thread_resume (thread );
503
499
cmdq_thread_disable (cmdq , thread );
504
- clk_bulk_disable (cmdq -> gce_num , cmdq -> clocks );
500
+ clk_bulk_disable (cmdq -> pdata -> gce_num , cmdq -> clocks );
505
501
506
502
out :
507
503
spin_unlock_irqrestore (& thread -> chan -> lock , flags );
@@ -548,7 +544,6 @@ static int cmdq_probe(struct platform_device *pdev)
548
544
struct device * dev = & pdev -> dev ;
549
545
struct cmdq * cmdq ;
550
546
int err , i ;
551
- struct gce_plat * plat_data ;
552
547
struct device_node * phandle = dev -> of_node ;
553
548
struct device_node * node ;
554
549
int alias_id = 0 ;
@@ -567,18 +562,13 @@ static int cmdq_probe(struct platform_device *pdev)
567
562
if (cmdq -> irq < 0 )
568
563
return cmdq -> irq ;
569
564
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 ) {
572
567
dev_err (dev , "failed to get match data\n" );
573
568
return - EINVAL ;
574
569
}
575
570
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 );
582
572
err = devm_request_irq (dev , cmdq -> irq , cmdq_irq_handler , IRQF_SHARED ,
583
573
"mtk_cmdq" , cmdq );
584
574
if (err < 0 ) {
@@ -589,10 +579,10 @@ static int cmdq_probe(struct platform_device *pdev)
589
579
dev_dbg (dev , "cmdq device: addr:0x%p, va:0x%p, irq:%d\n" ,
590
580
dev , cmdq -> base , cmdq -> irq );
591
581
592
- if (cmdq -> gce_num > 1 ) {
582
+ if (cmdq -> pdata -> gce_num > 1 ) {
593
583
for_each_child_of_node (phandle -> parent , node ) {
594
584
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 ) {
596
586
cmdq -> clocks [alias_id ].id = clk_names [alias_id ];
597
587
cmdq -> clocks [alias_id ].clk = of_clk_get (node , 0 );
598
588
if (IS_ERR (cmdq -> clocks [alias_id ].clk )) {
@@ -614,25 +604,25 @@ static int cmdq_probe(struct platform_device *pdev)
614
604
}
615
605
616
606
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 ,
618
608
sizeof (* cmdq -> mbox .chans ), GFP_KERNEL );
619
609
if (!cmdq -> mbox .chans )
620
610
return - ENOMEM ;
621
611
622
- cmdq -> mbox .num_chans = cmdq -> thread_nr ;
612
+ cmdq -> mbox .num_chans = cmdq -> pdata -> thread_nr ;
623
613
cmdq -> mbox .ops = & cmdq_mbox_chan_ops ;
624
614
cmdq -> mbox .of_xlate = cmdq_xlate ;
625
615
626
616
/* make use of TXDONE_BY_ACK */
627
617
cmdq -> mbox .txdone_irq = false;
628
618
cmdq -> mbox .txdone_poll = false;
629
619
630
- cmdq -> thread = devm_kcalloc (dev , cmdq -> thread_nr ,
620
+ cmdq -> thread = devm_kcalloc (dev , cmdq -> pdata -> thread_nr ,
631
621
sizeof (* cmdq -> thread ), GFP_KERNEL );
632
622
if (!cmdq -> thread )
633
623
return - ENOMEM ;
634
624
635
- for (i = 0 ; i < cmdq -> thread_nr ; i ++ ) {
625
+ for (i = 0 ; i < cmdq -> pdata -> thread_nr ; i ++ ) {
636
626
cmdq -> thread [i ].base = cmdq -> base + CMDQ_THR_BASE +
637
627
CMDQ_THR_SIZE * i ;
638
628
INIT_LIST_HEAD (& cmdq -> thread [i ].task_busy_list );
@@ -647,7 +637,7 @@ static int cmdq_probe(struct platform_device *pdev)
647
637
648
638
platform_set_drvdata (pdev , cmdq );
649
639
650
- WARN_ON (clk_bulk_prepare (cmdq -> gce_num , cmdq -> clocks ));
640
+ WARN_ON (clk_bulk_prepare (cmdq -> pdata -> gce_num , cmdq -> clocks ));
651
641
652
642
cmdq_init (cmdq );
653
643
0 commit comments