]> Pileus Git - ~andy/linux/commitdiff
Merge remote branch 'rmk/for-linus' into for-linus
authorDavid Brown <davidb@codeaurora.org>
Thu, 17 Mar 2011 05:13:16 +0000 (22:13 -0700)
committerDavid Brown <davidb@codeaurora.org>
Thu, 17 Mar 2011 05:13:16 +0000 (22:13 -0700)
* rmk/for-linus: (1557 commits)
  ARM: 6806/1: irq: introduce entry and exit functions for chained handlers
  ARM: 6781/1: Thumb-2: Work around buggy Thumb-2 short branch relocations in gas
  ARM: 6747/1: P2V: Thumb2 support
  ARM: 6798/1: aout-core: zero thread debug registers in a.out core dump
  ARM: 6796/1: Footbridge: Fix I/O mappings for NOMMU mode
  ARM: 6784/1: errata: no automatic Store Buffer drain on Cortex-A9
  ARM: 6772/1: errata: possible fault MMU translations following an ASID switch
  ARM: 6776/1: mach-ux500: activate fix for errata 753970
  ARM: 6794/1: SPEAr: Append UL to device address macros.
  ARM: 6793/1: SPEAr: Remove unused *_SIZE macros from spear*.h files
  ARM: 6792/1: SPEAr: Replace SIZE macro's with SZ_4K macros
  ARM: 6791/1: SPEAr3xx: Declare device structures after shirq code
  ARM: 6790/1: SPEAr: Clock Framework: Rename usbd clock and align apb_clk entry
  ARM: 6789/1: SPEAr3xx: Rename sdio to sdhci
  ARM: 6788/1: SPEAr: Include mach/hardware.h instead of mach/spear.h
  ARM: 6787/1: SPEAr: Reorder #includes in .h & .c files.
  ARM: 6681/1: SPEAr: add debugfs support to clk API
  ARM: 6703/1: SPEAr: update clk API support
  ARM: 6679/1: SPEAr: make clk API functions more generic
  ARM: 6737/1: SPEAr: formalized timer support
  ...

Conflicts:
arch/arm/mach-msm/board-msm7x27.c
arch/arm/mach-msm/board-msm7x30.c
arch/arm/mach-msm/board-qsd8x50.c
arch/arm/mach-msm/board-sapphire.c
arch/arm/mach-msm/include/mach/memory.h

65 files changed:
arch/arm/Kconfig
arch/arm/mach-msm/Kconfig
arch/arm/mach-msm/Makefile
arch/arm/mach-msm/board-halibut.c
arch/arm/mach-msm/board-mahimahi.c
arch/arm/mach-msm/board-msm7x27.c
arch/arm/mach-msm/board-msm7x30.c
arch/arm/mach-msm/board-msm8960.c [new file with mode: 0644]
arch/arm/mach-msm/board-msm8x60.c
arch/arm/mach-msm/board-qsd8x50.c
arch/arm/mach-msm/board-sapphire.c
arch/arm/mach-msm/board-trout-gpio.c
arch/arm/mach-msm/board-trout.c
arch/arm/mach-msm/clock-7x30.h
arch/arm/mach-msm/clock-debug.c [new file with mode: 0644]
arch/arm/mach-msm/clock-dummy.c [deleted file]
arch/arm/mach-msm/clock-pcom.c
arch/arm/mach-msm/clock-pcom.h
arch/arm/mach-msm/clock.c
arch/arm/mach-msm/clock.h
arch/arm/mach-msm/devices-iommu.c [moved from arch/arm/mach-msm/devices-msm8x60-iommu.c with 92% similarity]
arch/arm/mach-msm/devices-msm7x00.c
arch/arm/mach-msm/devices-msm7x30.c
arch/arm/mach-msm/devices-msm8960.c [new file with mode: 0644]
arch/arm/mach-msm/devices-qsd8x50.c
arch/arm/mach-msm/devices.h
arch/arm/mach-msm/gpiomux-7x30.c [deleted file]
arch/arm/mach-msm/gpiomux-8x50.c
arch/arm/mach-msm/headsmp.S
arch/arm/mach-msm/include/mach/board.h
arch/arm/mach-msm/include/mach/clk.h
arch/arm/mach-msm/include/mach/clkdev.h [new file with mode: 0644]
arch/arm/mach-msm/include/mach/cpu.h [new file with mode: 0644]
arch/arm/mach-msm/include/mach/io.h
arch/arm/mach-msm/include/mach/iommu.h
arch/arm/mach-msm/include/mach/iommu_hw-8xxx.h
arch/arm/mach-msm/include/mach/irqs-7x30.h
arch/arm/mach-msm/include/mach/irqs-8960.h [new file with mode: 0644]
arch/arm/mach-msm/include/mach/irqs-8x50.h
arch/arm/mach-msm/include/mach/irqs.h
arch/arm/mach-msm/include/mach/memory.h
arch/arm/mach-msm/include/mach/mmc.h
arch/arm/mach-msm/include/mach/msm_iomap-7x00.h
arch/arm/mach-msm/include/mach/msm_iomap-7x30.h
arch/arm/mach-msm/include/mach/msm_iomap-8960.h [new file with mode: 0644]
arch/arm/mach-msm/include/mach/msm_iomap-8x50.h
arch/arm/mach-msm/include/mach/msm_iomap-8x60.h
arch/arm/mach-msm/include/mach/msm_iomap.h
arch/arm/mach-msm/include/mach/sirc.h
arch/arm/mach-msm/include/mach/smp.h
arch/arm/mach-msm/io.c
arch/arm/mach-msm/iommu.c
arch/arm/mach-msm/iommu_dev.c
arch/arm/mach-msm/scm-boot.h
arch/arm/mach-msm/scm.c
arch/arm/mach-msm/scm.h
arch/arm/mach-msm/timer.c
drivers/mmc/host/msm_sdcc.c
drivers/mmc/host/msm_sdcc.h
drivers/tty/serial/msm_serial.c
drivers/tty/serial/msm_serial.h
drivers/video/msm/mdp_hw.h
drivers/video/msm/mdp_ppp.c
drivers/video/msm/msm_fb.c
include/linux/msm_mdp.h

index 48a0628d93e85171c2eaa7712367f6605f060d92..169db59f6bcbd4054477918d366727e2ef4e33c7 100644 (file)
@@ -635,6 +635,7 @@ config ARCH_MSM
        select HAVE_CLK
        select GENERIC_CLOCKEVENTS
        select ARCH_REQUIRE_GPIOLIB
+       select CLKDEV_LOOKUP
        help
          Support for Qualcomm MSM/QSD based systems.  This runs on the
          apps processor of the MSM/QSD and depends on a shared memory
index 5d3d9ade12fba23b7e91507168351ef1ec807347..1516896e8d177d53d1bff8a6c0ed0b1d7cb0eeee 100644 (file)
@@ -45,7 +45,16 @@ config ARCH_MSM8X60
        select CPU_V7
        select MSM_V2_TLMM
        select MSM_GPIOMUX
-       select IOMMU_API
+       select MSM_SCM if SMP
+
+config ARCH_MSM8960
+       bool "MSM8960"
+       select ARCH_MSM_SCORPIONMP
+       select MACH_MSM8960_SIM if (!MACH_MSM8960_RUMI3)
+       select ARM_GIC
+       select CPU_V7
+       select MSM_V2_TLMM
+       select MSM_GPIOMUX
        select MSM_SCM if SMP
 
 endchoice
@@ -125,11 +134,35 @@ config MACH_MSM8X60_FFA
        help
          Support for the Qualcomm MSM8x60 FFA eval board.
 
+config MACH_MSM8960_SIM
+       depends on ARCH_MSM8960
+       bool "MSM8960 Simulator"
+       help
+         Support for the Qualcomm MSM8960 simulator.
+
+config MACH_MSM8960_RUMI3
+       depends on ARCH_MSM8960
+       bool "MSM8960 RUMI3"
+       help
+         Support for the Qualcomm MSM8960 RUMI3 emulator.
+
 endmenu
 
+config MSM_IOMMU
+       bool "MSM IOMMU Support"
+       depends on ARCH_MSM8X60 || ARCH_MSM8960
+       select IOMMU_API
+       default n
+       help
+         Support for the IOMMUs found on certain Qualcomm SOCs.
+         These IOMMUs allow virtualization of the address space used by most
+         cores within the multimedia subsystem.
+
+         If unsure, say N here.
+
 config IOMMU_PGTABLES_L2
        def_bool y
-       depends on ARCH_MSM8X60 && MMU && SMP && CPU_DCACHE_DISABLE=n
+       depends on MSM_IOMMU && MMU && SMP && CPU_DCACHE_DISABLE=n
 
 config MSM_DEBUG_UART
        int
index 94195c190e13a495cf0701af1783a54af77a2a8c..9519fd28a025fd415abf9b7a591ac167085dac18 100644 (file)
@@ -1,21 +1,16 @@
 obj-y += io.o idle.o timer.o
-ifndef CONFIG_ARCH_MSM8X60
-obj-y += acpuclock-arm11.o
-obj-y += dma.o
-endif
+obj-y += clock.o
+obj-$(CONFIG_DEBUG_FS) += clock-debug.o
 
-ifdef CONFIG_MSM_VIC
-obj-y += irq-vic.o
-else
-ifndef CONFIG_ARCH_MSM8X60
-obj-y += irq.o
-endif
-endif
+obj-$(CONFIG_MSM_VIC) += irq-vic.o
+obj-$(CONFIG_MSM_IOMMU) += iommu.o iommu_dev.o devices-iommu.o
+
+obj-$(CONFIG_ARCH_MSM7X00A) += dma.o irq.o acpuclock-arm11.o
+obj-$(CONFIG_ARCH_MSM7X30) += dma.o
+obj-$(CONFIG_ARCH_QSD8X50) += dma.o sirc.o
 
-obj-$(CONFIG_ARCH_MSM8X60) += clock-dummy.o iommu.o iommu_dev.o devices-msm8x60-iommu.o
 obj-$(CONFIG_MSM_PROC_COMM) += proc_comm.o clock-pcom.o vreg.o
-obj-$(CONFIG_MSM_PROC_COMM) += clock.o
-obj-$(CONFIG_ARCH_QSD8X50) += sirc.o
+
 obj-$(CONFIG_MSM_SMD) += smd.o smd_debug.o
 obj-$(CONFIG_MSM_SMD) += last_radio_log.o
 obj-$(CONFIG_MSM_SCM) += scm.o scm-boot.o
@@ -29,12 +24,16 @@ obj-$(CONFIG_MACH_HALIBUT) += board-halibut.o devices-msm7x00.o
 obj-$(CONFIG_ARCH_MSM7X30) += board-msm7x30.o devices-msm7x30.o
 obj-$(CONFIG_ARCH_QSD8X50) += board-qsd8x50.o devices-qsd8x50.o
 obj-$(CONFIG_ARCH_MSM8X60) += board-msm8x60.o
+obj-$(CONFIG_ARCH_MSM8960) += board-msm8960.o devices-msm8960.o
 
-obj-$(CONFIG_ARCH_MSM7X30) += gpiomux-7x30.o gpiomux-v1.o gpiomux.o
+obj-$(CONFIG_ARCH_MSM7X30) += gpiomux-v1.o gpiomux.o
 obj-$(CONFIG_ARCH_QSD8X50) += gpiomux-8x50.o gpiomux-v1.o gpiomux.o
 obj-$(CONFIG_ARCH_MSM8X60) += gpiomux-8x60.o gpiomux-v2.o gpiomux.o
 ifdef CONFIG_MSM_V2_TLMM
+ifndef CONFIG_ARCH_MSM8960
+# TODO: TLMM Mapping issues need to be resolved
 obj-y  += gpio-v2.o
+endif
 else
 obj-y  += gpio.o
 endif
index 75dabb16c802380d6a02e06a1807afe72282cfc9..18a3c97bc8632b6d781c940be2fedb6bd8e1eba3 100644 (file)
@@ -93,8 +93,6 @@ static void __init halibut_map_io(void)
 }
 
 MACHINE_START(HALIBUT, "Halibut Board (QCT SURF7200A)")
-#ifdef CONFIG_MSM_DEBUG_UART
-#endif
        .boot_params    = 0x10000100,
        .fixup          = halibut_fixup,
        .map_io         = halibut_map_io,
index ef3ebf2f763be9c660554f4c6189aa67028a2ea0..7a9a03eb189cb578db9f20c992ead2105650ef39 100644 (file)
@@ -74,8 +74,6 @@ static void __init mahimahi_map_io(void)
 extern struct sys_timer msm_timer;
 
 MACHINE_START(MAHIMAHI, "mahimahi")
-#ifdef CONFIG_MSM_DEBUG_UART
-#endif
        .boot_params    = 0x20000100,
        .fixup          = mahimahi_fixup,
        .map_io         = mahimahi_map_io,
index 08fcd40a8cbd2fedeffddfa1bbed9902d481b502..c03f269e2e4bdaa29b29d9dc940ab4fab60a1c19 100644 (file)
@@ -130,8 +130,6 @@ static void __init msm7x2x_map_io(void)
 }
 
 MACHINE_START(MSM7X27_SURF, "QCT MSM7x27 SURF")
-#ifdef CONFIG_MSM_DEBUG_UART
-#endif
        .boot_params    = PLAT_PHYS_OFFSET + 0x100,
        .map_io         = msm7x2x_map_io,
        .init_irq       = msm7x2x_init_irq,
@@ -140,8 +138,6 @@ MACHINE_START(MSM7X27_SURF, "QCT MSM7x27 SURF")
 MACHINE_END
 
 MACHINE_START(MSM7X27_FFA, "QCT MSM7x27 FFA")
-#ifdef CONFIG_MSM_DEBUG_UART
-#endif
        .boot_params    = PLAT_PHYS_OFFSET + 0x100,
        .map_io         = msm7x2x_map_io,
        .init_irq       = msm7x2x_init_irq,
@@ -150,8 +146,6 @@ MACHINE_START(MSM7X27_FFA, "QCT MSM7x27 FFA")
 MACHINE_END
 
 MACHINE_START(MSM7X25_SURF, "QCT MSM7x25 SURF")
-#ifdef CONFIG_MSM_DEBUG_UART
-#endif
        .boot_params    = PLAT_PHYS_OFFSET + 0x100,
        .map_io         = msm7x2x_map_io,
        .init_irq       = msm7x2x_init_irq,
@@ -160,8 +154,6 @@ MACHINE_START(MSM7X25_SURF, "QCT MSM7x25 SURF")
 MACHINE_END
 
 MACHINE_START(MSM7X25_FFA, "QCT MSM7x25 FFA")
-#ifdef CONFIG_MSM_DEBUG_UART
-#endif
        .boot_params    = PLAT_PHYS_OFFSET + 0x100,
        .map_io         = msm7x2x_map_io,
        .init_irq       = msm7x2x_init_irq,
index 25db8fd71a70558f99e92c825cab9dfa5afb6f6b..b7a84966b711bcc9658595ecfdcc789bd9e1fe70 100644 (file)
@@ -23,6 +23,7 @@
 #include <linux/io.h>
 #include <linux/smsc911x.h>
 #include <linux/usb/msm_hsusb.h>
+#include <linux/clkdev.h>
 
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
@@ -36,6 +37,7 @@
 
 #include <mach/vreg.h>
 #include "devices.h"
+#include "gpiomux.h"
 #include "proc_comm.h"
 
 extern struct sys_timer msm_timer;
@@ -52,6 +54,27 @@ static struct msm_otg_platform_data msm_otg_pdata = {
        .otg_control            = OTG_PHY_CONTROL,
 };
 
+struct msm_gpiomux_config msm_gpiomux_configs[GPIOMUX_NGPIOS] = {
+#ifdef CONFIG_SERIAL_MSM_CONSOLE
+       [49] = { /* UART2 RFR */
+               .suspended = GPIOMUX_DRV_2MA | GPIOMUX_PULL_DOWN |
+                            GPIOMUX_FUNC_2 | GPIOMUX_VALID,
+       },
+       [50] = { /* UART2 CTS */
+               .suspended = GPIOMUX_DRV_2MA | GPIOMUX_PULL_DOWN |
+                            GPIOMUX_FUNC_2 | GPIOMUX_VALID,
+       },
+       [51] = { /* UART2 RX */
+               .suspended = GPIOMUX_DRV_2MA | GPIOMUX_PULL_DOWN |
+                            GPIOMUX_FUNC_2 | GPIOMUX_VALID,
+       },
+       [52] = { /* UART2 TX */
+               .suspended = GPIOMUX_DRV_2MA | GPIOMUX_PULL_DOWN |
+                            GPIOMUX_FUNC_2 | GPIOMUX_VALID,
+       },
+#endif
+};
+
 static struct platform_device *devices[] __initdata = {
 #if defined(CONFIG_SERIAL_MSM) || defined(CONFIG_MSM_SERIAL_DEBUGGER)
         &msm_device_uart2,
@@ -83,8 +106,6 @@ static void __init msm7x30_map_io(void)
 }
 
 MACHINE_START(MSM7X30_SURF, "QCT MSM7X30 SURF")
-#ifdef CONFIG_MSM_DEBUG_UART
-#endif
        .boot_params = PLAT_PHYS_OFFSET + 0x100,
        .map_io = msm7x30_map_io,
        .init_irq = msm7x30_init_irq,
@@ -93,8 +114,6 @@ MACHINE_START(MSM7X30_SURF, "QCT MSM7X30 SURF")
 MACHINE_END
 
 MACHINE_START(MSM7X30_FFA, "QCT MSM7X30 FFA")
-#ifdef CONFIG_MSM_DEBUG_UART
-#endif
        .boot_params = PLAT_PHYS_OFFSET + 0x100,
        .map_io = msm7x30_map_io,
        .init_irq = msm7x30_init_irq,
@@ -103,8 +122,6 @@ MACHINE_START(MSM7X30_FFA, "QCT MSM7X30 FFA")
 MACHINE_END
 
 MACHINE_START(MSM7X30_FLUID, "QCT MSM7X30 FLUID")
-#ifdef CONFIG_MSM_DEBUG_UART
-#endif
        .boot_params = PLAT_PHYS_OFFSET + 0x100,
        .map_io = msm7x30_map_io,
        .init_irq = msm7x30_init_irq,
diff --git a/arch/arm/mach-msm/board-msm8960.c b/arch/arm/mach-msm/board-msm8960.c
new file mode 100644 (file)
index 0000000..1993721
--- /dev/null
@@ -0,0 +1,91 @@
+/* Copyright (c) 2011, Code Aurora Forum. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 and
+ * only version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ *
+ */
+#include <linux/kernel.h>
+#include <linux/platform_device.h>
+#include <linux/io.h>
+#include <linux/irq.h>
+#include <linux/clkdev.h>
+
+#include <asm/mach-types.h>
+#include <asm/mach/arch.h>
+#include <asm/hardware/gic.h>
+
+#include <mach/board.h>
+#include <mach/msm_iomap.h>
+
+#include "devices.h"
+
+static void __init msm8960_map_io(void)
+{
+       msm_map_msm8960_io();
+}
+
+static void __init msm8960_init_irq(void)
+{
+       unsigned int i;
+       gic_init(0, GIC_PPI_START, MSM_QGIC_DIST_BASE,
+                (void *)MSM_QGIC_CPU_BASE);
+
+       /* Edge trigger PPIs except AVS_SVICINT and AVS_SVICINTSWDONE */
+       writel(0xFFFFD7FF, MSM_QGIC_DIST_BASE + GIC_DIST_CONFIG + 4);
+
+       if (machine_is_msm8960_rumi3())
+               writel(0x0000FFFF, MSM_QGIC_DIST_BASE + GIC_DIST_ENABLE_SET);
+
+       /* FIXME: Not installing AVS_SVICINT and AVS_SVICINTSWDONE yet
+        * as they are configured as level, which does not play nice with
+        * handle_percpu_irq.
+        */
+       for (i = GIC_PPI_START; i < GIC_SPI_START; i++) {
+               if (i != AVS_SVICINT && i != AVS_SVICINTSWDONE)
+                       set_irq_handler(i, handle_percpu_irq);
+       }
+}
+
+static struct platform_device *sim_devices[] __initdata = {
+       &msm8960_device_uart_gsbi2,
+};
+
+static struct platform_device *rumi3_devices[] __initdata = {
+       &msm8960_device_uart_gsbi5,
+};
+
+static void __init msm8960_sim_init(void)
+{
+       platform_add_devices(sim_devices, ARRAY_SIZE(sim_devices));
+}
+
+static void __init msm8960_rumi3_init(void)
+{
+       platform_add_devices(rumi3_devices, ARRAY_SIZE(rumi3_devices));
+}
+
+MACHINE_START(MSM8960_SIM, "QCT MSM8960 SIMULATOR")
+       .map_io = msm8960_map_io,
+       .init_irq = msm8960_init_irq,
+       .timer = &msm_timer,
+       .init_machine = msm8960_sim_init,
+MACHINE_END
+
+MACHINE_START(MSM8960_RUMI3, "QCT MSM8960 RUMI3")
+       .map_io = msm8960_map_io,
+       .init_irq = msm8960_init_irq,
+       .timer = &msm_timer,
+       .init_machine = msm8960_rumi3_init,
+MACHINE_END
+
index 9b5eb2b4ae1b8507a78927e43ce8c9c27b4220f6..b3c55f138fce8909250cc51d642f462d91a1c524 100644 (file)
 #include <mach/board.h>
 #include <mach/msm_iomap.h>
 
-unsigned long clk_get_max_axi_khz(void)
-{
-       return 0;
-}
 
 static void __init msm8x60_map_io(void)
 {
index 15c2bbd2ef81840e5adc7ea789fd5d18ee0b3717..7f568611547e94d5343db7d174712dc732ea0f2c 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2008-2009, Code Aurora Forum. All rights reserved.
+/* Copyright (c) 2009-2011, Code Aurora Forum. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 and
@@ -21,6 +21,8 @@
 #include <linux/platform_device.h>
 #include <linux/delay.h>
 #include <linux/usb/msm_hsusb.h>
+#include <linux/err.h>
+#include <linux/clkdev.h>
 
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
@@ -31,6 +33,8 @@
 #include <mach/irqs.h>
 #include <mach/sirc.h>
 #include <mach/gpio.h>
+#include <mach/vreg.h>
+#include <mach/mmc.h>
 
 #include "devices.h"
 
@@ -95,6 +99,81 @@ static struct platform_device *devices[] __initdata = {
        &msm_device_hsusb_host,
 };
 
+static struct msm_mmc_gpio sdc1_gpio_cfg[] = {
+       {51, "sdc1_dat_3"},
+       {52, "sdc1_dat_2"},
+       {53, "sdc1_dat_1"},
+       {54, "sdc1_dat_0"},
+       {55, "sdc1_cmd"},
+       {56, "sdc1_clk"}
+};
+
+static struct vreg *vreg_mmc;
+static unsigned long vreg_sts;
+
+static uint32_t msm_sdcc_setup_power(struct device *dv, unsigned int vdd)
+{
+       int rc = 0;
+       struct platform_device *pdev;
+
+       pdev = container_of(dv, struct platform_device, dev);
+
+       if (vdd == 0) {
+               if (!vreg_sts)
+                       return 0;
+
+               clear_bit(pdev->id, &vreg_sts);
+
+               if (!vreg_sts) {
+                       rc = vreg_disable(vreg_mmc);
+                       if (rc)
+                               pr_err("vreg_mmc disable failed for slot "
+                                               "%d: %d\n", pdev->id, rc);
+               }
+               return 0;
+       }
+
+       if (!vreg_sts) {
+               rc = vreg_set_level(vreg_mmc, 2900);
+               if (rc)
+                       pr_err("vreg_mmc set level failed for slot %d: %d\n",
+                                       pdev->id, rc);
+               rc = vreg_enable(vreg_mmc);
+               if (rc)
+                       pr_err("vreg_mmc enable failed for slot %d: %d\n",
+                                       pdev->id, rc);
+       }
+       set_bit(pdev->id, &vreg_sts);
+       return 0;
+}
+
+static struct msm_mmc_gpio_data sdc1_gpio = {
+       .gpio = sdc1_gpio_cfg,
+       .size = ARRAY_SIZE(sdc1_gpio_cfg),
+};
+
+static struct msm_mmc_platform_data qsd8x50_sdc1_data = {
+       .ocr_mask       = MMC_VDD_27_28 | MMC_VDD_28_29,
+       .translate_vdd  = msm_sdcc_setup_power,
+       .gpio_data = &sdc1_gpio,
+};
+
+static void __init qsd8x50_init_mmc(void)
+{
+       if (machine_is_qsd8x50_ffa() || machine_is_qsd8x50a_ffa())
+               vreg_mmc = vreg_get(NULL, "gp6");
+       else
+               vreg_mmc = vreg_get(NULL, "gp5");
+
+       if (IS_ERR(vreg_mmc)) {
+               pr_err("vreg get for vreg_mmc failed (%ld)\n",
+                               PTR_ERR(vreg_mmc));
+               return;
+       }
+
+       msm_add_sdcc(1, &qsd8x50_sdc1_data, 0, 0);
+}
+
 static void __init qsd8x50_map_io(void)
 {
        msm_map_qsd8x50_io();
@@ -113,11 +192,10 @@ static void __init qsd8x50_init(void)
        msm_device_hsusb.dev.parent = &msm_device_otg.dev;
        msm_device_hsusb_host.dev.parent = &msm_device_otg.dev;
        platform_add_devices(devices, ARRAY_SIZE(devices));
+       qsd8x50_init_mmc();
 }
 
 MACHINE_START(QSD8X50_SURF, "QCT QSD8X50 SURF")
-#ifdef CONFIG_MSM_DEBUG_UART
-#endif
        .boot_params = PLAT_PHYS_OFFSET + 0x100,
        .map_io = qsd8x50_map_io,
        .init_irq = qsd8x50_init_irq,
@@ -126,8 +204,6 @@ MACHINE_START(QSD8X50_SURF, "QCT QSD8X50 SURF")
 MACHINE_END
 
 MACHINE_START(QSD8X50A_ST1_5, "QCT QSD8X50A ST1.5")
-#ifdef CONFIG_MSM_DEBUG_UART
-#endif
        .boot_params = PLAT_PHYS_OFFSET + 0x100,
        .map_io = qsd8x50_map_io,
        .init_irq = qsd8x50_init_irq,
index 83604f526f0f350720acaf9f43de47cd8d070018..68f930f07d77c2bb86192e329036db861ccedafc 100644 (file)
@@ -105,8 +105,6 @@ static void __init sapphire_map_io(void)
 
 MACHINE_START(SAPPHIRE, "sapphire")
 /* Maintainer: Brian Swetland <swetland@google.com> */
-#ifdef CONFIG_MSM_DEBUG_UART
-#endif
        .boot_params    = PLAT_PHYS_OFFSET + 0x100,
        .fixup          = sapphire_fixup,
        .map_io         = sapphire_map_io,
index a604ec1e44bf2d685952263e7a2f691eb51a5cce..31117a4499c4bcb543904e0fbad05202df7111d6 100644 (file)
@@ -74,8 +74,6 @@ static int msm_gpiolib_direction_output(struct gpio_chip *chip,
 
 static int trout_gpio_to_irq(struct gpio_chip *chip, unsigned offset)
 {
-       struct msm_gpio_chip *msm_gpio = to_msm_gpio_chip(chip);
-
        return TROUT_GPIO_TO_INT(offset + chip->base);
 }
 
index 73f146066542198f111330b602eb3978bd34fa4b..814386772c663d16ea9c314a23788e9dba706745 100644 (file)
@@ -17,6 +17,7 @@
 #include <linux/kernel.h>
 #include <linux/init.h>
 #include <linux/platform_device.h>
+#include <linux/clkdev.h>
 
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
@@ -92,8 +93,6 @@ static void __init trout_map_io(void)
 }
 
 MACHINE_START(TROUT, "HTC Dream")
-#ifdef CONFIG_MSM_DEBUG_UART
-#endif
        .boot_params    = 0x10000100,
        .fixup          = trout_fixup,
        .map_io         = trout_map_io,
index e16f72f32829fbfce4df03f7997504406bc24c09..14104453688bd3fed7db46f35f183a6140e6376e 100644 (file)
@@ -1,30 +1,13 @@
 /* Copyright (c) 2009, Code Aurora Forum. All rights reserved.
  *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of Code Aurora Forum, Inc. nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 and
+ * only version 2 as published by the Free Software Foundation.
  *
+ * This program is distributed in the hope that it will be useful,
+ * 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.
  */
 
 #ifndef __ARCH_ARM_MACH_MSM_CLOCK_7X30_H
@@ -147,22 +130,26 @@ void pll_disable(uint32_t pll);
 extern int internal_pwr_rail_ctl_auto(unsigned rail_id, bool enable);
 
 #define CLK_7X30(clk_name, clk_id, clk_dev, clk_flags) {       \
-       .name = clk_name, \
-       .id = L_7X30_##clk_id, \
-       .remote_id = P_##clk_id, \
-       .flags = clk_flags, \
-       .dev = clk_dev, \
-       .dbg_name = #clk_id, \
+       .con_id = clk_name, \
+       .dev_id = clk_dev, \
+       .clk = &(struct clk){ \
+               .id = L_7X30_##clk_id, \
+               .remote_id = P_##clk_id, \
+               .flags = clk_flags, \
+               .dbg_name = #clk_id, \
+       }, \
        }
 
 #define CLK_7X30S(clk_name, l_id, r_id, clk_dev, clk_flags) {  \
-       .name = clk_name, \
-       .id = L_7X30_##l_id, \
-       .remote_id = P_##r_id, \
-       .flags = clk_flags, \
-       .dev = clk_dev, \
-       .dbg_name = #l_id, \
+       .con_id = clk_name, \
+       .dev_id = clk_dev, \
+       .clk = &(struct clk){ \
+               .id = L_7X30_##l_id, \
+               .remote_id = P_##r_id, \
+               .flags = clk_flags, \
+               .dbg_name = #l_id, \
+               .ops = &clk_ops_pcom, \
+       }, \
        }
 
 #endif
-
diff --git a/arch/arm/mach-msm/clock-debug.c b/arch/arm/mach-msm/clock-debug.c
new file mode 100644 (file)
index 0000000..4886404
--- /dev/null
@@ -0,0 +1,130 @@
+/*
+ * Copyright (C) 2007 Google, Inc.
+ * Copyright (c) 2007-2010, Code Aurora Forum. All rights reserved.
+ *
+ * This software is licensed under the terms of the GNU General Public
+ * License version 2, as published by the Free Software Foundation, and
+ * may be copied, distributed, and modified under those terms.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * 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.
+ *
+ */
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/ctype.h>
+#include <linux/debugfs.h>
+#include <linux/clk.h>
+#include "clock.h"
+
+static int clock_debug_rate_set(void *data, u64 val)
+{
+       struct clk *clock = data;
+       int ret;
+
+       /* Only increases to max rate will succeed, but that's actually good
+        * for debugging purposes so we don't check for error. */
+       if (clock->flags & CLK_MAX)
+               clk_set_max_rate(clock, val);
+       if (clock->flags & CLK_MIN)
+               ret = clk_set_min_rate(clock, val);
+       else
+               ret = clk_set_rate(clock, val);
+       if (ret != 0)
+               printk(KERN_ERR "clk_set%s_rate failed (%d)\n",
+                       (clock->flags & CLK_MIN) ? "_min" : "", ret);
+       return ret;
+}
+
+static int clock_debug_rate_get(void *data, u64 *val)
+{
+       struct clk *clock = data;
+       *val = clk_get_rate(clock);
+       return 0;
+}
+
+DEFINE_SIMPLE_ATTRIBUTE(clock_rate_fops, clock_debug_rate_get,
+                       clock_debug_rate_set, "%llu\n");
+
+static int clock_debug_enable_set(void *data, u64 val)
+{
+       struct clk *clock = data;
+       int rc = 0;
+
+       if (val)
+               rc = clock->ops->enable(clock->id);
+       else
+               clock->ops->disable(clock->id);
+
+       return rc;
+}
+
+static int clock_debug_enable_get(void *data, u64 *val)
+{
+       struct clk *clock = data;
+
+       *val = clock->ops->is_enabled(clock->id);
+
+       return 0;
+}
+
+DEFINE_SIMPLE_ATTRIBUTE(clock_enable_fops, clock_debug_enable_get,
+                       clock_debug_enable_set, "%llu\n");
+
+static int clock_debug_local_get(void *data, u64 *val)
+{
+       struct clk *clock = data;
+
+       *val = clock->ops->is_local(clock->id);
+
+       return 0;
+}
+
+DEFINE_SIMPLE_ATTRIBUTE(clock_local_fops, clock_debug_local_get,
+                       NULL, "%llu\n");
+
+static struct dentry *debugfs_base;
+
+int __init clock_debug_init(void)
+{
+       debugfs_base = debugfs_create_dir("clk", NULL);
+       if (!debugfs_base)
+               return -ENOMEM;
+       return 0;
+}
+
+int __init clock_debug_add(struct clk *clock)
+{
+       char temp[50], *ptr;
+       struct dentry *clk_dir;
+
+       if (!debugfs_base)
+               return -ENOMEM;
+
+       strncpy(temp, clock->dbg_name, ARRAY_SIZE(temp)-1);
+       for (ptr = temp; *ptr; ptr++)
+               *ptr = tolower(*ptr);
+
+       clk_dir = debugfs_create_dir(temp, debugfs_base);
+       if (!clk_dir)
+               return -ENOMEM;
+
+       if (!debugfs_create_file("rate", S_IRUGO | S_IWUSR, clk_dir,
+                               clock, &clock_rate_fops))
+               goto error;
+
+       if (!debugfs_create_file("enable", S_IRUGO | S_IWUSR, clk_dir,
+                               clock, &clock_enable_fops))
+               goto error;
+
+       if (!debugfs_create_file("is_local", S_IRUGO, clk_dir, clock,
+                               &clock_local_fops))
+               goto error;
+       return 0;
+error:
+       debugfs_remove_recursive(clk_dir);
+       return -ENOMEM;
+}
diff --git a/arch/arm/mach-msm/clock-dummy.c b/arch/arm/mach-msm/clock-dummy.c
deleted file mode 100644 (file)
index 1250d22..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-/* Copyright (c) 2010, Code Aurora Forum. All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 and
- * only version 2 as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * 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., 51 Franklin Street, Fifth Floor, Boston, MA
- * 02110-1301, USA.
- *
- */
-#include <linux/clk.h>
-#include <linux/err.h>
-#include <linux/module.h>
-
-struct clk *clk_get(struct device *dev, const char *id)
-{
-       return ERR_PTR(-ENOENT);
-}
-EXPORT_SYMBOL(clk_get);
-
-int clk_enable(struct clk *clk)
-{
-       return -ENOENT;
-}
-EXPORT_SYMBOL(clk_enable);
-
-void clk_disable(struct clk *clk)
-{
-}
-EXPORT_SYMBOL(clk_disable);
-
-unsigned long clk_get_rate(struct clk *clk)
-{
-       return 0;
-}
-EXPORT_SYMBOL(clk_get_rate);
-
-int clk_set_rate(struct clk *clk, unsigned long rate)
-{
-       return -ENOENT;
-}
-EXPORT_SYMBOL(clk_set_rate);
-
-void clk_put(struct clk *clk)
-{
-}
-EXPORT_SYMBOL(clk_put);
index a3b45627eb4aa4cb57530c29601436f51746f97d..63b7113110869dc0ab48b14b81f2361ded53e314 100644 (file)
@@ -20,6 +20,7 @@
 
 #include "proc_comm.h"
 #include "clock.h"
+#include "clock-pcom.h"
 
 /*
  * glue for the proc_comm interface
@@ -116,6 +117,11 @@ long pc_clk_round_rate(unsigned id, unsigned rate)
        return rate;
 }
 
+static bool pc_clk_is_local(unsigned id)
+{
+       return false;
+}
+
 struct clk_ops clk_ops_pcom = {
        .enable = pc_clk_enable,
        .disable = pc_clk_disable,
@@ -128,4 +134,5 @@ struct clk_ops clk_ops_pcom = {
        .get_rate = pc_clk_get_rate,
        .is_enabled = pc_clk_is_enabled,
        .round_rate = pc_clk_round_rate,
+       .is_local = pc_clk_is_local,
 };
index 17d027b235011bd594291b70dcc9ca75168cfd94..974d0032f3a3632d736ded9ef168b431d8491001 100644 (file)
@@ -1,30 +1,13 @@
 /* Copyright (c) 2009, Code Aurora Forum. All rights reserved.
  *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of Code Aurora Forum, Inc. nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 and
+ * only version 2 as published by the Free Software Foundation.
  *
+ * This program is distributed in the hope that it will be useful,
+ * 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.
  */
 
 #ifndef __ARCH_ARM_MACH_MSM_CLOCK_PCOM_H
 #define P_CSI1_P_CLK           97
 #define P_GSBI_CLK             98
 #define P_GSBI_P_CLK           99
+#define P_CE_CLK               100 /* Crypto engine */
+#define P_CODEC_SSBI_CLK       101
 
-#define P_NR_CLKS              100
+#define P_NR_CLKS              102
 
 struct clk_ops;
 extern struct clk_ops clk_ops_pcom;
@@ -141,13 +126,15 @@ extern struct clk_ops clk_ops_pcom;
 int pc_clk_reset(unsigned id, enum clk_reset_action action);
 
 #define CLK_PCOM(clk_name, clk_id, clk_dev, clk_flags) {       \
-       .name = clk_name, \
-       .id = P_##clk_id, \
-       .remote_id = P_##clk_id, \
-       .ops = &clk_ops_pcom, \
-       .flags = clk_flags, \
-       .dev = clk_dev, \
-       .dbg_name = #clk_id, \
+       .con_id = clk_name, \
+       .dev_id = clk_dev, \
+       .clk = &(struct clk){ \
+               .id = P_##clk_id, \
+               .remote_id = P_##clk_id, \
+               .ops = &clk_ops_pcom, \
+               .flags = clk_flags, \
+               .dbg_name = #clk_id, \
+       }, \
        }
 
 #endif
index 2069bfaa3a2619d078cb90edd93f3578b9f2230e..22a537669624285e938f31d0ba2cdc0e8d51783f 100644 (file)
  */
 
 #include <linux/kernel.h>
-#include <linux/init.h>
-#include <linux/module.h>
 #include <linux/list.h>
 #include <linux/err.h>
-#include <linux/clk.h>
 #include <linux/spinlock.h>
-#include <linux/debugfs.h>
-#include <linux/ctype.h>
 #include <linux/pm_qos_params.h>
-#include <mach/clk.h>
+#include <linux/mutex.h>
+#include <linux/clk.h>
+#include <linux/string.h>
+#include <linux/module.h>
+#include <linux/clkdev.h>
 
 #include "clock.h"
-#include "proc_comm.h"
-#include "clock-7x30.h"
 
 static DEFINE_MUTEX(clocks_mutex);
 static DEFINE_SPINLOCK(clocks_lock);
 static LIST_HEAD(clocks);
-struct clk *msm_clocks;
-unsigned msm_num_clocks;
-
-/*
- * Bitmap of enabled clocks, excluding ACPU which is always
- * enabled
- */
-static DECLARE_BITMAP(clock_map_enabled, NR_CLKS);
-static DEFINE_SPINLOCK(clock_map_lock);
 
 /*
  * Standard clock functions defined in include/linux/clk.h
  */
-struct clk *clk_get(struct device *dev, const char *id)
-{
-       struct clk *clk;
-
-       mutex_lock(&clocks_mutex);
-
-       list_for_each_entry(clk, &clocks, list)
-               if (!strcmp(id, clk->name) && clk->dev == dev)
-                       goto found_it;
-
-       list_for_each_entry(clk, &clocks, list)
-               if (!strcmp(id, clk->name) && clk->dev == NULL)
-                       goto found_it;
-
-       clk = ERR_PTR(-ENOENT);
-found_it:
-       mutex_unlock(&clocks_mutex);
-       return clk;
-}
-EXPORT_SYMBOL(clk_get);
-
-void clk_put(struct clk *clk)
-{
-}
-EXPORT_SYMBOL(clk_put);
-
 int clk_enable(struct clk *clk)
 {
        unsigned long flags;
        spin_lock_irqsave(&clocks_lock, flags);
        clk->count++;
-       if (clk->count == 1) {
+       if (clk->count == 1)
                clk->ops->enable(clk->id);
-               spin_lock(&clock_map_lock);
-               clock_map_enabled[BIT_WORD(clk->id)] |= BIT_MASK(clk->id);
-               spin_unlock(&clock_map_lock);
-       }
        spin_unlock_irqrestore(&clocks_lock, flags);
        return 0;
 }
@@ -94,20 +52,14 @@ void clk_disable(struct clk *clk)
        spin_lock_irqsave(&clocks_lock, flags);
        BUG_ON(clk->count == 0);
        clk->count--;
-       if (clk->count == 0) {
+       if (clk->count == 0)
                clk->ops->disable(clk->id);
-               spin_lock(&clock_map_lock);
-               clock_map_enabled[BIT_WORD(clk->id)] &= ~BIT_MASK(clk->id);
-               spin_unlock(&clock_map_lock);
-       }
        spin_unlock_irqrestore(&clocks_lock, flags);
 }
 EXPORT_SYMBOL(clk_disable);
 
 int clk_reset(struct clk *clk, enum clk_reset_action action)
 {
-       if (!clk->ops->reset)
-               clk->ops->reset = &pc_clk_reset;
        return clk->ops->reset(clk->remote_id, action);
 }
 EXPORT_SYMBOL(clk_reset);
@@ -184,25 +136,14 @@ EXPORT_SYMBOL(clk_set_flags);
  */
 static struct clk *ebi1_clk;
 
-static void __init set_clock_ops(struct clk *clk)
-{
-       if (!clk->ops) {
-               clk->ops = &clk_ops_pcom;
-               clk->id = clk->remote_id;
-       }
-}
-
-void __init msm_clock_init(struct clk *clock_tbl, unsigned num_clocks)
+void __init msm_clock_init(struct clk_lookup *clock_tbl, unsigned num_clocks)
 {
        unsigned n;
 
-       spin_lock_init(&clocks_lock);
        mutex_lock(&clocks_mutex);
-       msm_clocks = clock_tbl;
-       msm_num_clocks = num_clocks;
-       for (n = 0; n < msm_num_clocks; n++) {
-               set_clock_ops(&msm_clocks[n]);
-               list_add_tail(&msm_clocks[n].list, &clocks);
+       for (n = 0; n < num_clocks; n++) {
+               clkdev_add(&clock_tbl[n]);
+               list_add_tail(&clock_tbl[n].clk->list, &clocks);
        }
        mutex_unlock(&clocks_mutex);
 
@@ -211,115 +152,6 @@ void __init msm_clock_init(struct clk *clock_tbl, unsigned num_clocks)
 
 }
 
-#if defined(CONFIG_DEBUG_FS)
-static struct clk *msm_clock_get_nth(unsigned index)
-{
-       if (index < msm_num_clocks)
-               return msm_clocks + index;
-       else
-               return 0;
-}
-
-static int clock_debug_rate_set(void *data, u64 val)
-{
-       struct clk *clock = data;
-       int ret;
-
-       /* Only increases to max rate will succeed, but that's actually good
-        * for debugging purposes. So we don't check for error. */
-       if (clock->flags & CLK_MAX)
-               clk_set_max_rate(clock, val);
-       if (clock->flags & CLK_MIN)
-               ret = clk_set_min_rate(clock, val);
-       else
-               ret = clk_set_rate(clock, val);
-       if (ret != 0)
-               printk(KERN_ERR "clk_set%s_rate failed (%d)\n",
-                       (clock->flags & CLK_MIN) ? "_min" : "", ret);
-       return ret;
-}
-
-static int clock_debug_rate_get(void *data, u64 *val)
-{
-       struct clk *clock = data;
-       *val = clk_get_rate(clock);
-       return 0;
-}
-
-static int clock_debug_enable_set(void *data, u64 val)
-{
-       struct clk *clock = data;
-       int rc = 0;
-
-       if (val)
-               rc = clock->ops->enable(clock->id);
-       else
-               clock->ops->disable(clock->id);
-
-       return rc;
-}
-
-static int clock_debug_enable_get(void *data, u64 *val)
-{
-       struct clk *clock = data;
-
-       *val = clock->ops->is_enabled(clock->id);
-
-       return 0;
-}
-
-static int clock_debug_local_get(void *data, u64 *val)
-{
-       struct clk *clock = data;
-
-       *val = clock->ops != &clk_ops_pcom;
-
-       return 0;
-}
-
-DEFINE_SIMPLE_ATTRIBUTE(clock_rate_fops, clock_debug_rate_get,
-                       clock_debug_rate_set, "%llu\n");
-DEFINE_SIMPLE_ATTRIBUTE(clock_enable_fops, clock_debug_enable_get,
-                       clock_debug_enable_set, "%llu\n");
-DEFINE_SIMPLE_ATTRIBUTE(clock_local_fops, clock_debug_local_get,
-                       NULL, "%llu\n");
-
-static int __init clock_debug_init(void)
-{
-       struct dentry *dent_rate, *dent_enable, *dent_local;
-       struct clk *clock;
-       unsigned n = 0;
-       char temp[50], *ptr;
-
-       dent_rate = debugfs_create_dir("clk_rate", 0);
-       if (IS_ERR(dent_rate))
-               return PTR_ERR(dent_rate);
-
-       dent_enable = debugfs_create_dir("clk_enable", 0);
-       if (IS_ERR(dent_enable))
-               return PTR_ERR(dent_enable);
-
-       dent_local = debugfs_create_dir("clk_local", NULL);
-       if (IS_ERR(dent_local))
-               return PTR_ERR(dent_local);
-
-       while ((clock = msm_clock_get_nth(n++)) != 0) {
-               strncpy(temp, clock->dbg_name, ARRAY_SIZE(temp)-1);
-               for (ptr = temp; *ptr; ptr++)
-                       *ptr = tolower(*ptr);
-               debugfs_create_file(temp, 0644, dent_rate,
-                                   clock, &clock_rate_fops);
-               debugfs_create_file(temp, 0644, dent_enable,
-                                   clock, &clock_enable_fops);
-               debugfs_create_file(temp, S_IRUGO, dent_local,
-                                   clock, &clock_local_fops);
-       }
-       return 0;
-}
-
-device_initcall(clock_debug_init);
-#endif
-
 /* The bootloader and/or AMSS may have left various clocks enabled.
  * Disable any clocks that belong to us (CLKFLAG_AUTO_OFF) but have
  * not been explicitly enabled by a clk_enable() call.
@@ -330,8 +162,10 @@ static int __init clock_late_init(void)
        struct clk *clk;
        unsigned count = 0;
 
+       clock_debug_init();
        mutex_lock(&clocks_mutex);
        list_for_each_entry(clk, &clocks, list) {
+               clock_debug_add(clk);
                if (clk->flags & CLKFLAG_AUTO_OFF) {
                        spin_lock_irqsave(&clocks_lock, flags);
                        if (!clk->count) {
index c270b552ed1356609cb96e9bbc551fb50908615f..2c007f606d2921e61d8692bd7a3e288cf08d588b 100644 (file)
 #ifndef __ARCH_ARM_MACH_MSM_CLOCK_H
 #define __ARCH_ARM_MACH_MSM_CLOCK_H
 
+#include <linux/init.h>
 #include <linux/list.h>
 #include <mach/clk.h>
 
-#include "clock-pcom.h"
-#include "clock-7x30.h"
-
 #define CLKFLAG_INVERT                 0x00000001
 #define CLKFLAG_NOINVERT               0x00000002
 #define CLKFLAG_NONEST                 0x00000004
@@ -45,6 +43,7 @@ struct clk_ops {
        unsigned (*get_rate)(unsigned id);
        unsigned (*is_enabled)(unsigned id);
        long (*round_rate)(unsigned id, unsigned rate);
+       bool (*is_local)(unsigned id);
 };
 
 struct clk {
@@ -52,58 +51,22 @@ struct clk {
        uint32_t remote_id;
        uint32_t count;
        uint32_t flags;
-       const char *name;
        struct clk_ops *ops;
        const char *dbg_name;
        struct list_head list;
-       struct device *dev;
 };
 
-#define A11S_CLK_CNTL_ADDR             (MSM_CSR_BASE + 0x100)
-#define A11S_CLK_SEL_ADDR              (MSM_CSR_BASE + 0x104)
-#define A11S_VDD_SVS_PLEVEL_ADDR       (MSM_CSR_BASE + 0x124)
-
-#ifdef CONFIG_DEBUG_FS
-#define CLOCK_DBG_NAME(x) .dbg_name = x,
-#else
-#define CLOCK_DBG_NAME(x)
-#endif
-
-#define CLOCK(clk_name, clk_id, clk_dev, clk_flags) {  \
-       .name = clk_name, \
-       .id = clk_id, \
-       .flags = clk_flags, \
-       .dev = clk_dev, \
-        CLOCK_DBG_NAME(#clk_id) \
-       }
-
 #define OFF CLKFLAG_AUTO_OFF
 #define CLK_MIN CLKFLAG_MIN
 #define CLK_MAX CLKFLAG_MAX
 #define CLK_MINMAX (CLK_MIN | CLK_MAX)
-#define NR_CLKS        P_NR_CLKS
-
-enum {
-       PLL_0 = 0,
-       PLL_1,
-       PLL_2,
-       PLL_3,
-       PLL_4,
-       PLL_5,
-       PLL_6,
-       NUM_PLL
-};
-
-enum clkvote_client {
-       CLKVOTE_ACPUCLK = 0,
-       CLKVOTE_PMQOS,
-       CLKVOTE_MAX,
-};
-
-int msm_clock_require_tcxo(unsigned long *reason, int nbits);
-int msm_clock_get_name(uint32_t id, char *name, uint32_t size);
-int ebi1_clk_set_min_rate(enum clkvote_client client, unsigned long rate);
-unsigned long clk_get_max_axi_khz(void);
 
+#ifdef CONFIG_DEBUG_FS
+int __init clock_debug_init(void);
+int __init clock_debug_add(struct clk *clock);
+#else
+static inline int __init clock_debug_init(void) { return 0; }
+static inline int __init clock_debug_add(struct clk *clock) { return 0; }
 #endif
 
+#endif
similarity index 92%
rename from arch/arm/mach-msm/devices-msm8x60-iommu.c
rename to arch/arm/mach-msm/devices-iommu.c
index f9e7bd34ec59b49dad6481f6c1477f3de482bdfe..24030d0da6e3c59ec9ddfa2a76995001f747bc62 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2010, Code Aurora Forum. All rights reserved.
+/* Copyright (c) 2010-2011, Code Aurora Forum. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 and
 #include <linux/kernel.h>
 #include <linux/platform_device.h>
 #include <linux/bootmem.h>
-
-#include <mach/msm_iomap-8x60.h>
-#include <mach/irqs-8x60.h>
+#include <mach/irqs.h>
 #include <mach/iommu.h>
 
 static struct resource msm_iommu_jpegd_resources[] = {
        {
-               .start = MSM_IOMMU_JPEGD_PHYS,
-               .end   = MSM_IOMMU_JPEGD_PHYS + MSM_IOMMU_JPEGD_SIZE - 1,
+               .start = 0x07300000,
+               .end   = 0x07300000 + SZ_1M - 1,
                .name  = "physbase",
                .flags = IORESOURCE_MEM,
        },
@@ -46,8 +44,8 @@ static struct resource msm_iommu_jpegd_resources[] = {
 
 static struct resource msm_iommu_vpe_resources[] = {
        {
-               .start = MSM_IOMMU_VPE_PHYS,
-               .end   = MSM_IOMMU_VPE_PHYS + MSM_IOMMU_VPE_SIZE - 1,
+               .start = 0x07400000,
+               .end   = 0x07400000 + SZ_1M - 1,
                .name  = "physbase",
                .flags = IORESOURCE_MEM,
        },
@@ -67,8 +65,8 @@ static struct resource msm_iommu_vpe_resources[] = {
 
 static struct resource msm_iommu_mdp0_resources[] = {
        {
-               .start = MSM_IOMMU_MDP0_PHYS,
-               .end   = MSM_IOMMU_MDP0_PHYS + MSM_IOMMU_MDP0_SIZE - 1,
+               .start = 0x07500000,
+               .end   = 0x07500000 + SZ_1M - 1,
                .name  = "physbase",
                .flags = IORESOURCE_MEM,
        },
@@ -88,8 +86,8 @@ static struct resource msm_iommu_mdp0_resources[] = {
 
 static struct resource msm_iommu_mdp1_resources[] = {
        {
-               .start = MSM_IOMMU_MDP1_PHYS,
-               .end   = MSM_IOMMU_MDP1_PHYS + MSM_IOMMU_MDP1_SIZE - 1,
+               .start = 0x07600000,
+               .end   = 0x07600000 + SZ_1M - 1,
                .name  = "physbase",
                .flags = IORESOURCE_MEM,
        },
@@ -109,8 +107,8 @@ static struct resource msm_iommu_mdp1_resources[] = {
 
 static struct resource msm_iommu_rot_resources[] = {
        {
-               .start = MSM_IOMMU_ROT_PHYS,
-               .end   = MSM_IOMMU_ROT_PHYS + MSM_IOMMU_ROT_SIZE - 1,
+               .start = 0x07700000,
+               .end   = 0x07700000 + SZ_1M - 1,
                .name  = "physbase",
                .flags = IORESOURCE_MEM,
        },
@@ -130,8 +128,8 @@ static struct resource msm_iommu_rot_resources[] = {
 
 static struct resource msm_iommu_ijpeg_resources[] = {
        {
-               .start = MSM_IOMMU_IJPEG_PHYS,
-               .end   = MSM_IOMMU_IJPEG_PHYS + MSM_IOMMU_IJPEG_SIZE - 1,
+               .start = 0x07800000,
+               .end   = 0x07800000 + SZ_1M - 1,
                .name  = "physbase",
                .flags = IORESOURCE_MEM,
        },
@@ -151,8 +149,8 @@ static struct resource msm_iommu_ijpeg_resources[] = {
 
 static struct resource msm_iommu_vfe_resources[] = {
        {
-               .start = MSM_IOMMU_VFE_PHYS,
-               .end   = MSM_IOMMU_VFE_PHYS + MSM_IOMMU_VFE_SIZE - 1,
+               .start = 0x07900000,
+               .end   = 0x07900000 + SZ_1M - 1,
                .name  = "physbase",
                .flags = IORESOURCE_MEM,
        },
@@ -172,8 +170,8 @@ static struct resource msm_iommu_vfe_resources[] = {
 
 static struct resource msm_iommu_vcodec_a_resources[] = {
        {
-               .start = MSM_IOMMU_VCODEC_A_PHYS,
-               .end   = MSM_IOMMU_VCODEC_A_PHYS + MSM_IOMMU_VCODEC_A_SIZE - 1,
+               .start = 0x07A00000,
+               .end   = 0x07A00000 + SZ_1M - 1,
                .name  = "physbase",
                .flags = IORESOURCE_MEM,
        },
@@ -193,8 +191,8 @@ static struct resource msm_iommu_vcodec_a_resources[] = {
 
 static struct resource msm_iommu_vcodec_b_resources[] = {
        {
-               .start = MSM_IOMMU_VCODEC_B_PHYS,
-               .end   = MSM_IOMMU_VCODEC_B_PHYS + MSM_IOMMU_VCODEC_B_SIZE - 1,
+               .start = 0x07B00000,
+               .end   = 0x07B00000 + SZ_1M - 1,
                .name  = "physbase",
                .flags = IORESOURCE_MEM,
        },
@@ -214,8 +212,8 @@ static struct resource msm_iommu_vcodec_b_resources[] = {
 
 static struct resource msm_iommu_gfx3d_resources[] = {
        {
-               .start = MSM_IOMMU_GFX3D_PHYS,
-               .end   = MSM_IOMMU_GFX3D_PHYS + MSM_IOMMU_GFX3D_SIZE - 1,
+               .start = 0x07C00000,
+               .end   = 0x07C00000 + SZ_1M - 1,
                .name  = "physbase",
                .flags = IORESOURCE_MEM,
        },
@@ -235,8 +233,8 @@ static struct resource msm_iommu_gfx3d_resources[] = {
 
 static struct resource msm_iommu_gfx2d0_resources[] = {
        {
-               .start = MSM_IOMMU_GFX2D0_PHYS,
-               .end   = MSM_IOMMU_GFX2D0_PHYS + MSM_IOMMU_GFX2D0_SIZE - 1,
+               .start = 0x07D00000,
+               .end   = 0x07D00000 + SZ_1M - 1,
                .name  = "physbase",
                .flags = IORESOURCE_MEM,
        },
@@ -256,8 +254,8 @@ static struct resource msm_iommu_gfx2d0_resources[] = {
 
 static struct resource msm_iommu_gfx2d1_resources[] = {
        {
-               .start = MSM_IOMMU_GFX2D1_PHYS,
-               .end   = MSM_IOMMU_GFX2D1_PHYS + MSM_IOMMU_GFX2D1_SIZE - 1,
+               .start = 0x07E00000,
+               .end   = 0x07E00000 + SZ_1M - 1,
                .name  = "physbase",
                .flags = IORESOURCE_MEM,
        },
@@ -282,55 +280,62 @@ static struct platform_device msm_root_iommu_dev = {
 
 static struct msm_iommu_dev jpegd_iommu = {
        .name = "jpegd",
-       .clk_rate = -1
+       .ncb = 2,
 };
 
 static struct msm_iommu_dev vpe_iommu = {
-       .name = "vpe"
+       .name = "vpe",
+       .ncb = 2,
 };
 
 static struct msm_iommu_dev mdp0_iommu = {
-       .name = "mdp0"
+       .name = "mdp0",
+       .ncb = 2,
 };
 
 static struct msm_iommu_dev mdp1_iommu = {
-       .name = "mdp1"
+       .name = "mdp1",
+       .ncb = 2,
 };
 
 static struct msm_iommu_dev rot_iommu = {
-       .name = "rot"
+       .name = "rot",
+       .ncb = 2,
 };
 
 static struct msm_iommu_dev ijpeg_iommu = {
-       .name = "ijpeg"
+       .name = "ijpeg",
+       .ncb = 2,
 };
 
 static struct msm_iommu_dev vfe_iommu = {
        .name = "vfe",
-       .clk_rate = -1
+       .ncb = 2,
 };
 
 static struct msm_iommu_dev vcodec_a_iommu = {
-       .name = "vcodec_a"
+       .name = "vcodec_a",
+       .ncb = 2,
 };
 
 static struct msm_iommu_dev vcodec_b_iommu = {
-       .name = "vcodec_b"
+       .name = "vcodec_b",
+       .ncb = 2,
 };
 
 static struct msm_iommu_dev gfx3d_iommu = {
        .name = "gfx3d",
-       .clk_rate = 27000000
+       .ncb = 3,
 };
 
 static struct msm_iommu_dev gfx2d0_iommu = {
        .name = "gfx2d0",
-       .clk_rate = 27000000
+       .ncb = 2,
 };
 
 static struct msm_iommu_dev gfx2d1_iommu = {
        .name = "gfx2d1",
-       .clk_rate = 27000000
+       .ncb = 2,
 };
 
 static struct platform_device msm_device_iommu_jpegd = {
index fb548a8a21dbb907aa04b9bc7b4e4a78b58d47f6..c4f5e26feb4dc4d274a1b721b90fce08e6fffd96 100644 (file)
@@ -15,6 +15,7 @@
 
 #include <linux/kernel.h>
 #include <linux/platform_device.h>
+#include <linux/clkdev.h>
 
 #include <mach/irqs.h>
 #include <mach/msm_iomap.h>
@@ -24,8 +25,8 @@
 #include <linux/mtd/nand.h>
 #include <linux/mtd/partitions.h>
 
-
 #include "clock.h"
+#include "clock-pcom.h"
 #include <mach/mmc.h>
 
 static struct resource resources_uart1[] = {
@@ -38,6 +39,7 @@ static struct resource resources_uart1[] = {
                .start  = MSM_UART1_PHYS,
                .end    = MSM_UART1_PHYS + MSM_UART1_SIZE - 1,
                .flags  = IORESOURCE_MEM,
+               .name  = "uart_resource"
        },
 };
 
@@ -51,6 +53,7 @@ static struct resource resources_uart2[] = {
                .start  = MSM_UART2_PHYS,
                .end    = MSM_UART2_PHYS + MSM_UART2_SIZE - 1,
                .flags  = IORESOURCE_MEM,
+               .name  = "uart_resource"
        },
 };
 
@@ -64,6 +67,7 @@ static struct resource resources_uart3[] = {
                .start  = MSM_UART3_PHYS,
                .end    = MSM_UART3_PHYS + MSM_UART3_SIZE - 1,
                .flags  = IORESOURCE_MEM,
+               .name  = "uart_resource"
        },
 };
 
@@ -414,7 +418,7 @@ struct platform_device msm_device_mdp = {
        .resource = resources_mdp,
 };
 
-struct clk msm_clocks_7x01a[] = {
+struct clk_lookup msm_clocks_7x01a[] = {
        CLK_PCOM("adm_clk",     ADM_CLK,        NULL, 0),
        CLK_PCOM("adsp_clk",    ADSP_CLK,       NULL, 0),
        CLK_PCOM("ebi1_clk",    EBI1_CLK,       NULL, 0),
@@ -423,7 +427,7 @@ struct clk msm_clocks_7x01a[] = {
        CLK_PCOM("emdh_clk",    EMDH_CLK,       NULL, OFF),
        CLK_PCOM("gp_clk",              GP_CLK,         NULL, 0),
        CLK_PCOM("grp_clk",     GRP_3D_CLK,     NULL, OFF),
-       CLK_PCOM("i2c_clk",     I2C_CLK,        &msm_device_i2c.dev, 0),
+       CLK_PCOM("i2c_clk",     I2C_CLK,        "msm_i2c.0", 0),
        CLK_PCOM("icodec_rx_clk",       ICODEC_RX_CLK,  NULL, 0),
        CLK_PCOM("icodec_tx_clk",       ICODEC_TX_CLK,  NULL, 0),
        CLK_PCOM("imem_clk",    IMEM_CLK,       NULL, OFF),
@@ -433,25 +437,25 @@ struct clk msm_clocks_7x01a[] = {
        CLK_PCOM("pcm_clk",     PCM_CLK,        NULL, 0),
        CLK_PCOM("mddi_clk",    PMDH_CLK,       NULL, OFF | CLK_MINMAX),
        CLK_PCOM("sdac_clk",    SDAC_CLK,       NULL, OFF),
-       CLK_PCOM("sdc_clk",     SDC1_CLK,       &msm_device_sdc1.dev, OFF),
-       CLK_PCOM("sdc_pclk",    SDC1_P_CLK,     &msm_device_sdc1.dev, OFF),
-       CLK_PCOM("sdc_clk",     SDC2_CLK,       &msm_device_sdc2.dev, OFF),
-       CLK_PCOM("sdc_pclk",    SDC2_P_CLK,     &msm_device_sdc2.dev, OFF),
-       CLK_PCOM("sdc_clk",     SDC3_CLK,       &msm_device_sdc3.dev, OFF),
-       CLK_PCOM("sdc_pclk",    SDC3_P_CLK,     &msm_device_sdc3.dev, OFF),
-       CLK_PCOM("sdc_clk",     SDC4_CLK,       &msm_device_sdc4.dev, OFF),
-       CLK_PCOM("sdc_pclk",    SDC4_P_CLK,     &msm_device_sdc4.dev, OFF),
+       CLK_PCOM("sdc_clk",     SDC1_CLK,       "msm_sdcc.1", OFF),
+       CLK_PCOM("sdc_pclk",    SDC1_P_CLK,     "msm_sdcc.1", OFF),
+       CLK_PCOM("sdc_clk",     SDC2_CLK,       "msm_sdcc.2", OFF),
+       CLK_PCOM("sdc_pclk",    SDC2_P_CLK,     "msm_sdcc.2", OFF),
+       CLK_PCOM("sdc_clk",     SDC3_CLK,       "msm_sdcc.3", OFF),
+       CLK_PCOM("sdc_pclk",    SDC3_P_CLK,     "msm_sdcc.3", OFF),
+       CLK_PCOM("sdc_clk",     SDC4_CLK,       "msm_sdcc.4", OFF),
+       CLK_PCOM("sdc_pclk",    SDC4_P_CLK,     "msm_sdcc.4", OFF),
        CLK_PCOM("tsif_clk",    TSIF_CLK,       NULL, 0),
        CLK_PCOM("tsif_ref_clk",        TSIF_REF_CLK,   NULL, 0),
        CLK_PCOM("tv_dac_clk",  TV_DAC_CLK,     NULL, 0),
        CLK_PCOM("tv_enc_clk",  TV_ENC_CLK,     NULL, 0),
-       CLK_PCOM("uart_clk",    UART1_CLK,      &msm_device_uart1.dev, OFF),
-       CLK_PCOM("uart_clk",    UART2_CLK,      &msm_device_uart2.dev, 0),
-       CLK_PCOM("uart_clk",    UART3_CLK,      &msm_device_uart3.dev, OFF),
+       CLK_PCOM("uart_clk",    UART1_CLK,      "msm_serial.0", OFF),
+       CLK_PCOM("uart_clk",    UART2_CLK,      "msm_serial.1", 0),
+       CLK_PCOM("uart_clk",    UART3_CLK,      "msm_serial.2", OFF),
        CLK_PCOM("uart1dm_clk", UART1DM_CLK,    NULL, OFF),
        CLK_PCOM("uart2dm_clk", UART2DM_CLK,    NULL, 0),
-       CLK_PCOM("usb_hs_clk",  USB_HS_CLK,     &msm_device_hsusb.dev, OFF),
-       CLK_PCOM("usb_hs_pclk", USB_HS_P_CLK,   &msm_device_hsusb.dev, OFF),
+       CLK_PCOM("usb_hs_clk",  USB_HS_CLK,     "msm_hsusb", OFF),
+       CLK_PCOM("usb_hs_pclk", USB_HS_P_CLK,   "msm_hsusb", OFF),
        CLK_PCOM("usb_otg_clk", USB_OTG_CLK,    NULL, 0),
        CLK_PCOM("vdc_clk",     VDC_CLK,        NULL, OFF ),
        CLK_PCOM("vfe_clk",     VFE_CLK,        NULL, OFF),
index 4e9a0ab3e93777044d257e33137f515a9b8e093b..09b4f14038246f6004aa4e9ef5d2721baba285c8 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2008 Google, Inc.
- * Copyright (c) 2008-2010, Code Aurora Forum. All rights reserved.
+ * Copyright (c) 2008-2011, Code Aurora Forum. All rights reserved.
  *
  * This software is licensed under the terms of the GNU General Public
  * License version 2, as published by the Free Software Foundation, and
@@ -17,6 +17,7 @@
 #include <linux/platform_device.h>
 
 #include <linux/dma-mapping.h>
+#include <linux/clkdev.h>
 #include <mach/irqs.h>
 #include <mach/msm_iomap.h>
 #include <mach/dma.h>
@@ -28,6 +29,7 @@
 #include <asm/mach/flash.h>
 
 #include "clock-pcom.h"
+#include "clock-7x30.h"
 
 #include <mach/mmc.h>
 
@@ -41,6 +43,7 @@ static struct resource resources_uart2[] = {
                .start  = MSM_UART2_PHYS,
                .end    = MSM_UART2_PHYS + MSM_UART2_SIZE - 1,
                .flags  = IORESOURCE_MEM,
+               .name  = "uart_resource"
        },
 };
 
@@ -127,11 +130,13 @@ struct platform_device msm_device_hsusb_host = {
        },
 };
 
-struct clk msm_clocks_7x30[] = {
+struct clk_lookup msm_clocks_7x30[] = {
        CLK_PCOM("adm_clk",     ADM_CLK,        NULL, 0),
        CLK_PCOM("adsp_clk",    ADSP_CLK,       NULL, 0),
        CLK_PCOM("cam_m_clk",   CAM_M_CLK,      NULL, 0),
        CLK_PCOM("camif_pad_pclk",      CAMIF_PAD_P_CLK,        NULL, OFF),
+       CLK_PCOM("ce_clk",      CE_CLK, NULL, 0),
+       CLK_PCOM("codec_ssbi_clk",      CODEC_SSBI_CLK, NULL, 0),
        CLK_PCOM("ebi1_clk",    EBI1_CLK,       NULL, CLK_MIN),
        CLK_PCOM("ecodec_clk",  ECODEC_CLK,     NULL, 0),
        CLK_PCOM("emdh_clk",    EMDH_CLK,       NULL, OFF | CLK_MINMAX),
@@ -177,7 +182,7 @@ struct clk msm_clocks_7x30[] = {
        CLK_7X30S("tv_src_clk", TV_CLK,         TV_ENC_CLK,     NULL, 0),
        CLK_PCOM("tv_dac_clk",  TV_DAC_CLK,     NULL, 0),
        CLK_PCOM("tv_enc_clk",  TV_ENC_CLK,     NULL, 0),
-       CLK_PCOM("uart_clk",    UART2_CLK,      &msm_device_uart2.dev, 0),
+       CLK_PCOM("uart_clk",    UART2_CLK,      "msm_serial.1", 0),
        CLK_PCOM("usb_phy_clk", USB_PHY_CLK,    NULL, 0),
        CLK_PCOM("usb_hs_clk",          USB_HS_CLK,             NULL, OFF),
        CLK_PCOM("usb_hs_pclk",         USB_HS_P_CLK,           NULL, OFF),
diff --git a/arch/arm/mach-msm/devices-msm8960.c b/arch/arm/mach-msm/devices-msm8960.c
new file mode 100644 (file)
index 0000000..d9e1f26
--- /dev/null
@@ -0,0 +1,85 @@
+/* Copyright (c) 2011, Code Aurora Forum. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 and
+ * only version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ */
+
+#include <linux/kernel.h>
+#include <linux/platform_device.h>
+
+#include <linux/dma-mapping.h>
+#include <mach/irqs-8960.h>
+#include <mach/board.h>
+
+#include "devices.h"
+
+#define MSM_GSBI2_PHYS         0x16100000
+#define MSM_UART2DM_PHYS       (MSM_GSBI2_PHYS + 0x40000)
+
+#define MSM_GSBI5_PHYS         0x16400000
+#define MSM_UART5DM_PHYS       (MSM_GSBI5_PHYS + 0x40000)
+
+static struct resource resources_uart_gsbi2[] = {
+       {
+               .start  = GSBI2_UARTDM_IRQ,
+               .end    = GSBI2_UARTDM_IRQ,
+               .flags  = IORESOURCE_IRQ,
+       },
+       {
+               .start  = MSM_UART2DM_PHYS,
+               .end    = MSM_UART2DM_PHYS + PAGE_SIZE - 1,
+               .name   = "uart_resource",
+               .flags  = IORESOURCE_MEM,
+       },
+       {
+               .start  = MSM_GSBI2_PHYS,
+               .end    = MSM_GSBI2_PHYS + PAGE_SIZE - 1,
+               .name   = "gsbi_resource",
+               .flags  = IORESOURCE_MEM,
+       },
+};
+
+struct platform_device msm8960_device_uart_gsbi2 = {
+       .name   = "msm_serial",
+       .id     = 0,
+       .num_resources  = ARRAY_SIZE(resources_uart_gsbi2),
+       .resource       = resources_uart_gsbi2,
+};
+
+static struct resource resources_uart_gsbi5[] = {
+       {
+               .start  = GSBI5_UARTDM_IRQ,
+               .end    = GSBI5_UARTDM_IRQ,
+               .flags  = IORESOURCE_IRQ,
+       },
+       {
+               .start  = MSM_UART5DM_PHYS,
+               .end    = MSM_UART5DM_PHYS + PAGE_SIZE - 1,
+               .name   = "uart_resource",
+               .flags  = IORESOURCE_MEM,
+       },
+       {
+               .start  = MSM_GSBI5_PHYS,
+               .end    = MSM_GSBI5_PHYS + PAGE_SIZE - 1,
+               .name   = "gsbi_resource",
+               .flags  = IORESOURCE_MEM,
+       },
+};
+
+struct platform_device msm8960_device_uart_gsbi5 = {
+       .name   = "msm_serial",
+       .id     = 0,
+       .num_resources  = ARRAY_SIZE(resources_uart_gsbi5),
+       .resource       = resources_uart_gsbi5,
+};
index a4b798f20ccb777f708b20e9dd43a72fe11ea4fc..12d8deb78d9ca37b6a9bbe8fa6804301f3b1bae6 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2008 Google, Inc.
- * Copyright (c) 2008-2010, Code Aurora Forum. All rights reserved.
+ * Copyright (c) 2008-2011, Code Aurora Forum. All rights reserved.
  *
  * This software is licensed under the terms of the GNU General Public
  * License version 2, as published by the Free Software Foundation, and
@@ -15,8 +15,9 @@
 
 #include <linux/kernel.h>
 #include <linux/platform_device.h>
-
+#include <linux/clkdev.h>
 #include <linux/dma-mapping.h>
+
 #include <mach/irqs.h>
 #include <mach/msm_iomap.h>
 #include <mach/dma.h>
@@ -27,6 +28,7 @@
 #include <asm/mach/flash.h>
 
 #include <mach/mmc.h>
+#include "clock-pcom.h"
 
 static struct resource resources_uart3[] = {
        {
@@ -38,6 +40,7 @@ static struct resource resources_uart3[] = {
                .start  = MSM_UART3_PHYS,
                .end    = MSM_UART3_PHYS + MSM_UART3_SIZE - 1,
                .flags  = IORESOURCE_MEM,
+               .name  = "uart_resource"
        },
 };
 
@@ -124,14 +127,204 @@ struct platform_device msm_device_hsusb_host = {
        },
 };
 
-struct clk msm_clocks_8x50[] = {
+static struct resource resources_sdc1[] = {
+       {
+               .start  = MSM_SDC1_PHYS,
+               .end    = MSM_SDC1_PHYS + MSM_SDC1_SIZE - 1,
+               .flags  = IORESOURCE_MEM,
+       },
+       {
+               .start  = INT_SDC1_0,
+               .end    = INT_SDC1_0,
+               .flags  = IORESOURCE_IRQ,
+               .name   = "cmd_irq",
+       },
+       {
+               .start  = INT_SDC1_1,
+               .end    = INT_SDC1_1,
+               .flags  = IORESOURCE_IRQ,
+               .name   = "pio_irq",
+       },
+       {
+               .flags  = IORESOURCE_IRQ | IORESOURCE_DISABLED,
+               .name   = "status_irq"
+       },
+       {
+               .start  = 8,
+               .end    = 8,
+               .flags  = IORESOURCE_DMA,
+       },
+};
+
+static struct resource resources_sdc2[] = {
+       {
+               .start  = MSM_SDC2_PHYS,
+               .end    = MSM_SDC2_PHYS + MSM_SDC2_SIZE - 1,
+               .flags  = IORESOURCE_MEM,
+       },
+       {
+               .start  = INT_SDC2_0,
+               .end    = INT_SDC2_0,
+               .flags  = IORESOURCE_IRQ,
+               .name   = "cmd_irq",
+       },
+               {
+               .start  = INT_SDC2_1,
+               .end    = INT_SDC2_1,
+               .flags  = IORESOURCE_IRQ,
+               .name   = "pio_irq",
+       },
+       {
+               .flags  = IORESOURCE_IRQ | IORESOURCE_DISABLED,
+               .name   = "status_irq"
+       },
+       {
+               .start  = 8,
+               .end    = 8,
+               .flags  = IORESOURCE_DMA,
+       },
+};
+
+static struct resource resources_sdc3[] = {
+       {
+               .start  = MSM_SDC3_PHYS,
+               .end    = MSM_SDC3_PHYS + MSM_SDC3_SIZE - 1,
+               .flags  = IORESOURCE_MEM,
+       },
+       {
+               .start  = INT_SDC3_0,
+               .end    = INT_SDC3_0,
+               .flags  = IORESOURCE_IRQ,
+               .name   = "cmd_irq",
+       },
+               {
+               .start  = INT_SDC3_1,
+               .end    = INT_SDC3_1,
+               .flags  = IORESOURCE_IRQ,
+               .name   = "pio_irq",
+       },
+       {
+               .flags  = IORESOURCE_IRQ | IORESOURCE_DISABLED,
+               .name   = "status_irq"
+       },
+       {
+               .start  = 8,
+               .end    = 8,
+               .flags  = IORESOURCE_DMA,
+       },
+};
+
+static struct resource resources_sdc4[] = {
+       {
+               .start  = MSM_SDC4_PHYS,
+               .end    = MSM_SDC4_PHYS + MSM_SDC4_SIZE - 1,
+               .flags  = IORESOURCE_MEM,
+       },
+       {
+               .start  = INT_SDC4_0,
+               .end    = INT_SDC4_0,
+               .flags  = IORESOURCE_IRQ,
+               .name   = "cmd_irq",
+       },
+               {
+               .start  = INT_SDC4_1,
+               .end    = INT_SDC4_1,
+               .flags  = IORESOURCE_IRQ,
+               .name   = "pio_irq",
+       },
+       {
+               .flags  = IORESOURCE_IRQ | IORESOURCE_DISABLED,
+               .name   = "status_irq"
+       },
+       {
+               .start  = 8,
+               .end    = 8,
+               .flags  = IORESOURCE_DMA,
+       },
+};
+
+struct platform_device msm_device_sdc1 = {
+       .name           = "msm_sdcc",
+       .id             = 1,
+       .num_resources  = ARRAY_SIZE(resources_sdc1),
+       .resource       = resources_sdc1,
+       .dev            = {
+               .coherent_dma_mask      = 0xffffffff,
+       },
+};
+
+struct platform_device msm_device_sdc2 = {
+       .name           = "msm_sdcc",
+       .id             = 2,
+       .num_resources  = ARRAY_SIZE(resources_sdc2),
+       .resource       = resources_sdc2,
+       .dev            = {
+               .coherent_dma_mask      = 0xffffffff,
+       },
+};
+
+struct platform_device msm_device_sdc3 = {
+       .name           = "msm_sdcc",
+       .id             = 3,
+       .num_resources  = ARRAY_SIZE(resources_sdc3),
+       .resource       = resources_sdc3,
+       .dev            = {
+               .coherent_dma_mask      = 0xffffffff,
+       },
+};
+
+struct platform_device msm_device_sdc4 = {
+       .name           = "msm_sdcc",
+       .id             = 4,
+       .num_resources  = ARRAY_SIZE(resources_sdc4),
+       .resource       = resources_sdc4,
+       .dev            = {
+               .coherent_dma_mask      = 0xffffffff,
+       },
+};
+
+static struct platform_device *msm_sdcc_devices[] __initdata = {
+       &msm_device_sdc1,
+       &msm_device_sdc2,
+       &msm_device_sdc3,
+       &msm_device_sdc4,
+};
+
+int __init msm_add_sdcc(unsigned int controller,
+                       struct msm_mmc_platform_data *plat,
+                       unsigned int stat_irq, unsigned long stat_irq_flags)
+{
+       struct platform_device  *pdev;
+       struct resource *res;
+
+       if (controller < 1 || controller > 4)
+               return -EINVAL;
+
+       pdev = msm_sdcc_devices[controller-1];
+       pdev->dev.platform_data = plat;
+
+       res = platform_get_resource_byname(pdev, IORESOURCE_IRQ, "status_irq");
+       if (!res)
+               return -EINVAL;
+       else if (stat_irq) {
+               res->start = res->end = stat_irq;
+               res->flags &= ~IORESOURCE_DISABLED;
+               res->flags |= stat_irq_flags;
+       }
+
+       return platform_device_register(pdev);
+}
+
+struct clk_lookup msm_clocks_8x50[] = {
        CLK_PCOM("adm_clk",     ADM_CLK,        NULL, 0),
+       CLK_PCOM("ce_clk",      CE_CLK,         NULL, 0),
        CLK_PCOM("ebi1_clk",    EBI1_CLK,       NULL, CLK_MIN),
        CLK_PCOM("ebi2_clk",    EBI2_CLK,       NULL, 0),
        CLK_PCOM("ecodec_clk",  ECODEC_CLK,     NULL, 0),
        CLK_PCOM("emdh_clk",    EMDH_CLK,       NULL, OFF | CLK_MINMAX),
        CLK_PCOM("gp_clk",      GP_CLK,         NULL, 0),
        CLK_PCOM("grp_clk",     GRP_3D_CLK,     NULL, 0),
+       CLK_PCOM("i2c_clk",     I2C_CLK,        NULL, 0),
        CLK_PCOM("icodec_rx_clk",       ICODEC_RX_CLK,  NULL, 0),
        CLK_PCOM("icodec_tx_clk",       ICODEC_TX_CLK,  NULL, 0),
        CLK_PCOM("imem_clk",    IMEM_CLK,       NULL, OFF),
@@ -144,12 +337,24 @@ struct clk msm_clocks_8x50[] = {
        CLK_PCOM("pbus_clk",    PBUS_CLK,       NULL, CLK_MIN),
        CLK_PCOM("pcm_clk",     PCM_CLK,        NULL, 0),
        CLK_PCOM("sdac_clk",    SDAC_CLK,       NULL, OFF),
+       CLK_PCOM("sdc_clk",     SDC1_CLK,       "msm_sdcc.1", OFF),
+       CLK_PCOM("sdc_pclk",    SDC1_P_CLK,     "msm_sdcc.1", OFF),
+       CLK_PCOM("sdc_clk",     SDC2_CLK,       "msm_sdcc.2", OFF),
+       CLK_PCOM("sdc_pclk",    SDC2_P_CLK,     "msm_sdcc.2", OFF),
+       CLK_PCOM("sdc_clk",     SDC3_CLK,       "msm_sdcc.3", OFF),
+       CLK_PCOM("sdc_pclk",    SDC3_P_CLK,     "msm_sdcc.3", OFF),
+       CLK_PCOM("sdc_clk",     SDC4_CLK,       "msm_sdcc.4", OFF),
+       CLK_PCOM("sdc_pclk",    SDC4_P_CLK,     "msm_sdcc.4", OFF),
        CLK_PCOM("spi_clk",     SPI_CLK,        NULL, 0),
        CLK_PCOM("tsif_clk",    TSIF_CLK,       NULL, 0),
        CLK_PCOM("tsif_ref_clk",        TSIF_REF_CLK,   NULL, 0),
        CLK_PCOM("tv_dac_clk",  TV_DAC_CLK,     NULL, 0),
        CLK_PCOM("tv_enc_clk",  TV_ENC_CLK,     NULL, 0),
-       CLK_PCOM("uart_clk",    UART3_CLK,      &msm_device_uart3.dev, OFF),
+       CLK_PCOM("uart_clk",    UART1_CLK,      NULL, OFF),
+       CLK_PCOM("uart_clk",    UART2_CLK,      NULL, 0),
+       CLK_PCOM("uart_clk",    UART3_CLK,      "msm_serial.2", OFF),
+       CLK_PCOM("uartdm_clk",  UART1DM_CLK,    NULL, OFF),
+       CLK_PCOM("uartdm_clk",  UART2DM_CLK,    NULL, 0),
        CLK_PCOM("usb_hs_clk",  USB_HS_CLK,     NULL, OFF),
        CLK_PCOM("usb_hs_pclk", USB_HS_P_CLK,   NULL, OFF),
        CLK_PCOM("usb_otg_clk", USB_OTG_CLK,    NULL, 0),
index 87c70bfce2bde698fccddb06d29be7381ae46e34..9545c196c6e87832400bbb5fab059cbda93ba5ba 100644 (file)
 #ifndef __ARCH_ARM_MACH_MSM_DEVICES_H
 #define __ARCH_ARM_MACH_MSM_DEVICES_H
 
+#include <linux/clkdev.h>
+
 #include "clock.h"
 
 extern struct platform_device msm_device_uart1;
 extern struct platform_device msm_device_uart2;
 extern struct platform_device msm_device_uart3;
 
+extern struct platform_device msm8960_device_uart_gsbi2;
+extern struct platform_device msm8960_device_uart_gsbi5;
+
 extern struct platform_device msm_device_sdc1;
 extern struct platform_device msm_device_sdc2;
 extern struct platform_device msm_device_sdc3;
@@ -41,13 +46,13 @@ extern struct platform_device msm_device_mddi0;
 extern struct platform_device msm_device_mddi1;
 extern struct platform_device msm_device_mdp;
 
-extern struct clk msm_clocks_7x01a[];
+extern struct clk_lookup msm_clocks_7x01a[];
 extern unsigned msm_num_clocks_7x01a;
 
-extern struct clk msm_clocks_7x30[];
+extern struct clk_lookup msm_clocks_7x30[];
 extern unsigned msm_num_clocks_7x30;
 
-extern struct clk msm_clocks_8x50[];
+extern struct clk_lookup msm_clocks_8x50[];
 extern unsigned msm_num_clocks_8x50;
 
 #endif
diff --git a/arch/arm/mach-msm/gpiomux-7x30.c b/arch/arm/mach-msm/gpiomux-7x30.c
deleted file mode 100644 (file)
index 6ce41c5..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-/* Copyright (c) 2010, Code Aurora Forum. All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 and
- * only version 2 as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * 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., 51 Franklin Street, Fifth Floor, Boston, MA
- * 02110-1301, USA.
- */
-#include "gpiomux.h"
-
-struct msm_gpiomux_config msm_gpiomux_configs[GPIOMUX_NGPIOS] = {
-#ifdef CONFIG_SERIAL_MSM_CONSOLE
-       [49] = { /* UART2 RFR */
-               .suspended = GPIOMUX_DRV_2MA | GPIOMUX_PULL_DOWN |
-                            GPIOMUX_FUNC_2 | GPIOMUX_VALID,
-       },
-       [50] = { /* UART2 CTS */
-               .suspended = GPIOMUX_DRV_2MA | GPIOMUX_PULL_DOWN |
-                            GPIOMUX_FUNC_2 | GPIOMUX_VALID,
-       },
-       [51] = { /* UART2 RX */
-               .suspended = GPIOMUX_DRV_2MA | GPIOMUX_PULL_DOWN |
-                            GPIOMUX_FUNC_2 | GPIOMUX_VALID,
-       },
-       [52] = { /* UART2 TX */
-               .suspended = GPIOMUX_DRV_2MA | GPIOMUX_PULL_DOWN |
-                            GPIOMUX_FUNC_2 | GPIOMUX_VALID,
-       },
-#endif
-};
index 4406e0f4ae9508670d5303c494b5952a808c71be..f7a4ea593c95054591120d34a23c3f6a32e1cffb 100644 (file)
  */
 #include "gpiomux.h"
 
+#if defined(CONFIG_MMC_MSM) || defined(CONFIG_MMC_MSM_MODULE)
+       #define SDCC_DAT_0_3_CMD_ACTV_CFG (GPIOMUX_VALID | GPIOMUX_PULL_UP\
+                                       | GPIOMUX_FUNC_1 | GPIOMUX_DRV_8MA)
+       #define SDCC_CLK_ACTV_CFG (GPIOMUX_VALID | GPIOMUX_PULL_NONE\
+                                       | GPIOMUX_FUNC_1 | GPIOMUX_DRV_8MA)
+#else
+       #define SDCC_DAT_0_3_CMD_ACTV_CFG 0
+       #define SDCC_CLK_ACTV_CFG 0
+#endif
+
+#define SDC1_SUSPEND_CONFIG (GPIOMUX_VALID | GPIOMUX_PULL_DOWN\
+                               | GPIOMUX_FUNC_GPIO | GPIOMUX_DRV_2MA)
+
 struct msm_gpiomux_config msm_gpiomux_configs[GPIOMUX_NGPIOS] = {
        [86] = { /* UART3 RX */
                .suspended = GPIOMUX_DRV_2MA | GPIOMUX_PULL_DOWN |
@@ -25,4 +38,14 @@ struct msm_gpiomux_config msm_gpiomux_configs[GPIOMUX_NGPIOS] = {
                .suspended = GPIOMUX_DRV_2MA | GPIOMUX_PULL_DOWN |
                             GPIOMUX_FUNC_1 | GPIOMUX_VALID,
        },
+       /* SDC1 data[3:0] & CMD */
+       [51 ... 55] = {
+               .active = SDCC_DAT_0_3_CMD_ACTV_CFG,
+               .suspended = SDC1_SUSPEND_CONFIG
+       },
+       /* SDC1 CLK */
+       [56] = {
+               .active = SDCC_CLK_ACTV_CFG,
+               .suspended = SDC1_SUSPEND_CONFIG
+       },
 };
index d0c214338df96b09e41d3373cfc080eef28b98bd..0c631a9f8647f5b8ec35dd5998da65bc937860d0 100644 (file)
@@ -11,7 +11,7 @@
 #include <linux/linkage.h>
 #include <linux/init.h>
 
-       __INIT
+       __CPUINIT
 
 /*
  * MSM specific entry point for secondary CPUs.  This provides
index 6abf4a6eadc19be578b7888c21bfd3ec534291f6..2ce8f1f2fc4d57c163193229340b7b04d04c7474 100644 (file)
@@ -31,7 +31,7 @@ struct msm_acpu_clock_platform_data
        unsigned long wait_for_irq_khz;
 };
 
-struct clk;
+struct clk_lookup;
 
 extern struct sys_timer msm_timer;
 
@@ -41,7 +41,7 @@ void __init msm_add_devices(void);
 void __init msm_map_common_io(void);
 void __init msm_init_irq(void);
 void __init msm_init_gpio(void);
-void __init msm_clock_init(struct clk *clock_tbl, unsigned num_clocks);
+void __init msm_clock_init(struct clk_lookup *clock_tbl, unsigned num_clocks);
 void __init msm_acpu_clock_init(struct msm_acpu_clock_platform_data *);
 int __init msm_add_sdcc(unsigned int controller,
                        struct msm_mmc_platform_data *plat,
index c05ca40478c788a5f48a1fce1ae262ff2a807d80..e8d38428d8130e5d1e73aa9ed13e8652885fe2e9 100644 (file)
@@ -1,30 +1,13 @@
 /* Copyright (c) 2009, Code Aurora Forum. All rights reserved.
  *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of Code Aurora Forum, Inc. nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 and
+ * only version 2 as published by the Free Software Foundation.
  *
+ * This program is distributed in the hope that it will be useful,
+ * 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.
  */
 #ifndef __MACH_CLK_H
 #define __MACH_CLK_H
diff --git a/arch/arm/mach-msm/include/mach/clkdev.h b/arch/arm/mach-msm/include/mach/clkdev.h
new file mode 100644 (file)
index 0000000..f87a57b
--- /dev/null
@@ -0,0 +1,19 @@
+/* Copyright (c) 2011, Code Aurora Forum. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 and
+ * only version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * 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.
+ */
+#ifndef __ASM_ARCH_MSM_CLKDEV_H
+#define __ASM_ARCH_MSM_CLKDEV_H
+
+struct clk;
+
+static inline int __clk_get(struct clk *clk) { return 1; }
+static inline void __clk_put(struct clk *clk) { }
+#endif
diff --git a/arch/arm/mach-msm/include/mach/cpu.h b/arch/arm/mach-msm/include/mach/cpu.h
new file mode 100644 (file)
index 0000000..a9481b0
--- /dev/null
@@ -0,0 +1,54 @@
+/* Copyright (c) 2011, Code Aurora Forum. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 and
+ * only version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ */
+
+#ifndef __ARCH_ARM_MACH_MSM_CPU_H__
+#define __ARCH_ARM_MACH_MSM_CPU_H__
+
+/* TODO: For now, only one CPU can be compiled at a time. */
+
+#define cpu_is_msm7x01()       0
+#define cpu_is_msm7x30()       0
+#define cpu_is_qsd8x50()       0
+#define cpu_is_msm8x60()       0
+#define cpu_is_msm8960()       0
+
+#ifdef CONFIG_ARCH_MSM7X00A
+# undef cpu_is_msm7x01
+# define cpu_is_msm7x01()      1
+#endif
+
+#ifdef CONFIG_ARCH_MSM7X30
+# undef cpu_is_msm7x30
+# define cpu_is_msm7x30()      1
+#endif
+
+#ifdef CONFIG_ARCH_QSD8X50
+# undef cpu_is_qsd8x50
+# define cpu_is_qsd8x50()      1
+#endif
+
+#ifdef CONFIG_ARCH_MSM8X60
+# undef cpu_is_msm8x60
+# define cpu_is_msm8x60()      1
+#endif
+
+#ifdef CONFIG_ARCH_MSM8960
+# undef cpu_is_msm8960
+# define cpu_is_msm8960()      1
+#endif
+
+#endif
index 7386e732baad9d380914fd923404cb7a5e2e1931..dc1b928745e971a1f21cffa2c5e294a7454ea3d5 100644 (file)
@@ -29,6 +29,7 @@ void __iomem *__msm_ioremap(unsigned long phys_addr, size_t size, unsigned int m
 void msm_map_qsd8x50_io(void);
 void msm_map_msm7x30_io(void);
 void msm_map_msm8x60_io(void);
+void msm_map_msm8960_io(void);
 
 extern unsigned int msm_shared_ram_phys;
 
index 296c0f10f230e2005d7be5f78a021dc7cd66cd36..5c7c955e6d253a987c4a16d9c28f0c11e7c01771 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2010, Code Aurora Forum. All rights reserved.
+/* Copyright (c) 2010-2011, Code Aurora Forum. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 and
@@ -19,6 +19,7 @@
 #define MSM_IOMMU_H
 
 #include <linux/interrupt.h>
+#include <linux/clk.h>
 
 /* Sharability attributes of MSM IOMMU mappings */
 #define MSM_IOMMU_ATTR_NON_SH          0x0
 /**
  * struct msm_iommu_dev - a single IOMMU hardware instance
  * name                Human-readable name given to this IOMMU HW instance
- * clk_rate    Rate to set for this IOMMU's clock, if applicable to this
- *             particular IOMMU. 0 means don't set a rate.
- *             -1 means it is an AXI clock with no valid rate
- *
+ * ncb         Number of context banks present on this IOMMU HW instance
  */
 struct msm_iommu_dev {
        const char *name;
-       int clk_rate;
+       int ncb;
 };
 
 /**
@@ -73,14 +71,20 @@ struct msm_iommu_ctx_dev {
 /**
  * struct msm_iommu_drvdata - A single IOMMU hardware instance
  * @base:      IOMMU config port base address (VA)
+ * @ncb                The number of contexts on this IOMMU
  * @irq:       Interrupt number
-  *
+ * @clk:       The bus clock for this IOMMU hardware instance
+ * @pclk:      The clock for the IOMMU bus interconnect
+ *
  * A msm_iommu_drvdata holds the global driver data about a single piece
  * of an IOMMU hardware instance.
  */
 struct msm_iommu_drvdata {
        void __iomem *base;
        int irq;
+       int ncb;
+       struct clk *clk;
+       struct clk *pclk;
 };
 
 /**
index c2c3da9444f48293f397dd23180119d28556ba2e..fc160101dead20c6984cb75701493563cc713ea1 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2010, Code Aurora Forum. All rights reserved.
+/* Copyright (c) 2010-2011, Code Aurora Forum. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 and
@@ -68,6 +68,7 @@ do { \
 #define FL_CACHEABLE           (1 << 3)
 #define FL_TEX0                        (1 << 12)
 #define FL_OFFSET(va)          (((va) & 0xFFF00000) >> 20)
+#define FL_NG                  (1 << 17)
 
 /* Second-level page table bits */
 #define SL_BASE_MASK_LARGE     0xFFFF0000
@@ -81,6 +82,7 @@ do { \
 #define SL_CACHEABLE           (1 << 3)
 #define SL_TEX0                        (1 << 6)
 #define SL_OFFSET(va)          (((va) & 0xFF000) >> 12)
+#define SL_NG                  (1 << 11)
 
 /* Memory type and cache policy attributes */
 #define MT_SO                  0
@@ -623,20 +625,6 @@ do { \
 #define SET_INDEX(b, c, v)      SET_CONTEXT_FIELD(b, c, V2PSR, INDEX, v)
 
 
-/* V2Pxx UW UR PW PR */
-#define SET_V2PUW_INDEX(b, c, v) SET_CONTEXT_FIELD(b, c, V2PUW, V2Pxx_INDEX, v)
-#define SET_V2PUW_VA(b, c, v)   SET_CONTEXT_FIELD(b, c, V2PUW, V2Pxx_VA, v)
-
-#define SET_V2PUR_INDEX(b, c, v) SET_CONTEXT_FIELD(b, c, V2PUR, V2Pxx_INDEX, v)
-#define SET_V2PUR_VA(b, c, v)   SET_CONTEXT_FIELD(b, c, V2PUR, V2Pxx_VA, v)
-
-#define SET_V2PPW_INDEX(b, c, v) SET_CONTEXT_FIELD(b, c, V2PPW, V2Pxx_INDEX, v)
-#define SET_V2PPW_VA(b, c, v)   SET_CONTEXT_FIELD(b, c, V2PPW, V2Pxx_VA, v)
-
-#define SET_V2PPR_INDEX(b, c, v) SET_CONTEXT_FIELD(b, c, V2PPR, V2Pxx_INDEX, v)
-#define SET_V2PPR_VA(b, c, v)   SET_CONTEXT_FIELD(b, c, V2PPR, V2Pxx_VA, v)
-
-
 /* Context Register getters */
 /* ACTLR */
 #define GET_CFERE(b, c)                GET_CONTEXT_FIELD(b, c, ACTLR, CFERE)
@@ -824,20 +812,6 @@ do { \
 #define GET_INDEX(b, c)                GET_CONTEXT_FIELD(b, c, V2PSR, INDEX)
 
 
-/* V2Pxx UW UR PW PR */
-#define GET_V2PUW_INDEX(b, c)  GET_CONTEXT_FIELD(b, c, V2PUW, V2Pxx_INDEX)
-#define GET_V2PUW_VA(b, c)     GET_CONTEXT_FIELD(b, c, V2PUW, V2Pxx_VA)
-
-#define GET_V2PUR_INDEX(b, c)  GET_CONTEXT_FIELD(b, c, V2PUR, V2Pxx_INDEX)
-#define GET_V2PUR_VA(b, c)     GET_CONTEXT_FIELD(b, c, V2PUR, V2Pxx_VA)
-
-#define GET_V2PPW_INDEX(b, c)  GET_CONTEXT_FIELD(b, c, V2PPW, V2Pxx_INDEX)
-#define GET_V2PPW_VA(b, c)     GET_CONTEXT_FIELD(b, c, V2PPW, V2Pxx_VA)
-
-#define GET_V2PPR_INDEX(b, c)  GET_CONTEXT_FIELD(b, c, V2PPR, V2Pxx_INDEX)
-#define GET_V2PPR_VA(b, c)     GET_CONTEXT_FIELD(b, c, V2PPR, V2Pxx_VA)
-
-
 /* Global Registers */
 #define M2VCBR_N       (0xFF000)
 #define CBACR_N                (0xFF800)
index 67c5396514feb8446a45b1c40ecd0464d2df8a5b..1f15902655fd6b43116dcd520423181caed16b0e 100644 (file)
@@ -1,30 +1,13 @@
 /* Copyright (c) 2009, Code Aurora Forum. All rights reserved.
  *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of Code Aurora Forum, Inc. nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 and
+ * only version 2 as published by the Free Software Foundation.
  *
+ * This program is distributed in the hope that it will be useful,
+ * 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.
  */
 
 #ifndef __ASM_ARCH_MSM_IRQS_7X30_H
diff --git a/arch/arm/mach-msm/include/mach/irqs-8960.h b/arch/arm/mach-msm/include/mach/irqs-8960.h
new file mode 100644 (file)
index 0000000..81ab2a6
--- /dev/null
@@ -0,0 +1,277 @@
+/* Copyright (c) 2011 Code Aurora Forum. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 and
+ * only version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * 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.
+ */
+
+#ifndef __ASM_ARCH_MSM_IRQS_8960_H
+#define __ASM_ARCH_MSM_IRQS_8960_H
+
+/* MSM ACPU Interrupt Numbers */
+
+/* 0-15:  STI/SGI (software triggered/generated interrupts)
+   16-31: PPI (private peripheral interrupts)
+   32+:   SPI (shared peripheral interrupts) */
+
+#define GIC_PPI_START 16
+#define GIC_SPI_START 32
+
+#define INT_VGIC                               (GIC_PPI_START + 0)
+#define INT_DEBUG_TIMER_EXP                    (GIC_PPI_START + 1)
+#define INT_GP_TIMER_EXP                       (GIC_PPI_START + 2)
+#define INT_GP_TIMER2_EXP                      (GIC_PPI_START + 3)
+#define WDT0_ACCSCSSNBARK_INT                  (GIC_PPI_START + 4)
+#define WDT1_ACCSCSSNBARK_INT                  (GIC_PPI_START + 5)
+#define AVS_SVICINT                            (GIC_PPI_START + 6)
+#define AVS_SVICINTSWDONE                      (GIC_PPI_START + 7)
+#define CPU_DBGCPUXCOMMRXFULL                  (GIC_PPI_START + 8)
+#define CPU_DBGCPUXCOMMTXEMPTY                 (GIC_PPI_START + 9)
+#define CPU_SICCPUXPERFMONIRPTREQ              (GIC_PPI_START + 10)
+#define SC_AVSCPUXDOWN                         (GIC_PPI_START + 11)
+#define SC_AVSCPUXUP                           (GIC_PPI_START + 12)
+#define SC_SICCPUXACGIRPTREQ                   (GIC_PPI_START + 13)
+#define SC_SICCPUXEXTFAULTIRPTREQ              (GIC_PPI_START + 14)
+/* PPI 15 is unused */
+
+#define SC_SICMPUIRPTREQ                       (GIC_SPI_START + 0)
+#define SC_SICL2IRPTREQ                                (GIC_SPI_START + 1)
+#define SC_SICL2PERFMONIRPTREQ                 (GIC_SPI_START + 2)
+#define SC_SICAGCIRPTREQ                       (GIC_SPI_START + 3)
+#define TLMM_APCC_DIR_CONN_IRQ_0               (GIC_SPI_START + 4)
+#define TLMM_APCC_DIR_CONN_IRQ_1               (GIC_SPI_START + 5)
+#define TLMM_APCC_DIR_CONN_IRQ_2               (GIC_SPI_START + 6)
+#define TLMM_APCC_DIR_CONN_IRQ_3               (GIC_SPI_START + 7)
+#define TLMM_APCC_DIR_CONN_IRQ_4               (GIC_SPI_START + 8)
+#define TLMM_APCC_DIR_CONN_IRQ_5               (GIC_SPI_START + 9)
+#define TLMM_APCC_DIR_CONN_IRQ_6               (GIC_SPI_START + 10)
+#define TLMM_APCC_DIR_CONN_IRQ_7               (GIC_SPI_START + 11)
+#define TLMM_APCC_DIR_CONN_IRQ_8               (GIC_SPI_START + 12)
+#define TLMM_APCC_DIR_CONN_IRQ_9               (GIC_SPI_START + 13)
+#define PM8921_SEC_IRQ_103                     (GIC_SPI_START + 14)
+#define PM8018_SEC_IRQ_106                     (GIC_SPI_START + 15)
+#define TLMM_APCC_SUMMARY_IRQ                  (GIC_SPI_START + 16)
+#define SPDM_RT_1_IRQ                          (GIC_SPI_START + 17)
+#define SPDM_DIAG_IRQ                          (GIC_SPI_START + 18)
+#define RPM_APCC_CPU0_GP_HIGH_IRQ              (GIC_SPI_START + 19)
+#define RPM_APCC_CPU0_GP_MEDIUM_IRQ            (GIC_SPI_START + 20)
+#define RPM_APCC_CPU0_GP_LOW_IRQ               (GIC_SPI_START + 21)
+#define RPM_APCC_CPU0_WAKE_UP_IRQ              (GIC_SPI_START + 22)
+#define RPM_APCC_CPU1_GP_HIGH_IRQ              (GIC_SPI_START + 23)
+#define RPM_APCC_CPU1_GP_MEDIUM_IRQ            (GIC_SPI_START + 24)
+#define RPM_APCC_CPU1_GP_LOW_IRQ               (GIC_SPI_START + 25)
+#define RPM_APCC_CPU1_WAKE_UP_IRQ              (GIC_SPI_START + 26)
+#define SSBI2_2_SC_CPU0_SECURE_IRQ             (GIC_SPI_START + 27)
+#define SSBI2_2_SC_CPU0_NON_SECURE_IRQ         (GIC_SPI_START + 28)
+#define SSBI2_1_SC_CPU0_SECURE_IRQ             (GIC_SPI_START + 29)
+#define SSBI2_1_SC_CPU0_NON_SECURE_IRQ         (GIC_SPI_START + 30)
+#define MSMC_SC_SEC_CE_IRQ                     (GIC_SPI_START + 31)
+#define MSMC_SC_PRI_CE_IRQ                     (GIC_SPI_START + 32)
+#define SLIMBUS0_CORE_EE1_IRQ                  (GIC_SPI_START + 33)
+#define SLIMBUS0_BAM_EE1_IRQ                   (GIC_SPI_START + 34)
+#define Q6FW_WDOG_EXPIRED_IRQ                  (GIC_SPI_START + 35)
+#define Q6SW_WDOG_EXPIRED_IRQ                  (GIC_SPI_START + 36)
+#define MSS_TO_APPS_IRQ_0                      (GIC_SPI_START + 37)
+#define MSS_TO_APPS_IRQ_1                      (GIC_SPI_START + 38)
+#define MSS_TO_APPS_IRQ_2                      (GIC_SPI_START + 39)
+#define MSS_TO_APPS_IRQ_3                      (GIC_SPI_START + 40)
+#define MSS_TO_APPS_IRQ_4                      (GIC_SPI_START + 41)
+#define MSS_TO_APPS_IRQ_5                      (GIC_SPI_START + 42)
+#define MSS_TO_APPS_IRQ_6                      (GIC_SPI_START + 43)
+#define MSS_TO_APPS_IRQ_7                      (GIC_SPI_START + 44)
+#define MSS_TO_APPS_IRQ_8                      (GIC_SPI_START + 45)
+#define MSS_TO_APPS_IRQ_9                      (GIC_SPI_START + 46)
+#define VPE_IRQ                                        (GIC_SPI_START + 47)
+#define VFE_IRQ                                        (GIC_SPI_START + 48)
+#define VCODEC_IRQ                             (GIC_SPI_START + 49)
+#define TV_ENC_IRQ                             (GIC_SPI_START + 50)
+#define SMMU_VPE_CB_SC_SECURE_IRQ              (GIC_SPI_START + 51)
+#define SMMU_VPE_CB_SC_NON_SECURE_IRQ          (GIC_SPI_START + 52)
+#define SMMU_VFE_CB_SC_SECURE_IRQ              (GIC_SPI_START + 53)
+#define SMMU_VFE_CB_SC_NON_SECURE_IRQ          (GIC_SPI_START + 54)
+#define SMMU_VCODEC_B_CB_SC_SECURE_IRQ         (GIC_SPI_START + 55)
+#define SMMU_VCODEC_B_CB_SC_NON_SECURE_IRQ     (GIC_SPI_START + 56)
+#define SMMU_VCODEC_A_CB_SC_SECURE_IRQ         (GIC_SPI_START + 57)
+#define SMMU_VCODEC_A_CB_SC_NON_SECURE_IRQ     (GIC_SPI_START + 58)
+#define SMMU_ROT_CB_SC_SECURE_IRQ              (GIC_SPI_START + 59)
+#define SMMU_ROT_CB_SC_NON_SECURE_IRQ          (GIC_SPI_START + 60)
+#define SMMU_MDP1_CB_SC_SECURE_IRQ             (GIC_SPI_START + 61)
+#define SMMU_MDP1_CB_SC_NON_SECURE_IRQ         (GIC_SPI_START + 62)
+#define SMMU_MDP0_CB_SC_SECURE_IRQ             (GIC_SPI_START + 63)
+#define SMMU_MDP0_CB_SC_NON_SECURE_IRQ         (GIC_SPI_START + 64)
+#define SMMU_JPEGD_CB_SC_SECURE_IRQ            (GIC_SPI_START + 65)
+#define SMMU_JPEGD_CB_SC_NON_SECURE_IRQ                (GIC_SPI_START + 66)
+#define SMMU_IJPEG_CB_SC_SECURE_IRQ            (GIC_SPI_START + 67)
+#define SMMU_IJPEG_CB_SC_NON_SECURE_IRQ                (GIC_SPI_START + 68)
+#define SMMU_GFX3D_CB_SC_SECURE_IRQ            (GIC_SPI_START + 69)
+#define SMMU_GFX3D_CB_SC_NON_SECURE_IRQ                (GIC_SPI_START + 70)
+#define SMMU_GFX2D0_CB_SC_SECURE_IRQ           (GIC_SPI_START + 71)
+#define SMMU_GFX2D0_CB_SC_NON_SECURE_IRQ       (GIC_SPI_START + 72)
+#define ROT_IRQ                                        (GIC_SPI_START + 73)
+#define MMSS_FABRIC_IRQ                                (GIC_SPI_START + 74)
+#define MDP_IRQ                                        (GIC_SPI_START + 75)
+#define JPEGD_IRQ                              (GIC_SPI_START + 76)
+#define JPEG_IRQ                               (GIC_SPI_START + 77)
+#define MMSS_IMEM_IRQ                          (GIC_SPI_START + 78)
+#define HDMI_IRQ                               (GIC_SPI_START + 79)
+#define GFX3D_IRQ                              (GIC_SPI_START + 80)
+#define GFX2D0_IRQ                             (GIC_SPI_START + 81)
+#define DSI1_IRQ                               (GIC_SPI_START + 82)
+#define CSI_1_IRQ                              (GIC_SPI_START + 83)
+#define CSI_0_IRQ                              (GIC_SPI_START + 84)
+#define LPASS_SCSS_AUDIO_IF_OUT0_IRQ           (GIC_SPI_START + 85)
+#define LPASS_SCSS_MIDI_IRQ                    (GIC_SPI_START + 86)
+#define LPASS_Q6SS_WDOG_EXPIRED                        (GIC_SPI_START + 87)
+#define LPASS_SCSS_GP_LOW_IRQ                  (GIC_SPI_START + 88)
+#define LPASS_SCSS_GP_MEDIUM_IRQ               (GIC_SPI_START + 89)
+#define LPASS_SCSS_GP_HIGH_IRQ                 (GIC_SPI_START + 90)
+#define TOP_IMEM_IRQ                           (GIC_SPI_START + 91)
+#define FABRIC_SYS_IRQ                         (GIC_SPI_START + 92)
+#define FABRIC_APPS_IRQ                                (GIC_SPI_START + 93)
+#define USB1_HS_BAM_IRQ                                (GIC_SPI_START + 94)
+#define SDC4_BAM_IRQ                           (GIC_SPI_START + 95)
+#define SDC3_BAM_IRQ                           (GIC_SPI_START + 96)
+#define SDC2_BAM_IRQ                           (GIC_SPI_START + 97)
+#define SDC1_BAM_IRQ                           (GIC_SPI_START + 98)
+#define FABRIC_SPS_IRQ                         (GIC_SPI_START + 99)
+#define USB1_HS_IRQ                            (GIC_SPI_START + 100)
+#define SDC4_IRQ_0                             (GIC_SPI_START + 101)
+#define SDC3_IRQ_0                             (GIC_SPI_START + 102)
+#define SDC2_IRQ_0                             (GIC_SPI_START + 103)
+#define SDC1_IRQ_0                             (GIC_SPI_START + 104)
+#define SPS_BAM_DMA_IRQ                                (GIC_SPI_START + 105)
+#define SPS_SEC_VIOL_IRQ                       (GIC_SPI_START + 106)
+#define SPS_MTI_0                              (GIC_SPI_START + 107)
+#define SPS_MTI_1                              (GIC_SPI_START + 108)
+#define SPS_MTI_2                              (GIC_SPI_START + 109)
+#define SPS_MTI_3                              (GIC_SPI_START + 110)
+#define SPS_MTI_4                              (GIC_SPI_START + 111)
+#define SPS_MTI_5                              (GIC_SPI_START + 112)
+#define SPS_MTI_6                              (GIC_SPI_START + 113)
+#define SPS_MTI_7                              (GIC_SPI_START + 114)
+#define SPS_MTI_8                              (GIC_SPI_START + 115)
+#define SPS_MTI_9                              (GIC_SPI_START + 116)
+#define SPS_MTI_10                             (GIC_SPI_START + 117)
+#define SPS_MTI_11                             (GIC_SPI_START + 118)
+#define SPS_MTI_12                             (GIC_SPI_START + 119)
+#define SPS_MTI_13                             (GIC_SPI_START + 120)
+#define SPS_MTI_14                             (GIC_SPI_START + 121)
+#define SPS_MTI_15                             (GIC_SPI_START + 122)
+#define SPS_MTI_16                             (GIC_SPI_START + 123)
+#define SPS_MTI_17                             (GIC_SPI_START + 124)
+#define SPS_MTI_18                             (GIC_SPI_START + 125)
+#define SPS_MTI_19                             (GIC_SPI_START + 126)
+#define SPS_MTI_20                             (GIC_SPI_START + 127)
+#define SPS_MTI_21                             (GIC_SPI_START + 128)
+#define SPS_MTI_22                             (GIC_SPI_START + 129)
+#define SPS_MTI_23                             (GIC_SPI_START + 130)
+#define SPS_MTI_24                             (GIC_SPI_START + 131)
+#define SPS_MTI_25                             (GIC_SPI_START + 132)
+#define SPS_MTI_26                             (GIC_SPI_START + 133)
+#define SPS_MTI_27                             (GIC_SPI_START + 134)
+#define SPS_MTI_28                             (GIC_SPI_START + 135)
+#define SPS_MTI_29                             (GIC_SPI_START + 136)
+#define SPS_MTI_30                             (GIC_SPI_START + 137)
+#define SPS_MTI_31                             (GIC_SPI_START + 138)
+#define CSIPHY_4LN_IRQ                         (GIC_SPI_START + 139)
+#define CSIPHY_2LN_IRQ                         (GIC_SPI_START + 140)
+#define USB2_IRQ                               (GIC_SPI_START + 141)
+#define USB1_IRQ                               (GIC_SPI_START + 142)
+#define TSSC_SSBI_IRQ                          (GIC_SPI_START + 143)
+#define TSSC_SAMPLE_IRQ                                (GIC_SPI_START + 144)
+#define TSSC_PENUP_IRQ                         (GIC_SPI_START + 145)
+#define GSBI1_UARTDM_IRQ                       (GIC_SPI_START + 146)
+#define GSBI1_QUP_IRQ                          (GIC_SPI_START + 147)
+#define GSBI2_UARTDM_IRQ                       (GIC_SPI_START + 148)
+#define GSBI2_QUP_IRQ                          (GIC_SPI_START + 149)
+#define GSBI3_UARTDM_IRQ                       (GIC_SPI_START + 150)
+#define GSBI3_QUP_IRQ                          (GIC_SPI_START + 151)
+#define GSBI4_UARTDM_IRQ                       (GIC_SPI_START + 152)
+#define GSBI4_QUP_IRQ                          (GIC_SPI_START + 153)
+#define GSBI5_UARTDM_IRQ                       (GIC_SPI_START + 154)
+#define GSBI5_QUP_IRQ                          (GIC_SPI_START + 155)
+#define GSBI6_UARTDM_IRQ                       (GIC_SPI_START + 156)
+#define GSBI6_QUP_IRQ                          (GIC_SPI_START + 157)
+#define GSBI7_UARTDM_IRQ                       (GIC_SPI_START + 158)
+#define GSBI7_QUP_IRQ                          (GIC_SPI_START + 159)
+#define GSBI8_UARTDM_IRQ                       (GIC_SPI_START + 160)
+#define GSBI8_QUP_IRQ                          (GIC_SPI_START + 161)
+#define TSIF_TSPP_IRQ                          (GIC_SPI_START + 162)
+#define TSIF_BAM_IRQ                           (GIC_SPI_START + 163)
+#define TSIF2_IRQ                              (GIC_SPI_START + 164)
+#define TSIF1_IRQ                              (GIC_SPI_START + 165)
+#define DSI2_IRQ                               (GIC_SPI_START + 166)
+#define ISPIF_IRQ                              (GIC_SPI_START + 167)
+#define MSMC_SC_SEC_TMR_IRQ                    (GIC_SPI_START + 168)
+#define MSMC_SC_SEC_WDOG_BARK_IRQ              (GIC_SPI_START + 169)
+#define INT_ADM0_SCSS_0_IRQ                    (GIC_SPI_START + 170)
+#define INT_ADM0_SCSS_1_IRQ                    (GIC_SPI_START + 171)
+#define INT_ADM0_SCSS_2_IRQ                    (GIC_SPI_START + 172)
+#define INT_ADM0_SCSS_3_IRQ                    (GIC_SPI_START + 173)
+#define CC_SCSS_WDT1CPU1BITEEXPIRED            (GIC_SPI_START + 174)
+#define CC_SCSS_WDT1CPU0BITEEXPIRED            (GIC_SPI_START + 175)
+#define CC_SCSS_WDT0CPU1BITEEXPIRED            (GIC_SPI_START + 176)
+#define CC_SCSS_WDT0CPU0BITEEXPIRED            (GIC_SPI_START + 177)
+#define TSENS_UPPER_LOWER_INT                  (GIC_SPI_START + 178)
+#define SSBI2_2_SC_CPU1_SECURE_INT             (GIC_SPI_START + 179)
+#define SSBI2_2_SC_CPU1_NON_SECURE_INT         (GIC_SPI_START + 180)
+#define SSBI2_1_SC_CPU1_SECURE_INT             (GIC_SPI_START + 181)
+#define SSBI2_1_SC_CPU1_NON_SECURE_INT         (GIC_SPI_START + 182)
+#define XPU_SUMMARY_IRQ                                (GIC_SPI_START + 183)
+#define BUS_EXCEPTION_SUMMARY_IRQ              (GIC_SPI_START + 184)
+#define HSDDRX_EBI1CH0_IRQ                     (GIC_SPI_START + 185)
+#define HSDDRX_EBI1CH1_IRQ                     (GIC_SPI_START + 186)
+#define SDC5_BAM_IRQ                           (GIC_SPI_START + 187)
+#define SDC5_IRQ_0                             (GIC_SPI_START + 188)
+#define GSBI9_UARTDM_IRQ                       (GIC_SPI_START + 189)
+#define GSBI9_QUP_IRQ                          (GIC_SPI_START + 190)
+#define GSBI10_UARTDM_IRQ                      (GIC_SPI_START + 191)
+#define GSBI10_QUP_IRQ                         (GIC_SPI_START + 192)
+#define GSBI11_UARTDM_IRQ                      (GIC_SPI_START + 193)
+#define GSBI11_QUP_IRQ                         (GIC_SPI_START + 194)
+#define GSBI12_UARTDM_IRQ                      (GIC_SPI_START + 195)
+#define GSBI12_QUP_IRQ                         (GIC_SPI_START + 196)
+#define RIVA_APSS_LTECOEX_IRQ                  (GIC_SPI_START + 197)
+#define RIVA_APSS_SPARE_IRQ                    (GIC_SPI_START + 198)
+#define RIVA_APSS_WDOG_BITE_RESET_RDY_IRQ      (GIC_SPI_START + 199)
+#define RIVA_ASS_RESET_DONE_IRQ                        (GIC_SPI_START + 200)
+#define RIVA_APSS_ASIC_IRQ                     (GIC_SPI_START + 201)
+#define RIVA_APPS_WLAN_RX_DATA_AVAIL_IRQ       (GIC_SPI_START + 202)
+#define RIVA_APPS_WLAN_DATA_XFER_DONE_IRQ      (GIC_SPI_START + 203)
+#define RIVA_APPS_WLAM_SMSM_IRQ                        (GIC_SPI_START + 204)
+#define RIVA_APPS_LOG_CTRL_IRQ                 (GIC_SPI_START + 205)
+#define RIVA_APPS_FM_CTRL_IRQ                  (GIC_SPI_START + 206)
+#define RIVA_APPS_HCI_IRQ                      (GIC_SPI_START + 207)
+#define RIVA_APPS_WLAN_CTRL_IRQ                        (GIC_SPI_START + 208)
+#define A2_BAM_IRQ                             (GIC_SPI_START + 209)
+#define SMMU_GFX2D1_CB_SC_SECURE_IRQ           (GIC_SPI_START + 210)
+#define SMMU_GFX2D1_CB_SC_NON_SECURE_IRQ       (GIC_SPI_START + 211)
+#define GFX2D1_IRQ                             (GIC_SPI_START + 212)
+#define PPSS_WDOG_TIMER_IRQ                    (GIC_SPI_START + 213)
+#define SPS_SLIMBUS_CORE_EE0_IRQ               (GIC_SPI_START + 214)
+#define SPS_SLIMBUS_BAM_EE0_IRQ                        (GIC_SPI_START + 215)
+#define QDSS_ETB_IRQ                           (GIC_SPI_START + 216)
+#define QDSS_CTI2KPSS_CPU1_IRQ                 (GIC_SPI_START + 217)
+#define QDSS_CTI2KPSS_CPU0_IRQ                 (GIC_SPI_START + 218)
+#define TLMM_APCC_DIR_CONN_IRQ_16              (GIC_SPI_START + 219)
+#define TLMM_APCC_DIR_CONN_IRQ_17              (GIC_SPI_START + 220)
+#define TLMM_APCC_DIR_CONN_IRQ_18              (GIC_SPI_START + 221)
+#define TLMM_APCC_DIR_CONN_IRQ_19              (GIC_SPI_START + 222)
+#define TLMM_APCC_DIR_CONN_IRQ_20              (GIC_SPI_START + 223)
+#define TLMM_APCC_DIR_CONN_IRQ_21              (GIC_SPI_START + 224)
+#define PM8921_SEC_IRQ_104                     (GIC_SPI_START + 225)
+#define PM8018_SEC_IRQ_107                     (GIC_SPI_START + 226)
+
+/* For now, use the maximum number of interrupts until a pending GIC issue
+ * is sorted out */
+#define NR_MSM_IRQS 1020
+#define NR_BOARD_IRQS 0
+#define NR_GPIO_IRQS 0
+
+#endif
+
index de3d8fe24e4ef5744e997bbaf93361b0bfbf300c..26adbe0e940631a2dcea140913eb81107f7b2dc5 100644 (file)
@@ -1,30 +1,13 @@
 /* Copyright (c) 2008-2009, Code Aurora Forum. All rights reserved.
  *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of Code Aurora Forum, Inc. nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 and
+ * only version 2 as published by the Free Software Foundation.
  *
+ * This program is distributed in the hope that it will be useful,
+ * 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.
  */
 
 #ifndef __ASM_ARCH_MSM_IRQS_8XXX_H
index 8679a45647447c213902c297efd953aabba7ecba..3cd78b165abb22b4ca53896ac825f03262d4ef55 100644 (file)
@@ -26,6 +26,9 @@
 #include "sirc.h"
 #elif defined(CONFIG_ARCH_MSM8X60)
 #include "irqs-8x60.h"
+#elif defined(CONFIG_ARCH_MSM8960)
+/* TODO: Make these not generic. */
+#include "irqs-8960.h"
 #elif defined(CONFIG_ARCH_MSM_ARM11)
 #include "irqs-7x00.h"
 #else
index 176875df241fb0f5bbcfae5e69cc1cee5930010f..f2f8d299ba9533a1d15ce080823e3a2f653a579b 100644 (file)
@@ -25,6 +25,8 @@
 #define PLAT_PHYS_OFFSET               UL(0x00200000)
 #elif defined(CONFIG_ARCH_MSM8X60)
 #define PLAT_PHYS_OFFSET               UL(0x40200000)
+#elif defined(CONFIG_ARCH_MSM8960)
+#define PLAT_PHYS_OFFSET               UL(0x40200000)
 #else
 #define PLAT_PHYS_OFFSET               UL(0x10000000)
 #endif
index d54b6b086cff412bba5ad9e489d9c0dbee7c1a2c..5631b51cec465e78f90feec4cc52ae7a74d7b0be 100644 (file)
@@ -15,12 +15,23 @@ struct embedded_sdio_data {
        int num_funcs;
 };
 
+struct msm_mmc_gpio {
+       unsigned no;
+       const char *name;
+};
+
+struct msm_mmc_gpio_data {
+       struct msm_mmc_gpio *gpio;
+       u8 size;
+};
+
 struct msm_mmc_platform_data {
        unsigned int ocr_mask;                  /* available voltages */
        u32 (*translate_vdd)(struct device *, unsigned int);
        unsigned int (*status)(struct device *);
        struct embedded_sdio_data *embedded_sdio;
        int (*register_status_notify)(void (*callback)(int card_present, void *dev_id), void *dev_id);
+       struct msm_mmc_gpio_data *gpio_data;
 };
 
 #endif
index cfff0e74f128f302a13f345a3da9238a4f58fd2d..8f99d97615a0b25f9c3636e3313af016b38d4648 100644 (file)
@@ -1,6 +1,7 @@
 /* arch/arm/mach-msm/include/mach/msm_iomap.h
  *
  * Copyright (C) 2007 Google, Inc.
+ * Copyright (c) 2011, Code Aurora Forum. All rights reserved.
  * Author: Brian Swetland <swetland@google.com>
  *
  * This software is licensed under the terms of the GNU General Public
 #define MSM_VIC_PHYS          0xC0000000
 #define MSM_VIC_SIZE          SZ_4K
 
-#define MSM_CSR_BASE          IOMEM(0xE0001000)
-#define MSM_CSR_PHYS          0xC0100000
-#define MSM_CSR_SIZE          SZ_4K
-
-#define MSM_GPT_PHYS          MSM_CSR_PHYS
-#define MSM_GPT_BASE          MSM_CSR_BASE
-#define MSM_GPT_SIZE          SZ_4K
+#define MSM7X00_CSR_PHYS      0xC0100000
+#define MSM7X00_CSR_SIZE      SZ_4K
 
 #define MSM_DMOV_BASE         IOMEM(0xE0002000)
 #define MSM_DMOV_PHYS         0xA9700000
 #define MSM_AD5_SIZE          (SZ_1M*13)
 
 
-#if defined(CONFIG_ARCH_MSM7X30)
-#define MSM_GCC_BASE          IOMEM(0xF8009000)
-#define MSM_GCC_PHYS          0xC0182000
-#define MSM_GCC_SIZE          SZ_4K
-#endif
-
 #endif
index 0fd7b68ca1141750746f9af351c4b7e5775018c7..4d84be15955ea6856829af2e16be5ccf3aac9162 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2007 Google, Inc.
- * Copyright (c) 2008-2010, Code Aurora Forum. All rights reserved.
+ * Copyright (c) 2008-2011 Code Aurora Forum. All rights reserved.
  * Author: Brian Swetland <swetland@google.com>
  *
  * This software is licensed under the terms of the GNU General Public
 #define MSM_VIC_PHYS          0xC0080000
 #define MSM_VIC_SIZE          SZ_4K
 
-#define MSM_CSR_BASE          IOMEM(0xE0001000)
-#define MSM_CSR_PHYS          0xC0100000
-#define MSM_CSR_SIZE          SZ_4K
-
-#define MSM_TMR_PHYS          MSM_CSR_PHYS
-#define MSM_TMR_BASE          MSM_CSR_BASE
-#define MSM_TMR_SIZE          SZ_4K
-
-#define MSM_GPT_BASE         (MSM_TMR_BASE + 0x4)
-#define MSM_DGT_BASE         (MSM_TMR_BASE + 0x24)
+#define MSM7X30_CSR_PHYS      0xC0100000
+#define MSM7X30_CSR_SIZE      SZ_4K
 
 #define MSM_DMOV_BASE         IOMEM(0xE0002000)
 #define MSM_DMOV_PHYS         0xAC400000
diff --git a/arch/arm/mach-msm/include/mach/msm_iomap-8960.h b/arch/arm/mach-msm/include/mach/msm_iomap-8960.h
new file mode 100644 (file)
index 0000000..3c9d960
--- /dev/null
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2007 Google, Inc.
+ * Copyright (c) 2008-2011, Code Aurora Forum. All rights reserved.
+ * Author: Brian Swetland <swetland@google.com>
+ *
+ * This software is licensed under the terms of the GNU General Public
+ * License version 2, as published by the Free Software Foundation, and
+ * may be copied, distributed, and modified under those terms.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * 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.
+ *
+ *
+ * The MSM peripherals are spread all over across 768MB of physical
+ * space, which makes just having a simple IO_ADDRESS macro to slide
+ * them into the right virtual location rough.  Instead, we will
+ * provide a master phys->virt mapping for peripherals here.
+ *
+ */
+
+#ifndef __ASM_ARCH_MSM_IOMAP_8960_H
+#define __ASM_ARCH_MSM_IOMAP_8960_H
+
+/* Physical base address and size of peripherals.
+ * Ordered by the virtual base addresses they will be mapped at.
+ *
+ * If you add or remove entries here, you'll want to edit the
+ * msm_io_desc array in arch/arm/mach-msm/io.c to reflect your
+ * changes.
+ *
+ */
+
+
+#define MSM8960_QGIC_DIST_PHYS 0x02000000
+#define MSM8960_QGIC_DIST_SIZE SZ_4K
+
+#define MSM8960_QGIC_CPU_PHYS  0x02002000
+#define MSM8960_QGIC_CPU_SIZE  SZ_4K
+
+#define MSM8960_TMR_PHYS       0x0200A000
+#define MSM8960_TMR_SIZE       SZ_4K
+
+#define MSM8960_TMR0_PHYS      0x0208A000
+#define MSM8960_TMR0_SIZE      SZ_4K
+
+#endif
index acc819eb76e56e0f94e36fced3be04ebbd3cca7c..d4143201999f2d8675e29a142d4290f2fef75f2e 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2007 Google, Inc.
- * Copyright (c) 2008-2010, Code Aurora Forum. All rights reserved.
+ * Copyright (c) 2008-2011 Code Aurora Forum. All rights reserved.
  * Author: Brian Swetland <swetland@google.com>
  *
  * This software is licensed under the terms of the GNU General Public
 #define MSM_VIC_PHYS          0xAC000000
 #define MSM_VIC_SIZE          SZ_4K
 
-#define MSM_CSR_BASE          IOMEM(0xE0001000)
-#define MSM_CSR_PHYS          0xAC100000
-#define MSM_CSR_SIZE          SZ_4K
-
-#define MSM_TMR_PHYS          MSM_CSR_PHYS
-#define MSM_TMR_BASE          MSM_CSR_BASE
-#define MSM_TMR_SIZE          SZ_4K
-
-#define MSM_GPT_BASE          MSM_TMR_BASE
-#define MSM_DGT_BASE          (MSM_TMR_BASE + 0x10)
+#define QSD8X50_CSR_PHYS      0xAC100000
+#define QSD8X50_CSR_SIZE      SZ_4K
 
 #define MSM_DMOV_BASE         IOMEM(0xE0002000)
 #define MSM_DMOV_PHYS         0xA9700000
 #define MSM_UART2DM_PHYS      0xA0900000
 
 
-#define MSM_SDC1_PHYS          0xA0400000
+#define MSM_SDC1_PHYS          0xA0300000
 #define MSM_SDC1_SIZE          SZ_4K
 
-#define MSM_SDC2_PHYS          0xA0500000
+#define MSM_SDC2_PHYS          0xA0400000
 #define MSM_SDC2_SIZE          SZ_4K
 
-#define MSM_SDC3_PHYS          0xA0600000
+#define MSM_SDC3_PHYS          0xA0500000
 #define MSM_SDC3_SIZE           SZ_4K
 
-#define MSM_SDC4_PHYS          0xA0700000
+#define MSM_SDC4_PHYS          0xA0600000
 #define MSM_SDC4_SIZE          SZ_4K
 
 #endif
index a54e33b0882ea254bf8f5b9c5665ba03025b074b..3b19b8f244b8808d63489a1b92fc1851a38e0ffb 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2007 Google, Inc.
- * Copyright (c) 2008-2010, Code Aurora Forum. All rights reserved.
+ * Copyright (c) 2008-2011, Code Aurora Forum. All rights reserved.
  * Author: Brian Swetland <swetland@google.com>
  *
  * This software is licensed under the terms of the GNU General Public
  *
  */
 
-#define MSM_QGIC_DIST_BASE     IOMEM(0xF0000000)
-#define MSM_QGIC_DIST_PHYS     0x02080000
-#define MSM_QGIC_DIST_SIZE     SZ_4K
+#define MSM8X60_QGIC_DIST_PHYS 0x02080000
+#define MSM8X60_QGIC_DIST_SIZE SZ_4K
 
-#define MSM_QGIC_CPU_BASE      IOMEM(0xF0001000)
-#define MSM_QGIC_CPU_PHYS      0x02081000
-#define MSM_QGIC_CPU_SIZE      SZ_4K
+#define MSM8X60_QGIC_CPU_PHYS  0x02081000
+#define MSM8X60_QGIC_CPU_SIZE  SZ_4K
 
 #define MSM_ACC_BASE           IOMEM(0xF0002000)
 #define MSM_ACC_PHYS           0x02001000
 #define MSM_SHARED_RAM_BASE    IOMEM(0xF0100000)
 #define MSM_SHARED_RAM_SIZE    SZ_1M
 
-#define MSM_TMR_BASE           IOMEM(0xF0200000)
-#define MSM_TMR_PHYS           0x02000000
-#define MSM_TMR_SIZE           SZ_4K
+#define MSM8X60_TMR_PHYS       0x02000000
+#define MSM8X60_TMR_SIZE       SZ_4K
 
-#define MSM_TMR0_BASE          IOMEM(0xF0201000)
-#define MSM_TMR0_PHYS          0x02040000
-#define MSM_TMR0_SIZE          SZ_4K
-
-#define MSM_GPT_BASE           (MSM_TMR_BASE + 0x4)
-#define MSM_DGT_BASE           (MSM_TMR_BASE + 0x24)
-
-#define MSM_IOMMU_JPEGD_PHYS   0x07300000
-#define MSM_IOMMU_JPEGD_SIZE   SZ_1M
-
-#define MSM_IOMMU_VPE_PHYS     0x07400000
-#define MSM_IOMMU_VPE_SIZE     SZ_1M
-
-#define MSM_IOMMU_MDP0_PHYS    0x07500000
-#define MSM_IOMMU_MDP0_SIZE    SZ_1M
-
-#define MSM_IOMMU_MDP1_PHYS    0x07600000
-#define MSM_IOMMU_MDP1_SIZE    SZ_1M
-
-#define MSM_IOMMU_ROT_PHYS     0x07700000
-#define MSM_IOMMU_ROT_SIZE     SZ_1M
-
-#define MSM_IOMMU_IJPEG_PHYS   0x07800000
-#define MSM_IOMMU_IJPEG_SIZE   SZ_1M
-
-#define MSM_IOMMU_VFE_PHYS     0x07900000
-#define MSM_IOMMU_VFE_SIZE     SZ_1M
-
-#define MSM_IOMMU_VCODEC_A_PHYS        0x07A00000
-#define MSM_IOMMU_VCODEC_A_SIZE        SZ_1M
-
-#define MSM_IOMMU_VCODEC_B_PHYS        0x07B00000
-#define MSM_IOMMU_VCODEC_B_SIZE        SZ_1M
-
-#define MSM_IOMMU_GFX3D_PHYS   0x07C00000
-#define MSM_IOMMU_GFX3D_SIZE   SZ_1M
-
-#define MSM_IOMMU_GFX2D0_PHYS  0x07D00000
-#define MSM_IOMMU_GFX2D0_SIZE  SZ_1M
-
-#define MSM_IOMMU_GFX2D1_PHYS  0x07E00000
-#define MSM_IOMMU_GFX2D1_SIZE  SZ_1M
+#define MSM8X60_TMR0_PHYS      0x02040000
+#define MSM8X60_TMR0_SIZE      SZ_4K
 
 #endif
index 8e24dd8121397871de5bc3f8ee4a5d5769bca8f6..c98c7591f3b81fc0ffb9e3b0c735f29a9dbbd235 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2007 Google, Inc.
- * Copyright (c) 2008-2010, Code Aurora Forum. All rights reserved.
+ * Copyright (c) 2008-2011, Code Aurora Forum. All rights reserved.
  * Author: Brian Swetland <swetland@google.com>
  *
  * This software is licensed under the terms of the GNU General Public
 #include "msm_iomap-7x00.h"
 #endif
 
+#include "msm_iomap-8960.h"
 
+/* Virtual addressses shared across all MSM targets. */
+#define MSM_CSR_BASE           IOMEM(0xE0001000)
+#define MSM_QGIC_DIST_BASE     IOMEM(0xF0000000)
+#define MSM_QGIC_CPU_BASE      IOMEM(0xF0001000)
+#define MSM_TMR_BASE           IOMEM(0xF0200000)
+#define MSM_TMR0_BASE          IOMEM(0xF0201000)
 
 #endif
index 7281337ee28db9593d7ad163f717b61e3a25c423..ef55868a5b8ababa515882678db7bfb9c07e2bf6 100644 (file)
@@ -1,30 +1,13 @@
 /* Copyright (c) 2008-2009, Code Aurora Forum. All rights reserved.
  *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of Code Aurora Forum, Inc. nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 and
+ * only version 2 as published by the Free Software Foundation.
  *
+ * This program is distributed in the hope that it will be useful,
+ * 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.
  */
 
 #ifndef __ASM_ARCH_MSM_SIRC_H
index a95f7b9efe31b3d8e2e95a2d76c561df69d2e657..3c01000ecc806ecd1fa222becea9f031664e89f8 100644 (file)
@@ -1,29 +1,13 @@
 /* Copyright (c) 2010, Code Aurora Forum. All rights reserved.
  *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above copyright
- *       notice, this list of conditions and the following disclaimer in the
- *       documentation and/or other materials provided with the distribution.
- *     * Neither the name of Code Aurora nor
- *       the names of its contributors may be used to endorse or promote
- *       products derived from this software without specific prior written
- *       permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
- * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
- * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 and
+ * only version 2 as published by the Free Software Foundation.
  *
+ * This program is distributed in the hope that it will be useful,
+ * 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.
  */
 
 #ifndef __ASM_ARCH_MSM_SMP_H
index 1260007a9dd1a9799d4dad0f8931c4812994f764..cec6ed1c91d3ed602733d93127d8b5fc2340275d 100644 (file)
@@ -3,7 +3,7 @@
  * MSM7K, QSD io support
  *
  * Copyright (C) 2007 Google, Inc.
- * Copyright (c) 2008-2010, Code Aurora Forum. All rights reserved.
+ * Copyright (c) 2008-2011, Code Aurora Forum. All rights reserved.
  * Author: Brian Swetland <swetland@google.com>
  *
  * This software is licensed under the terms of the GNU General Public
 
 #include <mach/board.h>
 
-#define MSM_DEVICE(name) { \
+#define MSM_CHIP_DEVICE(name, chip) {                        \
                .virtual = (unsigned long) MSM_##name##_BASE, \
-               .pfn = __phys_to_pfn(MSM_##name##_PHYS), \
-               .length = MSM_##name##_SIZE, \
+               .pfn = __phys_to_pfn(chip##_##name##_PHYS), \
+               .length = chip##_##name##_SIZE, \
                .type = MT_DEVICE_NONSHARED, \
         }
 
+#define MSM_DEVICE(name) MSM_CHIP_DEVICE(name, MSM)
+
 #if defined(CONFIG_ARCH_MSM7X00A) || defined(CONFIG_ARCH_MSM7X27) \
        || defined(CONFIG_ARCH_MSM7X25)
 static struct map_desc msm_io_desc[] __initdata = {
        MSM_DEVICE(VIC),
-       MSM_DEVICE(CSR),
-       MSM_DEVICE(GPT),
+       MSM_CHIP_DEVICE(CSR, MSM7X00),
        MSM_DEVICE(DMOV),
        MSM_DEVICE(GPIO1),
        MSM_DEVICE(GPIO2),
@@ -73,8 +74,7 @@ void __init msm_map_common_io(void)
 #ifdef CONFIG_ARCH_QSD8X50
 static struct map_desc qsd8x50_io_desc[] __initdata = {
        MSM_DEVICE(VIC),
-       MSM_DEVICE(CSR),
-       MSM_DEVICE(TMR),
+       MSM_CHIP_DEVICE(CSR, QSD8X50),
        MSM_DEVICE(DMOV),
        MSM_DEVICE(GPIO1),
        MSM_DEVICE(GPIO2),
@@ -102,10 +102,10 @@ void __init msm_map_qsd8x50_io(void)
 
 #ifdef CONFIG_ARCH_MSM8X60
 static struct map_desc msm8x60_io_desc[] __initdata = {
-       MSM_DEVICE(QGIC_DIST),
-       MSM_DEVICE(QGIC_CPU),
-       MSM_DEVICE(TMR),
-       MSM_DEVICE(TMR0),
+       MSM_CHIP_DEVICE(QGIC_DIST, MSM8X60),
+       MSM_CHIP_DEVICE(QGIC_CPU, MSM8X60),
+       MSM_CHIP_DEVICE(TMR, MSM8X60),
+       MSM_CHIP_DEVICE(TMR0, MSM8X60),
        MSM_DEVICE(ACC),
        MSM_DEVICE(GCC),
 };
@@ -116,11 +116,24 @@ void __init msm_map_msm8x60_io(void)
 }
 #endif /* CONFIG_ARCH_MSM8X60 */
 
+#ifdef CONFIG_ARCH_MSM8960
+static struct map_desc msm8960_io_desc[] __initdata = {
+       MSM_CHIP_DEVICE(QGIC_DIST, MSM8960),
+       MSM_CHIP_DEVICE(QGIC_CPU, MSM8960),
+       MSM_CHIP_DEVICE(TMR, MSM8960),
+       MSM_CHIP_DEVICE(TMR0, MSM8960),
+};
+
+void __init msm_map_msm8960_io(void)
+{
+       iotable_init(msm8960_io_desc, ARRAY_SIZE(msm8960_io_desc));
+}
+#endif /* CONFIG_ARCH_MSM8960 */
+
 #ifdef CONFIG_ARCH_MSM7X30
 static struct map_desc msm7x30_io_desc[] __initdata = {
        MSM_DEVICE(VIC),
-       MSM_DEVICE(CSR),
-       MSM_DEVICE(TMR),
+       MSM_CHIP_DEVICE(CSR, MSM7X30),
        MSM_DEVICE(DMOV),
        MSM_DEVICE(GPIO1),
        MSM_DEVICE(GPIO2),
index e2d58e4cb0d73c47ecb11f62d834114d5e186d41..1a584e077c61fa36b00f0dc273b600a87ea1b726 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2010, Code Aurora Forum. All rights reserved.
+/* Copyright (c) 2010-2011, Code Aurora Forum. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 and
@@ -26,6 +26,7 @@
 #include <linux/spinlock.h>
 #include <linux/slab.h>
 #include <linux/iommu.h>
+#include <linux/clk.h>
 
 #include <asm/cacheflush.h>
 #include <asm/sizes.h>
@@ -50,6 +51,30 @@ struct msm_priv {
        struct list_head list_attached;
 };
 
+static int __enable_clocks(struct msm_iommu_drvdata *drvdata)
+{
+       int ret;
+
+       ret = clk_enable(drvdata->pclk);
+       if (ret)
+               goto fail;
+
+       if (drvdata->clk) {
+               ret = clk_enable(drvdata->clk);
+               if (ret)
+                       clk_disable(drvdata->pclk);
+       }
+fail:
+       return ret;
+}
+
+static void __disable_clocks(struct msm_iommu_drvdata *drvdata)
+{
+       if (drvdata->clk)
+               clk_disable(drvdata->clk);
+       clk_disable(drvdata->pclk);
+}
+
 static int __flush_iotlb(struct iommu_domain *domain)
 {
        struct msm_priv *priv = domain->priv;
@@ -77,9 +102,16 @@ static int __flush_iotlb(struct iommu_domain *domain)
                        BUG();
 
                iommu_drvdata = dev_get_drvdata(ctx_drvdata->pdev->dev.parent);
+               BUG_ON(!iommu_drvdata);
+
+               ret = __enable_clocks(iommu_drvdata);
+               if (ret)
+                       goto fail;
+
                SET_CTX_TLBIALL(iommu_drvdata->base, ctx_drvdata->num, 0);
+               __disable_clocks(iommu_drvdata);
        }
-
+fail:
        return ret;
 }
 
@@ -105,7 +137,6 @@ static void __reset_context(void __iomem *base, int ctx)
        SET_TLBLKCR(base, ctx, 0);
        SET_PRRR(base, ctx, 0);
        SET_NMRR(base, ctx, 0);
-       SET_CONTEXTIDR(base, ctx, 0);
 }
 
 static void __program_context(void __iomem *base, int ctx, phys_addr_t pgtable)
@@ -265,9 +296,14 @@ static int msm_iommu_attach_dev(struct iommu_domain *domain, struct device *dev)
                        goto fail;
                }
 
+       ret = __enable_clocks(iommu_drvdata);
+       if (ret)
+               goto fail;
+
        __program_context(iommu_drvdata->base, ctx_dev->num,
                          __pa(priv->pgtable));
 
+       __disable_clocks(iommu_drvdata);
        list_add(&(ctx_drvdata->attached_elm), &priv->list_attached);
        ret = __flush_iotlb(domain);
 
@@ -303,7 +339,12 @@ static void msm_iommu_detach_dev(struct iommu_domain *domain,
        if (ret)
                goto fail;
 
+       ret = __enable_clocks(iommu_drvdata);
+       if (ret)
+               goto fail;
+
        __reset_context(iommu_drvdata->base, ctx_dev->num);
+       __disable_clocks(iommu_drvdata);
        list_del_init(&ctx_drvdata->attached_elm);
 
 fail:
@@ -376,11 +417,11 @@ static int msm_iommu_map(struct iommu_domain *domain, unsigned long va,
                for (i = 0; i < 16; i++)
                        *(fl_pte+i) = (pa & 0xFF000000) | FL_SUPERSECTION |
                                  FL_AP_READ | FL_AP_WRITE | FL_TYPE_SECT |
-                                 FL_SHARED | pgprot;
+                                 FL_SHARED | FL_NG | pgprot;
        }
 
        if (len == SZ_1M)
-               *fl_pte = (pa & 0xFFF00000) | FL_AP_READ | FL_AP_WRITE |
+               *fl_pte = (pa & 0xFFF00000) | FL_AP_READ | FL_AP_WRITE | FL_NG |
                                            FL_TYPE_SECT | FL_SHARED | pgprot;
 
        /* Need a 2nd level table */
@@ -405,7 +446,7 @@ static int msm_iommu_map(struct iommu_domain *domain, unsigned long va,
 
 
        if (len == SZ_4K)
-               *sl_pte = (pa & SL_BASE_MASK_SMALL) | SL_AP0 | SL_AP1 |
+               *sl_pte = (pa & SL_BASE_MASK_SMALL) | SL_AP0 | SL_AP1 | SL_NG |
                                          SL_SHARED | SL_TYPE_SMALL | pgprot;
 
        if (len == SZ_64K) {
@@ -413,7 +454,7 @@ static int msm_iommu_map(struct iommu_domain *domain, unsigned long va,
 
                for (i = 0; i < 16; i++)
                        *(sl_pte+i) = (pa & SL_BASE_MASK_LARGE) | SL_AP0 |
-                               SL_AP1 | SL_SHARED | SL_TYPE_LARGE | pgprot;
+                           SL_NG | SL_AP1 | SL_SHARED | SL_TYPE_LARGE | pgprot;
        }
 
        ret = __flush_iotlb(domain);
@@ -532,9 +573,13 @@ static phys_addr_t msm_iommu_iova_to_phys(struct iommu_domain *domain,
        base = iommu_drvdata->base;
        ctx = ctx_drvdata->num;
 
+       ret = __enable_clocks(iommu_drvdata);
+       if (ret)
+               goto fail;
+
        /* Invalidate context TLB */
        SET_CTX_TLBIALL(base, ctx, 0);
-       SET_V2PPR_VA(base, ctx, va >> V2Pxx_VA_SHIFT);
+       SET_V2PPR(base, ctx, va & V2Pxx_VA);
 
        par = GET_PAR(base, ctx);
 
@@ -547,6 +592,7 @@ static phys_addr_t msm_iommu_iova_to_phys(struct iommu_domain *domain,
        if (GET_FAULT(base, ctx))
                ret = 0;
 
+       __disable_clocks(iommu_drvdata);
 fail:
        spin_unlock_irqrestore(&msm_iommu_lock, flags);
        return ret;
@@ -590,7 +636,7 @@ irqreturn_t msm_iommu_fault_handler(int irq, void *dev_id)
        struct msm_iommu_drvdata *drvdata = dev_id;
        void __iomem *base;
        unsigned int fsr;
-       int ncb, i;
+       int i, ret;
 
        spin_lock(&msm_iommu_lock);
 
@@ -604,8 +650,11 @@ irqreturn_t msm_iommu_fault_handler(int irq, void *dev_id)
        pr_err("Unexpected IOMMU page fault!\n");
        pr_err("base = %08x\n", (unsigned int) base);
 
-       ncb = GET_NCB(base)+1;
-       for (i = 0; i < ncb; i++) {
+       ret = __enable_clocks(drvdata);
+       if (ret)
+               goto fail;
+
+       for (i = 0; i < drvdata->ncb; i++) {
                fsr = GET_FSR(base, i);
                if (fsr) {
                        pr_err("Fault occurred in context %d.\n", i);
@@ -614,6 +663,7 @@ irqreturn_t msm_iommu_fault_handler(int irq, void *dev_id)
                        SET_FSR(base, i, 0x4000000F);
                }
        }
+       __disable_clocks(drvdata);
 fail:
        spin_unlock(&msm_iommu_lock);
        return 0;
index b83c73b41fd101ba397adf7418858b08d8de8c5f..8e8fb079852d22ca124a5c0ff7bbce9d3f5ec365 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2010, Code Aurora Forum. All rights reserved.
+/* Copyright (c) 2010-2011, Code Aurora Forum. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 and
@@ -29,6 +29,7 @@
 
 #include <mach/iommu_hw-8xxx.h>
 #include <mach/iommu.h>
+#include <mach/clk.h>
 
 struct iommu_ctx_iter_data {
        /* input */
@@ -84,9 +85,9 @@ fail:
 }
 EXPORT_SYMBOL(msm_iommu_get_ctx);
 
-static void msm_iommu_reset(void __iomem *base)
+static void msm_iommu_reset(void __iomem *base, int ncb)
 {
-       int ctx, ncb;
+       int ctx;
 
        SET_RPUE(base, 0);
        SET_RPUEIE(base, 0);
@@ -99,7 +100,6 @@ static void msm_iommu_reset(void __iomem *base)
        SET_GLOBAL_TLBIALL(base, 0);
        SET_RPU_ACR(base, 0);
        SET_TLBLKCRWE(base, 1);
-       ncb = GET_NCB(base)+1;
 
        for (ctx = 0; ctx < ncb; ctx++) {
                SET_BPRCOSH(base, ctx, 0);
@@ -130,117 +130,140 @@ static int msm_iommu_probe(struct platform_device *pdev)
 {
        struct resource *r, *r2;
        struct clk *iommu_clk;
+       struct clk *iommu_pclk;
        struct msm_iommu_drvdata *drvdata;
        struct msm_iommu_dev *iommu_dev = pdev->dev.platform_data;
        void __iomem *regs_base;
        resource_size_t len;
-       int ret = 0, ncb, nm2v, irq;
+       int ret, irq, par;
 
-       if (pdev->id != -1) {
-               drvdata = kzalloc(sizeof(*drvdata), GFP_KERNEL);
+       if (pdev->id == -1) {
+               msm_iommu_root_dev = pdev;
+               return 0;
+       }
 
-               if (!drvdata) {
-                       ret = -ENOMEM;
-                       goto fail;
-               }
+       drvdata = kzalloc(sizeof(*drvdata), GFP_KERNEL);
 
-               if (!iommu_dev) {
-                       ret = -ENODEV;
-                       goto fail;
-               }
+       if (!drvdata) {
+               ret = -ENOMEM;
+               goto fail;
+       }
 
-               if (iommu_dev->clk_rate != 0) {
-                       iommu_clk = clk_get(&pdev->dev, "iommu_clk");
-
-                       if (IS_ERR(iommu_clk)) {
-                               ret = -ENODEV;
-                               goto fail;
-                       }
-
-                       if (iommu_dev->clk_rate > 0) {
-                               ret = clk_set_rate(iommu_clk,
-                                                       iommu_dev->clk_rate);
-                               if (ret) {
-                                       clk_put(iommu_clk);
-                                       goto fail;
-                               }
-                       }
-
-                       ret = clk_enable(iommu_clk);
-                       if (ret) {
-                               clk_put(iommu_clk);
-                               goto fail;
-                       }
+       if (!iommu_dev) {
+               ret = -ENODEV;
+               goto fail;
+       }
+
+       iommu_pclk = clk_get(NULL, "smmu_pclk");
+       if (IS_ERR(iommu_pclk)) {
+               ret = -ENODEV;
+               goto fail;
+       }
+
+       ret = clk_enable(iommu_pclk);
+       if (ret)
+               goto fail_enable;
+
+       iommu_clk = clk_get(&pdev->dev, "iommu_clk");
+
+       if (!IS_ERR(iommu_clk)) {
+               if (clk_get_rate(iommu_clk) == 0)
+                       clk_set_min_rate(iommu_clk, 1);
+
+               ret = clk_enable(iommu_clk);
+               if (ret) {
                        clk_put(iommu_clk);
+                       goto fail_pclk;
                }
+       } else
+               iommu_clk = NULL;
 
-               r = platform_get_resource_byname(pdev, IORESOURCE_MEM,
-                                                "physbase");
-               if (!r) {
-                       ret = -ENODEV;
-                       goto fail;
-               }
+       r = platform_get_resource_byname(pdev, IORESOURCE_MEM, "physbase");
 
-               len = r->end - r->start + 1;
+       if (!r) {
+               ret = -ENODEV;
+               goto fail_clk;
+       }
 
-               r2 = request_mem_region(r->start, len, r->name);
-               if (!r2) {
-                       pr_err("Could not request memory region: "
-                       "start=%p, len=%d\n", (void *) r->start, len);
-                       ret = -EBUSY;
-                       goto fail;
-               }
+       len = resource_size(r);
 
-               regs_base = ioremap(r2->start, len);
+       r2 = request_mem_region(r->start, len, r->name);
+       if (!r2) {
+               pr_err("Could not request memory region: start=%p, len=%d\n",
+                                                       (void *) r->start, len);
+               ret = -EBUSY;
+               goto fail_clk;
+       }
 
-               if (!regs_base) {
-                       pr_err("Could not ioremap: start=%p, len=%d\n",
-                                (void *) r2->start, len);
-                       ret = -EBUSY;
-                       goto fail_mem;
-               }
+       regs_base = ioremap(r2->start, len);
 
-               irq = platform_get_irq_byname(pdev, "secure_irq");
-               if (irq < 0) {
-                       ret = -ENODEV;
-                       goto fail_io;
-               }
+       if (!regs_base) {
+               pr_err("Could not ioremap: start=%p, len=%d\n",
+                        (void *) r2->start, len);
+               ret = -EBUSY;
+               goto fail_mem;
+       }
 
-               mb();
+       irq = platform_get_irq_byname(pdev, "secure_irq");
+       if (irq < 0) {
+               ret = -ENODEV;
+               goto fail_io;
+       }
 
-               if (GET_IDR(regs_base) == 0) {
-                       pr_err("Invalid IDR value detected\n");
-                       ret = -ENODEV;
-                       goto fail_io;
-               }
+       msm_iommu_reset(regs_base, iommu_dev->ncb);
 
-               ret = request_irq(irq, msm_iommu_fault_handler, 0,
-                               "msm_iommu_secure_irpt_handler", drvdata);
-               if (ret) {
-                       pr_err("Request IRQ %d failed with ret=%d\n", irq, ret);
-                       goto fail_io;
-               }
+       SET_M(regs_base, 0, 1);
+       SET_PAR(regs_base, 0, 0);
+       SET_V2PCFG(regs_base, 0, 1);
+       SET_V2PPR(regs_base, 0, 0);
+       par = GET_PAR(regs_base, 0);
+       SET_V2PCFG(regs_base, 0, 0);
+       SET_M(regs_base, 0, 0);
 
-               msm_iommu_reset(regs_base);
-               drvdata->base = regs_base;
-               drvdata->irq = irq;
+       if (!par) {
+               pr_err("%s: Invalid PAR value detected\n", iommu_dev->name);
+               ret = -ENODEV;
+               goto fail_io;
+       }
 
-               nm2v = GET_NM2VCBMT((unsigned long) regs_base);
-               ncb = GET_NCB((unsigned long) regs_base);
+       ret = request_irq(irq, msm_iommu_fault_handler, 0,
+                       "msm_iommu_secure_irpt_handler", drvdata);
+       if (ret) {
+               pr_err("Request IRQ %d failed with ret=%d\n", irq, ret);
+               goto fail_io;
+       }
 
-               pr_info("device %s mapped at %p, irq %d with %d ctx banks\n",
-                       iommu_dev->name, regs_base, irq, ncb+1);
 
-               platform_set_drvdata(pdev, drvdata);
-       } else
-               msm_iommu_root_dev = pdev;
+       drvdata->pclk = iommu_pclk;
+       drvdata->clk = iommu_clk;
+       drvdata->base = regs_base;
+       drvdata->irq = irq;
+       drvdata->ncb = iommu_dev->ncb;
 
-       return 0;
+       pr_info("device %s mapped at %p, irq %d with %d ctx banks\n",
+               iommu_dev->name, regs_base, irq, iommu_dev->ncb);
+
+       platform_set_drvdata(pdev, drvdata);
+
+       if (iommu_clk)
+               clk_disable(iommu_clk);
+
+       clk_disable(iommu_pclk);
 
+       return 0;
 fail_io:
        iounmap(regs_base);
 fail_mem:
        release_mem_region(r->start, len);
+fail_clk:
+       if (iommu_clk) {
+               clk_disable(iommu_clk);
+               clk_put(iommu_clk);
+       }
+fail_pclk:
+       clk_disable(iommu_pclk);
+fail_enable:
+       clk_put(iommu_pclk);
 fail:
        kfree(drvdata);
        return ret;
@@ -252,7 +275,10 @@ static int msm_iommu_remove(struct platform_device *pdev)
 
        drv = platform_get_drvdata(pdev);
        if (drv) {
-               memset(drv, 0, sizeof(struct msm_iommu_drvdata));
+               if (drv->clk)
+                       clk_put(drv->clk);
+               clk_put(drv->pclk);
+               memset(drv, 0, sizeof(*drv));
                kfree(drv);
                platform_set_drvdata(pdev, NULL);
        }
@@ -264,7 +290,7 @@ static int msm_iommu_ctx_probe(struct platform_device *pdev)
        struct msm_iommu_ctx_dev *c = pdev->dev.platform_data;
        struct msm_iommu_drvdata *drvdata;
        struct msm_iommu_ctx_drvdata *ctx_drvdata = NULL;
-       int i, ret = 0;
+       int i, ret;
        if (!c || !pdev->dev.parent) {
                ret = -EINVAL;
                goto fail;
@@ -288,6 +314,18 @@ static int msm_iommu_ctx_probe(struct platform_device *pdev)
        INIT_LIST_HEAD(&ctx_drvdata->attached_elm);
        platform_set_drvdata(pdev, ctx_drvdata);
 
+       ret = clk_enable(drvdata->pclk);
+       if (ret)
+               goto fail;
+
+       if (drvdata->clk) {
+               ret = clk_enable(drvdata->clk);
+               if (ret) {
+                       clk_disable(drvdata->pclk);
+                       goto fail;
+               }
+       }
+
        /* Program the M2V tables for this context */
        for (i = 0; i < MAX_NUM_MIDS; i++) {
                int mid = c->mids[i];
@@ -297,21 +335,27 @@ static int msm_iommu_ctx_probe(struct platform_device *pdev)
                SET_M2VCBR_N(drvdata->base, mid, 0);
                SET_CBACR_N(drvdata->base, c->num, 0);
 
-               /* Set VMID = MID */
-               SET_VMID(drvdata->base, mid, mid);
+               /* Set VMID = 0 */
+               SET_VMID(drvdata->base, mid, 0);
 
                /* Set the context number for that MID to this context */
                SET_CBNDX(drvdata->base, mid, c->num);
 
-               /* Set MID associated with this context bank */
-               SET_CBVMID(drvdata->base, c->num, mid);
+               /* Set MID associated with this context bank to 0*/
+               SET_CBVMID(drvdata->base, c->num, 0);
+
+               /* Set the ASID for TLB tagging for this context */
+               SET_CONTEXTIDR_ASID(drvdata->base, c->num, c->num);
 
                /* Set security bit override to be Non-secure */
                SET_NSCFG(drvdata->base, mid, 3);
        }
 
-       pr_info("context device %s with bank index %d\n", c->name, c->num);
+       if (drvdata->clk)
+               clk_disable(drvdata->clk);
+       clk_disable(drvdata->pclk);
 
+       dev_info(&pdev->dev, "context %s using bank %d\n", c->name, c->num);
        return 0;
 fail:
        kfree(ctx_drvdata);
index 68f9b6153d743b568d311820ed479116e073c006..7be32ff5d6877244b7fe7f0a49aa29a804f90a87 100644 (file)
@@ -1,29 +1,13 @@
 /* Copyright (c) 2010, Code Aurora Forum. All rights reserved.
  *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of Code Aurora Forum, Inc. nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 and
+ * only version 2 as published by the Free Software Foundation.
  *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * This program is distributed in the hope that it will be useful,
+ * 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.
  */
 #ifndef __MACH_SCM_BOOT_H
 #define __MACH_SCM_BOOT_H
index f4b9bc90d6a76279d317f1773d68c6a02d28a0fc..cfa808dd489787834b28bdcb93e7f1f34e7f0fae 100644 (file)
@@ -174,15 +174,18 @@ static u32 smc(u32 cmd_addr)
        register u32 r0 asm("r0") = 1;
        register u32 r1 asm("r1") = (u32)&context_id;
        register u32 r2 asm("r2") = cmd_addr;
-       asm(
-               __asmeq("%0", "r0")
-               __asmeq("%1", "r0")
-               __asmeq("%2", "r1")
-               __asmeq("%3", "r2")
-               "smc    #0      @ switch to secure world\n"
-               : "=r" (r0)
-               : "r" (r0), "r" (r1), "r" (r2)
-               : "r3");
+       do {
+               asm volatile(
+                       __asmeq("%0", "r0")
+                       __asmeq("%1", "r0")
+                       __asmeq("%2", "r1")
+                       __asmeq("%3", "r2")
+                       "smc    #0      @ switch to secure world\n"
+                       : "=r" (r0)
+                       : "r" (r0), "r" (r1), "r" (r2)
+                       : "r3");
+       } while (r0 == SCM_INTERRUPTED);
+
        return r0;
 }
 
@@ -197,13 +200,9 @@ static int __scm_call(const struct scm_command *cmd)
         * side in the buffer.
         */
        flush_cache_all();
-       do {
-               ret = smc(cmd_addr);
-               if (ret < 0) {
-                       ret = scm_remap_error(ret);
-                       break;
-               }
-       } while (ret == SCM_INTERRUPTED);
+       ret = smc(cmd_addr);
+       if (ret < 0)
+               ret = scm_remap_error(ret);
 
        return ret;
 }
@@ -264,21 +263,28 @@ u32 scm_get_version(void)
 {
        int context_id;
        static u32 version = -1;
-       register u32 r0 asm("r0") = 0x1 << 8;
-       register u32 r1 asm("r1") = (u32)&context_id;
+       register u32 r0 asm("r0");
+       register u32 r1 asm("r1");
 
        if (version != -1)
                return version;
 
        mutex_lock(&scm_lock);
-       asm(
-               __asmeq("%0", "r1")
-               __asmeq("%1", "r0")
-               __asmeq("%2", "r1")
-               "smc    #0      @ switch to secure world\n"
-               : "=r" (r1)
-               : "r" (r0), "r" (r1)
-               : "r2", "r3");
+
+       r0 = 0x1 << 8;
+       r1 = (u32)&context_id;
+       do {
+               asm volatile(
+                       __asmeq("%0", "r0")
+                       __asmeq("%1", "r1")
+                       __asmeq("%2", "r0")
+                       __asmeq("%3", "r1")
+                       "smc    #0      @ switch to secure world\n"
+                       : "=r" (r0), "=r" (r1)
+                       : "r" (r0), "r" (r1)
+                       : "r2", "r3");
+       } while (r0 == SCM_INTERRUPTED);
+
        version = r1;
        mutex_unlock(&scm_lock);
 
index 261786be11c517feee0cf2eb652d6b5e7b2eaa0e..00b31ea58f299720f6c4d8cf36786ae582c20509 100644 (file)
@@ -1,29 +1,13 @@
 /* Copyright (c) 2010, Code Aurora Forum. All rights reserved.
  *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of Code Aurora Forum, Inc. nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 and
+ * only version 2 as published by the Free Software Foundation.
  *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * This program is distributed in the hope that it will be useful,
+ * 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.
  */
 #ifndef __MACH_SCM_H
 #define __MACH_SCM_H
index c105d28b53e38bc5f6ec331c35343aefe9581ac1..e7f8e5a4d48f26331921089f819a9992864378e1 100644 (file)
 
 #include <asm/mach/time.h>
 #include <mach/msm_iomap.h>
-
-#ifndef MSM_DGT_BASE
-#define MSM_DGT_BASE (MSM_GPT_BASE + 0x10)
-#endif
+#include <mach/cpu.h>
 
 #define TIMER_MATCH_VAL         0x0000
 #define TIMER_COUNT_VAL         0x0004
@@ -52,18 +49,14 @@ enum timer_location {
        GLOBAL_TIMER = 1,
 };
 
-#ifdef MSM_TMR0_BASE
-#define MSM_TMR_GLOBAL         (MSM_TMR0_BASE - MSM_TMR_BASE)
-#else
-#define MSM_TMR_GLOBAL         0
-#endif
-
 #define MSM_GLOBAL_TIMER MSM_CLOCK_DGT
 
+/* TODO: Remove these ifdefs */
 #if defined(CONFIG_ARCH_QSD8X50)
 #define DGT_HZ (19200000 / 4) /* 19.2 MHz / 4 by default */
 #define MSM_DGT_SHIFT (0)
-#elif defined(CONFIG_ARCH_MSM7X30) || defined(CONFIG_ARCH_MSM8X60)
+#elif defined(CONFIG_ARCH_MSM7X30) || defined(CONFIG_ARCH_MSM8X60) || \
+                                     defined(CONFIG_ARCH_MSM8960)
 #define DGT_HZ (24576000 / 4) /* 24.576 MHz (LPXO) / 4 by default */
 #define MSM_DGT_SHIFT (0)
 #else
@@ -177,11 +170,7 @@ static struct msm_clock msm_clocks[] = {
                        .dev_id  = &msm_clocks[0].clockevent,
                        .irq     = INT_GP_TIMER_EXP
                },
-               .regbase = MSM_GPT_BASE,
                .freq = GPT_HZ,
-               .local_counter = MSM_GPT_BASE + TIMER_COUNT_VAL,
-               .global_counter = MSM_GPT_BASE + TIMER_COUNT_VAL +
-                       MSM_TMR_GLOBAL,
        },
        [MSM_CLOCK_DGT] = {
                .clockevent = {
@@ -206,12 +195,8 @@ static struct msm_clock msm_clocks[] = {
                        .dev_id  = &msm_clocks[1].clockevent,
                        .irq     = INT_DEBUG_TIMER_EXP
                },
-               .regbase = MSM_DGT_BASE,
                .freq = DGT_HZ >> MSM_DGT_SHIFT,
                .shift = MSM_DGT_SHIFT,
-               .local_counter = MSM_DGT_BASE + TIMER_COUNT_VAL,
-               .global_counter = MSM_DGT_BASE + TIMER_COUNT_VAL +
-                       MSM_TMR_GLOBAL,
        }
 };
 
@@ -219,6 +204,25 @@ static void __init msm_timer_init(void)
 {
        int i;
        int res;
+       int global_offset = 0;
+
+       if (cpu_is_msm7x01()) {
+               msm_clocks[MSM_CLOCK_GPT].regbase = MSM_CSR_BASE;
+               msm_clocks[MSM_CLOCK_DGT].regbase = MSM_CSR_BASE + 0x10;
+       } else if (cpu_is_msm7x30()) {
+               msm_clocks[MSM_CLOCK_GPT].regbase = MSM_CSR_BASE + 0x04;
+               msm_clocks[MSM_CLOCK_DGT].regbase = MSM_CSR_BASE + 0x24;
+       } else if (cpu_is_qsd8x50()) {
+               msm_clocks[MSM_CLOCK_GPT].regbase = MSM_CSR_BASE;
+               msm_clocks[MSM_CLOCK_DGT].regbase = MSM_CSR_BASE + 0x10;
+       } else if (cpu_is_msm8x60() || cpu_is_msm8960()) {
+               msm_clocks[MSM_CLOCK_GPT].regbase = MSM_TMR_BASE + 0x04;
+               msm_clocks[MSM_CLOCK_DGT].regbase = MSM_TMR_BASE + 0x24;
+
+               /* Use CPU0's timer as the global timer. */
+               global_offset = MSM_TMR0_BASE - MSM_TMR_BASE;
+       } else
+               BUG();
 
 #ifdef CONFIG_ARCH_MSM_SCORPIONMP
        writel(DGT_CLK_CTL_DIV_4, MSM_TMR_BASE + DGT_CLK_CTL);
@@ -228,6 +232,10 @@ static void __init msm_timer_init(void)
                struct msm_clock *clock = &msm_clocks[i];
                struct clock_event_device *ce = &clock->clockevent;
                struct clocksource *cs = &clock->clocksource;
+
+               clock->local_counter = clock->regbase + TIMER_COUNT_VAL;
+               clock->global_counter = clock->local_counter + global_offset;
+
                writel(0, clock->regbase + TIMER_ENABLE);
                writel(0, clock->regbase + TIMER_CLEAR);
                writel(~0, clock->regbase + TIMER_MATCH_VAL);
index 153ab977a013638a7d1a187d3bdb73a33c8d2345..97c9b3638d57ea81aef3917c042b0067234fa31b 100644 (file)
@@ -36,6 +36,7 @@
 #include <linux/io.h>
 #include <linux/memory.h>
 #include <linux/gfp.h>
+#include <linux/gpio.h>
 
 #include <asm/cacheflush.h>
 #include <asm/div64.h>
@@ -941,6 +942,38 @@ msmsdcc_request(struct mmc_host *mmc, struct mmc_request *mrq)
        spin_unlock_irqrestore(&host->lock, flags);
 }
 
+static void msmsdcc_setup_gpio(struct msmsdcc_host *host, bool enable)
+{
+       struct msm_mmc_gpio_data *curr;
+       int i, rc = 0;
+
+       if (!host->plat->gpio_data && host->gpio_config_status == enable)
+               return;
+
+       curr = host->plat->gpio_data;
+       for (i = 0; i < curr->size; i++) {
+               if (enable) {
+                       rc = gpio_request(curr->gpio[i].no,
+                                               curr->gpio[i].name);
+                       if (rc) {
+                               pr_err("%s: gpio_request(%d, %s) failed %d\n",
+                                       mmc_hostname(host->mmc),
+                                       curr->gpio[i].no,
+                                       curr->gpio[i].name, rc);
+                               goto free_gpios;
+                       }
+               } else {
+                       gpio_free(curr->gpio[i].no);
+               }
+       }
+       host->gpio_config_status = enable;
+       return;
+
+free_gpios:
+       for (; i >= 0; i--)
+               gpio_free(curr->gpio[i].no);
+}
+
 static void
 msmsdcc_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
 {
@@ -953,6 +986,8 @@ msmsdcc_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
 
        msmsdcc_enable_clocks(host);
 
+       spin_unlock_irqrestore(&host->lock, flags);
+
        if (ios->clock) {
                if (ios->clock != host->clk_rate) {
                        rc = clk_set_rate(host->clk, ios->clock);
@@ -979,9 +1014,11 @@ msmsdcc_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
 
        switch (ios->power_mode) {
        case MMC_POWER_OFF:
+               msmsdcc_setup_gpio(host, false);
                break;
        case MMC_POWER_UP:
                pwr |= MCI_PWR_UP;
+               msmsdcc_setup_gpio(host, true);
                break;
        case MMC_POWER_ON:
                pwr |= MCI_PWR_ON;
@@ -998,9 +1035,10 @@ msmsdcc_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
                msmsdcc_writel(host, pwr, MMCIPOWER);
        }
 #if BUSCLK_PWRSAVE
+       spin_lock_irqsave(&host->lock, flags);
        msmsdcc_disable_clocks(host, 1);
-#endif
        spin_unlock_irqrestore(&host->lock, flags);
+#endif
 }
 
 static void msmsdcc_enable_sdio_irq(struct mmc_host *mmc, int enable)
index 939557af266d6e535c8b416895665cdaaceef645..42d7bbc977c5846a38e5c06449a22a0998374e41 100644 (file)
@@ -243,6 +243,7 @@ struct msmsdcc_host {
        unsigned int            cmd_datactrl;
        struct mmc_command      *cmd_cmd;
        u32                     cmd_c;
+       bool                    gpio_config_status;
 
        bool prog_scan;
        bool prog_enable;
index 8e43a7b69e646accf723a020ba8ef5f8a05841d0..bfee9b4c66611045132893e1efcb6e8a8a925714 100644 (file)
@@ -3,6 +3,7 @@
  *
  * Copyright (C) 2007 Google, Inc.
  * Author: Robert Love <rlove@google.com>
+ * Copyright (c) 2011, Code Aurora Forum. All rights reserved.
  *
  * This software is licensed under the terms of the GNU General Public
  * License version 2, as published by the Free Software Foundation, and
@@ -31,6 +32,7 @@
 #include <linux/serial.h>
 #include <linux/clk.h>
 #include <linux/platform_device.h>
+#include <linux/delay.h>
 
 #include "msm_serial.h"
 
@@ -38,9 +40,20 @@ struct msm_port {
        struct uart_port        uart;
        char                    name[16];
        struct clk              *clk;
+       struct clk              *pclk;
        unsigned int            imr;
+       unsigned int            *gsbi_base;
+       int                     is_uartdm;
+       unsigned int            old_snap_state;
 };
 
+static inline void wait_for_xmitr(struct uart_port *port, int bits)
+{
+       if (!(msm_read(port, UART_SR) & UART_SR_TX_EMPTY))
+               while ((msm_read(port, UART_ISR) & bits) != bits)
+                       cpu_relax();
+}
+
 static void msm_stop_tx(struct uart_port *port)
 {
        struct msm_port *msm_port = UART_TO_MSM(port);
@@ -73,6 +86,61 @@ static void msm_enable_ms(struct uart_port *port)
        msm_write(port, msm_port->imr, UART_IMR);
 }
 
+static void handle_rx_dm(struct uart_port *port, unsigned int misr)
+{
+       struct tty_struct *tty = port->state->port.tty;
+       unsigned int sr;
+       int count = 0;
+       struct msm_port *msm_port = UART_TO_MSM(port);
+
+       if ((msm_read(port, UART_SR) & UART_SR_OVERRUN)) {
+               port->icount.overrun++;
+               tty_insert_flip_char(tty, 0, TTY_OVERRUN);
+               msm_write(port, UART_CR_CMD_RESET_ERR, UART_CR);
+       }
+
+       if (misr & UART_IMR_RXSTALE) {
+               count = msm_read(port, UARTDM_RX_TOTAL_SNAP) -
+                       msm_port->old_snap_state;
+               msm_port->old_snap_state = 0;
+       } else {
+               count = 4 * (msm_read(port, UART_RFWR));
+               msm_port->old_snap_state += count;
+       }
+
+       /* TODO: Precise error reporting */
+
+       port->icount.rx += count;
+
+       while (count > 0) {
+               unsigned int c;
+
+               sr = msm_read(port, UART_SR);
+               if ((sr & UART_SR_RX_READY) == 0) {
+                       msm_port->old_snap_state -= count;
+                       break;
+               }
+               c = msm_read(port, UARTDM_RF);
+               if (sr & UART_SR_RX_BREAK) {
+                       port->icount.brk++;
+                       if (uart_handle_break(port))
+                               continue;
+               } else if (sr & UART_SR_PAR_FRAME_ERR)
+                       port->icount.frame++;
+
+               /* TODO: handle sysrq */
+               tty_insert_flip_string(tty, (char *) &c,
+                                      (count > 4) ? 4 : count);
+               count -= 4;
+       }
+
+       tty_flip_buffer_push(tty);
+       if (misr & (UART_IMR_RXSTALE))
+               msm_write(port, UART_CR_CMD_RESET_STALE_INT, UART_CR);
+       msm_write(port, 0xFFFFFF, UARTDM_DMRX);
+       msm_write(port, UART_CR_CMD_STALE_EVENT_ENABLE, UART_CR);
+}
+
 static void handle_rx(struct uart_port *port)
 {
        struct tty_struct *tty = port->state->port.tty;
@@ -121,6 +189,12 @@ static void handle_rx(struct uart_port *port)
        tty_flip_buffer_push(tty);
 }
 
+static void reset_dm_count(struct uart_port *port)
+{
+       wait_for_xmitr(port, UART_ISR_TX_READY);
+       msm_write(port, 1, UARTDM_NCF_TX);
+}
+
 static void handle_tx(struct uart_port *port)
 {
        struct circ_buf *xmit = &port->state->xmit;
@@ -128,11 +202,18 @@ static void handle_tx(struct uart_port *port)
        int sent_tx;
 
        if (port->x_char) {
-               msm_write(port, port->x_char, UART_TF);
+               if (msm_port->is_uartdm)
+                       reset_dm_count(port);
+
+               msm_write(port, port->x_char,
+                         msm_port->is_uartdm ? UARTDM_TF : UART_TF);
                port->icount.tx++;
                port->x_char = 0;
        }
 
+       if (msm_port->is_uartdm)
+               reset_dm_count(port);
+
        while (msm_read(port, UART_SR) & UART_SR_TX_READY) {
                if (uart_circ_empty(xmit)) {
                        /* disable tx interrupts */
@@ -140,8 +221,11 @@ static void handle_tx(struct uart_port *port)
                        msm_write(port, msm_port->imr, UART_IMR);
                        break;
                }
+               msm_write(port, xmit->buf[xmit->tail],
+                         msm_port->is_uartdm ? UARTDM_TF : UART_TF);
 
-               msm_write(port, xmit->buf[xmit->tail], UART_TF);
+               if (msm_port->is_uartdm)
+                       reset_dm_count(port);
 
                xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1);
                port->icount.tx++;
@@ -169,8 +253,12 @@ static irqreturn_t msm_irq(int irq, void *dev_id)
        misr = msm_read(port, UART_MISR);
        msm_write(port, 0, UART_IMR); /* disable interrupt */
 
-       if (misr & (UART_IMR_RXLEV | UART_IMR_RXSTALE))
-               handle_rx(port);
+       if (misr & (UART_IMR_RXLEV | UART_IMR_RXSTALE)) {
+               if (msm_port->is_uartdm)
+                       handle_rx_dm(port, misr);
+               else
+                       handle_rx(port);
+       }
        if (misr & UART_IMR_TXLEV)
                handle_tx(port);
        if (misr & UART_IMR_DELTA_CTS)
@@ -192,10 +280,21 @@ static unsigned int msm_get_mctrl(struct uart_port *port)
        return TIOCM_CAR | TIOCM_CTS | TIOCM_DSR | TIOCM_RTS;
 }
 
-static void msm_set_mctrl(struct uart_port *port, unsigned int mctrl)
+
+static void msm_reset(struct uart_port *port)
 {
-       unsigned int mr;
+       /* reset everything */
+       msm_write(port, UART_CR_CMD_RESET_RX, UART_CR);
+       msm_write(port, UART_CR_CMD_RESET_TX, UART_CR);
+       msm_write(port, UART_CR_CMD_RESET_ERR, UART_CR);
+       msm_write(port, UART_CR_CMD_RESET_BREAK_INT, UART_CR);
+       msm_write(port, UART_CR_CMD_RESET_CTS, UART_CR);
+       msm_write(port, UART_CR_CMD_SET_RFR, UART_CR);
+}
 
+void msm_set_mctrl(struct uart_port *port, unsigned int mctrl)
+{
+       unsigned int mr;
        mr = msm_read(port, UART_MR1);
 
        if (!(mctrl & TIOCM_RTS)) {
@@ -219,6 +318,7 @@ static void msm_break_ctl(struct uart_port *port, int break_ctl)
 static int msm_set_baud_rate(struct uart_port *port, unsigned int baud)
 {
        unsigned int baud_code, rxstale, watermark;
+       struct msm_port *msm_port = UART_TO_MSM(port);
 
        switch (baud) {
        case 300:
@@ -273,6 +373,9 @@ static int msm_set_baud_rate(struct uart_port *port, unsigned int baud)
                break;
        }
 
+       if (msm_port->is_uartdm)
+               msm_write(port, UART_CR_CMD_RESET_RX, UART_CR);
+
        msm_write(port, baud_code, UART_CSR);
 
        /* RX stale watermark */
@@ -288,25 +391,23 @@ static int msm_set_baud_rate(struct uart_port *port, unsigned int baud)
        /* set TX watermark */
        msm_write(port, 10, UART_TFWR);
 
+       if (msm_port->is_uartdm) {
+               msm_write(port, UART_CR_CMD_RESET_STALE_INT, UART_CR);
+               msm_write(port, 0xFFFFFF, UARTDM_DMRX);
+               msm_write(port, UART_CR_CMD_STALE_EVENT_ENABLE, UART_CR);
+       }
+
        return baud;
 }
 
-static void msm_reset(struct uart_port *port)
-{
-       /* reset everything */
-       msm_write(port, UART_CR_CMD_RESET_RX, UART_CR);
-       msm_write(port, UART_CR_CMD_RESET_TX, UART_CR);
-       msm_write(port, UART_CR_CMD_RESET_ERR, UART_CR);
-       msm_write(port, UART_CR_CMD_RESET_BREAK_INT, UART_CR);
-       msm_write(port, UART_CR_CMD_RESET_CTS, UART_CR);
-       msm_write(port, UART_CR_CMD_SET_RFR, UART_CR);
-}
 
 static void msm_init_clock(struct uart_port *port)
 {
        struct msm_port *msm_port = UART_TO_MSM(port);
 
        clk_enable(msm_port->clk);
+       if (!IS_ERR(msm_port->pclk))
+               clk_enable(msm_port->pclk);
        msm_serial_set_mnd_regs(port);
 }
 
@@ -347,15 +448,31 @@ static int msm_startup(struct uart_port *port)
                msm_write(port, data, UART_IPR);
        }
 
-       msm_reset(port);
+       data = 0;
+       if (!port->cons || (port->cons && !(port->cons->flags & CON_ENABLED))) {
+               msm_write(port, UART_CR_CMD_PROTECTION_EN, UART_CR);
+               msm_reset(port);
+               data = UART_CR_TX_ENABLE;
+       }
+
+       data |= UART_CR_RX_ENABLE;
+       msm_write(port, data, UART_CR); /* enable TX & RX */
 
-       msm_write(port, 0x05, UART_CR); /* enable TX & RX */
+       /* Make sure IPR is not 0 to start with*/
+       if (msm_port->is_uartdm)
+               msm_write(port, UART_IPR_STALE_LSB, UART_IPR);
 
        /* turn on RX and CTS interrupts */
        msm_port->imr = UART_IMR_RXLEV | UART_IMR_RXSTALE |
                        UART_IMR_CURRENT_CTS;
-       msm_write(port, msm_port->imr, UART_IMR);
 
+       if (msm_port->is_uartdm) {
+               msm_write(port, 0xFFFFFF, UARTDM_DMRX);
+               msm_write(port, UART_CR_CMD_RESET_STALE_INT, UART_CR);
+               msm_write(port, UART_CR_CMD_STALE_EVENT_ENABLE, UART_CR);
+       }
+
+       msm_write(port, msm_port->imr, UART_IMR);
        return 0;
 }
 
@@ -384,7 +501,7 @@ static void msm_set_termios(struct uart_port *port, struct ktermios *termios,
        baud = msm_set_baud_rate(port, baud);
        if (tty_termios_baud_rate(termios))
                tty_termios_encode_baud_rate(termios, baud, baud);
-       
+
        /* calculate parity */
        mr = msm_read(port, UART_MR2);
        mr &= ~UART_MR2_PARITY_MODE;
@@ -454,48 +571,105 @@ static const char *msm_type(struct uart_port *port)
 static void msm_release_port(struct uart_port *port)
 {
        struct platform_device *pdev = to_platform_device(port->dev);
-       struct resource *resource;
+       struct msm_port *msm_port = UART_TO_MSM(port);
+       struct resource *uart_resource;
+       struct resource *gsbi_resource;
        resource_size_t size;
 
-       resource = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       if (unlikely(!resource))
+       uart_resource = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       if (unlikely(!uart_resource))
                return;
-       size = resource->end - resource->start + 1;
+       size = resource_size(uart_resource);
 
        release_mem_region(port->mapbase, size);
        iounmap(port->membase);
        port->membase = NULL;
+
+       if (msm_port->gsbi_base) {
+               iowrite32(GSBI_PROTOCOL_IDLE, msm_port->gsbi_base +
+                         GSBI_CONTROL);
+
+               gsbi_resource = platform_get_resource_byname(pdev,
+                                                            IORESOURCE_MEM,
+                                                            "gsbi_resource");
+
+               if (unlikely(!gsbi_resource))
+                       return;
+
+               size = resource_size(gsbi_resource);
+               release_mem_region(gsbi_resource->start, size);
+               iounmap(msm_port->gsbi_base);
+               msm_port->gsbi_base = NULL;
+       }
 }
 
 static int msm_request_port(struct uart_port *port)
 {
+       struct msm_port *msm_port = UART_TO_MSM(port);
        struct platform_device *pdev = to_platform_device(port->dev);
-       struct resource *resource;
+       struct resource *uart_resource;
+       struct resource *gsbi_resource;
        resource_size_t size;
+       int ret;
 
-       resource = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       if (unlikely(!resource))
+       uart_resource = platform_get_resource_byname(pdev, IORESOURCE_MEM,
+                                                    "uart_resource");
+       if (unlikely(!uart_resource))
                return -ENXIO;
-       size = resource->end - resource->start + 1;
 
-       if (unlikely(!request_mem_region(port->mapbase, size, "msm_serial")))
+       size = resource_size(uart_resource);
+
+       if (!request_mem_region(port->mapbase, size, "msm_serial"))
                return -EBUSY;
 
        port->membase = ioremap(port->mapbase, size);
        if (!port->membase) {
-               release_mem_region(port->mapbase, size);
-               return -EBUSY;
+               ret = -EBUSY;
+               goto fail_release_port;
+       }
+
+       gsbi_resource = platform_get_resource_byname(pdev, IORESOURCE_MEM,
+                                                    "gsbi_resource");
+       /* Is this a GSBI-based port? */
+       if (gsbi_resource) {
+               size = resource_size(gsbi_resource);
+
+               if (!request_mem_region(gsbi_resource->start, size,
+                                                "msm_serial")) {
+                       ret = -EBUSY;
+                       goto fail_release_port;
+               }
+
+               msm_port->gsbi_base = ioremap(gsbi_resource->start, size);
+               if (!msm_port->gsbi_base) {
+                       ret = -EBUSY;
+                       goto fail_release_gsbi;
+               }
        }
 
        return 0;
+
+fail_release_gsbi:
+       release_mem_region(gsbi_resource->start, size);
+fail_release_port:
+       release_mem_region(port->mapbase, size);
+       return ret;
 }
 
 static void msm_config_port(struct uart_port *port, int flags)
 {
+       struct msm_port *msm_port = UART_TO_MSM(port);
+       int ret;
        if (flags & UART_CONFIG_TYPE) {
                port->type = PORT_MSM;
-               msm_request_port(port);
+               ret = msm_request_port(port);
+               if (ret)
+                       return;
        }
+
+       if (msm_port->is_uartdm)
+               iowrite32(GSBI_PROTOCOL_UART, msm_port->gsbi_base +
+                         GSBI_CONTROL);
 }
 
 static int msm_verify_port(struct uart_port *port, struct serial_struct *ser)
@@ -515,9 +689,13 @@ static void msm_power(struct uart_port *port, unsigned int state,
        switch (state) {
        case 0:
                clk_enable(msm_port->clk);
+               if (!IS_ERR(msm_port->pclk))
+                       clk_enable(msm_port->pclk);
                break;
        case 3:
                clk_disable(msm_port->clk);
+               if (!IS_ERR(msm_port->pclk))
+                       clk_disable(msm_port->pclk);
                break;
        default:
                printk(KERN_ERR "msm_serial: Unknown PM state %d\n", state);
@@ -550,7 +728,7 @@ static struct msm_port msm_uart_ports[] = {
                        .iotype = UPIO_MEM,
                        .ops = &msm_uart_pops,
                        .flags = UPF_BOOT_AUTOCONF,
-                       .fifosize = 512,
+                       .fifosize = 64,
                        .line = 0,
                },
        },
@@ -559,7 +737,7 @@ static struct msm_port msm_uart_ports[] = {
                        .iotype = UPIO_MEM,
                        .ops = &msm_uart_pops,
                        .flags = UPF_BOOT_AUTOCONF,
-                       .fifosize = 512,
+                       .fifosize = 64,
                        .line = 1,
                },
        },
@@ -585,9 +763,14 @@ static inline struct uart_port *get_port_from_line(unsigned int line)
 
 static void msm_console_putchar(struct uart_port *port, int c)
 {
+       struct msm_port *msm_port = UART_TO_MSM(port);
+
+       if (msm_port->is_uartdm)
+               reset_dm_count(port);
+
        while (!(msm_read(port, UART_SR) & UART_SR_TX_READY))
                ;
-       msm_write(port, c, UART_TF);
+       msm_write(port, c, msm_port->is_uartdm ? UARTDM_TF : UART_TF);
 }
 
 static void msm_console_write(struct console *co, const char *s,
@@ -609,12 +792,14 @@ static void msm_console_write(struct console *co, const char *s,
 static int __init msm_console_setup(struct console *co, char *options)
 {
        struct uart_port *port;
+       struct msm_port *msm_port;
        int baud, flow, bits, parity;
 
        if (unlikely(co->index >= UART_NR || co->index < 0))
                return -ENXIO;
 
        port = get_port_from_line(co->index);
+       msm_port = UART_TO_MSM(port);
 
        if (unlikely(!port->membase))
                return -ENXIO;
@@ -638,6 +823,11 @@ static int __init msm_console_setup(struct console *co, char *options)
 
        msm_reset(port);
 
+       if (msm_port->is_uartdm) {
+               msm_write(port, UART_CR_CMD_PROTECTION_EN, UART_CR);
+               msm_write(port, UART_CR_TX_ENABLE, UART_CR);
+       }
+
        printk(KERN_INFO "msm_serial: console setup on port #%d\n", port->line);
 
        return uart_set_options(port, co, baud, parity, bits, flow);
@@ -685,14 +875,32 @@ static int __init msm_serial_probe(struct platform_device *pdev)
        port->dev = &pdev->dev;
        msm_port = UART_TO_MSM(port);
 
-       msm_port->clk = clk_get(&pdev->dev, "uart_clk");
-       if (IS_ERR(msm_port->clk))
-               return PTR_ERR(msm_port->clk);
+       if (platform_get_resource_byname(pdev, IORESOURCE_MEM, "gsbi_resource"))
+               msm_port->is_uartdm = 1;
+       else
+               msm_port->is_uartdm = 0;
+
+       if (msm_port->is_uartdm) {
+               msm_port->clk = clk_get(&pdev->dev, "gsbi_uart_clk");
+               msm_port->pclk = clk_get(&pdev->dev, "gsbi_pclk");
+       } else {
+               msm_port->clk = clk_get(&pdev->dev, "uart_clk");
+               msm_port->pclk = ERR_PTR(-ENOENT);
+       }
+
+       if (unlikely(IS_ERR(msm_port->clk) || (IS_ERR(msm_port->pclk) &&
+                                              msm_port->is_uartdm)))
+                       return PTR_ERR(msm_port->clk);
+
+       if (msm_port->is_uartdm)
+               clk_set_rate(msm_port->clk, 7372800);
+
        port->uartclk = clk_get_rate(msm_port->clk);
        printk(KERN_INFO "uartclk = %d\n", port->uartclk);
 
 
-       resource = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       resource = platform_get_resource_byname(pdev, IORESOURCE_MEM,
+                                                    "uart_resource");
        if (unlikely(!resource))
                return -ENXIO;
        port->mapbase = resource->start;
index f6ca9ca79e98f34be24525596f1b38fe5c5f31a3..9b8dc5d0d85546e70aa978dc4381fea752f07812 100644 (file)
@@ -3,6 +3,7 @@
  *
  * Copyright (C) 2007 Google, Inc.
  * Author: Robert Love <rlove@google.com>
+ * Copyright (c) 2011, Code Aurora Forum. All rights reserved.
  *
  * This software is licensed under the terms of the GNU General Public
  * License version 2, as published by the Free Software Foundation, and
@@ -54,6 +55,7 @@
 #define UART_CSR_300   0x22
 
 #define UART_TF                0x000C
+#define UARTDM_TF      0x0070
 
 #define UART_CR                                0x0010
 #define UART_CR_CMD_NULL               (0 << 4)
 #define UART_CR_CMD_START_BREAK                (5 << 4)
 #define UART_CR_CMD_STOP_BREAK         (6 << 4)
 #define UART_CR_CMD_RESET_CTS          (7 << 4)
+#define UART_CR_CMD_RESET_STALE_INT    (8 << 4)
 #define UART_CR_CMD_PACKET_MODE                (9 << 4)
 #define UART_CR_CMD_MODE_RESET         (12 << 4)
 #define UART_CR_CMD_SET_RFR            (13 << 4)
 #define UART_CR_CMD_RESET_RFR          (14 << 4)
+#define UART_CR_CMD_PROTECTION_EN      (16 << 4)
+#define UART_CR_CMD_STALE_EVENT_ENABLE (80 << 4)
 #define UART_CR_TX_DISABLE             (1 << 3)
-#define UART_CR_TX_ENABLE              (1 << 3)
-#define UART_CR_RX_DISABLE             (1 << 3)
-#define UART_CR_RX_ENABLE              (1 << 3)
+#define UART_CR_TX_ENABLE              (1 << 2)
+#define UART_CR_RX_DISABLE             (1 << 1)
+#define UART_CR_RX_ENABLE              (1 << 0)
 
 #define UART_IMR               0x0014
 #define UART_IMR_TXLEV         (1 << 0)
 #define UART_SR_RX_FULL                (1 << 1)
 #define UART_SR_RX_READY       (1 << 0)
 
-#define UART_RF                0x000C
-#define UART_MISR      0x0010
-#define UART_ISR       0x0014
+#define UART_RF                        0x000C
+#define UARTDM_RF              0x0070
+#define UART_MISR              0x0010
+#define UART_ISR               0x0014
+#define UART_ISR_TX_READY      (1 << 7)
+
+#define GSBI_CONTROL           0x0
+#define GSBI_PROTOCOL_CODE     0x30
+#define GSBI_PROTOCOL_UART     0x40
+#define GSBI_PROTOCOL_IDLE     0x0
+
+#define UARTDM_DMRX            0x34
+#define UARTDM_NCF_TX          0x40
+#define UARTDM_RX_TOTAL_SNAP   0x38
 
 #define UART_TO_MSM(uart_port) ((struct msm_port *) uart_port)
 
index 4e3deb4e592b31ed0e4d8b4c3c69113af4aa4a98..d80477415caaa3bdd401814c511a3359bb98bd97 100644 (file)
@@ -449,6 +449,7 @@ int mdp_ppp_blit(const struct mdp_info *mdp, struct mdp_blit_req *req,
 #define PPP_CFG_MDP_XRGB_8888(dir) PPP_CFG_MDP_ARGB_8888(dir)
 #define PPP_CFG_MDP_RGBA_8888(dir) PPP_CFG_MDP_ARGB_8888(dir)
 #define PPP_CFG_MDP_BGRA_8888(dir) PPP_CFG_MDP_ARGB_8888(dir)
+#define PPP_CFG_MDP_RGBX_8888(dir) PPP_CFG_MDP_ARGB_8888(dir)
 
 #define PPP_CFG_MDP_Y_CBCR_H2V2(dir)   (PPP_##dir##_C2R_8BIT | \
                                        PPP_##dir##_C0G_8BIT | \
@@ -488,12 +489,14 @@ int mdp_ppp_blit(const struct mdp_info *mdp, struct mdp_blit_req *req,
        MDP_GET_PACK_PATTERN(0, CLR_R, CLR_G, CLR_B, 8)
 #define PPP_PACK_PATTERN_MDP_RGB_888 PPP_PACK_PATTERN_MDP_RGB_565
 #define PPP_PACK_PATTERN_MDP_XRGB_8888 \
-       MDP_GET_PACK_PATTERN(CLR_ALPHA, CLR_R, CLR_G, CLR_B, 8)
+       MDP_GET_PACK_PATTERN(CLR_B, CLR_G, CLR_R, CLR_ALPHA, 8)
 #define PPP_PACK_PATTERN_MDP_ARGB_8888 PPP_PACK_PATTERN_MDP_XRGB_8888
 #define PPP_PACK_PATTERN_MDP_RGBA_8888 \
        MDP_GET_PACK_PATTERN(CLR_ALPHA, CLR_B, CLR_G, CLR_R, 8)
 #define PPP_PACK_PATTERN_MDP_BGRA_8888 \
        MDP_GET_PACK_PATTERN(CLR_ALPHA, CLR_R, CLR_G, CLR_B, 8)
+#define PPP_PACK_PATTERN_MDP_RGBX_8888 \
+       MDP_GET_PACK_PATTERN(CLR_ALPHA, CLR_B, CLR_G, CLR_R, 8)
 #define PPP_PACK_PATTERN_MDP_Y_CBCR_H2V1 \
        MDP_GET_PACK_PATTERN(0, 0, CLR_CB, CLR_CR, 8)
 #define PPP_PACK_PATTERN_MDP_Y_CBCR_H2V2 PPP_PACK_PATTERN_MDP_Y_CBCR_H2V1
@@ -509,6 +512,7 @@ int mdp_ppp_blit(const struct mdp_info *mdp, struct mdp_blit_req *req,
 #define PPP_CHROMA_SAMP_MDP_ARGB_8888(dir) PPP_OP_##dir##_CHROMA_RGB
 #define PPP_CHROMA_SAMP_MDP_RGBA_8888(dir) PPP_OP_##dir##_CHROMA_RGB
 #define PPP_CHROMA_SAMP_MDP_BGRA_8888(dir) PPP_OP_##dir##_CHROMA_RGB
+#define PPP_CHROMA_SAMP_MDP_RGBX_8888(dir) PPP_OP_##dir##_CHROMA_RGB
 #define PPP_CHROMA_SAMP_MDP_Y_CBCR_H2V1(dir) PPP_OP_##dir##_CHROMA_H2V1
 #define PPP_CHROMA_SAMP_MDP_Y_CBCR_H2V2(dir) PPP_OP_##dir##_CHROMA_420
 #define PPP_CHROMA_SAMP_MDP_Y_CRCB_H2V1(dir) PPP_OP_##dir##_CHROMA_H2V1
@@ -523,6 +527,7 @@ int mdp_ppp_blit(const struct mdp_info *mdp, struct mdp_blit_req *req,
        [MDP_ARGB_8888] = PPP_##name##_MDP_ARGB_8888,\
        [MDP_RGBA_8888] = PPP_##name##_MDP_RGBA_8888,\
        [MDP_BGRA_8888] = PPP_##name##_MDP_BGRA_8888,\
+       [MDP_RGBX_8888] = PPP_##name##_MDP_RGBX_8888,\
        [MDP_Y_CBCR_H2V1] = PPP_##name##_MDP_Y_CBCR_H2V1,\
        [MDP_Y_CBCR_H2V2] = PPP_##name##_MDP_Y_CBCR_H2V2,\
        [MDP_Y_CRCB_H2V1] = PPP_##name##_MDP_Y_CRCB_H2V1,\
@@ -536,6 +541,7 @@ int mdp_ppp_blit(const struct mdp_info *mdp, struct mdp_blit_req *req,
        [MDP_ARGB_8888] = PPP_##name##_MDP_ARGB_8888(dir),\
        [MDP_RGBA_8888] = PPP_##name##_MDP_RGBA_8888(dir),\
        [MDP_BGRA_8888] = PPP_##name##_MDP_BGRA_8888(dir),\
+       [MDP_RGBX_8888] = PPP_##name##_MDP_RGBX_8888(dir),\
        [MDP_Y_CBCR_H2V1] = PPP_##name##_MDP_Y_CBCR_H2V1(dir),\
        [MDP_Y_CBCR_H2V2] = PPP_##name##_MDP_Y_CBCR_H2V2(dir),\
        [MDP_Y_CRCB_H2V1] = PPP_##name##_MDP_Y_CRCB_H2V1(dir),\
@@ -547,7 +553,8 @@ int mdp_ppp_blit(const struct mdp_info *mdp, struct mdp_blit_req *req,
                       (img == MDP_YCRYCB_H2V1))
 #define IS_RGB(img) ((img == MDP_RGB_565) | (img == MDP_RGB_888) | \
                     (img == MDP_ARGB_8888) | (img == MDP_RGBA_8888) | \
-                    (img == MDP_XRGB_8888) | (img == MDP_BGRA_8888))
+                    (img == MDP_XRGB_8888) | (img == MDP_BGRA_8888) | \
+                    (img == MDP_RGBX_8888))
 #define HAS_ALPHA(img) ((img == MDP_ARGB_8888) | (img == MDP_RGBA_8888) | \
                        (img == MDP_BGRA_8888))
 
index 4ff001f4cbbdd9f33a98803bf70755f562c2c1a7..2b6564e8bfeaa37e7f785904af2604ac847b4493 100644 (file)
@@ -69,6 +69,7 @@ static uint32_t bytes_per_pixel[] = {
        [MDP_ARGB_8888] = 4,
        [MDP_RGBA_8888] = 4,
        [MDP_BGRA_8888] = 4,
+       [MDP_RGBX_8888] = 4,
        [MDP_Y_CBCR_H2V1] = 1,
        [MDP_Y_CBCR_H2V2] = 1,
        [MDP_Y_CRCB_H2V1] = 1,
index debe5933fd2e6c0d3c3e272242e093632f2732cf..ec351309e60739c1969102614b6d55a46d95d837 100644 (file)
@@ -81,7 +81,6 @@ struct msmfb_info {
        spinlock_t update_lock;
        struct mutex panel_init_lock;
        wait_queue_head_t frame_wq;
-       struct workqueue_struct *resume_workqueue;
        struct work_struct resume_work;
        struct msmfb_callback dma_callback;
        struct msmfb_callback vsync_callback;
@@ -111,7 +110,7 @@ static void msmfb_handle_dma_interrupt(struct msmfb_callback *callback)
        if (msmfb->sleeping == UPDATING &&
            msmfb->frame_done == msmfb->update_frame) {
                DLOG(SUSPEND_RESUME, "full update completed\n");
-               queue_work(msmfb->resume_workqueue, &msmfb->resume_work);
+               schedule_work(&msmfb->resume_work);
        }
        spin_unlock_irqrestore(&msmfb->update_lock, irq_flags);
        wake_up(&msmfb->frame_wq);
@@ -220,8 +219,8 @@ restart:
 
        sleeping = msmfb->sleeping;
        /* on a full update, if the last frame has not completed, wait for it */
-       if (pan_display && (msmfb->frame_requested != msmfb->frame_done ||
-                           sleeping == UPDATING)) {
+       if ((pan_display && msmfb->frame_requested != msmfb->frame_done) ||
+                           sleeping == UPDATING) {
                int ret;
                spin_unlock_irqrestore(&msmfb->update_lock, irq_flags);
                ret = wait_event_interruptible_timeout(msmfb->frame_wq,
@@ -470,6 +469,18 @@ static void setup_fb_info(struct msmfb_info *msmfb)
        fb_info->var.yoffset = 0;
 
        if (msmfb->panel->caps & MSMFB_CAP_PARTIAL_UPDATES) {
+               /*
+                * Set the param in the fixed screen, so userspace can't
+                * change it. This will be used to check for the
+                * capability.
+                */
+               fb_info->fix.reserved[0] = 0x5444;
+               fb_info->fix.reserved[1] = 0x5055;
+
+               /*
+                * This preloads the value so that if userspace doesn't
+                * change it, it will be a full update
+                */
                fb_info->var.reserved[0] = 0x54445055;
                fb_info->var.reserved[1] = 0;
                fb_info->var.reserved[2] = (uint16_t)msmfb->xres |
@@ -559,12 +570,6 @@ static int msmfb_probe(struct platform_device *pdev)
        spin_lock_init(&msmfb->update_lock);
        mutex_init(&msmfb->panel_init_lock);
        init_waitqueue_head(&msmfb->frame_wq);
-       msmfb->resume_workqueue = create_workqueue("panel_on");
-       if (msmfb->resume_workqueue == NULL) {
-               printk(KERN_ERR "failed to create panel_on workqueue\n");
-               ret = -ENOMEM;
-               goto error_create_workqueue;
-       }
        INIT_WORK(&msmfb->resume_work, power_on_panel);
        msmfb->black = kzalloc(msmfb->fb->var.bits_per_pixel*msmfb->xres,
                               GFP_KERNEL);
@@ -589,8 +594,6 @@ static int msmfb_probe(struct platform_device *pdev)
        return 0;
 
 error_register_framebuffer:
-       destroy_workqueue(msmfb->resume_workqueue);
-error_create_workqueue:
        iounmap(fb->screen_base);
 error_setup_fbmem:
        framebuffer_release(msmfb->fb);
index d11fe0f2f956f4a97393590f7306fc0020abec60..fe722c1fb61d552afa87d0d6e62c0da6bd8f82af 100644 (file)
@@ -32,6 +32,7 @@ enum {
        MDP_Y_CBCR_H2V1,        /* Y and CrCb, pseduo planar w/ Cr is in MSB */
        MDP_RGBA_8888,          /* ARGB 888 */
        MDP_BGRA_8888,          /* ABGR 888 */
+       MDP_RGBX_8888,          /* RGBX 888 */
        MDP_IMGTYPE_LIMIT       /* Non valid image type after this enum */
 };