Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-or-later
0002 /*
0003  *  LEDs driver for the Cobalt Raq series.
0004  *
0005  *  Copyright (C) 2007  Yoichi Yuasa <yuasa@linux-mips.org>
0006  */
0007 #include <linux/init.h>
0008 #include <linux/io.h>
0009 #include <linux/ioport.h>
0010 #include <linux/leds.h>
0011 #include <linux/platform_device.h>
0012 #include <linux/spinlock.h>
0013 #include <linux/types.h>
0014 #include <linux/export.h>
0015 
0016 #define LED_WEB     0x04
0017 #define LED_POWER_OFF   0x08
0018 
0019 static void __iomem *led_port;
0020 static u8 led_value;
0021 static DEFINE_SPINLOCK(led_value_lock);
0022 
0023 static void raq_web_led_set(struct led_classdev *led_cdev,
0024                 enum led_brightness brightness)
0025 {
0026     unsigned long flags;
0027 
0028     spin_lock_irqsave(&led_value_lock, flags);
0029 
0030     if (brightness)
0031         led_value |= LED_WEB;
0032     else
0033         led_value &= ~LED_WEB;
0034     writeb(led_value, led_port);
0035 
0036     spin_unlock_irqrestore(&led_value_lock, flags);
0037 }
0038 
0039 static struct led_classdev raq_web_led = {
0040     .name       = "raq::web",
0041     .brightness_set = raq_web_led_set,
0042 };
0043 
0044 static void raq_power_off_led_set(struct led_classdev *led_cdev,
0045                   enum led_brightness brightness)
0046 {
0047     unsigned long flags;
0048 
0049     spin_lock_irqsave(&led_value_lock, flags);
0050 
0051     if (brightness)
0052         led_value |= LED_POWER_OFF;
0053     else
0054         led_value &= ~LED_POWER_OFF;
0055     writeb(led_value, led_port);
0056 
0057     spin_unlock_irqrestore(&led_value_lock, flags);
0058 }
0059 
0060 static struct led_classdev raq_power_off_led = {
0061     .name           = "raq::power-off",
0062     .brightness_set     = raq_power_off_led_set,
0063     .default_trigger    = "power-off",
0064 };
0065 
0066 static int cobalt_raq_led_probe(struct platform_device *pdev)
0067 {
0068     struct resource *res;
0069     int retval;
0070 
0071     res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
0072     if (!res)
0073         return -EBUSY;
0074 
0075     led_port = devm_ioremap(&pdev->dev, res->start, resource_size(res));
0076     if (!led_port)
0077         return -ENOMEM;
0078 
0079     retval = led_classdev_register(&pdev->dev, &raq_power_off_led);
0080     if (retval)
0081         goto err_null;
0082 
0083     retval = led_classdev_register(&pdev->dev, &raq_web_led);
0084     if (retval)
0085         goto err_unregister;
0086 
0087     return 0;
0088 
0089 err_unregister:
0090     led_classdev_unregister(&raq_power_off_led);
0091 
0092 err_null:
0093     led_port = NULL;
0094 
0095     return retval;
0096 }
0097 
0098 static struct platform_driver cobalt_raq_led_driver = {
0099     .probe  = cobalt_raq_led_probe,
0100     .driver = {
0101         .name   = "cobalt-raq-leds",
0102     },
0103 };
0104 
0105 builtin_platform_driver(cobalt_raq_led_driver);