[ARM] tegra: stingray: Support soft reset
authorGreg Meiste <w30289@motorola.com>
Fri, 20 Aug 2010 15:05:57 +0000 (10:05 -0500)
committerColin Cross <ccross@android.com>
Wed, 6 Oct 2010 23:33:43 +0000 (16:33 -0700)
Changes to allow last_kmsg to survive a reset.

Change-Id: I8b2830bd919cacd0346b2b8319c504625258dff0
Signed-off-by: Greg Meiste <w30289@motorola.com>
arch/arm/mach-tegra/board-stingray-power.c
arch/arm/mach-tegra/board-stingray.c

index a13a6b67520c46e82a01cb10749cad12278abf50..ffda3a90bdb6a82dfa5db8fe9e7336d9f0609346 100644 (file)
@@ -172,6 +172,13 @@ static int cpcap_validity_probe(struct platform_device *pdev)
        } else
                dev_info(&pdev->dev, "Not starting macro 14 (no hw support)\n");
 
+       /* Enable workaround to allow soft resets to work */
+       /* TODO: Only enable this on non-production hardware. */
+       cpcap_regacc_write(cpcap_di, CPCAP_REG_PGC,
+                          CPCAP_BIT_SYS_RST_MODE, CPCAP_BIT_SYS_RST_MODE);
+       err = cpcap_uc_start(cpcap_di, CPCAP_MACRO_15);
+       dev_info(&pdev->dev, "Started macro 15: %d\n", err);
+
        return 0;
 }
 
index 1e311b02c0c3e2378293e6f851fac61bbdffd18c..31664c7fd1583e5ac6093c3fc45226582654ed97 100644 (file)
@@ -47,6 +47,7 @@
 #include <mach/i2s.h>
 #include <mach/audio.h>
 #include <mach/cpcap_audio.h>
+#include <mach/system.h>
 
 #include <linux/usb/android_composite.h>
 
@@ -785,6 +786,17 @@ static void __init tegra_stingray_fixup(struct machine_desc *desc, struct tag *t
        mi->bank[1].size = SZ_512M - SZ_256K;
 }
 
+static void stingray_reset(char mode, const char *cmd)
+{
+       /* Signal to CPCAP to stop the uC. */
+       gpio_set_value(TEGRA_GPIO_PG3, 0);
+       mdelay(100);
+       gpio_set_value(TEGRA_GPIO_PG3, 1);
+       mdelay(100);
+
+       tegra_assert_system_reset();
+}
+
 static void stingray_power_off(void)
 {
        printk(KERN_INFO "stingray_pm_power_off...\n");
@@ -802,6 +814,11 @@ static void stingray_power_off(void)
 
 static void __init stingray_power_off_init(void)
 {
+       tegra_gpio_enable(TEGRA_GPIO_PG3);
+       gpio_request(TEGRA_GPIO_PG3, "sys_restart_b");
+       gpio_direction_output(TEGRA_GPIO_PG3, 1);
+       tegra_reset = stingray_reset;
+
        tegra_gpio_enable(TEGRA_GPIO_PV7);
        if (!gpio_request(TEGRA_GPIO_PV7, "wdi"))
                pm_power_off = stingray_power_off;
@@ -887,10 +904,6 @@ static void __init tegra_stingray_init(void)
        gpio_request(TEGRA_GPIO_PV4, "usb_data_en");
        gpio_direction_output(TEGRA_GPIO_PV4, 1);
 
-       tegra_gpio_enable(TEGRA_GPIO_PG3);
-       gpio_request(TEGRA_GPIO_PG3, "sys_restart_b");
-       gpio_direction_output(TEGRA_GPIO_PG3, 1);
-
        /* ULPI_PHY_RESET_B (TEGRA_GPIO_PG2) can be initialized as
           output low when the kernel boots.
           FIXME: This will need to be evaluated for datacard scenarios