xref: /openbmc/linux/include/linux/greybus.h (revision ec0ad868)
1ec0ad868SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
2ec0ad868SGreg Kroah-Hartman /*
3ec0ad868SGreg Kroah-Hartman  * Greybus driver and device API
4ec0ad868SGreg Kroah-Hartman  *
5ec0ad868SGreg Kroah-Hartman  * Copyright 2014-2015 Google Inc.
6ec0ad868SGreg Kroah-Hartman  * Copyright 2014-2015 Linaro Ltd.
7ec0ad868SGreg Kroah-Hartman  */
8ec0ad868SGreg Kroah-Hartman 
9ec0ad868SGreg Kroah-Hartman #ifndef __LINUX_GREYBUS_H
10ec0ad868SGreg Kroah-Hartman #define __LINUX_GREYBUS_H
11ec0ad868SGreg Kroah-Hartman 
12ec0ad868SGreg Kroah-Hartman #ifdef __KERNEL__
13ec0ad868SGreg Kroah-Hartman 
14ec0ad868SGreg Kroah-Hartman #include <linux/kernel.h>
15ec0ad868SGreg Kroah-Hartman #include <linux/types.h>
16ec0ad868SGreg Kroah-Hartman #include <linux/list.h>
17ec0ad868SGreg Kroah-Hartman #include <linux/slab.h>
18ec0ad868SGreg Kroah-Hartman #include <linux/device.h>
19ec0ad868SGreg Kroah-Hartman #include <linux/module.h>
20ec0ad868SGreg Kroah-Hartman #include <linux/pm_runtime.h>
21ec0ad868SGreg Kroah-Hartman #include <linux/idr.h>
22ec0ad868SGreg Kroah-Hartman 
23ec0ad868SGreg Kroah-Hartman #include <linux/greybus/greybus_id.h>
24ec0ad868SGreg Kroah-Hartman #include <linux/greybus/greybus_manifest.h>
25ec0ad868SGreg Kroah-Hartman #include <linux/greybus/greybus_protocols.h>
26ec0ad868SGreg Kroah-Hartman #include <linux/greybus/manifest.h>
27ec0ad868SGreg Kroah-Hartman #include <linux/greybus/hd.h>
28ec0ad868SGreg Kroah-Hartman #include <linux/greybus/svc.h>
29ec0ad868SGreg Kroah-Hartman #include <linux/greybus/control.h>
30ec0ad868SGreg Kroah-Hartman #include <linux/greybus/module.h>
31ec0ad868SGreg Kroah-Hartman #include <linux/greybus/interface.h>
32ec0ad868SGreg Kroah-Hartman #include <linux/greybus/bundle.h>
33ec0ad868SGreg Kroah-Hartman #include <linux/greybus/connection.h>
34ec0ad868SGreg Kroah-Hartman #include <linux/greybus/operation.h>
35ec0ad868SGreg Kroah-Hartman 
36ec0ad868SGreg Kroah-Hartman /* Matches up with the Greybus Protocol specification document */
37ec0ad868SGreg Kroah-Hartman #define GREYBUS_VERSION_MAJOR	0x00
38ec0ad868SGreg Kroah-Hartman #define GREYBUS_VERSION_MINOR	0x01
39ec0ad868SGreg Kroah-Hartman 
40ec0ad868SGreg Kroah-Hartman #define GREYBUS_ID_MATCH_DEVICE \
41ec0ad868SGreg Kroah-Hartman 	(GREYBUS_ID_MATCH_VENDOR | GREYBUS_ID_MATCH_PRODUCT)
42ec0ad868SGreg Kroah-Hartman 
43ec0ad868SGreg Kroah-Hartman #define GREYBUS_DEVICE(v, p)					\
44ec0ad868SGreg Kroah-Hartman 	.match_flags	= GREYBUS_ID_MATCH_DEVICE,		\
45ec0ad868SGreg Kroah-Hartman 	.vendor		= (v),					\
46ec0ad868SGreg Kroah-Hartman 	.product	= (p),
47ec0ad868SGreg Kroah-Hartman 
48ec0ad868SGreg Kroah-Hartman #define GREYBUS_DEVICE_CLASS(c)					\
49ec0ad868SGreg Kroah-Hartman 	.match_flags	= GREYBUS_ID_MATCH_CLASS,		\
50ec0ad868SGreg Kroah-Hartman 	.class		= (c),
51ec0ad868SGreg Kroah-Hartman 
52ec0ad868SGreg Kroah-Hartman /* Maximum number of CPorts */
53ec0ad868SGreg Kroah-Hartman #define CPORT_ID_MAX	4095		/* UniPro max id is 4095 */
54ec0ad868SGreg Kroah-Hartman #define CPORT_ID_BAD	U16_MAX
55ec0ad868SGreg Kroah-Hartman 
56ec0ad868SGreg Kroah-Hartman struct greybus_driver {
57ec0ad868SGreg Kroah-Hartman 	const char *name;
58ec0ad868SGreg Kroah-Hartman 
59ec0ad868SGreg Kroah-Hartman 	int (*probe)(struct gb_bundle *bundle,
60ec0ad868SGreg Kroah-Hartman 		     const struct greybus_bundle_id *id);
61ec0ad868SGreg Kroah-Hartman 	void (*disconnect)(struct gb_bundle *bundle);
62ec0ad868SGreg Kroah-Hartman 
63ec0ad868SGreg Kroah-Hartman 	const struct greybus_bundle_id *id_table;
64ec0ad868SGreg Kroah-Hartman 
65ec0ad868SGreg Kroah-Hartman 	struct device_driver driver;
66ec0ad868SGreg Kroah-Hartman };
67ec0ad868SGreg Kroah-Hartman #define to_greybus_driver(d) container_of(d, struct greybus_driver, driver)
68ec0ad868SGreg Kroah-Hartman 
greybus_set_drvdata(struct gb_bundle * bundle,void * data)69ec0ad868SGreg Kroah-Hartman static inline void greybus_set_drvdata(struct gb_bundle *bundle, void *data)
70ec0ad868SGreg Kroah-Hartman {
71ec0ad868SGreg Kroah-Hartman 	dev_set_drvdata(&bundle->dev, data);
72ec0ad868SGreg Kroah-Hartman }
73ec0ad868SGreg Kroah-Hartman 
greybus_get_drvdata(struct gb_bundle * bundle)74ec0ad868SGreg Kroah-Hartman static inline void *greybus_get_drvdata(struct gb_bundle *bundle)
75ec0ad868SGreg Kroah-Hartman {
76ec0ad868SGreg Kroah-Hartman 	return dev_get_drvdata(&bundle->dev);
77ec0ad868SGreg Kroah-Hartman }
78ec0ad868SGreg Kroah-Hartman 
79ec0ad868SGreg Kroah-Hartman /* Don't call these directly, use the module_greybus_driver() macro instead */
80ec0ad868SGreg Kroah-Hartman int greybus_register_driver(struct greybus_driver *driver,
81ec0ad868SGreg Kroah-Hartman 			    struct module *module, const char *mod_name);
82ec0ad868SGreg Kroah-Hartman void greybus_deregister_driver(struct greybus_driver *driver);
83ec0ad868SGreg Kroah-Hartman 
84ec0ad868SGreg Kroah-Hartman /* define to get proper THIS_MODULE and KBUILD_MODNAME values */
85ec0ad868SGreg Kroah-Hartman #define greybus_register(driver) \
86ec0ad868SGreg Kroah-Hartman 	greybus_register_driver(driver, THIS_MODULE, KBUILD_MODNAME)
87ec0ad868SGreg Kroah-Hartman #define greybus_deregister(driver) \
88ec0ad868SGreg Kroah-Hartman 	greybus_deregister_driver(driver)
89ec0ad868SGreg Kroah-Hartman 
90ec0ad868SGreg Kroah-Hartman /**
91ec0ad868SGreg Kroah-Hartman  * module_greybus_driver() - Helper macro for registering a Greybus driver
92ec0ad868SGreg Kroah-Hartman  * @__greybus_driver: greybus_driver structure
93ec0ad868SGreg Kroah-Hartman  *
94ec0ad868SGreg Kroah-Hartman  * Helper macro for Greybus drivers to set up proper module init / exit
95ec0ad868SGreg Kroah-Hartman  * functions.  Replaces module_init() and module_exit() and keeps people from
96ec0ad868SGreg Kroah-Hartman  * printing pointless things to the kernel log when their driver is loaded.
97ec0ad868SGreg Kroah-Hartman  */
98ec0ad868SGreg Kroah-Hartman #define module_greybus_driver(__greybus_driver)	\
99ec0ad868SGreg Kroah-Hartman 	module_driver(__greybus_driver, greybus_register, greybus_deregister)
100ec0ad868SGreg Kroah-Hartman 
101ec0ad868SGreg Kroah-Hartman int greybus_disabled(void);
102ec0ad868SGreg Kroah-Hartman 
103ec0ad868SGreg Kroah-Hartman void gb_debugfs_init(void);
104ec0ad868SGreg Kroah-Hartman void gb_debugfs_cleanup(void);
105ec0ad868SGreg Kroah-Hartman struct dentry *gb_debugfs_get(void);
106ec0ad868SGreg Kroah-Hartman 
107ec0ad868SGreg Kroah-Hartman extern struct bus_type greybus_bus_type;
108ec0ad868SGreg Kroah-Hartman 
109ec0ad868SGreg Kroah-Hartman extern struct device_type greybus_hd_type;
110ec0ad868SGreg Kroah-Hartman extern struct device_type greybus_module_type;
111ec0ad868SGreg Kroah-Hartman extern struct device_type greybus_interface_type;
112ec0ad868SGreg Kroah-Hartman extern struct device_type greybus_control_type;
113ec0ad868SGreg Kroah-Hartman extern struct device_type greybus_bundle_type;
114ec0ad868SGreg Kroah-Hartman extern struct device_type greybus_svc_type;
115ec0ad868SGreg Kroah-Hartman 
is_gb_host_device(const struct device * dev)116ec0ad868SGreg Kroah-Hartman static inline int is_gb_host_device(const struct device *dev)
117ec0ad868SGreg Kroah-Hartman {
118ec0ad868SGreg Kroah-Hartman 	return dev->type == &greybus_hd_type;
119ec0ad868SGreg Kroah-Hartman }
120ec0ad868SGreg Kroah-Hartman 
is_gb_module(const struct device * dev)121ec0ad868SGreg Kroah-Hartman static inline int is_gb_module(const struct device *dev)
122ec0ad868SGreg Kroah-Hartman {
123ec0ad868SGreg Kroah-Hartman 	return dev->type == &greybus_module_type;
124ec0ad868SGreg Kroah-Hartman }
125ec0ad868SGreg Kroah-Hartman 
is_gb_interface(const struct device * dev)126ec0ad868SGreg Kroah-Hartman static inline int is_gb_interface(const struct device *dev)
127ec0ad868SGreg Kroah-Hartman {
128ec0ad868SGreg Kroah-Hartman 	return dev->type == &greybus_interface_type;
129ec0ad868SGreg Kroah-Hartman }
130ec0ad868SGreg Kroah-Hartman 
is_gb_control(const struct device * dev)131ec0ad868SGreg Kroah-Hartman static inline int is_gb_control(const struct device *dev)
132ec0ad868SGreg Kroah-Hartman {
133ec0ad868SGreg Kroah-Hartman 	return dev->type == &greybus_control_type;
134ec0ad868SGreg Kroah-Hartman }
135ec0ad868SGreg Kroah-Hartman 
is_gb_bundle(const struct device * dev)136ec0ad868SGreg Kroah-Hartman static inline int is_gb_bundle(const struct device *dev)
137ec0ad868SGreg Kroah-Hartman {
138ec0ad868SGreg Kroah-Hartman 	return dev->type == &greybus_bundle_type;
139ec0ad868SGreg Kroah-Hartman }
140ec0ad868SGreg Kroah-Hartman 
is_gb_svc(const struct device * dev)141ec0ad868SGreg Kroah-Hartman static inline int is_gb_svc(const struct device *dev)
142ec0ad868SGreg Kroah-Hartman {
143ec0ad868SGreg Kroah-Hartman 	return dev->type == &greybus_svc_type;
144ec0ad868SGreg Kroah-Hartman }
145ec0ad868SGreg Kroah-Hartman 
cport_id_valid(struct gb_host_device * hd,u16 cport_id)146ec0ad868SGreg Kroah-Hartman static inline bool cport_id_valid(struct gb_host_device *hd, u16 cport_id)
147ec0ad868SGreg Kroah-Hartman {
148ec0ad868SGreg Kroah-Hartman 	return cport_id != CPORT_ID_BAD && cport_id < hd->num_cports;
149ec0ad868SGreg Kroah-Hartman }
150ec0ad868SGreg Kroah-Hartman 
151ec0ad868SGreg Kroah-Hartman #endif /* __KERNEL__ */
152ec0ad868SGreg Kroah-Hartman #endif /* __LINUX_GREYBUS_H */
153