From f70575805708cabdedea7498aaa3f710fde4d920 Mon Sep 17 00:00:00 2001
From: hc <hc@nodka.com>
Date: Wed, 31 Jan 2024 03:29:01 +0000
Subject: [PATCH] add lvds1024*800

---
 kernel/drivers/mailbox/rockchip-mailbox.c |   44 ++++++++++++++++++++++++++++----------------
 1 files changed, 28 insertions(+), 16 deletions(-)

diff --git a/kernel/drivers/mailbox/rockchip-mailbox.c b/kernel/drivers/mailbox/rockchip-mailbox.c
index 4b8718e..66ebea2 100644
--- a/kernel/drivers/mailbox/rockchip-mailbox.c
+++ b/kernel/drivers/mailbox/rockchip-mailbox.c
@@ -1,4 +1,4 @@
-// SPDX-License-Identifier:     GPL-2.0
+// SPDX-License-Identifier: GPL-2.0-only
 /*
  * Copyright (c) 2015, Fuzhou Rockchip Electronics Co., Ltd
  */
@@ -23,6 +23,8 @@
 #define MAILBOX_B2A_STATUS		0x2C
 #define MAILBOX_B2A_CMD(x)		(0x30 + (x) * 8)
 #define MAILBOX_B2A_DAT(x)		(0x34 + (x) * 8)
+
+#define MAILBOX_POLLING_MS		5 /* default polling interval 5ms */
 
 struct rockchip_mbox_data {
 	int num_chans;
@@ -99,10 +101,21 @@
 	spin_unlock(&mb->cfg_lock);
 }
 
+static bool rockchip_mbox_last_tx_done(struct mbox_chan *chan)
+{
+	struct rockchip_mbox *mb = dev_get_drvdata(chan->mbox->dev);
+	struct rockchip_mbox_chan *chans = chan->con_priv;
+	u32 status;
+
+	status = readl_relaxed(mb->mbox_base + MAILBOX_A2B_STATUS);
+	return !(status & (1U << chans->idx));
+}
+
 static const struct mbox_chan_ops rockchip_mbox_chan_ops = {
 	.send_data	= rockchip_mbox_send_data,
 	.startup	= rockchip_mbox_startup,
 	.shutdown	= rockchip_mbox_shutdown,
+	.last_tx_done	= rockchip_mbox_last_tx_done,
 };
 
 int rockchip_mbox_read_msg(struct mbox_chan *chan,
@@ -172,6 +185,7 @@
 	const struct rockchip_mbox_data *drv_data;
 	struct resource *res;
 	int ret, irq, i;
+	u32 txpoll_period;
 
 	if (!pdev->dev.of_node)
 		return -ENODEV;
@@ -203,8 +217,11 @@
 	mb->mbox.dev = &pdev->dev;
 	mb->mbox.num_chans = drv_data->num_chans;
 	mb->mbox.ops = &rockchip_mbox_chan_ops;
-	mb->mbox.txdone_irq = true;
 	spin_lock_init(&mb->cfg_lock);
+
+	mb->mbox.txdone_poll = true;
+	ret = device_property_read_u32(&pdev->dev, "rockchip,txpoll-period-ms", &txpoll_period);
+	mb->mbox.txpoll_period = !ret ? txpoll_period : MAILBOX_POLLING_MS;
 
 	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 	if (!res)
@@ -246,7 +263,7 @@
 		mb->mbox.chans[i].con_priv = &mb->chans[i];
 	}
 
-	ret = mbox_controller_register(&mb->mbox);
+	ret = devm_mbox_controller_register(&pdev->dev, &mb->mbox);
 	if (ret < 0) {
 		dev_err(&pdev->dev, "Failed to register mailbox: %d\n", ret);
 		goto disable_clk;
@@ -277,28 +294,23 @@
 	return ret;
 }
 
-static int rockchip_mbox_remove(struct platform_device *pdev)
-{
-	struct rockchip_mbox *mb = platform_get_drvdata(pdev);
-
-	if (!mb)
-		return -EINVAL;
-
-	mbox_controller_unregister(&mb->mbox);
-
-	return 0;
-}
-
 static struct platform_driver rockchip_mbox_driver = {
 	.probe	= rockchip_mbox_probe,
-	.remove	= rockchip_mbox_remove,
 	.driver = {
 		.name = "rockchip-mailbox",
 		.of_match_table = of_match_ptr(rockchip_mbox_of_match),
 	},
 };
 
+#if defined(CONFIG_ROCKCHIP_THUNDER_BOOT)
+static int __init rockchip_mbox_driver_init(void)
+{
+	return platform_driver_register(&rockchip_mbox_driver);
+}
+core_initcall(rockchip_mbox_driver_init);
+#else
 module_platform_driver(rockchip_mbox_driver);
+#endif
 
 MODULE_LICENSE("GPL v2");
 MODULE_DESCRIPTION("Rockchip mailbox: communicate between CPU cores and MCU");

--
Gitblit v1.6.2