18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Driver for the Analog Devices digital potentiometers (I2C bus) 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Copyright (C) 2010-2011 Michael Hennerich, Analog Devices Inc. 68c2ecf20Sopenharmony_ci */ 78c2ecf20Sopenharmony_ci 88c2ecf20Sopenharmony_ci#include <linux/i2c.h> 98c2ecf20Sopenharmony_ci#include <linux/module.h> 108c2ecf20Sopenharmony_ci 118c2ecf20Sopenharmony_ci#include "ad525x_dpot.h" 128c2ecf20Sopenharmony_ci 138c2ecf20Sopenharmony_ci/* I2C bus functions */ 148c2ecf20Sopenharmony_cistatic int write_d8(void *client, u8 val) 158c2ecf20Sopenharmony_ci{ 168c2ecf20Sopenharmony_ci return i2c_smbus_write_byte(client, val); 178c2ecf20Sopenharmony_ci} 188c2ecf20Sopenharmony_ci 198c2ecf20Sopenharmony_cistatic int write_r8d8(void *client, u8 reg, u8 val) 208c2ecf20Sopenharmony_ci{ 218c2ecf20Sopenharmony_ci return i2c_smbus_write_byte_data(client, reg, val); 228c2ecf20Sopenharmony_ci} 238c2ecf20Sopenharmony_ci 248c2ecf20Sopenharmony_cistatic int write_r8d16(void *client, u8 reg, u16 val) 258c2ecf20Sopenharmony_ci{ 268c2ecf20Sopenharmony_ci return i2c_smbus_write_word_data(client, reg, val); 278c2ecf20Sopenharmony_ci} 288c2ecf20Sopenharmony_ci 298c2ecf20Sopenharmony_cistatic int read_d8(void *client) 308c2ecf20Sopenharmony_ci{ 318c2ecf20Sopenharmony_ci return i2c_smbus_read_byte(client); 328c2ecf20Sopenharmony_ci} 338c2ecf20Sopenharmony_ci 348c2ecf20Sopenharmony_cistatic int read_r8d8(void *client, u8 reg) 358c2ecf20Sopenharmony_ci{ 368c2ecf20Sopenharmony_ci return i2c_smbus_read_byte_data(client, reg); 378c2ecf20Sopenharmony_ci} 388c2ecf20Sopenharmony_ci 398c2ecf20Sopenharmony_cistatic int read_r8d16(void *client, u8 reg) 408c2ecf20Sopenharmony_ci{ 418c2ecf20Sopenharmony_ci return i2c_smbus_read_word_data(client, reg); 428c2ecf20Sopenharmony_ci} 438c2ecf20Sopenharmony_ci 448c2ecf20Sopenharmony_cistatic const struct ad_dpot_bus_ops bops = { 458c2ecf20Sopenharmony_ci .read_d8 = read_d8, 468c2ecf20Sopenharmony_ci .read_r8d8 = read_r8d8, 478c2ecf20Sopenharmony_ci .read_r8d16 = read_r8d16, 488c2ecf20Sopenharmony_ci .write_d8 = write_d8, 498c2ecf20Sopenharmony_ci .write_r8d8 = write_r8d8, 508c2ecf20Sopenharmony_ci .write_r8d16 = write_r8d16, 518c2ecf20Sopenharmony_ci}; 528c2ecf20Sopenharmony_ci 538c2ecf20Sopenharmony_cistatic int ad_dpot_i2c_probe(struct i2c_client *client, 548c2ecf20Sopenharmony_ci const struct i2c_device_id *id) 558c2ecf20Sopenharmony_ci{ 568c2ecf20Sopenharmony_ci struct ad_dpot_bus_data bdata = { 578c2ecf20Sopenharmony_ci .client = client, 588c2ecf20Sopenharmony_ci .bops = &bops, 598c2ecf20Sopenharmony_ci }; 608c2ecf20Sopenharmony_ci 618c2ecf20Sopenharmony_ci if (!i2c_check_functionality(client->adapter, 628c2ecf20Sopenharmony_ci I2C_FUNC_SMBUS_WORD_DATA)) { 638c2ecf20Sopenharmony_ci dev_err(&client->dev, "SMBUS Word Data not Supported\n"); 648c2ecf20Sopenharmony_ci return -EIO; 658c2ecf20Sopenharmony_ci } 668c2ecf20Sopenharmony_ci 678c2ecf20Sopenharmony_ci return ad_dpot_probe(&client->dev, &bdata, id->driver_data, id->name); 688c2ecf20Sopenharmony_ci} 698c2ecf20Sopenharmony_ci 708c2ecf20Sopenharmony_cistatic int ad_dpot_i2c_remove(struct i2c_client *client) 718c2ecf20Sopenharmony_ci{ 728c2ecf20Sopenharmony_ci return ad_dpot_remove(&client->dev); 738c2ecf20Sopenharmony_ci} 748c2ecf20Sopenharmony_ci 758c2ecf20Sopenharmony_cistatic const struct i2c_device_id ad_dpot_id[] = { 768c2ecf20Sopenharmony_ci {"ad5258", AD5258_ID}, 778c2ecf20Sopenharmony_ci {"ad5259", AD5259_ID}, 788c2ecf20Sopenharmony_ci {"ad5251", AD5251_ID}, 798c2ecf20Sopenharmony_ci {"ad5252", AD5252_ID}, 808c2ecf20Sopenharmony_ci {"ad5253", AD5253_ID}, 818c2ecf20Sopenharmony_ci {"ad5254", AD5254_ID}, 828c2ecf20Sopenharmony_ci {"ad5255", AD5255_ID}, 838c2ecf20Sopenharmony_ci {"ad5241", AD5241_ID}, 848c2ecf20Sopenharmony_ci {"ad5242", AD5242_ID}, 858c2ecf20Sopenharmony_ci {"ad5243", AD5243_ID}, 868c2ecf20Sopenharmony_ci {"ad5245", AD5245_ID}, 878c2ecf20Sopenharmony_ci {"ad5246", AD5246_ID}, 888c2ecf20Sopenharmony_ci {"ad5247", AD5247_ID}, 898c2ecf20Sopenharmony_ci {"ad5248", AD5248_ID}, 908c2ecf20Sopenharmony_ci {"ad5280", AD5280_ID}, 918c2ecf20Sopenharmony_ci {"ad5282", AD5282_ID}, 928c2ecf20Sopenharmony_ci {"adn2860", ADN2860_ID}, 938c2ecf20Sopenharmony_ci {"ad5273", AD5273_ID}, 948c2ecf20Sopenharmony_ci {"ad5161", AD5161_ID}, 958c2ecf20Sopenharmony_ci {"ad5171", AD5171_ID}, 968c2ecf20Sopenharmony_ci {"ad5170", AD5170_ID}, 978c2ecf20Sopenharmony_ci {"ad5172", AD5172_ID}, 988c2ecf20Sopenharmony_ci {"ad5173", AD5173_ID}, 998c2ecf20Sopenharmony_ci {"ad5272", AD5272_ID}, 1008c2ecf20Sopenharmony_ci {"ad5274", AD5274_ID}, 1018c2ecf20Sopenharmony_ci {} 1028c2ecf20Sopenharmony_ci}; 1038c2ecf20Sopenharmony_ciMODULE_DEVICE_TABLE(i2c, ad_dpot_id); 1048c2ecf20Sopenharmony_ci 1058c2ecf20Sopenharmony_cistatic struct i2c_driver ad_dpot_i2c_driver = { 1068c2ecf20Sopenharmony_ci .driver = { 1078c2ecf20Sopenharmony_ci .name = "ad_dpot", 1088c2ecf20Sopenharmony_ci }, 1098c2ecf20Sopenharmony_ci .probe = ad_dpot_i2c_probe, 1108c2ecf20Sopenharmony_ci .remove = ad_dpot_i2c_remove, 1118c2ecf20Sopenharmony_ci .id_table = ad_dpot_id, 1128c2ecf20Sopenharmony_ci}; 1138c2ecf20Sopenharmony_ci 1148c2ecf20Sopenharmony_cimodule_i2c_driver(ad_dpot_i2c_driver); 1158c2ecf20Sopenharmony_ci 1168c2ecf20Sopenharmony_ciMODULE_AUTHOR("Michael Hennerich <michael.hennerich@analog.com>"); 1178c2ecf20Sopenharmony_ciMODULE_DESCRIPTION("digital potentiometer I2C bus driver"); 1188c2ecf20Sopenharmony_ciMODULE_LICENSE("GPL"); 119