/* SPDX-License-Identifier: GPL-2.0 */ /* * The MIPI SDCA specification is available for public downloads at * https://www.mipi.org/mipi-sdca-v1-0-download * * Copyright (C) 2025 Cirrus Logic, Inc. and * Cirrus Logic International Semiconductor Ltd. */ #ifndef __SDCA_CLASS_H__ #define __SDCA_CLASS_H__ #include #include #include struct device; struct regmap; struct sdw_slave; struct sdca_function_data; /** * struct sdca_class_ops - optional codec-provided class callbacks * @populate_function: fill @function (entities, clusters, init_table, ...) * from static tables in place of sdca_parse_function() on * DT/non-DisCo platforms. Called once per SDCA function with * @dev pointing at that function's device. Pure data source; * performs no bus I/O. Return 0 on success or a negative errno. */ struct sdca_class_ops { int (*populate_function)(struct device *dev, struct sdca_function_data *function); }; struct sdca_class_drv { struct device *dev; struct regmap *dev_regmap; struct sdw_slave *sdw; struct sdca_interrupt_info *irq_info; const struct sdca_class_ops *ops; struct mutex regmap_lock; /* Serialise function initialisations */ struct mutex init_lock; struct work_struct boot_work; }; /* Library helpers used by codec-specific SDCA SoundWire drivers. */ int sdca_class_probe(struct sdw_slave *sdw, struct sdca_class_drv *drv, const struct sdca_class_ops *ops); void sdca_class_remove(struct sdca_class_drv *drv); /* * PM helpers. Codec drivers embed sdca_class_drv in their own priv, * own dev_set_drvdata(), and compose these into their own dev_pm_ops: * * static int wcd_runtime_suspend(struct device *dev) { * struct wcd_priv *priv = dev_get_drvdata(dev); * return sdca_class_runtime_suspend(&priv->class); * } */ int sdca_class_runtime_suspend(struct sdca_class_drv *drv); int sdca_class_runtime_resume(struct sdca_class_drv *drv); int sdca_class_system_suspend(struct sdca_class_drv *drv); int sdca_class_system_resume(struct sdca_class_drv *drv); #endif /* __SDCA_CLASS_H__ */