提交 f686a36b 编写于 作者: A Andrea Galbusera 提交者: Jonathan Cameron

iio: adc: mcp320x: Add support for mcp3301

This adds support for Microchip's 13 bit 1 channel AD converter MCP3301
Signed-off-by: NAndrea Galbusera <gizero@gmail.com>
Signed-off-by: NJonathan Cameron <jic23@kernel.org>
上级 47764c79
...@@ -18,6 +18,7 @@ Required properties: ...@@ -18,6 +18,7 @@ Required properties:
"mcp3202" "mcp3202"
"mcp3204" "mcp3204"
"mcp3208" "mcp3208"
"mcp3301"
Examples: Examples:
......
...@@ -229,8 +229,8 @@ config MCP320X ...@@ -229,8 +229,8 @@ config MCP320X
depends on SPI depends on SPI
help help
Say yes here to build support for Microchip Technology's Say yes here to build support for Microchip Technology's
MCP3001, MCP3002, MCP3004, MCP3008, MCP3201, MCP3202, MCP3204 or MCP3001, MCP3002, MCP3004, MCP3008, MCP3201, MCP3202, MCP3204,
MCP3208 analog to digital converter. MCP3208 or MCP3301 analog to digital converter.
This driver can also be built as a module. If so, the module will be This driver can also be built as a module. If so, the module will be
called mcp320x. called mcp320x.
......
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
* http://ww1.microchip.com/downloads/en/DeviceDoc/21290D.pdf mcp3201 * http://ww1.microchip.com/downloads/en/DeviceDoc/21290D.pdf mcp3201
* http://ww1.microchip.com/downloads/en/DeviceDoc/21034D.pdf mcp3202 * http://ww1.microchip.com/downloads/en/DeviceDoc/21034D.pdf mcp3202
* http://ww1.microchip.com/downloads/en/DeviceDoc/21298c.pdf mcp3204/08 * http://ww1.microchip.com/downloads/en/DeviceDoc/21298c.pdf mcp3204/08
* http://ww1.microchip.com/downloads/en/DeviceDoc/21700E.pdf mcp3301
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as * it under the terms of the GNU General Public License version 2 as
...@@ -47,6 +48,7 @@ enum { ...@@ -47,6 +48,7 @@ enum {
mcp3202, mcp3202,
mcp3204, mcp3204,
mcp3208, mcp3208,
mcp3301,
}; };
struct mcp320x_chip_info { struct mcp320x_chip_info {
...@@ -76,6 +78,7 @@ static int mcp320x_channel_to_tx_data(int device_index, ...@@ -76,6 +78,7 @@ static int mcp320x_channel_to_tx_data(int device_index,
switch (device_index) { switch (device_index) {
case mcp3001: case mcp3001:
case mcp3201: case mcp3201:
case mcp3301:
return 0; return 0;
case mcp3002: case mcp3002:
case mcp3202: case mcp3202:
...@@ -102,7 +105,7 @@ static int mcp320x_adc_conversion(struct mcp320x *adc, u8 channel, ...@@ -102,7 +105,7 @@ static int mcp320x_adc_conversion(struct mcp320x *adc, u8 channel,
adc->tx_buf = mcp320x_channel_to_tx_data(device_index, adc->tx_buf = mcp320x_channel_to_tx_data(device_index,
channel, differential); channel, differential);
if (device_index != mcp3001 && device_index != mcp3201) { if (device_index != mcp3001 && device_index != mcp3201 && device_index != mcp3301) {
ret = spi_sync(adc->spi, &adc->msg); ret = spi_sync(adc->spi, &adc->msg);
if (ret < 0) if (ret < 0)
return ret; return ret;
...@@ -125,6 +128,8 @@ static int mcp320x_adc_conversion(struct mcp320x *adc, u8 channel, ...@@ -125,6 +128,8 @@ static int mcp320x_adc_conversion(struct mcp320x *adc, u8 channel,
case mcp3204: case mcp3204:
case mcp3208: case mcp3208:
return (adc->rx_buf[0] << 4 | adc->rx_buf[1] >> 4); return (adc->rx_buf[0] << 4 | adc->rx_buf[1] >> 4);
case mcp3301:
return sign_extend32((adc->rx_buf[0] & 0x1f) << 8 | adc->rx_buf[1], 12);
default: default:
return -EINVAL; return -EINVAL;
} }
...@@ -274,6 +279,11 @@ static const struct mcp320x_chip_info mcp320x_chip_infos[] = { ...@@ -274,6 +279,11 @@ static const struct mcp320x_chip_info mcp320x_chip_infos[] = {
.num_channels = ARRAY_SIZE(mcp3208_channels), .num_channels = ARRAY_SIZE(mcp3208_channels),
.resolution = 12 .resolution = 12
}, },
[mcp3301] = {
.channels = mcp3201_channels,
.num_channels = ARRAY_SIZE(mcp3201_channels),
.resolution = 13
},
}; };
static int mcp320x_probe(struct spi_device *spi) static int mcp320x_probe(struct spi_device *spi)
...@@ -366,6 +376,9 @@ static const struct of_device_id mcp320x_dt_ids[] = { ...@@ -366,6 +376,9 @@ static const struct of_device_id mcp320x_dt_ids[] = {
}, { }, {
.compatible = "mcp3208", .compatible = "mcp3208",
.data = &mcp320x_chip_infos[mcp3208], .data = &mcp320x_chip_infos[mcp3208],
}, {
.compatible = "mcp3301",
.data = &mcp320x_chip_infos[mcp3301],
}, { }, {
} }
}; };
...@@ -381,6 +394,7 @@ static const struct spi_device_id mcp320x_id[] = { ...@@ -381,6 +394,7 @@ static const struct spi_device_id mcp320x_id[] = {
{ "mcp3202", mcp3202 }, { "mcp3202", mcp3202 },
{ "mcp3204", mcp3204 }, { "mcp3204", mcp3204 },
{ "mcp3208", mcp3208 }, { "mcp3208", mcp3208 },
{ "mcp3301", mcp3301 },
{ } { }
}; };
MODULE_DEVICE_TABLE(spi, mcp320x_id); MODULE_DEVICE_TABLE(spi, mcp320x_id);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册