Add support for Microchip Technology's MCP3426/7/8 ADC
authorAngelo Compagnucci <angelo.compagnucci@gmail.com>
Sun, 3 Aug 2014 22:22:00 +0000 (23:22 +0100)
committerJonathan Cameron <jic23@kernel.org>
Sun, 16 Mar 2014 18:00:34 +0000 (18:00 +0000)
This patch extends previous mcp3422 driver to support
missing members of the family, mcp3426/7/8.

Signed-off-by: Angelo Compagnucci <angelo.compagnucci@gmail.com>
Signed-off-by: Jonathan Cameron <jic23@kernel.org>
drivers/iio/adc/Kconfig
drivers/iio/adc/mcp3422.c

index a036811..1dffa2d 100644 (file)
@@ -157,11 +157,12 @@ config MCP320X
          called mcp320x.
 
 config MCP3422
-       tristate "Microchip Technology MCP3422/3/4 driver"
+       tristate "Microchip Technology MCP3422/3/4/6/7/8 driver"
        depends on I2C
        help
-         Say yes here to build support for Microchip Technology's MCP3422,
-         MCP3423 or MCP3424 analog to digital converters.
+         Say yes here to build support for Microchip Technology's
+         MCP3422, MCP3423, MCP3424, MCP3426, MCP3427 or MCP3428
+         analog to digital converters.
 
          This driver can also be built as a module. If so, the module will be
          called mcp3422.
index 47dcb34..5167225 100644 (file)
@@ -1,10 +1,11 @@
 /*
- * mcp3422.c - driver for the Microchip mcp3422/3/4 chip family
+ * mcp3422.c - driver for the Microchip mcp3422/3/4/6/7/8 chip family
  *
  * Copyright (C) 2013, Angelo Compagnucci
  * Author: Angelo Compagnucci <angelo.compagnucci@gmail.com>
  *
  * Datasheet: http://ww1.microchip.com/downloads/en/devicedoc/22088b.pdf
+ *            http://ww1.microchip.com/downloads/en/DeviceDoc/22226a.pdf
  *
  * This driver exports the value of analog input voltage to sysfs, the
  * voltage unit is nV.
@@ -96,6 +97,7 @@ static const int mcp3422_sign_extend[4] = {
 /* Client data (each client gets its own) */
 struct mcp3422 {
        struct i2c_client *i2c;
+       u8 id;
        u8 config;
        u8 pga[4];
        struct mutex lock;
@@ -238,6 +240,8 @@ static int mcp3422_write_raw(struct iio_dev *iio,
                        temp = MCP3422_SRATE_15;
                        break;
                case 3:
+                       if (adc->id > 4)
+                               return -EINVAL;
                        temp = MCP3422_SRATE_3;
                        break;
                default:
@@ -271,6 +275,17 @@ static int mcp3422_write_raw_get_fmt(struct iio_dev *indio_dev,
        }
 }
 
+static ssize_t mcp3422_show_samp_freqs(struct device *dev,
+               struct device_attribute *attr, char *buf)
+{
+       struct mcp3422 *adc = iio_priv(dev_to_iio_dev(dev));
+
+       if (adc->id > 4)
+               return sprintf(buf, "240 60 15\n");
+
+       return sprintf(buf, "240 60 15 3\n");
+}
+
 static ssize_t mcp3422_show_scales(struct device *dev,
                struct device_attribute *attr, char *buf)
 {
@@ -284,12 +299,13 @@ static ssize_t mcp3422_show_scales(struct device *dev,
                mcp3422_scales[sample_rate][3]);
 }
 
-static IIO_CONST_ATTR_SAMP_FREQ_AVAIL("240 60 15 3");
+static IIO_DEVICE_ATTR(sampling_frequency_available, S_IRUGO,
+               mcp3422_show_samp_freqs, NULL, 0);
 static IIO_DEVICE_ATTR(in_voltage_scale_available, S_IRUGO,
                mcp3422_show_scales, NULL, 0);
 
 static struct attribute *mcp3422_attributes[] = {
-       &iio_const_attr_sampling_frequency_available.dev_attr.attr,
+       &iio_dev_attr_sampling_frequency_available.dev_attr.attr,
        &iio_dev_attr_in_voltage_scale_available.dev_attr.attr,
        NULL,
 };
@@ -335,6 +351,7 @@ static int mcp3422_probe(struct i2c_client *client,
 
        adc = iio_priv(indio_dev);
        adc->i2c = client;
+       adc->id = (u8)(id->driver_data);
 
        mutex_init(&adc->lock);
 
@@ -343,13 +360,16 @@ static int mcp3422_probe(struct i2c_client *client,
        indio_dev->modes = INDIO_DIRECT_MODE;
        indio_dev->info = &mcp3422_info;
 
-       switch ((unsigned int)(id->driver_data)) {
+       switch (adc->id) {
        case 2:
        case 3:
+       case 6:
+       case 7:
                indio_dev->channels = mcp3422_channels;
                indio_dev->num_channels = ARRAY_SIZE(mcp3422_channels);
                break;
        case 4:
+       case 8:
                indio_dev->channels = mcp3424_channels;
                indio_dev->num_channels = ARRAY_SIZE(mcp3424_channels);
                break;
@@ -375,6 +395,9 @@ static const struct i2c_device_id mcp3422_id[] = {
        { "mcp3422", 2 },
        { "mcp3423", 3 },
        { "mcp3424", 4 },
+       { "mcp3426", 6 },
+       { "mcp3427", 7 },
+       { "mcp3428", 8 },
        { }
 };
 MODULE_DEVICE_TABLE(i2c, mcp3422_id);
@@ -399,5 +422,5 @@ static struct i2c_driver mcp3422_driver = {
 module_i2c_driver(mcp3422_driver);
 
 MODULE_AUTHOR("Angelo Compagnucci <angelo.compagnucci@gmail.com>");
-MODULE_DESCRIPTION("Microchip mcp3422/3/4 driver");
+MODULE_DESCRIPTION("Microchip mcp3422/3/4/6/7/8 driver");
 MODULE_LICENSE("GPL v2");