Browse Source

misc: bmp085: add device tree properties

Reviewed-by: Stefan Nilsson <stefan.nilsson@unixphere.com>
Signed-off-by: Eric Andersson <eric.andersson@unixphere.com>
Reviewed-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Eric Andersson 13 years ago
parent
commit
c5a86ab6dd

+ 20 - 0
Documentation/devicetree/bindings/misc/bmp085.txt


+ 1 - 0
Documentation/devicetree/bindings/vendor-prefixes.txt

@@ -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.

+ 36 - 1
drivers/misc/bmp085.c

@@ -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 {
 	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)
 	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)
 	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)
 	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);
 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,