summaryrefslogtreecommitdiff
path: root/ANDROID_3.4.5/drivers/leds
diff options
context:
space:
mode:
Diffstat (limited to 'ANDROID_3.4.5/drivers/leds')
-rw-r--r--ANDROID_3.4.5/drivers/leds/Kconfig494
-rw-r--r--ANDROID_3.4.5/drivers/leds/Makefile62
-rw-r--r--ANDROID_3.4.5/drivers/leds/dell-led.c202
-rw-r--r--ANDROID_3.4.5/drivers/leds/led-class.c242
-rw-r--r--ANDROID_3.4.5/drivers/leds/led-core.c95
-rw-r--r--ANDROID_3.4.5/drivers/leds/led-triggers.c300
-rw-r--r--ANDROID_3.4.5/drivers/leds/leds-88pm860x.c269
-rw-r--r--ANDROID_3.4.5/drivers/leds/leds-adp5520.c221
-rw-r--r--ANDROID_3.4.5/drivers/leds/leds-asic3.c187
-rw-r--r--ANDROID_3.4.5/drivers/leds/leds-atmel-pwm.c151
-rw-r--r--ANDROID_3.4.5/drivers/leds/leds-bd2802.c819
-rw-r--r--ANDROID_3.4.5/drivers/leds/leds-clevo-mail.c219
-rw-r--r--ANDROID_3.4.5/drivers/leds/leds-cobalt-qube.c92
-rw-r--r--ANDROID_3.4.5/drivers/leds/leds-cobalt-raq.c139
-rw-r--r--ANDROID_3.4.5/drivers/leds/leds-da903x.c167
-rw-r--r--ANDROID_3.4.5/drivers/leds/leds-dac124s085.c139
-rw-r--r--ANDROID_3.4.5/drivers/leds/leds-fsg.c231
-rwxr-xr-xANDROID_3.4.5/drivers/leds/leds-genesis.c355
-rw-r--r--ANDROID_3.4.5/drivers/leds/leds-gpio-register.c42
-rw-r--r--ANDROID_3.4.5/drivers/leds/leds-gpio.c300
-rw-r--r--ANDROID_3.4.5/drivers/leds/leds-hp6xx.c96
-rw-r--r--ANDROID_3.4.5/drivers/leds/leds-lm3530.c485
-rw-r--r--ANDROID_3.4.5/drivers/leds/leds-locomo.c97
-rw-r--r--ANDROID_3.4.5/drivers/leds/leds-lp3944.c460
-rw-r--r--ANDROID_3.4.5/drivers/leds/leds-lp5521.c897
-rw-r--r--ANDROID_3.4.5/drivers/leds/leds-lp5523.c1026
-rw-r--r--ANDROID_3.4.5/drivers/leds/leds-lt3593.c207
-rw-r--r--ANDROID_3.4.5/drivers/leds/leds-max8997.c372
-rw-r--r--ANDROID_3.4.5/drivers/leds/leds-mc13783.c393
-rw-r--r--ANDROID_3.4.5/drivers/leds/leds-net48xx.c97
-rw-r--r--ANDROID_3.4.5/drivers/leds/leds-netxbig.c426
-rw-r--r--ANDROID_3.4.5/drivers/leds/leds-ns2.c332
-rw-r--r--ANDROID_3.4.5/drivers/leds/leds-ot200.c171
-rw-r--r--ANDROID_3.4.5/drivers/leds/leds-pca9532.c496
-rw-r--r--ANDROID_3.4.5/drivers/leds/leds-pca955x.c378
-rw-r--r--ANDROID_3.4.5/drivers/leds/leds-pca9633.c193
-rw-r--r--ANDROID_3.4.5/drivers/leds/leds-pwm.c143
-rw-r--r--ANDROID_3.4.5/drivers/leds/leds-rb532.c65
-rw-r--r--ANDROID_3.4.5/drivers/leds/leds-regulator.c237
-rw-r--r--ANDROID_3.4.5/drivers/leds/leds-renesas-tpu.c346
-rw-r--r--ANDROID_3.4.5/drivers/leds/leds-s3c24xx.c129
-rw-r--r--ANDROID_3.4.5/drivers/leds/leds-ss4200.c557
-rw-r--r--ANDROID_3.4.5/drivers/leds/leds-sunfire.c276
-rw-r--r--ANDROID_3.4.5/drivers/leds/leds-tca6507.c776
-rw-r--r--ANDROID_3.4.5/drivers/leds/leds-wm831x-status.c332
-rw-r--r--ANDROID_3.4.5/drivers/leds/leds-wm8350.c300
-rwxr-xr-xANDROID_3.4.5/drivers/leds/leds-wmt.c63
-rw-r--r--ANDROID_3.4.5/drivers/leds/leds-wrap.c154
-rw-r--r--ANDROID_3.4.5/drivers/leds/leds.h61
-rw-r--r--ANDROID_3.4.5/drivers/leds/ledtrig-backlight.c164
-rw-r--r--ANDROID_3.4.5/drivers/leds/ledtrig-default-on.c45
-rw-r--r--ANDROID_3.4.5/drivers/leds/ledtrig-gpio.c251
-rw-r--r--ANDROID_3.4.5/drivers/leds/ledtrig-heartbeat.c119
-rw-r--r--ANDROID_3.4.5/drivers/leds/ledtrig-ide-disk.c64
-rw-r--r--ANDROID_3.4.5/drivers/leds/ledtrig-sleep.c80
-rw-r--r--ANDROID_3.4.5/drivers/leds/ledtrig-timer.c139
-rwxr-xr-xANDROID_3.4.5/drivers/leds/wmt-lcd-backlight.c329
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");
-