hwmon: (sht15) Add device tree support
Allow the driver to work with device tree support. Based on initial patch submission from Peter Fox. Tested on a imx7d-sdb board connected to a SHT15 board via Mikro Bus. Signed-off-by: Marco Franchi <marco.franchi@nxp.com> Reviewed-by: Fabio Estevam <fabio.estevam@nxp.com> Signed-off-by: Guenter Roeck <linux@roeck-us.net>
This commit is contained in:
parent
87d08b11b1
commit
2f1736ff06
|
@ -0,0 +1,19 @@
|
||||||
|
Sensirion SHT15 Humidity and Temperature Sensor
|
||||||
|
|
||||||
|
Required properties:
|
||||||
|
|
||||||
|
- "compatible": must be "sensirion,sht15".
|
||||||
|
- "data-gpios": GPIO connected to the data line.
|
||||||
|
- "clk-gpios": GPIO connected to the clock line.
|
||||||
|
- "vcc-supply": regulator that drives the VCC pin.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
sensor {
|
||||||
|
pinctrl-names = "default";
|
||||||
|
pinctrl-0 = <&pinctrl_sensor>;
|
||||||
|
compatible = "sensirion,sht15";
|
||||||
|
clk-gpios = <&gpio4 12 0>;
|
||||||
|
data-gpios = <&gpio4 13 0>;
|
||||||
|
vcc-supply = <®_sht15>;
|
||||||
|
};
|
|
@ -34,6 +34,7 @@
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/atomic.h>
|
#include <linux/atomic.h>
|
||||||
#include <linux/bitrev.h>
|
#include <linux/bitrev.h>
|
||||||
|
#include <linux/of_gpio.h>
|
||||||
|
|
||||||
/* Commands */
|
/* Commands */
|
||||||
#define SHT15_MEASURE_TEMP 0x03
|
#define SHT15_MEASURE_TEMP 0x03
|
||||||
|
@ -911,6 +912,54 @@ static int sht15_invalidate_voltage(struct notifier_block *nb,
|
||||||
return NOTIFY_OK;
|
return NOTIFY_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_OF
|
||||||
|
static const struct of_device_id sht15_dt_match[] = {
|
||||||
|
{ .compatible = "sensirion,sht15" },
|
||||||
|
{ },
|
||||||
|
};
|
||||||
|
MODULE_DEVICE_TABLE(of, sht15_dt_match);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This function returns NULL if pdev isn't a device instatiated by dt,
|
||||||
|
* a pointer to pdata if it could successfully get all information
|
||||||
|
* from dt or a negative ERR_PTR() on error.
|
||||||
|
*/
|
||||||
|
static struct sht15_platform_data *sht15_probe_dt(struct device *dev)
|
||||||
|
{
|
||||||
|
struct device_node *np = dev->of_node;
|
||||||
|
struct sht15_platform_data *pdata;
|
||||||
|
|
||||||
|
/* no device tree device */
|
||||||
|
if (!np)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL);
|
||||||
|
if (!pdata)
|
||||||
|
return ERR_PTR(-ENOMEM);
|
||||||
|
|
||||||
|
pdata->gpio_data = of_get_named_gpio(np, "data-gpios", 0);
|
||||||
|
if (pdata->gpio_data < 0) {
|
||||||
|
if (pdata->gpio_data != -EPROBE_DEFER)
|
||||||
|
dev_err(dev, "data-gpios not found\n");
|
||||||
|
return ERR_PTR(pdata->gpio_data);
|
||||||
|
}
|
||||||
|
|
||||||
|
pdata->gpio_sck = of_get_named_gpio(np, "clk-gpios", 0);
|
||||||
|
if (pdata->gpio_sck < 0) {
|
||||||
|
if (pdata->gpio_sck != -EPROBE_DEFER)
|
||||||
|
dev_err(dev, "clk-gpios not found\n");
|
||||||
|
return ERR_PTR(pdata->gpio_sck);
|
||||||
|
}
|
||||||
|
|
||||||
|
return pdata;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
static inline struct sht15_platform_data *sht15_probe_dt(struct device *dev)
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static int sht15_probe(struct platform_device *pdev)
|
static int sht15_probe(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
@ -928,11 +977,17 @@ static int sht15_probe(struct platform_device *pdev)
|
||||||
data->dev = &pdev->dev;
|
data->dev = &pdev->dev;
|
||||||
init_waitqueue_head(&data->wait_queue);
|
init_waitqueue_head(&data->wait_queue);
|
||||||
|
|
||||||
if (dev_get_platdata(&pdev->dev) == NULL) {
|
data->pdata = sht15_probe_dt(&pdev->dev);
|
||||||
|
if (IS_ERR(data->pdata))
|
||||||
|
return PTR_ERR(data->pdata);
|
||||||
|
if (data->pdata == NULL) {
|
||||||
|
data->pdata = dev_get_platdata(&pdev->dev);
|
||||||
|
if (data->pdata == NULL) {
|
||||||
dev_err(&pdev->dev, "no platform data supplied\n");
|
dev_err(&pdev->dev, "no platform data supplied\n");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
data->pdata = dev_get_platdata(&pdev->dev);
|
}
|
||||||
|
|
||||||
data->supply_uv = data->pdata->supply_mv * 1000;
|
data->supply_uv = data->pdata->supply_mv * 1000;
|
||||||
if (data->pdata->checksum)
|
if (data->pdata->checksum)
|
||||||
data->checksumming = true;
|
data->checksumming = true;
|
||||||
|
@ -1075,6 +1130,7 @@ MODULE_DEVICE_TABLE(platform, sht15_device_ids);
|
||||||
static struct platform_driver sht15_driver = {
|
static struct platform_driver sht15_driver = {
|
||||||
.driver = {
|
.driver = {
|
||||||
.name = "sht15",
|
.name = "sht15",
|
||||||
|
.of_match_table = of_match_ptr(sht15_dt_match),
|
||||||
},
|
},
|
||||||
.probe = sht15_probe,
|
.probe = sht15_probe,
|
||||||
.remove = sht15_remove,
|
.remove = sht15_remove,
|
||||||
|
|
Loading…
Reference in New Issue