diff options
| -rw-r--r-- | Documentation/devicetree/bindings/misc/lis302.txt | 36 | ||||
| -rw-r--r-- | drivers/misc/lis3lv02d/lis3lv02d_i2c.c | 23 |
2 files changed, 59 insertions, 0 deletions
diff --git a/Documentation/devicetree/bindings/misc/lis302.txt b/Documentation/devicetree/bindings/misc/lis302.txt index e18af9d19793..6def86f6b053 100644 --- a/Documentation/devicetree/bindings/misc/lis302.txt +++ b/Documentation/devicetree/bindings/misc/lis302.txt | |||
| @@ -11,6 +11,12 @@ Required properties for the SPI bindings: | |||
| 11 | constrained by external circuitry | 11 | constrained by external circuitry |
| 12 | - interrupts: the interrupt generated by the device | 12 | - interrupts: the interrupt generated by the device |
| 13 | 13 | ||
| 14 | Required properties for the I2C bindings: | ||
| 15 | - compatible: should be set to "st,lis3lv02d" | ||
| 16 | - reg: i2c slave address | ||
| 17 | - Vdd-supply: The input supply for Vdd | ||
| 18 | - Vdd_IO-supply: The input supply for Vdd_IO | ||
| 19 | |||
| 14 | 20 | ||
| 15 | Optional properties for all bus drivers: | 21 | Optional properties for all bus drivers: |
| 16 | 22 | ||
| @@ -74,3 +80,33 @@ Example for a SPI device node: | |||
| 74 | st,wakeup-z-hi; | 80 | st,wakeup-z-hi; |
| 75 | }; | 81 | }; |
| 76 | 82 | ||
| 83 | Example for a I2C device node: | ||
| 84 | |||
| 85 | lis331dlh: lis331dlh@18 { | ||
| 86 | compatible = "st,lis331dlh", "st,lis3lv02d"; | ||
| 87 | reg = <0x18>; | ||
| 88 | Vdd-supply = <&lis3_reg>; | ||
| 89 | Vdd_IO-supply = <&lis3_reg>; | ||
| 90 | |||
| 91 | st,click-single-x; | ||
| 92 | st,click-single-y; | ||
| 93 | st,click-single-z; | ||
| 94 | st,click-thresh-x = <10>; | ||
| 95 | st,click-thresh-y = <10>; | ||
| 96 | st,click-thresh-z = <10>; | ||
| 97 | st,irq1-click; | ||
| 98 | st,irq2-click; | ||
| 99 | st,wakeup-x-lo; | ||
| 100 | st,wakeup-x-hi; | ||
| 101 | st,wakeup-y-lo; | ||
| 102 | st,wakeup-y-hi; | ||
| 103 | st,wakeup-z-lo; | ||
| 104 | st,wakeup-z-hi; | ||
| 105 | st,min-limit-x = <120>; | ||
| 106 | st,min-limit-y = <120>; | ||
| 107 | st,min-limit-z = <140>; | ||
| 108 | st,max-limit-x = <550>; | ||
| 109 | st,max-limit-y = <550>; | ||
| 110 | st,max-limit-z = <750>; | ||
| 111 | }; | ||
| 112 | |||
diff --git a/drivers/misc/lis3lv02d/lis3lv02d_i2c.c b/drivers/misc/lis3lv02d/lis3lv02d_i2c.c index 2c0a1148ee22..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" |
| @@ -102,12 +106,30 @@ static int lis3_i2c_init(struct lis3lv02d *lis3) | |||
| 102 | static union axis_conversion lis3lv02d_axis_map = | 106 | static union axis_conversion lis3lv02d_axis_map = |
| 103 | { .as_array = { LIS3_DEV_X, LIS3_DEV_Y, LIS3_DEV_Z } }; | 107 | { .as_array = { LIS3_DEV_X, LIS3_DEV_Y, LIS3_DEV_Z } }; |
| 104 | 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 | |||
| 105 | static int __devinit lis3lv02d_i2c_probe(struct i2c_client *client, | 117 | static int __devinit lis3lv02d_i2c_probe(struct i2c_client *client, |
| 106 | const struct i2c_device_id *id) | 118 | const struct i2c_device_id *id) |
| 107 | { | 119 | { |
| 108 | int ret = 0; | 120 | int ret = 0; |
| 109 | struct lis3lv02d_platform_data *pdata = client->dev.platform_data; | 121 | struct lis3lv02d_platform_data *pdata = client->dev.platform_data; |
| 110 | 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 | |||
| 111 | if (pdata) { | 133 | if (pdata) { |
| 112 | if ((pdata->driver_features & LIS3_USE_BLOCK_READ) && | 134 | if ((pdata->driver_features & LIS3_USE_BLOCK_READ) && |
| 113 | (i2c_check_functionality(client->adapter, | 135 | (i2c_check_functionality(client->adapter, |
| @@ -255,6 +277,7 @@ static struct i2c_driver lis3lv02d_i2c_driver = { | |||
| 255 | .name = DRV_NAME, | 277 | .name = DRV_NAME, |
| 256 | .owner = THIS_MODULE, | 278 | .owner = THIS_MODULE, |
| 257 | .pm = &lis3_pm_ops, | 279 | .pm = &lis3_pm_ops, |
| 280 | .of_match_table = of_match_ptr(lis3lv02d_i2c_dt_ids), | ||
| 258 | }, | 281 | }, |
| 259 | .probe = lis3lv02d_i2c_probe, | 282 | .probe = lis3lv02d_i2c_probe, |
| 260 | .remove = __devexit_p(lis3lv02d_i2c_remove), | 283 | .remove = __devexit_p(lis3lv02d_i2c_remove), |
