summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorandy.hu <andy.hu@starfivetech.com>2023-03-30 14:16:48 +0300
committerandy.hu <andy.hu@starfivetech.com>2023-03-30 14:16:48 +0300
commitbd7c43e2d46699d79c290990b3c1fbec06cb0ea5 (patch)
tree78598e67a62666b3a19b1c34dc42d7423251d4c6
parent1d5b9282049d5872755a82b0a9cc9c7c8710b75e (diff)
parentdc7742fa960a931172e14d21241b1cc87bf1b3a1 (diff)
downloadu-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.dtsi2
-rwxr-xr-xdrivers/pinctrl/starfive/pinctrl-starfive.c20
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,