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 e8c0019da97..60ec8689d6e 100644 --- a/drivers/misc/lis3lv02d/lis3lv02d_i2c.c +++ b/drivers/misc/lis3lv02d/lis3lv02d_i2c.c @@ -31,6 +31,10 @@  #include <linux/i2c.h>  #include <linux/pm_runtime.h>  #include <linux/delay.h> +#include <linux/of.h> +#include <linux/of_platform.h> +#include <linux/of_device.h> +  #include "lis3lv02d.h"  #define DRV_NAME	"lis3lv02d_i2c" @@ -90,7 +94,11 @@ static int lis3_i2c_init(struct lis3lv02d *lis3)  	if (ret < 0)  		return ret; -	reg |= CTRL1_PD0 | CTRL1_Xen | CTRL1_Yen | CTRL1_Zen; +	if (lis3->whoami == WAI_3DLH) +		reg |= CTRL1_PM0 | CTRL1_Xen | CTRL1_Yen | CTRL1_Zen; +	else +		reg |= CTRL1_PD0 | CTRL1_Xen | CTRL1_Yen | CTRL1_Zen; +  	return lis3->write(lis3, CTRL_REG1, reg);  } @@ -98,12 +106,30 @@ static int lis3_i2c_init(struct lis3lv02d *lis3)  static union axis_conversion lis3lv02d_axis_map =  	{ .as_array = { LIS3_DEV_X, LIS3_DEV_Y, LIS3_DEV_Z } }; +#ifdef CONFIG_OF +static struct of_device_id lis3lv02d_i2c_dt_ids[] = { +	{ .compatible = "st,lis3lv02d" }, +	{} +}; +MODULE_DEVICE_TABLE(of, lis3lv02d_i2c_dt_ids); +#endif +  static int __devinit lis3lv02d_i2c_probe(struct i2c_client *client,  					const struct i2c_device_id *id)  {  	int ret = 0;  	struct lis3lv02d_platform_data *pdata = client->dev.platform_data; +#ifdef CONFIG_OF +	if (of_match_device(lis3lv02d_i2c_dt_ids, &client->dev)) { +		lis3_dev.of_node = client->dev.of_node; +		ret = lis3lv02d_init_dt(&lis3_dev); +		if (ret) +			return ret; +		pdata = lis3_dev.pdata; +	} +#endif +  	if (pdata) {  		if ((pdata->driver_features & LIS3_USE_BLOCK_READ) &&  			(i2c_check_functionality(client->adapter, @@ -231,7 +257,8 @@ static int lis3_i2c_runtime_resume(struct device *dev)  #endif /* CONFIG_PM_RUNTIME */  static const struct i2c_device_id lis3lv02d_id[] = { -	{"lis3lv02d", 0 }, +	{"lis3lv02d", LIS3LV02D}, +	{"lis331dlh", LIS331DLH},  	{}  }; @@ -250,6 +277,7 @@ static struct i2c_driver lis3lv02d_i2c_driver = {  		.name   = DRV_NAME,  		.owner  = THIS_MODULE,  		.pm     = &lis3_pm_ops, +		.of_match_table = of_match_ptr(lis3lv02d_i2c_dt_ids),  	},  	.probe	= lis3lv02d_i2c_probe,  	.remove	= __devexit_p(lis3lv02d_i2c_remove),  |