| .. | .. |
|---|
| 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; |
|---|