GNU Linux-libre 6.9.2-gnu
[releases.git] / include / linux / framer / framer-provider.h
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 /*
3  * Generic framer profider header file
4  *
5  * Copyright 2023 CS GROUP France
6  *
7  * Author: Herve Codina <herve.codina@bootlin.com>
8  */
9
10 #ifndef __DRIVERS_PROVIDER_FRAMER_H
11 #define __DRIVERS_PROVIDER_FRAMER_H
12
13 #include <linux/export.h>
14 #include <linux/framer/framer.h>
15 #include <linux/types.h>
16
17 #define FRAMER_FLAG_POLL_STATUS  BIT(0)
18
19 /**
20  * struct framer_ops - set of function pointers for performing framer operations
21  * @init: operation to be performed for initializing the framer
22  * @exit: operation to be performed while exiting
23  * @power_on: powering on the framer
24  * @power_off: powering off the framer
25  * @flags: OR-ed flags (FRAMER_FLAG_*) to ask for core functionality
26  *          - @FRAMER_FLAG_POLL_STATUS:
27  *            Ask the core to perform a polling to get the framer status and
28  *            notify consumers on change.
29  *            The framer should call @framer_notify_status_change() when it
30  *            detects a status change. This is usually done using interrupts.
31  *            If the framer cannot detect this change, it can ask the core for
32  *            a status polling. The core will call @get_status() periodically
33  *            and, on change detected, it will notify the consumer.
34  *            the @get_status()
35  * @owner: the module owner containing the ops
36  */
37 struct framer_ops {
38         int     (*init)(struct framer *framer);
39         void    (*exit)(struct framer *framer);
40         int     (*power_on)(struct framer *framer);
41         int     (*power_off)(struct framer *framer);
42
43         /**
44          * @get_status:
45          *
46          * Optional.
47          *
48          * Used to get the framer status. framer_init() must have
49          * been called on the framer.
50          *
51          * Returns: 0 if successful, an negative error code otherwise
52          */
53         int     (*get_status)(struct framer *framer, struct framer_status *status);
54
55         /**
56          * @set_config:
57          *
58          * Optional.
59          *
60          * Used to set the framer configuration. framer_init() must have
61          * been called on the framer.
62          *
63          * Returns: 0 if successful, an negative error code otherwise
64          */
65         int     (*set_config)(struct framer *framer, const struct framer_config *config);
66
67         /**
68          * @get_config:
69          *
70          * Optional.
71          *
72          * Used to get the framer configuration. framer_init() must have
73          * been called on the framer.
74          *
75          * Returns: 0 if successful, an negative error code otherwise
76          */
77         int     (*get_config)(struct framer *framer, struct framer_config *config);
78
79         u32 flags;
80         struct module *owner;
81 };
82
83 /**
84  * struct framer_provider - represents the framer provider
85  * @dev: framer provider device
86  * @owner: the module owner having of_xlate
87  * @list: to maintain a linked list of framer providers
88  * @of_xlate: function pointer to obtain framer instance from framer pointer
89  */
90 struct framer_provider {
91         struct device           *dev;
92         struct module           *owner;
93         struct list_head        list;
94         struct framer * (*of_xlate)(struct device *dev,
95                                     const struct of_phandle_args *args);
96 };
97
98 static inline void framer_set_drvdata(struct framer *framer, void *data)
99 {
100         dev_set_drvdata(&framer->dev, data);
101 }
102
103 static inline void *framer_get_drvdata(struct framer *framer)
104 {
105         return dev_get_drvdata(&framer->dev);
106 }
107
108 #if IS_ENABLED(CONFIG_GENERIC_FRAMER)
109
110 /* Create and destroy a framer */
111 struct framer *framer_create(struct device *dev, struct device_node *node,
112                              const struct framer_ops *ops);
113 void framer_destroy(struct framer *framer);
114
115 /* devm version */
116 struct framer *devm_framer_create(struct device *dev, struct device_node *node,
117                                   const struct framer_ops *ops);
118
119 struct framer *framer_provider_simple_of_xlate(struct device *dev,
120                                                const struct of_phandle_args *args);
121
122 struct framer_provider *
123 __framer_provider_of_register(struct device *dev, struct module *owner,
124                               struct framer *(*of_xlate)(struct device *dev,
125                                                          const struct of_phandle_args *args));
126
127 void framer_provider_of_unregister(struct framer_provider *framer_provider);
128
129 struct framer_provider *
130 __devm_framer_provider_of_register(struct device *dev, struct module *owner,
131                                    struct framer *(*of_xlate)(struct device *dev,
132                                                               const struct of_phandle_args *args));
133
134 void framer_notify_status_change(struct framer *framer);
135
136 #else /* IS_ENABLED(CONFIG_GENERIC_FRAMER) */
137
138 static inline struct framer *framer_create(struct device *dev, struct device_node *node,
139                                            const struct framer_ops *ops)
140 {
141         return ERR_PTR(-ENOSYS);
142 }
143
144 static inline void framer_destroy(struct framer *framer)
145 {
146 }
147
148 /* devm version */
149 static inline struct framer *devm_framer_create(struct device *dev, struct device_node *node,
150                                                 const struct framer_ops *ops)
151 {
152         return ERR_PTR(-ENOSYS);
153 }
154
155 static inline struct framer *framer_provider_simple_of_xlate(struct device *dev,
156                                                              const struct of_phandle_args *args)
157 {
158         return ERR_PTR(-ENOSYS);
159 }
160
161 static inline struct framer_provider *
162 __framer_provider_of_register(struct device *dev, struct module *owner,
163                               struct framer *(*of_xlate)(struct device *dev,
164                                                          const struct of_phandle_args *args))
165 {
166         return ERR_PTR(-ENOSYS);
167 }
168
169 void framer_provider_of_unregister(struct framer_provider *framer_provider)
170 {
171 }
172
173 static inline struct framer_provider *
174 __devm_framer_provider_of_register(struct device *dev, struct module *owner,
175                                    struct framer *(*of_xlate)(struct device *dev,
176                                                               const struct of_phandle_args *args))
177 {
178         return ERR_PTR(-ENOSYS);
179 }
180
181 void framer_notify_status_change(struct framer *framer)
182 {
183 }
184
185 #endif /* IS_ENABLED(CONFIG_GENERIC_FRAMER) */
186
187 #define framer_provider_of_register(dev, xlate)         \
188         __framer_provider_of_register((dev), THIS_MODULE, (xlate))
189
190 #define devm_framer_provider_of_register(dev, xlate)    \
191         __devm_framer_provider_of_register((dev), THIS_MODULE, (xlate))
192
193 #endif /* __DRIVERS_PROVIDER_FRAMER_H */