diff options
author | Nitin Garg <nitin.garg@freescale.com> | 2012-02-05 11:00:19 -0600 |
---|---|---|
committer | Nitin Garg <nitin.garg@freescale.com> | 2012-02-05 11:00:19 -0600 |
commit | 1edd3fa4317853c8005c59a3658da9efe67e06d9 (patch) | |
tree | 9e42d0aabaa0a8a76f789e41b487b9a409c85fcd | |
parent | 221fa518594805de5a3feb314c97e799bbd3fbeb (diff) |
ENGR00171215: Battery, Shutdown, Suspend support
Added support for battery, shutdown and suspend/resume
for mx53 smd.
Signed-off-by: Nitin Garg <nitin.garg@freescale.com>
-rw-r--r-- | arch/arm/configs/imx5_android_defconfig | 51 | ||||
-rw-r--r-- | arch/arm/mach-mx5/board-mx53_smd.c | 71 | ||||
-rw-r--r-- | arch/arm/mach-mx5/clock.c | 12 | ||||
-rw-r--r-- | arch/arm/mach-mx5/mx53_smd_pmic_da9053.c | 21 | ||||
-rw-r--r-- | arch/arm/plat-mxc/system.c | 28 |
5 files changed, 167 insertions, 16 deletions
diff --git a/arch/arm/configs/imx5_android_defconfig b/arch/arm/configs/imx5_android_defconfig index 58b1a32aede4..23a2538d3e99 100644 --- a/arch/arm/configs/imx5_android_defconfig +++ b/arch/arm/configs/imx5_android_defconfig @@ -1,7 +1,7 @@ # # Automatically generated make config: don't edit # Linux/arm 2.6.38 Kernel Configuration -# Thu Jan 12 13:48:58 2012 +# Fri Feb 3 18:50:35 2012 # CONFIG_ARM=y CONFIG_HAVE_PWM=y @@ -512,6 +512,7 @@ CONFIG_WAKELOCK_STAT=y CONFIG_USER_WAKELOCK=y CONFIG_EARLYSUSPEND=y # CONFIG_NO_USER_SPACE_SCREEN_ACCESS_CONTROL is not set +# CONFIG_CONSOLE_EARLYSUSPEND is not set CONFIG_FB_EARLYSUSPEND=y CONFIG_APM_EMULATION=y CONFIG_PM_RUNTIME=y @@ -1211,6 +1212,7 @@ CONFIG_KEYBOARD_ATKBD=y CONFIG_KEYBOARD_GPIO=y # CONFIG_KEYBOARD_TCA6416 is not set # CONFIG_KEYBOARD_MATRIX is not set +# CONFIG_KEYBOARD_LM8323 is not set # CONFIG_KEYBOARD_MAX7359 is not set # CONFIG_KEYBOARD_MCS is not set # CONFIG_KEYBOARD_IMX is not set @@ -1292,7 +1294,11 @@ CONFIG_SERIO_LIBPS2=y # # Character devices # -# CONFIG_VT is not set +CONFIG_VT=y +CONFIG_CONSOLE_TRANSLATIONS=y +CONFIG_VT_CONSOLE=y +CONFIG_HW_CONSOLE=y +# CONFIG_VT_HW_CONSOLE_BINDING is not set CONFIG_DEVMEM=y # CONFIG_DEVKMEM is not set # CONFIG_SERIAL_NONSTANDARD is not set @@ -1455,6 +1461,7 @@ CONFIG_POWER_SUPPLY=y # CONFIG_BATTERY_DS2782 is not set # CONFIG_BATTERY_BQ20Z75 is not set # CONFIG_BATTERY_BQ27x00 is not set +CONFIG_BATTERY_MAX17085=y # CONFIG_BATTERY_MAX17040 is not set # CONFIG_BATTERY_MAX17042 is not set # CONFIG_CHARGER_ISP1704 is not set @@ -1467,7 +1474,7 @@ CONFIG_HWMON=y # # Native drivers # -# CONFIG_SENSORS_DA9052 is not set +CONFIG_SENSORS_DA9052=y # CONFIG_SENSORS_AD7414 is not set # CONFIG_SENSORS_AD7418 is not set # CONFIG_SENSORS_ADCXX is not set @@ -1552,7 +1559,21 @@ CONFIG_SENSORS_MAG3110=y CONFIG_MXC_MMA8450=y CONFIG_MXC_MMA8451=y # CONFIG_THERMAL is not set -# CONFIG_WATCHDOG is not set +CONFIG_WATCHDOG=y +# CONFIG_WATCHDOG_NOWAYOUT is not set + +# +# Watchdog Device Drivers +# +# CONFIG_SOFT_WATCHDOG is not set +# CONFIG_MAX63XX_WATCHDOG is not set +CONFIG_IMX2_WDT=y +# CONFIG_DA9052_WATCHDOG is not set + +# +# USB-based Watchdog Cards +# +# CONFIG_USBPCWATCHDOG is not set CONFIG_SSB_POSSIBLE=y # @@ -1838,6 +1859,12 @@ CONFIG_FB_MXC_SII902X=y # CONFIG_FB_MXC_EINK_PANEL is not set # CONFIG_FB_MXC_ELCDIF_FB is not set # CONFIG_FB_MXC_HDMI is not set + +# +# Console display driver support +# +CONFIG_DUMMY_CONSOLE=y +# CONFIG_FRAMEBUFFER_CONSOLE is not set CONFIG_LOGO=y # CONFIG_LOGO_LINUX_MONO is not set # CONFIG_LOGO_LINUX_VGA16 is not set @@ -2189,11 +2216,24 @@ CONFIG_MMC_SDHCI_ESDHC_IMX=y # CONFIG_MMC_USHC is not set # CONFIG_MEMSTICK is not set CONFIG_NEW_LEDS=y -# CONFIG_LEDS_CLASS is not set +CONFIG_LEDS_CLASS=y # # LED drivers # +# CONFIG_LEDS_PCA9532 is not set +# CONFIG_LEDS_GPIO is not set +# CONFIG_LEDS_LP3944 is not set +# CONFIG_LEDS_LP5521 is not set +# CONFIG_LEDS_LP5523 is not set +# CONFIG_LEDS_PCA955X is not set +# CONFIG_LEDS_DAC124S085 is not set +# CONFIG_LEDS_PWM is not set +# CONFIG_LEDS_REGULATOR is not set +# CONFIG_LEDS_BD2802 is not set +# CONFIG_LEDS_LT3593 is not set +# CONFIG_LEDS_MC13783 is not set +# CONFIG_LEDS_TRIGGERS is not set # # LED Triggers @@ -2364,6 +2404,7 @@ CONFIG_AR600x_SD31_XXX=y # # Speakup console speech # +# CONFIG_SPEAKUP is not set # CONFIG_TOUCHSCREEN_CLEARPAD_TM1217 is not set # CONFIG_TOUCHSCREEN_SYNAPTICS_I2C_RMI4 is not set CONFIG_CLKDEV_LOOKUP=y diff --git a/arch/arm/mach-mx5/board-mx53_smd.c b/arch/arm/mach-mx5/board-mx53_smd.c index 929d3d147505..1bf3ac6cdf4f 100644 --- a/arch/arm/mach-mx5/board-mx53_smd.c +++ b/arch/arm/mach-mx5/board-mx53_smd.c @@ -34,6 +34,7 @@ #include <linux/ipu.h> #include <linux/spi/spi.h> #include <linux/spi/flash.h> +#include <linux/mfd/da9052/da9052.h> #include <linux/mtd/mtd.h> #include <linux/mtd/map.h> @@ -408,7 +409,7 @@ static iomux_v3_cfg_t mx53_smd_pads[] = { }; #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE) -#define GPIO_BUTTON(gpio_num, ev_code, act_low, descr, wake) \ +#define GPIO_BUTTON(gpio_num, ev_code, act_low, descr, wake, debounce_ms) \ { \ .gpio = gpio_num, \ .type = EV_KEY, \ @@ -416,12 +417,13 @@ static iomux_v3_cfg_t mx53_smd_pads[] = { .active_low = act_low, \ .desc = "btn " descr, \ .wakeup = wake, \ + .debounce_interval = debounce_ms, \ } static struct gpio_keys_button smd_buttons[] = { - GPIO_BUTTON(MX53_SMD_PMIC_ON_OFF_REQ, KEY_POWER, 1, "power", 0), - GPIO_BUTTON(MX53_SMD_UI1, KEY_VOLUMEUP, 1, "volume-up", 0), - GPIO_BUTTON(MX53_SMD_UI2, KEY_VOLUMEDOWN, 1, "volume-down", 0), + GPIO_BUTTON(MX53_SMD_PMIC_ON_OFF_REQ, KEY_POWER, 0, "power", 0, 100), + GPIO_BUTTON(MX53_SMD_UI1, KEY_VOLUMEUP, 1, "volume-up", 0, 0), + GPIO_BUTTON(MX53_SMD_UI2, KEY_VOLUMEDOWN, 1, "volume-down", 0, 0), }; static struct gpio_keys_platform_data smd_button_data = { @@ -502,6 +504,7 @@ static const struct esdhc_platform_data mx53_smd_sd1_data __initconst = { static const struct esdhc_platform_data mx53_smd_sd2_data __initconst = { .always_present = 1, + .keep_power_at_suspend = 1, }; static const struct esdhc_platform_data mx53_smd_sd3_data __initconst = { @@ -958,6 +961,50 @@ static struct mxc_regulator_platform_data smd_regulator_data = { .vcc_reg_id = "DA9052_BUCK_PRO", }; +#if defined(CONFIG_BATTERY_MAX17085) || defined(CONFIG_BATTERY_MAX17085_MODULE) +static struct resource smd_batt_resource[] = { + { + .flags = IORESOURCE_IO, + .name = "pwr-good", + .start = MX53_SMD_PWR_GOOD, + .end = MX53_SMD_PWR_GOOD, + }, + { + .flags = IORESOURCE_IO, + .name = "ac-in", + .start = MX53_SMD_AC_IN, + .end = MX53_SMD_AC_IN, + }, + { + .flags = IORESOURCE_IO, + .name = "charge-now", + .start = MX53_SMD_CHRG_OR_CMOS, + .end = MX53_SMD_CHRG_OR_CMOS, + }, + { + .flags = IORESOURCE_IO, + .name = "charge-done", + .start = MX53_SMD_USER_DEG_CHG_NONE, + .end = MX53_SMD_USER_DEG_CHG_NONE, + }, +}; + +static struct platform_device smd_battery_device = { + .name = "max17085_bat", + .resource = smd_batt_resource, + .num_resources = ARRAY_SIZE(smd_batt_resource), +}; + +static void __init smd_add_device_battery(void) +{ + platform_device_register(&smd_battery_device); +} +#else +static void __init smd_add_device_battery(void) +{ +} +#endif + extern struct imx_mxc_gpu_data imx53_gpu_data; static void __init fixup_mxc_board(struct machine_desc *desc, struct tag *tags, @@ -1008,6 +1055,21 @@ static void __init fixup_mxc_board(struct machine_desc *desc, struct tag *tags, } } +static void mx53_smd_power_off(void) +{ + /* power off by sending shutdown command to da9053*/ + da9053_power_off(); +} + +static int __init mx53_smd_power_init(void) +{ + if (machine_is_mx53_smd()) + pm_power_off = mx53_smd_power_off; + + return 0; +} +late_initcall(mx53_smd_power_init); + static void __init mx53_smd_board_init(void) { int i; @@ -1154,6 +1216,7 @@ static void __init mx53_smd_board_init(void) imx53_add_mxc_scc2(); mx5_cpu_regulator_init(); + smd_add_device_battery(); } static void __init mx53_smd_timer_init(void) diff --git a/arch/arm/mach-mx5/clock.c b/arch/arm/mach-mx5/clock.c index d34a8c944fe4..7ee4b00bc349 100644 --- a/arch/arm/mach-mx5/clock.c +++ b/arch/arm/mach-mx5/clock.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2008-2011 Freescale Semiconductor, Inc. All Rights Reserved. + * Copyright (C) 2008-2012 Freescale Semiconductor, Inc. All Rights Reserved. */ /* @@ -4414,6 +4414,10 @@ static struct clk asrc_clk[] = { }, }; +static struct clk dummy_clk = { + .id = 0, +}; + #define _REGISTER_CLOCK(d, n, c) \ { \ .dev_id = d, \ @@ -4494,6 +4498,8 @@ static struct clk_lookup lookups[] = { _REGISTER_CLOCK(NULL, "gpt", gpt_clk[0]), _REGISTER_CLOCK("fec.0", NULL, fec_clk[0]), _REGISTER_CLOCK("mxc_w1.0", NULL, owire_clk), + _REGISTER_CLOCK("imx2-wdt.0", NULL, dummy_clk), + _REGISTER_CLOCK("imx2-wdt.1", NULL, dummy_clk), }; static struct clk_lookup mx51_lookups[] = { @@ -4594,7 +4600,6 @@ static void clk_tree_init(void) int __init mx51_clocks_init(unsigned long ckil, unsigned long osc, unsigned long ckih1, unsigned long ckih2) { - __iomem void *base; struct clk *tclk; int i = 0, j = 0, reg; int op_cnt = 0; @@ -4896,9 +4901,8 @@ int __init mx51_clocks_init(unsigned long ckil, unsigned long osc, unsigned long int __init mx53_clocks_init(unsigned long ckil, unsigned long osc, unsigned long ckih1, unsigned long ckih2) { - __iomem void *base; struct clk *tclk; - int i = 0, j = 0, reg; + int i = 0, reg; u32 pll1_rate; pll1_base = MX53_DPLL1_BASE; diff --git a/arch/arm/mach-mx5/mx53_smd_pmic_da9053.c b/arch/arm/mach-mx5/mx53_smd_pmic_da9053.c index 72436680eede..df93412a8274 100644 --- a/arch/arm/mach-mx5/mx53_smd_pmic_da9053.c +++ b/arch/arm/mach-mx5/mx53_smd_pmic_da9053.c @@ -178,6 +178,25 @@ static struct da9052_leds_platform_data da9052_gpio_leds = { }; +static struct da9052_bat_platform_data da9052_bat = { + .sw_temp_control_en = 0, + .monitoring_interval = 500, + .sw_bat_temp_threshold = 60, + .sw_junc_temp_threshold = 120, + .hysteresis_window_size = 1, + .current_monitoring_window = 10, + .bat_with_no_resistor = 62, + .bat_capacity_limit_low = 4, + .bat_capacity_full = 100, + .bat_capacity_limit_high = 70, + .chg_hysteresis_const = 89, + .hysteresis_reading_interval = 1000, + .hysteresis_no_of_reading = 10, + .filter_size = 4, + .bat_volt_cutoff = 2800, + .vbat_first_valid_detect_iteration = 3, +}; + static void da9052_init_ssc_cache(struct da9052 *da9052) { unsigned char cnt; @@ -296,7 +315,7 @@ static struct da9052_platform_data __initdata da9052_plat = { .regulators = da9052_regulators_init, .led_data = &da9052_gpio_leds, .tsi_data = &da9052_tsi, - /* .bat_data = &da9052_bat, */ + .bat_data = &da9052_bat, /* .gpio_base = GPIO_BOARD_START, */ }; diff --git a/arch/arm/plat-mxc/system.c b/arch/arm/plat-mxc/system.c index 415e828ea20b..8ce9ee0ccc3f 100644 --- a/arch/arm/plat-mxc/system.c +++ b/arch/arm/plat-mxc/system.c @@ -1,7 +1,7 @@ /* * Copyright (C) 1999 ARM Limited * Copyright (C) 2000 Deep Blue Solutions Ltd - * Copyright 2006-2011 Freescale Semiconductor, Inc. + * Copyright (C) 2006-2012 Freescale Semiconductor, Inc. * Copyright 2008 Juergen Beisert, kernel@pengutronix.de * Copyright 2009 Ilya Yanok, Emcraft Systems Ltd, yanok@emcraft.com * @@ -14,6 +14,10 @@ * 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> @@ -21,17 +25,22 @@ #include <linux/io.h> #include <linux/err.h> #include <linux/delay.h> + +#include <asm/mach-types.h> +#include <mach/iomux-mx53.h> #include <mach/hardware.h> #include <mach/common.h> #include <asm/proc-fns.h> #include <asm/system.h> + #ifdef CONFIG_SMP #include <linux/smp.h> #endif #include <asm/mach-types.h> static void __iomem *wdog_base; - +extern int dvfs_core_is_active; +extern void stop_dvfs(void); /* * Reset the system. It is called by machine_restart(). */ @@ -69,6 +78,21 @@ void arch_reset(char mode, const char *cmd) return; } #endif +#ifdef CONFIG_ARCH_MX51 + /* Workaround to reset NFC_CONFIG3 register + * due to the chip warm reset does not reset it + */ + if (cpu_is_mx53()) + __raw_writel(0x20600, MX53_IO_ADDRESS(MX53_NFC_BASE_ADDR)+0x28); + if (cpu_is_mx51()) + __raw_writel(0x20600, MX51_IO_ADDRESS(MX51_NFC_BASE_ADDR)+0x28); +#endif + +#ifdef CONFIG_ARCH_MX5 + /* Stop DVFS-CORE before reboot. */ + if (dvfs_core_is_active) + stop_dvfs(); +#endif if (cpu_is_mx1()) { wcr_enable = (1 << 0); |