vlynq.h 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. /* SPDX-License-Identifier: GPL-2.0-or-later */
  2. /*
  3. * Copyright (C) 2006, 2007 Eugene Konev <ejka@openwrt.org>
  4. */
  5. #ifndef __VLYNQ_H__
  6. #define __VLYNQ_H__
  7. #include <linux/device.h>
  8. #include <linux/types.h>
  9. struct module;
  10. #define VLYNQ_NUM_IRQS 32
  11. struct vlynq_mapping {
  12. u32 size;
  13. u32 offset;
  14. };
  15. enum vlynq_divisor {
  16. vlynq_div_auto = 0,
  17. vlynq_ldiv1,
  18. vlynq_ldiv2,
  19. vlynq_ldiv3,
  20. vlynq_ldiv4,
  21. vlynq_ldiv5,
  22. vlynq_ldiv6,
  23. vlynq_ldiv7,
  24. vlynq_ldiv8,
  25. vlynq_rdiv1,
  26. vlynq_rdiv2,
  27. vlynq_rdiv3,
  28. vlynq_rdiv4,
  29. vlynq_rdiv5,
  30. vlynq_rdiv6,
  31. vlynq_rdiv7,
  32. vlynq_rdiv8,
  33. vlynq_div_external
  34. };
  35. struct vlynq_device_id {
  36. u32 id;
  37. enum vlynq_divisor divisor;
  38. unsigned long driver_data;
  39. };
  40. struct vlynq_regs;
  41. struct vlynq_device {
  42. u32 id, dev_id;
  43. int local_irq;
  44. int remote_irq;
  45. enum vlynq_divisor divisor;
  46. u32 regs_start, regs_end;
  47. u32 mem_start, mem_end;
  48. u32 irq_start, irq_end;
  49. int irq;
  50. int enabled;
  51. struct vlynq_regs *local;
  52. struct vlynq_regs *remote;
  53. struct device dev;
  54. };
  55. struct vlynq_driver {
  56. char *name;
  57. struct vlynq_device_id *id_table;
  58. int (*probe)(struct vlynq_device *dev, struct vlynq_device_id *id);
  59. void (*remove)(struct vlynq_device *dev);
  60. struct device_driver driver;
  61. };
  62. struct plat_vlynq_ops {
  63. int (*on)(struct vlynq_device *dev);
  64. void (*off)(struct vlynq_device *dev);
  65. };
  66. static inline struct vlynq_driver *to_vlynq_driver(struct device_driver *drv)
  67. {
  68. return container_of(drv, struct vlynq_driver, driver);
  69. }
  70. static inline struct vlynq_device *to_vlynq_device(struct device *device)
  71. {
  72. return container_of(device, struct vlynq_device, dev);
  73. }
  74. extern struct bus_type vlynq_bus_type;
  75. extern int __vlynq_register_driver(struct vlynq_driver *driver,
  76. struct module *owner);
  77. static inline int vlynq_register_driver(struct vlynq_driver *driver)
  78. {
  79. return __vlynq_register_driver(driver, THIS_MODULE);
  80. }
  81. static inline void *vlynq_get_drvdata(struct vlynq_device *dev)
  82. {
  83. return dev_get_drvdata(&dev->dev);
  84. }
  85. static inline void vlynq_set_drvdata(struct vlynq_device *dev, void *data)
  86. {
  87. dev_set_drvdata(&dev->dev, data);
  88. }
  89. static inline u32 vlynq_mem_start(struct vlynq_device *dev)
  90. {
  91. return dev->mem_start;
  92. }
  93. static inline u32 vlynq_mem_end(struct vlynq_device *dev)
  94. {
  95. return dev->mem_end;
  96. }
  97. static inline u32 vlynq_mem_len(struct vlynq_device *dev)
  98. {
  99. return dev->mem_end - dev->mem_start + 1;
  100. }
  101. static inline int vlynq_virq_to_irq(struct vlynq_device *dev, int virq)
  102. {
  103. int irq = dev->irq_start + virq;
  104. if ((irq < dev->irq_start) || (irq > dev->irq_end))
  105. return -EINVAL;
  106. return irq;
  107. }
  108. static inline int vlynq_irq_to_virq(struct vlynq_device *dev, int irq)
  109. {
  110. if ((irq < dev->irq_start) || (irq > dev->irq_end))
  111. return -EINVAL;
  112. return irq - dev->irq_start;
  113. }
  114. extern void vlynq_unregister_driver(struct vlynq_driver *driver);
  115. extern int vlynq_enable_device(struct vlynq_device *dev);
  116. extern void vlynq_disable_device(struct vlynq_device *dev);
  117. extern int vlynq_set_local_mapping(struct vlynq_device *dev, u32 tx_offset,
  118. struct vlynq_mapping *mapping);
  119. extern int vlynq_set_remote_mapping(struct vlynq_device *dev, u32 tx_offset,
  120. struct vlynq_mapping *mapping);
  121. extern int vlynq_set_local_irq(struct vlynq_device *dev, int virq);
  122. extern int vlynq_set_remote_irq(struct vlynq_device *dev, int virq);
  123. #endif /* __VLYNQ_H__ */