1 // SPDX-License-Identifier: GPL-2.0+
3 * Copyright (C) 2016 Stefan Roese <sr@denx.de>
8 #include <dm/pinctrl.h>
12 #include <linux/bitops.h>
14 #define MVEBU_GPIOS_PER_BANK 32
16 struct mvebu_gpio_regs {
24 struct mvebu_gpio_priv {
25 struct mvebu_gpio_regs *regs;
26 char name[sizeof("mvebuX_")];
29 static int mvebu_gpio_direction_input(struct udevice *dev, unsigned int gpio)
31 struct mvebu_gpio_priv *priv = dev_get_priv(dev);
32 struct mvebu_gpio_regs *regs = priv->regs;
34 setbits_le32(®s->io_conf, BIT(gpio));
39 static int mvebu_gpio_direction_output(struct udevice *dev, unsigned gpio,
42 struct mvebu_gpio_priv *priv = dev_get_priv(dev);
43 struct mvebu_gpio_regs *regs = priv->regs;
46 setbits_le32(®s->data_out, BIT(gpio));
48 clrbits_le32(®s->data_out, BIT(gpio));
49 clrbits_le32(®s->io_conf, BIT(gpio));
54 static int mvebu_gpio_get_function(struct udevice *dev, unsigned gpio)
56 struct mvebu_gpio_priv *priv = dev_get_priv(dev);
57 struct mvebu_gpio_regs *regs = priv->regs;
60 val = readl(®s->io_conf) & BIT(gpio);
67 static int mvebu_gpio_set_value(struct udevice *dev, unsigned gpio,
70 struct mvebu_gpio_priv *priv = dev_get_priv(dev);
71 struct mvebu_gpio_regs *regs = priv->regs;
74 setbits_le32(®s->data_out, BIT(gpio));
76 clrbits_le32(®s->data_out, BIT(gpio));
81 static int mvebu_gpio_get_value(struct udevice *dev, unsigned gpio)
83 struct mvebu_gpio_priv *priv = dev_get_priv(dev);
84 struct mvebu_gpio_regs *regs = priv->regs;
86 return !!(readl(®s->data_in) & BIT(gpio));
89 static int mvebu_gpio_probe(struct udevice *dev)
91 struct gpio_dev_priv *uc_priv = dev_get_uclass_priv(dev);
92 struct mvebu_gpio_priv *priv = dev_get_priv(dev);
94 priv->regs = dev_read_addr_ptr(dev);
95 uc_priv->gpio_count = dev_read_u32_default(dev, "ngpios", MVEBU_GPIOS_PER_BANK);
96 sprintf(priv->name, "mvebu%d_", dev_seq(dev));
97 uc_priv->bank_name = priv->name;
102 static const struct dm_gpio_ops mvebu_gpio_ops = {
103 #if CONFIG_IS_ENABLED(PINCTRL_ARMADA_38X)
104 .request = pinctrl_gpio_request,
105 .rfree = pinctrl_gpio_free,
107 .direction_input = mvebu_gpio_direction_input,
108 .direction_output = mvebu_gpio_direction_output,
109 .get_function = mvebu_gpio_get_function,
110 .get_value = mvebu_gpio_get_value,
111 .set_value = mvebu_gpio_set_value,
114 static const struct udevice_id mvebu_gpio_ids[] = {
115 { .compatible = "marvell,orion-gpio" },
119 U_BOOT_DRIVER(gpio_mvebu) = {
120 .name = "gpio_mvebu",
122 .of_match = mvebu_gpio_ids,
123 .ops = &mvebu_gpio_ops,
124 .probe = mvebu_gpio_probe,
125 .priv_auto = sizeof(struct mvebu_gpio_priv),