diff options
Diffstat (limited to 'ANDROID_3.4.5/drivers/leds')
57 files changed, 0 insertions, 15482 deletions
diff --git a/ANDROID_3.4.5/drivers/leds/Kconfig b/ANDROID_3.4.5/drivers/leds/Kconfig deleted file mode 100644 index 978ec138..00000000 --- a/ANDROID_3.4.5/drivers/leds/Kconfig +++ /dev/null @@ -1,494 +0,0 @@ -config LEDS_GPIO_REGISTER - bool - help - This option provides the function gpio_led_register_device. - As this function is used by arch code it must not be compiled as a - module. - -menuconfig NEW_LEDS - bool "LED Support" - help - Say Y to enable Linux LED support. This allows control of supported - LEDs from both userspace and optionally, by kernel events (triggers). - - This is not related to standard keyboard LEDs which are controlled - via the input system. - -if NEW_LEDS - -config LEDS_CLASS - tristate "LED Class Support" - help - This option enables the led sysfs class in /sys/class/leds. You'll - need this to do anything useful with LEDs. If unsure, say N. - -comment "LED drivers" -config WMT_LCD_BACKLIGHT - tristate "LCD Backlight Support using WMT PWM outputs" - depends on LEDS_CLASS && PWM_WMT - help - This option enables support for LCD backlight driven using - outputs of the dedicated PWM controller found on WMT SOCs. - -config LEDS_88PM860X - tristate "LED Support for Marvell 88PM860x PMIC" - depends on LEDS_CLASS - depends on MFD_88PM860X - help - This option enables support for on-chip LED drivers found on Marvell - Semiconductor 88PM8606 PMIC. - -config LEDS_ATMEL_PWM - tristate "LED Support using Atmel PWM outputs" - depends on LEDS_CLASS - depends on ATMEL_PWM - help - This option enables support for LEDs driven using outputs - of the dedicated PWM controller found on newer Atmel SOCs. - -config LEDS_LM3530 - tristate "LCD Backlight driver for LM3530" - depends on LEDS_CLASS - depends on I2C - help - This option enables support for the LCD backlight using - LM3530 ambient light sensor chip. This ALS chip can be - controlled manually or using PWM input or using ambient - light automatically. - -config LEDS_LOCOMO - tristate "LED Support for Locomo device" - depends on LEDS_CLASS - depends on SHARP_LOCOMO - help - This option enables support for the LEDs on Sharp Locomo. - Zaurus models SL-5500 and SL-5600. - -config LEDS_MIKROTIK_RB532 - tristate "LED Support for Mikrotik Routerboard 532" - depends on LEDS_CLASS - depends on MIKROTIK_RB532 - help - This option enables support for the so called "User LED" of - Mikrotik's Routerboard 532. - -config LEDS_S3C24XX - tristate "LED Support for Samsung S3C24XX GPIO LEDs" - depends on LEDS_CLASS - depends on ARCH_S3C24XX - help - This option enables support for LEDs connected to GPIO lines - on Samsung S3C24XX series CPUs, such as the S3C2410 and S3C2440. - -config LEDS_NET48XX - tristate "LED Support for Soekris net48xx series Error LED" - depends on LEDS_CLASS - depends on SCx200_GPIO - help - This option enables support for the Soekris net4801 and net4826 error - LED. - -config LEDS_FSG - tristate "LED Support for the Freecom FSG-3" - depends on LEDS_CLASS - depends on MACH_FSG - help - This option enables support for the LEDs on the Freecom FSG-3. - -config LEDS_WRAP - tristate "LED Support for the WRAP series LEDs" - depends on LEDS_CLASS - depends on SCx200_GPIO - help - This option enables support for the PCEngines WRAP programmable LEDs. - -config LEDS_COBALT_QUBE - tristate "LED Support for the Cobalt Qube series front LED" - depends on LEDS_CLASS - depends on MIPS_COBALT - help - This option enables support for the front LED on Cobalt Qube series - -config LEDS_COBALT_RAQ - bool "LED Support for the Cobalt Raq series" - depends on LEDS_CLASS=y && MIPS_COBALT - select LEDS_TRIGGERS - help - This option enables support for the Cobalt Raq series LEDs. - -config LEDS_SUNFIRE - tristate "LED support for SunFire servers." - depends on LEDS_CLASS - depends on SPARC64 - select LEDS_TRIGGERS - help - This option enables support for the Left, Middle, and Right - LEDs on the I/O and CPU boards of SunFire UltraSPARC servers. - -config LEDS_HP6XX - tristate "LED Support for the HP Jornada 6xx" - depends on LEDS_CLASS - depends on SH_HP6XX - help - This option enables LED support for the handheld - HP Jornada 620/660/680/690. - -config LEDS_PCA9532 - tristate "LED driver for PCA9532 dimmer" - depends on LEDS_CLASS - depends on I2C && INPUT && EXPERIMENTAL - help - This option enables support for NXP pca9532 - LED controller. It is generally only useful - as a platform driver - -config LEDS_PCA9532_GPIO - bool "Enable GPIO support for PCA9532" - depends on LEDS_PCA9532 - depends on GPIOLIB - help - Allow unused pins on PCA9532 to be used as gpio. - - To use a pin as gpio pca9532_type in pca9532_platform data needs to - set to PCA9532_TYPE_GPIO. - -config LEDS_GPIO - tristate "LED Support for GPIO connected LEDs" - depends on LEDS_CLASS - depends on GENERIC_GPIO - help - This option enables support for the LEDs connected to GPIO - outputs. To be useful the particular board must have LEDs - and they must be connected to the GPIO lines. The LEDs must be - defined as platform devices and/or OpenFirmware platform devices. - The code to use these bindings can be selected below. - -config LEDS_LP3944 - tristate "LED Support for N.S. LP3944 (Fun Light) I2C chip" - depends on LEDS_CLASS - depends on I2C - help - This option enables support for LEDs connected to the National - Semiconductor LP3944 Lighting Management Unit (LMU) also known as - Fun Light Chip. - - To compile this driver as a module, choose M here: the - module will be called leds-lp3944. - -config LEDS_LP5521 - tristate "LED Support for N.S. LP5521 LED driver chip" - depends on LEDS_CLASS && I2C - help - If you say yes here you get support for the National Semiconductor - LP5521 LED driver. It is 3 channel chip with programmable engines. - Driver provides direct control via LED class and interface for - programming the engines. - -config LEDS_LP5523 - tristate "LED Support for N.S. LP5523 LED driver chip" - depends on LEDS_CLASS && I2C - help - If you say yes here you get support for the National Semiconductor - LP5523 LED driver. It is 9 channel chip with programmable engines. - Driver provides direct control via LED class and interface for - programming the engines. - -config LEDS_CLEVO_MAIL - tristate "Mail LED on Clevo notebook" - depends on LEDS_CLASS - depends on X86 && SERIO_I8042 && DMI - help - This driver makes the mail LED accessible from userspace - programs through the leds subsystem. This LED have three - known mode: off, blink at 0.5Hz and blink at 1Hz. - - The driver supports two kinds of interface: using ledtrig-timer - or through /sys/class/leds/clevo::mail/brightness. As this LED - cannot change it's brightness it blinks instead. The brightness - value 0 means off, 1..127 means blink at 0.5Hz and 128..255 means - blink at 1Hz. - - This module can drive the mail LED for the following notebooks: - - Clevo D400P - Clevo D410J - Clevo D410V - Clevo D400V/D470V (not tested, but might work) - Clevo M540N - Clevo M5x0N (not tested, but might work) - Positivo Mobile (Clevo M5x0V) - - If your model is not listed here you can try the "nodetect" - module parameter. - - To compile this driver as a module, choose M here: the - module will be called leds-clevo-mail. - -config LEDS_PCA955X - tristate "LED Support for PCA955x I2C chips" - depends on LEDS_CLASS - depends on I2C - help - This option enables support for LEDs connected to PCA955x - LED driver chips accessed via the I2C bus. Supported - devices include PCA9550, PCA9551, PCA9552, and PCA9553. - -config LEDS_PCA9633 - tristate "LED support for PCA9633 I2C chip" - depends on LEDS_CLASS - depends on I2C - help - This option enables support for LEDs connected to the PCA9633 - LED driver chip accessed via the I2C bus. - -config LEDS_WM831X_STATUS - tristate "LED support for status LEDs on WM831x PMICs" - depends on LEDS_CLASS - depends on MFD_WM831X - help - This option enables support for the status LEDs of the WM831x - series of PMICs. - -config LEDS_WM8350 - tristate "LED Support for WM8350 AudioPlus PMIC" - depends on LEDS_CLASS - depends on MFD_WM8350 - help - This option enables support for LEDs driven by the Wolfson - Microelectronics WM8350 AudioPlus PMIC. - -config LEDS_DA903X - tristate "LED Support for DA9030/DA9034 PMIC" - depends on LEDS_CLASS - depends on PMIC_DA903X - help - This option enables support for on-chip LED drivers found - on Dialog Semiconductor DA9030/DA9034 PMICs. - -config LEDS_DAC124S085 - tristate "LED Support for DAC124S085 SPI DAC" - depends on LEDS_CLASS - depends on SPI - help - This option enables support for DAC124S085 SPI DAC from NatSemi, - which can be used to control up to four LEDs. - -config LEDS_PWM - tristate "PWM driven LED Support" - depends on LEDS_CLASS - depends on HAVE_PWM - help - This option enables support for pwm driven LEDs - -config LEDS_REGULATOR - tristate "REGULATOR driven LED support" - depends on LEDS_CLASS - depends on REGULATOR - help - This option enables support for regulator driven LEDs. - -config LEDS_BD2802 - tristate "LED driver for BD2802 RGB LED" - depends on LEDS_CLASS - depends on I2C - help - This option enables support for BD2802GU RGB LED driver chips - accessed via the I2C bus. - -config LEDS_INTEL_SS4200 - tristate "LED driver for Intel NAS SS4200 series" - depends on LEDS_CLASS - depends on PCI && DMI - help - This option enables support for the Intel SS4200 series of - Network Attached Storage servers. You may control the hard - drive or power LEDs on the front panel. Using this driver - can stop the front LED from blinking after startup. - -config LEDS_LT3593 - tristate "LED driver for LT3593 controllers" - depends on LEDS_CLASS - depends on GENERIC_GPIO - help - This option enables support for LEDs driven by a Linear Technology - LT3593 controller. This controller uses a special one-wire pulse - coding protocol to set the brightness. - -config LEDS_ADP5520 - tristate "LED Support for ADP5520/ADP5501 PMIC" - depends on LEDS_CLASS - depends on PMIC_ADP5520 - help - This option enables support for on-chip LED drivers found - on Analog Devices ADP5520/ADP5501 PMICs. - - To compile this driver as a module, choose M here: the module will - be called leds-adp5520. - -config LEDS_DELL_NETBOOKS - tristate "External LED on Dell Business Netbooks" - depends on LEDS_CLASS - depends on X86 && ACPI_WMI - help - This adds support for the Latitude 2100 and similar - notebooks that have an external LED. - -config LEDS_MC13783 - tristate "LED Support for MC13783 PMIC" - depends on LEDS_CLASS - depends on MFD_MC13783 - help - This option enable support for on-chip LED drivers found - on Freescale Semiconductor MC13783 PMIC. - -config LEDS_NS2 - tristate "LED support for Network Space v2 GPIO LEDs" - depends on LEDS_CLASS - depends on MACH_NETSPACE_V2 || MACH_INETSPACE_V2 || \ - MACH_NETSPACE_MAX_V2 || MACH_D2NET_V2 - default y - help - This option enable support for the dual-GPIO LED found on the - Network Space v2 board (and parents). This include Internet Space v2, - Network Space (Max) v2 and d2 Network v2 boards. - -config LEDS_NETXBIG - tristate "LED support for Big Network series LEDs" - depends on MACH_NET2BIG_V2 || MACH_NET5BIG_V2 - depends on LEDS_CLASS - default y - help - This option enable support for LEDs found on the LaCie 2Big - and 5Big Network v2 boards. The LEDs are wired to a CPLD and are - controlled through a GPIO extension bus. - -config LEDS_ASIC3 - bool "LED support for the HTC ASIC3" - depends on LEDS_CLASS - depends on MFD_ASIC3 - default y - help - This option enables support for the LEDs on the HTC ASIC3. The HTC - ASIC3 LED GPIOs are inputs, not outputs, thus the leds-gpio driver - cannot be used. This driver supports hardware blinking with an on+off - period from 62ms to 125s. Say Y to enable LEDs on the HP iPAQ hx4700. - -config LEDS_RENESAS_TPU - bool "LED support for Renesas TPU" - depends on LEDS_CLASS && HAVE_CLK && GENERIC_GPIO - help - This option enables build of the LED TPU platform driver, - suitable to drive any TPU channel on newer Renesas SoCs. - The driver controls the GPIO pin connected to the LED via - the GPIO framework and expects the LED to be connected to - a pin that can be driven in both GPIO mode and using TPU - pin function. The latter to support brightness control. - Brightness control is supported but hardware blinking is not. - -config LEDS_TCA6507 - tristate "LED Support for TCA6507 I2C chip" - depends on LEDS_CLASS && I2C - help - This option enables support for LEDs connected to TC6507 - LED driver chips accessed via the I2C bus. - Driver support brightness control and hardware-assisted blinking. - -config LEDS_MAX8997 - tristate "LED support for MAX8997 PMIC" - depends on LEDS_CLASS && MFD_MAX8997 - help - This option enables support for on-chip LED drivers on - MAXIM MAX8997 PMIC. - -config LEDS_OT200 - tristate "LED support for the Bachmann OT200" - depends on LEDS_CLASS && HAS_IOMEM - help - This option enables support for the LEDs on the Bachmann OT200. - Say Y to enable LEDs on the Bachmann OT200. - -config LEDS_LOGO - tristate "LED support for Lighting Logo" - depends on LEDS_CLASS && ARCH_WMT - default y - help - This option enables support for the LEDs of logo on the WMT Platform. - The LEDs lights the logo - -config LEDS_TRIGGERS - bool "LED Trigger support" - depends on LEDS_CLASS - help - This option enables trigger support for the leds class. - These triggers allow kernel events to drive the LEDs and can - be configured via sysfs. If unsure, say Y. - -comment "LED Triggers" - -config LEDS_TRIGGER_TIMER - tristate "LED Timer Trigger" - depends on LEDS_TRIGGERS - help - This allows LEDs to be controlled by a programmable timer - via sysfs. Some LED hardware can be programmed to start - blinking the LED without any further software interaction. - For more details read Documentation/leds/leds-class.txt. - - If unsure, say Y. - -config LEDS_TRIGGER_IDE_DISK - bool "LED IDE Disk Trigger" - depends on IDE_GD_ATA - depends on LEDS_TRIGGERS - help - This allows LEDs to be controlled by IDE disk activity. - If unsure, say Y. - -config LEDS_TRIGGER_HEARTBEAT - tristate "LED Heartbeat Trigger" - depends on LEDS_TRIGGERS - help - This allows LEDs to be controlled by a CPU load average. - The flash frequency is a hyperbolic function of the 1-minute - load average. - If unsure, say Y. - -config LEDS_TRIGGER_BACKLIGHT - tristate "LED backlight Trigger" - depends on LEDS_TRIGGERS - help - This allows LEDs to be controlled as a backlight device: they - turn off and on when the display is blanked and unblanked. - - If unsure, say N. - -config LEDS_TRIGGER_GPIO - tristate "LED GPIO Trigger" - depends on LEDS_TRIGGERS - depends on GPIOLIB - help - This allows LEDs to be controlled by gpio events. It's good - when using gpios as switches and triggering the needed LEDs - from there. One use case is n810's keypad LEDs that could - be triggered by this trigger when user slides up to show - keypad. - - If unsure, say N. - -config LEDS_TRIGGER_DEFAULT_ON - tristate "LED Default ON Trigger" - depends on LEDS_TRIGGERS - help - This allows LEDs to be initialised in the ON state. - If unsure, say Y. - -config LEDS_TRIGGER_SLEEP - tristate "LED Sleep Mode Trigger" - depends on LEDS_TRIGGERS && HAS_EARLYSUSPEND - help - This turns LEDs on when the screen is off but the cpu still running. - -comment "iptables trigger is under Netfilter config (LED target)" - depends on LEDS_TRIGGERS - -endif # NEW_LEDS diff --git a/ANDROID_3.4.5/drivers/leds/Makefile b/ANDROID_3.4.5/drivers/leds/Makefile deleted file mode 100644 index 3b019de5..00000000 --- a/ANDROID_3.4.5/drivers/leds/Makefile +++ /dev/null @@ -1,62 +0,0 @@ - -# LED Core -obj-$(CONFIG_NEW_LEDS) += led-core.o -obj-$(CONFIG_LEDS_CLASS) += led-class.o -obj-$(CONFIG_LEDS_TRIGGERS) += led-triggers.o - -# LED Platform Drivers -obj-$(CONFIG_LEDS_88PM860X) += leds-88pm860x.o -obj-$(CONFIG_LEDS_ATMEL_PWM) += leds-atmel-pwm.o -obj-$(CONFIG_LEDS_BD2802) += leds-bd2802.o -obj-$(CONFIG_LEDS_LOCOMO) += leds-locomo.o -obj-$(CONFIG_LEDS_LM3530) += leds-lm3530.o -obj-$(CONFIG_LEDS_MIKROTIK_RB532) += leds-rb532.o -obj-$(CONFIG_LEDS_S3C24XX) += leds-s3c24xx.o -obj-$(CONFIG_LEDS_NET48XX) += leds-net48xx.o -obj-$(CONFIG_LEDS_WRAP) += leds-wrap.o -obj-$(CONFIG_LEDS_COBALT_QUBE) += leds-cobalt-qube.o -obj-$(CONFIG_LEDS_COBALT_RAQ) += leds-cobalt-raq.o -obj-$(CONFIG_LEDS_SUNFIRE) += leds-sunfire.o -obj-$(CONFIG_LEDS_PCA9532) += leds-pca9532.o -obj-$(CONFIG_LEDS_GPIO_REGISTER) += leds-gpio-register.o -obj-$(CONFIG_LEDS_GPIO) += leds-gpio.o -obj-$(CONFIG_LEDS_LP3944) += leds-lp3944.o -obj-$(CONFIG_LEDS_LP5521) += leds-lp5521.o -obj-$(CONFIG_LEDS_LP5523) += leds-lp5523.o -obj-$(CONFIG_LEDS_TCA6507) += leds-tca6507.o -obj-$(CONFIG_LEDS_CLEVO_MAIL) += leds-clevo-mail.o -obj-$(CONFIG_LEDS_HP6XX) += leds-hp6xx.o -obj-$(CONFIG_LEDS_OT200) += leds-ot200.o -obj-$(CONFIG_LEDS_FSG) += leds-fsg.o -obj-$(CONFIG_LEDS_PCA955X) += leds-pca955x.o -obj-$(CONFIG_LEDS_PCA9633) += leds-pca9633.o -obj-$(CONFIG_LEDS_DA903X) += leds-da903x.o -obj-$(CONFIG_LEDS_WM831X_STATUS) += leds-wm831x-status.o -obj-$(CONFIG_LEDS_WM8350) += leds-wm8350.o -obj-$(CONFIG_LEDS_PWM) += leds-pwm.o -obj-$(CONFIG_LEDS_REGULATOR) += leds-regulator.o -obj-$(CONFIG_LEDS_INTEL_SS4200) += leds-ss4200.o -obj-$(CONFIG_LEDS_LT3593) += leds-lt3593.o -obj-$(CONFIG_LEDS_ADP5520) += leds-adp5520.o -obj-$(CONFIG_LEDS_DELL_NETBOOKS) += dell-led.o -obj-$(CONFIG_LEDS_MC13783) += leds-mc13783.o -obj-$(CONFIG_LEDS_NS2) += leds-ns2.o -obj-$(CONFIG_LEDS_NETXBIG) += leds-netxbig.o -obj-$(CONFIG_LEDS_ASIC3) += leds-asic3.o -obj-$(CONFIG_LEDS_RENESAS_TPU) += leds-renesas-tpu.o -obj-$(CONFIG_LEDS_MAX8997) += leds-max8997.o -obj-$(CONFIG_LEDS_LOGO) += leds-genesis.o - -# LED SPI Drivers -obj-$(CONFIG_LEDS_DAC124S085) += leds-dac124s085.o - -# LED Triggers -obj-$(CONFIG_LEDS_TRIGGER_TIMER) += ledtrig-timer.o -obj-$(CONFIG_LEDS_TRIGGER_IDE_DISK) += ledtrig-ide-disk.o -obj-$(CONFIG_LEDS_TRIGGER_HEARTBEAT) += ledtrig-heartbeat.o -obj-$(CONFIG_LEDS_TRIGGER_BACKLIGHT) += ledtrig-backlight.o -obj-$(CONFIG_LEDS_TRIGGER_GPIO) += ledtrig-gpio.o -obj-$(CONFIG_LEDS_TRIGGER_DEFAULT_ON) += ledtrig-default-on.o -obj-$(CONFIG_LEDS_TRIGGER_SLEEP) += ledtrig-sleep.o - -obj-y += leds-wmt.o diff --git a/ANDROID_3.4.5/drivers/leds/dell-led.c b/ANDROID_3.4.5/drivers/leds/dell-led.c deleted file mode 100644 index e5c57389..00000000 --- a/ANDROID_3.4.5/drivers/leds/dell-led.c +++ /dev/null @@ -1,202 +0,0 @@ -/* - * dell_led.c - Dell LED Driver - * - * Copyright (C) 2010 Dell Inc. - * Louis Davis <louis_davis@dell.com> - * Jim Dailey <jim_dailey@dell.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as - * published by the Free Software Foundation. - * - */ - -#include <linux/acpi.h> -#include <linux/leds.h> -#include <linux/slab.h> -#include <linux/module.h> - -MODULE_AUTHOR("Louis Davis/Jim Dailey"); -MODULE_DESCRIPTION("Dell LED Control Driver"); -MODULE_LICENSE("GPL"); - -#define DELL_LED_BIOS_GUID "F6E4FE6E-909D-47cb-8BAB-C9F6F2F8D396" -MODULE_ALIAS("wmi:" DELL_LED_BIOS_GUID); - -/* Error Result Codes: */ -#define INVALID_DEVICE_ID 250 -#define INVALID_PARAMETER 251 -#define INVALID_BUFFER 252 -#define INTERFACE_ERROR 253 -#define UNSUPPORTED_COMMAND 254 -#define UNSPECIFIED_ERROR 255 - -/* Device ID */ -#define DEVICE_ID_PANEL_BACK 1 - -/* LED Commands */ -#define CMD_LED_ON 16 -#define CMD_LED_OFF 17 -#define CMD_LED_BLINK 18 - -struct bios_args { - unsigned char length; - unsigned char result_code; - unsigned char device_id; - unsigned char command; - unsigned char on_time; - unsigned char off_time; -}; - -static int dell_led_perform_fn(u8 length, - u8 result_code, - u8 device_id, - u8 command, - u8 on_time, - u8 off_time) -{ - struct bios_args *bios_return; - u8 return_code; - union acpi_object *obj; - struct acpi_buffer output = { ACPI_ALLOCATE_BUFFER, NULL }; - struct acpi_buffer input; - acpi_status status; - - struct bios_args args; - args.length = length; - args.result_code = result_code; - args.device_id = device_id; - args.command = command; - args.on_time = on_time; - args.off_time = off_time; - - input.length = sizeof(struct bios_args); - input.pointer = &args; - - status = wmi_evaluate_method(DELL_LED_BIOS_GUID, - 1, - 1, - &input, - &output); - - if (ACPI_FAILURE(status)) - return status; - - obj = output.pointer; - - if (!obj) - return -EINVAL; - else if (obj->type != ACPI_TYPE_BUFFER) { - kfree(obj); - return -EINVAL; - } - - bios_return = ((struct bios_args *)obj->buffer.pointer); - return_code = bios_return->result_code; - - kfree(obj); - - return return_code; -} - -static int led_on(void) -{ - return dell_led_perform_fn(3, /* Length of command */ - INTERFACE_ERROR, /* Init to INTERFACE_ERROR */ - DEVICE_ID_PANEL_BACK, /* Device ID */ - CMD_LED_ON, /* Command */ - 0, /* not used */ - 0); /* not used */ -} - -static int led_off(void) -{ - return dell_led_perform_fn(3, /* Length of command */ - INTERFACE_ERROR, /* Init to INTERFACE_ERROR */ - DEVICE_ID_PANEL_BACK, /* Device ID */ - CMD_LED_OFF, /* Command */ - 0, /* not used */ - 0); /* not used */ -} - -static int led_blink(unsigned char on_eighths, - unsigned char off_eighths) -{ - return dell_led_perform_fn(5, /* Length of command */ - INTERFACE_ERROR, /* Init to INTERFACE_ERROR */ - DEVICE_ID_PANEL_BACK, /* Device ID */ - CMD_LED_BLINK, /* Command */ - on_eighths, /* blink on in eigths of a second */ - off_eighths); /* blink off in eights of a second */ -} - -static void dell_led_set(struct led_classdev *led_cdev, - enum led_brightness value) -{ - if (value == LED_OFF) - led_off(); - else - led_on(); -} - -static int dell_led_blink(struct led_classdev *led_cdev, - unsigned long *delay_on, - unsigned long *delay_off) -{ - unsigned long on_eighths; - unsigned long off_eighths; - - /* The Dell LED delay is based on 125ms intervals. - Need to round up to next interval. */ - - on_eighths = (*delay_on + 124) / 125; - if (0 == on_eighths) - on_eighths = 1; - if (on_eighths > 255) - on_eighths = 255; - *delay_on = on_eighths * 125; - - off_eighths = (*delay_off + 124) / 125; - if (0 == off_eighths) - off_eighths = 1; - if (off_eighths > 255) - off_eighths = 255; - *delay_off = off_eighths * 125; - - led_blink(on_eighths, off_eighths); - - return 0; -} - -static struct led_classdev dell_led = { - .name = "dell::lid", - .brightness = LED_OFF, - .max_brightness = 1, - .brightness_set = dell_led_set, - .blink_set = dell_led_blink, - .flags = LED_CORE_SUSPENDRESUME, -}; - -static int __init dell_led_init(void) -{ - int error = 0; - - if (!wmi_has_guid(DELL_LED_BIOS_GUID)) - return -ENODEV; - - error = led_off(); - if (error != 0) - return -ENODEV; - - return led_classdev_register(NULL, &dell_led); -} - -static void __exit dell_led_exit(void) -{ - led_classdev_unregister(&dell_led); - - led_off(); -} - -module_init(dell_led_init); -module_exit(dell_led_exit); diff --git a/ANDROID_3.4.5/drivers/leds/led-class.c b/ANDROID_3.4.5/drivers/leds/led-class.c deleted file mode 100644 index 88410661..00000000 --- a/ANDROID_3.4.5/drivers/leds/led-class.c +++ /dev/null @@ -1,242 +0,0 @@ -/* - * LED Class Core - * - * Copyright (C) 2005 John Lenz <lenz@cs.wisc.edu> - * Copyright (C) 2005-2007 Richard Purdie <rpurdie@openedhand.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ - -#include <linux/module.h> -#include <linux/kernel.h> -#include <linux/init.h> -#include <linux/list.h> -#include <linux/spinlock.h> -#include <linux/device.h> -#include <linux/timer.h> -#include <linux/err.h> -#include <linux/ctype.h> -#include <linux/leds.h> -#include "leds.h" - -static struct class *leds_class; - -static void led_update_brightness(struct led_classdev *led_cdev) -{ - if (led_cdev->brightness_get) - led_cdev->brightness = led_cdev->brightness_get(led_cdev); -} - -static ssize_t led_brightness_show(struct device *dev, - struct device_attribute *attr, char *buf) -{ - struct led_classdev *led_cdev = dev_get_drvdata(dev); - - /* no lock needed for this */ - led_update_brightness(led_cdev); - - return sprintf(buf, "%u\n", led_cdev->brightness); -} - -static ssize_t led_brightness_store(struct device *dev, - struct device_attribute *attr, const char *buf, size_t size) -{ - struct led_classdev *led_cdev = dev_get_drvdata(dev); - ssize_t ret = -EINVAL; - char *after; - unsigned long state = simple_strtoul(buf, &after, 10); - size_t count = after - buf; - - if (isspace(*after)) - count++; - - if (count == size) { - ret = count; - -// if (state == LED_OFF) -// led_trigger_remove(led_cdev); - led_set_brightness(led_cdev, state); - } - - return ret; -} - -static ssize_t led_max_brightness_show(struct device *dev, - struct device_attribute *attr, char *buf) -{ - struct led_classdev *led_cdev = dev_get_drvdata(dev); - - return sprintf(buf, "%u\n", led_cdev->max_brightness); -} - -static struct device_attribute led_class_attrs[] = { - __ATTR(brightness, 0644, led_brightness_show, led_brightness_store), - __ATTR(max_brightness, 0444, led_max_brightness_show, NULL), -#ifdef CONFIG_LEDS_TRIGGERS - __ATTR(trigger, 0644, led_trigger_show, led_trigger_store), -#endif - __ATTR_NULL, -}; - -static void led_timer_function(unsigned long data) -{ - struct led_classdev *led_cdev = (void *)data; - unsigned long brightness; - unsigned long delay; - - if (!led_cdev->blink_delay_on || !led_cdev->blink_delay_off) { - led_set_brightness(led_cdev, LED_OFF); - return; - } - - brightness = led_get_brightness(led_cdev); - if (!brightness) { - /* Time to switch the LED on. */ - brightness = led_cdev->blink_brightness; - delay = led_cdev->blink_delay_on; - } else { - /* Store the current brightness value to be able - * to restore it when the delay_off period is over. - */ - led_cdev->blink_brightness = brightness; - brightness = LED_OFF; - delay = led_cdev->blink_delay_off; - } - - led_set_brightness(led_cdev, brightness); - - mod_timer(&led_cdev->blink_timer, jiffies + msecs_to_jiffies(delay)); -} - -/** - * led_classdev_suspend - suspend an led_classdev. - * @led_cdev: the led_classdev to suspend. - */ -void led_classdev_suspend(struct led_classdev *led_cdev) -{ - led_cdev->flags |= LED_SUSPENDED; - led_cdev->brightness_set(led_cdev, 0); -} -EXPORT_SYMBOL_GPL(led_classdev_suspend); - -/** - * led_classdev_resume - resume an led_classdev. - * @led_cdev: the led_classdev to resume. - */ -void led_classdev_resume(struct led_classdev *led_cdev) -{ - led_cdev->brightness_set(led_cdev, led_cdev->brightness); - led_cdev->flags &= ~LED_SUSPENDED; -} -EXPORT_SYMBOL_GPL(led_classdev_resume); - -static int led_suspend(struct device *dev, pm_message_t state) -{ - struct led_classdev *led_cdev = dev_get_drvdata(dev); - - if (led_cdev->flags & LED_CORE_SUSPENDRESUME) - led_classdev_suspend(led_cdev); - - return 0; -} - -static int led_resume(struct device *dev) -{ - struct led_classdev *led_cdev = dev_get_drvdata(dev); - - if (led_cdev->flags & LED_CORE_SUSPENDRESUME) - led_classdev_resume(led_cdev); - - return 0; -} - -/** - * led_classdev_register - register a new object of led_classdev class. - * @parent: The device to register. - * @led_cdev: the led_classdev structure for this device. - */ -int led_classdev_register(struct device *parent, struct led_classdev *led_cdev) -{ - led_cdev->dev = device_create(leds_class, parent, 0, led_cdev, - "%s", led_cdev->name); - if (IS_ERR(led_cdev->dev)) - return PTR_ERR(led_cdev->dev); - -#ifdef CONFIG_LEDS_TRIGGERS - init_rwsem(&led_cdev->trigger_lock); -#endif - /* add to the list of leds */ - down_write(&leds_list_lock); - list_add_tail(&led_cdev->node, &leds_list); - up_write(&leds_list_lock); - - if (!led_cdev->max_brightness) - led_cdev->max_brightness = LED_FULL; - - led_update_brightness(led_cdev); - - init_timer(&led_cdev->blink_timer); - led_cdev->blink_timer.function = led_timer_function; - led_cdev->blink_timer.data = (unsigned long)led_cdev; - -#ifdef CONFIG_LEDS_TRIGGERS - led_trigger_set_default(led_cdev); -#endif - - printk(KERN_DEBUG "Registered led device: %s\n", - led_cdev->name); - - return 0; -} -EXPORT_SYMBOL_GPL(led_classdev_register); - -/** - * led_classdev_unregister - unregisters a object of led_properties class. - * @led_cdev: the led device to unregister - * - * Unregisters a previously registered via led_classdev_register object. - */ -void led_classdev_unregister(struct led_classdev *led_cdev) -{ -#ifdef CONFIG_LEDS_TRIGGERS - down_write(&led_cdev->trigger_lock); - if (led_cdev->trigger) - led_trigger_set(led_cdev, NULL); - up_write(&led_cdev->trigger_lock); -#endif - - /* Stop blinking */ - led_brightness_set(led_cdev, LED_OFF); - - device_unregister(led_cdev->dev); - - down_write(&leds_list_lock); - list_del(&led_cdev->node); - up_write(&leds_list_lock); -} -EXPORT_SYMBOL_GPL(led_classdev_unregister); - -static int __init leds_init(void) -{ - leds_class = class_create(THIS_MODULE, "leds"); - if (IS_ERR(leds_class)) - return PTR_ERR(leds_class); - leds_class->suspend = led_suspend; - leds_class->resume = led_resume; - leds_class->dev_attrs = led_class_attrs; - return 0; -} - -static void __exit leds_exit(void) -{ - class_destroy(leds_class); -} - -subsys_initcall(leds_init); -module_exit(leds_exit); - -MODULE_AUTHOR("John Lenz, Richard Purdie"); -MODULE_LICENSE("GPL"); -MODULE_DESCRIPTION("LED Class Interface"); diff --git a/ANDROID_3.4.5/drivers/leds/led-core.c b/ANDROID_3.4.5/drivers/leds/led-core.c deleted file mode 100644 index 05e714a4..00000000 --- a/ANDROID_3.4.5/drivers/leds/led-core.c +++ /dev/null @@ -1,95 +0,0 @@ -/* - * LED Class Core - * - * Copyright 2005-2006 Openedhand Ltd. - * - * Author: Richard Purdie <rpurdie@openedhand.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - */ - -#include <linux/kernel.h> -#include <linux/list.h> -#include <linux/module.h> -#include <linux/rwsem.h> -#include <linux/leds.h> -#include "leds.h" - -DECLARE_RWSEM(leds_list_lock); -EXPORT_SYMBOL_GPL(leds_list_lock); - -LIST_HEAD(leds_list); -EXPORT_SYMBOL_GPL(leds_list); - -static void led_stop_software_blink(struct led_classdev *led_cdev) -{ - /* deactivate previous settings */ - del_timer_sync(&led_cdev->blink_timer); - led_cdev->blink_delay_on = 0; - led_cdev->blink_delay_off = 0; -} - -static void led_set_software_blink(struct led_classdev *led_cdev, - unsigned long delay_on, - unsigned long delay_off) -{ - int current_brightness; - - current_brightness = led_get_brightness(led_cdev); - if (current_brightness) - led_cdev->blink_brightness = current_brightness; - if (!led_cdev->blink_brightness) - led_cdev->blink_brightness = led_cdev->max_brightness; - - if (led_get_trigger_data(led_cdev) && - delay_on == led_cdev->blink_delay_on && - delay_off == led_cdev->blink_delay_off) - return; - - led_stop_software_blink(led_cdev); - - led_cdev->blink_delay_on = delay_on; - led_cdev->blink_delay_off = delay_off; - - /* never on - don't blink */ - if (!delay_on) - return; - - /* never off - just set to brightness */ - if (!delay_off) { - led_set_brightness(led_cdev, led_cdev->blink_brightness); - return; - } - - mod_timer(&led_cdev->blink_timer, jiffies + 1); -} - - -void led_blink_set(struct led_classdev *led_cdev, - unsigned long *delay_on, - unsigned long *delay_off) -{ - del_timer_sync(&led_cdev->blink_timer); - - if (led_cdev->blink_set && - !led_cdev->blink_set(led_cdev, delay_on, delay_off)) - return; - - /* blink with 1 Hz as default if nothing specified */ - if (!*delay_on && !*delay_off) - *delay_on = *delay_off = 0; - - led_set_software_blink(led_cdev, *delay_on, *delay_off); -} -EXPORT_SYMBOL(led_blink_set); - -void led_brightness_set(struct led_classdev *led_cdev, - enum led_brightness brightness) -{ - led_stop_software_blink(led_cdev); - led_cdev->brightness_set(led_cdev, brightness); -} -EXPORT_SYMBOL(led_brightness_set); diff --git a/ANDROID_3.4.5/drivers/leds/led-triggers.c b/ANDROID_3.4.5/drivers/leds/led-triggers.c deleted file mode 100644 index a85ce094..00000000 --- a/ANDROID_3.4.5/drivers/leds/led-triggers.c +++ /dev/null @@ -1,300 +0,0 @@ -/* - * LED Triggers Core - * - * Copyright 2005-2007 Openedhand Ltd. - * - * Author: Richard Purdie <rpurdie@openedhand.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - */ - -#include <linux/module.h> -#include <linux/kernel.h> -#include <linux/init.h> -#include <linux/list.h> -#include <linux/spinlock.h> -#include <linux/device.h> -#include <linux/timer.h> -#include <linux/rwsem.h> -#include <linux/leds.h> -#include <linux/slab.h> -#include "leds.h" - -/* - * Nests outside led_cdev->trigger_lock - */ -static DECLARE_RWSEM(triggers_list_lock); -static LIST_HEAD(trigger_list); - - /* Used by LED Class */ - -ssize_t led_trigger_store(struct device *dev, struct device_attribute *attr, - const char *buf, size_t count) -{ - struct led_classdev *led_cdev = dev_get_drvdata(dev); - char trigger_name[TRIG_NAME_MAX]; - struct led_trigger *trig; - size_t len; - - trigger_name[sizeof(trigger_name) - 1] = '\0'; - strncpy(trigger_name, buf, sizeof(trigger_name) - 1); - len = strlen(trigger_name); - - if (len && trigger_name[len - 1] == '\n') - trigger_name[len - 1] = '\0'; - - if (!strcmp(trigger_name, "none")) { - led_trigger_remove(led_cdev); - return count; - } - - down_read(&triggers_list_lock); - list_for_each_entry(trig, &trigger_list, next_trig) { - if (!strcmp(trigger_name, trig->name)) { - down_write(&led_cdev->trigger_lock); - led_trigger_set(led_cdev, trig); - up_write(&led_cdev->trigger_lock); - - up_read(&triggers_list_lock); - return count; - } - } - up_read(&triggers_list_lock); - - return -EINVAL; -} -EXPORT_SYMBOL_GPL(led_trigger_store); - -ssize_t led_trigger_show(struct device *dev, struct device_attribute *attr, - char *buf) -{ - struct led_classdev *led_cdev = dev_get_drvdata(dev); - struct led_trigger *trig; - int len = 0; - - down_read(&triggers_list_lock); - down_read(&led_cdev->trigger_lock); - - if (!led_cdev->trigger) - len += sprintf(buf+len, "[none] "); - else - len += sprintf(buf+len, "none "); - - list_for_each_entry(trig, &trigger_list, next_trig) { - if (led_cdev->trigger && !strcmp(led_cdev->trigger->name, - trig->name)) - len += sprintf(buf+len, "[%s] ", trig->name); - else - len += sprintf(buf+len, "%s ", trig->name); - } - up_read(&led_cdev->trigger_lock); - up_read(&triggers_list_lock); - - len += sprintf(len+buf, "\n"); - return len; -} -EXPORT_SYMBOL_GPL(led_trigger_show); - -/* Caller must ensure led_cdev->trigger_lock held */ -void led_trigger_set(struct led_classdev *led_cdev, struct led_trigger *trigger) -{ - unsigned long flags; - char *event = NULL; - char *envp[2]; - const char *name; - - name = trigger ? trigger->name : "none"; - event = kasprintf(GFP_KERNEL, "TRIGGER=%s", name); - - /* Remove any existing trigger */ - if (led_cdev->trigger) { - write_lock_irqsave(&led_cdev->trigger->leddev_list_lock, flags); - list_del(&led_cdev->trig_list); - write_unlock_irqrestore(&led_cdev->trigger->leddev_list_lock, - flags); - if (led_cdev->trigger->deactivate) - led_cdev->trigger->deactivate(led_cdev); - led_cdev->trigger = NULL; - led_brightness_set(led_cdev, LED_OFF); - } - if (trigger) { - write_lock_irqsave(&trigger->leddev_list_lock, flags); - list_add_tail(&led_cdev->trig_list, &trigger->led_cdevs); - write_unlock_irqrestore(&trigger->leddev_list_lock, flags); - led_cdev->trigger = trigger; - if (trigger->activate) - trigger->activate(led_cdev); - } - - if (event) { - envp[0] = event; - envp[1] = NULL; - kobject_uevent_env(&led_cdev->dev->kobj, KOBJ_CHANGE, envp); - kfree(event); - } -} -EXPORT_SYMBOL_GPL(led_trigger_set); - -void led_trigger_remove(struct led_classdev *led_cdev) -{ - down_write(&led_cdev->trigger_lock); - led_trigger_set(led_cdev, NULL); - up_write(&led_cdev->trigger_lock); -} -EXPORT_SYMBOL_GPL(led_trigger_remove); - -void led_trigger_set_default(struct led_classdev *led_cdev) -{ - struct led_trigger *trig; - - if (!led_cdev->default_trigger) - return; - - down_read(&triggers_list_lock); - down_write(&led_cdev->trigger_lock); - list_for_each_entry(trig, &trigger_list, next_trig) { - if (!strcmp(led_cdev->default_trigger, trig->name)) - led_trigger_set(led_cdev, trig); - } - up_write(&led_cdev->trigger_lock); - up_read(&triggers_list_lock); -} -EXPORT_SYMBOL_GPL(led_trigger_set_default); - -/* LED Trigger Interface */ - -int led_trigger_register(struct led_trigger *trigger) -{ - struct led_classdev *led_cdev; - struct led_trigger *trig; - - rwlock_init(&trigger->leddev_list_lock); - INIT_LIST_HEAD(&trigger->led_cdevs); - - down_write(&triggers_list_lock); - /* Make sure the trigger's name isn't already in use */ - list_for_each_entry(trig, &trigger_list, next_trig) { - if (!strcmp(trig->name, trigger->name)) { - up_write(&triggers_list_lock); - return -EEXIST; - } - } - /* Add to the list of led triggers */ - list_add_tail(&trigger->next_trig, &trigger_list); - up_write(&triggers_list_lock); - - /* Register with any LEDs that have this as a default trigger */ - down_read(&leds_list_lock); - list_for_each_entry(led_cdev, &leds_list, node) { - down_write(&led_cdev->trigger_lock); - if (!led_cdev->trigger && led_cdev->default_trigger && - !strcmp(led_cdev->default_trigger, trigger->name)) - led_trigger_set(led_cdev, trigger); - up_write(&led_cdev->trigger_lock); - } - up_read(&leds_list_lock); - - return 0; -} -EXPORT_SYMBOL_GPL(led_trigger_register); - -void led_trigger_unregister(struct led_trigger *trigger) -{ - struct led_classdev *led_cdev; - - /* Remove from the list of led triggers */ - down_write(&triggers_list_lock); - list_del(&trigger->next_trig); - up_write(&triggers_list_lock); - - /* Remove anyone actively using this trigger */ - down_read(&leds_list_lock); - list_for_each_entry(led_cdev, &leds_list, node) { - down_write(&led_cdev->trigger_lock); - if (led_cdev->trigger == trigger) - led_trigger_set(led_cdev, NULL); - up_write(&led_cdev->trigger_lock); - } - up_read(&leds_list_lock); -} -EXPORT_SYMBOL_GPL(led_trigger_unregister); - -/* Simple LED Tigger Interface */ - -void led_trigger_event(struct led_trigger *trigger, - enum led_brightness brightness) -{ - struct list_head *entry; - - if (!trigger) - return; - - read_lock(&trigger->leddev_list_lock); - list_for_each(entry, &trigger->led_cdevs) { - struct led_classdev *led_cdev; - - led_cdev = list_entry(entry, struct led_classdev, trig_list); - led_set_brightness(led_cdev, brightness); - } - read_unlock(&trigger->leddev_list_lock); -} -EXPORT_SYMBOL_GPL(led_trigger_event); - -void led_trigger_blink(struct led_trigger *trigger, - unsigned long *delay_on, - unsigned long *delay_off) -{ - struct list_head *entry; - - if (!trigger) - return; - - read_lock(&trigger->leddev_list_lock); - list_for_each(entry, &trigger->led_cdevs) { - struct led_classdev *led_cdev; - - led_cdev = list_entry(entry, struct led_classdev, trig_list); - led_blink_set(led_cdev, delay_on, delay_off); - } - read_unlock(&trigger->leddev_list_lock); -} -EXPORT_SYMBOL_GPL(led_trigger_blink); - -void led_trigger_register_simple(const char *name, struct led_trigger **tp) -{ - struct led_trigger *trigger; - int err; - - trigger = kzalloc(sizeof(struct led_trigger), GFP_KERNEL); - - if (trigger) { - trigger->name = name; - err = led_trigger_register(trigger); - if (err < 0) { - kfree(trigger); - trigger = NULL; - printk(KERN_WARNING "LED trigger %s failed to register" - " (%d)\n", name, err); - } - } else - printk(KERN_WARNING "LED trigger %s failed to register" - " (no memory)\n", name); - - *tp = trigger; -} -EXPORT_SYMBOL_GPL(led_trigger_register_simple); - -void led_trigger_unregister_simple(struct led_trigger *trigger) -{ - if (trigger) - led_trigger_unregister(trigger); - kfree(trigger); -} -EXPORT_SYMBOL_GPL(led_trigger_unregister_simple); - -MODULE_AUTHOR("Richard Purdie"); -MODULE_LICENSE("GPL"); -MODULE_DESCRIPTION("LED Triggers Core"); diff --git a/ANDROID_3.4.5/drivers/leds/leds-88pm860x.c b/ANDROID_3.4.5/drivers/leds/leds-88pm860x.c deleted file mode 100644 index 5b61aaf7..00000000 --- a/ANDROID_3.4.5/drivers/leds/leds-88pm860x.c +++ /dev/null @@ -1,269 +0,0 @@ -/* - * LED driver for Marvell 88PM860x - * - * Copyright (C) 2009 Marvell International Ltd. - * Haojian Zhuang <haojian.zhuang@marvell.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - */ - -#include <linux/kernel.h> -#include <linux/init.h> -#include <linux/platform_device.h> -#include <linux/i2c.h> -#include <linux/leds.h> -#include <linux/slab.h> -#include <linux/workqueue.h> -#include <linux/mfd/88pm860x.h> -#include <linux/module.h> - -#define LED_PWM_SHIFT (3) -#define LED_PWM_MASK (0x1F) -#define LED_CURRENT_MASK (0x07 << 5) - -#define LED_BLINK_ON_MASK (0x07) -#define LED_BLINK_MASK (0x7F) - -#define LED_BLINK_ON(x) ((x & 0x7) * 66 + 66) -#define LED_BLINK_ON_MIN LED_BLINK_ON(0) -#define LED_BLINK_ON_MAX LED_BLINK_ON(0x7) -#define LED_ON_CONTINUOUS (0x0F << 3) -#define LED_TO_ON(x) ((x - 66) / 66) - -#define LED1_BLINK_EN (1 << 1) -#define LED2_BLINK_EN (1 << 2) - -struct pm860x_led { - struct led_classdev cdev; - struct i2c_client *i2c; - struct work_struct work; - struct pm860x_chip *chip; - struct mutex lock; - char name[MFD_NAME_SIZE]; - - int port; - int iset; - unsigned char brightness; - unsigned char current_brightness; - - int blink_data; - int blink_time; - int blink_on; - int blink_off; -}; - -/* return offset of color register */ -static inline int __led_off(int port) -{ - int ret = -EINVAL; - - switch (port) { - case PM8606_LED1_RED: - case PM8606_LED1_GREEN: - case PM8606_LED1_BLUE: - ret = port - PM8606_LED1_RED + PM8606_RGB1B; - break; - case PM8606_LED2_RED: - case PM8606_LED2_GREEN: - case PM8606_LED2_BLUE: - ret = port - PM8606_LED2_RED + PM8606_RGB2B; - break; - } - return ret; -} - -/* return offset of blink register */ -static inline int __blink_off(int port) -{ - int ret = -EINVAL; - - switch (port) { - case PM8606_LED1_RED: - case PM8606_LED1_GREEN: - case PM8606_LED1_BLUE: - ret = PM8606_RGB1A; - break; - case PM8606_LED2_RED: - case PM8606_LED2_GREEN: - case PM8606_LED2_BLUE: - ret = PM8606_RGB2A; - break; - } - return ret; -} - -static inline int __blink_ctl_mask(int port) -{ - int ret = -EINVAL; - - switch (port) { - case PM8606_LED1_RED: - case PM8606_LED1_GREEN: - case PM8606_LED1_BLUE: - ret = LED1_BLINK_EN; - break; - case PM8606_LED2_RED: - case PM8606_LED2_GREEN: - case PM8606_LED2_BLUE: - ret = LED2_BLINK_EN; - break; - } - return ret; -} - -static int led_power_set(struct pm860x_chip *chip, int port, int on) -{ - int ret = -EINVAL; - - switch (port) { - case PM8606_LED1_RED: - case PM8606_LED1_GREEN: - case PM8606_LED1_BLUE: - ret = on ? pm8606_osc_enable(chip, RGB1_ENABLE) : - pm8606_osc_disable(chip, RGB1_ENABLE); - break; - case PM8606_LED2_RED: - case PM8606_LED2_GREEN: - case PM8606_LED2_BLUE: - ret = on ? pm8606_osc_enable(chip, RGB2_ENABLE) : - pm8606_osc_disable(chip, RGB2_ENABLE); - break; - } - return ret; -} - -static void pm860x_led_work(struct work_struct *work) -{ - - struct pm860x_led *led; - struct pm860x_chip *chip; - unsigned char buf[3]; - int mask, ret; - - led = container_of(work, struct pm860x_led, work); - chip = led->chip; - mutex_lock(&led->lock); - if ((led->current_brightness == 0) && led->brightness) { - led_power_set(chip, led->port, 1); - if (led->iset) { - pm860x_set_bits(led->i2c, __led_off(led->port), - LED_CURRENT_MASK, led->iset); - } - pm860x_set_bits(led->i2c, __blink_off(led->port), - LED_BLINK_MASK, LED_ON_CONTINUOUS); - mask = __blink_ctl_mask(led->port); - pm860x_set_bits(led->i2c, PM8606_WLED3B, mask, mask); - } - pm860x_set_bits(led->i2c, __led_off(led->port), LED_PWM_MASK, - led->brightness); - - if (led->brightness == 0) { - pm860x_bulk_read(led->i2c, __led_off(led->port), 3, buf); - ret = buf[0] & LED_PWM_MASK; - ret |= buf[1] & LED_PWM_MASK; - ret |= buf[2] & LED_PWM_MASK; - if (ret == 0) { - /* unset current since no led is lighting */ - pm860x_set_bits(led->i2c, __led_off(led->port), - LED_CURRENT_MASK, 0); - mask = __blink_ctl_mask(led->port); - pm860x_set_bits(led->i2c, PM8606_WLED3B, mask, 0); - led_power_set(chip, led->port, 0); - } - } - led->current_brightness = led->brightness; - dev_dbg(chip->dev, "Update LED. (reg:%d, brightness:%d)\n", - __led_off(led->port), led->brightness); - mutex_unlock(&led->lock); -} - -static void pm860x_led_set(struct led_classdev *cdev, - enum led_brightness value) -{ - struct pm860x_led *data = container_of(cdev, struct pm860x_led, cdev); - - data->brightness = value >> 3; - schedule_work(&data->work); -} - -static int pm860x_led_probe(struct platform_device *pdev) -{ - struct pm860x_chip *chip = dev_get_drvdata(pdev->dev.parent); - struct pm860x_led_pdata *pdata; - struct pm860x_led *data; - struct resource *res; - int ret; - - res = platform_get_resource(pdev, IORESOURCE_IO, 0); - if (res == NULL) { - dev_err(&pdev->dev, "No I/O resource!\n"); - return -EINVAL; - } - - pdata = pdev->dev.platform_data; - if (pdata == NULL) { - dev_err(&pdev->dev, "No platform data!\n"); - return -EINVAL; - } - - data = kzalloc(sizeof(struct pm860x_led), GFP_KERNEL); - if (data == NULL) - return -ENOMEM; - strncpy(data->name, res->name, MFD_NAME_SIZE - 1); - dev_set_drvdata(&pdev->dev, data); - data->chip = chip; - data->i2c = (chip->id == CHIP_PM8606) ? chip->client : chip->companion; - data->iset = pdata->iset; - data->port = pdata->flags; - if (data->port < 0) { - dev_err(&pdev->dev, "check device failed\n"); - kfree(data); - return -EINVAL; - } - - data->current_brightness = 0; - data->cdev.name = data->name; - data->cdev.brightness_set = pm860x_led_set; - mutex_init(&data->lock); - INIT_WORK(&data->work, pm860x_led_work); - - ret = led_classdev_register(chip->dev, &data->cdev); - if (ret < 0) { - dev_err(&pdev->dev, "Failed to register LED: %d\n", ret); - goto out; - } - pm860x_led_set(&data->cdev, 0); - return 0; -out: - kfree(data); - return ret; -} - -static int pm860x_led_remove(struct platform_device *pdev) -{ - struct pm860x_led *data = platform_get_drvdata(pdev); - - led_classdev_unregister(&data->cdev); - kfree(data); - - return 0; -} - -static struct platform_driver pm860x_led_driver = { - .driver = { - .name = "88pm860x-led", - .owner = THIS_MODULE, - }, - .probe = pm860x_led_probe, - .remove = pm860x_led_remove, -}; - -module_platform_driver(pm860x_led_driver); - -MODULE_DESCRIPTION("LED driver for Marvell PM860x"); -MODULE_AUTHOR("Haojian Zhuang <haojian.zhuang@marvell.com>"); -MODULE_LICENSE("GPL"); -MODULE_ALIAS("platform:88pm860x-led"); diff --git a/ANDROID_3.4.5/drivers/leds/leds-adp5520.c b/ANDROID_3.4.5/drivers/leds/leds-adp5520.c deleted file mode 100644 index b1400db3..00000000 --- a/ANDROID_3.4.5/drivers/leds/leds-adp5520.c +++ /dev/null @@ -1,221 +0,0 @@ -/* - * LEDs driver for Analog Devices ADP5520/ADP5501 MFD PMICs - * - * Copyright 2009 Analog Devices Inc. - * - * Loosely derived from leds-da903x: - * Copyright (C) 2008 Compulab, Ltd. - * Mike Rapoport <mike@compulab.co.il> - * - * Copyright (C) 2006-2008 Marvell International Ltd. - * Eric Miao <eric.miao@marvell.com> - * - * Licensed under the GPL-2 or later. - */ - -#include <linux/module.h> -#include <linux/kernel.h> -#include <linux/init.h> -#include <linux/platform_device.h> -#include <linux/leds.h> -#include <linux/workqueue.h> -#include <linux/mfd/adp5520.h> -#include <linux/slab.h> - -struct adp5520_led { - struct led_classdev cdev; - struct work_struct work; - struct device *master; - enum led_brightness new_brightness; - int id; - int flags; -}; - -static void adp5520_led_work(struct work_struct *work) -{ - struct adp5520_led *led = container_of(work, struct adp5520_led, work); - adp5520_write(led->master, ADP5520_LED1_CURRENT + led->id - 1, - led->new_brightness >> 2); -} - -static void adp5520_led_set(struct led_classdev *led_cdev, - enum led_brightness value) -{ - struct adp5520_led *led; - - led = container_of(led_cdev, struct adp5520_led, cdev); - led->new_brightness = value; - schedule_work(&led->work); -} - -static int adp5520_led_setup(struct adp5520_led *led) -{ - struct device *dev = led->master; - int flags = led->flags; - int ret = 0; - - switch (led->id) { - case FLAG_ID_ADP5520_LED1_ADP5501_LED0: - ret |= adp5520_set_bits(dev, ADP5520_LED_TIME, - (flags >> ADP5520_FLAG_OFFT_SHIFT) & - ADP5520_FLAG_OFFT_MASK); - ret |= adp5520_set_bits(dev, ADP5520_LED_CONTROL, - ADP5520_LED1_EN); - break; - case FLAG_ID_ADP5520_LED2_ADP5501_LED1: - ret |= adp5520_set_bits(dev, ADP5520_LED_TIME, - ((flags >> ADP5520_FLAG_OFFT_SHIFT) & - ADP5520_FLAG_OFFT_MASK) << 2); - ret |= adp5520_clr_bits(dev, ADP5520_LED_CONTROL, - ADP5520_R3_MODE); - ret |= adp5520_set_bits(dev, ADP5520_LED_CONTROL, - ADP5520_LED2_EN); - break; - case FLAG_ID_ADP5520_LED3_ADP5501_LED2: - ret |= adp5520_set_bits(dev, ADP5520_LED_TIME, - ((flags >> ADP5520_FLAG_OFFT_SHIFT) & - ADP5520_FLAG_OFFT_MASK) << 4); - ret |= adp5520_clr_bits(dev, ADP5520_LED_CONTROL, - ADP5520_C3_MODE); - ret |= adp5520_set_bits(dev, ADP5520_LED_CONTROL, - ADP5520_LED3_EN); - break; - } - - return ret; -} - -static int __devinit adp5520_led_prepare(struct platform_device *pdev) -{ - struct adp5520_leds_platform_data *pdata = pdev->dev.platform_data; - struct device *dev = pdev->dev.parent; - int ret = 0; - - ret |= adp5520_write(dev, ADP5520_LED1_CURRENT, 0); - ret |= adp5520_write(dev, ADP5520_LED2_CURRENT, 0); - ret |= adp5520_write(dev, ADP5520_LED3_CURRENT, 0); - ret |= adp5520_write(dev, ADP5520_LED_TIME, pdata->led_on_time << 6); - ret |= adp5520_write(dev, ADP5520_LED_FADE, FADE_VAL(pdata->fade_in, - pdata->fade_out)); - - return ret; -} - -static int __devinit adp5520_led_probe(struct platform_device *pdev) -{ - struct adp5520_leds_platform_data *pdata = pdev->dev.platform_data; - struct adp5520_led *led, *led_dat; - struct led_info *cur_led; - int ret, i; - - if (pdata == NULL) { - dev_err(&pdev->dev, "missing platform data\n"); - return -ENODEV; - } - - if (pdata->num_leds > ADP5520_01_MAXLEDS) { - dev_err(&pdev->dev, "can't handle more than %d LEDS\n", - ADP5520_01_MAXLEDS); - return -EFAULT; - } - - led = kzalloc(sizeof(*led) * pdata->num_leds, GFP_KERNEL); - if (led == NULL) { - dev_err(&pdev->dev, "failed to alloc memory\n"); - return -ENOMEM; - } - - ret = adp5520_led_prepare(pdev); - - if (ret) { - dev_err(&pdev->dev, "failed to write\n"); - goto err_free; - } - - for (i = 0; i < pdata->num_leds; ++i) { - cur_led = &pdata->leds[i]; - led_dat = &led[i]; - - led_dat->cdev.name = cur_led->name; - led_dat->cdev.default_trigger = cur_led->default_trigger; - led_dat->cdev.brightness_set = adp5520_led_set; - led_dat->cdev.brightness = LED_OFF; - - if (cur_led->flags & ADP5520_FLAG_LED_MASK) - led_dat->flags = cur_led->flags; - else - led_dat->flags = i + 1; - - led_dat->id = led_dat->flags & ADP5520_FLAG_LED_MASK; - - led_dat->master = pdev->dev.parent; - led_dat->new_brightness = LED_OFF; - - INIT_WORK(&led_dat->work, adp5520_led_work); - - ret = led_classdev_register(led_dat->master, &led_dat->cdev); - if (ret) { - dev_err(&pdev->dev, "failed to register LED %d\n", - led_dat->id); - goto err; - } - - ret = adp5520_led_setup(led_dat); - if (ret) { - dev_err(&pdev->dev, "failed to write\n"); - i++; - goto err; - } - } - - platform_set_drvdata(pdev, led); - return 0; - -err: - if (i > 0) { - for (i = i - 1; i >= 0; i--) { - led_classdev_unregister(&led[i].cdev); - cancel_work_sync(&led[i].work); - } - } - -err_free: - kfree(led); - return ret; -} - -static int __devexit adp5520_led_remove(struct platform_device *pdev) -{ - struct adp5520_leds_platform_data *pdata = pdev->dev.platform_data; - struct adp5520_led *led; - int i; - - led = platform_get_drvdata(pdev); - - adp5520_clr_bits(led->master, ADP5520_LED_CONTROL, - ADP5520_LED1_EN | ADP5520_LED2_EN | ADP5520_LED3_EN); - - for (i = 0; i < pdata->num_leds; i++) { - led_classdev_unregister(&led[i].cdev); - cancel_work_sync(&led[i].work); - } - - kfree(led); - return 0; -} - -static struct platform_driver adp5520_led_driver = { - .driver = { - .name = "adp5520-led", - .owner = THIS_MODULE, - }, - .probe = adp5520_led_probe, - .remove = __devexit_p(adp5520_led_remove), -}; - -module_platform_driver(adp5520_led_driver); - -MODULE_AUTHOR("Michael Hennerich <hennerich@blackfin.uclinux.org>"); -MODULE_DESCRIPTION("LEDS ADP5520(01) Driver"); -MODULE_LICENSE("GPL"); -MODULE_ALIAS("platform:adp5520-led"); diff --git a/ANDROID_3.4.5/drivers/leds/leds-asic3.c b/ANDROID_3.4.5/drivers/leds/leds-asic3.c deleted file mode 100644 index 525a9249..00000000 --- a/ANDROID_3.4.5/drivers/leds/leds-asic3.c +++ /dev/null @@ -1,187 +0,0 @@ -/* - * Copyright (C) 2011 Paul Parsons <lost.distance@yahoo.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ - -#include <linux/kernel.h> -#include <linux/init.h> -#include <linux/platform_device.h> -#include <linux/leds.h> -#include <linux/slab.h> - -#include <linux/mfd/asic3.h> -#include <linux/mfd/core.h> -#include <linux/module.h> - -/* - * The HTC ASIC3 LED GPIOs are inputs, not outputs. - * Hence we turn the LEDs on/off via the TimeBase register. - */ - -/* - * When TimeBase is 4 the clock resolution is about 32Hz. - * This driver supports hardware blinking with an on+off - * period from 62ms (2 clocks) to 125s (4000 clocks). - */ -#define MS_TO_CLK(ms) DIV_ROUND_CLOSEST(((ms)*1024), 32000) -#define CLK_TO_MS(clk) (((clk)*32000)/1024) -#define MAX_CLK 4000 /* Fits into 12-bit Time registers */ -#define MAX_MS CLK_TO_MS(MAX_CLK) - -static const unsigned int led_n_base[ASIC3_NUM_LEDS] = { - [0] = ASIC3_LED_0_Base, - [1] = ASIC3_LED_1_Base, - [2] = ASIC3_LED_2_Base, -}; - -static void brightness_set(struct led_classdev *cdev, - enum led_brightness value) -{ - struct platform_device *pdev = to_platform_device(cdev->dev->parent); - const struct mfd_cell *cell = mfd_get_cell(pdev); - struct asic3 *asic = dev_get_drvdata(pdev->dev.parent); - u32 timebase; - unsigned int base; - - timebase = (value == LED_OFF) ? 0 : (LED_EN|0x4); - - base = led_n_base[cell->id]; - asic3_write_register(asic, (base + ASIC3_LED_PeriodTime), 32); - asic3_write_register(asic, (base + ASIC3_LED_DutyTime), 32); - asic3_write_register(asic, (base + ASIC3_LED_AutoStopCount), 0); - asic3_write_register(asic, (base + ASIC3_LED_TimeBase), timebase); -} - -static int blink_set(struct led_classdev *cdev, - unsigned long *delay_on, - unsigned long *delay_off) -{ - struct platform_device *pdev = to_platform_device(cdev->dev->parent); - const struct mfd_cell *cell = mfd_get_cell(pdev); - struct asic3 *asic = dev_get_drvdata(pdev->dev.parent); - u32 on; - u32 off; - unsigned int base; - - if (*delay_on > MAX_MS || *delay_off > MAX_MS) - return -EINVAL; - - if (*delay_on == 0 && *delay_off == 0) { - /* If both are zero then a sensible default should be chosen */ - on = MS_TO_CLK(500); - off = MS_TO_CLK(500); - } else { - on = MS_TO_CLK(*delay_on); - off = MS_TO_CLK(*delay_off); - if ((on + off) > MAX_CLK) - return -EINVAL; - } - - base = led_n_base[cell->id]; - asic3_write_register(asic, (base + ASIC3_LED_PeriodTime), (on + off)); - asic3_write_register(asic, (base + ASIC3_LED_DutyTime), on); - asic3_write_register(asic, (base + ASIC3_LED_AutoStopCount), 0); - asic3_write_register(asic, (base + ASIC3_LED_TimeBase), (LED_EN|0x4)); - - *delay_on = CLK_TO_MS(on); - *delay_off = CLK_TO_MS(off); - - return 0; -} - -static int __devinit asic3_led_probe(struct platform_device *pdev) -{ - struct asic3_led *led = pdev->dev.platform_data; - int ret; - - ret = mfd_cell_enable(pdev); - if (ret < 0) - goto ret0; - - led->cdev = kzalloc(sizeof(struct led_classdev), GFP_KERNEL); - if (!led->cdev) { - ret = -ENOMEM; - goto ret1; - } - - led->cdev->name = led->name; - led->cdev->flags = LED_CORE_SUSPENDRESUME; - led->cdev->brightness_set = brightness_set; - led->cdev->blink_set = blink_set; - led->cdev->default_trigger = led->default_trigger; - - ret = led_classdev_register(&pdev->dev, led->cdev); - if (ret < 0) - goto ret2; - - return 0; - -ret2: - kfree(led->cdev); -ret1: - (void) mfd_cell_disable(pdev); -ret0: - return ret; -} - -static int __devexit asic3_led_remove(struct platform_device *pdev) -{ - struct asic3_led *led = pdev->dev.platform_data; - - led_classdev_unregister(led->cdev); - - kfree(led->cdev); - - return mfd_cell_disable(pdev); -} - -static int asic3_led_suspend(struct device *dev) -{ - struct platform_device *pdev = to_platform_device(dev); - const struct mfd_cell *cell = mfd_get_cell(pdev); - int ret; - - ret = 0; - if (cell->suspend) - ret = (*cell->suspend)(pdev); - - return ret; -} - -static int asic3_led_resume(struct device *dev) -{ - struct platform_device *pdev = to_platform_device(dev); - const struct mfd_cell *cell = mfd_get_cell(pdev); - int ret; - - ret = 0; - if (cell->resume) - ret = (*cell->resume)(pdev); - - return ret; -} - -static const struct dev_pm_ops asic3_led_pm_ops = { - .suspend = asic3_led_suspend, - .resume = asic3_led_resume, -}; - -static struct platform_driver asic3_led_driver = { - .probe = asic3_led_probe, - .remove = __devexit_p(asic3_led_remove), - .driver = { - .name = "leds-asic3", - .owner = THIS_MODULE, - .pm = &asic3_led_pm_ops, - }, -}; - -module_platform_driver(asic3_led_driver); - -MODULE_AUTHOR("Paul Parsons <lost.distance@yahoo.com>"); -MODULE_DESCRIPTION("HTC ASIC3 LED driver"); -MODULE_LICENSE("GPL"); -MODULE_ALIAS("platform:leds-asic3"); diff --git a/ANDROID_3.4.5/drivers/leds/leds-atmel-pwm.c b/ANDROID_3.4.5/drivers/leds/leds-atmel-pwm.c deleted file mode 100644 index 64ad702a..00000000 --- a/ANDROID_3.4.5/drivers/leds/leds-atmel-pwm.c +++ /dev/null @@ -1,151 +0,0 @@ -#include <linux/kernel.h> -#include <linux/platform_device.h> -#include <linux/leds.h> -#include <linux/io.h> -#include <linux/atmel_pwm.h> -#include <linux/slab.h> -#include <linux/module.h> - - -struct pwmled { - struct led_classdev cdev; - struct pwm_channel pwmc; - struct gpio_led *desc; - u32 mult; - u8 active_low; -}; - - -/* - * For simplicity, we use "brightness" as if it were a linear function - * of PWM duty cycle. However, a logarithmic function of duty cycle is - * probably a better match for perceived brightness: two is half as bright - * as four, four is half as bright as eight, etc - */ -static void pwmled_brightness(struct led_classdev *cdev, enum led_brightness b) -{ - struct pwmled *led; - - /* update the duty cycle for the *next* period */ - led = container_of(cdev, struct pwmled, cdev); - pwm_channel_writel(&led->pwmc, PWM_CUPD, led->mult * (unsigned) b); -} - -/* - * NOTE: we reuse the platform_data structure of GPIO leds, - * but repurpose its "gpio" number as a PWM channel number. - */ -static int __devinit pwmled_probe(struct platform_device *pdev) -{ - const struct gpio_led_platform_data *pdata; - struct pwmled *leds; - int i; - int status; - - pdata = pdev->dev.platform_data; - if (!pdata || pdata->num_leds < 1) - return -ENODEV; - - leds = kcalloc(pdata->num_leds, sizeof(*leds), GFP_KERNEL); - if (!leds) - return -ENOMEM; - - for (i = 0; i < pdata->num_leds; i++) { - struct pwmled *led = leds + i; - const struct gpio_led *dat = pdata->leds + i; - u32 tmp; - - led->cdev.name = dat->name; - led->cdev.brightness = LED_OFF; - led->cdev.brightness_set = pwmled_brightness; - led->cdev.default_trigger = dat->default_trigger; - - led->active_low = dat->active_low; - - status = pwm_channel_alloc(dat->gpio, &led->pwmc); - if (status < 0) - goto err; - - /* - * Prescale clock by 2^x, so PWM counts in low MHz. - * Start each cycle with the LED active, so increasing - * the duty cycle gives us more time on (== brighter). - */ - tmp = 5; - if (!led->active_low) - tmp |= PWM_CPR_CPOL; - pwm_channel_writel(&led->pwmc, PWM_CMR, tmp); - - /* - * Pick a period so PWM cycles at 100+ Hz; and a multiplier - * for scaling duty cycle: brightness * mult. - */ - tmp = (led->pwmc.mck / (1 << 5)) / 100; - tmp /= 255; - led->mult = tmp; - pwm_channel_writel(&led->pwmc, PWM_CDTY, - led->cdev.brightness * 255); - pwm_channel_writel(&led->pwmc, PWM_CPRD, - LED_FULL * tmp); - - pwm_channel_enable(&led->pwmc); - - /* Hand it over to the LED framework */ - status = led_classdev_register(&pdev->dev, &led->cdev); - if (status < 0) { - pwm_channel_free(&led->pwmc); - goto err; - } - } - - platform_set_drvdata(pdev, leds); - return 0; - -err: - if (i > 0) { - for (i = i - 1; i >= 0; i--) { - led_classdev_unregister(&leds[i].cdev); - pwm_channel_free(&leds[i].pwmc); - } - } - kfree(leds); - - return status; -} - -static int __exit pwmled_remove(struct platform_device *pdev) -{ - const struct gpio_led_platform_data *pdata; - struct pwmled *leds; - unsigned i; - - pdata = pdev->dev.platform_data; - leds = platform_get_drvdata(pdev); - - for (i = 0; i < pdata->num_leds; i++) { - struct pwmled *led = leds + i; - - led_classdev_unregister(&led->cdev); - pwm_channel_free(&led->pwmc); - } - - kfree(leds); - platform_set_drvdata(pdev, NULL); - return 0; -} - -static struct platform_driver pwmled_driver = { - .driver = { - .name = "leds-atmel-pwm", - .owner = THIS_MODULE, - }, - /* REVISIT add suspend() and resume() methods */ - .probe = pwmled_probe, - .remove = __exit_p(pwmled_remove), -}; - -module_platform_driver(pwmled_driver); - -MODULE_DESCRIPTION("Driver for LEDs with PWM-controlled brightness"); -MODULE_LICENSE("GPL"); -MODULE_ALIAS("platform:leds-atmel-pwm"); diff --git a/ANDROID_3.4.5/drivers/leds/leds-bd2802.c b/ANDROID_3.4.5/drivers/leds/leds-bd2802.c deleted file mode 100644 index 591cbdf5..00000000 --- a/ANDROID_3.4.5/drivers/leds/leds-bd2802.c +++ /dev/null @@ -1,819 +0,0 @@ -/* - * leds-bd2802.c - RGB LED Driver - * - * Copyright (C) 2009 Samsung Electronics - * Kim Kyuwon <q1.kim@samsung.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * Datasheet: http://www.rohm.com/products/databook/driver/pdf/bd2802gu-e.pdf - * - */ - -#include <linux/module.h> -#include <linux/i2c.h> -#include <linux/gpio.h> -#include <linux/delay.h> -#include <linux/leds.h> -#include <linux/leds-bd2802.h> -#include <linux/slab.h> -#include <linux/pm.h> - -#define LED_CTL(rgb2en, rgb1en) ((rgb2en) << 4 | ((rgb1en) << 0)) - -#define BD2802_LED_OFFSET 0xa -#define BD2802_COLOR_OFFSET 0x3 - -#define BD2802_REG_CLKSETUP 0x00 -#define BD2802_REG_CONTROL 0x01 -#define BD2802_REG_HOURSETUP 0x02 -#define BD2802_REG_CURRENT1SETUP 0x03 -#define BD2802_REG_CURRENT2SETUP 0x04 -#define BD2802_REG_WAVEPATTERN 0x05 - -#define BD2802_CURRENT_032 0x10 /* 3.2mA */ -#define BD2802_CURRENT_000 0x00 /* 0.0mA */ - -#define BD2802_PATTERN_FULL 0x07 -#define BD2802_PATTERN_HALF 0x03 - -enum led_ids { - LED1, - LED2, - LED_NUM, -}; - -enum led_colors { - RED, - GREEN, - BLUE, -}; - -enum led_bits { - BD2802_OFF, - BD2802_BLINK, - BD2802_ON, -}; - -/* - * State '0' : 'off' - * State '1' : 'blink' - * State '2' : 'on'. - */ -struct led_state { - unsigned r:2; - unsigned g:2; - unsigned b:2; -}; - -struct bd2802_led { - struct bd2802_led_platform_data *pdata; - struct i2c_client *client; - struct rw_semaphore rwsem; - struct work_struct work; - - struct led_state led[2]; - - /* - * Making led_classdev as array is not recommended, because array - * members prevent using 'container_of' macro. So repetitive works - * are needed. - */ - struct led_classdev cdev_led1r; - struct led_classdev cdev_led1g; - struct led_classdev cdev_led1b; - struct led_classdev cdev_led2r; - struct led_classdev cdev_led2g; - struct led_classdev cdev_led2b; - - /* - * Advanced Configuration Function(ADF) mode: - * In ADF mode, user can set registers of BD2802GU directly, - * therefore BD2802GU doesn't enter reset state. - */ - int adf_on; - - enum led_ids led_id; - enum led_colors color; - enum led_bits state; - - /* General attributes of RGB LEDs */ - int wave_pattern; - int rgb_current; -}; - - -/*--------------------------------------------------------------*/ -/* BD2802GU helper functions */ -/*--------------------------------------------------------------*/ - -static inline int bd2802_is_rgb_off(struct bd2802_led *led, enum led_ids id, - enum led_colors color) -{ - switch (color) { - case RED: - return !led->led[id].r; - case GREEN: - return !led->led[id].g; - case BLUE: - return !led->led[id].b; - default: - dev_err(&led->client->dev, "%s: Invalid color\n", __func__); - return -EINVAL; - } -} - -static inline int bd2802_is_led_off(struct bd2802_led *led, enum led_ids id) -{ - if (led->led[id].r || led->led[id].g || led->led[id].b) - return 0; - - return 1; -} - -static inline int bd2802_is_all_off(struct bd2802_led *led) -{ - int i; - - for (i = 0; i < LED_NUM; i++) - if (!bd2802_is_led_off(led, i)) - return 0; - - return 1; -} - -static inline u8 bd2802_get_base_offset(enum led_ids id, enum led_colors color) -{ - return id * BD2802_LED_OFFSET + color * BD2802_COLOR_OFFSET; -} - -static inline u8 bd2802_get_reg_addr(enum led_ids id, enum led_colors color, - u8 reg_offset) -{ - return reg_offset + bd2802_get_base_offset(id, color); -} - - -/*--------------------------------------------------------------*/ -/* BD2802GU core functions */ -/*--------------------------------------------------------------*/ - -static int bd2802_write_byte(struct i2c_client *client, u8 reg, u8 val) -{ - int ret = i2c_smbus_write_byte_data(client, reg, val); - if (ret >= 0) - return 0; - - dev_err(&client->dev, "%s: reg 0x%x, val 0x%x, err %d\n", - __func__, reg, val, ret); - - return ret; -} - -static void bd2802_update_state(struct bd2802_led *led, enum led_ids id, - enum led_colors color, enum led_bits led_bit) -{ - int i; - u8 value; - - for (i = 0; i < LED_NUM; i++) { - if (i == id) { - switch (color) { - case RED: - led->led[i].r = led_bit; - break; - case GREEN: - led->led[i].g = led_bit; - break; - case BLUE: - led->led[i].b = led_bit; - break; - default: - dev_err(&led->client->dev, - "%s: Invalid color\n", __func__); - return; - } - } - } - - if (led_bit == BD2802_BLINK || led_bit == BD2802_ON) - return; - - if (!bd2802_is_led_off(led, id)) - return; - - if (bd2802_is_all_off(led) && !led->adf_on) { - gpio_set_value(led->pdata->reset_gpio, 0); - return; - } - - /* - * In this case, other led is turned on, and current led is turned - * off. So set RGB LED Control register to stop the current RGB LED - */ - value = (id == LED1) ? LED_CTL(1, 0) : LED_CTL(0, 1); - bd2802_write_byte(led->client, BD2802_REG_CONTROL, value); -} - -static void bd2802_configure(struct bd2802_led *led) -{ - struct bd2802_led_platform_data *pdata = led->pdata; - u8 reg; - - reg = bd2802_get_reg_addr(LED1, RED, BD2802_REG_HOURSETUP); - bd2802_write_byte(led->client, reg, pdata->rgb_time); - - reg = bd2802_get_reg_addr(LED2, RED, BD2802_REG_HOURSETUP); - bd2802_write_byte(led->client, reg, pdata->rgb_time); -} - -static void bd2802_reset_cancel(struct bd2802_led *led) -{ - gpio_set_value(led->pdata->reset_gpio, 1); - udelay(100); - bd2802_configure(led); -} - -static void bd2802_enable(struct bd2802_led *led, enum led_ids id) -{ - enum led_ids other_led = (id == LED1) ? LED2 : LED1; - u8 value, other_led_on; - - other_led_on = !bd2802_is_led_off(led, other_led); - if (id == LED1) - value = LED_CTL(other_led_on, 1); - else - value = LED_CTL(1 , other_led_on); - - bd2802_write_byte(led->client, BD2802_REG_CONTROL, value); -} - -static void bd2802_set_on(struct bd2802_led *led, enum led_ids id, - enum led_colors color) -{ - u8 reg; - - if (bd2802_is_all_off(led) && !led->adf_on) - bd2802_reset_cancel(led); - - reg = bd2802_get_reg_addr(id, color, BD2802_REG_CURRENT1SETUP); - bd2802_write_byte(led->client, reg, led->rgb_current); - reg = bd2802_get_reg_addr(id, color, BD2802_REG_CURRENT2SETUP); - bd2802_write_byte(led->client, reg, BD2802_CURRENT_000); - reg = bd2802_get_reg_addr(id, color, BD2802_REG_WAVEPATTERN); - bd2802_write_byte(led->client, reg, BD2802_PATTERN_FULL); - - bd2802_enable(led, id); - bd2802_update_state(led, id, color, BD2802_ON); -} - -static void bd2802_set_blink(struct bd2802_led *led, enum led_ids id, - enum led_colors color) -{ - u8 reg; - - if (bd2802_is_all_off(led) && !led->adf_on) - bd2802_reset_cancel(led); - - reg = bd2802_get_reg_addr(id, color, BD2802_REG_CURRENT1SETUP); - bd2802_write_byte(led->client, reg, BD2802_CURRENT_000); - reg = bd2802_get_reg_addr(id, color, BD2802_REG_CURRENT2SETUP); - bd2802_write_byte(led->client, reg, led->rgb_current); - reg = bd2802_get_reg_addr(id, color, BD2802_REG_WAVEPATTERN); - bd2802_write_byte(led->client, reg, led->wave_pattern); - - bd2802_enable(led, id); - bd2802_update_state(led, id, color, BD2802_BLINK); -} - -static void bd2802_turn_on(struct bd2802_led *led, enum led_ids id, - enum led_colors color, enum led_bits led_bit) -{ - if (led_bit == BD2802_OFF) { - dev_err(&led->client->dev, - "Only 'blink' and 'on' are allowed\n"); - return; - } - - if (led_bit == BD2802_BLINK) - bd2802_set_blink(led, id, color); - else - bd2802_set_on(led, id, color); -} - -static void bd2802_turn_off(struct bd2802_led *led, enum led_ids id, - enum led_colors color) -{ - u8 reg; - - if (bd2802_is_rgb_off(led, id, color)) - return; - - reg = bd2802_get_reg_addr(id, color, BD2802_REG_CURRENT1SETUP); - bd2802_write_byte(led->client, reg, BD2802_CURRENT_000); - reg = bd2802_get_reg_addr(id, color, BD2802_REG_CURRENT2SETUP); - bd2802_write_byte(led->client, reg, BD2802_CURRENT_000); - - bd2802_update_state(led, id, color, BD2802_OFF); -} - -#define BD2802_SET_REGISTER(reg_addr, reg_name) \ -static ssize_t bd2802_store_reg##reg_addr(struct device *dev, \ - struct device_attribute *attr, const char *buf, size_t count) \ -{ \ - struct bd2802_led *led = i2c_get_clientdata(to_i2c_client(dev));\ - unsigned long val; \ - int ret; \ - if (!count) \ - return -EINVAL; \ - ret = strict_strtoul(buf, 16, &val); \ - if (ret) \ - return ret; \ - down_write(&led->rwsem); \ - bd2802_write_byte(led->client, reg_addr, (u8) val); \ - up_write(&led->rwsem); \ - return count; \ -} \ -static struct device_attribute bd2802_reg##reg_addr##_attr = { \ - .attr = {.name = reg_name, .mode = 0644}, \ - .store = bd2802_store_reg##reg_addr, \ -}; - -BD2802_SET_REGISTER(0x00, "0x00"); -BD2802_SET_REGISTER(0x01, "0x01"); -BD2802_SET_REGISTER(0x02, "0x02"); -BD2802_SET_REGISTER(0x03, "0x03"); -BD2802_SET_REGISTER(0x04, "0x04"); -BD2802_SET_REGISTER(0x05, "0x05"); -BD2802_SET_REGISTER(0x06, "0x06"); -BD2802_SET_REGISTER(0x07, "0x07"); -BD2802_SET_REGISTER(0x08, "0x08"); -BD2802_SET_REGISTER(0x09, "0x09"); -BD2802_SET_REGISTER(0x0a, "0x0a"); -BD2802_SET_REGISTER(0x0b, "0x0b"); -BD2802_SET_REGISTER(0x0c, "0x0c"); -BD2802_SET_REGISTER(0x0d, "0x0d"); -BD2802_SET_REGISTER(0x0e, "0x0e"); -BD2802_SET_REGISTER(0x0f, "0x0f"); -BD2802_SET_REGISTER(0x10, "0x10"); -BD2802_SET_REGISTER(0x11, "0x11"); -BD2802_SET_REGISTER(0x12, "0x12"); -BD2802_SET_REGISTER(0x13, "0x13"); -BD2802_SET_REGISTER(0x14, "0x14"); -BD2802_SET_REGISTER(0x15, "0x15"); - -static struct device_attribute *bd2802_addr_attributes[] = { - &bd2802_reg0x00_attr, - &bd2802_reg0x01_attr, - &bd2802_reg0x02_attr, - &bd2802_reg0x03_attr, - &bd2802_reg0x04_attr, - &bd2802_reg0x05_attr, - &bd2802_reg0x06_attr, - &bd2802_reg0x07_attr, - &bd2802_reg0x08_attr, - &bd2802_reg0x09_attr, - &bd2802_reg0x0a_attr, - &bd2802_reg0x0b_attr, - &bd2802_reg0x0c_attr, - &bd2802_reg0x0d_attr, - &bd2802_reg0x0e_attr, - &bd2802_reg0x0f_attr, - &bd2802_reg0x10_attr, - &bd2802_reg0x11_attr, - &bd2802_reg0x12_attr, - &bd2802_reg0x13_attr, - &bd2802_reg0x14_attr, - &bd2802_reg0x15_attr, -}; - -static void bd2802_enable_adv_conf(struct bd2802_led *led) -{ - int i, ret; - - for (i = 0; i < ARRAY_SIZE(bd2802_addr_attributes); i++) { - ret = device_create_file(&led->client->dev, - bd2802_addr_attributes[i]); - if (ret) { - dev_err(&led->client->dev, "failed: sysfs file %s\n", - bd2802_addr_attributes[i]->attr.name); - goto failed_remove_files; - } - } - - if (bd2802_is_all_off(led)) - bd2802_reset_cancel(led); - - led->adf_on = 1; - - return; - -failed_remove_files: - for (i--; i >= 0; i--) - device_remove_file(&led->client->dev, - bd2802_addr_attributes[i]); -} - -static void bd2802_disable_adv_conf(struct bd2802_led *led) -{ - int i; - - for (i = 0; i < ARRAY_SIZE(bd2802_addr_attributes); i++) - device_remove_file(&led->client->dev, - bd2802_addr_attributes[i]); - - if (bd2802_is_all_off(led)) - gpio_set_value(led->pdata->reset_gpio, 0); - - led->adf_on = 0; -} - -static ssize_t bd2802_show_adv_conf(struct device *dev, - struct device_attribute *attr, char *buf) -{ - struct bd2802_led *led = i2c_get_clientdata(to_i2c_client(dev)); - ssize_t ret; - - down_read(&led->rwsem); - if (led->adf_on) - ret = sprintf(buf, "on\n"); - else - ret = sprintf(buf, "off\n"); - up_read(&led->rwsem); - - return ret; -} - -static ssize_t bd2802_store_adv_conf(struct device *dev, - struct device_attribute *attr, const char *buf, size_t count) -{ - struct bd2802_led *led = i2c_get_clientdata(to_i2c_client(dev)); - - if (!count) - return -EINVAL; - - down_write(&led->rwsem); - if (!led->adf_on && !strncmp(buf, "on", 2)) - bd2802_enable_adv_conf(led); - else if (led->adf_on && !strncmp(buf, "off", 3)) - bd2802_disable_adv_conf(led); - up_write(&led->rwsem); - - return count; -} - -static struct device_attribute bd2802_adv_conf_attr = { - .attr = { - .name = "advanced_configuration", - .mode = 0644, - }, - .show = bd2802_show_adv_conf, - .store = bd2802_store_adv_conf, -}; - -#define BD2802_CONTROL_ATTR(attr_name, name_str) \ -static ssize_t bd2802_show_##attr_name(struct device *dev, \ - struct device_attribute *attr, char *buf) \ -{ \ - struct bd2802_led *led = i2c_get_clientdata(to_i2c_client(dev));\ - ssize_t ret; \ - down_read(&led->rwsem); \ - ret = sprintf(buf, "0x%02x\n", led->attr_name); \ - up_read(&led->rwsem); \ - return ret; \ -} \ -static ssize_t bd2802_store_##attr_name(struct device *dev, \ - struct device_attribute *attr, const char *buf, size_t count) \ -{ \ - struct bd2802_led *led = i2c_get_clientdata(to_i2c_client(dev));\ - unsigned long val; \ - int ret; \ - if (!count) \ - return -EINVAL; \ - ret = strict_strtoul(buf, 16, &val); \ - if (ret) \ - return ret; \ - down_write(&led->rwsem); \ - led->attr_name = val; \ - up_write(&led->rwsem); \ - return count; \ -} \ -static struct device_attribute bd2802_##attr_name##_attr = { \ - .attr = { \ - .name = name_str, \ - .mode = 0644, \ - }, \ - .show = bd2802_show_##attr_name, \ - .store = bd2802_store_##attr_name, \ -}; - -BD2802_CONTROL_ATTR(wave_pattern, "wave_pattern"); -BD2802_CONTROL_ATTR(rgb_current, "rgb_current"); - -static struct device_attribute *bd2802_attributes[] = { - &bd2802_adv_conf_attr, - &bd2802_wave_pattern_attr, - &bd2802_rgb_current_attr, -}; - -static void bd2802_led_work(struct work_struct *work) -{ - struct bd2802_led *led = container_of(work, struct bd2802_led, work); - - if (led->state) - bd2802_turn_on(led, led->led_id, led->color, led->state); - else - bd2802_turn_off(led, led->led_id, led->color); -} - -#define BD2802_CONTROL_RGBS(name, id, clr) \ -static void bd2802_set_##name##_brightness(struct led_classdev *led_cdev,\ - enum led_brightness value) \ -{ \ - struct bd2802_led *led = \ - container_of(led_cdev, struct bd2802_led, cdev_##name); \ - led->led_id = id; \ - led->color = clr; \ - if (value == LED_OFF) \ - led->state = BD2802_OFF; \ - else \ - led->state = BD2802_ON; \ - schedule_work(&led->work); \ -} \ -static int bd2802_set_##name##_blink(struct led_classdev *led_cdev, \ - unsigned long *delay_on, unsigned long *delay_off) \ -{ \ - struct bd2802_led *led = \ - container_of(led_cdev, struct bd2802_led, cdev_##name); \ - if (*delay_on == 0 || *delay_off == 0) \ - return -EINVAL; \ - led->led_id = id; \ - led->color = clr; \ - led->state = BD2802_BLINK; \ - schedule_work(&led->work); \ - return 0; \ -} - -BD2802_CONTROL_RGBS(led1r, LED1, RED); -BD2802_CONTROL_RGBS(led1g, LED1, GREEN); -BD2802_CONTROL_RGBS(led1b, LED1, BLUE); -BD2802_CONTROL_RGBS(led2r, LED2, RED); -BD2802_CONTROL_RGBS(led2g, LED2, GREEN); -BD2802_CONTROL_RGBS(led2b, LED2, BLUE); - -static int bd2802_register_led_classdev(struct bd2802_led *led) -{ - int ret; - - INIT_WORK(&led->work, bd2802_led_work); - - led->cdev_led1r.name = "led1_R"; - led->cdev_led1r.brightness = LED_OFF; - led->cdev_led1r.brightness_set = bd2802_set_led1r_brightness; - led->cdev_led1r.blink_set = bd2802_set_led1r_blink; - - ret = led_classdev_register(&led->client->dev, &led->cdev_led1r); - if (ret < 0) { - dev_err(&led->client->dev, "couldn't register LED %s\n", - led->cdev_led1r.name); - goto failed_unregister_led1_R; - } - - led->cdev_led1g.name = "led1_G"; - led->cdev_led1g.brightness = LED_OFF; - led->cdev_led1g.brightness_set = bd2802_set_led1g_brightness; - led->cdev_led1g.blink_set = bd2802_set_led1g_blink; - - ret = led_classdev_register(&led->client->dev, &led->cdev_led1g); - if (ret < 0) { - dev_err(&led->client->dev, "couldn't register LED %s\n", - led->cdev_led1g.name); - goto failed_unregister_led1_G; - } - - led->cdev_led1b.name = "led1_B"; - led->cdev_led1b.brightness = LED_OFF; - led->cdev_led1b.brightness_set = bd2802_set_led1b_brightness; - led->cdev_led1b.blink_set = bd2802_set_led1b_blink; - - ret = led_classdev_register(&led->client->dev, &led->cdev_led1b); - if (ret < 0) { - dev_err(&led->client->dev, "couldn't register LED %s\n", - led->cdev_led1b.name); - goto failed_unregister_led1_B; - } - - led->cdev_led2r.name = "led2_R"; - led->cdev_led2r.brightness = LED_OFF; - led->cdev_led2r.brightness_set = bd2802_set_led2r_brightness; - led->cdev_led2r.blink_set = bd2802_set_led2r_blink; - - ret = led_classdev_register(&led->client->dev, &led->cdev_led2r); - if (ret < 0) { - dev_err(&led->client->dev, "couldn't register LED %s\n", - led->cdev_led2r.name); - goto failed_unregister_led2_R; - } - - led->cdev_led2g.name = "led2_G"; - led->cdev_led2g.brightness = LED_OFF; - led->cdev_led2g.brightness_set = bd2802_set_led2g_brightness; - led->cdev_led2g.blink_set = bd2802_set_led2g_blink; - - ret = led_classdev_register(&led->client->dev, &led->cdev_led2g); - if (ret < 0) { - dev_err(&led->client->dev, "couldn't register LED %s\n", - led->cdev_led2g.name); - goto failed_unregister_led2_G; - } - - led->cdev_led2b.name = "led2_B"; - led->cdev_led2b.brightness = LED_OFF; - led->cdev_led2b.brightness_set = bd2802_set_led2b_brightness; - led->cdev_led2b.blink_set = bd2802_set_led2b_blink; - led->cdev_led2b.flags |= LED_CORE_SUSPENDRESUME; - - ret = led_classdev_register(&led->client->dev, &led->cdev_led2b); - if (ret < 0) { - dev_err(&led->client->dev, "couldn't register LED %s\n", - led->cdev_led2b.name); - goto failed_unregister_led2_B; - } - - return 0; - -failed_unregister_led2_B: - led_classdev_unregister(&led->cdev_led2g); -failed_unregister_led2_G: - led_classdev_unregister(&led->cdev_led2r); -failed_unregister_led2_R: - led_classdev_unregister(&led->cdev_led1b); -failed_unregister_led1_B: - led_classdev_unregister(&led->cdev_led1g); -failed_unregister_led1_G: - led_classdev_unregister(&led->cdev_led1r); -failed_unregister_led1_R: - - return ret; -} - -static void bd2802_unregister_led_classdev(struct bd2802_led *led) -{ - cancel_work_sync(&led->work); - led_classdev_unregister(&led->cdev_led2b); - led_classdev_unregister(&led->cdev_led2g); - led_classdev_unregister(&led->cdev_led2r); - led_classdev_unregister(&led->cdev_led1b); - led_classdev_unregister(&led->cdev_led1g); - led_classdev_unregister(&led->cdev_led1r); -} - -static int __devinit bd2802_probe(struct i2c_client *client, - const struct i2c_device_id *id) -{ - struct bd2802_led *led; - struct bd2802_led_platform_data *pdata; - int ret, i; - - led = kzalloc(sizeof(struct bd2802_led), GFP_KERNEL); - if (!led) { - dev_err(&client->dev, "failed to allocate driver data\n"); - return -ENOMEM; - } - - led->client = client; - pdata = led->pdata = client->dev.platform_data; - i2c_set_clientdata(client, led); - - /* Configure RESET GPIO (L: RESET, H: RESET cancel) */ - gpio_request_one(pdata->reset_gpio, GPIOF_OUT_INIT_HIGH, "RGB_RESETB"); - - /* Tacss = min 0.1ms */ - udelay(100); - - /* Detect BD2802GU */ - ret = bd2802_write_byte(client, BD2802_REG_CLKSETUP, 0x00); - if (ret < 0) { - dev_err(&client->dev, "failed to detect device\n"); - goto failed_free; - } else - dev_info(&client->dev, "return 0x%02x\n", ret); - - /* To save the power, reset BD2802 after detecting */ - gpio_set_value(led->pdata->reset_gpio, 0); - - /* Default attributes */ - led->wave_pattern = BD2802_PATTERN_HALF; - led->rgb_current = BD2802_CURRENT_032; - - init_rwsem(&led->rwsem); - - for (i = 0; i < ARRAY_SIZE(bd2802_attributes); i++) { - ret = device_create_file(&led->client->dev, - bd2802_attributes[i]); - if (ret) { - dev_err(&led->client->dev, "failed: sysfs file %s\n", - bd2802_attributes[i]->attr.name); - goto failed_unregister_dev_file; - } - } - - ret = bd2802_register_led_classdev(led); - if (ret < 0) - goto failed_unregister_dev_file; - - return 0; - -failed_unregister_dev_file: - for (i--; i >= 0; i--) - device_remove_file(&led->client->dev, bd2802_attributes[i]); -failed_free: - kfree(led); - - return ret; -} - -static int __exit bd2802_remove(struct i2c_client *client) -{ - struct bd2802_led *led = i2c_get_clientdata(client); - int i; - - gpio_set_value(led->pdata->reset_gpio, 0); - bd2802_unregister_led_classdev(led); - if (led->adf_on) - bd2802_disable_adv_conf(led); - for (i = 0; i < ARRAY_SIZE(bd2802_attributes); i++) - device_remove_file(&led->client->dev, bd2802_attributes[i]); - kfree(led); - - return 0; -} - -#ifdef CONFIG_PM - -static void bd2802_restore_state(struct bd2802_led *led) -{ - int i; - - for (i = 0; i < LED_NUM; i++) { - if (led->led[i].r) - bd2802_turn_on(led, i, RED, led->led[i].r); - if (led->led[i].g) - bd2802_turn_on(led, i, GREEN, led->led[i].g); - if (led->led[i].b) - bd2802_turn_on(led, i, BLUE, led->led[i].b); - } -} - -static int bd2802_suspend(struct device *dev) -{ - struct i2c_client *client = to_i2c_client(dev); - struct bd2802_led *led = i2c_get_clientdata(client); - - gpio_set_value(led->pdata->reset_gpio, 0); - - return 0; -} - -static int bd2802_resume(struct device *dev) -{ - struct i2c_client *client = to_i2c_client(dev); - struct bd2802_led *led = i2c_get_clientdata(client); - - if (!bd2802_is_all_off(led) || led->adf_on) { - bd2802_reset_cancel(led); - bd2802_restore_state(led); - } - - return 0; -} - -static SIMPLE_DEV_PM_OPS(bd2802_pm, bd2802_suspend, bd2802_resume); -#define BD2802_PM (&bd2802_pm) -#else /* CONFIG_PM */ -#define BD2802_PM NULL -#endif - -static const struct i2c_device_id bd2802_id[] = { - { "BD2802", 0 }, - { } -}; -MODULE_DEVICE_TABLE(i2c, bd2802_id); - -static struct i2c_driver bd2802_i2c_driver = { - .driver = { - .name = "BD2802", - .pm = BD2802_PM, - }, - .probe = bd2802_probe, - .remove = __exit_p(bd2802_remove), - .id_table = bd2802_id, -}; - -module_i2c_driver(bd2802_i2c_driver); - -MODULE_AUTHOR("Kim Kyuwon <q1.kim@samsung.com>"); -MODULE_DESCRIPTION("BD2802 LED driver"); -MODULE_LICENSE("GPL v2"); diff --git a/ANDROID_3.4.5/drivers/leds/leds-clevo-mail.c b/ANDROID_3.4.5/drivers/leds/leds-clevo-mail.c deleted file mode 100644 index 1ed1677c..00000000 --- a/ANDROID_3.4.5/drivers/leds/leds-clevo-mail.c +++ /dev/null @@ -1,219 +0,0 @@ - -#include <linux/module.h> - -#include <linux/platform_device.h> -#include <linux/err.h> -#include <linux/leds.h> - -#include <linux/io.h> -#include <linux/dmi.h> - -#include <linux/i8042.h> - -#define CLEVO_MAIL_LED_OFF 0x0084 -#define CLEVO_MAIL_LED_BLINK_1HZ 0x008A -#define CLEVO_MAIL_LED_BLINK_0_5HZ 0x0083 - -MODULE_AUTHOR("Márton Németh <nm127@freemail.hu>"); -MODULE_DESCRIPTION("Clevo mail LED driver"); -MODULE_LICENSE("GPL"); - -static bool __initdata nodetect; -module_param_named(nodetect, nodetect, bool, 0); -MODULE_PARM_DESC(nodetect, "Skip DMI hardware detection"); - -static struct platform_device *pdev; - -static int __init clevo_mail_led_dmi_callback(const struct dmi_system_id *id) -{ - printk(KERN_INFO KBUILD_MODNAME ": '%s' found\n", id->ident); - return 1; -} - -/* - * struct mail_led_whitelist - List of known good models - * - * Contains the known good models this driver is compatible with. - * When adding a new model try to be as strict as possible. This - * makes it possible to keep the false positives (the model is - * detected as working, but in reality it is not) as low as - * possible. - */ -static struct dmi_system_id __initdata mail_led_whitelist[] = { - { - .callback = clevo_mail_led_dmi_callback, - .ident = "Clevo D410J", - .matches = { - DMI_MATCH(DMI_SYS_VENDOR, "VIA"), - DMI_MATCH(DMI_PRODUCT_NAME, "K8N800"), - DMI_MATCH(DMI_PRODUCT_VERSION, "VT8204B") - } - }, - { - .callback = clevo_mail_led_dmi_callback, - .ident = "Clevo M5x0N", - .matches = { - DMI_MATCH(DMI_SYS_VENDOR, "CLEVO Co."), - DMI_MATCH(DMI_PRODUCT_NAME, "M5x0N") - } - }, - { - .callback = clevo_mail_led_dmi_callback, - .ident = "Positivo Mobile", - .matches = { - DMI_MATCH(DMI_BOARD_VENDOR, "CLEVO Co. "), - DMI_MATCH(DMI_BOARD_NAME, "M5X0V "), - DMI_MATCH(DMI_PRODUCT_NAME, "Positivo Mobile"), - DMI_MATCH(DMI_PRODUCT_VERSION, "VT6198") - } - }, - { - .callback = clevo_mail_led_dmi_callback, - .ident = "Clevo D400P", - .matches = { - DMI_MATCH(DMI_BOARD_VENDOR, "Clevo"), - DMI_MATCH(DMI_BOARD_NAME, "D400P"), - DMI_MATCH(DMI_BOARD_VERSION, "Rev.A"), - DMI_MATCH(DMI_PRODUCT_VERSION, "0106") - } - }, - { - .callback = clevo_mail_led_dmi_callback, - .ident = "Clevo D410V", - .matches = { - DMI_MATCH(DMI_BOARD_VENDOR, "Clevo, Co."), - DMI_MATCH(DMI_BOARD_NAME, "D400V/D470V"), - DMI_MATCH(DMI_BOARD_VERSION, "SS78B"), - DMI_MATCH(DMI_PRODUCT_VERSION, "Rev. A1") - } - }, - { } -}; - -static void clevo_mail_led_set(struct led_classdev *led_cdev, - enum led_brightness value) -{ - i8042_lock_chip(); - - if (value == LED_OFF) - i8042_command(NULL, CLEVO_MAIL_LED_OFF); - else if (value <= LED_HALF) - i8042_command(NULL, CLEVO_MAIL_LED_BLINK_0_5HZ); - else - i8042_command(NULL, CLEVO_MAIL_LED_BLINK_1HZ); - - i8042_unlock_chip(); - -} - -static int clevo_mail_led_blink(struct led_classdev *led_cdev, - unsigned long *delay_on, - unsigned long *delay_off) -{ - int status = -EINVAL; - - i8042_lock_chip(); - - if (*delay_on == 0 /* ms */ && *delay_off == 0 /* ms */) { - /* Special case: the leds subsystem requested us to - * chose one user friendly blinking of the LED, and - * start it. Let's blink the led slowly (0.5Hz). - */ - *delay_on = 1000; /* ms */ - *delay_off = 1000; /* ms */ - i8042_command(NULL, CLEVO_MAIL_LED_BLINK_0_5HZ); - status = 0; - - } else if (*delay_on == 500 /* ms */ && *delay_off == 500 /* ms */) { - /* blink the led with 1Hz */ - i8042_command(NULL, CLEVO_MAIL_LED_BLINK_1HZ); - status = 0; - - } else if (*delay_on == 1000 /* ms */ && *delay_off == 1000 /* ms */) { - /* blink the led with 0.5Hz */ - i8042_command(NULL, CLEVO_MAIL_LED_BLINK_0_5HZ); - status = 0; - - } else { - printk(KERN_DEBUG KBUILD_MODNAME - ": clevo_mail_led_blink(..., %lu, %lu)," - " returning -EINVAL (unsupported)\n", - *delay_on, *delay_off); - } - - i8042_unlock_chip(); - - return status; -} - -static struct led_classdev clevo_mail_led = { - .name = "clevo::mail", - .brightness_set = clevo_mail_led_set, - .blink_set = clevo_mail_led_blink, - .flags = LED_CORE_SUSPENDRESUME, -}; - -static int __devinit clevo_mail_led_probe(struct platform_device *pdev) -{ - return led_classdev_register(&pdev->dev, &clevo_mail_led); -} - -static int clevo_mail_led_remove(struct platform_device *pdev) -{ - led_classdev_unregister(&clevo_mail_led); - return 0; -} - -static struct platform_driver clevo_mail_led_driver = { - .probe = clevo_mail_led_probe, - .remove = clevo_mail_led_remove, - .driver = { - .name = KBUILD_MODNAME, - .owner = THIS_MODULE, - }, -}; - -static int __init clevo_mail_led_init(void) -{ - int error = 0; - int count = 0; - - /* Check with the help of DMI if we are running on supported hardware */ - if (!nodetect) { - count = dmi_check_system(mail_led_whitelist); - } else { - count = 1; - printk(KERN_ERR KBUILD_MODNAME ": Skipping DMI detection. " - "If the driver works on your hardware please " - "report model and the output of dmidecode in tracker " - "at http://sourceforge.net/projects/clevo-mailled/\n"); - } - - if (!count) - return -ENODEV; - - pdev = platform_device_register_simple(KBUILD_MODNAME, -1, NULL, 0); - if (!IS_ERR(pdev)) { - error = platform_driver_probe(&clevo_mail_led_driver, - clevo_mail_led_probe); - if (error) { - printk(KERN_ERR KBUILD_MODNAME - ": Can't probe platform driver\n"); - platform_device_unregister(pdev); - } - } else - error = PTR_ERR(pdev); - - return error; -} - -static void __exit clevo_mail_led_exit(void) -{ - platform_device_unregister(pdev); - platform_driver_unregister(&clevo_mail_led_driver); - - clevo_mail_led_set(NULL, LED_OFF); -} - -module_init(clevo_mail_led_init); -module_exit(clevo_mail_led_exit); diff --git a/ANDROID_3.4.5/drivers/leds/leds-cobalt-qube.c b/ANDROID_3.4.5/drivers/leds/leds-cobalt-qube.c deleted file mode 100644 index 6a8725cc..00000000 --- a/ANDROID_3.4.5/drivers/leds/leds-cobalt-qube.c +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright 2006 - Florian Fainelli <florian@openwrt.org> - * - * Control the Cobalt Qube/RaQ front LED - */ -#include <linux/init.h> -#include <linux/io.h> -#include <linux/ioport.h> -#include <linux/leds.h> -#include <linux/module.h> -#include <linux/platform_device.h> -#include <linux/types.h> - -#define LED_FRONT_LEFT 0x01 -#define LED_FRONT_RIGHT 0x02 - -static void __iomem *led_port; -static u8 led_value; - -static void qube_front_led_set(struct led_classdev *led_cdev, - enum led_brightness brightness) -{ - if (brightness) - led_value = LED_FRONT_LEFT | LED_FRONT_RIGHT; - else - led_value = ~(LED_FRONT_LEFT | LED_FRONT_RIGHT); - writeb(led_value, led_port); -} - -static struct led_classdev qube_front_led = { - .name = "qube::front", - .brightness = LED_FULL, - .brightness_set = qube_front_led_set, - .default_trigger = "default-on", -}; - -static int __devinit cobalt_qube_led_probe(struct platform_device *pdev) -{ - struct resource *res; - int retval; - - res = platform_get_resource(pdev, IORESOURCE_MEM, 0); - if (!res) - return -EBUSY; - - led_port = ioremap(res->start, resource_size(res)); - if (!led_port) - return -ENOMEM; - - led_value = LED_FRONT_LEFT | LED_FRONT_RIGHT; - writeb(led_value, led_port); - - retval = led_classdev_register(&pdev->dev, &qube_front_led); - if (retval) - goto err_iounmap; - - return 0; - -err_iounmap: - iounmap(led_port); - led_port = NULL; - - return retval; -} - -static int __devexit cobalt_qube_led_remove(struct platform_device *pdev) -{ - led_classdev_unregister(&qube_front_led); - - if (led_port) { - iounmap(led_port); - led_port = NULL; - } - - return 0; -} - -static struct platform_driver cobalt_qube_led_driver = { - .probe = cobalt_qube_led_probe, - .remove = __devexit_p(cobalt_qube_led_remove), - .driver = { - .name = "cobalt-qube-leds", - .owner = THIS_MODULE, - }, -}; - -module_platform_driver(cobalt_qube_led_driver); - -MODULE_LICENSE("GPL"); -MODULE_DESCRIPTION("Front LED support for Cobalt Server"); -MODULE_AUTHOR("Florian Fainelli <florian@openwrt.org>"); -MODULE_ALIAS("platform:cobalt-qube-leds"); diff --git a/ANDROID_3.4.5/drivers/leds/leds-cobalt-raq.c b/ANDROID_3.4.5/drivers/leds/leds-cobalt-raq.c deleted file mode 100644 index aac1c073..00000000 --- a/ANDROID_3.4.5/drivers/leds/leds-cobalt-raq.c +++ /dev/null @@ -1,139 +0,0 @@ -/* - * LEDs driver for the Cobalt Raq series. - * - * Copyright (C) 2007 Yoichi Yuasa <yuasa@linux-mips.org> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ -#include <linux/init.h> -#include <linux/io.h> -#include <linux/ioport.h> -#include <linux/leds.h> -#include <linux/platform_device.h> -#include <linux/spinlock.h> -#include <linux/types.h> -#include <linux/export.h> - -#define LED_WEB 0x04 -#define LED_POWER_OFF 0x08 - -static void __iomem *led_port; -static u8 led_value; -static DEFINE_SPINLOCK(led_value_lock); - -static void raq_web_led_set(struct led_classdev *led_cdev, - enum led_brightness brightness) -{ - unsigned long flags; - - spin_lock_irqsave(&led_value_lock, flags); - - if (brightness) - led_value |= LED_WEB; - else - led_value &= ~LED_WEB; - writeb(led_value, led_port); - - spin_unlock_irqrestore(&led_value_lock, flags); -} - -static struct led_classdev raq_web_led = { - .name = "raq::web", - .brightness_set = raq_web_led_set, -}; - -static void raq_power_off_led_set(struct led_classdev *led_cdev, - enum led_brightness brightness) -{ - unsigned long flags; - - spin_lock_irqsave(&led_value_lock, flags); - - if (brightness) - led_value |= LED_POWER_OFF; - else - led_value &= ~LED_POWER_OFF; - writeb(led_value, led_port); - - spin_unlock_irqrestore(&led_value_lock, flags); -} - -static struct led_classdev raq_power_off_led = { - .name = "raq::power-off", - .brightness_set = raq_power_off_led_set, - .default_trigger = "power-off", -}; - -static int __devinit cobalt_raq_led_probe(struct platform_device *pdev) -{ - struct resource *res; - int retval; - - res = platform_get_resource(pdev, IORESOURCE_MEM, 0); - if (!res) - return -EBUSY; - - led_port = ioremap(res->start, resource_size(res)); - if (!led_port) - return -ENOMEM; - - retval = led_classdev_register(&pdev->dev, &raq_power_off_led); - if (retval) - goto err_iounmap; - - retval = led_classdev_register(&pdev->dev, &raq_web_led); - if (retval) - goto err_unregister; - - return 0; - -err_unregister: - led_classdev_unregister(&raq_power_off_led); - -err_iounmap: - iounmap(led_port); - led_port = NULL; - - return retval; -} - -static int __devexit cobalt_raq_led_remove(struct platform_device *pdev) -{ - led_classdev_unregister(&raq_power_off_led); - led_classdev_unregister(&raq_web_led); - - if (led_port) { - iounmap(led_port); - led_port = NULL; - } - - return 0; -} - -static struct platform_driver cobalt_raq_led_driver = { - .probe = cobalt_raq_led_probe, - .remove = __devexit_p(cobalt_raq_led_remove), - .driver = { - .name = "cobalt-raq-leds", - .owner = THIS_MODULE, - }, -}; - -static int __init cobalt_raq_led_init(void) -{ - return platform_driver_register(&cobalt_raq_led_driver); -} - -module_init(cobalt_raq_led_init); diff --git a/ANDROID_3.4.5/drivers/leds/leds-da903x.c b/ANDROID_3.4.5/drivers/leds/leds-da903x.c deleted file mode 100644 index d9cd73eb..00000000 --- a/ANDROID_3.4.5/drivers/leds/leds-da903x.c +++ /dev/null @@ -1,167 +0,0 @@ -/* - * LEDs driver for Dialog Semiconductor DA9030/DA9034 - * - * Copyright (C) 2008 Compulab, Ltd. - * Mike Rapoport <mike@compulab.co.il> - * - * Copyright (C) 2006-2008 Marvell International Ltd. - * Eric Miao <eric.miao@marvell.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ - -#include <linux/module.h> -#include <linux/kernel.h> -#include <linux/init.h> -#include <linux/platform_device.h> -#include <linux/leds.h> -#include <linux/workqueue.h> -#include <linux/mfd/da903x.h> -#include <linux/slab.h> - -#define DA9030_LED1_CONTROL 0x20 -#define DA9030_LED2_CONTROL 0x21 -#define DA9030_LED3_CONTROL 0x22 -#define DA9030_LED4_CONTROL 0x23 -#define DA9030_LEDPC_CONTROL 0x24 -#define DA9030_MISC_CONTROL_A 0x26 /* Vibrator Control */ - -#define DA9034_LED1_CONTROL 0x35 -#define DA9034_LED2_CONTROL 0x36 -#define DA9034_VIBRA 0x40 - -struct da903x_led { - struct led_classdev cdev; - struct work_struct work; - struct device *master; - enum led_brightness new_brightness; - int id; - int flags; -}; - -#define DA9030_LED_OFFSET(id) ((id) - DA9030_ID_LED_1) -#define DA9034_LED_OFFSET(id) ((id) - DA9034_ID_LED_1) - -static void da903x_led_work(struct work_struct *work) -{ - struct da903x_led *led = container_of(work, struct da903x_led, work); - uint8_t val; - int offset; - - switch (led->id) { - case DA9030_ID_LED_1: - case DA9030_ID_LED_2: - case DA9030_ID_LED_3: - case DA9030_ID_LED_4: - case DA9030_ID_LED_PC: - offset = DA9030_LED_OFFSET(led->id); - val = led->flags & ~0x87; - val |= (led->new_brightness) ? 0x80 : 0; /* EN bit */ - val |= (0x7 - (led->new_brightness >> 5)) & 0x7; /* PWM<2:0> */ - da903x_write(led->master, DA9030_LED1_CONTROL + offset, val); - break; - case DA9030_ID_VIBRA: - val = led->flags & ~0x80; - val |= (led->new_brightness) ? 0x80 : 0; /* EN bit */ - da903x_write(led->master, DA9030_MISC_CONTROL_A, val); - break; - case DA9034_ID_LED_1: - case DA9034_ID_LED_2: - offset = DA9034_LED_OFFSET(led->id); - val = (led->new_brightness * 0x5f / LED_FULL) & 0x7f; - val |= (led->flags & DA9034_LED_RAMP) ? 0x80 : 0; - da903x_write(led->master, DA9034_LED1_CONTROL + offset, val); - break; - case DA9034_ID_VIBRA: - val = led->new_brightness & 0xfe; - da903x_write(led->master, DA9034_VIBRA, val); - break; - } -} - -static void da903x_led_set(struct led_classdev *led_cdev, - enum led_brightness value) -{ - struct da903x_led *led; - - led = container_of(led_cdev, struct da903x_led, cdev); - led->new_brightness = value; - schedule_work(&led->work); -} - -static int __devinit da903x_led_probe(struct platform_device *pdev) -{ - struct led_info *pdata = pdev->dev.platform_data; - struct da903x_led *led; - int id, ret; - - if (pdata == NULL) - return 0; - - id = pdev->id; - - if (!((id >= DA9030_ID_LED_1 && id <= DA9030_ID_VIBRA) || - (id >= DA9034_ID_LED_1 && id <= DA9034_ID_VIBRA))) { - dev_err(&pdev->dev, "invalid LED ID (%d) specified\n", id); - return -EINVAL; - } - - led = kzalloc(sizeof(struct da903x_led), GFP_KERNEL); - if (led == NULL) { - dev_err(&pdev->dev, "failed to alloc memory for LED%d\n", id); - return -ENOMEM; - } - - led->cdev.name = pdata->name; - led->cdev.default_trigger = pdata->default_trigger; - led->cdev.brightness_set = da903x_led_set; - led->cdev.brightness = LED_OFF; - - led->id = id; - led->flags = pdata->flags; - led->master = pdev->dev.parent; - led->new_brightness = LED_OFF; - - INIT_WORK(&led->work, da903x_led_work); - - ret = led_classdev_register(led->master, &led->cdev); - if (ret) { - dev_err(&pdev->dev, "failed to register LED %d\n", id); - goto err; - } - - platform_set_drvdata(pdev, led); - return 0; - -err: - kfree(led); - return ret; -} - -static int __devexit da903x_led_remove(struct platform_device *pdev) -{ - struct da903x_led *led = platform_get_drvdata(pdev); - - led_classdev_unregister(&led->cdev); - kfree(led); - return 0; -} - -static struct platform_driver da903x_led_driver = { - .driver = { - .name = "da903x-led", - .owner = THIS_MODULE, - }, - .probe = da903x_led_probe, - .remove = __devexit_p(da903x_led_remove), -}; - -module_platform_driver(da903x_led_driver); - -MODULE_DESCRIPTION("LEDs driver for Dialog Semiconductor DA9030/DA9034"); -MODULE_AUTHOR("Eric Miao <eric.miao@marvell.com>" - "Mike Rapoport <mike@compulab.co.il>"); -MODULE_LICENSE("GPL"); -MODULE_ALIAS("platform:da903x-led"); diff --git a/ANDROID_3.4.5/drivers/leds/leds-dac124s085.c b/ANDROID_3.4.5/drivers/leds/leds-dac124s085.c deleted file mode 100644 index d56c1426..00000000 --- a/ANDROID_3.4.5/drivers/leds/leds-dac124s085.c +++ /dev/null @@ -1,139 +0,0 @@ -/* - * Copyright 2008 - * Guennadi Liakhovetski, DENX Software Engineering, <lg@denx.de> - * - * This file is subject to the terms and conditions of version 2 of - * the GNU General Public License. See the file COPYING in the main - * directory of this archive for more details. - * - * LED driver for the DAC124S085 SPI DAC - */ - -#include <linux/leds.h> -#include <linux/module.h> -#include <linux/mutex.h> -#include <linux/slab.h> -#include <linux/spinlock.h> -#include <linux/workqueue.h> -#include <linux/spi/spi.h> - -struct dac124s085_led { - struct led_classdev ldev; - struct spi_device *spi; - int id; - int brightness; - char name[sizeof("dac124s085-3")]; - - struct mutex mutex; - struct work_struct work; - spinlock_t lock; -}; - -struct dac124s085 { - struct dac124s085_led leds[4]; -}; - -#define REG_WRITE (0 << 12) -#define REG_WRITE_UPDATE (1 << 12) -#define ALL_WRITE_UPDATE (2 << 12) -#define POWER_DOWN_OUTPUT (3 << 12) - -static void dac124s085_led_work(struct work_struct *work) -{ - struct dac124s085_led *led = container_of(work, struct dac124s085_led, - work); - u16 word; - - mutex_lock(&led->mutex); - word = cpu_to_le16(((led->id) << 14) | REG_WRITE_UPDATE | - (led->brightness & 0xfff)); - spi_write(led->spi, (const u8 *)&word, sizeof(word)); - mutex_unlock(&led->mutex); -} - -static void dac124s085_set_brightness(struct led_classdev *ldev, - enum led_brightness brightness) -{ - struct dac124s085_led *led = container_of(ldev, struct dac124s085_led, - ldev); - - spin_lock(&led->lock); - led->brightness = brightness; - schedule_work(&led->work); - spin_unlock(&led->lock); -} - -static int dac124s085_probe(struct spi_device *spi) -{ - struct dac124s085 *dac; - struct dac124s085_led *led; - int i, ret; - - dac = kzalloc(sizeof(*dac), GFP_KERNEL); - if (!dac) - return -ENOMEM; - - spi->bits_per_word = 16; - - for (i = 0; i < ARRAY_SIZE(dac->leds); i++) { - led = dac->leds + i; - led->id = i; - led->brightness = LED_OFF; - led->spi = spi; - snprintf(led->name, sizeof(led->name), "dac124s085-%d", i); - spin_lock_init(&led->lock); - INIT_WORK(&led->work, dac124s085_led_work); - mutex_init(&led->mutex); - led->ldev.name = led->name; - led->ldev.brightness = LED_OFF; - led->ldev.max_brightness = 0xfff; - led->ldev.brightness_set = dac124s085_set_brightness; - ret = led_classdev_register(&spi->dev, &led->ldev); - if (ret < 0) - goto eledcr; - } - - spi_set_drvdata(spi, dac); - - return 0; - -eledcr: - while (i--) - led_classdev_unregister(&dac->leds[i].ldev); - - spi_set_drvdata(spi, NULL); - kfree(dac); - return ret; -} - -static int dac124s085_remove(struct spi_device *spi) -{ - struct dac124s085 *dac = spi_get_drvdata(spi); - int i; - - for (i = 0; i < ARRAY_SIZE(dac->leds); i++) { - led_classdev_unregister(&dac->leds[i].ldev); - cancel_work_sync(&dac->leds[i].work); - } - - spi_set_drvdata(spi, NULL); - kfree(dac); - - return 0; -} - -static struct spi_driver dac124s085_driver = { - .probe = dac124s085_probe, - .remove = dac124s085_remove, - .driver = { - .name = "dac124s085", - .owner = THIS_MODULE, - }, -}; - -module_spi_driver(dac124s085_driver); - -MODULE_AUTHOR("Guennadi Liakhovetski <lg@denx.de>"); -MODULE_DESCRIPTION("DAC124S085 LED driver"); -MODULE_LICENSE("GPL v2"); -MODULE_ALIAS("spi:dac124s085"); diff --git a/ANDROID_3.4.5/drivers/leds/leds-fsg.c b/ANDROID_3.4.5/drivers/leds/leds-fsg.c deleted file mode 100644 index b9053fa6..00000000 --- a/ANDROID_3.4.5/drivers/leds/leds-fsg.c +++ /dev/null @@ -1,231 +0,0 @@ -/* - * LED Driver for the Freecom FSG-3 - * - * Copyright (c) 2008 Rod Whitby <rod@whitby.id.au> - * - * Author: Rod Whitby <rod@whitby.id.au> - * - * Based on leds-spitz.c - * Copyright 2005-2006 Openedhand Ltd. - * Author: Richard Purdie <rpurdie@openedhand.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - */ - -#include <linux/kernel.h> -#include <linux/init.h> -#include <linux/platform_device.h> -#include <linux/leds.h> -#include <linux/module.h> -#include <mach/hardware.h> -#include <asm/io.h> - -#define FSG_LED_WLAN_BIT 0 -#define FSG_LED_WAN_BIT 1 -#define FSG_LED_SATA_BIT 2 -#define FSG_LED_USB_BIT 4 -#define FSG_LED_RING_BIT 5 -#define FSG_LED_SYNC_BIT 7 - -static short __iomem *latch_address; -static unsigned short latch_value; - - -static void fsg_led_wlan_set(struct led_classdev *led_cdev, - enum led_brightness value) -{ - if (value) { - latch_value &= ~(1 << FSG_LED_WLAN_BIT); - *latch_address = latch_value; - } else { - latch_value |= (1 << FSG_LED_WLAN_BIT); - *latch_address = latch_value; - } -} - -static void fsg_led_wan_set(struct led_classdev *led_cdev, - enum led_brightness value) -{ - if (value) { - latch_value &= ~(1 << FSG_LED_WAN_BIT); - *latch_address = latch_value; - } else { - latch_value |= (1 << FSG_LED_WAN_BIT); - *latch_address = latch_value; - } -} - -static void fsg_led_sata_set(struct led_classdev *led_cdev, - enum led_brightness value) -{ - if (value) { - latch_value &= ~(1 << FSG_LED_SATA_BIT); - *latch_address = latch_value; - } else { - latch_value |= (1 << FSG_LED_SATA_BIT); - *latch_address = latch_value; - } -} - -static void fsg_led_usb_set(struct led_classdev *led_cdev, - enum led_brightness value) -{ - if (value) { - latch_value &= ~(1 << FSG_LED_USB_BIT); - *latch_address = latch_value; - } else { - latch_value |= (1 << FSG_LED_USB_BIT); - *latch_address = latch_value; - } -} - -static void fsg_led_sync_set(struct led_classdev *led_cdev, - enum led_brightness value) -{ - if (value) { - latch_value &= ~(1 << FSG_LED_SYNC_BIT); - *latch_address = latch_value; - } else { - latch_value |= (1 << FSG_LED_SYNC_BIT); - *latch_address = latch_value; - } -} - -static void fsg_led_ring_set(struct led_classdev *led_cdev, - enum led_brightness value) -{ - if (value) { - latch_value &= ~(1 << FSG_LED_RING_BIT); - *latch_address = latch_value; - } else { - latch_value |= (1 << FSG_LED_RING_BIT); - *latch_address = latch_value; - } -} - - -static struct led_classdev fsg_wlan_led = { - .name = "fsg:blue:wlan", - .brightness_set = fsg_led_wlan_set, - .flags = LED_CORE_SUSPENDRESUME, -}; - -static struct led_classdev fsg_wan_led = { - .name = "fsg:blue:wan", - .brightness_set = fsg_led_wan_set, - .flags = LED_CORE_SUSPENDRESUME, -}; - -static struct led_classdev fsg_sata_led = { - .name = "fsg:blue:sata", - .brightness_set = fsg_led_sata_set, - .flags = LED_CORE_SUSPENDRESUME, -}; - -static struct led_classdev fsg_usb_led = { - .name = "fsg:blue:usb", - .brightness_set = fsg_led_usb_set, - .flags = LED_CORE_SUSPENDRESUME, -}; - -static struct led_classdev fsg_sync_led = { - .name = "fsg:blue:sync", - .brightness_set = fsg_led_sync_set, - .flags = LED_CORE_SUSPENDRESUME, -}; - -static struct led_classdev fsg_ring_led = { - .name = "fsg:blue:ring", - .brightness_set = fsg_led_ring_set, - .flags = LED_CORE_SUSPENDRESUME, -}; - - -static int fsg_led_probe(struct platform_device *pdev) -{ - int ret; - - /* Map the LED chip select address space */ - latch_address = (unsigned short *) ioremap(IXP4XX_EXP_BUS_BASE(2), 512); - if (!latch_address) { - ret = -ENOMEM; - goto failremap; - } - - latch_value = 0xffff; - *latch_address = latch_value; - - ret = led_classdev_register(&pdev->dev, &fsg_wlan_led); - if (ret < 0) - goto failwlan; - - ret = led_classdev_register(&pdev->dev, &fsg_wan_led); - if (ret < 0) - goto failwan; - - ret = led_classdev_register(&pdev->dev, &fsg_sata_led); - if (ret < 0) - goto failsata; - - ret = led_classdev_register(&pdev->dev, &fsg_usb_led); - if (ret < 0) - goto failusb; - - ret = led_classdev_register(&pdev->dev, &fsg_sync_led); - if (ret < 0) - goto failsync; - - ret = led_classdev_register(&pdev->dev, &fsg_ring_led); - if (ret < 0) - goto failring; - - return ret; - - failring: - led_classdev_unregister(&fsg_sync_led); - failsync: - led_classdev_unregister(&fsg_usb_led); - failusb: - led_classdev_unregister(&fsg_sata_led); - failsata: - led_classdev_unregister(&fsg_wan_led); - failwan: - led_classdev_unregister(&fsg_wlan_led); - failwlan: - iounmap(latch_address); - failremap: - - return ret; -} - -static int fsg_led_remove(struct platform_device *pdev) -{ - led_classdev_unregister(&fsg_wlan_led); - led_classdev_unregister(&fsg_wan_led); - led_classdev_unregister(&fsg_sata_led); - led_classdev_unregister(&fsg_usb_led); - led_classdev_unregister(&fsg_sync_led); - led_classdev_unregister(&fsg_ring_led); - - iounmap(latch_address); - - return 0; -} - - -static struct platform_driver fsg_led_driver = { - .probe = fsg_led_probe, - .remove = fsg_led_remove, - .driver = { - .name = "fsg-led", - }, -}; - -module_platform_driver(fsg_led_driver); - -MODULE_AUTHOR("Rod Whitby <rod@whitby.id.au>"); -MODULE_DESCRIPTION("Freecom FSG-3 LED driver"); -MODULE_LICENSE("GPL"); diff --git a/ANDROID_3.4.5/drivers/leds/leds-genesis.c b/ANDROID_3.4.5/drivers/leds/leds-genesis.c deleted file mode 100755 index ca86cff5..00000000 --- a/ANDROID_3.4.5/drivers/leds/leds-genesis.c +++ /dev/null @@ -1,355 +0,0 @@ -/* LEDs driver for WM8880 Platform
-*
-* Copyright (c) 2014 WonderMedia Technologies, Inc.
-*
-* This program is free software; you can redistribute it and/or modify
-* it under the terms of the GNU General Public License version 2 as
-* published by the Free Software Foundation.
-*
-*/
-/*********************************** History ***********************************
-* Version 1.0 , HowayHuo, 2013/5/7
-* First version: Created by Howayhuo
-*
-********************************************************************************/
-#include <linux/init.h>
-#include <linux/module.h>
-#include <linux/types.h>
-#include <linux/slab.h>
-#include <linux/leds.h>
-#include <linux/gpio.h>
-#include <mach/wmt_iomux.h>
-#include <linux/platform_device.h>
-#include "../char/wmt-pwm.h"
-
-#define ENV_GENESIS_LED "wmt.gpo.logoled"
-#define ENV_LOGO_LED "wmt.logo.led"
-#define PWM2_GPIO_NO 200
-
-extern int wmt_getsyspara(char *varname, unsigned char *varval, int *varlen);
-
-struct led_operation_t {
- unsigned int light;
- unsigned int gpiono;
- unsigned int act;
-};
-
-static struct led_operation_t *led_gpio_pin;
-static int logo_led_enable;
-
-static void led_set_pwm(int no, int level, int freq, int active, int init)
-{
- int clock;
- int period, duty, scalar;
-
- if(init) {
- clock = auto_pll_divisor(DEV_PWM,GET_FREQ, 0, 0);
- clock = clock / freq;
- scalar = 0;
- period = 2000;
-
- while(period > 1023) {
- scalar++;
- period = clock / scalar;
- }
-
- duty = (period*level)/100;
- duty = (duty)? (duty-1):0;
- scalar = scalar-1;
- period = period -1;
-
- pwm_set_period(no,period);
- pwm_set_duty(no,duty);
- pwm_set_scalar(no,scalar);
- REG32_VAL(PIN_SHARING_SEL_4BYTE_ADDR) &= ~0x80;
- }
-
- if (active == 0)
- pwm_set_control(no,(level)? 0x37:0x8);
- else
- pwm_set_control(no,(level)? 0x35:0x8);
-}
-
-static void logo_led_light(int is_light)
-{
- if(!led_gpio_pin)
- return;
-
- if(led_gpio_pin->gpiono == PWM2_GPIO_NO) {
- if(is_light)
- led_set_pwm(2, 100, 22000, led_gpio_pin->act, 1);
- else
- led_set_pwm(2, 100, 22000, !led_gpio_pin->act, 0);
- return;
- }
-
- if(is_light) {
- if(led_gpio_pin->act)
- gpio_direction_output(led_gpio_pin->gpiono, 1);
- else
- gpio_direction_output(led_gpio_pin->gpiono, 0);
- }else {
- if(led_gpio_pin->act)
- gpio_direction_output(led_gpio_pin->gpiono, 0);
- else
- gpio_direction_output(led_gpio_pin->gpiono, 1);
- }
-}
-
-static void logo_led_turn_on(int on)
-{
- if(logo_led_enable)
- logo_led_light(on);
-}
-
-static void set_led_brightness(struct led_classdev *cdev, enum led_brightness b)
-{
- logo_led_turn_on(b);
-}
-
-static ssize_t attr_led_enable_show(struct device *dev,
- struct device_attribute *attr, char *buf)
-{
- return sprintf(buf, "%d\n", logo_led_enable);
-}
-
-static ssize_t attr_led_enable_store(struct device *dev,
- struct device_attribute *attr,
- const char *buf, size_t size)
-{
- unsigned long val;
-
- if (strict_strtoul(buf, 10, &val))
- return -EINVAL;
-
- logo_led_enable = val;
-
- if(logo_led_enable)
- logo_led_light(1);
- else
- logo_led_light(0);
-
- return size;
-}
-
-static DEVICE_ATTR(enable, 0644, attr_led_enable_show, attr_led_enable_store);
-
-static int __devinit logo_led_probe(struct platform_device *pdev)
-{
- int i, num;
- int ret = 0;
- const struct gpio_led_platform_data *pdata;
- struct led_classdev *leds;
- unsigned char buf[100];
- int buflen = 100;
-
- pdata = pdev->dev.platform_data;
- if (!pdata || pdata->num_leds < 1)
- return -ENODEV;
-
- leds = kzalloc(pdata->num_leds * sizeof(*leds), GFP_KERNEL);
- if (!leds)
- return -ENOMEM;
-
- for (i = 0; i < pdata->num_leds; i++) {
- struct led_classdev *led = leds + i;
- const struct gpio_led *dat = pdata->leds + i;
-
- led->name = dat->name;
- led->brightness = 0;
- led->brightness_set = set_led_brightness;
- led->default_trigger = dat->default_trigger;
-
- ret = led_classdev_register(&pdev->dev, led);
- if (ret < 0)
- goto err0;
-
- ret = device_create_file(led->dev, &dev_attr_enable);
- if(ret)
- goto err0;
- }
-
- platform_set_drvdata(pdev, leds);
-
- if(wmt_getsyspara(ENV_GENESIS_LED, buf, &buflen)) {
- if(wmt_getsyspara(ENV_LOGO_LED, buf, &buflen))
- goto exit0;
- else
- logo_led_enable = 1;
- }
-
- led_gpio_pin = kzalloc(sizeof(struct led_operation_t), GFP_KERNEL);
- if(!led_gpio_pin)
- goto exit0;
-
- num = sscanf(buf, "%d:%d:%d", &led_gpio_pin->light, &led_gpio_pin->gpiono,
- &led_gpio_pin->act);
-
- if(num != 3) {
- pr_err("the param of genesis-led is error. param num = %d\n", num);
- goto exit0;
- }
-
- if(led_gpio_pin->gpiono == PWM2_GPIO_NO) {
- if(led_gpio_pin->light) {
- logo_led_enable = 1;
- led_set_pwm(2, 100, 22000, led_gpio_pin->act, 1);
- }
- else
- led_set_pwm(2, 100, 22000, !led_gpio_pin->act, 1);
- } else {
- ret = gpio_request(led_gpio_pin->gpiono, "genesis-led");
- if(ret < 0) {
- pr_err("gpio(%d) request fail for genesis-led\n", led_gpio_pin->gpiono);
- goto exit0;
- }
-
- logo_led_light(led_gpio_pin->light);
- }
-
- return 0;
-
-err0:
- if (i > 0) {
- for (i = i - 1; i >= 0; i--) {
- device_remove_file((leds + i)->dev, &dev_attr_enable);
- led_classdev_unregister(leds + i);
- }
- }
-
- kfree(leds);
-
- return ret;
-
-exit0:
- if(led_gpio_pin) {
- kfree(led_gpio_pin);
- led_gpio_pin = NULL;
- }
-
- return 0;
-}
-
-static int __devexit logo_led_remove(struct platform_device *pdev)
-{
- const struct gpio_led_platform_data *pdata;
- struct led_classdev *leds;
- unsigned i;
-
- pdata = pdev->dev.platform_data;
- leds = platform_get_drvdata(pdev);
-
- for (i = 0; i < pdata->num_leds; i++) {
- struct led_classdev *led = leds + i;
- device_remove_file(led->dev, &dev_attr_enable);
- led_classdev_unregister(led);
- }
-
- kfree(leds);
- platform_set_drvdata(pdev, NULL);
-
- if(led_gpio_pin) {
- logo_led_light(0);
- gpio_free(led_gpio_pin->gpiono);
- kfree(led_gpio_pin);
- led_gpio_pin = NULL;
- }
-
- return 0;
-}
-
-static int logo_led_suspend(struct platform_device *pdev,
- pm_message_t state)
-{
- return 0;
-}
-
-static int logo_led_resume(struct platform_device *pdev)
-{
-
- if(!led_gpio_pin)
- return 0;
-
- if(led_gpio_pin->gpiono == PWM2_GPIO_NO) {
- if(logo_led_enable)
- led_set_pwm(2, 100, 22000, led_gpio_pin->act, 1);
- else
- led_set_pwm(2, 100, 22000, !led_gpio_pin->act, 1);
- }
-
- gpio_re_enabled(led_gpio_pin->gpiono);
-
- return 0;
-}
-
-static void logo_led_release(struct device *device)
-{
- return;
-}
-
-
-static struct gpio_led logo_leds[] = {
- {
- .name = "genesis-led",
- .default_trigger = "logoled",
- },
-};
-
-static struct gpio_led_platform_data lcd_backlight_data = {
- .leds = logo_leds,
- .num_leds = ARRAY_SIZE(logo_leds),
-};
-
-static struct platform_device logo_led_device = {
- .name = "genesis-led",
- .id = 0,
- .dev = {
- .platform_data = &lcd_backlight_data,
- .release = logo_led_release,
- },
-};
-
-static struct platform_driver logo_led_driver = {
- .probe = logo_led_probe,
- .remove = __devexit_p(logo_led_remove),
- .suspend = logo_led_suspend,
- .resume = logo_led_resume,
- .driver = {
- .name = "genesis-led",
- .owner = THIS_MODULE,
- },
-};
-
-static int __init logo_led_init(void)
-{
- int ret;
-
- ret = platform_device_register(&logo_led_device);
- if(ret) {
- pr_err("Can not register logo led device\n");
- return ret;
- }
-
- ret = platform_driver_register(&logo_led_driver);
- if(ret) {
- pr_err("Can not register logo led driver\n");
- platform_device_unregister(&logo_led_device);
- return ret;
- }
-
- return 0;
-}
-
-static void __exit logo_led_exit(void)
-{
- platform_driver_unregister(&logo_led_driver);
- platform_device_unregister(&logo_led_device);
-}
-
-module_init(logo_led_init);
-module_exit(logo_led_exit);
-
-MODULE_AUTHOR("WMT ShenZhen Driver Team");
-MODULE_DESCRIPTION("LOGO LED driver");
-MODULE_LICENSE("GPL");
-
diff --git a/ANDROID_3.4.5/drivers/leds/leds-gpio-register.c b/ANDROID_3.4.5/drivers/leds/leds-gpio-register.c deleted file mode 100644 index 1c4ed551..00000000 --- a/ANDROID_3.4.5/drivers/leds/leds-gpio-register.c +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (C) 2011 Pengutronix - * Uwe Kleine-Koenig <u.kleine-koenig@pengutronix.de> - * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License version 2 as published by the - * Free Software Foundation. - */ -#include <linux/err.h> -#include <linux/platform_device.h> -#include <linux/slab.h> -#include <linux/leds.h> - -/** - * gpio_led_register_device - register a gpio-led device - * @pdata: the platform data used for the new device - * - * Makes a copy of pdata and pdata->leds and registers a new leds-gpio device - * with the result. This allows to have pdata and pdata-leds in .init.rodata - * and so saves some bytes compared to a static struct platform_device with - * static platform data. - * - * Returns the registered device or an error pointer. - */ -struct platform_device *__init gpio_led_register_device( - int id, const struct gpio_led_platform_data *pdata) -{ - struct platform_device *ret; - struct gpio_led_platform_data _pdata = *pdata; - - _pdata.leds = kmemdup(pdata->leds, - pdata->num_leds * sizeof(*pdata->leds), GFP_KERNEL); - if (!_pdata.leds) - return ERR_PTR(-ENOMEM); - - ret = platform_device_register_resndata(NULL, "leds-gpio", id, - NULL, 0, &_pdata, sizeof(_pdata)); - if (IS_ERR(ret)) - kfree(_pdata.leds); - - return ret; -} diff --git a/ANDROID_3.4.5/drivers/leds/leds-gpio.c b/ANDROID_3.4.5/drivers/leds/leds-gpio.c deleted file mode 100644 index 6832bb41..00000000 --- a/ANDROID_3.4.5/drivers/leds/leds-gpio.c +++ /dev/null @@ -1,300 +0,0 @@ -/* - * LEDs driver for GPIOs - * - * Copyright (C) 2007 8D Technologies inc. - * Raphael Assenat <raph@8d.com> - * Copyright (C) 2008 Freescale Semiconductor, Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - */ -#include <linux/kernel.h> -#include <linux/init.h> -#include <linux/platform_device.h> -#include <linux/gpio.h> -#include <linux/leds.h> -#include <linux/of_platform.h> -#include <linux/of_gpio.h> -#include <linux/slab.h> -#include <linux/workqueue.h> -#include <linux/module.h> - -struct gpio_led_data { - struct led_classdev cdev; - unsigned gpio; - struct work_struct work; - u8 new_level; - u8 can_sleep; - u8 active_low; - u8 blinking; - int (*platform_gpio_blink_set)(unsigned gpio, int state, - unsigned long *delay_on, unsigned long *delay_off); -}; - -static void gpio_led_work(struct work_struct *work) -{ - struct gpio_led_data *led_dat = - container_of(work, struct gpio_led_data, work); - - if (led_dat->blinking) { - led_dat->platform_gpio_blink_set(led_dat->gpio, - led_dat->new_level, - NULL, NULL); - led_dat->blinking = 0; - } else - gpio_set_value_cansleep(led_dat->gpio, led_dat->new_level); -} - -static void gpio_led_set(struct led_classdev *led_cdev, - enum led_brightness value) -{ - struct gpio_led_data *led_dat = - container_of(led_cdev, struct gpio_led_data, cdev); - int level; - - if (value == LED_OFF) - level = 0; - else - level = 1; - - if (led_dat->active_low) - level = !level; - - /* Setting GPIOs with I2C/etc requires a task context, and we don't - * seem to have a reliable way to know if we're already in one; so - * let's just assume the worst. - */ - if (led_dat->can_sleep) { - led_dat->new_level = level; - schedule_work(&led_dat->work); - } else { - if (led_dat->blinking) { - led_dat->platform_gpio_blink_set(led_dat->gpio, level, - NULL, NULL); - led_dat->blinking = 0; - } else - gpio_direction_output(led_dat->gpio, level); - } -} - -static int gpio_blink_set(struct led_classdev *led_cdev, - unsigned long *delay_on, unsigned long *delay_off) -{ - struct gpio_led_data *led_dat = - container_of(led_cdev, struct gpio_led_data, cdev); - - led_dat->blinking = 1; - return led_dat->platform_gpio_blink_set(led_dat->gpio, GPIO_LED_BLINK, - delay_on, delay_off); -} - -static int __devinit create_gpio_led(const struct gpio_led *template, - struct gpio_led_data *led_dat, struct device *parent, - int (*blink_set)(unsigned, int, unsigned long *, unsigned long *)) -{ - int ret, state; - - led_dat->gpio = -1; - - /* skip leds that aren't available */ - if (!gpio_is_valid(template->gpio)) { - printk(KERN_INFO "Skipping unavailable LED gpio %d (%s)\n", - template->gpio, template->name); - return 0; - } - - ret = gpio_request(template->gpio, template->name); - if (ret < 0) - return ret; - - led_dat->cdev.name = template->name; - led_dat->cdev.default_trigger = template->default_trigger; - led_dat->gpio = template->gpio; - led_dat->can_sleep = gpio_cansleep(template->gpio); - led_dat->active_low = template->active_low; - led_dat->blinking = 0; - if (blink_set) { - led_dat->platform_gpio_blink_set = blink_set; - led_dat->cdev.blink_set = gpio_blink_set; - } - led_dat->cdev.brightness_set = gpio_led_set; - if (template->default_state == LEDS_GPIO_DEFSTATE_KEEP) - state = !!gpio_get_value_cansleep(led_dat->gpio) ^ led_dat->active_low; - else - state = (template->default_state == LEDS_GPIO_DEFSTATE_ON); - led_dat->cdev.brightness = state ? LED_FULL : LED_OFF; - if (!template->retain_state_suspended) - led_dat->cdev.flags |= LED_CORE_SUSPENDRESUME; - - ret = gpio_direction_output(led_dat->gpio, led_dat->active_low ^ state); - if (ret < 0) - goto err; - - INIT_WORK(&led_dat->work, gpio_led_work); - - ret = led_classdev_register(parent, &led_dat->cdev); - if (ret < 0) - goto err; - - return 0; -err: - gpio_free(led_dat->gpio); - return ret; -} - -static void delete_gpio_led(struct gpio_led_data *led) -{ - if (!gpio_is_valid(led->gpio)) - return; - led_classdev_unregister(&led->cdev); - cancel_work_sync(&led->work); - gpio_free(led->gpio); -} - -struct gpio_leds_priv { - int num_leds; - struct gpio_led_data leds[]; -}; - -static inline int sizeof_gpio_leds_priv(int num_leds) -{ - return sizeof(struct gpio_leds_priv) + - (sizeof(struct gpio_led_data) * num_leds); -} - -/* Code to create from OpenFirmware platform devices */ -#ifdef CONFIG_OF_GPIO -static struct gpio_leds_priv * __devinit gpio_leds_create_of(struct platform_device *pdev) -{ - struct device_node *np = pdev->dev.of_node, *child; - struct gpio_leds_priv *priv; - int count = 0, ret; - - /* count LEDs in this device, so we know how much to allocate */ - for_each_child_of_node(np, child) - count++; - if (!count) - return NULL; - - priv = kzalloc(sizeof_gpio_leds_priv(count), GFP_KERNEL); - if (!priv) - return NULL; - - for_each_child_of_node(np, child) { - struct gpio_led led = {}; - enum of_gpio_flags flags; - const char *state; - - led.gpio = of_get_gpio_flags(child, 0, &flags); - led.active_low = flags & OF_GPIO_ACTIVE_LOW; - led.name = of_get_property(child, "label", NULL) ? : child->name; - led.default_trigger = - of_get_property(child, "linux,default-trigger", NULL); - state = of_get_property(child, "default-state", NULL); - if (state) { - if (!strcmp(state, "keep")) - led.default_state = LEDS_GPIO_DEFSTATE_KEEP; - else if (!strcmp(state, "on")) - led.default_state = LEDS_GPIO_DEFSTATE_ON; - else - led.default_state = LEDS_GPIO_DEFSTATE_OFF; - } - - ret = create_gpio_led(&led, &priv->leds[priv->num_leds++], - &pdev->dev, NULL); - if (ret < 0) { - of_node_put(child); - goto err; - } - } - - return priv; - -err: - for (count = priv->num_leds - 2; count >= 0; count--) - delete_gpio_led(&priv->leds[count]); - kfree(priv); - return NULL; -} - -static const struct of_device_id of_gpio_leds_match[] = { - { .compatible = "gpio-leds", }, - {}, -}; -#else /* CONFIG_OF_GPIO */ -static struct gpio_leds_priv * __devinit gpio_leds_create_of(struct platform_device *pdev) -{ - return NULL; -} -#define of_gpio_leds_match NULL -#endif /* CONFIG_OF_GPIO */ - - -static int __devinit gpio_led_probe(struct platform_device *pdev) -{ - struct gpio_led_platform_data *pdata = pdev->dev.platform_data; - struct gpio_leds_priv *priv; - int i, ret = 0; - - if (pdata && pdata->num_leds) { - priv = kzalloc(sizeof_gpio_leds_priv(pdata->num_leds), - GFP_KERNEL); - if (!priv) - return -ENOMEM; - - priv->num_leds = pdata->num_leds; - for (i = 0; i < priv->num_leds; i++) { - ret = create_gpio_led(&pdata->leds[i], - &priv->leds[i], - &pdev->dev, pdata->gpio_blink_set); - if (ret < 0) { - /* On failure: unwind the led creations */ - for (i = i - 1; i >= 0; i--) - delete_gpio_led(&priv->leds[i]); - kfree(priv); - return ret; - } - } - } else { - priv = gpio_leds_create_of(pdev); - if (!priv) - return -ENODEV; - } - - platform_set_drvdata(pdev, priv); - - return 0; -} - -static int __devexit gpio_led_remove(struct platform_device *pdev) -{ - struct gpio_leds_priv *priv = dev_get_drvdata(&pdev->dev); - int i; - - for (i = 0; i < priv->num_leds; i++) - delete_gpio_led(&priv->leds[i]); - - dev_set_drvdata(&pdev->dev, NULL); - kfree(priv); - - return 0; -} - -static struct platform_driver gpio_led_driver = { - .probe = gpio_led_probe, - .remove = __devexit_p(gpio_led_remove), - .driver = { - .name = "leds-gpio", - .owner = THIS_MODULE, - .of_match_table = of_gpio_leds_match, - }, -}; - -module_platform_driver(gpio_led_driver); - -MODULE_AUTHOR("Raphael Assenat <raph@8d.com>, Trent Piepho <tpiepho@freescale.com>"); -MODULE_DESCRIPTION("GPIO LED driver"); -MODULE_LICENSE("GPL"); -MODULE_ALIAS("platform:leds-gpio"); diff --git a/ANDROID_3.4.5/drivers/leds/leds-hp6xx.c b/ANDROID_3.4.5/drivers/leds/leds-hp6xx.c deleted file mode 100644 index 366b6055..00000000 --- a/ANDROID_3.4.5/drivers/leds/leds-hp6xx.c +++ /dev/null @@ -1,96 +0,0 @@ -/* - * LED Triggers Core - * For the HP Jornada 620/660/680/690 handhelds - * - * Copyright 2008 Kristoffer Ericson <kristoffer.ericson@gmail.com> - * this driver is based on leds-spitz.c by Richard Purdie. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ - -#include <linux/module.h> -#include <linux/kernel.h> -#include <linux/init.h> -#include <linux/platform_device.h> -#include <linux/leds.h> -#include <asm/hd64461.h> -#include <mach/hp6xx.h> - -static void hp6xxled_green_set(struct led_classdev *led_cdev, - enum led_brightness value) -{ - u8 v8; - - v8 = inb(PKDR); - if (value) - outb(v8 & (~PKDR_LED_GREEN), PKDR); - else - outb(v8 | PKDR_LED_GREEN, PKDR); -} - -static void hp6xxled_red_set(struct led_classdev *led_cdev, - enum led_brightness value) -{ - u16 v16; - - v16 = inw(HD64461_GPBDR); - if (value) - outw(v16 & (~HD64461_GPBDR_LED_RED), HD64461_GPBDR); - else - outw(v16 | HD64461_GPBDR_LED_RED, HD64461_GPBDR); -} - -static struct led_classdev hp6xx_red_led = { - .name = "hp6xx:red", - .default_trigger = "hp6xx-charge", - .brightness_set = hp6xxled_red_set, - .flags = LED_CORE_SUSPENDRESUME, -}; - -static struct led_classdev hp6xx_green_led = { - .name = "hp6xx:green", - .default_trigger = "ide-disk", - .brightness_set = hp6xxled_green_set, - .flags = LED_CORE_SUSPENDRESUME, -}; - -static int hp6xxled_probe(struct platform_device *pdev) -{ - int ret; - - ret = led_classdev_register(&pdev->dev, &hp6xx_red_led); - if (ret < 0) - return ret; - - ret = led_classdev_register(&pdev->dev, &hp6xx_green_led); - if (ret < 0) - led_classdev_unregister(&hp6xx_red_led); - - return ret; -} - -static int hp6xxled_remove(struct platform_device *pdev) -{ - led_classdev_unregister(&hp6xx_red_led); - led_classdev_unregister(&hp6xx_green_led); - - return 0; -} - -static struct platform_driver hp6xxled_driver = { - .probe = hp6xxled_probe, - .remove = hp6xxled_remove, - .driver = { - .name = "hp6xx-led", - .owner = THIS_MODULE, - }, -}; - -module_platform_driver(hp6xxled_driver); - -MODULE_AUTHOR("Kristoffer Ericson <kristoffer.ericson@gmail.com>"); -MODULE_DESCRIPTION("HP Jornada 6xx LED driver"); -MODULE_LICENSE("GPL"); -MODULE_ALIAS("platform:hp6xx-led"); diff --git a/ANDROID_3.4.5/drivers/leds/leds-lm3530.c b/ANDROID_3.4.5/drivers/leds/leds-lm3530.c deleted file mode 100644 index 968fd5fe..00000000 --- a/ANDROID_3.4.5/drivers/leds/leds-lm3530.c +++ /dev/null @@ -1,485 +0,0 @@ -/* - * Copyright (C) 2011 ST-Ericsson SA. - * Copyright (C) 2009 Motorola, Inc. - * - * License Terms: GNU General Public License v2 - * - * Simple driver for National Semiconductor LM3530 Backlight driver chip - * - * Author: Shreshtha Kumar SAHU <shreshthakumar.sahu@stericsson.com> - * based on leds-lm3530.c by Dan Murphy <D.Murphy@motorola.com> - */ - -#include <linux/i2c.h> -#include <linux/leds.h> -#include <linux/slab.h> -#include <linux/platform_device.h> -#include <linux/input.h> -#include <linux/led-lm3530.h> -#include <linux/types.h> -#include <linux/regulator/consumer.h> -#include <linux/module.h> - -#define LM3530_LED_DEV "lcd-backlight" -#define LM3530_NAME "lm3530-led" - -#define LM3530_GEN_CONFIG 0x10 -#define LM3530_ALS_CONFIG 0x20 -#define LM3530_BRT_RAMP_RATE 0x30 -#define LM3530_ALS_IMP_SELECT 0x41 -#define LM3530_BRT_CTRL_REG 0xA0 -#define LM3530_ALS_ZB0_REG 0x60 -#define LM3530_ALS_ZB1_REG 0x61 -#define LM3530_ALS_ZB2_REG 0x62 -#define LM3530_ALS_ZB3_REG 0x63 -#define LM3530_ALS_Z0T_REG 0x70 -#define LM3530_ALS_Z1T_REG 0x71 -#define LM3530_ALS_Z2T_REG 0x72 -#define LM3530_ALS_Z3T_REG 0x73 -#define LM3530_ALS_Z4T_REG 0x74 -#define LM3530_REG_MAX 14 - -/* General Control Register */ -#define LM3530_EN_I2C_SHIFT (0) -#define LM3530_RAMP_LAW_SHIFT (1) -#define LM3530_MAX_CURR_SHIFT (2) -#define LM3530_EN_PWM_SHIFT (5) -#define LM3530_PWM_POL_SHIFT (6) -#define LM3530_EN_PWM_SIMPLE_SHIFT (7) - -#define LM3530_ENABLE_I2C (1 << LM3530_EN_I2C_SHIFT) -#define LM3530_ENABLE_PWM (1 << LM3530_EN_PWM_SHIFT) -#define LM3530_POL_LOW (1 << LM3530_PWM_POL_SHIFT) -#define LM3530_ENABLE_PWM_SIMPLE (1 << LM3530_EN_PWM_SIMPLE_SHIFT) - -/* ALS Config Register Options */ -#define LM3530_ALS_AVG_TIME_SHIFT (0) -#define LM3530_EN_ALS_SHIFT (3) -#define LM3530_ALS_SEL_SHIFT (5) - -#define LM3530_ENABLE_ALS (3 << LM3530_EN_ALS_SHIFT) - -/* Brightness Ramp Rate Register */ -#define LM3530_BRT_RAMP_FALL_SHIFT (0) -#define LM3530_BRT_RAMP_RISE_SHIFT (3) - -/* ALS Resistor Select */ -#define LM3530_ALS1_IMP_SHIFT (0) -#define LM3530_ALS2_IMP_SHIFT (4) - -/* Zone Boundary Register defaults */ -#define LM3530_ALS_ZB_MAX (4) -#define LM3530_ALS_WINDOW_mV (1000) -#define LM3530_ALS_OFFSET_mV (4) - -/* Zone Target Register defaults */ -#define LM3530_DEF_ZT_0 (0x7F) -#define LM3530_DEF_ZT_1 (0x66) -#define LM3530_DEF_ZT_2 (0x4C) -#define LM3530_DEF_ZT_3 (0x33) -#define LM3530_DEF_ZT_4 (0x19) - -/* 7 bits are used for the brightness : LM3530_BRT_CTRL_REG */ -#define MAX_BRIGHTNESS (127) - -struct lm3530_mode_map { - const char *mode; - enum lm3530_mode mode_val; -}; - -static struct lm3530_mode_map mode_map[] = { - { "man", LM3530_BL_MODE_MANUAL }, - { "als", LM3530_BL_MODE_ALS }, - { "pwm", LM3530_BL_MODE_PWM }, -}; - -/** - * struct lm3530_data - * @led_dev: led class device - * @client: i2c client - * @pdata: LM3530 platform data - * @mode: mode of operation - manual, ALS, PWM - * @regulator: regulator - * @brighness: previous brightness value - * @enable: regulator is enabled - */ -struct lm3530_data { - struct led_classdev led_dev; - struct i2c_client *client; - struct lm3530_platform_data *pdata; - enum lm3530_mode mode; - struct regulator *regulator; - enum led_brightness brightness; - bool enable; -}; - -static const u8 lm3530_reg[LM3530_REG_MAX] = { - LM3530_GEN_CONFIG, - LM3530_ALS_CONFIG, - LM3530_BRT_RAMP_RATE, - LM3530_ALS_IMP_SELECT, - LM3530_BRT_CTRL_REG, - LM3530_ALS_ZB0_REG, - LM3530_ALS_ZB1_REG, - LM3530_ALS_ZB2_REG, - LM3530_ALS_ZB3_REG, - LM3530_ALS_Z0T_REG, - LM3530_ALS_Z1T_REG, - LM3530_ALS_Z2T_REG, - LM3530_ALS_Z3T_REG, - LM3530_ALS_Z4T_REG, -}; - -static int lm3530_get_mode_from_str(const char *str) -{ - int i; - - for (i = 0; i < ARRAY_SIZE(mode_map); i++) - if (sysfs_streq(str, mode_map[i].mode)) - return mode_map[i].mode_val; - - return -1; -} - -static int lm3530_init_registers(struct lm3530_data *drvdata) -{ - int ret = 0; - int i; - u8 gen_config; - u8 als_config = 0; - u8 brt_ramp; - u8 als_imp_sel = 0; - u8 brightness; - u8 reg_val[LM3530_REG_MAX]; - u8 zones[LM3530_ALS_ZB_MAX]; - u32 als_vmin, als_vmax, als_vstep; - struct lm3530_platform_data *pdata = drvdata->pdata; - struct i2c_client *client = drvdata->client; - struct lm3530_pwm_data *pwm = &pdata->pwm_data; - - gen_config = (pdata->brt_ramp_law << LM3530_RAMP_LAW_SHIFT) | - ((pdata->max_current & 7) << LM3530_MAX_CURR_SHIFT); - - switch (drvdata->mode) { - case LM3530_BL_MODE_MANUAL: - case LM3530_BL_MODE_ALS: - gen_config |= LM3530_ENABLE_I2C; - break; - case LM3530_BL_MODE_PWM: - gen_config |= LM3530_ENABLE_PWM | LM3530_ENABLE_PWM_SIMPLE | - (pdata->pwm_pol_hi << LM3530_PWM_POL_SHIFT); - break; - } - - if (drvdata->mode == LM3530_BL_MODE_ALS) { - if (pdata->als_vmax == 0) { - pdata->als_vmin = 0; - pdata->als_vmax = LM3530_ALS_WINDOW_mV; - } - - als_vmin = pdata->als_vmin; - als_vmax = pdata->als_vmax; - - if ((als_vmax - als_vmin) > LM3530_ALS_WINDOW_mV) - pdata->als_vmax = als_vmax = - als_vmin + LM3530_ALS_WINDOW_mV; - - /* n zone boundary makes n+1 zones */ - als_vstep = (als_vmax - als_vmin) / (LM3530_ALS_ZB_MAX + 1); - - for (i = 0; i < LM3530_ALS_ZB_MAX; i++) - zones[i] = (((als_vmin + LM3530_ALS_OFFSET_mV) + - als_vstep + (i * als_vstep)) * LED_FULL) - / 1000; - - als_config = - (pdata->als_avrg_time << LM3530_ALS_AVG_TIME_SHIFT) | - (LM3530_ENABLE_ALS) | - (pdata->als_input_mode << LM3530_ALS_SEL_SHIFT); - - als_imp_sel = - (pdata->als1_resistor_sel << LM3530_ALS1_IMP_SHIFT) | - (pdata->als2_resistor_sel << LM3530_ALS2_IMP_SHIFT); - - } - - brt_ramp = (pdata->brt_ramp_fall << LM3530_BRT_RAMP_FALL_SHIFT) | - (pdata->brt_ramp_rise << LM3530_BRT_RAMP_RISE_SHIFT); - - if (drvdata->brightness) - brightness = drvdata->brightness; - else - brightness = drvdata->brightness = pdata->brt_val; - - if (brightness > drvdata->led_dev.max_brightness) - brightness = drvdata->led_dev.max_brightness; - - reg_val[0] = gen_config; /* LM3530_GEN_CONFIG */ - reg_val[1] = als_config; /* LM3530_ALS_CONFIG */ - reg_val[2] = brt_ramp; /* LM3530_BRT_RAMP_RATE */ - reg_val[3] = als_imp_sel; /* LM3530_ALS_IMP_SELECT */ - reg_val[4] = brightness; /* LM3530_BRT_CTRL_REG */ - reg_val[5] = zones[0]; /* LM3530_ALS_ZB0_REG */ - reg_val[6] = zones[1]; /* LM3530_ALS_ZB1_REG */ - reg_val[7] = zones[2]; /* LM3530_ALS_ZB2_REG */ - reg_val[8] = zones[3]; /* LM3530_ALS_ZB3_REG */ - reg_val[9] = LM3530_DEF_ZT_0; /* LM3530_ALS_Z0T_REG */ - reg_val[10] = LM3530_DEF_ZT_1; /* LM3530_ALS_Z1T_REG */ - reg_val[11] = LM3530_DEF_ZT_2; /* LM3530_ALS_Z2T_REG */ - reg_val[12] = LM3530_DEF_ZT_3; /* LM3530_ALS_Z3T_REG */ - reg_val[13] = LM3530_DEF_ZT_4; /* LM3530_ALS_Z4T_REG */ - - if (!drvdata->enable) { - ret = regulator_enable(drvdata->regulator); - if (ret) { - dev_err(&drvdata->client->dev, - "Enable regulator failed\n"); - return ret; - } - drvdata->enable = true; - } - - for (i = 0; i < LM3530_REG_MAX; i++) { - /* do not update brightness register when pwm mode */ - if (lm3530_reg[i] == LM3530_BRT_CTRL_REG && - drvdata->mode == LM3530_BL_MODE_PWM) { - if (pwm->pwm_set_intensity) - pwm->pwm_set_intensity(reg_val[i], - drvdata->led_dev.max_brightness); - continue; - } - - ret = i2c_smbus_write_byte_data(client, - lm3530_reg[i], reg_val[i]); - if (ret) - break; - } - - return ret; -} - -static void lm3530_brightness_set(struct led_classdev *led_cdev, - enum led_brightness brt_val) -{ - int err; - struct lm3530_data *drvdata = - container_of(led_cdev, struct lm3530_data, led_dev); - struct lm3530_platform_data *pdata = drvdata->pdata; - struct lm3530_pwm_data *pwm = &pdata->pwm_data; - u8 max_brightness = led_cdev->max_brightness; - - switch (drvdata->mode) { - case LM3530_BL_MODE_MANUAL: - - if (!drvdata->enable) { - err = lm3530_init_registers(drvdata); - if (err) { - dev_err(&drvdata->client->dev, - "Register Init failed: %d\n", err); - break; - } - } - - /* set the brightness in brightness control register*/ - err = i2c_smbus_write_byte_data(drvdata->client, - LM3530_BRT_CTRL_REG, brt_val); - if (err) - dev_err(&drvdata->client->dev, - "Unable to set brightness: %d\n", err); - else - drvdata->brightness = brt_val; - - if (brt_val == 0) { - err = regulator_disable(drvdata->regulator); - if (err) - dev_err(&drvdata->client->dev, - "Disable regulator failed\n"); - drvdata->enable = false; - } - break; - case LM3530_BL_MODE_ALS: - break; - case LM3530_BL_MODE_PWM: - if (pwm->pwm_set_intensity) - pwm->pwm_set_intensity(brt_val, max_brightness); - break; - default: - break; - } -} - -static ssize_t lm3530_mode_get(struct device *dev, - struct device_attribute *attr, char *buf) -{ - struct led_classdev *led_cdev = dev_get_drvdata(dev); - struct lm3530_data *drvdata; - int i, len = 0; - - drvdata = container_of(led_cdev, struct lm3530_data, led_dev); - for (i = 0; i < ARRAY_SIZE(mode_map); i++) - if (drvdata->mode == mode_map[i].mode_val) - len += sprintf(buf + len, "[%s] ", mode_map[i].mode); - else - len += sprintf(buf + len, "%s ", mode_map[i].mode); - - len += sprintf(buf + len, "\n"); - - return len; -} - -static ssize_t lm3530_mode_set(struct device *dev, struct device_attribute - *attr, const char *buf, size_t size) -{ - struct led_classdev *led_cdev = dev_get_drvdata(dev); - struct lm3530_data *drvdata; - struct lm3530_pwm_data *pwm; - u8 max_brightness; - int mode, err; - - drvdata = container_of(led_cdev, struct lm3530_data, led_dev); - pwm = &drvdata->pdata->pwm_data; - max_brightness = led_cdev->max_brightness; - mode = lm3530_get_mode_from_str(buf); - if (mode < 0) { - dev_err(dev, "Invalid mode\n"); - return -EINVAL; - } - - drvdata->mode = mode; - - /* set pwm to low if unnecessary */ - if (mode != LM3530_BL_MODE_PWM && pwm->pwm_set_intensity) - pwm->pwm_set_intensity(0, max_brightness); - - err = lm3530_init_registers(drvdata); - if (err) { - dev_err(dev, "Setting %s Mode failed :%d\n", buf, err); - return err; - } - - return sizeof(drvdata->mode); -} -static DEVICE_ATTR(mode, 0644, lm3530_mode_get, lm3530_mode_set); - -static int __devinit lm3530_probe(struct i2c_client *client, - const struct i2c_device_id *id) -{ - struct lm3530_platform_data *pdata = client->dev.platform_data; - struct lm3530_data *drvdata; - int err = 0; - - if (pdata == NULL) { - dev_err(&client->dev, "platform data required\n"); - err = -ENODEV; - goto err_out; - } - - /* BL mode */ - if (pdata->mode > LM3530_BL_MODE_PWM) { - dev_err(&client->dev, "Illegal Mode request\n"); - err = -EINVAL; - goto err_out; - } - - if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { - dev_err(&client->dev, "I2C_FUNC_I2C not supported\n"); - err = -EIO; - goto err_out; - } - - drvdata = kzalloc(sizeof(struct lm3530_data), GFP_KERNEL); - if (drvdata == NULL) { - err = -ENOMEM; - goto err_out; - } - - drvdata->mode = pdata->mode; - drvdata->client = client; - drvdata->pdata = pdata; - drvdata->brightness = LED_OFF; - drvdata->enable = false; - drvdata->led_dev.name = LM3530_LED_DEV; - drvdata->led_dev.brightness_set = lm3530_brightness_set; - drvdata->led_dev.max_brightness = MAX_BRIGHTNESS; - - i2c_set_clientdata(client, drvdata); - - drvdata->regulator = regulator_get(&client->dev, "vin"); - if (IS_ERR(drvdata->regulator)) { - dev_err(&client->dev, "regulator get failed\n"); - err = PTR_ERR(drvdata->regulator); - drvdata->regulator = NULL; - goto err_regulator_get; - } - - if (drvdata->pdata->brt_val) { - err = lm3530_init_registers(drvdata); - if (err < 0) { - dev_err(&client->dev, - "Register Init failed: %d\n", err); - err = -ENODEV; - goto err_reg_init; - } - } - err = led_classdev_register(&client->dev, &drvdata->led_dev); - if (err < 0) { - dev_err(&client->dev, "Register led class failed: %d\n", err); - err = -ENODEV; - goto err_class_register; - } - - err = device_create_file(drvdata->led_dev.dev, &dev_attr_mode); - if (err < 0) { - dev_err(&client->dev, "File device creation failed: %d\n", err); - err = -ENODEV; - goto err_create_file; - } - - return 0; - -err_create_file: - led_classdev_unregister(&drvdata->led_dev); -err_class_register: -err_reg_init: - regulator_put(drvdata->regulator); -err_regulator_get: - kfree(drvdata); -err_out: - return err; -} - -static int __devexit lm3530_remove(struct i2c_client *client) -{ - struct lm3530_data *drvdata = i2c_get_clientdata(client); - - device_remove_file(drvdata->led_dev.dev, &dev_attr_mode); - - if (drvdata->enable) - regulator_disable(drvdata->regulator); - regulator_put(drvdata->regulator); - led_classdev_unregister(&drvdata->led_dev); - kfree(drvdata); - return 0; -} - -static const struct i2c_device_id lm3530_id[] = { - {LM3530_NAME, 0}, - {} -}; -MODULE_DEVICE_TABLE(i2c, lm3530_id); - -static struct i2c_driver lm3530_i2c_driver = { - .probe = lm3530_probe, - .remove = __devexit_p(lm3530_remove), - .id_table = lm3530_id, - .driver = { - .name = LM3530_NAME, - .owner = THIS_MODULE, - }, -}; - -module_i2c_driver(lm3530_i2c_driver); - -MODULE_DESCRIPTION("Back Light driver for LM3530"); -MODULE_LICENSE("GPL v2"); -MODULE_AUTHOR("Shreshtha Kumar SAHU <shreshthakumar.sahu@stericsson.com>"); diff --git a/ANDROID_3.4.5/drivers/leds/leds-locomo.c b/ANDROID_3.4.5/drivers/leds/leds-locomo.c deleted file mode 100644 index 80ba0488..00000000 --- a/ANDROID_3.4.5/drivers/leds/leds-locomo.c +++ /dev/null @@ -1,97 +0,0 @@ -/* - * linux/drivers/leds/leds-locomo.c - * - * Copyright (C) 2005 John Lenz <lenz@cs.wisc.edu> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ - -#include <linux/kernel.h> -#include <linux/init.h> -#include <linux/module.h> -#include <linux/device.h> -#include <linux/leds.h> - -#include <mach/hardware.h> -#include <asm/hardware/locomo.h> - -static void locomoled_brightness_set(struct led_classdev *led_cdev, - enum led_brightness value, int offset) -{ - struct locomo_dev *locomo_dev = LOCOMO_DEV(led_cdev->dev->parent); - unsigned long flags; - - local_irq_save(flags); - if (value) - locomo_writel(LOCOMO_LPT_TOFH, locomo_dev->mapbase + offset); - else - locomo_writel(LOCOMO_LPT_TOFL, locomo_dev->mapbase + offset); - local_irq_restore(flags); -} - -static void locomoled_brightness_set0(struct led_classdev *led_cdev, - enum led_brightness value) -{ - locomoled_brightness_set(led_cdev, value, LOCOMO_LPT0); -} - -static void locomoled_brightness_set1(struct led_classdev *led_cdev, - enum led_brightness value) -{ - locomoled_brightness_set(led_cdev, value, LOCOMO_LPT1); -} - -static struct led_classdev locomo_led0 = { - .name = "locomo:amber:charge", - .default_trigger = "main-battery-charging", - .brightness_set = locomoled_brightness_set0, -}; - -static struct led_classdev locomo_led1 = { - .name = "locomo:green:mail", - .default_trigger = "nand-disk", - .brightness_set = locomoled_brightness_set1, -}; - -static int locomoled_probe(struct locomo_dev *ldev) -{ - int ret; - - ret = led_classdev_register(&ldev->dev, &locomo_led0); - if (ret < 0) - return ret; - - ret = led_classdev_register(&ldev->dev, &locomo_led1); - if (ret < 0) - led_classdev_unregister(&locomo_led0); - - return ret; -} - -static int locomoled_remove(struct locomo_dev *dev) -{ - led_classdev_unregister(&locomo_led0); - led_classdev_unregister(&locomo_led1); - return 0; -} - -static struct locomo_driver locomoled_driver = { - .drv = { - .name = "locomoled" - }, - .devid = LOCOMO_DEVID_LED, - .probe = locomoled_probe, - .remove = locomoled_remove, -}; - -static int __init locomoled_init(void) -{ - return locomo_driver_register(&locomoled_driver); -} -module_init(locomoled_init); - -MODULE_AUTHOR("John Lenz <lenz@cs.wisc.edu>"); -MODULE_DESCRIPTION("Locomo LED driver"); -MODULE_LICENSE("GPL"); diff --git a/ANDROID_3.4.5/drivers/leds/leds-lp3944.c b/ANDROID_3.4.5/drivers/leds/leds-lp3944.c deleted file mode 100644 index b8f9f0a5..00000000 --- a/ANDROID_3.4.5/drivers/leds/leds-lp3944.c +++ /dev/null @@ -1,460 +0,0 @@ -/* - * leds-lp3944.c - driver for National Semiconductor LP3944 Funlight Chip - * - * Copyright (C) 2009 Antonio Ospite <ospite@studenti.unina.it> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - */ - -/* - * I2C driver for National Semiconductor LP3944 Funlight Chip - * http://www.national.com/pf/LP/LP3944.html - * - * This helper chip can drive up to 8 leds, with two programmable DIM modes; - * it could even be used as a gpio expander but this driver assumes it is used - * as a led controller. - * - * The DIM modes are used to set _blink_ patterns for leds, the pattern is - * specified supplying two parameters: - * - period: from 0s to 1.6s - * - duty cycle: percentage of the period the led is on, from 0 to 100 - * - * LP3944 can be found on Motorola A910 smartphone, where it drives the rgb - * leds, the camera flash light and the displays backlights. - */ - -#include <linux/module.h> -#include <linux/i2c.h> -#include <linux/slab.h> -#include <linux/leds.h> -#include <linux/mutex.h> -#include <linux/workqueue.h> -#include <linux/leds-lp3944.h> - -/* Read Only Registers */ -#define LP3944_REG_INPUT1 0x00 /* LEDs 0-7 InputRegister (Read Only) */ -#define LP3944_REG_REGISTER1 0x01 /* None (Read Only) */ - -#define LP3944_REG_PSC0 0x02 /* Frequency Prescaler 0 (R/W) */ -#define LP3944_REG_PWM0 0x03 /* PWM Register 0 (R/W) */ -#define LP3944_REG_PSC1 0x04 /* Frequency Prescaler 1 (R/W) */ -#define LP3944_REG_PWM1 0x05 /* PWM Register 1 (R/W) */ -#define LP3944_REG_LS0 0x06 /* LEDs 0-3 Selector (R/W) */ -#define LP3944_REG_LS1 0x07 /* LEDs 4-7 Selector (R/W) */ - -/* These registers are not used to control leds in LP3944, they can store - * arbitrary values which the chip will ignore. - */ -#define LP3944_REG_REGISTER8 0x08 -#define LP3944_REG_REGISTER9 0x09 - -#define LP3944_DIM0 0 -#define LP3944_DIM1 1 - -/* period in ms */ -#define LP3944_PERIOD_MIN 0 -#define LP3944_PERIOD_MAX 1600 - -/* duty cycle is a percentage */ -#define LP3944_DUTY_CYCLE_MIN 0 -#define LP3944_DUTY_CYCLE_MAX 100 - -#define ldev_to_led(c) container_of(c, struct lp3944_led_data, ldev) - -/* Saved data */ -struct lp3944_led_data { - u8 id; - enum lp3944_type type; - enum lp3944_status status; - struct led_classdev ldev; - struct i2c_client *client; - struct work_struct work; -}; - -struct lp3944_data { - struct mutex lock; - struct i2c_client *client; - struct lp3944_led_data leds[LP3944_LEDS_MAX]; -}; - -static int lp3944_reg_read(struct i2c_client *client, u8 reg, u8 *value) -{ - int tmp; - - tmp = i2c_smbus_read_byte_data(client, reg); - if (tmp < 0) - return -EINVAL; - - *value = tmp; - - return 0; -} - -static int lp3944_reg_write(struct i2c_client *client, u8 reg, u8 value) -{ - return i2c_smbus_write_byte_data(client, reg, value); -} - -/** - * Set the period for DIM status - * - * @client: the i2c client - * @dim: either LP3944_DIM0 or LP3944_DIM1 - * @period: period of a blink, that is a on/off cycle, expressed in ms. - */ -static int lp3944_dim_set_period(struct i2c_client *client, u8 dim, u16 period) -{ - u8 psc_reg; - u8 psc_value; - int err; - - if (dim == LP3944_DIM0) - psc_reg = LP3944_REG_PSC0; - else if (dim == LP3944_DIM1) - psc_reg = LP3944_REG_PSC1; - else - return -EINVAL; - - /* Convert period to Prescaler value */ - if (period > LP3944_PERIOD_MAX) - return -EINVAL; - - psc_value = (period * 255) / LP3944_PERIOD_MAX; - - err = lp3944_reg_write(client, psc_reg, psc_value); - - return err; -} - -/** - * Set the duty cycle for DIM status - * - * @client: the i2c client - * @dim: either LP3944_DIM0 or LP3944_DIM1 - * @duty_cycle: percentage of a period during which a led is ON - */ -static int lp3944_dim_set_dutycycle(struct i2c_client *client, u8 dim, - u8 duty_cycle) -{ - u8 pwm_reg; - u8 pwm_value; - int err; - - if (dim == LP3944_DIM0) - pwm_reg = LP3944_REG_PWM0; - else if (dim == LP3944_DIM1) - pwm_reg = LP3944_REG_PWM1; - else - return -EINVAL; - - /* Convert duty cycle to PWM value */ - if (duty_cycle > LP3944_DUTY_CYCLE_MAX) - return -EINVAL; - - pwm_value = (duty_cycle * 255) / LP3944_DUTY_CYCLE_MAX; - - err = lp3944_reg_write(client, pwm_reg, pwm_value); - - return err; -} - -/** - * Set the led status - * - * @led: a lp3944_led_data structure - * @status: one of LP3944_LED_STATUS_OFF - * LP3944_LED_STATUS_ON - * LP3944_LED_STATUS_DIM0 - * LP3944_LED_STATUS_DIM1 - */ -static int lp3944_led_set(struct lp3944_led_data *led, u8 status) -{ - struct lp3944_data *data = i2c_get_clientdata(led->client); - u8 id = led->id; - u8 reg; - u8 val = 0; - int err; - - dev_dbg(&led->client->dev, "%s: %s, status before normalization:%d\n", - __func__, led->ldev.name, status); - - switch (id) { - case LP3944_LED0: - case LP3944_LED1: - case LP3944_LED2: - case LP3944_LED3: - reg = LP3944_REG_LS0; - break; - case LP3944_LED4: - case LP3944_LED5: - case LP3944_LED6: - case LP3944_LED7: - id -= LP3944_LED4; - reg = LP3944_REG_LS1; - break; - default: - return -EINVAL; - } - - if (status > LP3944_LED_STATUS_DIM1) - return -EINVAL; - - /* invert only 0 and 1, leave unchanged the other values, - * remember we are abusing status to set blink patterns - */ - if (led->type == LP3944_LED_TYPE_LED_INVERTED && status < 2) - status = 1 - status; - - mutex_lock(&data->lock); - lp3944_reg_read(led->client, reg, &val); - - val &= ~(LP3944_LED_STATUS_MASK << (id << 1)); - val |= (status << (id << 1)); - - dev_dbg(&led->client->dev, "%s: %s, reg:%d id:%d status:%d val:%#x\n", - __func__, led->ldev.name, reg, id, status, val); - - /* set led status */ - err = lp3944_reg_write(led->client, reg, val); - mutex_unlock(&data->lock); - - return err; -} - -static int lp3944_led_set_blink(struct led_classdev *led_cdev, - unsigned long *delay_on, - unsigned long *delay_off) -{ - struct lp3944_led_data *led = ldev_to_led(led_cdev); - u16 period; - u8 duty_cycle; - int err; - - /* units are in ms */ - if (*delay_on + *delay_off > LP3944_PERIOD_MAX) - return -EINVAL; - - if (*delay_on == 0 && *delay_off == 0) { - /* Special case: the leds subsystem requires a default user - * friendly blink pattern for the LED. Let's blink the led - * slowly (1Hz). - */ - *delay_on = 500; - *delay_off = 500; - } - - period = (*delay_on) + (*delay_off); - - /* duty_cycle is the percentage of period during which the led is ON */ - duty_cycle = 100 * (*delay_on) / period; - - /* invert duty cycle for inverted leds, this has the same effect of - * swapping delay_on and delay_off - */ - if (led->type == LP3944_LED_TYPE_LED_INVERTED) - duty_cycle = 100 - duty_cycle; - - /* NOTE: using always the first DIM mode, this means that all leds - * will have the same blinking pattern. - * - * We could find a way later to have two leds blinking in hardware - * with different patterns at the same time, falling back to software - * control for the other ones. - */ - err = lp3944_dim_set_period(led->client, LP3944_DIM0, period); - if (err) - return err; - - err = lp3944_dim_set_dutycycle(led->client, LP3944_DIM0, duty_cycle); - if (err) - return err; - - dev_dbg(&led->client->dev, "%s: OK hardware accelerated blink!\n", - __func__); - - led->status = LP3944_LED_STATUS_DIM0; - schedule_work(&led->work); - - return 0; -} - -static void lp3944_led_set_brightness(struct led_classdev *led_cdev, - enum led_brightness brightness) -{ - struct lp3944_led_data *led = ldev_to_led(led_cdev); - - dev_dbg(&led->client->dev, "%s: %s, %d\n", - __func__, led_cdev->name, brightness); - - led->status = brightness; - schedule_work(&led->work); -} - -static void lp3944_led_work(struct work_struct *work) -{ - struct lp3944_led_data *led; - - led = container_of(work, struct lp3944_led_data, work); - lp3944_led_set(led, led->status); -} - -static int lp3944_configure(struct i2c_client *client, - struct lp3944_data *data, - struct lp3944_platform_data *pdata) -{ - int i, err = 0; - - for (i = 0; i < pdata->leds_size; i++) { - struct lp3944_led *pled = &pdata->leds[i]; - struct lp3944_led_data *led = &data->leds[i]; - led->client = client; - led->id = i; - - switch (pled->type) { - - case LP3944_LED_TYPE_LED: - case LP3944_LED_TYPE_LED_INVERTED: - led->type = pled->type; - led->status = pled->status; - led->ldev.name = pled->name; - led->ldev.max_brightness = 1; - led->ldev.brightness_set = lp3944_led_set_brightness; - led->ldev.blink_set = lp3944_led_set_blink; - led->ldev.flags = LED_CORE_SUSPENDRESUME; - - INIT_WORK(&led->work, lp3944_led_work); - err = led_classdev_register(&client->dev, &led->ldev); - if (err < 0) { - dev_err(&client->dev, - "couldn't register LED %s\n", - led->ldev.name); - goto exit; - } - - /* to expose the default value to userspace */ - led->ldev.brightness = led->status; - - /* Set the default led status */ - err = lp3944_led_set(led, led->status); - if (err < 0) { - dev_err(&client->dev, - "%s couldn't set STATUS %d\n", - led->ldev.name, led->status); - goto exit; - } - break; - - case LP3944_LED_TYPE_NONE: - default: - break; - - } - } - return 0; - -exit: - if (i > 0) - for (i = i - 1; i >= 0; i--) - switch (pdata->leds[i].type) { - - case LP3944_LED_TYPE_LED: - case LP3944_LED_TYPE_LED_INVERTED: - led_classdev_unregister(&data->leds[i].ldev); - cancel_work_sync(&data->leds[i].work); - break; - - case LP3944_LED_TYPE_NONE: - default: - break; - } - - return err; -} - -static int __devinit lp3944_probe(struct i2c_client *client, - const struct i2c_device_id *id) -{ - struct lp3944_platform_data *lp3944_pdata = client->dev.platform_data; - struct lp3944_data *data; - int err; - - if (lp3944_pdata == NULL) { - dev_err(&client->dev, "no platform data\n"); - return -EINVAL; - } - - /* Let's see whether this adapter can support what we need. */ - if (!i2c_check_functionality(client->adapter, - I2C_FUNC_SMBUS_BYTE_DATA)) { - dev_err(&client->dev, "insufficient functionality!\n"); - return -ENODEV; - } - - data = kzalloc(sizeof(struct lp3944_data), GFP_KERNEL); - if (!data) - return -ENOMEM; - - data->client = client; - i2c_set_clientdata(client, data); - - mutex_init(&data->lock); - - err = lp3944_configure(client, data, lp3944_pdata); - if (err < 0) { - kfree(data); - return err; - } - - dev_info(&client->dev, "lp3944 enabled\n"); - return 0; -} - -static int __devexit lp3944_remove(struct i2c_client *client) -{ - struct lp3944_platform_data *pdata = client->dev.platform_data; - struct lp3944_data *data = i2c_get_clientdata(client); - int i; - - for (i = 0; i < pdata->leds_size; i++) - switch (data->leds[i].type) { - case LP3944_LED_TYPE_LED: - case LP3944_LED_TYPE_LED_INVERTED: - led_classdev_unregister(&data->leds[i].ldev); - cancel_work_sync(&data->leds[i].work); - break; - - case LP3944_LED_TYPE_NONE: - default: - break; - } - - kfree(data); - - return 0; -} - -/* lp3944 i2c driver struct */ -static const struct i2c_device_id lp3944_id[] = { - {"lp3944", 0}, - {} -}; - -MODULE_DEVICE_TABLE(i2c, lp3944_id); - -static struct i2c_driver lp3944_driver = { - .driver = { - .name = "lp3944", - }, - .probe = lp3944_probe, - .remove = __devexit_p(lp3944_remove), - .id_table = lp3944_id, -}; - -module_i2c_driver(lp3944_driver); - -MODULE_AUTHOR("Antonio Ospite <ospite@studenti.unina.it>"); -MODULE_DESCRIPTION("LP3944 Fun Light Chip"); -MODULE_LICENSE("GPL"); diff --git a/ANDROID_3.4.5/drivers/leds/leds-lp5521.c b/ANDROID_3.4.5/drivers/leds/leds-lp5521.c deleted file mode 100644 index 410a723b..00000000 --- a/ANDROID_3.4.5/drivers/leds/leds-lp5521.c +++ /dev/null @@ -1,897 +0,0 @@ -/* - * LP5521 LED chip driver. - * - * Copyright (C) 2010 Nokia Corporation - * - * Contact: Samu Onkalo <samu.p.onkalo@nokia.com> - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA - * 02110-1301 USA - */ - -#include <linux/module.h> -#include <linux/init.h> -#include <linux/i2c.h> -#include <linux/mutex.h> -#include <linux/gpio.h> -#include <linux/interrupt.h> -#include <linux/delay.h> -#include <linux/ctype.h> -#include <linux/spinlock.h> -#include <linux/wait.h> -#include <linux/leds.h> -#include <linux/leds-lp5521.h> -#include <linux/workqueue.h> -#include <linux/slab.h> - -#define LP5521_PROGRAM_LENGTH 32 /* in bytes */ - -#define LP5521_MAX_LEDS 3 /* Maximum number of LEDs */ -#define LP5521_MAX_ENGINES 3 /* Maximum number of engines */ - -#define LP5521_ENG_MASK_BASE 0x30 /* 00110000 */ -#define LP5521_ENG_STATUS_MASK 0x07 /* 00000111 */ - -#define LP5521_CMD_LOAD 0x15 /* 00010101 */ -#define LP5521_CMD_RUN 0x2a /* 00101010 */ -#define LP5521_CMD_DIRECT 0x3f /* 00111111 */ -#define LP5521_CMD_DISABLED 0x00 /* 00000000 */ - -/* Registers */ -#define LP5521_REG_ENABLE 0x00 -#define LP5521_REG_OP_MODE 0x01 -#define LP5521_REG_R_PWM 0x02 -#define LP5521_REG_G_PWM 0x03 -#define LP5521_REG_B_PWM 0x04 -#define LP5521_REG_R_CURRENT 0x05 -#define LP5521_REG_G_CURRENT 0x06 -#define LP5521_REG_B_CURRENT 0x07 -#define LP5521_REG_CONFIG 0x08 -#define LP5521_REG_R_CHANNEL_PC 0x09 -#define LP5521_REG_G_CHANNEL_PC 0x0A -#define LP5521_REG_B_CHANNEL_PC 0x0B -#define LP5521_REG_STATUS 0x0C -#define LP5521_REG_RESET 0x0D -#define LP5521_REG_GPO 0x0E -#define LP5521_REG_R_PROG_MEM 0x10 -#define LP5521_REG_G_PROG_MEM 0x30 -#define LP5521_REG_B_PROG_MEM 0x50 - -#define LP5521_PROG_MEM_BASE LP5521_REG_R_PROG_MEM -#define LP5521_PROG_MEM_SIZE 0x20 - -/* Base register to set LED current */ -#define LP5521_REG_LED_CURRENT_BASE LP5521_REG_R_CURRENT - -/* Base register to set the brightness */ -#define LP5521_REG_LED_PWM_BASE LP5521_REG_R_PWM - -/* Bits in ENABLE register */ -#define LP5521_MASTER_ENABLE 0x40 /* Chip master enable */ -#define LP5521_LOGARITHMIC_PWM 0x80 /* Logarithmic PWM adjustment */ -#define LP5521_EXEC_RUN 0x2A -#define LP5521_ENABLE_DEFAULT \ - (LP5521_MASTER_ENABLE | LP5521_LOGARITHMIC_PWM) -#define LP5521_ENABLE_RUN_PROGRAM \ - (LP5521_ENABLE_DEFAULT | LP5521_EXEC_RUN) - -/* Status */ -#define LP5521_EXT_CLK_USED 0x08 - -/* default R channel current register value */ -#define LP5521_REG_R_CURR_DEFAULT 0xAF - -/* Pattern Mode */ -#define PATTERN_OFF 0 - -struct lp5521_engine { - int id; - u8 mode; - u8 prog_page; - u8 engine_mask; -}; - -struct lp5521_led { - int id; - u8 chan_nr; - u8 led_current; - u8 max_current; - struct led_classdev cdev; - struct work_struct brightness_work; - u8 brightness; -}; - -struct lp5521_chip { - struct lp5521_platform_data *pdata; - struct mutex lock; /* Serialize control */ - struct i2c_client *client; - struct lp5521_engine engines[LP5521_MAX_ENGINES]; - struct lp5521_led leds[LP5521_MAX_LEDS]; - u8 num_channels; - u8 num_leds; -}; - -static inline struct lp5521_led *cdev_to_led(struct led_classdev *cdev) -{ - return container_of(cdev, struct lp5521_led, cdev); -} - -static inline struct lp5521_chip *engine_to_lp5521(struct lp5521_engine *engine) -{ - return container_of(engine, struct lp5521_chip, - engines[engine->id - 1]); -} - -static inline struct lp5521_chip *led_to_lp5521(struct lp5521_led *led) -{ - return container_of(led, struct lp5521_chip, - leds[led->id]); -} - -static void lp5521_led_brightness_work(struct work_struct *work); - -static inline int lp5521_write(struct i2c_client *client, u8 reg, u8 value) -{ - return i2c_smbus_write_byte_data(client, reg, value); -} - -static int lp5521_read(struct i2c_client *client, u8 reg, u8 *buf) -{ - s32 ret; - - ret = i2c_smbus_read_byte_data(client, reg); - if (ret < 0) - return -EIO; - - *buf = ret; - return 0; -} - -static int lp5521_set_engine_mode(struct lp5521_engine *engine, u8 mode) -{ - struct lp5521_chip *chip = engine_to_lp5521(engine); - struct i2c_client *client = chip->client; - int ret; - u8 engine_state; - - /* Only transition between RUN and DIRECT mode are handled here */ - if (mode == LP5521_CMD_LOAD) - return 0; - - if (mode == LP5521_CMD_DISABLED) - mode = LP5521_CMD_DIRECT; - - ret = lp5521_read(client, LP5521_REG_OP_MODE, &engine_state); - if (ret < 0) - return ret; - - /* set mode only for this engine */ - engine_state &= ~(engine->engine_mask); - mode &= engine->engine_mask; - engine_state |= mode; - return lp5521_write(client, LP5521_REG_OP_MODE, engine_state); -} - -static int lp5521_load_program(struct lp5521_engine *eng, const u8 *pattern) -{ - struct lp5521_chip *chip = engine_to_lp5521(eng); - struct i2c_client *client = chip->client; - int ret; - int addr; - u8 mode; - - /* move current engine to direct mode and remember the state */ - ret = lp5521_set_engine_mode(eng, LP5521_CMD_DIRECT); - /* Mode change requires min 500 us delay. 1 - 2 ms with margin */ - usleep_range(1000, 2000); - ret |= lp5521_read(client, LP5521_REG_OP_MODE, &mode); - - /* For loading, all the engines to load mode */ - lp5521_write(client, LP5521_REG_OP_MODE, LP5521_CMD_DIRECT); - /* Mode change requires min 500 us delay. 1 - 2 ms with margin */ - usleep_range(1000, 2000); - lp5521_write(client, LP5521_REG_OP_MODE, LP5521_CMD_LOAD); - /* Mode change requires min 500 us delay. 1 - 2 ms with margin */ - usleep_range(1000, 2000); - - addr = LP5521_PROG_MEM_BASE + eng->prog_page * LP5521_PROG_MEM_SIZE; - i2c_smbus_write_i2c_block_data(client, - addr, - LP5521_PROG_MEM_SIZE, - pattern); - - ret |= lp5521_write(client, LP5521_REG_OP_MODE, mode); - return ret; -} - -static int lp5521_set_led_current(struct lp5521_chip *chip, int led, u8 curr) -{ - return lp5521_write(chip->client, - LP5521_REG_LED_CURRENT_BASE + chip->leds[led].chan_nr, - curr); -} - -static void lp5521_init_engine(struct lp5521_chip *chip) -{ - int i; - for (i = 0; i < ARRAY_SIZE(chip->engines); i++) { - chip->engines[i].id = i + 1; - chip->engines[i].engine_mask = LP5521_ENG_MASK_BASE >> (i * 2); - chip->engines[i].prog_page = i; - } -} - -static int lp5521_configure(struct i2c_client *client) -{ - struct lp5521_chip *chip = i2c_get_clientdata(client); - int ret; - u8 cfg; - - lp5521_init_engine(chip); - - /* Set all PWMs to direct control mode */ - ret = lp5521_write(client, LP5521_REG_OP_MODE, LP5521_CMD_DIRECT); - - cfg = chip->pdata->update_config ? - : (LP5521_PWRSAVE_EN | LP5521_CP_MODE_AUTO | LP5521_R_TO_BATT); - ret |= lp5521_write(client, LP5521_REG_CONFIG, cfg); - - /* Initialize all channels PWM to zero -> leds off */ - ret |= lp5521_write(client, LP5521_REG_R_PWM, 0); - ret |= lp5521_write(client, LP5521_REG_G_PWM, 0); - ret |= lp5521_write(client, LP5521_REG_B_PWM, 0); - - /* Set engines are set to run state when OP_MODE enables engines */ - ret |= lp5521_write(client, LP5521_REG_ENABLE, - LP5521_ENABLE_RUN_PROGRAM); - /* enable takes 500us. 1 - 2 ms leaves some margin */ - usleep_range(1000, 2000); - - return ret; -} - -static int lp5521_run_selftest(struct lp5521_chip *chip, char *buf) -{ - int ret; - u8 status; - - ret = lp5521_read(chip->client, LP5521_REG_STATUS, &status); - if (ret < 0) - return ret; - - /* Check that ext clock is really in use if requested */ - if (chip->pdata && chip->pdata->clock_mode == LP5521_CLOCK_EXT) - if ((status & LP5521_EXT_CLK_USED) == 0) - return -EIO; - return 0; -} - -static void lp5521_set_brightness(struct led_classdev *cdev, - enum led_brightness brightness) -{ - struct lp5521_led *led = cdev_to_led(cdev); - led->brightness = (u8)brightness; - schedule_work(&led->brightness_work); -} - -static void lp5521_led_brightness_work(struct work_struct *work) -{ - struct lp5521_led *led = container_of(work, - struct lp5521_led, - brightness_work); - struct lp5521_chip *chip = led_to_lp5521(led); - struct i2c_client *client = chip->client; - - mutex_lock(&chip->lock); - lp5521_write(client, LP5521_REG_LED_PWM_BASE + led->chan_nr, - led->brightness); - mutex_unlock(&chip->lock); -} - -/* Detect the chip by setting its ENABLE register and reading it back. */ -static int lp5521_detect(struct i2c_client *client) -{ - int ret; - u8 buf; - - ret = lp5521_write(client, LP5521_REG_ENABLE, LP5521_ENABLE_DEFAULT); - if (ret) - return ret; - /* enable takes 500us. 1 - 2 ms leaves some margin */ - usleep_range(1000, 2000); - ret = lp5521_read(client, LP5521_REG_ENABLE, &buf); - if (ret) - return ret; - if (buf != LP5521_ENABLE_DEFAULT) - return -ENODEV; - - return 0; -} - -/* Set engine mode and create appropriate sysfs attributes, if required. */ -static int lp5521_set_mode(struct lp5521_engine *engine, u8 mode) -{ - int ret = 0; - - /* if in that mode already do nothing, except for run */ - if (mode == engine->mode && mode != LP5521_CMD_RUN) - return 0; - - if (mode == LP5521_CMD_RUN) { - ret = lp5521_set_engine_mode(engine, LP5521_CMD_RUN); - } else if (mode == LP5521_CMD_LOAD) { - lp5521_set_engine_mode(engine, LP5521_CMD_DISABLED); - lp5521_set_engine_mode(engine, LP5521_CMD_LOAD); - } else if (mode == LP5521_CMD_DISABLED) { - lp5521_set_engine_mode(engine, LP5521_CMD_DISABLED); - } - - engine->mode = mode; - - return ret; -} - -static int lp5521_do_store_load(struct lp5521_engine *engine, - const char *buf, size_t len) -{ - struct lp5521_chip *chip = engine_to_lp5521(engine); - struct i2c_client *client = chip->client; - int ret, nrchars, offset = 0, i = 0; - char c[3]; - unsigned cmd; - u8 pattern[LP5521_PROGRAM_LENGTH] = {0}; - - while ((offset < len - 1) && (i < LP5521_PROGRAM_LENGTH)) { - /* separate sscanfs because length is working only for %s */ - ret = sscanf(buf + offset, "%2s%n ", c, &nrchars); - if (ret != 2) - goto fail; - ret = sscanf(c, "%2x", &cmd); - if (ret != 1) - goto fail; - pattern[i] = (u8)cmd; - - offset += nrchars; - i++; - } - - /* Each instruction is 16bit long. Check that length is even */ - if (i % 2) - goto fail; - - mutex_lock(&chip->lock); - if (engine->mode == LP5521_CMD_LOAD) - ret = lp5521_load_program(engine, pattern); - else - ret = -EINVAL; - mutex_unlock(&chip->lock); - - if (ret) { - dev_err(&client->dev, "failed loading pattern\n"); - return ret; - } - - return len; -fail: - dev_err(&client->dev, "wrong pattern format\n"); - return -EINVAL; -} - -static ssize_t store_engine_load(struct device *dev, - struct device_attribute *attr, - const char *buf, size_t len, int nr) -{ - struct i2c_client *client = to_i2c_client(dev); - struct lp5521_chip *chip = i2c_get_clientdata(client); - return lp5521_do_store_load(&chip->engines[nr - 1], buf, len); -} - -#define store_load(nr) \ -static ssize_t store_engine##nr##_load(struct device *dev, \ - struct device_attribute *attr, \ - const char *buf, size_t len) \ -{ \ - return store_engine_load(dev, attr, buf, len, nr); \ -} -store_load(1) -store_load(2) -store_load(3) - -static ssize_t show_engine_mode(struct device *dev, - struct device_attribute *attr, - char *buf, int nr) -{ - struct i2c_client *client = to_i2c_client(dev); - struct lp5521_chip *chip = i2c_get_clientdata(client); - switch (chip->engines[nr - 1].mode) { - case LP5521_CMD_RUN: - return sprintf(buf, "run\n"); - case LP5521_CMD_LOAD: - return sprintf(buf, "load\n"); - case LP5521_CMD_DISABLED: - return sprintf(buf, "disabled\n"); - default: - return sprintf(buf, "disabled\n"); - } -} - -#define show_mode(nr) \ -static ssize_t show_engine##nr##_mode(struct device *dev, \ - struct device_attribute *attr, \ - char *buf) \ -{ \ - return show_engine_mode(dev, attr, buf, nr); \ -} -show_mode(1) -show_mode(2) -show_mode(3) - -static ssize_t store_engine_mode(struct device *dev, - struct device_attribute *attr, - const char *buf, size_t len, int nr) -{ - struct i2c_client *client = to_i2c_client(dev); - struct lp5521_chip *chip = i2c_get_clientdata(client); - struct lp5521_engine *engine = &chip->engines[nr - 1]; - mutex_lock(&chip->lock); - - if (!strncmp(buf, "run", 3)) - lp5521_set_mode(engine, LP5521_CMD_RUN); - else if (!strncmp(buf, "load", 4)) - lp5521_set_mode(engine, LP5521_CMD_LOAD); - else if (!strncmp(buf, "disabled", 8)) - lp5521_set_mode(engine, LP5521_CMD_DISABLED); - - mutex_unlock(&chip->lock); - return len; -} - -#define store_mode(nr) \ -static ssize_t store_engine##nr##_mode(struct device *dev, \ - struct device_attribute *attr, \ - const char *buf, size_t len) \ -{ \ - return store_engine_mode(dev, attr, buf, len, nr); \ -} -store_mode(1) -store_mode(2) -store_mode(3) - -static ssize_t show_max_current(struct device *dev, - struct device_attribute *attr, - char *buf) -{ - struct led_classdev *led_cdev = dev_get_drvdata(dev); - struct lp5521_led *led = cdev_to_led(led_cdev); - - return sprintf(buf, "%d\n", led->max_current); -} - -static ssize_t show_current(struct device *dev, - struct device_attribute *attr, - char *buf) -{ - struct led_classdev *led_cdev = dev_get_drvdata(dev); - struct lp5521_led *led = cdev_to_led(led_cdev); - - return sprintf(buf, "%d\n", led->led_current); -} - -static ssize_t store_current(struct device *dev, - struct device_attribute *attr, - const char *buf, size_t len) -{ - struct led_classdev *led_cdev = dev_get_drvdata(dev); - struct lp5521_led *led = cdev_to_led(led_cdev); - struct lp5521_chip *chip = led_to_lp5521(led); - ssize_t ret; - unsigned long curr; - - if (kstrtoul(buf, 0, &curr)) - return -EINVAL; - - if (curr > led->max_current) - return -EINVAL; - - mutex_lock(&chip->lock); - ret = lp5521_set_led_current(chip, led->id, curr); - mutex_unlock(&chip->lock); - - if (ret < 0) - return ret; - - led->led_current = (u8)curr; - - return len; -} - -static ssize_t lp5521_selftest(struct device *dev, - struct device_attribute *attr, - char *buf) -{ - struct i2c_client *client = to_i2c_client(dev); - struct lp5521_chip *chip = i2c_get_clientdata(client); - int ret; - - mutex_lock(&chip->lock); - ret = lp5521_run_selftest(chip, buf); - mutex_unlock(&chip->lock); - return sprintf(buf, "%s\n", ret ? "FAIL" : "OK"); -} - -static void lp5521_clear_program_memory(struct i2c_client *cl) -{ - int i; - u8 rgb_mem[] = { - LP5521_REG_R_PROG_MEM, - LP5521_REG_G_PROG_MEM, - LP5521_REG_B_PROG_MEM, - }; - - for (i = 0; i < ARRAY_SIZE(rgb_mem); i++) { - lp5521_write(cl, rgb_mem[i], 0); - lp5521_write(cl, rgb_mem[i] + 1, 0); - } -} - -static void lp5521_write_program_memory(struct i2c_client *cl, - u8 base, u8 *rgb, int size) -{ - int i; - - if (!rgb || size <= 0) - return; - - for (i = 0; i < size; i++) - lp5521_write(cl, base + i, *(rgb + i)); - - lp5521_write(cl, base + i, 0); - lp5521_write(cl, base + i + 1, 0); -} - -static inline struct lp5521_led_pattern *lp5521_get_pattern - (struct lp5521_chip *chip, u8 offset) -{ - struct lp5521_led_pattern *ptn; - ptn = chip->pdata->patterns + (offset - 1); - return ptn; -} - -static void lp5521_run_led_pattern(int mode, struct lp5521_chip *chip) -{ - struct lp5521_led_pattern *ptn; - struct i2c_client *cl = chip->client; - int num_patterns = chip->pdata->num_patterns; - - if (mode > num_patterns || !(chip->pdata->patterns)) - return; - - if (mode == PATTERN_OFF) { - lp5521_write(cl, LP5521_REG_ENABLE, LP5521_ENABLE_DEFAULT); - usleep_range(1000, 2000); - lp5521_write(cl, LP5521_REG_OP_MODE, LP5521_CMD_DIRECT); - } else { - ptn = lp5521_get_pattern(chip, mode); - if (!ptn) - return; - - lp5521_write(cl, LP5521_REG_OP_MODE, LP5521_CMD_LOAD); - usleep_range(1000, 2000); - - lp5521_clear_program_memory(cl); - - lp5521_write_program_memory(cl, LP5521_REG_R_PROG_MEM, - ptn->r, ptn->size_r); - lp5521_write_program_memory(cl, LP5521_REG_G_PROG_MEM, - ptn->g, ptn->size_g); - lp5521_write_program_memory(cl, LP5521_REG_B_PROG_MEM, - ptn->b, ptn->size_b); - - lp5521_write(cl, LP5521_REG_OP_MODE, LP5521_CMD_RUN); - usleep_range(1000, 2000); - lp5521_write(cl, LP5521_REG_ENABLE, LP5521_ENABLE_RUN_PROGRAM); - } -} - -static ssize_t store_led_pattern(struct device *dev, - struct device_attribute *attr, - const char *buf, size_t len) -{ - struct lp5521_chip *chip = i2c_get_clientdata(to_i2c_client(dev)); - unsigned long val; - int ret; - - ret = strict_strtoul(buf, 16, &val); - if (ret) - return ret; - - lp5521_run_led_pattern(val, chip); - - return len; -} - -/* led class device attributes */ -static DEVICE_ATTR(led_current, S_IRUGO | S_IWUSR, show_current, store_current); -static DEVICE_ATTR(max_current, S_IRUGO , show_max_current, NULL); - -static struct attribute *lp5521_led_attributes[] = { - &dev_attr_led_current.attr, - &dev_attr_max_current.attr, - NULL, -}; - -static struct attribute_group lp5521_led_attribute_group = { - .attrs = lp5521_led_attributes -}; - -/* device attributes */ -static DEVICE_ATTR(engine1_mode, S_IRUGO | S_IWUSR, - show_engine1_mode, store_engine1_mode); -static DEVICE_ATTR(engine2_mode, S_IRUGO | S_IWUSR, - show_engine2_mode, store_engine2_mode); -static DEVICE_ATTR(engine3_mode, S_IRUGO | S_IWUSR, - show_engine3_mode, store_engine3_mode); -static DEVICE_ATTR(engine1_load, S_IWUSR, NULL, store_engine1_load); -static DEVICE_ATTR(engine2_load, S_IWUSR, NULL, store_engine2_load); -static DEVICE_ATTR(engine3_load, S_IWUSR, NULL, store_engine3_load); -static DEVICE_ATTR(selftest, S_IRUGO, lp5521_selftest, NULL); -static DEVICE_ATTR(led_pattern, S_IWUSR, NULL, store_led_pattern); - -static struct attribute *lp5521_attributes[] = { - &dev_attr_engine1_mode.attr, - &dev_attr_engine2_mode.attr, - &dev_attr_engine3_mode.attr, - &dev_attr_selftest.attr, - &dev_attr_engine1_load.attr, - &dev_attr_engine2_load.attr, - &dev_attr_engine3_load.attr, - &dev_attr_led_pattern.attr, - NULL -}; - -static const struct attribute_group lp5521_group = { - .attrs = lp5521_attributes, -}; - -static int lp5521_register_sysfs(struct i2c_client *client) -{ - struct device *dev = &client->dev; - return sysfs_create_group(&dev->kobj, &lp5521_group); -} - -static void lp5521_unregister_sysfs(struct i2c_client *client) -{ - struct lp5521_chip *chip = i2c_get_clientdata(client); - struct device *dev = &client->dev; - int i; - - sysfs_remove_group(&dev->kobj, &lp5521_group); - - for (i = 0; i < chip->num_leds; i++) - sysfs_remove_group(&chip->leds[i].cdev.dev->kobj, - &lp5521_led_attribute_group); -} - -static int __devinit lp5521_init_led(struct lp5521_led *led, - struct i2c_client *client, - int chan, struct lp5521_platform_data *pdata) -{ - struct device *dev = &client->dev; - char name[32]; - int res; - - if (chan >= LP5521_MAX_LEDS) - return -EINVAL; - - if (pdata->led_config[chan].led_current == 0) - return 0; - - led->led_current = pdata->led_config[chan].led_current; - led->max_current = pdata->led_config[chan].max_current; - led->chan_nr = pdata->led_config[chan].chan_nr; - - if (led->chan_nr >= LP5521_MAX_LEDS) { - dev_err(dev, "Use channel numbers between 0 and %d\n", - LP5521_MAX_LEDS - 1); - return -EINVAL; - } - - led->cdev.brightness_set = lp5521_set_brightness; - if (pdata->led_config[chan].name) { - led->cdev.name = pdata->led_config[chan].name; - } else { - snprintf(name, sizeof(name), "%s:channel%d", - pdata->label ?: client->name, chan); - led->cdev.name = name; - } - - res = led_classdev_register(dev, &led->cdev); - if (res < 0) { - dev_err(dev, "couldn't register led on channel %d\n", chan); - return res; - } - - res = sysfs_create_group(&led->cdev.dev->kobj, - &lp5521_led_attribute_group); - if (res < 0) { - dev_err(dev, "couldn't register current attribute\n"); - led_classdev_unregister(&led->cdev); - return res; - } - return 0; -} - -static int __devinit lp5521_probe(struct i2c_client *client, - const struct i2c_device_id *id) -{ - struct lp5521_chip *chip; - struct lp5521_platform_data *pdata; - int ret, i, led; - u8 buf; - - chip = kzalloc(sizeof(*chip), GFP_KERNEL); - if (!chip) - return -ENOMEM; - - i2c_set_clientdata(client, chip); - chip->client = client; - - pdata = client->dev.platform_data; - - if (!pdata) { - dev_err(&client->dev, "no platform data\n"); - ret = -EINVAL; - goto fail1; - } - - mutex_init(&chip->lock); - - chip->pdata = pdata; - - if (pdata->setup_resources) { - ret = pdata->setup_resources(); - if (ret < 0) - goto fail1; - } - - if (pdata->enable) { - pdata->enable(0); - usleep_range(1000, 2000); /* Keep enable down at least 1ms */ - pdata->enable(1); - usleep_range(1000, 2000); /* 500us abs min. */ - } - - lp5521_write(client, LP5521_REG_RESET, 0xff); - usleep_range(10000, 20000); /* - * Exact value is not available. 10 - 20ms - * appears to be enough for reset. - */ - - /* - * Make sure that the chip is reset by reading back the r channel - * current reg. This is dummy read is required on some platforms - - * otherwise further access to the R G B channels in the - * LP5521_REG_ENABLE register will not have any effect - strange! - */ - ret = lp5521_read(client, LP5521_REG_R_CURRENT, &buf); - if (buf != LP5521_REG_R_CURR_DEFAULT) { - dev_err(&client->dev, "error in resetting chip\n"); - goto fail2; - } - usleep_range(10000, 20000); - - ret = lp5521_detect(client); - - if (ret) { - dev_err(&client->dev, "Chip not found\n"); - goto fail2; - } - - dev_info(&client->dev, "%s programmable led chip found\n", id->name); - - ret = lp5521_configure(client); - if (ret < 0) { - dev_err(&client->dev, "error configuring chip\n"); - goto fail2; - } - - /* Initialize leds */ - chip->num_channels = pdata->num_channels; - chip->num_leds = 0; - led = 0; - for (i = 0; i < pdata->num_channels; i++) { - /* Do not initialize channels that are not connected */ - if (pdata->led_config[i].led_current == 0) - continue; - - ret = lp5521_init_led(&chip->leds[led], client, i, pdata); - if (ret) { - dev_err(&client->dev, "error initializing leds\n"); - goto fail3; - } - chip->num_leds++; - - chip->leds[led].id = led; - /* Set initial LED current */ - lp5521_set_led_current(chip, led, - chip->leds[led].led_current); - - INIT_WORK(&(chip->leds[led].brightness_work), - lp5521_led_brightness_work); - - led++; - } - - ret = lp5521_register_sysfs(client); - if (ret) { - dev_err(&client->dev, "registering sysfs failed\n"); - goto fail3; - } - return ret; -fail3: - for (i = 0; i < chip->num_leds; i++) { - led_classdev_unregister(&chip->leds[i].cdev); - cancel_work_sync(&chip->leds[i].brightness_work); - } -fail2: - if (pdata->enable) - pdata->enable(0); - if (pdata->release_resources) - pdata->release_resources(); -fail1: - kfree(chip); - return ret; -} - -static int __devexit lp5521_remove(struct i2c_client *client) -{ - struct lp5521_chip *chip = i2c_get_clientdata(client); - int i; - - lp5521_run_led_pattern(PATTERN_OFF, chip); - lp5521_unregister_sysfs(client); - - for (i = 0; i < chip->num_leds; i++) { - led_classdev_unregister(&chip->leds[i].cdev); - cancel_work_sync(&chip->leds[i].brightness_work); - } - - if (chip->pdata->enable) - chip->pdata->enable(0); - if (chip->pdata->release_resources) - chip->pdata->release_resources(); - kfree(chip); - return 0; -} - -static const struct i2c_device_id lp5521_id[] = { - { "lp5521", 0 }, /* Three channel chip */ - { } -}; -MODULE_DEVICE_TABLE(i2c, lp5521_id); - -static struct i2c_driver lp5521_driver = { - .driver = { - .name = "lp5521", - }, - .probe = lp5521_probe, - .remove = __devexit_p(lp5521_remove), - .id_table = lp5521_id, -}; - -module_i2c_driver(lp5521_driver); - -MODULE_AUTHOR("Mathias Nyman, Yuri Zaporozhets, Samu Onkalo"); -MODULE_DESCRIPTION("LP5521 LED engine"); -MODULE_LICENSE("GPL v2"); diff --git a/ANDROID_3.4.5/drivers/leds/leds-lp5523.c b/ANDROID_3.4.5/drivers/leds/leds-lp5523.c deleted file mode 100644 index 857a3e15..00000000 --- a/ANDROID_3.4.5/drivers/leds/leds-lp5523.c +++ /dev/null @@ -1,1026 +0,0 @@ -/* - * lp5523.c - LP5523 LED Driver - * - * Copyright (C) 2010 Nokia Corporation - * - * Contact: Samu Onkalo <samu.p.onkalo@nokia.com> - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA - * 02110-1301 USA - */ - -#include <linux/module.h> -#include <linux/init.h> -#include <linux/i2c.h> -#include <linux/mutex.h> -#include <linux/gpio.h> -#include <linux/interrupt.h> -#include <linux/delay.h> -#include <linux/ctype.h> -#include <linux/spinlock.h> -#include <linux/wait.h> -#include <linux/leds.h> -#include <linux/leds-lp5523.h> -#include <linux/workqueue.h> -#include <linux/slab.h> - -#define LP5523_REG_ENABLE 0x00 -#define LP5523_REG_OP_MODE 0x01 -#define LP5523_REG_RATIOMETRIC_MSB 0x02 -#define LP5523_REG_RATIOMETRIC_LSB 0x03 -#define LP5523_REG_ENABLE_LEDS_MSB 0x04 -#define LP5523_REG_ENABLE_LEDS_LSB 0x05 -#define LP5523_REG_LED_CNTRL_BASE 0x06 -#define LP5523_REG_LED_PWM_BASE 0x16 -#define LP5523_REG_LED_CURRENT_BASE 0x26 -#define LP5523_REG_CONFIG 0x36 -#define LP5523_REG_CHANNEL1_PC 0x37 -#define LP5523_REG_CHANNEL2_PC 0x38 -#define LP5523_REG_CHANNEL3_PC 0x39 -#define LP5523_REG_STATUS 0x3a -#define LP5523_REG_GPO 0x3b -#define LP5523_REG_VARIABLE 0x3c -#define LP5523_REG_RESET 0x3d -#define LP5523_REG_TEMP_CTRL 0x3e -#define LP5523_REG_TEMP_READ 0x3f -#define LP5523_REG_TEMP_WRITE 0x40 -#define LP5523_REG_LED_TEST_CTRL 0x41 -#define LP5523_REG_LED_TEST_ADC 0x42 -#define LP5523_REG_ENG1_VARIABLE 0x45 -#define LP5523_REG_ENG2_VARIABLE 0x46 -#define LP5523_REG_ENG3_VARIABLE 0x47 -#define LP5523_REG_MASTER_FADER1 0x48 -#define LP5523_REG_MASTER_FADER2 0x49 -#define LP5523_REG_MASTER_FADER3 0x4a -#define LP5523_REG_CH1_PROG_START 0x4c -#define LP5523_REG_CH2_PROG_START 0x4d -#define LP5523_REG_CH3_PROG_START 0x4e -#define LP5523_REG_PROG_PAGE_SEL 0x4f -#define LP5523_REG_PROG_MEM 0x50 - -#define LP5523_CMD_LOAD 0x15 /* 00010101 */ -#define LP5523_CMD_RUN 0x2a /* 00101010 */ -#define LP5523_CMD_DISABLED 0x00 /* 00000000 */ - -#define LP5523_ENABLE 0x40 -#define LP5523_AUTO_INC 0x40 -#define LP5523_PWR_SAVE 0x20 -#define LP5523_PWM_PWR_SAVE 0x04 -#define LP5523_CP_1 0x08 -#define LP5523_CP_1_5 0x10 -#define LP5523_CP_AUTO 0x18 -#define LP5523_INT_CLK 0x01 -#define LP5523_AUTO_CLK 0x02 -#define LP5523_EN_LEDTEST 0x80 -#define LP5523_LEDTEST_DONE 0x80 - -#define LP5523_DEFAULT_CURRENT 50 /* microAmps */ -#define LP5523_PROGRAM_LENGTH 32 /* in bytes */ -#define LP5523_PROGRAM_PAGES 6 -#define LP5523_ADC_SHORTCIRC_LIM 80 - -#define LP5523_LEDS 9 -#define LP5523_ENGINES 3 - -#define LP5523_ENG_MASK_BASE 0x30 /* 00110000 */ - -#define LP5523_ENG_STATUS_MASK 0x07 /* 00000111 */ - -#define LP5523_IRQ_FLAGS IRQF_TRIGGER_FALLING - -#define LP5523_EXT_CLK_USED 0x08 - -#define LED_ACTIVE(mux, led) (!!(mux & (0x0001 << led))) -#define SHIFT_MASK(id) (((id) - 1) * 2) - -struct lp5523_engine { - int id; - u8 mode; - u8 prog_page; - u8 mux_page; - u16 led_mux; - u8 engine_mask; -}; - -struct lp5523_led { - int id; - u8 chan_nr; - u8 led_current; - u8 max_current; - struct led_classdev cdev; - struct work_struct brightness_work; - u8 brightness; -}; - -struct lp5523_chip { - struct mutex lock; /* Serialize control */ - struct i2c_client *client; - struct lp5523_engine engines[LP5523_ENGINES]; - struct lp5523_led leds[LP5523_LEDS]; - struct lp5523_platform_data *pdata; - u8 num_channels; - u8 num_leds; -}; - -static inline struct lp5523_led *cdev_to_led(struct led_classdev *cdev) -{ - return container_of(cdev, struct lp5523_led, cdev); -} - -static inline struct lp5523_chip *engine_to_lp5523(struct lp5523_engine *engine) -{ - return container_of(engine, struct lp5523_chip, - engines[engine->id - 1]); -} - -static inline struct lp5523_chip *led_to_lp5523(struct lp5523_led *led) -{ - return container_of(led, struct lp5523_chip, - leds[led->id]); -} - -static int lp5523_set_mode(struct lp5523_engine *engine, u8 mode); -static int lp5523_set_engine_mode(struct lp5523_engine *engine, u8 mode); -static int lp5523_load_program(struct lp5523_engine *engine, const u8 *pattern); - -static void lp5523_led_brightness_work(struct work_struct *work); - -static int lp5523_write(struct i2c_client *client, u8 reg, u8 value) -{ - return i2c_smbus_write_byte_data(client, reg, value); -} - -static int lp5523_read(struct i2c_client *client, u8 reg, u8 *buf) -{ - s32 ret = i2c_smbus_read_byte_data(client, reg); - - if (ret < 0) - return -EIO; - - *buf = ret; - return 0; -} - -static int lp5523_detect(struct i2c_client *client) -{ - int ret; - u8 buf; - - ret = lp5523_write(client, LP5523_REG_ENABLE, 0x40); - if (ret) - return ret; - ret = lp5523_read(client, LP5523_REG_ENABLE, &buf); - if (ret) - return ret; - if (buf == 0x40) - return 0; - else - return -ENODEV; -} - -static int lp5523_configure(struct i2c_client *client) -{ - struct lp5523_chip *chip = i2c_get_clientdata(client); - int ret = 0; - u8 status; - - /* one pattern per engine setting led mux start and stop addresses */ - static const u8 pattern[][LP5523_PROGRAM_LENGTH] = { - { 0x9c, 0x30, 0x9c, 0xb0, 0x9d, 0x80, 0xd8, 0x00, 0}, - { 0x9c, 0x40, 0x9c, 0xc0, 0x9d, 0x80, 0xd8, 0x00, 0}, - { 0x9c, 0x50, 0x9c, 0xd0, 0x9d, 0x80, 0xd8, 0x00, 0}, - }; - - ret |= lp5523_write(client, LP5523_REG_ENABLE, LP5523_ENABLE); - /* Chip startup time is 500 us, 1 - 2 ms gives some margin */ - usleep_range(1000, 2000); - - ret |= lp5523_write(client, LP5523_REG_CONFIG, - LP5523_AUTO_INC | LP5523_PWR_SAVE | - LP5523_CP_AUTO | LP5523_AUTO_CLK | - LP5523_PWM_PWR_SAVE); - - /* turn on all leds */ - ret |= lp5523_write(client, LP5523_REG_ENABLE_LEDS_MSB, 0x01); - ret |= lp5523_write(client, LP5523_REG_ENABLE_LEDS_LSB, 0xff); - - /* hardcode 32 bytes of memory for each engine from program memory */ - ret |= lp5523_write(client, LP5523_REG_CH1_PROG_START, 0x00); - ret |= lp5523_write(client, LP5523_REG_CH2_PROG_START, 0x10); - ret |= lp5523_write(client, LP5523_REG_CH3_PROG_START, 0x20); - - /* write led mux address space for each channel */ - ret |= lp5523_load_program(&chip->engines[0], pattern[0]); - ret |= lp5523_load_program(&chip->engines[1], pattern[1]); - ret |= lp5523_load_program(&chip->engines[2], pattern[2]); - - if (ret) { - dev_err(&client->dev, "could not load mux programs\n"); - return -1; - } - - /* set all engines exec state and mode to run 00101010 */ - ret |= lp5523_write(client, LP5523_REG_ENABLE, - (LP5523_CMD_RUN | LP5523_ENABLE)); - - ret |= lp5523_write(client, LP5523_REG_OP_MODE, LP5523_CMD_RUN); - - if (ret) { - dev_err(&client->dev, "could not start mux programs\n"); - return -1; - } - - /* Let the programs run for couple of ms and check the engine status */ - usleep_range(3000, 6000); - lp5523_read(client, LP5523_REG_STATUS, &status); - status &= LP5523_ENG_STATUS_MASK; - - if (status == LP5523_ENG_STATUS_MASK) { - dev_dbg(&client->dev, "all engines configured\n"); - } else { - dev_info(&client->dev, "status == %x\n", status); - dev_err(&client->dev, "cound not configure LED engine\n"); - return -1; - } - - dev_info(&client->dev, "disabling engines\n"); - - ret |= lp5523_write(client, LP5523_REG_OP_MODE, LP5523_CMD_DISABLED); - - return ret; -} - -static int lp5523_set_engine_mode(struct lp5523_engine *engine, u8 mode) -{ - struct lp5523_chip *chip = engine_to_lp5523(engine); - struct i2c_client *client = chip->client; - int ret; - u8 engine_state; - - ret = lp5523_read(client, LP5523_REG_OP_MODE, &engine_state); - if (ret) - goto fail; - - engine_state &= ~(engine->engine_mask); - - /* set mode only for this engine */ - mode &= engine->engine_mask; - - engine_state |= mode; - - ret |= lp5523_write(client, LP5523_REG_OP_MODE, engine_state); -fail: - return ret; -} - -static int lp5523_load_mux(struct lp5523_engine *engine, u16 mux) -{ - struct lp5523_chip *chip = engine_to_lp5523(engine); - struct i2c_client *client = chip->client; - int ret = 0; - - ret |= lp5523_set_engine_mode(engine, LP5523_CMD_LOAD); - - ret |= lp5523_write(client, LP5523_REG_PROG_PAGE_SEL, engine->mux_page); - ret |= lp5523_write(client, LP5523_REG_PROG_MEM, - (u8)(mux >> 8)); - ret |= lp5523_write(client, LP5523_REG_PROG_MEM + 1, (u8)(mux)); - engine->led_mux = mux; - - return ret; -} - -static int lp5523_load_program(struct lp5523_engine *engine, const u8 *pattern) -{ - struct lp5523_chip *chip = engine_to_lp5523(engine); - struct i2c_client *client = chip->client; - - int ret = 0; - - ret |= lp5523_set_engine_mode(engine, LP5523_CMD_LOAD); - - ret |= lp5523_write(client, LP5523_REG_PROG_PAGE_SEL, - engine->prog_page); - ret |= i2c_smbus_write_i2c_block_data(client, LP5523_REG_PROG_MEM, - LP5523_PROGRAM_LENGTH, pattern); - - return ret; -} - -static int lp5523_run_program(struct lp5523_engine *engine) -{ - struct lp5523_chip *chip = engine_to_lp5523(engine); - struct i2c_client *client = chip->client; - int ret; - - ret = lp5523_write(client, LP5523_REG_ENABLE, - LP5523_CMD_RUN | LP5523_ENABLE); - if (ret) - goto fail; - - ret = lp5523_set_engine_mode(engine, LP5523_CMD_RUN); -fail: - return ret; -} - -static int lp5523_mux_parse(const char *buf, u16 *mux, size_t len) -{ - int i; - u16 tmp_mux = 0; - len = len < LP5523_LEDS ? len : LP5523_LEDS; - for (i = 0; i < len; i++) { - switch (buf[i]) { - case '1': - tmp_mux |= (1 << i); - break; - case '0': - break; - case '\n': - i = len; - break; - default: - return -1; - } - } - *mux = tmp_mux; - - return 0; -} - -static void lp5523_mux_to_array(u16 led_mux, char *array) -{ - int i, pos = 0; - for (i = 0; i < LP5523_LEDS; i++) - pos += sprintf(array + pos, "%x", LED_ACTIVE(led_mux, i)); - - array[pos] = '\0'; -} - -/*--------------------------------------------------------------*/ -/* Sysfs interface */ -/*--------------------------------------------------------------*/ - -static ssize_t show_engine_leds(struct device *dev, - struct device_attribute *attr, - char *buf, int nr) -{ - struct i2c_client *client = to_i2c_client(dev); - struct lp5523_chip *chip = i2c_get_clientdata(client); - char mux[LP5523_LEDS + 1]; - - lp5523_mux_to_array(chip->engines[nr - 1].led_mux, mux); - - return sprintf(buf, "%s\n", mux); -} - -#define show_leds(nr) \ -static ssize_t show_engine##nr##_leds(struct device *dev, \ - struct device_attribute *attr, \ - char *buf) \ -{ \ - return show_engine_leds(dev, attr, buf, nr); \ -} -show_leds(1) -show_leds(2) -show_leds(3) - -static ssize_t store_engine_leds(struct device *dev, - struct device_attribute *attr, - const char *buf, size_t len, int nr) -{ - struct i2c_client *client = to_i2c_client(dev); - struct lp5523_chip *chip = i2c_get_clientdata(client); - u16 mux = 0; - ssize_t ret; - - if (lp5523_mux_parse(buf, &mux, len)) - return -EINVAL; - - mutex_lock(&chip->lock); - ret = -EINVAL; - if (chip->engines[nr - 1].mode != LP5523_CMD_LOAD) - goto leave; - - if (lp5523_load_mux(&chip->engines[nr - 1], mux)) - goto leave; - - ret = len; -leave: - mutex_unlock(&chip->lock); - return ret; -} - -#define store_leds(nr) \ -static ssize_t store_engine##nr##_leds(struct device *dev, \ - struct device_attribute *attr, \ - const char *buf, size_t len) \ -{ \ - return store_engine_leds(dev, attr, buf, len, nr); \ -} -store_leds(1) -store_leds(2) -store_leds(3) - -static ssize_t lp5523_selftest(struct device *dev, - struct device_attribute *attr, - char *buf) -{ - struct i2c_client *client = to_i2c_client(dev); - struct lp5523_chip *chip = i2c_get_clientdata(client); - int i, ret, pos = 0; - int led = 0; - u8 status, adc, vdd; - - mutex_lock(&chip->lock); - - ret = lp5523_read(chip->client, LP5523_REG_STATUS, &status); - if (ret < 0) - goto fail; - - /* Check that ext clock is really in use if requested */ - if ((chip->pdata) && (chip->pdata->clock_mode == LP5523_CLOCK_EXT)) - if ((status & LP5523_EXT_CLK_USED) == 0) - goto fail; - - /* Measure VDD (i.e. VBAT) first (channel 16 corresponds to VDD) */ - lp5523_write(chip->client, LP5523_REG_LED_TEST_CTRL, - LP5523_EN_LEDTEST | 16); - usleep_range(3000, 6000); /* ADC conversion time is typically 2.7 ms */ - ret = lp5523_read(chip->client, LP5523_REG_STATUS, &status); - if (!(status & LP5523_LEDTEST_DONE)) - usleep_range(3000, 6000); /* Was not ready. Wait little bit */ - - ret |= lp5523_read(chip->client, LP5523_REG_LED_TEST_ADC, &vdd); - vdd--; /* There may be some fluctuation in measurement */ - - for (i = 0; i < LP5523_LEDS; i++) { - /* Skip non-existing channels */ - if (chip->pdata->led_config[i].led_current == 0) - continue; - - /* Set default current */ - lp5523_write(chip->client, - LP5523_REG_LED_CURRENT_BASE + i, - chip->pdata->led_config[i].led_current); - - lp5523_write(chip->client, LP5523_REG_LED_PWM_BASE + i, 0xff); - /* let current stabilize 2 - 4ms before measurements start */ - usleep_range(2000, 4000); - lp5523_write(chip->client, - LP5523_REG_LED_TEST_CTRL, - LP5523_EN_LEDTEST | i); - /* ADC conversion time is 2.7 ms typically */ - usleep_range(3000, 6000); - ret = lp5523_read(chip->client, LP5523_REG_STATUS, &status); - if (!(status & LP5523_LEDTEST_DONE)) - usleep_range(3000, 6000);/* Was not ready. Wait. */ - ret |= lp5523_read(chip->client, LP5523_REG_LED_TEST_ADC, &adc); - - if (adc >= vdd || adc < LP5523_ADC_SHORTCIRC_LIM) - pos += sprintf(buf + pos, "LED %d FAIL\n", i); - - lp5523_write(chip->client, LP5523_REG_LED_PWM_BASE + i, 0x00); - - /* Restore current */ - lp5523_write(chip->client, - LP5523_REG_LED_CURRENT_BASE + i, - chip->leds[led].led_current); - led++; - } - if (pos == 0) - pos = sprintf(buf, "OK\n"); - goto release_lock; -fail: - pos = sprintf(buf, "FAIL\n"); - -release_lock: - mutex_unlock(&chip->lock); - - return pos; -} - -static void lp5523_set_brightness(struct led_classdev *cdev, - enum led_brightness brightness) -{ - struct lp5523_led *led = cdev_to_led(cdev); - - led->brightness = (u8)brightness; - - schedule_work(&led->brightness_work); -} - -static void lp5523_led_brightness_work(struct work_struct *work) -{ - struct lp5523_led *led = container_of(work, - struct lp5523_led, - brightness_work); - struct lp5523_chip *chip = led_to_lp5523(led); - struct i2c_client *client = chip->client; - - mutex_lock(&chip->lock); - - lp5523_write(client, LP5523_REG_LED_PWM_BASE + led->chan_nr, - led->brightness); - - mutex_unlock(&chip->lock); -} - -static int lp5523_do_store_load(struct lp5523_engine *engine, - const char *buf, size_t len) -{ - struct lp5523_chip *chip = engine_to_lp5523(engine); - struct i2c_client *client = chip->client; - int ret, nrchars, offset = 0, i = 0; - char c[3]; - unsigned cmd; - u8 pattern[LP5523_PROGRAM_LENGTH] = {0}; - - while ((offset < len - 1) && (i < LP5523_PROGRAM_LENGTH)) { - /* separate sscanfs because length is working only for %s */ - ret = sscanf(buf + offset, "%2s%n ", c, &nrchars); - ret = sscanf(c, "%2x", &cmd); - if (ret != 1) - goto fail; - pattern[i] = (u8)cmd; - - offset += nrchars; - i++; - } - - /* Each instruction is 16bit long. Check that length is even */ - if (i % 2) - goto fail; - - mutex_lock(&chip->lock); - - if (engine->mode == LP5523_CMD_LOAD) - ret = lp5523_load_program(engine, pattern); - else - ret = -EINVAL; - - mutex_unlock(&chip->lock); - - if (ret) { - dev_err(&client->dev, "failed loading pattern\n"); - return ret; - } - - return len; -fail: - dev_err(&client->dev, "wrong pattern format\n"); - return -EINVAL; -} - -static ssize_t store_engine_load(struct device *dev, - struct device_attribute *attr, - const char *buf, size_t len, int nr) -{ - struct i2c_client *client = to_i2c_client(dev); - struct lp5523_chip *chip = i2c_get_clientdata(client); - return lp5523_do_store_load(&chip->engines[nr - 1], buf, len); -} - -#define store_load(nr) \ -static ssize_t store_engine##nr##_load(struct device *dev, \ - struct device_attribute *attr, \ - const char *buf, size_t len) \ -{ \ - return store_engine_load(dev, attr, buf, len, nr); \ -} -store_load(1) -store_load(2) -store_load(3) - -static ssize_t show_engine_mode(struct device *dev, - struct device_attribute *attr, - char *buf, int nr) -{ - struct i2c_client *client = to_i2c_client(dev); - struct lp5523_chip *chip = i2c_get_clientdata(client); - switch (chip->engines[nr - 1].mode) { - case LP5523_CMD_RUN: - return sprintf(buf, "run\n"); - case LP5523_CMD_LOAD: - return sprintf(buf, "load\n"); - case LP5523_CMD_DISABLED: - return sprintf(buf, "disabled\n"); - default: - return sprintf(buf, "disabled\n"); - } -} - -#define show_mode(nr) \ -static ssize_t show_engine##nr##_mode(struct device *dev, \ - struct device_attribute *attr, \ - char *buf) \ -{ \ - return show_engine_mode(dev, attr, buf, nr); \ -} -show_mode(1) -show_mode(2) -show_mode(3) - -static ssize_t store_engine_mode(struct device *dev, - struct device_attribute *attr, - const char *buf, size_t len, int nr) -{ - struct i2c_client *client = to_i2c_client(dev); - struct lp5523_chip *chip = i2c_get_clientdata(client); - struct lp5523_engine *engine = &chip->engines[nr - 1]; - mutex_lock(&chip->lock); - - if (!strncmp(buf, "run", 3)) - lp5523_set_mode(engine, LP5523_CMD_RUN); - else if (!strncmp(buf, "load", 4)) - lp5523_set_mode(engine, LP5523_CMD_LOAD); - else if (!strncmp(buf, "disabled", 8)) - lp5523_set_mode(engine, LP5523_CMD_DISABLED); - - mutex_unlock(&chip->lock); - return len; -} - -#define store_mode(nr) \ -static ssize_t store_engine##nr##_mode(struct device *dev, \ - struct device_attribute *attr, \ - const char *buf, size_t len) \ -{ \ - return store_engine_mode(dev, attr, buf, len, nr); \ -} -store_mode(1) -store_mode(2) -store_mode(3) - -static ssize_t show_max_current(struct device *dev, - struct device_attribute *attr, - char *buf) -{ - struct led_classdev *led_cdev = dev_get_drvdata(dev); - struct lp5523_led *led = cdev_to_led(led_cdev); - - return sprintf(buf, "%d\n", led->max_current); -} - -static ssize_t show_current(struct device *dev, - struct device_attribute *attr, - char *buf) -{ - struct led_classdev *led_cdev = dev_get_drvdata(dev); - struct lp5523_led *led = cdev_to_led(led_cdev); - - return sprintf(buf, "%d\n", led->led_current); -} - -static ssize_t store_current(struct device *dev, - struct device_attribute *attr, - const char *buf, size_t len) -{ - struct led_classdev *led_cdev = dev_get_drvdata(dev); - struct lp5523_led *led = cdev_to_led(led_cdev); - struct lp5523_chip *chip = led_to_lp5523(led); - ssize_t ret; - unsigned long curr; - - if (strict_strtoul(buf, 0, &curr)) - return -EINVAL; - - if (curr > led->max_current) - return -EINVAL; - - mutex_lock(&chip->lock); - ret = lp5523_write(chip->client, - LP5523_REG_LED_CURRENT_BASE + led->chan_nr, - (u8)curr); - mutex_unlock(&chip->lock); - - if (ret < 0) - return ret; - - led->led_current = (u8)curr; - - return len; -} - -/* led class device attributes */ -static DEVICE_ATTR(led_current, S_IRUGO | S_IWUSR, show_current, store_current); -static DEVICE_ATTR(max_current, S_IRUGO , show_max_current, NULL); - -static struct attribute *lp5523_led_attributes[] = { - &dev_attr_led_current.attr, - &dev_attr_max_current.attr, - NULL, -}; - -static struct attribute_group lp5523_led_attribute_group = { - .attrs = lp5523_led_attributes -}; - -/* device attributes */ -static DEVICE_ATTR(engine1_mode, S_IRUGO | S_IWUSR, - show_engine1_mode, store_engine1_mode); -static DEVICE_ATTR(engine2_mode, S_IRUGO | S_IWUSR, - show_engine2_mode, store_engine2_mode); -static DEVICE_ATTR(engine3_mode, S_IRUGO | S_IWUSR, - show_engine3_mode, store_engine3_mode); -static DEVICE_ATTR(engine1_leds, S_IRUGO | S_IWUSR, - show_engine1_leds, store_engine1_leds); -static DEVICE_ATTR(engine2_leds, S_IRUGO | S_IWUSR, - show_engine2_leds, store_engine2_leds); -static DEVICE_ATTR(engine3_leds, S_IRUGO | S_IWUSR, - show_engine3_leds, store_engine3_leds); -static DEVICE_ATTR(engine1_load, S_IWUSR, NULL, store_engine1_load); -static DEVICE_ATTR(engine2_load, S_IWUSR, NULL, store_engine2_load); -static DEVICE_ATTR(engine3_load, S_IWUSR, NULL, store_engine3_load); -static DEVICE_ATTR(selftest, S_IRUGO, lp5523_selftest, NULL); - -static struct attribute *lp5523_attributes[] = { - &dev_attr_engine1_mode.attr, - &dev_attr_engine2_mode.attr, - &dev_attr_engine3_mode.attr, - &dev_attr_selftest.attr, - &dev_attr_engine1_load.attr, - &dev_attr_engine1_leds.attr, - &dev_attr_engine2_load.attr, - &dev_attr_engine2_leds.attr, - &dev_attr_engine3_load.attr, - &dev_attr_engine3_leds.attr, -}; - -static const struct attribute_group lp5523_group = { - .attrs = lp5523_attributes, -}; - -static int lp5523_register_sysfs(struct i2c_client *client) -{ - struct device *dev = &client->dev; - int ret; - - ret = sysfs_create_group(&dev->kobj, &lp5523_group); - if (ret < 0) - return ret; - - return 0; -} - -static void lp5523_unregister_sysfs(struct i2c_client *client) -{ - struct lp5523_chip *chip = i2c_get_clientdata(client); - struct device *dev = &client->dev; - int i; - - sysfs_remove_group(&dev->kobj, &lp5523_group); - - for (i = 0; i < chip->num_leds; i++) - sysfs_remove_group(&chip->leds[i].cdev.dev->kobj, - &lp5523_led_attribute_group); -} - -/*--------------------------------------------------------------*/ -/* Set chip operating mode */ -/*--------------------------------------------------------------*/ -static int lp5523_set_mode(struct lp5523_engine *engine, u8 mode) -{ - int ret = 0; - - /* if in that mode already do nothing, except for run */ - if (mode == engine->mode && mode != LP5523_CMD_RUN) - return 0; - - if (mode == LP5523_CMD_RUN) { - ret = lp5523_run_program(engine); - } else if (mode == LP5523_CMD_LOAD) { - lp5523_set_engine_mode(engine, LP5523_CMD_DISABLED); - lp5523_set_engine_mode(engine, LP5523_CMD_LOAD); - } else if (mode == LP5523_CMD_DISABLED) { - lp5523_set_engine_mode(engine, LP5523_CMD_DISABLED); - } - - engine->mode = mode; - - return ret; -} - -/*--------------------------------------------------------------*/ -/* Probe, Attach, Remove */ -/*--------------------------------------------------------------*/ -static int __init lp5523_init_engine(struct lp5523_engine *engine, int id) -{ - if (id < 1 || id > LP5523_ENGINES) - return -1; - engine->id = id; - engine->engine_mask = LP5523_ENG_MASK_BASE >> SHIFT_MASK(id); - engine->prog_page = id - 1; - engine->mux_page = id + 2; - - return 0; -} - -static int __devinit lp5523_init_led(struct lp5523_led *led, struct device *dev, - int chan, struct lp5523_platform_data *pdata) -{ - char name[32]; - int res; - - if (chan >= LP5523_LEDS) - return -EINVAL; - - if (pdata->led_config[chan].led_current) { - led->led_current = pdata->led_config[chan].led_current; - led->max_current = pdata->led_config[chan].max_current; - led->chan_nr = pdata->led_config[chan].chan_nr; - - if (led->chan_nr >= LP5523_LEDS) { - dev_err(dev, "Use channel numbers between 0 and %d\n", - LP5523_LEDS - 1); - return -EINVAL; - } - - snprintf(name, sizeof(name), "%s:channel%d", - pdata->label ?: "lp5523", chan); - - led->cdev.name = name; - led->cdev.brightness_set = lp5523_set_brightness; - res = led_classdev_register(dev, &led->cdev); - if (res < 0) { - dev_err(dev, "couldn't register led on channel %d\n", - chan); - return res; - } - res = sysfs_create_group(&led->cdev.dev->kobj, - &lp5523_led_attribute_group); - if (res < 0) { - dev_err(dev, "couldn't register current attribute\n"); - led_classdev_unregister(&led->cdev); - return res; - } - } else { - led->led_current = 0; - } - return 0; -} - -static int __devinit lp5523_probe(struct i2c_client *client, - const struct i2c_device_id *id) -{ - struct lp5523_chip *chip; - struct lp5523_platform_data *pdata; - int ret, i, led; - - chip = kzalloc(sizeof(*chip), GFP_KERNEL); - if (!chip) - return -ENOMEM; - - i2c_set_clientdata(client, chip); - chip->client = client; - - pdata = client->dev.platform_data; - - if (!pdata) { - dev_err(&client->dev, "no platform data\n"); - ret = -EINVAL; - goto fail1; - } - - mutex_init(&chip->lock); - - chip->pdata = pdata; - - if (pdata->setup_resources) { - ret = pdata->setup_resources(); - if (ret < 0) - goto fail1; - } - - if (pdata->enable) { - pdata->enable(0); - usleep_range(1000, 2000); /* Keep enable down at least 1ms */ - pdata->enable(1); - usleep_range(1000, 2000); /* 500us abs min. */ - } - - lp5523_write(client, LP5523_REG_RESET, 0xff); - usleep_range(10000, 20000); /* - * Exact value is not available. 10 - 20ms - * appears to be enough for reset. - */ - ret = lp5523_detect(client); - if (ret) - goto fail2; - - dev_info(&client->dev, "LP5523 Programmable led chip found\n"); - - /* Initialize engines */ - for (i = 0; i < ARRAY_SIZE(chip->engines); i++) { - ret = lp5523_init_engine(&chip->engines[i], i + 1); - if (ret) { - dev_err(&client->dev, "error initializing engine\n"); - goto fail2; - } - } - ret = lp5523_configure(client); - if (ret < 0) { - dev_err(&client->dev, "error configuring chip\n"); - goto fail2; - } - - /* Initialize leds */ - chip->num_channels = pdata->num_channels; - chip->num_leds = 0; - led = 0; - for (i = 0; i < pdata->num_channels; i++) { - /* Do not initialize channels that are not connected */ - if (pdata->led_config[i].led_current == 0) - continue; - - ret = lp5523_init_led(&chip->leds[led], &client->dev, i, pdata); - if (ret) { - dev_err(&client->dev, "error initializing leds\n"); - goto fail3; - } - chip->num_leds++; - - chip->leds[led].id = led; - /* Set LED current */ - lp5523_write(client, - LP5523_REG_LED_CURRENT_BASE + chip->leds[led].chan_nr, - chip->leds[led].led_current); - - INIT_WORK(&(chip->leds[led].brightness_work), - lp5523_led_brightness_work); - - led++; - } - - ret = lp5523_register_sysfs(client); - if (ret) { - dev_err(&client->dev, "registering sysfs failed\n"); - goto fail3; - } - return ret; -fail3: - for (i = 0; i < chip->num_leds; i++) { - led_classdev_unregister(&chip->leds[i].cdev); - cancel_work_sync(&chip->leds[i].brightness_work); - } -fail2: - if (pdata->enable) - pdata->enable(0); - if (pdata->release_resources) - pdata->release_resources(); -fail1: - kfree(chip); - return ret; -} - -static int lp5523_remove(struct i2c_client *client) -{ - struct lp5523_chip *chip = i2c_get_clientdata(client); - int i; - - lp5523_unregister_sysfs(client); - - for (i = 0; i < chip->num_leds; i++) { - led_classdev_unregister(&chip->leds[i].cdev); - cancel_work_sync(&chip->leds[i].brightness_work); - } - - if (chip->pdata->enable) - chip->pdata->enable(0); - if (chip->pdata->release_resources) - chip->pdata->release_resources(); - kfree(chip); - return 0; -} - -static const struct i2c_device_id lp5523_id[] = { - { "lp5523", 0 }, - { } -}; - -MODULE_DEVICE_TABLE(i2c, lp5523_id); - -static struct i2c_driver lp5523_driver = { - .driver = { - .name = "lp5523", - }, - .probe = lp5523_probe, - .remove = lp5523_remove, - .id_table = lp5523_id, -}; - -module_i2c_driver(lp5523_driver); - -MODULE_AUTHOR("Mathias Nyman <mathias.nyman@nokia.com>"); -MODULE_DESCRIPTION("LP5523 LED engine"); -MODULE_LICENSE("GPL"); diff --git a/ANDROID_3.4.5/drivers/leds/leds-lt3593.c b/ANDROID_3.4.5/drivers/leds/leds-lt3593.c deleted file mode 100644 index e311a96c..00000000 --- a/ANDROID_3.4.5/drivers/leds/leds-lt3593.c +++ /dev/null @@ -1,207 +0,0 @@ -/* - * LEDs driver for LT3593 controllers - * - * See the datasheet at http://cds.linear.com/docs/Datasheet/3593f.pdf - * - * Copyright (c) 2009 Daniel Mack <daniel@caiaq.de> - * - * Based on leds-gpio.c, - * - * Copyright (C) 2007 8D Technologies inc. - * Raphael Assenat <raph@8d.com> - * Copyright (C) 2008 Freescale Semiconductor, Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ - -#include <linux/kernel.h> -#include <linux/init.h> -#include <linux/platform_device.h> -#include <linux/leds.h> -#include <linux/workqueue.h> -#include <linux/delay.h> -#include <linux/gpio.h> -#include <linux/slab.h> -#include <linux/module.h> - -struct lt3593_led_data { - struct led_classdev cdev; - unsigned gpio; - struct work_struct work; - u8 new_level; -}; - -static void lt3593_led_work(struct work_struct *work) -{ - int pulses; - struct lt3593_led_data *led_dat = - container_of(work, struct lt3593_led_data, work); - - /* - * The LT3593 resets its internal current level register to the maximum - * level on the first falling edge on the control pin. Each following - * falling edge decreases the current level by 625uA. Up to 32 pulses - * can be sent, so the maximum power reduction is 20mA. - * After a timeout of 128us, the value is taken from the register and - * applied is to the output driver. - */ - - if (led_dat->new_level == 0) { - gpio_set_value_cansleep(led_dat->gpio, 0); - return; - } - - pulses = 32 - (led_dat->new_level * 32) / 255; - - if (pulses == 0) { - gpio_set_value_cansleep(led_dat->gpio, 0); - mdelay(1); - gpio_set_value_cansleep(led_dat->gpio, 1); - return; - } - - gpio_set_value_cansleep(led_dat->gpio, 1); - - while (pulses--) { - gpio_set_value_cansleep(led_dat->gpio, 0); - udelay(1); - gpio_set_value_cansleep(led_dat->gpio, 1); - udelay(1); - } -} - -static void lt3593_led_set(struct led_classdev *led_cdev, - enum led_brightness value) -{ - struct lt3593_led_data *led_dat = - container_of(led_cdev, struct lt3593_led_data, cdev); - - led_dat->new_level = value; - schedule_work(&led_dat->work); -} - -static int __devinit create_lt3593_led(const struct gpio_led *template, - struct lt3593_led_data *led_dat, struct device *parent) -{ - int ret, state; - - /* skip leds on GPIOs that aren't available */ - if (!gpio_is_valid(template->gpio)) { - printk(KERN_INFO "%s: skipping unavailable LT3593 LED at gpio %d (%s)\n", - KBUILD_MODNAME, template->gpio, template->name); - return 0; - } - - ret = gpio_request(template->gpio, template->name); - if (ret < 0) - return ret; - - led_dat->cdev.name = template->name; - led_dat->cdev.default_trigger = template->default_trigger; - led_dat->gpio = template->gpio; - - led_dat->cdev.brightness_set = lt3593_led_set; - - state = (template->default_state == LEDS_GPIO_DEFSTATE_ON); - led_dat->cdev.brightness = state ? LED_FULL : LED_OFF; - - if (!template->retain_state_suspended) - led_dat->cdev.flags |= LED_CORE_SUSPENDRESUME; - - ret = gpio_direction_output(led_dat->gpio, state); - if (ret < 0) - goto err; - - INIT_WORK(&led_dat->work, lt3593_led_work); - - ret = led_classdev_register(parent, &led_dat->cdev); - if (ret < 0) - goto err; - - printk(KERN_INFO "%s: registered LT3593 LED '%s' at GPIO %d\n", - KBUILD_MODNAME, template->name, template->gpio); - - return 0; - -err: - gpio_free(led_dat->gpio); - return ret; -} - -static void delete_lt3593_led(struct lt3593_led_data *led) -{ - if (!gpio_is_valid(led->gpio)) - return; - - led_classdev_unregister(&led->cdev); - cancel_work_sync(&led->work); - gpio_free(led->gpio); -} - -static int __devinit lt3593_led_probe(struct platform_device *pdev) -{ - struct gpio_led_platform_data *pdata = pdev->dev.platform_data; - struct lt3593_led_data *leds_data; - int i, ret = 0; - - if (!pdata) - return -EBUSY; - - leds_data = kzalloc(sizeof(struct lt3593_led_data) * pdata->num_leds, - GFP_KERNEL); - if (!leds_data) - return -ENOMEM; - - for (i = 0; i < pdata->num_leds; i++) { - ret = create_lt3593_led(&pdata->leds[i], &leds_data[i], - &pdev->dev); - if (ret < 0) - goto err; - } - - platform_set_drvdata(pdev, leds_data); - - return 0; - -err: - for (i = i - 1; i >= 0; i--) - delete_lt3593_led(&leds_data[i]); - - kfree(leds_data); - - return ret; -} - -static int __devexit lt3593_led_remove(struct platform_device *pdev) -{ - int i; - struct gpio_led_platform_data *pdata = pdev->dev.platform_data; - struct lt3593_led_data *leds_data; - - leds_data = platform_get_drvdata(pdev); - - for (i = 0; i < pdata->num_leds; i++) - delete_lt3593_led(&leds_data[i]); - - kfree(leds_data); - - return 0; -} - -static struct platform_driver lt3593_led_driver = { - .probe = lt3593_led_probe, - .remove = __devexit_p(lt3593_led_remove), - .driver = { - .name = "leds-lt3593", - .owner = THIS_MODULE, - }, -}; - -module_platform_driver(lt3593_led_driver); - -MODULE_AUTHOR("Daniel Mack <daniel@caiaq.de>"); -MODULE_DESCRIPTION("LED driver for LT3593 controllers"); -MODULE_LICENSE("GPL"); -MODULE_ALIAS("platform:leds-lt3593"); diff --git a/ANDROID_3.4.5/drivers/leds/leds-max8997.c b/ANDROID_3.4.5/drivers/leds/leds-max8997.c deleted file mode 100644 index f4c0e37f..00000000 --- a/ANDROID_3.4.5/drivers/leds/leds-max8997.c +++ /dev/null @@ -1,372 +0,0 @@ -/* - * leds-max8997.c - LED class driver for MAX8997 LEDs. - * - * Copyright (C) 2011 Samsung Electronics - * Donggeun Kim <dg77.kim@samsung.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - */ - -#include <linux/module.h> -#include <linux/err.h> -#include <linux/slab.h> -#include <linux/workqueue.h> -#include <linux/leds.h> -#include <linux/mfd/max8997.h> -#include <linux/mfd/max8997-private.h> -#include <linux/platform_device.h> - -#define MAX8997_LED_FLASH_SHIFT 3 -#define MAX8997_LED_FLASH_CUR_MASK 0xf8 -#define MAX8997_LED_MOVIE_SHIFT 4 -#define MAX8997_LED_MOVIE_CUR_MASK 0xf0 - -#define MAX8997_LED_FLASH_MAX_BRIGHTNESS 0x1f -#define MAX8997_LED_MOVIE_MAX_BRIGHTNESS 0xf -#define MAX8997_LED_NONE_MAX_BRIGHTNESS 0 - -#define MAX8997_LED0_FLASH_MASK 0x1 -#define MAX8997_LED0_FLASH_PIN_MASK 0x5 -#define MAX8997_LED0_MOVIE_MASK 0x8 -#define MAX8997_LED0_MOVIE_PIN_MASK 0x28 - -#define MAX8997_LED1_FLASH_MASK 0x2 -#define MAX8997_LED1_FLASH_PIN_MASK 0x6 -#define MAX8997_LED1_MOVIE_MASK 0x10 -#define MAX8997_LED1_MOVIE_PIN_MASK 0x30 - -#define MAX8997_LED_BOOST_ENABLE_MASK (1 << 6) - -struct max8997_led { - struct max8997_dev *iodev; - struct led_classdev cdev; - bool enabled; - int id; - enum max8997_led_mode led_mode; - struct mutex mutex; -}; - -static void max8997_led_clear_mode(struct max8997_led *led, - enum max8997_led_mode mode) -{ - struct i2c_client *client = led->iodev->i2c; - u8 val = 0, mask = 0; - int ret; - - switch (mode) { - case MAX8997_FLASH_MODE: - mask = led->id ? - MAX8997_LED1_FLASH_MASK : MAX8997_LED0_FLASH_MASK; - break; - case MAX8997_MOVIE_MODE: - mask = led->id ? - MAX8997_LED1_MOVIE_MASK : MAX8997_LED0_MOVIE_MASK; - break; - case MAX8997_FLASH_PIN_CONTROL_MODE: - mask = led->id ? - MAX8997_LED1_FLASH_PIN_MASK : MAX8997_LED0_FLASH_PIN_MASK; - break; - case MAX8997_MOVIE_PIN_CONTROL_MODE: - mask = led->id ? - MAX8997_LED1_MOVIE_PIN_MASK : MAX8997_LED0_MOVIE_PIN_MASK; - break; - default: - break; - } - - if (mask) { - ret = max8997_update_reg(client, - MAX8997_REG_LEN_CNTL, val, mask); - if (ret) - dev_err(led->iodev->dev, - "failed to update register(%d)\n", ret); - } -} - -static void max8997_led_set_mode(struct max8997_led *led, - enum max8997_led_mode mode) -{ - int ret; - struct i2c_client *client = led->iodev->i2c; - u8 mask = 0; - - /* First, clear the previous mode */ - max8997_led_clear_mode(led, led->led_mode); - - switch (mode) { - case MAX8997_FLASH_MODE: - mask = led->id ? - MAX8997_LED1_FLASH_MASK : MAX8997_LED0_FLASH_MASK; - led->cdev.max_brightness = MAX8997_LED_FLASH_MAX_BRIGHTNESS; - break; - case MAX8997_MOVIE_MODE: - mask = led->id ? - MAX8997_LED1_MOVIE_MASK : MAX8997_LED0_MOVIE_MASK; - led->cdev.max_brightness = MAX8997_LED_MOVIE_MAX_BRIGHTNESS; - break; - case MAX8997_FLASH_PIN_CONTROL_MODE: - mask = led->id ? - MAX8997_LED1_FLASH_PIN_MASK : MAX8997_LED0_FLASH_PIN_MASK; - led->cdev.max_brightness = MAX8997_LED_FLASH_MAX_BRIGHTNESS; - break; - case MAX8997_MOVIE_PIN_CONTROL_MODE: - mask = led->id ? - MAX8997_LED1_MOVIE_PIN_MASK : MAX8997_LED0_MOVIE_PIN_MASK; - led->cdev.max_brightness = MAX8997_LED_MOVIE_MAX_BRIGHTNESS; - break; - default: - led->cdev.max_brightness = MAX8997_LED_NONE_MAX_BRIGHTNESS; - break; - } - - if (mask) { - ret = max8997_update_reg(client, - MAX8997_REG_LEN_CNTL, mask, mask); - if (ret) - dev_err(led->iodev->dev, - "failed to update register(%d)\n", ret); - } - - led->led_mode = mode; -} - -static void max8997_led_enable(struct max8997_led *led, bool enable) -{ - int ret; - struct i2c_client *client = led->iodev->i2c; - u8 val = 0, mask = MAX8997_LED_BOOST_ENABLE_MASK; - - if (led->enabled == enable) - return; - - val = enable ? MAX8997_LED_BOOST_ENABLE_MASK : 0; - - ret = max8997_update_reg(client, MAX8997_REG_BOOST_CNTL, val, mask); - if (ret) - dev_err(led->iodev->dev, - "failed to update register(%d)\n", ret); - - led->enabled = enable; -} - -static void max8997_led_set_current(struct max8997_led *led, - enum led_brightness value) -{ - int ret; - struct i2c_client *client = led->iodev->i2c; - u8 val = 0, mask = 0, reg = 0; - - switch (led->led_mode) { - case MAX8997_FLASH_MODE: - case MAX8997_FLASH_PIN_CONTROL_MODE: - val = value << MAX8997_LED_FLASH_SHIFT; - mask = MAX8997_LED_FLASH_CUR_MASK; - reg = led->id ? MAX8997_REG_FLASH2_CUR : MAX8997_REG_FLASH1_CUR; - break; - case MAX8997_MOVIE_MODE: - case MAX8997_MOVIE_PIN_CONTROL_MODE: - val = value << MAX8997_LED_MOVIE_SHIFT; - mask = MAX8997_LED_MOVIE_CUR_MASK; - reg = MAX8997_REG_MOVIE_CUR; - break; - default: - break; - } - - if (mask) { - ret = max8997_update_reg(client, reg, val, mask); - if (ret) - dev_err(led->iodev->dev, - "failed to update register(%d)\n", ret); - } -} - -static void max8997_led_brightness_set(struct led_classdev *led_cdev, - enum led_brightness value) -{ - struct max8997_led *led = - container_of(led_cdev, struct max8997_led, cdev); - - if (value) { - max8997_led_set_current(led, value); - max8997_led_enable(led, true); - } else { - max8997_led_set_current(led, value); - max8997_led_enable(led, false); - } -} - -static ssize_t max8997_led_show_mode(struct device *dev, - struct device_attribute *attr, char *buf) -{ - struct led_classdev *led_cdev = dev_get_drvdata(dev); - struct max8997_led *led = - container_of(led_cdev, struct max8997_led, cdev); - ssize_t ret = 0; - - mutex_lock(&led->mutex); - - switch (led->led_mode) { - case MAX8997_FLASH_MODE: - ret += sprintf(buf, "FLASH\n"); - break; - case MAX8997_MOVIE_MODE: - ret += sprintf(buf, "MOVIE\n"); - break; - case MAX8997_FLASH_PIN_CONTROL_MODE: - ret += sprintf(buf, "FLASH_PIN_CONTROL\n"); - break; - case MAX8997_MOVIE_PIN_CONTROL_MODE: - ret += sprintf(buf, "MOVIE_PIN_CONTROL\n"); - break; - default: - ret += sprintf(buf, "NONE\n"); - break; - } - - mutex_unlock(&led->mutex); - - return ret; -} - -static ssize_t max8997_led_store_mode(struct device *dev, - struct device_attribute *attr, - const char *buf, size_t size) -{ - struct led_classdev *led_cdev = dev_get_drvdata(dev); - struct max8997_led *led = - container_of(led_cdev, struct max8997_led, cdev); - enum max8997_led_mode mode; - - mutex_lock(&led->mutex); - - if (!strncmp(buf, "FLASH_PIN_CONTROL", 17)) - mode = MAX8997_FLASH_PIN_CONTROL_MODE; - else if (!strncmp(buf, "MOVIE_PIN_CONTROL", 17)) - mode = MAX8997_MOVIE_PIN_CONTROL_MODE; - else if (!strncmp(buf, "FLASH", 5)) - mode = MAX8997_FLASH_MODE; - else if (!strncmp(buf, "MOVIE", 5)) - mode = MAX8997_MOVIE_MODE; - else - mode = MAX8997_NONE; - - max8997_led_set_mode(led, mode); - - mutex_unlock(&led->mutex); - - return size; -} - -static DEVICE_ATTR(mode, 0644, max8997_led_show_mode, max8997_led_store_mode); - -static int __devinit max8997_led_probe(struct platform_device *pdev) -{ - struct max8997_dev *iodev = dev_get_drvdata(pdev->dev.parent); - struct max8997_platform_data *pdata = dev_get_platdata(iodev->dev); - struct max8997_led *led; - char name[20]; - int ret = 0; - - if (pdata == NULL) { - dev_err(&pdev->dev, "no platform data\n"); - return -ENODEV; - } - - led = kzalloc(sizeof(*led), GFP_KERNEL); - if (led == NULL) { - ret = -ENOMEM; - goto err_mem; - } - - led->id = pdev->id; - snprintf(name, sizeof(name), "max8997-led%d", pdev->id); - - led->cdev.name = name; - led->cdev.brightness_set = max8997_led_brightness_set; - led->cdev.flags |= LED_CORE_SUSPENDRESUME; - led->cdev.brightness = 0; - led->iodev = iodev; - - /* initialize mode and brightness according to platform_data */ - if (pdata->led_pdata) { - u8 mode = 0, brightness = 0; - - mode = pdata->led_pdata->mode[led->id]; - brightness = pdata->led_pdata->brightness[led->id]; - - max8997_led_set_mode(led, pdata->led_pdata->mode[led->id]); - - if (brightness > led->cdev.max_brightness) - brightness = led->cdev.max_brightness; - max8997_led_set_current(led, brightness); - led->cdev.brightness = brightness; - } else { - max8997_led_set_mode(led, MAX8997_NONE); - max8997_led_set_current(led, 0); - } - - mutex_init(&led->mutex); - - platform_set_drvdata(pdev, led); - - ret = led_classdev_register(&pdev->dev, &led->cdev); - if (ret < 0) - goto err_led; - - ret = device_create_file(led->cdev.dev, &dev_attr_mode); - if (ret != 0) { - dev_err(&pdev->dev, - "failed to create file: %d\n", ret); - goto err_file; - } - - return 0; - -err_file: - led_classdev_unregister(&led->cdev); -err_led: - kfree(led); -err_mem: - return ret; -} - -static int __devexit max8997_led_remove(struct platform_device *pdev) -{ - struct max8997_led *led = platform_get_drvdata(pdev); - - device_remove_file(led->cdev.dev, &dev_attr_mode); - led_classdev_unregister(&led->cdev); - kfree(led); - - return 0; -} - -static struct platform_driver max8997_led_driver = { - .driver = { - .name = "max8997-led", - .owner = THIS_MODULE, - }, - .probe = max8997_led_probe, - .remove = __devexit_p(max8997_led_remove), -}; - -static int __init max8997_led_init(void) -{ - return platform_driver_register(&max8997_led_driver); -} -module_init(max8997_led_init); - -static void __exit max8997_led_exit(void) -{ - platform_driver_unregister(&max8997_led_driver); -} -module_exit(max8997_led_exit); - -MODULE_AUTHOR("Donggeun Kim <dg77.kim@samsung.com>"); -MODULE_DESCRIPTION("MAX8997 LED driver"); -MODULE_LICENSE("GPL"); -MODULE_ALIAS("platform:max8997-led"); diff --git a/ANDROID_3.4.5/drivers/leds/leds-mc13783.c b/ANDROID_3.4.5/drivers/leds/leds-mc13783.c deleted file mode 100644 index 8bc49154..00000000 --- a/ANDROID_3.4.5/drivers/leds/leds-mc13783.c +++ /dev/null @@ -1,393 +0,0 @@ -/* - * LEDs driver for Freescale MC13783 - * - * Copyright (C) 2010 Philippe Rétornaz - * - * Based on leds-da903x: - * Copyright (C) 2008 Compulab, Ltd. - * Mike Rapoport <mike@compulab.co.il> - * - * Copyright (C) 2006-2008 Marvell International Ltd. - * Eric Miao <eric.miao@marvell.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ - -#include <linux/module.h> -#include <linux/kernel.h> -#include <linux/init.h> -#include <linux/platform_device.h> -#include <linux/leds.h> -#include <linux/workqueue.h> -#include <linux/mfd/mc13xxx.h> -#include <linux/slab.h> - -struct mc13783_led { - struct led_classdev cdev; - struct work_struct work; - struct mc13xxx *master; - enum led_brightness new_brightness; - int id; -}; - -#define MC13783_REG_LED_CONTROL_0 51 -#define MC13783_LED_C0_ENABLE_BIT (1 << 0) -#define MC13783_LED_C0_TRIODE_MD_BIT (1 << 7) -#define MC13783_LED_C0_TRIODE_AD_BIT (1 << 8) -#define MC13783_LED_C0_TRIODE_KP_BIT (1 << 9) -#define MC13783_LED_C0_BOOST_BIT (1 << 10) -#define MC13783_LED_C0_ABMODE_MASK 0x7 -#define MC13783_LED_C0_ABMODE 11 -#define MC13783_LED_C0_ABREF_MASK 0x3 -#define MC13783_LED_C0_ABREF 14 - -#define MC13783_REG_LED_CONTROL_1 52 -#define MC13783_LED_C1_TC1HALF_BIT (1 << 18) - -#define MC13783_REG_LED_CONTROL_2 53 -#define MC13783_LED_C2_BL_P_MASK 0xf -#define MC13783_LED_C2_MD_P 9 -#define MC13783_LED_C2_AD_P 13 -#define MC13783_LED_C2_KP_P 17 -#define MC13783_LED_C2_BL_C_MASK 0x7 -#define MC13783_LED_C2_MD_C 0 -#define MC13783_LED_C2_AD_C 3 -#define MC13783_LED_C2_KP_C 6 - -#define MC13783_REG_LED_CONTROL_3 54 -#define MC13783_LED_C3_TC_P 6 -#define MC13783_LED_C3_TC_P_MASK 0x1f - -#define MC13783_REG_LED_CONTROL_4 55 -#define MC13783_REG_LED_CONTROL_5 56 - -#define MC13783_LED_Cx_PERIOD 21 -#define MC13783_LED_Cx_PERIOD_MASK 0x3 -#define MC13783_LED_Cx_SLEWLIM_BIT (1 << 23) -#define MC13783_LED_Cx_TRIODE_TC_BIT (1 << 23) -#define MC13783_LED_Cx_TC_C_MASK 0x3 - -static void mc13783_led_work(struct work_struct *work) -{ - struct mc13783_led *led = container_of(work, struct mc13783_led, work); - int reg = 0; - int mask = 0; - int value = 0; - int bank, off, shift; - - switch (led->id) { - case MC13783_LED_MD: - reg = MC13783_REG_LED_CONTROL_2; - mask = MC13783_LED_C2_BL_P_MASK << MC13783_LED_C2_MD_P; - value = (led->new_brightness >> 4) << MC13783_LED_C2_MD_P; - break; - case MC13783_LED_AD: - reg = MC13783_REG_LED_CONTROL_2; - mask = MC13783_LED_C2_BL_P_MASK << MC13783_LED_C2_AD_P; - value = (led->new_brightness >> 4) << MC13783_LED_C2_AD_P; - break; - case MC13783_LED_KP: - reg = MC13783_REG_LED_CONTROL_2; - mask = MC13783_LED_C2_BL_P_MASK << MC13783_LED_C2_KP_P; - value = (led->new_brightness >> 4) << MC13783_LED_C2_KP_P; - break; - case MC13783_LED_R1: - case MC13783_LED_G1: - case MC13783_LED_B1: - case MC13783_LED_R2: - case MC13783_LED_G2: - case MC13783_LED_B2: - case MC13783_LED_R3: - case MC13783_LED_G3: - case MC13783_LED_B3: - off = led->id - MC13783_LED_R1; - bank = off/3; - reg = MC13783_REG_LED_CONTROL_3 + off/3; - shift = (off - bank * 3) * 5 + MC13783_LED_C3_TC_P; - value = (led->new_brightness >> 3) << shift; - mask = MC13783_LED_C3_TC_P_MASK << shift; - break; - } - - mc13xxx_lock(led->master); - - mc13xxx_reg_rmw(led->master, reg, mask, value); - - mc13xxx_unlock(led->master); -} - -static void mc13783_led_set(struct led_classdev *led_cdev, - enum led_brightness value) -{ - struct mc13783_led *led; - - led = container_of(led_cdev, struct mc13783_led, cdev); - led->new_brightness = value; - schedule_work(&led->work); -} - -static int __devinit mc13783_led_setup(struct mc13783_led *led, int max_current) -{ - int shift = 0; - int mask = 0; - int value = 0; - int reg = 0; - int ret, bank; - - switch (led->id) { - case MC13783_LED_MD: - shift = MC13783_LED_C2_MD_C; - mask = MC13783_LED_C2_BL_C_MASK; - value = max_current & MC13783_LED_C2_BL_C_MASK; - reg = MC13783_REG_LED_CONTROL_2; - break; - case MC13783_LED_AD: - shift = MC13783_LED_C2_AD_C; - mask = MC13783_LED_C2_BL_C_MASK; - value = max_current & MC13783_LED_C2_BL_C_MASK; - reg = MC13783_REG_LED_CONTROL_2; - break; - case MC13783_LED_KP: - shift = MC13783_LED_C2_KP_C; - mask = MC13783_LED_C2_BL_C_MASK; - value = max_current & MC13783_LED_C2_BL_C_MASK; - reg = MC13783_REG_LED_CONTROL_2; - break; - case MC13783_LED_R1: - case MC13783_LED_G1: - case MC13783_LED_B1: - case MC13783_LED_R2: - case MC13783_LED_G2: - case MC13783_LED_B2: - case MC13783_LED_R3: - case MC13783_LED_G3: - case MC13783_LED_B3: - bank = (led->id - MC13783_LED_R1)/3; - reg = MC13783_REG_LED_CONTROL_3 + bank; - shift = ((led->id - MC13783_LED_R1) - bank * 3) * 2; - mask = MC13783_LED_Cx_TC_C_MASK; - value = max_current & MC13783_LED_Cx_TC_C_MASK; - break; - } - - mc13xxx_lock(led->master); - - ret = mc13xxx_reg_rmw(led->master, reg, mask << shift, - value << shift); - - mc13xxx_unlock(led->master); - return ret; -} - -static int __devinit mc13783_leds_prepare(struct platform_device *pdev) -{ - struct mc13xxx_leds_platform_data *pdata = dev_get_platdata(&pdev->dev); - struct mc13xxx *dev = dev_get_drvdata(pdev->dev.parent); - int ret = 0; - int reg = 0; - - mc13xxx_lock(dev); - - if (pdata->flags & MC13783_LED_TC1HALF) - reg |= MC13783_LED_C1_TC1HALF_BIT; - - if (pdata->flags & MC13783_LED_SLEWLIMTC) - reg |= MC13783_LED_Cx_SLEWLIM_BIT; - - ret = mc13xxx_reg_write(dev, MC13783_REG_LED_CONTROL_1, reg); - if (ret) - goto out; - - reg = (pdata->bl_period & MC13783_LED_Cx_PERIOD_MASK) << - MC13783_LED_Cx_PERIOD; - - if (pdata->flags & MC13783_LED_SLEWLIMBL) - reg |= MC13783_LED_Cx_SLEWLIM_BIT; - - ret = mc13xxx_reg_write(dev, MC13783_REG_LED_CONTROL_2, reg); - if (ret) - goto out; - - reg = (pdata->tc1_period & MC13783_LED_Cx_PERIOD_MASK) << - MC13783_LED_Cx_PERIOD; - - if (pdata->flags & MC13783_LED_TRIODE_TC1) - reg |= MC13783_LED_Cx_TRIODE_TC_BIT; - - ret = mc13xxx_reg_write(dev, MC13783_REG_LED_CONTROL_3, reg); - if (ret) - goto out; - - reg = (pdata->tc2_period & MC13783_LED_Cx_PERIOD_MASK) << - MC13783_LED_Cx_PERIOD; - - if (pdata->flags & MC13783_LED_TRIODE_TC2) - reg |= MC13783_LED_Cx_TRIODE_TC_BIT; - - ret = mc13xxx_reg_write(dev, MC13783_REG_LED_CONTROL_4, reg); - if (ret) - goto out; - - reg = (pdata->tc3_period & MC13783_LED_Cx_PERIOD_MASK) << - MC13783_LED_Cx_PERIOD; - - if (pdata->flags & MC13783_LED_TRIODE_TC3) - reg |= MC13783_LED_Cx_TRIODE_TC_BIT; - - ret = mc13xxx_reg_write(dev, MC13783_REG_LED_CONTROL_5, reg); - if (ret) - goto out; - - reg = MC13783_LED_C0_ENABLE_BIT; - if (pdata->flags & MC13783_LED_TRIODE_MD) - reg |= MC13783_LED_C0_TRIODE_MD_BIT; - if (pdata->flags & MC13783_LED_TRIODE_AD) - reg |= MC13783_LED_C0_TRIODE_AD_BIT; - if (pdata->flags & MC13783_LED_TRIODE_KP) - reg |= MC13783_LED_C0_TRIODE_KP_BIT; - if (pdata->flags & MC13783_LED_BOOST_EN) - reg |= MC13783_LED_C0_BOOST_BIT; - - reg |= (pdata->abmode & MC13783_LED_C0_ABMODE_MASK) << - MC13783_LED_C0_ABMODE; - reg |= (pdata->abref & MC13783_LED_C0_ABREF_MASK) << - MC13783_LED_C0_ABREF; - - ret = mc13xxx_reg_write(dev, MC13783_REG_LED_CONTROL_0, reg); - -out: - mc13xxx_unlock(dev); - return ret; -} - -static int __devinit mc13783_led_probe(struct platform_device *pdev) -{ - struct mc13xxx_leds_platform_data *pdata = dev_get_platdata(&pdev->dev); - struct mc13xxx_led_platform_data *led_cur; - struct mc13783_led *led, *led_dat; - int ret, i; - int init_led = 0; - - if (pdata == NULL) { - dev_err(&pdev->dev, "missing platform data\n"); - return -ENODEV; - } - - if (pdata->num_leds < 1 || pdata->num_leds > (MC13783_LED_MAX + 1)) { - dev_err(&pdev->dev, "Invalid led count %d\n", pdata->num_leds); - return -EINVAL; - } - - led = kzalloc(sizeof(*led) * pdata->num_leds, GFP_KERNEL); - if (led == NULL) { - dev_err(&pdev->dev, "failed to alloc memory\n"); - return -ENOMEM; - } - - ret = mc13783_leds_prepare(pdev); - if (ret) { - dev_err(&pdev->dev, "unable to init led driver\n"); - goto err_free; - } - - for (i = 0; i < pdata->num_leds; i++) { - led_dat = &led[i]; - led_cur = &pdata->led[i]; - - if (led_cur->id > MC13783_LED_MAX || led_cur->id < 0) { - dev_err(&pdev->dev, "invalid id %d\n", led_cur->id); - ret = -EINVAL; - goto err_register; - } - - if (init_led & (1 << led_cur->id)) { - dev_err(&pdev->dev, "led %d already initialized\n", - led_cur->id); - ret = -EINVAL; - goto err_register; - } - - init_led |= 1 << led_cur->id; - led_dat->cdev.name = led_cur->name; - led_dat->cdev.default_trigger = led_cur->default_trigger; - led_dat->cdev.brightness_set = mc13783_led_set; - led_dat->cdev.brightness = LED_OFF; - led_dat->id = led_cur->id; - led_dat->master = dev_get_drvdata(pdev->dev.parent); - - INIT_WORK(&led_dat->work, mc13783_led_work); - - ret = led_classdev_register(pdev->dev.parent, &led_dat->cdev); - if (ret) { - dev_err(&pdev->dev, "failed to register led %d\n", - led_dat->id); - goto err_register; - } - - ret = mc13783_led_setup(led_dat, led_cur->max_current); - if (ret) { - dev_err(&pdev->dev, "unable to init led %d\n", - led_dat->id); - i++; - goto err_register; - } - } - - platform_set_drvdata(pdev, led); - return 0; - -err_register: - for (i = i - 1; i >= 0; i--) { - led_classdev_unregister(&led[i].cdev); - cancel_work_sync(&led[i].work); - } - -err_free: - kfree(led); - return ret; -} - -static int __devexit mc13783_led_remove(struct platform_device *pdev) -{ - struct mc13xxx_leds_platform_data *pdata = dev_get_platdata(&pdev->dev); - struct mc13783_led *led = platform_get_drvdata(pdev); - struct mc13xxx *dev = dev_get_drvdata(pdev->dev.parent); - int i; - - for (i = 0; i < pdata->num_leds; i++) { - led_classdev_unregister(&led[i].cdev); - cancel_work_sync(&led[i].work); - } - - mc13xxx_lock(dev); - - mc13xxx_reg_write(dev, MC13783_REG_LED_CONTROL_0, 0); - mc13xxx_reg_write(dev, MC13783_REG_LED_CONTROL_1, 0); - mc13xxx_reg_write(dev, MC13783_REG_LED_CONTROL_2, 0); - mc13xxx_reg_write(dev, MC13783_REG_LED_CONTROL_3, 0); - mc13xxx_reg_write(dev, MC13783_REG_LED_CONTROL_4, 0); - mc13xxx_reg_write(dev, MC13783_REG_LED_CONTROL_5, 0); - - mc13xxx_unlock(dev); - - kfree(led); - return 0; -} - -static struct platform_driver mc13783_led_driver = { - .driver = { - .name = "mc13783-led", - .owner = THIS_MODULE, - }, - .probe = mc13783_led_probe, - .remove = __devexit_p(mc13783_led_remove), -}; - -module_platform_driver(mc13783_led_driver); - -MODULE_DESCRIPTION("LEDs driver for Freescale MC13783 PMIC"); -MODULE_AUTHOR("Philippe Retornaz <philippe.retornaz@epfl.ch>"); -MODULE_LICENSE("GPL"); -MODULE_ALIAS("platform:mc13783-led"); diff --git a/ANDROID_3.4.5/drivers/leds/leds-net48xx.c b/ANDROID_3.4.5/drivers/leds/leds-net48xx.c deleted file mode 100644 index f117f732..00000000 --- a/ANDROID_3.4.5/drivers/leds/leds-net48xx.c +++ /dev/null @@ -1,97 +0,0 @@ -/* - * LEDs driver for Soekris net48xx - * - * Copyright (C) 2006 Chris Boot <bootc@bootc.net> - * - * Based on leds-ams-delta.c - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ - -#include <linux/kernel.h> -#include <linux/init.h> -#include <linux/platform_device.h> -#include <linux/leds.h> -#include <linux/err.h> -#include <asm/io.h> -#include <linux/nsc_gpio.h> -#include <linux/scx200_gpio.h> -#include <linux/module.h> - -#define DRVNAME "net48xx-led" -#define NET48XX_ERROR_LED_GPIO 20 - -static struct platform_device *pdev; - -static void net48xx_error_led_set(struct led_classdev *led_cdev, - enum led_brightness value) -{ - scx200_gpio_ops.gpio_set(NET48XX_ERROR_LED_GPIO, value ? 1 : 0); -} - -static struct led_classdev net48xx_error_led = { - .name = "net48xx::error", - .brightness_set = net48xx_error_led_set, - .flags = LED_CORE_SUSPENDRESUME, -}; - -static int net48xx_led_probe(struct platform_device *pdev) -{ - return led_classdev_register(&pdev->dev, &net48xx_error_led); -} - -static int net48xx_led_remove(struct platform_device *pdev) -{ - led_classdev_unregister(&net48xx_error_led); - return 0; -} - -static struct platform_driver net48xx_led_driver = { - .probe = net48xx_led_probe, - .remove = net48xx_led_remove, - .driver = { - .name = DRVNAME, - .owner = THIS_MODULE, - }, -}; - -static int __init net48xx_led_init(void) -{ - int ret; - - /* small hack, but scx200_gpio doesn't set .dev if the probe fails */ - if (!scx200_gpio_ops.dev) { - ret = -ENODEV; - goto out; - } - - ret = platform_driver_register(&net48xx_led_driver); - if (ret < 0) - goto out; - - pdev = platform_device_register_simple(DRVNAME, -1, NULL, 0); - if (IS_ERR(pdev)) { - ret = PTR_ERR(pdev); - platform_driver_unregister(&net48xx_led_driver); - goto out; - } - -out: - return ret; -} - -static void __exit net48xx_led_exit(void) -{ - platform_device_unregister(pdev); - platform_driver_unregister(&net48xx_led_driver); -} - -module_init(net48xx_led_init); -module_exit(net48xx_led_exit); - -MODULE_AUTHOR("Chris Boot <bootc@bootc.net>"); -MODULE_DESCRIPTION("Soekris net48xx LED driver"); -MODULE_LICENSE("GPL"); - diff --git a/ANDROID_3.4.5/drivers/leds/leds-netxbig.c b/ANDROID_3.4.5/drivers/leds/leds-netxbig.c deleted file mode 100644 index 73973fdb..00000000 --- a/ANDROID_3.4.5/drivers/leds/leds-netxbig.c +++ /dev/null @@ -1,426 +0,0 @@ -/* - * leds-netxbig.c - Driver for the 2Big and 5Big Network series LEDs - * - * Copyright (C) 2010 LaCie - * - * Author: Simon Guinot <sguinot@lacie.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include <linux/module.h> -#include <linux/init.h> -#include <linux/irq.h> -#include <linux/slab.h> -#include <linux/spinlock.h> -#include <linux/platform_device.h> -#include <linux/gpio.h> -#include <linux/leds.h> -#include <mach/leds-netxbig.h> - -/* - * GPIO extension bus. - */ - -static DEFINE_SPINLOCK(gpio_ext_lock); - -static void gpio_ext_set_addr(struct netxbig_gpio_ext *gpio_ext, int addr) -{ - int pin; - - for (pin = 0; pin < gpio_ext->num_addr; pin++) - gpio_set_value(gpio_ext->addr[pin], (addr >> pin) & 1); -} - -static void gpio_ext_set_data(struct netxbig_gpio_ext *gpio_ext, int data) -{ - int pin; - - for (pin = 0; pin < gpio_ext->num_data; pin++) - gpio_set_value(gpio_ext->data[pin], (data >> pin) & 1); -} - -static void gpio_ext_enable_select(struct netxbig_gpio_ext *gpio_ext) -{ - /* Enable select is done on the raising edge. */ - gpio_set_value(gpio_ext->enable, 0); - gpio_set_value(gpio_ext->enable, 1); -} - -static void gpio_ext_set_value(struct netxbig_gpio_ext *gpio_ext, - int addr, int value) -{ - unsigned long flags; - - spin_lock_irqsave(&gpio_ext_lock, flags); - gpio_ext_set_addr(gpio_ext, addr); - gpio_ext_set_data(gpio_ext, value); - gpio_ext_enable_select(gpio_ext); - spin_unlock_irqrestore(&gpio_ext_lock, flags); -} - -static int __devinit gpio_ext_init(struct netxbig_gpio_ext *gpio_ext) -{ - int err; - int i; - - if (unlikely(!gpio_ext)) - return -EINVAL; - - /* Configure address GPIOs. */ - for (i = 0; i < gpio_ext->num_addr; i++) { - err = gpio_request_one(gpio_ext->addr[i], GPIOF_OUT_INIT_LOW, - "GPIO extension addr"); - if (err) - goto err_free_addr; - } - /* Configure data GPIOs. */ - for (i = 0; i < gpio_ext->num_data; i++) { - err = gpio_request_one(gpio_ext->data[i], GPIOF_OUT_INIT_LOW, - "GPIO extension data"); - if (err) - goto err_free_data; - } - /* Configure "enable select" GPIO. */ - err = gpio_request_one(gpio_ext->enable, GPIOF_OUT_INIT_LOW, - "GPIO extension enable"); - if (err) - goto err_free_data; - - return 0; - -err_free_data: - for (i = i - 1; i >= 0; i--) - gpio_free(gpio_ext->data[i]); - i = gpio_ext->num_addr; -err_free_addr: - for (i = i - 1; i >= 0; i--) - gpio_free(gpio_ext->addr[i]); - - return err; -} - -static void gpio_ext_free(struct netxbig_gpio_ext *gpio_ext) -{ - int i; - - gpio_free(gpio_ext->enable); - for (i = gpio_ext->num_addr - 1; i >= 0; i--) - gpio_free(gpio_ext->addr[i]); - for (i = gpio_ext->num_data - 1; i >= 0; i--) - gpio_free(gpio_ext->data[i]); -} - -/* - * Class LED driver. - */ - -struct netxbig_led_data { - struct netxbig_gpio_ext *gpio_ext; - struct led_classdev cdev; - int mode_addr; - int *mode_val; - int bright_addr; - int bright_max; - struct netxbig_led_timer *timer; - int num_timer; - enum netxbig_led_mode mode; - int sata; - spinlock_t lock; -}; - -static int netxbig_led_get_timer_mode(enum netxbig_led_mode *mode, - unsigned long delay_on, - unsigned long delay_off, - struct netxbig_led_timer *timer, - int num_timer) -{ - int i; - - for (i = 0; i < num_timer; i++) { - if (timer[i].delay_on == delay_on && - timer[i].delay_off == delay_off) { - *mode = timer[i].mode; - return 0; - } - } - return -EINVAL; -} - -static int netxbig_led_blink_set(struct led_classdev *led_cdev, - unsigned long *delay_on, - unsigned long *delay_off) -{ - struct netxbig_led_data *led_dat = - container_of(led_cdev, struct netxbig_led_data, cdev); - enum netxbig_led_mode mode; - int mode_val; - int ret; - - /* Look for a LED mode with the requested timer frequency. */ - ret = netxbig_led_get_timer_mode(&mode, *delay_on, *delay_off, - led_dat->timer, led_dat->num_timer); - if (ret < 0) - return ret; - - mode_val = led_dat->mode_val[mode]; - if (mode_val == NETXBIG_LED_INVALID_MODE) - return -EINVAL; - - spin_lock_irq(&led_dat->lock); - - gpio_ext_set_value(led_dat->gpio_ext, led_dat->mode_addr, mode_val); - led_dat->mode = mode; - - spin_unlock_irq(&led_dat->lock); - - return 0; -} - -static void netxbig_led_set(struct led_classdev *led_cdev, - enum led_brightness value) -{ - struct netxbig_led_data *led_dat = - container_of(led_cdev, struct netxbig_led_data, cdev); - enum netxbig_led_mode mode; - int mode_val, bright_val; - int set_brightness = 1; - unsigned long flags; - - spin_lock_irqsave(&led_dat->lock, flags); - - if (value == LED_OFF) { - mode = NETXBIG_LED_OFF; - set_brightness = 0; - } else { - if (led_dat->sata) - mode = NETXBIG_LED_SATA; - else if (led_dat->mode == NETXBIG_LED_OFF) - mode = NETXBIG_LED_ON; - else /* Keep 'timer' mode. */ - mode = led_dat->mode; - } - mode_val = led_dat->mode_val[mode]; - - gpio_ext_set_value(led_dat->gpio_ext, led_dat->mode_addr, mode_val); - led_dat->mode = mode; - /* - * Note that the brightness register is shared between all the - * SATA LEDs. So, change the brightness setting for a single - * SATA LED will affect all the others. - */ - if (set_brightness) { - bright_val = DIV_ROUND_UP(value * led_dat->bright_max, - LED_FULL); - gpio_ext_set_value(led_dat->gpio_ext, - led_dat->bright_addr, bright_val); - } - - spin_unlock_irqrestore(&led_dat->lock, flags); -} - -static ssize_t netxbig_led_sata_store(struct device *dev, - struct device_attribute *attr, - const char *buff, size_t count) -{ - struct led_classdev *led_cdev = dev_get_drvdata(dev); - struct netxbig_led_data *led_dat = - container_of(led_cdev, struct netxbig_led_data, cdev); - unsigned long enable; - enum netxbig_led_mode mode; - int mode_val; - int ret; - - ret = strict_strtoul(buff, 10, &enable); - if (ret < 0) - return ret; - - enable = !!enable; - - spin_lock_irq(&led_dat->lock); - - if (led_dat->sata == enable) { - ret = count; - goto exit_unlock; - } - - if (led_dat->mode != NETXBIG_LED_ON && - led_dat->mode != NETXBIG_LED_SATA) - mode = led_dat->mode; /* Keep modes 'off' and 'timer'. */ - else if (enable) - mode = NETXBIG_LED_SATA; - else - mode = NETXBIG_LED_ON; - - mode_val = led_dat->mode_val[mode]; - if (mode_val == NETXBIG_LED_INVALID_MODE) { - ret = -EINVAL; - goto exit_unlock; - } - - gpio_ext_set_value(led_dat->gpio_ext, led_dat->mode_addr, mode_val); - led_dat->mode = mode; - led_dat->sata = enable; - - ret = count; - -exit_unlock: - spin_unlock_irq(&led_dat->lock); - - return ret; -} - -static ssize_t netxbig_led_sata_show(struct device *dev, - struct device_attribute *attr, char *buf) -{ - struct led_classdev *led_cdev = dev_get_drvdata(dev); - struct netxbig_led_data *led_dat = - container_of(led_cdev, struct netxbig_led_data, cdev); - - return sprintf(buf, "%d\n", led_dat->sata); -} - -static DEVICE_ATTR(sata, 0644, netxbig_led_sata_show, netxbig_led_sata_store); - -static void delete_netxbig_led(struct netxbig_led_data *led_dat) -{ - if (led_dat->mode_val[NETXBIG_LED_SATA] != NETXBIG_LED_INVALID_MODE) - device_remove_file(led_dat->cdev.dev, &dev_attr_sata); - led_classdev_unregister(&led_dat->cdev); -} - -static int __devinit -create_netxbig_led(struct platform_device *pdev, - struct netxbig_led_data *led_dat, - const struct netxbig_led *template) -{ - struct netxbig_led_platform_data *pdata = pdev->dev.platform_data; - int ret; - - spin_lock_init(&led_dat->lock); - led_dat->gpio_ext = pdata->gpio_ext; - led_dat->cdev.name = template->name; - led_dat->cdev.default_trigger = template->default_trigger; - led_dat->cdev.blink_set = netxbig_led_blink_set; - led_dat->cdev.brightness_set = netxbig_led_set; - /* - * Because the GPIO extension bus don't allow to read registers - * value, there is no way to probe the LED initial state. - * So, the initial sysfs LED value for the "brightness" and "sata" - * attributes are inconsistent. - * - * Note that the initial LED state can't be reconfigured. - * The reason is that the LED behaviour must stay uniform during - * the whole boot process (bootloader+linux). - */ - led_dat->sata = 0; - led_dat->cdev.brightness = LED_OFF; - led_dat->cdev.flags |= LED_CORE_SUSPENDRESUME; - led_dat->mode_addr = template->mode_addr; - led_dat->mode_val = template->mode_val; - led_dat->bright_addr = template->bright_addr; - led_dat->bright_max = (1 << pdata->gpio_ext->num_data) - 1; - led_dat->timer = pdata->timer; - led_dat->num_timer = pdata->num_timer; - - ret = led_classdev_register(&pdev->dev, &led_dat->cdev); - if (ret < 0) - return ret; - - /* - * If available, expose the SATA activity blink capability through - * a "sata" sysfs attribute. - */ - if (led_dat->mode_val[NETXBIG_LED_SATA] != NETXBIG_LED_INVALID_MODE) { - ret = device_create_file(led_dat->cdev.dev, &dev_attr_sata); - if (ret) - led_classdev_unregister(&led_dat->cdev); - } - - return ret; -} - -static int __devinit netxbig_led_probe(struct platform_device *pdev) -{ - struct netxbig_led_platform_data *pdata = pdev->dev.platform_data; - struct netxbig_led_data *leds_data; - int i; - int ret; - - if (!pdata) - return -EINVAL; - - leds_data = kzalloc(sizeof(struct netxbig_led_data) * pdata->num_leds, - GFP_KERNEL); - if (!leds_data) - return -ENOMEM; - - ret = gpio_ext_init(pdata->gpio_ext); - if (ret < 0) - goto err_free_data; - - for (i = 0; i < pdata->num_leds; i++) { - ret = create_netxbig_led(pdev, &leds_data[i], &pdata->leds[i]); - if (ret < 0) - goto err_free_leds; - } - - platform_set_drvdata(pdev, leds_data); - - return 0; - -err_free_leds: - for (i = i - 1; i >= 0; i--) - delete_netxbig_led(&leds_data[i]); - - gpio_ext_free(pdata->gpio_ext); -err_free_data: - kfree(leds_data); - - return ret; -} - -static int __devexit netxbig_led_remove(struct platform_device *pdev) -{ - struct netxbig_led_platform_data *pdata = pdev->dev.platform_data; - struct netxbig_led_data *leds_data; - int i; - - leds_data = platform_get_drvdata(pdev); - - for (i = 0; i < pdata->num_leds; i++) - delete_netxbig_led(&leds_data[i]); - - gpio_ext_free(pdata->gpio_ext); - kfree(leds_data); - - return 0; -} - -static struct platform_driver netxbig_led_driver = { - .probe = netxbig_led_probe, - .remove = __devexit_p(netxbig_led_remove), - .driver = { - .name = "leds-netxbig", - .owner = THIS_MODULE, - }, -}; - -module_platform_driver(netxbig_led_driver); - -MODULE_AUTHOR("Simon Guinot <sguinot@lacie.com>"); -MODULE_DESCRIPTION("LED driver for LaCie xBig Network boards"); -MODULE_LICENSE("GPL"); -MODULE_ALIAS("platform:leds-netxbig"); diff --git a/ANDROID_3.4.5/drivers/leds/leds-ns2.c b/ANDROID_3.4.5/drivers/leds/leds-ns2.c deleted file mode 100644 index 01cf89ec..00000000 --- a/ANDROID_3.4.5/drivers/leds/leds-ns2.c +++ /dev/null @@ -1,332 +0,0 @@ -/* - * leds-ns2.c - Driver for the Network Space v2 (and parents) dual-GPIO LED - * - * Copyright (C) 2010 LaCie - * - * Author: Simon Guinot <sguinot@lacie.com> - * - * Based on leds-gpio.c by Raphael Assenat <raph@8d.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include <linux/kernel.h> -#include <linux/init.h> -#include <linux/platform_device.h> -#include <linux/slab.h> -#include <linux/gpio.h> -#include <linux/leds.h> -#include <linux/module.h> -#include <mach/leds-ns2.h> - -/* - * The Network Space v2 dual-GPIO LED is wired to a CPLD and can blink in - * relation with the SATA activity. This capability is exposed through the - * "sata" sysfs attribute. - * - * The following array detail the different LED registers and the combination - * of their possible values: - * - * cmd_led | slow_led | /SATA active | LED state - * | | | - * 1 | 0 | x | off - * - | 1 | x | on - * 0 | 0 | 1 | on - * 0 | 0 | 0 | blink (rate 300ms) - */ - -enum ns2_led_modes { - NS_V2_LED_OFF, - NS_V2_LED_ON, - NS_V2_LED_SATA, -}; - -struct ns2_led_mode_value { - enum ns2_led_modes mode; - int cmd_level; - int slow_level; -}; - -static struct ns2_led_mode_value ns2_led_modval[] = { - { NS_V2_LED_OFF , 1, 0 }, - { NS_V2_LED_ON , 0, 1 }, - { NS_V2_LED_ON , 1, 1 }, - { NS_V2_LED_SATA, 0, 0 }, -}; - -struct ns2_led_data { - struct led_classdev cdev; - unsigned cmd; - unsigned slow; - unsigned char sata; /* True when SATA mode active. */ - rwlock_t rw_lock; /* Lock GPIOs. */ -}; - -static int ns2_led_get_mode(struct ns2_led_data *led_dat, - enum ns2_led_modes *mode) -{ - int i; - int ret = -EINVAL; - int cmd_level; - int slow_level; - - read_lock_irq(&led_dat->rw_lock); - - cmd_level = gpio_get_value(led_dat->cmd); - slow_level = gpio_get_value(led_dat->slow); - - for (i = 0; i < ARRAY_SIZE(ns2_led_modval); i++) { - if (cmd_level == ns2_led_modval[i].cmd_level && - slow_level == ns2_led_modval[i].slow_level) { - *mode = ns2_led_modval[i].mode; - ret = 0; - break; - } - } - - read_unlock_irq(&led_dat->rw_lock); - - return ret; -} - -static void ns2_led_set_mode(struct ns2_led_data *led_dat, - enum ns2_led_modes mode) -{ - int i; - unsigned long flags; - - write_lock_irqsave(&led_dat->rw_lock, flags); - - for (i = 0; i < ARRAY_SIZE(ns2_led_modval); i++) { - if (mode == ns2_led_modval[i].mode) { - gpio_set_value(led_dat->cmd, - ns2_led_modval[i].cmd_level); - gpio_set_value(led_dat->slow, - ns2_led_modval[i].slow_level); - } - } - - write_unlock_irqrestore(&led_dat->rw_lock, flags); -} - -static void ns2_led_set(struct led_classdev *led_cdev, - enum led_brightness value) -{ - struct ns2_led_data *led_dat = - container_of(led_cdev, struct ns2_led_data, cdev); - enum ns2_led_modes mode; - - if (value == LED_OFF) - mode = NS_V2_LED_OFF; - else if (led_dat->sata) - mode = NS_V2_LED_SATA; - else - mode = NS_V2_LED_ON; - - ns2_led_set_mode(led_dat, mode); -} - -static ssize_t ns2_led_sata_store(struct device *dev, - struct device_attribute *attr, - const char *buff, size_t count) -{ - struct led_classdev *led_cdev = dev_get_drvdata(dev); - struct ns2_led_data *led_dat = - container_of(led_cdev, struct ns2_led_data, cdev); - int ret; - unsigned long enable; - enum ns2_led_modes mode; - - ret = strict_strtoul(buff, 10, &enable); - if (ret < 0) - return ret; - - enable = !!enable; - - if (led_dat->sata == enable) - return count; - - ret = ns2_led_get_mode(led_dat, &mode); - if (ret < 0) - return ret; - - if (enable && mode == NS_V2_LED_ON) - ns2_led_set_mode(led_dat, NS_V2_LED_SATA); - if (!enable && mode == NS_V2_LED_SATA) - ns2_led_set_mode(led_dat, NS_V2_LED_ON); - - led_dat->sata = enable; - - return count; -} - -static ssize_t ns2_led_sata_show(struct device *dev, - struct device_attribute *attr, char *buf) -{ - struct led_classdev *led_cdev = dev_get_drvdata(dev); - struct ns2_led_data *led_dat = - container_of(led_cdev, struct ns2_led_data, cdev); - - return sprintf(buf, "%d\n", led_dat->sata); -} - -static DEVICE_ATTR(sata, 0644, ns2_led_sata_show, ns2_led_sata_store); - -static int __devinit -create_ns2_led(struct platform_device *pdev, struct ns2_led_data *led_dat, - const struct ns2_led *template) -{ - int ret; - enum ns2_led_modes mode; - - ret = gpio_request(template->cmd, template->name); - if (ret == 0) { - ret = gpio_direction_output(template->cmd, - gpio_get_value(template->cmd)); - if (ret) - gpio_free(template->cmd); - } - if (ret) { - dev_err(&pdev->dev, "%s: failed to setup command GPIO\n", - template->name); - } - - ret = gpio_request(template->slow, template->name); - if (ret == 0) { - ret = gpio_direction_output(template->slow, - gpio_get_value(template->slow)); - if (ret) - gpio_free(template->slow); - } - if (ret) { - dev_err(&pdev->dev, "%s: failed to setup slow GPIO\n", - template->name); - goto err_free_cmd; - } - - rwlock_init(&led_dat->rw_lock); - - led_dat->cdev.name = template->name; - led_dat->cdev.default_trigger = template->default_trigger; - led_dat->cdev.blink_set = NULL; - led_dat->cdev.brightness_set = ns2_led_set; - led_dat->cdev.flags |= LED_CORE_SUSPENDRESUME; - led_dat->cmd = template->cmd; - led_dat->slow = template->slow; - - ret = ns2_led_get_mode(led_dat, &mode); - if (ret < 0) - goto err_free_slow; - - /* Set LED initial state. */ - led_dat->sata = (mode == NS_V2_LED_SATA) ? 1 : 0; - led_dat->cdev.brightness = - (mode == NS_V2_LED_OFF) ? LED_OFF : LED_FULL; - - ret = led_classdev_register(&pdev->dev, &led_dat->cdev); - if (ret < 0) - goto err_free_slow; - - ret = device_create_file(led_dat->cdev.dev, &dev_attr_sata); - if (ret < 0) - goto err_free_cdev; - - return 0; - -err_free_cdev: - led_classdev_unregister(&led_dat->cdev); -err_free_slow: - gpio_free(led_dat->slow); -err_free_cmd: - gpio_free(led_dat->cmd); - - return ret; -} - -static void delete_ns2_led(struct ns2_led_data *led_dat) -{ - device_remove_file(led_dat->cdev.dev, &dev_attr_sata); - led_classdev_unregister(&led_dat->cdev); - gpio_free(led_dat->cmd); - gpio_free(led_dat->slow); -} - -static int __devinit ns2_led_probe(struct platform_device *pdev) -{ - struct ns2_led_platform_data *pdata = pdev->dev.platform_data; - struct ns2_led_data *leds_data; - int i; - int ret; - - if (!pdata) - return -EINVAL; - - leds_data = kzalloc(sizeof(struct ns2_led_data) * - pdata->num_leds, GFP_KERNEL); - if (!leds_data) - return -ENOMEM; - - for (i = 0; i < pdata->num_leds; i++) { - ret = create_ns2_led(pdev, &leds_data[i], &pdata->leds[i]); - if (ret < 0) - goto err; - - } - - platform_set_drvdata(pdev, leds_data); - - return 0; - -err: - for (i = i - 1; i >= 0; i--) - delete_ns2_led(&leds_data[i]); - - kfree(leds_data); - - return ret; -} - -static int __devexit ns2_led_remove(struct platform_device *pdev) -{ - int i; - struct ns2_led_platform_data *pdata = pdev->dev.platform_data; - struct ns2_led_data *leds_data; - - leds_data = platform_get_drvdata(pdev); - - for (i = 0; i < pdata->num_leds; i++) - delete_ns2_led(&leds_data[i]); - - kfree(leds_data); - platform_set_drvdata(pdev, NULL); - - return 0; -} - -static struct platform_driver ns2_led_driver = { - .probe = ns2_led_probe, - .remove = __devexit_p(ns2_led_remove), - .driver = { - .name = "leds-ns2", - .owner = THIS_MODULE, - }, -}; - -module_platform_driver(ns2_led_driver); - -MODULE_AUTHOR("Simon Guinot <sguinot@lacie.com>"); -MODULE_DESCRIPTION("Network Space v2 LED driver"); -MODULE_LICENSE("GPL"); -MODULE_ALIAS("platform:leds-ns2"); diff --git a/ANDROID_3.4.5/drivers/leds/leds-ot200.c b/ANDROID_3.4.5/drivers/leds/leds-ot200.c deleted file mode 100644 index c4646825..00000000 --- a/ANDROID_3.4.5/drivers/leds/leds-ot200.c +++ /dev/null @@ -1,171 +0,0 @@ -/* - * Bachmann ot200 leds driver. - * - * Author: Sebastian Andrzej Siewior <bigeasy@linutronix.de> - * Christian Gmeiner <christian.gmeiner@gmail.com> - * - * License: GPL as published by the FSF. - */ - -#include <linux/kernel.h> -#include <linux/init.h> -#include <linux/platform_device.h> -#include <linux/slab.h> -#include <linux/leds.h> -#include <linux/io.h> -#include <linux/module.h> - - -struct ot200_led { - struct led_classdev cdev; - const char *name; - unsigned long port; - u8 mask; -}; - -/* - * The device has three leds on the back panel (led_err, led_init and led_run) - * and can handle up to seven leds on the front panel. - */ - -static struct ot200_led leds[] = { - { - .name = "led_run", - .port = 0x5a, - .mask = BIT(0), - }, - { - .name = "led_init", - .port = 0x5a, - .mask = BIT(1), - }, - { - .name = "led_err", - .port = 0x5a, - .mask = BIT(2), - }, - { - .name = "led_1", - .port = 0x49, - .mask = BIT(7), - }, - { - .name = "led_2", - .port = 0x49, - .mask = BIT(6), - }, - { - .name = "led_3", - .port = 0x49, - .mask = BIT(5), - }, - { - .name = "led_4", - .port = 0x49, - .mask = BIT(4), - }, - { - .name = "led_5", - .port = 0x49, - .mask = BIT(3), - }, - { - .name = "led_6", - .port = 0x49, - .mask = BIT(2), - }, - { - .name = "led_7", - .port = 0x49, - .mask = BIT(1), - } -}; - -static DEFINE_SPINLOCK(value_lock); - -/* - * we need to store the current led states, as it is not - * possible to read the current led state via inb(). - */ -static u8 leds_back; -static u8 leds_front; - -static void ot200_led_brightness_set(struct led_classdev *led_cdev, - enum led_brightness value) -{ - struct ot200_led *led = container_of(led_cdev, struct ot200_led, cdev); - u8 *val; - unsigned long flags; - - spin_lock_irqsave(&value_lock, flags); - - if (led->port == 0x49) - val = &leds_front; - else if (led->port == 0x5a) - val = &leds_back; - else - BUG(); - - if (value == LED_OFF) - *val &= ~led->mask; - else - *val |= led->mask; - - outb(*val, led->port); - spin_unlock_irqrestore(&value_lock, flags); -} - -static int __devinit ot200_led_probe(struct platform_device *pdev) -{ - int i; - int ret; - - for (i = 0; i < ARRAY_SIZE(leds); i++) { - - leds[i].cdev.name = leds[i].name; - leds[i].cdev.brightness_set = ot200_led_brightness_set; - - ret = led_classdev_register(&pdev->dev, &leds[i].cdev); - if (ret < 0) - goto err; - } - - leds_front = 0; /* turn off all front leds */ - leds_back = BIT(1); /* turn on init led */ - outb(leds_front, 0x49); - outb(leds_back, 0x5a); - - return 0; - -err: - for (i = i - 1; i >= 0; i--) - led_classdev_unregister(&leds[i].cdev); - - return ret; -} - -static int __devexit ot200_led_remove(struct platform_device *pdev) -{ - int i; - - for (i = 0; i < ARRAY_SIZE(leds); i++) - led_classdev_unregister(&leds[i].cdev); - - return 0; -} - -static struct platform_driver ot200_led_driver = { - .probe = ot200_led_probe, - .remove = __devexit_p(ot200_led_remove), - .driver = { - .name = "leds-ot200", - .owner = THIS_MODULE, - }, -}; - -module_platform_driver(ot200_led_driver); - -MODULE_AUTHOR("Sebastian A. Siewior <bigeasy@linutronix.de>"); -MODULE_DESCRIPTION("ot200 LED driver"); -MODULE_LICENSE("GPL"); -MODULE_ALIAS("platform:leds-ot200"); diff --git a/ANDROID_3.4.5/drivers/leds/leds-pca9532.c b/ANDROID_3.4.5/drivers/leds/leds-pca9532.c deleted file mode 100644 index ceccab44..00000000 --- a/ANDROID_3.4.5/drivers/leds/leds-pca9532.c +++ /dev/null @@ -1,496 +0,0 @@ -/* - * pca9532.c - 16-bit Led dimmer - * - * Copyright (C) 2011 Jan Weitzel - * Copyright (C) 2008 Riku Voipio - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License. - * - * Datasheet: http://www.nxp.com/documents/data_sheet/PCA9532.pdf - * - */ - -#include <linux/module.h> -#include <linux/i2c.h> -#include <linux/slab.h> -#include <linux/leds.h> -#include <linux/input.h> -#include <linux/mutex.h> -#include <linux/workqueue.h> -#include <linux/leds-pca9532.h> -#include <linux/gpio.h> - -/* m = num_leds*/ -#define PCA9532_REG_INPUT(i) ((i) >> 3) -#define PCA9532_REG_OFFSET(m) ((m) >> 4) -#define PCA9532_REG_PSC(m, i) (PCA9532_REG_OFFSET(m) + 0x1 + (i) * 2) -#define PCA9532_REG_PWM(m, i) (PCA9532_REG_OFFSET(m) + 0x2 + (i) * 2) -#define LED_REG(m, led) (PCA9532_REG_OFFSET(m) + 0x5 + (led >> 2)) -#define LED_NUM(led) (led & 0x3) - -#define ldev_to_led(c) container_of(c, struct pca9532_led, ldev) - -struct pca9532_chip_info { - u8 num_leds; -}; - -struct pca9532_data { - struct i2c_client *client; - struct pca9532_led leds[16]; - struct mutex update_lock; - struct input_dev *idev; - struct work_struct work; -#ifdef CONFIG_LEDS_PCA9532_GPIO - struct gpio_chip gpio; -#endif - const struct pca9532_chip_info *chip_info; - u8 pwm[2]; - u8 psc[2]; -}; - -static int pca9532_probe(struct i2c_client *client, - const struct i2c_device_id *id); -static int pca9532_remove(struct i2c_client *client); - -enum { - pca9530, - pca9531, - pca9532, - pca9533, -}; - -static const struct i2c_device_id pca9532_id[] = { - { "pca9530", pca9530 }, - { "pca9531", pca9531 }, - { "pca9532", pca9532 }, - { "pca9533", pca9533 }, - { } -}; - -MODULE_DEVICE_TABLE(i2c, pca9532_id); - -static const struct pca9532_chip_info pca9532_chip_info_tbl[] = { - [pca9530] = { - .num_leds = 2, - }, - [pca9531] = { - .num_leds = 8, - }, - [pca9532] = { - .num_leds = 16, - }, - [pca9533] = { - .num_leds = 4, - }, -}; - -static struct i2c_driver pca9532_driver = { - .driver = { - .name = "leds-pca953x", - }, - .probe = pca9532_probe, - .remove = pca9532_remove, - .id_table = pca9532_id, -}; - -/* We have two pwm/blinkers, but 16 possible leds to drive. Additionally, - * the clever Thecus people are using one pwm to drive the beeper. So, - * as a compromise we average one pwm to the values requested by all - * leds that are not ON/OFF. - * */ -static int pca9532_calcpwm(struct i2c_client *client, int pwm, int blink, - enum led_brightness value) -{ - int a = 0, b = 0, i = 0; - struct pca9532_data *data = i2c_get_clientdata(client); - for (i = 0; i < data->chip_info->num_leds; i++) { - if (data->leds[i].type == PCA9532_TYPE_LED && - data->leds[i].state == PCA9532_PWM0+pwm) { - a++; - b += data->leds[i].ldev.brightness; - } - } - if (a == 0) { - dev_err(&client->dev, - "fear of division by zero %d/%d, wanted %d\n", - b, a, value); - return -EINVAL; - } - b = b/a; - if (b > 0xFF) - return -EINVAL; - data->pwm[pwm] = b; - data->psc[pwm] = blink; - return 0; -} - -static int pca9532_setpwm(struct i2c_client *client, int pwm) -{ - struct pca9532_data *data = i2c_get_clientdata(client); - u8 maxleds = data->chip_info->num_leds; - - mutex_lock(&data->update_lock); - i2c_smbus_write_byte_data(client, PCA9532_REG_PWM(maxleds, pwm), - data->pwm[pwm]); - i2c_smbus_write_byte_data(client, PCA9532_REG_PSC(maxleds, pwm), - data->psc[pwm]); - mutex_unlock(&data->update_lock); - return 0; -} - -/* Set LED routing */ -static void pca9532_setled(struct pca9532_led *led) -{ - struct i2c_client *client = led->client; - struct pca9532_data *data = i2c_get_clientdata(client); - u8 maxleds = data->chip_info->num_leds; - char reg; - - mutex_lock(&data->update_lock); - reg = i2c_smbus_read_byte_data(client, LED_REG(maxleds, led->id)); - /* zero led bits */ - reg = reg & ~(0x3<<LED_NUM(led->id)*2); - /* set the new value */ - reg = reg | (led->state << LED_NUM(led->id)*2); - i2c_smbus_write_byte_data(client, LED_REG(maxleds, led->id), reg); - mutex_unlock(&data->update_lock); -} - -static void pca9532_set_brightness(struct led_classdev *led_cdev, - enum led_brightness value) -{ - int err = 0; - struct pca9532_led *led = ldev_to_led(led_cdev); - - if (value == LED_OFF) - led->state = PCA9532_OFF; - else if (value == LED_FULL) - led->state = PCA9532_ON; - else { - led->state = PCA9532_PWM0; /* Thecus: hardcode one pwm */ - err = pca9532_calcpwm(led->client, 0, 0, value); - if (err) - return; /* XXX: led api doesn't allow error code? */ - } - schedule_work(&led->work); -} - -static int pca9532_set_blink(struct led_classdev *led_cdev, - unsigned long *delay_on, unsigned long *delay_off) -{ - struct pca9532_led *led = ldev_to_led(led_cdev); - struct i2c_client *client = led->client; - int psc; - int err = 0; - - if (*delay_on == 0 && *delay_off == 0) { - /* led subsystem ask us for a blink rate */ - *delay_on = 1000; - *delay_off = 1000; - } - if (*delay_on != *delay_off || *delay_on > 1690 || *delay_on < 6) - return -EINVAL; - - /* Thecus specific: only use PSC/PWM 0 */ - psc = (*delay_on * 152-1)/1000; - err = pca9532_calcpwm(client, 0, psc, led_cdev->brightness); - if (err) - return err; - schedule_work(&led->work); - return 0; -} - -static int pca9532_event(struct input_dev *dev, unsigned int type, - unsigned int code, int value) -{ - struct pca9532_data *data = input_get_drvdata(dev); - - if (!(type == EV_SND && (code == SND_BELL || code == SND_TONE))) - return -1; - - /* XXX: allow different kind of beeps with psc/pwm modifications */ - if (value > 1 && value < 32767) - data->pwm[1] = 127; - else - data->pwm[1] = 0; - - schedule_work(&data->work); - - return 0; -} - -static void pca9532_input_work(struct work_struct *work) -{ - struct pca9532_data *data = - container_of(work, struct pca9532_data, work); - u8 maxleds = data->chip_info->num_leds; - - mutex_lock(&data->update_lock); - i2c_smbus_write_byte_data(data->client, PCA9532_REG_PWM(maxleds, 1), - data->pwm[1]); - mutex_unlock(&data->update_lock); -} - -static void pca9532_led_work(struct work_struct *work) -{ - struct pca9532_led *led; - led = container_of(work, struct pca9532_led, work); - if (led->state == PCA9532_PWM0) - pca9532_setpwm(led->client, 0); - pca9532_setled(led); -} - -#ifdef CONFIG_LEDS_PCA9532_GPIO -static int pca9532_gpio_request_pin(struct gpio_chip *gc, unsigned offset) -{ - struct pca9532_data *data = container_of(gc, struct pca9532_data, gpio); - struct pca9532_led *led = &data->leds[offset]; - - if (led->type == PCA9532_TYPE_GPIO) - return 0; - - return -EBUSY; -} - -static void pca9532_gpio_set_value(struct gpio_chip *gc, unsigned offset, int val) -{ - struct pca9532_data *data = container_of(gc, struct pca9532_data, gpio); - struct pca9532_led *led = &data->leds[offset]; - - if (val) - led->state = PCA9532_ON; - else - led->state = PCA9532_OFF; - - pca9532_setled(led); -} - -static int pca9532_gpio_get_value(struct gpio_chip *gc, unsigned offset) -{ - struct pca9532_data *data = container_of(gc, struct pca9532_data, gpio); - unsigned char reg; - - reg = i2c_smbus_read_byte_data(data->client, PCA9532_REG_INPUT(offset)); - - return !!(reg & (1 << (offset % 8))); -} - -static int pca9532_gpio_direction_input(struct gpio_chip *gc, unsigned offset) -{ - /* To use as input ensure pin is not driven */ - pca9532_gpio_set_value(gc, offset, 0); - - return 0; -} - -static int pca9532_gpio_direction_output(struct gpio_chip *gc, unsigned offset, int val) -{ - pca9532_gpio_set_value(gc, offset, val); - - return 0; -} -#endif /* CONFIG_LEDS_PCA9532_GPIO */ - -static int pca9532_destroy_devices(struct pca9532_data *data, int n_devs) -{ - int i = n_devs; - - if (!data) - return -EINVAL; - - while (--i >= 0) { - switch (data->leds[i].type) { - case PCA9532_TYPE_NONE: - case PCA9532_TYPE_GPIO: - break; - case PCA9532_TYPE_LED: - led_classdev_unregister(&data->leds[i].ldev); - cancel_work_sync(&data->leds[i].work); - break; - case PCA9532_TYPE_N2100_BEEP: - if (data->idev != NULL) { - input_unregister_device(data->idev); - cancel_work_sync(&data->work); - data->idev = NULL; - } - break; - } - } - -#ifdef CONFIG_LEDS_PCA9532_GPIO - if (data->gpio.dev) { - int err = gpiochip_remove(&data->gpio); - if (err) { - dev_err(&data->client->dev, "%s failed, %d\n", - "gpiochip_remove()", err); - return err; - } - } -#endif - - return 0; -} - -static int pca9532_configure(struct i2c_client *client, - struct pca9532_data *data, struct pca9532_platform_data *pdata) -{ - int i, err = 0; - int gpios = 0; - u8 maxleds = data->chip_info->num_leds; - - for (i = 0; i < 2; i++) { - data->pwm[i] = pdata->pwm[i]; - data->psc[i] = pdata->psc[i]; - i2c_smbus_write_byte_data(client, PCA9532_REG_PWM(maxleds, i), - data->pwm[i]); - i2c_smbus_write_byte_data(client, PCA9532_REG_PSC(maxleds, i), - data->psc[i]); - } - - for (i = 0; i < data->chip_info->num_leds; i++) { - struct pca9532_led *led = &data->leds[i]; - struct pca9532_led *pled = &pdata->leds[i]; - led->client = client; - led->id = i; - led->type = pled->type; - switch (led->type) { - case PCA9532_TYPE_NONE: - break; - case PCA9532_TYPE_GPIO: - gpios++; - break; - case PCA9532_TYPE_LED: - led->state = pled->state; - led->name = pled->name; - led->ldev.name = led->name; - led->ldev.brightness = LED_OFF; - led->ldev.brightness_set = pca9532_set_brightness; - led->ldev.blink_set = pca9532_set_blink; - INIT_WORK(&led->work, pca9532_led_work); - err = led_classdev_register(&client->dev, &led->ldev); - if (err < 0) { - dev_err(&client->dev, - "couldn't register LED %s\n", - led->name); - goto exit; - } - pca9532_setled(led); - break; - case PCA9532_TYPE_N2100_BEEP: - BUG_ON(data->idev); - led->state = PCA9532_PWM1; - pca9532_setled(led); - data->idev = input_allocate_device(); - if (data->idev == NULL) { - err = -ENOMEM; - goto exit; - } - data->idev->name = pled->name; - data->idev->phys = "i2c/pca9532"; - data->idev->id.bustype = BUS_HOST; - data->idev->id.vendor = 0x001f; - data->idev->id.product = 0x0001; - data->idev->id.version = 0x0100; - data->idev->evbit[0] = BIT_MASK(EV_SND); - data->idev->sndbit[0] = BIT_MASK(SND_BELL) | - BIT_MASK(SND_TONE); - data->idev->event = pca9532_event; - input_set_drvdata(data->idev, data); - INIT_WORK(&data->work, pca9532_input_work); - err = input_register_device(data->idev); - if (err) { - input_free_device(data->idev); - cancel_work_sync(&data->work); - data->idev = NULL; - goto exit; - } - break; - } - } - -#ifdef CONFIG_LEDS_PCA9532_GPIO - if (gpios) { - data->gpio.label = "gpio-pca9532"; - data->gpio.direction_input = pca9532_gpio_direction_input; - data->gpio.direction_output = pca9532_gpio_direction_output; - data->gpio.set = pca9532_gpio_set_value; - data->gpio.get = pca9532_gpio_get_value; - data->gpio.request = pca9532_gpio_request_pin; - data->gpio.can_sleep = 1; - data->gpio.base = pdata->gpio_base; - data->gpio.ngpio = data->chip_info->num_leds; - data->gpio.dev = &client->dev; - data->gpio.owner = THIS_MODULE; - - err = gpiochip_add(&data->gpio); - if (err) { - /* Use data->gpio.dev as a flag for freeing gpiochip */ - data->gpio.dev = NULL; - dev_warn(&client->dev, "could not add gpiochip\n"); - } else { - dev_info(&client->dev, "gpios %i...%i\n", - data->gpio.base, data->gpio.base + - data->gpio.ngpio - 1); - } - } -#endif - - return 0; - -exit: - pca9532_destroy_devices(data, i); - return err; -} - -static int pca9532_probe(struct i2c_client *client, - const struct i2c_device_id *id) -{ - struct pca9532_data *data = i2c_get_clientdata(client); - struct pca9532_platform_data *pca9532_pdata = client->dev.platform_data; - int err; - - if (!pca9532_pdata) - return -EIO; - - if (!i2c_check_functionality(client->adapter, - I2C_FUNC_SMBUS_BYTE_DATA)) - return -EIO; - - data = kzalloc(sizeof(*data), GFP_KERNEL); - if (!data) - return -ENOMEM; - - data->chip_info = &pca9532_chip_info_tbl[id->driver_data]; - - dev_info(&client->dev, "setting platform data\n"); - i2c_set_clientdata(client, data); - data->client = client; - mutex_init(&data->update_lock); - - err = pca9532_configure(client, data, pca9532_pdata); - if (err) - kfree(data); - - return err; -} - -static int pca9532_remove(struct i2c_client *client) -{ - struct pca9532_data *data = i2c_get_clientdata(client); - int err; - - err = pca9532_destroy_devices(data, data->chip_info->num_leds); - if (err) - return err; - - kfree(data); - return 0; -} - -module_i2c_driver(pca9532_driver); - -MODULE_AUTHOR("Riku Voipio"); -MODULE_LICENSE("GPL"); -MODULE_DESCRIPTION("PCA 9532 LED dimmer"); diff --git a/ANDROID_3.4.5/drivers/leds/leds-pca955x.c b/ANDROID_3.4.5/drivers/leds/leds-pca955x.c deleted file mode 100644 index dcc3bc3d..00000000 --- a/ANDROID_3.4.5/drivers/leds/leds-pca955x.c +++ /dev/null @@ -1,378 +0,0 @@ -/* - * Copyright 2007-2008 Extreme Engineering Solutions, Inc. - * - * Author: Nate Case <ncase@xes-inc.com> - * - * This file is subject to the terms and conditions of version 2 of - * the GNU General Public License. See the file COPYING in the main - * directory of this archive for more details. - * - * LED driver for various PCA955x I2C LED drivers - * - * Supported devices: - * - * Device Description 7-bit slave address - * ------ ----------- ------------------- - * PCA9550 2-bit driver 0x60 .. 0x61 - * PCA9551 8-bit driver 0x60 .. 0x67 - * PCA9552 16-bit driver 0x60 .. 0x67 - * PCA9553/01 4-bit driver 0x62 - * PCA9553/02 4-bit driver 0x63 - * - * Philips PCA955x LED driver chips follow a register map as shown below: - * - * Control Register Description - * ---------------- ----------- - * 0x0 Input register 0 - * .. - * NUM_INPUT_REGS - 1 Last Input register X - * - * NUM_INPUT_REGS Frequency prescaler 0 - * NUM_INPUT_REGS + 1 PWM register 0 - * NUM_INPUT_REGS + 2 Frequency prescaler 1 - * NUM_INPUT_REGS + 3 PWM register 1 - * - * NUM_INPUT_REGS + 4 LED selector 0 - * NUM_INPUT_REGS + 4 - * + NUM_LED_REGS - 1 Last LED selector - * - * where NUM_INPUT_REGS and NUM_LED_REGS vary depending on how many - * bits the chip supports. - */ - -#include <linux/module.h> -#include <linux/delay.h> -#include <linux/string.h> -#include <linux/ctype.h> -#include <linux/leds.h> -#include <linux/err.h> -#include <linux/i2c.h> -#include <linux/workqueue.h> -#include <linux/slab.h> - -/* LED select registers determine the source that drives LED outputs */ -#define PCA955X_LS_LED_ON 0x0 /* Output LOW */ -#define PCA955X_LS_LED_OFF 0x1 /* Output HI-Z */ -#define PCA955X_LS_BLINK0 0x2 /* Blink at PWM0 rate */ -#define PCA955X_LS_BLINK1 0x3 /* Blink at PWM1 rate */ - -enum pca955x_type { - pca9550, - pca9551, - pca9552, - pca9553, -}; - -struct pca955x_chipdef { - int bits; - u8 slv_addr; /* 7-bit slave address mask */ - int slv_addr_shift; /* Number of bits to ignore */ -}; - -static struct pca955x_chipdef pca955x_chipdefs[] = { - [pca9550] = { - .bits = 2, - .slv_addr = /* 110000x */ 0x60, - .slv_addr_shift = 1, - }, - [pca9551] = { - .bits = 8, - .slv_addr = /* 1100xxx */ 0x60, - .slv_addr_shift = 3, - }, - [pca9552] = { - .bits = 16, - .slv_addr = /* 1100xxx */ 0x60, - .slv_addr_shift = 3, - }, - [pca9553] = { - .bits = 4, - .slv_addr = /* 110001x */ 0x62, - .slv_addr_shift = 1, - }, -}; - -static const struct i2c_device_id pca955x_id[] = { - { "pca9550", pca9550 }, - { "pca9551", pca9551 }, - { "pca9552", pca9552 }, - { "pca9553", pca9553 }, - { } -}; -MODULE_DEVICE_TABLE(i2c, pca955x_id); - -struct pca955x_led { - struct pca955x_chipdef *chipdef; - struct i2c_client *client; - struct work_struct work; - spinlock_t lock; - enum led_brightness brightness; - struct led_classdev led_cdev; - int led_num; /* 0 .. 15 potentially */ - char name[32]; -}; - -/* 8 bits per input register */ -static inline int pca95xx_num_input_regs(int bits) -{ - return (bits + 7) / 8; -} - -/* 4 bits per LED selector register */ -static inline int pca95xx_num_led_regs(int bits) -{ - return (bits + 3) / 4; -} - -/* - * Return an LED selector register value based on an existing one, with - * the appropriate 2-bit state value set for the given LED number (0-3). - */ -static inline u8 pca955x_ledsel(u8 oldval, int led_num, int state) -{ - return (oldval & (~(0x3 << (led_num << 1)))) | - ((state & 0x3) << (led_num << 1)); -} - -/* - * Write to frequency prescaler register, used to program the - * period of the PWM output. period = (PSCx + 1) / 38 - */ -static void pca955x_write_psc(struct i2c_client *client, int n, u8 val) -{ - struct pca955x_led *pca955x = i2c_get_clientdata(client); - - i2c_smbus_write_byte_data(client, - pca95xx_num_input_regs(pca955x->chipdef->bits) + 2*n, - val); -} - -/* - * Write to PWM register, which determines the duty cycle of the - * output. LED is OFF when the count is less than the value of this - * register, and ON when it is greater. If PWMx == 0, LED is always OFF. - * - * Duty cycle is (256 - PWMx) / 256 - */ -static void pca955x_write_pwm(struct i2c_client *client, int n, u8 val) -{ - struct pca955x_led *pca955x = i2c_get_clientdata(client); - - i2c_smbus_write_byte_data(client, - pca95xx_num_input_regs(pca955x->chipdef->bits) + 1 + 2*n, - val); -} - -/* - * Write to LED selector register, which determines the source that - * drives the LED output. - */ -static void pca955x_write_ls(struct i2c_client *client, int n, u8 val) -{ - struct pca955x_led *pca955x = i2c_get_clientdata(client); - - i2c_smbus_write_byte_data(client, - pca95xx_num_input_regs(pca955x->chipdef->bits) + 4 + n, - val); -} - -/* - * Read the LED selector register, which determines the source that - * drives the LED output. - */ -static u8 pca955x_read_ls(struct i2c_client *client, int n) -{ - struct pca955x_led *pca955x = i2c_get_clientdata(client); - - return (u8) i2c_smbus_read_byte_data(client, - pca95xx_num_input_regs(pca955x->chipdef->bits) + 4 + n); -} - -static void pca955x_led_work(struct work_struct *work) -{ - struct pca955x_led *pca955x; - u8 ls; - int chip_ls; /* which LSx to use (0-3 potentially) */ - int ls_led; /* which set of bits within LSx to use (0-3) */ - - pca955x = container_of(work, struct pca955x_led, work); - chip_ls = pca955x->led_num / 4; - ls_led = pca955x->led_num % 4; - - ls = pca955x_read_ls(pca955x->client, chip_ls); - - switch (pca955x->brightness) { - case LED_FULL: - ls = pca955x_ledsel(ls, ls_led, PCA955X_LS_LED_ON); - break; - case LED_OFF: - ls = pca955x_ledsel(ls, ls_led, PCA955X_LS_LED_OFF); - break; - case LED_HALF: - ls = pca955x_ledsel(ls, ls_led, PCA955X_LS_BLINK0); - break; - default: - /* - * Use PWM1 for all other values. This has the unwanted - * side effect of making all LEDs on the chip share the - * same brightness level if set to a value other than - * OFF, HALF, or FULL. But, this is probably better than - * just turning off for all other values. - */ - pca955x_write_pwm(pca955x->client, 1, 255-pca955x->brightness); - ls = pca955x_ledsel(ls, ls_led, PCA955X_LS_BLINK1); - break; - } - - pca955x_write_ls(pca955x->client, chip_ls, ls); -} - -static void pca955x_led_set(struct led_classdev *led_cdev, enum led_brightness value) -{ - struct pca955x_led *pca955x; - - pca955x = container_of(led_cdev, struct pca955x_led, led_cdev); - - spin_lock(&pca955x->lock); - pca955x->brightness = value; - - /* - * Must use workqueue for the actual I/O since I2C operations - * can sleep. - */ - schedule_work(&pca955x->work); - - spin_unlock(&pca955x->lock); -} - -static int __devinit pca955x_probe(struct i2c_client *client, - const struct i2c_device_id *id) -{ - struct pca955x_led *pca955x; - struct pca955x_chipdef *chip; - struct i2c_adapter *adapter; - struct led_platform_data *pdata; - int i, err; - - chip = &pca955x_chipdefs[id->driver_data]; - adapter = to_i2c_adapter(client->dev.parent); - pdata = client->dev.platform_data; - - /* Make sure the slave address / chip type combo given is possible */ - if ((client->addr & ~((1 << chip->slv_addr_shift) - 1)) != - chip->slv_addr) { - dev_err(&client->dev, "invalid slave address %02x\n", - client->addr); - return -ENODEV; - } - - printk(KERN_INFO "leds-pca955x: Using %s %d-bit LED driver at " - "slave address 0x%02x\n", - id->name, chip->bits, client->addr); - - if (!i2c_check_functionality(adapter, I2C_FUNC_I2C)) - return -EIO; - - if (pdata) { - if (pdata->num_leds != chip->bits) { - dev_err(&client->dev, "board info claims %d LEDs" - " on a %d-bit chip\n", - pdata->num_leds, chip->bits); - return -ENODEV; - } - } - - pca955x = kzalloc(sizeof(*pca955x) * chip->bits, GFP_KERNEL); - if (!pca955x) - return -ENOMEM; - - i2c_set_clientdata(client, pca955x); - - for (i = 0; i < chip->bits; i++) { - pca955x[i].chipdef = chip; - pca955x[i].client = client; - pca955x[i].led_num = i; - - /* Platform data can specify LED names and default triggers */ - if (pdata) { - if (pdata->leds[i].name) - snprintf(pca955x[i].name, - sizeof(pca955x[i].name), "pca955x:%s", - pdata->leds[i].name); - if (pdata->leds[i].default_trigger) - pca955x[i].led_cdev.default_trigger = - pdata->leds[i].default_trigger; - } else { - snprintf(pca955x[i].name, sizeof(pca955x[i].name), - "pca955x:%d", i); - } - - spin_lock_init(&pca955x[i].lock); - - pca955x[i].led_cdev.name = pca955x[i].name; - pca955x[i].led_cdev.brightness_set = pca955x_led_set; - - INIT_WORK(&pca955x[i].work, pca955x_led_work); - - err = led_classdev_register(&client->dev, &pca955x[i].led_cdev); - if (err < 0) - goto exit; - } - - /* Turn off LEDs */ - for (i = 0; i < pca95xx_num_led_regs(chip->bits); i++) - pca955x_write_ls(client, i, 0x55); - - /* PWM0 is used for half brightness or 50% duty cycle */ - pca955x_write_pwm(client, 0, 255-LED_HALF); - - /* PWM1 is used for variable brightness, default to OFF */ - pca955x_write_pwm(client, 1, 0); - - /* Set to fast frequency so we do not see flashing */ - pca955x_write_psc(client, 0, 0); - pca955x_write_psc(client, 1, 0); - - return 0; - -exit: - while (i--) { - led_classdev_unregister(&pca955x[i].led_cdev); - cancel_work_sync(&pca955x[i].work); - } - - kfree(pca955x); - - return err; -} - -static int __devexit pca955x_remove(struct i2c_client *client) -{ - struct pca955x_led *pca955x = i2c_get_clientdata(client); - int i; - - for (i = 0; i < pca955x->chipdef->bits; i++) { - led_classdev_unregister(&pca955x[i].led_cdev); - cancel_work_sync(&pca955x[i].work); - } - - kfree(pca955x); - - return 0; -} - -static struct i2c_driver pca955x_driver = { - .driver = { - .name = "leds-pca955x", - .owner = THIS_MODULE, - }, - .probe = pca955x_probe, - .remove = __devexit_p(pca955x_remove), - .id_table = pca955x_id, -}; - -module_i2c_driver(pca955x_driver); - -MODULE_AUTHOR("Nate Case <ncase@xes-inc.com>"); -MODULE_DESCRIPTION("PCA955x LED driver"); -MODULE_LICENSE("GPL v2"); diff --git a/ANDROID_3.4.5/drivers/leds/leds-pca9633.c b/ANDROID_3.4.5/drivers/leds/leds-pca9633.c deleted file mode 100644 index d8926fd0..00000000 --- a/ANDROID_3.4.5/drivers/leds/leds-pca9633.c +++ /dev/null @@ -1,193 +0,0 @@ -/* - * Copyright 2011 bct electronic GmbH - * - * Author: Peter Meerwald <p.meerwald@bct-electronic.com> - * - * Based on leds-pca955x.c - * - * This file is subject to the terms and conditions of version 2 of - * the GNU General Public License. See the file COPYING in the main - * directory of this archive for more details. - * - * LED driver for the PCA9633 I2C LED driver (7-bit slave address 0x62) - * - */ - -#include <linux/module.h> -#include <linux/delay.h> -#include <linux/string.h> -#include <linux/ctype.h> -#include <linux/leds.h> -#include <linux/err.h> -#include <linux/i2c.h> -#include <linux/workqueue.h> -#include <linux/slab.h> - -/* LED select registers determine the source that drives LED outputs */ -#define PCA9633_LED_OFF 0x0 /* LED driver off */ -#define PCA9633_LED_ON 0x1 /* LED driver on */ -#define PCA9633_LED_PWM 0x2 /* Controlled through PWM */ -#define PCA9633_LED_GRP_PWM 0x3 /* Controlled through PWM/GRPPWM */ - -#define PCA9633_MODE1 0x00 -#define PCA9633_MODE2 0x01 -#define PCA9633_PWM_BASE 0x02 -#define PCA9633_LEDOUT 0x08 - -static const struct i2c_device_id pca9633_id[] = { - { "pca9633", 0 }, - { } -}; -MODULE_DEVICE_TABLE(i2c, pca9633_id); - -struct pca9633_led { - struct i2c_client *client; - struct work_struct work; - enum led_brightness brightness; - struct led_classdev led_cdev; - int led_num; /* 0 .. 3 potentially */ - char name[32]; -}; - -static void pca9633_led_work(struct work_struct *work) -{ - struct pca9633_led *pca9633 = container_of(work, - struct pca9633_led, work); - u8 ledout = i2c_smbus_read_byte_data(pca9633->client, PCA9633_LEDOUT); - int shift = 2 * pca9633->led_num; - u8 mask = 0x3 << shift; - - switch (pca9633->brightness) { - case LED_FULL: - i2c_smbus_write_byte_data(pca9633->client, PCA9633_LEDOUT, - (ledout & ~mask) | (PCA9633_LED_ON << shift)); - break; - case LED_OFF: - i2c_smbus_write_byte_data(pca9633->client, PCA9633_LEDOUT, - ledout & ~mask); - break; - default: - i2c_smbus_write_byte_data(pca9633->client, - PCA9633_PWM_BASE + pca9633->led_num, - pca9633->brightness); - i2c_smbus_write_byte_data(pca9633->client, PCA9633_LEDOUT, - (ledout & ~mask) | (PCA9633_LED_PWM << shift)); - break; - } -} - -static void pca9633_led_set(struct led_classdev *led_cdev, - enum led_brightness value) -{ - struct pca9633_led *pca9633; - - pca9633 = container_of(led_cdev, struct pca9633_led, led_cdev); - - pca9633->brightness = value; - - /* - * Must use workqueue for the actual I/O since I2C operations - * can sleep. - */ - schedule_work(&pca9633->work); -} - -static int __devinit pca9633_probe(struct i2c_client *client, - const struct i2c_device_id *id) -{ - struct pca9633_led *pca9633; - struct led_platform_data *pdata; - int i, err; - - pdata = client->dev.platform_data; - - if (pdata) { - if (pdata->num_leds <= 0 || pdata->num_leds > 4) { - dev_err(&client->dev, "board info must claim at most 4 LEDs"); - return -EINVAL; - } - } - - pca9633 = kcalloc(4, sizeof(*pca9633), GFP_KERNEL); - if (!pca9633) - return -ENOMEM; - - i2c_set_clientdata(client, pca9633); - - for (i = 0; i < 4; i++) { - pca9633[i].client = client; - pca9633[i].led_num = i; - - /* Platform data can specify LED names and default triggers */ - if (pdata && i < pdata->num_leds) { - if (pdata->leds[i].name) - snprintf(pca9633[i].name, - sizeof(pca9633[i].name), "pca9633:%s", - pdata->leds[i].name); - if (pdata->leds[i].default_trigger) - pca9633[i].led_cdev.default_trigger = - pdata->leds[i].default_trigger; - } else { - snprintf(pca9633[i].name, sizeof(pca9633[i].name), - "pca9633:%d", i); - } - - pca9633[i].led_cdev.name = pca9633[i].name; - pca9633[i].led_cdev.brightness_set = pca9633_led_set; - - INIT_WORK(&pca9633[i].work, pca9633_led_work); - - err = led_classdev_register(&client->dev, &pca9633[i].led_cdev); - if (err < 0) - goto exit; - } - - /* Disable LED all-call address and set normal mode */ - i2c_smbus_write_byte_data(client, PCA9633_MODE1, 0x00); - - /* Turn off LEDs */ - i2c_smbus_write_byte_data(client, PCA9633_LEDOUT, 0x00); - - return 0; - -exit: - while (i--) { - led_classdev_unregister(&pca9633[i].led_cdev); - cancel_work_sync(&pca9633[i].work); - } - - kfree(pca9633); - - return err; -} - -static int __devexit pca9633_remove(struct i2c_client *client) -{ - struct pca9633_led *pca9633 = i2c_get_clientdata(client); - int i; - - for (i = 0; i < 4; i++) { - led_classdev_unregister(&pca9633[i].led_cdev); - cancel_work_sync(&pca9633[i].work); - } - - kfree(pca9633); - - return 0; -} - -static struct i2c_driver pca9633_driver = { - .driver = { - .name = "leds-pca9633", - .owner = THIS_MODULE, - }, - .probe = pca9633_probe, - .remove = __devexit_p(pca9633_remove), - .id_table = pca9633_id, -}; - -module_i2c_driver(pca9633_driver); - -MODULE_AUTHOR("Peter Meerwald <p.meerwald@bct-electronic.com>"); -MODULE_DESCRIPTION("PCA9633 LED driver"); -MODULE_LICENSE("GPL v2"); diff --git a/ANDROID_3.4.5/drivers/leds/leds-pwm.c b/ANDROID_3.4.5/drivers/leds/leds-pwm.c deleted file mode 100644 index 3ed92f34..00000000 --- a/ANDROID_3.4.5/drivers/leds/leds-pwm.c +++ /dev/null @@ -1,143 +0,0 @@ -/* - * linux/drivers/leds-pwm.c - * - * simple PWM based LED control - * - * Copyright 2009 Luotao Fu @ Pengutronix (l.fu@pengutronix.de) - * - * based on leds-gpio.c by Raphael Assenat <raph@8d.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ - -#include <linux/module.h> -#include <linux/kernel.h> -#include <linux/init.h> -#include <linux/platform_device.h> -#include <linux/fb.h> -#include <linux/leds.h> -#include <linux/err.h> -#include <linux/pwm.h> -#include <linux/leds_pwm.h> -#include <linux/slab.h> - -struct led_pwm_data { - struct led_classdev cdev; - struct pwm_device *pwm; - unsigned int active_low; - unsigned int period; -}; - -static void led_pwm_set(struct led_classdev *led_cdev, - enum led_brightness brightness) -{ - struct led_pwm_data *led_dat = - container_of(led_cdev, struct led_pwm_data, cdev); - unsigned int max = led_dat->cdev.max_brightness; - unsigned int period = led_dat->period; - - if (brightness == 0) { - pwm_config(led_dat->pwm, 0, period); - pwm_disable(led_dat->pwm); - } else { - pwm_config(led_dat->pwm, brightness * period / max, period); - pwm_enable(led_dat->pwm); - } -} - -static int led_pwm_probe(struct platform_device *pdev) -{ - struct led_pwm_platform_data *pdata = pdev->dev.platform_data; - struct led_pwm *cur_led; - struct led_pwm_data *leds_data, *led_dat; - int i, ret = 0; - - if (!pdata) - return -EBUSY; - - leds_data = kzalloc(sizeof(struct led_pwm_data) * pdata->num_leds, - GFP_KERNEL); - if (!leds_data) - return -ENOMEM; - - for (i = 0; i < pdata->num_leds; i++) { - cur_led = &pdata->leds[i]; - led_dat = &leds_data[i]; - - led_dat->pwm = pwm_request(cur_led->pwm_id, - cur_led->name); - if (IS_ERR(led_dat->pwm)) { - ret = PTR_ERR(led_dat->pwm); - dev_err(&pdev->dev, "unable to request PWM %d\n", - cur_led->pwm_id); - goto err; - } - - led_dat->cdev.name = cur_led->name; - led_dat->cdev.default_trigger = cur_led->default_trigger; - led_dat->active_low = cur_led->active_low; - led_dat->period = cur_led->pwm_period_ns; - led_dat->cdev.brightness_set = led_pwm_set; - led_dat->cdev.brightness = LED_OFF; - led_dat->cdev.max_brightness = cur_led->max_brightness; - led_dat->cdev.flags |= LED_CORE_SUSPENDRESUME; - - ret = led_classdev_register(&pdev->dev, &led_dat->cdev); - if (ret < 0) { - pwm_free(led_dat->pwm); - goto err; - } - } - - platform_set_drvdata(pdev, leds_data); - - return 0; - -err: - if (i > 0) { - for (i = i - 1; i >= 0; i--) { - led_classdev_unregister(&leds_data[i].cdev); - pwm_free(leds_data[i].pwm); - } - } - - kfree(leds_data); - - return ret; -} - -static int __devexit led_pwm_remove(struct platform_device *pdev) -{ - int i; - struct led_pwm_platform_data *pdata = pdev->dev.platform_data; - struct led_pwm_data *leds_data; - - leds_data = platform_get_drvdata(pdev); - - for (i = 0; i < pdata->num_leds; i++) { - led_classdev_unregister(&leds_data[i].cdev); - pwm_free(leds_data[i].pwm); - } - - kfree(leds_data); - - return 0; -} - -static struct platform_driver led_pwm_driver = { - .probe = led_pwm_probe, - .remove = __devexit_p(led_pwm_remove), - .driver = { - .name = "leds_pwm", - .owner = THIS_MODULE, - }, -}; - -module_platform_driver(led_pwm_driver); - -MODULE_AUTHOR("Luotao Fu <l.fu@pengutronix.de>"); -MODULE_DESCRIPTION("PWM LED driver for PXA"); -MODULE_LICENSE("GPL"); -MODULE_ALIAS("platform:leds-pwm"); diff --git a/ANDROID_3.4.5/drivers/leds/leds-rb532.c b/ANDROID_3.4.5/drivers/leds/leds-rb532.c deleted file mode 100644 index a7815b6c..00000000 --- a/ANDROID_3.4.5/drivers/leds/leds-rb532.c +++ /dev/null @@ -1,65 +0,0 @@ -/* - * LEDs driver for the "User LED" on Routerboard532 - * - * Copyright (C) 2009 Phil Sutter <n0-1@freewrt.org> - * - * Based on leds-cobalt-qube.c by Florian Fainelly and - * rb-diag.c (my own standalone driver for both LED and - * button of Routerboard532). - */ - -#include <linux/leds.h> -#include <linux/module.h> -#include <linux/platform_device.h> - -#include <asm/mach-rc32434/gpio.h> -#include <asm/mach-rc32434/rb.h> - -static void rb532_led_set(struct led_classdev *cdev, - enum led_brightness brightness) -{ - if (brightness) - set_latch_u5(LO_ULED, 0); - - else - set_latch_u5(0, LO_ULED); -} - -static enum led_brightness rb532_led_get(struct led_classdev *cdev) -{ - return (get_latch_u5() & LO_ULED) ? LED_FULL : LED_OFF; -} - -static struct led_classdev rb532_uled = { - .name = "uled", - .brightness_set = rb532_led_set, - .brightness_get = rb532_led_get, - .default_trigger = "nand-disk", -}; - -static int __devinit rb532_led_probe(struct platform_device *pdev) -{ - return led_classdev_register(&pdev->dev, &rb532_uled); -} - -static int __devexit rb532_led_remove(struct platform_device *pdev) -{ - led_classdev_unregister(&rb532_uled); - return 0; -} - -static struct platform_driver rb532_led_driver = { - .probe = rb532_led_probe, - .remove = __devexit_p(rb532_led_remove), - .driver = { - .name = "rb532-led", - .owner = THIS_MODULE, - }, -}; - -module_platform_driver(rb532_led_driver); - -MODULE_LICENSE("GPL"); -MODULE_DESCRIPTION("User LED support for Routerboard532"); -MODULE_AUTHOR("Phil Sutter <n0-1@freewrt.org>"); -MODULE_ALIAS("platform:rb532-led"); diff --git a/ANDROID_3.4.5/drivers/leds/leds-regulator.c b/ANDROID_3.4.5/drivers/leds/leds-regulator.c deleted file mode 100644 index df7e963b..00000000 --- a/ANDROID_3.4.5/drivers/leds/leds-regulator.c +++ /dev/null @@ -1,237 +0,0 @@ -/* - * leds-regulator.c - LED class driver for regulator driven LEDs. - * - * Copyright (C) 2009 Antonio Ospite <ospite@studenti.unina.it> - * - * Inspired by leds-wm8350 driver. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - */ - -#include <linux/module.h> -#include <linux/err.h> -#include <linux/slab.h> -#include <linux/workqueue.h> -#include <linux/leds.h> -#include <linux/leds-regulator.h> -#include <linux/platform_device.h> -#include <linux/regulator/consumer.h> - -#define to_regulator_led(led_cdev) \ - container_of(led_cdev, struct regulator_led, cdev) - -struct regulator_led { - struct led_classdev cdev; - enum led_brightness value; - int enabled; - struct mutex mutex; - struct work_struct work; - - struct regulator *vcc; -}; - -static inline int led_regulator_get_max_brightness(struct regulator *supply) -{ - int ret; - int voltage = regulator_list_voltage(supply, 0); - - if (voltage <= 0) - return 1; - - /* even if regulator can't change voltages, - * we still assume it can change status - * and the LED can be turned on and off. - */ - ret = regulator_set_voltage(supply, voltage, voltage); - if (ret < 0) - return 1; - - return regulator_count_voltages(supply); -} - -static int led_regulator_get_voltage(struct regulator *supply, - enum led_brightness brightness) -{ - if (brightness == 0) - return -EINVAL; - - return regulator_list_voltage(supply, brightness - 1); -} - - -static void regulator_led_enable(struct regulator_led *led) -{ - int ret; - - if (led->enabled) - return; - - ret = regulator_enable(led->vcc); - if (ret != 0) { - dev_err(led->cdev.dev, "Failed to enable vcc: %d\n", ret); - return; - } - - led->enabled = 1; -} - -static void regulator_led_disable(struct regulator_led *led) -{ - int ret; - - if (!led->enabled) - return; - - ret = regulator_disable(led->vcc); - if (ret != 0) { - dev_err(led->cdev.dev, "Failed to disable vcc: %d\n", ret); - return; - } - - led->enabled = 0; -} - -static void regulator_led_set_value(struct regulator_led *led) -{ - int voltage; - int ret; - - mutex_lock(&led->mutex); - - if (led->value == LED_OFF) { - regulator_led_disable(led); - goto out; - } - - if (led->cdev.max_brightness > 1) { - voltage = led_regulator_get_voltage(led->vcc, led->value); - dev_dbg(led->cdev.dev, "brightness: %d voltage: %d\n", - led->value, voltage); - - ret = regulator_set_voltage(led->vcc, voltage, voltage); - if (ret != 0) - dev_err(led->cdev.dev, "Failed to set voltage %d: %d\n", - voltage, ret); - } - - regulator_led_enable(led); - -out: - mutex_unlock(&led->mutex); -} - -static void led_work(struct work_struct *work) -{ - struct regulator_led *led; - - led = container_of(work, struct regulator_led, work); - regulator_led_set_value(led); -} - -static void regulator_led_brightness_set(struct led_classdev *led_cdev, - enum led_brightness value) -{ - struct regulator_led *led = to_regulator_led(led_cdev); - - led->value = value; - schedule_work(&led->work); -} - -static int __devinit regulator_led_probe(struct platform_device *pdev) -{ - struct led_regulator_platform_data *pdata = pdev->dev.platform_data; - struct regulator_led *led; - struct regulator *vcc; - int ret = 0; - - if (pdata == NULL) { - dev_err(&pdev->dev, "no platform data\n"); - return -ENODEV; - } - - vcc = regulator_get_exclusive(&pdev->dev, "vled"); - if (IS_ERR(vcc)) { - dev_err(&pdev->dev, "Cannot get vcc for %s\n", pdata->name); - return PTR_ERR(vcc); - } - - led = kzalloc(sizeof(*led), GFP_KERNEL); - if (led == NULL) { - ret = -ENOMEM; - goto err_vcc; - } - - led->cdev.max_brightness = led_regulator_get_max_brightness(vcc); - if (pdata->brightness > led->cdev.max_brightness) { - dev_err(&pdev->dev, "Invalid default brightness %d\n", - pdata->brightness); - ret = -EINVAL; - goto err_led; - } - led->value = pdata->brightness; - - led->cdev.brightness_set = regulator_led_brightness_set; - led->cdev.name = pdata->name; - led->cdev.flags |= LED_CORE_SUSPENDRESUME; - led->vcc = vcc; - - /* to handle correctly an already enabled regulator */ - if (regulator_is_enabled(led->vcc)) - led->enabled = 1; - - mutex_init(&led->mutex); - INIT_WORK(&led->work, led_work); - - platform_set_drvdata(pdev, led); - - ret = led_classdev_register(&pdev->dev, &led->cdev); - if (ret < 0) { - cancel_work_sync(&led->work); - goto err_led; - } - - /* to expose the default value to userspace */ - led->cdev.brightness = led->value; - - /* Set the default led status */ - regulator_led_set_value(led); - - return 0; - -err_led: - kfree(led); -err_vcc: - regulator_put(vcc); - return ret; -} - -static int __devexit regulator_led_remove(struct platform_device *pdev) -{ - struct regulator_led *led = platform_get_drvdata(pdev); - - led_classdev_unregister(&led->cdev); - cancel_work_sync(&led->work); - regulator_led_disable(led); - regulator_put(led->vcc); - kfree(led); - return 0; -} - -static struct platform_driver regulator_led_driver = { - .driver = { - .name = "leds-regulator", - .owner = THIS_MODULE, - }, - .probe = regulator_led_probe, - .remove = __devexit_p(regulator_led_remove), -}; - -module_platform_driver(regulator_led_driver); - -MODULE_AUTHOR("Antonio Ospite <ospite@studenti.unina.it>"); -MODULE_DESCRIPTION("Regulator driven LED driver"); -MODULE_LICENSE("GPL"); -MODULE_ALIAS("platform:leds-regulator"); diff --git a/ANDROID_3.4.5/drivers/leds/leds-renesas-tpu.c b/ANDROID_3.4.5/drivers/leds/leds-renesas-tpu.c deleted file mode 100644 index 32fe337d..00000000 --- a/ANDROID_3.4.5/drivers/leds/leds-renesas-tpu.c +++ /dev/null @@ -1,346 +0,0 @@ -/* - * LED control using Renesas TPU - * - * Copyright (C) 2011 Magnus Damm - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include <linux/module.h> -#include <linux/init.h> -#include <linux/platform_device.h> -#include <linux/spinlock.h> -#include <linux/printk.h> -#include <linux/ioport.h> -#include <linux/io.h> -#include <linux/clk.h> -#include <linux/leds.h> -#include <linux/platform_data/leds-renesas-tpu.h> -#include <linux/gpio.h> -#include <linux/err.h> -#include <linux/slab.h> -#include <linux/pm_runtime.h> -#include <linux/workqueue.h> - -enum r_tpu_pin { R_TPU_PIN_UNUSED, R_TPU_PIN_GPIO, R_TPU_PIN_GPIO_FN }; -enum r_tpu_timer { R_TPU_TIMER_UNUSED, R_TPU_TIMER_ON }; - -struct r_tpu_priv { - struct led_classdev ldev; - void __iomem *mapbase; - struct clk *clk; - struct platform_device *pdev; - enum r_tpu_pin pin_state; - enum r_tpu_timer timer_state; - unsigned long min_rate; - unsigned int refresh_rate; - struct work_struct work; - enum led_brightness new_brightness; -}; - -static DEFINE_SPINLOCK(r_tpu_lock); - -#define TSTR -1 /* Timer start register (shared register) */ -#define TCR 0 /* Timer control register (+0x00) */ -#define TMDR 1 /* Timer mode register (+0x04) */ -#define TIOR 2 /* Timer I/O control register (+0x08) */ -#define TIER 3 /* Timer interrupt enable register (+0x0c) */ -#define TSR 4 /* Timer status register (+0x10) */ -#define TCNT 5 /* Timer counter (+0x14) */ -#define TGRA 6 /* Timer general register A (+0x18) */ -#define TGRB 7 /* Timer general register B (+0x1c) */ -#define TGRC 8 /* Timer general register C (+0x20) */ -#define TGRD 9 /* Timer general register D (+0x24) */ - -static inline unsigned short r_tpu_read(struct r_tpu_priv *p, int reg_nr) -{ - struct led_renesas_tpu_config *cfg = p->pdev->dev.platform_data; - void __iomem *base = p->mapbase; - unsigned long offs = reg_nr << 2; - - if (reg_nr == TSTR) - return ioread16(base - cfg->channel_offset); - - return ioread16(base + offs); -} - -static inline void r_tpu_write(struct r_tpu_priv *p, int reg_nr, - unsigned short value) -{ - struct led_renesas_tpu_config *cfg = p->pdev->dev.platform_data; - void __iomem *base = p->mapbase; - unsigned long offs = reg_nr << 2; - - if (reg_nr == TSTR) { - iowrite16(value, base - cfg->channel_offset); - return; - } - - iowrite16(value, base + offs); -} - -static void r_tpu_start_stop_ch(struct r_tpu_priv *p, int start) -{ - struct led_renesas_tpu_config *cfg = p->pdev->dev.platform_data; - unsigned long flags, value; - - /* start stop register shared by multiple timer channels */ - spin_lock_irqsave(&r_tpu_lock, flags); - value = r_tpu_read(p, TSTR); - - if (start) - value |= 1 << cfg->timer_bit; - else - value &= ~(1 << cfg->timer_bit); - - r_tpu_write(p, TSTR, value); - spin_unlock_irqrestore(&r_tpu_lock, flags); -} - -static int r_tpu_enable(struct r_tpu_priv *p, enum led_brightness brightness) -{ - struct led_renesas_tpu_config *cfg = p->pdev->dev.platform_data; - int prescaler[] = { 1, 4, 16, 64 }; - int k, ret; - unsigned long rate, tmp; - - if (p->timer_state == R_TPU_TIMER_ON) - return 0; - - /* wake up device and enable clock */ - pm_runtime_get_sync(&p->pdev->dev); - ret = clk_enable(p->clk); - if (ret) { - dev_err(&p->pdev->dev, "cannot enable clock\n"); - return ret; - } - - /* make sure channel is disabled */ - r_tpu_start_stop_ch(p, 0); - - /* get clock rate after enabling it */ - rate = clk_get_rate(p->clk); - - /* pick the lowest acceptable rate */ - for (k = 0; k < ARRAY_SIZE(prescaler); k++) - if ((rate / prescaler[k]) < p->min_rate) - break; - - if (!k) { - dev_err(&p->pdev->dev, "clock rate mismatch\n"); - goto err0; - } - dev_dbg(&p->pdev->dev, "rate = %lu, prescaler %u\n", - rate, prescaler[k - 1]); - - /* clear TCNT on TGRB match, count on rising edge, set prescaler */ - r_tpu_write(p, TCR, 0x0040 | (k - 1)); - - /* output 0 until TGRA, output 1 until TGRB */ - r_tpu_write(p, TIOR, 0x0002); - - rate /= prescaler[k - 1] * p->refresh_rate; - r_tpu_write(p, TGRB, rate); - dev_dbg(&p->pdev->dev, "TRGB = 0x%04lx\n", rate); - - tmp = (cfg->max_brightness - brightness) * rate; - r_tpu_write(p, TGRA, tmp / cfg->max_brightness); - dev_dbg(&p->pdev->dev, "TRGA = 0x%04lx\n", tmp / cfg->max_brightness); - - /* PWM mode */ - r_tpu_write(p, TMDR, 0x0002); - - /* enable channel */ - r_tpu_start_stop_ch(p, 1); - - p->timer_state = R_TPU_TIMER_ON; - return 0; - err0: - clk_disable(p->clk); - pm_runtime_put_sync(&p->pdev->dev); - return -ENOTSUPP; -} - -static void r_tpu_disable(struct r_tpu_priv *p) -{ - if (p->timer_state == R_TPU_TIMER_UNUSED) - return; - - /* disable channel */ - r_tpu_start_stop_ch(p, 0); - - /* stop clock and mark device as idle */ - clk_disable(p->clk); - pm_runtime_put_sync(&p->pdev->dev); - - p->timer_state = R_TPU_TIMER_UNUSED; -} - -static void r_tpu_set_pin(struct r_tpu_priv *p, enum r_tpu_pin new_state, - enum led_brightness brightness) -{ - struct led_renesas_tpu_config *cfg = p->pdev->dev.platform_data; - - if (p->pin_state == new_state) { - if (p->pin_state == R_TPU_PIN_GPIO) - gpio_set_value(cfg->pin_gpio, brightness); - return; - } - - if (p->pin_state == R_TPU_PIN_GPIO) - gpio_free(cfg->pin_gpio); - - if (p->pin_state == R_TPU_PIN_GPIO_FN) - gpio_free(cfg->pin_gpio_fn); - - if (new_state == R_TPU_PIN_GPIO) { - gpio_request(cfg->pin_gpio, cfg->name); - gpio_direction_output(cfg->pin_gpio, !!brightness); - } - if (new_state == R_TPU_PIN_GPIO_FN) - gpio_request(cfg->pin_gpio_fn, cfg->name); - - p->pin_state = new_state; -} - -static void r_tpu_work(struct work_struct *work) -{ - struct r_tpu_priv *p = container_of(work, struct r_tpu_priv, work); - enum led_brightness brightness = p->new_brightness; - - r_tpu_disable(p); - - /* off and maximum are handled as GPIO pins, in between PWM */ - if ((brightness == 0) || (brightness == p->ldev.max_brightness)) - r_tpu_set_pin(p, R_TPU_PIN_GPIO, brightness); - else { - r_tpu_set_pin(p, R_TPU_PIN_GPIO_FN, 0); - r_tpu_enable(p, brightness); - } -} - -static void r_tpu_set_brightness(struct led_classdev *ldev, - enum led_brightness brightness) -{ - struct r_tpu_priv *p = container_of(ldev, struct r_tpu_priv, ldev); - p->new_brightness = brightness; - schedule_work(&p->work); -} - -static int __devinit r_tpu_probe(struct platform_device *pdev) -{ - struct led_renesas_tpu_config *cfg = pdev->dev.platform_data; - struct r_tpu_priv *p; - struct resource *res; - int ret = -ENXIO; - - if (!cfg) { - dev_err(&pdev->dev, "missing platform data\n"); - goto err0; - } - - p = kzalloc(sizeof(*p), GFP_KERNEL); - if (p == NULL) { - dev_err(&pdev->dev, "failed to allocate driver data\n"); - ret = -ENOMEM; - goto err0; - } - - res = platform_get_resource(pdev, IORESOURCE_MEM, 0); - if (!res) { - dev_err(&pdev->dev, "failed to get I/O memory\n"); - goto err1; - } - - /* map memory, let mapbase point to our channel */ - p->mapbase = ioremap_nocache(res->start, resource_size(res)); - if (p->mapbase == NULL) { - dev_err(&pdev->dev, "failed to remap I/O memory\n"); - goto err1; - } - - /* get hold of clock */ - p->clk = clk_get(&pdev->dev, NULL); - if (IS_ERR(p->clk)) { - dev_err(&pdev->dev, "cannot get clock\n"); - ret = PTR_ERR(p->clk); - goto err2; - } - - p->pdev = pdev; - p->pin_state = R_TPU_PIN_UNUSED; - p->timer_state = R_TPU_TIMER_UNUSED; - p->refresh_rate = cfg->refresh_rate ? cfg->refresh_rate : 100; - r_tpu_set_pin(p, R_TPU_PIN_GPIO, LED_OFF); - platform_set_drvdata(pdev, p); - - INIT_WORK(&p->work, r_tpu_work); - - p->ldev.name = cfg->name; - p->ldev.brightness = LED_OFF; - p->ldev.max_brightness = cfg->max_brightness; - p->ldev.brightness_set = r_tpu_set_brightness; - p->ldev.flags |= LED_CORE_SUSPENDRESUME; - ret = led_classdev_register(&pdev->dev, &p->ldev); - if (ret < 0) - goto err3; - - /* max_brightness may be updated by the LED core code */ - p->min_rate = p->ldev.max_brightness * p->refresh_rate; - - pm_runtime_enable(&pdev->dev); - return 0; - - err3: - r_tpu_set_pin(p, R_TPU_PIN_UNUSED, LED_OFF); - clk_put(p->clk); - err2: - iounmap(p->mapbase); - err1: - kfree(p); - err0: - return ret; -} - -static int __devexit r_tpu_remove(struct platform_device *pdev) -{ - struct r_tpu_priv *p = platform_get_drvdata(pdev); - - r_tpu_set_brightness(&p->ldev, LED_OFF); - led_classdev_unregister(&p->ldev); - cancel_work_sync(&p->work); - r_tpu_disable(p); - r_tpu_set_pin(p, R_TPU_PIN_UNUSED, LED_OFF); - - pm_runtime_disable(&pdev->dev); - clk_put(p->clk); - - iounmap(p->mapbase); - kfree(p); - return 0; -} - -static struct platform_driver r_tpu_device_driver = { - .probe = r_tpu_probe, - .remove = __devexit_p(r_tpu_remove), - .driver = { - .name = "leds-renesas-tpu", - } -}; - -module_platform_driver(r_tpu_device_driver); - -MODULE_AUTHOR("Magnus Damm"); -MODULE_DESCRIPTION("Renesas TPU LED Driver"); -MODULE_LICENSE("GPL v2"); diff --git a/ANDROID_3.4.5/drivers/leds/leds-s3c24xx.c b/ANDROID_3.4.5/drivers/leds/leds-s3c24xx.c deleted file mode 100644 index bd0a5ed4..00000000 --- a/ANDROID_3.4.5/drivers/leds/leds-s3c24xx.c +++ /dev/null @@ -1,129 +0,0 @@ -/* drivers/leds/leds-s3c24xx.c - * - * (c) 2006 Simtec Electronics - * http://armlinux.simtec.co.uk/ - * Ben Dooks <ben@simtec.co.uk> - * - * S3C24XX - LEDs GPIO driver - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. -*/ - -#include <linux/kernel.h> -#include <linux/init.h> -#include <linux/platform_device.h> -#include <linux/leds.h> -#include <linux/gpio.h> -#include <linux/slab.h> -#include <linux/module.h> - -#include <mach/hardware.h> -#include <mach/regs-gpio.h> -#include <mach/leds-gpio.h> - -/* our context */ - -struct s3c24xx_gpio_led { - struct led_classdev cdev; - struct s3c24xx_led_platdata *pdata; -}; - -static inline struct s3c24xx_gpio_led *pdev_to_gpio(struct platform_device *dev) -{ - return platform_get_drvdata(dev); -} - -static inline struct s3c24xx_gpio_led *to_gpio(struct led_classdev *led_cdev) -{ - return container_of(led_cdev, struct s3c24xx_gpio_led, cdev); -} - -static void s3c24xx_led_set(struct led_classdev *led_cdev, - enum led_brightness value) -{ - struct s3c24xx_gpio_led *led = to_gpio(led_cdev); - struct s3c24xx_led_platdata *pd = led->pdata; - - /* there will be a short delay between setting the output and - * going from output to input when using tristate. */ - - s3c2410_gpio_setpin(pd->gpio, (value ? 1 : 0) ^ - (pd->flags & S3C24XX_LEDF_ACTLOW)); - - if (pd->flags & S3C24XX_LEDF_TRISTATE) - s3c2410_gpio_cfgpin(pd->gpio, - value ? S3C2410_GPIO_OUTPUT : S3C2410_GPIO_INPUT); - -} - -static int s3c24xx_led_remove(struct platform_device *dev) -{ - struct s3c24xx_gpio_led *led = pdev_to_gpio(dev); - - led_classdev_unregister(&led->cdev); - kfree(led); - - return 0; -} - -static int s3c24xx_led_probe(struct platform_device *dev) -{ - struct s3c24xx_led_platdata *pdata = dev->dev.platform_data; - struct s3c24xx_gpio_led *led; - int ret; - - led = kzalloc(sizeof(struct s3c24xx_gpio_led), GFP_KERNEL); - if (led == NULL) { - dev_err(&dev->dev, "No memory for device\n"); - return -ENOMEM; - } - - platform_set_drvdata(dev, led); - - led->cdev.brightness_set = s3c24xx_led_set; - led->cdev.default_trigger = pdata->def_trigger; - led->cdev.name = pdata->name; - led->cdev.flags |= LED_CORE_SUSPENDRESUME; - - led->pdata = pdata; - - /* no point in having a pull-up if we are always driving */ - - if (pdata->flags & S3C24XX_LEDF_TRISTATE) { - s3c2410_gpio_setpin(pdata->gpio, 0); - s3c2410_gpio_cfgpin(pdata->gpio, S3C2410_GPIO_INPUT); - } else { - s3c2410_gpio_pullup(pdata->gpio, 0); - s3c2410_gpio_setpin(pdata->gpio, 0); - s3c2410_gpio_cfgpin(pdata->gpio, S3C2410_GPIO_OUTPUT); - } - - /* register our new led device */ - - ret = led_classdev_register(&dev->dev, &led->cdev); - if (ret < 0) { - dev_err(&dev->dev, "led_classdev_register failed\n"); - kfree(led); - return ret; - } - - return 0; -} - -static struct platform_driver s3c24xx_led_driver = { - .probe = s3c24xx_led_probe, - .remove = s3c24xx_led_remove, - .driver = { - .name = "s3c24xx_led", - .owner = THIS_MODULE, - }, -}; - -module_platform_driver(s3c24xx_led_driver); - -MODULE_AUTHOR("Ben Dooks <ben@simtec.co.uk>"); -MODULE_DESCRIPTION("S3C24XX LED driver"); -MODULE_LICENSE("GPL"); -MODULE_ALIAS("platform:s3c24xx_led"); diff --git a/ANDROID_3.4.5/drivers/leds/leds-ss4200.c b/ANDROID_3.4.5/drivers/leds/leds-ss4200.c deleted file mode 100644 index 57371e14..00000000 --- a/ANDROID_3.4.5/drivers/leds/leds-ss4200.c +++ /dev/null @@ -1,557 +0,0 @@ -/* - * SS4200-E Hardware API - * Copyright (c) 2009, Intel Corporation. - * Copyright IBM Corporation, 2009 - * - * This program is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - * - * Author: Dave Hansen <dave@sr71.net> - */ - -#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt - -#include <linux/dmi.h> -#include <linux/init.h> -#include <linux/ioport.h> -#include <linux/kernel.h> -#include <linux/leds.h> -#include <linux/module.h> -#include <linux/pci.h> -#include <linux/types.h> -#include <linux/uaccess.h> - -MODULE_AUTHOR("Rodney Girod <rgirod@confocus.com>, Dave Hansen <dave@sr71.net>"); -MODULE_DESCRIPTION("Intel NAS/Home Server ICH7 GPIO Driver"); -MODULE_LICENSE("GPL"); - -/* - * ICH7 LPC/GPIO PCI Config register offsets - */ -#define PMBASE 0x040 -#define GPIO_BASE 0x048 -#define GPIO_CTRL 0x04c -#define GPIO_EN 0x010 - -/* - * The ICH7 GPIO register block is 64 bytes in size. - */ -#define ICH7_GPIO_SIZE 64 - -/* - * Define register offsets within the ICH7 register block. - */ -#define GPIO_USE_SEL 0x000 -#define GP_IO_SEL 0x004 -#define GP_LVL 0x00c -#define GPO_BLINK 0x018 -#define GPI_INV 0x030 -#define GPIO_USE_SEL2 0x034 -#define GP_IO_SEL2 0x038 -#define GP_LVL2 0x03c - -/* - * PCI ID of the Intel ICH7 LPC Device within which the GPIO block lives. - */ -static const struct pci_device_id ich7_lpc_pci_id[] = -{ - { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH7_0) }, - { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH7_1) }, - { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH7_30) }, - { } /* NULL entry */ -}; - -MODULE_DEVICE_TABLE(pci, ich7_lpc_pci_id); - -static int __init ss4200_led_dmi_callback(const struct dmi_system_id *id) -{ - pr_info("detected '%s'\n", id->ident); - return 1; -} - -static bool __initdata nodetect; -module_param_named(nodetect, nodetect, bool, 0); -MODULE_PARM_DESC(nodetect, "Skip DMI-based hardware detection"); - -/* - * struct nas_led_whitelist - List of known good models - * - * Contains the known good models this driver is compatible with. - * When adding a new model try to be as strict as possible. This - * makes it possible to keep the false positives (the model is - * detected as working, but in reality it is not) as low as - * possible. - */ -static struct dmi_system_id __initdata nas_led_whitelist[] = { - { - .callback = ss4200_led_dmi_callback, - .ident = "Intel SS4200-E", - .matches = { - DMI_MATCH(DMI_SYS_VENDOR, "Intel"), - DMI_MATCH(DMI_PRODUCT_NAME, "SS4200-E"), - DMI_MATCH(DMI_PRODUCT_VERSION, "1.00.00") - } - }, - {} -}; - -/* - * Base I/O address assigned to the Power Management register block - */ -static u32 g_pm_io_base; - -/* - * Base I/O address assigned to the ICH7 GPIO register block - */ -static u32 nas_gpio_io_base; - -/* - * When we successfully register a region, we are returned a resource. - * We use these to identify which regions we need to release on our way - * back out. - */ -static struct resource *gp_gpio_resource; - -struct nasgpio_led { - char *name; - u32 gpio_bit; - struct led_classdev led_cdev; -}; - -/* - * gpio_bit(s) are the ICH7 GPIO bit assignments - */ -static struct nasgpio_led nasgpio_leds[] = { - { .name = "hdd1:blue:sata", .gpio_bit = 0 }, - { .name = "hdd1:amber:sata", .gpio_bit = 1 }, - { .name = "hdd2:blue:sata", .gpio_bit = 2 }, - { .name = "hdd2:amber:sata", .gpio_bit = 3 }, - { .name = "hdd3:blue:sata", .gpio_bit = 4 }, - { .name = "hdd3:amber:sata", .gpio_bit = 5 }, - { .name = "hdd4:blue:sata", .gpio_bit = 6 }, - { .name = "hdd4:amber:sata", .gpio_bit = 7 }, - { .name = "power:blue:power", .gpio_bit = 27}, - { .name = "power:amber:power", .gpio_bit = 28}, -}; - -#define NAS_RECOVERY 0x00000400 /* GPIO10 */ - -static struct nasgpio_led * -led_classdev_to_nasgpio_led(struct led_classdev *led_cdev) -{ - return container_of(led_cdev, struct nasgpio_led, led_cdev); -} - -static struct nasgpio_led *get_led_named(char *name) -{ - int i; - for (i = 0; i < ARRAY_SIZE(nasgpio_leds); i++) { - if (strcmp(nasgpio_leds[i].name, name)) - continue; - return &nasgpio_leds[i]; - } - return NULL; -} - -/* - * This protects access to the gpio ports. - */ -static DEFINE_SPINLOCK(nasgpio_gpio_lock); - -/* - * There are two gpio ports, one for blinking and the other - * for power. @port tells us if we're doing blinking or - * power control. - * - * Caller must hold nasgpio_gpio_lock - */ -static void __nasgpio_led_set_attr(struct led_classdev *led_cdev, - u32 port, u32 value) -{ - struct nasgpio_led *led = led_classdev_to_nasgpio_led(led_cdev); - u32 gpio_out; - - gpio_out = inl(nas_gpio_io_base + port); - if (value) - gpio_out |= (1<<led->gpio_bit); - else - gpio_out &= ~(1<<led->gpio_bit); - - outl(gpio_out, nas_gpio_io_base + port); -} - -static void nasgpio_led_set_attr(struct led_classdev *led_cdev, - u32 port, u32 value) -{ - spin_lock(&nasgpio_gpio_lock); - __nasgpio_led_set_attr(led_cdev, port, value); - spin_unlock(&nasgpio_gpio_lock); -} - -u32 nasgpio_led_get_attr(struct led_classdev *led_cdev, u32 port) -{ - struct nasgpio_led *led = led_classdev_to_nasgpio_led(led_cdev); - u32 gpio_in; - - spin_lock(&nasgpio_gpio_lock); - gpio_in = inl(nas_gpio_io_base + port); - spin_unlock(&nasgpio_gpio_lock); - if (gpio_in & (1<<led->gpio_bit)) - return 1; - return 0; -} - -/* - * There is actual brightness control in the hardware, - * but it is via smbus commands and not implemented - * in this driver. - */ -static void nasgpio_led_set_brightness(struct led_classdev *led_cdev, - enum led_brightness brightness) -{ - u32 setting = 0; - if (brightness >= LED_HALF) - setting = 1; - /* - * Hold the lock across both operations. This ensures - * consistency so that both the "turn off blinking" - * and "turn light off" operations complete as a set. - */ - spin_lock(&nasgpio_gpio_lock); - /* - * LED class documentation asks that past blink state - * be disabled when brightness is turned to zero. - */ - if (brightness == 0) - __nasgpio_led_set_attr(led_cdev, GPO_BLINK, 0); - __nasgpio_led_set_attr(led_cdev, GP_LVL, setting); - spin_unlock(&nasgpio_gpio_lock); -} - -static int nasgpio_led_set_blink(struct led_classdev *led_cdev, - unsigned long *delay_on, - unsigned long *delay_off) -{ - u32 setting = 1; - if (!(*delay_on == 0 && *delay_off == 0) && - !(*delay_on == 500 && *delay_off == 500)) - return -EINVAL; - /* - * These are very approximate. - */ - *delay_on = 500; - *delay_off = 500; - - nasgpio_led_set_attr(led_cdev, GPO_BLINK, setting); - - return 0; -} - - -/* - * Initialize the ICH7 GPIO registers for NAS usage. The BIOS should have - * already taken care of this, but we will do so in a non destructive manner - * so that we have what we need whether the BIOS did it or not. - */ -static int __devinit ich7_gpio_init(struct device *dev) -{ - int i; - u32 config_data = 0; - u32 all_nas_led = 0; - - for (i = 0; i < ARRAY_SIZE(nasgpio_leds); i++) - all_nas_led |= (1<<nasgpio_leds[i].gpio_bit); - - spin_lock(&nasgpio_gpio_lock); - /* - * We need to enable all of the GPIO lines used by the NAS box, - * so we will read the current Use Selection and add our usage - * to it. This should be benign with regard to the original - * BIOS configuration. - */ - config_data = inl(nas_gpio_io_base + GPIO_USE_SEL); - dev_dbg(dev, ": Data read from GPIO_USE_SEL = 0x%08x\n", config_data); - config_data |= all_nas_led + NAS_RECOVERY; - outl(config_data, nas_gpio_io_base + GPIO_USE_SEL); - config_data = inl(nas_gpio_io_base + GPIO_USE_SEL); - dev_dbg(dev, ": GPIO_USE_SEL = 0x%08x\n\n", config_data); - - /* - * The LED GPIO outputs need to be configured for output, so we - * will ensure that all LED lines are cleared for output and the - * RECOVERY line ready for input. This too should be benign with - * regard to BIOS configuration. - */ - config_data = inl(nas_gpio_io_base + GP_IO_SEL); - dev_dbg(dev, ": Data read from GP_IO_SEL = 0x%08x\n", - config_data); - config_data &= ~all_nas_led; - config_data |= NAS_RECOVERY; - outl(config_data, nas_gpio_io_base + GP_IO_SEL); - config_data = inl(nas_gpio_io_base + GP_IO_SEL); - dev_dbg(dev, ": GP_IO_SEL = 0x%08x\n", config_data); - - /* - * In our final system, the BIOS will initialize the state of all - * of the LEDs. For now, we turn them all off (or Low). - */ - config_data = inl(nas_gpio_io_base + GP_LVL); - dev_dbg(dev, ": Data read from GP_LVL = 0x%08x\n", config_data); - /* - * In our final system, the BIOS will initialize the blink state of all - * of the LEDs. For now, we turn blink off for all of them. - */ - config_data = inl(nas_gpio_io_base + GPO_BLINK); - dev_dbg(dev, ": Data read from GPO_BLINK = 0x%08x\n", config_data); - - /* - * At this moment, I am unsure if anything needs to happen with GPI_INV - */ - config_data = inl(nas_gpio_io_base + GPI_INV); - dev_dbg(dev, ": Data read from GPI_INV = 0x%08x\n", config_data); - - spin_unlock(&nasgpio_gpio_lock); - return 0; -} - -static void ich7_lpc_cleanup(struct device *dev) -{ - /* - * If we were given exclusive use of the GPIO - * I/O Address range, we must return it. - */ - if (gp_gpio_resource) { - dev_dbg(dev, ": Releasing GPIO I/O addresses\n"); - release_region(nas_gpio_io_base, ICH7_GPIO_SIZE); - gp_gpio_resource = NULL; - } -} - -/* - * The OS has determined that the LPC of the Intel ICH7 Southbridge is present - * so we can retrive the required operational information and prepare the GPIO. - */ -static struct pci_dev *nas_gpio_pci_dev; -static int __devinit ich7_lpc_probe(struct pci_dev *dev, - const struct pci_device_id *id) -{ - int status; - u32 gc = 0; - - status = pci_enable_device(dev); - if (status) { - dev_err(&dev->dev, "pci_enable_device failed\n"); - return -EIO; - } - - nas_gpio_pci_dev = dev; - status = pci_read_config_dword(dev, PMBASE, &g_pm_io_base); - if (status) - goto out; - g_pm_io_base &= 0x00000ff80; - - status = pci_read_config_dword(dev, GPIO_CTRL, &gc); - if (!(GPIO_EN & gc)) { - status = -EEXIST; - dev_info(&dev->dev, - "ERROR: The LPC GPIO Block has not been enabled.\n"); - goto out; - } - - status = pci_read_config_dword(dev, GPIO_BASE, &nas_gpio_io_base); - if (0 > status) { - dev_info(&dev->dev, "Unable to read GPIOBASE.\n"); - goto out; - } - dev_dbg(&dev->dev, ": GPIOBASE = 0x%08x\n", nas_gpio_io_base); - nas_gpio_io_base &= 0x00000ffc0; - - /* - * Insure that we have exclusive access to the GPIO I/O address range. - */ - gp_gpio_resource = request_region(nas_gpio_io_base, ICH7_GPIO_SIZE, - KBUILD_MODNAME); - if (NULL == gp_gpio_resource) { - dev_info(&dev->dev, - "ERROR Unable to register GPIO I/O addresses.\n"); - status = -1; - goto out; - } - - /* - * Initialize the GPIO for NAS/Home Server Use - */ - ich7_gpio_init(&dev->dev); - -out: - if (status) { - ich7_lpc_cleanup(&dev->dev); - pci_disable_device(dev); - } - return status; -} - -static void ich7_lpc_remove(struct pci_dev *dev) -{ - ich7_lpc_cleanup(&dev->dev); - pci_disable_device(dev); -} - -/* - * pci_driver structure passed to the PCI modules - */ -static struct pci_driver nas_gpio_pci_driver = { - .name = KBUILD_MODNAME, - .id_table = ich7_lpc_pci_id, - .probe = ich7_lpc_probe, - .remove = ich7_lpc_remove, -}; - -static struct led_classdev *get_classdev_for_led_nr(int nr) -{ - struct nasgpio_led *nas_led = &nasgpio_leds[nr]; - struct led_classdev *led = &nas_led->led_cdev; - return led; -} - - -static void set_power_light_amber_noblink(void) -{ - struct nasgpio_led *amber = get_led_named("power:amber:power"); - struct nasgpio_led *blue = get_led_named("power:blue:power"); - - if (!amber || !blue) - return; - /* - * LED_OFF implies disabling future blinking - */ - pr_debug("setting blue off and amber on\n"); - - nasgpio_led_set_brightness(&blue->led_cdev, LED_OFF); - nasgpio_led_set_brightness(&amber->led_cdev, LED_FULL); -} - -static ssize_t nas_led_blink_show(struct device *dev, - struct device_attribute *attr, char *buf) -{ - struct led_classdev *led = dev_get_drvdata(dev); - int blinking = 0; - if (nasgpio_led_get_attr(led, GPO_BLINK)) - blinking = 1; - return sprintf(buf, "%u\n", blinking); -} - -static ssize_t nas_led_blink_store(struct device *dev, - struct device_attribute *attr, - const char *buf, size_t size) -{ - int ret; - struct led_classdev *led = dev_get_drvdata(dev); - unsigned long blink_state; - - ret = strict_strtoul(buf, 10, &blink_state); - if (ret) - return ret; - - nasgpio_led_set_attr(led, GPO_BLINK, blink_state); - - return size; -} - -static DEVICE_ATTR(blink, 0644, nas_led_blink_show, nas_led_blink_store); - -static int register_nasgpio_led(int led_nr) -{ - int ret; - struct nasgpio_led *nas_led = &nasgpio_leds[led_nr]; - struct led_classdev *led = get_classdev_for_led_nr(led_nr); - - led->name = nas_led->name; - led->brightness = LED_OFF; - if (nasgpio_led_get_attr(led, GP_LVL)) - led->brightness = LED_FULL; - led->brightness_set = nasgpio_led_set_brightness; - led->blink_set = nasgpio_led_set_blink; - ret = led_classdev_register(&nas_gpio_pci_dev->dev, led); - if (ret) - return ret; - ret = device_create_file(led->dev, &dev_attr_blink); - if (ret) - led_classdev_unregister(led); - return ret; -} - -static void unregister_nasgpio_led(int led_nr) -{ - struct led_classdev *led = get_classdev_for_led_nr(led_nr); - led_classdev_unregister(led); - device_remove_file(led->dev, &dev_attr_blink); -} -/* - * module load/initialization - */ -static int __init nas_gpio_init(void) -{ - int i; - int ret = 0; - int nr_devices = 0; - - nr_devices = dmi_check_system(nas_led_whitelist); - if (nodetect) { - pr_info("skipping hardware autodetection\n"); - pr_info("Please send 'dmidecode' output to dave@sr71.net\n"); - nr_devices++; - } - - if (nr_devices <= 0) { - pr_info("no LED devices found\n"); - return -ENODEV; - } - - pr_info("registering PCI driver\n"); - ret = pci_register_driver(&nas_gpio_pci_driver); - if (ret) - return ret; - for (i = 0; i < ARRAY_SIZE(nasgpio_leds); i++) { - ret = register_nasgpio_led(i); - if (ret) - goto out_err; - } - /* - * When the system powers on, the BIOS leaves the power - * light blue and blinking. This will turn it solid - * amber once the driver is loaded. - */ - set_power_light_amber_noblink(); - return 0; -out_err: - for (i--; i >= 0; i--) - unregister_nasgpio_led(i); - pci_unregister_driver(&nas_gpio_pci_driver); - return ret; -} - -/* - * module unload - */ -static void __exit nas_gpio_exit(void) -{ - int i; - pr_info("Unregistering driver\n"); - for (i = 0; i < ARRAY_SIZE(nasgpio_leds); i++) - unregister_nasgpio_led(i); - pci_unregister_driver(&nas_gpio_pci_driver); -} - -module_init(nas_gpio_init); -module_exit(nas_gpio_exit); diff --git a/ANDROID_3.4.5/drivers/leds/leds-sunfire.c b/ANDROID_3.4.5/drivers/leds/leds-sunfire.c deleted file mode 100644 index 1757396b..00000000 --- a/ANDROID_3.4.5/drivers/leds/leds-sunfire.c +++ /dev/null @@ -1,276 +0,0 @@ -/* leds-sunfire.c: SUNW,Ultra-Enterprise LED driver. - * - * Copyright (C) 2008 David S. Miller <davem@davemloft.net> - */ - -#include <linux/kernel.h> -#include <linux/module.h> -#include <linux/init.h> -#include <linux/leds.h> -#include <linux/io.h> -#include <linux/platform_device.h> -#include <linux/slab.h> - -#include <asm/fhc.h> -#include <asm/upa.h> - -#define DRIVER_NAME "leds-sunfire" -#define PFX DRIVER_NAME ": " - -MODULE_AUTHOR("David S. Miller (davem@davemloft.net)"); -MODULE_DESCRIPTION("Sun Fire LED driver"); -MODULE_LICENSE("GPL"); - -struct sunfire_led { - struct led_classdev led_cdev; - void __iomem *reg; -}; -#define to_sunfire_led(d) container_of(d, struct sunfire_led, led_cdev) - -static void __clockboard_set(struct led_classdev *led_cdev, - enum led_brightness led_val, u8 bit) -{ - struct sunfire_led *p = to_sunfire_led(led_cdev); - u8 reg = upa_readb(p->reg); - - switch (bit) { - case CLOCK_CTRL_LLED: - if (led_val) - reg &= ~bit; - else - reg |= bit; - break; - - default: - if (led_val) - reg |= bit; - else - reg &= ~bit; - break; - } - upa_writeb(reg, p->reg); -} - -static void clockboard_left_set(struct led_classdev *led_cdev, - enum led_brightness led_val) -{ - __clockboard_set(led_cdev, led_val, CLOCK_CTRL_LLED); -} - -static void clockboard_middle_set(struct led_classdev *led_cdev, - enum led_brightness led_val) -{ - __clockboard_set(led_cdev, led_val, CLOCK_CTRL_MLED); -} - -static void clockboard_right_set(struct led_classdev *led_cdev, - enum led_brightness led_val) -{ - __clockboard_set(led_cdev, led_val, CLOCK_CTRL_RLED); -} - -static void __fhc_set(struct led_classdev *led_cdev, - enum led_brightness led_val, u32 bit) -{ - struct sunfire_led *p = to_sunfire_led(led_cdev); - u32 reg = upa_readl(p->reg); - - switch (bit) { - case FHC_CONTROL_LLED: - if (led_val) - reg &= ~bit; - else - reg |= bit; - break; - - default: - if (led_val) - reg |= bit; - else - reg &= ~bit; - break; - } - upa_writel(reg, p->reg); -} - -static void fhc_left_set(struct led_classdev *led_cdev, - enum led_brightness led_val) -{ - __fhc_set(led_cdev, led_val, FHC_CONTROL_LLED); -} - -static void fhc_middle_set(struct led_classdev *led_cdev, - enum led_brightness led_val) -{ - __fhc_set(led_cdev, led_val, FHC_CONTROL_MLED); -} - -static void fhc_right_set(struct led_classdev *led_cdev, - enum led_brightness led_val) -{ - __fhc_set(led_cdev, led_val, FHC_CONTROL_RLED); -} - -typedef void (*set_handler)(struct led_classdev *, enum led_brightness); -struct led_type { - const char *name; - set_handler handler; - const char *default_trigger; -}; - -#define NUM_LEDS_PER_BOARD 3 -struct sunfire_drvdata { - struct sunfire_led leds[NUM_LEDS_PER_BOARD]; -}; - -static int __devinit sunfire_led_generic_probe(struct platform_device *pdev, - struct led_type *types) -{ - struct sunfire_drvdata *p; - int i, err; - - if (pdev->num_resources != 1) { - printk(KERN_ERR PFX "Wrong number of resources %d, should be 1\n", - pdev->num_resources); - err = -EINVAL; - goto out; - } - - p = kzalloc(sizeof(*p), GFP_KERNEL); - if (!p) { - printk(KERN_ERR PFX "Could not allocate struct sunfire_drvdata\n"); - err = -ENOMEM; - goto out; - } - - for (i = 0; i < NUM_LEDS_PER_BOARD; i++) { - struct led_classdev *lp = &p->leds[i].led_cdev; - - p->leds[i].reg = (void __iomem *) pdev->resource[0].start; - lp->name = types[i].name; - lp->brightness = LED_FULL; - lp->brightness_set = types[i].handler; - lp->default_trigger = types[i].default_trigger; - - err = led_classdev_register(&pdev->dev, lp); - if (err) { - printk(KERN_ERR PFX "Could not register %s LED\n", - lp->name); - goto out_unregister_led_cdevs; - } - } - - dev_set_drvdata(&pdev->dev, p); - - return 0; - -out_unregister_led_cdevs: - for (i--; i >= 0; i--) - led_classdev_unregister(&p->leds[i].led_cdev); - kfree(p); -out: - return err; -} - -static int __devexit sunfire_led_generic_remove(struct platform_device *pdev) -{ - struct sunfire_drvdata *p = dev_get_drvdata(&pdev->dev); - int i; - - for (i = 0; i < NUM_LEDS_PER_BOARD; i++) - led_classdev_unregister(&p->leds[i].led_cdev); - - kfree(p); - - return 0; -} - -static struct led_type clockboard_led_types[NUM_LEDS_PER_BOARD] = { - { - .name = "clockboard-left", - .handler = clockboard_left_set, - }, - { - .name = "clockboard-middle", - .handler = clockboard_middle_set, - }, - { - .name = "clockboard-right", - .handler = clockboard_right_set, - .default_trigger= "heartbeat", - }, -}; - -static int __devinit sunfire_clockboard_led_probe(struct platform_device *pdev) -{ - return sunfire_led_generic_probe(pdev, clockboard_led_types); -} - -static struct led_type fhc_led_types[NUM_LEDS_PER_BOARD] = { - { - .name = "fhc-left", - .handler = fhc_left_set, - }, - { - .name = "fhc-middle", - .handler = fhc_middle_set, - }, - { - .name = "fhc-right", - .handler = fhc_right_set, - .default_trigger= "heartbeat", - }, -}; - -static int __devinit sunfire_fhc_led_probe(struct platform_device *pdev) -{ - return sunfire_led_generic_probe(pdev, fhc_led_types); -} - -MODULE_ALIAS("platform:sunfire-clockboard-leds"); -MODULE_ALIAS("platform:sunfire-fhc-leds"); - -static struct platform_driver sunfire_clockboard_led_driver = { - .probe = sunfire_clockboard_led_probe, - .remove = __devexit_p(sunfire_led_generic_remove), - .driver = { - .name = "sunfire-clockboard-leds", - .owner = THIS_MODULE, - }, -}; - -static struct platform_driver sunfire_fhc_led_driver = { - .probe = sunfire_fhc_led_probe, - .remove = __devexit_p(sunfire_led_generic_remove), - .driver = { - .name = "sunfire-fhc-leds", - .owner = THIS_MODULE, - }, -}; - -static int __init sunfire_leds_init(void) -{ - int err = platform_driver_register(&sunfire_clockboard_led_driver); - - if (err) { - printk(KERN_ERR PFX "Could not register clock board LED driver\n"); - return err; - } - - err = platform_driver_register(&sunfire_fhc_led_driver); - if (err) { - printk(KERN_ERR PFX "Could not register FHC LED driver\n"); - platform_driver_unregister(&sunfire_clockboard_led_driver); - } - - return err; -} - -static void __exit sunfire_leds_exit(void) -{ - platform_driver_unregister(&sunfire_clockboard_led_driver); - platform_driver_unregister(&sunfire_fhc_led_driver); -} - -module_init(sunfire_leds_init); -module_exit(sunfire_leds_exit); diff --git a/ANDROID_3.4.5/drivers/leds/leds-tca6507.c b/ANDROID_3.4.5/drivers/leds/leds-tca6507.c deleted file mode 100644 index 6c1c14f3..00000000 --- a/ANDROID_3.4.5/drivers/leds/leds-tca6507.c +++ /dev/null @@ -1,776 +0,0 @@ -/* - * leds-tca6507 - * - * The TCA6507 is a programmable LED controller that can drive 7 - * separate lines either by holding them low, or by pulsing them - * with modulated width. - * The modulation can be varied in a simple pattern to produce a blink or - * double-blink. - * - * This driver can configure each line either as a 'GPIO' which is out-only - * (no pull-up) or as an LED with variable brightness and hardware-assisted - * blinking. - * - * Apart from OFF and ON there are three programmable brightness levels which - * can be programmed from 0 to 15 and indicate how many 500usec intervals in - * each 8msec that the led is 'on'. The levels are named MASTER, BANK0 and - * BANK1. - * - * There are two different blink rates that can be programmed, each with - * separate time for rise, on, fall, off and second-off. Thus if 3 or more - * different non-trivial rates are required, software must be used for the extra - * rates. The two different blink rates must align with the two levels BANK0 and - * BANK1. - * This driver does not support double-blink so 'second-off' always matches - * 'off'. - * - * Only 16 different times can be programmed in a roughly logarithmic scale from - * 64ms to 16320ms. To be precise the possible times are: - * 0, 64, 128, 192, 256, 384, 512, 768, - * 1024, 1536, 2048, 3072, 4096, 5760, 8128, 16320 - * - * Times that cannot be closely matched with these must be - * handled in software. This driver allows 12.5% error in matching. - * - * This driver does not allow rise/fall rates to be set explicitly. When trying - * to match a given 'on' or 'off' period, an appropriate pair of 'change' and - * 'hold' times are chosen to get a close match. If the target delay is even, - * the 'change' number will be the smaller; if odd, the 'hold' number will be - * the smaller. - - * Choosing pairs of delays with 12.5% errors allows us to match delays in the - * ranges: 56-72, 112-144, 168-216, 224-27504, 28560-36720. - * 26% of the achievable sums can be matched by multiple pairings. For example - * 1536 == 1536+0, 1024+512, or 768+768. This driver will always choose the - * pairing with the least maximum - 768+768 in this case. Other pairings are - * not available. - * - * Access to the 3 levels and 2 blinks are on a first-come, first-served basis. - * Access can be shared by multiple leds if they have the same level and - * either same blink rates, or some don't blink. - * When a led changes, it relinquishes access and tries again, so it might - * lose access to hardware blink. - * If a blink engine cannot be allocated, software blink is used. - * If the desired brightness cannot be allocated, the closest available non-zero - * brightness is used. As 'full' is always available, the worst case would be - * to have two different blink rates at '1', with Max at '2', then other leds - * will have to choose between '2' and '16'. Hopefully this is not likely. - * - * Each bank (BANK0 and BANK1) has two usage counts - LEDs using the brightness - * and LEDs using the blink. It can only be reprogrammed when the appropriate - * counter is zero. The MASTER level has a single usage count. - * - * Each Led has programmable 'on' and 'off' time as milliseconds. With each - * there is a flag saying if it was explicitly requested or defaulted. - * Similarly the banks know if each time was explicit or a default. Defaults - * are permitted to be changed freely - they are not recognised when matching. - * - * - * An led-tca6507 device must be provided with platform data. This data - * lists for each output: the name, default trigger, and whether the signal - * is being used as a GPiO rather than an led. 'struct led_plaform_data' - * is used for this. If 'name' is NULL, the output isn't used. If 'flags' - * is TCA6507_MAKE_CPIO, the output is a GPO. - * The "struct led_platform_data" can be embedded in a - * "struct tca6507_platform_data" which adds a 'gpio_base' for the GPiOs, - * and a 'setup' callback which is called once the GPiOs are available. - * - */ - -#include <linux/module.h> -#include <linux/slab.h> -#include <linux/leds.h> -#include <linux/err.h> -#include <linux/i2c.h> -#include <linux/gpio.h> -#include <linux/workqueue.h> -#include <linux/leds-tca6507.h> - -/* LED select registers determine the source that drives LED outputs */ -#define TCA6507_LS_LED_OFF 0x0 /* Output HI-Z (off) */ -#define TCA6507_LS_LED_OFF1 0x1 /* Output HI-Z (off) - not used */ -#define TCA6507_LS_LED_PWM0 0x2 /* Output LOW with Bank0 rate */ -#define TCA6507_LS_LED_PWM1 0x3 /* Output LOW with Bank1 rate */ -#define TCA6507_LS_LED_ON 0x4 /* Output LOW (on) */ -#define TCA6507_LS_LED_MIR 0x5 /* Output LOW with Master Intensity */ -#define TCA6507_LS_BLINK0 0x6 /* Blink at Bank0 rate */ -#define TCA6507_LS_BLINK1 0x7 /* Blink at Bank1 rate */ - -enum { - BANK0, - BANK1, - MASTER, -}; -static int bank_source[3] = { - TCA6507_LS_LED_PWM0, - TCA6507_LS_LED_PWM1, - TCA6507_LS_LED_MIR, -}; -static int blink_source[2] = { - TCA6507_LS_BLINK0, - TCA6507_LS_BLINK1, -}; - -/* PWM registers */ -#define TCA6507_REG_CNT 11 - -/* - * 0x00, 0x01, 0x02 encode the TCA6507_LS_* values, each output - * owns one bit in each register - */ -#define TCA6507_FADE_ON 0x03 -#define TCA6507_FULL_ON 0x04 -#define TCA6507_FADE_OFF 0x05 -#define TCA6507_FIRST_OFF 0x06 -#define TCA6507_SECOND_OFF 0x07 -#define TCA6507_MAX_INTENSITY 0x08 -#define TCA6507_MASTER_INTENSITY 0x09 -#define TCA6507_INITIALIZE 0x0A - -#define INIT_CODE 0x8 - -#define TIMECODES 16 -static int time_codes[TIMECODES] = { - 0, 64, 128, 192, 256, 384, 512, 768, - 1024, 1536, 2048, 3072, 4096, 5760, 8128, 16320 -}; - -/* Convert an led.brightness level (0..255) to a TCA6507 level (0..15) */ -static inline int TO_LEVEL(int brightness) -{ - return brightness >> 4; -} - -/* ...and convert back */ -static inline int TO_BRIGHT(int level) -{ - if (level) - return (level << 4) | 0xf; - return 0; -} - -#define NUM_LEDS 7 -struct tca6507_chip { - int reg_set; /* One bit per register where - * a '1' means the register - * should be written */ - u8 reg_file[TCA6507_REG_CNT]; - /* Bank 2 is Master Intensity and doesn't use times */ - struct bank { - int level; - int ontime, offtime; - int on_dflt, off_dflt; - int time_use, level_use; - } bank[3]; - struct i2c_client *client; - struct work_struct work; - spinlock_t lock; - - struct tca6507_led { - struct tca6507_chip *chip; - struct led_classdev led_cdev; - int num; - int ontime, offtime; - int on_dflt, off_dflt; - int bank; /* Bank used, or -1 */ - int blink; /* Set if hardware-blinking */ - } leds[NUM_LEDS]; -#ifdef CONFIG_GPIOLIB - struct gpio_chip gpio; - const char *gpio_name[NUM_LEDS]; - int gpio_map[NUM_LEDS]; -#endif -}; - -static const struct i2c_device_id tca6507_id[] = { - { "tca6507" }, - { } -}; -MODULE_DEVICE_TABLE(i2c, tca6507_id); - -static int choose_times(int msec, int *c1p, int *c2p) -{ - /* - * Choose two timecodes which add to 'msec' as near as possible. - * The first returned is the 'on' or 'off' time. The second is to be - * used as a 'fade-on' or 'fade-off' time. If 'msec' is even, - * the first will not be smaller than the second. If 'msec' is odd, - * the first will not be larger than the second. - * If we cannot get a sum within 1/8 of 'msec' fail with -EINVAL, - * otherwise return the sum that was achieved, plus 1 if the first is - * smaller. - * If two possibilities are equally good (e.g. 512+0, 256+256), choose - * the first pair so there is more change-time visible (i.e. it is - * softer). - */ - int c1, c2; - int tmax = msec * 9 / 8; - int tmin = msec * 7 / 8; - int diff = 65536; - - /* We start at '1' to ensure we never even think of choosing a - * total time of '0'. - */ - for (c1 = 1; c1 < TIMECODES; c1++) { - int t = time_codes[c1]; - if (t*2 < tmin) - continue; - if (t > tmax) - break; - for (c2 = 0; c2 <= c1; c2++) { - int tt = t + time_codes[c2]; - int d; - if (tt < tmin) - continue; - if (tt > tmax) - break; - /* This works! */ - d = abs(msec - tt); - if (d >= diff) - continue; - /* Best yet */ - *c1p = c1; - *c2p = c2; - diff = d; - if (d == 0) - return msec; - } - } - if (diff < 65536) { - int actual; - if (msec & 1) { - c1 = *c2p; - *c2p = *c1p; - *c1p = c1; - } - actual = time_codes[*c1p] + time_codes[*c2p]; - if (*c1p < *c2p) - return actual + 1; - else - return actual; - } - /* No close match */ - return -EINVAL; -} - -/* - * Update the register file with the appropriate 3-bit state for - * the given led. - */ -static void set_select(struct tca6507_chip *tca, int led, int val) -{ - int mask = (1 << led); - int bit; - - for (bit = 0; bit < 3; bit++) { - int n = tca->reg_file[bit] & ~mask; - if (val & (1 << bit)) - n |= mask; - if (tca->reg_file[bit] != n) { - tca->reg_file[bit] = n; - tca->reg_set |= (1 << bit); - } - } -} - -/* Update the register file with the appropriate 4-bit code for - * one bank or other. This can be used for timers, for levels, or - * for initialisation. - */ -static void set_code(struct tca6507_chip *tca, int reg, int bank, int new) -{ - int mask = 0xF; - int n; - if (bank) { - mask <<= 4; - new <<= 4; - } - n = tca->reg_file[reg] & ~mask; - n |= new; - if (tca->reg_file[reg] != n) { - tca->reg_file[reg] = n; - tca->reg_set |= 1 << reg; - } -} - -/* Update brightness level. */ -static void set_level(struct tca6507_chip *tca, int bank, int level) -{ - switch (bank) { - case BANK0: - case BANK1: - set_code(tca, TCA6507_MAX_INTENSITY, bank, level); - break; - case MASTER: - set_code(tca, TCA6507_MASTER_INTENSITY, 0, level); - break; - } - tca->bank[bank].level = level; -} - -/* Record all relevant time code for a given bank */ -static void set_times(struct tca6507_chip *tca, int bank) -{ - int c1, c2; - int result; - - result = choose_times(tca->bank[bank].ontime, &c1, &c2); - dev_dbg(&tca->client->dev, - "Chose on times %d(%d) %d(%d) for %dms\n", c1, time_codes[c1], - c2, time_codes[c2], tca->bank[bank].ontime); - set_code(tca, TCA6507_FADE_ON, bank, c2); - set_code(tca, TCA6507_FULL_ON, bank, c1); - tca->bank[bank].ontime = result; - - result = choose_times(tca->bank[bank].offtime, &c1, &c2); - dev_dbg(&tca->client->dev, - "Chose off times %d(%d) %d(%d) for %dms\n", c1, time_codes[c1], - c2, time_codes[c2], tca->bank[bank].offtime); - set_code(tca, TCA6507_FADE_OFF, bank, c2); - set_code(tca, TCA6507_FIRST_OFF, bank, c1); - set_code(tca, TCA6507_SECOND_OFF, bank, c1); - tca->bank[bank].offtime = result; - - set_code(tca, TCA6507_INITIALIZE, bank, INIT_CODE); -} - -/* Write all needed register of tca6507 */ - -static void tca6507_work(struct work_struct *work) -{ - struct tca6507_chip *tca = container_of(work, struct tca6507_chip, - work); - struct i2c_client *cl = tca->client; - int set; - u8 file[TCA6507_REG_CNT]; - int r; - - spin_lock_irq(&tca->lock); - set = tca->reg_set; - memcpy(file, tca->reg_file, TCA6507_REG_CNT); - tca->reg_set = 0; - spin_unlock_irq(&tca->lock); - - for (r = 0; r < TCA6507_REG_CNT; r++) - if (set & (1<<r)) - i2c_smbus_write_byte_data(cl, r, file[r]); -} - -static void led_release(struct tca6507_led *led) -{ - /* If led owns any resource, release it. */ - struct tca6507_chip *tca = led->chip; - if (led->bank >= 0) { - struct bank *b = tca->bank + led->bank; - if (led->blink) - b->time_use--; - b->level_use--; - } - led->blink = 0; - led->bank = -1; -} - -static int led_prepare(struct tca6507_led *led) -{ - /* Assign this led to a bank, configuring that bank if necessary. */ - int level = TO_LEVEL(led->led_cdev.brightness); - struct tca6507_chip *tca = led->chip; - int c1, c2; - int i; - struct bank *b; - int need_init = 0; - - led->led_cdev.brightness = TO_BRIGHT(level); - if (level == 0) { - set_select(tca, led->num, TCA6507_LS_LED_OFF); - return 0; - } - - if (led->ontime == 0 || led->offtime == 0) { - /* - * Just set the brightness, choosing first usable bank. - * If none perfect, choose best. - * Count backwards so we check MASTER bank first - * to avoid wasting a timer. - */ - int best = -1;/* full-on */ - int diff = 15-level; - - if (level == 15) { - set_select(tca, led->num, TCA6507_LS_LED_ON); - return 0; - } - - for (i = MASTER; i >= BANK0; i--) { - int d; - if (tca->bank[i].level == level || - tca->bank[i].level_use == 0) { - best = i; - break; - } - d = abs(level - tca->bank[i].level); - if (d < diff) { - diff = d; - best = i; - } - } - if (best == -1) { - /* Best brightness is full-on */ - set_select(tca, led->num, TCA6507_LS_LED_ON); - led->led_cdev.brightness = LED_FULL; - return 0; - } - - if (!tca->bank[best].level_use) - set_level(tca, best, level); - - tca->bank[best].level_use++; - led->bank = best; - set_select(tca, led->num, bank_source[best]); - led->led_cdev.brightness = TO_BRIGHT(tca->bank[best].level); - return 0; - } - - /* - * We have on/off time so we need to try to allocate a timing bank. - * First check if times are compatible with hardware and give up if - * not. - */ - if (choose_times(led->ontime, &c1, &c2) < 0) - return -EINVAL; - if (choose_times(led->offtime, &c1, &c2) < 0) - return -EINVAL; - - for (i = BANK0; i <= BANK1; i++) { - if (tca->bank[i].level_use == 0) - /* not in use - it is ours! */ - break; - if (tca->bank[i].level != level) - /* Incompatible level - skip */ - /* FIX: if timer matches we maybe should consider - * this anyway... - */ - continue; - - if (tca->bank[i].time_use == 0) - /* Timer not in use, and level matches - use it */ - break; - - if (!(tca->bank[i].on_dflt || - led->on_dflt || - tca->bank[i].ontime == led->ontime)) - /* on time is incompatible */ - continue; - - if (!(tca->bank[i].off_dflt || - led->off_dflt || - tca->bank[i].offtime == led->offtime)) - /* off time is incompatible */ - continue; - - /* looks like a suitable match */ - break; - } - - if (i > BANK1) - /* Nothing matches - how sad */ - return -EINVAL; - - b = &tca->bank[i]; - if (b->level_use == 0) - set_level(tca, i, level); - b->level_use++; - led->bank = i; - - if (b->on_dflt || - !led->on_dflt || - b->time_use == 0) { - b->ontime = led->ontime; - b->on_dflt = led->on_dflt; - need_init = 1; - } - - if (b->off_dflt || - !led->off_dflt || - b->time_use == 0) { - b->offtime = led->offtime; - b->off_dflt = led->off_dflt; - need_init = 1; - } - - if (need_init) - set_times(tca, i); - - led->ontime = b->ontime; - led->offtime = b->offtime; - - b->time_use++; - led->blink = 1; - led->led_cdev.brightness = TO_BRIGHT(b->level); - set_select(tca, led->num, blink_source[i]); - return 0; -} - -static int led_assign(struct tca6507_led *led) -{ - struct tca6507_chip *tca = led->chip; - int err; - unsigned long flags; - - spin_lock_irqsave(&tca->lock, flags); - led_release(led); - err = led_prepare(led); - if (err) { - /* - * Can only fail on timer setup. In that case we need to - * re-establish as steady level. - */ - led->ontime = 0; - led->offtime = 0; - led_prepare(led); - } - spin_unlock_irqrestore(&tca->lock, flags); - - if (tca->reg_set) - schedule_work(&tca->work); - return err; -} - -static void tca6507_brightness_set(struct led_classdev *led_cdev, - enum led_brightness brightness) -{ - struct tca6507_led *led = container_of(led_cdev, struct tca6507_led, - led_cdev); - led->led_cdev.brightness = brightness; - led->ontime = 0; - led->offtime = 0; - led_assign(led); -} - -static int tca6507_blink_set(struct led_classdev *led_cdev, - unsigned long *delay_on, - unsigned long *delay_off) -{ - struct tca6507_led *led = container_of(led_cdev, struct tca6507_led, - led_cdev); - - if (*delay_on == 0) - led->on_dflt = 1; - else if (delay_on != &led_cdev->blink_delay_on) - led->on_dflt = 0; - led->ontime = *delay_on; - - if (*delay_off == 0) - led->off_dflt = 1; - else if (delay_off != &led_cdev->blink_delay_off) - led->off_dflt = 0; - led->offtime = *delay_off; - - if (led->ontime == 0) - led->ontime = 512; - if (led->offtime == 0) - led->offtime = 512; - - if (led->led_cdev.brightness == LED_OFF) - led->led_cdev.brightness = LED_FULL; - if (led_assign(led) < 0) { - led->ontime = 0; - led->offtime = 0; - led->led_cdev.brightness = LED_OFF; - return -EINVAL; - } - *delay_on = led->ontime; - *delay_off = led->offtime; - return 0; -} - -#ifdef CONFIG_GPIOLIB -static void tca6507_gpio_set_value(struct gpio_chip *gc, - unsigned offset, int val) -{ - struct tca6507_chip *tca = container_of(gc, struct tca6507_chip, gpio); - unsigned long flags; - - spin_lock_irqsave(&tca->lock, flags); - /* - * 'OFF' is floating high, and 'ON' is pulled down, so it has the - * inverse sense of 'val'. - */ - set_select(tca, tca->gpio_map[offset], - val ? TCA6507_LS_LED_OFF : TCA6507_LS_LED_ON); - spin_unlock_irqrestore(&tca->lock, flags); - if (tca->reg_set) - schedule_work(&tca->work); -} - -static int tca6507_gpio_direction_output(struct gpio_chip *gc, - unsigned offset, int val) -{ - tca6507_gpio_set_value(gc, offset, val); - return 0; -} - -static int tca6507_probe_gpios(struct i2c_client *client, - struct tca6507_chip *tca, - struct tca6507_platform_data *pdata) -{ - int err; - int i = 0; - int gpios = 0; - - for (i = 0; i < NUM_LEDS; i++) - if (pdata->leds.leds[i].name && pdata->leds.leds[i].flags) { - /* Configure as a gpio */ - tca->gpio_name[gpios] = pdata->leds.leds[i].name; - tca->gpio_map[gpios] = i; - gpios++; - } - - if (!gpios) - return 0; - - tca->gpio.label = "gpio-tca6507"; - tca->gpio.names = tca->gpio_name; - tca->gpio.ngpio = gpios; - tca->gpio.base = pdata->gpio_base; - tca->gpio.owner = THIS_MODULE; - tca->gpio.direction_output = tca6507_gpio_direction_output; - tca->gpio.set = tca6507_gpio_set_value; - tca->gpio.dev = &client->dev; - err = gpiochip_add(&tca->gpio); - if (err) { - tca->gpio.ngpio = 0; - return err; - } - if (pdata->setup) - pdata->setup(tca->gpio.base, tca->gpio.ngpio); - return 0; -} - -static void tca6507_remove_gpio(struct tca6507_chip *tca) -{ - if (tca->gpio.ngpio) { - int err = gpiochip_remove(&tca->gpio); - dev_err(&tca->client->dev, "%s failed, %d\n", - "gpiochip_remove()", err); - } -} -#else /* CONFIG_GPIOLIB */ -static int tca6507_probe_gpios(struct i2c_client *client, - struct tca6507_chip *tca, - struct tca6507_platform_data *pdata) -{ - return 0; -} -static void tca6507_remove_gpio(struct tca6507_chip *tca) -{ -} -#endif /* CONFIG_GPIOLIB */ - -static int __devinit tca6507_probe(struct i2c_client *client, - const struct i2c_device_id *id) -{ - struct tca6507_chip *tca; - struct i2c_adapter *adapter; - struct tca6507_platform_data *pdata; - int err; - int i = 0; - - adapter = to_i2c_adapter(client->dev.parent); - pdata = client->dev.platform_data; - - if (!i2c_check_functionality(adapter, I2C_FUNC_I2C)) - return -EIO; - - if (!pdata || pdata->leds.num_leds != NUM_LEDS) { - dev_err(&client->dev, "Need %d entries in platform-data list\n", - NUM_LEDS); - return -ENODEV; - } - tca = kzalloc(sizeof(*tca), GFP_KERNEL); - if (!tca) - return -ENOMEM; - - tca->client = client; - INIT_WORK(&tca->work, tca6507_work); - spin_lock_init(&tca->lock); - i2c_set_clientdata(client, tca); - - for (i = 0; i < NUM_LEDS; i++) { - struct tca6507_led *l = tca->leds + i; - - l->chip = tca; - l->num = i; - if (pdata->leds.leds[i].name && !pdata->leds.leds[i].flags) { - l->led_cdev.name = pdata->leds.leds[i].name; - l->led_cdev.default_trigger - = pdata->leds.leds[i].default_trigger; - l->led_cdev.brightness_set = tca6507_brightness_set; - l->led_cdev.blink_set = tca6507_blink_set; - l->bank = -1; - err = led_classdev_register(&client->dev, - &l->led_cdev); - if (err < 0) - goto exit; - } - } - err = tca6507_probe_gpios(client, tca, pdata); - if (err) - goto exit; - /* set all registers to known state - zero */ - tca->reg_set = 0x7f; - schedule_work(&tca->work); - - return 0; -exit: - while (i--) { - if (tca->leds[i].led_cdev.name) - led_classdev_unregister(&tca->leds[i].led_cdev); - } - kfree(tca); - return err; -} - -static int __devexit tca6507_remove(struct i2c_client *client) -{ - int i; - struct tca6507_chip *tca = i2c_get_clientdata(client); - struct tca6507_led *tca_leds = tca->leds; - - for (i = 0; i < NUM_LEDS; i++) { - if (tca_leds[i].led_cdev.name) - led_classdev_unregister(&tca_leds[i].led_cdev); - } - tca6507_remove_gpio(tca); - cancel_work_sync(&tca->work); - kfree(tca); - - return 0; -} - -static struct i2c_driver tca6507_driver = { - .driver = { - .name = "leds-tca6507", - .owner = THIS_MODULE, - }, - .probe = tca6507_probe, - .remove = __devexit_p(tca6507_remove), - .id_table = tca6507_id, -}; - -static int __init tca6507_leds_init(void) -{ - return i2c_add_driver(&tca6507_driver); -} - -static void __exit tca6507_leds_exit(void) -{ - i2c_del_driver(&tca6507_driver); -} - -module_init(tca6507_leds_init); -module_exit(tca6507_leds_exit); - -MODULE_AUTHOR("NeilBrown <neilb@suse.de>"); -MODULE_DESCRIPTION("TCA6507 LED/GPO driver"); -MODULE_LICENSE("GPL v2"); diff --git a/ANDROID_3.4.5/drivers/leds/leds-wm831x-status.c b/ANDROID_3.4.5/drivers/leds/leds-wm831x-status.c deleted file mode 100644 index 74a24cf8..00000000 --- a/ANDROID_3.4.5/drivers/leds/leds-wm831x-status.c +++ /dev/null @@ -1,332 +0,0 @@ -/* - * LED driver for WM831x status LEDs - * - * Copyright(C) 2009 Wolfson Microelectronics PLC. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - */ - -#include <linux/kernel.h> -#include <linux/init.h> -#include <linux/platform_device.h> -#include <linux/slab.h> -#include <linux/leds.h> -#include <linux/err.h> -#include <linux/mfd/wm831x/core.h> -#include <linux/mfd/wm831x/pdata.h> -#include <linux/mfd/wm831x/status.h> -#include <linux/module.h> - - -struct wm831x_status { - struct led_classdev cdev; - struct wm831x *wm831x; - struct work_struct work; - struct mutex mutex; - - spinlock_t value_lock; - int reg; /* Control register */ - int reg_val; /* Control register value */ - - int blink; - int blink_time; - int blink_cyc; - int src; - enum led_brightness brightness; -}; - -#define to_wm831x_status(led_cdev) \ - container_of(led_cdev, struct wm831x_status, cdev) - -static void wm831x_status_work(struct work_struct *work) -{ - struct wm831x_status *led = container_of(work, struct wm831x_status, - work); - unsigned long flags; - - mutex_lock(&led->mutex); - - led->reg_val &= ~(WM831X_LED_SRC_MASK | WM831X_LED_MODE_MASK | - WM831X_LED_DUTY_CYC_MASK | WM831X_LED_DUR_MASK); - - spin_lock_irqsave(&led->value_lock, flags); - - led->reg_val |= led->src << WM831X_LED_SRC_SHIFT; - if (led->blink) { - led->reg_val |= 2 << WM831X_LED_MODE_SHIFT; - led->reg_val |= led->blink_time << WM831X_LED_DUR_SHIFT; - led->reg_val |= led->blink_cyc; - } else { - if (led->brightness != LED_OFF) - led->reg_val |= 1 << WM831X_LED_MODE_SHIFT; - } - - spin_unlock_irqrestore(&led->value_lock, flags); - - wm831x_reg_write(led->wm831x, led->reg, led->reg_val); - - mutex_unlock(&led->mutex); -} - -static void wm831x_status_set(struct led_classdev *led_cdev, - enum led_brightness value) -{ - struct wm831x_status *led = to_wm831x_status(led_cdev); - unsigned long flags; - - spin_lock_irqsave(&led->value_lock, flags); - led->brightness = value; - if (value == LED_OFF) - led->blink = 0; - schedule_work(&led->work); - spin_unlock_irqrestore(&led->value_lock, flags); -} - -static int wm831x_status_blink_set(struct led_classdev *led_cdev, - unsigned long *delay_on, - unsigned long *delay_off) -{ - struct wm831x_status *led = to_wm831x_status(led_cdev); - unsigned long flags; - int ret = 0; - - /* Pick some defaults if we've not been given times */ - if (*delay_on == 0 && *delay_off == 0) { - *delay_on = 250; - *delay_off = 250; - } - - spin_lock_irqsave(&led->value_lock, flags); - - /* We only have a limited selection of settings, see if we can - * support the configuration we're being given */ - switch (*delay_on) { - case 1000: - led->blink_time = 0; - break; - case 250: - led->blink_time = 1; - break; - case 125: - led->blink_time = 2; - break; - case 62: - case 63: - /* Actually 62.5ms */ - led->blink_time = 3; - break; - default: - ret = -EINVAL; - break; - } - - if (ret == 0) { - switch (*delay_off / *delay_on) { - case 1: - led->blink_cyc = 0; - break; - case 3: - led->blink_cyc = 1; - break; - case 4: - led->blink_cyc = 2; - break; - case 8: - led->blink_cyc = 3; - break; - default: - ret = -EINVAL; - break; - } - } - - if (ret == 0) - led->blink = 1; - else - led->blink = 0; - - /* Always update; if we fail turn off blinking since we expect - * a software fallback. */ - schedule_work(&led->work); - - spin_unlock_irqrestore(&led->value_lock, flags); - - return ret; -} - -static const char *led_src_texts[] = { - "otp", - "power", - "charger", - "soft", -}; - -static ssize_t wm831x_status_src_show(struct device *dev, - struct device_attribute *attr, char *buf) -{ - struct led_classdev *led_cdev = dev_get_drvdata(dev); - struct wm831x_status *led = to_wm831x_status(led_cdev); - int i; - ssize_t ret = 0; - - mutex_lock(&led->mutex); - - for (i = 0; i < ARRAY_SIZE(led_src_texts); i++) - if (i == led->src) - ret += sprintf(&buf[ret], "[%s] ", led_src_texts[i]); - else - ret += sprintf(&buf[ret], "%s ", led_src_texts[i]); - - mutex_unlock(&led->mutex); - - ret += sprintf(&buf[ret], "\n"); - - return ret; -} - -static ssize_t wm831x_status_src_store(struct device *dev, - struct device_attribute *attr, - const char *buf, size_t size) -{ - struct led_classdev *led_cdev = dev_get_drvdata(dev); - struct wm831x_status *led = to_wm831x_status(led_cdev); - char name[20]; - int i; - size_t len; - - name[sizeof(name) - 1] = '\0'; - strncpy(name, buf, sizeof(name) - 1); - len = strlen(name); - - if (len && name[len - 1] == '\n') - name[len - 1] = '\0'; - - for (i = 0; i < ARRAY_SIZE(led_src_texts); i++) { - if (!strcmp(name, led_src_texts[i])) { - mutex_lock(&led->mutex); - - led->src = i; - schedule_work(&led->work); - - mutex_unlock(&led->mutex); - } - } - - return size; -} - -static DEVICE_ATTR(src, 0644, wm831x_status_src_show, wm831x_status_src_store); - -static int wm831x_status_probe(struct platform_device *pdev) -{ - struct wm831x *wm831x = dev_get_drvdata(pdev->dev.parent); - struct wm831x_pdata *chip_pdata; - struct wm831x_status_pdata pdata; - struct wm831x_status *drvdata; - struct resource *res; - int id = pdev->id % ARRAY_SIZE(chip_pdata->status); - int ret; - - res = platform_get_resource(pdev, IORESOURCE_IO, 0); - if (res == NULL) { - dev_err(&pdev->dev, "No I/O resource\n"); - ret = -EINVAL; - goto err; - } - - drvdata = devm_kzalloc(&pdev->dev, sizeof(struct wm831x_status), - GFP_KERNEL); - if (!drvdata) - return -ENOMEM; - dev_set_drvdata(&pdev->dev, drvdata); - - drvdata->wm831x = wm831x; - drvdata->reg = res->start; - - if (wm831x->dev->platform_data) - chip_pdata = wm831x->dev->platform_data; - else - chip_pdata = NULL; - - memset(&pdata, 0, sizeof(pdata)); - if (chip_pdata && chip_pdata->status[id]) - memcpy(&pdata, chip_pdata->status[id], sizeof(pdata)); - else - pdata.name = dev_name(&pdev->dev); - - mutex_init(&drvdata->mutex); - INIT_WORK(&drvdata->work, wm831x_status_work); - spin_lock_init(&drvdata->value_lock); - - /* We cache the configuration register and read startup values - * from it. */ - drvdata->reg_val = wm831x_reg_read(wm831x, drvdata->reg); - - if (drvdata->reg_val & WM831X_LED_MODE_MASK) - drvdata->brightness = LED_FULL; - else - drvdata->brightness = LED_OFF; - - /* Set a default source if configured, otherwise leave the - * current hardware setting. - */ - if (pdata.default_src == WM831X_STATUS_PRESERVE) { - drvdata->src = drvdata->reg_val; - drvdata->src &= WM831X_LED_SRC_MASK; - drvdata->src >>= WM831X_LED_SRC_SHIFT; - } else { - drvdata->src = pdata.default_src - 1; - } - - drvdata->cdev.name = pdata.name; - drvdata->cdev.default_trigger = pdata.default_trigger; - drvdata->cdev.brightness_set = wm831x_status_set; - drvdata->cdev.blink_set = wm831x_status_blink_set; - - ret = led_classdev_register(wm831x->dev, &drvdata->cdev); - if (ret < 0) { - dev_err(&pdev->dev, "Failed to register LED: %d\n", ret); - goto err_led; - } - - ret = device_create_file(drvdata->cdev.dev, &dev_attr_src); - if (ret != 0) - dev_err(&pdev->dev, - "No source control for LED: %d\n", ret); - - return 0; - -err_led: - led_classdev_unregister(&drvdata->cdev); -err: - return ret; -} - -static int wm831x_status_remove(struct platform_device *pdev) -{ - struct wm831x_status *drvdata = platform_get_drvdata(pdev); - - device_remove_file(drvdata->cdev.dev, &dev_attr_src); - led_classdev_unregister(&drvdata->cdev); - - return 0; -} - -static struct platform_driver wm831x_status_driver = { - .driver = { - .name = "wm831x-status", - .owner = THIS_MODULE, - }, - .probe = wm831x_status_probe, - .remove = wm831x_status_remove, -}; - -module_platform_driver(wm831x_status_driver); - -MODULE_AUTHOR("Mark Brown <broonie@opensource.wolfsonmicro.com>"); -MODULE_DESCRIPTION("WM831x status LED driver"); -MODULE_LICENSE("GPL"); -MODULE_ALIAS("platform:wm831x-status"); diff --git a/ANDROID_3.4.5/drivers/leds/leds-wm8350.c b/ANDROID_3.4.5/drivers/leds/leds-wm8350.c deleted file mode 100644 index 918d4baf..00000000 --- a/ANDROID_3.4.5/drivers/leds/leds-wm8350.c +++ /dev/null @@ -1,300 +0,0 @@ -/* - * LED driver for WM8350 driven LEDS. - * - * Copyright(C) 2007, 2008 Wolfson Microelectronics PLC. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - */ - -#include <linux/kernel.h> -#include <linux/init.h> -#include <linux/platform_device.h> -#include <linux/leds.h> -#include <linux/err.h> -#include <linux/mfd/wm8350/pmic.h> -#include <linux/regulator/consumer.h> -#include <linux/slab.h> -#include <linux/module.h> - -/* Microamps */ -static const int isink_cur[] = { - 4, - 5, - 6, - 7, - 8, - 10, - 11, - 14, - 16, - 19, - 23, - 27, - 32, - 39, - 46, - 54, - 65, - 77, - 92, - 109, - 130, - 154, - 183, - 218, - 259, - 308, - 367, - 436, - 518, - 616, - 733, - 872, - 1037, - 1233, - 1466, - 1744, - 2073, - 2466, - 2933, - 3487, - 4147, - 4932, - 5865, - 6975, - 8294, - 9864, - 11730, - 13949, - 16589, - 19728, - 23460, - 27899, - 33178, - 39455, - 46920, - 55798, - 66355, - 78910, - 93840, - 111596, - 132710, - 157820, - 187681, - 223191 -}; - -#define to_wm8350_led(led_cdev) \ - container_of(led_cdev, struct wm8350_led, cdev) - -static void wm8350_led_enable(struct wm8350_led *led) -{ - int ret; - - if (led->enabled) - return; - - ret = regulator_enable(led->isink); - if (ret != 0) { - dev_err(led->cdev.dev, "Failed to enable ISINK: %d\n", ret); - return; - } - - ret = regulator_enable(led->dcdc); - if (ret != 0) { - dev_err(led->cdev.dev, "Failed to enable DCDC: %d\n", ret); - regulator_disable(led->isink); - return; - } - - led->enabled = 1; -} - -static void wm8350_led_disable(struct wm8350_led *led) -{ - int ret; - - if (!led->enabled) - return; - - ret = regulator_disable(led->dcdc); - if (ret != 0) { - dev_err(led->cdev.dev, "Failed to disable DCDC: %d\n", ret); - return; - } - - ret = regulator_disable(led->isink); - if (ret != 0) { - dev_err(led->cdev.dev, "Failed to disable ISINK: %d\n", ret); - regulator_enable(led->dcdc); - return; - } - - led->enabled = 0; -} - -static void led_work(struct work_struct *work) -{ - struct wm8350_led *led = container_of(work, struct wm8350_led, work); - int ret; - int uA; - unsigned long flags; - - mutex_lock(&led->mutex); - - spin_lock_irqsave(&led->value_lock, flags); - - if (led->value == LED_OFF) { - spin_unlock_irqrestore(&led->value_lock, flags); - wm8350_led_disable(led); - goto out; - } - - /* This scales linearly into the index of valid current - * settings which results in a linear scaling of perceived - * brightness due to the non-linear current settings provided - * by the hardware. - */ - uA = (led->max_uA_index * led->value) / LED_FULL; - spin_unlock_irqrestore(&led->value_lock, flags); - BUG_ON(uA >= ARRAY_SIZE(isink_cur)); - - ret = regulator_set_current_limit(led->isink, isink_cur[uA], - isink_cur[uA]); - if (ret != 0) - dev_err(led->cdev.dev, "Failed to set %duA: %d\n", - isink_cur[uA], ret); - - wm8350_led_enable(led); - -out: - mutex_unlock(&led->mutex); -} - -static void wm8350_led_set(struct led_classdev *led_cdev, - enum led_brightness value) -{ - struct wm8350_led *led = to_wm8350_led(led_cdev); - unsigned long flags; - - spin_lock_irqsave(&led->value_lock, flags); - led->value = value; - schedule_work(&led->work); - spin_unlock_irqrestore(&led->value_lock, flags); -} - -static void wm8350_led_shutdown(struct platform_device *pdev) -{ - struct wm8350_led *led = platform_get_drvdata(pdev); - - mutex_lock(&led->mutex); - led->value = LED_OFF; - wm8350_led_disable(led); - mutex_unlock(&led->mutex); -} - -static int wm8350_led_probe(struct platform_device *pdev) -{ - struct regulator *isink, *dcdc; - struct wm8350_led *led; - struct wm8350_led_platform_data *pdata = pdev->dev.platform_data; - int ret, i; - - if (pdata == NULL) { - dev_err(&pdev->dev, "no platform data\n"); - return -ENODEV; - } - - if (pdata->max_uA < isink_cur[0]) { - dev_err(&pdev->dev, "Invalid maximum current %duA\n", - pdata->max_uA); - return -EINVAL; - } - - isink = regulator_get(&pdev->dev, "led_isink"); - if (IS_ERR(isink)) { - printk(KERN_ERR "%s: can't get ISINK\n", __func__); - return PTR_ERR(isink); - } - - dcdc = regulator_get(&pdev->dev, "led_vcc"); - if (IS_ERR(dcdc)) { - printk(KERN_ERR "%s: can't get DCDC\n", __func__); - ret = PTR_ERR(dcdc); - goto err_isink; - } - - led = devm_kzalloc(&pdev->dev, sizeof(*led), GFP_KERNEL); - if (led == NULL) { - ret = -ENOMEM; - goto err_dcdc; - } - - led->cdev.brightness_set = wm8350_led_set; - led->cdev.default_trigger = pdata->default_trigger; - led->cdev.name = pdata->name; - led->cdev.flags |= LED_CORE_SUSPENDRESUME; - led->enabled = regulator_is_enabled(isink); - led->isink = isink; - led->dcdc = dcdc; - - for (i = 0; i < ARRAY_SIZE(isink_cur) - 1; i++) - if (isink_cur[i] >= pdata->max_uA) - break; - led->max_uA_index = i; - if (pdata->max_uA != isink_cur[i]) - dev_warn(&pdev->dev, - "Maximum current %duA is not directly supported," - " check platform data\n", - pdata->max_uA); - - spin_lock_init(&led->value_lock); - mutex_init(&led->mutex); - INIT_WORK(&led->work, led_work); - led->value = LED_OFF; - platform_set_drvdata(pdev, led); - - ret = led_classdev_register(&pdev->dev, &led->cdev); - if (ret < 0) - goto err_dcdc; - - return 0; - - err_dcdc: - regulator_put(dcdc); - err_isink: - regulator_put(isink); - return ret; -} - -static int wm8350_led_remove(struct platform_device *pdev) -{ - struct wm8350_led *led = platform_get_drvdata(pdev); - - led_classdev_unregister(&led->cdev); - flush_work_sync(&led->work); - wm8350_led_disable(led); - regulator_put(led->dcdc); - regulator_put(led->isink); - return 0; -} - -static struct platform_driver wm8350_led_driver = { - .driver = { - .name = "wm8350-led", - .owner = THIS_MODULE, - }, - .probe = wm8350_led_probe, - .remove = wm8350_led_remove, - .shutdown = wm8350_led_shutdown, -}; - -module_platform_driver(wm8350_led_driver); - -MODULE_AUTHOR("Mark Brown"); -MODULE_DESCRIPTION("WM8350 LED driver"); -MODULE_LICENSE("GPL"); -MODULE_ALIAS("platform:wm8350-led"); diff --git a/ANDROID_3.4.5/drivers/leds/leds-wmt.c b/ANDROID_3.4.5/drivers/leds/leds-wmt.c deleted file mode 100755 index ca68f671..00000000 --- a/ANDROID_3.4.5/drivers/leds/leds-wmt.c +++ /dev/null @@ -1,63 +0,0 @@ - -#include <linux/module.h> -#include <linux/platform_device.h> -#include <linux/leds.h> -#include <linux/gpio.h> -#include <linux/gpio.h> -#include <mach/wmt_iomux.h> -#include <mach/wmt_env.h> - -static struct gpio_led gpio_leds[] = { - { - .name = "green", - .default_trigger = "timer", - .gpio = WMT_PIN_GP62_WAKEUP3, - .active_low = 0, - .default_state = LEDS_GPIO_DEFSTATE_OFF, - }, -}; - -static struct gpio_led_platform_data gpio_led_info = { - .leds = gpio_leds, - .num_leds = ARRAY_SIZE(gpio_leds), -}; - -static struct platform_device wmt_leds = { - .name = "leds-gpio", - .id = -1, - .dev = { - .platform_data = &gpio_led_info, - } -}; - -static int parse_charger_param(void) -{ - static const char uboot_env[] = "wmt.led.param"; - char buf[64]; - size_t l = sizeof(buf); - int gpio; - - if (wmt_getsyspara((char *)uboot_env, buf, &l)) - return -ENODEV; - - sscanf(buf, "%d", &gpio); - - if (!gpio_is_valid(gpio)) - return -EINVAL; - - gpio_leds[0].gpio = gpio; - return 0; -} - -static int __init wmt_leds_init(void) -{ - if (parse_charger_param()) - return -EINVAL; - - return platform_device_register(&wmt_leds); -} - -module_init(wmt_leds_init); - -MODULE_LICENSE("GPL"); - diff --git a/ANDROID_3.4.5/drivers/leds/leds-wrap.c b/ANDROID_3.4.5/drivers/leds/leds-wrap.c deleted file mode 100644 index 6e21e654..00000000 --- a/ANDROID_3.4.5/drivers/leds/leds-wrap.c +++ /dev/null @@ -1,154 +0,0 @@ -/* - * LEDs driver for PCEngines WRAP - * - * Copyright (C) 2006 Kristian Kielhofner <kris@krisk.org> - * - * Based on leds-net48xx.c - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ - -#include <linux/kernel.h> -#include <linux/init.h> -#include <linux/platform_device.h> -#include <linux/leds.h> -#include <linux/err.h> -#include <asm/io.h> -#include <linux/scx200_gpio.h> -#include <linux/module.h> - -#define DRVNAME "wrap-led" -#define WRAP_POWER_LED_GPIO 2 -#define WRAP_ERROR_LED_GPIO 3 -#define WRAP_EXTRA_LED_GPIO 18 - -static struct platform_device *pdev; - -static void wrap_power_led_set(struct led_classdev *led_cdev, - enum led_brightness value) -{ - if (value) - scx200_gpio_set_low(WRAP_POWER_LED_GPIO); - else - scx200_gpio_set_high(WRAP_POWER_LED_GPIO); -} - -static void wrap_error_led_set(struct led_classdev *led_cdev, - enum led_brightness value) -{ - if (value) - scx200_gpio_set_low(WRAP_ERROR_LED_GPIO); - else - scx200_gpio_set_high(WRAP_ERROR_LED_GPIO); -} - -static void wrap_extra_led_set(struct led_classdev *led_cdev, - enum led_brightness value) -{ - if (value) - scx200_gpio_set_low(WRAP_EXTRA_LED_GPIO); - else - scx200_gpio_set_high(WRAP_EXTRA_LED_GPIO); -} - -static struct led_classdev wrap_power_led = { - .name = "wrap::power", - .brightness_set = wrap_power_led_set, - .default_trigger = "default-on", - .flags = LED_CORE_SUSPENDRESUME, -}; - -static struct led_classdev wrap_error_led = { - .name = "wrap::error", - .brightness_set = wrap_error_led_set, - .flags = LED_CORE_SUSPENDRESUME, -}; - -static struct led_classdev wrap_extra_led = { - .name = "wrap::extra", - .brightness_set = wrap_extra_led_set, - .flags = LED_CORE_SUSPENDRESUME, -}; - -static int wrap_led_probe(struct platform_device *pdev) -{ - int ret; - - ret = led_classdev_register(&pdev->dev, &wrap_power_led); - if (ret < 0) - return ret; - - ret = led_classdev_register(&pdev->dev, &wrap_error_led); - if (ret < 0) - goto err1; - - ret = led_classdev_register(&pdev->dev, &wrap_extra_led); - if (ret < 0) - goto err2; - - return ret; - -err2: - led_classdev_unregister(&wrap_error_led); -err1: - led_classdev_unregister(&wrap_power_led); - - return ret; -} - -static int wrap_led_remove(struct platform_device *pdev) -{ - led_classdev_unregister(&wrap_power_led); - led_classdev_unregister(&wrap_error_led); - led_classdev_unregister(&wrap_extra_led); - return 0; -} - -static struct platform_driver wrap_led_driver = { - .probe = wrap_led_probe, - .remove = wrap_led_remove, - .driver = { - .name = DRVNAME, - .owner = THIS_MODULE, - }, -}; - -static int __init wrap_led_init(void) -{ - int ret; - - if (!scx200_gpio_present()) { - ret = -ENODEV; - goto out; - } - - ret = platform_driver_register(&wrap_led_driver); - if (ret < 0) - goto out; - - pdev = platform_device_register_simple(DRVNAME, -1, NULL, 0); - if (IS_ERR(pdev)) { - ret = PTR_ERR(pdev); - platform_driver_unregister(&wrap_led_driver); - goto out; - } - -out: - return ret; -} - -static void __exit wrap_led_exit(void) -{ - platform_device_unregister(pdev); - platform_driver_unregister(&wrap_led_driver); -} - -module_init(wrap_led_init); -module_exit(wrap_led_exit); - -MODULE_AUTHOR("Kristian Kielhofner <kris@krisk.org>"); -MODULE_DESCRIPTION("PCEngines WRAP LED driver"); -MODULE_LICENSE("GPL"); - diff --git a/ANDROID_3.4.5/drivers/leds/leds.h b/ANDROID_3.4.5/drivers/leds/leds.h deleted file mode 100644 index e77c7f8d..00000000 --- a/ANDROID_3.4.5/drivers/leds/leds.h +++ /dev/null @@ -1,61 +0,0 @@ -/* - * LED Core - * - * Copyright 2005 Openedhand Ltd. - * - * Author: Richard Purdie <rpurdie@openedhand.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - */ -#ifndef __LEDS_H_INCLUDED -#define __LEDS_H_INCLUDED - -#include <linux/device.h> -#include <linux/rwsem.h> -#include <linux/leds.h> - -static inline void led_set_brightness(struct led_classdev *led_cdev, - enum led_brightness value) -{ - if (value > led_cdev->max_brightness) - value = led_cdev->max_brightness; - led_cdev->brightness = value; - if (!(led_cdev->flags & LED_SUSPENDED)) - led_cdev->brightness_set(led_cdev, value); -} - -static inline int led_get_brightness(struct led_classdev *led_cdev) -{ - return led_cdev->brightness; -} - -extern struct rw_semaphore leds_list_lock; -extern struct list_head leds_list; - -#ifdef CONFIG_LEDS_TRIGGERS -void led_trigger_set_default(struct led_classdev *led_cdev); -void led_trigger_set(struct led_classdev *led_cdev, - struct led_trigger *trigger); -void led_trigger_remove(struct led_classdev *led_cdev); - -static inline void *led_get_trigger_data(struct led_classdev *led_cdev) -{ - return led_cdev->trigger_data; -} - -#else -#define led_trigger_set_default(x) do {} while (0) -#define led_trigger_set(x, y) do {} while (0) -#define led_trigger_remove(x) do {} while (0) -#define led_get_trigger_data(x) (NULL) -#endif - -ssize_t led_trigger_store(struct device *dev, struct device_attribute *attr, - const char *buf, size_t count); -ssize_t led_trigger_show(struct device *dev, struct device_attribute *attr, - char *buf); - -#endif /* __LEDS_H_INCLUDED */ diff --git a/ANDROID_3.4.5/drivers/leds/ledtrig-backlight.c b/ANDROID_3.4.5/drivers/leds/ledtrig-backlight.c deleted file mode 100644 index 2b513a2a..00000000 --- a/ANDROID_3.4.5/drivers/leds/ledtrig-backlight.c +++ /dev/null @@ -1,164 +0,0 @@ -/* - * Backlight emulation LED trigger - * - * Copyright 2008 (C) Rodolfo Giometti <giometti@linux.it> - * Copyright 2008 (C) Eurotech S.p.A. <info@eurotech.it> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - */ - -#include <linux/module.h> -#include <linux/kernel.h> -#include <linux/slab.h> -#include <linux/init.h> -#include <linux/fb.h> -#include <linux/leds.h> -#include "leds.h" - -#define BLANK 1 -#define UNBLANK 0 - -struct bl_trig_notifier { - struct led_classdev *led; - int brightness; - int old_status; - struct notifier_block notifier; - unsigned invert; -}; - -static int fb_notifier_callback(struct notifier_block *p, - unsigned long event, void *data) -{ - struct bl_trig_notifier *n = container_of(p, - struct bl_trig_notifier, notifier); - struct led_classdev *led = n->led; - struct fb_event *fb_event = data; - int *blank = fb_event->data; - int new_status = *blank ? BLANK : UNBLANK; - - switch (event) { - case FB_EVENT_BLANK : - if (new_status == n->old_status) - break; - - if ((n->old_status == UNBLANK) ^ n->invert) { - n->brightness = led->brightness; - led_set_brightness(led, LED_OFF); - } else { - led_set_brightness(led, n->brightness); - } - - n->old_status = new_status; - - break; - } - - return 0; -} - -static ssize_t bl_trig_invert_show(struct device *dev, - struct device_attribute *attr, char *buf) -{ - struct led_classdev *led = dev_get_drvdata(dev); - struct bl_trig_notifier *n = led->trigger_data; - - return sprintf(buf, "%u\n", n->invert); -} - -static ssize_t bl_trig_invert_store(struct device *dev, - struct device_attribute *attr, const char *buf, size_t num) -{ - struct led_classdev *led = dev_get_drvdata(dev); - struct bl_trig_notifier *n = led->trigger_data; - unsigned long invert; - int ret; - - ret = strict_strtoul(buf, 10, &invert); - if (ret < 0) - return ret; - - if (invert > 1) - return -EINVAL; - - n->invert = invert; - - /* After inverting, we need to update the LED. */ - if ((n->old_status == BLANK) ^ n->invert) - led_set_brightness(led, LED_OFF); - else - led_set_brightness(led, n->brightness); - - return num; -} -static DEVICE_ATTR(inverted, 0644, bl_trig_invert_show, bl_trig_invert_store); - -static void bl_trig_activate(struct led_classdev *led) -{ - int ret; - - struct bl_trig_notifier *n; - - n = kzalloc(sizeof(struct bl_trig_notifier), GFP_KERNEL); - led->trigger_data = n; - if (!n) { - dev_err(led->dev, "unable to allocate backlight trigger\n"); - return; - } - - ret = device_create_file(led->dev, &dev_attr_inverted); - if (ret) - goto err_invert; - - n->led = led; - n->brightness = led->brightness; - n->old_status = UNBLANK; - n->notifier.notifier_call = fb_notifier_callback; - - ret = fb_register_client(&n->notifier); - if (ret) - dev_err(led->dev, "unable to register backlight trigger\n"); - - return; - -err_invert: - led->trigger_data = NULL; - kfree(n); -} - -static void bl_trig_deactivate(struct led_classdev *led) -{ - struct bl_trig_notifier *n = - (struct bl_trig_notifier *) led->trigger_data; - - if (n) { - device_remove_file(led->dev, &dev_attr_inverted); - fb_unregister_client(&n->notifier); - kfree(n); - } -} - -static struct led_trigger bl_led_trigger = { - .name = "backlight", - .activate = bl_trig_activate, - .deactivate = bl_trig_deactivate -}; - -static int __init bl_trig_init(void) -{ - return led_trigger_register(&bl_led_trigger); -} - -static void __exit bl_trig_exit(void) -{ - led_trigger_unregister(&bl_led_trigger); -} - -module_init(bl_trig_init); -module_exit(bl_trig_exit); - -MODULE_AUTHOR("Rodolfo Giometti <giometti@linux.it>"); -MODULE_DESCRIPTION("Backlight emulation LED trigger"); -MODULE_LICENSE("GPL v2"); diff --git a/ANDROID_3.4.5/drivers/leds/ledtrig-default-on.c b/ANDROID_3.4.5/drivers/leds/ledtrig-default-on.c deleted file mode 100644 index a4ef54b9..00000000 --- a/ANDROID_3.4.5/drivers/leds/ledtrig-default-on.c +++ /dev/null @@ -1,45 +0,0 @@ -/* - * LED Kernel Default ON Trigger - * - * Copyright 2008 Nick Forbes <nick.forbes@incepta.com> - * - * Based on Richard Purdie's ledtrig-timer.c. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - */ - -#include <linux/module.h> -#include <linux/kernel.h> -#include <linux/init.h> -#include <linux/leds.h> -#include "leds.h" - -static void defon_trig_activate(struct led_classdev *led_cdev) -{ - led_set_brightness(led_cdev, led_cdev->max_brightness); -} - -static struct led_trigger defon_led_trigger = { - .name = "default-on", - .activate = defon_trig_activate, -}; - -static int __init defon_trig_init(void) -{ - return led_trigger_register(&defon_led_trigger); -} - -static void __exit defon_trig_exit(void) -{ - led_trigger_unregister(&defon_led_trigger); -} - -module_init(defon_trig_init); -module_exit(defon_trig_exit); - -MODULE_AUTHOR("Nick Forbes <nick.forbes@incepta.com>"); -MODULE_DESCRIPTION("Default-ON LED trigger"); -MODULE_LICENSE("GPL"); diff --git a/ANDROID_3.4.5/drivers/leds/ledtrig-gpio.c b/ANDROID_3.4.5/drivers/leds/ledtrig-gpio.c deleted file mode 100644 index ecc4bf3f..00000000 --- a/ANDROID_3.4.5/drivers/leds/ledtrig-gpio.c +++ /dev/null @@ -1,251 +0,0 @@ -/* - * ledtrig-gio.c - LED Trigger Based on GPIO events - * - * Copyright 2009 Felipe Balbi <me@felipebalbi.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - */ - -#include <linux/module.h> -#include <linux/kernel.h> -#include <linux/init.h> -#include <linux/gpio.h> -#include <linux/interrupt.h> -#include <linux/workqueue.h> -#include <linux/leds.h> -#include <linux/slab.h> -#include "leds.h" - -struct gpio_trig_data { - struct led_classdev *led; - struct work_struct work; - - unsigned desired_brightness; /* desired brightness when led is on */ - unsigned inverted; /* true when gpio is inverted */ - unsigned gpio; /* gpio that triggers the leds */ -}; - -static irqreturn_t gpio_trig_irq(int irq, void *_led) -{ - struct led_classdev *led = _led; - struct gpio_trig_data *gpio_data = led->trigger_data; - - /* just schedule_work since gpio_get_value can sleep */ - schedule_work(&gpio_data->work); - - return IRQ_HANDLED; -}; - -static void gpio_trig_work(struct work_struct *work) -{ - struct gpio_trig_data *gpio_data = container_of(work, - struct gpio_trig_data, work); - int tmp; - - if (!gpio_data->gpio) - return; - - tmp = gpio_get_value(gpio_data->gpio); - if (gpio_data->inverted) - tmp = !tmp; - - if (tmp) { - if (gpio_data->desired_brightness) - led_set_brightness(gpio_data->led, - gpio_data->desired_brightness); - else - led_set_brightness(gpio_data->led, LED_FULL); - } else { - led_set_brightness(gpio_data->led, LED_OFF); - } -} - -static ssize_t gpio_trig_brightness_show(struct device *dev, - struct device_attribute *attr, char *buf) -{ - struct led_classdev *led = dev_get_drvdata(dev); - struct gpio_trig_data *gpio_data = led->trigger_data; - - return sprintf(buf, "%u\n", gpio_data->desired_brightness); -} - -static ssize_t gpio_trig_brightness_store(struct device *dev, - struct device_attribute *attr, const char *buf, size_t n) -{ - struct led_classdev *led = dev_get_drvdata(dev); - struct gpio_trig_data *gpio_data = led->trigger_data; - unsigned desired_brightness; - int ret; - - ret = sscanf(buf, "%u", &desired_brightness); - if (ret < 1 || desired_brightness > 255) { - dev_err(dev, "invalid value\n"); - return -EINVAL; - } - - gpio_data->desired_brightness = desired_brightness; - - return n; -} -static DEVICE_ATTR(desired_brightness, 0644, gpio_trig_brightness_show, - gpio_trig_brightness_store); - -static ssize_t gpio_trig_inverted_show(struct device *dev, - struct device_attribute *attr, char *buf) -{ - struct led_classdev *led = dev_get_drvdata(dev); - struct gpio_trig_data *gpio_data = led->trigger_data; - - return sprintf(buf, "%u\n", gpio_data->inverted); -} - -static ssize_t gpio_trig_inverted_store(struct device *dev, - struct device_attribute *attr, const char *buf, size_t n) -{ - struct led_classdev *led = dev_get_drvdata(dev); - struct gpio_trig_data *gpio_data = led->trigger_data; - unsigned long inverted; - int ret; - - ret = strict_strtoul(buf, 10, &inverted); - if (ret < 0) - return ret; - - if (inverted > 1) - return -EINVAL; - - gpio_data->inverted = inverted; - - /* After inverting, we need to update the LED. */ - schedule_work(&gpio_data->work); - - return n; -} -static DEVICE_ATTR(inverted, 0644, gpio_trig_inverted_show, - gpio_trig_inverted_store); - -static ssize_t gpio_trig_gpio_show(struct device *dev, - struct device_attribute *attr, char *buf) -{ - struct led_classdev *led = dev_get_drvdata(dev); - struct gpio_trig_data *gpio_data = led->trigger_data; - - return sprintf(buf, "%u\n", gpio_data->gpio); -} - -static ssize_t gpio_trig_gpio_store(struct device *dev, - struct device_attribute *attr, const char *buf, size_t n) -{ - struct led_classdev *led = dev_get_drvdata(dev); - struct gpio_trig_data *gpio_data = led->trigger_data; - unsigned gpio; - int ret; - - ret = sscanf(buf, "%u", &gpio); - if (ret < 1) { - dev_err(dev, "couldn't read gpio number\n"); - flush_work(&gpio_data->work); - return -EINVAL; - } - - if (gpio_data->gpio == gpio) - return n; - - if (!gpio) { - if (gpio_data->gpio != 0) - free_irq(gpio_to_irq(gpio_data->gpio), led); - gpio_data->gpio = 0; - return n; - } - - ret = request_irq(gpio_to_irq(gpio), gpio_trig_irq, - IRQF_SHARED | IRQF_TRIGGER_RISING - | IRQF_TRIGGER_FALLING, "ledtrig-gpio", led); - if (ret) { - dev_err(dev, "request_irq failed with error %d\n", ret); - } else { - if (gpio_data->gpio != 0) - free_irq(gpio_to_irq(gpio_data->gpio), led); - gpio_data->gpio = gpio; - } - - return ret ? ret : n; -} -static DEVICE_ATTR(gpio, 0644, gpio_trig_gpio_show, gpio_trig_gpio_store); - -static void gpio_trig_activate(struct led_classdev *led) -{ - struct gpio_trig_data *gpio_data; - int ret; - - gpio_data = kzalloc(sizeof(*gpio_data), GFP_KERNEL); - if (!gpio_data) - return; - - ret = device_create_file(led->dev, &dev_attr_gpio); - if (ret) - goto err_gpio; - - ret = device_create_file(led->dev, &dev_attr_inverted); - if (ret) - goto err_inverted; - - ret = device_create_file(led->dev, &dev_attr_desired_brightness); - if (ret) - goto err_brightness; - - gpio_data->led = led; - led->trigger_data = gpio_data; - INIT_WORK(&gpio_data->work, gpio_trig_work); - - return; - -err_brightness: - device_remove_file(led->dev, &dev_attr_inverted); - -err_inverted: - device_remove_file(led->dev, &dev_attr_gpio); - -err_gpio: - kfree(gpio_data); -} - -static void gpio_trig_deactivate(struct led_classdev *led) -{ - struct gpio_trig_data *gpio_data = led->trigger_data; - - if (gpio_data) { - device_remove_file(led->dev, &dev_attr_gpio); - device_remove_file(led->dev, &dev_attr_inverted); - device_remove_file(led->dev, &dev_attr_desired_brightness); - flush_work(&gpio_data->work); - if (gpio_data->gpio != 0) - free_irq(gpio_to_irq(gpio_data->gpio), led); - kfree(gpio_data); - } -} - -static struct led_trigger gpio_led_trigger = { - .name = "gpio", - .activate = gpio_trig_activate, - .deactivate = gpio_trig_deactivate, -}; - -static int __init gpio_trig_init(void) -{ - return led_trigger_register(&gpio_led_trigger); -} -module_init(gpio_trig_init); - -static void __exit gpio_trig_exit(void) -{ - led_trigger_unregister(&gpio_led_trigger); -} -module_exit(gpio_trig_exit); - -MODULE_AUTHOR("Felipe Balbi <me@felipebalbi.com>"); -MODULE_DESCRIPTION("GPIO LED trigger"); -MODULE_LICENSE("GPL"); diff --git a/ANDROID_3.4.5/drivers/leds/ledtrig-heartbeat.c b/ANDROID_3.4.5/drivers/leds/ledtrig-heartbeat.c deleted file mode 100644 index 759c0bba..00000000 --- a/ANDROID_3.4.5/drivers/leds/ledtrig-heartbeat.c +++ /dev/null @@ -1,119 +0,0 @@ -/* - * LED Heartbeat Trigger - * - * Copyright (C) 2006 Atsushi Nemoto <anemo@mba.ocn.ne.jp> - * - * Based on Richard Purdie's ledtrig-timer.c and some arch's - * CONFIG_HEARTBEAT code. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - */ -#include <linux/module.h> -#include <linux/kernel.h> -#include <linux/init.h> -#include <linux/slab.h> -#include <linux/timer.h> -#include <linux/sched.h> -#include <linux/leds.h> -#include "leds.h" - -struct heartbeat_trig_data { - unsigned int phase; - unsigned int period; - struct timer_list timer; -}; - -static void led_heartbeat_function(unsigned long data) -{ - struct led_classdev *led_cdev = (struct led_classdev *) data; - struct heartbeat_trig_data *heartbeat_data = led_cdev->trigger_data; - unsigned long brightness = LED_OFF; - unsigned long delay = 0; - - /* acts like an actual heart beat -- ie thump-thump-pause... */ - switch (heartbeat_data->phase) { - case 0: - /* - * The hyperbolic function below modifies the - * heartbeat period length in dependency of the - * current (1min) load. It goes through the points - * f(0)=1260, f(1)=860, f(5)=510, f(inf)->300. - */ - heartbeat_data->period = 300 + - (6720 << FSHIFT) / (5 * avenrun[0] + (7 << FSHIFT)); - heartbeat_data->period = - msecs_to_jiffies(heartbeat_data->period); - delay = msecs_to_jiffies(70); - heartbeat_data->phase++; - brightness = led_cdev->max_brightness; - break; - case 1: - delay = heartbeat_data->period / 4 - msecs_to_jiffies(70); - heartbeat_data->phase++; - break; - case 2: - delay = msecs_to_jiffies(70); - heartbeat_data->phase++; - brightness = led_cdev->max_brightness; - break; - default: - delay = heartbeat_data->period - heartbeat_data->period / 4 - - msecs_to_jiffies(70); - heartbeat_data->phase = 0; - break; - } - - led_set_brightness(led_cdev, brightness); - mod_timer(&heartbeat_data->timer, jiffies + delay); -} - -static void heartbeat_trig_activate(struct led_classdev *led_cdev) -{ - struct heartbeat_trig_data *heartbeat_data; - - heartbeat_data = kzalloc(sizeof(*heartbeat_data), GFP_KERNEL); - if (!heartbeat_data) - return; - - led_cdev->trigger_data = heartbeat_data; - setup_timer(&heartbeat_data->timer, - led_heartbeat_function, (unsigned long) led_cdev); - heartbeat_data->phase = 0; - led_heartbeat_function(heartbeat_data->timer.data); -} - -static void heartbeat_trig_deactivate(struct led_classdev *led_cdev) -{ - struct heartbeat_trig_data *heartbeat_data = led_cdev->trigger_data; - - if (heartbeat_data) { - del_timer_sync(&heartbeat_data->timer); - kfree(heartbeat_data); - } -} - -static struct led_trigger heartbeat_led_trigger = { - .name = "heartbeat", - .activate = heartbeat_trig_activate, - .deactivate = heartbeat_trig_deactivate, -}; - -static int __init heartbeat_trig_init(void) -{ - return led_trigger_register(&heartbeat_led_trigger); -} - -static void __exit heartbeat_trig_exit(void) -{ - led_trigger_unregister(&heartbeat_led_trigger); -} - -module_init(heartbeat_trig_init); -module_exit(heartbeat_trig_exit); - -MODULE_AUTHOR("Atsushi Nemoto <anemo@mba.ocn.ne.jp>"); -MODULE_DESCRIPTION("Heartbeat LED trigger"); -MODULE_LICENSE("GPL"); diff --git a/ANDROID_3.4.5/drivers/leds/ledtrig-ide-disk.c b/ANDROID_3.4.5/drivers/leds/ledtrig-ide-disk.c deleted file mode 100644 index ec099fcb..00000000 --- a/ANDROID_3.4.5/drivers/leds/ledtrig-ide-disk.c +++ /dev/null @@ -1,64 +0,0 @@ -/* - * LED IDE-Disk Activity Trigger - * - * Copyright 2006 Openedhand Ltd. - * - * Author: Richard Purdie <rpurdie@openedhand.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - */ - -#include <linux/module.h> -#include <linux/jiffies.h> -#include <linux/kernel.h> -#include <linux/init.h> -#include <linux/timer.h> -#include <linux/leds.h> - -static void ledtrig_ide_timerfunc(unsigned long data); - -DEFINE_LED_TRIGGER(ledtrig_ide); -static DEFINE_TIMER(ledtrig_ide_timer, ledtrig_ide_timerfunc, 0, 0); -static int ide_activity; -static int ide_lastactivity; - -void ledtrig_ide_activity(void) -{ - ide_activity++; - if (!timer_pending(&ledtrig_ide_timer)) - mod_timer(&ledtrig_ide_timer, jiffies + msecs_to_jiffies(10)); -} -EXPORT_SYMBOL(ledtrig_ide_activity); - -static void ledtrig_ide_timerfunc(unsigned long data) -{ - if (ide_lastactivity != ide_activity) { - ide_lastactivity = ide_activity; - /* INT_MAX will set each LED to its maximum brightness */ - led_trigger_event(ledtrig_ide, INT_MAX); - mod_timer(&ledtrig_ide_timer, jiffies + msecs_to_jiffies(10)); - } else { - led_trigger_event(ledtrig_ide, LED_OFF); - } -} - -static int __init ledtrig_ide_init(void) -{ - led_trigger_register_simple("ide-disk", &ledtrig_ide); - return 0; -} - -static void __exit ledtrig_ide_exit(void) -{ - led_trigger_unregister_simple(ledtrig_ide); -} - -module_init(ledtrig_ide_init); -module_exit(ledtrig_ide_exit); - -MODULE_AUTHOR("Richard Purdie <rpurdie@openedhand.com>"); -MODULE_DESCRIPTION("LED IDE Disk Activity Trigger"); -MODULE_LICENSE("GPL"); diff --git a/ANDROID_3.4.5/drivers/leds/ledtrig-sleep.c b/ANDROID_3.4.5/drivers/leds/ledtrig-sleep.c deleted file mode 100644 index f1640421..00000000 --- a/ANDROID_3.4.5/drivers/leds/ledtrig-sleep.c +++ /dev/null @@ -1,80 +0,0 @@ -/* drivers/leds/ledtrig-sleep.c - * - * Copyright (C) 2007 Google, Inc. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include <linux/earlysuspend.h> -#include <linux/leds.h> -#include <linux/suspend.h> - -static int ledtrig_sleep_pm_callback(struct notifier_block *nfb, - unsigned long action, - void *ignored); - -DEFINE_LED_TRIGGER(ledtrig_sleep) -static struct notifier_block ledtrig_sleep_pm_notifier = { - .notifier_call = ledtrig_sleep_pm_callback, - .priority = 0, -}; - -static void ledtrig_sleep_early_suspend(struct early_suspend *h) -{ - led_trigger_event(ledtrig_sleep, LED_FULL); -} - -static void ledtrig_sleep_early_resume(struct early_suspend *h) -{ - led_trigger_event(ledtrig_sleep, LED_OFF); -} - -static struct early_suspend ledtrig_sleep_early_suspend_handler = { - .suspend = ledtrig_sleep_early_suspend, - .resume = ledtrig_sleep_early_resume, -}; - -static int ledtrig_sleep_pm_callback(struct notifier_block *nfb, - unsigned long action, - void *ignored) -{ - switch (action) { - case PM_HIBERNATION_PREPARE: - case PM_SUSPEND_PREPARE: - led_trigger_event(ledtrig_sleep, LED_OFF); - return NOTIFY_OK; - case PM_POST_HIBERNATION: - case PM_POST_SUSPEND: - led_trigger_event(ledtrig_sleep, LED_FULL); - return NOTIFY_OK; - } - - return NOTIFY_DONE; -} - -static int __init ledtrig_sleep_init(void) -{ - led_trigger_register_simple("sleep", &ledtrig_sleep); - register_pm_notifier(&ledtrig_sleep_pm_notifier); - register_early_suspend(&ledtrig_sleep_early_suspend_handler); - return 0; -} - -static void __exit ledtrig_sleep_exit(void) -{ - unregister_early_suspend(&ledtrig_sleep_early_suspend_handler); - unregister_pm_notifier(&ledtrig_sleep_pm_notifier); - led_trigger_unregister_simple(ledtrig_sleep); -} - -module_init(ledtrig_sleep_init); -module_exit(ledtrig_sleep_exit); - diff --git a/ANDROID_3.4.5/drivers/leds/ledtrig-timer.c b/ANDROID_3.4.5/drivers/leds/ledtrig-timer.c deleted file mode 100644 index 328c64c0..00000000 --- a/ANDROID_3.4.5/drivers/leds/ledtrig-timer.c +++ /dev/null @@ -1,139 +0,0 @@ -/* - * LED Kernel Timer Trigger - * - * Copyright 2005-2006 Openedhand Ltd. - * - * Author: Richard Purdie <rpurdie@openedhand.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - */ - -#include <linux/module.h> -#include <linux/kernel.h> -#include <linux/init.h> -#include <linux/device.h> -#include <linux/ctype.h> -#include <linux/leds.h> -#include "leds.h" - -static ssize_t led_delay_on_show(struct device *dev, - struct device_attribute *attr, char *buf) -{ - struct led_classdev *led_cdev = dev_get_drvdata(dev); - - return sprintf(buf, "%lu\n", led_cdev->blink_delay_on); -} - -static ssize_t led_delay_on_store(struct device *dev, - struct device_attribute *attr, const char *buf, size_t size) -{ - struct led_classdev *led_cdev = dev_get_drvdata(dev); - int ret = -EINVAL; - char *after; - unsigned long state = simple_strtoul(buf, &after, 10); - size_t count = after - buf; - - if (isspace(*after)) - count++; - - if (count == size) { - led_blink_set(led_cdev, &state, &led_cdev->blink_delay_off); - led_cdev->blink_delay_on = state; - ret = count; - } - - return ret; -} - -static ssize_t led_delay_off_show(struct device *dev, - struct device_attribute *attr, char *buf) -{ - struct led_classdev *led_cdev = dev_get_drvdata(dev); - - return sprintf(buf, "%lu\n", led_cdev->blink_delay_off); -} - -static ssize_t led_delay_off_store(struct device *dev, - struct device_attribute *attr, const char *buf, size_t size) -{ - struct led_classdev *led_cdev = dev_get_drvdata(dev); - int ret = -EINVAL; - char *after; - unsigned long state = simple_strtoul(buf, &after, 10); - size_t count = after - buf; - - if (isspace(*after)) - count++; - - if (count == size) { - led_blink_set(led_cdev, &led_cdev->blink_delay_on, &state); - led_cdev->blink_delay_off = state; - ret = count; - } - - return ret; -} - -static DEVICE_ATTR(delay_on, 0644, led_delay_on_show, led_delay_on_store); -static DEVICE_ATTR(delay_off, 0644, led_delay_off_show, led_delay_off_store); - -static void timer_trig_activate(struct led_classdev *led_cdev) -{ - int rc; - - led_cdev->trigger_data = NULL; - - rc = device_create_file(led_cdev->dev, &dev_attr_delay_on); - if (rc) - return; - rc = device_create_file(led_cdev->dev, &dev_attr_delay_off); - if (rc) - goto err_out_delayon; - - led_blink_set(led_cdev, &led_cdev->blink_delay_on, - &led_cdev->blink_delay_off); - - led_cdev->trigger_data = (void *)1; - - return; - -err_out_delayon: - device_remove_file(led_cdev->dev, &dev_attr_delay_on); -} - -static void timer_trig_deactivate(struct led_classdev *led_cdev) -{ - if (led_cdev->trigger_data) { - device_remove_file(led_cdev->dev, &dev_attr_delay_on); - device_remove_file(led_cdev->dev, &dev_attr_delay_off); - } - - /* Stop blinking */ - led_brightness_set(led_cdev, LED_OFF); -} - -static struct led_trigger timer_led_trigger = { - .name = "timer", - .activate = timer_trig_activate, - .deactivate = timer_trig_deactivate, -}; - -static int __init timer_trig_init(void) -{ - return led_trigger_register(&timer_led_trigger); -} - -static void __exit timer_trig_exit(void) -{ - led_trigger_unregister(&timer_led_trigger); -} - -module_init(timer_trig_init); -module_exit(timer_trig_exit); - -MODULE_AUTHOR("Richard Purdie <rpurdie@openedhand.com>"); -MODULE_DESCRIPTION("Timer LED trigger"); -MODULE_LICENSE("GPL"); diff --git a/ANDROID_3.4.5/drivers/leds/wmt-lcd-backlight.c b/ANDROID_3.4.5/drivers/leds/wmt-lcd-backlight.c deleted file mode 100755 index d51b7c5b..00000000 --- a/ANDROID_3.4.5/drivers/leds/wmt-lcd-backlight.c +++ /dev/null @@ -1,329 +0,0 @@ -/************************************************************** -Copyright (c) 2008 WonderMedia Technologies, Inc. - -Module Name: - $Workfile: wmt-lcd-backlight.c $ -Abstract: - This program is the WMT LCD backlight driver for Android 1.6 system. - Andriod1.6 API adjusts the LCD backlight by writing follwing file: - /sys/class/leds/lcd-backlight/brightness - Use WMT PWM to control the LCD backlight -Revision History: - Jan.08.2010 First Created by HowayHuo - -**************************************************************/ -#include <linux/kernel.h> -#include <linux/platform_device.h> -#include <linux/leds.h> -#include <linux/io.h> -#include <linux/slab.h> -#include "../char/wmt-pwm.h" - -#define BACKLIGHT_ON 0 -#define BACKLIGHT_CLOSE 1 - -struct wmt_pwm_reg_t { - unsigned int id; - unsigned int scalar; - unsigned int period; - unsigned int duty; - unsigned int config; - unsigned int status; -}; - -static struct wmt_pwm_reg_t g_pwm_setting; - -#define ENV_LCD_BACKLIGHT "wmt.display.pwm" - -extern int wmt_getsyspara(char *varname, unsigned char *varval, int *varlen); - -struct back_light_limit { - int max; - int min; - int diff; - int step; - int allheigh; -}; - -struct back_light_limit g_backlight_limit; - -static unsigned int g_oldbrightness; -static unsigned int g_isresume = 0; - -extern void vpp_set_lvds_blank(int blank); - - -void backlight_get_env(void) -{ - unsigned char buf[100]; - int varlen = 100; - int max = -1, min = -1; - int val = -1; - - memset((char *)&g_backlight_limit, 0, sizeof(struct back_light_limit)); - if( wmt_getsyspara(ENV_LCD_BACKLIGHT,buf,&varlen) == 0) { - //printk("\r\n backlight_get_env : %s = %s \n",ENV_LCD_BACKLIGHT,buf); - sscanf(buf,"%x",&val); - g_pwm_setting.id = val&0x0F; - if (g_pwm_setting.id > 1) { - printk("PWM%d is invaild , using default PWM0\n", g_pwm_setting.id); - g_pwm_setting.id = 0; - } - min = (val >> 8)&0xff; - max = (val >> 16)&0xff; - if ((min >= max) || (max > 100) || (min < 0)) { - printk("backlight_get_env error : max = %d , min = %d ", max, min); - goto out; - } - g_backlight_limit.max = max; - g_backlight_limit.min = min; - } else { - printk("## Warning: %s not defined\n",ENV_LCD_BACKLIGHT); - goto out; - } - return; -out: - g_pwm_setting.id = 0; - g_backlight_limit.max = 90; - g_backlight_limit.min = 10; -} - - -/* - * For simplicity, we use "brightness" as if it were a linear function - * of PWM duty cycle. However, a logarithmic function of duty cycle is - * probably a better match for perceived brightness: two is half as bright - * as four, four is half as bright as eight, etc - */ -static void lcd_brightness(struct led_classdev *cdev, enum led_brightness b) -{ - unsigned int duty; - int val = 0; - - /*printk(KERN_ALERT "[%s]pwm_no = %d pwm_period = %d b= %d\n", __func__, pwm_no,pwm_period, b);*/ - - if (g_isresume == 1) { - if (b <= g_oldbrightness) - return; - g_isresume = 0; - } - g_oldbrightness = b; - if (!b) { - g_pwm_setting.status = BACKLIGHT_CLOSE; - pwm_set_gpio(g_pwm_setting.id, 0); - /*vpp_set_lvds_blank(1);*/ - return; - } - - if ((b != 255) || (!g_backlight_limit.allheigh)) { - val = (b*g_backlight_limit.diff*1000)/255; - duty = (val * g_backlight_limit.step) /1000; - duty = (duty + g_backlight_limit.min)/1000; - if(duty) { - if(--duty > 0xFFF) - duty = 0xFFF; - } - } else - duty = g_backlight_limit.max/1000; - - //printk("max = %d , min = %d , b= %d , duty = %d\n", g_backlight_limit.max, g_backlight_limit.min, b,duty); - duty = duty-1; - - pwm_set_duty(g_pwm_setting.id, duty); - - //fix : framework do not set brightness to 0 when suspend - //if (g_pwm_setting.status == BACKLIGHT_CLOSE) { - if (!get_lcd_power()) { - /*vpp_set_lvds_blank(0);*/ - pwm_set_gpio(g_pwm_setting.id, 1); - g_pwm_setting.status = BACKLIGHT_ON; - } -} - -/* - * NOTE: we reuse the platform_data structure of GPIO leds, - * but repurpose its "gpio" number as a PWM channel number. - */ -static int lcd_backlight_probe(struct platform_device *pdev) -{ - const struct gpio_led_platform_data *pdata; - struct led_classdev *leds; - int i; - int status; - unsigned int brightness; - unsigned int pwm_period; - - pdata = pdev->dev.platform_data; - if (!pdata || pdata->num_leds < 1) - return -ENODEV; - - leds = kcalloc(pdata->num_leds, sizeof(*leds), GFP_KERNEL); - if (!leds) - return -ENOMEM; - - auto_pll_divisor(DEV_PWM,CLK_ENABLE,0,0); - - pwm_period = pwm_get_period(g_pwm_setting.id) + 1; - pwm_period = pwm_period*1000; - backlight_get_env(); - g_backlight_limit.allheigh = 0; - if (g_backlight_limit.max == 100) - g_backlight_limit.allheigh = 1; - g_backlight_limit.diff = (g_backlight_limit.max - g_backlight_limit.min); - g_backlight_limit.max = (pwm_period*g_backlight_limit.max)/100; - g_backlight_limit.min = (pwm_period*g_backlight_limit.min)/100; - g_backlight_limit.step = (g_backlight_limit.max - g_backlight_limit.min) / g_backlight_limit.diff; - - /*calculate the default brightness*/ - brightness = (pwm_get_duty(g_pwm_setting.id) * 255) / pwm_period; - - for (i = 0; i < pdata->num_leds; i++) { - struct led_classdev *led = leds + i; - const struct gpio_led *dat = pdata->leds + i; - - led->name = dat->name; - led->brightness = brightness; - led->brightness_set = lcd_brightness; - led->default_trigger = dat->default_trigger; - - /* Hand it over to the LED framework */ - status = led_classdev_register(&pdev->dev, led); - if (status < 0) { - goto err; - } - } - - platform_set_drvdata(pdev, leds); - g_pwm_setting.status = BACKLIGHT_ON; - return 0; - -err: - if (i > 0) { - for (i = i - 1; i >= 0; i--) { - led_classdev_unregister(leds + i); - } - } - kfree(leds); - - return status; -} - -static int __exit lcd_backlight_remove(struct platform_device *pdev) -{ - const struct gpio_led_platform_data *pdata; - struct led_classdev *leds; - unsigned i; - - pdata = pdev->dev.platform_data; - leds = platform_get_drvdata(pdev); - - for (i = 0; i < pdata->num_leds; i++) { - struct led_classdev *led = leds + i; - - led_classdev_unregister(led); - } - - kfree(leds); - platform_set_drvdata(pdev, NULL); - return 0; -} - -static int lcd_backlight_suspend -( - struct platform_device *pdev, /*!<; // a pointer point to struct device */ - pm_message_t state /*!<; // suspend state */ -) -{ - unsigned int addr; - - addr = PWM_CTRL_REG_ADDR + (0x10 * g_pwm_setting.id); - g_pwm_setting.config = (REG32_VAL(addr) & 0xFFF); - pwm_set_control(g_pwm_setting.id, 0); - addr = PWM_PERIOD_REG_ADDR + (0x10 * g_pwm_setting.id); - g_pwm_setting.period = (REG32_VAL(addr) & 0xFFF); - - addr = PWM_SCALAR_REG_ADDR + (0x10 * g_pwm_setting.id); - g_pwm_setting.scalar = (REG32_VAL(addr) & 0xFFF); - //g_pwm_setting.duty = 0; // for android , AP will set duty to 0 - - return 0; -} - -static int lcd_backlight_resume -( - struct platform_device *pdev /*!<; // a pointer point to struct device */ -) -{ - pwm_set_scalar(g_pwm_setting.id, g_pwm_setting.scalar); - pwm_set_period(g_pwm_setting.id, g_pwm_setting.period); - - pwm_set_duty(g_pwm_setting.id, 5); - pwm_set_control(g_pwm_setting.id, g_pwm_setting.config); - - g_isresume = 1; - - return 0; -} - - -static struct gpio_led lcd_pwm[] = { - { - .name = "lcd-backlight", - }, -}; - - -static struct gpio_led_platform_data lcd_backlight_data = { - .leds = lcd_pwm, - .num_leds = ARRAY_SIZE(lcd_pwm), -}; - -static struct platform_device lcd_backlight_device = { - .name = "lcd-backlight", - .id = 0, - .dev = { .platform_data = &lcd_backlight_data, - }, -}; - -static struct platform_driver lcd_backlight_driver = { - .driver = { - .name = "lcd-backlight", - .owner = THIS_MODULE, - }, - /* REVISIT add suspend() and resume() methods */ - .probe = lcd_backlight_probe, - .remove = __exit_p(lcd_backlight_remove), - .suspend = lcd_backlight_suspend, - .resume = lcd_backlight_resume -}; - -static int __init lcd_backlight_init(void) -{ - int ret; - - ret = platform_device_register(&lcd_backlight_device); - if(ret) { - printk("[lcd_backlight_init]Error: Can not register LCD backlight device\n"); - return ret; - } - //ret = platform_driver_probe(&lcd_backlight_driver, lcd_backlight_probe); - ret = platform_driver_register(&lcd_backlight_driver); - if(ret) { - printk("[lcd_backlight_init]Error: Can not register LCD backlight driver\n"); - platform_device_unregister(&lcd_backlight_device); - return ret; - } - return 0; -} -module_init(lcd_backlight_init); - -static void __exit lcd_backlight_exit(void) -{ - platform_driver_unregister(&lcd_backlight_driver); - platform_device_unregister(&lcd_backlight_device); -} -module_exit(lcd_backlight_exit); - -MODULE_DESCRIPTION("Driver for LCD with PWM-controlled brightness"); -MODULE_LICENSE("GPL"); - |