moxtet.h 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. /*
  3. * Turris Mox module configuration bus driver
  4. *
  5. * Copyright (C) 2019 Marek Behun <marek.behun@nic.cz>
  6. */
  7. #ifndef __LINUX_MOXTET_H
  8. #define __LINUX_MOXTET_H
  9. #include <linux/device.h>
  10. #include <linux/irq.h>
  11. #include <linux/irqdomain.h>
  12. #include <linux/mutex.h>
  13. #define TURRIS_MOX_MAX_MODULES 10
  14. enum turris_mox_cpu_module_id {
  15. TURRIS_MOX_CPU_ID_EMMC = 0x00,
  16. TURRIS_MOX_CPU_ID_SD = 0x10,
  17. };
  18. enum turris_mox_module_id {
  19. TURRIS_MOX_MODULE_FIRST = 0x01,
  20. TURRIS_MOX_MODULE_SFP = 0x01,
  21. TURRIS_MOX_MODULE_PCI = 0x02,
  22. TURRIS_MOX_MODULE_TOPAZ = 0x03,
  23. TURRIS_MOX_MODULE_PERIDOT = 0x04,
  24. TURRIS_MOX_MODULE_USB3 = 0x05,
  25. TURRIS_MOX_MODULE_PCI_BRIDGE = 0x06,
  26. TURRIS_MOX_MODULE_LAST = 0x06,
  27. };
  28. #define MOXTET_NIRQS 16
  29. extern struct bus_type moxtet_type;
  30. struct moxtet {
  31. struct device *dev;
  32. struct mutex lock;
  33. u8 modules[TURRIS_MOX_MAX_MODULES];
  34. int count;
  35. u8 tx[TURRIS_MOX_MAX_MODULES];
  36. int dev_irq;
  37. struct {
  38. struct irq_domain *domain;
  39. struct irq_chip chip;
  40. unsigned long masked, exists;
  41. struct moxtet_irqpos {
  42. u8 idx;
  43. u8 bit;
  44. } position[MOXTET_NIRQS];
  45. } irq;
  46. #ifdef CONFIG_DEBUG_FS
  47. struct dentry *debugfs_root;
  48. #endif
  49. };
  50. struct moxtet_driver {
  51. const enum turris_mox_module_id *id_table;
  52. struct device_driver driver;
  53. };
  54. static inline struct moxtet_driver *
  55. to_moxtet_driver(struct device_driver *drv)
  56. {
  57. if (!drv)
  58. return NULL;
  59. return container_of(drv, struct moxtet_driver, driver);
  60. }
  61. extern int __moxtet_register_driver(struct module *owner,
  62. struct moxtet_driver *mdrv);
  63. static inline void moxtet_unregister_driver(struct moxtet_driver *mdrv)
  64. {
  65. if (mdrv)
  66. driver_unregister(&mdrv->driver);
  67. }
  68. #define moxtet_register_driver(driver) \
  69. __moxtet_register_driver(THIS_MODULE, driver)
  70. #define module_moxtet_driver(__moxtet_driver) \
  71. module_driver(__moxtet_driver, moxtet_register_driver, \
  72. moxtet_unregister_driver)
  73. struct moxtet_device {
  74. struct device dev;
  75. struct moxtet *moxtet;
  76. enum turris_mox_module_id id;
  77. unsigned int idx;
  78. };
  79. extern int moxtet_device_read(struct device *dev);
  80. extern int moxtet_device_write(struct device *dev, u8 val);
  81. extern int moxtet_device_written(struct device *dev);
  82. static inline struct moxtet_device *
  83. to_moxtet_device(struct device *dev)
  84. {
  85. if (!dev)
  86. return NULL;
  87. return container_of(dev, struct moxtet_device, dev);
  88. }
  89. #endif /* __LINUX_MOXTET_H */