mirror of https://github.com/Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
71 lines
1.4 KiB
71 lines
1.4 KiB
// SPDX-License-Identifier: GPL-2.0-only |
|
/* |
|
* Driver for the LED found on the EBSA110 machine |
|
* Based on Versatile and RealView machine LED code |
|
* |
|
* Author: Bryan Wu <[email protected]> |
|
*/ |
|
#include <linux/kernel.h> |
|
#include <linux/init.h> |
|
#include <linux/io.h> |
|
#include <linux/slab.h> |
|
#include <linux/leds.h> |
|
|
|
#include <asm/mach-types.h> |
|
|
|
#include "core.h" |
|
|
|
#if defined(CONFIG_NEW_LEDS) && defined(CONFIG_LEDS_CLASS) |
|
static void ebsa110_led_set(struct led_classdev *cdev, |
|
enum led_brightness b) |
|
{ |
|
u8 reg = __raw_readb(SOFT_BASE); |
|
|
|
if (b != LED_OFF) |
|
reg |= 0x80; |
|
else |
|
reg &= ~0x80; |
|
|
|
__raw_writeb(reg, SOFT_BASE); |
|
} |
|
|
|
static enum led_brightness ebsa110_led_get(struct led_classdev *cdev) |
|
{ |
|
u8 reg = __raw_readb(SOFT_BASE); |
|
|
|
return (reg & 0x80) ? LED_FULL : LED_OFF; |
|
} |
|
|
|
static int __init ebsa110_leds_init(void) |
|
{ |
|
|
|
struct led_classdev *cdev; |
|
int ret; |
|
|
|
if (!machine_is_ebsa110()) |
|
return -ENODEV; |
|
|
|
cdev = kzalloc(sizeof(*cdev), GFP_KERNEL); |
|
if (!cdev) |
|
return -ENOMEM; |
|
|
|
cdev->name = "ebsa110:0"; |
|
cdev->brightness_set = ebsa110_led_set; |
|
cdev->brightness_get = ebsa110_led_get; |
|
cdev->default_trigger = "heartbeat"; |
|
|
|
ret = led_classdev_register(NULL, cdev); |
|
if (ret < 0) { |
|
kfree(cdev); |
|
return ret; |
|
} |
|
|
|
return 0; |
|
} |
|
|
|
/* |
|
* Since we may have triggers on any subsystem, defer registration |
|
* until after subsystem_init. |
|
*/ |
|
fs_initcall(ebsa110_leds_init); |
|
#endif
|
|
|