16ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge/*
26ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge *  max517.c - Support for Maxim MAX517, MAX518 and MAX519
36ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge *
46ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge *  Copyright (C) 2010, 2011 Roland Stigge <stigge@antcom.de>
56ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge *
66ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge *  This program is free software; you can redistribute it and/or modify
76ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge *  it under the terms of the GNU General Public License as published by
86ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge *  the Free Software Foundation; either version 2 of the License, or
96ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge *  (at your option) any later version.
106ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge *
116ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge *  This program is distributed in the hope that it will be useful,
126ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge *  but WITHOUT ANY WARRANTY; without even the implied warranty of
136ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
146ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge *  GNU General Public License for more details.
156ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge *
166ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge *  You should have received a copy of the GNU General Public License
176ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge *  along with this program; if not, write to the Free Software
186ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
196ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge */
206ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge
216ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge#include <linux/module.h>
226ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge#include <linux/init.h>
236ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge#include <linux/slab.h>
246ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge#include <linux/jiffies.h>
256ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge#include <linux/i2c.h>
266ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge#include <linux/err.h>
276ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge
286ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge#include "../iio.h"
299dd1cb303c18f4508abc69f5b40f423ff36a9626Jonathan Cameron#include "../sysfs.h"
306ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge#include "dac.h"
316ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge
326ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge#include "max517.h"
336ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge
346ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge#define MAX517_DRV_NAME	"max517"
356ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge
366ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge/* Commands */
376ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge#define COMMAND_CHANNEL0	0x00
386ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge#define COMMAND_CHANNEL1	0x01 /* for MAX518 and MAX519 */
396ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge#define COMMAND_PD		0x08 /* Power Down */
406ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge
416ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stiggeenum max517_device_ids {
426ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge	ID_MAX517,
436ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge	ID_MAX518,
446ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge	ID_MAX519,
456ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge};
466ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge
476ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stiggestruct max517_data {
486ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge	struct iio_dev		*indio_dev;
49826514b4ee347bf683f043e0900590cfac4d6da5Roland Stigge	struct i2c_client	*client;
506ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge	unsigned short		vref_mv[2];
516ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge};
526ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge
536ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge/*
546ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge * channel: bit 0: channel 1
556ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge *          bit 1: channel 2
566ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge * (this way, it's possible to set both channels at once)
576ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge */
586ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stiggestatic ssize_t max517_set_value(struct device *dev,
596ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge				 struct device_attribute *attr,
606ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge				 const char *buf, size_t count, int channel)
616ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge{
62638e59fc8c867b44dfbe20c235df00384814cb5eJonathan Cameron	struct iio_dev *indio_dev = dev_get_drvdata(dev);
63638e59fc8c867b44dfbe20c235df00384814cb5eJonathan Cameron	struct max517_data *data = iio_priv(indio_dev);
64826514b4ee347bf683f043e0900590cfac4d6da5Roland Stigge	struct i2c_client *client = data->client;
656ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge	u8 outbuf[4]; /* 1x or 2x command + value */
666ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge	int outbuf_size = 0;
676ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge	int res;
686ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge	long val;
696ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge
706ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge	res = strict_strtol(buf, 10, &val);
716ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge
726ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge	if (res)
736ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge		return res;
746ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge
756ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge	if (val < 0 || val > 255)
766ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge		return -EINVAL;
776ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge
786ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge	if (channel & 1) {
796ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge		outbuf[outbuf_size++] = COMMAND_CHANNEL0;
806ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge		outbuf[outbuf_size++] = val;
816ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge	}
826ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge	if (channel & 2) {
836ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge		outbuf[outbuf_size++] = COMMAND_CHANNEL1;
846ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge		outbuf[outbuf_size++] = val;
856ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge	}
866ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge
876ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge	/*
886ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge	 * At this point, there are always 1 or 2 two-byte commands in
896ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge	 * outbuf. With 2 commands, the device can set two outputs
906ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge	 * simultaneously, latching the values upon the end of the I2C
916ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge	 * transfer.
926ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge	 */
936ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge
946ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge	res = i2c_master_send(client, outbuf, outbuf_size);
956ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge	if (res < 0)
966ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge		return res;
976ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge
986ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge	return count;
996ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge}
1006ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge
1016ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stiggestatic ssize_t max517_set_value_1(struct device *dev,
1026ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge				 struct device_attribute *attr,
1036ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge				 const char *buf, size_t count)
1046ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge{
1056ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge	return max517_set_value(dev, attr, buf, count, 1);
1066ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge}
1076ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stiggestatic IIO_DEV_ATTR_OUT_RAW(1, max517_set_value_1, 0);
1086ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge
1096ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stiggestatic ssize_t max517_set_value_2(struct device *dev,
1106ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge				 struct device_attribute *attr,
1116ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge				 const char *buf, size_t count)
1126ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge{
1136ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge	return max517_set_value(dev, attr, buf, count, 2);
1146ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge}
1156ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stiggestatic IIO_DEV_ATTR_OUT_RAW(2, max517_set_value_2, 1);
1166ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge
1176ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stiggestatic ssize_t max517_set_value_both(struct device *dev,
1186ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge				 struct device_attribute *attr,
1196ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge				 const char *buf, size_t count)
1206ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge{
1216ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge	return max517_set_value(dev, attr, buf, count, 3);
1226ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge}
123322c95636739420631e51f3d3f24132dc220762aJonathan Cameronstatic IIO_DEVICE_ATTR_NAMED(out_voltage1and2_raw,
124322c95636739420631e51f3d3f24132dc220762aJonathan Cameron			     out_voltage1&2_raw, S_IWUSR, NULL,
125322c95636739420631e51f3d3f24132dc220762aJonathan Cameron			     max517_set_value_both, -1);
1266ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge
1276ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stiggestatic ssize_t max517_show_scale(struct device *dev,
1286ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge				struct device_attribute *attr,
1296ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge				char *buf, int channel)
1306ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge{
131638e59fc8c867b44dfbe20c235df00384814cb5eJonathan Cameron	struct iio_dev *indio_dev = dev_get_drvdata(dev);
132638e59fc8c867b44dfbe20c235df00384814cb5eJonathan Cameron	struct max517_data *data = iio_priv(indio_dev);
1336ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge	/* Corresponds to Vref / 2^(bits) */
1346ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge	unsigned int scale_uv = (data->vref_mv[channel - 1] * 1000) >> 8;
1356ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge
1366ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge	return sprintf(buf, "%d.%03d\n", scale_uv / 1000, scale_uv % 1000);
1376ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge}
1386ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge
1396ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stiggestatic ssize_t max517_show_scale1(struct device *dev,
1406ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge				struct device_attribute *attr,
1416ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge				char *buf)
1426ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge{
1436ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge	return max517_show_scale(dev, attr, buf, 1);
1446ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge}
145322c95636739420631e51f3d3f24132dc220762aJonathan Cameronstatic IIO_DEVICE_ATTR(out_voltage1_scale, S_IRUGO,
146322c95636739420631e51f3d3f24132dc220762aJonathan Cameron		       max517_show_scale1, NULL, 0);
1476ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge
1486ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stiggestatic ssize_t max517_show_scale2(struct device *dev,
1496ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge				struct device_attribute *attr,
1506ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge				char *buf)
1516ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge{
1526ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge	return max517_show_scale(dev, attr, buf, 2);
1536ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge}
154322c95636739420631e51f3d3f24132dc220762aJonathan Cameronstatic IIO_DEVICE_ATTR(out_voltage2_scale, S_IRUGO,
155322c95636739420631e51f3d3f24132dc220762aJonathan Cameron		       max517_show_scale2, NULL, 0);
1566ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge
157826514b4ee347bf683f043e0900590cfac4d6da5Roland Stigge/* On MAX517 variant, we have one output */
1586ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stiggestatic struct attribute *max517_attributes[] = {
159322c95636739420631e51f3d3f24132dc220762aJonathan Cameron	&iio_dev_attr_out_voltage1_raw.dev_attr.attr,
160322c95636739420631e51f3d3f24132dc220762aJonathan Cameron	&iio_dev_attr_out_voltage1_scale.dev_attr.attr,
1616ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge	NULL
1626ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge};
1636ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge
1646ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stiggestatic struct attribute_group max517_attribute_group = {
1656ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge	.attrs = max517_attributes,
1666ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge};
1676ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge
168826514b4ee347bf683f043e0900590cfac4d6da5Roland Stigge/* On MAX518 and MAX519 variant, we have two outputs */
1696ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stiggestatic struct attribute *max518_attributes[] = {
170322c95636739420631e51f3d3f24132dc220762aJonathan Cameron	&iio_dev_attr_out_voltage1_raw.dev_attr.attr,
171322c95636739420631e51f3d3f24132dc220762aJonathan Cameron	&iio_dev_attr_out_voltage1_scale.dev_attr.attr,
172322c95636739420631e51f3d3f24132dc220762aJonathan Cameron	&iio_dev_attr_out_voltage2_raw.dev_attr.attr,
173322c95636739420631e51f3d3f24132dc220762aJonathan Cameron	&iio_dev_attr_out_voltage2_scale.dev_attr.attr,
174322c95636739420631e51f3d3f24132dc220762aJonathan Cameron	&iio_dev_attr_out_voltage1and2_raw.dev_attr.attr,
1756ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge	NULL
1766ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge};
1776ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge
1786ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stiggestatic struct attribute_group max518_attribute_group = {
1796ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge	.attrs = max518_attributes,
1806ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge};
1816ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge
18201788c533acbd63702146a2be975ae4007cfb2cfLars-Peter Clausen#ifdef CONFIG_PM_SLEEP
18301788c533acbd63702146a2be975ae4007cfb2cfLars-Peter Clausenstatic int max517_suspend(struct device *dev)
1846ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge{
1856ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge	u8 outbuf = COMMAND_PD;
1866ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge
18701788c533acbd63702146a2be975ae4007cfb2cfLars-Peter Clausen	return i2c_master_send(to_i2c_client(dev), &outbuf, 1);
1886ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge}
1896ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge
19001788c533acbd63702146a2be975ae4007cfb2cfLars-Peter Clausenstatic int max517_resume(struct device *dev)
1916ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge{
1926ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge	u8 outbuf = 0;
1936ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge
19401788c533acbd63702146a2be975ae4007cfb2cfLars-Peter Clausen	return i2c_master_send(to_i2c_client(dev), &outbuf, 1);
1956ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge}
1966ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge
19701788c533acbd63702146a2be975ae4007cfb2cfLars-Peter Clausenstatic SIMPLE_DEV_PM_OPS(max517_pm_ops, max517_suspend, max517_resume);
19801788c533acbd63702146a2be975ae4007cfb2cfLars-Peter Clausen#define MAX517_PM_OPS (&max517_pm_ops)
19901788c533acbd63702146a2be975ae4007cfb2cfLars-Peter Clausen#else
20001788c533acbd63702146a2be975ae4007cfb2cfLars-Peter Clausen#define MAX517_PM_OPS NULL
20101788c533acbd63702146a2be975ae4007cfb2cfLars-Peter Clausen#endif
20201788c533acbd63702146a2be975ae4007cfb2cfLars-Peter Clausen
2036fe8135fccd66aedcc55ded70824342587fd2499Jonathan Cameronstatic const struct iio_info max517_info = {
2046fe8135fccd66aedcc55ded70824342587fd2499Jonathan Cameron	.attrs = &max517_attribute_group,
2056fe8135fccd66aedcc55ded70824342587fd2499Jonathan Cameron	.driver_module = THIS_MODULE,
2066fe8135fccd66aedcc55ded70824342587fd2499Jonathan Cameron};
2076fe8135fccd66aedcc55ded70824342587fd2499Jonathan Cameron
2086fe8135fccd66aedcc55ded70824342587fd2499Jonathan Cameronstatic const struct iio_info max518_info = {
2098aa460e9e9f6eb6c23c8b244516bedddee901cebRoland Stigge	.attrs = &max518_attribute_group,
2106fe8135fccd66aedcc55ded70824342587fd2499Jonathan Cameron	.driver_module = THIS_MODULE,
2116fe8135fccd66aedcc55ded70824342587fd2499Jonathan Cameron};
2126fe8135fccd66aedcc55ded70824342587fd2499Jonathan Cameron
2136ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stiggestatic int max517_probe(struct i2c_client *client,
2146ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge			const struct i2c_device_id *id)
2156ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge{
2166ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge	struct max517_data *data;
217cada11fa205b008afed1582bc9816ae5941baf6dJonathan Cameron	struct iio_dev *indio_dev;
2186ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge	struct max517_platform_data *platform_data = client->dev.platform_data;
2196ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge	int err;
2206ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge
221cada11fa205b008afed1582bc9816ae5941baf6dJonathan Cameron	indio_dev = iio_allocate_device(sizeof(*data));
222cada11fa205b008afed1582bc9816ae5941baf6dJonathan Cameron	if (indio_dev == NULL) {
2236ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge		err = -ENOMEM;
2246ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge		goto exit;
2256ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge	}
226cada11fa205b008afed1582bc9816ae5941baf6dJonathan Cameron	data = iio_priv(indio_dev);
227cada11fa205b008afed1582bc9816ae5941baf6dJonathan Cameron	i2c_set_clientdata(client, indio_dev);
228826514b4ee347bf683f043e0900590cfac4d6da5Roland Stigge	data->client = client;
229826514b4ee347bf683f043e0900590cfac4d6da5Roland Stigge
2306ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge	/* establish that the iio_dev is a child of the i2c device */
231cada11fa205b008afed1582bc9816ae5941baf6dJonathan Cameron	indio_dev->dev.parent = &client->dev;
2326ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge
2336ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge	/* reduced attribute set for MAX517 */
2346ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge	if (id->driver_data == ID_MAX517)
235cada11fa205b008afed1582bc9816ae5941baf6dJonathan Cameron		indio_dev->info = &max517_info;
2366ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge	else
237cada11fa205b008afed1582bc9816ae5941baf6dJonathan Cameron		indio_dev->info = &max518_info;
238cada11fa205b008afed1582bc9816ae5941baf6dJonathan Cameron	indio_dev->modes = INDIO_DIRECT_MODE;
2396ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge
2406ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge	/*
2416ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge	 * Reference voltage on MAX518 and default is 5V, else take vref_mv
2426ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge	 * from platform_data
2436ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge	 */
2446ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge	if (id->driver_data == ID_MAX518 || !platform_data) {
2456ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge		data->vref_mv[0] = data->vref_mv[1] = 5000; /* mV */
2466ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge	} else {
2476ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge		data->vref_mv[0] = platform_data->vref_mv[0];
2486ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge		data->vref_mv[1] = platform_data->vref_mv[1];
2496ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge	}
2506ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge
251cada11fa205b008afed1582bc9816ae5941baf6dJonathan Cameron	err = iio_device_register(indio_dev);
2526ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge	if (err)
2536ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge		goto exit_free_device;
2546ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge
2556ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge	dev_info(&client->dev, "DAC registered\n");
2566ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge
2576ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge	return 0;
2586ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge
2596ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stiggeexit_free_device:
260cada11fa205b008afed1582bc9816ae5941baf6dJonathan Cameron	iio_free_device(indio_dev);
2616ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stiggeexit:
2626ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge	return err;
2636ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge}
2646ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge
2656ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stiggestatic int max517_remove(struct i2c_client *client)
2666ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge{
267cada11fa205b008afed1582bc9816ae5941baf6dJonathan Cameron	iio_free_device(i2c_get_clientdata(client));
2686ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge
2696ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge	return 0;
2706ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge}
2716ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge
2726ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stiggestatic const struct i2c_device_id max517_id[] = {
2736ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge	{ "max517", ID_MAX517 },
2746ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge	{ "max518", ID_MAX518 },
2756ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge	{ "max519", ID_MAX519 },
2766ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge	{ }
2776ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge};
2786ddc5fb43e47e18d434619e08d41260ff121a7f6Roland StiggeMODULE_DEVICE_TABLE(i2c, max517_id);
2796ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge
2806ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stiggestatic struct i2c_driver max517_driver = {
2816ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge	.driver = {
2826ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge		.name	= MAX517_DRV_NAME,
28301788c533acbd63702146a2be975ae4007cfb2cfLars-Peter Clausen		.pm		= MAX517_PM_OPS,
2846ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge	},
2856ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge	.probe		= max517_probe,
2866ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge	.remove		= max517_remove,
2876ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge	.id_table	= max517_id,
2886ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge};
2896e5af184f810f6150e07339bd23a09c498739c82Lars-Peter Clausenmodule_i2c_driver(max517_driver);
2906ddc5fb43e47e18d434619e08d41260ff121a7f6Roland Stigge
2916ddc5fb43e47e18d434619e08d41260ff121a7f6Roland StiggeMODULE_AUTHOR("Roland Stigge <stigge@antcom.de>");
2926ddc5fb43e47e18d434619e08d41260ff121a7f6Roland StiggeMODULE_DESCRIPTION("MAX517/MAX518/MAX519 8-bit DAC");
2936ddc5fb43e47e18d434619e08d41260ff121a7f6Roland StiggeMODULE_LICENSE("GPL");
294