mirror of
https://github.com/torvalds/linux.git
synced 2026-09-24 06:24:02 +02:00
ASoC: SDCA: Remove devm from primary IRQ cleanup
To provide greater flexibility on when the IRQs are requested for client drivers don't use devm for the primary IRQ request/cleanup helper functions. Signed-off-by: Charles Keepax <ckeepax@opensource.cirrus.com> Link: https://patch.msgid.link/20260721143636.361814-4-ckeepax@opensource.cirrus.com Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
f18e97fa7f
commit
0880082c27
|
|
@ -67,6 +67,8 @@ struct fdl_state {
|
||||||
#if IS_ENABLED(CONFIG_SND_SOC_SDCA_FDL)
|
#if IS_ENABLED(CONFIG_SND_SOC_SDCA_FDL)
|
||||||
|
|
||||||
int sdca_fdl_alloc_state(struct sdca_interrupt *interrupt);
|
int sdca_fdl_alloc_state(struct sdca_interrupt *interrupt);
|
||||||
|
void sdca_fdl_free_state(struct sdca_interrupt *interrupt);
|
||||||
|
|
||||||
int sdca_fdl_process(struct sdca_interrupt *interrupt);
|
int sdca_fdl_process(struct sdca_interrupt *interrupt);
|
||||||
int sdca_fdl_sync(struct device *dev, struct sdca_function_data *function,
|
int sdca_fdl_sync(struct device *dev, struct sdca_function_data *function,
|
||||||
struct sdca_interrupt_info *info);
|
struct sdca_interrupt_info *info);
|
||||||
|
|
|
||||||
|
|
@ -31,6 +31,7 @@ struct sdca_function_data;
|
||||||
* @entity: Pointer to the Entity 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.
|
* @control: Pointer to the Control that the interrupt is associated with.
|
||||||
* @priv: Pointer to private data for use by the handler.
|
* @priv: Pointer to private data for use by the handler.
|
||||||
|
* @free_priv: Pointer to a function that can be used to free the priv data.
|
||||||
* @irq: IRQ number allocated to this interrupt, also used internally to track
|
* @irq: IRQ number allocated to this interrupt, also used internally to track
|
||||||
* the IRQ being assigned.
|
* the IRQ being assigned.
|
||||||
* @early_request: Flag to indicate this IRQ was requested at bus probe time.
|
* @early_request: Flag to indicate this IRQ was requested at bus probe time.
|
||||||
|
|
@ -47,6 +48,7 @@ struct sdca_interrupt {
|
||||||
struct sdca_control *control;
|
struct sdca_control *control;
|
||||||
|
|
||||||
void *priv;
|
void *priv;
|
||||||
|
void (*free_priv)(struct sdca_interrupt *interrupt);
|
||||||
|
|
||||||
int irq;
|
int irq;
|
||||||
bool early_request;
|
bool early_request;
|
||||||
|
|
|
||||||
|
|
@ -28,6 +28,8 @@ struct jack_state {
|
||||||
};
|
};
|
||||||
|
|
||||||
int sdca_jack_alloc_state(struct sdca_interrupt *interrupt);
|
int sdca_jack_alloc_state(struct sdca_interrupt *interrupt);
|
||||||
|
void sdca_jack_free_state(struct sdca_interrupt *interrupt);
|
||||||
|
|
||||||
int sdca_jack_process(struct sdca_interrupt *interrupt);
|
int sdca_jack_process(struct sdca_interrupt *interrupt);
|
||||||
int sdca_jack_set_jack(struct sdca_interrupt_info *info, struct snd_soc_jack *jack);
|
int sdca_jack_set_jack(struct sdca_interrupt_info *info, struct snd_soc_jack *jack);
|
||||||
int sdca_jack_report(struct sdca_interrupt *interrupt);
|
int sdca_jack_report(struct sdca_interrupt *interrupt);
|
||||||
|
|
|
||||||
|
|
@ -481,10 +481,9 @@ EXPORT_SYMBOL_NS_GPL(sdca_fdl_process, "SND_SOC_SDCA");
|
||||||
*/
|
*/
|
||||||
int sdca_fdl_alloc_state(struct sdca_interrupt *interrupt)
|
int sdca_fdl_alloc_state(struct sdca_interrupt *interrupt)
|
||||||
{
|
{
|
||||||
struct device *dev = interrupt->dev;
|
|
||||||
struct fdl_state *fdl_state;
|
struct fdl_state *fdl_state;
|
||||||
|
|
||||||
fdl_state = devm_kzalloc(dev, sizeof(*fdl_state), GFP_KERNEL);
|
fdl_state = kzalloc_obj(*fdl_state);
|
||||||
if (!fdl_state)
|
if (!fdl_state)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
|
|
@ -499,3 +498,13 @@ int sdca_fdl_alloc_state(struct sdca_interrupt *interrupt)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_NS_GPL(sdca_fdl_alloc_state, "SND_SOC_SDCA");
|
EXPORT_SYMBOL_NS_GPL(sdca_fdl_alloc_state, "SND_SOC_SDCA");
|
||||||
|
|
||||||
|
/**
|
||||||
|
* sdca_fdl_free_state - free state for an FDL interrupt
|
||||||
|
* @interrupt: SDCA interrupt structure.
|
||||||
|
*/
|
||||||
|
void sdca_fdl_free_state(struct sdca_interrupt *interrupt)
|
||||||
|
{
|
||||||
|
kfree(interrupt->priv);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_NS_GPL(sdca_fdl_free_state, "SND_SOC_SDCA");
|
||||||
|
|
|
||||||
|
|
@ -457,6 +457,7 @@ int sdca_irq_populate_early(struct device *dev, struct regmap *regmap,
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
interrupt->early_request = true;
|
interrupt->early_request = true;
|
||||||
|
interrupt->free_priv = sdca_fdl_free_state;
|
||||||
|
|
||||||
ret = sdca_fdl_alloc_state(interrupt);
|
ret = sdca_fdl_alloc_state(interrupt);
|
||||||
if (ret)
|
if (ret)
|
||||||
|
|
@ -530,6 +531,8 @@ int sdca_irq_populate(struct sdca_function_data *function,
|
||||||
handler = function_status_handler;
|
handler = function_status_handler;
|
||||||
break;
|
break;
|
||||||
case SDCA_CTL_TYPE_S(GE, DETECTED_MODE):
|
case SDCA_CTL_TYPE_S(GE, DETECTED_MODE):
|
||||||
|
interrupt->free_priv = sdca_jack_free_state;
|
||||||
|
|
||||||
ret = sdca_jack_alloc_state(interrupt);
|
ret = sdca_jack_alloc_state(interrupt);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
@ -537,6 +540,8 @@ int sdca_irq_populate(struct sdca_function_data *function,
|
||||||
handler = detected_mode_handler;
|
handler = detected_mode_handler;
|
||||||
break;
|
break;
|
||||||
case SDCA_CTL_TYPE_S(XU, FDL_CURRENTOWNER):
|
case SDCA_CTL_TYPE_S(XU, FDL_CURRENTOWNER):
|
||||||
|
interrupt->free_priv = sdca_fdl_free_state;
|
||||||
|
|
||||||
ret = sdca_fdl_alloc_state(interrupt);
|
ret = sdca_fdl_alloc_state(interrupt);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
@ -584,6 +589,9 @@ static void sdca_irq_cleanup_flags(struct device *dev,
|
||||||
|
|
||||||
sdca_irq_free_locked(dev, info, i, interrupt->name, interrupt);
|
sdca_irq_free_locked(dev, info, i, interrupt->name, interrupt);
|
||||||
|
|
||||||
|
if (interrupt->free_priv)
|
||||||
|
interrupt->free_priv(interrupt);
|
||||||
|
|
||||||
kfree(interrupt->name);
|
kfree(interrupt->name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -132,10 +132,9 @@ EXPORT_SYMBOL_NS_GPL(sdca_jack_process, "SND_SOC_SDCA");
|
||||||
*/
|
*/
|
||||||
int sdca_jack_alloc_state(struct sdca_interrupt *interrupt)
|
int sdca_jack_alloc_state(struct sdca_interrupt *interrupt)
|
||||||
{
|
{
|
||||||
struct device *dev = interrupt->dev;
|
|
||||||
struct jack_state *jack_state;
|
struct jack_state *jack_state;
|
||||||
|
|
||||||
jack_state = devm_kzalloc(dev, sizeof(*jack_state), GFP_KERNEL);
|
jack_state = kzalloc_obj(*jack_state);
|
||||||
if (!jack_state)
|
if (!jack_state)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
|
|
@ -145,6 +144,16 @@ int sdca_jack_alloc_state(struct sdca_interrupt *interrupt)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_NS_GPL(sdca_jack_alloc_state, "SND_SOC_SDCA");
|
EXPORT_SYMBOL_NS_GPL(sdca_jack_alloc_state, "SND_SOC_SDCA");
|
||||||
|
|
||||||
|
/**
|
||||||
|
* sdca_jack_free_state - free state for a jack interrupt
|
||||||
|
* @interrupt: SDCA interrupt structure.
|
||||||
|
*/
|
||||||
|
void sdca_jack_free_state(struct sdca_interrupt *interrupt)
|
||||||
|
{
|
||||||
|
kfree(interrupt->priv);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_NS_GPL(sdca_jack_free_state, "SND_SOC_SDCA");
|
||||||
|
|
||||||
static int type_get_mask(enum sdca_terminal_type type)
|
static int type_get_mask(enum sdca_terminal_type type)
|
||||||
{
|
{
|
||||||
switch (type) {
|
switch (type) {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user