Commit a878a1a6 authored by Antonio Fiol's avatar Antonio Fiol Committed by Jonathan Cameron

iio: max517: Add support for MAX520 and MAX521 chips.

MAX520 and MAX521 are protocol-compatible with the already supported
chips, just have more channels.
Signed-off-by: default avatarAntonio Fiol <antonio@fiol.es>
Signed-off-by: default avatarJonathan Cameron <jic23@kernel.org>
parent 7253606d
...@@ -143,11 +143,16 @@ config AD7303 ...@@ -143,11 +143,16 @@ config AD7303
ad7303. ad7303.
config MAX517 config MAX517
tristate "Maxim MAX517/518/519 DAC driver" tristate "Maxim MAX517/518/519/520/521 DAC driver"
depends on I2C depends on I2C
help help
If you say yes here you get support for the Maxim chips MAX517, If you say yes here you get support for the following Maxim chips
MAX518 and MAX519 (I2C 8-Bit DACs with rail-to-rail outputs). (I2C 8-Bit DACs with rail-to-rail outputs):
MAX517 - Single channel, single reference
MAX518 - Dual channel, ref=Vdd
MAX519 - Dual channel, dual reference
MAX520 - Quad channel, quad reference
MAX521 - Octal channel, independent ref for ch0-3, shared ref for ch4-7
This driver can also be built as a module. If so, the module This driver can also be built as a module. If so, the module
will be called max517. will be called max517.
......
...@@ -39,11 +39,13 @@ enum max517_device_ids { ...@@ -39,11 +39,13 @@ enum max517_device_ids {
ID_MAX517, ID_MAX517,
ID_MAX518, ID_MAX518,
ID_MAX519, ID_MAX519,
ID_MAX520,
ID_MAX521,
}; };
struct max517_data { struct max517_data {
struct i2c_client *client; struct i2c_client *client;
unsigned short vref_mv[2]; unsigned short vref_mv[8];
}; };
/* /*
...@@ -149,7 +151,13 @@ static const struct iio_info max517_info = { ...@@ -149,7 +151,13 @@ static const struct iio_info max517_info = {
static const struct iio_chan_spec max517_channels[] = { static const struct iio_chan_spec max517_channels[] = {
MAX517_CHANNEL(0), MAX517_CHANNEL(0),
MAX517_CHANNEL(1) MAX517_CHANNEL(1),
MAX517_CHANNEL(2),
MAX517_CHANNEL(3),
MAX517_CHANNEL(4),
MAX517_CHANNEL(5),
MAX517_CHANNEL(6),
MAX517_CHANNEL(7),
}; };
static int max517_probe(struct i2c_client *client, static int max517_probe(struct i2c_client *client,
...@@ -158,6 +166,7 @@ static int max517_probe(struct i2c_client *client, ...@@ -158,6 +166,7 @@ static int max517_probe(struct i2c_client *client,
struct max517_data *data; struct max517_data *data;
struct iio_dev *indio_dev; struct iio_dev *indio_dev;
struct max517_platform_data *platform_data = client->dev.platform_data; struct max517_platform_data *platform_data = client->dev.platform_data;
int chan;
indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data)); indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data));
if (!indio_dev) if (!indio_dev)
...@@ -169,11 +178,21 @@ static int max517_probe(struct i2c_client *client, ...@@ -169,11 +178,21 @@ static int max517_probe(struct i2c_client *client,
/* establish that the iio_dev is a child of the i2c device */ /* establish that the iio_dev is a child of the i2c device */
indio_dev->dev.parent = &client->dev; indio_dev->dev.parent = &client->dev;
/* reduced channel set for MAX517 */ switch (id->driver_data) {
if (id->driver_data == ID_MAX517) case ID_MAX521:
indio_dev->num_channels = 1; indio_dev->num_channels = 8;
else break;
case ID_MAX520:
indio_dev->num_channels = 4;
break;
case ID_MAX519:
case ID_MAX518:
indio_dev->num_channels = 2; indio_dev->num_channels = 2;
break;
default: /* single channel for MAX517 */
indio_dev->num_channels = 1;
break;
}
indio_dev->channels = max517_channels; indio_dev->channels = max517_channels;
indio_dev->modes = INDIO_DIRECT_MODE; indio_dev->modes = INDIO_DIRECT_MODE;
indio_dev->info = &max517_info; indio_dev->info = &max517_info;
...@@ -182,11 +201,11 @@ static int max517_probe(struct i2c_client *client, ...@@ -182,11 +201,11 @@ static int max517_probe(struct i2c_client *client,
* Reference voltage on MAX518 and default is 5V, else take vref_mv * Reference voltage on MAX518 and default is 5V, else take vref_mv
* from platform_data * from platform_data
*/ */
if (id->driver_data == ID_MAX518 || !platform_data) { for (chan = 0; chan < indio_dev->num_channels; chan++) {
data->vref_mv[0] = data->vref_mv[1] = 5000; /* mV */ if (id->driver_data == ID_MAX518 || !platform_data)
} else { data->vref_mv[chan] = 5000; /* mV */
data->vref_mv[0] = platform_data->vref_mv[0]; else
data->vref_mv[1] = platform_data->vref_mv[1]; data->vref_mv[chan] = platform_data->vref_mv[chan];
} }
return iio_device_register(indio_dev); return iio_device_register(indio_dev);
...@@ -202,6 +221,8 @@ static const struct i2c_device_id max517_id[] = { ...@@ -202,6 +221,8 @@ static const struct i2c_device_id max517_id[] = {
{ "max517", ID_MAX517 }, { "max517", ID_MAX517 },
{ "max518", ID_MAX518 }, { "max518", ID_MAX518 },
{ "max519", ID_MAX519 }, { "max519", ID_MAX519 },
{ "max520", ID_MAX520 },
{ "max521", ID_MAX521 },
{ } { }
}; };
MODULE_DEVICE_TABLE(i2c, max517_id); MODULE_DEVICE_TABLE(i2c, max517_id);
...@@ -218,5 +239,5 @@ static struct i2c_driver max517_driver = { ...@@ -218,5 +239,5 @@ static struct i2c_driver max517_driver = {
module_i2c_driver(max517_driver); module_i2c_driver(max517_driver);
MODULE_AUTHOR("Roland Stigge <stigge@antcom.de>"); MODULE_AUTHOR("Roland Stigge <stigge@antcom.de>");
MODULE_DESCRIPTION("MAX517/MAX518/MAX519 8-bit DAC"); MODULE_DESCRIPTION("MAX517/518/519/520/521 8-bit DAC");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
#define IIO_DAC_MAX517_H_ #define IIO_DAC_MAX517_H_
struct max517_platform_data { struct max517_platform_data {
u16 vref_mv[2]; u16 vref_mv[8];
}; };
#endif /* IIO_DAC_MAX517_H_ */ #endif /* IIO_DAC_MAX517_H_ */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment