diff mbox series

iio: mma8452: Fix probe failing when an i2c_device_id is used

Message ID 20220106111414.66421-1-hdegoede@redhat.com (mailing list archive)
State Accepted
Headers show
Series iio: mma8452: Fix probe failing when an i2c_device_id is used | expand

Commit Message

Hans de Goede Jan. 6, 2022, 11:14 a.m. UTC
The mma8452_driver declares both of_match_table and i2c_driver.id_table
match-tables, but its probe() function only checked for of matches.

Add support for i2c_device_id matches. This fixes the driver not loading
on some x86 tablets (e.g. the Nextbook Ares 8) where the i2c_client is
instantiated by platform code using an i2c_device_id.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
 drivers/iio/accel/mma8452.c | 23 +++++++++++++++--------
 1 file changed, 15 insertions(+), 8 deletions(-)

Comments

Jonathan Cameron Jan. 9, 2022, 3:10 p.m. UTC | #1
On Thu,  6 Jan 2022 12:14:14 +0100
Hans de Goede <hdegoede@redhat.com> wrote:

> The mma8452_driver declares both of_match_table and i2c_driver.id_table
> match-tables, but its probe() function only checked for of matches.
> 
> Add support for i2c_device_id matches. This fixes the driver not loading
> on some x86 tablets (e.g. the Nextbook Ares 8) where the i2c_client is
> instantiated by platform code using an i2c_device_id.
> 
> Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Hi Hans,

At some point we'll want to get rid of the of_ specific stuff in here in
favour of generic firmware properties and I suspect at that time we'll
move the device name into the chip_info_table[] entries so that we
can just use device_get_match_data()

In the meantime this fix looks good to me.  Is there an appropriate
Fixes: tag?

Thanks,

Jonathan


> ---
>  drivers/iio/accel/mma8452.c | 23 +++++++++++++++--------
>  1 file changed, 15 insertions(+), 8 deletions(-)
> 
> diff --git a/drivers/iio/accel/mma8452.c b/drivers/iio/accel/mma8452.c
> index 09c7f10fefb6..c82841c0a7b3 100644
> --- a/drivers/iio/accel/mma8452.c
> +++ b/drivers/iio/accel/mma8452.c
> @@ -1523,12 +1523,7 @@ static int mma8452_probe(struct i2c_client *client,
>  	struct iio_dev *indio_dev;
>  	int ret;
>  	const struct of_device_id *match;
> -
> -	match = of_match_device(mma8452_dt_ids, &client->dev);
> -	if (!match) {
> -		dev_err(&client->dev, "unknown device model\n");
> -		return -ENODEV;
> -	}
> +	const char *compatible;
>  
>  	indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data));
>  	if (!indio_dev)
> @@ -1537,7 +1532,19 @@ static int mma8452_probe(struct i2c_client *client,
>  	data = iio_priv(indio_dev);
>  	data->client = client;
>  	mutex_init(&data->lock);
> -	data->chip_info = match->data;
> +
> +	if (id) {
> +		compatible = id->name;
> +		data->chip_info = &mma_chip_info_table[id->driver_data];
> +	} else {
> +		match = of_match_device(mma8452_dt_ids, &client->dev);
> +		if (!match) {
> +			dev_err(&client->dev, "unknown device model\n");
> +			return -ENODEV;
> +		}
> +		compatible = match->compatible;
> +		data->chip_info = match->data;
> +	}
>  
>  	data->vdd_reg = devm_regulator_get(&client->dev, "vdd");
>  	if (IS_ERR(data->vdd_reg))
> @@ -1581,7 +1588,7 @@ static int mma8452_probe(struct i2c_client *client,
>  	}
>  
>  	dev_info(&client->dev, "registering %s accelerometer; ID 0x%x\n",
> -		 match->compatible, data->chip_info->chip_id);
> +		 compatible, data->chip_info->chip_id);
>  
>  	i2c_set_clientdata(client, indio_dev);
>  	indio_dev->info = &mma8452_info;
Hans de Goede Jan. 9, 2022, 3:35 p.m. UTC | #2
Hi,

On 1/9/22 16:10, Jonathan Cameron wrote:
> On Thu,  6 Jan 2022 12:14:14 +0100
> Hans de Goede <hdegoede@redhat.com> wrote:
> 
>> The mma8452_driver declares both of_match_table and i2c_driver.id_table
>> match-tables, but its probe() function only checked for of matches.
>>
>> Add support for i2c_device_id matches. This fixes the driver not loading
>> on some x86 tablets (e.g. the Nextbook Ares 8) where the i2c_client is
>> instantiated by platform code using an i2c_device_id.
>>
>> Signed-off-by: Hans de Goede <hdegoede@redhat.com>
> Hi Hans,
> 
> At some point we'll want to get rid of the of_ specific stuff in here in
> favour of generic firmware properties and I suspect at that time we'll
> move the device name into the chip_info_table[] entries so that we
> can just use device_get_match_data()
> 
> In the meantime this fix looks good to me.  Is there an appropriate
> Fixes: tag?

I did a quick dive in the git history and the of_match_device() ||
return -ENODEV behavior was introduced in:

c3cdd6e48e35 ("iio: mma8452: refactor for seperating chip specific data")

Regards,

Hans




>> ---
>>  drivers/iio/accel/mma8452.c | 23 +++++++++++++++--------
>>  1 file changed, 15 insertions(+), 8 deletions(-)
>>
>> diff --git a/drivers/iio/accel/mma8452.c b/drivers/iio/accel/mma8452.c
>> index 09c7f10fefb6..c82841c0a7b3 100644
>> --- a/drivers/iio/accel/mma8452.c
>> +++ b/drivers/iio/accel/mma8452.c
>> @@ -1523,12 +1523,7 @@ static int mma8452_probe(struct i2c_client *client,
>>  	struct iio_dev *indio_dev;
>>  	int ret;
>>  	const struct of_device_id *match;
>> -
>> -	match = of_match_device(mma8452_dt_ids, &client->dev);
>> -	if (!match) {
>> -		dev_err(&client->dev, "unknown device model\n");
>> -		return -ENODEV;
>> -	}
>> +	const char *compatible;
>>  
>>  	indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data));
>>  	if (!indio_dev)
>> @@ -1537,7 +1532,19 @@ static int mma8452_probe(struct i2c_client *client,
>>  	data = iio_priv(indio_dev);
>>  	data->client = client;
>>  	mutex_init(&data->lock);
>> -	data->chip_info = match->data;
>> +
>> +	if (id) {
>> +		compatible = id->name;
>> +		data->chip_info = &mma_chip_info_table[id->driver_data];
>> +	} else {
>> +		match = of_match_device(mma8452_dt_ids, &client->dev);
>> +		if (!match) {
>> +			dev_err(&client->dev, "unknown device model\n");
>> +			return -ENODEV;
>> +		}
>> +		compatible = match->compatible;
>> +		data->chip_info = match->data;
>> +	}
>>  
>>  	data->vdd_reg = devm_regulator_get(&client->dev, "vdd");
>>  	if (IS_ERR(data->vdd_reg))
>> @@ -1581,7 +1588,7 @@ static int mma8452_probe(struct i2c_client *client,
>>  	}
>>  
>>  	dev_info(&client->dev, "registering %s accelerometer; ID 0x%x\n",
>> -		 match->compatible, data->chip_info->chip_id);
>> +		 compatible, data->chip_info->chip_id);
>>  
>>  	i2c_set_clientdata(client, indio_dev);
>>  	indio_dev->info = &mma8452_info;
>
Jonathan Cameron Jan. 30, 2022, 2:54 p.m. UTC | #3
On Sun, 9 Jan 2022 16:35:46 +0100
Hans de Goede <hdegoede@redhat.com> wrote:

> Hi,
> 
> On 1/9/22 16:10, Jonathan Cameron wrote:
> > On Thu,  6 Jan 2022 12:14:14 +0100
> > Hans de Goede <hdegoede@redhat.com> wrote:
> >   
> >> The mma8452_driver declares both of_match_table and i2c_driver.id_table
> >> match-tables, but its probe() function only checked for of matches.
> >>
> >> Add support for i2c_device_id matches. This fixes the driver not loading
> >> on some x86 tablets (e.g. the Nextbook Ares 8) where the i2c_client is
> >> instantiated by platform code using an i2c_device_id.
> >>
> >> Signed-off-by: Hans de Goede <hdegoede@redhat.com>  
> > Hi Hans,
> > 
> > At some point we'll want to get rid of the of_ specific stuff in here in
> > favour of generic firmware properties and I suspect at that time we'll
> > move the device name into the chip_info_table[] entries so that we
> > can just use device_get_match_data()
> > 
> > In the meantime this fix looks good to me.  Is there an appropriate
> > Fixes: tag?  
> 
> I did a quick dive in the git history and the of_match_device() ||
> return -ENODEV behavior was introduced in:
> 
> c3cdd6e48e35 ("iio: mma8452: refactor for seperating chip specific data")
Applied to the fixes-togreg branch of iio.git with that as the fixes tag.

Hmm. Sending "Fixes: tag?" was a  bad idea on my part as b4 picked it up as
a fixes tag. Good think I was editing it anyway or I might not have noticed.

Thanks,

Jonathan

> 
> Regards,
> 
> Hans
> 
> 
> 
> 
> >> ---
> >>  drivers/iio/accel/mma8452.c | 23 +++++++++++++++--------
> >>  1 file changed, 15 insertions(+), 8 deletions(-)
> >>
> >> diff --git a/drivers/iio/accel/mma8452.c b/drivers/iio/accel/mma8452.c
> >> index 09c7f10fefb6..c82841c0a7b3 100644
> >> --- a/drivers/iio/accel/mma8452.c
> >> +++ b/drivers/iio/accel/mma8452.c
> >> @@ -1523,12 +1523,7 @@ static int mma8452_probe(struct i2c_client *client,
> >>  	struct iio_dev *indio_dev;
> >>  	int ret;
> >>  	const struct of_device_id *match;
> >> -
> >> -	match = of_match_device(mma8452_dt_ids, &client->dev);
> >> -	if (!match) {
> >> -		dev_err(&client->dev, "unknown device model\n");
> >> -		return -ENODEV;
> >> -	}
> >> +	const char *compatible;
> >>  
> >>  	indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data));
> >>  	if (!indio_dev)
> >> @@ -1537,7 +1532,19 @@ static int mma8452_probe(struct i2c_client *client,
> >>  	data = iio_priv(indio_dev);
> >>  	data->client = client;
> >>  	mutex_init(&data->lock);
> >> -	data->chip_info = match->data;
> >> +
> >> +	if (id) {
> >> +		compatible = id->name;
> >> +		data->chip_info = &mma_chip_info_table[id->driver_data];
> >> +	} else {
> >> +		match = of_match_device(mma8452_dt_ids, &client->dev);
> >> +		if (!match) {
> >> +			dev_err(&client->dev, "unknown device model\n");
> >> +			return -ENODEV;
> >> +		}
> >> +		compatible = match->compatible;
> >> +		data->chip_info = match->data;
> >> +	}
> >>  
> >>  	data->vdd_reg = devm_regulator_get(&client->dev, "vdd");
> >>  	if (IS_ERR(data->vdd_reg))
> >> @@ -1581,7 +1588,7 @@ static int mma8452_probe(struct i2c_client *client,
> >>  	}
> >>  
> >>  	dev_info(&client->dev, "registering %s accelerometer; ID 0x%x\n",
> >> -		 match->compatible, data->chip_info->chip_id);
> >> +		 compatible, data->chip_info->chip_id);
> >>  
> >>  	i2c_set_clientdata(client, indio_dev);
> >>  	indio_dev->info = &mma8452_info;  
> >   
>
diff mbox series

Patch

diff --git a/drivers/iio/accel/mma8452.c b/drivers/iio/accel/mma8452.c
index 09c7f10fefb6..c82841c0a7b3 100644
--- a/drivers/iio/accel/mma8452.c
+++ b/drivers/iio/accel/mma8452.c
@@ -1523,12 +1523,7 @@  static int mma8452_probe(struct i2c_client *client,
 	struct iio_dev *indio_dev;
 	int ret;
 	const struct of_device_id *match;
-
-	match = of_match_device(mma8452_dt_ids, &client->dev);
-	if (!match) {
-		dev_err(&client->dev, "unknown device model\n");
-		return -ENODEV;
-	}
+	const char *compatible;
 
 	indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data));
 	if (!indio_dev)
@@ -1537,7 +1532,19 @@  static int mma8452_probe(struct i2c_client *client,
 	data = iio_priv(indio_dev);
 	data->client = client;
 	mutex_init(&data->lock);
-	data->chip_info = match->data;
+
+	if (id) {
+		compatible = id->name;
+		data->chip_info = &mma_chip_info_table[id->driver_data];
+	} else {
+		match = of_match_device(mma8452_dt_ids, &client->dev);
+		if (!match) {
+			dev_err(&client->dev, "unknown device model\n");
+			return -ENODEV;
+		}
+		compatible = match->compatible;
+		data->chip_info = match->data;
+	}
 
 	data->vdd_reg = devm_regulator_get(&client->dev, "vdd");
 	if (IS_ERR(data->vdd_reg))
@@ -1581,7 +1588,7 @@  static int mma8452_probe(struct i2c_client *client,
 	}
 
 	dev_info(&client->dev, "registering %s accelerometer; ID 0x%x\n",
-		 match->compatible, data->chip_info->chip_id);
+		 compatible, data->chip_info->chip_id);
 
 	i2c_set_clientdata(client, indio_dev);
 	indio_dev->info = &mma8452_info;