gpio.c 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. /*
  2. * This file is subject to the terms and conditions of the GNU General Public
  3. * License. See the file "COPYING" in the main directory of this archive
  4. * for more details.
  5. *
  6. * Copyright (C) 2007 Aurelien Jarno <aurelien@aurel32.net>
  7. */
  8. #include <linux/ssb/ssb.h>
  9. #include <linux/ssb/ssb_driver_chipcommon.h>
  10. #include <linux/ssb/ssb_driver_extif.h>
  11. #include <asm/mach-bcm47xx/bcm47xx.h>
  12. #include <asm/mach-bcm47xx/gpio.h>
  13. #if (BCM47XX_CHIPCO_GPIO_LINES > BCM47XX_EXTIF_GPIO_LINES)
  14. static DECLARE_BITMAP(gpio_in_use, BCM47XX_CHIPCO_GPIO_LINES);
  15. #else
  16. static DECLARE_BITMAP(gpio_in_use, BCM47XX_EXTIF_GPIO_LINES);
  17. #endif
  18. int gpio_request(unsigned gpio, const char *tag)
  19. {
  20. switch (bcm47xx_bus_type) {
  21. #ifdef CONFIG_BCM47XX_SSB
  22. case BCM47XX_BUS_TYPE_SSB:
  23. if (ssb_chipco_available(&bcm47xx_bus.ssb.chipco) &&
  24. ((unsigned)gpio >= BCM47XX_CHIPCO_GPIO_LINES))
  25. return -EINVAL;
  26. if (ssb_extif_available(&bcm47xx_bus.ssb.extif) &&
  27. ((unsigned)gpio >= BCM47XX_EXTIF_GPIO_LINES))
  28. return -EINVAL;
  29. if (test_and_set_bit(gpio, gpio_in_use))
  30. return -EBUSY;
  31. return 0;
  32. #endif
  33. #ifdef CONFIG_BCM47XX_BCMA
  34. case BCM47XX_BUS_TYPE_BCMA:
  35. if (gpio >= BCM47XX_CHIPCO_GPIO_LINES)
  36. return -EINVAL;
  37. if (test_and_set_bit(gpio, gpio_in_use))
  38. return -EBUSY;
  39. return 0;
  40. #endif
  41. }
  42. return -EINVAL;
  43. }
  44. EXPORT_SYMBOL(gpio_request);
  45. void gpio_free(unsigned gpio)
  46. {
  47. switch (bcm47xx_bus_type) {
  48. #ifdef CONFIG_BCM47XX_SSB
  49. case BCM47XX_BUS_TYPE_SSB:
  50. if (ssb_chipco_available(&bcm47xx_bus.ssb.chipco) &&
  51. ((unsigned)gpio >= BCM47XX_CHIPCO_GPIO_LINES))
  52. return;
  53. if (ssb_extif_available(&bcm47xx_bus.ssb.extif) &&
  54. ((unsigned)gpio >= BCM47XX_EXTIF_GPIO_LINES))
  55. return;
  56. clear_bit(gpio, gpio_in_use);
  57. return;
  58. #endif
  59. #ifdef CONFIG_BCM47XX_BCMA
  60. case BCM47XX_BUS_TYPE_BCMA:
  61. if (gpio >= BCM47XX_CHIPCO_GPIO_LINES)
  62. return;
  63. clear_bit(gpio, gpio_in_use);
  64. return;
  65. #endif
  66. }
  67. }
  68. EXPORT_SYMBOL(gpio_free);
  69. int gpio_to_irq(unsigned gpio)
  70. {
  71. switch (bcm47xx_bus_type) {
  72. #ifdef CONFIG_BCM47XX_SSB
  73. case BCM47XX_BUS_TYPE_SSB:
  74. if (ssb_chipco_available(&bcm47xx_bus.ssb.chipco))
  75. return ssb_mips_irq(bcm47xx_bus.ssb.chipco.dev) + 2;
  76. else if (ssb_extif_available(&bcm47xx_bus.ssb.extif))
  77. return ssb_mips_irq(bcm47xx_bus.ssb.extif.dev) + 2;
  78. else
  79. return -EINVAL;
  80. #endif
  81. #ifdef CONFIG_BCM47XX_BCMA
  82. case BCM47XX_BUS_TYPE_BCMA:
  83. return bcma_core_mips_irq(bcm47xx_bus.bcma.bus.drv_cc.core) + 2;
  84. #endif
  85. }
  86. return -EINVAL;
  87. }
  88. EXPORT_SYMBOL_GPL(gpio_to_irq);