From patchwork Thu Nov 7 13:00:05 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Klinger X-Patchwork-Id: 11232763 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 4DE68139A for ; Thu, 7 Nov 2019 13:02:16 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 3682321D6C for ; Thu, 7 Nov 2019 13:02:16 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2388442AbfKGNCN (ORCPT ); Thu, 7 Nov 2019 08:02:13 -0500 Received: from mout.kundenserver.de ([212.227.17.24]:58211 "EHLO mout.kundenserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726873AbfKGNCM (ORCPT ); Thu, 7 Nov 2019 08:02:12 -0500 Received: from localhost ([46.78.193.225]) by mrelayeu.kundenserver.de (mreue109 [212.227.15.183]) with ESMTPSA (Nemesis) id 1M3DBb-1iU4q23Lif-003eaF; Thu, 07 Nov 2019 14:00:08 +0100 Date: Thu, 7 Nov 2019 14:00:05 +0100 From: Andreas Klinger To: robh+dt@kernel.org, jic23@kernel.org, mark.rutland@arm.com Cc: mripard@kernel.org, shawnguo@kernel.org, heiko@sntech.de, icenowy@aosc.io, laurent.pinchart@ideasonboard.com, knaack.h@gmx.de, lars@metafoo.de, pmeerw@pmeerw.net, gregkh@linuxfoundation.org, christophe.jaillet@wanadoo.fr, tglx@linutronix.de, mchehab+samsung@kernel.org, davem@davemloft.net, paulmck@linux.ibm.com, devicetree@vger.kernel.org, linux-iio@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH 1/5] dt-bindings: add vendor prefix parallax Message-ID: <20191107130003.m6ul3klzmv2g2sbd@arbad> MIME-Version: 1.0 Content-Disposition: inline User-Agent: NeoMutt/20170113 (1.7.2) X-Provags-ID: V03:K1:C8IX4KdRmZEk6Z1ftKghKP5WhDeC1HAho2hptIwhg03itfX28K5 lc5HmJpLEkeM6YsYzsdC+yQbqlHpPqsnG52s/6txbNzsFteh96kfsJ9xthD+ey6/ykNbwSu QzDqp92HVmdqOPiXaJR22TewJPtzaY7EIOAIpm7B6e+62n9CJv+LXUNtxHyUb8cH4sJtEWW /elcDwQ70aljywhAYF+1g== X-Spam-Flag: NO X-UI-Out-Filterresults: notjunk:1;V03:K0:ITQGoTZy2B4=:tzABNfQqv5gz/B7DJ+4lOn IQKJwWy2x3whNLzk0E+i3VTumuWdeA6FYk17ZHZj4NYGC0M1v6CYu5OvitKJvGj2AwLkA3xEG 7TjsNwvNfUdK1/4YFoTrZ/wGeleqZv84LVZZEBhICgdEdOJzLxTaUgxGZS9QEmlTP49yHoY05 swSKIp4vGYeJvJxOI5XPunIVFNnENMM71cPh6xo9flo1/dPDLZWRrynsT543mvw1XJqlz02Hw K1QTDfUVfcIPP7LsVqRvZiLEEOB62nWGyxaf60wBZx2FOtwr+8c/kRIMMqHWk/zXZqF//zipc jKB5kE4MkR3zEMCZidBqlI0nAfNhu7EzomO9mliH9XgxREi6mT+4ACrymsEevtEctrIpIdlxP b9++PCKLXa2p4WeWs76emn0bo42SeiRz/pUvGMt1FfUsVE/dEt/ypWDPkn2N4zAhsgc3sEoBO yEhLOXgvAfxjjRemm3LR/kuNfWHwvbjRR8o5XBpbtm+TxXPdbVsJlGovLSrRcanjIVJvWOa3I Zadh3DPHz6QL1a+5artch818Gify7IuLyduZAD/NHBU9MJwd/w5ZAld220/mqjeyNHWc55yhx 2vWn6DHMobtlMeThS31PErW+BPC0PmcqTAeZ1XjyqvRpvEv9ywKUEpr6e46PIMd0WcjrI/QiF XHctthFnuIxVz8qyhKboNgiP3qTou5wXaXn51llPkBMXh70aDHpo3a37UcXKzoRFOAeWNOcpb KL4JvNiFLkoQRq52sZw44mHGYFB0wAPCboBoOWDG7e3gzWg2K1yH0Wj8HmXnxYg9nschN8rtM ykbJ+MPdvEtLTyHGHQ5iqAHYeplO07NEbPkx577jkwEEMijIwJ2zdNg5aAyHHYcjeAtzLfifx Za3OoghaosvGOrkEV7lA== Sender: linux-iio-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-iio@vger.kernel.org Add new vendor prefix parallax for newly created ping iio sensors. Signed-off-by: Andreas Klinger Acked-by: Rob Herring --- Documentation/devicetree/bindings/vendor-prefixes.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Documentation/devicetree/bindings/vendor-prefixes.yaml b/Documentation/devicetree/bindings/vendor-prefixes.yaml index 967e78c5ec0a..d3f9690e1e4b 100644 --- a/Documentation/devicetree/bindings/vendor-prefixes.yaml +++ b/Documentation/devicetree/bindings/vendor-prefixes.yaml @@ -713,6 +713,8 @@ patternProperties: description: Panasonic Corporation "^parade,.*": description: Parade Technologies Inc. + "^parallax,.*": + description: Parallax Inc. "^pda,.*": description: Precision Design Associates, Inc. "^pericom,.*": From patchwork Thu Nov 7 13:00:29 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Klinger X-Patchwork-Id: 11232757 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id B9A6B139A for ; Thu, 7 Nov 2019 13:01:18 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id A331221882 for ; Thu, 7 Nov 2019 13:01:18 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2388796AbfKGNBO (ORCPT ); Thu, 7 Nov 2019 08:01:14 -0500 Received: from mout.kundenserver.de ([212.227.17.24]:54703 "EHLO mout.kundenserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726873AbfKGNBO (ORCPT ); Thu, 7 Nov 2019 08:01:14 -0500 Received: from localhost ([46.78.193.225]) by mrelayeu.kundenserver.de (mreue109 [212.227.15.183]) with ESMTPSA (Nemesis) id 1MAfQk-1idk0d0Uye-00B74F; Thu, 07 Nov 2019 14:00:31 +0100 Date: Thu, 7 Nov 2019 14:00:29 +0100 From: Andreas Klinger To: robh+dt@kernel.org, jic23@kernel.org, mark.rutland@arm.com Cc: mripard@kernel.org, shawnguo@kernel.org, heiko@sntech.de, icenowy@aosc.io, laurent.pinchart@ideasonboard.com, knaack.h@gmx.de, lars@metafoo.de, pmeerw@pmeerw.net, gregkh@linuxfoundation.org, christophe.jaillet@wanadoo.fr, tglx@linutronix.de, mchehab+samsung@kernel.org, davem@davemloft.net, paulmck@linux.ibm.com, devicetree@vger.kernel.org, linux-iio@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH 2/5] dt-bindings: add parallax ping sensors Message-ID: <20191107130027.k2uo547xrfiuxgb7@arbad> MIME-Version: 1.0 Content-Disposition: inline User-Agent: NeoMutt/20170113 (1.7.2) X-Provags-ID: V03:K1:U8Bhu4Vf+4KzVDN7o7hwZXPSjh260AOQqJZxXo1LOYq9R7wx45l qnicUAjmKFHfet4tBWVuSROasrooJ/jiN46LNHswEIXeLVnUN7glkp4VpgR/Sn1RYDC7kD9 TevZhF2xS/c0uONj+wFOiWRBuZWSs9TUpXBGGkeNEXqBDONi2jliQKZWPdxalt3+TgYcb39 +0EOWafbZeC+SJC4ELJ9Q== X-Spam-Flag: NO X-UI-Out-Filterresults: notjunk:1;V03:K0:7uSPIhWC6ns=:eGFlqo4N96XxVf0BxSzsKM 9S48F5JPNhf2Zqu1arX8XktQ2tg688u1oGwiLzTZWQPSiUR1s1mre/Zfb0BhbSq5HxTNaiRH2 iOwE4P713IPTnNujXHS7Tvyy+JATPfl8vGZj2N4PKFe0QUE9sCmla7gDWEhx6pwHJzj7HpxJF 4ePuKHdm7oKT5l2uZ+xGBdbbLXRSspZcQ4k1KaXd1hTUcj2it8LgnQAakp3tPIBSFjjM3IIWI jmfcpenTyhMpSc/ofkcEsN94qOxPOTGf04+4UMj1Qimch9QPHsZoOhu4oDFXkcjvHSs6JyLxl Km3oY0UdoNe5Hk9DWOAp4kPwHU/IWEncMUwU53i4uUsPEAJXfrHBX7JIgOl2p7UEAHnFCFayP iaCLi7AMI8YStH/Mr/z+A3f2vT+pDbDAsDIYOrg8SH/SzBFF606CYXkn8SdnG5XiGQxzst5JJ CWGg8YAWmYHloaPhRPGv6z9oaK8s5IZkEUkTrI/Bn/dWa9/8rvndZMLWAEd9RGr/71iuRkThy D2kNS1PkFBGkoTJ+L21/SVtIx3dcOfGBWKU0rUUGx/CJnDsPxA9Ct4JccU2AGeQ4Wl7nggegh ExUzzlyGyqk9DdHi+JK1HsMQHzqfyeMwPenI2T3Y0IdVpQo7T07rF/Zdtx3gTJyBUxos04mxf 3P32st9l0vLARle1URYRjJ5btNRR85j48MZPEVrlSeSoeNktplCPMcNpXL3K3/XZ3e92TxNqk gEAcEBmh8dstwu84DiejN3hM+O+lht7Jlenmlp1ZGKjg5rENWLlp4cTRlzDsSdxMAkvMtTCDx ghKQPadixhSaUSjWzovcPQw3eMTGUsZ4bK6wtapZ2PfLz3fBBt+USdaY0vAi4jF21ZlEE+aBf vSSlAcyCaq0IkZX6fI8g== Sender: linux-iio-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-iio@vger.kernel.org Add dt-bindings for parallax PING))) and LaserPING iio sensors, which are used for measuring distances. Signed-off-by: Andreas Klinger --- .../bindings/iio/proximity/parallax-ping.yaml | 51 ++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 Documentation/devicetree/bindings/iio/proximity/parallax-ping.yaml diff --git a/Documentation/devicetree/bindings/iio/proximity/parallax-ping.yaml b/Documentation/devicetree/bindings/iio/proximity/parallax-ping.yaml new file mode 100644 index 000000000000..ab8dbdf4f04a --- /dev/null +++ b/Documentation/devicetree/bindings/iio/proximity/parallax-ping.yaml @@ -0,0 +1,51 @@ +# SPDX-License-Identifier: GPL-2.0-or-later +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/iio/proximity/parallax-ping.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Parallax PING))) and LaserPING range finder + +maintainers: + - Andreas Klinger + +description: | + Bit-banging driver using one GPIO: + - ping-gpio is raised by the driver to start measurement + - direction of ping-gpio is then switched into input with an interrupt + for receiving distance value as PWM signal + + Specifications about the devices can be found at: + http://parallax.com/sites/default/files/downloads/28041-LaserPING-2m-Rangefinder-Guide.pdf + http://parallax.com/sites/default/files/downloads/28015-PING-Documentation-v1.6.pdf + +properties: + compatible: + enum: + - parallax,ping + - parallax,laserping + + ping-gpios: + description: + Definition of the GPIO for the triggering and echo (output and input) + This GPIO is set for about 5 us by the driver to tell the device it + should initiate the measurement cycle. Afterwards the GPIO is switched + to input direction with an interrupt. The device sets it and the + length of the input signal corresponds to the measured distance. + It needs to be an GPIO which is able to deliver an interrupt because + the time between two interrupts is measured in the driver. + See Documentation/devicetree/bindings/gpio/gpio.txt for information + on how to specify a consumer gpio. + maxItems: 1 + +required: + - compatible + - ping-gpios + +examples: + - | + #include + proximity { + compatible = "parallax,laserping"; + ping-gpios = <&gpio0 26 GPIO_ACTIVE_HIGH>; + }; From patchwork Thu Nov 7 13:00:47 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Andreas Klinger X-Patchwork-Id: 11232759 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 3C46E1599 for ; Thu, 7 Nov 2019 13:01:34 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 12ADD21882 for ; Thu, 7 Nov 2019 13:01:34 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2388905AbfKGNBd convert rfc822-to-8bit (ORCPT ); Thu, 7 Nov 2019 08:01:33 -0500 Received: from mout.kundenserver.de ([217.72.192.73]:42035 "EHLO mout.kundenserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726873AbfKGNBc (ORCPT ); Thu, 7 Nov 2019 08:01:32 -0500 Received: from localhost ([46.78.193.225]) by mrelayeu.kundenserver.de (mreue106 [212.227.15.183]) with ESMTPSA (Nemesis) id 1MUGRh-1iKpTF19U3-00RKXJ; Thu, 07 Nov 2019 14:00:50 +0100 Date: Thu, 7 Nov 2019 14:00:47 +0100 From: Andreas Klinger To: robh+dt@kernel.org, jic23@kernel.org, mark.rutland@arm.com Cc: mripard@kernel.org, shawnguo@kernel.org, heiko@sntech.de, icenowy@aosc.io, laurent.pinchart@ideasonboard.com, knaack.h@gmx.de, lars@metafoo.de, pmeerw@pmeerw.net, gregkh@linuxfoundation.org, christophe.jaillet@wanadoo.fr, tglx@linutronix.de, mchehab+samsung@kernel.org, davem@davemloft.net, paulmck@linux.ibm.com, devicetree@vger.kernel.org, linux-iio@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH 3/5] iio: ping: add parallax ping sensors Message-ID: <20191107130045.rt3ix2atyjd3gekr@arbad> MIME-Version: 1.0 Content-Disposition: inline User-Agent: NeoMutt/20170113 (1.7.2) X-Provags-ID: V03:K1:nXx+Gy3UN403OOAJbCn0F13NiVlK2mTXENSbW1vuRV+JRD/RuaB KoI6bwjpHXI3/KuI5FDvcrNoW1VcJZ2CRg/cC0L0KUi+K/A1quCrpU4fCEd1C1IYTzywUg+ PMMQ8QFXML2k5UbCa56fF0LuzeOYoPG10EoN0pUxD+Q4wVAl5iSfIK1rtHKjvZn5C1kxO8h q0DoNog0QMGUrTPyXVDNw== X-Spam-Flag: NO X-UI-Out-Filterresults: notjunk:1;V03:K0:MUQovN5zwb4=:zL8rZx0R7e2ZEWAesERG6Y UrMkcs8Sp3JGJw6rlZKth1GCmzVEXzExCrXLA2qRSTelwSFm5KSzW5cujKrw01fVp9uRPu3yz rhrD8yFB+LT1dkLhApjcTX69r4F9QOdLrhCRjyzC18rdZECu68J/Es/701geCrOiK5hiegvvE oLNT34QuBsSk2sUP1zk7J3X09kqa2FItcYuJikLjtSySjfSQSAmlcGRK0TkizGw5lJKLprgDU DaQwDvYYvsU86KqhR/MxUYh/Zgg3d57SI/sZ7E8Oytqmq0BOVKxf8fuEOj+x6qFNY3KyZo10M mclkhxMReomAR1Eu6Fc4vZ2R4XR0cKh/5T2pczyCRh28W1qRMfjcOKWfARNyxj58btWcnmBaa ZQ1oQ+FppeCSryADCOctX9Gsyd9XixATmvMsydvmV84x2gRkIjel7t2GvYSWkFMVcLZjj9pYO Vqgx2X5HzWsUbwACWtcwEBYp/3FzMXJHAD2UcNaPr7mmgwFSngTOROh1DeCg8ahO5T2ikHyOA yEgSpHxUWwuKT6eo+LgQ6+EgwtHFB3dR7luEQ1EC+AQDjwz7R0Lcc8uQ8uu43ZBLO4/TAoSq1 8nIosf4RiX0nW5FZHVeJveggOt/RV2DfVTmds74OX+km/IOEj9fFBkOqRAxO5mCxUvC33BNpe EtsAdf2dQCheV/czCPiX7ob3N2Qt9SbjKcmVmrI1ggTxonl3gT9Z4gVtKLkn4qF84GWU8NrQU oygdUGlWkSRlh4YiNY37GwKFfQH6ogTrDTmqs1vCHyaVj87B9Fo8kiklGorvXUYvZCq05t2JD Ki4S1XG2je8Nn+RNWurNPnPjI8bw/+v3T3l/4KOtP2K0iuFCZlbRlpQpOPPffKGMAitPizA0A HL3KBZ4rHbQTdG/3ib9w== Sender: linux-iio-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-iio@vger.kernel.org add support for parallax ping and laser ping sensors with just one pin for trigger and echo signal. This driver is based on srf04. In contrast to it it's necessary to change direction of the pin and to request the irq just for the period when the echo is rising and falling. Because this adds a lot of cases there is this individual driver for handling this type of sensors. Signed-off-by: Andreas Klinger --- drivers/iio/proximity/ping.c | 336 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 336 insertions(+) create mode 100644 drivers/iio/proximity/ping.c diff --git a/drivers/iio/proximity/ping.c b/drivers/iio/proximity/ping.c new file mode 100644 index 000000000000..1a1fbb8ab0c2 --- /dev/null +++ b/drivers/iio/proximity/ping.c @@ -0,0 +1,336 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * PING: ultrasonic sensor for distance measuring by using only one GPIOs + * + * Copyright (c) 2019 Andreas Klinger + * + * For details about the devices see: + * http://parallax.com/sites/default/files/downloads/28041-LaserPING-2m-Rangefinder-Guide.pdf + * http://parallax.com/sites/default/files/downloads/28015-PING-Documentation-v1.6.pdf + * + * the measurement cycle as timing diagram looks like: + * + * +---+ +------------------------+ + * GPIO | | | | + * ping: --+ +------------+ +---------------- + * ^ ^ ^ ^ + * |<->| interrupt interrupt + * udelay(5) (ts_rising) (ts_falling) + * |<---------------------->| + * . pulse time measured + * . --> one round trip of ultra sonic waves + * . . + * ultra +-+ +-+ +-+ . + * sonic | | | | | | . + * burst: ---------+ +-+ +-+ +----------------------------------------- + * . + * ultra +-+ +-+ +-+ + * sonic | | | | | | + * echo: ----------------------------------+ +-+ +-+ +---------------- + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +struct ping_cfg { + unsigned long trigger_pulse_us; /* length of trigger pulse */ + int laserping_error; /* support error code in */ + /* pulse width of laser */ + /* ping sensors */ + s64 timeout_ns; /* timeout in ns */ +}; + +struct ping_data { + struct device *dev; + struct gpio_desc *gpiod_ping; + struct mutex lock; + int irqnr; + ktime_t ts_rising; + ktime_t ts_falling; + struct completion rising; + struct completion falling; + const struct ping_cfg *cfg; +}; + +static const struct ping_cfg pa_ping_cfg = { + .trigger_pulse_us = 5, + .laserping_error = 0, + .timeout_ns = 18500000, /* 3 meters */ +}; + +static const struct ping_cfg pa_laser_ping_cfg = { + .trigger_pulse_us = 5, + .laserping_error = 1, + .timeout_ns = 15500000, /* 2 meters plus error codes */ +}; + +static irqreturn_t ping_handle_irq(int irq, void *dev_id) +{ + struct iio_dev *indio_dev = dev_id; + struct ping_data *data = iio_priv(indio_dev); + ktime_t now = ktime_get(); + + if (gpiod_get_value(data->gpiod_ping)) { + data->ts_rising = now; + complete(&data->rising); + } else { + data->ts_falling = now; + complete(&data->falling); + } + + return IRQ_HANDLED; +} + +static int ping_read(struct ping_data *data) +{ + int ret; + ktime_t ktime_dt; + s64 dt_ns; + u32 time_ns, distance_mm; + struct platform_device *pdev = container_of(data->dev, + struct platform_device, dev); + struct iio_dev *indio_dev = iio_priv_to_dev(data); + + /* + * just one read-echo-cycle can take place at a time + * ==> lock against concurrent reading calls + */ + mutex_lock(&data->lock); + + reinit_completion(&data->rising); + reinit_completion(&data->falling); + + gpiod_set_value(data->gpiod_ping, 1); + udelay(data->cfg->trigger_pulse_us); + gpiod_set_value(data->gpiod_ping, 0); + + ret = gpiod_direction_input(data->gpiod_ping); + if (ret < 0) { + mutex_unlock(&data->lock); + return ret; + } + + data->irqnr = gpiod_to_irq(data->gpiod_ping); + if (data->irqnr < 0) { + dev_err(data->dev, "gpiod_to_irq: %d\n", data->irqnr); + return data->irqnr; + } + + ret = devm_request_irq(data->dev, data->irqnr, ping_handle_irq, + IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, + pdev->name, indio_dev); + if (ret < 0) { + dev_err(data->dev, "request_irq: %d\n", ret); + return ret; + } + + /* it should not take more than 20 ms until echo is rising */ + ret = wait_for_completion_killable_timeout(&data->rising, HZ/50); + if (ret < 0) + goto err_reset_direction; + else if (ret == 0) { + ret = -ETIMEDOUT; + goto err_reset_direction; + } + + /* it cannot take more than 50 ms until echo is falling */ + ret = wait_for_completion_killable_timeout(&data->falling, HZ/20); + if (ret < 0) + goto err_reset_direction; + else if (ret == 0) { + ret = -ETIMEDOUT; + goto err_reset_direction; + } + + ktime_dt = ktime_sub(data->ts_falling, data->ts_rising); + + free_irq(data->irqnr, indio_dev); + + ret = gpiod_direction_output(data->gpiod_ping, GPIOD_OUT_LOW); + if (ret < 0) { + mutex_unlock(&data->lock); + return ret; + } + + mutex_unlock(&data->lock); + + dt_ns = ktime_to_ns(ktime_dt); + if (dt_ns > data->cfg->timeout_ns) { + dev_dbg(data->dev, "distance out of range: dt=%lldns\n", + dt_ns); + return -EIO; + } + + time_ns = dt_ns; + + /* + * read error code of laser ping sensor and give users chance to + * figure out error by using dynamic debuggging + */ + if (data->cfg->laserping_error) { + if ((time_ns > 12500000) && (time_ns <= 13500000)) { + dev_dbg(data->dev, "target too close or to far\n"); + return -EIO; + } + if ((time_ns > 13500000) && (time_ns <= 14500000)) { + dev_dbg(data->dev, "internal sensor error\n"); + return -EIO; + } + if ((time_ns > 14500000) && (time_ns <= 15500000)) { + dev_dbg(data->dev, "internal sensor timeout\n"); + return -EIO; + } + } + + /* + * the speed as function of the temperature is approximately: + * + * speed = 331,5 + 0,6 * Temp + * with Temp in °C + * and speed in m/s + * + * use 343,5 m/s as ultrasonic speed at 20 °C here in absence of the + * temperature + * + * therefore: + * time 343,5 time * 232 + * distance = ------ * ------- = ------------ + * 10^6 2 1350800 + * with time in ns + * and distance in mm (one way) + * + * because we limit to 3 meters the multiplication with 232 just + * fits into 32 bit + */ + distance_mm = time_ns * 232 / 1350800; + + return distance_mm; + +err_reset_direction: + mutex_unlock(&data->lock); + free_irq(data->irqnr, indio_dev); + + if (gpiod_direction_output(data->gpiod_ping, GPIOD_OUT_LOW)) + dev_dbg(data->dev, "error in gpiod_direction_output\n"); + return ret; +} + +static int ping_read_raw(struct iio_dev *indio_dev, + struct iio_chan_spec const *channel, int *val, + int *val2, long info) +{ + struct ping_data *data = iio_priv(indio_dev); + int ret; + + if (channel->type != IIO_DISTANCE) + return -EINVAL; + + switch (info) { + case IIO_CHAN_INFO_RAW: + ret = ping_read(data); + if (ret < 0) + return ret; + *val = ret; + return IIO_VAL_INT; + case IIO_CHAN_INFO_SCALE: + /* + * maximum resolution in datasheet is 1 mm + * 1 LSB is 1 mm + */ + *val = 0; + *val2 = 1000; + return IIO_VAL_INT_PLUS_MICRO; + default: + return -EINVAL; + } +} + +static const struct iio_info ping_iio_info = { + .read_raw = ping_read_raw, +}; + +static const struct iio_chan_spec ping_chan_spec[] = { + { + .type = IIO_DISTANCE, + .info_mask_separate = + BIT(IIO_CHAN_INFO_RAW) | + BIT(IIO_CHAN_INFO_SCALE), + }, +}; + +static const struct of_device_id of_ping_match[] = { + { .compatible = "parallax,ping", .data = &pa_ping_cfg}, + { .compatible = "parallax,laserping", .data = &pa_ping_cfg}, + {}, +}; + +MODULE_DEVICE_TABLE(of, of_ping_match); + +static int ping_probe(struct platform_device *pdev) +{ + struct device *dev = &pdev->dev; + struct ping_data *data; + struct iio_dev *indio_dev; + + indio_dev = devm_iio_device_alloc(dev, sizeof(struct ping_data)); + if (!indio_dev) { + dev_err(dev, "failed to allocate IIO device\n"); + return -ENOMEM; + } + + data = iio_priv(indio_dev); + data->dev = dev; + data->cfg = of_match_device(of_ping_match, dev)->data; + + mutex_init(&data->lock); + init_completion(&data->rising); + init_completion(&data->falling); + + data->gpiod_ping = devm_gpiod_get(dev, "ping", GPIOD_OUT_LOW); + if (IS_ERR(data->gpiod_ping)) { + dev_err(dev, "failed to get ping-gpios: err=%ld\n", + PTR_ERR(data->gpiod_ping)); + return PTR_ERR(data->gpiod_ping); + } + + if (gpiod_cansleep(data->gpiod_ping)) { + dev_err(data->dev, "cansleep-GPIOs not supported\n"); + return -ENODEV; + } + + platform_set_drvdata(pdev, indio_dev); + + indio_dev->name = "ping"; + indio_dev->dev.parent = &pdev->dev; + indio_dev->info = &ping_iio_info; + indio_dev->modes = INDIO_DIRECT_MODE; + indio_dev->channels = ping_chan_spec; + indio_dev->num_channels = ARRAY_SIZE(ping_chan_spec); + + return devm_iio_device_register(dev, indio_dev); +} + +static struct platform_driver ping_driver = { + .probe = ping_probe, + .driver = { + .name = "ping-gpio", + .of_match_table = of_ping_match, + }, +}; + +module_platform_driver(ping_driver); + +MODULE_AUTHOR("Andreas Klinger "); +MODULE_DESCRIPTION("PING sensors for distance measuring using one GPIOs"); +MODULE_LICENSE("GPL"); +MODULE_ALIAS("platform:ping"); From patchwork Thu Nov 7 13:01:11 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Klinger X-Patchwork-Id: 11232761 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id BE75D139A for ; Thu, 7 Nov 2019 13:01:53 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id A75C520673 for ; Thu, 7 Nov 2019 13:01:53 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2388846AbfKGNBt (ORCPT ); Thu, 7 Nov 2019 08:01:49 -0500 Received: from mout.kundenserver.de ([212.227.17.24]:55149 "EHLO mout.kundenserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726873AbfKGNBt (ORCPT ); Thu, 7 Nov 2019 08:01:49 -0500 Received: from localhost ([46.78.193.225]) by mrelayeu.kundenserver.de (mreue106 [212.227.15.183]) with ESMTPSA (Nemesis) id 1MPoTl-1iGNUE2fiN-00MvAj; Thu, 07 Nov 2019 14:01:17 +0100 Date: Thu, 7 Nov 2019 14:01:11 +0100 From: Andreas Klinger To: robh+dt@kernel.org, jic23@kernel.org, mark.rutland@arm.com Cc: mripard@kernel.org, shawnguo@kernel.org, heiko@sntech.de, icenowy@aosc.io, laurent.pinchart@ideasonboard.com, knaack.h@gmx.de, lars@metafoo.de, pmeerw@pmeerw.net, gregkh@linuxfoundation.org, christophe.jaillet@wanadoo.fr, tglx@linutronix.de, mchehab+samsung@kernel.org, davem@davemloft.net, paulmck@linux.ibm.com, devicetree@vger.kernel.org, linux-iio@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH 4/5] iio: add ping sensors to kernel configuration Message-ID: <20191107130108.p6maggrs2m7va5pf@arbad> MIME-Version: 1.0 Content-Disposition: inline User-Agent: NeoMutt/20170113 (1.7.2) X-Provags-ID: V03:K1:YnPKCWkI+oAHGK0oBCaxn9+OMKi/PZRgpNNf4njdogAkiOtTNnG nIU9ZLRabqjm6ssy5vI3auwnqlfrU4Vnd/LTcJd+DnZd+XYzsCMvCvzSiggzVypuSPsVT2z UYlViD2P9SzwGGn1e4enBckIzmythSqrSHekYYdo9wgWB+dAxNxTlwEeTWN8H5GcV5KFACt XSwoFP3jiNK40N0279tJg== X-Spam-Flag: NO X-UI-Out-Filterresults: notjunk:1;V03:K0:vXoEMobgM+k=:NzkB7c1Kh44XwZRNWoRiRq dCXV8pFhpFi8/S5WW3ZkAOC15NTIb1EEzi2+I+ddhefBe/CZN7jkasMjA01Git3bGUj7ltsYW ni/B1+S1upIOR0++NYhurkvRpbMNKJnrdiIPhATyWBdP84ic/aU1P9mEIPbLfWx5745xR+FNt bue6SIR7DNeT8TmjzZ40RbLw8TYJ63ShDGrPhMzKE7Q/gjNVNYDyN9J2VnFi4tbz5uMYNLQzz NJAffcjXU4+9fKeXh+WddIgC5YcEkz02C9PzzdNA1HrKftGrBaS51LbuR6v7y5Uq5MqZsf40r At/NRRjN8hMjPcqSmNgIFdRJI/ajl/V0qg+NM7ZxSkzmnl3VKMKBr/T4v1PYQa2neYPL3IaRW MPwZAYsN6Gb3okFvkRVud5+83nVcUyWsac7xibNg4sxgmGjno2l/ITavUn1HOCJkcx2WURNli 7VslmVubSyoPp76zrkm1Xwu0JDNY/5rI+kWI2PVRMWDMgYD98NwSaDbSC/idNNpXGA+TSIcZ3 VuCebnFRCZHJ8et2VnGV2vy06xoK9IaxPMygs3ID77nP23G8zUayXVRPfEQZzBFknXOSBreJP +44WsmuRkcWQAcQuvEDsz4Elwl24mMN8UXn6WYiWXb956CIGgDCRylGTDj2BC1+AqR2cJr0qf GAJS8bkM5ZZKDpjXVw5rhfMkKfJJGhkPMl33u7FgnV37aBJ2duY+Gg64JswUXM2hEDGjl2NVb yEHVyaRC1oNI3rp7lzUjeepmG3K8LWrXS7ohNCNqAreoSlq1+kmPmSngnWGegXknJRCeUio/z Hibu8Bu1489U8ddZUDNh/UPncHpyJkQ2mSBADIA+aMUQA4CvE1PfBf1lZpNxhRxvPLHPI/PQP gJOvN57SIs77985jP6vA== Sender: linux-iio-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-iio@vger.kernel.org Add a new configuration variable CONFIG_PING for the newly supported parallax ping sensors. Signed-off-by: Andreas Klinger --- drivers/iio/proximity/Kconfig | 15 +++++++++++++++ drivers/iio/proximity/Makefile | 1 + 2 files changed, 16 insertions(+) diff --git a/drivers/iio/proximity/Kconfig b/drivers/iio/proximity/Kconfig index d53601447da4..37606d400805 100644 --- a/drivers/iio/proximity/Kconfig +++ b/drivers/iio/proximity/Kconfig @@ -58,6 +58,21 @@ config MB1232 To compile this driver as a module, choose M here: the module will be called mb1232. +config PING + tristate "Parallax GPIO bitbanged ranger sensors" + depends on GPIOLIB + help + Say Y here to build a driver for GPIO bitbanged ranger sensors + with just one GPIO for the trigger and echo. This driver can be + used to measure the distance of objects. + + Actually supported are: + - Parallax PING))) (ultrasonic) + - Parallax LaserPING (time-of-flight) + + To compile this driver as a module, choose M here: the + module will be called ping. + config RFD77402 tristate "RFD77402 ToF sensor" depends on I2C diff --git a/drivers/iio/proximity/Makefile b/drivers/iio/proximity/Makefile index 0bb5f9de13d6..c591b019304e 100644 --- a/drivers/iio/proximity/Makefile +++ b/drivers/iio/proximity/Makefile @@ -8,6 +8,7 @@ obj-$(CONFIG_AS3935) += as3935.o obj-$(CONFIG_ISL29501) += isl29501.o obj-$(CONFIG_LIDAR_LITE_V2) += pulsedlight-lidar-lite-v2.o obj-$(CONFIG_MB1232) += mb1232.o +obj-$(CONFIG_PING) += ping.o obj-$(CONFIG_RFD77402) += rfd77402.o obj-$(CONFIG_SRF04) += srf04.o obj-$(CONFIG_SRF08) += srf08.o From patchwork Thu Nov 7 13:02:50 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Klinger X-Patchwork-Id: 11232765 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 1BAC51599 for ; Thu, 7 Nov 2019 13:03:30 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id EC5DB214D8 for ; Thu, 7 Nov 2019 13:03:29 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2388678AbfKGND3 (ORCPT ); Thu, 7 Nov 2019 08:03:29 -0500 Received: from mout.kundenserver.de ([212.227.17.24]:36291 "EHLO mout.kundenserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2388407AbfKGND3 (ORCPT ); Thu, 7 Nov 2019 08:03:29 -0500 Received: from localhost ([46.78.193.225]) by mrelayeu.kundenserver.de (mreue108 [212.227.15.183]) with ESMTPSA (Nemesis) id 1N4yyQ-1hjq0Z1xnY-010xdN; Thu, 07 Nov 2019 14:02:56 +0100 Date: Thu, 7 Nov 2019 14:02:50 +0100 From: Andreas Klinger To: robh+dt@kernel.org, jic23@kernel.org, mark.rutland@arm.com Cc: mripard@kernel.org, shawnguo@kernel.org, heiko@sntech.de, icenowy@aosc.io, laurent.pinchart@ideasonboard.com, knaack.h@gmx.de, lars@metafoo.de, pmeerw@pmeerw.net, gregkh@linuxfoundation.org, christophe.jaillet@wanadoo.fr, tglx@linutronix.de, mchehab+samsung@kernel.org, davem@davemloft.net, paulmck@linux.ibm.com, devicetree@vger.kernel.org, linux-iio@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH 5/5] MAINTAINERS: add maintainer for ping iio sensors Message-ID: <20191107130133.asgoinzne4wpvx2b@arbad> MIME-Version: 1.0 Content-Disposition: inline User-Agent: NeoMutt/20170113 (1.7.2) X-Provags-ID: V03:K1:roj6/uW2rfWs1vtm4BS1f4RBniw3LM9usYRsDw9ryAHb5sWJl6S wR/Sah8Rcd0r+wsmEsrkn2d2o5rnnqutq80WhTuY193F60xRSsRHLKb8bI07jXL8DtNiWEE LJmF00G6+pB0tC+xo6sxWCVC23ZCBPKtdc944ob8BWaK8g7d5hUUidsNV1gnaUe7O8HZ0nq DpGl8DQ6nz7s8E+E4QpbA== X-Spam-Flag: NO X-UI-Out-Filterresults: notjunk:1;V03:K0:A6AJSlv7As8=:AMHdnxsg19HuEiOij2fX2I zM2nuwPtI8vqgqnS5cJaSpofBe5DFIWdKngNtM/+b7J0S1CrcjlTtg0NjxiXpLPQiqr+uC8pj SiBfgYOU7M8lGHXHJ10UzLh5QAkJlFmgGO/iFUGICs+pOTJPxUGhEv5Rmcv9CbnuXw2gjbhLZ 8l/AEn/vSWY7VREHZsc64JbHByRckn4F7SXdidNQUywy0UWSruccymI/oOytR8ETGuznuWYKY L/UGuQSlz5ZW5EKtnt5X+FmL8UMZDwQ9gEGWMMFFQzC3mE7v8hGo4+A/ZAFWwacSZzn+bgvNv rL1GLc4NEENh2claz4z7KJEwHIFO6LjqdpiEjiCFYnKj4+3bxJzbkwLDw987ozjKrvkPxd+Ea j72lJ4m0g+OP1MdIIYlNABHsfHa1UGaUNWLBptZA88Ho7yeuMbujdYYtARBYgtOL5RKQUB/K4 aGizZG06nOdakKT1V18Y6jMtBQq5fgD9GkCdVSx51FeTwzeun673EynwLFBPnbTwDl/V2TtMz AllSnwF6Oe4ejir0MDQZ1kDG2crqJaukkpYsATKLrkYZ54k3zhflFOakCAcuW0oToC2zAjFgE Z9SnliU07qA12xp6sfKxpon/0NOehKQSuvdYeiO7Bgjk9BaxWt3jKYMeM49wy91XM8nYRXHeb aCjuUYJbqpx75ew5DrdHNH6uQJCp0FCLnyX44XFrnQENYk5xoIEmi69gcYCBLPLwL7ihvl7Lv gwiq2uGW1hkf80MWsgKDh53mUsEFyD0xBIQKmT0RYiwZ88FezFaQkEe/0e68RwLhlBrE9deKo 5iaR+hCY0UcmgESdegfoVysg1gMjV5RYe1VFpIcUZ/blYBRn6ucQZsDKto4gKv7Y1KM3yWJ4/ Ssx+MPZ6HxjlxG2Bw28Q== Sender: linux-iio-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-iio@vger.kernel.org Add a maintainer for the new parallax PING))) and LaserPING IIO sensors Signed-off-by: Andreas Klinger --- MAINTAINERS | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/MAINTAINERS b/MAINTAINERS index c6c34d04ce95..ad469adffb99 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -12264,6 +12264,13 @@ L: platform-driver-x86@vger.kernel.org S: Maintained F: drivers/platform/x86/panasonic-laptop.c +PARALLAX PING IIO SENSOR DRIVER +M: Andreas Klinger +L: linux-iio@vger.kernel.org +S: Maintained +F: Documentation/devicetree/bindings/iio/proximity/parallax-ping.yaml +F: drivers/iio/proximity/ping.c + PARALLEL LCD/KEYPAD PANEL DRIVER M: Willy Tarreau M: Ksenija Stanojevic