embedded.c 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. /*
  2. * Sonics Silicon Backplane
  3. * Embedded systems support code
  4. *
  5. * Copyright 2005-2008, Broadcom Corporation
  6. * Copyright 2006-2008, Michael Buesch <mb@bu3sch.de>
  7. *
  8. * Licensed under the GNU/GPL. See COPYING for details.
  9. */
  10. #include <linux/ssb/ssb.h>
  11. #include <linux/ssb/ssb_embedded.h>
  12. #include "ssb_private.h"
  13. int ssb_watchdog_timer_set(struct ssb_bus *bus, u32 ticks)
  14. {
  15. if (ssb_chipco_available(&bus->chipco)) {
  16. ssb_chipco_watchdog_timer_set(&bus->chipco, ticks);
  17. return 0;
  18. }
  19. if (ssb_extif_available(&bus->extif)) {
  20. ssb_extif_watchdog_timer_set(&bus->extif, ticks);
  21. return 0;
  22. }
  23. return -ENODEV;
  24. }
  25. u32 ssb_gpio_in(struct ssb_bus *bus, u32 mask)
  26. {
  27. unsigned long flags;
  28. u32 res = 0;
  29. spin_lock_irqsave(&bus->gpio_lock, flags);
  30. if (ssb_chipco_available(&bus->chipco))
  31. res = ssb_chipco_gpio_in(&bus->chipco, mask);
  32. else if (ssb_extif_available(&bus->extif))
  33. res = ssb_extif_gpio_in(&bus->extif, mask);
  34. else
  35. SSB_WARN_ON(1);
  36. spin_unlock_irqrestore(&bus->gpio_lock, flags);
  37. return res;
  38. }
  39. EXPORT_SYMBOL(ssb_gpio_in);
  40. u32 ssb_gpio_out(struct ssb_bus *bus, u32 mask, u32 value)
  41. {
  42. unsigned long flags;
  43. u32 res = 0;
  44. spin_lock_irqsave(&bus->gpio_lock, flags);
  45. if (ssb_chipco_available(&bus->chipco))
  46. res = ssb_chipco_gpio_out(&bus->chipco, mask, value);
  47. else if (ssb_extif_available(&bus->extif))
  48. res = ssb_extif_gpio_out(&bus->extif, mask, value);
  49. else
  50. SSB_WARN_ON(1);
  51. spin_unlock_irqrestore(&bus->gpio_lock, flags);
  52. return res;
  53. }
  54. EXPORT_SYMBOL(ssb_gpio_out);
  55. u32 ssb_gpio_outen(struct ssb_bus *bus, u32 mask, u32 value)
  56. {
  57. unsigned long flags;
  58. u32 res = 0;
  59. spin_lock_irqsave(&bus->gpio_lock, flags);
  60. if (ssb_chipco_available(&bus->chipco))
  61. res = ssb_chipco_gpio_outen(&bus->chipco, mask, value);
  62. else if (ssb_extif_available(&bus->extif))
  63. res = ssb_extif_gpio_outen(&bus->extif, mask, value);
  64. else
  65. SSB_WARN_ON(1);
  66. spin_unlock_irqrestore(&bus->gpio_lock, flags);
  67. return res;
  68. }
  69. EXPORT_SYMBOL(ssb_gpio_outen);
  70. u32 ssb_gpio_control(struct ssb_bus *bus, u32 mask, u32 value)
  71. {
  72. unsigned long flags;
  73. u32 res = 0;
  74. spin_lock_irqsave(&bus->gpio_lock, flags);
  75. if (ssb_chipco_available(&bus->chipco))
  76. res = ssb_chipco_gpio_control(&bus->chipco, mask, value);
  77. spin_unlock_irqrestore(&bus->gpio_lock, flags);
  78. return res;
  79. }
  80. EXPORT_SYMBOL(ssb_gpio_control);
  81. u32 ssb_gpio_intmask(struct ssb_bus *bus, u32 mask, u32 value)
  82. {
  83. unsigned long flags;
  84. u32 res = 0;
  85. spin_lock_irqsave(&bus->gpio_lock, flags);
  86. if (ssb_chipco_available(&bus->chipco))
  87. res = ssb_chipco_gpio_intmask(&bus->chipco, mask, value);
  88. else if (ssb_extif_available(&bus->extif))
  89. res = ssb_extif_gpio_intmask(&bus->extif, mask, value);
  90. else
  91. SSB_WARN_ON(1);
  92. spin_unlock_irqrestore(&bus->gpio_lock, flags);
  93. return res;
  94. }
  95. EXPORT_SYMBOL(ssb_gpio_intmask);
  96. u32 ssb_gpio_polarity(struct ssb_bus *bus, u32 mask, u32 value)
  97. {
  98. unsigned long flags;
  99. u32 res = 0;
  100. spin_lock_irqsave(&bus->gpio_lock, flags);
  101. if (ssb_chipco_available(&bus->chipco))
  102. res = ssb_chipco_gpio_polarity(&bus->chipco, mask, value);
  103. else if (ssb_extif_available(&bus->extif))
  104. res = ssb_extif_gpio_polarity(&bus->extif, mask, value);
  105. else
  106. SSB_WARN_ON(1);
  107. spin_unlock_irqrestore(&bus->gpio_lock, flags);
  108. return res;
  109. }
  110. EXPORT_SYMBOL(ssb_gpio_polarity);