1 // SPDX-License-Identifier: GPL-2.0+
3 * Faraday Technology's FTGPIO010 controller.
11 struct ftgpio010_regs {
14 u32 direction; // 1 - output
20 struct ftgpio010_plat {
21 struct ftgpio010_regs __iomem *regs;
24 static int ftgpio010_direction_input(struct udevice *dev, unsigned int pin)
26 struct ftgpio010_plat *plat = dev_get_plat(dev);
27 struct ftgpio010_regs *const regs = plat->regs;
29 clrbits_le32(®s->direction, 1 << pin);
33 static int ftgpio010_direction_output(struct udevice *dev, unsigned int pin,
36 struct ftgpio010_plat *plat = dev_get_plat(dev);
37 struct ftgpio010_regs *const regs = plat->regs;
39 /* change the data first, then the direction. to avoid glitch */
40 out_le32(val ? ®s->set : ®s->clear, 1 << pin);
41 setbits_le32(®s->direction, 1 << pin);
46 static int ftgpio010_get_value(struct udevice *dev, unsigned int pin)
48 struct ftgpio010_plat *plat = dev_get_plat(dev);
49 struct ftgpio010_regs *const regs = plat->regs;
51 return in_le32(®s->in) >> pin & 1;
54 static int ftgpio010_set_value(struct udevice *dev, unsigned int pin, int val)
56 struct ftgpio010_plat *plat = dev_get_plat(dev);
57 struct ftgpio010_regs *const regs = plat->regs;
59 out_le32(val ? ®s->set : ®s->clear, 1 << pin);
63 static int ftgpio010_get_function(struct udevice *dev, unsigned int pin)
65 struct ftgpio010_plat *plat = dev_get_plat(dev);
66 struct ftgpio010_regs *const regs = plat->regs;
68 if (in_le32(®s->direction) >> pin & 1)
73 static int ftgpio010_probe(struct udevice *dev)
75 struct gpio_dev_priv *uc_priv = dev_get_uclass_priv(dev);
77 uc_priv->gpio_count = ofnode_read_u32_default(dev_ofnode(dev),
82 static int ftgpio010_of_to_plat(struct udevice *dev)
84 struct ftgpio010_plat *plat = dev_get_plat(dev);
86 plat->regs = dev_read_addr_ptr(dev);
90 static const struct dm_gpio_ops ftgpio010_ops = {
91 .direction_input = ftgpio010_direction_input,
92 .direction_output = ftgpio010_direction_output,
93 .get_value = ftgpio010_get_value,
94 .set_value = ftgpio010_set_value,
95 .get_function = ftgpio010_get_function,
98 static const struct udevice_id ftgpio010_ids[] = {
99 { .compatible = "faraday,ftgpio010" },
103 U_BOOT_DRIVER(ftgpio010) = {
106 .of_match = ftgpio010_ids,
107 .ops = &ftgpio010_ops,
108 .of_to_plat = ftgpio010_of_to_plat,
109 .plat_auto = sizeof(struct ftgpio010_plat),
110 .probe = ftgpio010_probe,