[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20230815023426.15076-4-jiansheng.wu@unisoc.com>
Date: Tue, 15 Aug 2023 10:34:22 +0800
From: Jiansheng Wu <jiansheng.wu@...soc.com>
To: Mark Brown <broonie@...nel.org>, Orson Zhai <orsonzhai@...il.com>,
Baolin Wang <baolin.wang@...ux.alibaba.com>,
Chunyan Zhang <zhang.lyra@...il.com>
CC: <linux-spi@...r.kernel.org>, <linux-kernel@...r.kernel.org>,
<yongzhi.chen@...soc.com>, <xiaoqing.wu@...soc.com>,
<jianshengwu16@...il.com>
Subject: [PATCH 4/8] Spi: sprd-adi: Supported multi parameter configurations
It is supporting multi hardware and multi config on adi driver.
That we can define different parameter on boards' dts, and configure
cannels on adi-device.
Signed-off-by: Jiansheng Wu <jiansheng.wu@...soc.com>
---
drivers/spi/spi-sprd-adi.c | 35 ++++++++++++++++++++++++++++++++++-
1 file changed, 34 insertions(+), 1 deletion(-)
diff --git a/drivers/spi/spi-sprd-adi.c b/drivers/spi/spi-sprd-adi.c
index 569a66943e8d..eea64d20279e 100644
--- a/drivers/spi/spi-sprd-adi.c
+++ b/drivers/spi/spi-sprd-adi.c
@@ -140,6 +140,8 @@
#define WDG_UNLOCK_KEY 0xe551
#define PANIC_REASON_LEN_MAX 20
+/*Adi single soft multi hard*/
+#define SPRD_ADI_MAGIC_LEN_MAX 5
struct sprd_adi_data {
u32 slave_offset;
@@ -471,12 +473,40 @@ static int sprd_adi_restart_handler(struct notifier_block *this, unsigned long m
return NOTIFY_DONE;
}
+static void sprd_adi_power_ssmh(char *adi_supply)
+{
+ struct device_node *cmdline_node;
+ const char *cmd_line, *adi_type;
+ char adi_value[SPRD_ADI_MAGIC_LEN_MAX] = "";
+ int ret;
+
+ cmdline_node = of_find_node_by_path("/chosen");
+ ret = of_property_read_string(cmdline_node, "bootargs", &cmd_line);
+ if (ret) {
+ pr_err("can't parse bootargs property\n");
+ return;
+ }
+
+ adi_type = strstr(cmd_line, "power.from.extern=");
+ if (!adi_type) {
+ pr_err("can't find power.from.extern\n");
+ return;
+ }
+
+ sscanf(adi_type, "power.from.extern=%s\n", adi_value);
+ if (!adi_value[0])
+ return;
+
+ strcat(adi_supply, adi_value);
+}
+
static void sprd_adi_hw_init(struct sprd_adi *sadi)
{
struct device_node *np = sadi->dev->of_node;
int i, size, chn_cnt;
const __be32 *list;
u32 tmp;
+ char adi_supply[25] = "sprd,hw-channels";
/* Set all channels as default priority */
writel_relaxed(0, sadi->base + REG_ADI_CHN_PRIL);
@@ -488,7 +518,10 @@ static void sprd_adi_hw_init(struct sprd_adi *sadi)
writel_relaxed(tmp, sadi->base + REG_ADI_GSSI_CFG0);
/* Set hardware channels setting */
- list = of_get_property(np, "sprd,hw-channels", &size);
+ sprd_adi_power_ssmh(adi_supply);
+ dev_info(sadi->dev, "adi supply is %s\n", adi_supply);
+
+ list = of_get_property(np, adi_supply, &size);
if (!list || !size) {
dev_info(sadi->dev, "no hw channels setting in node\n");
return;
--
2.17.1
Powered by blists - more mailing lists