gpiomux.h 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. /* Copyright (c) 2010, Code Aurora Forum. All rights reserved.
  2. *
  3. * This program is free software; you can redistribute it and/or modify
  4. * it under the terms of the GNU General Public License version 2 and
  5. * only version 2 as published by the Free Software Foundation.
  6. *
  7. * This program is distributed in the hope that it will be useful,
  8. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. * GNU General Public License for more details.
  11. *
  12. * You should have received a copy of the GNU General Public License
  13. * along with this program; if not, write to the Free Software
  14. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
  15. * 02110-1301, USA.
  16. */
  17. #ifndef __ARCH_ARM_MACH_MSM_GPIOMUX_H
  18. #define __ARCH_ARM_MACH_MSM_GPIOMUX_H
  19. #include <linux/bitops.h>
  20. #include <linux/errno.h>
  21. #if defined(CONFIG_MSM_V2_TLMM)
  22. #include "gpiomux-v2.h"
  23. #else
  24. #include "gpiomux-v1.h"
  25. #endif
  26. /**
  27. * struct msm_gpiomux_config: gpiomux settings for one gpio line.
  28. *
  29. * A complete gpiomux config is the bitwise-or of a drive-strength,
  30. * function, and pull. For functions other than GPIO, the OE
  31. * is hard-wired according to the function. For GPIO mode,
  32. * OE is controlled by gpiolib.
  33. *
  34. * Available settings differ by target; see the gpiomux header
  35. * specific to your target arch for available configurations.
  36. *
  37. * @active: The configuration to be installed when the line is
  38. * active, or its reference count is > 0.
  39. * @suspended: The configuration to be installed when the line
  40. * is suspended, or its reference count is 0.
  41. * @ref: The reference count of the line. For internal use of
  42. * the gpiomux framework only.
  43. */
  44. struct msm_gpiomux_config {
  45. gpiomux_config_t active;
  46. gpiomux_config_t suspended;
  47. unsigned ref;
  48. };
  49. /**
  50. * @GPIOMUX_VALID: If set, the config field contains 'good data'.
  51. * The absence of this bit will prevent the gpiomux
  52. * system from applying the configuration under all
  53. * circumstances.
  54. */
  55. enum {
  56. GPIOMUX_VALID = BIT(sizeof(gpiomux_config_t) * BITS_PER_BYTE - 1),
  57. GPIOMUX_CTL_MASK = GPIOMUX_VALID,
  58. };
  59. #ifdef CONFIG_MSM_GPIOMUX
  60. /* Each architecture must provide its own instance of this table.
  61. * To avoid having gpiomux manage any given gpio, one or both of
  62. * the entries can avoid setting GPIOMUX_VALID - the absence
  63. * of that flag will prevent the configuration from being applied
  64. * during state transitions.
  65. */
  66. extern struct msm_gpiomux_config msm_gpiomux_configs[GPIOMUX_NGPIOS];
  67. /* Increment a gpio's reference count, possibly activating the line. */
  68. int __must_check msm_gpiomux_get(unsigned gpio);
  69. /* Decrement a gpio's reference count, possibly suspending the line. */
  70. int msm_gpiomux_put(unsigned gpio);
  71. /* Install a new configuration to the gpio line. To avoid overwriting
  72. * a configuration, leave the VALID bit out.
  73. */
  74. int msm_gpiomux_write(unsigned gpio,
  75. gpiomux_config_t active,
  76. gpiomux_config_t suspended);
  77. /* Architecture-internal function for use by the framework only.
  78. * This function can assume the following:
  79. * - the gpio value has passed a bounds-check
  80. * - the gpiomux spinlock has been obtained
  81. *
  82. * This function is not for public consumption. External users
  83. * should use msm_gpiomux_write.
  84. */
  85. void __msm_gpiomux_write(unsigned gpio, gpiomux_config_t val);
  86. #else
  87. static inline int __must_check msm_gpiomux_get(unsigned gpio)
  88. {
  89. return -ENOSYS;
  90. }
  91. static inline int msm_gpiomux_put(unsigned gpio)
  92. {
  93. return -ENOSYS;
  94. }
  95. static inline int msm_gpiomux_write(unsigned gpio,
  96. gpiomux_config_t active,
  97. gpiomux_config_t suspended)
  98. {
  99. return -ENOSYS;
  100. }
  101. #endif
  102. #endif