lkml.org 
[lkml]   [2011]   [Apr]   [11]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v3] leds: provide helper to register "leds-gpio" devices
    Date
    This function makes a deep copy of the platform data to allow it to live
    in init memory.
    The definition cannot go into leds-gpio.c because it needs to be builtin
    to be usable by platforms.

    Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
    ---
    Hello,

    changes since v2:
    - define gpio_led_register_device in a new file (led-register.c)
    - new parameter id for gpio_led_register_device
    - change drivers/Makefile to unconditionally include
    drivers/leds/Makefile

    On Wed, Apr 06, 2011 at 06:38:17AM -0700, Richard Purdie wrote:
    > It should only be built-in on platforms that both use leds-gpio and want
    > to use this function at boot time. This is not the description of
    > leds-core.c.
    >
    > I understand the issue and the desire to move it into common code, I
    > think that is good but I don't think you've found the most appropriate
    > place yet.
    >
    > I'm tempted to suggest making the function a static inline in leds.h (or
    > create an leds-gpio.h and move the struct definition there too).
    I don't like your static inline suggestion but prefer a "select
    SOMETHING" to make the function available. So what about this patch?

    I choosed a generic name led-register.c, maybe in the future some more
    leds want a similar function.

    Best regards
    Uwe

    drivers/Makefile | 2 +-
    drivers/leds/Kconfig | 5 +++++
    drivers/leds/Makefile | 1 +
    drivers/leds/led-register.c | 33 +++++++++++++++++++++++++++++++++
    include/linux/leds.h | 12 ++++++++++++
    5 files changed, 52 insertions(+), 1 deletions(-)
    create mode 100644 drivers/leds/led-register.c

    diff --git a/drivers/Makefile b/drivers/Makefile
    index 3f135b6..4a4f425 100644
    --- a/drivers/Makefile
    +++ b/drivers/Makefile
    @@ -95,7 +95,7 @@ obj-$(CONFIG_CPU_IDLE) += cpuidle/
    obj-$(CONFIG_DMA_ENGINE) += dma/
    obj-$(CONFIG_MMC) += mmc/
    obj-$(CONFIG_MEMSTICK) += memstick/
    -obj-$(CONFIG_NEW_LEDS) += leds/
    +obj-y += leds/
    obj-$(CONFIG_INFINIBAND) += infiniband/
    obj-$(CONFIG_SGI_SN) += sn/
    obj-y += firmware/
    diff --git a/drivers/leds/Kconfig b/drivers/leds/Kconfig
    index 9bec869..e8e101e 100644
    --- a/drivers/leds/Kconfig
    +++ b/drivers/leds/Kconfig
    @@ -14,6 +14,11 @@ config LEDS_CLASS
    This option enables the led sysfs class in /sys/class/leds. You'll
    need this to do anything useful with LEDs. If unsure, say N.

    +config LED_REGISTER_GPIO
    + bool
    + help
    + This option provides the function gpio_led_register_device.
    +
    if NEW_LEDS

    comment "LED drivers"
    diff --git a/drivers/leds/Makefile b/drivers/leds/Makefile
    index 39c80fc..ca428bd 100644
    --- a/drivers/leds/Makefile
    +++ b/drivers/leds/Makefile
    @@ -3,6 +3,7 @@
    obj-$(CONFIG_NEW_LEDS) += led-core.o
    obj-$(CONFIG_LEDS_CLASS) += led-class.o
    obj-$(CONFIG_LEDS_TRIGGERS) += led-triggers.o
    +obj-y += led-register.o

    # LED Platform Drivers
    obj-$(CONFIG_LEDS_88PM860X) += leds-88pm860x.o
    diff --git a/drivers/leds/led-register.c b/drivers/leds/led-register.c
    new file mode 100644
    index 0000000..d3731ea
    --- /dev/null
    +++ b/drivers/leds/led-register.c
    @@ -0,0 +1,33 @@
    +/*
    + * Copyright (C) 2011 Pengutronix
    + * Uwe Kleine-Koenig <u.kleine-koenig@pengutronix.de>
    + *
    + * This program is free software; you can redistribute it and/or modify it under
    + * the terms of the GNU General Public License version 2 as published by the
    + * Free Software Foundation.
    + */
    +#include <linux/err.h>
    +#include <linux/platform_device.h>
    +#include <linux/slab.h>
    +#include <linux/leds.h>
    +
    +#if defined(CONFIG_LED_REGISTER_GPIO)
    +struct platform_device *__init gpio_led_register_device(
    + int id, const struct gpio_led_platform_data *pdata)
    +{
    + struct platform_device *ret;
    + struct gpio_led_platform_data _pdata = *pdata;
    +
    + _pdata.leds = kmemdup(pdata->leds,
    + pdata->num_leds * sizeof(*pdata->leds), GFP_KERNEL);
    + if (!_pdata.leds)
    + return ERR_PTR(-ENOMEM);
    +
    + ret = platform_device_register_resndata(NULL, "leds-gpio", id,
    + NULL, 0, &_pdata, sizeof(_pdata));
    + if (IS_ERR(ret))
    + kfree(_pdata.leds);
    +
    + return ret;
    +}
    +#endif
    diff --git a/include/linux/leds.h b/include/linux/leds.h
    index 61e0340..b20474d 100644
    --- a/include/linux/leds.h
    +++ b/include/linux/leds.h
    @@ -207,5 +207,17 @@ struct gpio_led_platform_data {
    unsigned long *delay_off);
    };

    +/**
    + * gpio_led_register_device - register a gpio-led device
    + * @pdata: the platform data used for the new device
    + *
    + * Use this function instead of platform_device_add()ing a static struct
    + * platform_device.
    + *
    + * Note: as pdata and pdata->leds is copied these usually can and should be
    + * __initdata.
    + */
    +struct platform_device *gpio_led_register_device(
    + int id, const struct gpio_led_platform_data *pdata);

    #endif /* __LINUX_LEDS_H_INCLUDED */
    --
    1.7.2.3
    --
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2011-04-11 22:41    [W:0.028 / U:123.612 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site