Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Andrea Galbusera and committed by
Jonathan Cameron
f686a36b 47764c79

+18 -3
+1
Documentation/devicetree/bindings/iio/adc/mcp320x.txt
··· 18 18 "mcp3202" 19 19 "mcp3204" 20 20 "mcp3208" 21 + "mcp3301" 21 22 22 23 23 24 Examples:
+2 -2
drivers/iio/adc/Kconfig
··· 229 229 depends on SPI 230 230 help 231 231 Say yes here to build support for Microchip Technology's 232 - MCP3001, MCP3002, MCP3004, MCP3008, MCP3201, MCP3202, MCP3204 or 233 - MCP3208 analog to digital converter. 232 + MCP3001, MCP3002, MCP3004, MCP3008, MCP3201, MCP3202, MCP3204, 233 + MCP3208 or MCP3301 analog to digital converter. 234 234 235 235 This driver can also be built as a module. If so, the module will be 236 236 called mcp320x.
+15 -1
drivers/iio/adc/mcp320x.c
··· 25 25 * http://ww1.microchip.com/downloads/en/DeviceDoc/21290D.pdf mcp3201 26 26 * http://ww1.microchip.com/downloads/en/DeviceDoc/21034D.pdf mcp3202 27 27 * http://ww1.microchip.com/downloads/en/DeviceDoc/21298c.pdf mcp3204/08 28 + * http://ww1.microchip.com/downloads/en/DeviceDoc/21700E.pdf mcp3301 28 29 * 29 30 * This program is free software; you can redistribute it and/or modify 30 31 * it under the terms of the GNU General Public License version 2 as ··· 48 47 mcp3202, 49 48 mcp3204, 50 49 mcp3208, 50 + mcp3301, 51 51 }; 52 52 53 53 struct mcp320x_chip_info { ··· 78 76 switch (device_index) { 79 77 case mcp3001: 80 78 case mcp3201: 79 + case mcp3301: 81 80 return 0; 82 81 case mcp3002: 83 82 case mcp3202: ··· 105 102 adc->tx_buf = mcp320x_channel_to_tx_data(device_index, 106 103 channel, differential); 107 104 108 - if (device_index != mcp3001 && device_index != mcp3201) { 105 + if (device_index != mcp3001 && device_index != mcp3201 && device_index != mcp3301) { 109 106 ret = spi_sync(adc->spi, &adc->msg); 110 107 if (ret < 0) 111 108 return ret; ··· 128 125 case mcp3204: 129 126 case mcp3208: 130 127 return (adc->rx_buf[0] << 4 | adc->rx_buf[1] >> 4); 128 + case mcp3301: 129 + return sign_extend32((adc->rx_buf[0] & 0x1f) << 8 | adc->rx_buf[1], 12); 131 130 default: 132 131 return -EINVAL; 133 132 } ··· 279 274 .num_channels = ARRAY_SIZE(mcp3208_channels), 280 275 .resolution = 12 281 276 }, 277 + [mcp3301] = { 278 + .channels = mcp3201_channels, 279 + .num_channels = ARRAY_SIZE(mcp3201_channels), 280 + .resolution = 13 281 + }, 282 282 }; 283 283 284 284 static int mcp320x_probe(struct spi_device *spi) ··· 377 367 .compatible = "mcp3208", 378 368 .data = &mcp320x_chip_infos[mcp3208], 379 369 }, { 370 + .compatible = "mcp3301", 371 + .data = &mcp320x_chip_infos[mcp3301], 372 + }, { 380 373 } 381 374 }; 382 375 MODULE_DEVICE_TABLE(of, mcp320x_dt_ids); ··· 394 381 { "mcp3202", mcp3202 }, 395 382 { "mcp3204", mcp3204 }, 396 383 { "mcp3208", mcp3208 }, 384 + { "mcp3301", mcp3301 }, 397 385 { } 398 386 }; 399 387 MODULE_DEVICE_TABLE(spi, mcp320x_id);