File Index
Files and directories
Sign in
FILE

framer-provider.h

File preview with syntax highlighting.

linux-6.19.14/include/linux/framer/framer-provider.h C
  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 */
 37struct 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 */
 90struct 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
 98static inline void framer_set_drvdata(struct framer *framer, void *data)
 99{
100	dev_set_drvdata(&framer->dev, data);
101}
102
103static 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 */
111struct framer *framer_create(struct device *dev, struct device_node *node,
112			     const struct framer_ops *ops);
113void framer_destroy(struct framer *framer);
114
115/* devm version */
116struct framer *devm_framer_create(struct device *dev, struct device_node *node,
117				  const struct framer_ops *ops);
118
119struct framer *framer_provider_simple_of_xlate(struct device *dev,
120					       const struct of_phandle_args *args);
121
122struct 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
127void framer_provider_of_unregister(struct framer_provider *framer_provider);
128
129struct 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
134void framer_notify_status_change(struct framer *framer);
135
136#else /* IS_ENABLED(CONFIG_GENERIC_FRAMER) */
137
138static 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
144static inline void framer_destroy(struct framer *framer)
145{
146}
147
148/* devm version */
149static 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
155static 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
161static 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
169void framer_provider_of_unregister(struct framer_provider *framer_provider)
170{
171}
172
173static 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
181void 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 */
~/ Read-only file preview.