1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
|
/*
* cma3000_d0x_i2c.c
*
* Implements I2C interface for VTI CMA300_D0x Accelerometer driver
*
* Copyright (C) 2010 Texas Instruments
* Author: Hemanth V <hemanthv@ti.com>
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 as published by
* the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <linux/module.h>
#include <linux/pm.h>
#include <linux/platform_device.h>
#include <linux/slab.h>
#include <linux/i2c.h>
#include <linux/i2c/cma3000.h>
#include "cma3000_d0x.h"
int cma3000_set(struct cma3000_accl_data *accl, u8 reg, u8 val, char *msg)
{
int ret = i2c_smbus_write_byte_data(accl->client, reg, val);
if (ret < 0)
dev_err(&accl->client->dev,
"i2c_smbus_write_byte_data failed (%s)\n", msg);
return ret;
}
int cma3000_read(struct cma3000_accl_data *accl, u8 reg, char *msg)
{
int ret = i2c_smbus_read_byte_data(accl->client, reg);
if (ret < 0)
dev_err(&accl->client->dev,
"i2c_smbus_read_byte_data failed (%s)\n", msg);
return ret;
}
static int __devinit cma3000_accl_probe(struct i2c_client *client,
const struct i2c_device_id *id)
{
int ret;
struct cma3000_accl_data *data = NULL;
data = kzalloc(sizeof(*data), GFP_KERNEL);
if (data == NULL) {
ret = -ENOMEM;
goto err_op_failed;
}
data->client = client;
i2c_set_clientdata(client, data);
ret = cma3000_init(data);
if (ret)
goto err_op_failed;
return 0;
err_op_failed:
if (data != NULL)
kfree(data);
return ret;
}
static int __devexit cma3000_accl_remove(struct i2c_client *client)
{
struct cma3000_accl_data *data = i2c_get_clientdata(client);
int ret;
ret = cma3000_exit(data);
i2c_set_clientdata(client, NULL);
kfree(data);
return ret;
}
#ifdef CONFIG_PM
static int cma3000_accl_suspend(struct device *dev)
{
struct platform_device *pdev = to_platform_device(dev);
struct cma3000_accl_data *data = platform_get_drvdata(pdev);
return cma3000_poweroff(data);
}
static int cma3000_accl_resume(struct device *dev)
{
struct platform_device *pdev = to_platform_device(dev);
struct cma3000_accl_data *data = platform_get_drvdata(pdev);
return cma3000_poweron(data);
}
static const struct dev_pm_ops cma3000_pm_ops = {
.suspend = cma3000_accl_suspend,
.resume = cma3000_accl_resume,
};
#endif
static const struct i2c_device_id cma3000_id[] = {
{ "cma3000_accl", 0 },
{ },
};
static struct i2c_driver cma3000_accl_driver = {
.probe = cma3000_accl_probe,
.remove = cma3000_accl_remove,
.id_table = cma3000_id,
.driver = {
.name = "cma3000_accl",
#ifdef CONFIG_PM
.pm = &cma3000_pm_ops,
#endif
},
};
static int __init cma3000_accl_init(void)
{
return i2c_add_driver(&cma3000_accl_driver);
}
static void __exit cma3000_accl_exit(void)
{
i2c_del_driver(&cma3000_accl_driver);
}
module_init(cma3000_accl_init);
module_exit(cma3000_accl_exit);
MODULE_DESCRIPTION("CMA3000-D0x Accelerometer Driver");
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Hemanth V <hemanthv@ti.com>");
|