xref: /kernel/linux/linux-6.6/drivers/iio/dac/max5821.c (revision 62306a36)
162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only
262306a36Sopenharmony_ci /*
362306a36Sopenharmony_ci  * iio/dac/max5821.c
462306a36Sopenharmony_ci  * Copyright (C) 2014 Philippe Reynes
562306a36Sopenharmony_ci  */
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci#include <linux/kernel.h>
862306a36Sopenharmony_ci#include <linux/module.h>
962306a36Sopenharmony_ci#include <linux/i2c.h>
1062306a36Sopenharmony_ci#include <linux/iio/iio.h>
1162306a36Sopenharmony_ci#include <linux/regulator/consumer.h>
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ci#define MAX5821_MAX_DAC_CHANNELS		2
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci/* command bytes */
1662306a36Sopenharmony_ci#define MAX5821_LOAD_DAC_A_IN_REG_B		0x00
1762306a36Sopenharmony_ci#define MAX5821_LOAD_DAC_B_IN_REG_A		0x10
1862306a36Sopenharmony_ci#define MAX5821_EXTENDED_COMMAND_MODE		0xf0
1962306a36Sopenharmony_ci#define MAX5821_READ_DAC_A_COMMAND		0xf1
2062306a36Sopenharmony_ci#define MAX5821_READ_DAC_B_COMMAND		0xf2
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_ci#define MAX5821_EXTENDED_POWER_UP		0x00
2362306a36Sopenharmony_ci#define MAX5821_EXTENDED_POWER_DOWN_MODE0	0x01
2462306a36Sopenharmony_ci#define MAX5821_EXTENDED_POWER_DOWN_MODE1	0x02
2562306a36Sopenharmony_ci#define MAX5821_EXTENDED_POWER_DOWN_MODE2	0x03
2662306a36Sopenharmony_ci#define MAX5821_EXTENDED_DAC_A			0x04
2762306a36Sopenharmony_ci#define MAX5821_EXTENDED_DAC_B			0x08
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_cienum max5821_device_ids {
3062306a36Sopenharmony_ci	ID_MAX5821,
3162306a36Sopenharmony_ci};
3262306a36Sopenharmony_ci
3362306a36Sopenharmony_cistruct max5821_data {
3462306a36Sopenharmony_ci	struct i2c_client	*client;
3562306a36Sopenharmony_ci	struct regulator	*vref_reg;
3662306a36Sopenharmony_ci	unsigned short		vref_mv;
3762306a36Sopenharmony_ci	bool			powerdown[MAX5821_MAX_DAC_CHANNELS];
3862306a36Sopenharmony_ci	u8			powerdown_mode[MAX5821_MAX_DAC_CHANNELS];
3962306a36Sopenharmony_ci	struct mutex		lock;
4062306a36Sopenharmony_ci};
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_cistatic const char * const max5821_powerdown_modes[] = {
4362306a36Sopenharmony_ci	"three_state",
4462306a36Sopenharmony_ci	"1kohm_to_gnd",
4562306a36Sopenharmony_ci	"100kohm_to_gnd",
4662306a36Sopenharmony_ci};
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_cienum {
4962306a36Sopenharmony_ci	MAX5821_THREE_STATE,
5062306a36Sopenharmony_ci	MAX5821_1KOHM_TO_GND,
5162306a36Sopenharmony_ci	MAX5821_100KOHM_TO_GND
5262306a36Sopenharmony_ci};
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_cistatic int max5821_get_powerdown_mode(struct iio_dev *indio_dev,
5562306a36Sopenharmony_ci				      const struct iio_chan_spec *chan)
5662306a36Sopenharmony_ci{
5762306a36Sopenharmony_ci	struct max5821_data *st = iio_priv(indio_dev);
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_ci	return st->powerdown_mode[chan->channel];
6062306a36Sopenharmony_ci}
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_cistatic int max5821_set_powerdown_mode(struct iio_dev *indio_dev,
6362306a36Sopenharmony_ci				      const struct iio_chan_spec *chan,
6462306a36Sopenharmony_ci				      unsigned int mode)
6562306a36Sopenharmony_ci{
6662306a36Sopenharmony_ci	struct max5821_data *st = iio_priv(indio_dev);
6762306a36Sopenharmony_ci
6862306a36Sopenharmony_ci	st->powerdown_mode[chan->channel] = mode;
6962306a36Sopenharmony_ci
7062306a36Sopenharmony_ci	return 0;
7162306a36Sopenharmony_ci}
7262306a36Sopenharmony_ci
7362306a36Sopenharmony_cistatic const struct iio_enum max5821_powerdown_mode_enum = {
7462306a36Sopenharmony_ci	.items = max5821_powerdown_modes,
7562306a36Sopenharmony_ci	.num_items = ARRAY_SIZE(max5821_powerdown_modes),
7662306a36Sopenharmony_ci	.get = max5821_get_powerdown_mode,
7762306a36Sopenharmony_ci	.set = max5821_set_powerdown_mode,
7862306a36Sopenharmony_ci};
7962306a36Sopenharmony_ci
8062306a36Sopenharmony_cistatic ssize_t max5821_read_dac_powerdown(struct iio_dev *indio_dev,
8162306a36Sopenharmony_ci					  uintptr_t private,
8262306a36Sopenharmony_ci					  const struct iio_chan_spec *chan,
8362306a36Sopenharmony_ci					  char *buf)
8462306a36Sopenharmony_ci{
8562306a36Sopenharmony_ci	struct max5821_data *st = iio_priv(indio_dev);
8662306a36Sopenharmony_ci
8762306a36Sopenharmony_ci	return sysfs_emit(buf, "%d\n", st->powerdown[chan->channel]);
8862306a36Sopenharmony_ci}
8962306a36Sopenharmony_ci
9062306a36Sopenharmony_cistatic int max5821_sync_powerdown_mode(struct max5821_data *data,
9162306a36Sopenharmony_ci				       const struct iio_chan_spec *chan)
9262306a36Sopenharmony_ci{
9362306a36Sopenharmony_ci	u8 outbuf[2];
9462306a36Sopenharmony_ci
9562306a36Sopenharmony_ci	outbuf[0] = MAX5821_EXTENDED_COMMAND_MODE;
9662306a36Sopenharmony_ci
9762306a36Sopenharmony_ci	if (chan->channel == 0)
9862306a36Sopenharmony_ci		outbuf[1] = MAX5821_EXTENDED_DAC_A;
9962306a36Sopenharmony_ci	else
10062306a36Sopenharmony_ci		outbuf[1] = MAX5821_EXTENDED_DAC_B;
10162306a36Sopenharmony_ci
10262306a36Sopenharmony_ci	if (data->powerdown[chan->channel])
10362306a36Sopenharmony_ci		outbuf[1] |= data->powerdown_mode[chan->channel] + 1;
10462306a36Sopenharmony_ci	else
10562306a36Sopenharmony_ci		outbuf[1] |= MAX5821_EXTENDED_POWER_UP;
10662306a36Sopenharmony_ci
10762306a36Sopenharmony_ci	return i2c_master_send(data->client, outbuf, 2);
10862306a36Sopenharmony_ci}
10962306a36Sopenharmony_ci
11062306a36Sopenharmony_cistatic ssize_t max5821_write_dac_powerdown(struct iio_dev *indio_dev,
11162306a36Sopenharmony_ci					   uintptr_t private,
11262306a36Sopenharmony_ci					   const struct iio_chan_spec *chan,
11362306a36Sopenharmony_ci					   const char *buf, size_t len)
11462306a36Sopenharmony_ci{
11562306a36Sopenharmony_ci	struct max5821_data *data = iio_priv(indio_dev);
11662306a36Sopenharmony_ci	bool powerdown;
11762306a36Sopenharmony_ci	int ret;
11862306a36Sopenharmony_ci
11962306a36Sopenharmony_ci	ret = kstrtobool(buf, &powerdown);
12062306a36Sopenharmony_ci	if (ret)
12162306a36Sopenharmony_ci		return ret;
12262306a36Sopenharmony_ci
12362306a36Sopenharmony_ci	data->powerdown[chan->channel] = powerdown;
12462306a36Sopenharmony_ci
12562306a36Sopenharmony_ci	ret = max5821_sync_powerdown_mode(data, chan);
12662306a36Sopenharmony_ci	if (ret < 0)
12762306a36Sopenharmony_ci		return ret;
12862306a36Sopenharmony_ci
12962306a36Sopenharmony_ci	return len;
13062306a36Sopenharmony_ci}
13162306a36Sopenharmony_ci
13262306a36Sopenharmony_cistatic const struct iio_chan_spec_ext_info max5821_ext_info[] = {
13362306a36Sopenharmony_ci	{
13462306a36Sopenharmony_ci		.name = "powerdown",
13562306a36Sopenharmony_ci		.read = max5821_read_dac_powerdown,
13662306a36Sopenharmony_ci		.write = max5821_write_dac_powerdown,
13762306a36Sopenharmony_ci		.shared = IIO_SEPARATE,
13862306a36Sopenharmony_ci	},
13962306a36Sopenharmony_ci	IIO_ENUM("powerdown_mode", IIO_SEPARATE, &max5821_powerdown_mode_enum),
14062306a36Sopenharmony_ci	IIO_ENUM_AVAILABLE("powerdown_mode", IIO_SHARED_BY_TYPE, &max5821_powerdown_mode_enum),
14162306a36Sopenharmony_ci	{ },
14262306a36Sopenharmony_ci};
14362306a36Sopenharmony_ci
14462306a36Sopenharmony_ci#define MAX5821_CHANNEL(chan) {					\
14562306a36Sopenharmony_ci	.type = IIO_VOLTAGE,					\
14662306a36Sopenharmony_ci	.indexed = 1,						\
14762306a36Sopenharmony_ci	.output = 1,						\
14862306a36Sopenharmony_ci	.channel = (chan),					\
14962306a36Sopenharmony_ci	.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),		\
15062306a36Sopenharmony_ci	.info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SCALE),	\
15162306a36Sopenharmony_ci	.ext_info = max5821_ext_info,				\
15262306a36Sopenharmony_ci}
15362306a36Sopenharmony_ci
15462306a36Sopenharmony_cistatic const struct iio_chan_spec max5821_channels[] = {
15562306a36Sopenharmony_ci	MAX5821_CHANNEL(0),
15662306a36Sopenharmony_ci	MAX5821_CHANNEL(1)
15762306a36Sopenharmony_ci};
15862306a36Sopenharmony_ci
15962306a36Sopenharmony_cistatic const u8 max5821_read_dac_command[] = {
16062306a36Sopenharmony_ci	MAX5821_READ_DAC_A_COMMAND,
16162306a36Sopenharmony_ci	MAX5821_READ_DAC_B_COMMAND
16262306a36Sopenharmony_ci};
16362306a36Sopenharmony_ci
16462306a36Sopenharmony_cistatic const u8 max5821_load_dac_command[] = {
16562306a36Sopenharmony_ci	MAX5821_LOAD_DAC_A_IN_REG_B,
16662306a36Sopenharmony_ci	MAX5821_LOAD_DAC_B_IN_REG_A
16762306a36Sopenharmony_ci};
16862306a36Sopenharmony_ci
16962306a36Sopenharmony_cistatic int max5821_get_value(struct iio_dev *indio_dev,
17062306a36Sopenharmony_ci			     int *val, int channel)
17162306a36Sopenharmony_ci{
17262306a36Sopenharmony_ci	struct max5821_data *data = iio_priv(indio_dev);
17362306a36Sopenharmony_ci	struct i2c_client *client = data->client;
17462306a36Sopenharmony_ci	u8 outbuf[1];
17562306a36Sopenharmony_ci	u8 inbuf[2];
17662306a36Sopenharmony_ci	int ret;
17762306a36Sopenharmony_ci
17862306a36Sopenharmony_ci	if ((channel != 0) && (channel != 1))
17962306a36Sopenharmony_ci		return -EINVAL;
18062306a36Sopenharmony_ci
18162306a36Sopenharmony_ci	outbuf[0] = max5821_read_dac_command[channel];
18262306a36Sopenharmony_ci
18362306a36Sopenharmony_ci	mutex_lock(&data->lock);
18462306a36Sopenharmony_ci
18562306a36Sopenharmony_ci	ret = i2c_master_send(client, outbuf, 1);
18662306a36Sopenharmony_ci	if (ret < 0) {
18762306a36Sopenharmony_ci		mutex_unlock(&data->lock);
18862306a36Sopenharmony_ci		return ret;
18962306a36Sopenharmony_ci	} else if (ret != 1) {
19062306a36Sopenharmony_ci		mutex_unlock(&data->lock);
19162306a36Sopenharmony_ci		return -EIO;
19262306a36Sopenharmony_ci	}
19362306a36Sopenharmony_ci
19462306a36Sopenharmony_ci	ret = i2c_master_recv(client, inbuf, 2);
19562306a36Sopenharmony_ci	if (ret < 0) {
19662306a36Sopenharmony_ci		mutex_unlock(&data->lock);
19762306a36Sopenharmony_ci		return ret;
19862306a36Sopenharmony_ci	} else if (ret != 2) {
19962306a36Sopenharmony_ci		mutex_unlock(&data->lock);
20062306a36Sopenharmony_ci		return -EIO;
20162306a36Sopenharmony_ci	}
20262306a36Sopenharmony_ci
20362306a36Sopenharmony_ci	mutex_unlock(&data->lock);
20462306a36Sopenharmony_ci
20562306a36Sopenharmony_ci	*val = ((inbuf[0] & 0x0f) << 6) | (inbuf[1] >> 2);
20662306a36Sopenharmony_ci
20762306a36Sopenharmony_ci	return IIO_VAL_INT;
20862306a36Sopenharmony_ci}
20962306a36Sopenharmony_ci
21062306a36Sopenharmony_cistatic int max5821_set_value(struct iio_dev *indio_dev,
21162306a36Sopenharmony_ci			     int val, int channel)
21262306a36Sopenharmony_ci{
21362306a36Sopenharmony_ci	struct max5821_data *data = iio_priv(indio_dev);
21462306a36Sopenharmony_ci	struct i2c_client *client = data->client;
21562306a36Sopenharmony_ci	u8 outbuf[2];
21662306a36Sopenharmony_ci	int ret;
21762306a36Sopenharmony_ci
21862306a36Sopenharmony_ci	if ((val < 0) || (val > 1023))
21962306a36Sopenharmony_ci		return -EINVAL;
22062306a36Sopenharmony_ci
22162306a36Sopenharmony_ci	if ((channel != 0) && (channel != 1))
22262306a36Sopenharmony_ci		return -EINVAL;
22362306a36Sopenharmony_ci
22462306a36Sopenharmony_ci	outbuf[0] = max5821_load_dac_command[channel];
22562306a36Sopenharmony_ci	outbuf[0] |= val >> 6;
22662306a36Sopenharmony_ci	outbuf[1] = (val & 0x3f) << 2;
22762306a36Sopenharmony_ci
22862306a36Sopenharmony_ci	ret = i2c_master_send(client, outbuf, 2);
22962306a36Sopenharmony_ci	if (ret < 0)
23062306a36Sopenharmony_ci		return ret;
23162306a36Sopenharmony_ci	else if (ret != 2)
23262306a36Sopenharmony_ci		return -EIO;
23362306a36Sopenharmony_ci	else
23462306a36Sopenharmony_ci		return 0;
23562306a36Sopenharmony_ci}
23662306a36Sopenharmony_ci
23762306a36Sopenharmony_cistatic int max5821_read_raw(struct iio_dev *indio_dev,
23862306a36Sopenharmony_ci			   struct iio_chan_spec const *chan,
23962306a36Sopenharmony_ci			   int *val, int *val2, long mask)
24062306a36Sopenharmony_ci{
24162306a36Sopenharmony_ci	struct max5821_data *data = iio_priv(indio_dev);
24262306a36Sopenharmony_ci
24362306a36Sopenharmony_ci	switch (mask) {
24462306a36Sopenharmony_ci	case IIO_CHAN_INFO_RAW:
24562306a36Sopenharmony_ci		return max5821_get_value(indio_dev, val, chan->channel);
24662306a36Sopenharmony_ci	case IIO_CHAN_INFO_SCALE:
24762306a36Sopenharmony_ci		*val = data->vref_mv;
24862306a36Sopenharmony_ci		*val2 = 10;
24962306a36Sopenharmony_ci		return IIO_VAL_FRACTIONAL_LOG2;
25062306a36Sopenharmony_ci	default:
25162306a36Sopenharmony_ci		return -EINVAL;
25262306a36Sopenharmony_ci	}
25362306a36Sopenharmony_ci}
25462306a36Sopenharmony_ci
25562306a36Sopenharmony_cistatic int max5821_write_raw(struct iio_dev *indio_dev,
25662306a36Sopenharmony_ci			     struct iio_chan_spec const *chan,
25762306a36Sopenharmony_ci			     int val, int val2, long mask)
25862306a36Sopenharmony_ci{
25962306a36Sopenharmony_ci	if (val2 != 0)
26062306a36Sopenharmony_ci		return -EINVAL;
26162306a36Sopenharmony_ci
26262306a36Sopenharmony_ci	switch (mask) {
26362306a36Sopenharmony_ci	case IIO_CHAN_INFO_RAW:
26462306a36Sopenharmony_ci		return max5821_set_value(indio_dev, val, chan->channel);
26562306a36Sopenharmony_ci	default:
26662306a36Sopenharmony_ci		return -EINVAL;
26762306a36Sopenharmony_ci	}
26862306a36Sopenharmony_ci}
26962306a36Sopenharmony_ci
27062306a36Sopenharmony_cistatic int max5821_suspend(struct device *dev)
27162306a36Sopenharmony_ci{
27262306a36Sopenharmony_ci	u8 outbuf[2] = { MAX5821_EXTENDED_COMMAND_MODE,
27362306a36Sopenharmony_ci			 MAX5821_EXTENDED_DAC_A |
27462306a36Sopenharmony_ci			 MAX5821_EXTENDED_DAC_B |
27562306a36Sopenharmony_ci			 MAX5821_EXTENDED_POWER_DOWN_MODE2 };
27662306a36Sopenharmony_ci
27762306a36Sopenharmony_ci	return i2c_master_send(to_i2c_client(dev), outbuf, 2);
27862306a36Sopenharmony_ci}
27962306a36Sopenharmony_ci
28062306a36Sopenharmony_cistatic int max5821_resume(struct device *dev)
28162306a36Sopenharmony_ci{
28262306a36Sopenharmony_ci	u8 outbuf[2] = { MAX5821_EXTENDED_COMMAND_MODE,
28362306a36Sopenharmony_ci			 MAX5821_EXTENDED_DAC_A |
28462306a36Sopenharmony_ci			 MAX5821_EXTENDED_DAC_B |
28562306a36Sopenharmony_ci			 MAX5821_EXTENDED_POWER_UP };
28662306a36Sopenharmony_ci
28762306a36Sopenharmony_ci	return i2c_master_send(to_i2c_client(dev), outbuf, 2);
28862306a36Sopenharmony_ci}
28962306a36Sopenharmony_ci
29062306a36Sopenharmony_cistatic DEFINE_SIMPLE_DEV_PM_OPS(max5821_pm_ops, max5821_suspend,
29162306a36Sopenharmony_ci				max5821_resume);
29262306a36Sopenharmony_ci
29362306a36Sopenharmony_cistatic const struct iio_info max5821_info = {
29462306a36Sopenharmony_ci	.read_raw = max5821_read_raw,
29562306a36Sopenharmony_ci	.write_raw = max5821_write_raw,
29662306a36Sopenharmony_ci};
29762306a36Sopenharmony_ci
29862306a36Sopenharmony_cistatic void max5821_regulator_disable(void *reg)
29962306a36Sopenharmony_ci{
30062306a36Sopenharmony_ci	regulator_disable(reg);
30162306a36Sopenharmony_ci}
30262306a36Sopenharmony_ci
30362306a36Sopenharmony_cistatic int max5821_probe(struct i2c_client *client)
30462306a36Sopenharmony_ci{
30562306a36Sopenharmony_ci	const struct i2c_device_id *id = i2c_client_get_device_id(client);
30662306a36Sopenharmony_ci	struct max5821_data *data;
30762306a36Sopenharmony_ci	struct iio_dev *indio_dev;
30862306a36Sopenharmony_ci	u32 tmp;
30962306a36Sopenharmony_ci	int ret;
31062306a36Sopenharmony_ci
31162306a36Sopenharmony_ci	indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data));
31262306a36Sopenharmony_ci	if (!indio_dev)
31362306a36Sopenharmony_ci		return -ENOMEM;
31462306a36Sopenharmony_ci	data = iio_priv(indio_dev);
31562306a36Sopenharmony_ci	data->client = client;
31662306a36Sopenharmony_ci	mutex_init(&data->lock);
31762306a36Sopenharmony_ci
31862306a36Sopenharmony_ci	/* max5821 start in powerdown mode 100Kohm to ground */
31962306a36Sopenharmony_ci	for (tmp = 0; tmp < MAX5821_MAX_DAC_CHANNELS; tmp++) {
32062306a36Sopenharmony_ci		data->powerdown[tmp] = true;
32162306a36Sopenharmony_ci		data->powerdown_mode[tmp] = MAX5821_100KOHM_TO_GND;
32262306a36Sopenharmony_ci	}
32362306a36Sopenharmony_ci
32462306a36Sopenharmony_ci	data->vref_reg = devm_regulator_get(&client->dev, "vref");
32562306a36Sopenharmony_ci	if (IS_ERR(data->vref_reg))
32662306a36Sopenharmony_ci		return dev_err_probe(&client->dev, PTR_ERR(data->vref_reg),
32762306a36Sopenharmony_ci				     "Failed to get vref regulator\n");
32862306a36Sopenharmony_ci
32962306a36Sopenharmony_ci	ret = regulator_enable(data->vref_reg);
33062306a36Sopenharmony_ci	if (ret) {
33162306a36Sopenharmony_ci		dev_err(&client->dev,
33262306a36Sopenharmony_ci			"Failed to enable vref regulator: %d\n", ret);
33362306a36Sopenharmony_ci		return ret;
33462306a36Sopenharmony_ci	}
33562306a36Sopenharmony_ci
33662306a36Sopenharmony_ci	ret = devm_add_action_or_reset(&client->dev, max5821_regulator_disable,
33762306a36Sopenharmony_ci				       data->vref_reg);
33862306a36Sopenharmony_ci	if (ret) {
33962306a36Sopenharmony_ci		dev_err(&client->dev,
34062306a36Sopenharmony_ci			"Failed to add action to managed regulator: %d\n", ret);
34162306a36Sopenharmony_ci		return ret;
34262306a36Sopenharmony_ci	}
34362306a36Sopenharmony_ci
34462306a36Sopenharmony_ci	ret = regulator_get_voltage(data->vref_reg);
34562306a36Sopenharmony_ci	if (ret < 0) {
34662306a36Sopenharmony_ci		dev_err(&client->dev,
34762306a36Sopenharmony_ci			"Failed to get voltage on regulator: %d\n", ret);
34862306a36Sopenharmony_ci		return ret;
34962306a36Sopenharmony_ci	}
35062306a36Sopenharmony_ci
35162306a36Sopenharmony_ci	data->vref_mv = ret / 1000;
35262306a36Sopenharmony_ci
35362306a36Sopenharmony_ci	indio_dev->name = id->name;
35462306a36Sopenharmony_ci	indio_dev->num_channels = ARRAY_SIZE(max5821_channels);
35562306a36Sopenharmony_ci	indio_dev->channels = max5821_channels;
35662306a36Sopenharmony_ci	indio_dev->modes = INDIO_DIRECT_MODE;
35762306a36Sopenharmony_ci	indio_dev->info = &max5821_info;
35862306a36Sopenharmony_ci
35962306a36Sopenharmony_ci	return devm_iio_device_register(&client->dev, indio_dev);
36062306a36Sopenharmony_ci}
36162306a36Sopenharmony_ci
36262306a36Sopenharmony_cistatic const struct i2c_device_id max5821_id[] = {
36362306a36Sopenharmony_ci	{ "max5821", ID_MAX5821 },
36462306a36Sopenharmony_ci	{ }
36562306a36Sopenharmony_ci};
36662306a36Sopenharmony_ciMODULE_DEVICE_TABLE(i2c, max5821_id);
36762306a36Sopenharmony_ci
36862306a36Sopenharmony_cistatic const struct of_device_id max5821_of_match[] = {
36962306a36Sopenharmony_ci	{ .compatible = "maxim,max5821" },
37062306a36Sopenharmony_ci	{ }
37162306a36Sopenharmony_ci};
37262306a36Sopenharmony_ciMODULE_DEVICE_TABLE(of, max5821_of_match);
37362306a36Sopenharmony_ci
37462306a36Sopenharmony_cistatic struct i2c_driver max5821_driver = {
37562306a36Sopenharmony_ci	.driver = {
37662306a36Sopenharmony_ci		.name	= "max5821",
37762306a36Sopenharmony_ci		.of_match_table = max5821_of_match,
37862306a36Sopenharmony_ci		.pm     = pm_sleep_ptr(&max5821_pm_ops),
37962306a36Sopenharmony_ci	},
38062306a36Sopenharmony_ci	.probe		= max5821_probe,
38162306a36Sopenharmony_ci	.id_table	= max5821_id,
38262306a36Sopenharmony_ci};
38362306a36Sopenharmony_cimodule_i2c_driver(max5821_driver);
38462306a36Sopenharmony_ci
38562306a36Sopenharmony_ciMODULE_AUTHOR("Philippe Reynes <tremyfr@yahoo.fr>");
38662306a36Sopenharmony_ciMODULE_DESCRIPTION("MAX5821 DAC");
38762306a36Sopenharmony_ciMODULE_LICENSE("GPL v2");
388