iio: health: max30102: Add check for part ID
authorPeter Meerwald-Stadler <pmeerw@pmeerw.net>
Fri, 27 Oct 2017 19:45:36 +0000 (21:45 +0200)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Sat, 2 Dec 2017 10:40:46 +0000 (10:40 +0000)
Signed-off-by: Peter Meerwald-Stadler <pmeerw@pmeerw.net>
Acked-by: Matt Ranostay <matt.ranostay@konsulko.com>
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
drivers/iio/health/max30102.c

index 3b6213a..0123347 100644 (file)
@@ -32,6 +32,7 @@
 
 #define MAX30102_REGMAP_NAME   "max30102_regmap"
 #define MAX30102_DRV_NAME      "max30102"
+#define MAX30102_PART_NUMBER   0x15
 
 #define MAX30102_REG_INT_STATUS                        0x00
 #define MAX30102_REG_INT_STATUS_PWR_RDY                BIT(0)
@@ -83,6 +84,9 @@
 #define MAX30102_REG_TEMP_INTEGER              0x1f
 #define MAX30102_REG_TEMP_FRACTION             0x20
 
+#define MAX30102_REG_REV_ID                    0xfe
+#define MAX30102_REG_PART_ID                   0xff
+
 struct max30102_data {
        struct i2c_client *client;
        struct iio_dev *indio_dev;
@@ -391,6 +395,7 @@ static int max30102_probe(struct i2c_client *client,
        struct iio_buffer *buffer;
        struct iio_dev *indio_dev;
        int ret;
+       unsigned int reg;
 
        indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data));
        if (!indio_dev)
@@ -424,6 +429,19 @@ static int max30102_probe(struct i2c_client *client,
                return PTR_ERR(data->regmap);
        }
 
+       /* check part ID */
+       ret = regmap_read(data->regmap, MAX30102_REG_PART_ID, &reg);
+       if (ret)
+               return ret;
+       if (reg != MAX30102_PART_NUMBER)
+               return -ENODEV;
+
+       /* show revision ID */
+       ret = regmap_read(data->regmap, MAX30102_REG_REV_ID, &reg);
+       if (ret)
+               return ret;
+       dev_dbg(&client->dev, "max3010x revision %02x\n", reg);
+
        ret = max30102_set_powermode(data, false);
        if (ret)
                return ret;