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