1
2
3
4
5
6
7
8
9
10#include <config.h>
11#include <common.h>
12#include <clk.h>
13#include <dm.h>
14#include <malloc.h>
15#include <asm/io.h>
16#include <linux/sizes.h>
17#include <asm/gpio.h>
18#include <asm/arch/hardware.h>
19#include <asm/arch/at91_pio.h>
20
21#define GPIO_PER_BANK 32
22
23static struct at91_port *at91_pio_get_port(unsigned port)
24{
25 switch (port) {
26 case AT91_PIO_PORTA:
27 return (struct at91_port *)ATMEL_BASE_PIOA;
28 case AT91_PIO_PORTB:
29 return (struct at91_port *)ATMEL_BASE_PIOB;
30 case AT91_PIO_PORTC:
31 return (struct at91_port *)ATMEL_BASE_PIOC;
32#if (ATMEL_PIO_PORTS > 3)
33 case AT91_PIO_PORTD:
34 return (struct at91_port *)ATMEL_BASE_PIOD;
35#if (ATMEL_PIO_PORTS > 4)
36 case AT91_PIO_PORTE:
37 return (struct at91_port *)ATMEL_BASE_PIOE;
38#endif
39#endif
40 default:
41 printf("Error: at91_gpio: Fail to get PIO base!\n");
42 return NULL;
43 }
44}
45
46static void at91_set_port_pullup(struct at91_port *at91_port, unsigned offset,
47 int use_pullup)
48{
49 u32 mask;
50
51 mask = 1 << offset;
52 if (use_pullup)
53 writel(mask, &at91_port->puer);
54 else
55 writel(mask, &at91_port->pudr);
56 writel(mask, &at91_port->per);
57}
58
59int at91_set_pio_pullup(unsigned port, unsigned pin, int use_pullup)
60{
61 struct at91_port *at91_port = at91_pio_get_port(port);
62
63 if (at91_port && (pin < GPIO_PER_BANK))
64 at91_set_port_pullup(at91_port, pin, use_pullup);
65
66 return 0;
67}
68
69
70
71
72int at91_set_pio_periph(unsigned port, unsigned pin, int use_pullup)
73{
74 struct at91_port *at91_port = at91_pio_get_port(port);
75 u32 mask;
76
77 if (at91_port && (pin < GPIO_PER_BANK)) {
78 mask = 1 << pin;
79 writel(mask, &at91_port->idr);
80 at91_set_pio_pullup(port, pin, use_pullup);
81 writel(mask, &at91_port->per);
82 }
83
84 return 0;
85}
86
87
88
89
90int at91_set_a_periph(unsigned port, unsigned pin, int use_pullup)
91{
92 struct at91_port *at91_port = at91_pio_get_port(port);
93 u32 mask;
94
95 if (at91_port && (pin < GPIO_PER_BANK)) {
96 mask = 1 << pin;
97 writel(mask, &at91_port->idr);
98 at91_set_pio_pullup(port, pin, use_pullup);
99 writel(mask, &at91_port->mux.pio2.asr);
100 writel(mask, &at91_port->pdr);
101 }
102
103 return 0;
104}
105
106
107
108
109int at91_set_b_periph(unsigned port, unsigned pin, int use_pullup)
110{
111 struct at91_port *at91_port = at91_pio_get_port(port);
112 u32 mask;
113
114 if (at91_port && (pin < GPIO_PER_BANK)) {
115 mask = 1 << pin;
116 writel(mask, &at91_port->idr);
117 at91_set_pio_pullup(port, pin, use_pullup);
118 writel(mask, &at91_port->mux.pio2.bsr);
119 writel(mask, &at91_port->pdr);
120 }
121
122 return 0;
123}
124
125
126
127
128int at91_pio3_set_a_periph(unsigned port, unsigned pin, int use_pullup)
129{
130 struct at91_port *at91_port = at91_pio_get_port(port);
131 u32 mask;
132
133 if (at91_port && (pin < GPIO_PER_BANK)) {
134 mask = 1 << pin;
135 writel(mask, &at91_port->idr);
136 at91_set_pio_pullup(port, pin, use_pullup);
137 writel(readl(&at91_port->mux.pio3.abcdsr1) & ~mask,
138 &at91_port->mux.pio3.abcdsr1);
139 writel(readl(&at91_port->mux.pio3.abcdsr2) & ~mask,
140 &at91_port->mux.pio3.abcdsr2);
141
142 writel(mask, &at91_port->pdr);
143 }
144
145 return 0;
146}
147
148
149
150
151int at91_pio3_set_b_periph(unsigned port, unsigned pin, int use_pullup)
152{
153 struct at91_port *at91_port = at91_pio_get_port(port);
154 u32 mask;
155
156 if (at91_port && (pin < GPIO_PER_BANK)) {
157 mask = 1 << pin;
158 writel(mask, &at91_port->idr);
159 at91_set_pio_pullup(port, pin, use_pullup);
160 writel(readl(&at91_port->mux.pio3.abcdsr1) | mask,
161 &at91_port->mux.pio3.abcdsr1);
162 writel(readl(&at91_port->mux.pio3.abcdsr2) & ~mask,
163 &at91_port->mux.pio3.abcdsr2);
164
165 writel(mask, &at91_port->pdr);
166 }
167
168 return 0;
169}
170
171
172
173int at91_pio3_set_c_periph(unsigned port, unsigned pin, int use_pullup)
174{
175 struct at91_port *at91_port = at91_pio_get_port(port);
176 u32 mask;
177
178 if (at91_port && (pin < GPIO_PER_BANK)) {
179 mask = 1 << pin;
180 writel(mask, &at91_port->idr);
181 at91_set_pio_pullup(port, pin, use_pullup);
182 writel(readl(&at91_port->mux.pio3.abcdsr1) & ~mask,
183 &at91_port->mux.pio3.abcdsr1);
184 writel(readl(&at91_port->mux.pio3.abcdsr2) | mask,
185 &at91_port->mux.pio3.abcdsr2);
186 writel(mask, &at91_port->pdr);
187 }
188
189 return 0;
190}
191
192
193
194
195int at91_pio3_set_d_periph(unsigned port, unsigned pin, int use_pullup)
196{
197 struct at91_port *at91_port = at91_pio_get_port(port);
198 u32 mask;
199
200 if (at91_port && (pin < GPIO_PER_BANK)) {
201 mask = 1 << pin;
202 writel(mask, &at91_port->idr);
203 at91_set_pio_pullup(port, pin, use_pullup);
204 writel(readl(&at91_port->mux.pio3.abcdsr1) | mask,
205 &at91_port->mux.pio3.abcdsr1);
206 writel(readl(&at91_port->mux.pio3.abcdsr2) | mask,
207 &at91_port->mux.pio3.abcdsr2);
208 writel(mask, &at91_port->pdr);
209 }
210
211 return 0;
212}
213
214#if CONFIG_IS_ENABLED(DM_GPIO)
215static bool at91_get_port_output(struct at91_port *at91_port, int offset)
216{
217 u32 mask, val;
218
219 mask = 1 << offset;
220 val = readl(&at91_port->osr);
221 return val & mask;
222}
223#endif
224
225static void at91_set_port_input(struct at91_port *at91_port, int offset,
226 int use_pullup)
227{
228 u32 mask;
229
230 mask = 1 << offset;
231 writel(mask, &at91_port->idr);
232 at91_set_port_pullup(at91_port, offset, use_pullup);
233 writel(mask, &at91_port->odr);
234 writel(mask, &at91_port->per);
235}
236
237
238
239
240
241int at91_set_pio_input(unsigned port, u32 pin, int use_pullup)
242{
243 struct at91_port *at91_port = at91_pio_get_port(port);
244
245 if (at91_port && (pin < GPIO_PER_BANK))
246 at91_set_port_input(at91_port, pin, use_pullup);
247
248 return 0;
249}
250
251static void at91_set_port_output(struct at91_port *at91_port, int offset,
252 int value)
253{
254 u32 mask;
255
256 mask = 1 << offset;
257 writel(mask, &at91_port->idr);
258 writel(mask, &at91_port->pudr);
259 if (value)
260 writel(mask, &at91_port->sodr);
261 else
262 writel(mask, &at91_port->codr);
263 writel(mask, &at91_port->oer);
264 writel(mask, &at91_port->per);
265}
266
267
268
269
270
271int at91_set_pio_output(unsigned port, u32 pin, int value)
272{
273 struct at91_port *at91_port = at91_pio_get_port(port);
274
275 if (at91_port && (pin < GPIO_PER_BANK))
276 at91_set_port_output(at91_port, pin, value);
277
278 return 0;
279}
280
281
282
283
284int at91_set_pio_deglitch(unsigned port, unsigned pin, int is_on)
285{
286 struct at91_port *at91_port = at91_pio_get_port(port);
287 u32 mask;
288
289 if (at91_port && (pin < GPIO_PER_BANK)) {
290 mask = 1 << pin;
291 if (is_on)
292 writel(mask, &at91_port->ifer);
293 else
294 writel(mask, &at91_port->ifdr);
295 }
296
297 return 0;
298}
299
300
301
302
303int at91_pio3_set_pio_deglitch(unsigned port, unsigned pin, int is_on)
304{
305 struct at91_port *at91_port = at91_pio_get_port(port);
306 u32 mask;
307
308 if (at91_port && (pin < GPIO_PER_BANK)) {
309 mask = 1 << pin;
310 if (is_on) {
311 writel(mask, &at91_port->mux.pio3.ifscdr);
312 writel(mask, &at91_port->ifer);
313 } else {
314 writel(mask, &at91_port->ifdr);
315 }
316 }
317
318 return 0;
319}
320
321
322
323
324int at91_pio3_set_pio_debounce(unsigned port, unsigned pin, int is_on, int div)
325{
326 struct at91_port *at91_port = at91_pio_get_port(port);
327 u32 mask;
328
329 if (at91_port && (pin < GPIO_PER_BANK)) {
330 mask = 1 << pin;
331 if (is_on) {
332 writel(mask, &at91_port->mux.pio3.ifscer);
333 writel(div & PIO_SCDR_DIV, &at91_port->mux.pio3.scdr);
334 writel(mask, &at91_port->ifer);
335 } else {
336 writel(mask, &at91_port->ifdr);
337 }
338 }
339
340 return 0;
341}
342
343
344
345
346
347int at91_pio3_set_pio_pulldown(unsigned port, unsigned pin, int is_on)
348{
349 struct at91_port *at91_port = at91_pio_get_port(port);
350 u32 mask;
351
352 if (at91_port && (pin < GPIO_PER_BANK)) {
353 mask = 1 << pin;
354 if (is_on) {
355 at91_set_pio_pullup(port, pin, 0);
356 writel(mask, &at91_port->mux.pio3.ppder);
357 } else
358 writel(mask, &at91_port->mux.pio3.ppddr);
359 }
360
361 return 0;
362}
363
364int at91_pio3_set_pio_pullup(unsigned port, unsigned pin, int use_pullup)
365{
366 struct at91_port *at91_port = at91_pio_get_port(port);
367
368 if (use_pullup)
369 at91_pio3_set_pio_pulldown(port, pin, 0);
370
371 if (at91_port && (pin < GPIO_PER_BANK))
372 at91_set_port_pullup(at91_port, pin, use_pullup);
373
374 return 0;
375}
376
377
378
379
380int at91_pio3_set_pio_disable_schmitt_trig(unsigned port, unsigned pin)
381{
382 struct at91_port *at91_port = at91_pio_get_port(port);
383 u32 mask;
384
385 if (at91_port && (pin < GPIO_PER_BANK)) {
386 mask = 1 << pin;
387 writel(readl(&at91_port->schmitt) | mask,
388 &at91_port->schmitt);
389 }
390
391 return 0;
392}
393
394
395
396
397
398int at91_set_pio_multi_drive(unsigned port, unsigned pin, int is_on)
399{
400 struct at91_port *at91_port = at91_pio_get_port(port);
401 u32 mask;
402
403 if (at91_port && (pin < GPIO_PER_BANK)) {
404 mask = 1 << pin;
405 if (is_on)
406 writel(mask, &at91_port->mder);
407 else
408 writel(mask, &at91_port->mddr);
409 }
410
411 return 0;
412}
413
414static void at91_set_port_value(struct at91_port *at91_port, int offset,
415 int value)
416{
417 u32 mask;
418
419 mask = 1 << offset;
420 if (value)
421 writel(mask, &at91_port->sodr);
422 else
423 writel(mask, &at91_port->codr);
424}
425
426
427
428
429int at91_set_pio_value(unsigned port, unsigned pin, int value)
430{
431 struct at91_port *at91_port = at91_pio_get_port(port);
432
433 if (at91_port && (pin < GPIO_PER_BANK))
434 at91_set_port_value(at91_port, pin, value);
435
436 return 0;
437}
438
439static int at91_get_port_value(struct at91_port *at91_port, int offset)
440{
441 u32 pdsr = 0, mask;
442
443 mask = 1 << offset;
444 pdsr = readl(&at91_port->pdsr) & mask;
445
446 return pdsr != 0;
447}
448
449
450
451int at91_get_pio_value(unsigned port, unsigned pin)
452{
453 struct at91_port *at91_port = at91_pio_get_port(port);
454
455 if (at91_port && (pin < GPIO_PER_BANK))
456 return at91_get_port_value(at91_port, pin);
457
458 return 0;
459}
460
461#if !CONFIG_IS_ENABLED(DM_GPIO)
462
463
464int gpio_request(unsigned gpio, const char *label)
465{
466 return 0;
467}
468
469int gpio_free(unsigned gpio)
470{
471 return 0;
472}
473
474int gpio_direction_input(unsigned gpio)
475{
476 at91_set_pio_input(at91_gpio_to_port(gpio),
477 at91_gpio_to_pin(gpio), 0);
478 return 0;
479}
480
481int gpio_direction_output(unsigned gpio, int value)
482{
483 at91_set_pio_output(at91_gpio_to_port(gpio),
484 at91_gpio_to_pin(gpio), value);
485 return 0;
486}
487
488int gpio_get_value(unsigned gpio)
489{
490 return at91_get_pio_value(at91_gpio_to_port(gpio),
491 at91_gpio_to_pin(gpio));
492}
493
494int gpio_set_value(unsigned gpio, int value)
495{
496 at91_set_pio_value(at91_gpio_to_port(gpio),
497 at91_gpio_to_pin(gpio), value);
498
499 return 0;
500}
501#endif
502
503#if CONFIG_IS_ENABLED(DM_GPIO)
504
505struct at91_port_priv {
506 struct at91_port *regs;
507};
508
509
510static int at91_gpio_direction_input(struct udevice *dev, unsigned offset)
511{
512 struct at91_port_priv *port = dev_get_priv(dev);
513
514 at91_set_port_input(port->regs, offset, 0);
515
516 return 0;
517}
518
519
520static int at91_gpio_direction_output(struct udevice *dev, unsigned offset,
521 int value)
522{
523 struct at91_port_priv *port = dev_get_priv(dev);
524
525 at91_set_port_output(port->regs, offset, value);
526
527 return 0;
528}
529
530
531static int at91_gpio_get_value(struct udevice *dev, unsigned offset)
532{
533 struct at91_port_priv *port = dev_get_priv(dev);
534
535 return at91_get_port_value(port->regs, offset);
536}
537
538
539static int at91_gpio_set_value(struct udevice *dev, unsigned offset,
540 int value)
541{
542 struct at91_port_priv *port = dev_get_priv(dev);
543
544 at91_set_port_value(port->regs, offset, value);
545
546 return 0;
547}
548
549static int at91_gpio_get_function(struct udevice *dev, unsigned offset)
550{
551 struct at91_port_priv *port = dev_get_priv(dev);
552
553
554 if (at91_get_port_output(port->regs, offset))
555 return GPIOF_OUTPUT;
556 else
557 return GPIOF_INPUT;
558}
559
560static const char *at91_get_bank_name(uint32_t base_addr)
561{
562 switch (base_addr) {
563 case ATMEL_BASE_PIOA:
564 return "PIOA";
565 case ATMEL_BASE_PIOB:
566 return "PIOB";
567 case ATMEL_BASE_PIOC:
568 return "PIOC";
569#if (ATMEL_PIO_PORTS > 3)
570 case ATMEL_BASE_PIOD:
571 return "PIOD";
572#if (ATMEL_PIO_PORTS > 4)
573 case ATMEL_BASE_PIOE:
574 return "PIOE";
575#endif
576#endif
577 }
578
579 return "undefined";
580}
581
582static const struct dm_gpio_ops gpio_at91_ops = {
583 .direction_input = at91_gpio_direction_input,
584 .direction_output = at91_gpio_direction_output,
585 .get_value = at91_gpio_get_value,
586 .set_value = at91_gpio_set_value,
587 .get_function = at91_gpio_get_function,
588};
589
590static int at91_gpio_probe(struct udevice *dev)
591{
592 struct at91_port_priv *port = dev_get_priv(dev);
593 struct at91_port_plat *plat = dev_get_plat(dev);
594 struct gpio_dev_priv *uc_priv = dev_get_uclass_priv(dev);
595 struct clk clk;
596 int ret;
597
598 ret = clk_get_by_index(dev, 0, &clk);
599 if (ret)
600 return ret;
601
602 ret = clk_enable(&clk);
603 if (ret)
604 return ret;
605
606 clk_free(&clk);
607
608#if CONFIG_IS_ENABLED(OF_CONTROL)
609 plat->base_addr = dev_read_addr(dev);
610#endif
611 plat->bank_name = at91_get_bank_name(plat->base_addr);
612 port->regs = (struct at91_port *)plat->base_addr;
613
614 uc_priv->bank_name = plat->bank_name;
615 uc_priv->gpio_count = GPIO_PER_BANK;
616
617 return 0;
618}
619
620#if CONFIG_IS_ENABLED(OF_CONTROL)
621static const struct udevice_id at91_gpio_ids[] = {
622 { .compatible = "atmel,at91rm9200-gpio" },
623 { }
624};
625#endif
626
627U_BOOT_DRIVER(atmel_at91rm9200_gpio) = {
628 .name = "atmel_at91rm9200_gpio",
629 .id = UCLASS_GPIO,
630#if CONFIG_IS_ENABLED(OF_CONTROL)
631 .of_match = at91_gpio_ids,
632 .plat_auto = sizeof(struct at91_port_plat),
633#endif
634 .ops = &gpio_at91_ops,
635 .probe = at91_gpio_probe,
636 .priv_auto = sizeof(struct at91_port_priv),
637};
638#endif
639