Re: [PATCH v3] ASoC: rt766: add RT766/RT767 SDCA driver
Charles Keepax <[email protected]> Fri, 31 Jul 2026 15:46:13 +0100
| Newsgroups | org.kernel.vger.linux-sound |
|---|---|
| Message-ID | <[email protected]> |
On Fri, Jul 31, 2026 at 05:10:37PM +0800, [email protected] wrote: > +static int rt766_sdca_irq_ctl(struct rt766_sdca_priv *rt766, > + struct sdca_function_data *function, > + struct snd_soc_component *component, > + struct sdca_interrupt_info *info, > + bool enabled) > +{ > + struct device *dev = &rt766->slave->dev; > + struct sdca_interrupt *interrupt; > + struct sdca_control *control; > + struct sdca_entity *entity; > + irq_handler_t handler; > + int i, j, irq, ret; > + > + for (i = 0; i < function->num_entities; i++) { > + entity = &function->entities[i]; > + > + for (j = 0; j < entity->num_controls; j++) { > + control = &entity->controls[j]; > + irq = control->interrupt_position; > + > + switch (SDCA_CTL_TYPE(entity->type, control->sel)) { > + case SDCA_CTL_TYPE_S(GE, DETECTED_MODE): > + handler = rt766_sdca_irq_jd_handler; > + break; > + case SDCA_CTL_TYPE_S(HIDE, HIDTX_CURRENTOWNER): > + handler = rt766_sdca_irq_btn_handler; > + break; > + default: > + continue; > + } > + > + interrupt = &info->irqs[irq]; > + > + if (enabled) { > + ret = sdca_irq_data_populate(dev, rt766->regmap, component, > + function, entity, control, > + interrupt); > + if (ret) > + return ret; > + > + interrupt->priv = rt766; > + ret = sdca_irq_request(dev, info, irq, interrupt->name, > + handler, interrupt); > + if (ret) { > + dev_err(dev, "failed to request irq %s: %d\n", > + interrupt->name, ret); > + return ret; > + } > + dev_dbg(dev, "Requesting IRQ %d InterruptName=%s\n", irq, interrupt->name); > + } else { > + sdca_irq_free(dev, info, irq, interrupt->name, interrupt); You need to also free the IRQ name allocated by sdca_irq_data_populate() here or it will leak if the jack is re-enabled. > +static void rt766_sdca_remove(struct snd_soc_component *component) > +{ > + struct rt766_sdca_priv *rt766 = snd_soc_component_get_drvdata(component); > + > + sdca_irq_cleanup(component->dev, rt766->uaj_func_data, rt766->irq_info); > + sdca_irq_cleanup(component->dev, rt766->hid_func_data, rt766->irq_info); > +} These should be sdca_irq_cleanup_late(), to ensure they free the names as well. Although, worth noting this only does anything if rt766_sdca_set_jack_detect() didn't already clean everything up, not sure if that is guaranteed or not. Thanks, Charles