diff mbox series

[v3] gpio: ftgpio010: Add support for Faraday Technology FTGPIO010

Message ID 20220912100915.2773051-1-saproj@gmail.com
State Accepted
Delegated to: Tom Rini
Headers show
Series [v3] gpio: ftgpio010: Add support for Faraday Technology FTGPIO010 | expand

Commit Message

Sergei Antonov Sept. 12, 2022, 10:09 a.m. UTC
Add Faraday Technology's FTGPIO010 controller driver.

Signed-off-by: Sergei Antonov <saproj@gmail.com>
---
v2 -> v3:
 Implement .get_function to make "gpio status" command work.

v1 -> v2:
 Replace setbits_le32() with a simpler function out_le32().
 Replace readl() with in_le32() to respect endianness.

 drivers/gpio/Kconfig     |   6 +++
 drivers/gpio/Makefile    |   1 +
 drivers/gpio/ftgpio010.c | 111 +++++++++++++++++++++++++++++++++++++++
 3 files changed, 118 insertions(+)
 create mode 100644 drivers/gpio/ftgpio010.c

Comments

Sergei Antonov Oct. 7, 2022, 9:27 a.m. UTC | #1
On Mon, 12 Sept 2022 at 13:11, Sergei Antonov <saproj@gmail.com> wrote:
>
> Add Faraday Technology's FTGPIO010 controller driver.
>
> Signed-off-by: Sergei Antonov <saproj@gmail.com>
> ---
> v2 -> v3:
>  Implement .get_function to make "gpio status" command work.
>
> v1 -> v2:
>  Replace setbits_le32() with a simpler function out_le32().
>  Replace readl() with in_le32() to respect endianness.

+andre.przywara
+pali
+sr
+samuel

Hello! There has been no feedback to this patch. Anyone?
I think it is ready to be committed.
Tom Rini Oct. 7, 2022, 3:48 p.m. UTC | #2
On Mon, Sep 12, 2022 at 01:09:15PM +0300, Sergei Antonov wrote:

> Add Faraday Technology's FTGPIO010 controller driver.
> 
> Signed-off-by: Sergei Antonov <saproj@gmail.com>

Applied to u-boot/master, thanks!
Pali Rohár Oct. 7, 2022, 5:02 p.m. UTC | #3
On Friday 07 October 2022 12:27:43 Sergei Antonov wrote:
> On Mon, 12 Sept 2022 at 13:11, Sergei Antonov <saproj@gmail.com> wrote:
> >
> > Add Faraday Technology's FTGPIO010 controller driver.
> >
> > Signed-off-by: Sergei Antonov <saproj@gmail.com>
> > ---
> > v2 -> v3:
> >  Implement .get_function to make "gpio status" command work.
> >
> > v1 -> v2:
> >  Replace setbits_le32() with a simpler function out_le32().
> >  Replace readl() with in_le32() to respect endianness.
> 
> +andre.przywara
> +pali
> +sr
> +samuel
> 
> Hello! There has been no feedback to this patch. Anyone?
> I think it is ready to be committed.

I have already sent feedback for ftgpio010.c:
https://lore.kernel.org/u-boot/20220904102653.3vconq3kdegki34s@pali/t/#u

How many times should I repeat it? I'm really not maintainer of
ftgpio010.c driver, nor of gpio. So please do not send me emails about
ftgpio010.c if you do not have really good reason.
diff mbox series

Patch

diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig
index c949f9d2f7cc..2a60478b476a 100644
--- a/drivers/gpio/Kconfig
+++ b/drivers/gpio/Kconfig
@@ -605,4 +605,10 @@  config TURRIS_OMNIA_MCU
 	help
 	   Support for GPIOs on MCU connected to Turris Omnia via i2c.
 
+config FTGPIO010
+	bool "Faraday Technology FTGPIO010 driver"
+	depends on DM_GPIO
+	help
+	   Support for GPIOs on Faraday Technology's FTGPIO010 controller.
+
 endif
diff --git a/drivers/gpio/Makefile b/drivers/gpio/Makefile
index 9d718a554e59..eee7908871d8 100644
--- a/drivers/gpio/Makefile
+++ b/drivers/gpio/Makefile
@@ -75,3 +75,4 @@  obj-$(CONFIG_SL28CPLD_GPIO)	+= sl28cpld-gpio.o
 obj-$(CONFIG_ZYNQMP_GPIO_MODEPIN)	+= zynqmp_gpio_modepin.o
 obj-$(CONFIG_SLG7XL45106_I2C_GPO)	+= gpio_slg7xl45106.o
 obj-$(CONFIG_$(SPL_TPL_)TURRIS_OMNIA_MCU)	+= turris_omnia_mcu.o
+obj-$(CONFIG_FTGPIO010)		+= ftgpio010.o
diff --git a/drivers/gpio/ftgpio010.c b/drivers/gpio/ftgpio010.c
new file mode 100644
index 000000000000..6c091d4fd874
--- /dev/null
+++ b/drivers/gpio/ftgpio010.c
@@ -0,0 +1,111 @@ 
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Faraday Technology's FTGPIO010 controller.
+ */
+
+#include <common.h>
+#include <dm.h>
+#include <asm/io.h>
+#include <asm/gpio.h>
+
+struct ftgpio010_regs {
+	u32 out;
+	u32 in;
+	u32 direction;	// 1 - output
+	u32 reserved;
+	u32 set;
+	u32 clear;
+};
+
+struct ftgpio010_plat {
+	struct ftgpio010_regs __iomem *regs;
+};
+
+static int ftgpio010_direction_input(struct udevice *dev, unsigned int pin)
+{
+	struct ftgpio010_plat *plat = dev_get_plat(dev);
+	struct ftgpio010_regs *const regs = plat->regs;
+
+	clrbits_le32(&regs->direction, 1 << pin);
+	return 0;
+}
+
+static int ftgpio010_direction_output(struct udevice *dev, unsigned int pin,
+				      int val)
+{
+	struct ftgpio010_plat *plat = dev_get_plat(dev);
+	struct ftgpio010_regs *const regs = plat->regs;
+
+	/* change the data first, then the direction. to avoid glitch */
+	out_le32(val ? &regs->set : &regs->clear, 1 << pin);
+	setbits_le32(&regs->direction, 1 << pin);
+
+	return 0;
+}
+
+static int ftgpio010_get_value(struct udevice *dev, unsigned int pin)
+{
+	struct ftgpio010_plat *plat = dev_get_plat(dev);
+	struct ftgpio010_regs *const regs = plat->regs;
+
+	return in_le32(&regs->in) >> pin & 1;
+}
+
+static int ftgpio010_set_value(struct udevice *dev, unsigned int pin, int val)
+{
+	struct ftgpio010_plat *plat = dev_get_plat(dev);
+	struct ftgpio010_regs *const regs = plat->regs;
+
+	out_le32(val ? &regs->set : &regs->clear, 1 << pin);
+	return 0;
+}
+
+static int ftgpio010_get_function(struct udevice *dev, unsigned int pin)
+{
+	struct ftgpio010_plat *plat = dev_get_plat(dev);
+	struct ftgpio010_regs *const regs = plat->regs;
+
+	if (in_le32(&regs->direction) >> pin & 1)
+		return GPIOF_OUTPUT;
+	return GPIOF_INPUT;
+}
+
+static int ftgpio010_probe(struct udevice *dev)
+{
+	struct gpio_dev_priv *uc_priv = dev_get_uclass_priv(dev);
+
+	uc_priv->gpio_count = ofnode_read_u32_default(dev_ofnode(dev),
+						      "nr-gpios", 32);
+	return 0;
+}
+
+static int ftgpio010_of_to_plat(struct udevice *dev)
+{
+	struct ftgpio010_plat *plat = dev_get_plat(dev);
+
+	plat->regs = dev_read_addr_ptr(dev);
+	return 0;
+}
+
+static const struct dm_gpio_ops ftgpio010_ops = {
+	.direction_input	= ftgpio010_direction_input,
+	.direction_output	= ftgpio010_direction_output,
+	.get_value		= ftgpio010_get_value,
+	.set_value		= ftgpio010_set_value,
+	.get_function		= ftgpio010_get_function,
+};
+
+static const struct udevice_id ftgpio010_ids[] = {
+	{ .compatible = "faraday,ftgpio010" },
+	{ }
+};
+
+U_BOOT_DRIVER(ftgpio010) = {
+	.name		= "ftgpio010",
+	.id		= UCLASS_GPIO,
+	.of_match	= ftgpio010_ids,
+	.ops		= &ftgpio010_ops,
+	.of_to_plat	= ftgpio010_of_to_plat,
+	.plat_auto	= sizeof(struct ftgpio010_plat),
+	.probe		= ftgpio010_probe,
+};