15bc7f990SMarek Behún /* SPDX-License-Identifier: GPL-2.0 */
25bc7f990SMarek Behún /*
35bc7f990SMarek Behún * Turris Mox module configuration bus driver
45bc7f990SMarek Behún *
5b37c3848SMarek Behún * Copyright (C) 2019 Marek Behún <[email protected]>
65bc7f990SMarek Behún */
75bc7f990SMarek Behún
85bc7f990SMarek Behún #ifndef __LINUX_MOXTET_H
95bc7f990SMarek Behún #define __LINUX_MOXTET_H
105bc7f990SMarek Behún
115bc7f990SMarek Behún #include <linux/device.h>
125bc7f990SMarek Behún #include <linux/irq.h>
135bc7f990SMarek Behún #include <linux/irqdomain.h>
145bc7f990SMarek Behún #include <linux/mutex.h>
155bc7f990SMarek Behún
165bc7f990SMarek Behún #define TURRIS_MOX_MAX_MODULES 10
175bc7f990SMarek Behún
185bc7f990SMarek Behún enum turris_mox_cpu_module_id {
195bc7f990SMarek Behún TURRIS_MOX_CPU_ID_EMMC = 0x00,
205bc7f990SMarek Behún TURRIS_MOX_CPU_ID_SD = 0x10,
215bc7f990SMarek Behún };
225bc7f990SMarek Behún
235bc7f990SMarek Behún enum turris_mox_module_id {
245bc7f990SMarek Behún TURRIS_MOX_MODULE_FIRST = 0x01,
255bc7f990SMarek Behún
265bc7f990SMarek Behún TURRIS_MOX_MODULE_SFP = 0x01,
275bc7f990SMarek Behún TURRIS_MOX_MODULE_PCI = 0x02,
285bc7f990SMarek Behún TURRIS_MOX_MODULE_TOPAZ = 0x03,
295bc7f990SMarek Behún TURRIS_MOX_MODULE_PERIDOT = 0x04,
305bc7f990SMarek Behún TURRIS_MOX_MODULE_USB3 = 0x05,
315bc7f990SMarek Behún TURRIS_MOX_MODULE_PCI_BRIDGE = 0x06,
325bc7f990SMarek Behún
335bc7f990SMarek Behún TURRIS_MOX_MODULE_LAST = 0x06,
345bc7f990SMarek Behún };
355bc7f990SMarek Behún
365bc7f990SMarek Behún #define MOXTET_NIRQS 16
375bc7f990SMarek Behún
385bc7f990SMarek Behún struct moxtet {
395bc7f990SMarek Behún struct device *dev;
405bc7f990SMarek Behún struct mutex lock;
415bc7f990SMarek Behún u8 modules[TURRIS_MOX_MAX_MODULES];
425bc7f990SMarek Behún int count;
435bc7f990SMarek Behún u8 tx[TURRIS_MOX_MAX_MODULES];
445bc7f990SMarek Behún int dev_irq;
455bc7f990SMarek Behún struct {
465bc7f990SMarek Behún struct irq_domain *domain;
475bc7f990SMarek Behún struct irq_chip chip;
485bc7f990SMarek Behún unsigned long masked, exists;
495bc7f990SMarek Behún struct moxtet_irqpos {
505bc7f990SMarek Behún u8 idx;
515bc7f990SMarek Behún u8 bit;
525bc7f990SMarek Behún } position[MOXTET_NIRQS];
535bc7f990SMarek Behún } irq;
545bc7f990SMarek Behún #ifdef CONFIG_DEBUG_FS
555bc7f990SMarek Behún struct dentry *debugfs_root;
565bc7f990SMarek Behún #endif
575bc7f990SMarek Behún };
585bc7f990SMarek Behún
595bc7f990SMarek Behún struct moxtet_driver {
605bc7f990SMarek Behún const enum turris_mox_module_id *id_table;
615bc7f990SMarek Behún struct device_driver driver;
625bc7f990SMarek Behún };
635bc7f990SMarek Behún
64*d69d8048SGreg Kroah-Hartman #define to_moxtet_driver(__drv) \
65*d69d8048SGreg Kroah-Hartman ( __drv ? container_of_const(__drv, struct moxtet_driver, driver) : NULL )
665bc7f990SMarek Behún
675bc7f990SMarek Behún extern int __moxtet_register_driver(struct module *owner,
685bc7f990SMarek Behún struct moxtet_driver *mdrv);
695bc7f990SMarek Behún
moxtet_unregister_driver(struct moxtet_driver * mdrv)705bc7f990SMarek Behún static inline void moxtet_unregister_driver(struct moxtet_driver *mdrv)
715bc7f990SMarek Behún {
725bc7f990SMarek Behún if (mdrv)
735bc7f990SMarek Behún driver_unregister(&mdrv->driver);
745bc7f990SMarek Behún }
755bc7f990SMarek Behún
765bc7f990SMarek Behún #define moxtet_register_driver(driver) \
775bc7f990SMarek Behún __moxtet_register_driver(THIS_MODULE, driver)
785bc7f990SMarek Behún
795bc7f990SMarek Behún #define module_moxtet_driver(__moxtet_driver) \
805bc7f990SMarek Behún module_driver(__moxtet_driver, moxtet_register_driver, \
815bc7f990SMarek Behún moxtet_unregister_driver)
825bc7f990SMarek Behún
835bc7f990SMarek Behún struct moxtet_device {
845bc7f990SMarek Behún struct device dev;
855bc7f990SMarek Behún struct moxtet *moxtet;
865bc7f990SMarek Behún enum turris_mox_module_id id;
875bc7f990SMarek Behún unsigned int idx;
885bc7f990SMarek Behún };
895bc7f990SMarek Behún
905bc7f990SMarek Behún extern int moxtet_device_read(struct device *dev);
915bc7f990SMarek Behún extern int moxtet_device_write(struct device *dev, u8 val);
925bc7f990SMarek Behún extern int moxtet_device_written(struct device *dev);
935bc7f990SMarek Behún
945bc7f990SMarek Behún static inline struct moxtet_device *
to_moxtet_device(struct device * dev)955bc7f990SMarek Behún to_moxtet_device(struct device *dev)
965bc7f990SMarek Behún {
975bc7f990SMarek Behún if (!dev)
985bc7f990SMarek Behún return NULL;
995bc7f990SMarek Behún return container_of(dev, struct moxtet_device, dev);
1005bc7f990SMarek Behún }
1015bc7f990SMarek Behún
1025bc7f990SMarek Behún #endif /* __LINUX_MOXTET_H */
103