xref: /linux/include/sound/sdca_class.h (revision 3273ec3e149ade420500014d442e4159bcc0d264)
10985313aSSrinivas Kandagatla /* SPDX-License-Identifier: GPL-2.0 */
20985313aSSrinivas Kandagatla /*
30985313aSSrinivas Kandagatla  * The MIPI SDCA specification is available for public downloads at
40985313aSSrinivas Kandagatla  * https://www.mipi.org/mipi-sdca-v1-0-download
50985313aSSrinivas Kandagatla  *
60985313aSSrinivas Kandagatla  * Copyright (C) 2025 Cirrus Logic, Inc. and
70985313aSSrinivas Kandagatla  *                    Cirrus Logic International Semiconductor Ltd.
80985313aSSrinivas Kandagatla  */
90985313aSSrinivas Kandagatla 
100985313aSSrinivas Kandagatla #ifndef __SDCA_CLASS_H__
110985313aSSrinivas Kandagatla #define __SDCA_CLASS_H__
120985313aSSrinivas Kandagatla 
130985313aSSrinivas Kandagatla #include <linux/completion.h>
140985313aSSrinivas Kandagatla #include <linux/mutex.h>
150985313aSSrinivas Kandagatla #include <linux/workqueue.h>
160985313aSSrinivas Kandagatla 
170985313aSSrinivas Kandagatla struct device;
180985313aSSrinivas Kandagatla struct regmap;
190985313aSSrinivas Kandagatla struct sdw_slave;
200985313aSSrinivas Kandagatla struct sdca_function_data;
210985313aSSrinivas Kandagatla 
22*3273ec3eSSrinivas Kandagatla /**
23*3273ec3eSSrinivas Kandagatla  * struct sdca_class_ops - optional codec-provided class callbacks
24*3273ec3eSSrinivas Kandagatla  * @populate_function: fill @function (entities, clusters, init_table, ...)
25*3273ec3eSSrinivas Kandagatla  *           from static tables in place of sdca_parse_function() on
26*3273ec3eSSrinivas Kandagatla  *           DT/non-DisCo platforms.  Called once per SDCA function with
27*3273ec3eSSrinivas Kandagatla  *           @dev pointing at that function's device.  Pure data source;
28*3273ec3eSSrinivas Kandagatla  *           performs no bus I/O.  Return 0 on success or a negative errno.
29*3273ec3eSSrinivas Kandagatla  */
30*3273ec3eSSrinivas Kandagatla struct sdca_class_ops {
31*3273ec3eSSrinivas Kandagatla 	int (*populate_function)(struct device *dev,
32*3273ec3eSSrinivas Kandagatla 				 struct sdca_function_data *function);
33*3273ec3eSSrinivas Kandagatla };
34*3273ec3eSSrinivas Kandagatla 
350985313aSSrinivas Kandagatla struct sdca_class_drv {
360985313aSSrinivas Kandagatla 	struct device *dev;
370985313aSSrinivas Kandagatla 	struct regmap *dev_regmap;
380985313aSSrinivas Kandagatla 	struct sdw_slave *sdw;
390985313aSSrinivas Kandagatla 
400985313aSSrinivas Kandagatla 	struct sdca_interrupt_info *irq_info;
410985313aSSrinivas Kandagatla 
42*3273ec3eSSrinivas Kandagatla 	const struct sdca_class_ops *ops;
43*3273ec3eSSrinivas Kandagatla 
440985313aSSrinivas Kandagatla 	struct mutex regmap_lock;
450985313aSSrinivas Kandagatla 	/* Serialise function initialisations */
460985313aSSrinivas Kandagatla 	struct mutex init_lock;
470985313aSSrinivas Kandagatla 	struct work_struct boot_work;
480985313aSSrinivas Kandagatla };
490985313aSSrinivas Kandagatla 
50a60f1ac4SSrinivas Kandagatla /* Library helpers used by codec-specific SDCA SoundWire drivers. */
51*3273ec3eSSrinivas Kandagatla int sdca_class_probe(struct sdw_slave *sdw,
52*3273ec3eSSrinivas Kandagatla 		     struct sdca_class_drv *drv,
53*3273ec3eSSrinivas Kandagatla 		     const struct sdca_class_ops *ops);
54a60f1ac4SSrinivas Kandagatla void sdca_class_remove(struct sdca_class_drv *drv);
55a60f1ac4SSrinivas Kandagatla 
560985313aSSrinivas Kandagatla /*
570985313aSSrinivas Kandagatla  * PM helpers.  Codec drivers embed sdca_class_drv in their own priv,
580985313aSSrinivas Kandagatla  * own dev_set_drvdata(), and compose these into their own dev_pm_ops:
590985313aSSrinivas Kandagatla  *
600985313aSSrinivas Kandagatla  *	static int wcd_runtime_suspend(struct device *dev) {
610985313aSSrinivas Kandagatla  *		struct wcd_priv *priv = dev_get_drvdata(dev);
620985313aSSrinivas Kandagatla  *		return sdca_class_runtime_suspend(&priv->class);
630985313aSSrinivas Kandagatla  *	}
640985313aSSrinivas Kandagatla  */
650985313aSSrinivas Kandagatla int sdca_class_runtime_suspend(struct sdca_class_drv *drv);
660985313aSSrinivas Kandagatla int sdca_class_runtime_resume(struct sdca_class_drv *drv);
670985313aSSrinivas Kandagatla int sdca_class_system_suspend(struct sdca_class_drv *drv);
680985313aSSrinivas Kandagatla int sdca_class_system_resume(struct sdca_class_drv *drv);
690985313aSSrinivas Kandagatla 
700985313aSSrinivas Kandagatla #endif /* __SDCA_CLASS_H__ */
71