Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-only
0002 /*
0003  * AD5593R Digital <-> Analog converters driver
0004  *
0005  * Copyright 2015-2016 Analog Devices Inc.
0006  * Author: Paul Cercueil <paul.cercueil@analog.com>
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);