9 Sep
2022
9 Sep
'22
5:55 p.m.
On 09/09/2022 14:53, Martin PoviĊĦer wrote:
+static int cs42l42_init(struct cs42l42_private *cs42l42) +{
- unsigned int reg;
- int devid, ret;
- /* initialize codec */ devid = cirrus_read_device_id(cs42l42->regmap, CS42L42_DEVID_AB); if (devid < 0) {
@@ -2320,15 +2331,15 @@ static int cs42l42_i2c_probe(struct i2c_client *i2c_client) /* Setup headset detection */ cs42l42_setup_hs_type_detect(cs42l42);
- /*
* Set init_done before unmasking interrupts so any triggered
* immediately will be handled.
*/
- cs42l42->init_done = true;
- /* Mask/Unmask Interrupts */ cs42l42_set_interrupt_masks(cs42l42);
/* Register codec for machine driver */
ret = devm_snd_soc_register_component(cs42l42->dev,
&soc_component_dev_cs42l42, &cs42l42_dai, 1);
if (ret < 0)
goto err_shutdown;
return 0;
err_shutdown:
@@ -2337,34 +2348,69 @@ static int cs42l42_i2c_probe(struct i2c_client *i2c_client) regmap_write(cs42l42->regmap, CS42L42_PWR_CTL1, 0xff);
err_disable:
- if (i2c_client->irq)
free_irq(i2c_client->irq, cs42l42);
These 3 lines should not be removed. cs42l42_init() must free the irq in the error paths.