gpio.h 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. #ifndef __DIAG_GPIO_H
  2. #define __DIAG_GPIO_H
  3. #include <linux/interrupt.h>
  4. #ifndef BCMDRIVER
  5. #include <linux/ssb/ssb.h>
  6. #include <linux/ssb/ssb_driver_chipcommon.h>
  7. #include <linux/ssb/ssb_driver_extif.h>
  8. extern struct ssb_bus ssb;
  9. #define gpio_op(op, param...) \
  10. do { \
  11. if (ssb.chipco.dev) \
  12. return ssb_chipco_gpio_##op(&ssb.chipco, param); \
  13. else if (ssb.extif.dev) \
  14. return ssb_extif_gpio_##op(&ssb.extif, param); \
  15. else \
  16. return 0; \
  17. } while (0);
  18. static inline u32 gpio_in(void)
  19. {
  20. gpio_op(in, ~0);
  21. }
  22. static inline u32 gpio_out(u32 mask, u32 value)
  23. {
  24. gpio_op(out, mask, value);
  25. }
  26. static inline u32 gpio_outen(u32 mask, u32 value)
  27. {
  28. gpio_op(outen, mask, value);
  29. }
  30. static inline u32 gpio_control(u32 mask, u32 value)
  31. {
  32. if (ssb.chipco.dev)
  33. return ssb_chipco_gpio_control(&ssb.chipco, mask, value);
  34. else
  35. return 0;
  36. }
  37. static inline u32 gpio_intmask(u32 mask, u32 value)
  38. {
  39. gpio_op(intmask, mask, value);
  40. }
  41. static inline u32 gpio_intpolarity(u32 mask, u32 value)
  42. {
  43. gpio_op(polarity, mask, value);
  44. }
  45. static void gpio_set_irqenable(int enabled, irqreturn_t (*handler)(int, void *))
  46. {
  47. int irq;
  48. if (ssb.chipco.dev)
  49. irq = ssb_mips_irq(ssb.chipco.dev) + 2;
  50. else if (ssb.extif.dev)
  51. irq = ssb_mips_irq(ssb.extif.dev) + 2;
  52. else return;
  53. if (enabled) {
  54. if (request_irq(irq, handler, IRQF_SHARED | IRQF_SAMPLE_RANDOM, "gpio", handler))
  55. return;
  56. } else {
  57. free_irq(irq, handler);
  58. }
  59. if (ssb.chipco.dev)
  60. ssb_write32_masked(ssb.chipco.dev, SSB_CHIPCO_IRQMASK, SSB_CHIPCO_IRQ_GPIO, (enabled ? SSB_CHIPCO_IRQ_GPIO : 0));
  61. }
  62. #else
  63. #include <typedefs.h>
  64. #include <osl.h>
  65. #include <bcmdevs.h>
  66. #include <sbutils.h>
  67. #include <sbconfig.h>
  68. #include <sbchipc.h>
  69. #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
  70. #include <sbmips.h>
  71. #else
  72. #include <hndcpu.h>
  73. #endif
  74. #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
  75. #define sbh bcm947xx_sbh
  76. #define sbh_lock bcm947xx_sbh_lock
  77. #endif
  78. extern void *sbh;
  79. extern spinlock_t sbh_lock;
  80. #define gpio_in() sb_gpioin(sbh)
  81. #define gpio_out(mask, value) sb_gpioout(sbh, mask, ((value) & (mask)), GPIO_DRV_PRIORITY)
  82. #define gpio_outen(mask, value) sb_gpioouten(sbh, mask, value, GPIO_DRV_PRIORITY)
  83. #define gpio_control(mask, value) sb_gpiocontrol(sbh, mask, value, GPIO_DRV_PRIORITY)
  84. #define gpio_intmask(mask, value) sb_gpiointmask(sbh, mask, value, GPIO_DRV_PRIORITY)
  85. #define gpio_intpolarity(mask, value) sb_gpiointpolarity(sbh, mask, value, GPIO_DRV_PRIORITY)
  86. static void gpio_set_irqenable(int enabled, irqreturn_t (*handler)(int, void *, struct pt_regs *))
  87. {
  88. unsigned int coreidx;
  89. unsigned long flags;
  90. chipcregs_t *cc;
  91. int irq;
  92. spin_lock_irqsave(sbh_lock, flags);
  93. coreidx = sb_coreidx(sbh);
  94. irq = sb_irq(sbh) + 2;
  95. if (enabled)
  96. request_irq(irq, handler, SA_SHIRQ | SA_SAMPLE_RANDOM, "gpio", handler);
  97. else
  98. free_irq(irq, handler);
  99. if ((cc = sb_setcore(sbh, SB_CC, 0))) {
  100. int intmask;
  101. intmask = readl(&cc->intmask);
  102. if (enabled)
  103. intmask |= CI_GPIO;
  104. else
  105. intmask &= ~CI_GPIO;
  106. writel(intmask, &cc->intmask);
  107. }
  108. sb_setcoreidx(sbh, coreidx);
  109. spin_unlock_irqrestore(sbh_lock, flags);
  110. }
  111. #endif /* BCMDRIVER */
  112. #define EXTIF_ADDR 0x1f000000
  113. #define EXTIF_UART (EXTIF_ADDR + 0x00800000)
  114. #define GPIO_TYPE_NORMAL (0x0 << 24)
  115. #define GPIO_TYPE_EXTIF (0x1 << 24)
  116. #define GPIO_TYPE_MASK (0xf << 24)
  117. static inline void gpio_set_extif(int gpio, int value)
  118. {
  119. volatile u8 *addr = (volatile u8 *) KSEG1ADDR(EXTIF_UART) + (gpio & ~GPIO_TYPE_MASK);
  120. if (value)
  121. *addr = 0xFF;
  122. else
  123. *addr;
  124. }
  125. #endif /* __DIAG_GPIO_H */