hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/drivers/mailbox/rockchip-mailbox.c
....@@ -1,4 +1,4 @@
1
-// SPDX-License-Identifier: GPL-2.0
1
+// SPDX-License-Identifier: GPL-2.0-only
22 /*
33 * Copyright (c) 2015, Fuzhou Rockchip Electronics Co., Ltd
44 */
....@@ -23,6 +23,8 @@
2323 #define MAILBOX_B2A_STATUS 0x2C
2424 #define MAILBOX_B2A_CMD(x) (0x30 + (x) * 8)
2525 #define MAILBOX_B2A_DAT(x) (0x34 + (x) * 8)
26
+
27
+#define MAILBOX_POLLING_MS 5 /* default polling interval 5ms */
2628
2729 struct rockchip_mbox_data {
2830 int num_chans;
....@@ -99,10 +101,21 @@
99101 spin_unlock(&mb->cfg_lock);
100102 }
101103
104
+static bool rockchip_mbox_last_tx_done(struct mbox_chan *chan)
105
+{
106
+ struct rockchip_mbox *mb = dev_get_drvdata(chan->mbox->dev);
107
+ struct rockchip_mbox_chan *chans = chan->con_priv;
108
+ u32 status;
109
+
110
+ status = readl_relaxed(mb->mbox_base + MAILBOX_A2B_STATUS);
111
+ return !(status & (1U << chans->idx));
112
+}
113
+
102114 static const struct mbox_chan_ops rockchip_mbox_chan_ops = {
103115 .send_data = rockchip_mbox_send_data,
104116 .startup = rockchip_mbox_startup,
105117 .shutdown = rockchip_mbox_shutdown,
118
+ .last_tx_done = rockchip_mbox_last_tx_done,
106119 };
107120
108121 int rockchip_mbox_read_msg(struct mbox_chan *chan,
....@@ -172,6 +185,7 @@
172185 const struct rockchip_mbox_data *drv_data;
173186 struct resource *res;
174187 int ret, irq, i;
188
+ u32 txpoll_period;
175189
176190 if (!pdev->dev.of_node)
177191 return -ENODEV;
....@@ -203,8 +217,11 @@
203217 mb->mbox.dev = &pdev->dev;
204218 mb->mbox.num_chans = drv_data->num_chans;
205219 mb->mbox.ops = &rockchip_mbox_chan_ops;
206
- mb->mbox.txdone_irq = true;
207220 spin_lock_init(&mb->cfg_lock);
221
+
222
+ mb->mbox.txdone_poll = true;
223
+ ret = device_property_read_u32(&pdev->dev, "rockchip,txpoll-period-ms", &txpoll_period);
224
+ mb->mbox.txpoll_period = !ret ? txpoll_period : MAILBOX_POLLING_MS;
208225
209226 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
210227 if (!res)
....@@ -246,7 +263,7 @@
246263 mb->mbox.chans[i].con_priv = &mb->chans[i];
247264 }
248265
249
- ret = mbox_controller_register(&mb->mbox);
266
+ ret = devm_mbox_controller_register(&pdev->dev, &mb->mbox);
250267 if (ret < 0) {
251268 dev_err(&pdev->dev, "Failed to register mailbox: %d\n", ret);
252269 goto disable_clk;
....@@ -277,28 +294,23 @@
277294 return ret;
278295 }
279296
280
-static int rockchip_mbox_remove(struct platform_device *pdev)
281
-{
282
- struct rockchip_mbox *mb = platform_get_drvdata(pdev);
283
-
284
- if (!mb)
285
- return -EINVAL;
286
-
287
- mbox_controller_unregister(&mb->mbox);
288
-
289
- return 0;
290
-}
291
-
292297 static struct platform_driver rockchip_mbox_driver = {
293298 .probe = rockchip_mbox_probe,
294
- .remove = rockchip_mbox_remove,
295299 .driver = {
296300 .name = "rockchip-mailbox",
297301 .of_match_table = of_match_ptr(rockchip_mbox_of_match),
298302 },
299303 };
300304
305
+#if defined(CONFIG_ROCKCHIP_THUNDER_BOOT)
306
+static int __init rockchip_mbox_driver_init(void)
307
+{
308
+ return platform_driver_register(&rockchip_mbox_driver);
309
+}
310
+core_initcall(rockchip_mbox_driver_init);
311
+#else
301312 module_platform_driver(rockchip_mbox_driver);
313
+#endif
302314
303315 MODULE_LICENSE("GPL v2");
304316 MODULE_DESCRIPTION("Rockchip mailbox: communicate between CPU cores and MCU");