Commit fc8850c0 authored by Lars-Peter Clausen's avatar Lars-Peter Clausen Committed by Jonathan Cameron

staging:iio:adis16400: Fix product id check

The product id check currently ANDs the read id with 0xF000 and compares the
result to the product id from the chip info. Since none of the product ids in
the chip info table end in 0x000 the check will always fail. Furthermore it is
also wrong, the product id in the PROD_ID register will always match the part
number of the device.

Some of the ADIS16XXX devices are identical from a software point of
view with the product id register having a different content. If we keep the
current scheme of storing the product id in the chip info table this would
require us to have multiple almost identical chip info table entries. So instead
this patch changes the code to parse the product id from the device name.
Signed-off-by: default avatarLars-Peter Clausen <lars@metafoo.de>
Signed-off-by: default avatarJonathan Cameron <jic23@kernel.org>
parent ea2ccb3e
...@@ -140,7 +140,6 @@ ...@@ -140,7 +140,6 @@
struct adis16400_chip_info { struct adis16400_chip_info {
const struct iio_chan_spec *channels; const struct iio_chan_spec *channels;
const int num_channels; const int num_channels;
const int product_id;
const long flags; const long flags;
unsigned int gyro_scale_micro; unsigned int gyro_scale_micro;
unsigned int accel_scale_micro; unsigned int accel_scale_micro;
......
...@@ -415,6 +415,7 @@ static int adis16400_initial_setup(struct iio_dev *indio_dev) ...@@ -415,6 +415,7 @@ static int adis16400_initial_setup(struct iio_dev *indio_dev)
{ {
int ret; int ret;
u16 prod_id, smp_prd; u16 prod_id, smp_prd;
unsigned int device_id;
struct adis16400_state *st = iio_priv(indio_dev); struct adis16400_state *st = iio_priv(indio_dev);
/* use low spi speed for init if the device has a slow mode */ /* use low spi speed for init if the device has a slow mode */
...@@ -454,8 +455,11 @@ static int adis16400_initial_setup(struct iio_dev *indio_dev) ...@@ -454,8 +455,11 @@ static int adis16400_initial_setup(struct iio_dev *indio_dev)
if (ret) if (ret)
goto err_ret; goto err_ret;
if ((prod_id & 0xF000) != st->variant->product_id) sscanf(indio_dev->name, "adis%u\n", &device_id);
dev_warn(&indio_dev->dev, "incorrect id");
if (prod_id != device_id)
dev_warn(&indio_dev->dev, "Device ID(%u) and product ID(%u) do not match.",
device_id, prod_id);
dev_info(&indio_dev->dev, "%s: prod_id 0x%04x at CS%d (irq %d)\n", dev_info(&indio_dev->dev, "%s: prod_id 0x%04x at CS%d (irq %d)\n",
indio_dev->name, prod_id, indio_dev->name, prod_id,
...@@ -1149,7 +1153,6 @@ static struct adis16400_chip_info adis16400_chips[] = { ...@@ -1149,7 +1153,6 @@ static struct adis16400_chip_info adis16400_chips[] = {
.channels = adis16350_channels, .channels = adis16350_channels,
.num_channels = ARRAY_SIZE(adis16350_channels), .num_channels = ARRAY_SIZE(adis16350_channels),
.flags = ADIS16400_HAS_PROD_ID | ADIS16400_HAS_SLOW_MODE, .flags = ADIS16400_HAS_PROD_ID | ADIS16400_HAS_SLOW_MODE,
.product_id = 0x3FE8,
.gyro_scale_micro = IIO_DEGREE_TO_RAD(50000), /* 0.05 deg/s */ .gyro_scale_micro = IIO_DEGREE_TO_RAD(50000), /* 0.05 deg/s */
.accel_scale_micro = IIO_G_TO_M_S_2(3333), /* 3.333 mg */ .accel_scale_micro = IIO_G_TO_M_S_2(3333), /* 3.333 mg */
.temp_scale_nano = 136000000, /* 0.136 C */ .temp_scale_nano = 136000000, /* 0.136 C */
...@@ -1162,7 +1165,6 @@ static struct adis16400_chip_info adis16400_chips[] = { ...@@ -1162,7 +1165,6 @@ static struct adis16400_chip_info adis16400_chips[] = {
.channels = adis16350_channels, .channels = adis16350_channels,
.num_channels = ARRAY_SIZE(adis16350_channels), .num_channels = ARRAY_SIZE(adis16350_channels),
.flags = ADIS16400_HAS_PROD_ID | ADIS16400_HAS_SLOW_MODE, .flags = ADIS16400_HAS_PROD_ID | ADIS16400_HAS_SLOW_MODE,
.product_id = 0x3FEA,
.gyro_scale_micro = IIO_DEGREE_TO_RAD(50000), /* 0.05 deg/s */ .gyro_scale_micro = IIO_DEGREE_TO_RAD(50000), /* 0.05 deg/s */
.accel_scale_micro = IIO_G_TO_M_S_2(333), /* 0.333 mg */ .accel_scale_micro = IIO_G_TO_M_S_2(333), /* 0.333 mg */
.temp_scale_nano = 136000000, /* 0.136 C */ .temp_scale_nano = 136000000, /* 0.136 C */
...@@ -1175,7 +1177,6 @@ static struct adis16400_chip_info adis16400_chips[] = { ...@@ -1175,7 +1177,6 @@ static struct adis16400_chip_info adis16400_chips[] = {
.channels = adis16350_channels, .channels = adis16350_channels,
.num_channels = ARRAY_SIZE(adis16350_channels), .num_channels = ARRAY_SIZE(adis16350_channels),
.flags = ADIS16400_HAS_PROD_ID | ADIS16400_HAS_SLOW_MODE, .flags = ADIS16400_HAS_PROD_ID | ADIS16400_HAS_SLOW_MODE,
.product_id = 0x3FEC,
.gyro_scale_micro = IIO_DEGREE_TO_RAD(50000), /* 0.05 deg/s */ .gyro_scale_micro = IIO_DEGREE_TO_RAD(50000), /* 0.05 deg/s */
.accel_scale_micro = IIO_G_TO_M_S_2(1000), /* 1 mg */ .accel_scale_micro = IIO_G_TO_M_S_2(1000), /* 1 mg */
.temp_scale_nano = 136000000, /* 0.136 C */ .temp_scale_nano = 136000000, /* 0.136 C */
...@@ -1188,7 +1189,6 @@ static struct adis16400_chip_info adis16400_chips[] = { ...@@ -1188,7 +1189,6 @@ static struct adis16400_chip_info adis16400_chips[] = {
.channels = adis16350_channels, .channels = adis16350_channels,
.num_channels = ARRAY_SIZE(adis16350_channels), .num_channels = ARRAY_SIZE(adis16350_channels),
.flags = ADIS16400_HAS_PROD_ID | ADIS16400_HAS_SLOW_MODE, .flags = ADIS16400_HAS_PROD_ID | ADIS16400_HAS_SLOW_MODE,
.product_id = 0x3FED,
.gyro_scale_micro = IIO_DEGREE_TO_RAD(50000), /* 0.05 deg/s */ .gyro_scale_micro = IIO_DEGREE_TO_RAD(50000), /* 0.05 deg/s */
.accel_scale_micro = IIO_G_TO_M_S_2(1000), /* 1 mg */ .accel_scale_micro = IIO_G_TO_M_S_2(1000), /* 1 mg */
.temp_scale_nano = 136000000, /* 0.136 C */ .temp_scale_nano = 136000000, /* 0.136 C */
...@@ -1201,7 +1201,6 @@ static struct adis16400_chip_info adis16400_chips[] = { ...@@ -1201,7 +1201,6 @@ static struct adis16400_chip_info adis16400_chips[] = {
.channels = adis16400_channels, .channels = adis16400_channels,
.num_channels = ARRAY_SIZE(adis16400_channels), .num_channels = ARRAY_SIZE(adis16400_channels),
.flags = ADIS16400_HAS_PROD_ID | ADIS16400_HAS_SLOW_MODE, .flags = ADIS16400_HAS_PROD_ID | ADIS16400_HAS_SLOW_MODE,
.product_id = 0x4015,
.gyro_scale_micro = IIO_DEGREE_TO_RAD(50000), /* 0.05 deg/s */ .gyro_scale_micro = IIO_DEGREE_TO_RAD(50000), /* 0.05 deg/s */
.accel_scale_micro = IIO_G_TO_M_S_2(3333), /* 3.333 mg */ .accel_scale_micro = IIO_G_TO_M_S_2(3333), /* 3.333 mg */
.default_scan_mask = 0xFFF, .default_scan_mask = 0xFFF,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment