| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- /* 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 <linux/interrupt.h>
- #include <linux/mutex.h>
- #include <linux/regmap.h>
- 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.
- * @dev: Pointer to the Function device.
- * @device_regmap: Pointer to the IRQ regmap.
- * @function_regmap: Pointer to the SDCA Function regmap.
- * @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.
- * @irq: IRQ number allocated to this interrupt, also used internally to track
- * the IRQ being assigned.
- */
- struct sdca_interrupt {
- const char *name;
- struct device *dev;
- struct regmap *device_regmap;
- struct regmap *function_regmap;
- struct snd_soc_component *component;
- struct sdca_function_data *function;
- struct sdca_entity *entity;
- struct sdca_control *control;
- void *priv;
- int irq;
- };
- /**
- * 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);
- void sdca_irq_free(struct device *dev, struct sdca_interrupt_info *interrupt_info,
- int sdca_irq, const char *name, void *data);
- int sdca_irq_data_populate(struct device *dev, struct regmap *function_regmap,
- 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_early(struct device *dev, struct regmap *function_regmap,
- struct sdca_function_data *function,
- struct sdca_interrupt_info *info);
- int sdca_irq_populate(struct sdca_function_data *function,
- struct snd_soc_component *component,
- struct sdca_interrupt_info *info);
- void sdca_irq_cleanup(struct device *dev,
- struct sdca_function_data *function,
- struct sdca_interrupt_info *info);
- struct sdca_interrupt_info *sdca_irq_allocate(struct device *dev,
- struct regmap *regmap, int irq);
- void sdca_irq_enable_early(struct sdca_function_data *function,
- struct sdca_interrupt_info *info);
- void sdca_irq_enable(struct sdca_function_data *function,
- struct sdca_interrupt_info *info);
- void sdca_irq_disable(struct sdca_function_data *function,
- struct sdca_interrupt_info *info);
- #endif
|