Lines Matching +full:int +full:- +full:gpios
1 // SPDX-License-Identifier: GPL-2.0+
47 return (1U << (31 - (gpio))); in gpio_mask()
52 return in_be32(&base->gpdat) & mask; in mpc8xxx_gpio_get_val()
57 return in_be32(&base->gpdir) & mask; in mpc8xxx_gpio_get_dir()
60 static inline void mpc8xxx_gpio_set_in(struct ccsr_gpio *base, u32 gpios) in mpc8xxx_gpio_set_in() argument
62 clrbits_be32(&base->gpdat, gpios); in mpc8xxx_gpio_set_in()
63 /* GPDIR register 0 -> input */ in mpc8xxx_gpio_set_in()
64 clrbits_be32(&base->gpdir, gpios); in mpc8xxx_gpio_set_in()
67 static inline void mpc8xxx_gpio_set_low(struct ccsr_gpio *base, u32 gpios) in mpc8xxx_gpio_set_low() argument
69 clrbits_be32(&base->gpdat, gpios); in mpc8xxx_gpio_set_low()
70 /* GPDIR register 1 -> output */ in mpc8xxx_gpio_set_low()
71 setbits_be32(&base->gpdir, gpios); in mpc8xxx_gpio_set_low()
74 static inline void mpc8xxx_gpio_set_high(struct ccsr_gpio *base, u32 gpios) in mpc8xxx_gpio_set_high() argument
76 setbits_be32(&base->gpdat, gpios); in mpc8xxx_gpio_set_high()
77 /* GPDIR register 1 -> output */ in mpc8xxx_gpio_set_high()
78 setbits_be32(&base->gpdir, gpios); in mpc8xxx_gpio_set_high()
81 static inline int mpc8xxx_gpio_open_drain_val(struct ccsr_gpio *base, u32 mask) in mpc8xxx_gpio_open_drain_val()
83 return in_be32(&base->gpodr) & mask; in mpc8xxx_gpio_open_drain_val()
87 gpios) in mpc8xxx_gpio_open_drain_on() argument
89 /* GPODR register 1 -> open drain on */ in mpc8xxx_gpio_open_drain_on()
90 setbits_be32(&base->gpodr, gpios); in mpc8xxx_gpio_open_drain_on()
94 u32 gpios) in mpc8xxx_gpio_open_drain_off() argument
96 /* GPODR register 0 -> open drain off (actively driven) */ in mpc8xxx_gpio_open_drain_off()
97 clrbits_be32(&base->gpodr, gpios); in mpc8xxx_gpio_open_drain_off()
100 static int mpc8xxx_gpio_direction_input(struct udevice *dev, uint gpio) in mpc8xxx_gpio_direction_input()
104 mpc8xxx_gpio_set_in(data->base, gpio_mask(gpio)); in mpc8xxx_gpio_direction_input()
108 static int mpc8xxx_gpio_set_value(struct udevice *dev, uint gpio, int value) in mpc8xxx_gpio_set_value()
113 data->dat_shadow |= gpio_mask(gpio); in mpc8xxx_gpio_set_value()
114 mpc8xxx_gpio_set_high(data->base, gpio_mask(gpio)); in mpc8xxx_gpio_set_value()
116 data->dat_shadow &= ~gpio_mask(gpio); in mpc8xxx_gpio_set_value()
117 mpc8xxx_gpio_set_low(data->base, gpio_mask(gpio)); in mpc8xxx_gpio_set_value()
122 static int mpc8xxx_gpio_direction_output(struct udevice *dev, uint gpio, in mpc8xxx_gpio_direction_output()
123 int value) in mpc8xxx_gpio_direction_output()
128 if (data->type == MPC5121_GPIO_TYPE && gpio >= 28) in mpc8xxx_gpio_direction_output()
129 return -EINVAL; in mpc8xxx_gpio_direction_output()
134 static int mpc8xxx_gpio_get_value(struct udevice *dev, uint gpio) in mpc8xxx_gpio_get_value()
138 if (!!mpc8xxx_gpio_get_dir(data->base, gpio_mask(gpio))) { in mpc8xxx_gpio_get_value()
139 /* Output -> use shadowed value */ in mpc8xxx_gpio_get_value()
140 return !!(data->dat_shadow & gpio_mask(gpio)); in mpc8xxx_gpio_get_value()
143 /* Input -> read value from GPDAT register */ in mpc8xxx_gpio_get_value()
144 return !!mpc8xxx_gpio_get_val(data->base, gpio_mask(gpio)); in mpc8xxx_gpio_get_value()
147 static int mpc8xxx_gpio_get_open_drain(struct udevice *dev, uint gpio) in mpc8xxx_gpio_get_open_drain()
151 return !!mpc8xxx_gpio_open_drain_val(data->base, gpio_mask(gpio)); in mpc8xxx_gpio_get_open_drain()
154 static int mpc8xxx_gpio_set_open_drain(struct udevice *dev, uint gpio, in mpc8xxx_gpio_set_open_drain()
155 int value) in mpc8xxx_gpio_set_open_drain()
160 mpc8xxx_gpio_open_drain_on(data->base, gpio_mask(gpio)); in mpc8xxx_gpio_set_open_drain()
162 mpc8xxx_gpio_open_drain_off(data->base, gpio_mask(gpio)); in mpc8xxx_gpio_set_open_drain()
167 static int mpc8xxx_gpio_get_function(struct udevice *dev, uint gpio) in mpc8xxx_gpio_get_function()
170 int dir; in mpc8xxx_gpio_get_function()
172 dir = !!mpc8xxx_gpio_get_dir(data->base, gpio_mask(gpio)); in mpc8xxx_gpio_get_function()
177 static int mpc8xxx_gpio_ofdata_to_platdata(struct udevice *dev) in mpc8xxx_gpio_ofdata_to_platdata()
186 plat->addr = addr; in mpc8xxx_gpio_ofdata_to_platdata()
187 plat->size = reg[1]; in mpc8xxx_gpio_ofdata_to_platdata()
188 plat->ngpios = dev_read_u32_default(dev, "ngpios", 32); in mpc8xxx_gpio_ofdata_to_platdata()
194 static int mpc8xxx_gpio_platdata_to_priv(struct udevice *dev) in mpc8xxx_gpio_platdata_to_priv()
198 unsigned long size = plat->size; in mpc8xxx_gpio_platdata_to_priv()
204 priv->addr = plat->addr; in mpc8xxx_gpio_platdata_to_priv()
205 priv->base = map_sysmem(plat->addr, size); in mpc8xxx_gpio_platdata_to_priv()
207 if (!priv->base) in mpc8xxx_gpio_platdata_to_priv()
208 return -ENOMEM; in mpc8xxx_gpio_platdata_to_priv()
210 priv->gpio_count = plat->ngpios; in mpc8xxx_gpio_platdata_to_priv()
211 priv->dat_shadow = 0; in mpc8xxx_gpio_platdata_to_priv()
213 priv->type = driver_data; in mpc8xxx_gpio_platdata_to_priv()
218 static int mpc8xxx_gpio_probe(struct udevice *dev) in mpc8xxx_gpio_probe()
226 snprintf(name, sizeof(name), "MPC@%lx_", data->addr); in mpc8xxx_gpio_probe()
230 return -ENOMEM; in mpc8xxx_gpio_probe()
232 uc_priv->bank_name = str; in mpc8xxx_gpio_probe()
233 uc_priv->gpio_count = data->gpio_count; in mpc8xxx_gpio_probe()
249 { .compatible = "fsl,pq3-gpio", .data = MPC8XXX_GPIO_TYPE },
250 { .compatible = "fsl,mpc8308-gpio", .data = MPC8XXX_GPIO_TYPE },
251 { .compatible = "fsl,mpc8349-gpio", .data = MPC8XXX_GPIO_TYPE },
252 { .compatible = "fsl,mpc8572-gpio", .data = MPC8XXX_GPIO_TYPE},
253 { .compatible = "fsl,mpc8610-gpio", .data = MPC8XXX_GPIO_TYPE},
254 { .compatible = "fsl,mpc5121-gpio", .data = MPC5121_GPIO_TYPE, },
255 { .compatible = "fsl,qoriq-gpio", .data = MPC8XXX_GPIO_TYPE },