Commit | Line | Data |
---|---|---|
1a6e4b74 VK |
1 | /* |
2 | * ST Microelectronics MFD: stmpe's i2c client specific driver | |
3 | * | |
4 | * Copyright (C) ST-Ericsson SA 2010 | |
5 | * Copyright (C) ST Microelectronics SA 2011 | |
6 | * | |
7 | * License Terms: GNU General Public License, version 2 | |
8 | * Author: Rabin Vincent <rabin.vincent@stericsson.com> for ST-Ericsson | |
10d8935f | 9 | * Author: Viresh Kumar <viresh.linux@gmail.com> for ST Microelectronics |
1a6e4b74 VK |
10 | */ |
11 | ||
12 | #include <linux/i2c.h> | |
13 | #include <linux/interrupt.h> | |
14 | #include <linux/kernel.h> | |
15 | #include <linux/module.h> | |
16 | #include <linux/types.h> | |
17 | #include "stmpe.h" | |
18 | ||
19 | static int i2c_reg_read(struct stmpe *stmpe, u8 reg) | |
20 | { | |
21 | struct i2c_client *i2c = stmpe->client; | |
22 | ||
23 | return i2c_smbus_read_byte_data(i2c, reg); | |
24 | } | |
25 | ||
26 | static int i2c_reg_write(struct stmpe *stmpe, u8 reg, u8 val) | |
27 | { | |
28 | struct i2c_client *i2c = stmpe->client; | |
29 | ||
30 | return i2c_smbus_write_byte_data(i2c, reg, val); | |
31 | } | |
32 | ||
33 | static int i2c_block_read(struct stmpe *stmpe, u8 reg, u8 length, u8 *values) | |
34 | { | |
35 | struct i2c_client *i2c = stmpe->client; | |
36 | ||
37 | return i2c_smbus_read_i2c_block_data(i2c, reg, length, values); | |
38 | } | |
39 | ||
40 | static int i2c_block_write(struct stmpe *stmpe, u8 reg, u8 length, | |
41 | const u8 *values) | |
42 | { | |
43 | struct i2c_client *i2c = stmpe->client; | |
44 | ||
45 | return i2c_smbus_write_i2c_block_data(i2c, reg, length, values); | |
46 | } | |
47 | ||
48 | static struct stmpe_client_info i2c_ci = { | |
49 | .read_byte = i2c_reg_read, | |
50 | .write_byte = i2c_reg_write, | |
51 | .read_block = i2c_block_read, | |
52 | .write_block = i2c_block_write, | |
53 | }; | |
54 | ||
f791be49 | 55 | static int |
1a6e4b74 VK |
56 | stmpe_i2c_probe(struct i2c_client *i2c, const struct i2c_device_id *id) |
57 | { | |
58 | i2c_ci.data = (void *)id; | |
59 | i2c_ci.irq = i2c->irq; | |
60 | i2c_ci.client = i2c; | |
61 | i2c_ci.dev = &i2c->dev; | |
62 | ||
63 | return stmpe_probe(&i2c_ci, id->driver_data); | |
64 | } | |
65 | ||
4740f73f | 66 | static int stmpe_i2c_remove(struct i2c_client *i2c) |
1a6e4b74 VK |
67 | { |
68 | struct stmpe *stmpe = dev_get_drvdata(&i2c->dev); | |
69 | ||
70 | return stmpe_remove(stmpe); | |
71 | } | |
72 | ||
73 | static const struct i2c_device_id stmpe_i2c_id[] = { | |
1cda2394 | 74 | { "stmpe610", STMPE610 }, |
7f7f4ea1 | 75 | { "stmpe801", STMPE801 }, |
1a6e4b74 VK |
76 | { "stmpe811", STMPE811 }, |
77 | { "stmpe1601", STMPE1601 }, | |
78 | { "stmpe2401", STMPE2401 }, | |
79 | { "stmpe2403", STMPE2403 }, | |
80 | { } | |
81 | }; | |
82 | MODULE_DEVICE_TABLE(i2c, stmpe_id); | |
83 | ||
84 | static struct i2c_driver stmpe_i2c_driver = { | |
32533983 VK |
85 | .driver = { |
86 | .name = "stmpe-i2c", | |
87 | .owner = THIS_MODULE, | |
1a6e4b74 | 88 | #ifdef CONFIG_PM |
32533983 | 89 | .pm = &stmpe_dev_pm_ops, |
1a6e4b74 | 90 | #endif |
32533983 | 91 | }, |
1a6e4b74 | 92 | .probe = stmpe_i2c_probe, |
84449216 | 93 | .remove = stmpe_i2c_remove, |
1a6e4b74 VK |
94 | .id_table = stmpe_i2c_id, |
95 | }; | |
96 | ||
97 | static int __init stmpe_init(void) | |
98 | { | |
99 | return i2c_add_driver(&stmpe_i2c_driver); | |
100 | } | |
101 | subsys_initcall(stmpe_init); | |
102 | ||
103 | static void __exit stmpe_exit(void) | |
104 | { | |
105 | i2c_del_driver(&stmpe_i2c_driver); | |
106 | } | |
107 | module_exit(stmpe_exit); | |
108 | ||
109 | MODULE_LICENSE("GPL v2"); | |
110 | MODULE_DESCRIPTION("STMPE MFD I2C Interface Driver"); | |
111 | MODULE_AUTHOR("Rabin Vincent <rabin.vincent@stericsson.com>"); |