Re: [Patch] hwmon (sht15) enabled device tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 12/18/2016 03:05 PM, Peter Fox wrote:
From: Peter Fox <FoxPeter@xxxxxxxxxx>


Attached is a patch which allows the sht15 module to read its configuration from

a device tree in addition to any platform data


Why so many empty lines ?

Please drop _all_ whitespace changes, ie every change not directly related
to the subject and description.

Devicetree properties will need to be documented in a separate patch and
will have to be approved by a devicetree maintainer.

More comments inline.

Signed-off-by: Peter Fox <FoxPeter@xxxxxxxxxx>

---


--- linux/drivers/hwmon/sht15.c.orig    2016-12-18 23:23:43.431045129 +0100
+++ linux/drivers/hwmon/sht15.c    2016-12-18 23:40:27.924278262 +0100
@@ -1,6 +1,8 @@
 /*
  * sht15.c - support for the SHT15 Temperature and Humidity Sensor
  *
+ * Device tree ready (c) 2016 Peter Fox
+ *
  * Portions Copyright (c) 2010-2012 Savoir-faire Linux Inc.
  *          Jerome Oufella <jerome.oufella@xxxxxxxxxxxxxxxxxxxx>
  *          Vivien Didelot <vivien.didelot@xxxxxxxxxxxxxxxxxxxx>
@@ -26,6 +28,9 @@
 #include <linux/mutex.h>
 #include <linux/platform_data/sht15.h>
 #include <linux/platform_device.h>
+#include <linux/of.h>
+#include <linux/of_platform.h>
+#include <linux/of_gpio.h>

Why is this include needed ?

 #include <linux/sched.h>
 #include <linux/delay.h>
 #include <linux/jiffies.h>
@@ -758,8 +763,7 @@ static ssize_t sht15_show_temp(struct de
  * Returns number of bytes written into buffer, negative errno on error.
  */
 static ssize_t sht15_show_humidity(struct device *dev,
-                   struct device_attribute *attr,
-                   char *buf)
+                   struct device_attribute *attr, char *buf)
 {
     int ret;
     struct sht15_data *data = dev_get_drvdata(dev);
@@ -770,17 +774,15 @@ static ssize_t sht15_show_humidity(struc
 }

 static ssize_t show_name(struct device *dev,
-             struct device_attribute *attr,
-             char *buf)
+    struct device_attribute *attr, char *buf)
 {
     struct platform_device *pdev = to_platform_device(dev);
     return sprintf(buf, "%s\n", pdev->name);
 }

-static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO,
-              sht15_show_temp, NULL, 0);
+static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, sht15_show_temp, NULL, 0);
 static SENSOR_DEVICE_ATTR(humidity1_input, S_IRUGO,
-              sht15_show_humidity, NULL, 0);
+    sht15_show_humidity, NULL, 0);
 static SENSOR_DEVICE_ATTR(temp1_fault, S_IRUGO, sht15_show_status, NULL,
               SHT15_STATUS_LOW_BATTERY);
 static SENSOR_DEVICE_ATTR(humidity1_fault, S_IRUGO, sht15_show_status, NULL,
@@ -821,8 +823,7 @@ static void sht15_bh_read_data(struct wo
     u8 dev_checksum = 0;
     u8 checksum_vals[3];
     struct sht15_data *data
-        = container_of(work_s, struct sht15_data,
-                   read_work);
+        = container_of(work_s, struct sht15_data, read_work);

     /* Firstly, verify the line is low */
     if (gpio_get_value(data->pdata->gpio_data)) {
@@ -884,8 +885,7 @@ wakeup:
 static void sht15_update_voltage(struct work_struct *work_s)
 {
     struct sht15_data *data
-        = container_of(work_s, struct sht15_data,
-                   update_supply_work);
+        = container_of(work_s, struct sht15_data, update_supply_work);
     data->supply_uv = regulator_get_voltage(data->reg);
 }

@@ -911,6 +911,50 @@ static int sht15_invalidate_voltage(stru
     return NOTIFY_OK;
 }

+
+#ifdef CONFIG_OF
+static const struct of_device_id sht15_of_match[] = {
+    { .compatible = "sht10" },
+    { .compatible = "sht11" },
+    { .compatible = "sht15" },
+    { .compatible = "sht71" },
+    { .compatible = "sht75" },
+    { },
+};
+MODULE_DEVICE_TABLE(of, sht15_of_match);
+
+static struct sht15_platform_data *sht15_parse_dt(struct device *dev)
+{
+    const struct of_device_id *of_id = of_match_device(sht15_of_match, dev);

This is quite unnecessary; you don't do anything with it. The framework will
already do a match.

+    struct device_node *np = dev->of_node;
+    struct sht15_platform_data *pdata;
+
+    if (!of_id || !np)
+        return NULL;
+
+    pdata = kzalloc(sizeof(struct sht15_platform_data), GFP_KERNEL);
+    if (!pdata)
+        return ERR_PTR(-ENOMEM);
+
+    of_property_read_u32(np, "data", &pdata->gpio_data);
+    of_property_read_u32(np, "clock", &pdata->gpio_sck);
+    of_property_read_u32(np, "supply_mv", &pdata->supply_mv);
+    pdata->checksum =    of_property_read_bool(np, "checksum");
+    pdata->no_otp_reload =    of_property_read_bool(np, "no_otp_reload");
+    pdata->low_resolution =    of_property_read_bool(np, "low_resolution");

I don't think those property names are acceptable. Property names usually don't have
underscores.

+
+    return pdata;
+}
+
+#else
+
+static inline struct sht15_platform_data *sht15_parse_dt(struct device *dev)
+{
+    return NULL;
+}
+
+#endif
+
 static int sht15_probe(struct platform_device *pdev)
 {
     int ret;
@@ -928,11 +972,18 @@ static int sht15_probe(struct platform_d
     data->dev = &pdev->dev;
     init_waitqueue_head(&data->wait_queue);

-    if (dev_get_platdata(&pdev->dev) == NULL) {
-        dev_err(&pdev->dev, "no platform data supplied\n");
-        return -EINVAL;
-    }
     data->pdata = dev_get_platdata(&pdev->dev);
+    if (!data->pdata) {
+        data->pdata = sht15_parse_dt(&pdev->dev);
+        if (IS_ERR(data->pdata))
+            return PTR_ERR(data->pdata);

This is overly complex and misleading. Returning NULL if there is no devicetree
entry but -ENOMEM on memory failure is inconsistent.

+
+        if (!data->pdata) {
+            dev_err(&pdev->dev, "no platform data supplied\n");
+            return -EINVAL;
+        }
+    }
+
     data->supply_uv = data->pdata->supply_mv * 1000;
     if (data->pdata->checksum)
         data->checksumming = true;
@@ -967,8 +1018,7 @@ static int sht15_probe(struct platform_d
         data->nb.notifier_call = &sht15_invalidate_voltage;
         ret = regulator_register_notifier(data->reg, &data->nb);
         if (ret) {
-            dev_err(&pdev->dev,
-                "regulator notifier request failed\n");
+            dev_err(&pdev->dev, "regulator notifier request failed\n");
             regulator_disable(data->reg);
             return ret;
         }
@@ -1062,6 +1112,7 @@ static int sht15_remove(struct platform_
     return 0;
 }

+
 static const struct platform_device_id sht15_device_ids[] = {
     { "sht10", sht10 },
     { "sht11", sht11 },
@@ -1072,15 +1123,20 @@ static const struct platform_device_id s
 };
 MODULE_DEVICE_TABLE(platform, sht15_device_ids);

+
 static struct platform_driver sht15_driver = {
-    .driver = {
-        .name = "sht15",
-    },
     .probe = sht15_probe,
     .remove = sht15_remove,
     .id_table = sht15_device_ids,
+    .driver = {
+        .name = "sht15",
+        .of_match_table = of_match_ptr(sht15_of_match),
+    },
 };
 module_platform_driver(sht15_driver);

-MODULE_LICENSE("GPL");
+
+MODULE_ALIAS("platform:sht15");

Unrelated.

+MODULE_AUTHOR("Wouter Horre, Jonathan Cameron, Jerome Oufella, Vivien Didelot, Peter Fox");

Please drop that.

 MODULE_DESCRIPTION("Sensirion SHT15 temperature and humidity sensor driver");
+MODULE_LICENSE("GPL");




--
To unsubscribe from this list: send the line "unsubscribe linux-hwmon" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [LM Sensors]     [Linux Sound]     [ALSA Users]     [ALSA Devel]     [Linux Audio Users]     [Linux Media]     [Kernel]     [Gimp]     [Yosemite News]     [Linux Media]

  Powered by Linux