aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/misc/lis3lv02d/lis3lv02d_i2c.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/misc/lis3lv02d/lis3lv02d_i2c.c')
-rw-r--r--drivers/misc/lis3lv02d/lis3lv02d_i2c.c32
1 files changed, 30 insertions, 2 deletions
diff --git a/drivers/misc/lis3lv02d/lis3lv02d_i2c.c b/drivers/misc/lis3lv02d/lis3lv02d_i2c.c
index e8c0019da97a..60ec8689d6e3 100644
--- a/drivers/misc/lis3lv02d/lis3lv02d_i2c.c
+++ b/drivers/misc/lis3lv02d/lis3lv02d_i2c.c
@@ -31,6 +31,10 @@
31#include <linux/i2c.h> 31#include <linux/i2c.h>
32#include <linux/pm_runtime.h> 32#include <linux/pm_runtime.h>
33#include <linux/delay.h> 33#include <linux/delay.h>
34#include <linux/of.h>
35#include <linux/of_platform.h>
36#include <linux/of_device.h>
37
34#include "lis3lv02d.h" 38#include "lis3lv02d.h"
35 39
36#define DRV_NAME "lis3lv02d_i2c" 40#define DRV_NAME "lis3lv02d_i2c"
@@ -90,7 +94,11 @@ static int lis3_i2c_init(struct lis3lv02d *lis3)
90 if (ret < 0) 94 if (ret < 0)
91 return ret; 95 return ret;
92 96
93 reg |= CTRL1_PD0 | CTRL1_Xen | CTRL1_Yen | CTRL1_Zen; 97 if (lis3->whoami == WAI_3DLH)
98 reg |= CTRL1_PM0 | CTRL1_Xen | CTRL1_Yen | CTRL1_Zen;
99 else
100 reg |= CTRL1_PD0 | CTRL1_Xen | CTRL1_Yen | CTRL1_Zen;
101
94 return lis3->write(lis3, CTRL_REG1, reg); 102 return lis3->write(lis3, CTRL_REG1, reg);
95} 103}
96 104
@@ -98,12 +106,30 @@ static int lis3_i2c_init(struct lis3lv02d *lis3)
98static union axis_conversion lis3lv02d_axis_map = 106static union axis_conversion lis3lv02d_axis_map =
99 { .as_array = { LIS3_DEV_X, LIS3_DEV_Y, LIS3_DEV_Z } }; 107 { .as_array = { LIS3_DEV_X, LIS3_DEV_Y, LIS3_DEV_Z } };
100 108
109#ifdef CONFIG_OF
110static struct of_device_id lis3lv02d_i2c_dt_ids[] = {
111 { .compatible = "st,lis3lv02d" },
112 {}
113};
114MODULE_DEVICE_TABLE(of, lis3lv02d_i2c_dt_ids);
115#endif
116
101static int __devinit lis3lv02d_i2c_probe(struct i2c_client *client, 117static int __devinit lis3lv02d_i2c_probe(struct i2c_client *client,
102 const struct i2c_device_id *id) 118 const struct i2c_device_id *id)
103{ 119{
104 int ret = 0; 120 int ret = 0;
105 struct lis3lv02d_platform_data *pdata = client->dev.platform_data; 121 struct lis3lv02d_platform_data *pdata = client->dev.platform_data;
106 122
123#ifdef CONFIG_OF
124 if (of_match_device(lis3lv02d_i2c_dt_ids, &client->dev)) {
125 lis3_dev.of_node = client->dev.of_node;
126 ret = lis3lv02d_init_dt(&lis3_dev);
127 if (ret)
128 return ret;
129 pdata = lis3_dev.pdata;
130 }
131#endif
132
107 if (pdata) { 133 if (pdata) {
108 if ((pdata->driver_features & LIS3_USE_BLOCK_READ) && 134 if ((pdata->driver_features & LIS3_USE_BLOCK_READ) &&
109 (i2c_check_functionality(client->adapter, 135 (i2c_check_functionality(client->adapter,
@@ -231,7 +257,8 @@ static int lis3_i2c_runtime_resume(struct device *dev)
231#endif /* CONFIG_PM_RUNTIME */ 257#endif /* CONFIG_PM_RUNTIME */
232 258
233static const struct i2c_device_id lis3lv02d_id[] = { 259static const struct i2c_device_id lis3lv02d_id[] = {
234 {"lis3lv02d", 0 }, 260 {"lis3lv02d", LIS3LV02D},
261 {"lis331dlh", LIS331DLH},
235 {} 262 {}
236}; 263};
237 264
@@ -250,6 +277,7 @@ static struct i2c_driver lis3lv02d_i2c_driver = {
250 .name = DRV_NAME, 277 .name = DRV_NAME,
251 .owner = THIS_MODULE, 278 .owner = THIS_MODULE,
252 .pm = &lis3_pm_ops, 279 .pm = &lis3_pm_ops,
280 .of_match_table = of_match_ptr(lis3lv02d_i2c_dt_ids),
253 }, 281 },
254 .probe = lis3lv02d_i2c_probe, 282 .probe = lis3lv02d_i2c_probe,
255 .remove = __devexit_p(lis3lv02d_i2c_remove), 283 .remove = __devexit_p(lis3lv02d_i2c_remove),