mcb.h 3.7 KB

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