diff options
Diffstat (limited to 'drivers/misc/lis3lv02d/lis3lv02d_i2c.c')
-rw-r--r-- | drivers/misc/lis3lv02d/lis3lv02d_i2c.c | 32 |
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) | |||
98 | static union axis_conversion lis3lv02d_axis_map = | 106 | static 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 | ||
110 | static struct of_device_id lis3lv02d_i2c_dt_ids[] = { | ||
111 | { .compatible = "st,lis3lv02d" }, | ||
112 | {} | ||
113 | }; | ||
114 | MODULE_DEVICE_TABLE(of, lis3lv02d_i2c_dt_ids); | ||
115 | #endif | ||
116 | |||
101 | static int __devinit lis3lv02d_i2c_probe(struct i2c_client *client, | 117 | static 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 | ||
233 | static const struct i2c_device_id lis3lv02d_id[] = { | 259 | static 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), |