| From bc55eb17b46668e70dfbd1a091159935d8f95eb9 Mon Sep 17 00:00:00 2001 |
| From: Joerg Schambacher <joerg@i2audio.com> |
| Date: Fri, 16 Oct 2020 15:17:07 +0200 |
| Subject: [PATCH] Fixes a problem when module probes before i2c |
| module is available |
| |
| The driver crashed while a NULL pointer returned by i2c_get_adapter() |
| has been used to access the i2c bus functions. |
| The headphone probing function hb_hp_probe() now returns -EPROBE_DEFER |
| in case the i2c module has not been loaded yet. |
| |
| Signed-off-by: Joerg Schambacher <joerg@i2audio.com> |
| --- |
| sound/soc/bcm/hifiberry_dacplus.c | 9 +++++++-- |
| 1 file changed, 7 insertions(+), 2 deletions(-) |
| |
| --- a/sound/soc/bcm/hifiberry_dacplus.c |
| +++ b/sound/soc/bcm/hifiberry_dacplus.c |
| @@ -315,12 +315,14 @@ static int hb_hp_detect(void) |
| { |
| struct i2c_adapter *adap = i2c_get_adapter(1); |
| int ret; |
| - |
| struct i2c_client tpa_i2c_client = { |
| .addr = 0x60, |
| .adapter = adap, |
| }; |
| |
| + if (!adap) |
| + return -EPROBE_DEFER; /* I2C module not yet available */ |
| + |
| ret = i2c_smbus_read_byte(&tpa_i2c_client) >= 0; |
| i2c_put_adapter(adap); |
| return ret; |
| @@ -342,7 +344,10 @@ static int snd_rpi_hifiberry_dacplus_pro |
| struct of_changeset ocs; |
| |
| /* probe for head phone amp */ |
| - if (hb_hp_detect()) { |
| + ret = hb_hp_detect(); |
| + if (ret < 0) |
| + return ret; |
| + if (ret) { |
| card->aux_dev = hifiberry_dacplus_aux_devs; |
| card->num_aux_devs = |
| ARRAY_SIZE(hifiberry_dacplus_aux_devs); |