On 11/23/13 17:44, Harald Geyer wrote:
> Jonathan Cameron writes:
>> On 10/25/13 12:47, Harald Geyer wrote:
>>> This driver handles DHT11 and DHT22 sensors.
>>>
>>> Signed-off-by: Harald Geyer <[email protected]>
>>
>> Hi Harald,
>>
>> I'm afraid I completely missed your posting of this version 2.
>>
>> Do feel free to pester me if I fail to say anything about a patch
>> for a couple of weeks.
>
> Well, was going to do so in a few days ... :)
>
>> Anyhow
>>> ---
>>> changes since v1 (tested on DHT11):
>>> Add dependency on GPIOLIB
>>> Prefix all local preprocessor macros with DHT11_
>>> Rename STARTUP to START_TRANSMISSION
>>> Remove leading zeros
>>> Simplify channel disambiguation
>>> Remove obvious comments
>>> Make whitespace more consistent
>>> Strip unnecessary output and simplify error handling
>>> Fix spelling errors
>>>
>>> The v1 patch has been tested with DHT11 and DHT22 hardware.
>> There are a few redundant bits below that want to be dropped.
>>
>> The only real issue I have otherwise is with the naming.
>> I would expect *-gpio to be a driver providing gpios?
>
> At least there are 'leds-gpio' and 'w1-gpio' already.
> I was under the impression that drivers providing gpios
> start with 'gpio' like 'gpio-mxs' ...
Looking at the device tree bindings, this is a mess. Some are gpio-*
and some *-gpio.
>
>> Just go with dht11. This applies to the bindings as well.
>
> I'm happy to grab 'dht11' but am reluctant to do so because
> somebody might write a DHT11 driver using some other IO hardware
> then gpio. How would this be called then?
I would hope that they would rework the driver to support both rather
than starting again.
I would definitely go with just dht11
>
>> Also note that policy is now to cc the device tree list for
>> all patches changing or introducing bindings.
>>
>> I've cc'd them on this reply.
>
> Thanks.
>
>> Thanks,
>>
>> Jonathan
>>>
>>> Thanks,
>>> Harald
>>>
>>> .../bindings/iio/humidity/dht11-gpio.txt | 14 +
>>> drivers/iio/Kconfig | 1 +
>>> drivers/iio/Makefile | 1 +
>>> drivers/iio/humidity/Kconfig | 15 +
>>> drivers/iio/humidity/Makefile | 5 +
>>> drivers/iio/humidity/dht11-gpio.c | 325
>>> ++++++++++++++++++++
>>> 6 files changed, 361 insertions(+), 0 deletions(-)
>>> create mode 100644
>>> Documentation/devicetree/bindings/iio/humidity/dht11-gpio.txt
>>> create mode 100644 drivers/iio/humidity/Kconfig
>>> create mode 100644 drivers/iio/humidity/Makefile
>>> create mode 100644 drivers/iio/humidity/dht11-gpio.c
>>>
>>> diff --git a/Documentation/devicetree/bindings/iio/humidity/dht11-gpio.txt
>>> b/Documentation/devicetree/bindings/iio/humidity/dht11-gpio.txt
>>> new file mode 100644
>>> index 0000000..ee8fa04
>>> --- /dev/null
>>> +++ b/Documentation/devicetree/bindings/iio/humidity/dht11-gpio.txt
>>> @@ -0,0 +1,14 @@
>>> +* DHT11 humidity/temperature sensor (and compatibles like DHT22)
>>> +
>>> +Required properties:
>>> + - compatible: Should be "dht11-gpio"
>>> + - gpios: Should specify the GPIO connected to the sensor's data
>>> + line, see "gpios property" in
>>> + Documentation/devicetree/bindings/gpio/gpio.txt.
>>> +
>>> +Example:
>>> +
>>> +humidity_sensor {
>>> + compatible = "dht11-gpio";
>>> + gpios = <&gpio0 6 0>;
>>> +}
>>> diff --git a/drivers/iio/Kconfig b/drivers/iio/Kconfig
>>> index 90cf0cd..a5ed882 100644
>>> --- a/drivers/iio/Kconfig
>>> +++ b/drivers/iio/Kconfig
>>> @@ -65,6 +65,7 @@ source "drivers/iio/common/Kconfig"
>>> source "drivers/iio/dac/Kconfig"
>>> source "drivers/iio/frequency/Kconfig"
>>> source "drivers/iio/gyro/Kconfig"
>>> +source "drivers/iio/humidity/Kconfig"
>>> source "drivers/iio/imu/Kconfig"
>>> source "drivers/iio/light/Kconfig"
>>> source "drivers/iio/magnetometer/Kconfig"
>>> diff --git a/drivers/iio/Makefile b/drivers/iio/Makefile
>>> index bcf7e9e..b3b5096 100644
>>> --- a/drivers/iio/Makefile
>>> +++ b/drivers/iio/Makefile
>>> @@ -18,6 +18,7 @@ obj-y += common/
>>> obj-y += dac/
>>> obj-y += gyro/
>>> obj-y += frequency/
>>> +obj-y += humidity/
>>> obj-y += imu/
>>> obj-y += light/
>>> obj-y += magnetometer/
>>> diff --git a/drivers/iio/humidity/Kconfig b/drivers/iio/humidity/Kconfig
>>> new file mode 100644
>>> index 0000000..bbc44f2
>>> --- /dev/null
>>> +++ b/drivers/iio/humidity/Kconfig
>>> @@ -0,0 +1,15 @@
>>> +#
>>> +# humidity sensor drivers
>>> +#
>>> +menu "Humidity sensors"
>>> +
>>> +config DHT11_GPIO
>> The _GPIO to my mind would normally imply that this as a driver
>> providing GPIOs rather than using them.
>
> I will change this according to the result of the naming
> discussion.
>
>>> + tristate "DHT11 (and compatible sensors) driver"
>>> + depends on GPIOLIB
>>> + help
>>> + This driver supports reading data via a single interrupt
>>> + generating GPIO line. Currently tested are DHT11 and DHT22.
>>> + Other sensors should work as well as long as they speak the
>>> + same protocol.
>>> +
>>> +endmenu
>>> diff --git a/drivers/iio/humidity/Makefile b/drivers/iio/humidity/Makefile
>>> new file mode 100644
>>> index 0000000..5e8226f
>>> --- /dev/null
>>> +++ b/drivers/iio/humidity/Makefile
>>> @@ -0,0 +1,5 @@
>>> +#
>>> +# Makefile for IIO humidity sensor drivers
>>> +#
>>> +
>>> +obj-$(CONFIG_DHT11_GPIO) += dht11-gpio.o
>>> diff --git a/drivers/iio/humidity/dht11-gpio.c
>>> b/drivers/iio/humidity/dht11-gpio.c
>>> new file mode 100644
>>> index 0000000..3bb4d81
>>> --- /dev/null
>>> +++ b/drivers/iio/humidity/dht11-gpio.c
>>> @@ -0,0 +1,325 @@
>> ...
>> Don't bother with this comment. If anyone wants it they can
>> add support :)
>>> +/* TODO?: Support systems without DT? */
>
> Ok.
>
>>> +
>>> +struct dht11_gpio {
>>> + struct device *dev;
>>> +
>>> + int gpio;
>>> + int irq;
>>> +
>>> + struct completion completion;
>>> +
>>> + s64 timestamp;
>>> + int temperature;
>>> + int humidity;
>>> +
>>> + /* num_edges: -1 means "no transmission in progress" */
>>> + int num_edges;
>>> + struct {s64 ts; int value; } edges[DHT11_EDGES_PER_READ];
>>> +};
>>> +
>> This isn't called anywhere and so should be removed from the driver.
>
> I will do so, if you think it's more apropriate. I figured that
> commenting it out is like removing but retaining a useful comment.
> Maybe prefix the whole comment with asterix to make it more obvious
> this actually is a comment?
>
>>> +/*
>>> + * dht11_edges_print: show the data as actually received by the
>>> + * driver.
>>> + * This is dead code, keeping it for now just in case somebody needs
>>> + * it for porting the driver to new sensor HW, etc.
>>> + *
>>> +static void dht11_edges_print(struct dht11_gpio *dht11)
>>> +{
>>> + int i;
>>> +
>>> + for (i = 1; i < dht11->num_edges; ++i) {
>>> + pr_err("dht11-gpio: %d: %lld ns %s\n", i,
>>> + dht11->edges[i].ts - dht11->edges[i-1].ts,
>>> + dht11->edges[i-1].value ? "high" : "low");
>>> + }
>>> +}
>>> +*/
>> ...
>
>
>
>>> +static const struct of_device_id dht11_gpio_dt_ids[] = {
>>> + { .compatible = "dht11-gpio", },
>>> + { }
>>> +};
>>> +MODULE_DEVICE_TABLE(of, dht11_gpio_dt_ids);
>>> +
>>> +static int dht11_gpio_probe(struct platform_device *pdev)
>>> +{
>>> + struct device *dev = &pdev->dev;
>>> + struct device_node *node = dev->of_node;
>>> + struct dht11_gpio *dht11;
>>> + struct iio_dev *iio;
>>> + int ret;
>>> +
>>> + iio = devm_iio_device_alloc(dev, sizeof(*dht11));
>>> + if (!iio) {
>>> + dev_err(dev, "Failed to allocate IIO device\n");
>>> + return -ENOMEM;
>>> + }
>>> +
>>> + dht11 = iio_priv(iio);
>>> + dht11->dev = dev;
>>> +
>>> + dht11->gpio = ret = of_get_gpio(node, 0);
>>> + if (ret < 0)
>>> + return ret;
>>> + ret = devm_gpio_request_one(dev, dht11->gpio, GPIOF_IN, pdev->name);
>>> + if (ret)
>>> + return ret;
>>> +
>>> + dht11->irq = gpio_to_irq(dht11->gpio);
>>> + if (dht11->irq < 0) {
>>> + dev_err(dev, "GPIO %d has no interrupt\n", dht11->gpio);
>>> + return -EINVAL;
>>> + }
>>> + ret = devm_request_irq(dev, dht11->irq, dht11_gpio_handle_irq,
>>> + IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
>>> + pdev->name, iio);
>>> + if (ret)
>>> + return ret;
>>> +
>>> + dht11->timestamp = iio_get_time_ns() - DHT11_DATA_VALID_TIME - 1;
>>> + dht11->num_edges = -1;
>>> +
>>> + platform_set_drvdata(pdev, iio);
>>> +
>>> + init_completion(&dht11->completion);
>>> + iio->name = pdev->name;
>>> + iio->dev.parent = &pdev->dev;
>>> + iio->info = &dht11_gpio_iio_info;
>>> + iio->modes = INDIO_DIRECT_MODE;
>>> + iio->channels = dht11_gpio_chan_spec;
>>> + iio->num_channels = ARRAY_SIZE(dht11_gpio_chan_spec);
>>> +
>>> + return iio_device_register(iio);
>>> +}
>>> +
>>
>> Could use the new devm_iio_device_register() call and drop
>> this boilerplate.
>
> Yes, I'll send a v3 with this after the other issues are sorted
> out.
>
> Thanks,
> Harald
>
>>> +static int dht11_gpio_remove(struct platform_device *pdev)
>>> +{
>>> + struct iio_dev *iio = platform_get_drvdata(pdev);
>>> +
>>> + iio_device_unregister(iio);
>>> +
>>> + return 0;
>>> +}
>>> +
>>> +static struct platform_driver dht11_gpio_driver = {
>>> + .driver = {
>>> + .name = DRIVER_NAME,
>>> + .owner = THIS_MODULE,
>>> + .of_match_table = dht11_gpio_dt_ids,
>>> + },
>>> + .probe = dht11_gpio_probe,
>>> + .remove = dht11_gpio_remove,
>>> +};
>>> +
>>> +module_platform_driver(dht11_gpio_driver);
>>> +
>>> +MODULE_AUTHOR("Harald Geyer <[email protected]>");
>>> +MODULE_DESCRIPTION("DHT11 humidity/temperature sensor driver");
>>> +MODULE_LICENSE("GPL v2");
>>> +
>>>
>> --
>> To unsubscribe from this list: send the line "unsubscribe linux-iio" in
>> the body of a message to [email protected]
>> More majordomo info at http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html