Fixes a problem when module probes before i2c module is available
authorJoerg Schambacher <joerg@i2audio.com>
Fri, 16 Oct 2020 13:17:07 +0000 (15:17 +0200)
committerpopcornmix <popcornmix@gmail.com>
Wed, 27 Jan 2021 19:12:52 +0000 (19:12 +0000)
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

index a6d078b..157ab4c 100644 (file)
@@ -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_probe(struct platform_device *pdev)
        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);