Skip to content

Commit acabe12

Browse files
AngeloGioacchino Del RegnoJassiBrar
authored andcommitted
mailbox: mtk-cmdq-mailbox: Use platform data directly instead of copying
Copying platform data to struct cmdq serves to no purpose, as that data is never modified during runtime: it's worth at this point storing a pointer to gce_plat in gce and. Remove all duplicated `struct gce_plat` members from `struct gce` and reuse the platform data across the driver to save some memory. Signed-off-by: AngeloGioacchino Del Regno <[email protected]> Reviewed-by: Matthias Brugger <[email protected]> Reviewed-by: Chun-Kuang Hu <[email protected]> Signed-off-by: Jassi Brar <[email protected]>
1 parent 165b764 commit acabe12

File tree

1 file changed

+39
-49
lines changed

1 file changed

+39
-49
lines changed

drivers/mailbox/mtk-cmdq-mailbox.c

Lines changed: 39 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -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

8985
struct gce_plat {
@@ -96,21 +92,21 @@ struct gce_plat {
9692

9793
static 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

109105
u8 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
}
115111
EXPORT_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

162158
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)
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

466462
done:
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

506502
out:
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

Comments
 (0)