.. | .. |
---|
1 | | -// SPDX-License-Identifier: GPL-2.0 |
---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-only |
---|
2 | 2 | /* |
---|
3 | 3 | * Copyright (c) 2015, Fuzhou Rockchip Electronics Co., Ltd |
---|
4 | 4 | */ |
---|
.. | .. |
---|
23 | 23 | #define MAILBOX_B2A_STATUS 0x2C |
---|
24 | 24 | #define MAILBOX_B2A_CMD(x) (0x30 + (x) * 8) |
---|
25 | 25 | #define MAILBOX_B2A_DAT(x) (0x34 + (x) * 8) |
---|
| 26 | + |
---|
| 27 | +#define MAILBOX_POLLING_MS 5 /* default polling interval 5ms */ |
---|
26 | 28 | |
---|
27 | 29 | struct rockchip_mbox_data { |
---|
28 | 30 | int num_chans; |
---|
.. | .. |
---|
99 | 101 | spin_unlock(&mb->cfg_lock); |
---|
100 | 102 | } |
---|
101 | 103 | |
---|
| 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 | + |
---|
102 | 114 | static const struct mbox_chan_ops rockchip_mbox_chan_ops = { |
---|
103 | 115 | .send_data = rockchip_mbox_send_data, |
---|
104 | 116 | .startup = rockchip_mbox_startup, |
---|
105 | 117 | .shutdown = rockchip_mbox_shutdown, |
---|
| 118 | + .last_tx_done = rockchip_mbox_last_tx_done, |
---|
106 | 119 | }; |
---|
107 | 120 | |
---|
108 | 121 | int rockchip_mbox_read_msg(struct mbox_chan *chan, |
---|
.. | .. |
---|
172 | 185 | const struct rockchip_mbox_data *drv_data; |
---|
173 | 186 | struct resource *res; |
---|
174 | 187 | int ret, irq, i; |
---|
| 188 | + u32 txpoll_period; |
---|
175 | 189 | |
---|
176 | 190 | if (!pdev->dev.of_node) |
---|
177 | 191 | return -ENODEV; |
---|
.. | .. |
---|
203 | 217 | mb->mbox.dev = &pdev->dev; |
---|
204 | 218 | mb->mbox.num_chans = drv_data->num_chans; |
---|
205 | 219 | mb->mbox.ops = &rockchip_mbox_chan_ops; |
---|
206 | | - mb->mbox.txdone_irq = true; |
---|
207 | 220 | 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; |
---|
208 | 225 | |
---|
209 | 226 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
---|
210 | 227 | if (!res) |
---|
.. | .. |
---|
246 | 263 | mb->mbox.chans[i].con_priv = &mb->chans[i]; |
---|
247 | 264 | } |
---|
248 | 265 | |
---|
249 | | - ret = mbox_controller_register(&mb->mbox); |
---|
| 266 | + ret = devm_mbox_controller_register(&pdev->dev, &mb->mbox); |
---|
250 | 267 | if (ret < 0) { |
---|
251 | 268 | dev_err(&pdev->dev, "Failed to register mailbox: %d\n", ret); |
---|
252 | 269 | goto disable_clk; |
---|
.. | .. |
---|
277 | 294 | return ret; |
---|
278 | 295 | } |
---|
279 | 296 | |
---|
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 | | - |
---|
292 | 297 | static struct platform_driver rockchip_mbox_driver = { |
---|
293 | 298 | .probe = rockchip_mbox_probe, |
---|
294 | | - .remove = rockchip_mbox_remove, |
---|
295 | 299 | .driver = { |
---|
296 | 300 | .name = "rockchip-mailbox", |
---|
297 | 301 | .of_match_table = of_match_ptr(rockchip_mbox_of_match), |
---|
298 | 302 | }, |
---|
299 | 303 | }; |
---|
300 | 304 | |
---|
| 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 |
---|
301 | 312 | module_platform_driver(rockchip_mbox_driver); |
---|
| 313 | +#endif |
---|
302 | 314 | |
---|
303 | 315 | MODULE_LICENSE("GPL v2"); |
---|
304 | 316 | MODULE_DESCRIPTION("Rockchip mailbox: communicate between CPU cores and MCU"); |
---|