1 // SPDX-License-Identifier: GPL-2.0-or-later 2 /* 3 * Driver for the Analog Devices digital potentiometers (I2C bus) 4 * 5 * Copyright (C) 2010-2011 Michael Hennerich, Analog Devices Inc. 6 */ 7 8 #include <linux/i2c.h> 9 #include <linux/module.h> 10 11 #include "ad525x_dpot.h" 12 13 /* I2C bus functions */ 14 static int write_d8(void *client, u8 val) 15 { 16 return i2c_smbus_write_byte(client, val); 17 } 18 19 static int write_r8d8(void *client, u8 reg, u8 val) 20 { 21 return i2c_smbus_write_byte_data(client, reg, val); 22 } 23 24 static int write_r8d16(void *client, u8 reg, u16 val) 25 { 26 return i2c_smbus_write_word_data(client, reg, val); 27 } 28 29 static int read_d8(void *client) 30 { 31 return i2c_smbus_read_byte(client); 32 } 33 34 static int read_r8d8(void *client, u8 reg) 35 { 36 return i2c_smbus_read_byte_data(client, reg); 37 } 38 39 static int read_r8d16(void *client, u8 reg) 40 { 41 return i2c_smbus_read_word_data(client, reg); 42 } 43 44 static const struct ad_dpot_bus_ops bops = { 45 .read_d8 = read_d8, 46 .read_r8d8 = read_r8d8, 47 .read_r8d16 = read_r8d16, 48 .write_d8 = write_d8, 49 .write_r8d8 = write_r8d8, 50 .write_r8d16 = write_r8d16, 51 }; 52 53 static int ad_dpot_i2c_probe(struct i2c_client *client) 54 { 55 const struct i2c_device_id *id = i2c_client_get_device_id(client); 56 struct ad_dpot_bus_data bdata = { 57 .client = client, 58 .bops = &bops, 59 }; 60 61 if (!i2c_check_functionality(client->adapter, 62 I2C_FUNC_SMBUS_WORD_DATA)) { 63 dev_err(&client->dev, "SMBUS Word Data not Supported\n"); 64 return -EIO; 65 } 66 67 return ad_dpot_probe(&client->dev, &bdata, id->driver_data, id->name); 68 } 69 70 static void ad_dpot_i2c_remove(struct i2c_client *client) 71 { 72 ad_dpot_remove(&client->dev); 73 } 74 75 static const struct i2c_device_id ad_dpot_id[] = { 76 { .name = "ad5258", .driver_data = AD5258_ID }, 77 { .name = "ad5259", .driver_data = AD5259_ID }, 78 { .name = "ad5251", .driver_data = AD5251_ID }, 79 { .name = "ad5252", .driver_data = AD5252_ID }, 80 { .name = "ad5253", .driver_data = AD5253_ID }, 81 { .name = "ad5254", .driver_data = AD5254_ID }, 82 { .name = "ad5255", .driver_data = AD5255_ID }, 83 { .name = "ad5241", .driver_data = AD5241_ID }, 84 { .name = "ad5242", .driver_data = AD5242_ID }, 85 { .name = "ad5243", .driver_data = AD5243_ID }, 86 { .name = "ad5245", .driver_data = AD5245_ID }, 87 { .name = "ad5246", .driver_data = AD5246_ID }, 88 { .name = "ad5247", .driver_data = AD5247_ID }, 89 { .name = "ad5248", .driver_data = AD5248_ID }, 90 { .name = "ad5280", .driver_data = AD5280_ID }, 91 { .name = "ad5282", .driver_data = AD5282_ID }, 92 { .name = "adn2860", .driver_data = ADN2860_ID }, 93 { .name = "ad5273", .driver_data = AD5273_ID }, 94 { .name = "ad5161", .driver_data = AD5161_ID }, 95 { .name = "ad5171", .driver_data = AD5171_ID }, 96 { .name = "ad5170", .driver_data = AD5170_ID }, 97 { .name = "ad5172", .driver_data = AD5172_ID }, 98 { .name = "ad5173", .driver_data = AD5173_ID }, 99 { .name = "ad5272", .driver_data = AD5272_ID }, 100 { .name = "ad5274", .driver_data = AD5274_ID }, 101 { } 102 }; 103 MODULE_DEVICE_TABLE(i2c, ad_dpot_id); 104 105 static struct i2c_driver ad_dpot_i2c_driver = { 106 .driver = { 107 .name = "ad_dpot", 108 .dev_groups = ad_dpot_groups, 109 }, 110 .probe = ad_dpot_i2c_probe, 111 .remove = ad_dpot_i2c_remove, 112 .id_table = ad_dpot_id, 113 }; 114 115 module_i2c_driver(ad_dpot_i2c_driver); 116 117 MODULE_AUTHOR("Michael Hennerich <michael.hennerich@analog.com>"); 118 MODULE_DESCRIPTION("digital potentiometer I2C bus driver"); 119 MODULE_LICENSE("GPL"); 120