// 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 <bryan.wu@canonical.com> */ #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([31mCONFIG_NEW_LEDS[0m) && defined([31mCONFIG_LEDS_CLASS[0m) 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 |