portmux-gpio.c 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. /*
  2. * Copyright (C) 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. /* Both pull-up and pull-down set means buskeeper */
  14. if (flags & PORTMUX_PULL_DOWN)
  15. gpio_writel(port, PDERS, pin_mask);
  16. else
  17. gpio_writel(port, PDERC, pin_mask);
  18. if (flags & PORTMUX_PULL_UP)
  19. gpio_writel(port, PUERS, pin_mask);
  20. else
  21. gpio_writel(port, PUERC, pin_mask);
  22. /* Select drive strength */
  23. if (flags & PORTMUX_DRIVE_LOW)
  24. gpio_writel(port, ODCR0S, pin_mask);
  25. else
  26. gpio_writel(port, ODCR0C, pin_mask);
  27. if (flags & PORTMUX_DRIVE_HIGH)
  28. gpio_writel(port, ODCR1S, pin_mask);
  29. else
  30. gpio_writel(port, ODCR1C, pin_mask);
  31. /* Select function */
  32. if (func & PORTMUX_FUNC_B)
  33. gpio_writel(port, PMR0S, pin_mask);
  34. else
  35. gpio_writel(port, PMR0C, pin_mask);
  36. if (func & PORTMUX_FUNC_C)
  37. gpio_writel(port, PMR1S, pin_mask);
  38. else
  39. gpio_writel(port, PMR1C, pin_mask);
  40. /* Disable GPIO (i.e. enable peripheral) */
  41. gpio_writel(port, GPERC, pin_mask);
  42. }
  43. void portmux_select_gpio(void *port, unsigned long pin_mask,
  44. unsigned long flags)
  45. {
  46. /* Both pull-up and pull-down set means buskeeper */
  47. if (flags & PORTMUX_PULL_DOWN)
  48. gpio_writel(port, PDERS, pin_mask);
  49. else
  50. gpio_writel(port, PDERC, pin_mask);
  51. if (flags & PORTMUX_PULL_UP)
  52. gpio_writel(port, PUERS, pin_mask);
  53. else
  54. gpio_writel(port, PUERC, pin_mask);
  55. /* Enable open-drain mode if requested */
  56. if (flags & PORTMUX_OPEN_DRAIN)
  57. gpio_writel(port, ODMERS, pin_mask);
  58. else
  59. gpio_writel(port, ODMERC, pin_mask);
  60. /* Select drive strength */
  61. if (flags & PORTMUX_DRIVE_LOW)
  62. gpio_writel(port, ODCR0S, pin_mask);
  63. else
  64. gpio_writel(port, ODCR0C, pin_mask);
  65. if (flags & PORTMUX_DRIVE_HIGH)
  66. gpio_writel(port, ODCR1S, pin_mask);
  67. else
  68. gpio_writel(port, ODCR1C, pin_mask);
  69. /* Select direction and initial pin state */
  70. if (flags & PORTMUX_DIR_OUTPUT) {
  71. if (flags & PORTMUX_INIT_HIGH)
  72. gpio_writel(port, OVRS, pin_mask);
  73. else
  74. gpio_writel(port, OVRC, pin_mask);
  75. gpio_writel(port, ODERS, pin_mask);
  76. } else {
  77. gpio_writel(port, ODERC, pin_mask);
  78. }
  79. /* Enable GPIO */
  80. gpio_writel(port, GPERS, pin_mask);
  81. }