xref: /linux-6.15/include/linux/framer/framer.h (revision 82c944d0)
1*82c944d0SHerve Codina /* SPDX-License-Identifier: GPL-2.0-or-later */
2*82c944d0SHerve Codina /*
3*82c944d0SHerve Codina  * Generic framer header file
4*82c944d0SHerve Codina  *
5*82c944d0SHerve Codina  * Copyright 2023 CS GROUP France
6*82c944d0SHerve Codina  *
7*82c944d0SHerve Codina  * Author: Herve Codina <[email protected]>
8*82c944d0SHerve Codina  */
9*82c944d0SHerve Codina 
10*82c944d0SHerve Codina #ifndef __DRIVERS_FRAMER_H
11*82c944d0SHerve Codina #define __DRIVERS_FRAMER_H
12*82c944d0SHerve Codina 
13*82c944d0SHerve Codina #include <linux/err.h>
14*82c944d0SHerve Codina #include <linux/mutex.h>
15*82c944d0SHerve Codina #include <linux/notifier.h>
16*82c944d0SHerve Codina #include <linux/of.h>
17*82c944d0SHerve Codina #include <linux/device.h>
18*82c944d0SHerve Codina #include <linux/workqueue.h>
19*82c944d0SHerve Codina 
20*82c944d0SHerve Codina /**
21*82c944d0SHerve Codina  * enum framer_iface - Framer interface
22*82c944d0SHerve Codina  * @FRAMER_IFACE_E1: E1 interface
23*82c944d0SHerve Codina  * @FRAMER_IFACE_T1: T1 interface
24*82c944d0SHerve Codina  */
25*82c944d0SHerve Codina enum framer_iface {
26*82c944d0SHerve Codina 	FRAMER_IFACE_E1,
27*82c944d0SHerve Codina 	FRAMER_IFACE_T1,
28*82c944d0SHerve Codina };
29*82c944d0SHerve Codina 
30*82c944d0SHerve Codina /**
31*82c944d0SHerve Codina  * enum framer_clock_type - Framer clock type
32*82c944d0SHerve Codina  * @FRAMER_CLOCK_EXT: External clock
33*82c944d0SHerve Codina  * @FRAMER_CLOCK_INT: Internal clock
34*82c944d0SHerve Codina  */
35*82c944d0SHerve Codina enum framer_clock_type {
36*82c944d0SHerve Codina 	FRAMER_CLOCK_EXT,
37*82c944d0SHerve Codina 	FRAMER_CLOCK_INT,
38*82c944d0SHerve Codina };
39*82c944d0SHerve Codina 
40*82c944d0SHerve Codina /**
41*82c944d0SHerve Codina  * struct framer_config - Framer configuration
42*82c944d0SHerve Codina  * @iface: Framer line interface
43*82c944d0SHerve Codina  * @clock_type: Framer clock type
44*82c944d0SHerve Codina  * @line_clock_rate: Framer line clock rate
45*82c944d0SHerve Codina  */
46*82c944d0SHerve Codina struct framer_config {
47*82c944d0SHerve Codina 	enum framer_iface iface;
48*82c944d0SHerve Codina 	enum framer_clock_type clock_type;
49*82c944d0SHerve Codina 	unsigned long line_clock_rate;
50*82c944d0SHerve Codina };
51*82c944d0SHerve Codina 
52*82c944d0SHerve Codina /**
53*82c944d0SHerve Codina  * struct framer_status - Framer status
54*82c944d0SHerve Codina  * @link_is_on: Framer link state. true, the link is on, false, the link is off.
55*82c944d0SHerve Codina  */
56*82c944d0SHerve Codina struct framer_status {
57*82c944d0SHerve Codina 	bool link_is_on;
58*82c944d0SHerve Codina };
59*82c944d0SHerve Codina 
60*82c944d0SHerve Codina /**
61*82c944d0SHerve Codina  * enum framer_event - Event available for notification
62*82c944d0SHerve Codina  * @FRAMER_EVENT_STATUS: Event notified on framer_status changes
63*82c944d0SHerve Codina  */
64*82c944d0SHerve Codina enum framer_event {
65*82c944d0SHerve Codina 	FRAMER_EVENT_STATUS,
66*82c944d0SHerve Codina };
67*82c944d0SHerve Codina 
68*82c944d0SHerve Codina /**
69*82c944d0SHerve Codina  * struct framer - represents the framer device
70*82c944d0SHerve Codina  * @dev: framer device
71*82c944d0SHerve Codina  * @id: id of the framer device
72*82c944d0SHerve Codina  * @ops: function pointers for performing framer operations
73*82c944d0SHerve Codina  * @mutex: mutex to protect framer_ops
74*82c944d0SHerve Codina  * @init_count: used to protect when the framer is used by multiple consumers
75*82c944d0SHerve Codina  * @power_count: used to protect when the framer is used by multiple consumers
76*82c944d0SHerve Codina  * @pwr: power regulator associated with the framer
77*82c944d0SHerve Codina  * @notify_status_work: work structure used for status notifications
78*82c944d0SHerve Codina  * @notifier_list: notifier list used for notifications
79*82c944d0SHerve Codina  * @polling_work: delayed work structure used for the polling task
80*82c944d0SHerve Codina  * @prev_status: previous read status used by the polling task to detect changes
81*82c944d0SHerve Codina  */
82*82c944d0SHerve Codina struct framer {
83*82c944d0SHerve Codina 	struct device			dev;
84*82c944d0SHerve Codina 	int				id;
85*82c944d0SHerve Codina 	const struct framer_ops		*ops;
86*82c944d0SHerve Codina 	struct mutex			mutex;	/* Protect framer */
87*82c944d0SHerve Codina 	int				init_count;
88*82c944d0SHerve Codina 	int				power_count;
89*82c944d0SHerve Codina 	struct regulator		*pwr;
90*82c944d0SHerve Codina 	struct work_struct		notify_status_work;
91*82c944d0SHerve Codina 	struct blocking_notifier_head	notifier_list;
92*82c944d0SHerve Codina 	struct delayed_work		polling_work;
93*82c944d0SHerve Codina 	struct framer_status		prev_status;
94*82c944d0SHerve Codina };
95*82c944d0SHerve Codina 
96*82c944d0SHerve Codina #if IS_ENABLED(CONFIG_GENERIC_FRAMER)
97*82c944d0SHerve Codina int framer_pm_runtime_get(struct framer *framer);
98*82c944d0SHerve Codina int framer_pm_runtime_get_sync(struct framer *framer);
99*82c944d0SHerve Codina int framer_pm_runtime_put(struct framer *framer);
100*82c944d0SHerve Codina int framer_pm_runtime_put_sync(struct framer *framer);
101*82c944d0SHerve Codina int framer_init(struct framer *framer);
102*82c944d0SHerve Codina int framer_exit(struct framer *framer);
103*82c944d0SHerve Codina int framer_power_on(struct framer *framer);
104*82c944d0SHerve Codina int framer_power_off(struct framer *framer);
105*82c944d0SHerve Codina int framer_get_status(struct framer *framer, struct framer_status *status);
106*82c944d0SHerve Codina int framer_get_config(struct framer *framer, struct framer_config *config);
107*82c944d0SHerve Codina int framer_set_config(struct framer *framer, const struct framer_config *config);
108*82c944d0SHerve Codina int framer_notifier_register(struct framer *framer, struct notifier_block *nb);
109*82c944d0SHerve Codina int framer_notifier_unregister(struct framer *framer, struct notifier_block *nb);
110*82c944d0SHerve Codina 
111*82c944d0SHerve Codina struct framer *framer_get(struct device *dev, const char *con_id);
112*82c944d0SHerve Codina void framer_put(struct device *dev, struct framer *framer);
113*82c944d0SHerve Codina 
114*82c944d0SHerve Codina struct framer *devm_framer_get(struct device *dev, const char *con_id);
115*82c944d0SHerve Codina struct framer *devm_framer_optional_get(struct device *dev, const char *con_id);
116*82c944d0SHerve Codina #else
117*82c944d0SHerve Codina static inline int framer_pm_runtime_get(struct framer *framer)
118*82c944d0SHerve Codina {
119*82c944d0SHerve Codina 	return -ENOSYS;
120*82c944d0SHerve Codina }
121*82c944d0SHerve Codina 
122*82c944d0SHerve Codina static inline int framer_pm_runtime_get_sync(struct framer *framer)
123*82c944d0SHerve Codina {
124*82c944d0SHerve Codina 	return -ENOSYS;
125*82c944d0SHerve Codina }
126*82c944d0SHerve Codina 
127*82c944d0SHerve Codina static inline int framer_pm_runtime_put(struct framer *framer)
128*82c944d0SHerve Codina {
129*82c944d0SHerve Codina 	return -ENOSYS;
130*82c944d0SHerve Codina }
131*82c944d0SHerve Codina 
132*82c944d0SHerve Codina static inline int framer_pm_runtime_put_sync(struct framer *framer)
133*82c944d0SHerve Codina {
134*82c944d0SHerve Codina 	return -ENOSYS;
135*82c944d0SHerve Codina }
136*82c944d0SHerve Codina 
137*82c944d0SHerve Codina static inline int framer_init(struct framer *framer)
138*82c944d0SHerve Codina {
139*82c944d0SHerve Codina 	return -ENOSYS;
140*82c944d0SHerve Codina }
141*82c944d0SHerve Codina 
142*82c944d0SHerve Codina static inline int framer_exit(struct framer *framer)
143*82c944d0SHerve Codina {
144*82c944d0SHerve Codina 	return -ENOSYS;
145*82c944d0SHerve Codina }
146*82c944d0SHerve Codina 
147*82c944d0SHerve Codina static inline int framer_power_on(struct framer *framer)
148*82c944d0SHerve Codina {
149*82c944d0SHerve Codina 	return -ENOSYS;
150*82c944d0SHerve Codina }
151*82c944d0SHerve Codina 
152*82c944d0SHerve Codina static inline int framer_power_off(struct framer *framer)
153*82c944d0SHerve Codina {
154*82c944d0SHerve Codina 	return -ENOSYS;
155*82c944d0SHerve Codina }
156*82c944d0SHerve Codina 
157*82c944d0SHerve Codina static inline int framer_get_status(struct framer *framer, struct framer_status *status)
158*82c944d0SHerve Codina {
159*82c944d0SHerve Codina 	return -ENOSYS;
160*82c944d0SHerve Codina }
161*82c944d0SHerve Codina 
162*82c944d0SHerve Codina static inline int framer_get_config(struct framer *framer, struct framer_config *config)
163*82c944d0SHerve Codina {
164*82c944d0SHerve Codina 	return -ENOSYS;
165*82c944d0SHerve Codina }
166*82c944d0SHerve Codina 
167*82c944d0SHerve Codina static inline int framer_set_config(struct framer *framer, const struct framer_config *config)
168*82c944d0SHerve Codina {
169*82c944d0SHerve Codina 	return -ENOSYS;
170*82c944d0SHerve Codina }
171*82c944d0SHerve Codina 
172*82c944d0SHerve Codina static inline int framer_notifier_register(struct framer *framer,
173*82c944d0SHerve Codina 					   struct notifier_block *nb)
174*82c944d0SHerve Codina {
175*82c944d0SHerve Codina 	return -ENOSYS;
176*82c944d0SHerve Codina }
177*82c944d0SHerve Codina 
178*82c944d0SHerve Codina static inline int framer_notifier_unregister(struct framer *framer,
179*82c944d0SHerve Codina 					     struct notifier_block *nb)
180*82c944d0SHerve Codina {
181*82c944d0SHerve Codina 	return -ENOSYS;
182*82c944d0SHerve Codina }
183*82c944d0SHerve Codina 
184*82c944d0SHerve Codina struct framer *framer_get(struct device *dev, const char *con_id)
185*82c944d0SHerve Codina {
186*82c944d0SHerve Codina 	return ERR_PTR(-ENOSYS);
187*82c944d0SHerve Codina }
188*82c944d0SHerve Codina 
189*82c944d0SHerve Codina void framer_put(struct device *dev, struct framer *framer)
190*82c944d0SHerve Codina {
191*82c944d0SHerve Codina }
192*82c944d0SHerve Codina 
193*82c944d0SHerve Codina static inline struct framer *devm_framer_get(struct device *dev, const char *con_id)
194*82c944d0SHerve Codina {
195*82c944d0SHerve Codina 	return ERR_PTR(-ENOSYS);
196*82c944d0SHerve Codina }
197*82c944d0SHerve Codina 
198*82c944d0SHerve Codina static inline struct framer *devm_framer_optional_get(struct device *dev, const char *con_id)
199*82c944d0SHerve Codina {
200*82c944d0SHerve Codina 	return NULL;
201*82c944d0SHerve Codina }
202*82c944d0SHerve Codina 
203*82c944d0SHerve Codina #endif
204*82c944d0SHerve Codina 
205*82c944d0SHerve Codina #endif /* __DRIVERS_FRAMER_H */
206