Commit c5a86ab6 authored by Eric Andersson's avatar Eric Andersson Committed by Greg Kroah-Hartman

misc: bmp085: add device tree properties

Reviewed-by: default avatarStefan Nilsson <stefan.nilsson@unixphere.com>
Signed-off-by: default avatarEric Andersson <eric.andersson@unixphere.com>
Reviewed-by: default avatarArnd Bergmann <arnd@arndb.de>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent e939ca0a
BMP085/BMP18x digital pressure sensors
Required properties:
- compatible: bosch,bmp085
Optional properties:
- chip-id: configurable chip id for non-default chip revisions
- temp-measurement-period: temperature measurement period (milliseconds)
- default-oversampling: default oversampling value to be used at startup,
value range is 0-3 with rising sensitivity.
Example:
pressure@77 {
compatible = "bosch,bmp085";
reg = <0x77>;
chip-id = <10>;
temp-measurement-period = <100>;
default-oversampling = <2>;
};
...@@ -8,6 +8,7 @@ amcc Applied Micro Circuits Corporation (APM, formally AMCC) ...@@ -8,6 +8,7 @@ amcc Applied Micro Circuits Corporation (APM, formally AMCC)
apm Applied Micro Circuits Corporation (APM) apm Applied Micro Circuits Corporation (APM)
arm ARM Ltd. arm ARM Ltd.
atmel Atmel Corporation atmel Atmel Corporation
bosch Bosch Sensortec GmbH
cavium Cavium, Inc. cavium Cavium, Inc.
chrp Common Hardware Reference Platform chrp Common Hardware Reference Platform
cortina Cortina Systems, Inc. cortina Cortina Systems, Inc.
......
...@@ -50,6 +50,7 @@ ...@@ -50,6 +50,7 @@
#include <linux/i2c.h> #include <linux/i2c.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/of.h>
#define BMP085_NAME "bmp085" #define BMP085_NAME "bmp085"
#define BMP085_I2C_ADDRESS 0x77 #define BMP085_I2C_ADDRESS 0x77
...@@ -85,6 +86,7 @@ struct bmp085_data { ...@@ -85,6 +86,7 @@ struct bmp085_data {
u32 raw_pressure; u32 raw_pressure;
u32 temp_measurement_period; u32 temp_measurement_period;
unsigned long last_temp_measurement; unsigned long last_temp_measurement;
u8 chip_id;
s32 b6; /* calculated temperature correction coefficient */ s32 b6; /* calculated temperature correction coefficient */
}; };
...@@ -385,6 +387,27 @@ static int bmp085_detect(struct i2c_client *client, struct i2c_board_info *info) ...@@ -385,6 +387,27 @@ static int bmp085_detect(struct i2c_client *client, struct i2c_board_info *info)
return 0; return 0;
} }
static void __init bmp085_get_of_properties(struct i2c_client *client,
struct bmp085_data *data)
{
#ifdef CONFIG_OF
struct device_node *np = client->dev.of_node;
u32 prop;
if (!np)
return;
if (!of_property_read_u32(np, "chip-id", &prop))
data->chip_id = prop & 0xff;
if (!of_property_read_u32(np, "temp-measurement-period", &prop))
data->temp_measurement_period = (prop/100)*HZ;
if (!of_property_read_u32(np, "default-oversampling", &prop))
data->oversampling_setting = prop & 0xff;
#endif
}
static int bmp085_init_client(struct i2c_client *client) static int bmp085_init_client(struct i2c_client *client)
{ {
struct bmp085_data *data = i2c_get_clientdata(client); struct bmp085_data *data = i2c_get_clientdata(client);
...@@ -393,10 +416,15 @@ static int bmp085_init_client(struct i2c_client *client) ...@@ -393,10 +416,15 @@ static int bmp085_init_client(struct i2c_client *client)
if (status < 0) if (status < 0)
return status; return status;
/* default settings */
data->client = client; data->client = client;
data->chip_id = BMP085_CHIP_ID;
data->last_temp_measurement = 0; data->last_temp_measurement = 0;
data->temp_measurement_period = 1*HZ; data->temp_measurement_period = 1*HZ;
data->oversampling_setting = 3; data->oversampling_setting = 3;
bmp085_get_of_properties(client, data);
mutex_init(&data->lock); mutex_init(&data->lock);
return 0; return 0;
...@@ -446,6 +474,12 @@ static int __devexit bmp085_remove(struct i2c_client *client) ...@@ -446,6 +474,12 @@ static int __devexit bmp085_remove(struct i2c_client *client)
return 0; return 0;
} }
static const struct of_device_id bmp085_of_match[] = {
{ .compatible = "bosch,bmp085", },
{ },
};
MODULE_DEVICE_TABLE(of, bmp085_of_match);
static const struct i2c_device_id bmp085_id[] = { static const struct i2c_device_id bmp085_id[] = {
{ BMP085_NAME, 0 }, { BMP085_NAME, 0 },
{ } { }
...@@ -455,7 +489,8 @@ MODULE_DEVICE_TABLE(i2c, bmp085_id); ...@@ -455,7 +489,8 @@ MODULE_DEVICE_TABLE(i2c, bmp085_id);
static struct i2c_driver bmp085_driver = { static struct i2c_driver bmp085_driver = {
.driver = { .driver = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.name = BMP085_NAME .name = BMP085_NAME,
.of_match_table = bmp085_of_match
}, },
.id_table = bmp085_id, .id_table = bmp085_id,
.probe = bmp085_probe, .probe = bmp085_probe,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment