linux/drivers/leds/leds-cobalt-raq.c
<<
>>
Prefs
   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);
 106