iio: adc: mcp320x: Add support for mcp3301
This adds support for Microchip's 13 bit 1 channel AD converter MCP3301 Signed-off-by: Andrea Galbusera <gizero@gmail.com> Signed-off-by: Jonathan Cameron <jic23@kernel.org>
This commit is contained in:
Родитель
47764c7918
Коммит
f686a36b4b
|
@ -18,6 +18,7 @@ Required properties:
|
|||
"mcp3202"
|
||||
"mcp3204"
|
||||
"mcp3208"
|
||||
"mcp3301"
|
||||
|
||||
|
||||
Examples:
|
||||
|
|
|
@ -229,8 +229,8 @@ config MCP320X
|
|||
depends on SPI
|
||||
help
|
||||
Say yes here to build support for Microchip Technology's
|
||||
MCP3001, MCP3002, MCP3004, MCP3008, MCP3201, MCP3202, MCP3204 or
|
||||
MCP3208 analog to digital converter.
|
||||
MCP3001, MCP3002, MCP3004, MCP3008, MCP3201, MCP3202, MCP3204,
|
||||
MCP3208 or MCP3301 analog to digital converter.
|
||||
|
||||
This driver can also be built as a module. If so, the module will be
|
||||
called mcp320x.
|
||||
|
|
|
@ -25,6 +25,7 @@
|
|||
* 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/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
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
|
@ -47,6 +48,7 @@ enum {
|
|||
mcp3202,
|
||||
mcp3204,
|
||||
mcp3208,
|
||||
mcp3301,
|
||||
};
|
||||
|
||||
struct mcp320x_chip_info {
|
||||
|
@ -76,6 +78,7 @@ static int mcp320x_channel_to_tx_data(int device_index,
|
|||
switch (device_index) {
|
||||
case mcp3001:
|
||||
case mcp3201:
|
||||
case mcp3301:
|
||||
return 0;
|
||||
case mcp3002:
|
||||
case mcp3202:
|
||||
|
@ -102,7 +105,7 @@ static int mcp320x_adc_conversion(struct mcp320x *adc, u8 channel,
|
|||
adc->tx_buf = mcp320x_channel_to_tx_data(device_index,
|
||||
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);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
@ -125,6 +128,8 @@ static int mcp320x_adc_conversion(struct mcp320x *adc, u8 channel,
|
|||
case mcp3204:
|
||||
case mcp3208:
|
||||
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:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
@ -274,6 +279,11 @@ static const struct mcp320x_chip_info mcp320x_chip_infos[] = {
|
|||
.num_channels = ARRAY_SIZE(mcp3208_channels),
|
||||
.resolution = 12
|
||||
},
|
||||
[mcp3301] = {
|
||||
.channels = mcp3201_channels,
|
||||
.num_channels = ARRAY_SIZE(mcp3201_channels),
|
||||
.resolution = 13
|
||||
},
|
||||
};
|
||||
|
||||
static int mcp320x_probe(struct spi_device *spi)
|
||||
|
@ -366,6 +376,9 @@ static const struct of_device_id mcp320x_dt_ids[] = {
|
|||
}, {
|
||||
.compatible = "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[] = {
|
|||
{ "mcp3202", mcp3202 },
|
||||
{ "mcp3204", mcp3204 },
|
||||
{ "mcp3208", mcp3208 },
|
||||
{ "mcp3301", mcp3301 },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(spi, mcp320x_id);
|
||||
|
|
Загрузка…
Ссылка в новой задаче