| From 264e67f064c60ebf6ec5b965f1798f048941a653 Mon Sep 17 00:00:00 2001 |
| From: "yung-sheng.huang" <yung-sheng.huang@fii-na.corp-partner.google.com> |
| Date: Wed, 16 Apr 2025 14:33:30 +0800 |
| Subject: [PATCH] Add setting SGPIO default value |
| |
| This patch enable SGPIO init value from DTS |
| |
| Signed-off-by: yung-sheng.huang <yung-sheng.huang@fii-na.corp-partner.google.com> |
| --- |
| drivers/gpio/gpio-aspeed-sgpio.c | 20 ++++++++++++++++++++ |
| 1 file changed, 20 insertions(+) |
| |
| diff --git a/drivers/gpio/gpio-aspeed-sgpio.c b/drivers/gpio/gpio-aspeed-sgpio.c |
| index 450d6eb87..ce3cdf387 100644 |
| --- a/drivers/gpio/gpio-aspeed-sgpio.c |
| +++ b/drivers/gpio/gpio-aspeed-sgpio.c |
| @@ -855,6 +855,8 @@ static int aspeed_sgpio_probe(struct platform_device *pdev) |
| unsigned long apb_freq; |
| void __iomem *addr; |
| int rc, i; |
| + u32 initial_val; |
| + int has_default = 1; |
| |
| gpio = devm_kzalloc(&pdev->dev, sizeof(*gpio), GFP_KERNEL); |
| if (!gpio) |
| @@ -883,11 +885,29 @@ static int aspeed_sgpio_probe(struct platform_device *pdev) |
| return -EINVAL; |
| } |
| |
| + u32 Byte_configs[nr_gpios / 8]; |
| + for (i = 0; i < nr_gpios / 8; i++) { |
| + char prop_name[16]; |
| + snprintf(prop_name, sizeof(prop_name), "Byte%d_default", i); |
| + rc = device_property_read_u32(&pdev->dev, prop_name, &Byte_configs[i]); |
| + if (rc < 0) { |
| + has_default = 0; |
| + break; |
| + } |
| + } |
| + |
| if (gpio->version == 7 && !gpio->pdata->slave) |
| for (i = 0; i < nr_gpios; i++) { |
| addr = gpio->base + SGPIO_G7_CTRL_REG_OFFSET(i); |
| ast_write_bits(addr, SGPIO_G7_SERIAL_OUT_SEL, |
| SELECT_FROM_CSR); |
| + |
| + if (has_default) { |
| + int byte_index = i / 8; |
| + int bit_index = i % 8; |
| + initial_val = (Byte_configs[byte_index] >> bit_index) & 1; |
| + ast_write_bits(addr, SGPIO_G7_OUT_DATA, initial_val); |
| + } |
| } |
| |
| if (!gpio->pdata->slave) { |
| -- |
| 2.34.1 |
| |