portmux-pio.c 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. /*
  2. * Copyright (C) 2006, 2008 Atmel Corporation
  3. *
  4. * SPDX-License-Identifier: GPL-2.0+
  5. */
  6. #include <common.h>
  7. #include <asm/io.h>
  8. #include <asm/arch/hardware.h>
  9. #include <asm/arch/gpio.h>
  10. void portmux_select_peripheral(void *port, unsigned long pin_mask,
  11. enum portmux_function func, unsigned long flags)
  12. {
  13. if (flags & PORTMUX_PULL_UP)
  14. pio_writel(port, PUER, pin_mask);
  15. else
  16. pio_writel(port, PUDR, pin_mask);
  17. switch (func) {
  18. case PORTMUX_FUNC_A:
  19. pio_writel(port, ASR, pin_mask);
  20. break;
  21. case PORTMUX_FUNC_B:
  22. pio_writel(port, BSR, pin_mask);
  23. break;
  24. }
  25. pio_writel(port, PDR, pin_mask);
  26. }
  27. void portmux_select_gpio(void *port, unsigned long pin_mask,
  28. unsigned long flags)
  29. {
  30. if (flags & PORTMUX_PULL_UP)
  31. pio_writel(port, PUER, pin_mask);
  32. else
  33. pio_writel(port, PUDR, pin_mask);
  34. if (flags & PORTMUX_OPEN_DRAIN)
  35. pio_writel(port, MDER, pin_mask);
  36. else
  37. pio_writel(port, MDDR, pin_mask);
  38. if (flags & PORTMUX_DIR_OUTPUT) {
  39. if (flags & PORTMUX_INIT_HIGH)
  40. pio_writel(port, SODR, pin_mask);
  41. else
  42. pio_writel(port, CODR, pin_mask);
  43. pio_writel(port, OER, pin_mask);
  44. } else {
  45. pio_writel(port, ODR, pin_mask);
  46. }
  47. pio_writel(port, PER, pin_mask);
  48. }
  49. void pio_set_output_value(unsigned int pin, int value)
  50. {
  51. void *port = pio_pin_to_port(pin);
  52. if (!port)
  53. panic("Invalid GPIO pin %u\n", pin);
  54. __pio_set_output_value(port, pin & 0x1f, value);
  55. }
  56. int pio_get_input_value(unsigned int pin)
  57. {
  58. void *port = pio_pin_to_port(pin);
  59. if (!port)
  60. panic("Invalid GPIO pin %u\n", pin);
  61. return __pio_get_input_value(port, pin & 0x1f);
  62. }