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