All of lore.kernel.org
 help / color / mirror / Atom feed
From: Andy Shevchenko <andy.shevchenko@gmail.com>
To: Mauri Sandberg <maukka@ext.kapsi.fi>
Cc: Mauri Sandberg <sandberg@mailfence.com>,
	Bartosz Golaszewski <bgolaszewski@baylibre.com>,
	Geert Uytterhoeven <geert+renesas@glider.be>,
	Linus Walleij <linus.walleij@linaro.org>,
	"open list:GPIO SUBSYSTEM" <linux-gpio@vger.kernel.org>,
	Rob Herring <robh+dt@kernel.org>,
	devicetree <devicetree@vger.kernel.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Drew Fustini <drew@beagleboard.org>
Subject: Re: [PATCH v7 2/2] gpio: gpio-cascade: add generic GPIO cascade
Date: Mon, 25 Oct 2021 12:29:31 +0300	[thread overview]
Message-ID: <CAHp75VfKcS1eRRBypjkQG2D3QiFHOae9Ub1VcT=Mopt2wDAztg@mail.gmail.com> (raw)
In-Reply-To: <20211019200831.3817-3-maukka@ext.kapsi.fi>

On Tue, Oct 19, 2021 at 11:10 PM Mauri Sandberg <maukka@ext.kapsi.fi> wrote:
>
> Adds support for building cascades of GPIO lines. That is, it allows
> setups when there is one upstream line and multiple cascaded lines, out
> of which one can be chosen at a time. The status of the upstream line
> can be conveyed to the selected cascaded line or, vice versa, the status
> of the cascaded line can be conveyed to the upstream line.
>
> A multiplexer is being used to select, which cascaded GPIO line is being
> used at any given time.
>
> At the moment only input direction is supported. In future it should be
> possible to add support for output direction, too.

A nit-pick below and you may have my
Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>

> Signed-off-by: Mauri Sandberg <maukka@ext.kapsi.fi>
> ---
> v6 -> v7:
>  - In Kconfig add info about module name
>  - adhere to new convention that allows lines longer than 80 chars
>  - use dev_probe_err with upstream gpio line too
>  - refactor for cleaner exit of probe function.
> v5 -> v6:
>  - In Kconfig, remove dependency to OF_GPIO and select only MULTIPLEXER
>  - refactor code preferring one-liners
>  - clean up prints, removing them from success-path.
>  - don't explicitly set gpio_chip.of_node as it's done in the GPIO library
>  - use devm_gpiochip_add_data instead of gpiochip_add
> v4 -> v5:
>  - renamed gpio-mux-input -> gpio-cascade. refactored code accordingly
>    here and there and changed to use new bindings and compatible string
>    - ambigious and vague 'pin' was rename to 'upstream_line'
>  - dropped Tested-by and Reviewed-by due to changes in bindings
>  - dropped Reported-by suggested by an automatic bot as it was not really
>    appropriate to begin with
>  - functionally it's the same as v4
> v3 -> v4:
>  - Changed author email
>  - Included Tested-by and Reviewed-by from Drew
> v2 -> v3:
>  - use managed device resources
>  - update Kconfig description
> v1 -> v2:
>  - removed .owner from platform_driver as per test bot's instruction
>  - added MODULE_AUTHOR, MODULE_DESCRIPTION, MODULE_LICENSE
>  - added gpio_mux_input_get_direction as it's recommended for all chips
>  - removed because this is input only chip: gpio_mux_input_set_value
>  - removed because they are not needed for input/output only chips:
>      gpio_mux_input_direction_input
>      gpio_mux_input_direction_output
>  - fixed typo in an error message
>  - added info message about successful registration
>  - removed can_sleep flag as this does not sleep while getting GPIO value
>    like I2C or SPI do
>  - Updated description in Kconfig
> ---
>  drivers/gpio/Kconfig        |  15 +++++
>  drivers/gpio/Makefile       |   1 +
>  drivers/gpio/gpio-cascade.c | 118 ++++++++++++++++++++++++++++++++++++
>  3 files changed, 134 insertions(+)
>  create mode 100644 drivers/gpio/gpio-cascade.c
>
> diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig
> index 37a6f77c86fe..e69457144459 100644
> --- a/drivers/gpio/Kconfig
> +++ b/drivers/gpio/Kconfig
> @@ -1694,4 +1694,19 @@ config GPIO_VIRTIO
>
>  endmenu
>
> +comment "Other GPIO expanders"
> +
> +config GPIO_CASCADE
> +       tristate "General GPIO cascade"
> +       select MULTIPLEXER
> +       help
> +         Say yes here to enable support for generic GPIO cascade.
> +
> +         This allows building one-to-many cascades of GPIO lines using
> +         different types of multiplexers readily available. At the
> +         moment only input lines are supported.
> +
> +         To build the driver as a module choose 'm' and the resulting module
> +         will be called 'gpio-cascade'.
> +
>  endif
> diff --git a/drivers/gpio/Makefile b/drivers/gpio/Makefile
> index 71ee9fc2ff83..e8945456e7ea 100644
> --- a/drivers/gpio/Makefile
> +++ b/drivers/gpio/Makefile
> @@ -45,6 +45,7 @@ obj-$(CONFIG_GPIO_BD9571MWV)          += gpio-bd9571mwv.o
>  obj-$(CONFIG_GPIO_BRCMSTB)             += gpio-brcmstb.o
>  obj-$(CONFIG_GPIO_BT8XX)               += gpio-bt8xx.o
>  obj-$(CONFIG_GPIO_CADENCE)             += gpio-cadence.o
> +obj-$(CONFIG_GPIO_CASCADE)             += gpio-cascade.o
>  obj-$(CONFIG_GPIO_CLPS711X)            += gpio-clps711x.o
>  obj-$(CONFIG_GPIO_SNPS_CREG)           += gpio-creg-snps.o
>  obj-$(CONFIG_GPIO_CRYSTAL_COVE)                += gpio-crystalcove.o
> diff --git a/drivers/gpio/gpio-cascade.c b/drivers/gpio/gpio-cascade.c
> new file mode 100644
> index 000000000000..82001299265e
> --- /dev/null
> +++ b/drivers/gpio/gpio-cascade.c
> @@ -0,0 +1,118 @@
> +// SPDX-License-Identifier: GPL-2.0-only
> +/*
> + *  A generic GPIO cascade driver
> + *
> + *  Copyright (C) 2021 Mauri Sandberg <maukka@ext.kapsi.fi>
> + *
> + * This allows building cascades of GPIO lines in a manner illustrated
> + * below:
> + *
> + *                 /|---- Cascaded GPIO line 0
> + *  Upstream      | |---- Cascaded GPIO line 1
> + *  GPIO line ----+ | .
> + *                | | .
> + *                 \|---- Cascaded GPIO line n
> + *
> + * A gpio-mux is being used to select, which cascaded line is being
> + * addressed at any given time.
> + *
> + * At the moment only input mode is supported due to lack of means for
> + * testing output functionality. At least theoretically output should be
> + * possible with an open drain constructions.
> + */
> +
> +#include <linux/module.h>
> +#include <linux/slab.h>
> +#include <linux/platform_device.h>
> +#include <linux/mux/consumer.h>
> +
> +#include <linux/gpio/consumer.h>
> +#include <linux/gpio/driver.h>
> +
> +struct gpio_cascade {

> +       struct device           *parent;
> +       struct gpio_chip        gpio_chip;

Make the gpio_chip first and any container_of become a no-op at compile time!

> +       struct mux_control      *mux_control;
> +       struct gpio_desc        *upstream_line;
> +};
> +
> +static struct gpio_cascade *chip_to_cascade(struct gpio_chip *gc)
> +{
> +       return container_of(gc, struct gpio_cascade, gpio_chip);
> +}
> +
> +static int gpio_cascade_get_direction(struct gpio_chip *gc,
> +                                       unsigned int offset)
> +{
> +       return GPIO_LINE_DIRECTION_IN;
> +}
> +
> +static int gpio_cascade_get_value(struct gpio_chip *gc, unsigned int offset)
> +{
> +       struct gpio_cascade *cas = chip_to_cascade(gc);
> +       int ret;
> +
> +       ret = mux_control_select(cas->mux_control, offset);
> +       if (ret)
> +               return ret;
> +
> +       ret = gpiod_get_value(cas->upstream_line);
> +       mux_control_deselect(cas->mux_control);
> +       return ret;
> +}
> +
> +static int gpio_cascade_probe(struct platform_device *pdev)
> +{
> +       struct device *dev = &pdev->dev;
> +       struct gpio_cascade *cas;
> +       struct mux_control *mc;
> +       struct gpio_desc *upstream;
> +       struct gpio_chip *gc;
> +
> +       cas = devm_kzalloc(dev, sizeof(*cas), GFP_KERNEL);
> +       if (!cas)
> +               return -ENOMEM;
> +
> +       mc = devm_mux_control_get(dev, NULL);
> +       if (IS_ERR(mc))
> +               return dev_err_probe(dev, PTR_ERR(mc), "unable to get mux-control\n");
> +
> +       cas->mux_control = mc;
> +       upstream = devm_gpiod_get(dev, "upstream",  GPIOD_IN);
> +       if (IS_ERR(upstream))
> +               return dev_err_probe(dev, PTR_ERR(upstream), "unable to claim upstream GPIO line\n");
> +
> +       cas->upstream_line = upstream;
> +       cas->parent = dev;
> +
> +       gc = &cas->gpio_chip;
> +       gc->get = gpio_cascade_get_value;
> +       gc->get_direction = gpio_cascade_get_direction;
> +       gc->base = -1;
> +       gc->ngpio = mux_control_states(mc);
> +       gc->label = dev_name(cas->parent);
> +       gc->parent = cas->parent;
> +       gc->owner = THIS_MODULE;
> +
> +       platform_set_drvdata(pdev, cas);
> +       return devm_gpiochip_add_data(dev, &cas->gpio_chip, NULL);
> +}
> +
> +static const struct of_device_id gpio_cascade_id[] = {
> +       { .compatible = "gpio-cascade" },
> +       { /* sentinel */ }
> +};
> +MODULE_DEVICE_TABLE(of, gpio_cascade_id);
> +
> +static struct platform_driver gpio_cascade_driver = {
> +       .driver = {
> +               .name           = "gpio-cascade",
> +               .of_match_table = gpio_cascade_id,
> +       },
> +       .probe  = gpio_cascade_probe,
> +};
> +module_platform_driver(gpio_cascade_driver);
> +
> +MODULE_AUTHOR("Mauri Sandberg <maukka@ext.kapsi.fi>");
> +MODULE_DESCRIPTION("Generic GPIO cascade");
> +MODULE_LICENSE("GPL");
> --
> 2.25.1
>


-- 
With Best Regards,
Andy Shevchenko

  parent reply	other threads:[~2021-10-25  9:30 UTC|newest]

Thread overview: 62+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-03-25 12:28 [RFC gpio/for-next 0/2] gpio: add generic gpio input multiplexer Mauri Sandberg
2021-03-25 12:28 ` [RFC gpio/for-next 1/2] dt-bindings: gpio-mux-input: add documentation Mauri Sandberg
2021-03-25 12:28 ` [RFC gpio/for-next 2/2] gpio: gpio-mux-input: add generic gpio input multiplexer Mauri Sandberg
2021-03-25 23:08   ` kernel test robot
2021-03-25 23:08   ` [PATCH] gpio: gpio-mux-input: fix platform_no_drv_owner.cocci warnings kernel test robot
2021-03-26  6:59   ` [RFC gpio/for-next 2/2] gpio: gpio-mux-input: add generic gpio input multiplexer Drew Fustini
2021-03-26 10:32     ` Mauri Sandberg
2021-03-26 10:49       ` Andy Shevchenko
2021-03-29 13:57 ` [RFC v2 0/2] gpio: " Mauri Sandberg
2021-03-29 13:57   ` [RFC v2 1/2] dt-bindings: gpio-mux-input: add documentation Mauri Sandberg
2021-03-29 13:57   ` [RFC v2 2/2] gpio: gpio-mux-input: add generic gpio input multiplexer Mauri Sandberg
2021-05-17 16:58 ` [PATCH v3 0/2] gpio: " Mauri Sandberg
2021-05-17 16:58   ` [PATCH v3 1/2] dt-bindings: gpio-mux-input: add documentation Mauri Sandberg
2021-05-17 16:58   ` [PATCH v3 2/2] gpio: gpio-mux-input: add generic gpio input multiplexer Mauri Sandberg
2021-05-17 22:13   ` [PATCH v3 0/2] gpio: " Drew Fustini
2021-05-28  0:23     ` Linus Walleij
2021-05-28  0:27       ` Drew Fustini
2021-05-24 21:25   ` Drew Fustini
2021-05-24 16:29 ` RESEND PATCH v3 Mauri Sandberg
2021-05-24 16:29   ` [PATCH v3 1/2] dt-bindings: gpio-mux-input: add documentation Mauri Sandberg
2021-05-24 16:29   ` [PATCH v3 2/2] gpio: gpio-mux-input: add generic gpio input multiplexer Mauri Sandberg
2021-05-24 21:29   ` RESEND PATCH v3 Drew Fustini
2021-05-30 16:13 ` [PATCH v4 0/2] gpio: add generic gpio input multiplexer Mauri Sandberg
2021-05-30 16:13   ` [PATCH v4 1/2] dt-bindings: gpio-mux-input: add documentation Mauri Sandberg
2021-06-01 10:10     ` Linus Walleij
2021-06-01 10:44     ` Linus Walleij
2021-06-02  9:31       ` Mauri Sandberg
2021-06-02 10:35         ` Linus Walleij
2021-06-02 11:21           ` Mauri Sandberg
2021-06-04  7:51             ` Linus Walleij
2021-06-01 13:32     ` Rob Herring
2021-06-02 11:36       ` Mauri Sandberg
2021-05-30 16:13   ` [PATCH v4 2/2] gpio: gpio-mux-input: add generic gpio input multiplexer Mauri Sandberg
2021-05-30 18:09     ` Andy Shevchenko
2021-05-30 19:02       ` Mauri Sandberg
2021-05-30 19:38         ` Andy Shevchenko
2021-05-31 10:19           ` Mauri Sandberg
2021-06-01 10:38     ` Linus Walleij
2021-06-21 17:20 ` [PATCH v5 0/2] gpio: add generic gpio cascade Mauri Sandberg
2021-06-21 17:20   ` [PATCH v5 1/2] dt-bindings: gpio-cascade: add documentation Mauri Sandberg
2021-06-24 18:30     ` Rob Herring
2021-06-21 17:20   ` [PATCH v5 2/2] gpio: gpio-cascade: add generic GPIO cascade Mauri Sandberg
2021-06-21 17:43     ` Andy Shevchenko
2021-06-21 18:31       ` Enrico Weigelt, metux IT consult
2021-10-15 12:56       ` Mauri Sandberg
2021-10-15 17:20         ` Andy Shevchenko
2021-10-19 12:57 ` [PATCH v6 0/2] " Mauri Sandberg
2021-10-19 12:57   ` [PATCH v6 1/2] dt-bindings: gpio-cascade: add documentation Mauri Sandberg
2021-10-19 12:57   ` [PATCH v6 2/2] gpio: gpio-cascade: add generic GPIO cascade Mauri Sandberg
2021-10-19 13:12     ` Andy Shevchenko
2021-10-19 20:08 ` [PATCH v7 0/2] " Mauri Sandberg
2021-10-19 20:08   ` [PATCH v7 1/2] dt-bindings: gpio-cascade: add documentation Mauri Sandberg
2021-10-24 22:18     ` Linus Walleij
2021-10-19 20:08   ` [PATCH v7 2/2] gpio: gpio-cascade: add generic GPIO cascade Mauri Sandberg
2021-10-24 22:17     ` Linus Walleij
2021-10-25  9:29     ` Andy Shevchenko [this message]
2021-10-26 19:15 ` [PATCH v8 0/2] " Mauri Sandberg
2021-10-26 19:15   ` [PATCH v8 1/2] dt-bindings: gpio-cascade: add documentation Mauri Sandberg
2021-10-26 19:15   ` [PATCH v8 2/2] gpio: gpio-cascade: add generic GPIO cascade Mauri Sandberg
2022-02-05 21:59 ` [RESEND v8 0/2] " Mauri Sandberg
2022-02-05 21:59   ` [RESEND v8 1/2] dt-bindings: gpio-cascade: add documentation Mauri Sandberg
2022-02-05 21:59   ` [RESEND v8 2/2] gpio: gpio-cascade: add generic GPIO cascade Mauri Sandberg

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='CAHp75VfKcS1eRRBypjkQG2D3QiFHOae9Ub1VcT=Mopt2wDAztg@mail.gmail.com' \
    --to=andy.shevchenko@gmail.com \
    --cc=bgolaszewski@baylibre.com \
    --cc=devicetree@vger.kernel.org \
    --cc=drew@beagleboard.org \
    --cc=geert+renesas@glider.be \
    --cc=linus.walleij@linaro.org \
    --cc=linux-gpio@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=maukka@ext.kapsi.fi \
    --cc=robh+dt@kernel.org \
    --cc=sandberg@mailfence.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.