hwmon: (mcp3021) Add MCP3221 support
authorSven Schuchmann <schuchmann@schleissheimer.de>
Fri, 21 Sep 2012 11:04:22 +0000 (13:04 +0200)
committerGuenter Roeck <linux@roeck-us.net>
Mon, 24 Sep 2012 04:08:36 +0000 (21:08 -0700)
This Patch adds support for mcp3221 chip to the
mcp3021 driver.

Signed-off-by: Sven Schuchmann <schuchmann@schleissheimer.de>
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
Documentation/hwmon/mcp3021
drivers/hwmon/Kconfig
drivers/hwmon/mcp3021.c

index 325fd87e81b22e64a5b0ddaf07647a559b14f730..74a6b72adf5fe4378f692c42e598e80c690fc473 100644 (file)
@@ -5,18 +5,25 @@ Supported chips:
   * Microchip Technology MCP3021
     Prefix: 'mcp3021'
     Datasheet: http://ww1.microchip.com/downloads/en/DeviceDoc/21805a.pdf
+  * Microchip Technology MCP3221
+    Prefix: 'mcp3221'
+    Datasheet: http://ww1.microchip.com/downloads/en/DeviceDoc/21732c.pdf
 
-Author: Mingkai Hu
+Authors:
+   Mingkai Hu
+   Sven Schuchmann <schuchmann@schleissheimer.de>
 
 Description
 -----------
 
-This driver implements support for the Microchip Technology MCP3021 chip.
+This driver implements support for the Microchip Technology MCP3021 and
+MCP3221 chip.
 
 The Microchip Technology Inc. MCP3021 is a successive approximation A/D
-converter (ADC) with 10-bit resolution.
-This device provides one single-ended input with very low power consumption.
-Communication to the MCP3021 is performed using a 2-wire I2C compatible
-interface. Standard (100 kHz) and Fast (400 kHz) I2C modes are available.
-The default I2C device address is 0x4d (contact the Microchip factory for
-additional address options).
+converter (ADC) with 10-bit resolution. The MCP3221 has 12-bit resolution.
+
+These devices provide one single-ended input with very low power consumption.
+Communication to the MCP3021/MCP3221  is performed using a 2-wire I2C
+compatible interface. Standard (100 kHz) and Fast (400 kHz) I2C modes are
+available. The default I2C device address is 0x4d (contact the Microchip
+factory for additional address options).
index 6bc49cfb9f7b3023c21696b4ed871a4984f83681..c74e73b2069ad230cd1be4ae4d7510252d44f52b 100644 (file)
@@ -855,11 +855,12 @@ config SENSORS_MAX6650
          will be called max6650.
 
 config SENSORS_MCP3021
-       tristate "Microchip MCP3021"
+       tristate "Microchip MCP3021 and compatibles"
        depends on I2C
        help
-         If you say yes here you get support for the MCP3021 chip
-         that is a A/D converter (ADC) with 10-bit resolution.
+         If you say yes here you get support for MCP3021 and MCP3221.
+         The MCP3021 is a A/D converter (ADC) with 10-bit and the MCP3221
+         with 12-bit resolution.
 
          This driver can also be built as a module.  If so, the module
          will be called mcp3021.
index d700b9271174fb1c35a553feb674a94932ad43ec..eedb32292d6d3c20035f56a90820861d38e02102 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * mcp3021.c - driver for the Microchip MCP3021 chip
+ * mcp3021.c - driver for Microchip MCP3021 and MCP3221
  *
  * Copyright (C) 2008-2009, 2012 Freescale Semiconductor, Inc.
  * Author: Mingkai Hu <Mingkai.hu@freescale.com>
 #define MCP3021_OUTPUT_RES     10      /* 10-bit resolution */
 #define MCP3021_OUTPUT_SCALE   4
 
+#define MCP3221_SAR_SHIFT      0
+#define MCP3221_SAR_MASK       0xfff
+#define MCP3221_OUTPUT_RES     12      /* 12-bit resolution */
+#define MCP3221_OUTPUT_SCALE   1
+
 enum chips {
-       mcp3021
+       mcp3021,
+       mcp3221
 };
+
 /*
  * Client data (each client gets its own)
  */
@@ -127,6 +134,13 @@ static int mcp3021_probe(struct i2c_client *client,
                data->output_res = MCP3021_OUTPUT_RES;
                data->output_scale = MCP3021_OUTPUT_SCALE;
                break;
+
+       case mcp3221:
+               data->sar_shift = MCP3221_SAR_SHIFT;
+               data->sar_mask = MCP3221_SAR_MASK;
+               data->output_res = MCP3221_OUTPUT_RES;
+               data->output_scale = MCP3221_OUTPUT_SCALE;
+               break;
        }
 
        if (client->dev.platform_data) {
@@ -165,6 +179,7 @@ static int mcp3021_remove(struct i2c_client *client)
 
 static const struct i2c_device_id mcp3021_id[] = {
        { "mcp3021", mcp3021 },
+       { "mcp3221", mcp3221 },
        { }
 };
 MODULE_DEVICE_TABLE(i2c, mcp3021_id);
@@ -181,5 +196,5 @@ static struct i2c_driver mcp3021_driver = {
 module_i2c_driver(mcp3021_driver);
 
 MODULE_AUTHOR("Mingkai Hu <Mingkai.hu@freescale.com>");
-MODULE_DESCRIPTION("Microchip MCP3021 driver");
+MODULE_DESCRIPTION("Microchip MCP3021/MCP3221 driver");
 MODULE_LICENSE("GPL");