Skip to content

Commit 7d72351

Browse files
simontrimmerbroonie
authored andcommitted
ASoC: cs35l56: Rework IRQ allocation
The irq member was being set before calling the init function and then cs35l56_irq_request() was called only when the init was successful. However cs35l56_release() calls devm_free_irq() when the irq member is set and therefore if init() fails then this will cause an attempted free of an unallocated IRQ. Instead pass the desired IRQ number to the cs35l56_irq_request() function and set cs35l56->irq only when it has been successfully allocated. Signed-off-by: Simon Trimmer <simont@opensource.cirrus.com> Signed-off-by: Richard Fitzgerald <rf@opensource.cirrus.com> Link: https://lore.kernel.org/r/168147949598.26.711670799488943454@mailman-core.alsa-project.org Signed-off-by: Mark Brown <broonie@kernel.org>
1 parent fc0b096 commit 7d72351

4 files changed

Lines changed: 9 additions & 10 deletions

File tree

sound/soc/codecs/cs35l56-i2c.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ static int cs35l56_i2c_probe(struct i2c_client *client)
2727
return -ENOMEM;
2828

2929
cs35l56->dev = dev;
30-
cs35l56->irq = client->irq;
3130
cs35l56->can_hibernate = true;
3231

3332
i2c_set_clientdata(client, cs35l56);
@@ -43,7 +42,7 @@ static int cs35l56_i2c_probe(struct i2c_client *client)
4342

4443
ret = cs35l56_init(cs35l56);
4544
if (ret == 0)
46-
ret = cs35l56_irq_request(cs35l56);
45+
ret = cs35l56_irq_request(cs35l56, client->irq);
4746
if (ret < 0)
4847
cs35l56_remove(cs35l56);
4948

sound/soc/codecs/cs35l56-spi.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,15 +32,14 @@ static int cs35l56_spi_probe(struct spi_device *spi)
3232
}
3333

3434
cs35l56->dev = &spi->dev;
35-
cs35l56->irq = spi->irq;
3635

3736
ret = cs35l56_common_probe(cs35l56);
3837
if (ret != 0)
3938
return ret;
4039

4140
ret = cs35l56_init(cs35l56);
4241
if (ret == 0)
43-
ret = cs35l56_irq_request(cs35l56);
42+
ret = cs35l56_irq_request(cs35l56, spi->irq);
4443
if (ret < 0)
4544
cs35l56_remove(cs35l56);
4645

sound/soc/codecs/cs35l56.c

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -423,18 +423,19 @@ irqreturn_t cs35l56_irq(int irq, void *data)
423423
}
424424
EXPORT_SYMBOL_NS_GPL(cs35l56_irq, SND_SOC_CS35L56_CORE);
425425

426-
int cs35l56_irq_request(struct cs35l56_private *cs35l56)
426+
int cs35l56_irq_request(struct cs35l56_private *cs35l56, int irq)
427427
{
428428
int ret;
429429

430-
if (!cs35l56->irq)
430+
if (!irq)
431431
return 0;
432432

433-
ret = devm_request_threaded_irq(cs35l56->dev, cs35l56->irq, NULL,
434-
cs35l56_irq,
433+
ret = devm_request_threaded_irq(cs35l56->dev, irq, NULL, cs35l56_irq,
435434
IRQF_ONESHOT | IRQF_SHARED | IRQF_TRIGGER_LOW,
436435
"cs35l56", cs35l56);
437-
if (ret < 0)
436+
if (!ret)
437+
cs35l56->irq = irq;
438+
else
438439
dev_err(cs35l56->dev, "Failed to get IRQ: %d\n", ret);
439440

440441
return ret;

sound/soc/codecs/cs35l56.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ int cs35l56_system_resume_no_irq(struct device *dev);
7474
int cs35l56_system_resume_early(struct device *dev);
7575
int cs35l56_system_resume(struct device *dev);
7676
irqreturn_t cs35l56_irq(int irq, void *data);
77-
int cs35l56_irq_request(struct cs35l56_private *cs35l56);
77+
int cs35l56_irq_request(struct cs35l56_private *cs35l56, int irq);
7878
int cs35l56_common_probe(struct cs35l56_private *cs35l56);
7979
int cs35l56_init(struct cs35l56_private *cs35l56);
8080
int cs35l56_remove(struct cs35l56_private *cs35l56);

0 commit comments

Comments
 (0)