[PATCH 4/8] Spi: sprd-adi: Supported multi parameter configurations

From: Jiansheng Wu
Date: Mon Aug 14 2023 - 22:35:51 EST


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@xxxxxxxxxx>
---
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