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