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