147298897SPhilippe Reynes /* 247298897SPhilippe Reynes * iio/dac/max5821.c 347298897SPhilippe Reynes * Copyright (C) 2014 Philippe Reynes 447298897SPhilippe Reynes * 547298897SPhilippe Reynes * This program is free software; you can redistribute it and/or modify 647298897SPhilippe Reynes * it under the terms of the GNU General Public License version 2 as 747298897SPhilippe Reynes * published by the Free Software Foundation. 847298897SPhilippe Reynes */ 947298897SPhilippe Reynes 1047298897SPhilippe Reynes #include <linux/kernel.h> 1147298897SPhilippe Reynes #include <linux/module.h> 1247298897SPhilippe Reynes #include <linux/i2c.h> 1347298897SPhilippe Reynes #include <linux/iio/iio.h> 1447298897SPhilippe Reynes #include <linux/regulator/consumer.h> 1547298897SPhilippe Reynes 1647298897SPhilippe Reynes #define MAX5821_MAX_DAC_CHANNELS 2 1747298897SPhilippe Reynes 1847298897SPhilippe Reynes /* command bytes */ 1947298897SPhilippe Reynes #define MAX5821_LOAD_DAC_A_IN_REG_B 0x00 2047298897SPhilippe Reynes #define MAX5821_LOAD_DAC_B_IN_REG_A 0x10 2147298897SPhilippe Reynes #define MAX5821_EXTENDED_COMMAND_MODE 0xf0 2247298897SPhilippe Reynes #define MAX5821_READ_DAC_A_COMMAND 0xf1 2347298897SPhilippe Reynes #define MAX5821_READ_DAC_B_COMMAND 0xf2 2447298897SPhilippe Reynes 2547298897SPhilippe Reynes #define MAX5821_EXTENDED_POWER_UP 0x00 2647298897SPhilippe Reynes #define MAX5821_EXTENDED_POWER_DOWN_MODE0 0x01 2747298897SPhilippe Reynes #define MAX5821_EXTENDED_POWER_DOWN_MODE1 0x02 2847298897SPhilippe Reynes #define MAX5821_EXTENDED_POWER_DOWN_MODE2 0x03 2947298897SPhilippe Reynes #define MAX5821_EXTENDED_DAC_A 0x04 3047298897SPhilippe Reynes #define MAX5821_EXTENDED_DAC_B 0x08 3147298897SPhilippe Reynes 3247298897SPhilippe Reynes enum max5821_device_ids { 3347298897SPhilippe Reynes ID_MAX5821, 3447298897SPhilippe Reynes }; 3547298897SPhilippe Reynes 3647298897SPhilippe Reynes struct max5821_data { 3747298897SPhilippe Reynes struct i2c_client *client; 3847298897SPhilippe Reynes struct regulator *vref_reg; 3947298897SPhilippe Reynes unsigned short vref_mv; 4047298897SPhilippe Reynes bool powerdown[MAX5821_MAX_DAC_CHANNELS]; 4147298897SPhilippe Reynes u8 powerdown_mode[MAX5821_MAX_DAC_CHANNELS]; 4247298897SPhilippe Reynes struct mutex lock; 4347298897SPhilippe Reynes }; 4447298897SPhilippe Reynes 4547298897SPhilippe Reynes static const char * const max5821_powerdown_modes[] = { 4647298897SPhilippe Reynes "three_state", 4747298897SPhilippe Reynes "1kohm_to_gnd", 4847298897SPhilippe Reynes "100kohm_to_gnd", 4947298897SPhilippe Reynes }; 5047298897SPhilippe Reynes 5147298897SPhilippe Reynes enum { 5247298897SPhilippe Reynes MAX5821_THREE_STATE, 5347298897SPhilippe Reynes MAX5821_1KOHM_TO_GND, 5447298897SPhilippe Reynes MAX5821_100KOHM_TO_GND 5547298897SPhilippe Reynes }; 5647298897SPhilippe Reynes 5747298897SPhilippe Reynes static int max5821_get_powerdown_mode(struct iio_dev *indio_dev, 5847298897SPhilippe Reynes const struct iio_chan_spec *chan) 5947298897SPhilippe Reynes { 6047298897SPhilippe Reynes struct max5821_data *st = iio_priv(indio_dev); 6147298897SPhilippe Reynes 6247298897SPhilippe Reynes return st->powerdown_mode[chan->channel]; 6347298897SPhilippe Reynes } 6447298897SPhilippe Reynes 6547298897SPhilippe Reynes static int max5821_set_powerdown_mode(struct iio_dev *indio_dev, 6647298897SPhilippe Reynes const struct iio_chan_spec *chan, 6747298897SPhilippe Reynes unsigned int mode) 6847298897SPhilippe Reynes { 6947298897SPhilippe Reynes struct max5821_data *st = iio_priv(indio_dev); 7047298897SPhilippe Reynes 7147298897SPhilippe Reynes st->powerdown_mode[chan->channel] = mode; 7247298897SPhilippe Reynes 7347298897SPhilippe Reynes return 0; 7447298897SPhilippe Reynes } 7547298897SPhilippe Reynes 7647298897SPhilippe Reynes static const struct iio_enum max5821_powerdown_mode_enum = { 7747298897SPhilippe Reynes .items = max5821_powerdown_modes, 7847298897SPhilippe Reynes .num_items = ARRAY_SIZE(max5821_powerdown_modes), 7947298897SPhilippe Reynes .get = max5821_get_powerdown_mode, 8047298897SPhilippe Reynes .set = max5821_set_powerdown_mode, 8147298897SPhilippe Reynes }; 8247298897SPhilippe Reynes 8347298897SPhilippe Reynes static ssize_t max5821_read_dac_powerdown(struct iio_dev *indio_dev, 8447298897SPhilippe Reynes uintptr_t private, 8547298897SPhilippe Reynes const struct iio_chan_spec *chan, 8647298897SPhilippe Reynes char *buf) 8747298897SPhilippe Reynes { 8847298897SPhilippe Reynes struct max5821_data *st = iio_priv(indio_dev); 8947298897SPhilippe Reynes 9047298897SPhilippe Reynes return sprintf(buf, "%d\n", st->powerdown[chan->channel]); 9147298897SPhilippe Reynes } 9247298897SPhilippe Reynes 9347298897SPhilippe Reynes static int max5821_sync_powerdown_mode(struct max5821_data *data, 9447298897SPhilippe Reynes const struct iio_chan_spec *chan) 9547298897SPhilippe Reynes { 9647298897SPhilippe Reynes u8 outbuf[2]; 9747298897SPhilippe Reynes 9847298897SPhilippe Reynes outbuf[0] = MAX5821_EXTENDED_COMMAND_MODE; 9947298897SPhilippe Reynes 10047298897SPhilippe Reynes if (chan->channel == 0) 10147298897SPhilippe Reynes outbuf[1] = MAX5821_EXTENDED_DAC_A; 10247298897SPhilippe Reynes else 10347298897SPhilippe Reynes outbuf[1] = MAX5821_EXTENDED_DAC_B; 10447298897SPhilippe Reynes 10547298897SPhilippe Reynes if (data->powerdown[chan->channel]) 10647298897SPhilippe Reynes outbuf[1] |= data->powerdown_mode[chan->channel] + 1; 10747298897SPhilippe Reynes else 10847298897SPhilippe Reynes outbuf[1] |= MAX5821_EXTENDED_POWER_UP; 10947298897SPhilippe Reynes 11047298897SPhilippe Reynes return i2c_master_send(data->client, outbuf, 2); 11147298897SPhilippe Reynes } 11247298897SPhilippe Reynes 11347298897SPhilippe Reynes static ssize_t max5821_write_dac_powerdown(struct iio_dev *indio_dev, 11447298897SPhilippe Reynes uintptr_t private, 11547298897SPhilippe Reynes const struct iio_chan_spec *chan, 11647298897SPhilippe Reynes const char *buf, size_t len) 11747298897SPhilippe Reynes { 11847298897SPhilippe Reynes struct max5821_data *data = iio_priv(indio_dev); 11947298897SPhilippe Reynes bool powerdown; 12047298897SPhilippe Reynes int ret; 12147298897SPhilippe Reynes 12247298897SPhilippe Reynes ret = strtobool(buf, &powerdown); 12347298897SPhilippe Reynes if (ret) 12447298897SPhilippe Reynes return ret; 12547298897SPhilippe Reynes 12647298897SPhilippe Reynes data->powerdown[chan->channel] = powerdown; 12747298897SPhilippe Reynes 12847298897SPhilippe Reynes ret = max5821_sync_powerdown_mode(data, chan); 12947298897SPhilippe Reynes if (ret < 0) 13047298897SPhilippe Reynes return ret; 13147298897SPhilippe Reynes 13247298897SPhilippe Reynes return len; 13347298897SPhilippe Reynes } 13447298897SPhilippe Reynes 13547298897SPhilippe Reynes static const struct iio_chan_spec_ext_info max5821_ext_info[] = { 13647298897SPhilippe Reynes { 13747298897SPhilippe Reynes .name = "powerdown", 13847298897SPhilippe Reynes .read = max5821_read_dac_powerdown, 13947298897SPhilippe Reynes .write = max5821_write_dac_powerdown, 14047298897SPhilippe Reynes .shared = IIO_SEPARATE, 14147298897SPhilippe Reynes }, 14247298897SPhilippe Reynes IIO_ENUM("powerdown_mode", IIO_SEPARATE, &max5821_powerdown_mode_enum), 14347298897SPhilippe Reynes IIO_ENUM_AVAILABLE("powerdown_mode", &max5821_powerdown_mode_enum), 14447298897SPhilippe Reynes { }, 14547298897SPhilippe Reynes }; 14647298897SPhilippe Reynes 14747298897SPhilippe Reynes #define MAX5821_CHANNEL(chan) { \ 14847298897SPhilippe Reynes .type = IIO_VOLTAGE, \ 14947298897SPhilippe Reynes .indexed = 1, \ 15047298897SPhilippe Reynes .output = 1, \ 15147298897SPhilippe Reynes .channel = (chan), \ 15247298897SPhilippe Reynes .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \ 15347298897SPhilippe Reynes .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SCALE), \ 15447298897SPhilippe Reynes .ext_info = max5821_ext_info, \ 15547298897SPhilippe Reynes } 15647298897SPhilippe Reynes 15747298897SPhilippe Reynes static const struct iio_chan_spec max5821_channels[] = { 15847298897SPhilippe Reynes MAX5821_CHANNEL(0), 15947298897SPhilippe Reynes MAX5821_CHANNEL(1) 16047298897SPhilippe Reynes }; 16147298897SPhilippe Reynes 16247298897SPhilippe Reynes static const u8 max5821_read_dac_command[] = { 16347298897SPhilippe Reynes MAX5821_READ_DAC_A_COMMAND, 16447298897SPhilippe Reynes MAX5821_READ_DAC_B_COMMAND 16547298897SPhilippe Reynes }; 16647298897SPhilippe Reynes 16747298897SPhilippe Reynes static const u8 max5821_load_dac_command[] = { 16847298897SPhilippe Reynes MAX5821_LOAD_DAC_A_IN_REG_B, 16947298897SPhilippe Reynes MAX5821_LOAD_DAC_B_IN_REG_A 17047298897SPhilippe Reynes }; 17147298897SPhilippe Reynes 17247298897SPhilippe Reynes static int max5821_get_value(struct iio_dev *indio_dev, 17347298897SPhilippe Reynes int *val, int channel) 17447298897SPhilippe Reynes { 17547298897SPhilippe Reynes struct max5821_data *data = iio_priv(indio_dev); 17647298897SPhilippe Reynes struct i2c_client *client = data->client; 17747298897SPhilippe Reynes u8 outbuf[1]; 17847298897SPhilippe Reynes u8 inbuf[2]; 17947298897SPhilippe Reynes int ret; 18047298897SPhilippe Reynes 18147298897SPhilippe Reynes if ((channel != 0) && (channel != 1)) 18247298897SPhilippe Reynes return -EINVAL; 18347298897SPhilippe Reynes 18447298897SPhilippe Reynes outbuf[0] = max5821_read_dac_command[channel]; 18547298897SPhilippe Reynes 18647298897SPhilippe Reynes mutex_lock(&data->lock); 18747298897SPhilippe Reynes 18847298897SPhilippe Reynes ret = i2c_master_send(client, outbuf, 1); 18947298897SPhilippe Reynes if (ret < 0) { 19047298897SPhilippe Reynes mutex_unlock(&data->lock); 19147298897SPhilippe Reynes return ret; 19247298897SPhilippe Reynes } else if (ret != 1) { 19347298897SPhilippe Reynes mutex_unlock(&data->lock); 19447298897SPhilippe Reynes return -EIO; 19547298897SPhilippe Reynes } 19647298897SPhilippe Reynes 19747298897SPhilippe Reynes ret = i2c_master_recv(client, inbuf, 2); 19847298897SPhilippe Reynes if (ret < 0) { 19947298897SPhilippe Reynes mutex_unlock(&data->lock); 20047298897SPhilippe Reynes return ret; 20147298897SPhilippe Reynes } else if (ret != 2) { 20247298897SPhilippe Reynes mutex_unlock(&data->lock); 20347298897SPhilippe Reynes return -EIO; 20447298897SPhilippe Reynes } 20547298897SPhilippe Reynes 20647298897SPhilippe Reynes mutex_unlock(&data->lock); 20747298897SPhilippe Reynes 20847298897SPhilippe Reynes *val = ((inbuf[0] & 0x0f) << 6) | (inbuf[1] >> 2); 20947298897SPhilippe Reynes 21047298897SPhilippe Reynes return IIO_VAL_INT; 21147298897SPhilippe Reynes } 21247298897SPhilippe Reynes 21347298897SPhilippe Reynes static int max5821_set_value(struct iio_dev *indio_dev, 21447298897SPhilippe Reynes int val, int channel) 21547298897SPhilippe Reynes { 21647298897SPhilippe Reynes struct max5821_data *data = iio_priv(indio_dev); 21747298897SPhilippe Reynes struct i2c_client *client = data->client; 21847298897SPhilippe Reynes u8 outbuf[2]; 21947298897SPhilippe Reynes int ret; 22047298897SPhilippe Reynes 22147298897SPhilippe Reynes if ((val < 0) || (val > 1023)) 22247298897SPhilippe Reynes return -EINVAL; 22347298897SPhilippe Reynes 22447298897SPhilippe Reynes if ((channel != 0) && (channel != 1)) 22547298897SPhilippe Reynes return -EINVAL; 22647298897SPhilippe Reynes 22747298897SPhilippe Reynes outbuf[0] = max5821_load_dac_command[channel]; 22847298897SPhilippe Reynes outbuf[0] |= val >> 6; 22947298897SPhilippe Reynes outbuf[1] = (val & 0x3f) << 2; 23047298897SPhilippe Reynes 23147298897SPhilippe Reynes ret = i2c_master_send(client, outbuf, 2); 23247298897SPhilippe Reynes if (ret < 0) 23347298897SPhilippe Reynes return ret; 23447298897SPhilippe Reynes else if (ret != 2) 23547298897SPhilippe Reynes return -EIO; 23647298897SPhilippe Reynes else 23747298897SPhilippe Reynes return 0; 23847298897SPhilippe Reynes } 23947298897SPhilippe Reynes 24047298897SPhilippe Reynes static int max5821_read_raw(struct iio_dev *indio_dev, 24147298897SPhilippe Reynes struct iio_chan_spec const *chan, 24247298897SPhilippe Reynes int *val, int *val2, long mask) 24347298897SPhilippe Reynes { 24447298897SPhilippe Reynes struct max5821_data *data = iio_priv(indio_dev); 24547298897SPhilippe Reynes 24647298897SPhilippe Reynes switch (mask) { 24747298897SPhilippe Reynes case IIO_CHAN_INFO_RAW: 24847298897SPhilippe Reynes return max5821_get_value(indio_dev, val, chan->channel); 24947298897SPhilippe Reynes case IIO_CHAN_INFO_SCALE: 25047298897SPhilippe Reynes *val = data->vref_mv; 25147298897SPhilippe Reynes *val2 = 10; 25247298897SPhilippe Reynes return IIO_VAL_FRACTIONAL_LOG2; 25347298897SPhilippe Reynes default: 25447298897SPhilippe Reynes return -EINVAL; 25547298897SPhilippe Reynes } 25647298897SPhilippe Reynes } 25747298897SPhilippe Reynes 25847298897SPhilippe Reynes static int max5821_write_raw(struct iio_dev *indio_dev, 25947298897SPhilippe Reynes struct iio_chan_spec const *chan, 26047298897SPhilippe Reynes int val, int val2, long mask) 26147298897SPhilippe Reynes { 26247298897SPhilippe Reynes if (val2 != 0) 26347298897SPhilippe Reynes return -EINVAL; 26447298897SPhilippe Reynes 26547298897SPhilippe Reynes switch (mask) { 26647298897SPhilippe Reynes case IIO_CHAN_INFO_RAW: 26747298897SPhilippe Reynes return max5821_set_value(indio_dev, val, chan->channel); 26847298897SPhilippe Reynes default: 26947298897SPhilippe Reynes return -EINVAL; 27047298897SPhilippe Reynes } 27147298897SPhilippe Reynes } 27247298897SPhilippe Reynes 27347298897SPhilippe Reynes #ifdef CONFIG_PM_SLEEP 27447298897SPhilippe Reynes static int max5821_suspend(struct device *dev) 27547298897SPhilippe Reynes { 27647298897SPhilippe Reynes u8 outbuf[2] = { MAX5821_EXTENDED_COMMAND_MODE, 27747298897SPhilippe Reynes MAX5821_EXTENDED_DAC_A | 27847298897SPhilippe Reynes MAX5821_EXTENDED_DAC_B | 27947298897SPhilippe Reynes MAX5821_EXTENDED_POWER_DOWN_MODE2 }; 28047298897SPhilippe Reynes 28147298897SPhilippe Reynes return i2c_master_send(to_i2c_client(dev), outbuf, 2); 28247298897SPhilippe Reynes } 28347298897SPhilippe Reynes 28447298897SPhilippe Reynes static int max5821_resume(struct device *dev) 28547298897SPhilippe Reynes { 28647298897SPhilippe Reynes u8 outbuf[2] = { MAX5821_EXTENDED_COMMAND_MODE, 28747298897SPhilippe Reynes MAX5821_EXTENDED_DAC_A | 28847298897SPhilippe Reynes MAX5821_EXTENDED_DAC_B | 28947298897SPhilippe Reynes MAX5821_EXTENDED_POWER_UP }; 29047298897SPhilippe Reynes 29147298897SPhilippe Reynes return i2c_master_send(to_i2c_client(dev), outbuf, 2); 29247298897SPhilippe Reynes } 29347298897SPhilippe Reynes 29447298897SPhilippe Reynes static SIMPLE_DEV_PM_OPS(max5821_pm_ops, max5821_suspend, max5821_resume); 29547298897SPhilippe Reynes #define MAX5821_PM_OPS (&max5821_pm_ops) 29647298897SPhilippe Reynes #else 29747298897SPhilippe Reynes #define MAX5821_PM_OPS NULL 29847298897SPhilippe Reynes #endif /* CONFIG_PM_SLEEP */ 29947298897SPhilippe Reynes 30047298897SPhilippe Reynes static const struct iio_info max5821_info = { 30147298897SPhilippe Reynes .read_raw = max5821_read_raw, 30247298897SPhilippe Reynes .write_raw = max5821_write_raw, 30347298897SPhilippe Reynes .driver_module = THIS_MODULE, 30447298897SPhilippe Reynes }; 30547298897SPhilippe Reynes 30647298897SPhilippe Reynes static int max5821_probe(struct i2c_client *client, 30747298897SPhilippe Reynes const struct i2c_device_id *id) 30847298897SPhilippe Reynes { 30947298897SPhilippe Reynes struct max5821_data *data; 31047298897SPhilippe Reynes struct iio_dev *indio_dev; 31147298897SPhilippe Reynes u32 tmp; 31247298897SPhilippe Reynes int ret; 31347298897SPhilippe Reynes 31447298897SPhilippe Reynes indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data)); 31547298897SPhilippe Reynes if (!indio_dev) 31647298897SPhilippe Reynes return -ENOMEM; 31747298897SPhilippe Reynes data = iio_priv(indio_dev); 31847298897SPhilippe Reynes i2c_set_clientdata(client, indio_dev); 31947298897SPhilippe Reynes data->client = client; 32047298897SPhilippe Reynes mutex_init(&data->lock); 32147298897SPhilippe Reynes 32247298897SPhilippe Reynes /* max5821 start in powerdown mode 100Kohm to ground */ 32347298897SPhilippe Reynes for (tmp = 0; tmp < MAX5821_MAX_DAC_CHANNELS; tmp++) { 32447298897SPhilippe Reynes data->powerdown[tmp] = true; 32547298897SPhilippe Reynes data->powerdown_mode[tmp] = MAX5821_100KOHM_TO_GND; 32647298897SPhilippe Reynes } 32747298897SPhilippe Reynes 32847298897SPhilippe Reynes data->vref_reg = devm_regulator_get(&client->dev, "vref"); 32947298897SPhilippe Reynes if (IS_ERR(data->vref_reg)) { 33047298897SPhilippe Reynes ret = PTR_ERR(data->vref_reg); 33147298897SPhilippe Reynes dev_err(&client->dev, 33247298897SPhilippe Reynes "Failed to get vref regulator: %d\n", ret); 33347298897SPhilippe Reynes goto error_free_reg; 33447298897SPhilippe Reynes } 33547298897SPhilippe Reynes 33647298897SPhilippe Reynes ret = regulator_enable(data->vref_reg); 33747298897SPhilippe Reynes if (ret) { 33847298897SPhilippe Reynes dev_err(&client->dev, 33947298897SPhilippe Reynes "Failed to enable vref regulator: %d\n", ret); 34047298897SPhilippe Reynes goto error_free_reg; 34147298897SPhilippe Reynes } 34247298897SPhilippe Reynes 34347298897SPhilippe Reynes ret = regulator_get_voltage(data->vref_reg); 34447298897SPhilippe Reynes if (ret < 0) { 34547298897SPhilippe Reynes dev_err(&client->dev, 34647298897SPhilippe Reynes "Failed to get voltage on regulator: %d\n", ret); 34747298897SPhilippe Reynes goto error_disable_reg; 34847298897SPhilippe Reynes } 34947298897SPhilippe Reynes 35047298897SPhilippe Reynes data->vref_mv = ret / 1000; 35147298897SPhilippe Reynes 35247298897SPhilippe Reynes indio_dev->name = id->name; 35347298897SPhilippe Reynes indio_dev->dev.parent = &client->dev; 35447298897SPhilippe Reynes indio_dev->num_channels = ARRAY_SIZE(max5821_channels); 35547298897SPhilippe Reynes indio_dev->channels = max5821_channels; 35647298897SPhilippe Reynes indio_dev->modes = INDIO_DIRECT_MODE; 35747298897SPhilippe Reynes indio_dev->info = &max5821_info; 35847298897SPhilippe Reynes 35947298897SPhilippe Reynes return iio_device_register(indio_dev); 36047298897SPhilippe Reynes 36147298897SPhilippe Reynes error_disable_reg: 36247298897SPhilippe Reynes regulator_disable(data->vref_reg); 36347298897SPhilippe Reynes 36447298897SPhilippe Reynes error_free_reg: 36547298897SPhilippe Reynes 36647298897SPhilippe Reynes return ret; 36747298897SPhilippe Reynes } 36847298897SPhilippe Reynes 36947298897SPhilippe Reynes static int max5821_remove(struct i2c_client *client) 37047298897SPhilippe Reynes { 37147298897SPhilippe Reynes struct iio_dev *indio_dev = i2c_get_clientdata(client); 37247298897SPhilippe Reynes struct max5821_data *data = iio_priv(indio_dev); 37347298897SPhilippe Reynes 37447298897SPhilippe Reynes iio_device_unregister(indio_dev); 37547298897SPhilippe Reynes regulator_disable(data->vref_reg); 37647298897SPhilippe Reynes 37747298897SPhilippe Reynes return 0; 37847298897SPhilippe Reynes } 37947298897SPhilippe Reynes 38047298897SPhilippe Reynes static const struct i2c_device_id max5821_id[] = { 38147298897SPhilippe Reynes { "max5821", ID_MAX5821 }, 38247298897SPhilippe Reynes { } 38347298897SPhilippe Reynes }; 38447298897SPhilippe Reynes MODULE_DEVICE_TABLE(i2c, max5821_id); 38547298897SPhilippe Reynes 38647298897SPhilippe Reynes static const struct of_device_id max5821_of_match[] = { 38747298897SPhilippe Reynes { .compatible = "maxim,max5821" }, 38847298897SPhilippe Reynes { } 38947298897SPhilippe Reynes }; 390e09f56f3SLuis de Bethencourt MODULE_DEVICE_TABLE(of, max5821_of_match); 39147298897SPhilippe Reynes 39247298897SPhilippe Reynes static struct i2c_driver max5821_driver = { 39347298897SPhilippe Reynes .driver = { 39447298897SPhilippe Reynes .name = "max5821", 395*73733403SJavier Martinez Canillas .of_match_table = max5821_of_match, 39647298897SPhilippe Reynes .pm = MAX5821_PM_OPS, 39747298897SPhilippe Reynes }, 39847298897SPhilippe Reynes .probe = max5821_probe, 39947298897SPhilippe Reynes .remove = max5821_remove, 40047298897SPhilippe Reynes .id_table = max5821_id, 40147298897SPhilippe Reynes }; 40247298897SPhilippe Reynes module_i2c_driver(max5821_driver); 40347298897SPhilippe Reynes 40447298897SPhilippe Reynes MODULE_AUTHOR("Philippe Reynes <tremyfr@yahoo.fr>"); 40547298897SPhilippe Reynes MODULE_DESCRIPTION("MAX5821 DAC"); 40647298897SPhilippe Reynes MODULE_LICENSE("GPL v2"); 407