xref: /linux/sound/soc/meson/gx-formatter.h (revision e5c91aac491def6ab3f90c4cc246e3fcb0f8f058)
1*a295be8dSValerio Setti /* SPDX-License-Identifier: (GPL-2.0 OR MIT) */
2*a295be8dSValerio Setti /*
3*a295be8dSValerio Setti  * Copyright (c) 2026 Baylibre SAS.
4*a295be8dSValerio Setti  * Author: Valerio Setti <vsetti@baylibre.com>
5*a295be8dSValerio Setti  */
6*a295be8dSValerio Setti 
7*a295be8dSValerio Setti #ifndef _MESON_GX_FORMATTER_H
8*a295be8dSValerio Setti #define _MESON_GX_FORMATTER_H
9*a295be8dSValerio Setti 
10*a295be8dSValerio Setti #include "gx-interface.h"
11*a295be8dSValerio Setti 
12*a295be8dSValerio Setti struct platform_device;
13*a295be8dSValerio Setti struct regmap;
14*a295be8dSValerio Setti struct snd_soc_dapm_widget;
15*a295be8dSValerio Setti struct snd_kcontrol;
16*a295be8dSValerio Setti 
17*a295be8dSValerio Setti struct gx_formatter_hw {
18*a295be8dSValerio Setti 	unsigned int skew_offset;
19*a295be8dSValerio Setti };
20*a295be8dSValerio Setti 
21*a295be8dSValerio Setti struct gx_formatter_ops {
22*a295be8dSValerio Setti 	struct gx_stream *(*get_stream)(struct snd_soc_dapm_widget *w);
23*a295be8dSValerio Setti 	void (*enable)(struct regmap *map);
24*a295be8dSValerio Setti 	void (*disable)(struct regmap *map);
25*a295be8dSValerio Setti 	int (*prepare)(struct regmap *map,
26*a295be8dSValerio Setti 		       const struct gx_formatter_hw *quirks,
27*a295be8dSValerio Setti 		       struct gx_stream *ts);
28*a295be8dSValerio Setti };
29*a295be8dSValerio Setti 
30*a295be8dSValerio Setti struct gx_formatter_driver {
31*a295be8dSValerio Setti 	const struct snd_soc_component_driver *component_drv;
32*a295be8dSValerio Setti 	const struct regmap_config *regmap_cfg;
33*a295be8dSValerio Setti 	const struct gx_formatter_ops *ops;
34*a295be8dSValerio Setti 	const struct gx_formatter_hw *quirks;
35*a295be8dSValerio Setti };
36*a295be8dSValerio Setti 
37*a295be8dSValerio Setti int gx_formatter_event(struct snd_soc_dapm_widget *w,
38*a295be8dSValerio Setti 		       struct snd_kcontrol *control,
39*a295be8dSValerio Setti 		       int event);
40*a295be8dSValerio Setti int gx_formatter_probe(struct platform_device *pdev);
41*a295be8dSValerio Setti 
42*a295be8dSValerio Setti int gx_formatter_create(struct device *dev,
43*a295be8dSValerio Setti 			struct snd_soc_dapm_widget *w,
44*a295be8dSValerio Setti 			const struct gx_formatter_driver *drv,
45*a295be8dSValerio Setti 			struct regmap *regmap);
46*a295be8dSValerio Setti 
47*a295be8dSValerio Setti /*
48*a295be8dSValerio Setti  * Formatter data is already freed when the associated device is removed,
49*a295be8dSValerio Setti  * so we just need to remove the pointer from the widget.
50*a295be8dSValerio Setti  */
51*a295be8dSValerio Setti static inline void gx_formatter_free(struct snd_soc_dapm_widget *w)
52*a295be8dSValerio Setti {
53*a295be8dSValerio Setti 	w->priv = NULL;
54*a295be8dSValerio Setti }
55*a295be8dSValerio Setti 
56*a295be8dSValerio Setti #endif /* _MESON_GX_FORMATTER_H */
57