gpio.c 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  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. case BCM47XX_BUS_TYPE_SSB:
  22. if (ssb_chipco_available(&bcm47xx_bus.ssb.chipco) &&
  23. ((unsigned)gpio >= BCM47XX_CHIPCO_GPIO_LINES))
  24. return -EINVAL;
  25. if (ssb_extif_available(&bcm47xx_bus.ssb.extif) &&
  26. ((unsigned)gpio >= BCM47XX_EXTIF_GPIO_LINES))
  27. return -EINVAL;
  28. if (test_and_set_bit(gpio, gpio_in_use))
  29. return -EBUSY;
  30. return 0;
  31. }
  32. return -EINVAL;
  33. }
  34. EXPORT_SYMBOL(gpio_request);
  35. void gpio_free(unsigned gpio)
  36. {
  37. switch (bcm47xx_bus_type) {
  38. case BCM47XX_BUS_TYPE_SSB:
  39. if (ssb_chipco_available(&bcm47xx_bus.ssb.chipco) &&
  40. ((unsigned)gpio >= BCM47XX_CHIPCO_GPIO_LINES))
  41. return;
  42. if (ssb_extif_available(&bcm47xx_bus.ssb.extif) &&
  43. ((unsigned)gpio >= BCM47XX_EXTIF_GPIO_LINES))
  44. return;
  45. clear_bit(gpio, gpio_in_use);
  46. return;
  47. }
  48. }
  49. EXPORT_SYMBOL(gpio_free);
  50. int gpio_to_irq(unsigned gpio)
  51. {
  52. switch (bcm47xx_bus_type) {
  53. case BCM47XX_BUS_TYPE_SSB:
  54. if (ssb_chipco_available(&bcm47xx_bus.ssb.chipco))
  55. return ssb_mips_irq(bcm47xx_bus.ssb.chipco.dev) + 2;
  56. else if (ssb_extif_available(&bcm47xx_bus.ssb.extif))
  57. return ssb_mips_irq(bcm47xx_bus.ssb.extif.dev) + 2;
  58. else
  59. return -EINVAL;
  60. }
  61. return -EINVAL;
  62. }
  63. EXPORT_SYMBOL_GPL(gpio_to_irq);