iomux.h 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. /* SPDX-License-Identifier: GPL-2.0+ */
  2. /*
  3. * Copyright (C) 2009 by Jan Weitzel Phytec Messtechnik GmbH,
  4. * <armlinux@phytec.de>
  5. * Copyright (C) 2010 Freescale Semiconductor, Inc. All Rights Reserved.
  6. */
  7. #ifndef __MACH_MXS_IOMUX_H__
  8. #define __MACH_MXS_IOMUX_H__
  9. #ifndef __ASSEMBLY__
  10. #include <asm/types.h>
  11. /*
  12. * IOMUX/PAD Bit field definitions
  13. *
  14. * PAD_BANK: 0..2 (3)
  15. * PAD_PIN: 3..7 (5)
  16. * PAD_MUXSEL: 8..9 (2)
  17. * PAD_MA: 10..11 (2)
  18. * PAD_MA_VALID: 12 (1)
  19. * PAD_VOL: 13 (1)
  20. * PAD_VOL_VALID: 14 (1)
  21. * PAD_PULL: 15 (1)
  22. * PAD_PULL_VALID: 16 (1)
  23. * RESERVED: 17..31 (15)
  24. */
  25. typedef u32 iomux_cfg_t;
  26. #define MXS_PAD_BANK_SHIFT 0
  27. #define MXS_PAD_BANK_MASK ((iomux_cfg_t)0x7 << MXS_PAD_BANK_SHIFT)
  28. #define MXS_PAD_PIN_SHIFT 3
  29. #define MXS_PAD_PIN_MASK ((iomux_cfg_t)0x1f << MXS_PAD_PIN_SHIFT)
  30. #define MXS_PAD_MUXSEL_SHIFT 8
  31. #define MXS_PAD_MUXSEL_MASK ((iomux_cfg_t)0x3 << MXS_PAD_MUXSEL_SHIFT)
  32. #define MXS_PAD_MA_SHIFT 10
  33. #define MXS_PAD_MA_MASK ((iomux_cfg_t)0x3 << MXS_PAD_MA_SHIFT)
  34. #define MXS_PAD_MA_VALID_SHIFT 12
  35. #define MXS_PAD_MA_VALID_MASK ((iomux_cfg_t)0x1 << MXS_PAD_MA_VALID_SHIFT)
  36. #define MXS_PAD_VOL_SHIFT 13
  37. #define MXS_PAD_VOL_MASK ((iomux_cfg_t)0x1 << MXS_PAD_VOL_SHIFT)
  38. #define MXS_PAD_VOL_VALID_SHIFT 14
  39. #define MXS_PAD_VOL_VALID_MASK ((iomux_cfg_t)0x1 << MXS_PAD_VOL_VALID_SHIFT)
  40. #define MXS_PAD_PULL_SHIFT 15
  41. #define MXS_PAD_PULL_MASK ((iomux_cfg_t)0x1 << MXS_PAD_PULL_SHIFT)
  42. #define MXS_PAD_PULL_VALID_SHIFT 16
  43. #define MXS_PAD_PULL_VALID_MASK ((iomux_cfg_t)0x1 << MXS_PAD_PULL_VALID_SHIFT)
  44. #define PAD_MUXSEL_0 0
  45. #define PAD_MUXSEL_1 1
  46. #define PAD_MUXSEL_2 2
  47. #define PAD_MUXSEL_GPIO 3
  48. #define PAD_4MA 0
  49. #define PAD_8MA 1
  50. #define PAD_12MA 2
  51. #define PAD_16MA 3
  52. #define PAD_1V8 0
  53. #if defined(CONFIG_MX28)
  54. #define PAD_3V3 1
  55. #else
  56. #define PAD_3V3 0
  57. #endif
  58. #define PAD_NOPULL 0
  59. #define PAD_PULLUP 1
  60. #define MXS_PAD_4MA ((PAD_4MA << MXS_PAD_MA_SHIFT) | \
  61. MXS_PAD_MA_VALID_MASK)
  62. #define MXS_PAD_8MA ((PAD_8MA << MXS_PAD_MA_SHIFT) | \
  63. MXS_PAD_MA_VALID_MASK)
  64. #define MXS_PAD_12MA ((PAD_12MA << MXS_PAD_MA_SHIFT) | \
  65. MXS_PAD_MA_VALID_MASK)
  66. #define MXS_PAD_16MA ((PAD_16MA << MXS_PAD_MA_SHIFT) | \
  67. MXS_PAD_MA_VALID_MASK)
  68. #define MXS_PAD_1V8 ((PAD_1V8 << MXS_PAD_VOL_SHIFT) | \
  69. MXS_PAD_VOL_VALID_MASK)
  70. #define MXS_PAD_3V3 ((PAD_3V3 << MXS_PAD_VOL_SHIFT) | \
  71. MXS_PAD_VOL_VALID_MASK)
  72. #define MXS_PAD_NOPULL ((PAD_NOPULL << MXS_PAD_PULL_SHIFT) | \
  73. MXS_PAD_PULL_VALID_MASK)
  74. #define MXS_PAD_PULLUP ((PAD_PULLUP << MXS_PAD_PULL_SHIFT) | \
  75. MXS_PAD_PULL_VALID_MASK)
  76. /* generic pad control used in most cases */
  77. #define MXS_PAD_CTRL (MXS_PAD_4MA | MXS_PAD_3V3 | MXS_PAD_NOPULL)
  78. #define MXS_IOMUX_PAD(_bank, _pin, _muxsel, _ma, _vol, _pull) \
  79. (((iomux_cfg_t)(_bank) << MXS_PAD_BANK_SHIFT) | \
  80. ((iomux_cfg_t)(_pin) << MXS_PAD_PIN_SHIFT) | \
  81. ((iomux_cfg_t)(_muxsel) << MXS_PAD_MUXSEL_SHIFT) | \
  82. ((iomux_cfg_t)(_ma) << MXS_PAD_MA_SHIFT) | \
  83. ((iomux_cfg_t)(_vol) << MXS_PAD_VOL_SHIFT) | \
  84. ((iomux_cfg_t)(_pull) << MXS_PAD_PULL_SHIFT))
  85. /*
  86. * A pad becomes naked, when none of mA, vol or pull
  87. * validity bits is set.
  88. */
  89. #define MXS_IOMUX_PAD_NAKED(_bank, _pin, _muxsel) \
  90. MXS_IOMUX_PAD(_bank, _pin, _muxsel, 0, 0, 0)
  91. static inline unsigned int PAD_BANK(iomux_cfg_t pad)
  92. {
  93. return (pad & MXS_PAD_BANK_MASK) >> MXS_PAD_BANK_SHIFT;
  94. }
  95. static inline unsigned int PAD_PIN(iomux_cfg_t pad)
  96. {
  97. return (pad & MXS_PAD_PIN_MASK) >> MXS_PAD_PIN_SHIFT;
  98. }
  99. static inline unsigned int PAD_MUXSEL(iomux_cfg_t pad)
  100. {
  101. return (pad & MXS_PAD_MUXSEL_MASK) >> MXS_PAD_MUXSEL_SHIFT;
  102. }
  103. static inline unsigned int PAD_MA(iomux_cfg_t pad)
  104. {
  105. return (pad & MXS_PAD_MA_MASK) >> MXS_PAD_MA_SHIFT;
  106. }
  107. static inline unsigned int PAD_MA_VALID(iomux_cfg_t pad)
  108. {
  109. return (pad & MXS_PAD_MA_VALID_MASK) >> MXS_PAD_MA_VALID_SHIFT;
  110. }
  111. static inline unsigned int PAD_VOL(iomux_cfg_t pad)
  112. {
  113. return (pad & MXS_PAD_VOL_MASK) >> MXS_PAD_VOL_SHIFT;
  114. }
  115. static inline unsigned int PAD_VOL_VALID(iomux_cfg_t pad)
  116. {
  117. return (pad & MXS_PAD_VOL_VALID_MASK) >> MXS_PAD_VOL_VALID_SHIFT;
  118. }
  119. static inline unsigned int PAD_PULL(iomux_cfg_t pad)
  120. {
  121. return (pad & MXS_PAD_PULL_MASK) >> MXS_PAD_PULL_SHIFT;
  122. }
  123. static inline unsigned int PAD_PULL_VALID(iomux_cfg_t pad)
  124. {
  125. return (pad & MXS_PAD_PULL_VALID_MASK) >> MXS_PAD_PULL_VALID_SHIFT;
  126. }
  127. /*
  128. * configures a single pad in the iomuxer
  129. */
  130. int mxs_iomux_setup_pad(iomux_cfg_t pad);
  131. /*
  132. * configures multiple pads
  133. * convenient way to call the above function with tables
  134. */
  135. int mxs_iomux_setup_multiple_pads(const iomux_cfg_t *pad_list, unsigned count);
  136. #endif /* __ASSEMBLY__ */
  137. #endif /* __MACH_MXS_IOMUX_H__*/