1 | // SPDX-License-Identifier: GPL-2.0-only |
2 | /* |
3 | * Implements I2C interface for VTI CMA300_D0x Accelerometer driver |
4 | * |
5 | * Copyright (C) 2010 Texas Instruments |
6 | * Author: Hemanth V <hemanthv@ti.com> |
7 | */ |
8 | |
9 | #include <linux/module.h> |
10 | #include <linux/i2c.h> |
11 | #include <linux/input/cma3000.h> |
12 | #include "cma3000_d0x.h" |
13 | |
14 | static int cma3000_i2c_set(struct device *dev, |
15 | u8 reg, u8 val, char *msg) |
16 | { |
17 | struct i2c_client *client = to_i2c_client(dev); |
18 | int ret; |
19 | |
20 | ret = i2c_smbus_write_byte_data(client, command: reg, value: val); |
21 | if (ret < 0) |
22 | dev_err(&client->dev, |
23 | "%s failed (%s, %d)\n" , __func__, msg, ret); |
24 | return ret; |
25 | } |
26 | |
27 | static int cma3000_i2c_read(struct device *dev, u8 reg, char *msg) |
28 | { |
29 | struct i2c_client *client = to_i2c_client(dev); |
30 | int ret; |
31 | |
32 | ret = i2c_smbus_read_byte_data(client, command: reg); |
33 | if (ret < 0) |
34 | dev_err(&client->dev, |
35 | "%s failed (%s, %d)\n" , __func__, msg, ret); |
36 | return ret; |
37 | } |
38 | |
39 | static const struct cma3000_bus_ops cma3000_i2c_bops = { |
40 | .bustype = BUS_I2C, |
41 | #define CMA3000_BUSI2C (0 << 4) |
42 | .ctrl_mod = CMA3000_BUSI2C, |
43 | .read = cma3000_i2c_read, |
44 | .write = cma3000_i2c_set, |
45 | }; |
46 | |
47 | static int cma3000_i2c_probe(struct i2c_client *client) |
48 | { |
49 | struct cma3000_accl_data *data; |
50 | |
51 | data = cma3000_init(dev: &client->dev, irq: client->irq, bops: &cma3000_i2c_bops); |
52 | if (IS_ERR(ptr: data)) |
53 | return PTR_ERR(ptr: data); |
54 | |
55 | i2c_set_clientdata(client, data); |
56 | |
57 | return 0; |
58 | } |
59 | |
60 | static void cma3000_i2c_remove(struct i2c_client *client) |
61 | { |
62 | struct cma3000_accl_data *data = i2c_get_clientdata(client); |
63 | |
64 | cma3000_exit(data); |
65 | } |
66 | |
67 | static int cma3000_i2c_suspend(struct device *dev) |
68 | { |
69 | struct i2c_client *client = to_i2c_client(dev); |
70 | struct cma3000_accl_data *data = i2c_get_clientdata(client); |
71 | |
72 | cma3000_suspend(data); |
73 | |
74 | return 0; |
75 | } |
76 | |
77 | static int cma3000_i2c_resume(struct device *dev) |
78 | { |
79 | struct i2c_client *client = to_i2c_client(dev); |
80 | struct cma3000_accl_data *data = i2c_get_clientdata(client); |
81 | |
82 | cma3000_resume(data); |
83 | |
84 | return 0; |
85 | } |
86 | |
87 | static const struct dev_pm_ops cma3000_i2c_pm_ops = { |
88 | .suspend = cma3000_i2c_suspend, |
89 | .resume = cma3000_i2c_resume, |
90 | }; |
91 | |
92 | static const struct i2c_device_id cma3000_i2c_id[] = { |
93 | { "cma3000_d01" , 0 }, |
94 | { }, |
95 | }; |
96 | |
97 | MODULE_DEVICE_TABLE(i2c, cma3000_i2c_id); |
98 | |
99 | static struct i2c_driver cma3000_i2c_driver = { |
100 | .probe = cma3000_i2c_probe, |
101 | .remove = cma3000_i2c_remove, |
102 | .id_table = cma3000_i2c_id, |
103 | .driver = { |
104 | .name = "cma3000_i2c_accl" , |
105 | .pm = pm_sleep_ptr(&cma3000_i2c_pm_ops), |
106 | }, |
107 | }; |
108 | |
109 | module_i2c_driver(cma3000_i2c_driver); |
110 | |
111 | MODULE_DESCRIPTION("CMA3000-D0x Accelerometer I2C Driver" ); |
112 | MODULE_LICENSE("GPL" ); |
113 | MODULE_AUTHOR("Hemanth V <hemanthv@ti.com>" ); |
114 | |