0001
0002
0003
0004
0005
0006
0007
0008 #ifndef __LINUX_MOXTET_H
0009 #define __LINUX_MOXTET_H
0010
0011 #include <linux/device.h>
0012 #include <linux/irq.h>
0013 #include <linux/irqdomain.h>
0014 #include <linux/mutex.h>
0015
0016 #define TURRIS_MOX_MAX_MODULES 10
0017
0018 enum turris_mox_cpu_module_id {
0019 TURRIS_MOX_CPU_ID_EMMC = 0x00,
0020 TURRIS_MOX_CPU_ID_SD = 0x10,
0021 };
0022
0023 enum turris_mox_module_id {
0024 TURRIS_MOX_MODULE_FIRST = 0x01,
0025
0026 TURRIS_MOX_MODULE_SFP = 0x01,
0027 TURRIS_MOX_MODULE_PCI = 0x02,
0028 TURRIS_MOX_MODULE_TOPAZ = 0x03,
0029 TURRIS_MOX_MODULE_PERIDOT = 0x04,
0030 TURRIS_MOX_MODULE_USB3 = 0x05,
0031 TURRIS_MOX_MODULE_PCI_BRIDGE = 0x06,
0032
0033 TURRIS_MOX_MODULE_LAST = 0x06,
0034 };
0035
0036 #define MOXTET_NIRQS 16
0037
0038 extern struct bus_type moxtet_type;
0039
0040 struct moxtet {
0041 struct device *dev;
0042 struct mutex lock;
0043 u8 modules[TURRIS_MOX_MAX_MODULES];
0044 int count;
0045 u8 tx[TURRIS_MOX_MAX_MODULES];
0046 int dev_irq;
0047 struct {
0048 struct irq_domain *domain;
0049 struct irq_chip chip;
0050 unsigned long masked, exists;
0051 struct moxtet_irqpos {
0052 u8 idx;
0053 u8 bit;
0054 } position[MOXTET_NIRQS];
0055 } irq;
0056 #ifdef CONFIG_DEBUG_FS
0057 struct dentry *debugfs_root;
0058 #endif
0059 };
0060
0061 struct moxtet_driver {
0062 const enum turris_mox_module_id *id_table;
0063 struct device_driver driver;
0064 };
0065
0066 static inline struct moxtet_driver *
0067 to_moxtet_driver(struct device_driver *drv)
0068 {
0069 if (!drv)
0070 return NULL;
0071 return container_of(drv, struct moxtet_driver, driver);
0072 }
0073
0074 extern int __moxtet_register_driver(struct module *owner,
0075 struct moxtet_driver *mdrv);
0076
0077 static inline void moxtet_unregister_driver(struct moxtet_driver *mdrv)
0078 {
0079 if (mdrv)
0080 driver_unregister(&mdrv->driver);
0081 }
0082
0083 #define moxtet_register_driver(driver) \
0084 __moxtet_register_driver(THIS_MODULE, driver)
0085
0086 #define module_moxtet_driver(__moxtet_driver) \
0087 module_driver(__moxtet_driver, moxtet_register_driver, \
0088 moxtet_unregister_driver)
0089
0090 struct moxtet_device {
0091 struct device dev;
0092 struct moxtet *moxtet;
0093 enum turris_mox_module_id id;
0094 unsigned int idx;
0095 };
0096
0097 extern int moxtet_device_read(struct device *dev);
0098 extern int moxtet_device_write(struct device *dev, u8 val);
0099 extern int moxtet_device_written(struct device *dev);
0100
0101 static inline struct moxtet_device *
0102 to_moxtet_device(struct device *dev)
0103 {
0104 if (!dev)
0105 return NULL;
0106 return container_of(dev, struct moxtet_device, dev);
0107 }
0108
0109 #endif