From patchwork Wed Mar 4 19:33:06 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Arnd Bergmann X-Patchwork-Id: 5939371 Return-Path: X-Original-To: patchwork-linux-arm-msm@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 5210F9F318 for ; Wed, 4 Mar 2015 19:35:12 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 5903020320 for ; Wed, 4 Mar 2015 19:35:10 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 22AEB202FE for ; Wed, 4 Mar 2015 19:35:08 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1758118AbbCDTeg (ORCPT ); Wed, 4 Mar 2015 14:34:36 -0500 Received: from mout.kundenserver.de ([212.227.126.130]:62324 "EHLO mout.kundenserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1759327AbbCDTed (ORCPT ); Wed, 4 Mar 2015 14:34:33 -0500 Received: from wuerfel.lan. ([149.172.15.242]) by mrelayeu.kundenserver.de (mreue003) with ESMTPSA (Nemesis) id 0MKMjK-1YRaM743Co-001grr; Wed, 04 Mar 2015 20:33:42 +0100 From: Arnd Bergmann To: linux-arm-msm@vger.kernel.org Cc: linux-arm-kernel@lists.infradead.org, David Brown , Daniel Walker , Bryan Huntsman , Stephen Boyd , Tim Bird , Bjorn Andersson , Linus Walleij , linux-kernel@vger.kernel.org, Greg Kroah-Hartman , Ulf Hansson , Arnd Bergmann Subject: [RFC PATCH 12/18] ARM: msm: make smd behave like a normal driver Date: Wed, 4 Mar 2015 20:33:06 +0100 Message-Id: <1425497592-1831064-13-git-send-email-arnd@arndb.de> X-Mailer: git-send-email 2.1.0.rc2 In-Reply-To: <1425497592-1831064-1-git-send-email-arnd@arndb.de> References: <1425497592-1831064-1-git-send-email-arnd@arndb.de> X-Provags-ID: V03:K0:3uvTSw/qnboRl2at2WoKMghHIMe2TJ6gtQMXCn9v1QY9HLWjrAb STOInfim9pvDWDEnvjpYlCivtCXJ73hId1eAXVLEuvC3qOFF+wAapTGybXe8TJ4UFSTR63Z QfwNi5g1b8IaKLfKVqxqVLC1hc/GQsKOJZGqYFAZKNI1Y9lgDOx5uN4d7pr96Mirj5leQlh y7T/nJifWriVlfpB4707A== X-UI-Out-Filterresults: notjunk:1; Sender: linux-arm-msm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-arm-msm@vger.kernel.org X-Spam-Status: No, score=-6.9 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, T_RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP The smd driver is registered as a platform driver with a probe function, but hardcodes soc-specific interrupts and other settings at compile-time, which gets in the way of reusing the same driver on multiple machines. This changes all compile-time configuration in the smd driver to runtime configuration from platform device resources and the platform device id, like we do for other drivers. Signed-off-by: Arnd Bergmann --- arch/arm/mach-msm/Makefile | 5 +- arch/arm/mach-msm/board-halibut.c | 6 -- arch/arm/mach-msm/board-msm7x30.c | 8 --- arch/arm/mach-msm/board-qsd8x50.c | 7 -- arch/arm/mach-msm/board-sapphire.c | 6 -- arch/arm/mach-msm/board-trout.c | 6 -- arch/arm/mach-msm/common.h | 6 -- arch/arm/mach-msm/devices-msm7x00.c | 11 ++- arch/arm/mach-msm/devices-msm7x30.c | 18 ++++- arch/arm/mach-msm/devices-qsd8x50.c | 11 ++- arch/arm/mach-msm/last_radio_log.c | 1 - arch/arm/mach-msm/proc_comm.c | 10 +-- arch/arm/mach-msm/proc_comm.h | 2 + arch/arm/mach-msm/smd.c | 127 ++++++++++++++++---------------- arch/arm/mach-msm/smd_debug.c | 140 ++++++++++++------------------------ arch/arm/mach-msm/smd_private.h | 65 +++++++---------- 16 files changed, 173 insertions(+), 256 deletions(-) diff --git a/arch/arm/mach-msm/Makefile b/arch/arm/mach-msm/Makefile index eb0fa4bf7f36..59ef46a881ea 100644 --- a/arch/arm/mach-msm/Makefile +++ b/arch/arm/mach-msm/Makefile @@ -9,8 +9,9 @@ obj-$(CONFIG_MSM_PROC_COMM) += proc_comm.o clock-pcom.o vreg.o obj-$(CONFIG_ARCH_MSM) += gpio-msm-v1.o -obj-$(CONFIG_MSM_SMD) += smd.o smd_debug.o -obj-$(CONFIG_MSM_SMD) += last_radio_log.o +obj-$(CONFIG_MSM_SMD) += msm-smd.o +msm-smd-y += smd.o last_radio_log.o +msm-smd-$(CONFIG_DEBUG_FS) += smd_debug.o obj-$(CONFIG_MACH_TROUT) += board-trout.o board-trout-gpio.o board-trout-mmc.o devices-msm7x00.o obj-$(CONFIG_MACH_TROUT) += board-trout.o board-trout-gpio.o board-trout-mmc.o board-trout-panel.o devices-msm7x00.o diff --git a/arch/arm/mach-msm/board-halibut.c b/arch/arm/mach-msm/board-halibut.c index 1b62427ad5ed..1b6d64196631 100644 --- a/arch/arm/mach-msm/board-halibut.c +++ b/arch/arm/mach-msm/board-halibut.c @@ -88,17 +88,11 @@ static void __init halibut_map_io(void) msm_map_common_io(); } -static void __init halibut_init_late(void) -{ - smd_debugfs_init(); -} - MACHINE_START(HALIBUT, "Halibut Board (QCT SURF7200A)") .atag_offset = 0x100, .map_io = halibut_map_io, .init_early = halibut_init_early, .init_irq = halibut_init_irq, .init_machine = halibut_init, - .init_late = halibut_init_late, .init_time = msm7x01_timer_init, MACHINE_END diff --git a/arch/arm/mach-msm/board-msm7x30.c b/arch/arm/mach-msm/board-msm7x30.c index 4718a661306e..295d7c03e53f 100644 --- a/arch/arm/mach-msm/board-msm7x30.c +++ b/arch/arm/mach-msm/board-msm7x30.c @@ -206,11 +206,6 @@ static void __init msm7x30_map_io(void) msm_map_msm7x30_io(); } -static void __init msm7x30_init_late(void) -{ - smd_debugfs_init(); -} - MACHINE_START(MSM7X30_SURF, "QCT MSM7X30 SURF") .atag_offset = 0x100, .fixup = msm7x30_fixup, @@ -218,7 +213,6 @@ MACHINE_START(MSM7X30_SURF, "QCT MSM7X30 SURF") .map_io = msm7x30_map_io, .init_irq = msm7x30_init_irq, .init_machine = msm7x30_init, - .init_late = msm7x30_init_late, .init_time = msm7x30_timer_init, MACHINE_END @@ -229,7 +223,6 @@ MACHINE_START(MSM7X30_FFA, "QCT MSM7X30 FFA") .map_io = msm7x30_map_io, .init_irq = msm7x30_init_irq, .init_machine = msm7x30_init, - .init_late = msm7x30_init_late, .init_time = msm7x30_timer_init, MACHINE_END @@ -240,6 +233,5 @@ MACHINE_START(MSM7X30_FLUID, "QCT MSM7X30 FLUID") .map_io = msm7x30_map_io, .init_irq = msm7x30_init_irq, .init_machine = msm7x30_init, - .init_late = msm7x30_init_late, .init_time = msm7x30_timer_init, MACHINE_END diff --git a/arch/arm/mach-msm/board-qsd8x50.c b/arch/arm/mach-msm/board-qsd8x50.c index ff458806785b..7bd36b9908c8 100644 --- a/arch/arm/mach-msm/board-qsd8x50.c +++ b/arch/arm/mach-msm/board-qsd8x50.c @@ -293,17 +293,11 @@ static void __init qsd8x50_init(void) qsd8x50_init_mmc(); } -static void __init qsd8x50_init_late(void) -{ - smd_debugfs_init(); -} - MACHINE_START(QSD8X50_SURF, "QCT QSD8X50 SURF") .atag_offset = 0x100, .map_io = msm_map_qsd8x50_io, .init_irq = qsd8x50_init_irq, .init_machine = qsd8x50_init, - .init_late = qsd8x50_init_late, .init_time = qsd8x50_timer_init, MACHINE_END @@ -319,7 +313,6 @@ MACHINE_START(QSD8X50A_ST1_5, "QCT QSD8X50A ST1.5") .map_io = msm_map_qsd8x50_io_rev_a, .init_irq = qsd8x50_init_irq_rev_a, .init_machine = qsd8x50_init, - .init_late = qsd8x50_init_late, .init_time = qsd8x50_timer_init, MACHINE_END #endif diff --git a/arch/arm/mach-msm/board-sapphire.c b/arch/arm/mach-msm/board-sapphire.c index e50967926dcd..e3aa71e839f4 100644 --- a/arch/arm/mach-msm/board-sapphire.c +++ b/arch/arm/mach-msm/board-sapphire.c @@ -97,11 +97,6 @@ static void __init sapphire_map_io(void) msm_clock_init(); } -static void __init sapphire_init_late(void) -{ - smd_debugfs_init(); -} - MACHINE_START(SAPPHIRE, "sapphire") /* Maintainer: Brian Swetland */ .atag_offset = 0x100, @@ -109,6 +104,5 @@ MACHINE_START(SAPPHIRE, "sapphire") .map_io = sapphire_map_io, .init_irq = sapphire_init_irq, .init_machine = sapphire_init, - .init_late = sapphire_init_late, .init_time = msm_timer_init, MACHINE_END diff --git a/arch/arm/mach-msm/board-trout.c b/arch/arm/mach-msm/board-trout.c index 7c1b06fa9a76..e1c6e8528150 100644 --- a/arch/arm/mach-msm/board-trout.c +++ b/arch/arm/mach-msm/board-trout.c @@ -94,11 +94,6 @@ static void __init trout_map_io(void) #endif } -static void __init trout_init_late(void) -{ - smd_debugfs_init(); -} - MACHINE_START(TROUT, "HTC Dream") .atag_offset = 0x100, .fixup = trout_fixup, @@ -106,6 +101,5 @@ MACHINE_START(TROUT, "HTC Dream") .init_early = trout_init_early, .init_irq = trout_init_irq, .init_machine = trout_init, - .init_late = trout_init_late, .init_time = msm7x01_timer_init, MACHINE_END diff --git a/arch/arm/mach-msm/common.h b/arch/arm/mach-msm/common.h index 7e4ddfdf4fe8..3c5214057657 100644 --- a/arch/arm/mach-msm/common.h +++ b/arch/arm/mach-msm/common.h @@ -34,10 +34,4 @@ extern int msm_add_sdcc(unsigned int controller, struct msm_mmc_platform_data *plat, unsigned int stat_irq, unsigned long stat_irq_flags); -#if defined(CONFIG_MSM_SMD) && defined(CONFIG_DEBUG_FS) -extern int smd_debugfs_init(void); -#else -static inline int smd_debugfs_init(void) { return 0; } -#endif - #endif diff --git a/arch/arm/mach-msm/devices-msm7x00.c b/arch/arm/mach-msm/devices-msm7x00.c index dc0ea895568b..1bac32b690cf 100644 --- a/arch/arm/mach-msm/devices-msm7x00.c +++ b/arch/arm/mach-msm/devices-msm7x00.c @@ -247,9 +247,16 @@ struct platform_device msm_device_nand = { }, }; +static struct resource resources_smd[] = { + DEFINE_RES_IRQ(INT_A9_M2A_0), + DEFINE_RES_IRQ(INT_A9_M2A_5), +}; + struct platform_device msm_device_smd = { - .name = "msm_smd", - .id = -1, + .name = "msm7x00_smd", + .id = -1, + .num_resources = ARRAY_SIZE(resources_smd), + .resource = resources_smd, }; static struct resource resources_sdc1[] = { diff --git a/arch/arm/mach-msm/devices-msm7x30.c b/arch/arm/mach-msm/devices-msm7x30.c index 824e0d86b93f..f4ff40caac27 100644 --- a/arch/arm/mach-msm/devices-msm7x30.c +++ b/arch/arm/mach-msm/devices-msm7x30.c @@ -30,6 +30,7 @@ #include "clock.h" #include "clock-pcom.h" +#include "proc_comm.h" #include @@ -55,10 +56,16 @@ static struct map_desc msm7x30_io_desc[] __initdata = { }, }; +static void msm_a2m_int_msm7x00(uint32_t irq) +{ + writel(1 << irq, MSM_GCC_BASE + 0x8); +} + void __init msm_map_msm7x30_io(void) { debug_ll_io_init(); iotable_init(msm7x30_io_desc, ARRAY_SIZE(msm7x30_io_desc)); + msm_a2m_int = msm_a2m_int_msm7x00; } static struct resource msm_gpio_resources[] = { @@ -113,9 +120,16 @@ struct platform_device msm_device_uart2 = { .resource = resources_uart2, }; +static struct resource resources_smd[] = { + DEFINE_RES_IRQ(INT_A9_M2A_0), + DEFINE_RES_IRQ(INT_A9_M2A_5), +}; + struct platform_device msm_device_smd = { - .name = "msm_smd", - .id = -1, + .name = "msm_smd", + .id = -1, + .num_resources = ARRAY_SIZE(resources_smd), + .resource = resources_smd, }; static struct resource resources_otg[] = { diff --git a/arch/arm/mach-msm/devices-qsd8x50.c b/arch/arm/mach-msm/devices-qsd8x50.c index f80a8efee126..5dcf17a24d70 100644 --- a/arch/arm/mach-msm/devices-qsd8x50.c +++ b/arch/arm/mach-msm/devices-qsd8x50.c @@ -130,9 +130,16 @@ struct platform_device msm_device_uart3 = { .resource = resources_uart3, }; +static struct resource resources_smd[] = { + DEFINE_RES_IRQ(INT_A9_M2A_0), + DEFINE_RES_IRQ(INT_A9_M2A_5), +}; + struct platform_device msm_device_smd = { - .name = "msm_smd", - .id = -1, + .name = "msm_smd", + .id = -1, + .num_resources = ARRAY_SIZE(resources_smd), + .resource = resources_smd, }; static struct resource resources_otg[] = { diff --git a/arch/arm/mach-msm/last_radio_log.c b/arch/arm/mach-msm/last_radio_log.c index 9c392a29fc7e..7fd9fbde2025 100644 --- a/arch/arm/mach-msm/last_radio_log.c +++ b/arch/arm/mach-msm/last_radio_log.c @@ -68,4 +68,3 @@ void msm_init_last_radio_log(struct module *owner) last_radio_log_fops.owner = owner; proc_set_size(entry, radio_log_size); } -EXPORT_SYMBOL(msm_init_last_radio_log); diff --git a/arch/arm/mach-msm/proc_comm.c b/arch/arm/mach-msm/proc_comm.c index 507f5ca80697..f79f57d7a0dd 100644 --- a/arch/arm/mach-msm/proc_comm.c +++ b/arch/arm/mach-msm/proc_comm.c @@ -22,14 +22,14 @@ #include "proc_comm.h" -static inline void msm_a2m_int(uint32_t irq) +/* msm7x00 uses a different method and needs to override + * this function + */ +static void msm_a2m_int_scorpion(uint32_t irq) { -#if defined(CONFIG_ARCH_MSM7X30) - writel(1 << irq, MSM_GCC_BASE + 0x8); -#else writel(1, MSM_CSR_BASE + 0x400 + (irq * 4)); -#endif } +void (*msm_a2m_int)(uint32_t irq) = msm_a2m_int_scorpion; static inline void notify_other_proc_comm(void) { diff --git a/arch/arm/mach-msm/proc_comm.h b/arch/arm/mach-msm/proc_comm.h index e8d043a0e990..a0224327e8c7 100644 --- a/arch/arm/mach-msm/proc_comm.h +++ b/arch/arm/mach-msm/proc_comm.h @@ -255,4 +255,6 @@ enum { int msm_proc_comm(unsigned cmd, unsigned *data1, unsigned *data2); void proc_comm_boot_wait(void); +extern void (*msm_a2m_int)(uint32_t irq); + #endif diff --git a/arch/arm/mach-msm/smd.c b/arch/arm/mach-msm/smd.c index 7550f5a08956..b87f183a86c5 100644 --- a/arch/arm/mach-msm/smd.c +++ b/arch/arm/mach-msm/smd.c @@ -34,9 +34,21 @@ #include "smd_private.h" #include "proc_comm.h" -#if defined(CONFIG_ARCH_QSD8X50) -#define CONFIG_QDSP6 1 -#endif +enum msm_smd_version { + SMD_MSM7X00, + SMD_MSM7X30, + SMD_QSD8X50, +} smd_version; + +#define SMSM_STATE_APPS (smd_version == SMD_MSM7X00 ? \ + MSM7X00_SMSM_STATE_APPS : SCORPION_SMSM_STATE_APPS) + +#define SMSM_STATE_MODEM (smd_version == SMD_MSM7X00 ? \ + MSM7X00_SMSM_STATE_MODEM : SCORPION_SMSM_STATE_MODEM) + +#define SMSM_STATE_COUNT \ + (MSM7X00_SMSM_STATE_COUNT > SCORPION_SMSM_STATE_COUNT ? \ + MSM7X00_SMSM_STATE_COUNT : SCORPION_SMSM_STATE_COUNT) #define MODULE_NAME "msm_smd" @@ -67,9 +79,8 @@ static unsigned last_heap_free = 0xffffffff; static inline void notify_other_smsm(void) { msm_a2m_int(5); -#ifdef CONFIG_QDSP6 - msm_a2m_int(8); -#endif + if (smd_version == SMD_QSD8X50) + msm_a2m_int(8); } static inline void notify_modem_smd(void) @@ -374,13 +385,11 @@ static irqreturn_t smd_modem_irq_handler(int irq, void *data) return IRQ_HANDLED; } -#if defined(CONFIG_QDSP6) static irqreturn_t smd_dsp_irq_handler(int irq, void *data) { handle_smd_irq(&smd_ch_list_dsp, notify_dsp_smd); return IRQ_HANDLED; } -#endif static void smd_fake_irq_handler(unsigned long arg) { @@ -553,6 +562,7 @@ static int smd_packet_read(smd_channel_t *ch, void *data, int len) static int smd_alloc_channel(const char *name, uint32_t cid, uint32_t type) { struct smd_channel *ch; + int ret; ch = kzalloc(sizeof(struct smd_channel), GFP_KERNEL); if (ch == 0) { @@ -561,7 +571,12 @@ static int smd_alloc_channel(const char *name, uint32_t cid, uint32_t type) } ch->n = cid; - if (_smd_alloc_channel(ch)) { + if (smd_version == SMD_MSM7X00) + ret = _smd_alloc_channel_pkg3(ch); + else + ret = _smd_alloc_channel_pkg4(ch); + + if (ret) { kfree(ch); return -1; } @@ -892,48 +907,12 @@ uint32_t smsm_get_state(enum smsm_state_item item) return rv; } -#ifdef CONFIG_ARCH_MSM_SCORPION - -int smsm_set_sleep_duration(uint32_t delay) -{ - struct msm_dem_slave_data *ptr; - - ptr = smem_find(SMEM_APPS_DEM_SLAVE_DATA, sizeof(*ptr)); - if (ptr == NULL) { - pr_err("smsm_set_sleep_duration \n"); - return -EIO; - } - if (msm_smd_debug_mask & MSM_SMSM_DEBUG) - pr_info("smsm_set_sleep_duration %d -> %d\n", - ptr->sleep_time, delay); - ptr->sleep_time = delay; - return 0; -} - -#else - -int smsm_set_sleep_duration(uint32_t delay) -{ - uint32_t *ptr; - - ptr = smem_find(SMEM_SMSM_SLEEP_DELAY, sizeof(*ptr)); - if (ptr == NULL) { - pr_err("smsm_set_sleep_duration \n"); - return -EIO; - } - if (msm_smd_debug_mask & MSM_SMSM_DEBUG) - pr_info("smsm_set_sleep_duration %d -> %d\n", - *ptr, delay); - *ptr = delay; - return 0; -} - -#endif - -int smd_core_init(void) +static int smd_core_init(int version, int irq_a9_m2a_0, int irq_a9_m2a_5, int irq_adsp_a11) { int r; + smd_version = version; + /* wait for essential items to be initialized */ for (;;) { unsigned size; @@ -947,33 +926,33 @@ int smd_core_init(void) smd_info.ready = 1; - r = request_irq(INT_A9_M2A_0, smd_modem_irq_handler, + r = request_irq(irq_a9_m2a_0, smd_modem_irq_handler, IRQF_TRIGGER_RISING, "smd_dev", 0); if (r < 0) return r; - r = enable_irq_wake(INT_A9_M2A_0); + r = enable_irq_wake(irq_a9_m2a_0); if (r < 0) pr_err("smd_core_init: enable_irq_wake failed for A9_M2A_0\n"); - r = request_irq(INT_A9_M2A_5, smsm_irq_handler, + r = request_irq(irq_a9_m2a_5, smsm_irq_handler, IRQF_TRIGGER_RISING, "smsm_dev", 0); if (r < 0) { - free_irq(INT_A9_M2A_0, 0); + free_irq(irq_a9_m2a_0, 0); return r; } - r = enable_irq_wake(INT_A9_M2A_5); + r = enable_irq_wake(irq_a9_m2a_5); if (r < 0) pr_err("smd_core_init: enable_irq_wake failed for A9_M2A_5\n"); -#if defined(CONFIG_QDSP6) - r = request_irq(INT_ADSP_A11, smd_dsp_irq_handler, - IRQF_TRIGGER_RISING, "smd_dsp", 0); - if (r < 0) { - free_irq(INT_A9_M2A_0, 0); - free_irq(INT_A9_M2A_5, 0); - return r; + if (smd_version == SMD_QSD8X50) { + r = request_irq(irq_adsp_a11, smd_dsp_irq_handler, + IRQF_TRIGGER_RISING, "smd_dsp", 0); + if (r < 0) { + free_irq(irq_a9_m2a_0, 0); + free_irq(irq_a9_m2a_5, 0); + return r; + } } -#endif /* check for any SMD channels that may already exist */ do_smd_probe(); @@ -981,15 +960,16 @@ int smd_core_init(void) /* indicate that we're up and running */ smsm_change_state(SMSM_STATE_APPS, ~0, SMSM_INIT | SMSM_SMDINIT | SMSM_RPCINIT | SMSM_RUN); -#ifdef CONFIG_ARCH_MSM_SCORPION - smsm_change_state(SMSM_STATE_APPS_DEM, ~0, 0); -#endif + if (smd_version != SMD_MSM7X00) + smsm_change_state(SCORPION_SMSM_STATE_APPS_DEM, ~0, 0); return 0; } static int msm_smd_probe(struct platform_device *pdev) { + int ret; + /* * If we haven't waited for the ARM9 to boot up till now, * then we need to wait here. Otherwise this should just @@ -999,9 +979,14 @@ static int msm_smd_probe(struct platform_device *pdev) INIT_WORK(&probe_work, smd_channel_probe_worker); - if (smd_core_init()) { + ret = smd_core_init(pdev->id_entry->driver_data, + platform_get_irq(pdev, 0), + platform_get_irq(pdev, 1), + platform_get_irq(pdev, 2)); + + if (ret) { pr_err("smd_core_init() failed\n"); - return -1; + return ret; } do_smd_probe(); @@ -1010,13 +995,23 @@ static int msm_smd_probe(struct platform_device *pdev) msm_init_last_radio_log(THIS_MODULE); + smd_debugfs_init(pdev->id_entry->driver_data != SMD_MSM7X00); + smd_initialized = 1; return 0; } +struct platform_device_id msm_smd_id_table[] = { + { "msm7x00_smd", SMD_MSM7X00 }, + { "msm7x30_smd", SMD_MSM7X00 }, + { "qsd8x50_smd", SMD_QSD8X50 }, + {} +}; + static struct platform_driver msm_smd_driver = { .probe = msm_smd_probe, + .id_table = msm_smd_id_table, .driver = { .name = MODULE_NAME, }, diff --git a/arch/arm/mach-msm/smd_debug.c b/arch/arm/mach-msm/smd_debug.c index 8056b3e5590f..daffcc9e802d 100644 --- a/arch/arm/mach-msm/smd_debug.c +++ b/arch/arm/mach-msm/smd_debug.c @@ -21,8 +21,6 @@ #include "smd_private.h" -#if defined(CONFIG_DEBUG_FS) - static char *chstate(unsigned n) { switch (n) { @@ -76,33 +74,56 @@ static int dump_ch(char *buf, int max, struct smd_channel *ch) ); } -static int debug_read_stat(char *buf, int max) +static int debug_read_stat_common(char *buf, int max) { char *msg; - int i = 0; msg = smem_find(ID_DIAG_ERR_MSG, SZ_DIAG_ERR_MSG); + if (!msg) + return 0; + + msg[SZ_DIAG_ERR_MSG - 1] = 0; + return scnprintf(buf, max, "diag: '%s'\n", msg); +} + +static int debug_read_stat_msm7x00(char *buf, int max) +{ + int i = 0; + + if (raw_smsm_get_state(MSM7X00_SMSM_STATE_MODEM) & SMSM_RESET) + i += scnprintf(buf + i, max - i, + "smsm: ARM9 HAS CRASHED\n"); + + i += scnprintf(buf + i, max - i, "smsm: a9: %08x a11: %08x\n", + raw_smsm_get_state(MSM7X00_SMSM_STATE_MODEM), + raw_smsm_get_state(MSM7X00_SMSM_STATE_APPS)); + + i += debug_read_stat_common(buf + i, max - i); + + return i; +} + +static int debug_read_stat_scorpion(char *buf, int max) +{ + int i = 0; - if (raw_smsm_get_state(SMSM_STATE_MODEM) & SMSM_RESET) + if (raw_smsm_get_state(SCORPION_SMSM_STATE_MODEM) & SMSM_RESET) i += scnprintf(buf + i, max - i, "smsm: ARM9 HAS CRASHED\n"); i += scnprintf(buf + i, max - i, "smsm: a9: %08x a11: %08x\n", - raw_smsm_get_state(SMSM_STATE_MODEM), - raw_smsm_get_state(SMSM_STATE_APPS)); -#ifdef CONFIG_ARCH_MSM_SCORPION + raw_smsm_get_state(SCORPION_SMSM_STATE_MODEM), + raw_smsm_get_state(SCORPION_SMSM_STATE_APPS)); i += scnprintf(buf + i, max - i, "smsm dem: apps: %08x modem: %08x " "qdsp6: %08x power: %08x time: %08x\n", - raw_smsm_get_state(SMSM_STATE_APPS_DEM), - raw_smsm_get_state(SMSM_STATE_MODEM_DEM), - raw_smsm_get_state(SMSM_STATE_QDSP6_DEM), - raw_smsm_get_state(SMSM_STATE_POWER_MASTER_DEM), - raw_smsm_get_state(SMSM_STATE_TIME_MASTER_DEM)); -#endif - if (msg) { - msg[SZ_DIAG_ERR_MSG - 1] = 0; - i += scnprintf(buf + i, max - i, "diag: '%s'\n", msg); - } + raw_smsm_get_state(SCORPION_SMSM_STATE_APPS_DEM), + raw_smsm_get_state(SCORPION_SMSM_STATE_MODEM_DEM), + raw_smsm_get_state(SCORPION_SMSM_STATE_QDSP6_DEM), + raw_smsm_get_state(SCORPION_SMSM_STATE_POWER_MASTER_DEM), + raw_smsm_get_state(SCORPION_SMSM_STATE_TIME_MASTER_DEM)); + + i += debug_read_stat_common(buf + i, max - i); + return i; } @@ -216,7 +237,7 @@ static void debug_create(const char *name, umode_t mode, debugfs_create_file(name, mode, dent, fill, &debug_ops); } -int __init smd_debugfs_init(void) +int smd_debugfs_init(bool is_scorpion) { struct dentry *dent; @@ -225,7 +246,10 @@ int __init smd_debugfs_init(void) return 1; debug_create("ch", 0444, dent, debug_read_ch); - debug_create("stat", 0444, dent, debug_read_stat); + if (is_scorpion) + debug_create("stat", 0444, dent, debug_read_stat_scorpion); + else + debug_create("stat", 0444, dent, debug_read_stat_msm7x00); debug_create("mem", 0444, dent, debug_read_mem); debug_create("version", 0444, dent, debug_read_version); debug_create("tbl", 0444, dent, debug_read_alloc_tbl); @@ -233,79 +257,3 @@ int __init smd_debugfs_init(void) return 0; } - -#endif - - -#define MAX_NUM_SLEEP_CLIENTS 64 -#define MAX_SLEEP_NAME_LEN 8 - -#define NUM_GPIO_INT_REGISTERS 6 -#define GPIO_SMEM_NUM_GROUPS 2 -#define GPIO_SMEM_MAX_PC_INTERRUPTS 8 - -struct tramp_gpio_save { - unsigned int enable; - unsigned int detect; - unsigned int polarity; -}; - -struct tramp_gpio_smem { - uint16_t num_fired[GPIO_SMEM_NUM_GROUPS]; - uint16_t fired[GPIO_SMEM_NUM_GROUPS][GPIO_SMEM_MAX_PC_INTERRUPTS]; - uint32_t enabled[NUM_GPIO_INT_REGISTERS]; - uint32_t detection[NUM_GPIO_INT_REGISTERS]; - uint32_t polarity[NUM_GPIO_INT_REGISTERS]; -}; - - -void smsm_print_sleep_info(void) -{ - unsigned long flags; - uint32_t *ptr; -#ifndef CONFIG_ARCH_MSM_SCORPION - struct tramp_gpio_smem *gpio; - struct smsm_interrupt_info *int_info; -#endif - - - spin_lock_irqsave(&smem_lock, flags); - - ptr = smem_alloc(SMEM_SMSM_SLEEP_DELAY, sizeof(*ptr)); - if (ptr) - pr_info("SMEM_SMSM_SLEEP_DELAY: %x\n", *ptr); - - ptr = smem_alloc(SMEM_SMSM_LIMIT_SLEEP, sizeof(*ptr)); - if (ptr) - pr_info("SMEM_SMSM_LIMIT_SLEEP: %x\n", *ptr); - - ptr = smem_alloc(SMEM_SLEEP_POWER_COLLAPSE_DISABLED, sizeof(*ptr)); - if (ptr) - pr_info("SMEM_SLEEP_POWER_COLLAPSE_DISABLED: %x\n", *ptr); - -#ifndef CONFIG_ARCH_MSM_SCORPION - int_info = smem_alloc(SMEM_SMSM_INT_INFO, sizeof(*int_info)); - if (int_info) - pr_info("SMEM_SMSM_INT_INFO %x %x %x\n", - int_info->interrupt_mask, - int_info->pending_interrupts, - int_info->wakeup_reason); - - gpio = smem_alloc(SMEM_GPIO_INT, sizeof(*gpio)); - if (gpio) { - int i; - for (i = 0; i < NUM_GPIO_INT_REGISTERS; i++) - pr_info("SMEM_GPIO_INT: %d: e %x d %x p %x\n", - i, gpio->enabled[i], gpio->detection[i], - gpio->polarity[i]); - - for (i = 0; i < GPIO_SMEM_NUM_GROUPS; i++) - pr_info("SMEM_GPIO_INT: %d: f %d: %d %d...\n", - i, gpio->num_fired[i], gpio->fired[i][0], - gpio->fired[i][1]); - } -#else -#endif - spin_unlock_irqrestore(&smem_lock, flags); -} - diff --git a/arch/arm/mach-msm/smd_private.h b/arch/arm/mach-msm/smd_private.h index 727bfe68aa9b..50f7b7d22023 100644 --- a/arch/arm/mach-msm/smd_private.h +++ b/arch/arm/mach-msm/smd_private.h @@ -64,15 +64,14 @@ struct smem_shared { #define SMSM_V1_SIZE (sizeof(unsigned) * 8) #define SMSM_V2_SIZE (sizeof(unsigned) * 4) -#ifdef CONFIG_MSM_SMD_PKG3 -struct smsm_interrupt_info { +struct smsm_interrupt_info_pkg3 { uint32_t interrupt_mask; uint32_t pending_interrupts; uint32_t wakeup_reason; }; -#else + #define DEM_MAX_PORT_NAME_LEN (20) -struct msm_dem_slave_data { +struct msm_dem_slave_data_pkg4 { uint32_t sleep_time; uint32_t interrupt_mask; uint32_t resources_used; @@ -85,7 +84,6 @@ struct msm_dem_slave_data { char smd_port_name[DEM_MAX_PORT_NAME_LEN]; uint32_t reserved2; }; -#endif #define SZ_DIAG_ERR_MSG 0xC8 #define ID_DIAG_ERR_MSG SMEM_DIAG_ERR_MESSAGE @@ -126,30 +124,24 @@ struct msm_dem_slave_data { #define SMSM_WKUP_REASON_ALARM 0x00000010 #define SMSM_WKUP_REASON_RESET 0x00000020 -#ifdef CONFIG_ARCH_MSM7X00A -enum smsm_state_item { - SMSM_STATE_APPS = 1, - SMSM_STATE_MODEM = 3, - SMSM_STATE_COUNT, -}; -#else enum smsm_state_item { - SMSM_STATE_APPS, - SMSM_STATE_MODEM, - SMSM_STATE_HEXAGON, - SMSM_STATE_APPS_DEM, - SMSM_STATE_MODEM_DEM, - SMSM_STATE_QDSP6_DEM, - SMSM_STATE_POWER_MASTER_DEM, - SMSM_STATE_TIME_MASTER_DEM, - SMSM_STATE_COUNT, + MSM7X00_SMSM_STATE_APPS = 1, + MSM7X00_SMSM_STATE_MODEM = 3, + MSM7X00_SMSM_STATE_COUNT, + SCORPION_SMSM_STATE_APPS = 0, + SCORPION_SMSM_STATE_MODEM, + SCORPION_SMSM_STATE_HEXAGON, + SCORPION_SMSM_STATE_APPS_DEM, + SCORPION_SMSM_STATE_MODEM_DEM, + SCORPION_SMSM_STATE_QDSP6_DEM, + SCORPION_SMSM_STATE_POWER_MASTER_DEM, + SCORPION_SMSM_STATE_TIME_MASTER_DEM, + SCORPION_SMSM_STATE_COUNT, }; -#endif void *smem_alloc(unsigned id, unsigned size); int smsm_change_state(enum smsm_state_item item, uint32_t clear_mask, uint32_t set_mask); uint32_t smsm_get_state(enum smsm_state_item item); -int smsm_set_sleep_duration(uint32_t delay); void smsm_print_sleep_info(void); #define SMEM_NUM_SMD_CHANNELS 64 @@ -335,12 +327,17 @@ uint32_t raw_smsm_get_state(enum smsm_state_item item); extern void msm_init_last_radio_log(struct module *); -#ifdef CONFIG_MSM_SMD_PKG3 +#if defined(CONFIG_MSM_SMD) && defined(CONFIG_DEBUG_FS) +extern int smd_debugfs_init(bool); +#else +static inline int smd_debugfs_init(bool is_scorpion) { return 0; } +#endif + /* * This allocator assumes an SMD Package v3 which only exists on * MSM7x00 SoC's. */ -static inline int _smd_alloc_channel(struct smd_channel *ch) +static inline int _smd_alloc_channel_pkg3(struct smd_channel *ch) { struct smd_shared_v1 *shared1; @@ -356,12 +353,12 @@ static inline int _smd_alloc_channel(struct smd_channel *ch) ch->fifo_size = SMD_BUF_SIZE; return 0; } -#else + /* * This allocator assumes an SMD Package v4, the most common * and the default. */ -static inline int _smd_alloc_channel(struct smd_channel *ch) +static inline int _smd_alloc_channel_pkg4(struct smd_channel *ch) { struct smd_shared_v2 *shared2; void *buffer; @@ -385,19 +382,5 @@ static inline int _smd_alloc_channel(struct smd_channel *ch) ch->fifo_size = buffer_sz; return 0; } -#endif /* CONFIG_MSM_SMD_PKG3 */ - -#if defined(CONFIG_ARCH_MSM7X30) -static inline void msm_a2m_int(uint32_t irq) -{ - writel(1 << irq, MSM_GCC_BASE + 0x8); -} -#else -static inline void msm_a2m_int(uint32_t irq) -{ - writel(1, MSM_CSR_BASE + 0x400 + (irq * 4)); -} -#endif /* CONFIG_ARCH_MSM7X30 */ - #endif