aboutsummaryrefslogtreecommitdiff
path: root/arch/arm/mach-ux500/tee_ta_start_modem_svp.c
diff options
context:
space:
mode:
authorMathieu J. Poirier <mathieu.poirier@linaro.org>2011-09-29 15:10:39 -0600
committerMathieu J. Poirier <mathieu.poirier@linaro.org>2011-09-29 15:10:39 -0600
commit7118ded1c4dbdee31da6876b1839a1b647bc41df (patch)
treecf926790ce9fe3bb3b35baef5a9b7289e519cade /arch/arm/mach-ux500/tee_ta_start_modem_svp.c
parent0023ca51966eb6e302f3cb945dbff9e794be615f (diff)
parent2036fd76350799bb2b53b309d0ac6d60692fe890 (diff)
downloadsnowball-7118ded1c4dbdee31da6876b1839a1b647bc41df.tar.gz
Merge branch 'linaro.linux-3.0-android-ux500.master' into linux-linaro-3.0-2011.09-0-android-1
Signed-off-by: Mathieu J. Poirier <mathieu.poirier@linaro.org> Conflicts: arch/arm/common/Makefile arch/arm/configs/android_omap3_defconfig arch/arm/configs/android_omap4_defconfig arch/arm/kernel/entry-armv.S drivers/gpu/ion/ion.c drivers/misc/Kconfig drivers/misc/Makefile drivers/mmc/card/block.c drivers/mmc/core/core.c drivers/mmc/host/mmci.c drivers/net/wireless/bcmdhd/Makefile drivers/net/wireless/bcmdhd/bcmevent.c drivers/net/wireless/bcmdhd/bcmsdh_linux.c drivers/net/wireless/bcmdhd/dhd.h drivers/net/wireless/bcmdhd/dhd_bus.h drivers/net/wireless/bcmdhd/dhd_cdc.c drivers/net/wireless/bcmdhd/dhd_common.c drivers/net/wireless/bcmdhd/dhd_linux.c drivers/net/wireless/bcmdhd/dhd_linux_mon.c drivers/net/wireless/bcmdhd/dhd_sdio.c drivers/net/wireless/bcmdhd/include/bcmutils.h drivers/net/wireless/bcmdhd/include/epivers.h drivers/net/wireless/bcmdhd/include/linuxver.h drivers/net/wireless/bcmdhd/include/proto/bcmevent.h drivers/net/wireless/bcmdhd/include/sdio.h drivers/net/wireless/bcmdhd/include/wlioctl.h drivers/net/wireless/bcmdhd/wl_android.c drivers/net/wireless/bcmdhd/wl_android.h drivers/net/wireless/bcmdhd/wl_cfg80211.c drivers/net/wireless/bcmdhd/wl_cfg80211.h drivers/net/wireless/bcmdhd/wl_cfgp2p.c drivers/net/wireless/bcmdhd/wl_cfgp2p.h drivers/net/wireless/bcmdhd/wl_iw.c drivers/net/wireless/bcmdhd/wldev_common.c drivers/staging/android/Kconfig drivers/staging/android/Makefile drivers/staging/android/binder.c drivers/staging/android/logger.c drivers/usb/gadget/android.c drivers/usb/otg/otg_id.c include/linux/android_aid.h include/linux/earlysuspend.h include/linux/ion.h include/linux/usb/otg_id.h include/linux/wakelock.h kernel/irq/pm.c kernel/power/consoleearlysuspend.c kernel/power/wakelock.c net/bluetooth/l2cap_core.c net/bluetooth/l2cap_sock.c net/netfilter/Kconfig net/netfilter/xt_qtaguid.c net/netfilter/xt_quota2.c
Diffstat (limited to 'arch/arm/mach-ux500/tee_ta_start_modem_svp.c')
-rw-r--r--arch/arm/mach-ux500/tee_ta_start_modem_svp.c56
1 files changed, 56 insertions, 0 deletions
diff --git a/arch/arm/mach-ux500/tee_ta_start_modem_svp.c b/arch/arm/mach-ux500/tee_ta_start_modem_svp.c
new file mode 100644
index 00000000000..12337b93154
--- /dev/null
+++ b/arch/arm/mach-ux500/tee_ta_start_modem_svp.c
@@ -0,0 +1,56 @@
+/*
+ * Trusted application for starting the modem.
+ *
+ * Copyright (C) ST-Ericsson SA 2010
+ * Author: Shujuan Chen <shujuan.chen@stericsson.com>
+ * License terms: GNU General Public License (GPL) version 2
+ */
+
+#include <linux/err.h>
+#include <linux/io.h>
+#include <linux/kernel.h>
+#include <linux/elf.h>
+#include <mach/hardware.h>
+
+#include "mach/tee_ta_start_modem.h"
+
+static int reset_modem(unsigned long modem_start_addr)
+{
+ void __iomem *base = ioremap(U5500_ACCCON_BASE_SEC, 0x2FF);
+ if (!base)
+ return -ENOMEM;
+
+ pr_info("[%s] Setting modem start address!\n", __func__);
+ writel(base + (U5500_ACCCON_CPUVEC_RESET_ADDR_OFFSET/sizeof(uint32_t)),
+ modem_start_addr);
+
+ pr_info("[%s] resetting the modem!\n", __func__);
+ writel(base + (U5500_ACCCON_ACC_CPU_CTRL_OFFSET/sizeof(uint32_t)), 1);
+
+ iounmap(base);
+
+ return 0;
+}
+
+int tee_ta_start_modem(struct tee_ta_start_modem *data)
+{
+ int ret = 0;
+ struct elfhdr *elfhdr;
+ void __iomem *vaddr;
+
+ vaddr = ioremap((unsigned long)data->access_image_descr.elf_hdr,
+ sizeof(struct elfhdr));
+ if (!vaddr)
+ return -ENOMEM;
+
+ elfhdr = (struct elfhdr *)readl(vaddr);
+ pr_info("Reading in kernel:elfhdr 0x%x:elfhdr->entry=0x%x\n",
+ (uint32_t)elfhdr, (uint32_t)elfhdr->e_entry);
+
+ pr_info("[%s] reset modem()...\n", __func__);
+ ret = reset_modem(elfhdr->e_entry);
+
+ iounmap(vaddr);
+
+ return ret;
+}