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