summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNitin Garg <nitin.garg@freescale.com>2012-02-05 11:00:19 -0600
committerNitin Garg <nitin.garg@freescale.com>2012-02-05 11:00:19 -0600
commit1edd3fa4317853c8005c59a3658da9efe67e06d9 (patch)
tree9e42d0aabaa0a8a76f789e41b487b9a409c85fcd
parent221fa518594805de5a3feb314c97e799bbd3fbeb (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_defconfig51
-rw-r--r--arch/arm/mach-mx5/board-mx53_smd.c71
-rw-r--r--arch/arm/mach-mx5/clock.c12
-rw-r--r--arch/arm/mach-mx5/mx53_smd_pmic_da9053.c21
-rw-r--r--arch/arm/plat-mxc/system.c28
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);