[PATCH] gpio: rgpio2p: Enhance reading of GPIO pin value

Add support for reading GPIO pin value when function is output. With this patch applied, gpio toggle command is working.
Signed-off-by: Christoph Fritz chf.fritz@googlemail.com --- drivers/gpio/imx_rgpio2p.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-)
diff --git a/drivers/gpio/imx_rgpio2p.c b/drivers/gpio/imx_rgpio2p.c index 0e2874ca95c..175e460aff5 100644 --- a/drivers/gpio/imx_rgpio2p.c +++ b/drivers/gpio/imx_rgpio2p.c @@ -39,6 +39,14 @@ static int imx_rgpio2p_is_output(struct gpio_regs *regs, int offset) return val & (1 << offset) ? 1 : 0; }
+static int imx_rgpio2p_bank_get_direction(struct gpio_regs *regs, int offset) +{ + if ((readl(®s->gpio_pddr) >> offset) & 0x01) + return IMX_RGPIO2P_DIRECTION_OUT; + + return IMX_RGPIO2P_DIRECTION_IN; +} + static void imx_rgpio2p_bank_direction(struct gpio_regs *regs, int offset, enum imx_rgpio2p_direction direction) { @@ -67,7 +75,11 @@ static void imx_rgpio2p_bank_set_value(struct gpio_regs *regs, int offset,
static int imx_rgpio2p_bank_get_value(struct gpio_regs *regs, int offset) { - return (readl(®s->gpio_pdir) >> offset) & 0x01; + if (imx_rgpio2p_bank_get_direction(regs, offset) == + IMX_RGPIO2P_DIRECTION_IN) + return (readl(®s->gpio_pdir) >> offset) & 0x01; + + return (readl(®s->gpio_pdor) >> offset) & 0x01; }
static int imx_rgpio2p_direction_input(struct udevice *dev, unsigned offset)

[Adding the NXP folks to help reviewing it]
On Mon, Jan 24, 2022 at 5:46 PM Christoph Fritz chf.fritz@googlemail.com wrote:
Add support for reading GPIO pin value when function is output. With this patch applied, gpio toggle command is working.
Signed-off-by: Christoph Fritz chf.fritz@googlemail.com
drivers/gpio/imx_rgpio2p.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-)
diff --git a/drivers/gpio/imx_rgpio2p.c b/drivers/gpio/imx_rgpio2p.c index 0e2874ca95c..175e460aff5 100644 --- a/drivers/gpio/imx_rgpio2p.c +++ b/drivers/gpio/imx_rgpio2p.c @@ -39,6 +39,14 @@ static int imx_rgpio2p_is_output(struct gpio_regs *regs, int offset) return val & (1 << offset) ? 1 : 0; }
+static int imx_rgpio2p_bank_get_direction(struct gpio_regs *regs, int offset) +{
if ((readl(®s->gpio_pddr) >> offset) & 0x01)
return IMX_RGPIO2P_DIRECTION_OUT;
return IMX_RGPIO2P_DIRECTION_IN;
+}
static void imx_rgpio2p_bank_direction(struct gpio_regs *regs, int offset, enum imx_rgpio2p_direction direction) { @@ -67,7 +75,11 @@ static void imx_rgpio2p_bank_set_value(struct gpio_regs *regs, int offset,
static int imx_rgpio2p_bank_get_value(struct gpio_regs *regs, int offset) {
return (readl(®s->gpio_pdir) >> offset) & 0x01;
if (imx_rgpio2p_bank_get_direction(regs, offset) ==
IMX_RGPIO2P_DIRECTION_IN)
return (readl(®s->gpio_pdir) >> offset) & 0x01;
return (readl(®s->gpio_pdor) >> offset) & 0x01;
}
static int imx_rgpio2p_direction_input(struct udevice *dev, unsigned offset)
2.30.2

On Mon, Jan 24, 2022 at 5:50 PM Fabio Estevam festevam@gmail.com wrote:
[Adding the NXP folks to help reviewing it]
Sorry, added the NXP Linux folks instead of the NXP U-Boot folks.
On Mon, Jan 24, 2022 at 5:46 PM Christoph Fritz chf.fritz@googlemail.com wrote:
Add support for reading GPIO pin value when function is output. With this patch applied, gpio toggle command is working.
Signed-off-by: Christoph Fritz chf.fritz@googlemail.com
drivers/gpio/imx_rgpio2p.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-)
diff --git a/drivers/gpio/imx_rgpio2p.c b/drivers/gpio/imx_rgpio2p.c index 0e2874ca95c..175e460aff5 100644 --- a/drivers/gpio/imx_rgpio2p.c +++ b/drivers/gpio/imx_rgpio2p.c @@ -39,6 +39,14 @@ static int imx_rgpio2p_is_output(struct gpio_regs *regs, int offset) return val & (1 << offset) ? 1 : 0; }
+static int imx_rgpio2p_bank_get_direction(struct gpio_regs *regs, int offset) +{
if ((readl(®s->gpio_pddr) >> offset) & 0x01)
return IMX_RGPIO2P_DIRECTION_OUT;
return IMX_RGPIO2P_DIRECTION_IN;
+}
static void imx_rgpio2p_bank_direction(struct gpio_regs *regs, int offset, enum imx_rgpio2p_direction direction) { @@ -67,7 +75,11 @@ static void imx_rgpio2p_bank_set_value(struct gpio_regs *regs, int offset,
static int imx_rgpio2p_bank_get_value(struct gpio_regs *regs, int offset) {
return (readl(®s->gpio_pdir) >> offset) & 0x01;
if (imx_rgpio2p_bank_get_direction(regs, offset) ==
IMX_RGPIO2P_DIRECTION_IN)
return (readl(®s->gpio_pdir) >> offset) & 0x01;
return (readl(®s->gpio_pdor) >> offset) & 0x01;
}
static int imx_rgpio2p_direction_input(struct udevice *dev, unsigned offset)
2.30.2

*ping*, any objections getting this patch applied?
On Mon, 2022-01-24 at 17:51 -0300, Fabio Estevam wrote:
On Mon, Jan 24, 2022 at 5:50 PM Fabio Estevam festevam@gmail.com wrote:
[Adding the NXP folks to help reviewing it]
Sorry, added the NXP Linux folks instead of the NXP U-Boot folks.
On Mon, Jan 24, 2022 at 5:46 PM Christoph Fritz chf.fritz@googlemail.com wrote:
Add support for reading GPIO pin value when function is output. With this patch applied, gpio toggle command is working.
Signed-off-by: Christoph Fritz chf.fritz@googlemail.com
drivers/gpio/imx_rgpio2p.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-)
diff --git a/drivers/gpio/imx_rgpio2p.c b/drivers/gpio/imx_rgpio2p.c index 0e2874ca95c..175e460aff5 100644 --- a/drivers/gpio/imx_rgpio2p.c +++ b/drivers/gpio/imx_rgpio2p.c @@ -39,6 +39,14 @@ static int imx_rgpio2p_is_output(struct gpio_regs *regs, int offset) return val & (1 << offset) ? 1 : 0; }
+static int imx_rgpio2p_bank_get_direction(struct gpio_regs *regs, int offset) +{ + if ((readl(®s->gpio_pddr) >> offset) & 0x01) + return IMX_RGPIO2P_DIRECTION_OUT;
+ return IMX_RGPIO2P_DIRECTION_IN; +}
static void imx_rgpio2p_bank_direction(struct gpio_regs *regs, int offset, enum imx_rgpio2p_direction direction) { @@ -67,7 +75,11 @@ static void imx_rgpio2p_bank_set_value(struct gpio_regs *regs, int offset,
static int imx_rgpio2p_bank_get_value(struct gpio_regs *regs, int offset) { - return (readl(®s->gpio_pdir) >> offset) & 0x01; + if (imx_rgpio2p_bank_get_direction(regs, offset) == + IMX_RGPIO2P_DIRECTION_IN) + return (readl(®s->gpio_pdir) >> offset) & 0x01;
+ return (readl(®s->gpio_pdor) >> offset) & 0x01; }
static int imx_rgpio2p_direction_input(struct udevice *dev, unsigned offset) -- 2.30.2

Hi Peng and Ye Li,
Could you please help reviewing this patch?
Thanks
On Mon, Jan 24, 2022 at 5:46 PM Christoph Fritz chf.fritz@googlemail.com wrote:
Add support for reading GPIO pin value when function is output. With this patch applied, gpio toggle command is working.
Signed-off-by: Christoph Fritz chf.fritz@googlemail.com
drivers/gpio/imx_rgpio2p.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-)
diff --git a/drivers/gpio/imx_rgpio2p.c b/drivers/gpio/imx_rgpio2p.c index 0e2874ca95c..175e460aff5 100644 --- a/drivers/gpio/imx_rgpio2p.c +++ b/drivers/gpio/imx_rgpio2p.c @@ -39,6 +39,14 @@ static int imx_rgpio2p_is_output(struct gpio_regs *regs, int offset) return val & (1 << offset) ? 1 : 0; }
+static int imx_rgpio2p_bank_get_direction(struct gpio_regs *regs, int offset) +{
if ((readl(®s->gpio_pddr) >> offset) & 0x01)
return IMX_RGPIO2P_DIRECTION_OUT;
return IMX_RGPIO2P_DIRECTION_IN;
+}
static void imx_rgpio2p_bank_direction(struct gpio_regs *regs, int offset, enum imx_rgpio2p_direction direction) { @@ -67,7 +75,11 @@ static void imx_rgpio2p_bank_set_value(struct gpio_regs *regs, int offset,
static int imx_rgpio2p_bank_get_value(struct gpio_regs *regs, int offset) {
return (readl(®s->gpio_pdir) >> offset) & 0x01;
if (imx_rgpio2p_bank_get_direction(regs, offset) ==
IMX_RGPIO2P_DIRECTION_IN)
return (readl(®s->gpio_pdir) >> offset) & 0x01;
return (readl(®s->gpio_pdor) >> offset) & 0x01;
}
static int imx_rgpio2p_direction_input(struct udevice *dev, unsigned offset)
2.30.2

Subject: Re: [PATCH] gpio: rgpio2p: Enhance reading of GPIO pin value
Hi Peng and Ye Li,
Could you please help reviewing this patch?
Not able to find the original patch in my mailbox, so just reply here.
Thanks
On Mon, Jan 24, 2022 at 5:46 PM Christoph Fritz chf.fritz@googlemail.com wrote:
Add support for reading GPIO pin value when function is output. With this patch applied, gpio toggle command is working.
Signed-off-by: Christoph Fritz chf.fritz@googlemail.com
Reviewed-by: Peng Fan peng.fan@nxp.com
drivers/gpio/imx_rgpio2p.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-)
diff --git a/drivers/gpio/imx_rgpio2p.c b/drivers/gpio/imx_rgpio2p.c index 0e2874ca95c..175e460aff5 100644 --- a/drivers/gpio/imx_rgpio2p.c +++ b/drivers/gpio/imx_rgpio2p.c @@ -39,6 +39,14 @@ static int imx_rgpio2p_is_output(struct gpio_regs
*regs, int offset)
return val & (1 << offset) ? 1 : 0; }
+static int imx_rgpio2p_bank_get_direction(struct gpio_regs *regs, int +offset) {
if ((readl(®s->gpio_pddr) >> offset) & 0x01)
return IMX_RGPIO2P_DIRECTION_OUT;
return IMX_RGPIO2P_DIRECTION_IN; }
static void imx_rgpio2p_bank_direction(struct gpio_regs *regs, int offset, enum imx_rgpio2p_direction direction) { @@ -67,7 +75,11 @@ static void imx_rgpio2p_bank_set_value(struct gpio_regs *regs, int offset,
static int imx_rgpio2p_bank_get_value(struct gpio_regs *regs, int offset) {
return (readl(®s->gpio_pdir) >> offset) & 0x01;
if (imx_rgpio2p_bank_get_direction(regs, offset) ==
IMX_RGPIO2P_DIRECTION_IN)
return (readl(®s->gpio_pdir) >> offset) & 0x01;
return (readl(®s->gpio_pdor) >> offset) & 0x01;
}
static int imx_rgpio2p_direction_input(struct udevice *dev, unsigned offset) -- 2.30.2
participants (3)
-
Christoph Fritz
-
Fabio Estevam
-
Peng Fan (OSS)