Hi Linus,

just wanted to check on the status of this patch?

        Thanks,
        Sören

On Thu, 2014-09-04 at 10:58AM -0700, Soren Brinkmann wrote:
> Add an attribute 'wakeup' to the GPIO sysfs interface which allows
> marking/unmarking a GPIO as wake IRQ.
> The file 'wakeup' is created in each exported GPIOs directory, if an IRQ
> is associated with that GPIO and the irqchip implements set_wake().
> Writing 'enabled' to that file will enable wake for that GPIO, while
> writing 'disabled' will disable wake.
> Reading that file will return either 'disabled' or 'enabled' depening on
> the currently set flag for the GPIO's IRQ.
> 
> Signed-off-by: Soren Brinkmann <soren.brinkm...@xilinx.com>
> ---
> Hi all,
> 
> I originally submitted this patch with a few fixes for Zynq's GPIO driver
> (https://lkml.org/lkml/2014/8/29/391). Since this change is not just
> Zynq-related and has broader impact, Linus asked me to post this again, 
> separate
> from the Zynq series.
> 
> Let me just quote myself from the original submission:
> "I'm still not fully convinced that the gpio_keys are the best
> replacement for the sysfs interface when it comes to inputs. For that
> reason and to have a way to do some quick wake testing, I'd like to
> propose adding the ability to control wake through the sysfs interface
> (patch 3)."
> 
>       Thanks,
>       Sören
> 
>  drivers/gpio/gpiolib-sysfs.c | 75 
> ++++++++++++++++++++++++++++++++++++++++----
>  1 file changed, 69 insertions(+), 6 deletions(-)
> 
> diff --git a/drivers/gpio/gpiolib-sysfs.c b/drivers/gpio/gpiolib-sysfs.c
> index 5f2150b619a7..aaf021eaaff5 100644
> --- a/drivers/gpio/gpiolib-sysfs.c
> +++ b/drivers/gpio/gpiolib-sysfs.c
> @@ -286,6 +286,56 @@ found:
>  
>  static DEVICE_ATTR(edge, 0644, gpio_edge_show, gpio_edge_store);
>  
> +static ssize_t gpio_wakeup_show(struct device *dev,
> +             struct device_attribute *attr, char *buf)
> +{
> +     ssize_t                 status;
> +     const struct gpio_desc  *desc = dev_get_drvdata(dev);
> +     int                     irq = gpiod_to_irq(desc);
> +     struct irq_desc         *irq_desc = irq_to_desc(irq);
> +
> +     mutex_lock(&sysfs_lock);
> +
> +     if (irqd_is_wakeup_set(&irq_desc->irq_data))
> +             status = sprintf(buf, "enabled\n");
> +     else
> +             status = sprintf(buf, "disabled\n");
> +
> +     mutex_unlock(&sysfs_lock);
> +
> +     return status;
> +}
> +
> +static ssize_t gpio_wakeup_store(struct device *dev,
> +             struct device_attribute *attr, const char *buf, size_t size)
> +{
> +     int                     ret;
> +     unsigned int            on;
> +     struct gpio_desc        *desc = dev_get_drvdata(dev);
> +     int                     irq = gpiod_to_irq(desc);
> +
> +     mutex_lock(&sysfs_lock);
> +
> +     if (sysfs_streq("enabled", buf))
> +             on = true;
> +     else if (sysfs_streq("disabled", buf))
> +             on = false;
> +     else
> +             return -EINVAL;
> +
> +     ret = irq_set_irq_wake(irq, on);
> +
> +     mutex_unlock(&sysfs_lock);
> +
> +     if (ret)
> +             pr_warn("%s: failed to %s wake\n", __func__,
> +                             on ? "enable" : "disable");
> +
> +     return size;
> +}
> +
> +static DEVICE_ATTR(wakeup, 0644, gpio_wakeup_show, gpio_wakeup_store);
> +
>  static int sysfs_set_active_low(struct gpio_desc *desc, struct device *dev,
>                               int value)
>  {
> @@ -526,7 +576,7 @@ static struct class gpio_class = {
>  int gpiod_export(struct gpio_desc *desc, bool direction_may_change)
>  {
>       unsigned long           flags;
> -     int                     status;
> +     int                     status, irq;
>       const char              *ioname = NULL;
>       struct device           *dev;
>       int                     offset;
> @@ -582,11 +632,24 @@ int gpiod_export(struct gpio_desc *desc, bool 
> direction_may_change)
>                       goto fail_unregister_device;
>       }
>  
> -     if (gpiod_to_irq(desc) >= 0 && (direction_may_change ||
> -                                    !test_bit(FLAG_IS_OUT, &desc->flags))) {
> -             status = device_create_file(dev, &dev_attr_edge);
> -             if (status)
> -                     goto fail_unregister_device;
> +     irq = gpiod_to_irq(desc);
> +     if (irq >= 0) {
> +             struct irq_desc *irq_desc = irq_to_desc(irq);
> +             struct irq_chip *irqchip = irq_desc_get_chip(irq_desc);
> +
> +             if (direction_may_change ||
> +                             !test_bit(FLAG_IS_OUT, &desc->flags)) {
> +                     status = device_create_file(dev, &dev_attr_edge);
> +                     if (status)
> +                             goto fail_unregister_device;
> +             }
> +
> +             if (irqchip->flags & IRQCHIP_SKIP_SET_WAKE ||
> +                             irqchip->irq_set_wake) {
> +                     status = device_create_file(dev, &dev_attr_wakeup);
> +                     if (status)
> +                             goto fail_unregister_device;
> +             }
>       }
>  
>       set_bit(FLAG_EXPORT, &desc->flags);
> -- 
> 2.1.0.1.g27b9230
> 
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to