xref: /linux-6.15/include/linux/fsi.h (revision d69d8048)
11802d0beSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */
20508ad1fSJeremy Kerr /* FSI device & driver interfaces
30508ad1fSJeremy Kerr  *
40508ad1fSJeremy Kerr  * Copyright (C) IBM Corporation 2016
50508ad1fSJeremy Kerr  */
60508ad1fSJeremy Kerr 
70508ad1fSJeremy Kerr #ifndef LINUX_FSI_H
80508ad1fSJeremy Kerr #define LINUX_FSI_H
90508ad1fSJeremy Kerr 
100508ad1fSJeremy Kerr #include <linux/device.h>
110508ad1fSJeremy Kerr 
12fda07a6cSJeremy Kerr struct fsi_device {
13fda07a6cSJeremy Kerr 	struct device		dev;
14dd37eed7SJeremy Kerr 	u8			engine_type;
15dd37eed7SJeremy Kerr 	u8			version;
16f7ade2a6SJeremy Kerr 	u8			unit;
17f7ade2a6SJeremy Kerr 	struct fsi_slave	*slave;
18f7ade2a6SJeremy Kerr 	uint32_t		addr;
19f7ade2a6SJeremy Kerr 	uint32_t		size;
20fda07a6cSJeremy Kerr };
21fda07a6cSJeremy Kerr 
224efe37f4SJeremy Kerr extern int fsi_device_read(struct fsi_device *dev, uint32_t addr,
234efe37f4SJeremy Kerr 		void *val, size_t size);
244efe37f4SJeremy Kerr extern int fsi_device_write(struct fsi_device *dev, uint32_t addr,
254efe37f4SJeremy Kerr 		const void *val, size_t size);
264efe37f4SJeremy Kerr extern int fsi_device_peek(struct fsi_device *dev, void *val);
274efe37f4SJeremy Kerr 
28dd37eed7SJeremy Kerr struct fsi_device_id {
29dd37eed7SJeremy Kerr 	u8	engine_type;
30dd37eed7SJeremy Kerr 	u8	version;
31dd37eed7SJeremy Kerr };
32dd37eed7SJeremy Kerr 
33dd37eed7SJeremy Kerr #define FSI_VERSION_ANY		0
34dd37eed7SJeremy Kerr 
35dd37eed7SJeremy Kerr #define FSI_DEVICE(t) \
36dd37eed7SJeremy Kerr 	.engine_type = (t), .version = FSI_VERSION_ANY,
37dd37eed7SJeremy Kerr 
38dd37eed7SJeremy Kerr #define FSI_DEVICE_VERSIONED(t, v) \
39dd37eed7SJeremy Kerr 	.engine_type = (t), .version = (v),
40dd37eed7SJeremy Kerr 
41fda07a6cSJeremy Kerr struct fsi_driver {
42fda07a6cSJeremy Kerr 	struct device_driver		drv;
43dd37eed7SJeremy Kerr 	const struct fsi_device_id	*id_table;
44fda07a6cSJeremy Kerr };
45fda07a6cSJeremy Kerr 
46fda07a6cSJeremy Kerr #define to_fsi_dev(devp) container_of(devp, struct fsi_device, dev)
47*d69d8048SGreg Kroah-Hartman #define to_fsi_drv(drvp) container_of_const(drvp, struct fsi_driver, drv)
48fda07a6cSJeremy Kerr 
49356d8009SChristopher Bostic extern int fsi_driver_register(struct fsi_driver *fsi_drv);
50356d8009SChristopher Bostic extern void fsi_driver_unregister(struct fsi_driver *fsi_drv);
51356d8009SChristopher Bostic 
52356d8009SChristopher Bostic /* module_fsi_driver() - Helper macro for drivers that don't do
53356d8009SChristopher Bostic  * anything special in module init/exit.  This eliminates a lot of
54356d8009SChristopher Bostic  * boilerplate.  Each module may only use this macro once, and
55356d8009SChristopher Bostic  * calling it replaces module_init() and module_exit()
56356d8009SChristopher Bostic  */
57356d8009SChristopher Bostic #define module_fsi_driver(__fsi_driver) \
58356d8009SChristopher Bostic 		module_driver(__fsi_driver, fsi_driver_register, \
59356d8009SChristopher Bostic 				fsi_driver_unregister)
60356d8009SChristopher Bostic 
61da36cadfSJeremy Kerr /* direct slave API */
62da36cadfSJeremy Kerr extern int fsi_slave_claim_range(struct fsi_slave *slave,
63da36cadfSJeremy Kerr 		uint32_t addr, uint32_t size);
64da36cadfSJeremy Kerr extern void fsi_slave_release_range(struct fsi_slave *slave,
65da36cadfSJeremy Kerr 		uint32_t addr, uint32_t size);
66da36cadfSJeremy Kerr extern int fsi_slave_read(struct fsi_slave *slave, uint32_t addr,
67da36cadfSJeremy Kerr 		void *val, size_t size);
68da36cadfSJeremy Kerr extern int fsi_slave_write(struct fsi_slave *slave, uint32_t addr,
69da36cadfSJeremy Kerr 		const void *val, size_t size);
70da36cadfSJeremy Kerr 
710508ad1fSJeremy Kerr extern struct bus_type fsi_bus_type;
720ab5fe53SBenjamin Herrenschmidt extern const struct device_type fsi_cdev_type;
730ab5fe53SBenjamin Herrenschmidt 
740ab5fe53SBenjamin Herrenschmidt enum fsi_dev_type {
750ab5fe53SBenjamin Herrenschmidt 	fsi_dev_cfam,
760ab5fe53SBenjamin Herrenschmidt 	fsi_dev_sbefifo,
770ab5fe53SBenjamin Herrenschmidt 	fsi_dev_scom,
780ab5fe53SBenjamin Herrenschmidt 	fsi_dev_occ
790ab5fe53SBenjamin Herrenschmidt };
800ab5fe53SBenjamin Herrenschmidt 
810ab5fe53SBenjamin Herrenschmidt extern int fsi_get_new_minor(struct fsi_device *fdev, enum fsi_dev_type type,
820ab5fe53SBenjamin Herrenschmidt 			     dev_t *out_dev, int *out_index);
830ab5fe53SBenjamin Herrenschmidt extern void fsi_free_minor(dev_t dev);
840508ad1fSJeremy Kerr 
850508ad1fSJeremy Kerr #endif /* LINUX_FSI_H */
86