leds-cobalt-raq.c (2229B)
1// SPDX-License-Identifier: GPL-2.0-or-later 2/* 3 * LEDs driver for the Cobalt Raq series. 4 * 5 * Copyright (C) 2007 Yoichi Yuasa <yuasa@linux-mips.org> 6 */ 7#include <linux/init.h> 8#include <linux/io.h> 9#include <linux/ioport.h> 10#include <linux/leds.h> 11#include <linux/platform_device.h> 12#include <linux/spinlock.h> 13#include <linux/types.h> 14#include <linux/export.h> 15 16#define LED_WEB 0x04 17#define LED_POWER_OFF 0x08 18 19static void __iomem *led_port; 20static u8 led_value; 21static DEFINE_SPINLOCK(led_value_lock); 22 23static void raq_web_led_set(struct led_classdev *led_cdev, 24 enum led_brightness brightness) 25{ 26 unsigned long flags; 27 28 spin_lock_irqsave(&led_value_lock, flags); 29 30 if (brightness) 31 led_value |= LED_WEB; 32 else 33 led_value &= ~LED_WEB; 34 writeb(led_value, led_port); 35 36 spin_unlock_irqrestore(&led_value_lock, flags); 37} 38 39static struct led_classdev raq_web_led = { 40 .name = "raq::web", 41 .brightness_set = raq_web_led_set, 42}; 43 44static void raq_power_off_led_set(struct led_classdev *led_cdev, 45 enum led_brightness brightness) 46{ 47 unsigned long flags; 48 49 spin_lock_irqsave(&led_value_lock, flags); 50 51 if (brightness) 52 led_value |= LED_POWER_OFF; 53 else 54 led_value &= ~LED_POWER_OFF; 55 writeb(led_value, led_port); 56 57 spin_unlock_irqrestore(&led_value_lock, flags); 58} 59 60static struct led_classdev raq_power_off_led = { 61 .name = "raq::power-off", 62 .brightness_set = raq_power_off_led_set, 63 .default_trigger = "power-off", 64}; 65 66static int cobalt_raq_led_probe(struct platform_device *pdev) 67{ 68 struct resource *res; 69 int retval; 70 71 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 72 if (!res) 73 return -EBUSY; 74 75 led_port = devm_ioremap(&pdev->dev, res->start, resource_size(res)); 76 if (!led_port) 77 return -ENOMEM; 78 79 retval = led_classdev_register(&pdev->dev, &raq_power_off_led); 80 if (retval) 81 goto err_null; 82 83 retval = led_classdev_register(&pdev->dev, &raq_web_led); 84 if (retval) 85 goto err_unregister; 86 87 return 0; 88 89err_unregister: 90 led_classdev_unregister(&raq_power_off_led); 91 92err_null: 93 led_port = NULL; 94 95 return retval; 96} 97 98static struct platform_driver cobalt_raq_led_driver = { 99 .probe = cobalt_raq_led_probe, 100 .driver = { 101 .name = "cobalt-raq-leds", 102 }, 103}; 104 105builtin_platform_driver(cobalt_raq_led_driver);