0001
0002
0003
0004
0005
0006
0007
0008
0009 #include "ad5592r-base.h"
0010
0011 #include <linux/bitops.h>
0012 #include <linux/i2c.h>
0013 #include <linux/module.h>
0014 #include <linux/mod_devicetable.h>
0015
0016 #define AD5593R_MODE_CONF (0 << 4)
0017 #define AD5593R_MODE_DAC_WRITE (1 << 4)
0018 #define AD5593R_MODE_ADC_READBACK (4 << 4)
0019 #define AD5593R_MODE_DAC_READBACK (5 << 4)
0020 #define AD5593R_MODE_GPIO_READBACK (6 << 4)
0021 #define AD5593R_MODE_REG_READBACK (7 << 4)
0022
0023 static int ad5593r_write_dac(struct ad5592r_state *st, unsigned chan, u16 value)
0024 {
0025 struct i2c_client *i2c = to_i2c_client(st->dev);
0026
0027 return i2c_smbus_write_word_swapped(i2c,
0028 AD5593R_MODE_DAC_WRITE | chan, value);
0029 }
0030
0031 static int ad5593r_read_adc(struct ad5592r_state *st, unsigned chan, u16 *value)
0032 {
0033 struct i2c_client *i2c = to_i2c_client(st->dev);
0034 s32 val;
0035
0036 val = i2c_smbus_write_word_swapped(i2c,
0037 AD5593R_MODE_CONF | AD5592R_REG_ADC_SEQ, BIT(chan));
0038 if (val < 0)
0039 return (int) val;
0040
0041 val = i2c_smbus_read_word_swapped(i2c, AD5593R_MODE_ADC_READBACK);
0042 if (val < 0)
0043 return (int) val;
0044
0045 *value = (u16) val;
0046
0047 return 0;
0048 }
0049
0050 static int ad5593r_reg_write(struct ad5592r_state *st, u8 reg, u16 value)
0051 {
0052 struct i2c_client *i2c = to_i2c_client(st->dev);
0053
0054 return i2c_smbus_write_word_swapped(i2c,
0055 AD5593R_MODE_CONF | reg, value);
0056 }
0057
0058 static int ad5593r_reg_read(struct ad5592r_state *st, u8 reg, u16 *value)
0059 {
0060 struct i2c_client *i2c = to_i2c_client(st->dev);
0061 s32 val;
0062
0063 val = i2c_smbus_read_word_swapped(i2c, AD5593R_MODE_REG_READBACK | reg);
0064 if (val < 0)
0065 return (int) val;
0066
0067 *value = (u16) val;
0068
0069 return 0;
0070 }
0071
0072 static int ad5593r_gpio_read(struct ad5592r_state *st, u8 *value)
0073 {
0074 struct i2c_client *i2c = to_i2c_client(st->dev);
0075 s32 val;
0076
0077 val = i2c_smbus_read_word_swapped(i2c, AD5593R_MODE_GPIO_READBACK);
0078 if (val < 0)
0079 return (int) val;
0080
0081 *value = (u8) val;
0082
0083 return 0;
0084 }
0085
0086 static const struct ad5592r_rw_ops ad5593r_rw_ops = {
0087 .write_dac = ad5593r_write_dac,
0088 .read_adc = ad5593r_read_adc,
0089 .reg_write = ad5593r_reg_write,
0090 .reg_read = ad5593r_reg_read,
0091 .gpio_read = ad5593r_gpio_read,
0092 };
0093
0094 static int ad5593r_i2c_probe(struct i2c_client *i2c,
0095 const struct i2c_device_id *id)
0096 {
0097 return ad5592r_probe(&i2c->dev, id->name, &ad5593r_rw_ops);
0098 }
0099
0100 static int ad5593r_i2c_remove(struct i2c_client *i2c)
0101 {
0102 ad5592r_remove(&i2c->dev);
0103
0104 return 0;
0105 }
0106
0107 static const struct i2c_device_id ad5593r_i2c_ids[] = {
0108 { .name = "ad5593r", },
0109 {},
0110 };
0111 MODULE_DEVICE_TABLE(i2c, ad5593r_i2c_ids);
0112
0113 static const struct of_device_id ad5593r_of_match[] = {
0114 { .compatible = "adi,ad5593r", },
0115 {},
0116 };
0117 MODULE_DEVICE_TABLE(of, ad5593r_of_match);
0118
0119 static const struct acpi_device_id ad5593r_acpi_match[] = {
0120 {"ADS5593", },
0121 { },
0122 };
0123 MODULE_DEVICE_TABLE(acpi, ad5593r_acpi_match);
0124
0125 static struct i2c_driver ad5593r_driver = {
0126 .driver = {
0127 .name = "ad5593r",
0128 .of_match_table = ad5593r_of_match,
0129 .acpi_match_table = ad5593r_acpi_match,
0130 },
0131 .probe = ad5593r_i2c_probe,
0132 .remove = ad5593r_i2c_remove,
0133 .id_table = ad5593r_i2c_ids,
0134 };
0135 module_i2c_driver(ad5593r_driver);
0136
0137 MODULE_AUTHOR("Paul Cercueil <paul.cercueil@analog.com>");
0138 MODULE_DESCRIPTION("Analog Devices AD5593R multi-channel converters");
0139 MODULE_LICENSE("GPL v2");
0140 MODULE_IMPORT_NS(IIO_AD5592R);