linux/drivers/leds/leds-corgi.c
<<
>>
Prefs
   1/*
   2 * LED Triggers Core
   3 *
   4 * Copyright 2005-2006 Openedhand Ltd.
   5 *
   6 * Author: Richard Purdie <rpurdie@openedhand.com>
   7 *
   8 * This program is free software; you can redistribute it and/or modify
   9 * it under the terms of the GNU General Public License version 2 as
  10 * published by the Free Software Foundation.
  11 *
  12 */
  13
  14#include <linux/kernel.h>
  15#include <linux/init.h>
  16#include <linux/platform_device.h>
  17#include <linux/leds.h>
  18#include <mach/corgi.h>
  19#include <mach/hardware.h>
  20#include <mach/pxa-regs.h>
  21#include <asm/hardware/scoop.h>
  22
  23static void corgiled_amber_set(struct led_classdev *led_cdev,
  24                               enum led_brightness value)
  25{
  26        if (value)
  27                GPSR0 = GPIO_bit(CORGI_GPIO_LED_ORANGE);
  28        else
  29                GPCR0 = GPIO_bit(CORGI_GPIO_LED_ORANGE);
  30}
  31
  32static void corgiled_green_set(struct led_classdev *led_cdev,
  33                               enum led_brightness value)
  34{
  35        if (value)
  36                set_scoop_gpio(&corgiscoop_device.dev, CORGI_SCP_LED_GREEN);
  37        else
  38                reset_scoop_gpio(&corgiscoop_device.dev, CORGI_SCP_LED_GREEN);
  39}
  40
  41static struct led_classdev corgi_amber_led = {
  42        .name                   = "corgi:amber:charge",
  43        .default_trigger        = "sharpsl-charge",
  44        .brightness_set         = corgiled_amber_set,
  45};
  46
  47static struct led_classdev corgi_green_led = {
  48        .name                   = "corgi:green:mail",
  49        .default_trigger        = "nand-disk",
  50        .brightness_set         = corgiled_green_set,
  51};
  52
  53#ifdef CONFIG_PM
  54static int corgiled_suspend(struct platform_device *dev, pm_message_t state)
  55{
  56#ifdef CONFIG_LEDS_TRIGGERS
  57        if (corgi_amber_led.trigger &&
  58            strcmp(corgi_amber_led.trigger->name, "sharpsl-charge"))
  59#endif
  60                led_classdev_suspend(&corgi_amber_led);
  61        led_classdev_suspend(&corgi_green_led);
  62        return 0;
  63}
  64
  65static int corgiled_resume(struct platform_device *dev)
  66{
  67        led_classdev_resume(&corgi_amber_led);
  68        led_classdev_resume(&corgi_green_led);
  69        return 0;
  70}
  71#endif
  72
  73static int corgiled_probe(struct platform_device *pdev)
  74{
  75        int ret;
  76
  77        ret = led_classdev_register(&pdev->dev, &corgi_amber_led);
  78        if (ret < 0)
  79                return ret;
  80
  81        ret = led_classdev_register(&pdev->dev, &corgi_green_led);
  82        if (ret < 0)
  83                led_classdev_unregister(&corgi_amber_led);
  84
  85        return ret;
  86}
  87
  88static int corgiled_remove(struct platform_device *pdev)
  89{
  90        led_classdev_unregister(&corgi_amber_led);
  91        led_classdev_unregister(&corgi_green_led);
  92        return 0;
  93}
  94
  95static struct platform_driver corgiled_driver = {
  96        .probe          = corgiled_probe,
  97        .remove         = corgiled_remove,
  98#ifdef CONFIG_PM
  99        .suspend        = corgiled_suspend,
 100        .resume         = corgiled_resume,
 101#endif
 102        .driver         = {
 103                .name           = "corgi-led",
 104                .owner          = THIS_MODULE,
 105        },
 106};
 107
 108static int __init corgiled_init(void)
 109{
 110        return platform_driver_register(&corgiled_driver);
 111}
 112
 113static void __exit corgiled_exit(void)
 114{
 115        platform_driver_unregister(&corgiled_driver);
 116}
 117
 118module_init(corgiled_init);
 119module_exit(corgiled_exit);
 120
 121MODULE_AUTHOR("Richard Purdie <rpurdie@openedhand.com>");
 122MODULE_DESCRIPTION("Corgi LED driver");
 123MODULE_LICENSE("GPL");
 124MODULE_ALIAS("platform:corgi-led");
 125