mcb.h 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  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. #define to_mcb_bus(b) container_of((b), struct mcb_bus, dev)
  41. /**
  42. * struct mcb_device - MEN Chameleon Bus device
  43. *
  44. * @bus_list: internal list handling for bus code
  45. * @dev: device in kernel representation
  46. * @bus: mcb bus the device is plugged to
  47. * @subordinate: subordinate MCBus in case of bridge
  48. * @is_added: flag to check if device is added to bus
  49. * @driver: associated mcb_driver
  50. * @id: mcb device id
  51. * @inst: instance in Chameleon table
  52. * @group: group in Chameleon table
  53. * @var: variant in Chameleon table
  54. * @bar: BAR in Chameleon table
  55. * @rev: revision in Chameleon table
  56. * @irq: IRQ resource
  57. * @memory: memory resource
  58. */
  59. struct mcb_device {
  60. struct list_head bus_list;
  61. struct device dev;
  62. struct mcb_bus *bus;
  63. struct mcb_bus *subordinate;
  64. bool is_added;
  65. struct mcb_driver *driver;
  66. u16 id;
  67. int inst;
  68. int group;
  69. int var;
  70. int bar;
  71. int rev;
  72. struct resource irq;
  73. struct resource mem;
  74. };
  75. #define to_mcb_device(x) container_of((x), struct mcb_device, dev)
  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. #define to_mcb_driver(x) container_of((x), struct mcb_driver, driver)
  93. static inline void *mcb_get_drvdata(struct mcb_device *dev)
  94. {
  95. return dev_get_drvdata(&dev->dev);
  96. }
  97. static inline void mcb_set_drvdata(struct mcb_device *dev, void *data)
  98. {
  99. dev_set_drvdata(&dev->dev, data);
  100. }
  101. extern int __must_check __mcb_register_driver(struct mcb_driver *drv,
  102. struct module *owner,
  103. const char *mod_name);
  104. #define mcb_register_driver(driver) \
  105. __mcb_register_driver(driver, THIS_MODULE, KBUILD_MODNAME)
  106. extern void mcb_unregister_driver(struct mcb_driver *driver);
  107. #define module_mcb_driver(__mcb_driver) \
  108. module_driver(__mcb_driver, mcb_register_driver, mcb_unregister_driver);
  109. extern void mcb_bus_add_devices(const struct mcb_bus *bus);
  110. extern int mcb_device_register(struct mcb_bus *bus, struct mcb_device *dev);
  111. extern struct mcb_bus *mcb_alloc_bus(struct device *carrier);
  112. extern struct mcb_bus *mcb_bus_get(struct mcb_bus *bus);
  113. extern void mcb_bus_put(struct mcb_bus *bus);
  114. extern struct mcb_device *mcb_alloc_dev(struct mcb_bus *bus);
  115. extern void mcb_free_dev(struct mcb_device *dev);
  116. extern void mcb_release_bus(struct mcb_bus *bus);
  117. extern struct resource *mcb_request_mem(struct mcb_device *dev,
  118. const char *name);
  119. extern void mcb_release_mem(struct resource *mem);
  120. extern int mcb_get_irq(struct mcb_device *dev);
  121. #endif /* _LINUX_MCB_H */