.. | .. |
---|
24 | 24 | #define MAILBOX_B2A_CMD(x) (0x30 + (x) * 8) |
---|
25 | 25 | #define MAILBOX_B2A_DAT(x) (0x34 + (x) * 8) |
---|
26 | 26 | |
---|
| 27 | +#define MAILBOX_POLLING_MS 5 /* default polling interval 5ms */ |
---|
| 28 | + |
---|
27 | 29 | struct rockchip_mbox_data { |
---|
28 | 30 | int num_chans; |
---|
29 | 31 | }; |
---|
.. | .. |
---|
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); |
---|
208 | 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; |
---|
| 225 | + |
---|
209 | 226 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
---|
210 | 227 | if (!res) |
---|
211 | 228 | return -ENODEV; |
---|