/* 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_INTERRUPTS_H__ #define __SDCA_INTERRUPTS_H__ #include #include #include struct device; struct snd_soc_component; struct sdca_function_data; #define SDCA_MAX_INTERRUPTS 31 /* the last bit is reserved for future extensions */ /** * struct sdca_interrupt - contains information about a single SDCA interrupt * @name: The name of the interrupt. * @component: Pointer to the ASoC component owns the interrupt. * @function: Pointer to the Function that the interrupt is associated with. * @entity: Pointer to the Entity that the interrupt is associated with. * @control: Pointer to the Control that the interrupt is associated with. * @priv: Pointer to private data for use by the handler. * @externally_requested: Internal flag used to check if a client driver has * already requested the interrupt, for custom handling, allowing the core to * skip handling this interrupt. */ struct sdca_interrupt { const char *name; struct snd_soc_component *component; struct sdca_function_data *function; struct sdca_entity *entity; struct sdca_control *control; void *priv; bool externally_requested; }; /** * struct sdca_interrupt_info - contains top-level SDCA interrupt information * @irq_chip: regmap irq chip structure. * @irq_data: regmap irq chip data structure. * @irqs: Array of data for each individual IRQ. * @irq_lock: Protects access to the list of sdca_interrupt structures. */ struct sdca_interrupt_info { struct regmap_irq_chip irq_chip; struct regmap_irq_chip_data *irq_data; struct sdca_interrupt irqs[SDCA_MAX_INTERRUPTS]; struct mutex irq_lock; /* Protect irqs list across functions */ }; int sdca_irq_request(struct device *dev, struct sdca_interrupt_info *interrupt_info, int sdca_irq, const char *name, irq_handler_t handler, void *data); int sdca_irq_data_populate(struct snd_soc_component *component, struct sdca_function_data *function, struct sdca_entity *entity, struct sdca_control *control, struct sdca_interrupt *interrupt); int sdca_irq_populate(struct sdca_function_data *function, struct snd_soc_component *component, struct sdca_interrupt_info *info); struct sdca_interrupt_info *sdca_irq_allocate(struct device *dev, struct regmap *regmap, int irq); #endif