mcb.h 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  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 <johannes.thumshirn@men.de>
  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. bool is_added;
  61. struct mcb_driver *driver;
  62. u16 id;
  63. int inst;
  64. int group;
  65. int var;
  66. int bar;
  67. int rev;
  68. struct resource irq;
  69. struct resource mem;
  70. struct device *dma_dev;
  71. };
  72. static inline struct mcb_device *to_mcb_device(struct device *dev)
  73. {
  74. return container_of(dev, struct mcb_device, dev);
  75. }
  76. /**
  77. * struct mcb_driver - MEN Chameleon Bus device driver
  78. *
  79. * @driver: device_driver
  80. * @id_table: mcb id table
  81. * @probe: probe callback
  82. * @remove: remove callback
  83. * @shutdown: shutdown callback
  84. */
  85. struct mcb_driver {
  86. struct device_driver driver;
  87. const struct mcb_device_id *id_table;
  88. int (*probe)(struct mcb_device *mdev, const struct mcb_device_id *id);
  89. void (*remove)(struct mcb_device *mdev);
  90. void (*shutdown)(struct mcb_device *mdev);
  91. };
  92. static inline struct mcb_driver *to_mcb_driver(struct device_driver *drv)
  93. {
  94. return container_of(drv, struct mcb_driver, driver);
  95. }
  96. static inline void *mcb_get_drvdata(struct mcb_device *dev)
  97. {
  98. return dev_get_drvdata(&dev->dev);
  99. }
  100. static inline void mcb_set_drvdata(struct mcb_device *dev, void *data)
  101. {
  102. dev_set_drvdata(&dev->dev, data);
  103. }
  104. extern int __must_check __mcb_register_driver(struct mcb_driver *drv,
  105. struct module *owner,
  106. const char *mod_name);
  107. #define mcb_register_driver(driver) \
  108. __mcb_register_driver(driver, THIS_MODULE, KBUILD_MODNAME)
  109. extern void mcb_unregister_driver(struct mcb_driver *driver);
  110. #define module_mcb_driver(__mcb_driver) \
  111. module_driver(__mcb_driver, mcb_register_driver, mcb_unregister_driver);
  112. extern void mcb_bus_add_devices(const struct mcb_bus *bus);
  113. extern int mcb_device_register(struct mcb_bus *bus, struct mcb_device *dev);
  114. extern struct mcb_bus *mcb_alloc_bus(struct device *carrier);
  115. extern struct mcb_bus *mcb_bus_get(struct mcb_bus *bus);
  116. extern void mcb_bus_put(struct mcb_bus *bus);
  117. extern struct mcb_device *mcb_alloc_dev(struct mcb_bus *bus);
  118. extern void mcb_free_dev(struct mcb_device *dev);
  119. extern void mcb_release_bus(struct mcb_bus *bus);
  120. extern struct resource *mcb_request_mem(struct mcb_device *dev,
  121. const char *name);
  122. extern void mcb_release_mem(struct resource *mem);
  123. extern int mcb_get_irq(struct mcb_device *dev);
  124. extern struct resource *mcb_get_resource(struct mcb_device *dev,
  125. unsigned int type);
  126. #endif /* _LINUX_MCB_H */