mcb.h 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. /*
  2. * MEN Chameleon Bus.
  3. *
  4. * Copyright (C) 2014 MEN Mikroelektronik GmbH (www.men.de)
  5. * Author: Johannes Thumshirn <johannes.thumshirn@men.de>
  6. *
  7. * This program is free software; you can redistribute it and/or modify it
  8. * under the terms of the GNU General Public License as published by the Free
  9. * Software Foundation; version 2 of the License.
  10. */
  11. #ifndef _LINUX_MCB_H
  12. #define _LINUX_MCB_H
  13. #include <linux/mod_devicetable.h>
  14. #include <linux/device.h>
  15. #include <linux/irqreturn.h>
  16. #define CHAMELEON_FILENAME_LEN 12
  17. struct mcb_driver;
  18. struct mcb_device;
  19. /**
  20. * struct mcb_bus - MEN Chameleon Bus
  21. *
  22. * @dev: bus device
  23. * @carrier: pointer to carrier device
  24. * @bus_nr: mcb bus number
  25. * @get_irq: callback to get IRQ number
  26. * @revision: the FPGA's revision number
  27. * @model: the FPGA's model number
  28. * @filename: the FPGA's name
  29. */
  30. struct mcb_bus {
  31. struct device dev;
  32. struct device *carrier;
  33. int bus_nr;
  34. u8 revision;
  35. char model;
  36. u8 minor;
  37. char name[CHAMELEON_FILENAME_LEN + 1];
  38. int (*get_irq)(struct mcb_device *dev);
  39. };
  40. static inline struct mcb_bus *to_mcb_bus(struct device *dev)
  41. {
  42. return container_of(dev, struct mcb_bus, dev);
  43. }
  44. /**
  45. * struct mcb_device - MEN Chameleon Bus device
  46. *
  47. * @dev: device in kernel representation
  48. * @bus: mcb bus the device is plugged to
  49. * @is_added: flag to check if device is added to bus
  50. * @driver: associated mcb_driver
  51. * @id: mcb device id
  52. * @inst: instance in Chameleon table
  53. * @group: group in Chameleon table
  54. * @var: variant in Chameleon table
  55. * @bar: BAR in Chameleon table
  56. * @rev: revision in Chameleon table
  57. * @irq: IRQ resource
  58. * @memory: memory resource
  59. */
  60. struct mcb_device {
  61. struct device dev;
  62. struct mcb_bus *bus;
  63. bool is_added;
  64. struct mcb_driver *driver;
  65. u16 id;
  66. int inst;
  67. int group;
  68. int var;
  69. int bar;
  70. int rev;
  71. struct resource irq;
  72. struct resource mem;
  73. struct device *dma_dev;
  74. };
  75. static inline struct mcb_device *to_mcb_device(struct device *dev)
  76. {
  77. return container_of(dev, struct mcb_device, dev);
  78. }
  79. /**
  80. * struct mcb_driver - MEN Chameleon Bus device driver
  81. *
  82. * @driver: device_driver
  83. * @id_table: mcb id table
  84. * @probe: probe callback
  85. * @remove: remove callback
  86. * @shutdown: shutdown callback
  87. */
  88. struct mcb_driver {
  89. struct device_driver driver;
  90. const struct mcb_device_id *id_table;
  91. int (*probe)(struct mcb_device *mdev, const struct mcb_device_id *id);
  92. void (*remove)(struct mcb_device *mdev);
  93. void (*shutdown)(struct mcb_device *mdev);
  94. };
  95. static inline struct mcb_driver *to_mcb_driver(struct device_driver *drv)
  96. {
  97. return container_of(drv, struct mcb_driver, driver);
  98. }
  99. static inline void *mcb_get_drvdata(struct mcb_device *dev)
  100. {
  101. return dev_get_drvdata(&dev->dev);
  102. }
  103. static inline void mcb_set_drvdata(struct mcb_device *dev, void *data)
  104. {
  105. dev_set_drvdata(&dev->dev, data);
  106. }
  107. extern int __must_check __mcb_register_driver(struct mcb_driver *drv,
  108. struct module *owner,
  109. const char *mod_name);
  110. #define mcb_register_driver(driver) \
  111. __mcb_register_driver(driver, THIS_MODULE, KBUILD_MODNAME)
  112. extern void mcb_unregister_driver(struct mcb_driver *driver);
  113. #define module_mcb_driver(__mcb_driver) \
  114. module_driver(__mcb_driver, mcb_register_driver, mcb_unregister_driver);
  115. extern void mcb_bus_add_devices(const struct mcb_bus *bus);
  116. extern int mcb_device_register(struct mcb_bus *bus, struct mcb_device *dev);
  117. extern struct mcb_bus *mcb_alloc_bus(struct device *carrier);
  118. extern struct mcb_bus *mcb_bus_get(struct mcb_bus *bus);
  119. extern void mcb_bus_put(struct mcb_bus *bus);
  120. extern struct mcb_device *mcb_alloc_dev(struct mcb_bus *bus);
  121. extern void mcb_free_dev(struct mcb_device *dev);
  122. extern void mcb_release_bus(struct mcb_bus *bus);
  123. extern struct resource *mcb_request_mem(struct mcb_device *dev,
  124. const char *name);
  125. extern void mcb_release_mem(struct resource *mem);
  126. extern int mcb_get_irq(struct mcb_device *dev);
  127. #endif /* _LINUX_MCB_H */