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, value: val); |
17 | } |
18 | |
19 | static int write_r8d8(void *client, u8 reg, u8 val) |
20 | { |
21 | return i2c_smbus_write_byte_data(client, command: reg, value: val); |
22 | } |
23 | |
24 | static int write_r8d16(void *client, u8 reg, u16 val) |
25 | { |
26 | return i2c_smbus_write_word_data(client, command: reg, value: 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, command: reg); |
37 | } |
38 | |
39 | static int read_r8d16(void *client, u8 reg) |
40 | { |
41 | return i2c_smbus_read_word_data(client, command: 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(adap: 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(dev: &client->dev, bdata: &bdata, devid: id->driver_data, name: id->name); |
68 | } |
69 | |
70 | static void ad_dpot_i2c_remove(struct i2c_client *client) |
71 | { |
72 | ad_dpot_remove(dev: &client->dev); |
73 | } |
74 | |
75 | static const struct i2c_device_id ad_dpot_id[] = { |
76 | {"ad5258" , AD5258_ID}, |
77 | {"ad5259" , AD5259_ID}, |
78 | {"ad5251" , AD5251_ID}, |
79 | {"ad5252" , AD5252_ID}, |
80 | {"ad5253" , AD5253_ID}, |
81 | {"ad5254" , AD5254_ID}, |
82 | {"ad5255" , AD5255_ID}, |
83 | {"ad5241" , AD5241_ID}, |
84 | {"ad5242" , AD5242_ID}, |
85 | {"ad5243" , AD5243_ID}, |
86 | {"ad5245" , AD5245_ID}, |
87 | {"ad5246" , AD5246_ID}, |
88 | {"ad5247" , AD5247_ID}, |
89 | {"ad5248" , AD5248_ID}, |
90 | {"ad5280" , AD5280_ID}, |
91 | {"ad5282" , AD5282_ID}, |
92 | {"adn2860" , ADN2860_ID}, |
93 | {"ad5273" , AD5273_ID}, |
94 | {"ad5161" , AD5161_ID}, |
95 | {"ad5171" , AD5171_ID}, |
96 | {"ad5170" , AD5170_ID}, |
97 | {"ad5172" , AD5172_ID}, |
98 | {"ad5173" , AD5173_ID}, |
99 | {"ad5272" , AD5272_ID}, |
100 | {"ad5274" , 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 | }, |
109 | .probe = ad_dpot_i2c_probe, |
110 | .remove = ad_dpot_i2c_remove, |
111 | .id_table = ad_dpot_id, |
112 | }; |
113 | |
114 | module_i2c_driver(ad_dpot_i2c_driver); |
115 | |
116 | MODULE_AUTHOR("Michael Hennerich <michael.hennerich@analog.com>" ); |
117 | MODULE_DESCRIPTION("digital potentiometer I2C bus driver" ); |
118 | MODULE_LICENSE("GPL" ); |
119 | |