vlynq.h 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. /*
  2. * Copyright (C) 2006, 2007 Eugene Konev <ejka@openwrt.org>
  3. *
  4. * This program is free software; you can redistribute it and/or modify
  5. * it under the terms of the GNU General Public License as published by
  6. * the Free Software Foundation; either version 2 of the License, or
  7. * (at your option) any later version.
  8. *
  9. * This program is distributed in the hope that it will be useful,
  10. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. * GNU General Public License for more details.
  13. *
  14. * You should have received a copy of the GNU General Public License
  15. * along with this program; if not, write to the Free Software
  16. * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
  17. */
  18. #ifndef __VLYNQ_H__
  19. #define __VLYNQ_H__
  20. #include <linux/device.h>
  21. #include <linux/types.h>
  22. struct module;
  23. #define VLYNQ_NUM_IRQS 32
  24. struct vlynq_mapping {
  25. u32 size;
  26. u32 offset;
  27. };
  28. enum vlynq_divisor {
  29. vlynq_div_auto = 0,
  30. vlynq_ldiv1,
  31. vlynq_ldiv2,
  32. vlynq_ldiv3,
  33. vlynq_ldiv4,
  34. vlynq_ldiv5,
  35. vlynq_ldiv6,
  36. vlynq_ldiv7,
  37. vlynq_ldiv8,
  38. vlynq_rdiv1,
  39. vlynq_rdiv2,
  40. vlynq_rdiv3,
  41. vlynq_rdiv4,
  42. vlynq_rdiv5,
  43. vlynq_rdiv6,
  44. vlynq_rdiv7,
  45. vlynq_rdiv8,
  46. vlynq_div_external
  47. };
  48. struct vlynq_device_id {
  49. u32 id;
  50. enum vlynq_divisor divisor;
  51. unsigned long driver_data;
  52. };
  53. struct vlynq_regs;
  54. struct vlynq_device {
  55. u32 id, dev_id;
  56. int local_irq;
  57. int remote_irq;
  58. enum vlynq_divisor divisor;
  59. u32 regs_start, regs_end;
  60. u32 mem_start, mem_end;
  61. u32 irq_start, irq_end;
  62. int irq;
  63. int enabled;
  64. struct vlynq_regs *local;
  65. struct vlynq_regs *remote;
  66. struct device dev;
  67. };
  68. struct vlynq_driver {
  69. char *name;
  70. struct vlynq_device_id *id_table;
  71. int (*probe)(struct vlynq_device *dev, struct vlynq_device_id *id);
  72. void (*remove)(struct vlynq_device *dev);
  73. struct device_driver driver;
  74. };
  75. struct plat_vlynq_ops {
  76. int (*on)(struct vlynq_device *dev);
  77. void (*off)(struct vlynq_device *dev);
  78. };
  79. static inline struct vlynq_driver *to_vlynq_driver(struct device_driver *drv)
  80. {
  81. return container_of(drv, struct vlynq_driver, driver);
  82. }
  83. static inline struct vlynq_device *to_vlynq_device(struct device *device)
  84. {
  85. return container_of(device, struct vlynq_device, dev);
  86. }
  87. extern struct bus_type vlynq_bus_type;
  88. extern int __vlynq_register_driver(struct vlynq_driver *driver,
  89. struct module *owner);
  90. static inline int vlynq_register_driver(struct vlynq_driver *driver)
  91. {
  92. return __vlynq_register_driver(driver, THIS_MODULE);
  93. }
  94. static inline void *vlynq_get_drvdata(struct vlynq_device *dev)
  95. {
  96. return dev_get_drvdata(&dev->dev);
  97. }
  98. static inline void vlynq_set_drvdata(struct vlynq_device *dev, void *data)
  99. {
  100. dev_set_drvdata(&dev->dev, data);
  101. }
  102. static inline u32 vlynq_mem_start(struct vlynq_device *dev)
  103. {
  104. return dev->mem_start;
  105. }
  106. static inline u32 vlynq_mem_end(struct vlynq_device *dev)
  107. {
  108. return dev->mem_end;
  109. }
  110. static inline u32 vlynq_mem_len(struct vlynq_device *dev)
  111. {
  112. return dev->mem_end - dev->mem_start + 1;
  113. }
  114. static inline int vlynq_virq_to_irq(struct vlynq_device *dev, int virq)
  115. {
  116. int irq = dev->irq_start + virq;
  117. if ((irq < dev->irq_start) || (irq > dev->irq_end))
  118. return -EINVAL;
  119. return irq;
  120. }
  121. static inline int vlynq_irq_to_virq(struct vlynq_device *dev, int irq)
  122. {
  123. if ((irq < dev->irq_start) || (irq > dev->irq_end))
  124. return -EINVAL;
  125. return irq - dev->irq_start;
  126. }
  127. extern void vlynq_unregister_driver(struct vlynq_driver *driver);
  128. extern int vlynq_enable_device(struct vlynq_device *dev);
  129. extern void vlynq_disable_device(struct vlynq_device *dev);
  130. extern int vlynq_set_local_mapping(struct vlynq_device *dev, u32 tx_offset,
  131. struct vlynq_mapping *mapping);
  132. extern int vlynq_set_remote_mapping(struct vlynq_device *dev, u32 tx_offset,
  133. struct vlynq_mapping *mapping);
  134. extern int vlynq_set_local_irq(struct vlynq_device *dev, int virq);
  135. extern int vlynq_set_remote_irq(struct vlynq_device *dev, int virq);
  136. #endif /* __VLYNQ_H__ */