diff options
author | andy.hu <andy.hu@starfivetech.com> | 2023-03-30 14:16:48 +0300 |
---|---|---|
committer | andy.hu <andy.hu@starfivetech.com> | 2023-03-30 14:16:48 +0300 |
commit | bd7c43e2d46699d79c290990b3c1fbec06cb0ea5 (patch) | |
tree | 78598e67a62666b3a19b1c34dc42d7423251d4c6 | |
parent | 1d5b9282049d5872755a82b0a9cc9c7c8710b75e (diff) | |
parent | dc7742fa960a931172e14d21241b1cc87bf1b3a1 (diff) | |
download | u-boot-bd7c43e2d46699d79c290990b3c1fbec06cb0ea5.tar.xz |
Merge branch 'CR_4446_pinctrl_hal.feng' into 'jh7110-master'
CR 4446 pinctrl hal.feng
See merge request sdk/u-boot!46
-rw-r--r-- | arch/riscv/dts/jh7110.dtsi | 2 | ||||
-rwxr-xr-x | drivers/pinctrl/starfive/pinctrl-starfive.c | 20 |
2 files changed, 20 insertions, 2 deletions
diff --git a/arch/riscv/dts/jh7110.dtsi b/arch/riscv/dts/jh7110.dtsi index cf9a1eebb2..408787334c 100644 --- a/arch/riscv/dts/jh7110.dtsi +++ b/arch/riscv/dts/jh7110.dtsi @@ -555,6 +555,7 @@ reg-names = "control"; interrupts = <91>; interrupt-controller; + gpio-controller; #gpio-cells = <2>; ngpios = <64>; status = "okay"; @@ -566,6 +567,7 @@ reg-names = "control"; interrupts = <90>; interrupt-controller; + gpio-controller; #gpio-cells = <2>; ngpios = <4>; status = "okay"; diff --git a/drivers/pinctrl/starfive/pinctrl-starfive.c b/drivers/pinctrl/starfive/pinctrl-starfive.c index 6e69654550..990d7ac526 100755 --- a/drivers/pinctrl/starfive/pinctrl-starfive.c +++ b/drivers/pinctrl/starfive/pinctrl-starfive.c @@ -275,10 +275,25 @@ const struct pinctrl_ops starfive_pinctrl_ops = { .pinconf_set = starfive_pinconf_set, }; +static int starfive_gpio_get_direction(struct udevice *dev, unsigned int off) +{ + struct udevice *pdev = dev->parent; + struct starfive_pinctrl_priv *priv = dev_get_priv(pdev); + struct starfive_pinctrl_soc_info *info = priv->info; + + unsigned int offset = 4 * (off / 4); + unsigned int shift = 8 * (off % 4); + u32 doen = readl(priv->base + info->doen_reg_base + offset); + + doen = (doen >> shift) & info->doen_mask; + + return doen == GPOEN_ENABLE ? GPIOF_OUTPUT : GPIOF_INPUT; +} + static int starfive_gpio_direction_input(struct udevice *dev, unsigned int off) { struct udevice *pdev = dev->parent; - struct starfive_pinctrl_priv *priv = dev_get_priv(dev); + struct starfive_pinctrl_priv *priv = dev_get_priv(pdev); struct starfive_pinctrl_soc_info *info = priv->info; /* enable input and schmitt trigger */ @@ -297,7 +312,7 @@ static int starfive_gpio_direction_output(struct udevice *dev, unsigned int off, int val) { struct udevice *pdev = dev->parent; - struct starfive_pinctrl_priv *priv = dev_get_priv(dev); + struct starfive_pinctrl_priv *priv = dev_get_priv(pdev); struct starfive_pinctrl_soc_info *info = priv->info; if (info->set_one_pinmux) @@ -365,6 +380,7 @@ static int starfive_gpio_probe(struct udevice *dev) } static const struct dm_gpio_ops starfive_gpio_ops = { + .get_function = starfive_gpio_get_direction, .direction_input = starfive_gpio_direction_input, .direction_output = starfive_gpio_direction_output, .get_value = starfive_gpio_get_value, |