xref: /linux-6.15/include/linux/serdev.h (revision cd6484e1)
1*cd6484e1SRob Herring /*
2*cd6484e1SRob Herring  * Copyright (C) 2016-2017 Linaro Ltd., Rob Herring <[email protected]>
3*cd6484e1SRob Herring  *
4*cd6484e1SRob Herring  * This program is free software; you can redistribute it and/or modify
5*cd6484e1SRob Herring  * it under the terms of the GNU General Public License version 2 and
6*cd6484e1SRob Herring  * only version 2 as published by the Free Software Foundation.
7*cd6484e1SRob Herring  *
8*cd6484e1SRob Herring  * This program is distributed in the hope that it will be useful,
9*cd6484e1SRob Herring  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10*cd6484e1SRob Herring  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11*cd6484e1SRob Herring  * GNU General Public License for more details.
12*cd6484e1SRob Herring  */
13*cd6484e1SRob Herring #ifndef _LINUX_SERDEV_H
14*cd6484e1SRob Herring #define _LINUX_SERDEV_H
15*cd6484e1SRob Herring 
16*cd6484e1SRob Herring #include <linux/types.h>
17*cd6484e1SRob Herring #include <linux/device.h>
18*cd6484e1SRob Herring 
19*cd6484e1SRob Herring struct serdev_controller;
20*cd6484e1SRob Herring struct serdev_device;
21*cd6484e1SRob Herring 
22*cd6484e1SRob Herring /*
23*cd6484e1SRob Herring  * serdev device structures
24*cd6484e1SRob Herring  */
25*cd6484e1SRob Herring 
26*cd6484e1SRob Herring /**
27*cd6484e1SRob Herring  * struct serdev_device_ops - Callback operations for a serdev device
28*cd6484e1SRob Herring  * @receive_buf:	Function called with data received from device.
29*cd6484e1SRob Herring  * @write_wakeup:	Function called when ready to transmit more data.
30*cd6484e1SRob Herring  */
31*cd6484e1SRob Herring struct serdev_device_ops {
32*cd6484e1SRob Herring 	int (*receive_buf)(struct serdev_device *, const unsigned char *, size_t);
33*cd6484e1SRob Herring 	void (*write_wakeup)(struct serdev_device *);
34*cd6484e1SRob Herring };
35*cd6484e1SRob Herring 
36*cd6484e1SRob Herring /**
37*cd6484e1SRob Herring  * struct serdev_device - Basic representation of an serdev device
38*cd6484e1SRob Herring  * @dev:	Driver model representation of the device.
39*cd6484e1SRob Herring  * @nr:		Device number on serdev bus.
40*cd6484e1SRob Herring  * @ctrl:	serdev controller managing this device.
41*cd6484e1SRob Herring  * @ops:	Device operations.
42*cd6484e1SRob Herring  */
43*cd6484e1SRob Herring struct serdev_device {
44*cd6484e1SRob Herring 	struct device dev;
45*cd6484e1SRob Herring 	int nr;
46*cd6484e1SRob Herring 	struct serdev_controller *ctrl;
47*cd6484e1SRob Herring 	const struct serdev_device_ops *ops;
48*cd6484e1SRob Herring };
49*cd6484e1SRob Herring 
50*cd6484e1SRob Herring static inline struct serdev_device *to_serdev_device(struct device *d)
51*cd6484e1SRob Herring {
52*cd6484e1SRob Herring 	return container_of(d, struct serdev_device, dev);
53*cd6484e1SRob Herring }
54*cd6484e1SRob Herring 
55*cd6484e1SRob Herring /**
56*cd6484e1SRob Herring  * struct serdev_device_driver - serdev slave device driver
57*cd6484e1SRob Herring  * @driver:	serdev device drivers should initialize name field of this
58*cd6484e1SRob Herring  *		structure.
59*cd6484e1SRob Herring  * @probe:	binds this driver to a serdev device.
60*cd6484e1SRob Herring  * @remove:	unbinds this driver from the serdev device.
61*cd6484e1SRob Herring  */
62*cd6484e1SRob Herring struct serdev_device_driver {
63*cd6484e1SRob Herring 	struct device_driver driver;
64*cd6484e1SRob Herring 	int	(*probe)(struct serdev_device *);
65*cd6484e1SRob Herring 	void	(*remove)(struct serdev_device *);
66*cd6484e1SRob Herring };
67*cd6484e1SRob Herring 
68*cd6484e1SRob Herring static inline struct serdev_device_driver *to_serdev_device_driver(struct device_driver *d)
69*cd6484e1SRob Herring {
70*cd6484e1SRob Herring 	return container_of(d, struct serdev_device_driver, driver);
71*cd6484e1SRob Herring }
72*cd6484e1SRob Herring 
73*cd6484e1SRob Herring /*
74*cd6484e1SRob Herring  * serdev controller structures
75*cd6484e1SRob Herring  */
76*cd6484e1SRob Herring struct serdev_controller_ops {
77*cd6484e1SRob Herring 	int (*write_buf)(struct serdev_controller *, const unsigned char *, size_t);
78*cd6484e1SRob Herring 	void (*write_flush)(struct serdev_controller *);
79*cd6484e1SRob Herring 	int (*write_room)(struct serdev_controller *);
80*cd6484e1SRob Herring 	int (*open)(struct serdev_controller *);
81*cd6484e1SRob Herring 	void (*close)(struct serdev_controller *);
82*cd6484e1SRob Herring 	void (*set_flow_control)(struct serdev_controller *, bool);
83*cd6484e1SRob Herring 	unsigned int (*set_baudrate)(struct serdev_controller *, unsigned int);
84*cd6484e1SRob Herring };
85*cd6484e1SRob Herring 
86*cd6484e1SRob Herring /**
87*cd6484e1SRob Herring  * struct serdev_controller - interface to the serdev controller
88*cd6484e1SRob Herring  * @dev:	Driver model representation of the device.
89*cd6484e1SRob Herring  * @nr:		number identifier for this controller/bus.
90*cd6484e1SRob Herring  * @serdev:	Pointer to slave device for this controller.
91*cd6484e1SRob Herring  * @ops:	Controller operations.
92*cd6484e1SRob Herring  */
93*cd6484e1SRob Herring struct serdev_controller {
94*cd6484e1SRob Herring 	struct device		dev;
95*cd6484e1SRob Herring 	unsigned int		nr;
96*cd6484e1SRob Herring 	struct serdev_device	*serdev;
97*cd6484e1SRob Herring 	const struct serdev_controller_ops *ops;
98*cd6484e1SRob Herring };
99*cd6484e1SRob Herring 
100*cd6484e1SRob Herring static inline struct serdev_controller *to_serdev_controller(struct device *d)
101*cd6484e1SRob Herring {
102*cd6484e1SRob Herring 	return container_of(d, struct serdev_controller, dev);
103*cd6484e1SRob Herring }
104*cd6484e1SRob Herring 
105*cd6484e1SRob Herring static inline void *serdev_device_get_drvdata(const struct serdev_device *serdev)
106*cd6484e1SRob Herring {
107*cd6484e1SRob Herring 	return dev_get_drvdata(&serdev->dev);
108*cd6484e1SRob Herring }
109*cd6484e1SRob Herring 
110*cd6484e1SRob Herring static inline void serdev_device_set_drvdata(struct serdev_device *serdev, void *data)
111*cd6484e1SRob Herring {
112*cd6484e1SRob Herring 	dev_set_drvdata(&serdev->dev, data);
113*cd6484e1SRob Herring }
114*cd6484e1SRob Herring 
115*cd6484e1SRob Herring /**
116*cd6484e1SRob Herring  * serdev_device_put() - decrement serdev device refcount
117*cd6484e1SRob Herring  * @serdev	serdev device.
118*cd6484e1SRob Herring  */
119*cd6484e1SRob Herring static inline void serdev_device_put(struct serdev_device *serdev)
120*cd6484e1SRob Herring {
121*cd6484e1SRob Herring 	if (serdev)
122*cd6484e1SRob Herring 		put_device(&serdev->dev);
123*cd6484e1SRob Herring }
124*cd6484e1SRob Herring 
125*cd6484e1SRob Herring static inline void serdev_device_set_client_ops(struct serdev_device *serdev,
126*cd6484e1SRob Herring 					      const struct serdev_device_ops *ops)
127*cd6484e1SRob Herring {
128*cd6484e1SRob Herring 	serdev->ops = ops;
129*cd6484e1SRob Herring }
130*cd6484e1SRob Herring 
131*cd6484e1SRob Herring static inline
132*cd6484e1SRob Herring void *serdev_controller_get_drvdata(const struct serdev_controller *ctrl)
133*cd6484e1SRob Herring {
134*cd6484e1SRob Herring 	return ctrl ? dev_get_drvdata(&ctrl->dev) : NULL;
135*cd6484e1SRob Herring }
136*cd6484e1SRob Herring 
137*cd6484e1SRob Herring static inline void serdev_controller_set_drvdata(struct serdev_controller *ctrl,
138*cd6484e1SRob Herring 					       void *data)
139*cd6484e1SRob Herring {
140*cd6484e1SRob Herring 	dev_set_drvdata(&ctrl->dev, data);
141*cd6484e1SRob Herring }
142*cd6484e1SRob Herring 
143*cd6484e1SRob Herring /**
144*cd6484e1SRob Herring  * serdev_controller_put() - decrement controller refcount
145*cd6484e1SRob Herring  * @ctrl	serdev controller.
146*cd6484e1SRob Herring  */
147*cd6484e1SRob Herring static inline void serdev_controller_put(struct serdev_controller *ctrl)
148*cd6484e1SRob Herring {
149*cd6484e1SRob Herring 	if (ctrl)
150*cd6484e1SRob Herring 		put_device(&ctrl->dev);
151*cd6484e1SRob Herring }
152*cd6484e1SRob Herring 
153*cd6484e1SRob Herring struct serdev_device *serdev_device_alloc(struct serdev_controller *);
154*cd6484e1SRob Herring int serdev_device_add(struct serdev_device *);
155*cd6484e1SRob Herring void serdev_device_remove(struct serdev_device *);
156*cd6484e1SRob Herring 
157*cd6484e1SRob Herring struct serdev_controller *serdev_controller_alloc(struct device *, size_t);
158*cd6484e1SRob Herring int serdev_controller_add(struct serdev_controller *);
159*cd6484e1SRob Herring void serdev_controller_remove(struct serdev_controller *);
160*cd6484e1SRob Herring 
161*cd6484e1SRob Herring static inline void serdev_controller_write_wakeup(struct serdev_controller *ctrl)
162*cd6484e1SRob Herring {
163*cd6484e1SRob Herring 	struct serdev_device *serdev = ctrl->serdev;
164*cd6484e1SRob Herring 
165*cd6484e1SRob Herring 	if (!serdev || !serdev->ops->write_wakeup)
166*cd6484e1SRob Herring 		return;
167*cd6484e1SRob Herring 
168*cd6484e1SRob Herring 	serdev->ops->write_wakeup(ctrl->serdev);
169*cd6484e1SRob Herring }
170*cd6484e1SRob Herring 
171*cd6484e1SRob Herring static inline int serdev_controller_receive_buf(struct serdev_controller *ctrl,
172*cd6484e1SRob Herring 					      const unsigned char *data,
173*cd6484e1SRob Herring 					      size_t count)
174*cd6484e1SRob Herring {
175*cd6484e1SRob Herring 	struct serdev_device *serdev = ctrl->serdev;
176*cd6484e1SRob Herring 
177*cd6484e1SRob Herring 	if (!serdev || !serdev->ops->receive_buf)
178*cd6484e1SRob Herring 		return -EINVAL;
179*cd6484e1SRob Herring 
180*cd6484e1SRob Herring 	return serdev->ops->receive_buf(ctrl->serdev, data, count);
181*cd6484e1SRob Herring }
182*cd6484e1SRob Herring 
183*cd6484e1SRob Herring #if IS_ENABLED(CONFIG_SERIAL_DEV_BUS)
184*cd6484e1SRob Herring 
185*cd6484e1SRob Herring int serdev_device_open(struct serdev_device *);
186*cd6484e1SRob Herring void serdev_device_close(struct serdev_device *);
187*cd6484e1SRob Herring unsigned int serdev_device_set_baudrate(struct serdev_device *, unsigned int);
188*cd6484e1SRob Herring void serdev_device_set_flow_control(struct serdev_device *, bool);
189*cd6484e1SRob Herring int serdev_device_write_buf(struct serdev_device *, const unsigned char *, size_t);
190*cd6484e1SRob Herring void serdev_device_write_flush(struct serdev_device *);
191*cd6484e1SRob Herring int serdev_device_write_room(struct serdev_device *);
192*cd6484e1SRob Herring 
193*cd6484e1SRob Herring /*
194*cd6484e1SRob Herring  * serdev device driver functions
195*cd6484e1SRob Herring  */
196*cd6484e1SRob Herring int __serdev_device_driver_register(struct serdev_device_driver *, struct module *);
197*cd6484e1SRob Herring #define serdev_device_driver_register(sdrv) \
198*cd6484e1SRob Herring 	__serdev_device_driver_register(sdrv, THIS_MODULE)
199*cd6484e1SRob Herring 
200*cd6484e1SRob Herring /**
201*cd6484e1SRob Herring  * serdev_device_driver_unregister() - unregister an serdev client driver
202*cd6484e1SRob Herring  * @sdrv:	the driver to unregister
203*cd6484e1SRob Herring  */
204*cd6484e1SRob Herring static inline void serdev_device_driver_unregister(struct serdev_device_driver *sdrv)
205*cd6484e1SRob Herring {
206*cd6484e1SRob Herring 	if (sdrv)
207*cd6484e1SRob Herring 		driver_unregister(&sdrv->driver);
208*cd6484e1SRob Herring }
209*cd6484e1SRob Herring 
210*cd6484e1SRob Herring #define module_serdev_device_driver(__serdev_device_driver) \
211*cd6484e1SRob Herring 	module_driver(__serdev_device_driver, serdev_device_driver_register, \
212*cd6484e1SRob Herring 			serdev_device_driver_unregister)
213*cd6484e1SRob Herring 
214*cd6484e1SRob Herring #else
215*cd6484e1SRob Herring 
216*cd6484e1SRob Herring static inline int serdev_device_open(struct serdev_device *sdev)
217*cd6484e1SRob Herring {
218*cd6484e1SRob Herring 	return -ENODEV;
219*cd6484e1SRob Herring }
220*cd6484e1SRob Herring static inline void serdev_device_close(struct serdev_device *sdev) {}
221*cd6484e1SRob Herring static inline unsigned int serdev_device_set_baudrate(struct serdev_device *sdev, unsigned int baudrate)
222*cd6484e1SRob Herring {
223*cd6484e1SRob Herring 	return 0;
224*cd6484e1SRob Herring }
225*cd6484e1SRob Herring static inline void serdev_device_set_flow_control(struct serdev_device *sdev, bool enable) {}
226*cd6484e1SRob Herring static inline int serdev_device_write_buf(struct serdev_device *sdev, const unsigned char *buf, size_t count)
227*cd6484e1SRob Herring {
228*cd6484e1SRob Herring 	return -ENODEV;
229*cd6484e1SRob Herring }
230*cd6484e1SRob Herring static inline void serdev_device_write_flush(struct serdev_device *sdev) {}
231*cd6484e1SRob Herring static inline int serdev_device_write_room(struct serdev_device *sdev)
232*cd6484e1SRob Herring {
233*cd6484e1SRob Herring 	return 0;
234*cd6484e1SRob Herring }
235*cd6484e1SRob Herring 
236*cd6484e1SRob Herring #define serdev_device_driver_register(x)
237*cd6484e1SRob Herring #define serdev_device_driver_unregister(x)
238*cd6484e1SRob Herring 
239*cd6484e1SRob Herring #endif /* CONFIG_SERIAL_DEV_BUS */
240*cd6484e1SRob Herring 
241*cd6484e1SRob Herring #endif /*_LINUX_SERDEV_H */
242