3 * Guennadi Liakhovetski, DENX Software Engineering, <lg@denx.de>
6 * Stefano Babic, DENX Software Engineering, <sbabic@denx.de>
8 * SPDX-License-Identifier: GPL-2.0+
14 #include <asm/arch/imx-regs.h>
18 enum mxc_gpio_direction
{
19 MXC_GPIO_DIRECTION_IN
,
20 MXC_GPIO_DIRECTION_OUT
,
23 #define GPIO_PER_BANK 32
25 struct mxc_gpio_plat
{
27 struct gpio_regs
*regs
;
30 struct mxc_bank_info
{
31 struct gpio_regs
*regs
;
34 #ifndef CONFIG_DM_GPIO
35 #define GPIO_TO_PORT(n) (n / 32)
37 /* GPIO port description */
38 static unsigned long gpio_ports
[] = {
39 [0] = GPIO1_BASE_ADDR
,
40 [1] = GPIO2_BASE_ADDR
,
41 [2] = GPIO3_BASE_ADDR
,
42 #if defined(CONFIG_MX25) || defined(CONFIG_MX27) || defined(CONFIG_MX51) || \
43 defined(CONFIG_MX53) || defined(CONFIG_MX6) || \
45 [3] = GPIO4_BASE_ADDR
,
47 #if defined(CONFIG_MX27) || defined(CONFIG_MX53) || defined(CONFIG_MX6) || \
49 [4] = GPIO5_BASE_ADDR
,
51 [5] = GPIO6_BASE_ADDR
,
54 #if defined(CONFIG_MX53) || defined(CONFIG_MX6) || defined(CONFIG_MX7)
56 [6] = GPIO7_BASE_ADDR
,
61 static int mxc_gpio_direction(unsigned int gpio
,
62 enum mxc_gpio_direction direction
)
64 unsigned int port
= GPIO_TO_PORT(gpio
);
65 struct gpio_regs
*regs
;
68 if (port
>= ARRAY_SIZE(gpio_ports
))
73 regs
= (struct gpio_regs
*)gpio_ports
[port
];
75 l
= readl(®s
->gpio_dir
);
78 case MXC_GPIO_DIRECTION_OUT
:
81 case MXC_GPIO_DIRECTION_IN
:
84 writel(l
, ®s
->gpio_dir
);
89 int gpio_set_value(unsigned gpio
, int value
)
91 unsigned int port
= GPIO_TO_PORT(gpio
);
92 struct gpio_regs
*regs
;
95 if (port
>= ARRAY_SIZE(gpio_ports
))
100 regs
= (struct gpio_regs
*)gpio_ports
[port
];
102 l
= readl(®s
->gpio_dr
);
107 writel(l
, ®s
->gpio_dr
);
112 int gpio_get_value(unsigned gpio
)
114 unsigned int port
= GPIO_TO_PORT(gpio
);
115 struct gpio_regs
*regs
;
118 if (port
>= ARRAY_SIZE(gpio_ports
))
123 regs
= (struct gpio_regs
*)gpio_ports
[port
];
125 val
= (readl(®s
->gpio_psr
) >> gpio
) & 0x01;
130 int gpio_request(unsigned gpio
, const char *label
)
132 unsigned int port
= GPIO_TO_PORT(gpio
);
133 if (port
>= ARRAY_SIZE(gpio_ports
))
138 int gpio_free(unsigned gpio
)
143 int gpio_direction_input(unsigned gpio
)
145 return mxc_gpio_direction(gpio
, MXC_GPIO_DIRECTION_IN
);
148 int gpio_direction_output(unsigned gpio
, int value
)
150 int ret
= gpio_set_value(gpio
, value
);
155 return mxc_gpio_direction(gpio
, MXC_GPIO_DIRECTION_OUT
);
159 #ifdef CONFIG_DM_GPIO
161 DECLARE_GLOBAL_DATA_PTR
;
163 static int mxc_gpio_is_output(struct gpio_regs
*regs
, int offset
)
167 val
= readl(®s
->gpio_dir
);
169 return val
& (1 << offset
) ? 1 : 0;
172 static void mxc_gpio_bank_direction(struct gpio_regs
*regs
, int offset
,
173 enum mxc_gpio_direction direction
)
177 l
= readl(®s
->gpio_dir
);
180 case MXC_GPIO_DIRECTION_OUT
:
183 case MXC_GPIO_DIRECTION_IN
:
186 writel(l
, ®s
->gpio_dir
);
189 static void mxc_gpio_bank_set_value(struct gpio_regs
*regs
, int offset
,
194 l
= readl(®s
->gpio_dr
);
199 writel(l
, ®s
->gpio_dr
);
202 static int mxc_gpio_bank_get_value(struct gpio_regs
*regs
, int offset
)
204 return (readl(®s
->gpio_psr
) >> offset
) & 0x01;
207 /* set GPIO pin 'gpio' as an input */
208 static int mxc_gpio_direction_input(struct udevice
*dev
, unsigned offset
)
210 struct mxc_bank_info
*bank
= dev_get_priv(dev
);
212 /* Configure GPIO direction as input. */
213 mxc_gpio_bank_direction(bank
->regs
, offset
, MXC_GPIO_DIRECTION_IN
);
218 /* set GPIO pin 'gpio' as an output, with polarity 'value' */
219 static int mxc_gpio_direction_output(struct udevice
*dev
, unsigned offset
,
222 struct mxc_bank_info
*bank
= dev_get_priv(dev
);
224 /* Configure GPIO output value. */
225 mxc_gpio_bank_set_value(bank
->regs
, offset
, value
);
227 /* Configure GPIO direction as output. */
228 mxc_gpio_bank_direction(bank
->regs
, offset
, MXC_GPIO_DIRECTION_OUT
);
233 /* read GPIO IN value of pin 'gpio' */
234 static int mxc_gpio_get_value(struct udevice
*dev
, unsigned offset
)
236 struct mxc_bank_info
*bank
= dev_get_priv(dev
);
238 return mxc_gpio_bank_get_value(bank
->regs
, offset
);
241 /* write GPIO OUT value to pin 'gpio' */
242 static int mxc_gpio_set_value(struct udevice
*dev
, unsigned offset
,
245 struct mxc_bank_info
*bank
= dev_get_priv(dev
);
247 mxc_gpio_bank_set_value(bank
->regs
, offset
, value
);
252 static int mxc_gpio_get_function(struct udevice
*dev
, unsigned offset
)
254 struct mxc_bank_info
*bank
= dev_get_priv(dev
);
256 /* GPIOF_FUNC is not implemented yet */
257 if (mxc_gpio_is_output(bank
->regs
, offset
))
263 static const struct dm_gpio_ops gpio_mxc_ops
= {
264 .direction_input
= mxc_gpio_direction_input
,
265 .direction_output
= mxc_gpio_direction_output
,
266 .get_value
= mxc_gpio_get_value
,
267 .set_value
= mxc_gpio_set_value
,
268 .get_function
= mxc_gpio_get_function
,
271 static int mxc_gpio_probe(struct udevice
*dev
)
273 struct mxc_bank_info
*bank
= dev_get_priv(dev
);
274 struct mxc_gpio_plat
*plat
= dev_get_platdata(dev
);
275 struct gpio_dev_priv
*uc_priv
= dev_get_uclass_priv(dev
);
279 banknum
= plat
->bank_index
;
280 sprintf(name
, "GPIO%d_", banknum
+ 1);
284 uc_priv
->bank_name
= str
;
285 uc_priv
->gpio_count
= GPIO_PER_BANK
;
286 bank
->regs
= plat
->regs
;
291 static int mxc_gpio_bind(struct udevice
*dev
)
293 struct mxc_gpio_plat
*plat
= dev
->platdata
;
297 * If platdata already exsits, directly return.
298 * Actually only when DT is not supported, platdata
299 * is statically initialized in U_BOOT_DEVICES.Here
305 addr
= dev_get_addr(dev
);
306 if (addr
== FDT_ADDR_T_NONE
)
311 * When every board is converted to driver model and DT is supported,
312 * this can be done by auto-alloc feature, but not using calloc
313 * to alloc memory for platdata.
315 plat
= calloc(1, sizeof(*plat
));
319 plat
->regs
= (struct gpio_regs
*)addr
;
320 plat
->bank_index
= dev
->req_seq
;
321 dev
->platdata
= plat
;
326 static const struct udevice_id mxc_gpio_ids
[] = {
327 { .compatible
= "fsl,imx35-gpio" },
331 U_BOOT_DRIVER(gpio_mxc
) = {
334 .ops
= &gpio_mxc_ops
,
335 .probe
= mxc_gpio_probe
,
336 .priv_auto_alloc_size
= sizeof(struct mxc_bank_info
),
337 .of_match
= mxc_gpio_ids
,
338 .bind
= mxc_gpio_bind
,
341 #if !CONFIG_IS_ENABLED(OF_CONTROL)
342 static const struct mxc_gpio_plat mxc_plat
[] = {
343 { 0, (struct gpio_regs
*)GPIO1_BASE_ADDR
},
344 { 1, (struct gpio_regs
*)GPIO2_BASE_ADDR
},
345 { 2, (struct gpio_regs
*)GPIO3_BASE_ADDR
},
346 #if defined(CONFIG_MX25) || defined(CONFIG_MX27) || defined(CONFIG_MX51) || \
347 defined(CONFIG_MX53) || defined(CONFIG_MX6)
348 { 3, (struct gpio_regs
*)GPIO4_BASE_ADDR
},
350 #if defined(CONFIG_MX27) || defined(CONFIG_MX53) || defined(CONFIG_MX6)
351 { 4, (struct gpio_regs
*)GPIO5_BASE_ADDR
},
352 { 5, (struct gpio_regs
*)GPIO6_BASE_ADDR
},
354 #if defined(CONFIG_MX53) || defined(CONFIG_MX6)
355 { 6, (struct gpio_regs
*)GPIO7_BASE_ADDR
},
359 U_BOOT_DEVICES(mxc_gpios
) = {
360 { "gpio_mxc", &mxc_plat
[0] },
361 { "gpio_mxc", &mxc_plat
[1] },
362 { "gpio_mxc", &mxc_plat
[2] },
363 #if defined(CONFIG_MX25) || defined(CONFIG_MX27) || defined(CONFIG_MX51) || \
364 defined(CONFIG_MX53) || defined(CONFIG_MX6)
365 { "gpio_mxc", &mxc_plat
[3] },
367 #if defined(CONFIG_MX27) || defined(CONFIG_MX53) || defined(CONFIG_MX6)
368 { "gpio_mxc", &mxc_plat
[4] },
369 { "gpio_mxc", &mxc_plat
[5] },
371 #if defined(CONFIG_MX53) || defined(CONFIG_MX6)
372 { "gpio_mxc", &mxc_plat
[6] },