On Sat, 2008-04-12 at 14:10 -0400, Sean MacLennan wrote: > Signed-off-by: Sean MacLennan <[EMAIL PROTECTED]>
This should be sent to Richard Purdie. josh > > diff --git a/drivers/leds/Kconfig b/drivers/leds/Kconfig > index 859814f..31e1746 100644 > --- a/drivers/leds/Kconfig > +++ b/drivers/leds/Kconfig > @@ -145,6 +145,12 @@ config LEDS_CLEVO_MAIL > To compile this driver as a module, choose M here: the > module will be called leds-clevo-mail. > > +config LEDS_WARP > + tristate "LED Support for the PIKA Warp LEDs" > + depends on LEDS_CLASS && WARP > + help > + This option enables support for the PIKA Warp LEDs. > + > comment "LED Triggers" > > config LEDS_TRIGGERS > diff --git a/drivers/leds/Makefile b/drivers/leds/Makefile > index 84ced3b..eb60fb1 100644 > --- a/drivers/leds/Makefile > +++ b/drivers/leds/Makefile > @@ -21,6 +21,7 @@ obj-$(CONFIG_LEDS_GPIO) += leds-gpio.o > obj-$(CONFIG_LEDS_CM_X270) += leds-cm-x270.o > obj-$(CONFIG_LEDS_CLEVO_MAIL) += leds-clevo-mail.o > obj-$(CONFIG_LEDS_HP6XX) += leds-hp6xx.o > +obj-$(CONFIG_LEDS_WARP) += leds-warp.o > > # LED Triggers > obj-$(CONFIG_LEDS_TRIGGER_TIMER) += ledtrig-timer.o > diff --git a/drivers/leds/leds-warp.c b/drivers/leds/leds-warp.c > new file mode 100644 > index 0000000..0fbe0b7 > --- /dev/null > +++ b/drivers/leds/leds-warp.c > @@ -0,0 +1,148 @@ > +/* > + * Copyright (c) 2008 PIKA Technologies > + * Sean MacLennan <smaclennan at pikatech.com> > + * > + * This is just a temporary driver until the GPIO/GPIO_OF_LEDS drivers > + * get sorted out. > + */ > +#include <linux/module.h> > +#include <linux/leds.h> > +#include <linux/of_platform.h> > +#include <asm/machdep.h> > + > + > +#define LED_GREEN (0x80000000 >> 0) > +#define LED_RED (0x80000000 >> 1) > + > +static void __iomem *gpio_base; > + > + > +static void warp_green_set(struct led_classdev *led_cdev, > + enum led_brightness brightness) > +{ > + unsigned leds = in_be32(gpio_base); > + > + if (brightness) > + leds |= LED_GREEN; > + else > + leds &= ~LED_GREEN; > + > + out_be32(gpio_base, leds); > +} > + > +static void warp_red_set(struct led_classdev *led_cdev, > + enum led_brightness brightness) > +{ > + unsigned leds = in_be32(gpio_base); > + > + if (brightness) > + leds |= LED_RED; > + else > + leds &= ~LED_RED; > + > + out_be32(gpio_base, leds); > +} > + > +static struct led_classdev warp_green_led = { > + .name = "warp-green", > + .brightness_set = warp_green_set, > +}; > + > +static struct led_classdev warp_red_led = { > + .name = "warp-red", > + .brightness_set = warp_red_set, > +}; > + > +static int __devinit warp_led_probe(struct platform_device *pdev) > +{ > + struct device_node *np; > + int rc; > + > + /* Power LEDS are on the second GPIO controller */ > + np = of_find_compatible_node(NULL, NULL, "ibm,gpio-440EP"); > + if (np) > + np = of_find_compatible_node(np, NULL, "ibm,gpio-440EP"); > + if (np == NULL) { > + printk(KERN_ERR __FILE__ ": Unable to find gpio\n"); > + return -ENOENT; > + } > + > + gpio_base = of_iomap(np, 0); > + of_node_put(np); > + if (gpio_base == NULL) { > + printk(KERN_ERR __FILE__ ": Unable to map gpio"); > + return -ENOMEM; > + } > + > + rc = led_classdev_register(&pdev->dev, &warp_green_led); > + if (rc) { > + iounmap(gpio_base); > + return rc; > + } > + > + rc = led_classdev_register(&pdev->dev, &warp_red_led); > + if (rc) { > + led_classdev_unregister(&warp_green_led); > + iounmap(gpio_base); > + return rc; > + } > + > + return 0; > +} > + > +static int __devexit warp_led_remove(struct platform_device *pdev) > +{ > + led_classdev_unregister(&warp_green_led); > + led_classdev_unregister(&warp_red_led); > + > + iounmap(gpio_base); > + > + return 0; > +} > + > +/* We *must* have a release. */ > +static void warp_led_release(struct device *dev) {} > + > +static struct platform_driver warp_led_driver = { > + .probe = warp_led_probe, > + .remove = __devexit_p(warp_led_remove), > + .driver = { > + .name = "warp-led", > + }, > +}; > + > +static struct platform_device warp_led_device = { > + .name = "warp-led", > + .id = 0, > + .dev = { > + .release = warp_led_release, > + }, > +}; > + > +static int __init warp_led_init(void) > +{ > + int rc; > + > + rc = platform_device_register(&warp_led_device); > + if (rc) > + return rc; > + rc = platform_driver_register(&warp_led_driver); > + if (rc) { > + platform_device_unregister(&warp_led_device); > + return rc; > + } > + > + return 0; > +} > + > +static void __exit warp_led_exit(void) > +{ > + platform_driver_unregister(&warp_led_driver); > + platform_device_unregister(&warp_led_device); > +} > + > +module_init(warp_led_init); > +module_exit(warp_led_exit); > + > +MODULE_LICENSE("GPL"); > +MODULE_AUTHOR("Sean MacLennan <[EMAIL PROTECTED]>"); > _______________________________________________ > Linuxppc-dev mailing list > Linuxppc-dev@ozlabs.org > https://ozlabs.org/mailman/listinfo/linuxppc-dev _______________________________________________ Linuxppc-dev mailing list Linuxppc-dev@ozlabs.org https://ozlabs.org/mailman/listinfo/linuxppc-dev