hc
2024-05-10 37f49e37ab4cb5d0bc4c60eb5c6d4dd57db767bb
kernel/drivers/mailbox/hi3660-mailbox.c
....@@ -38,6 +38,7 @@
3838 #define MBOX_AUTOMATIC_ACK 1
3939
4040 #define MBOX_STATE_IDLE BIT(4)
41
+#define MBOX_STATE_READY BIT(5)
4142 #define MBOX_STATE_ACK BIT(7)
4243
4344 #define MBOX_MSG_LEN 8
....@@ -91,8 +92,8 @@
9192 unsigned long val;
9293 unsigned int ret;
9394
94
- /* Mailbox is idle so directly bail out */
95
- if (readl(base + MBOX_MODE_REG) & MBOX_STATE_IDLE)
95
+ /* Mailbox is ready to use */
96
+ if (readl(base + MBOX_MODE_REG) & MBOX_STATE_READY)
9697 return 0;
9798
9899 /* Wait for acknowledge from remote */
....@@ -103,9 +104,9 @@
103104 return ret;
104105 }
105106
106
- /* Ensure channel is released */
107
- writel(0xffffffff, base + MBOX_IMASK_REG);
108
- writel(BIT(mchan->ack_irq), base + MBOX_SRC_REG);
107
+ /* clear ack state, mailbox will get back to ready state */
108
+ writel(BIT(mchan->ack_irq), base + MBOX_ICLR_REG);
109
+
109110 return 0;
110111 }
111112
....@@ -160,10 +161,6 @@
160161 {
161162 int ret;
162163
163
- ret = hi3660_mbox_check_state(chan);
164
- if (ret)
165
- return ret;
166
-
167164 ret = hi3660_mbox_unlock(chan);
168165 if (ret)
169166 return ret;
....@@ -183,10 +180,11 @@
183180 void __iomem *base = MBOX_BASE(mbox, ch);
184181 u32 *buf = msg;
185182 unsigned int i;
183
+ int ret;
186184
187
- /* Ensure channel is released */
188
- writel_relaxed(0xffffffff, base + MBOX_IMASK_REG);
189
- writel_relaxed(BIT(mchan->ack_irq), base + MBOX_SRC_REG);
185
+ ret = hi3660_mbox_check_state(chan);
186
+ if (ret)
187
+ return ret;
190188
191189 /* Clear mask for destination interrupt */
192190 writel_relaxed(~BIT(mchan->dst_irq), base + MBOX_IMASK_REG);
....@@ -206,7 +204,7 @@
206204 return 0;
207205 }
208206
209
-static struct mbox_chan_ops hi3660_mbox_ops = {
207
+static const struct mbox_chan_ops hi3660_mbox_ops = {
210208 .startup = hi3660_mbox_startup,
211209 .send_data = hi3660_mbox_send_data,
212210 };
....@@ -267,7 +265,7 @@
267265 for (ch = 0; ch < MBOX_CHAN_MAX; ch++)
268266 chan[ch].con_priv = (void *)ch;
269267
270
- err = mbox_controller_register(&mbox->controller);
268
+ err = devm_mbox_controller_register(dev, &mbox->controller);
271269 if (err) {
272270 dev_err(dev, "Failed to register mailbox %d\n", err);
273271 return err;
....@@ -278,17 +276,8 @@
278276 return 0;
279277 }
280278
281
-static int hi3660_mbox_remove(struct platform_device *pdev)
282
-{
283
- struct hi3660_mbox *mbox = platform_get_drvdata(pdev);
284
-
285
- mbox_controller_unregister(&mbox->controller);
286
- return 0;
287
-}
288
-
289279 static struct platform_driver hi3660_mbox_driver = {
290280 .probe = hi3660_mbox_probe,
291
- .remove = hi3660_mbox_remove,
292281 .driver = {
293282 .name = "hi3660-mbox",
294283 .of_match_table = hi3660_mbox_of_match,