mdm9x25: fastboot reboot

Adds support for reboot command.

Change-Id: I6e5f98d79683397f2fd2395f1a4f30a438b4be62
diff --git a/target/mdm9625/init.c b/target/mdm9625/init.c
index f03bef2..ac1906e 100644
--- a/target/mdm9625/init.c
+++ b/target/mdm9625/init.c
@@ -36,12 +36,19 @@
 #include <qpic_nand.h>
 #include <ctype.h>
 #include <string.h>
+#include <pm8x41.h>
+#include <reg.h>
+#include <platform/timer.h>
 
 extern void smem_ptable_init(void);
 extern void smem_add_modem_partitions(struct ptable *flash_ptable);
 
 static struct ptable flash_ptable;
 
+/* PMIC config data */
+#define PMIC_ARB_CHANNEL_NUM    0
+#define PMIC_ARB_OWNER_ID       0
+
 /* NANDc BAM pipe numbers */
 #define DATA_CONSUMER_PIPE                            0
 #define DATA_PRODUCER_PIPE                            1
@@ -81,6 +88,8 @@
 {
 	dprintf(INFO, "target_init()\n");
 
+	spmi_init(PMIC_ARB_CHANNEL_NUM, PMIC_ARB_OWNER_ID);
+
 	config.pipes.read_pipe = DATA_PRODUCER_PIPE;
 	config.pipes.write_pipe = DATA_CONSUMER_PIPE;
 	config.pipes.cmd_pipe = CMD_PIPE;
@@ -104,6 +113,17 @@
 /* reboot */
 void reboot_device(unsigned reboot_reason)
 {
+	/* Write the reboot reason */
+	writel(reboot_reason, RESTART_REASON_ADDR);
+
+	/* Configure PMIC for warm reset */
+	pm8x41_reset_configure(PON_PSHOLD_WARM_RESET);
+
+	/* Drop PS_HOLD for MSM */
+	writel(0x00, MPM2_MPM_PS_HOLD);
+
+	mdelay(5000);
+
 	dprintf(CRITICAL, "Rebooting failed\n");
 	return;
 }