diff options
| author | Dmitry Torokhov <[email protected]> | 2023-08-30 16:06:38 -0700 | 
|---|---|---|
| committer | Dmitry Torokhov <[email protected]> | 2023-08-30 16:06:38 -0700 | 
| commit | 1ac731c529cd4d6adbce134754b51ff7d822b145 (patch) | |
| tree | 143ab3f35ca5f3b69f583c84e6964b17139c2ec1 /drivers/iio/temperature/tmp117.c | |
| parent | 07b4c950f27bef0362dc6ad7ee713aab61d58149 (diff) | |
| parent | 54116d442e001e1b6bd482122043b1870998a1f3 (diff) | |
Merge branch 'next' into for-linus
Prepare input updates for 6.6 merge window.
Diffstat (limited to 'drivers/iio/temperature/tmp117.c')
| -rw-r--r-- | drivers/iio/temperature/tmp117.c | 80 | 
1 files changed, 61 insertions, 19 deletions
diff --git a/drivers/iio/temperature/tmp117.c b/drivers/iio/temperature/tmp117.c index f9b8f2b570f6..638e3a5bd6b8 100644 --- a/drivers/iio/temperature/tmp117.c +++ b/drivers/iio/temperature/tmp117.c @@ -16,6 +16,7 @@  #include <linux/types.h>  #include <linux/kernel.h>  #include <linux/limits.h> +#include <linux/property.h>  #include <linux/iio/iio.h> @@ -31,17 +32,19 @@  #define TMP117_REG_DEVICE_ID		0xF  #define TMP117_RESOLUTION_10UC		78125 -#define TMP117_DEVICE_ID		0x0117  #define MICRODEGREE_PER_10MILLIDEGREE	10000 +#define TMP116_DEVICE_ID		0x1116 +#define TMP117_DEVICE_ID		0x0117 +  struct tmp117_data {  	struct i2c_client *client;  	s16 calibbias;  };  static int tmp117_read_raw(struct iio_dev *indio_dev, -		struct iio_chan_spec const *channel, int *val, -		int *val2, long mask) +			   struct iio_chan_spec const *channel, int *val, +			   int *val2, long mask)  {  	struct tmp117_data *data = iio_priv(indio_dev);  	s32 ret; @@ -49,7 +52,7 @@ static int tmp117_read_raw(struct iio_dev *indio_dev,  	switch (mask) {  	case IIO_CHAN_INFO_RAW:  		ret = i2c_smbus_read_word_swapped(data->client, -						TMP117_REG_TEMP); +						  TMP117_REG_TEMP);  		if (ret < 0)  			return ret;  		*val = sign_extend32(ret, 15); @@ -57,7 +60,7 @@ static int tmp117_read_raw(struct iio_dev *indio_dev,  	case IIO_CHAN_INFO_CALIBBIAS:  		ret = i2c_smbus_read_word_swapped(data->client, -					TMP117_REG_TEMP_OFFSET); +						  TMP117_REG_TEMP_OFFSET);  		if (ret < 0)  			return ret;  		*val = sign_extend32(ret, 15); @@ -79,9 +82,8 @@ static int tmp117_read_raw(struct iio_dev *indio_dev,  	}  } -static int tmp117_write_raw(struct iio_dev *indio_dev, -		struct iio_chan_spec const *channel, int val, -		int val2, long mask) +static int tmp117_write_raw(struct iio_dev *indio_dev, struct iio_chan_spec +			    const *channel, int val, int val2, long mask)  {  	struct tmp117_data *data = iio_priv(indio_dev);  	s16 off; @@ -104,7 +106,16 @@ static const struct iio_chan_spec tmp117_channels[] = {  	{  		.type = IIO_TEMP,  		.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | -			BIT(IIO_CHAN_INFO_CALIBBIAS) | BIT(IIO_CHAN_INFO_SCALE), +				      BIT(IIO_CHAN_INFO_CALIBBIAS) | +				      BIT(IIO_CHAN_INFO_SCALE), +	}, +}; + +static const struct iio_chan_spec tmp116_channels[] = { +	{ +		.type = IIO_TEMP, +		.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | +				      BIT(IIO_CHAN_INFO_SCALE),  	},  }; @@ -115,23 +126,41 @@ static const struct iio_info tmp117_info = {  static int tmp117_identify(struct i2c_client *client)  { +	const struct i2c_device_id *id; +	unsigned long match_data;  	int dev_id;  	dev_id = i2c_smbus_read_word_swapped(client, TMP117_REG_DEVICE_ID);  	if (dev_id < 0)  		return dev_id; -	if (dev_id != TMP117_DEVICE_ID) { -		dev_err(&client->dev, "TMP117 not found\n"); -		return -ENODEV; + +	switch (dev_id) { +	case TMP116_DEVICE_ID: +	case TMP117_DEVICE_ID: +		return dev_id;  	} -	return 0; + +	dev_info(&client->dev, "Unknown device id (0x%x), use fallback compatible\n", +		 dev_id); + +	match_data = (uintptr_t)device_get_match_data(&client->dev); +	if (match_data) +		return match_data; + +	id = i2c_client_get_device_id(client); +	if (id) +		return id->driver_data; + +	dev_err(&client->dev, "Failed to identify unsupported device\n"); + +	return -ENODEV;  }  static int tmp117_probe(struct i2c_client *client)  {  	struct tmp117_data *data;  	struct iio_dev *indio_dev; -	int ret; +	int ret, dev_id;  	if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_WORD_DATA))  		return -EOPNOTSUPP; @@ -140,6 +169,8 @@ static int tmp117_probe(struct i2c_client *client)  	if (ret < 0)  		return ret; +	dev_id = ret; +  	indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data));  	if (!indio_dev)  		return -ENOMEM; @@ -148,24 +179,35 @@ static int tmp117_probe(struct i2c_client *client)  	data->client = client;  	data->calibbias = 0; -	indio_dev->name = "tmp117";  	indio_dev->modes = INDIO_DIRECT_MODE;  	indio_dev->info = &tmp117_info; -	indio_dev->channels = tmp117_channels; -	indio_dev->num_channels = ARRAY_SIZE(tmp117_channels); +	switch (dev_id) { +	case TMP116_DEVICE_ID: +		indio_dev->channels = tmp116_channels; +		indio_dev->num_channels = ARRAY_SIZE(tmp116_channels); +		indio_dev->name = "tmp116"; +		break; +	case TMP117_DEVICE_ID: +		indio_dev->channels = tmp117_channels; +		indio_dev->num_channels = ARRAY_SIZE(tmp117_channels); +		indio_dev->name = "tmp117"; +		break; +	}  	return devm_iio_device_register(&client->dev, indio_dev);  }  static const struct of_device_id tmp117_of_match[] = { -	{ .compatible = "ti,tmp117", }, +	{ .compatible = "ti,tmp116", .data = (void *)TMP116_DEVICE_ID }, +	{ .compatible = "ti,tmp117", .data = (void *)TMP117_DEVICE_ID },  	{ }  };  MODULE_DEVICE_TABLE(of, tmp117_of_match);  static const struct i2c_device_id tmp117_id[] = { -	{ "tmp117", 0 }, +	{ "tmp116", TMP116_DEVICE_ID }, +	{ "tmp117", TMP117_DEVICE_ID },  	{ }  };  MODULE_DEVICE_TABLE(i2c, tmp117_id);  |