1/* 2 * LEDs driver for SEAD3 3 * 4 * Copyright (C) 2006 Kristian Kielhofner <kris@krisk.org> 5 * 6 * Based on leds-wrap.c 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#include <linux/kernel.h> 14#include <linux/init.h> 15#include <linux/platform_device.h> 16#include <linux/leds.h> 17#include <linux/err.h> 18#include <asm/io.h> 19 20#define DRVNAME "sead3-led" 21 22static struct platform_device *pdev; 23 24static void sead3_pled_set(struct led_classdev *led_cdev, 25 enum led_brightness value) 26{ 27 pr_debug("sead3_pled_set\n"); 28 writel(value, (void __iomem *)0xBF000210); 29} 30 31static void sead3_fled_set(struct led_classdev *led_cdev, 32 enum led_brightness value) 33{ 34 pr_debug("sead3_fled_set\n"); 35 writel(value, (void __iomem *)0xBF000218); 36} 37 38static struct led_classdev sead3_pled = { 39 .name = "sead3::pled", 40 .brightness_set = sead3_pled_set, 41}; 42 43static struct led_classdev sead3_fled = { 44 .name = "sead3::fled", 45 .brightness_set = sead3_fled_set, 46}; 47 48#ifdef CONFIG_PM 49static int sead3_led_suspend(struct platform_device *dev, 50 pm_message_t state) 51{ 52 led_classdev_suspend(&sead3_pled); 53 led_classdev_suspend(&sead3_fled); 54 return 0; 55} 56 57static int sead3_led_resume(struct platform_device *dev) 58{ 59 led_classdev_resume(&sead3_pled); 60 led_classdev_resume(&sead3_fled); 61 return 0; 62} 63#else 64#define sead3_led_suspend NULL 65#define sead3_led_resume NULL 66#endif 67 68static int sead3_led_probe(struct platform_device *pdev) 69{ 70 int ret; 71 72 ret = led_classdev_register(&pdev->dev, &sead3_pled); 73 if (ret < 0) 74 return ret; 75 76 ret = led_classdev_register(&pdev->dev, &sead3_fled); 77 if (ret < 0) 78 led_classdev_unregister(&sead3_pled); 79 80 return ret; 81} 82 83static int sead3_led_remove(struct platform_device *pdev) 84{ 85 led_classdev_unregister(&sead3_pled); 86 led_classdev_unregister(&sead3_fled); 87 return 0; 88} 89 90static struct platform_driver sead3_led_driver = { 91 .probe = sead3_led_probe, 92 .remove = sead3_led_remove, 93 .suspend = sead3_led_suspend, 94 .resume = sead3_led_resume, 95 .driver = { 96 .name = DRVNAME, 97 .owner = THIS_MODULE, 98 }, 99}; 100 101static int __init sead3_led_init(void) 102{ 103 int ret; 104 105 ret = platform_driver_register(&sead3_led_driver); 106 if (ret < 0) 107 goto out; 108 109 pdev = platform_device_register_simple(DRVNAME, -1, NULL, 0); 110 if (IS_ERR(pdev)) { 111 ret = PTR_ERR(pdev); 112 platform_driver_unregister(&sead3_led_driver); 113 goto out; 114 } 115 116out: 117 return ret; 118} 119 120static void __exit sead3_led_exit(void) 121{ 122 platform_device_unregister(pdev); 123 platform_driver_unregister(&sead3_led_driver); 124} 125 126module_init(sead3_led_init); 127module_exit(sead3_led_exit); 128 129MODULE_AUTHOR("Kristian Kielhofner <kris@krisk.org>"); 130MODULE_DESCRIPTION("SEAD3 LED driver"); 131MODULE_LICENSE("GPL"); 132