mcb.h 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  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. struct mcb_driver;
  17. struct mcb_device;
  18. /**
  19. * struct mcb_bus - MEN Chameleon Bus
  20. *
  21. * @dev: pointer to carrier device
  22. * @children: the child busses
  23. * @bus_nr: mcb bus number
  24. * @get_irq: callback to get IRQ number
  25. */
  26. struct mcb_bus {
  27. struct list_head children;
  28. struct device dev;
  29. struct device *carrier;
  30. int bus_nr;
  31. int (*get_irq)(struct mcb_device *dev);
  32. };
  33. #define to_mcb_bus(b) container_of((b), struct mcb_bus, dev)
  34. /**
  35. * struct mcb_device - MEN Chameleon Bus device
  36. *
  37. * @bus_list: internal list handling for bus code
  38. * @dev: device in kernel representation
  39. * @bus: mcb bus the device is plugged to
  40. * @subordinate: subordinate MCBus in case of bridge
  41. * @is_added: flag to check if device is added to bus
  42. * @driver: associated mcb_driver
  43. * @id: mcb device id
  44. * @inst: instance in Chameleon table
  45. * @group: group in Chameleon table
  46. * @var: variant in Chameleon table
  47. * @bar: BAR in Chameleon table
  48. * @rev: revision in Chameleon table
  49. * @irq: IRQ resource
  50. * @memory: memory resource
  51. */
  52. struct mcb_device {
  53. struct list_head bus_list;
  54. struct device dev;
  55. struct mcb_bus *bus;
  56. struct mcb_bus *subordinate;
  57. bool is_added;
  58. struct mcb_driver *driver;
  59. u16 id;
  60. int inst;
  61. int group;
  62. int var;
  63. int bar;
  64. int rev;
  65. struct resource irq;
  66. struct resource mem;
  67. };
  68. #define to_mcb_device(x) container_of((x), struct mcb_device, dev)
  69. /**
  70. * struct mcb_driver - MEN Chameleon Bus device driver
  71. *
  72. * @driver: device_driver
  73. * @id_table: mcb id table
  74. * @probe: probe callback
  75. * @remove: remove callback
  76. * @shutdown: shutdown callback
  77. */
  78. struct mcb_driver {
  79. struct device_driver driver;
  80. const struct mcb_device_id *id_table;
  81. int (*probe)(struct mcb_device *mdev, const struct mcb_device_id *id);
  82. void (*remove)(struct mcb_device *mdev);
  83. void (*shutdown)(struct mcb_device *mdev);
  84. };
  85. #define to_mcb_driver(x) container_of((x), struct mcb_driver, driver)
  86. static inline void *mcb_get_drvdata(struct mcb_device *dev)
  87. {
  88. return dev_get_drvdata(&dev->dev);
  89. }
  90. static inline void mcb_set_drvdata(struct mcb_device *dev, void *data)
  91. {
  92. dev_set_drvdata(&dev->dev, data);
  93. }
  94. extern int __must_check __mcb_register_driver(struct mcb_driver *drv,
  95. struct module *owner,
  96. const char *mod_name);
  97. #define mcb_register_driver(driver) \
  98. __mcb_register_driver(driver, THIS_MODULE, KBUILD_MODNAME)
  99. extern void mcb_unregister_driver(struct mcb_driver *driver);
  100. #define module_mcb_driver(__mcb_driver) \
  101. module_driver(__mcb_driver, mcb_register_driver, mcb_unregister_driver);
  102. extern void mcb_bus_add_devices(const struct mcb_bus *bus);
  103. extern int mcb_device_register(struct mcb_bus *bus, struct mcb_device *dev);
  104. extern struct mcb_bus *mcb_alloc_bus(struct device *carrier);
  105. extern struct mcb_bus *mcb_bus_get(struct mcb_bus *bus);
  106. extern void mcb_bus_put(struct mcb_bus *bus);
  107. extern struct mcb_device *mcb_alloc_dev(struct mcb_bus *bus);
  108. extern void mcb_free_dev(struct mcb_device *dev);
  109. extern void mcb_release_bus(struct mcb_bus *bus);
  110. extern struct resource *mcb_request_mem(struct mcb_device *dev,
  111. const char *name);
  112. extern void mcb_release_mem(struct resource *mem);
  113. extern int mcb_get_irq(struct mcb_device *dev);
  114. #endif /* _LINUX_MCB_H */