xref: /linux-6.15/include/linux/moxtet.h (revision d69d8048)
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