mirror of
https://github.com/torvalds/linux.git
synced 2025-12-07 20:06:24 +00:00
Some IRQs (FDL) require processing before the primary soundcard is brought up, as the downloaded files could be firmware required for operation of the audio functions of the device. Add a new helper function which registers the required IRQs. Reviewed-by: Bard Liao <yung-chuan.liao@linux.intel.com> Signed-off-by: Charles Keepax <ckeepax@opensource.cirrus.com> Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.dev> Link: https://patch.msgid.link/20251020155512.353774-19-ckeepax@opensource.cirrus.com Signed-off-by: Mark Brown <broonie@kernel.org>
88 lines
2.9 KiB
C
88 lines
2.9 KiB
C
/* 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);
|
|
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);
|
|
struct sdca_interrupt_info *sdca_irq_allocate(struct device *dev,
|
|
struct regmap *regmap, int irq);
|
|
|
|
#endif
|