Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f686a36b authored by Andrea Galbusera's avatar Andrea Galbusera Committed by Jonathan Cameron
Browse files

iio: adc: mcp320x: Add support for mcp3301



This adds support for Microchip's 13 bit 1 channel AD converter MCP3301

Signed-off-by: default avatarAndrea Galbusera <gizero@gmail.com>
Signed-off-by: default avatarJonathan Cameron <jic23@kernel.org>
parent 47764c79
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ Required properties:
				"mcp3202"
				"mcp3204"
				"mcp3208"
				"mcp3301"


Examples:
+2 −2
Original line number Diff line number Diff line
@@ -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.
+15 −1
Original line number Diff line number Diff line
@@ -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);