diff options
Diffstat (limited to 'arch/arm')
72 files changed, 1856 insertions, 599 deletions
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index f1d9297b105..d56d21c0573 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig | |||
| @@ -1311,7 +1311,7 @@ config HZ | |||
| 1311 | 1311 | ||
| 1312 | config THUMB2_KERNEL | 1312 | config THUMB2_KERNEL |
| 1313 | bool "Compile the kernel in Thumb-2 mode" | 1313 | bool "Compile the kernel in Thumb-2 mode" |
| 1314 | depends on CPU_V7 && EXPERIMENTAL | 1314 | depends on CPU_V7 && !CPU_V6 && EXPERIMENTAL |
| 1315 | select AEABI | 1315 | select AEABI |
| 1316 | select ARM_ASM_UNIFIED | 1316 | select ARM_ASM_UNIFIED |
| 1317 | help | 1317 | help |
| @@ -1759,7 +1759,7 @@ comment "At least one emulation must be selected" | |||
| 1759 | 1759 | ||
| 1760 | config FPE_NWFPE | 1760 | config FPE_NWFPE |
| 1761 | bool "NWFPE math emulation" | 1761 | bool "NWFPE math emulation" |
| 1762 | depends on !AEABI || OABI_COMPAT | 1762 | depends on (!AEABI || OABI_COMPAT) && !THUMB2_KERNEL |
| 1763 | ---help--- | 1763 | ---help--- |
| 1764 | Say Y to include the NWFPE floating point emulator in the kernel. | 1764 | Say Y to include the NWFPE floating point emulator in the kernel. |
| 1765 | This is necessary to run most binaries. Linux does not currently | 1765 | This is necessary to run most binaries. Linux does not currently |
diff --git a/arch/arm/common/it8152.c b/arch/arm/common/it8152.c index 1bec96e8519..42ff90b46df 100644 --- a/arch/arm/common/it8152.c +++ b/arch/arm/common/it8152.c | |||
| @@ -352,3 +352,4 @@ struct pci_bus * __init it8152_pci_scan_bus(int nr, struct pci_sys_data *sys) | |||
| 352 | return pci_scan_bus(nr, &it8152_ops, sys); | 352 | return pci_scan_bus(nr, &it8152_ops, sys); |
| 353 | } | 353 | } |
| 354 | 354 | ||
| 355 | EXPORT_SYMBOL(dma_set_coherent_mask); | ||
diff --git a/arch/arm/include/asm/hardware/it8152.h b/arch/arm/include/asm/hardware/it8152.h index 21fa272301f..b2f95c72287 100644 --- a/arch/arm/include/asm/hardware/it8152.h +++ b/arch/arm/include/asm/hardware/it8152.h | |||
| @@ -76,6 +76,7 @@ extern unsigned long it8152_base_address; | |||
| 76 | IT8152_PD_IRQ(0) Audio controller (ACR) | 76 | IT8152_PD_IRQ(0) Audio controller (ACR) |
| 77 | */ | 77 | */ |
| 78 | #define IT8152_IRQ(x) (IRQ_BOARD_START + (x)) | 78 | #define IT8152_IRQ(x) (IRQ_BOARD_START + (x)) |
| 79 | #define IT8152_LAST_IRQ (IRQ_BOARD_START + 40) | ||
| 79 | 80 | ||
| 80 | /* IRQ-sources in 3 groups - local devices, LPC (serial), and external PCI */ | 81 | /* IRQ-sources in 3 groups - local devices, LPC (serial), and external PCI */ |
| 81 | #define IT8152_LD_IRQ_COUNT 9 | 82 | #define IT8152_LD_IRQ_COUNT 9 |
diff --git a/arch/arm/include/asm/highmem.h b/arch/arm/include/asm/highmem.h index 1fc684e70ab..7080e2c8fa6 100644 --- a/arch/arm/include/asm/highmem.h +++ b/arch/arm/include/asm/highmem.h | |||
| @@ -25,9 +25,6 @@ extern void *kmap_high(struct page *page); | |||
| 25 | extern void *kmap_high_get(struct page *page); | 25 | extern void *kmap_high_get(struct page *page); |
| 26 | extern void kunmap_high(struct page *page); | 26 | extern void kunmap_high(struct page *page); |
| 27 | 27 | ||
| 28 | extern void *kmap_high_l1_vipt(struct page *page, pte_t *saved_pte); | ||
| 29 | extern void kunmap_high_l1_vipt(struct page *page, pte_t saved_pte); | ||
| 30 | |||
| 31 | /* | 28 | /* |
| 32 | * The following functions are already defined by <linux/highmem.h> | 29 | * The following functions are already defined by <linux/highmem.h> |
| 33 | * when CONFIG_HIGHMEM is not set. | 30 | * when CONFIG_HIGHMEM is not set. |
diff --git a/arch/arm/include/asm/sizes.h b/arch/arm/include/asm/sizes.h index 4fc1565e4f9..316bb2b2be3 100644 --- a/arch/arm/include/asm/sizes.h +++ b/arch/arm/include/asm/sizes.h | |||
| @@ -13,9 +13,6 @@ | |||
| 13 | * along with this program; if not, write to the Free Software | 13 | * along with this program; if not, write to the Free Software |
| 14 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | 14 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
| 15 | */ | 15 | */ |
| 16 | /* DO NOT EDIT!! - this file automatically generated | ||
| 17 | * from .s file by awk -f s2h.awk | ||
| 18 | */ | ||
| 19 | /* Size definitions | 16 | /* Size definitions |
| 20 | * Copyright (C) ARM Limited 1998. All rights reserved. | 17 | * Copyright (C) ARM Limited 1998. All rights reserved. |
| 21 | */ | 18 | */ |
| @@ -25,6 +22,9 @@ | |||
| 25 | 22 | ||
| 26 | /* handy sizes */ | 23 | /* handy sizes */ |
| 27 | #define SZ_16 0x00000010 | 24 | #define SZ_16 0x00000010 |
| 25 | #define SZ_32 0x00000020 | ||
| 26 | #define SZ_64 0x00000040 | ||
| 27 | #define SZ_128 0x00000080 | ||
| 28 | #define SZ_256 0x00000100 | 28 | #define SZ_256 0x00000100 |
| 29 | #define SZ_512 0x00000200 | 29 | #define SZ_512 0x00000200 |
| 30 | 30 | ||
diff --git a/arch/arm/include/asm/system.h b/arch/arm/include/asm/system.h index 1120f18a6b1..80025948b8a 100644 --- a/arch/arm/include/asm/system.h +++ b/arch/arm/include/asm/system.h | |||
| @@ -150,6 +150,7 @@ extern unsigned int user_debug; | |||
| 150 | #define rmb() dmb() | 150 | #define rmb() dmb() |
| 151 | #define wmb() mb() | 151 | #define wmb() mb() |
| 152 | #else | 152 | #else |
| 153 | #include <asm/memory.h> | ||
| 153 | #define mb() do { if (arch_is_coherent()) dmb(); else barrier(); } while (0) | 154 | #define mb() do { if (arch_is_coherent()) dmb(); else barrier(); } while (0) |
| 154 | #define rmb() do { if (arch_is_coherent()) dmb(); else barrier(); } while (0) | 155 | #define rmb() do { if (arch_is_coherent()) dmb(); else barrier(); } while (0) |
| 155 | #define wmb() do { if (arch_is_coherent()) dmb(); else barrier(); } while (0) | 156 | #define wmb() do { if (arch_is_coherent()) dmb(); else barrier(); } while (0) |
diff --git a/arch/arm/kernel/entry-common.S b/arch/arm/kernel/entry-common.S index 8bfa98757cd..80bf8cd88d7 100644 --- a/arch/arm/kernel/entry-common.S +++ b/arch/arm/kernel/entry-common.S | |||
| @@ -29,6 +29,9 @@ ret_fast_syscall: | |||
| 29 | ldr r1, [tsk, #TI_FLAGS] | 29 | ldr r1, [tsk, #TI_FLAGS] |
| 30 | tst r1, #_TIF_WORK_MASK | 30 | tst r1, #_TIF_WORK_MASK |
| 31 | bne fast_work_pending | 31 | bne fast_work_pending |
| 32 | #if defined(CONFIG_IRQSOFF_TRACER) | ||
| 33 | asm_trace_hardirqs_on | ||
| 34 | #endif | ||
| 32 | 35 | ||
| 33 | /* perform architecture specific actions before user return */ | 36 | /* perform architecture specific actions before user return */ |
| 34 | arch_ret_to_user r1, lr | 37 | arch_ret_to_user r1, lr |
| @@ -65,6 +68,9 @@ ret_slow_syscall: | |||
| 65 | tst r1, #_TIF_WORK_MASK | 68 | tst r1, #_TIF_WORK_MASK |
| 66 | bne work_pending | 69 | bne work_pending |
| 67 | no_work_pending: | 70 | no_work_pending: |
| 71 | #if defined(CONFIG_IRQSOFF_TRACER) | ||
| 72 | asm_trace_hardirqs_on | ||
| 73 | #endif | ||
| 68 | /* perform architecture specific actions before user return */ | 74 | /* perform architecture specific actions before user return */ |
| 69 | arch_ret_to_user r1, lr | 75 | arch_ret_to_user r1, lr |
| 70 | 76 | ||
diff --git a/arch/arm/kernel/perf_event.c b/arch/arm/kernel/perf_event.c index 07a50357492..fdfa4976b0b 100644 --- a/arch/arm/kernel/perf_event.c +++ b/arch/arm/kernel/perf_event.c | |||
| @@ -3034,11 +3034,11 @@ init_hw_perf_events(void) | |||
| 3034 | pr_info("no hardware support available\n"); | 3034 | pr_info("no hardware support available\n"); |
| 3035 | } | 3035 | } |
| 3036 | 3036 | ||
| 3037 | perf_pmu_register(&pmu); | 3037 | perf_pmu_register(&pmu, "cpu", PERF_TYPE_RAW); |
| 3038 | 3038 | ||
| 3039 | return 0; | 3039 | return 0; |
| 3040 | } | 3040 | } |
| 3041 | arch_initcall(init_hw_perf_events); | 3041 | early_initcall(init_hw_perf_events); |
| 3042 | 3042 | ||
| 3043 | /* | 3043 | /* |
| 3044 | * Callchain handling code. | 3044 | * Callchain handling code. |
diff --git a/arch/arm/kernel/smp.c b/arch/arm/kernel/smp.c index 8c195959025..9066473c0eb 100644 --- a/arch/arm/kernel/smp.c +++ b/arch/arm/kernel/smp.c | |||
| @@ -310,7 +310,6 @@ asmlinkage void __cpuinit secondary_start_kernel(void) | |||
| 310 | * All kernel threads share the same mm context; grab a | 310 | * All kernel threads share the same mm context; grab a |
| 311 | * reference and switch to it. | 311 | * reference and switch to it. |
| 312 | */ | 312 | */ |
| 313 | atomic_inc(&mm->mm_users); | ||
| 314 | atomic_inc(&mm->mm_count); | 313 | atomic_inc(&mm->mm_count); |
| 315 | current->active_mm = mm; | 314 | current->active_mm = mm; |
| 316 | cpumask_set_cpu(cpu, mm_cpumask(mm)); | 315 | cpumask_set_cpu(cpu, mm_cpumask(mm)); |
diff --git a/arch/arm/mach-at91/Makefile b/arch/arm/mach-at91/Makefile index 62d686f0b42..d13add71f72 100644 --- a/arch/arm/mach-at91/Makefile +++ b/arch/arm/mach-at91/Makefile | |||
| @@ -65,7 +65,7 @@ obj-$(CONFIG_MACH_AT91SAM9G20EK) += board-sam9g20ek.o | |||
| 65 | obj-$(CONFIG_MACH_CPU9G20) += board-cpu9krea.o | 65 | obj-$(CONFIG_MACH_CPU9G20) += board-cpu9krea.o |
| 66 | obj-$(CONFIG_MACH_STAMP9G20) += board-stamp9g20.o | 66 | obj-$(CONFIG_MACH_STAMP9G20) += board-stamp9g20.o |
| 67 | obj-$(CONFIG_MACH_PORTUXG20) += board-stamp9g20.o | 67 | obj-$(CONFIG_MACH_PORTUXG20) += board-stamp9g20.o |
| 68 | obj-$(CONFIG_MACH_PCONTROL_G20) += board-pcontrol-g20.o | 68 | obj-$(CONFIG_MACH_PCONTROL_G20) += board-pcontrol-g20.o board-stamp9g20.o |
| 69 | 69 | ||
| 70 | # AT91SAM9260/AT91SAM9G20 board-specific support | 70 | # AT91SAM9260/AT91SAM9G20 board-specific support |
| 71 | obj-$(CONFIG_MACH_SNAPPER_9260) += board-snapper9260.o | 71 | obj-$(CONFIG_MACH_SNAPPER_9260) += board-snapper9260.o |
diff --git a/arch/arm/mach-at91/board-pcontrol-g20.c b/arch/arm/mach-at91/board-pcontrol-g20.c index bba5a560e02..feb65787c30 100644 --- a/arch/arm/mach-at91/board-pcontrol-g20.c +++ b/arch/arm/mach-at91/board-pcontrol-g20.c | |||
| @@ -31,6 +31,7 @@ | |||
| 31 | 31 | ||
| 32 | #include <mach/board.h> | 32 | #include <mach/board.h> |
| 33 | #include <mach/at91sam9_smc.h> | 33 | #include <mach/at91sam9_smc.h> |
| 34 | #include <mach/stamp9g20.h> | ||
| 34 | 35 | ||
| 35 | #include "sam9_smc.h" | 36 | #include "sam9_smc.h" |
| 36 | #include "generic.h" | 37 | #include "generic.h" |
| @@ -38,11 +39,7 @@ | |||
| 38 | 39 | ||
| 39 | static void __init pcontrol_g20_map_io(void) | 40 | static void __init pcontrol_g20_map_io(void) |
| 40 | { | 41 | { |
| 41 | /* Initialize processor: 18.432 MHz crystal */ | 42 | stamp9g20_map_io(); |
| 42 | at91sam9260_initialize(18432000); | ||
| 43 | |||
| 44 | /* DGBU on ttyS0. (Rx, Tx) only TTL -> JTAG connector X7 17,19 ) */ | ||
| 45 | at91_register_uart(0, 0, 0); | ||
| 46 | 43 | ||
| 47 | /* USART0 on ttyS1. (Rx, Tx, CTS, RTS) piggyback A2 */ | 44 | /* USART0 on ttyS1. (Rx, Tx, CTS, RTS) piggyback A2 */ |
| 48 | at91_register_uart(AT91SAM9260_ID_US0, 1, ATMEL_UART_CTS | 45 | at91_register_uart(AT91SAM9260_ID_US0, 1, ATMEL_UART_CTS |
| @@ -54,9 +51,6 @@ static void __init pcontrol_g20_map_io(void) | |||
| 54 | 51 | ||
| 55 | /* USART2 on ttyS3. (Rx, Tx) 9bit-Bus Multidrop-mode X4 */ | 52 | /* USART2 on ttyS3. (Rx, Tx) 9bit-Bus Multidrop-mode X4 */ |
| 56 | at91_register_uart(AT91SAM9260_ID_US4, 3, 0); | 53 | at91_register_uart(AT91SAM9260_ID_US4, 3, 0); |
| 57 | |||
| 58 | /* set serial console to ttyS0 (ie, DBGU) */ | ||
| 59 | at91_set_serial_console(0); | ||
| 60 | } | 54 | } |
| 61 | 55 | ||
| 62 | 56 | ||
| @@ -66,38 +60,6 @@ static void __init init_irq(void) | |||
| 66 | } | 60 | } |
| 67 | 61 | ||
| 68 | 62 | ||
| 69 | /* | ||
| 70 | * NAND flash 512MiB 1,8V 8-bit, sector size 128 KiB | ||
| 71 | */ | ||
| 72 | static struct atmel_nand_data __initdata nand_data = { | ||
| 73 | .ale = 21, | ||
| 74 | .cle = 22, | ||
| 75 | .rdy_pin = AT91_PIN_PC13, | ||
| 76 | .enable_pin = AT91_PIN_PC14, | ||
| 77 | }; | ||
| 78 | |||
| 79 | /* | ||
| 80 | * Bus timings; unit = 7.57ns | ||
| 81 | */ | ||
| 82 | static struct sam9_smc_config __initdata nand_smc_config = { | ||
| 83 | .ncs_read_setup = 0, | ||
| 84 | .nrd_setup = 2, | ||
| 85 | .ncs_write_setup = 0, | ||
| 86 | .nwe_setup = 2, | ||
| 87 | |||
| 88 | .ncs_read_pulse = 4, | ||
| 89 | .nrd_pulse = 4, | ||
| 90 | .ncs_write_pulse = 4, | ||
| 91 | .nwe_pulse = 4, | ||
| 92 | |||
| 93 | .read_cycle = 7, | ||
| 94 | .write_cycle = 7, | ||
| 95 | |||
| 96 | .mode = AT91_SMC_READMODE | AT91_SMC_WRITEMODE | ||
| 97 | | AT91_SMC_EXNWMODE_DISABLE | AT91_SMC_DBW_8, | ||
| 98 | .tdf_cycles = 3, | ||
| 99 | }; | ||
| 100 | |||
| 101 | static struct sam9_smc_config __initdata pcontrol_smc_config[2] = { { | 63 | static struct sam9_smc_config __initdata pcontrol_smc_config[2] = { { |
| 102 | .ncs_read_setup = 16, | 64 | .ncs_read_setup = 16, |
| 103 | .nrd_setup = 18, | 65 | .nrd_setup = 18, |
| @@ -138,14 +100,6 @@ static struct sam9_smc_config __initdata pcontrol_smc_config[2] = { { | |||
| 138 | .tdf_cycles = 1, | 100 | .tdf_cycles = 1, |
| 139 | } }; | 101 | } }; |
| 140 | 102 | ||
| 141 | static void __init add_device_nand(void) | ||
| 142 | { | ||
| 143 | /* configure chip-select 3 (NAND) */ | ||
| 144 | sam9_smc_configure(3, &nand_smc_config); | ||
| 145 | at91_add_device_nand(&nand_data); | ||
| 146 | } | ||
| 147 | |||
| 148 | |||
| 149 | static void __init add_device_pcontrol(void) | 103 | static void __init add_device_pcontrol(void) |
| 150 | { | 104 | { |
| 151 | /* configure chip-select 4 (IO compatible to 8051 X4 ) */ | 105 | /* configure chip-select 4 (IO compatible to 8051 X4 ) */ |
| @@ -156,23 +110,6 @@ static void __init add_device_pcontrol(void) | |||
| 156 | 110 | ||
| 157 | 111 | ||
| 158 | /* | 112 | /* |
| 159 | * MCI (SD/MMC) | ||
| 160 | * det_pin, wp_pin and vcc_pin are not connected | ||
| 161 | */ | ||
| 162 | #if defined(CONFIG_MMC_ATMELMCI) || defined(CONFIG_MMC_ATMELMCI_MODULE) | ||
| 163 | static struct mci_platform_data __initdata mmc_data = { | ||
| 164 | .slot[0] = { | ||
| 165 | .bus_width = 4, | ||
| 166 | }, | ||
| 167 | }; | ||
| 168 | #else | ||
| 169 | static struct at91_mmc_data __initdata mmc_data = { | ||
| 170 | .wire4 = 1, | ||
| 171 | }; | ||
| 172 | #endif | ||
| 173 | |||
| 174 | |||
| 175 | /* | ||
| 176 | * USB Host port | 113 | * USB Host port |
| 177 | */ | 114 | */ |
| 178 | static struct at91_usbh_data __initdata usbh_data = { | 115 | static struct at91_usbh_data __initdata usbh_data = { |
| @@ -265,42 +202,13 @@ static struct spi_board_info pcontrol_g20_spi_devices[] = { | |||
| 265 | }; | 202 | }; |
| 266 | 203 | ||
| 267 | 204 | ||
| 268 | /* | ||
| 269 | * Dallas 1-Wire DS2431 | ||
| 270 | */ | ||
| 271 | static struct w1_gpio_platform_data w1_gpio_pdata = { | ||
| 272 | .pin = AT91_PIN_PA29, | ||
| 273 | .is_open_drain = 1, | ||
| 274 | }; | ||
| 275 | |||
| 276 | static struct platform_device w1_device = { | ||
| 277 | .name = "w1-gpio", | ||
| 278 | .id = -1, | ||
| 279 | .dev.platform_data = &w1_gpio_pdata, | ||
| 280 | }; | ||
| 281 | |||
| 282 | static void add_wire1(void) | ||
| 283 | { | ||
| 284 | at91_set_GPIO_periph(w1_gpio_pdata.pin, 1); | ||
| 285 | at91_set_multi_drive(w1_gpio_pdata.pin, 1); | ||
| 286 | platform_device_register(&w1_device); | ||
| 287 | } | ||
| 288 | |||
| 289 | |||
| 290 | static void __init pcontrol_g20_board_init(void) | 205 | static void __init pcontrol_g20_board_init(void) |
| 291 | { | 206 | { |
| 292 | at91_add_device_serial(); | 207 | stamp9g20_board_init(); |
| 293 | add_device_nand(); | ||
| 294 | #if defined(CONFIG_MMC_ATMELMCI) || defined(CONFIG_MMC_ATMELMCI_MODULE) | ||
| 295 | at91_add_device_mci(0, &mmc_data); | ||
| 296 | #else | ||
| 297 | at91_add_device_mmc(0, &mmc_data); | ||
| 298 | #endif | ||
| 299 | at91_add_device_usbh(&usbh_data); | 208 | at91_add_device_usbh(&usbh_data); |
| 300 | at91_add_device_eth(&macb_data); | 209 | at91_add_device_eth(&macb_data); |
| 301 | at91_add_device_i2c(pcontrol_g20_i2c_devices, | 210 | at91_add_device_i2c(pcontrol_g20_i2c_devices, |
| 302 | ARRAY_SIZE(pcontrol_g20_i2c_devices)); | 211 | ARRAY_SIZE(pcontrol_g20_i2c_devices)); |
| 303 | add_wire1(); | ||
| 304 | add_device_pcontrol(); | 212 | add_device_pcontrol(); |
| 305 | at91_add_device_spi(pcontrol_g20_spi_devices, | 213 | at91_add_device_spi(pcontrol_g20_spi_devices, |
| 306 | ARRAY_SIZE(pcontrol_g20_spi_devices)); | 214 | ARRAY_SIZE(pcontrol_g20_spi_devices)); |
diff --git a/arch/arm/mach-at91/board-stamp9g20.c b/arch/arm/mach-at91/board-stamp9g20.c index 5206eef4a67..f8902b11896 100644 --- a/arch/arm/mach-at91/board-stamp9g20.c +++ b/arch/arm/mach-at91/board-stamp9g20.c | |||
| @@ -32,7 +32,7 @@ | |||
| 32 | #include "generic.h" | 32 | #include "generic.h" |
| 33 | 33 | ||
| 34 | 34 | ||
| 35 | static void __init portuxg20_map_io(void) | 35 | void __init stamp9g20_map_io(void) |
| 36 | { | 36 | { |
| 37 | /* Initialize processor: 18.432 MHz crystal */ | 37 | /* Initialize processor: 18.432 MHz crystal */ |
| 38 | at91sam9260_initialize(18432000); | 38 | at91sam9260_initialize(18432000); |
| @@ -40,6 +40,24 @@ static void __init portuxg20_map_io(void) | |||
| 40 | /* DGBU on ttyS0. (Rx & Tx only) */ | 40 | /* DGBU on ttyS0. (Rx & Tx only) */ |
| 41 | at91_register_uart(0, 0, 0); | 41 | at91_register_uart(0, 0, 0); |
| 42 | 42 | ||
| 43 | /* set serial console to ttyS0 (ie, DBGU) */ | ||
| 44 | at91_set_serial_console(0); | ||
| 45 | } | ||
| 46 | |||
| 47 | static void __init stamp9g20evb_map_io(void) | ||
| 48 | { | ||
| 49 | stamp9g20_map_io(); | ||
| 50 | |||
| 51 | /* USART0 on ttyS1. (Rx, Tx, CTS, RTS, DTR, DSR, DCD, RI) */ | ||
| 52 | at91_register_uart(AT91SAM9260_ID_US0, 1, ATMEL_UART_CTS | ATMEL_UART_RTS | ||
| 53 | | ATMEL_UART_DTR | ATMEL_UART_DSR | ||
| 54 | | ATMEL_UART_DCD | ATMEL_UART_RI); | ||
| 55 | } | ||
| 56 | |||
| 57 | static void __init portuxg20_map_io(void) | ||
| 58 | { | ||
| 59 | stamp9g20_map_io(); | ||
| 60 | |||
| 43 | /* USART0 on ttyS1. (Rx, Tx, CTS, RTS, DTR, DSR, DCD, RI) */ | 61 | /* USART0 on ttyS1. (Rx, Tx, CTS, RTS, DTR, DSR, DCD, RI) */ |
| 44 | at91_register_uart(AT91SAM9260_ID_US0, 1, ATMEL_UART_CTS | ATMEL_UART_RTS | 62 | at91_register_uart(AT91SAM9260_ID_US0, 1, ATMEL_UART_CTS | ATMEL_UART_RTS |
| 45 | | ATMEL_UART_DTR | ATMEL_UART_DSR | 63 | | ATMEL_UART_DTR | ATMEL_UART_DSR |
| @@ -56,26 +74,6 @@ static void __init portuxg20_map_io(void) | |||
| 56 | 74 | ||
| 57 | /* USART5 on ttyS6. (Rx, Tx only) */ | 75 | /* USART5 on ttyS6. (Rx, Tx only) */ |
| 58 | at91_register_uart(AT91SAM9260_ID_US5, 6, 0); | 76 | at91_register_uart(AT91SAM9260_ID_US5, 6, 0); |
| 59 | |||
| 60 | /* set serial console to ttyS0 (ie, DBGU) */ | ||
| 61 | at91_set_serial_console(0); | ||
| 62 | } | ||
| 63 | |||
| 64 | static void __init stamp9g20_map_io(void) | ||
| 65 | { | ||
| 66 | /* Initialize processor: 18.432 MHz crystal */ | ||
| 67 | at91sam9260_initialize(18432000); | ||
| 68 | |||
| 69 | /* DGBU on ttyS0. (Rx & Tx only) */ | ||
| 70 | at91_register_uart(0, 0, 0); | ||
| 71 | |||
| 72 | /* USART0 on ttyS1. (Rx, Tx, CTS, RTS, DTR, DSR, DCD, RI) */ | ||
| 73 | at91_register_uart(AT91SAM9260_ID_US0, 1, ATMEL_UART_CTS | ATMEL_UART_RTS | ||
| 74 | | ATMEL_UART_DTR | ATMEL_UART_DSR | ||
| 75 | | ATMEL_UART_DCD | ATMEL_UART_RI); | ||
| 76 | |||
| 77 | /* set serial console to ttyS0 (ie, DBGU) */ | ||
| 78 | at91_set_serial_console(0); | ||
| 79 | } | 77 | } |
| 80 | 78 | ||
| 81 | static void __init init_irq(void) | 79 | static void __init init_irq(void) |
| @@ -156,7 +154,7 @@ static struct at91_udc_data __initdata portuxg20_udc_data = { | |||
| 156 | .pullup_pin = 0, /* pull-up driven by UDC */ | 154 | .pullup_pin = 0, /* pull-up driven by UDC */ |
| 157 | }; | 155 | }; |
| 158 | 156 | ||
| 159 | static struct at91_udc_data __initdata stamp9g20_udc_data = { | 157 | static struct at91_udc_data __initdata stamp9g20evb_udc_data = { |
| 160 | .vbus_pin = AT91_PIN_PA22, | 158 | .vbus_pin = AT91_PIN_PA22, |
| 161 | .pullup_pin = 0, /* pull-up driven by UDC */ | 159 | .pullup_pin = 0, /* pull-up driven by UDC */ |
| 162 | }; | 160 | }; |
| @@ -190,7 +188,7 @@ static struct gpio_led portuxg20_leds[] = { | |||
| 190 | } | 188 | } |
| 191 | }; | 189 | }; |
| 192 | 190 | ||
| 193 | static struct gpio_led stamp9g20_leds[] = { | 191 | static struct gpio_led stamp9g20evb_leds[] = { |
| 194 | { | 192 | { |
| 195 | .name = "D8", | 193 | .name = "D8", |
| 196 | .gpio = AT91_PIN_PB18, | 194 | .gpio = AT91_PIN_PB18, |
| @@ -250,7 +248,7 @@ void add_w1(void) | |||
| 250 | } | 248 | } |
| 251 | 249 | ||
| 252 | 250 | ||
| 253 | static void __init generic_board_init(void) | 251 | void __init stamp9g20_board_init(void) |
| 254 | { | 252 | { |
| 255 | /* Serial */ | 253 | /* Serial */ |
| 256 | at91_add_device_serial(); | 254 | at91_add_device_serial(); |
| @@ -262,34 +260,40 @@ static void __init generic_board_init(void) | |||
| 262 | #else | 260 | #else |
| 263 | at91_add_device_mmc(0, &mmc_data); | 261 | at91_add_device_mmc(0, &mmc_data); |
| 264 | #endif | 262 | #endif |
| 265 | /* USB Host */ | ||
| 266 | at91_add_device_usbh(&usbh_data); | ||
| 267 | /* Ethernet */ | ||
| 268 | at91_add_device_eth(&macb_data); | ||
| 269 | /* I2C */ | ||
| 270 | at91_add_device_i2c(NULL, 0); | ||
| 271 | /* W1 */ | 263 | /* W1 */ |
| 272 | add_w1(); | 264 | add_w1(); |
| 273 | } | 265 | } |
| 274 | 266 | ||
| 275 | static void __init portuxg20_board_init(void) | 267 | static void __init portuxg20_board_init(void) |
| 276 | { | 268 | { |
| 277 | generic_board_init(); | 269 | stamp9g20_board_init(); |
| 278 | /* SPI */ | 270 | /* USB Host */ |
| 279 | at91_add_device_spi(portuxg20_spi_devices, ARRAY_SIZE(portuxg20_spi_devices)); | 271 | at91_add_device_usbh(&usbh_data); |
| 280 | /* USB Device */ | 272 | /* USB Device */ |
| 281 | at91_add_device_udc(&portuxg20_udc_data); | 273 | at91_add_device_udc(&portuxg20_udc_data); |
| 274 | /* Ethernet */ | ||
| 275 | at91_add_device_eth(&macb_data); | ||
| 276 | /* I2C */ | ||
| 277 | at91_add_device_i2c(NULL, 0); | ||
| 278 | /* SPI */ | ||
| 279 | at91_add_device_spi(portuxg20_spi_devices, ARRAY_SIZE(portuxg20_spi_devices)); | ||
| 282 | /* LEDs */ | 280 | /* LEDs */ |
| 283 | at91_gpio_leds(portuxg20_leds, ARRAY_SIZE(portuxg20_leds)); | 281 | at91_gpio_leds(portuxg20_leds, ARRAY_SIZE(portuxg20_leds)); |
| 284 | } | 282 | } |
| 285 | 283 | ||
| 286 | static void __init stamp9g20_board_init(void) | 284 | static void __init stamp9g20evb_board_init(void) |
| 287 | { | 285 | { |
| 288 | generic_board_init(); | 286 | stamp9g20_board_init(); |
| 287 | /* USB Host */ | ||
| 288 | at91_add_device_usbh(&usbh_data); | ||
| 289 | /* USB Device */ | 289 | /* USB Device */ |
| 290 | at91_add_device_udc(&stamp9g20_udc_data); | 290 | at91_add_device_udc(&stamp9g20evb_udc_data); |
| 291 | /* Ethernet */ | ||
| 292 | at91_add_device_eth(&macb_data); | ||
| 293 | /* I2C */ | ||
| 294 | at91_add_device_i2c(NULL, 0); | ||
| 291 | /* LEDs */ | 295 | /* LEDs */ |
| 292 | at91_gpio_leds(stamp9g20_leds, ARRAY_SIZE(stamp9g20_leds)); | 296 | at91_gpio_leds(stamp9g20evb_leds, ARRAY_SIZE(stamp9g20evb_leds)); |
| 293 | } | 297 | } |
| 294 | 298 | ||
| 295 | MACHINE_START(PORTUXG20, "taskit PortuxG20") | 299 | MACHINE_START(PORTUXG20, "taskit PortuxG20") |
| @@ -305,7 +309,7 @@ MACHINE_START(STAMP9G20, "taskit Stamp9G20") | |||
| 305 | /* Maintainer: taskit GmbH */ | 309 | /* Maintainer: taskit GmbH */ |
| 306 | .boot_params = AT91_SDRAM_BASE + 0x100, | 310 | .boot_params = AT91_SDRAM_BASE + 0x100, |
| 307 | .timer = &at91sam926x_timer, | 311 | .timer = &at91sam926x_timer, |
| 308 | .map_io = stamp9g20_map_io, | 312 | .map_io = stamp9g20evb_map_io, |
| 309 | .init_irq = init_irq, | 313 | .init_irq = init_irq, |
| 310 | .init_machine = stamp9g20_board_init, | 314 | .init_machine = stamp9g20evb_board_init, |
| 311 | MACHINE_END | 315 | MACHINE_END |
diff --git a/arch/arm/mach-at91/clock.c b/arch/arm/mach-at91/clock.c index 7525cee3983..9113da6845f 100644 --- a/arch/arm/mach-at91/clock.c +++ b/arch/arm/mach-at91/clock.c | |||
| @@ -658,7 +658,7 @@ static void __init at91_upll_usbfs_clock_init(unsigned long main_clock) | |||
| 658 | /* Now set uhpck values */ | 658 | /* Now set uhpck values */ |
| 659 | uhpck.parent = &utmi_clk; | 659 | uhpck.parent = &utmi_clk; |
| 660 | uhpck.pmc_mask = AT91SAM926x_PMC_UHP; | 660 | uhpck.pmc_mask = AT91SAM926x_PMC_UHP; |
| 661 | uhpck.rate_hz = utmi_clk.parent->rate_hz; | 661 | uhpck.rate_hz = utmi_clk.rate_hz; |
| 662 | uhpck.rate_hz /= 1 + ((at91_sys_read(AT91_PMC_USB) & AT91_PMC_OHCIUSBDIV) >> 8); | 662 | uhpck.rate_hz /= 1 + ((at91_sys_read(AT91_PMC_USB) & AT91_PMC_OHCIUSBDIV) >> 8); |
| 663 | } | 663 | } |
| 664 | 664 | ||
diff --git a/arch/arm/mach-at91/include/mach/at91_mci.h b/arch/arm/mach-at91/include/mach/at91_mci.h index 57f8ee15494..27ac6f550fe 100644 --- a/arch/arm/mach-at91/include/mach/at91_mci.h +++ b/arch/arm/mach-at91/include/mach/at91_mci.h | |||
| @@ -74,6 +74,8 @@ | |||
| 74 | #define AT91_MCI_TRTYP_BLOCK (0 << 19) | 74 | #define AT91_MCI_TRTYP_BLOCK (0 << 19) |
| 75 | #define AT91_MCI_TRTYP_MULTIPLE (1 << 19) | 75 | #define AT91_MCI_TRTYP_MULTIPLE (1 << 19) |
| 76 | #define AT91_MCI_TRTYP_STREAM (2 << 19) | 76 | #define AT91_MCI_TRTYP_STREAM (2 << 19) |
| 77 | #define AT91_MCI_TRTYP_SDIO_BYTE (4 << 19) | ||
| 78 | #define AT91_MCI_TRTYP_SDIO_BLOCK (5 << 19) | ||
| 77 | 79 | ||
| 78 | #define AT91_MCI_BLKR 0x18 /* Block Register */ | 80 | #define AT91_MCI_BLKR 0x18 /* Block Register */ |
| 79 | #define AT91_MCI_BLKR_BCNT(n) ((0xffff & (n)) << 0) /* Block count */ | 81 | #define AT91_MCI_BLKR_BCNT(n) ((0xffff & (n)) << 0) /* Block count */ |
diff --git a/arch/arm/mach-at91/include/mach/stamp9g20.h b/arch/arm/mach-at91/include/mach/stamp9g20.h new file mode 100644 index 00000000000..6120f9c46d5 --- /dev/null +++ b/arch/arm/mach-at91/include/mach/stamp9g20.h | |||
| @@ -0,0 +1,7 @@ | |||
| 1 | #ifndef __MACH_STAMP9G20_H | ||
| 2 | #define __MACH_STAMP9G20_H | ||
| 3 | |||
| 4 | void stamp9g20_map_io(void); | ||
| 5 | void stamp9g20_board_init(void); | ||
| 6 | |||
| 7 | #endif | ||
diff --git a/arch/arm/mach-ixp4xx/common-pci.c b/arch/arm/mach-ixp4xx/common-pci.c index 24498a932ba..a54b3db8036 100644 --- a/arch/arm/mach-ixp4xx/common-pci.c +++ b/arch/arm/mach-ixp4xx/common-pci.c | |||
| @@ -513,4 +513,4 @@ int dma_set_coherent_mask(struct device *dev, u64 mask) | |||
| 513 | 513 | ||
| 514 | EXPORT_SYMBOL(ixp4xx_pci_read); | 514 | EXPORT_SYMBOL(ixp4xx_pci_read); |
| 515 | EXPORT_SYMBOL(ixp4xx_pci_write); | 515 | EXPORT_SYMBOL(ixp4xx_pci_write); |
| 516 | 516 | EXPORT_SYMBOL(dma_set_coherent_mask); | |
diff --git a/arch/arm/mach-mmp/mmp2.c b/arch/arm/mach-mmp/mmp2.c index daf3993349f..2e3dd08ccc3 100644 --- a/arch/arm/mach-mmp/mmp2.c +++ b/arch/arm/mach-mmp/mmp2.c | |||
| @@ -126,7 +126,6 @@ static APBC_CLK(twsi3, MMP2_TWSI3, 0, 26000000); | |||
| 126 | static APBC_CLK(twsi4, MMP2_TWSI4, 0, 26000000); | 126 | static APBC_CLK(twsi4, MMP2_TWSI4, 0, 26000000); |
| 127 | static APBC_CLK(twsi5, MMP2_TWSI5, 0, 26000000); | 127 | static APBC_CLK(twsi5, MMP2_TWSI5, 0, 26000000); |
| 128 | static APBC_CLK(twsi6, MMP2_TWSI6, 0, 26000000); | 128 | static APBC_CLK(twsi6, MMP2_TWSI6, 0, 26000000); |
| 129 | static APBC_CLK(rtc, MMP2_RTC, 0, 32768); | ||
| 130 | 129 | ||
| 131 | static APMU_CLK(nand, NAND, 0xbf, 100000000); | 130 | static APMU_CLK(nand, NAND, 0xbf, 100000000); |
| 132 | 131 | ||
diff --git a/arch/arm/mach-msm/Kconfig b/arch/arm/mach-msm/Kconfig index dbbcfeb919d..1a11f1ed216 100644 --- a/arch/arm/mach-msm/Kconfig +++ b/arch/arm/mach-msm/Kconfig | |||
| @@ -44,6 +44,7 @@ config ARCH_MSM8X60 | |||
| 44 | select CPU_V7 | 44 | select CPU_V7 |
| 45 | select MSM_V2_TLMM | 45 | select MSM_V2_TLMM |
| 46 | select MSM_GPIOMUX | 46 | select MSM_GPIOMUX |
| 47 | select IOMMU_API | ||
| 47 | 48 | ||
| 48 | endchoice | 49 | endchoice |
| 49 | 50 | ||
| @@ -122,6 +123,10 @@ config MACH_MSM8X60_FFA | |||
| 122 | 123 | ||
| 123 | endmenu | 124 | endmenu |
| 124 | 125 | ||
| 126 | config IOMMU_PGTABLES_L2 | ||
| 127 | def_bool y | ||
| 128 | depends on ARCH_MSM8X60 && MMU && SMP && CPU_DCACHE_DISABLE=n | ||
| 129 | |||
| 125 | config MSM_DEBUG_UART | 130 | config MSM_DEBUG_UART |
| 126 | int | 131 | int |
| 127 | default 1 if MSM_DEBUG_UART1 | 132 | default 1 if MSM_DEBUG_UART1 |
| @@ -162,4 +167,7 @@ config MSM_GPIOMUX | |||
| 162 | 167 | ||
| 163 | config MSM_V2_TLMM | 168 | config MSM_V2_TLMM |
| 164 | bool | 169 | bool |
| 170 | |||
| 171 | config IOMMU_API | ||
| 172 | bool | ||
| 165 | endif | 173 | endif |
diff --git a/arch/arm/mach-msm/Makefile b/arch/arm/mach-msm/Makefile index b5a7b07a44f..59646bbd619 100644 --- a/arch/arm/mach-msm/Makefile +++ b/arch/arm/mach-msm/Makefile | |||
| @@ -20,6 +20,7 @@ obj-$(CONFIG_MSM_SMD) += smd.o smd_debug.o | |||
| 20 | obj-$(CONFIG_MSM_SMD) += last_radio_log.o | 20 | obj-$(CONFIG_MSM_SMD) += last_radio_log.o |
| 21 | 21 | ||
| 22 | obj-$(CONFIG_MACH_TROUT) += board-trout.o board-trout-gpio.o board-trout-mmc.o devices-msm7x00.o | 22 | obj-$(CONFIG_MACH_TROUT) += board-trout.o board-trout-gpio.o board-trout-mmc.o devices-msm7x00.o |
| 23 | obj-$(CONFIG_MACH_TROUT) += board-trout.o board-trout-gpio.o board-trout-mmc.o board-trout-panel.o devices-msm7x00.o | ||
| 23 | obj-$(CONFIG_MACH_HALIBUT) += board-halibut.o devices-msm7x00.o | 24 | obj-$(CONFIG_MACH_HALIBUT) += board-halibut.o devices-msm7x00.o |
| 24 | obj-$(CONFIG_ARCH_MSM7X30) += board-msm7x30.o devices-msm7x30.o | 25 | obj-$(CONFIG_ARCH_MSM7X30) += board-msm7x30.o devices-msm7x30.o |
| 25 | obj-$(CONFIG_ARCH_QSD8X50) += board-qsd8x50.o devices-qsd8x50.o | 26 | obj-$(CONFIG_ARCH_QSD8X50) += board-qsd8x50.o devices-qsd8x50.o |
| @@ -28,6 +29,8 @@ obj-$(CONFIG_ARCH_MSM8X60) += board-msm8x60.o | |||
| 28 | obj-$(CONFIG_ARCH_MSM7X30) += gpiomux-7x30.o gpiomux-v1.o gpiomux.o | 29 | obj-$(CONFIG_ARCH_MSM7X30) += gpiomux-7x30.o gpiomux-v1.o gpiomux.o |
| 29 | obj-$(CONFIG_ARCH_QSD8X50) += gpiomux-8x50.o gpiomux-v1.o gpiomux.o | 30 | obj-$(CONFIG_ARCH_QSD8X50) += gpiomux-8x50.o gpiomux-v1.o gpiomux.o |
| 30 | obj-$(CONFIG_ARCH_MSM8X60) += gpiomux-8x60.o gpiomux-v2.o gpiomux.o | 31 | obj-$(CONFIG_ARCH_MSM8X60) += gpiomux-8x60.o gpiomux-v2.o gpiomux.o |
| 31 | ifndef CONFIG_MSM_V2_TLMM | 32 | ifdef CONFIG_MSM_V2_TLMM |
| 33 | obj-y += gpio-v2.o | ||
| 34 | else | ||
| 32 | obj-y += gpio.o | 35 | obj-y += gpio.o |
| 33 | endif | 36 | endif |
diff --git a/arch/arm/mach-msm/board-msm7x30.c b/arch/arm/mach-msm/board-msm7x30.c index 05241df3f9b..6f3b9735e97 100644 --- a/arch/arm/mach-msm/board-msm7x30.c +++ b/arch/arm/mach-msm/board-msm7x30.c | |||
| @@ -22,6 +22,7 @@ | |||
| 22 | #include <linux/delay.h> | 22 | #include <linux/delay.h> |
| 23 | #include <linux/io.h> | 23 | #include <linux/io.h> |
| 24 | #include <linux/smsc911x.h> | 24 | #include <linux/smsc911x.h> |
| 25 | #include <linux/usb/msm_hsusb.h> | ||
| 25 | 26 | ||
| 26 | #include <asm/mach-types.h> | 27 | #include <asm/mach-types.h> |
| 27 | #include <asm/mach/arch.h> | 28 | #include <asm/mach/arch.h> |
| @@ -39,11 +40,26 @@ | |||
| 39 | 40 | ||
| 40 | extern struct sys_timer msm_timer; | 41 | extern struct sys_timer msm_timer; |
| 41 | 42 | ||
| 43 | static int hsusb_phy_init_seq[] = { | ||
| 44 | 0x30, 0x32, /* Enable and set Pre-Emphasis Depth to 20% */ | ||
| 45 | 0x02, 0x36, /* Disable CDR Auto Reset feature */ | ||
| 46 | -1 | ||
| 47 | }; | ||
| 48 | |||
| 49 | static struct msm_otg_platform_data msm_otg_pdata = { | ||
| 50 | .phy_init_seq = hsusb_phy_init_seq, | ||
| 51 | .mode = USB_PERIPHERAL, | ||
| 52 | .otg_control = OTG_PHY_CONTROL, | ||
| 53 | }; | ||
| 54 | |||
| 42 | static struct platform_device *devices[] __initdata = { | 55 | static struct platform_device *devices[] __initdata = { |
| 43 | #if defined(CONFIG_SERIAL_MSM) || defined(CONFIG_MSM_SERIAL_DEBUGGER) | 56 | #if defined(CONFIG_SERIAL_MSM) || defined(CONFIG_MSM_SERIAL_DEBUGGER) |
| 44 | &msm_device_uart2, | 57 | &msm_device_uart2, |
| 45 | #endif | 58 | #endif |
| 46 | &msm_device_smd, | 59 | &msm_device_smd, |
| 60 | &msm_device_otg, | ||
| 61 | &msm_device_hsusb, | ||
| 62 | &msm_device_hsusb_host, | ||
| 47 | }; | 63 | }; |
| 48 | 64 | ||
| 49 | static void __init msm7x30_init_irq(void) | 65 | static void __init msm7x30_init_irq(void) |
| @@ -53,6 +69,10 @@ static void __init msm7x30_init_irq(void) | |||
| 53 | 69 | ||
| 54 | static void __init msm7x30_init(void) | 70 | static void __init msm7x30_init(void) |
| 55 | { | 71 | { |
| 72 | msm_device_otg.dev.platform_data = &msm_otg_pdata; | ||
| 73 | msm_device_hsusb.dev.parent = &msm_device_otg.dev; | ||
| 74 | msm_device_hsusb_host.dev.parent = &msm_device_otg.dev; | ||
| 75 | |||
| 56 | platform_add_devices(devices, ARRAY_SIZE(devices)); | 76 | platform_add_devices(devices, ARRAY_SIZE(devices)); |
| 57 | } | 77 | } |
| 58 | 78 | ||
diff --git a/arch/arm/mach-msm/board-qsd8x50.c b/arch/arm/mach-msm/board-qsd8x50.c index ed2af4ad97e..2e8391307f5 100644 --- a/arch/arm/mach-msm/board-qsd8x50.c +++ b/arch/arm/mach-msm/board-qsd8x50.c | |||
| @@ -20,6 +20,7 @@ | |||
| 20 | #include <linux/gpio.h> | 20 | #include <linux/gpio.h> |
| 21 | #include <linux/platform_device.h> | 21 | #include <linux/platform_device.h> |
| 22 | #include <linux/delay.h> | 22 | #include <linux/delay.h> |
| 23 | #include <linux/usb/msm_hsusb.h> | ||
| 23 | 24 | ||
| 24 | #include <asm/mach-types.h> | 25 | #include <asm/mach-types.h> |
| 25 | #include <asm/mach/arch.h> | 26 | #include <asm/mach/arch.h> |
| @@ -74,9 +75,24 @@ static int __init msm_init_smc91x(void) | |||
| 74 | } | 75 | } |
| 75 | module_init(msm_init_smc91x); | 76 | module_init(msm_init_smc91x); |
| 76 | 77 | ||
| 78 | static int hsusb_phy_init_seq[] = { | ||
| 79 | 0x08, 0x31, /* Increase HS Driver Amplitude */ | ||
| 80 | 0x20, 0x32, /* Enable and set Pre-Emphasis Depth to 10% */ | ||
| 81 | -1 | ||
| 82 | }; | ||
| 83 | |||
| 84 | static struct msm_otg_platform_data msm_otg_pdata = { | ||
| 85 | .phy_init_seq = hsusb_phy_init_seq, | ||
| 86 | .mode = USB_PERIPHERAL, | ||
| 87 | .otg_control = OTG_PHY_CONTROL, | ||
| 88 | }; | ||
| 89 | |||
| 77 | static struct platform_device *devices[] __initdata = { | 90 | static struct platform_device *devices[] __initdata = { |
| 78 | &msm_device_uart3, | 91 | &msm_device_uart3, |
| 79 | &msm_device_smd, | 92 | &msm_device_smd, |
| 93 | &msm_device_otg, | ||
| 94 | &msm_device_hsusb, | ||
| 95 | &msm_device_hsusb_host, | ||
| 80 | }; | 96 | }; |
| 81 | 97 | ||
| 82 | static void __init qsd8x50_map_io(void) | 98 | static void __init qsd8x50_map_io(void) |
| @@ -93,6 +109,9 @@ static void __init qsd8x50_init_irq(void) | |||
| 93 | 109 | ||
| 94 | static void __init qsd8x50_init(void) | 110 | static void __init qsd8x50_init(void) |
| 95 | { | 111 | { |
| 112 | msm_device_otg.dev.platform_data = &msm_otg_pdata; | ||
| 113 | msm_device_hsusb.dev.parent = &msm_device_otg.dev; | ||
| 114 | msm_device_hsusb_host.dev.parent = &msm_device_otg.dev; | ||
| 96 | platform_add_devices(devices, ARRAY_SIZE(devices)); | 115 | platform_add_devices(devices, ARRAY_SIZE(devices)); |
| 97 | } | 116 | } |
| 98 | 117 | ||
diff --git a/arch/arm/mach-msm/board-trout-gpio.c b/arch/arm/mach-msm/board-trout-gpio.c index c50f3afc313..f8c09ef6666 100644 --- a/arch/arm/mach-msm/board-trout-gpio.c +++ b/arch/arm/mach-msm/board-trout-gpio.c | |||
| @@ -72,6 +72,13 @@ static int msm_gpiolib_direction_output(struct gpio_chip *chip, | |||
| 72 | return 0; | 72 | return 0; |
| 73 | } | 73 | } |
| 74 | 74 | ||
| 75 | static int trout_gpio_to_irq(struct gpio_chip *chip, unsigned offset) | ||
| 76 | { | ||
| 77 | struct msm_gpio_chip *msm_gpio = to_msm_gpio_chip(chip); | ||
| 78 | |||
| 79 | return TROUT_GPIO_TO_INT(offset + chip->base); | ||
| 80 | } | ||
| 81 | |||
| 75 | #define TROUT_GPIO_BANK(name, reg_num, base_gpio, shadow_val) \ | 82 | #define TROUT_GPIO_BANK(name, reg_num, base_gpio, shadow_val) \ |
| 76 | { \ | 83 | { \ |
| 77 | .chip = { \ | 84 | .chip = { \ |
| @@ -80,6 +87,7 @@ static int msm_gpiolib_direction_output(struct gpio_chip *chip, | |||
| 80 | .direction_output = msm_gpiolib_direction_output, \ | 87 | .direction_output = msm_gpiolib_direction_output, \ |
| 81 | .get = msm_gpiolib_get, \ | 88 | .get = msm_gpiolib_get, \ |
| 82 | .set = msm_gpiolib_set, \ | 89 | .set = msm_gpiolib_set, \ |
| 90 | .to_irq = trout_gpio_to_irq, \ | ||
| 83 | .base = base_gpio, \ | 91 | .base = base_gpio, \ |
| 84 | .ngpio = 8, \ | 92 | .ngpio = 8, \ |
| 85 | }, \ | 93 | }, \ |
diff --git a/arch/arm/mach-msm/board-trout-panel.c b/arch/arm/mach-msm/board-trout-panel.c new file mode 100644 index 00000000000..729bb49a44c --- /dev/null +++ b/arch/arm/mach-msm/board-trout-panel.c | |||
| @@ -0,0 +1,297 @@ | |||
| 1 | /* linux/arch/arm/mach-msm/board-trout-mddi.c | ||
| 2 | ** Author: Brian Swetland <swetland@google.com> | ||
| 3 | */ | ||
| 4 | |||
| 5 | #include <linux/kernel.h> | ||
| 6 | #include <linux/init.h> | ||
| 7 | #include <linux/platform_device.h> | ||
| 8 | #include <linux/delay.h> | ||
| 9 | #include <linux/leds.h> | ||
| 10 | #include <linux/clk.h> | ||
| 11 | #include <linux/err.h> | ||
| 12 | |||
| 13 | #include <asm/io.h> | ||
| 14 | #include <asm/gpio.h> | ||
| 15 | #include <asm/mach-types.h> | ||
| 16 | |||
| 17 | #include <mach/msm_fb.h> | ||
| 18 | #include <mach/vreg.h> | ||
| 19 | |||
| 20 | #include "board-trout.h" | ||
| 21 | #include "proc_comm.h" | ||
| 22 | #include "devices.h" | ||
| 23 | |||
| 24 | #define TROUT_DEFAULT_BACKLIGHT_BRIGHTNESS 255 | ||
| 25 | |||
| 26 | #define MDDI_CLIENT_CORE_BASE 0x108000 | ||
| 27 | #define LCD_CONTROL_BLOCK_BASE 0x110000 | ||
| 28 | #define SPI_BLOCK_BASE 0x120000 | ||
| 29 | #define I2C_BLOCK_BASE 0x130000 | ||
| 30 | #define PWM_BLOCK_BASE 0x140000 | ||
| 31 | #define GPIO_BLOCK_BASE 0x150000 | ||
| 32 | #define SYSTEM_BLOCK1_BASE 0x160000 | ||
| 33 | #define SYSTEM_BLOCK2_BASE 0x170000 | ||
| 34 | |||
| 35 | |||
| 36 | #define DPSUS (MDDI_CLIENT_CORE_BASE|0x24) | ||
| 37 | #define SYSCLKENA (MDDI_CLIENT_CORE_BASE|0x2C) | ||
| 38 | #define PWM0OFF (PWM_BLOCK_BASE|0x1C) | ||
| 39 | |||
| 40 | #define V_VDDE2E_VDD2_GPIO 0 | ||
| 41 | #define MDDI_RST_N 82 | ||
| 42 | |||
| 43 | #define MDDICAP0 (MDDI_CLIENT_CORE_BASE|0x00) | ||
| 44 | #define MDDICAP1 (MDDI_CLIENT_CORE_BASE|0x04) | ||
| 45 | #define MDDICAP2 (MDDI_CLIENT_CORE_BASE|0x08) | ||
| 46 | #define MDDICAP3 (MDDI_CLIENT_CORE_BASE|0x0C) | ||
| 47 | #define MDCAPCHG (MDDI_CLIENT_CORE_BASE|0x10) | ||
| 48 | #define MDCRCERC (MDDI_CLIENT_CORE_BASE|0x14) | ||
| 49 | #define TTBUSSEL (MDDI_CLIENT_CORE_BASE|0x18) | ||
| 50 | #define DPSET0 (MDDI_CLIENT_CORE_BASE|0x1C) | ||
| 51 | #define DPSET1 (MDDI_CLIENT_CORE_BASE|0x20) | ||
| 52 | #define DPSUS (MDDI_CLIENT_CORE_BASE|0x24) | ||
| 53 | #define DPRUN (MDDI_CLIENT_CORE_BASE|0x28) | ||
| 54 | #define SYSCKENA (MDDI_CLIENT_CORE_BASE|0x2C) | ||
| 55 | #define TESTMODE (MDDI_CLIENT_CORE_BASE|0x30) | ||
| 56 | #define FIFOMONI (MDDI_CLIENT_CORE_BASE|0x34) | ||
| 57 | #define INTMONI (MDDI_CLIENT_CORE_BASE|0x38) | ||
| 58 | #define MDIOBIST (MDDI_CLIENT_CORE_BASE|0x3C) | ||
| 59 | #define MDIOPSET (MDDI_CLIENT_CORE_BASE|0x40) | ||
| 60 | #define BITMAP0 (MDDI_CLIENT_CORE_BASE|0x44) | ||
| 61 | #define BITMAP1 (MDDI_CLIENT_CORE_BASE|0x48) | ||
| 62 | #define BITMAP2 (MDDI_CLIENT_CORE_BASE|0x4C) | ||
| 63 | #define BITMAP3 (MDDI_CLIENT_CORE_BASE|0x50) | ||
| 64 | #define BITMAP4 (MDDI_CLIENT_CORE_BASE|0x54) | ||
| 65 | |||
| 66 | #define SRST (LCD_CONTROL_BLOCK_BASE|0x00) | ||
| 67 | #define PORT_ENB (LCD_CONTROL_BLOCK_BASE|0x04) | ||
| 68 | #define START (LCD_CONTROL_BLOCK_BASE|0x08) | ||
| 69 | #define PORT (LCD_CONTROL_BLOCK_BASE|0x0C) | ||
| 70 | #define CMN (LCD_CONTROL_BLOCK_BASE|0x10) | ||
| 71 | #define GAMMA (LCD_CONTROL_BLOCK_BASE|0x14) | ||
| 72 | #define INTFLG (LCD_CONTROL_BLOCK_BASE|0x18) | ||
| 73 | #define INTMSK (LCD_CONTROL_BLOCK_BASE|0x1C) | ||
| 74 | #define MPLFBUF (LCD_CONTROL_BLOCK_BASE|0x20) | ||
| 75 | #define HDE_LEFT (LCD_CONTROL_BLOCK_BASE|0x24) | ||
| 76 | #define VDE_TOP (LCD_CONTROL_BLOCK_BASE|0x28) | ||
| 77 | #define PXL (LCD_CONTROL_BLOCK_BASE|0x30) | ||
| 78 | #define HCYCLE (LCD_CONTROL_BLOCK_BASE|0x34) | ||
| 79 | #define HSW (LCD_CONTROL_BLOCK_BASE|0x38) | ||
| 80 | #define HDE_START (LCD_CONTROL_BLOCK_BASE|0x3C) | ||
| 81 | #define HDE_SIZE (LCD_CONTROL_BLOCK_BASE|0x40) | ||
| 82 | #define VCYCLE (LCD_CONTROL_BLOCK_BASE|0x44) | ||
| 83 | #define VSW (LCD_CONTROL_BLOCK_BASE|0x48) | ||
| 84 | #define VDE_START (LCD_CONTROL_BLOCK_BASE|0x4C) | ||
| 85 | #define VDE_SIZE (LCD_CONTROL_BLOCK_BASE|0x50) | ||
| 86 | #define WAKEUP (LCD_CONTROL_BLOCK_BASE|0x54) | ||
| 87 | #define WSYN_DLY (LCD_CONTROL_BLOCK_BASE|0x58) | ||
| 88 | #define REGENB (LCD_CONTROL_BLOCK_BASE|0x5C) | ||
| 89 | #define VSYNIF (LCD_CONTROL_BLOCK_BASE|0x60) | ||
| 90 | #define WRSTB (LCD_CONTROL_BLOCK_BASE|0x64) | ||
| 91 | #define RDSTB (LCD_CONTROL_BLOCK_BASE|0x68) | ||
| 92 | #define ASY_DATA (LCD_CONTROL_BLOCK_BASE|0x6C) | ||
| 93 | #define ASY_DATB (LCD_CONTROL_BLOCK_BASE|0x70) | ||
| 94 | #define ASY_DATC (LCD_CONTROL_BLOCK_BASE|0x74) | ||
| 95 | #define ASY_DATD (LCD_CONTROL_BLOCK_BASE|0x78) | ||
| 96 | #define ASY_DATE (LCD_CONTROL_BLOCK_BASE|0x7C) | ||
| 97 | #define ASY_DATF (LCD_CONTROL_BLOCK_BASE|0x80) | ||
| 98 | #define ASY_DATG (LCD_CONTROL_BLOCK_BASE|0x84) | ||
| 99 | #define ASY_DATH (LCD_CONTROL_BLOCK_BASE|0x88) | ||
| 100 | #define ASY_CMDSET (LCD_CONTROL_BLOCK_BASE|0x8C) | ||
| 101 | |||
| 102 | #define SSICTL (SPI_BLOCK_BASE|0x00) | ||
| 103 | #define SSITIME (SPI_BLOCK_BASE|0x04) | ||
| 104 | #define SSITX (SPI_BLOCK_BASE|0x08) | ||
| 105 | #define SSIRX (SPI_BLOCK_BASE|0x0C) | ||
| 106 | #define SSIINTC (SPI_BLOCK_BASE|0x10) | ||
| 107 | #define SSIINTS (SPI_BLOCK_BASE|0x14) | ||
| 108 | #define SSIDBG1 (SPI_BLOCK_BASE|0x18) | ||
| 109 | #define SSIDBG2 (SPI_BLOCK_BASE|0x1C) | ||
| 110 | #define SSIID (SPI_BLOCK_BASE|0x20) | ||
| 111 | |||
| 112 | #define WKREQ (SYSTEM_BLOCK1_BASE|0x00) | ||
| 113 | #define CLKENB (SYSTEM_BLOCK1_BASE|0x04) | ||
| 114 | #define DRAMPWR (SYSTEM_BLOCK1_BASE|0x08) | ||
| 115 | #define INTMASK (SYSTEM_BLOCK1_BASE|0x0C) | ||
| 116 | #define GPIOSEL (SYSTEM_BLOCK2_BASE|0x00) | ||
| 117 | |||
| 118 | #define GPIODATA (GPIO_BLOCK_BASE|0x00) | ||
| 119 | #define GPIODIR (GPIO_BLOCK_BASE|0x04) | ||
| 120 | #define GPIOIS (GPIO_BLOCK_BASE|0x08) | ||
| 121 | #define GPIOIBE (GPIO_BLOCK_BASE|0x0C) | ||
| 122 | #define GPIOIEV (GPIO_BLOCK_BASE|0x10) | ||
| 123 | #define GPIOIE (GPIO_BLOCK_BASE|0x14) | ||
| 124 | #define GPIORIS (GPIO_BLOCK_BASE|0x18) | ||
| 125 | #define GPIOMIS (GPIO_BLOCK_BASE|0x1C) | ||
| 126 | #define GPIOIC (GPIO_BLOCK_BASE|0x20) | ||
| 127 | #define GPIOOMS (GPIO_BLOCK_BASE|0x24) | ||
| 128 | #define GPIOPC (GPIO_BLOCK_BASE|0x28) | ||
| 129 | #define GPIOID (GPIO_BLOCK_BASE|0x30) | ||
| 130 | |||
| 131 | #define SPI_WRITE(reg, val) \ | ||
| 132 | { SSITX, 0x00010000 | (((reg) & 0xff) << 8) | ((val) & 0xff) }, \ | ||
| 133 | { 0, 5 }, | ||
| 134 | |||
| 135 | #define SPI_WRITE1(reg) \ | ||
| 136 | { SSITX, (reg) & 0xff }, \ | ||
| 137 | { 0, 5 }, | ||
| 138 | |||
| 139 | struct mddi_table { | ||
| 140 | uint32_t reg; | ||
| 141 | uint32_t value; | ||
| 142 | }; | ||
| 143 | static struct mddi_table mddi_toshiba_init_table[] = { | ||
| 144 | { DPSET0, 0x09e90046 }, | ||
| 145 | { DPSET1, 0x00000118 }, | ||
| 146 | { DPSUS, 0x00000000 }, | ||
| 147 | { DPRUN, 0x00000001 }, | ||
| 148 | { 1, 14 }, /* msleep 14 */ | ||
| 149 | { SYSCKENA, 0x00000001 }, | ||
| 150 | { CLKENB, 0x0000A1EF }, /* # SYS.CLKENB # Enable clocks for each module (without DCLK , i2cCLK) */ | ||
| 151 | |||
| 152 | { GPIODATA, 0x02000200 }, /* # GPI .GPIODATA # GPIO2(RESET_LCD_N) set to 0 , GPIO3(eDRAM_Power) set to 0 */ | ||
| 153 | { GPIODIR, 0x000030D }, /* 24D # GPI .GPIODIR # Select direction of GPIO port (0,2,3,6,9 output) */ | ||
| 154 | { GPIOSEL, 0/*0x00000173*/}, /* # SYS.GPIOSEL # GPIO port multiplexing control */ | ||
| 155 | { GPIOPC, 0x03C300C0 }, /* # GPI .GPIOPC # GPIO2,3 PD cut */ | ||
| 156 | { WKREQ, 0x00000000 }, /* # SYS.WKREQ # Wake-up request event is VSYNC alignment */ | ||
| 157 | |||
| 158 | { GPIOIBE, 0x000003FF }, | ||
| 159 | { GPIOIS, 0x00000000 }, | ||
| 160 | { GPIOIC, 0x000003FF }, | ||
| 161 | { GPIOIE, 0x00000000 }, | ||
| 162 | |||
| 163 | { GPIODATA, 0x00040004 }, /* # GPI .GPIODATA # eDRAM VD supply */ | ||
| 164 | { 1, 1 }, /* msleep 1 */ | ||
| 165 | { GPIODATA, 0x02040004 }, /* # GPI .GPIODATA # eDRAM VD supply */ | ||
| 166 | { DRAMPWR, 0x00000001 }, /* eDRAM power */ | ||
| 167 | }; | ||
| 168 | |||
| 169 | #define GPIOSEL_VWAKEINT (1U << 0) | ||
| 170 | #define INTMASK_VWAKEOUT (1U << 0) | ||
| 171 | |||
| 172 | |||
| 173 | static struct clk *gp_clk; | ||
| 174 | static int trout_new_backlight = 1; | ||
| 175 | static struct vreg *vreg_mddi_1v5; | ||
| 176 | static struct vreg *vreg_lcm_2v85; | ||
| 177 | |||
| 178 | static void trout_process_mddi_table(struct msm_mddi_client_data *client_data, | ||
| 179 | struct mddi_table *table, size_t count) | ||
| 180 | { | ||
| 181 | int i; | ||
| 182 | for (i = 0; i < count; i++) { | ||
| 183 | uint32_t reg = table[i].reg; | ||
| 184 | uint32_t value = table[i].value; | ||
| 185 | |||
| 186 | if (reg == 0) | ||
| 187 | udelay(value); | ||
| 188 | else if (reg == 1) | ||
| 189 | msleep(value); | ||
| 190 | else | ||
| 191 | client_data->remote_write(client_data, value, reg); | ||
| 192 | } | ||
| 193 | } | ||
| 194 | |||
| 195 | static int trout_mddi_toshiba_client_init( | ||
| 196 | struct msm_mddi_bridge_platform_data *bridge_data, | ||
| 197 | struct msm_mddi_client_data *client_data) | ||
| 198 | { | ||
| 199 | int panel_id; | ||
| 200 | |||
| 201 | client_data->auto_hibernate(client_data, 0); | ||
| 202 | trout_process_mddi_table(client_data, mddi_toshiba_init_table, | ||
| 203 | ARRAY_SIZE(mddi_toshiba_init_table)); | ||
| 204 | client_data->auto_hibernate(client_data, 1); | ||
| 205 | panel_id = (client_data->remote_read(client_data, GPIODATA) >> 4) & 3; | ||
| 206 | if (panel_id > 1) { | ||
| 207 | printk(KERN_WARNING "unknown panel id at mddi_enable\n"); | ||
| 208 | return -1; | ||
| 209 | } | ||
| 210 | return 0; | ||
| 211 | } | ||
| 212 | |||
| 213 | static int trout_mddi_toshiba_client_uninit( | ||
| 214 | struct msm_mddi_bridge_platform_data *bridge_data, | ||
| 215 | struct msm_mddi_client_data *client_data) | ||
| 216 | { | ||
| 217 | return 0; | ||
| 218 | } | ||
| 219 | |||
| 220 | static struct resource resources_msm_fb[] = { | ||
| 221 | { | ||
| 222 | .start = MSM_FB_BASE, | ||
| 223 | .end = MSM_FB_BASE + MSM_FB_SIZE, | ||
| 224 | .flags = IORESOURCE_MEM, | ||
| 225 | }, | ||
| 226 | }; | ||
| 227 | |||
| 228 | struct msm_mddi_bridge_platform_data toshiba_client_data = { | ||
| 229 | .init = trout_mddi_toshiba_client_init, | ||
| 230 | .uninit = trout_mddi_toshiba_client_uninit, | ||
| 231 | .fb_data = { | ||
| 232 | .xres = 320, | ||
| 233 | .yres = 480, | ||
| 234 | .width = 45, | ||
| 235 | .height = 67, | ||
| 236 | .output_format = 0, | ||
| 237 | }, | ||
| 238 | }; | ||
| 239 | |||
| 240 | static struct msm_mddi_platform_data mddi_pdata = { | ||
| 241 | .clk_rate = 122880000, | ||
| 242 | .fb_resource = resources_msm_fb, | ||
| 243 | .num_clients = 1, | ||
| 244 | .client_platform_data = { | ||
| 245 | { | ||
| 246 | .product_id = (0xd263 << 16 | 0), | ||
| 247 | .name = "mddi_c_d263_0000", | ||
| 248 | .id = 0, | ||
| 249 | .client_data = &toshiba_client_data, | ||
| 250 | .clk_rate = 0, | ||
| 251 | }, | ||
| 252 | }, | ||
| 253 | }; | ||
| 254 | |||
| 255 | int __init trout_init_panel(void) | ||
| 256 | { | ||
| 257 | int rc; | ||
| 258 | |||
| 259 | if (!machine_is_trout()) | ||
| 260 | return 0; | ||
| 261 | vreg_mddi_1v5 = vreg_get(0, "gp2"); | ||
| 262 | if (IS_ERR(vreg_mddi_1v5)) | ||
| 263 | return PTR_ERR(vreg_mddi_1v5); | ||
| 264 | vreg_lcm_2v85 = vreg_get(0, "gp4"); | ||
| 265 | if (IS_ERR(vreg_lcm_2v85)) | ||
| 266 | return PTR_ERR(vreg_lcm_2v85); | ||
| 267 | |||
| 268 | trout_new_backlight = system_rev >= 5; | ||
| 269 | if (trout_new_backlight) { | ||
| 270 | uint32_t config = PCOM_GPIO_CFG(27, 0, GPIO_OUTPUT, | ||
| 271 | GPIO_NO_PULL, GPIO_8MA); | ||
| 272 | msm_proc_comm(PCOM_RPC_GPIO_TLMM_CONFIG_EX, &config, 0); | ||
| 273 | } else { | ||
| 274 | uint32_t config = PCOM_GPIO_CFG(27, 1, GPIO_OUTPUT, | ||
| 275 | GPIO_NO_PULL, GPIO_8MA); | ||
| 276 | msm_proc_comm(PCOM_RPC_GPIO_TLMM_CONFIG_EX, &config, 0); | ||
| 277 | |||
| 278 | gp_clk = clk_get(NULL, "gp_clk"); | ||
| 279 | if (IS_ERR(gp_clk)) { | ||
| 280 | printk(KERN_ERR "trout_init_panel: could not get gp" | ||
| 281 | "clock\n"); | ||
| 282 | gp_clk = NULL; | ||
| 283 | } | ||
| 284 | rc = clk_set_rate(gp_clk, 19200000); | ||
| 285 | if (rc) | ||
| 286 | printk(KERN_ERR "trout_init_panel: set clock rate " | ||
| 287 | "failed\n"); | ||
| 288 | } | ||
| 289 | |||
| 290 | rc = platform_device_register(&msm_device_mdp); | ||
| 291 | if (rc) | ||
| 292 | return rc; | ||
| 293 | msm_device_mddi0.dev.platform_data = &mddi_pdata; | ||
| 294 | return platform_device_register(&msm_device_mddi0); | ||
| 295 | } | ||
| 296 | |||
| 297 | device_initcall(trout_init_panel); | ||
diff --git a/arch/arm/mach-msm/clock.c b/arch/arm/mach-msm/clock.c index c57210f4f06..2069bfaa3a2 100644 --- a/arch/arm/mach-msm/clock.c +++ b/arch/arm/mach-msm/clock.c | |||
| @@ -120,6 +120,21 @@ EXPORT_SYMBOL(clk_get_rate); | |||
| 120 | 120 | ||
| 121 | int clk_set_rate(struct clk *clk, unsigned long rate) | 121 | int clk_set_rate(struct clk *clk, unsigned long rate) |
| 122 | { | 122 | { |
| 123 | int ret; | ||
| 124 | if (clk->flags & CLKFLAG_MAX) { | ||
| 125 | ret = clk->ops->set_max_rate(clk->id, rate); | ||
| 126 | if (ret) | ||
| 127 | return ret; | ||
| 128 | } | ||
| 129 | if (clk->flags & CLKFLAG_MIN) { | ||
| 130 | ret = clk->ops->set_min_rate(clk->id, rate); | ||
| 131 | if (ret) | ||
| 132 | return ret; | ||
| 133 | } | ||
| 134 | |||
| 135 | if (clk->flags & CLKFLAG_MAX || clk->flags & CLKFLAG_MIN) | ||
| 136 | return ret; | ||
| 137 | |||
| 123 | return clk->ops->set_rate(clk->id, rate); | 138 | return clk->ops->set_rate(clk->id, rate); |
| 124 | } | 139 | } |
| 125 | EXPORT_SYMBOL(clk_set_rate); | 140 | EXPORT_SYMBOL(clk_set_rate); |
diff --git a/arch/arm/mach-msm/devices-msm7x00.c b/arch/arm/mach-msm/devices-msm7x00.c index 4e8c0bcdc92..fb548a8a21d 100644 --- a/arch/arm/mach-msm/devices-msm7x00.c +++ b/arch/arm/mach-msm/devices-msm7x00.c | |||
| @@ -347,6 +347,73 @@ int __init msm_add_sdcc(unsigned int controller, | |||
| 347 | return platform_device_register(pdev); | 347 | return platform_device_register(pdev); |
| 348 | } | 348 | } |
| 349 | 349 | ||
| 350 | static struct resource resources_mddi0[] = { | ||
| 351 | { | ||
| 352 | .start = MSM_PMDH_PHYS, | ||
| 353 | .end = MSM_PMDH_PHYS + MSM_PMDH_SIZE - 1, | ||
| 354 | .flags = IORESOURCE_MEM, | ||
| 355 | }, | ||
| 356 | { | ||
| 357 | .start = INT_MDDI_PRI, | ||
| 358 | .end = INT_MDDI_PRI, | ||
| 359 | .flags = IORESOURCE_IRQ, | ||
| 360 | }, | ||
| 361 | }; | ||
| 362 | |||
| 363 | static struct resource resources_mddi1[] = { | ||
| 364 | { | ||
| 365 | .start = MSM_EMDH_PHYS, | ||
| 366 | .end = MSM_EMDH_PHYS + MSM_EMDH_SIZE - 1, | ||
| 367 | .flags = IORESOURCE_MEM, | ||
| 368 | }, | ||
| 369 | { | ||
| 370 | .start = INT_MDDI_EXT, | ||
| 371 | .end = INT_MDDI_EXT, | ||
| 372 | .flags = IORESOURCE_IRQ, | ||
| 373 | }, | ||
| 374 | }; | ||
| 375 | |||
| 376 | struct platform_device msm_device_mddi0 = { | ||
| 377 | .name = "msm_mddi", | ||
| 378 | .id = 0, | ||
| 379 | .num_resources = ARRAY_SIZE(resources_mddi0), | ||
| 380 | .resource = resources_mddi0, | ||
| 381 | .dev = { | ||
| 382 | .coherent_dma_mask = 0xffffffff, | ||
| 383 | }, | ||
| 384 | }; | ||
| 385 | |||
| 386 | struct platform_device msm_device_mddi1 = { | ||
| 387 | .name = "msm_mddi", | ||
| 388 | .id = 1, | ||
| 389 | .num_resources = ARRAY_SIZE(resources_mddi1), | ||
| 390 | .resource = resources_mddi1, | ||
| 391 | .dev = { | ||
| 392 | .coherent_dma_mask = 0xffffffff, | ||
| 393 | }, | ||
| 394 | }; | ||
| 395 | |||
| 396 | static struct resource resources_mdp[] = { | ||
| 397 | { | ||
| 398 | .start = MSM_MDP_PHYS, | ||
| 399 | .end = MSM_MDP_PHYS + MSM_MDP_SIZE - 1, | ||
| 400 | .name = "mdp", | ||
| 401 | .flags = IORESOURCE_MEM | ||
| 402 | }, | ||
| 403 | { | ||
| 404 | .start = INT_MDP, | ||
| 405 | .end = INT_MDP, | ||
| 406 | .flags = IORESOURCE_IRQ, | ||
| 407 | }, | ||
| 408 | }; | ||
| 409 | |||
| 410 | struct platform_device msm_device_mdp = { | ||
| 411 | .name = "msm_mdp", | ||
| 412 | .id = 0, | ||
| 413 | .num_resources = ARRAY_SIZE(resources_mdp), | ||
| 414 | .resource = resources_mdp, | ||
| 415 | }; | ||
| 416 | |||
| 350 | struct clk msm_clocks_7x01a[] = { | 417 | struct clk msm_clocks_7x01a[] = { |
| 351 | CLK_PCOM("adm_clk", ADM_CLK, NULL, 0), | 418 | CLK_PCOM("adm_clk", ADM_CLK, NULL, 0), |
| 352 | CLK_PCOM("adsp_clk", ADSP_CLK, NULL, 0), | 419 | CLK_PCOM("adsp_clk", ADSP_CLK, NULL, 0), |
| @@ -364,7 +431,7 @@ struct clk msm_clocks_7x01a[] = { | |||
| 364 | CLK_PCOM("mdp_clk", MDP_CLK, NULL, OFF), | 431 | CLK_PCOM("mdp_clk", MDP_CLK, NULL, OFF), |
| 365 | CLK_PCOM("pbus_clk", PBUS_CLK, NULL, 0), | 432 | CLK_PCOM("pbus_clk", PBUS_CLK, NULL, 0), |
| 366 | CLK_PCOM("pcm_clk", PCM_CLK, NULL, 0), | 433 | CLK_PCOM("pcm_clk", PCM_CLK, NULL, 0), |
| 367 | CLK_PCOM("pmdh_clk", PMDH_CLK, NULL, OFF ), | 434 | CLK_PCOM("mddi_clk", PMDH_CLK, NULL, OFF | CLK_MINMAX), |
| 368 | CLK_PCOM("sdac_clk", SDAC_CLK, NULL, OFF), | 435 | CLK_PCOM("sdac_clk", SDAC_CLK, NULL, OFF), |
| 369 | CLK_PCOM("sdc_clk", SDC1_CLK, &msm_device_sdc1.dev, OFF), | 436 | CLK_PCOM("sdc_clk", SDC1_CLK, &msm_device_sdc1.dev, OFF), |
| 370 | CLK_PCOM("sdc_pclk", SDC1_P_CLK, &msm_device_sdc1.dev, OFF), | 437 | CLK_PCOM("sdc_pclk", SDC1_P_CLK, &msm_device_sdc1.dev, OFF), |
diff --git a/arch/arm/mach-msm/devices-msm7x30.c b/arch/arm/mach-msm/devices-msm7x30.c index 7fcf2e3b769..4e9a0ab3e93 100644 --- a/arch/arm/mach-msm/devices-msm7x30.c +++ b/arch/arm/mach-msm/devices-msm7x30.c | |||
| @@ -56,6 +56,77 @@ struct platform_device msm_device_smd = { | |||
| 56 | .id = -1, | 56 | .id = -1, |
| 57 | }; | 57 | }; |
| 58 | 58 | ||
| 59 | static struct resource resources_otg[] = { | ||
| 60 | { | ||
| 61 | .start = MSM_HSUSB_PHYS, | ||
| 62 | .end = MSM_HSUSB_PHYS + MSM_HSUSB_SIZE, | ||
| 63 | .flags = IORESOURCE_MEM, | ||
| 64 | }, | ||
| 65 | { | ||
| 66 | .start = INT_USB_HS, | ||
| 67 | .end = INT_USB_HS, | ||
| 68 | .flags = IORESOURCE_IRQ, | ||
| 69 | }, | ||
| 70 | }; | ||
| 71 | |||
| 72 | struct platform_device msm_device_otg = { | ||
| 73 | .name = "msm_otg", | ||
| 74 | .id = -1, | ||
| 75 | .num_resources = ARRAY_SIZE(resources_otg), | ||
| 76 | .resource = resources_otg, | ||
| 77 | .dev = { | ||
| 78 | .coherent_dma_mask = 0xffffffff, | ||
| 79 | }, | ||
| 80 | }; | ||
| 81 | |||
| 82 | static struct resource resources_hsusb[] = { | ||
| 83 | { | ||
| 84 | .start = MSM_HSUSB_PHYS, | ||
| 85 | .end = MSM_HSUSB_PHYS + MSM_HSUSB_SIZE, | ||
| 86 | .flags = IORESOURCE_MEM, | ||
| 87 | }, | ||
| 88 | { | ||
| 89 | .start = INT_USB_HS, | ||
| 90 | .end = INT_USB_HS, | ||
| 91 | .flags = IORESOURCE_IRQ, | ||
| 92 | }, | ||
| 93 | }; | ||
| 94 | |||
| 95 | struct platform_device msm_device_hsusb = { | ||
| 96 | .name = "msm_hsusb", | ||
| 97 | .id = -1, | ||
| 98 | .num_resources = ARRAY_SIZE(resources_hsusb), | ||
| 99 | .resource = resources_hsusb, | ||
| 100 | .dev = { | ||
| 101 | .coherent_dma_mask = 0xffffffff, | ||
| 102 | }, | ||
| 103 | }; | ||
| 104 | |||
| 105 | static u64 dma_mask = 0xffffffffULL; | ||
| 106 | static struct resource resources_hsusb_host[] = { | ||
| 107 | { | ||
| 108 | .start = MSM_HSUSB_PHYS, | ||
| 109 | .end = MSM_HSUSB_PHYS + MSM_HSUSB_SIZE, | ||
| 110 | .flags = IORESOURCE_MEM, | ||
| 111 | }, | ||
| 112 | { | ||
| 113 | .start = INT_USB_HS, | ||
| 114 | .end = INT_USB_HS, | ||
| 115 | .flags = IORESOURCE_IRQ, | ||
| 116 | }, | ||
| 117 | }; | ||
| 118 | |||
| 119 | struct platform_device msm_device_hsusb_host = { | ||
| 120 | .name = "msm_hsusb_host", | ||
| 121 | .id = -1, | ||
| 122 | .num_resources = ARRAY_SIZE(resources_hsusb_host), | ||
| 123 | .resource = resources_hsusb_host, | ||
| 124 | .dev = { | ||
| 125 | .dma_mask = &dma_mask, | ||
| 126 | .coherent_dma_mask = 0xffffffffULL, | ||
| 127 | }, | ||
| 128 | }; | ||
| 129 | |||
| 59 | struct clk msm_clocks_7x30[] = { | 130 | struct clk msm_clocks_7x30[] = { |
| 60 | CLK_PCOM("adm_clk", ADM_CLK, NULL, 0), | 131 | CLK_PCOM("adm_clk", ADM_CLK, NULL, 0), |
| 61 | CLK_PCOM("adsp_clk", ADSP_CLK, NULL, 0), | 132 | CLK_PCOM("adsp_clk", ADSP_CLK, NULL, 0), |
| @@ -107,6 +178,7 @@ struct clk msm_clocks_7x30[] = { | |||
| 107 | CLK_PCOM("tv_dac_clk", TV_DAC_CLK, NULL, 0), | 178 | CLK_PCOM("tv_dac_clk", TV_DAC_CLK, NULL, 0), |
| 108 | CLK_PCOM("tv_enc_clk", TV_ENC_CLK, NULL, 0), | 179 | CLK_PCOM("tv_enc_clk", TV_ENC_CLK, NULL, 0), |
| 109 | CLK_PCOM("uart_clk", UART2_CLK, &msm_device_uart2.dev, 0), | 180 | CLK_PCOM("uart_clk", UART2_CLK, &msm_device_uart2.dev, 0), |
| 181 | CLK_PCOM("usb_phy_clk", USB_PHY_CLK, NULL, 0), | ||
| 110 | CLK_PCOM("usb_hs_clk", USB_HS_CLK, NULL, OFF), | 182 | CLK_PCOM("usb_hs_clk", USB_HS_CLK, NULL, OFF), |
| 111 | CLK_PCOM("usb_hs_pclk", USB_HS_P_CLK, NULL, OFF), | 183 | CLK_PCOM("usb_hs_pclk", USB_HS_P_CLK, NULL, OFF), |
| 112 | CLK_PCOM("usb_hs_core_clk", USB_HS_CORE_CLK, NULL, OFF), | 184 | CLK_PCOM("usb_hs_core_clk", USB_HS_CORE_CLK, NULL, OFF), |
diff --git a/arch/arm/mach-msm/devices-msm8x60-iommu.c b/arch/arm/mach-msm/devices-msm8x60-iommu.c index 89b9d4437e9..f9e7bd34ec5 100644 --- a/arch/arm/mach-msm/devices-msm8x60-iommu.c +++ b/arch/arm/mach-msm/devices-msm8x60-iommu.c | |||
| @@ -254,60 +254,86 @@ static struct resource msm_iommu_gfx2d0_resources[] = { | |||
| 254 | }, | 254 | }, |
| 255 | }; | 255 | }; |
| 256 | 256 | ||
| 257 | static struct resource msm_iommu_gfx2d1_resources[] = { | ||
| 258 | { | ||
| 259 | .start = MSM_IOMMU_GFX2D1_PHYS, | ||
| 260 | .end = MSM_IOMMU_GFX2D1_PHYS + MSM_IOMMU_GFX2D1_SIZE - 1, | ||
| 261 | .name = "physbase", | ||
| 262 | .flags = IORESOURCE_MEM, | ||
| 263 | }, | ||
| 264 | { | ||
| 265 | .name = "nonsecure_irq", | ||
| 266 | .start = SMMU_GFX2D1_CB_SC_NON_SECURE_IRQ, | ||
| 267 | .end = SMMU_GFX2D1_CB_SC_NON_SECURE_IRQ, | ||
| 268 | .flags = IORESOURCE_IRQ, | ||
| 269 | }, | ||
| 270 | { | ||
| 271 | .name = "secure_irq", | ||
| 272 | .start = SMMU_GFX2D1_CB_SC_SECURE_IRQ, | ||
| 273 | .end = SMMU_GFX2D1_CB_SC_SECURE_IRQ, | ||
| 274 | .flags = IORESOURCE_IRQ, | ||
| 275 | }, | ||
| 276 | }; | ||
| 277 | |||
| 257 | static struct platform_device msm_root_iommu_dev = { | 278 | static struct platform_device msm_root_iommu_dev = { |
| 258 | .name = "msm_iommu", | 279 | .name = "msm_iommu", |
| 259 | .id = -1, | 280 | .id = -1, |
| 260 | }; | 281 | }; |
| 261 | 282 | ||
| 262 | static struct msm_iommu_dev jpegd_smmu = { | 283 | static struct msm_iommu_dev jpegd_iommu = { |
| 263 | .name = "jpegd", | 284 | .name = "jpegd", |
| 264 | .clk_rate = -1 | 285 | .clk_rate = -1 |
| 265 | }; | 286 | }; |
| 266 | 287 | ||
| 267 | static struct msm_iommu_dev vpe_smmu = { | 288 | static struct msm_iommu_dev vpe_iommu = { |
| 268 | .name = "vpe" | 289 | .name = "vpe" |
| 269 | }; | 290 | }; |
| 270 | 291 | ||
| 271 | static struct msm_iommu_dev mdp0_smmu = { | 292 | static struct msm_iommu_dev mdp0_iommu = { |
| 272 | .name = "mdp0" | 293 | .name = "mdp0" |
| 273 | }; | 294 | }; |
| 274 | 295 | ||
| 275 | static struct msm_iommu_dev mdp1_smmu = { | 296 | static struct msm_iommu_dev mdp1_iommu = { |
| 276 | .name = "mdp1" | 297 | .name = "mdp1" |
| 277 | }; | 298 | }; |
| 278 | 299 | ||
| 279 | static struct msm_iommu_dev rot_smmu = { | 300 | static struct msm_iommu_dev rot_iommu = { |
| 280 | .name = "rot" | 301 | .name = "rot" |
| 281 | }; | 302 | }; |
| 282 | 303 | ||
| 283 | static struct msm_iommu_dev ijpeg_smmu = { | 304 | static struct msm_iommu_dev ijpeg_iommu = { |
| 284 | .name = "ijpeg" | 305 | .name = "ijpeg" |
| 285 | }; | 306 | }; |
| 286 | 307 | ||
| 287 | static struct msm_iommu_dev vfe_smmu = { | 308 | static struct msm_iommu_dev vfe_iommu = { |
| 288 | .name = "vfe", | 309 | .name = "vfe", |
| 289 | .clk_rate = -1 | 310 | .clk_rate = -1 |
| 290 | }; | 311 | }; |
| 291 | 312 | ||
| 292 | static struct msm_iommu_dev vcodec_a_smmu = { | 313 | static struct msm_iommu_dev vcodec_a_iommu = { |
| 293 | .name = "vcodec_a" | 314 | .name = "vcodec_a" |
| 294 | }; | 315 | }; |
| 295 | 316 | ||
| 296 | static struct msm_iommu_dev vcodec_b_smmu = { | 317 | static struct msm_iommu_dev vcodec_b_iommu = { |
| 297 | .name = "vcodec_b" | 318 | .name = "vcodec_b" |
| 298 | }; | 319 | }; |
| 299 | 320 | ||
| 300 | static struct msm_iommu_dev gfx3d_smmu = { | 321 | static struct msm_iommu_dev gfx3d_iommu = { |
| 301 | .name = "gfx3d", | 322 | .name = "gfx3d", |
| 302 | .clk_rate = 27000000 | 323 | .clk_rate = 27000000 |
| 303 | }; | 324 | }; |
| 304 | 325 | ||
| 305 | static struct msm_iommu_dev gfx2d0_smmu = { | 326 | static struct msm_iommu_dev gfx2d0_iommu = { |
| 306 | .name = "gfx2d0", | 327 | .name = "gfx2d0", |
| 307 | .clk_rate = 27000000 | 328 | .clk_rate = 27000000 |
| 308 | }; | 329 | }; |
| 309 | 330 | ||
| 310 | static struct platform_device msm_device_smmu_jpegd = { | 331 | static struct msm_iommu_dev gfx2d1_iommu = { |
| 332 | .name = "gfx2d1", | ||
| 333 | .clk_rate = 27000000 | ||
| 334 | }; | ||
| 335 | |||
| 336 | static struct platform_device msm_device_iommu_jpegd = { | ||
| 311 | .name = "msm_iommu", | 337 | .name = "msm_iommu", |
| 312 | .id = 0, | 338 | .id = 0, |
| 313 | .dev = { | 339 | .dev = { |
| @@ -317,7 +343,7 @@ static struct platform_device msm_device_smmu_jpegd = { | |||
| 317 | .resource = msm_iommu_jpegd_resources, | 343 | .resource = msm_iommu_jpegd_resources, |
| 318 | }; | 344 | }; |
| 319 | 345 | ||
| 320 | static struct platform_device msm_device_smmu_vpe = { | 346 | static struct platform_device msm_device_iommu_vpe = { |
| 321 | .name = "msm_iommu", | 347 | .name = "msm_iommu", |
| 322 | .id = 1, | 348 | .id = 1, |
| 323 | .dev = { | 349 | .dev = { |
| @@ -327,7 +353,7 @@ static struct platform_device msm_device_smmu_vpe = { | |||
| 327 | .resource = msm_iommu_vpe_resources, | 353 | .resource = msm_iommu_vpe_resources, |
| 328 | }; | 354 | }; |
| 329 | 355 | ||
| 330 | static struct platform_device msm_device_smmu_mdp0 = { | 356 | static struct platform_device msm_device_iommu_mdp0 = { |
| 331 | .name = "msm_iommu", | 357 | .name = "msm_iommu", |
| 332 | .id = 2, | 358 | .id = 2, |
| 333 | .dev = { | 359 | .dev = { |
| @@ -337,7 +363,7 @@ static struct platform_device msm_device_smmu_mdp0 = { | |||
| 337 | .resource = msm_iommu_mdp0_resources, | 363 | .resource = msm_iommu_mdp0_resources, |
| 338 | }; | 364 | }; |
| 339 | 365 | ||
| 340 | static struct platform_device msm_device_smmu_mdp1 = { | 366 | static struct platform_device msm_device_iommu_mdp1 = { |
| 341 | .name = "msm_iommu", | 367 | .name = "msm_iommu", |
| 342 | .id = 3, | 368 | .id = 3, |
| 343 | .dev = { | 369 | .dev = { |
| @@ -347,7 +373,7 @@ static struct platform_device msm_device_smmu_mdp1 = { | |||
| 347 | .resource = msm_iommu_mdp1_resources, | 373 | .resource = msm_iommu_mdp1_resources, |
| 348 | }; | 374 | }; |
| 349 | 375 | ||
| 350 | static struct platform_device msm_device_smmu_rot = { | 376 | static struct platform_device msm_device_iommu_rot = { |
| 351 | .name = "msm_iommu", | 377 | .name = "msm_iommu", |
| 352 | .id = 4, | 378 | .id = 4, |
| 353 | .dev = { | 379 | .dev = { |
| @@ -357,7 +383,7 @@ static struct platform_device msm_device_smmu_rot = { | |||
| 357 | .resource = msm_iommu_rot_resources, | 383 | .resource = msm_iommu_rot_resources, |
| 358 | }; | 384 | }; |
| 359 | 385 | ||
| 360 | static struct platform_device msm_device_smmu_ijpeg = { | 386 | static struct platform_device msm_device_iommu_ijpeg = { |
| 361 | .name = "msm_iommu", | 387 | .name = "msm_iommu", |
| 362 | .id = 5, | 388 | .id = 5, |
| 363 | .dev = { | 389 | .dev = { |
| @@ -367,7 +393,7 @@ static struct platform_device msm_device_smmu_ijpeg = { | |||
| 367 | .resource = msm_iommu_ijpeg_resources, | 393 | .resource = msm_iommu_ijpeg_resources, |
| 368 | }; | 394 | }; |
| 369 | 395 | ||
| 370 | static struct platform_device msm_device_smmu_vfe = { | 396 | static struct platform_device msm_device_iommu_vfe = { |
| 371 | .name = "msm_iommu", | 397 | .name = "msm_iommu", |
| 372 | .id = 6, | 398 | .id = 6, |
| 373 | .dev = { | 399 | .dev = { |
| @@ -377,7 +403,7 @@ static struct platform_device msm_device_smmu_vfe = { | |||
| 377 | .resource = msm_iommu_vfe_resources, | 403 | .resource = msm_iommu_vfe_resources, |
| 378 | }; | 404 | }; |
| 379 | 405 | ||
| 380 | static struct platform_device msm_device_smmu_vcodec_a = { | 406 | static struct platform_device msm_device_iommu_vcodec_a = { |
| 381 | .name = "msm_iommu", | 407 | .name = "msm_iommu", |
| 382 | .id = 7, | 408 | .id = 7, |
| 383 | .dev = { | 409 | .dev = { |
| @@ -387,7 +413,7 @@ static struct platform_device msm_device_smmu_vcodec_a = { | |||
| 387 | .resource = msm_iommu_vcodec_a_resources, | 413 | .resource = msm_iommu_vcodec_a_resources, |
| 388 | }; | 414 | }; |
| 389 | 415 | ||
| 390 | static struct platform_device msm_device_smmu_vcodec_b = { | 416 | static struct platform_device msm_device_iommu_vcodec_b = { |
| 391 | .name = "msm_iommu", | 417 | .name = "msm_iommu", |
| 392 | .id = 8, | 418 | .id = 8, |
| 393 | .dev = { | 419 | .dev = { |
| @@ -397,7 +423,7 @@ static struct platform_device msm_device_smmu_vcodec_b = { | |||
| 397 | .resource = msm_iommu_vcodec_b_resources, | 423 | .resource = msm_iommu_vcodec_b_resources, |
| 398 | }; | 424 | }; |
| 399 | 425 | ||
| 400 | static struct platform_device msm_device_smmu_gfx3d = { | 426 | static struct platform_device msm_device_iommu_gfx3d = { |
| 401 | .name = "msm_iommu", | 427 | .name = "msm_iommu", |
| 402 | .id = 9, | 428 | .id = 9, |
| 403 | .dev = { | 429 | .dev = { |
| @@ -407,7 +433,7 @@ static struct platform_device msm_device_smmu_gfx3d = { | |||
| 407 | .resource = msm_iommu_gfx3d_resources, | 433 | .resource = msm_iommu_gfx3d_resources, |
| 408 | }; | 434 | }; |
| 409 | 435 | ||
| 410 | static struct platform_device msm_device_smmu_gfx2d0 = { | 436 | static struct platform_device msm_device_iommu_gfx2d0 = { |
| 411 | .name = "msm_iommu", | 437 | .name = "msm_iommu", |
| 412 | .id = 10, | 438 | .id = 10, |
| 413 | .dev = { | 439 | .dev = { |
| @@ -417,6 +443,16 @@ static struct platform_device msm_device_smmu_gfx2d0 = { | |||
| 417 | .resource = msm_iommu_gfx2d0_resources, | 443 | .resource = msm_iommu_gfx2d0_resources, |
| 418 | }; | 444 | }; |
| 419 | 445 | ||
| 446 | struct platform_device msm_device_iommu_gfx2d1 = { | ||
| 447 | .name = "msm_iommu", | ||
| 448 | .id = 11, | ||
| 449 | .dev = { | ||
| 450 | .parent = &msm_root_iommu_dev.dev, | ||
| 451 | }, | ||
| 452 | .num_resources = ARRAY_SIZE(msm_iommu_gfx2d1_resources), | ||
| 453 | .resource = msm_iommu_gfx2d1_resources, | ||
| 454 | }; | ||
| 455 | |||
| 420 | static struct msm_iommu_ctx_dev jpegd_src_ctx = { | 456 | static struct msm_iommu_ctx_dev jpegd_src_ctx = { |
| 421 | .name = "jpegd_src", | 457 | .name = "jpegd_src", |
| 422 | .num = 0, | 458 | .num = 0, |
| @@ -519,41 +555,36 @@ static struct msm_iommu_ctx_dev vcodec_b_mm2_ctx = { | |||
| 519 | .mids = {0, 1, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, -1} | 555 | .mids = {0, 1, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, -1} |
| 520 | }; | 556 | }; |
| 521 | 557 | ||
| 522 | static struct msm_iommu_ctx_dev gfx3d_rbpa_ctx = { | 558 | static struct msm_iommu_ctx_dev gfx3d_user_ctx = { |
| 523 | .name = "gfx3d_rbpa", | 559 | .name = "gfx3d_user", |
| 524 | .num = 0, | 560 | .num = 0, |
| 525 | .mids = {-1} | 561 | .mids = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, -1} |
| 526 | }; | 562 | }; |
| 527 | 563 | ||
| 528 | static struct msm_iommu_ctx_dev gfx3d_cpvgttc_ctx = { | 564 | static struct msm_iommu_ctx_dev gfx3d_priv_ctx = { |
| 529 | .name = "gfx3d_cpvgttc", | 565 | .name = "gfx3d_priv", |
| 530 | .num = 1, | 566 | .num = 1, |
| 531 | .mids = {0, 1, 2, 3, 4, 5, 6, 7, -1} | 567 | .mids = {16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, |
| 532 | }; | 568 | 31, -1} |
| 533 | |||
| 534 | static struct msm_iommu_ctx_dev gfx3d_smmu_ctx = { | ||
| 535 | .name = "gfx3d_smmu", | ||
| 536 | .num = 2, | ||
| 537 | .mids = {8, 9, 10, 11, 12, -1} | ||
| 538 | }; | 569 | }; |
| 539 | 570 | ||
| 540 | static struct msm_iommu_ctx_dev gfx2d0_pixv1_ctx = { | 571 | static struct msm_iommu_ctx_dev gfx2d0_2d0_ctx = { |
| 541 | .name = "gfx2d0_pixv1_smmu", | 572 | .name = "gfx2d0_2d0", |
| 542 | .num = 0, | 573 | .num = 0, |
| 543 | .mids = {0, 3, 4, -1} | 574 | .mids = {0, 1, 2, 3, 4, 5, 6, 7, -1} |
| 544 | }; | 575 | }; |
| 545 | 576 | ||
| 546 | static struct msm_iommu_ctx_dev gfx2d0_texv3_ctx = { | 577 | static struct msm_iommu_ctx_dev gfx2d1_2d1_ctx = { |
| 547 | .name = "gfx2d0_texv3_smmu", | 578 | .name = "gfx2d1_2d1", |
| 548 | .num = 1, | 579 | .num = 0, |
| 549 | .mids = {1, 6, 7, -1} | 580 | .mids = {0, 1, 2, 3, 4, 5, 6, 7, -1} |
| 550 | }; | 581 | }; |
| 551 | 582 | ||
| 552 | static struct platform_device msm_device_jpegd_src_ctx = { | 583 | static struct platform_device msm_device_jpegd_src_ctx = { |
| 553 | .name = "msm_iommu_ctx", | 584 | .name = "msm_iommu_ctx", |
| 554 | .id = 0, | 585 | .id = 0, |
| 555 | .dev = { | 586 | .dev = { |
| 556 | .parent = &msm_device_smmu_jpegd.dev, | 587 | .parent = &msm_device_iommu_jpegd.dev, |
| 557 | }, | 588 | }, |
| 558 | }; | 589 | }; |
| 559 | 590 | ||
| @@ -561,7 +592,7 @@ static struct platform_device msm_device_jpegd_dst_ctx = { | |||
| 561 | .name = "msm_iommu_ctx", | 592 | .name = "msm_iommu_ctx", |
| 562 | .id = 1, | 593 | .id = 1, |
| 563 | .dev = { | 594 | .dev = { |
| 564 | .parent = &msm_device_smmu_jpegd.dev, | 595 | .parent = &msm_device_iommu_jpegd.dev, |
| 565 | }, | 596 | }, |
| 566 | }; | 597 | }; |
| 567 | 598 | ||
| @@ -569,7 +600,7 @@ static struct platform_device msm_device_vpe_src_ctx = { | |||
| 569 | .name = "msm_iommu_ctx", | 600 | .name = "msm_iommu_ctx", |
| 570 | .id = 2, | 601 | .id = 2, |
| 571 | .dev = { | 602 | .dev = { |
| 572 | .parent = &msm_device_smmu_vpe.dev, | 603 | .parent = &msm_device_iommu_vpe.dev, |
| 573 | }, | 604 | }, |
| 574 | }; | 605 | }; |
| 575 | 606 | ||
| @@ -577,7 +608,7 @@ static struct platform_device msm_device_vpe_dst_ctx = { | |||
| 577 | .name = "msm_iommu_ctx", | 608 | .name = "msm_iommu_ctx", |
| 578 | .id = 3, | 609 | .id = 3, |
| 579 | .dev = { | 610 | .dev = { |
| 580 | .parent = &msm_device_smmu_vpe.dev, | 611 | .parent = &msm_device_iommu_vpe.dev, |
| 581 | }, | 612 | }, |
| 582 | }; | 613 | }; |
| 583 | 614 | ||
| @@ -585,7 +616,7 @@ static struct platform_device msm_device_mdp_vg1_ctx = { | |||
| 585 | .name = "msm_iommu_ctx", | 616 | .name = "msm_iommu_ctx", |
| 586 | .id = 4, | 617 | .id = 4, |
| 587 | .dev = { | 618 | .dev = { |
| 588 | .parent = &msm_device_smmu_mdp0.dev, | 619 | .parent = &msm_device_iommu_mdp0.dev, |
| 589 | }, | 620 | }, |
| 590 | }; | 621 | }; |
| 591 | 622 | ||
| @@ -593,7 +624,7 @@ static struct platform_device msm_device_mdp_rgb1_ctx = { | |||
| 593 | .name = "msm_iommu_ctx", | 624 | .name = "msm_iommu_ctx", |
| 594 | .id = 5, | 625 | .id = 5, |
| 595 | .dev = { | 626 | .dev = { |
| 596 | .parent = &msm_device_smmu_mdp0.dev, | 627 | .parent = &msm_device_iommu_mdp0.dev, |
| 597 | }, | 628 | }, |
| 598 | }; | 629 | }; |
| 599 | 630 | ||
| @@ -601,7 +632,7 @@ static struct platform_device msm_device_mdp_vg2_ctx = { | |||
| 601 | .name = "msm_iommu_ctx", | 632 | .name = "msm_iommu_ctx", |
| 602 | .id = 6, | 633 | .id = 6, |
| 603 | .dev = { | 634 | .dev = { |
| 604 | .parent = &msm_device_smmu_mdp1.dev, | 635 | .parent = &msm_device_iommu_mdp1.dev, |
| 605 | }, | 636 | }, |
| 606 | }; | 637 | }; |
| 607 | 638 | ||
| @@ -609,7 +640,7 @@ static struct platform_device msm_device_mdp_rgb2_ctx = { | |||
| 609 | .name = "msm_iommu_ctx", | 640 | .name = "msm_iommu_ctx", |
| 610 | .id = 7, | 641 | .id = 7, |
| 611 | .dev = { | 642 | .dev = { |
| 612 | .parent = &msm_device_smmu_mdp1.dev, | 643 | .parent = &msm_device_iommu_mdp1.dev, |
| 613 | }, | 644 | }, |
| 614 | }; | 645 | }; |
| 615 | 646 | ||
| @@ -617,7 +648,7 @@ static struct platform_device msm_device_rot_src_ctx = { | |||
| 617 | .name = "msm_iommu_ctx", | 648 | .name = "msm_iommu_ctx", |
| 618 | .id = 8, | 649 | .id = 8, |
| 619 | .dev = { | 650 | .dev = { |
| 620 | .parent = &msm_device_smmu_rot.dev, | 651 | .parent = &msm_device_iommu_rot.dev, |
| 621 | }, | 652 | }, |
| 622 | }; | 653 | }; |
| 623 | 654 | ||
| @@ -625,7 +656,7 @@ static struct platform_device msm_device_rot_dst_ctx = { | |||
| 625 | .name = "msm_iommu_ctx", | 656 | .name = "msm_iommu_ctx", |
| 626 | .id = 9, | 657 | .id = 9, |
| 627 | .dev = { | 658 | .dev = { |
| 628 | .parent = &msm_device_smmu_rot.dev, | 659 | .parent = &msm_device_iommu_rot.dev, |
| 629 | }, | 660 | }, |
| 630 | }; | 661 | }; |
| 631 | 662 | ||
| @@ -633,7 +664,7 @@ static struct platform_device msm_device_ijpeg_src_ctx = { | |||
| 633 | .name = "msm_iommu_ctx", | 664 | .name = "msm_iommu_ctx", |
| 634 | .id = 10, | 665 | .id = 10, |
| 635 | .dev = { | 666 | .dev = { |
| 636 | .parent = &msm_device_smmu_ijpeg.dev, | 667 | .parent = &msm_device_iommu_ijpeg.dev, |
| 637 | }, | 668 | }, |
| 638 | }; | 669 | }; |
| 639 | 670 | ||
| @@ -641,7 +672,7 @@ static struct platform_device msm_device_ijpeg_dst_ctx = { | |||
| 641 | .name = "msm_iommu_ctx", | 672 | .name = "msm_iommu_ctx", |
| 642 | .id = 11, | 673 | .id = 11, |
| 643 | .dev = { | 674 | .dev = { |
| 644 | .parent = &msm_device_smmu_ijpeg.dev, | 675 | .parent = &msm_device_iommu_ijpeg.dev, |
| 645 | }, | 676 | }, |
| 646 | }; | 677 | }; |
| 647 | 678 | ||
| @@ -649,7 +680,7 @@ static struct platform_device msm_device_vfe_imgwr_ctx = { | |||
| 649 | .name = "msm_iommu_ctx", | 680 | .name = "msm_iommu_ctx", |
| 650 | .id = 12, | 681 | .id = 12, |
| 651 | .dev = { | 682 | .dev = { |
| 652 | .parent = &msm_device_smmu_vfe.dev, | 683 | .parent = &msm_device_iommu_vfe.dev, |
| 653 | }, | 684 | }, |
| 654 | }; | 685 | }; |
| 655 | 686 | ||
| @@ -657,7 +688,7 @@ static struct platform_device msm_device_vfe_misc_ctx = { | |||
| 657 | .name = "msm_iommu_ctx", | 688 | .name = "msm_iommu_ctx", |
| 658 | .id = 13, | 689 | .id = 13, |
| 659 | .dev = { | 690 | .dev = { |
| 660 | .parent = &msm_device_smmu_vfe.dev, | 691 | .parent = &msm_device_iommu_vfe.dev, |
| 661 | }, | 692 | }, |
| 662 | }; | 693 | }; |
| 663 | 694 | ||
| @@ -665,7 +696,7 @@ static struct platform_device msm_device_vcodec_a_stream_ctx = { | |||
| 665 | .name = "msm_iommu_ctx", | 696 | .name = "msm_iommu_ctx", |
| 666 | .id = 14, | 697 | .id = 14, |
| 667 | .dev = { | 698 | .dev = { |
| 668 | .parent = &msm_device_smmu_vcodec_a.dev, | 699 | .parent = &msm_device_iommu_vcodec_a.dev, |
| 669 | }, | 700 | }, |
| 670 | }; | 701 | }; |
| 671 | 702 | ||
| @@ -673,7 +704,7 @@ static struct platform_device msm_device_vcodec_a_mm1_ctx = { | |||
| 673 | .name = "msm_iommu_ctx", | 704 | .name = "msm_iommu_ctx", |
| 674 | .id = 15, | 705 | .id = 15, |
| 675 | .dev = { | 706 | .dev = { |
| 676 | .parent = &msm_device_smmu_vcodec_a.dev, | 707 | .parent = &msm_device_iommu_vcodec_a.dev, |
| 677 | }, | 708 | }, |
| 678 | }; | 709 | }; |
| 679 | 710 | ||
| @@ -681,76 +712,70 @@ static struct platform_device msm_device_vcodec_b_mm2_ctx = { | |||
| 681 | .name = "msm_iommu_ctx", | 712 | .name = "msm_iommu_ctx", |
| 682 | .id = 16, | 713 | .id = 16, |
| 683 | .dev = { | 714 | .dev = { |
| 684 | .parent = &msm_device_smmu_vcodec_b.dev, | 715 | .parent = &msm_device_iommu_vcodec_b.dev, |
| 685 | }, | 716 | }, |
| 686 | }; | 717 | }; |
| 687 | 718 | ||
| 688 | static struct platform_device msm_device_gfx3d_rbpa_ctx = { | 719 | static struct platform_device msm_device_gfx3d_user_ctx = { |
| 689 | .name = "msm_iommu_ctx", | 720 | .name = "msm_iommu_ctx", |
| 690 | .id = 17, | 721 | .id = 17, |
| 691 | .dev = { | 722 | .dev = { |
| 692 | .parent = &msm_device_smmu_gfx3d.dev, | 723 | .parent = &msm_device_iommu_gfx3d.dev, |
| 693 | }, | 724 | }, |
| 694 | }; | 725 | }; |
| 695 | 726 | ||
| 696 | static struct platform_device msm_device_gfx3d_cpvgttc_ctx = { | 727 | static struct platform_device msm_device_gfx3d_priv_ctx = { |
| 697 | .name = "msm_iommu_ctx", | 728 | .name = "msm_iommu_ctx", |
| 698 | .id = 18, | 729 | .id = 18, |
| 699 | .dev = { | 730 | .dev = { |
| 700 | .parent = &msm_device_smmu_gfx3d.dev, | 731 | .parent = &msm_device_iommu_gfx3d.dev, |
| 701 | }, | 732 | }, |
| 702 | }; | 733 | }; |
| 703 | 734 | ||
| 704 | static struct platform_device msm_device_gfx3d_smmu_ctx = { | 735 | static struct platform_device msm_device_gfx2d0_2d0_ctx = { |
| 705 | .name = "msm_iommu_ctx", | 736 | .name = "msm_iommu_ctx", |
| 706 | .id = 19, | 737 | .id = 19, |
| 707 | .dev = { | 738 | .dev = { |
| 708 | .parent = &msm_device_smmu_gfx3d.dev, | 739 | .parent = &msm_device_iommu_gfx2d0.dev, |
| 709 | }, | 740 | }, |
| 710 | }; | 741 | }; |
| 711 | 742 | ||
| 712 | static struct platform_device msm_device_gfx2d0_pixv1_ctx = { | 743 | static struct platform_device msm_device_gfx2d1_2d1_ctx = { |
| 713 | .name = "msm_iommu_ctx", | 744 | .name = "msm_iommu_ctx", |
| 714 | .id = 20, | 745 | .id = 20, |
| 715 | .dev = { | 746 | .dev = { |
| 716 | .parent = &msm_device_smmu_gfx2d0.dev, | 747 | .parent = &msm_device_iommu_gfx2d1.dev, |
| 717 | }, | ||
| 718 | }; | ||
| 719 | |||
| 720 | static struct platform_device msm_device_gfx2d0_texv3_ctx = { | ||
| 721 | .name = "msm_iommu_ctx", | ||
| 722 | .id = 21, | ||
| 723 | .dev = { | ||
| 724 | .parent = &msm_device_smmu_gfx2d0.dev, | ||
| 725 | }, | 748 | }, |
| 726 | }; | 749 | }; |
| 727 | 750 | ||
| 728 | static struct platform_device *msm_iommu_devs[] = { | 751 | static struct platform_device *msm_iommu_devs[] = { |
| 729 | &msm_device_smmu_jpegd, | 752 | &msm_device_iommu_jpegd, |
| 730 | &msm_device_smmu_vpe, | 753 | &msm_device_iommu_vpe, |
| 731 | &msm_device_smmu_mdp0, | 754 | &msm_device_iommu_mdp0, |
| 732 | &msm_device_smmu_mdp1, | 755 | &msm_device_iommu_mdp1, |
| 733 | &msm_device_smmu_rot, | 756 | &msm_device_iommu_rot, |
| 734 | &msm_device_smmu_ijpeg, | 757 | &msm_device_iommu_ijpeg, |
| 735 | &msm_device_smmu_vfe, | 758 | &msm_device_iommu_vfe, |
| 736 | &msm_device_smmu_vcodec_a, | 759 | &msm_device_iommu_vcodec_a, |
| 737 | &msm_device_smmu_vcodec_b, | 760 | &msm_device_iommu_vcodec_b, |
| 738 | &msm_device_smmu_gfx3d, | 761 | &msm_device_iommu_gfx3d, |
| 739 | &msm_device_smmu_gfx2d0, | 762 | &msm_device_iommu_gfx2d0, |
| 763 | &msm_device_iommu_gfx2d1, | ||
| 740 | }; | 764 | }; |
| 741 | 765 | ||
| 742 | static struct msm_iommu_dev *msm_iommu_data[] = { | 766 | static struct msm_iommu_dev *msm_iommu_data[] = { |
| 743 | &jpegd_smmu, | 767 | &jpegd_iommu, |
| 744 | &vpe_smmu, | 768 | &vpe_iommu, |
| 745 | &mdp0_smmu, | 769 | &mdp0_iommu, |
| 746 | &mdp1_smmu, | 770 | &mdp1_iommu, |
| 747 | &rot_smmu, | 771 | &rot_iommu, |
| 748 | &ijpeg_smmu, | 772 | &ijpeg_iommu, |
| 749 | &vfe_smmu, | 773 | &vfe_iommu, |
| 750 | &vcodec_a_smmu, | 774 | &vcodec_a_iommu, |
| 751 | &vcodec_b_smmu, | 775 | &vcodec_b_iommu, |
| 752 | &gfx3d_smmu, | 776 | &gfx3d_iommu, |
| 753 | &gfx2d0_smmu, | 777 | &gfx2d0_iommu, |
| 778 | &gfx2d1_iommu, | ||
| 754 | }; | 779 | }; |
| 755 | 780 | ||
| 756 | static struct platform_device *msm_iommu_ctx_devs[] = { | 781 | static struct platform_device *msm_iommu_ctx_devs[] = { |
| @@ -771,11 +796,10 @@ static struct platform_device *msm_iommu_ctx_devs[] = { | |||
| 771 | &msm_device_vcodec_a_stream_ctx, | 796 | &msm_device_vcodec_a_stream_ctx, |
| 772 | &msm_device_vcodec_a_mm1_ctx, | 797 | &msm_device_vcodec_a_mm1_ctx, |
| 773 | &msm_device_vcodec_b_mm2_ctx, | 798 | &msm_device_vcodec_b_mm2_ctx, |
| 774 | &msm_device_gfx3d_rbpa_ctx, | 799 | &msm_device_gfx3d_user_ctx, |
| 775 | &msm_device_gfx3d_cpvgttc_ctx, | 800 | &msm_device_gfx3d_priv_ctx, |
| 776 | &msm_device_gfx3d_smmu_ctx, | 801 | &msm_device_gfx2d0_2d0_ctx, |
| 777 | &msm_device_gfx2d0_pixv1_ctx, | 802 | &msm_device_gfx2d1_2d1_ctx, |
| 778 | &msm_device_gfx2d0_texv3_ctx, | ||
| 779 | }; | 803 | }; |
| 780 | 804 | ||
| 781 | static struct msm_iommu_ctx_dev *msm_iommu_ctx_data[] = { | 805 | static struct msm_iommu_ctx_dev *msm_iommu_ctx_data[] = { |
| @@ -796,14 +820,13 @@ static struct msm_iommu_ctx_dev *msm_iommu_ctx_data[] = { | |||
| 796 | &vcodec_a_stream_ctx, | 820 | &vcodec_a_stream_ctx, |
| 797 | &vcodec_a_mm1_ctx, | 821 | &vcodec_a_mm1_ctx, |
| 798 | &vcodec_b_mm2_ctx, | 822 | &vcodec_b_mm2_ctx, |
| 799 | &gfx3d_rbpa_ctx, | 823 | &gfx3d_user_ctx, |
| 800 | &gfx3d_cpvgttc_ctx, | 824 | &gfx3d_priv_ctx, |
| 801 | &gfx3d_smmu_ctx, | 825 | &gfx2d0_2d0_ctx, |
| 802 | &gfx2d0_pixv1_ctx, | 826 | &gfx2d1_2d1_ctx, |
| 803 | &gfx2d0_texv3_ctx, | ||
| 804 | }; | 827 | }; |
| 805 | 828 | ||
| 806 | static int msm8x60_iommu_init(void) | 829 | static int __init msm8x60_iommu_init(void) |
| 807 | { | 830 | { |
| 808 | int ret, i; | 831 | int ret, i; |
| 809 | 832 | ||
| @@ -826,7 +849,7 @@ static int msm8x60_iommu_init(void) | |||
| 826 | ret = platform_device_register(msm_iommu_devs[i]); | 849 | ret = platform_device_register(msm_iommu_devs[i]); |
| 827 | 850 | ||
| 828 | if (ret != 0) { | 851 | if (ret != 0) { |
| 829 | pr_err("platform_device_register smmu failed, " | 852 | pr_err("platform_device_register iommu failed, " |
| 830 | "i = %d\n", i); | 853 | "i = %d\n", i); |
| 831 | goto failure_unwind; | 854 | goto failure_unwind; |
| 832 | } | 855 | } |
| @@ -837,7 +860,7 @@ static int msm8x60_iommu_init(void) | |||
| 837 | msm_iommu_ctx_data[i], | 860 | msm_iommu_ctx_data[i], |
| 838 | sizeof(*msm_iommu_ctx_devs[i])); | 861 | sizeof(*msm_iommu_ctx_devs[i])); |
| 839 | if (ret != 0) { | 862 | if (ret != 0) { |
| 840 | pr_err("platform_device_add_data smmu failed, " | 863 | pr_err("platform_device_add_data iommu failed, " |
| 841 | "i = %d\n", i); | 864 | "i = %d\n", i); |
| 842 | goto failure_unwind2; | 865 | goto failure_unwind2; |
| 843 | } | 866 | } |
| @@ -863,7 +886,7 @@ failure: | |||
| 863 | return ret; | 886 | return ret; |
| 864 | } | 887 | } |
| 865 | 888 | ||
| 866 | static void msm8x60_iommu_exit(void) | 889 | static void __exit msm8x60_iommu_exit(void) |
| 867 | { | 890 | { |
| 868 | int i; | 891 | int i; |
| 869 | 892 | ||
diff --git a/arch/arm/mach-msm/devices-qsd8x50.c b/arch/arm/mach-msm/devices-qsd8x50.c index 6fe67c5d1ae..a4b798f20cc 100644 --- a/arch/arm/mach-msm/devices-qsd8x50.c +++ b/arch/arm/mach-msm/devices-qsd8x50.c | |||
| @@ -53,6 +53,77 @@ struct platform_device msm_device_smd = { | |||
| 53 | .id = -1, | 53 | .id = -1, |
| 54 | }; | 54 | }; |
| 55 | 55 | ||
| 56 | static struct resource resources_otg[] = { | ||
| 57 | { | ||
| 58 | .start = MSM_HSUSB_PHYS, | ||
| 59 | .end = MSM_HSUSB_PHYS + MSM_HSUSB_SIZE, | ||
| 60 | .flags = IORESOURCE_MEM, | ||
| 61 | }, | ||
| 62 | { | ||
| 63 | .start = INT_USB_HS, | ||
| 64 | .end = INT_USB_HS, | ||
| 65 | .flags = IORESOURCE_IRQ, | ||
| 66 | }, | ||
| 67 | }; | ||
| 68 | |||
| 69 | struct platform_device msm_device_otg = { | ||
| 70 | .name = "msm_otg", | ||
| 71 | .id = -1, | ||
| 72 | .num_resources = ARRAY_SIZE(resources_otg), | ||
| 73 | .resource = resources_otg, | ||
| 74 | .dev = { | ||
| 75 | .coherent_dma_mask = 0xffffffff, | ||
| 76 | }, | ||
| 77 | }; | ||
| 78 | |||
| 79 | static struct resource resources_hsusb[] = { | ||
| 80 | { | ||
| 81 | .start = MSM_HSUSB_PHYS, | ||
| 82 | .end = MSM_HSUSB_PHYS + MSM_HSUSB_SIZE, | ||
| 83 | .flags = IORESOURCE_MEM, | ||
| 84 | }, | ||
| 85 | { | ||
| 86 | .start = INT_USB_HS, | ||
| 87 | .end = INT_USB_HS, | ||
| 88 | .flags = IORESOURCE_IRQ, | ||
| 89 | }, | ||
| 90 | }; | ||
| 91 | |||
| 92 | struct platform_device msm_device_hsusb = { | ||
| 93 | .name = "msm_hsusb", | ||
| 94 | .id = -1, | ||
| 95 | .num_resources = ARRAY_SIZE(resources_hsusb), | ||
| 96 | .resource = resources_hsusb, | ||
| 97 | .dev = { | ||
| 98 | .coherent_dma_mask = 0xffffffff, | ||
| 99 | }, | ||
| 100 | }; | ||
| 101 | |||
| 102 | static u64 dma_mask = 0xffffffffULL; | ||
| 103 | static struct resource resources_hsusb_host[] = { | ||
| 104 | { | ||
| 105 | .start = MSM_HSUSB_PHYS, | ||
| 106 | .end = MSM_HSUSB_PHYS + MSM_HSUSB_SIZE, | ||
| 107 | .flags = IORESOURCE_MEM, | ||
| 108 | }, | ||
| 109 | { | ||
| 110 | .start = INT_USB_HS, | ||
| 111 | .end = INT_USB_HS, | ||
| 112 | .flags = IORESOURCE_IRQ, | ||
| 113 | }, | ||
| 114 | }; | ||
| 115 | |||
| 116 | struct platform_device msm_device_hsusb_host = { | ||
| 117 | .name = "msm_hsusb_host", | ||
| 118 | .id = -1, | ||
| 119 | .num_resources = ARRAY_SIZE(resources_hsusb_host), | ||
| 120 | .resource = resources_hsusb_host, | ||
| 121 | .dev = { | ||
| 122 | .dma_mask = &dma_mask, | ||
| 123 | .coherent_dma_mask = 0xffffffffULL, | ||
| 124 | }, | ||
| 125 | }; | ||
| 126 | |||
| 56 | struct clk msm_clocks_8x50[] = { | 127 | struct clk msm_clocks_8x50[] = { |
| 57 | CLK_PCOM("adm_clk", ADM_CLK, NULL, 0), | 128 | CLK_PCOM("adm_clk", ADM_CLK, NULL, 0), |
| 58 | CLK_PCOM("ebi1_clk", EBI1_CLK, NULL, CLK_MIN), | 129 | CLK_PCOM("ebi1_clk", EBI1_CLK, NULL, CLK_MIN), |
diff --git a/arch/arm/mach-msm/devices.h b/arch/arm/mach-msm/devices.h index 568443e7642..87c70bfce2b 100644 --- a/arch/arm/mach-msm/devices.h +++ b/arch/arm/mach-msm/devices.h | |||
| @@ -28,6 +28,8 @@ extern struct platform_device msm_device_sdc3; | |||
| 28 | extern struct platform_device msm_device_sdc4; | 28 | extern struct platform_device msm_device_sdc4; |
| 29 | 29 | ||
| 30 | extern struct platform_device msm_device_hsusb; | 30 | extern struct platform_device msm_device_hsusb; |
| 31 | extern struct platform_device msm_device_otg; | ||
| 32 | extern struct platform_device msm_device_hsusb_host; | ||
| 31 | 33 | ||
| 32 | extern struct platform_device msm_device_i2c; | 34 | extern struct platform_device msm_device_i2c; |
| 33 | 35 | ||
| @@ -35,6 +37,10 @@ extern struct platform_device msm_device_smd; | |||
| 35 | 37 | ||
| 36 | extern struct platform_device msm_device_nand; | 38 | extern struct platform_device msm_device_nand; |
| 37 | 39 | ||
| 40 | extern struct platform_device msm_device_mddi0; | ||
| 41 | extern struct platform_device msm_device_mddi1; | ||
| 42 | extern struct platform_device msm_device_mdp; | ||
| 43 | |||
| 38 | extern struct clk msm_clocks_7x01a[]; | 44 | extern struct clk msm_clocks_7x01a[]; |
| 39 | extern unsigned msm_num_clocks_7x01a; | 45 | extern unsigned msm_num_clocks_7x01a; |
| 40 | 46 | ||
diff --git a/arch/arm/mach-msm/gpio-v2.c b/arch/arm/mach-msm/gpio-v2.c new file mode 100644 index 00000000000..0de19ec74e3 --- /dev/null +++ b/arch/arm/mach-msm/gpio-v2.c | |||
| @@ -0,0 +1,426 @@ | |||
| 1 | /* Copyright (c) 2010, Code Aurora Forum. All rights reserved. | ||
| 2 | * | ||
| 3 | * This program is free software; you can redistribute it and/or modify | ||
| 4 | * it under the terms of the GNU General Public License version 2 and | ||
| 5 | * only version 2 as published by the Free Software Foundation. | ||
| 6 | * | ||
| 7 | * This program is distributed in the hope that it will be useful, | ||
| 8 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 9 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 10 | * GNU General Public License for more details. | ||
| 11 | * | ||
| 12 | * You should have received a copy of the GNU General Public License | ||
| 13 | * along with this program; if not, write to the Free Software | ||
| 14 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA | ||
| 15 | * 02110-1301, USA. | ||
| 16 | * | ||
| 17 | */ | ||
| 18 | #define pr_fmt(fmt) "%s: " fmt, __func__ | ||
| 19 | |||
| 20 | #include <linux/bitmap.h> | ||
| 21 | #include <linux/bitops.h> | ||
| 22 | #include <linux/gpio.h> | ||
| 23 | #include <linux/init.h> | ||
| 24 | #include <linux/interrupt.h> | ||
| 25 | #include <linux/io.h> | ||
| 26 | #include <linux/irq.h> | ||
| 27 | #include <linux/module.h> | ||
| 28 | #include <linux/platform_device.h> | ||
| 29 | #include <linux/spinlock.h> | ||
| 30 | #include <mach/msm_iomap.h> | ||
| 31 | #include "gpiomux.h" | ||
| 32 | |||
| 33 | /* Bits of interest in the GPIO_IN_OUT register. | ||
| 34 | */ | ||
| 35 | enum { | ||
| 36 | GPIO_IN = 0, | ||
| 37 | GPIO_OUT = 1 | ||
| 38 | }; | ||
| 39 | |||
| 40 | /* Bits of interest in the GPIO_INTR_STATUS register. | ||
| 41 | */ | ||
| 42 | enum { | ||
| 43 | INTR_STATUS = 0, | ||
| 44 | }; | ||
| 45 | |||
| 46 | /* Bits of interest in the GPIO_CFG register. | ||
| 47 | */ | ||
| 48 | enum { | ||
| 49 | GPIO_OE = 9, | ||
| 50 | }; | ||
| 51 | |||
| 52 | /* Bits of interest in the GPIO_INTR_CFG register. | ||
| 53 | * When a GPIO triggers, two separate decisions are made, controlled | ||
| 54 | * by two separate flags. | ||
| 55 | * | ||
| 56 | * - First, INTR_RAW_STATUS_EN controls whether or not the GPIO_INTR_STATUS | ||
| 57 | * register for that GPIO will be updated to reflect the triggering of that | ||
| 58 | * gpio. If this bit is 0, this register will not be updated. | ||
| 59 | * - Second, INTR_ENABLE controls whether an interrupt is triggered. | ||
| 60 | * | ||
| 61 | * If INTR_ENABLE is set and INTR_RAW_STATUS_EN is NOT set, an interrupt | ||
| 62 | * can be triggered but the status register will not reflect it. | ||
| 63 | */ | ||
| 64 | enum { | ||
| 65 | INTR_ENABLE = 0, | ||
| 66 | INTR_POL_CTL = 1, | ||
| 67 | INTR_DECT_CTL = 2, | ||
| 68 | INTR_RAW_STATUS_EN = 3, | ||
| 69 | }; | ||
| 70 | |||
| 71 | /* Codes of interest in GPIO_INTR_CFG_SU. | ||
| 72 | */ | ||
| 73 | enum { | ||
| 74 | TARGET_PROC_SCORPION = 4, | ||
| 75 | TARGET_PROC_NONE = 7, | ||
| 76 | }; | ||
| 77 | |||
| 78 | |||
| 79 | #define GPIO_INTR_CFG_SU(gpio) (MSM_TLMM_BASE + 0x0400 + (0x04 * (gpio))) | ||
| 80 | #define GPIO_CONFIG(gpio) (MSM_TLMM_BASE + 0x1000 + (0x10 * (gpio))) | ||
| 81 | #define GPIO_IN_OUT(gpio) (MSM_TLMM_BASE + 0x1004 + (0x10 * (gpio))) | ||
| 82 | #define GPIO_INTR_CFG(gpio) (MSM_TLMM_BASE + 0x1008 + (0x10 * (gpio))) | ||
| 83 | #define GPIO_INTR_STATUS(gpio) (MSM_TLMM_BASE + 0x100c + (0x10 * (gpio))) | ||
| 84 | |||
| 85 | /** | ||
| 86 | * struct msm_gpio_dev: the MSM8660 SoC GPIO device structure | ||
| 87 | * | ||
| 88 | * @enabled_irqs: a bitmap used to optimize the summary-irq handler. By | ||
| 89 | * keeping track of which gpios are unmasked as irq sources, we avoid | ||
| 90 | * having to do readl calls on hundreds of iomapped registers each time | ||
| 91 | * the summary interrupt fires in order to locate the active interrupts. | ||
| 92 | * | ||
| 93 | * @wake_irqs: a bitmap for tracking which interrupt lines are enabled | ||
| 94 | * as wakeup sources. When the device is suspended, interrupts which are | ||
| 95 | * not wakeup sources are disabled. | ||
| 96 | * | ||
| 97 | * @dual_edge_irqs: a bitmap used to track which irqs are configured | ||
| 98 | * as dual-edge, as this is not supported by the hardware and requires | ||
| 99 | * some special handling in the driver. | ||
| 100 | */ | ||
| 101 | struct msm_gpio_dev { | ||
| 102 | struct gpio_chip gpio_chip; | ||
| 103 | DECLARE_BITMAP(enabled_irqs, NR_GPIO_IRQS); | ||
| 104 | DECLARE_BITMAP(wake_irqs, NR_GPIO_IRQS); | ||
| 105 | DECLARE_BITMAP(dual_edge_irqs, NR_GPIO_IRQS); | ||
| 106 | }; | ||
| 107 | |||
| 108 | static DEFINE_SPINLOCK(tlmm_lock); | ||
| 109 | |||
| 110 | static inline struct msm_gpio_dev *to_msm_gpio_dev(struct gpio_chip *chip) | ||
| 111 | { | ||
| 112 | return container_of(chip, struct msm_gpio_dev, gpio_chip); | ||
| 113 | } | ||
| 114 | |||
| 115 | static inline void set_gpio_bits(unsigned n, void __iomem *reg) | ||
| 116 | { | ||
| 117 | writel(readl(reg) | n, reg); | ||
| 118 | } | ||
| 119 | |||
| 120 | static inline void clear_gpio_bits(unsigned n, void __iomem *reg) | ||
| 121 | { | ||
| 122 | writel(readl(reg) & ~n, reg); | ||
| 123 | } | ||
| 124 | |||
| 125 | static int msm_gpio_get(struct gpio_chip *chip, unsigned offset) | ||
| 126 | { | ||
| 127 | return readl(GPIO_IN_OUT(offset)) & BIT(GPIO_IN); | ||
| 128 | } | ||
| 129 | |||
| 130 | static void msm_gpio_set(struct gpio_chip *chip, unsigned offset, int val) | ||
| 131 | { | ||
| 132 | writel(val ? BIT(GPIO_OUT) : 0, GPIO_IN_OUT(offset)); | ||
| 133 | } | ||
| 134 | |||
| 135 | static int msm_gpio_direction_input(struct gpio_chip *chip, unsigned offset) | ||
| 136 | { | ||
| 137 | unsigned long irq_flags; | ||
| 138 | |||
| 139 | spin_lock_irqsave(&tlmm_lock, irq_flags); | ||
| 140 | clear_gpio_bits(BIT(GPIO_OE), GPIO_CONFIG(offset)); | ||
| 141 | spin_unlock_irqrestore(&tlmm_lock, irq_flags); | ||
| 142 | return 0; | ||
| 143 | } | ||
| 144 | |||
| 145 | static int msm_gpio_direction_output(struct gpio_chip *chip, | ||
| 146 | unsigned offset, | ||
| 147 | int val) | ||
| 148 | { | ||
| 149 | unsigned long irq_flags; | ||
| 150 | |||
| 151 | spin_lock_irqsave(&tlmm_lock, irq_flags); | ||
| 152 | msm_gpio_set(chip, offset, val); | ||
| 153 | set_gpio_bits(BIT(GPIO_OE), GPIO_CONFIG(offset)); | ||
| 154 | spin_unlock_irqrestore(&tlmm_lock, irq_flags); | ||
| 155 | return 0; | ||
| 156 | } | ||
| 157 | |||
| 158 | static int msm_gpio_request(struct gpio_chip *chip, unsigned offset) | ||
| 159 | { | ||
| 160 | return msm_gpiomux_get(chip->base + offset); | ||
| 161 | } | ||
| 162 | |||
| 163 | static void msm_gpio_free(struct gpio_chip *chip, unsigned offset) | ||
| 164 | { | ||
| 165 | msm_gpiomux_put(chip->base + offset); | ||
| 166 | } | ||
| 167 | |||
| 168 | static int msm_gpio_to_irq(struct gpio_chip *chip, unsigned offset) | ||
| 169 | { | ||
| 170 | return MSM_GPIO_TO_INT(chip->base + offset); | ||
| 171 | } | ||
| 172 | |||
| 173 | static inline int msm_irq_to_gpio(struct gpio_chip *chip, unsigned irq) | ||
| 174 | { | ||
| 175 | return irq - MSM_GPIO_TO_INT(chip->base); | ||
| 176 | } | ||
| 177 | |||
| 178 | static struct msm_gpio_dev msm_gpio = { | ||
| 179 | .gpio_chip = { | ||
| 180 | .base = 0, | ||
| 181 | .ngpio = NR_GPIO_IRQS, | ||
| 182 | .direction_input = msm_gpio_direction_input, | ||
| 183 | .direction_output = msm_gpio_direction_output, | ||
| 184 | .get = msm_gpio_get, | ||
| 185 | .set = msm_gpio_set, | ||
| 186 | .to_irq = msm_gpio_to_irq, | ||
| 187 | .request = msm_gpio_request, | ||
| 188 | .free = msm_gpio_free, | ||
| 189 | }, | ||
| 190 | }; | ||
| 191 | |||
| 192 | /* For dual-edge interrupts in software, since the hardware has no | ||
| 193 | * such support: | ||
| 194 | * | ||
| 195 | * At appropriate moments, this function may be called to flip the polarity | ||
| 196 | * settings of both-edge irq lines to try and catch the next edge. | ||
| 197 | * | ||
| 198 | * The attempt is considered successful if: | ||
| 199 | * - the status bit goes high, indicating that an edge was caught, or | ||
| 200 | * - the input value of the gpio doesn't change during the attempt. | ||
| 201 | * If the value changes twice during the process, that would cause the first | ||
| 202 | * test to fail but would force the second, as two opposite | ||
| 203 | * transitions would cause a detection no matter the polarity setting. | ||
| 204 | * | ||
| 205 | * The do-loop tries to sledge-hammer closed the timing hole between | ||
| 206 | * the initial value-read and the polarity-write - if the line value changes | ||
| 207 | * during that window, an interrupt is lost, the new polarity setting is | ||
| 208 | * incorrect, and the first success test will fail, causing a retry. | ||
| 209 | * | ||
| 210 | * Algorithm comes from Google's msmgpio driver, see mach-msm/gpio.c. | ||
| 211 | */ | ||
| 212 | static void msm_gpio_update_dual_edge_pos(unsigned gpio) | ||
| 213 | { | ||
| 214 | int loop_limit = 100; | ||
| 215 | unsigned val, val2, intstat; | ||
| 216 | |||
| 217 | do { | ||
| 218 | val = readl(GPIO_IN_OUT(gpio)) & BIT(GPIO_IN); | ||
| 219 | if (val) | ||
| 220 | clear_gpio_bits(BIT(INTR_POL_CTL), GPIO_INTR_CFG(gpio)); | ||
| 221 | else | ||
| 222 | set_gpio_bits(BIT(INTR_POL_CTL), GPIO_INTR_CFG(gpio)); | ||
| 223 | val2 = readl(GPIO_IN_OUT(gpio)) & BIT(GPIO_IN); | ||
| 224 | intstat = readl(GPIO_INTR_STATUS(gpio)) & BIT(INTR_STATUS); | ||
| 225 | if (intstat || val == val2) | ||
| 226 | return; | ||
| 227 | } while (loop_limit-- > 0); | ||
| 228 | pr_err("dual-edge irq failed to stabilize, " | ||
| 229 | "interrupts dropped. %#08x != %#08x\n", | ||
| 230 | val, val2); | ||
| 231 | } | ||
| 232 | |||
| 233 | static void msm_gpio_irq_ack(unsigned int irq) | ||
| 234 | { | ||
| 235 | int gpio = msm_irq_to_gpio(&msm_gpio.gpio_chip, irq); | ||
| 236 | |||
| 237 | writel(BIT(INTR_STATUS), GPIO_INTR_STATUS(gpio)); | ||
| 238 | if (test_bit(gpio, msm_gpio.dual_edge_irqs)) | ||
| 239 | msm_gpio_update_dual_edge_pos(gpio); | ||
| 240 | } | ||
| 241 | |||
| 242 | static void msm_gpio_irq_mask(unsigned int irq) | ||
| 243 | { | ||
| 244 | int gpio = msm_irq_to_gpio(&msm_gpio.gpio_chip, irq); | ||
| 245 | unsigned long irq_flags; | ||
| 246 | |||
| 247 | spin_lock_irqsave(&tlmm_lock, irq_flags); | ||
| 248 | writel(TARGET_PROC_NONE, GPIO_INTR_CFG_SU(gpio)); | ||
| 249 | clear_gpio_bits(INTR_RAW_STATUS_EN | INTR_ENABLE, GPIO_INTR_CFG(gpio)); | ||
| 250 | __clear_bit(gpio, msm_gpio.enabled_irqs); | ||
| 251 | spin_unlock_irqrestore(&tlmm_lock, irq_flags); | ||
| 252 | } | ||
| 253 | |||
| 254 | static void msm_gpio_irq_unmask(unsigned int irq) | ||
| 255 | { | ||
| 256 | int gpio = msm_irq_to_gpio(&msm_gpio.gpio_chip, irq); | ||
| 257 | unsigned long irq_flags; | ||
| 258 | |||
| 259 | spin_lock_irqsave(&tlmm_lock, irq_flags); | ||
| 260 | __set_bit(gpio, msm_gpio.enabled_irqs); | ||
| 261 | set_gpio_bits(INTR_RAW_STATUS_EN | INTR_ENABLE, GPIO_INTR_CFG(gpio)); | ||
| 262 | writel(TARGET_PROC_SCORPION, GPIO_INTR_CFG_SU(gpio)); | ||
| 263 | spin_unlock_irqrestore(&tlmm_lock, irq_flags); | ||
| 264 | } | ||
| 265 | |||
| 266 | static int msm_gpio_irq_set_type(unsigned int irq, unsigned int flow_type) | ||
| 267 | { | ||
| 268 | int gpio = msm_irq_to_gpio(&msm_gpio.gpio_chip, irq); | ||
| 269 | unsigned long irq_flags; | ||
| 270 | uint32_t bits; | ||
| 271 | |||
| 272 | spin_lock_irqsave(&tlmm_lock, irq_flags); | ||
| 273 | |||
| 274 | bits = readl(GPIO_INTR_CFG(gpio)); | ||
| 275 | |||
| 276 | if (flow_type & IRQ_TYPE_EDGE_BOTH) { | ||
| 277 | bits |= BIT(INTR_DECT_CTL); | ||
| 278 | irq_desc[irq].handle_irq = handle_edge_irq; | ||
| 279 | if ((flow_type & IRQ_TYPE_EDGE_BOTH) == IRQ_TYPE_EDGE_BOTH) | ||
| 280 | __set_bit(gpio, msm_gpio.dual_edge_irqs); | ||
| 281 | else | ||
| 282 | __clear_bit(gpio, msm_gpio.dual_edge_irqs); | ||
| 283 | } else { | ||
| 284 | bits &= ~BIT(INTR_DECT_CTL); | ||
| 285 | irq_desc[irq].handle_irq = handle_level_irq; | ||
| 286 | __clear_bit(gpio, msm_gpio.dual_edge_irqs); | ||
| 287 | } | ||
| 288 | |||
| 289 | if (flow_type & (IRQ_TYPE_EDGE_RISING | IRQ_TYPE_LEVEL_HIGH)) | ||
| 290 | bits |= BIT(INTR_POL_CTL); | ||
| 291 | else | ||
| 292 | bits &= ~BIT(INTR_POL_CTL); | ||
| 293 | |||
| 294 | writel(bits, GPIO_INTR_CFG(gpio)); | ||
| 295 | |||
| 296 | if ((flow_type & IRQ_TYPE_EDGE_BOTH) == IRQ_TYPE_EDGE_BOTH) | ||
| 297 | msm_gpio_update_dual_edge_pos(gpio); | ||
| 298 | |||
| 299 | spin_unlock_irqrestore(&tlmm_lock, irq_flags); | ||
| 300 | |||
| 301 | return 0; | ||
| 302 | } | ||
| 303 | |||
| 304 | /* | ||
| 305 | * When the summary IRQ is raised, any number of GPIO lines may be high. | ||
| 306 | * It is the job of the summary handler to find all those GPIO lines | ||
| 307 | * which have been set as summary IRQ lines and which are triggered, | ||
| 308 | * and to call their interrupt handlers. | ||
| 309 | */ | ||
| 310 | static void msm_summary_irq_handler(unsigned int irq, struct irq_desc *desc) | ||
| 311 | { | ||
| 312 | unsigned long i; | ||
| 313 | |||
| 314 | for (i = find_first_bit(msm_gpio.enabled_irqs, NR_GPIO_IRQS); | ||
| 315 | i < NR_GPIO_IRQS; | ||
| 316 | i = find_next_bit(msm_gpio.enabled_irqs, NR_GPIO_IRQS, i + 1)) { | ||
| 317 | if (readl(GPIO_INTR_STATUS(i)) & BIT(INTR_STATUS)) | ||
| 318 | generic_handle_irq(msm_gpio_to_irq(&msm_gpio.gpio_chip, | ||
| 319 | i)); | ||
| 320 | } | ||
| 321 | desc->chip->ack(irq); | ||
| 322 | } | ||
| 323 | |||
| 324 | static int msm_gpio_irq_set_wake(unsigned int irq, unsigned int on) | ||
| 325 | { | ||
| 326 | int gpio = msm_irq_to_gpio(&msm_gpio.gpio_chip, irq); | ||
| 327 | |||
| 328 | if (on) { | ||
| 329 | if (bitmap_empty(msm_gpio.wake_irqs, NR_GPIO_IRQS)) | ||
| 330 | set_irq_wake(TLMM_SCSS_SUMMARY_IRQ, 1); | ||
| 331 | set_bit(gpio, msm_gpio.wake_irqs); | ||
| 332 | } else { | ||
| 333 | clear_bit(gpio, msm_gpio.wake_irqs); | ||
| 334 | if (bitmap_empty(msm_gpio.wake_irqs, NR_GPIO_IRQS)) | ||
| 335 | set_irq_wake(TLMM_SCSS_SUMMARY_IRQ, 0); | ||
| 336 | } | ||
| 337 | |||
| 338 | return 0; | ||
| 339 | } | ||
| 340 | |||
| 341 | static struct irq_chip msm_gpio_irq_chip = { | ||
| 342 | .name = "msmgpio", | ||
| 343 | .mask = msm_gpio_irq_mask, | ||
| 344 | .unmask = msm_gpio_irq_unmask, | ||
| 345 | .ack = msm_gpio_irq_ack, | ||
| 346 | .set_type = msm_gpio_irq_set_type, | ||
| 347 | .set_wake = msm_gpio_irq_set_wake, | ||
| 348 | }; | ||
| 349 | |||
| 350 | static int __devinit msm_gpio_probe(struct platform_device *dev) | ||
| 351 | { | ||
| 352 | int i, irq, ret; | ||
| 353 | |||
| 354 | bitmap_zero(msm_gpio.enabled_irqs, NR_GPIO_IRQS); | ||
| 355 | bitmap_zero(msm_gpio.wake_irqs, NR_GPIO_IRQS); | ||
| 356 | bitmap_zero(msm_gpio.dual_edge_irqs, NR_GPIO_IRQS); | ||
| 357 | msm_gpio.gpio_chip.label = dev->name; | ||
| 358 | ret = gpiochip_add(&msm_gpio.gpio_chip); | ||
| 359 | if (ret < 0) | ||
| 360 | return ret; | ||
| 361 | |||
| 362 | for (i = 0; i < msm_gpio.gpio_chip.ngpio; ++i) { | ||
| 363 | irq = msm_gpio_to_irq(&msm_gpio.gpio_chip, i); | ||
| 364 | set_irq_chip(irq, &msm_gpio_irq_chip); | ||
| 365 | set_irq_handler(irq, handle_level_irq); | ||
| 366 | set_irq_flags(irq, IRQF_VALID); | ||
| 367 | } | ||
| 368 | |||
| 369 | set_irq_chained_handler(TLMM_SCSS_SUMMARY_IRQ, | ||
| 370 | msm_summary_irq_handler); | ||
| 371 | return 0; | ||
| 372 | } | ||
| 373 | |||
| 374 | static int __devexit msm_gpio_remove(struct platform_device *dev) | ||
| 375 | { | ||
| 376 | int ret = gpiochip_remove(&msm_gpio.gpio_chip); | ||
| 377 | |||
| 378 | if (ret < 0) | ||
| 379 | return ret; | ||
| 380 | |||
| 381 | set_irq_handler(TLMM_SCSS_SUMMARY_IRQ, NULL); | ||
| 382 | |||
| 383 | return 0; | ||
| 384 | } | ||
| 385 | |||
| 386 | static struct platform_driver msm_gpio_driver = { | ||
| 387 | .probe = msm_gpio_probe, | ||
| 388 | .remove = __devexit_p(msm_gpio_remove), | ||
| 389 | .driver = { | ||
| 390 | .name = "msmgpio", | ||
| 391 | .owner = THIS_MODULE, | ||
| 392 | }, | ||
| 393 | }; | ||
| 394 | |||
| 395 | static struct platform_device msm_device_gpio = { | ||
| 396 | .name = "msmgpio", | ||
| 397 | .id = -1, | ||
| 398 | }; | ||
| 399 | |||
| 400 | static int __init msm_gpio_init(void) | ||
| 401 | { | ||
| 402 | int rc; | ||
| 403 | |||
| 404 | rc = platform_driver_register(&msm_gpio_driver); | ||
| 405 | if (!rc) { | ||
| 406 | rc = platform_device_register(&msm_device_gpio); | ||
| 407 | if (rc) | ||
| 408 | platform_driver_unregister(&msm_gpio_driver); | ||
| 409 | } | ||
| 410 | |||
| 411 | return rc; | ||
| 412 | } | ||
| 413 | |||
| 414 | static void __exit msm_gpio_exit(void) | ||
| 415 | { | ||
| 416 | platform_device_unregister(&msm_device_gpio); | ||
| 417 | platform_driver_unregister(&msm_gpio_driver); | ||
| 418 | } | ||
| 419 | |||
| 420 | postcore_initcall(msm_gpio_init); | ||
| 421 | module_exit(msm_gpio_exit); | ||
| 422 | |||
| 423 | MODULE_AUTHOR("Gregory Bean <gbean@codeaurora.org>"); | ||
| 424 | MODULE_DESCRIPTION("Driver for Qualcomm MSM TLMMv2 SoC GPIOs"); | ||
| 425 | MODULE_LICENSE("GPL v2"); | ||
| 426 | MODULE_ALIAS("platform:msmgpio"); | ||
diff --git a/arch/arm/mach-msm/include/mach/iommu.h b/arch/arm/mach-msm/include/mach/iommu.h index 218ef5732a2..296c0f10f23 100644 --- a/arch/arm/mach-msm/include/mach/iommu.h +++ b/arch/arm/mach-msm/include/mach/iommu.h | |||
| @@ -20,13 +20,26 @@ | |||
| 20 | 20 | ||
| 21 | #include <linux/interrupt.h> | 21 | #include <linux/interrupt.h> |
| 22 | 22 | ||
| 23 | /* Sharability attributes of MSM IOMMU mappings */ | ||
| 24 | #define MSM_IOMMU_ATTR_NON_SH 0x0 | ||
| 25 | #define MSM_IOMMU_ATTR_SH 0x4 | ||
| 26 | |||
| 27 | /* Cacheability attributes of MSM IOMMU mappings */ | ||
| 28 | #define MSM_IOMMU_ATTR_NONCACHED 0x0 | ||
| 29 | #define MSM_IOMMU_ATTR_CACHED_WB_WA 0x1 | ||
| 30 | #define MSM_IOMMU_ATTR_CACHED_WB_NWA 0x2 | ||
| 31 | #define MSM_IOMMU_ATTR_CACHED_WT 0x3 | ||
| 32 | |||
| 33 | /* Mask for the cache policy attribute */ | ||
| 34 | #define MSM_IOMMU_CP_MASK 0x03 | ||
| 35 | |||
| 23 | /* Maximum number of Machine IDs that we are allowing to be mapped to the same | 36 | /* Maximum number of Machine IDs that we are allowing to be mapped to the same |
| 24 | * context bank. The number of MIDs mapped to the same CB does not affect | 37 | * context bank. The number of MIDs mapped to the same CB does not affect |
| 25 | * performance, but there is a practical limit on how many distinct MIDs may | 38 | * performance, but there is a practical limit on how many distinct MIDs may |
| 26 | * be present. These mappings are typically determined at design time and are | 39 | * be present. These mappings are typically determined at design time and are |
| 27 | * not expected to change at run time. | 40 | * not expected to change at run time. |
| 28 | */ | 41 | */ |
| 29 | #define MAX_NUM_MIDS 16 | 42 | #define MAX_NUM_MIDS 32 |
| 30 | 43 | ||
| 31 | /** | 44 | /** |
| 32 | * struct msm_iommu_dev - a single IOMMU hardware instance | 45 | * struct msm_iommu_dev - a single IOMMU hardware instance |
diff --git a/arch/arm/mach-msm/include/mach/iommu_hw-8xxx.h b/arch/arm/mach-msm/include/mach/iommu_hw-8xxx.h index f9386d3a2f7..c2c3da9444f 100644 --- a/arch/arm/mach-msm/include/mach/iommu_hw-8xxx.h +++ b/arch/arm/mach-msm/include/mach/iommu_hw-8xxx.h | |||
| @@ -54,6 +54,7 @@ do { \ | |||
| 54 | 54 | ||
| 55 | #define NUM_FL_PTE 4096 | 55 | #define NUM_FL_PTE 4096 |
| 56 | #define NUM_SL_PTE 256 | 56 | #define NUM_SL_PTE 256 |
| 57 | #define NUM_TEX_CLASS 8 | ||
| 57 | 58 | ||
| 58 | /* First-level page table bits */ | 59 | /* First-level page table bits */ |
| 59 | #define FL_BASE_MASK 0xFFFFFC00 | 60 | #define FL_BASE_MASK 0xFFFFFC00 |
| @@ -63,6 +64,9 @@ do { \ | |||
| 63 | #define FL_AP_WRITE (1 << 10) | 64 | #define FL_AP_WRITE (1 << 10) |
| 64 | #define FL_AP_READ (1 << 11) | 65 | #define FL_AP_READ (1 << 11) |
| 65 | #define FL_SHARED (1 << 16) | 66 | #define FL_SHARED (1 << 16) |
| 67 | #define FL_BUFFERABLE (1 << 2) | ||
| 68 | #define FL_CACHEABLE (1 << 3) | ||
| 69 | #define FL_TEX0 (1 << 12) | ||
| 66 | #define FL_OFFSET(va) (((va) & 0xFFF00000) >> 20) | 70 | #define FL_OFFSET(va) (((va) & 0xFFF00000) >> 20) |
| 67 | 71 | ||
| 68 | /* Second-level page table bits */ | 72 | /* Second-level page table bits */ |
| @@ -73,8 +77,20 @@ do { \ | |||
| 73 | #define SL_AP0 (1 << 4) | 77 | #define SL_AP0 (1 << 4) |
| 74 | #define SL_AP1 (2 << 4) | 78 | #define SL_AP1 (2 << 4) |
| 75 | #define SL_SHARED (1 << 10) | 79 | #define SL_SHARED (1 << 10) |
| 80 | #define SL_BUFFERABLE (1 << 2) | ||
| 81 | #define SL_CACHEABLE (1 << 3) | ||
| 82 | #define SL_TEX0 (1 << 6) | ||
| 76 | #define SL_OFFSET(va) (((va) & 0xFF000) >> 12) | 83 | #define SL_OFFSET(va) (((va) & 0xFF000) >> 12) |
| 77 | 84 | ||
| 85 | /* Memory type and cache policy attributes */ | ||
| 86 | #define MT_SO 0 | ||
| 87 | #define MT_DEV 1 | ||
| 88 | #define MT_NORMAL 2 | ||
| 89 | #define CP_NONCACHED 0 | ||
| 90 | #define CP_WB_WA 1 | ||
| 91 | #define CP_WT 2 | ||
| 92 | #define CP_WB_NWA 3 | ||
| 93 | |||
| 78 | /* Global register setters / getters */ | 94 | /* Global register setters / getters */ |
| 79 | #define SET_M2VCBR_N(b, N, v) SET_GLOBAL_REG_N(M2VCBR_N, N, (b), (v)) | 95 | #define SET_M2VCBR_N(b, N, v) SET_GLOBAL_REG_N(M2VCBR_N, N, (b), (v)) |
| 80 | #define SET_CBACR_N(b, N, v) SET_GLOBAL_REG_N(CBACR_N, N, (b), (v)) | 96 | #define SET_CBACR_N(b, N, v) SET_GLOBAL_REG_N(CBACR_N, N, (b), (v)) |
| @@ -706,7 +722,9 @@ do { \ | |||
| 706 | #define GET_OCPC5(b, c) GET_CONTEXT_FIELD(b, c, NMRR, OCPC5) | 722 | #define GET_OCPC5(b, c) GET_CONTEXT_FIELD(b, c, NMRR, OCPC5) |
| 707 | #define GET_OCPC6(b, c) GET_CONTEXT_FIELD(b, c, NMRR, OCPC6) | 723 | #define GET_OCPC6(b, c) GET_CONTEXT_FIELD(b, c, NMRR, OCPC6) |
| 708 | #define GET_OCPC7(b, c) GET_CONTEXT_FIELD(b, c, NMRR, OCPC7) | 724 | #define GET_OCPC7(b, c) GET_CONTEXT_FIELD(b, c, NMRR, OCPC7) |
| 709 | 725 | #define NMRR_ICP(nmrr, n) (((nmrr) & (3 << ((n) * 2))) >> ((n) * 2)) | |
| 726 | #define NMRR_OCP(nmrr, n) (((nmrr) & (3 << ((n) * 2 + 16))) >> \ | ||
| 727 | ((n) * 2 + 16)) | ||
| 710 | 728 | ||
| 711 | /* PAR */ | 729 | /* PAR */ |
| 712 | #define GET_FAULT(b, c) GET_CONTEXT_FIELD(b, c, PAR, FAULT) | 730 | #define GET_FAULT(b, c) GET_CONTEXT_FIELD(b, c, PAR, FAULT) |
| @@ -750,6 +768,8 @@ do { \ | |||
| 750 | #define GET_NOS5(b, c) GET_CONTEXT_FIELD(b, c, PRRR, NOS5) | 768 | #define GET_NOS5(b, c) GET_CONTEXT_FIELD(b, c, PRRR, NOS5) |
| 751 | #define GET_NOS6(b, c) GET_CONTEXT_FIELD(b, c, PRRR, NOS6) | 769 | #define GET_NOS6(b, c) GET_CONTEXT_FIELD(b, c, PRRR, NOS6) |
| 752 | #define GET_NOS7(b, c) GET_CONTEXT_FIELD(b, c, PRRR, NOS7) | 770 | #define GET_NOS7(b, c) GET_CONTEXT_FIELD(b, c, PRRR, NOS7) |
| 771 | #define PRRR_NOS(prrr, n) ((prrr) & (1 << ((n) + 24)) ? 1 : 0) | ||
| 772 | #define PRRR_MT(prrr, n) ((((prrr) & (3 << ((n) * 2))) >> ((n) * 2))) | ||
| 753 | 773 | ||
| 754 | 774 | ||
| 755 | /* RESUME */ | 775 | /* RESUME */ |
diff --git a/arch/arm/mach-msm/include/mach/irqs-8x60.h b/arch/arm/mach-msm/include/mach/irqs-8x60.h index 36074cfc9ad..f65841c74c0 100644 --- a/arch/arm/mach-msm/include/mach/irqs-8x60.h +++ b/arch/arm/mach-msm/include/mach/irqs-8x60.h | |||
| @@ -237,7 +237,12 @@ | |||
| 237 | #define GSBI11_QUP_IRQ (GIC_SPI_START + 194) | 237 | #define GSBI11_QUP_IRQ (GIC_SPI_START + 194) |
| 238 | #define INT_UART12DM_IRQ (GIC_SPI_START + 195) | 238 | #define INT_UART12DM_IRQ (GIC_SPI_START + 195) |
| 239 | #define GSBI12_QUP_IRQ (GIC_SPI_START + 196) | 239 | #define GSBI12_QUP_IRQ (GIC_SPI_START + 196) |
| 240 | /*SPI 197 to 216 arent used in 8x60*/ | 240 | |
| 241 | /*SPI 197 to 209 arent used in 8x60*/ | ||
| 242 | #define SMMU_GFX2D1_CB_SC_SECURE_IRQ (GIC_SPI_START + 210) | ||
| 243 | #define SMMU_GFX2D1_CB_SC_NON_SECURE_IRQ (GIC_SPI_START + 211) | ||
| 244 | |||
| 245 | /*SPI 212 to 216 arent used in 8x60*/ | ||
| 241 | #define SMPSS_SPARE_1 (GIC_SPI_START + 217) | 246 | #define SMPSS_SPARE_1 (GIC_SPI_START + 217) |
| 242 | #define SMPSS_SPARE_2 (GIC_SPI_START + 218) | 247 | #define SMPSS_SPARE_2 (GIC_SPI_START + 218) |
| 243 | #define SMPSS_SPARE_3 (GIC_SPI_START + 219) | 248 | #define SMPSS_SPARE_3 (GIC_SPI_START + 219) |
diff --git a/arch/arm/mach-msm/include/mach/msm_iomap-7x30.h b/arch/arm/mach-msm/include/mach/msm_iomap-7x30.h index 8a00c2defbc..0fd7b68ca11 100644 --- a/arch/arm/mach-msm/include/mach/msm_iomap-7x30.h +++ b/arch/arm/mach-msm/include/mach/msm_iomap-7x30.h | |||
| @@ -119,4 +119,7 @@ | |||
| 119 | #define MSM_AD5_PHYS 0xA7000000 | 119 | #define MSM_AD5_PHYS 0xA7000000 |
| 120 | #define MSM_AD5_SIZE (SZ_1M*13) | 120 | #define MSM_AD5_SIZE (SZ_1M*13) |
| 121 | 121 | ||
| 122 | #define MSM_HSUSB_PHYS 0xA3600000 | ||
| 123 | #define MSM_HSUSB_SIZE SZ_1K | ||
| 124 | |||
| 122 | #endif | 125 | #endif |
diff --git a/arch/arm/mach-msm/include/mach/msm_iomap-8x60.h b/arch/arm/mach-msm/include/mach/msm_iomap-8x60.h index 45bab50e3ee..7c43a9bff1a 100644 --- a/arch/arm/mach-msm/include/mach/msm_iomap-8x60.h +++ b/arch/arm/mach-msm/include/mach/msm_iomap-8x60.h | |||
| @@ -98,4 +98,7 @@ | |||
| 98 | #define MSM_IOMMU_GFX2D0_PHYS 0x07D00000 | 98 | #define MSM_IOMMU_GFX2D0_PHYS 0x07D00000 |
| 99 | #define MSM_IOMMU_GFX2D0_SIZE SZ_1M | 99 | #define MSM_IOMMU_GFX2D0_SIZE SZ_1M |
| 100 | 100 | ||
| 101 | #define MSM_IOMMU_GFX2D1_PHYS 0x07E00000 | ||
| 102 | #define MSM_IOMMU_GFX2D1_SIZE SZ_1M | ||
| 103 | |||
| 101 | #endif | 104 | #endif |
diff --git a/arch/arm/mach-msm/io.c b/arch/arm/mach-msm/io.c index d36b6107414..f912d7bf188 100644 --- a/arch/arm/mach-msm/io.c +++ b/arch/arm/mach-msm/io.c | |||
| @@ -163,3 +163,4 @@ __msm_ioremap(unsigned long phys_addr, size_t size, unsigned int mtype) | |||
| 163 | return __arm_ioremap_caller(phys_addr, size, mtype, | 163 | return __arm_ioremap_caller(phys_addr, size, mtype, |
| 164 | __builtin_return_address(0)); | 164 | __builtin_return_address(0)); |
| 165 | } | 165 | } |
| 166 | EXPORT_SYMBOL(__msm_ioremap); | ||
diff --git a/arch/arm/mach-msm/iommu.c b/arch/arm/mach-msm/iommu.c index f71747db3be..e2d58e4cb0d 100644 --- a/arch/arm/mach-msm/iommu.c +++ b/arch/arm/mach-msm/iommu.c | |||
| @@ -33,6 +33,16 @@ | |||
| 33 | #include <mach/iommu_hw-8xxx.h> | 33 | #include <mach/iommu_hw-8xxx.h> |
| 34 | #include <mach/iommu.h> | 34 | #include <mach/iommu.h> |
| 35 | 35 | ||
| 36 | #define MRC(reg, processor, op1, crn, crm, op2) \ | ||
| 37 | __asm__ __volatile__ ( \ | ||
| 38 | " mrc " #processor "," #op1 ", %0," #crn "," #crm "," #op2 "\n" \ | ||
| 39 | : "=r" (reg)) | ||
| 40 | |||
| 41 | #define RCP15_PRRR(reg) MRC(reg, p15, 0, c10, c2, 0) | ||
| 42 | #define RCP15_NMRR(reg) MRC(reg, p15, 0, c10, c2, 1) | ||
| 43 | |||
| 44 | static int msm_iommu_tex_class[4]; | ||
| 45 | |||
| 36 | DEFINE_SPINLOCK(msm_iommu_lock); | 46 | DEFINE_SPINLOCK(msm_iommu_lock); |
| 37 | 47 | ||
| 38 | struct msm_priv { | 48 | struct msm_priv { |
| @@ -40,23 +50,26 @@ struct msm_priv { | |||
| 40 | struct list_head list_attached; | 50 | struct list_head list_attached; |
| 41 | }; | 51 | }; |
| 42 | 52 | ||
| 43 | static void __flush_iotlb(struct iommu_domain *domain) | 53 | static int __flush_iotlb(struct iommu_domain *domain) |
| 44 | { | 54 | { |
| 45 | struct msm_priv *priv = domain->priv; | 55 | struct msm_priv *priv = domain->priv; |
| 46 | struct msm_iommu_drvdata *iommu_drvdata; | 56 | struct msm_iommu_drvdata *iommu_drvdata; |
| 47 | struct msm_iommu_ctx_drvdata *ctx_drvdata; | 57 | struct msm_iommu_ctx_drvdata *ctx_drvdata; |
| 48 | 58 | int ret = 0; | |
| 49 | #ifndef CONFIG_IOMMU_PGTABLES_L2 | 59 | #ifndef CONFIG_IOMMU_PGTABLES_L2 |
| 50 | unsigned long *fl_table = priv->pgtable; | 60 | unsigned long *fl_table = priv->pgtable; |
| 51 | int i; | 61 | int i; |
| 52 | 62 | ||
| 53 | dmac_flush_range(fl_table, fl_table + SZ_16K); | 63 | if (!list_empty(&priv->list_attached)) { |
| 64 | dmac_flush_range(fl_table, fl_table + SZ_16K); | ||
| 54 | 65 | ||
| 55 | for (i = 0; i < NUM_FL_PTE; i++) | 66 | for (i = 0; i < NUM_FL_PTE; i++) |
| 56 | if ((fl_table[i] & 0x03) == FL_TYPE_TABLE) { | 67 | if ((fl_table[i] & 0x03) == FL_TYPE_TABLE) { |
| 57 | void *sl_table = __va(fl_table[i] & FL_BASE_MASK); | 68 | void *sl_table = __va(fl_table[i] & |
| 58 | dmac_flush_range(sl_table, sl_table + SZ_4K); | 69 | FL_BASE_MASK); |
| 59 | } | 70 | dmac_flush_range(sl_table, sl_table + SZ_4K); |
| 71 | } | ||
| 72 | } | ||
| 60 | #endif | 73 | #endif |
| 61 | 74 | ||
| 62 | list_for_each_entry(ctx_drvdata, &priv->list_attached, attached_elm) { | 75 | list_for_each_entry(ctx_drvdata, &priv->list_attached, attached_elm) { |
| @@ -66,6 +79,8 @@ static void __flush_iotlb(struct iommu_domain *domain) | |||
| 66 | iommu_drvdata = dev_get_drvdata(ctx_drvdata->pdev->dev.parent); | 79 | iommu_drvdata = dev_get_drvdata(ctx_drvdata->pdev->dev.parent); |
| 67 | SET_CTX_TLBIALL(iommu_drvdata->base, ctx_drvdata->num, 0); | 80 | SET_CTX_TLBIALL(iommu_drvdata->base, ctx_drvdata->num, 0); |
| 68 | } | 81 | } |
| 82 | |||
| 83 | return ret; | ||
| 69 | } | 84 | } |
| 70 | 85 | ||
| 71 | static void __reset_context(void __iomem *base, int ctx) | 86 | static void __reset_context(void __iomem *base, int ctx) |
| @@ -95,6 +110,7 @@ static void __reset_context(void __iomem *base, int ctx) | |||
| 95 | 110 | ||
| 96 | static void __program_context(void __iomem *base, int ctx, phys_addr_t pgtable) | 111 | static void __program_context(void __iomem *base, int ctx, phys_addr_t pgtable) |
| 97 | { | 112 | { |
| 113 | unsigned int prrr, nmrr; | ||
| 98 | __reset_context(base, ctx); | 114 | __reset_context(base, ctx); |
| 99 | 115 | ||
| 100 | /* Set up HTW mode */ | 116 | /* Set up HTW mode */ |
| @@ -127,11 +143,11 @@ static void __program_context(void __iomem *base, int ctx, phys_addr_t pgtable) | |||
| 127 | /* Turn on TEX Remap */ | 143 | /* Turn on TEX Remap */ |
| 128 | SET_TRE(base, ctx, 1); | 144 | SET_TRE(base, ctx, 1); |
| 129 | 145 | ||
| 130 | /* Do not configure PRRR / NMRR on the IOMMU for now. We will assume | 146 | /* Set TEX remap attributes */ |
| 131 | * TEX class 0 for everything until attributes are properly worked out | 147 | RCP15_PRRR(prrr); |
| 132 | */ | 148 | RCP15_NMRR(nmrr); |
| 133 | SET_PRRR(base, ctx, 0); | 149 | SET_PRRR(base, ctx, prrr); |
| 134 | SET_NMRR(base, ctx, 0); | 150 | SET_NMRR(base, ctx, nmrr); |
| 135 | 151 | ||
| 136 | /* Turn on BFB prefetch */ | 152 | /* Turn on BFB prefetch */ |
| 137 | SET_BFBDFE(base, ctx, 1); | 153 | SET_BFBDFE(base, ctx, 1); |
| @@ -238,6 +254,11 @@ static int msm_iommu_attach_dev(struct iommu_domain *domain, struct device *dev) | |||
| 238 | goto fail; | 254 | goto fail; |
| 239 | } | 255 | } |
| 240 | 256 | ||
| 257 | if (!list_empty(&ctx_drvdata->attached_elm)) { | ||
| 258 | ret = -EBUSY; | ||
| 259 | goto fail; | ||
| 260 | } | ||
| 261 | |||
| 241 | list_for_each_entry(tmp_drvdata, &priv->list_attached, attached_elm) | 262 | list_for_each_entry(tmp_drvdata, &priv->list_attached, attached_elm) |
| 242 | if (tmp_drvdata == ctx_drvdata) { | 263 | if (tmp_drvdata == ctx_drvdata) { |
| 243 | ret = -EBUSY; | 264 | ret = -EBUSY; |
| @@ -248,7 +269,7 @@ static int msm_iommu_attach_dev(struct iommu_domain *domain, struct device *dev) | |||
| 248 | __pa(priv->pgtable)); | 269 | __pa(priv->pgtable)); |
| 249 | 270 | ||
| 250 | list_add(&(ctx_drvdata->attached_elm), &priv->list_attached); | 271 | list_add(&(ctx_drvdata->attached_elm), &priv->list_attached); |
| 251 | __flush_iotlb(domain); | 272 | ret = __flush_iotlb(domain); |
| 252 | 273 | ||
| 253 | fail: | 274 | fail: |
| 254 | spin_unlock_irqrestore(&msm_iommu_lock, flags); | 275 | spin_unlock_irqrestore(&msm_iommu_lock, flags); |
| @@ -263,6 +284,7 @@ static void msm_iommu_detach_dev(struct iommu_domain *domain, | |||
| 263 | struct msm_iommu_drvdata *iommu_drvdata; | 284 | struct msm_iommu_drvdata *iommu_drvdata; |
| 264 | struct msm_iommu_ctx_drvdata *ctx_drvdata; | 285 | struct msm_iommu_ctx_drvdata *ctx_drvdata; |
| 265 | unsigned long flags; | 286 | unsigned long flags; |
| 287 | int ret; | ||
| 266 | 288 | ||
| 267 | spin_lock_irqsave(&msm_iommu_lock, flags); | 289 | spin_lock_irqsave(&msm_iommu_lock, flags); |
| 268 | priv = domain->priv; | 290 | priv = domain->priv; |
| @@ -277,7 +299,10 @@ static void msm_iommu_detach_dev(struct iommu_domain *domain, | |||
| 277 | if (!iommu_drvdata || !ctx_drvdata || !ctx_dev) | 299 | if (!iommu_drvdata || !ctx_drvdata || !ctx_dev) |
| 278 | goto fail; | 300 | goto fail; |
| 279 | 301 | ||
| 280 | __flush_iotlb(domain); | 302 | ret = __flush_iotlb(domain); |
| 303 | if (ret) | ||
| 304 | goto fail; | ||
| 305 | |||
| 281 | __reset_context(iommu_drvdata->base, ctx_dev->num); | 306 | __reset_context(iommu_drvdata->base, ctx_dev->num); |
| 282 | list_del_init(&ctx_drvdata->attached_elm); | 307 | list_del_init(&ctx_drvdata->attached_elm); |
| 283 | 308 | ||
| @@ -296,12 +321,21 @@ static int msm_iommu_map(struct iommu_domain *domain, unsigned long va, | |||
| 296 | unsigned long *sl_table; | 321 | unsigned long *sl_table; |
| 297 | unsigned long *sl_pte; | 322 | unsigned long *sl_pte; |
| 298 | unsigned long sl_offset; | 323 | unsigned long sl_offset; |
| 324 | unsigned int pgprot; | ||
| 299 | size_t len = 0x1000UL << order; | 325 | size_t len = 0x1000UL << order; |
| 300 | int ret = 0; | 326 | int ret = 0, tex, sh; |
| 301 | 327 | ||
| 302 | spin_lock_irqsave(&msm_iommu_lock, flags); | 328 | spin_lock_irqsave(&msm_iommu_lock, flags); |
| 303 | priv = domain->priv; | ||
| 304 | 329 | ||
| 330 | sh = (prot & MSM_IOMMU_ATTR_SH) ? 1 : 0; | ||
| 331 | tex = msm_iommu_tex_class[prot & MSM_IOMMU_CP_MASK]; | ||
| 332 | |||
| 333 | if (tex < 0 || tex > NUM_TEX_CLASS - 1) { | ||
| 334 | ret = -EINVAL; | ||
| 335 | goto fail; | ||
| 336 | } | ||
| 337 | |||
| 338 | priv = domain->priv; | ||
| 305 | if (!priv) { | 339 | if (!priv) { |
| 306 | ret = -EINVAL; | 340 | ret = -EINVAL; |
| 307 | goto fail; | 341 | goto fail; |
| @@ -322,6 +356,18 @@ static int msm_iommu_map(struct iommu_domain *domain, unsigned long va, | |||
| 322 | goto fail; | 356 | goto fail; |
| 323 | } | 357 | } |
| 324 | 358 | ||
| 359 | if (len == SZ_16M || len == SZ_1M) { | ||
| 360 | pgprot = sh ? FL_SHARED : 0; | ||
| 361 | pgprot |= tex & 0x01 ? FL_BUFFERABLE : 0; | ||
| 362 | pgprot |= tex & 0x02 ? FL_CACHEABLE : 0; | ||
| 363 | pgprot |= tex & 0x04 ? FL_TEX0 : 0; | ||
| 364 | } else { | ||
| 365 | pgprot = sh ? SL_SHARED : 0; | ||
| 366 | pgprot |= tex & 0x01 ? SL_BUFFERABLE : 0; | ||
| 367 | pgprot |= tex & 0x02 ? SL_CACHEABLE : 0; | ||
| 368 | pgprot |= tex & 0x04 ? SL_TEX0 : 0; | ||
| 369 | } | ||
| 370 | |||
| 325 | fl_offset = FL_OFFSET(va); /* Upper 12 bits */ | 371 | fl_offset = FL_OFFSET(va); /* Upper 12 bits */ |
| 326 | fl_pte = fl_table + fl_offset; /* int pointers, 4 bytes */ | 372 | fl_pte = fl_table + fl_offset; /* int pointers, 4 bytes */ |
| 327 | 373 | ||
| @@ -330,17 +376,17 @@ static int msm_iommu_map(struct iommu_domain *domain, unsigned long va, | |||
| 330 | for (i = 0; i < 16; i++) | 376 | for (i = 0; i < 16; i++) |
| 331 | *(fl_pte+i) = (pa & 0xFF000000) | FL_SUPERSECTION | | 377 | *(fl_pte+i) = (pa & 0xFF000000) | FL_SUPERSECTION | |
| 332 | FL_AP_READ | FL_AP_WRITE | FL_TYPE_SECT | | 378 | FL_AP_READ | FL_AP_WRITE | FL_TYPE_SECT | |
| 333 | FL_SHARED; | 379 | FL_SHARED | pgprot; |
| 334 | } | 380 | } |
| 335 | 381 | ||
| 336 | if (len == SZ_1M) | 382 | if (len == SZ_1M) |
| 337 | *fl_pte = (pa & 0xFFF00000) | FL_AP_READ | FL_AP_WRITE | | 383 | *fl_pte = (pa & 0xFFF00000) | FL_AP_READ | FL_AP_WRITE | |
| 338 | FL_TYPE_SECT | FL_SHARED; | 384 | FL_TYPE_SECT | FL_SHARED | pgprot; |
| 339 | 385 | ||
| 340 | /* Need a 2nd level table */ | 386 | /* Need a 2nd level table */ |
| 341 | if ((len == SZ_4K || len == SZ_64K) && (*fl_pte) == 0) { | 387 | if ((len == SZ_4K || len == SZ_64K) && (*fl_pte) == 0) { |
| 342 | unsigned long *sl; | 388 | unsigned long *sl; |
| 343 | sl = (unsigned long *) __get_free_pages(GFP_KERNEL, | 389 | sl = (unsigned long *) __get_free_pages(GFP_ATOMIC, |
| 344 | get_order(SZ_4K)); | 390 | get_order(SZ_4K)); |
| 345 | 391 | ||
| 346 | if (!sl) { | 392 | if (!sl) { |
| @@ -360,17 +406,17 @@ static int msm_iommu_map(struct iommu_domain *domain, unsigned long va, | |||
| 360 | 406 | ||
| 361 | if (len == SZ_4K) | 407 | if (len == SZ_4K) |
| 362 | *sl_pte = (pa & SL_BASE_MASK_SMALL) | SL_AP0 | SL_AP1 | | 408 | *sl_pte = (pa & SL_BASE_MASK_SMALL) | SL_AP0 | SL_AP1 | |
| 363 | SL_SHARED | SL_TYPE_SMALL; | 409 | SL_SHARED | SL_TYPE_SMALL | pgprot; |
| 364 | 410 | ||
| 365 | if (len == SZ_64K) { | 411 | if (len == SZ_64K) { |
| 366 | int i; | 412 | int i; |
| 367 | 413 | ||
| 368 | for (i = 0; i < 16; i++) | 414 | for (i = 0; i < 16; i++) |
| 369 | *(sl_pte+i) = (pa & SL_BASE_MASK_LARGE) | SL_AP0 | | 415 | *(sl_pte+i) = (pa & SL_BASE_MASK_LARGE) | SL_AP0 | |
| 370 | SL_AP1 | SL_SHARED | SL_TYPE_LARGE; | 416 | SL_AP1 | SL_SHARED | SL_TYPE_LARGE | pgprot; |
| 371 | } | 417 | } |
| 372 | 418 | ||
| 373 | __flush_iotlb(domain); | 419 | ret = __flush_iotlb(domain); |
| 374 | fail: | 420 | fail: |
| 375 | spin_unlock_irqrestore(&msm_iommu_lock, flags); | 421 | spin_unlock_irqrestore(&msm_iommu_lock, flags); |
| 376 | return ret; | 422 | return ret; |
| @@ -455,7 +501,7 @@ static int msm_iommu_unmap(struct iommu_domain *domain, unsigned long va, | |||
| 455 | } | 501 | } |
| 456 | } | 502 | } |
| 457 | 503 | ||
| 458 | __flush_iotlb(domain); | 504 | ret = __flush_iotlb(domain); |
| 459 | fail: | 505 | fail: |
| 460 | spin_unlock_irqrestore(&msm_iommu_lock, flags); | 506 | spin_unlock_irqrestore(&msm_iommu_lock, flags); |
| 461 | return ret; | 507 | return ret; |
| @@ -490,9 +536,6 @@ static phys_addr_t msm_iommu_iova_to_phys(struct iommu_domain *domain, | |||
| 490 | SET_CTX_TLBIALL(base, ctx, 0); | 536 | SET_CTX_TLBIALL(base, ctx, 0); |
| 491 | SET_V2PPR_VA(base, ctx, va >> V2Pxx_VA_SHIFT); | 537 | SET_V2PPR_VA(base, ctx, va >> V2Pxx_VA_SHIFT); |
| 492 | 538 | ||
| 493 | if (GET_FAULT(base, ctx)) | ||
| 494 | goto fail; | ||
| 495 | |||
| 496 | par = GET_PAR(base, ctx); | 539 | par = GET_PAR(base, ctx); |
| 497 | 540 | ||
| 498 | /* We are dealing with a supersection */ | 541 | /* We are dealing with a supersection */ |
| @@ -501,6 +544,9 @@ static phys_addr_t msm_iommu_iova_to_phys(struct iommu_domain *domain, | |||
| 501 | else /* Upper 20 bits from PAR, lower 12 from VA */ | 544 | else /* Upper 20 bits from PAR, lower 12 from VA */ |
| 502 | ret = (par & 0xFFFFF000) | (va & 0x00000FFF); | 545 | ret = (par & 0xFFFFF000) | (va & 0x00000FFF); |
| 503 | 546 | ||
| 547 | if (GET_FAULT(base, ctx)) | ||
| 548 | ret = 0; | ||
| 549 | |||
| 504 | fail: | 550 | fail: |
| 505 | spin_unlock_irqrestore(&msm_iommu_lock, flags); | 551 | spin_unlock_irqrestore(&msm_iommu_lock, flags); |
| 506 | return ret; | 552 | return ret; |
| @@ -543,8 +589,8 @@ irqreturn_t msm_iommu_fault_handler(int irq, void *dev_id) | |||
| 543 | { | 589 | { |
| 544 | struct msm_iommu_drvdata *drvdata = dev_id; | 590 | struct msm_iommu_drvdata *drvdata = dev_id; |
| 545 | void __iomem *base; | 591 | void __iomem *base; |
| 546 | unsigned int fsr = 0; | 592 | unsigned int fsr; |
| 547 | int ncb = 0, i = 0; | 593 | int ncb, i; |
| 548 | 594 | ||
| 549 | spin_lock(&msm_iommu_lock); | 595 | spin_lock(&msm_iommu_lock); |
| 550 | 596 | ||
| @@ -555,7 +601,6 @@ irqreturn_t msm_iommu_fault_handler(int irq, void *dev_id) | |||
| 555 | 601 | ||
| 556 | base = drvdata->base; | 602 | base = drvdata->base; |
| 557 | 603 | ||
| 558 | pr_err("===== WOAH! =====\n"); | ||
| 559 | pr_err("Unexpected IOMMU page fault!\n"); | 604 | pr_err("Unexpected IOMMU page fault!\n"); |
| 560 | pr_err("base = %08x\n", (unsigned int) base); | 605 | pr_err("base = %08x\n", (unsigned int) base); |
| 561 | 606 | ||
| @@ -585,8 +630,47 @@ static struct iommu_ops msm_iommu_ops = { | |||
| 585 | .domain_has_cap = msm_iommu_domain_has_cap | 630 | .domain_has_cap = msm_iommu_domain_has_cap |
| 586 | }; | 631 | }; |
| 587 | 632 | ||
| 588 | static int msm_iommu_init(void) | 633 | static int __init get_tex_class(int icp, int ocp, int mt, int nos) |
| 634 | { | ||
| 635 | int i = 0; | ||
| 636 | unsigned int prrr = 0; | ||
| 637 | unsigned int nmrr = 0; | ||
| 638 | int c_icp, c_ocp, c_mt, c_nos; | ||
| 639 | |||
| 640 | RCP15_PRRR(prrr); | ||
| 641 | RCP15_NMRR(nmrr); | ||
| 642 | |||
| 643 | for (i = 0; i < NUM_TEX_CLASS; i++) { | ||
| 644 | c_nos = PRRR_NOS(prrr, i); | ||
| 645 | c_mt = PRRR_MT(prrr, i); | ||
| 646 | c_icp = NMRR_ICP(nmrr, i); | ||
| 647 | c_ocp = NMRR_OCP(nmrr, i); | ||
| 648 | |||
| 649 | if (icp == c_icp && ocp == c_ocp && c_mt == mt && c_nos == nos) | ||
| 650 | return i; | ||
| 651 | } | ||
| 652 | |||
| 653 | return -ENODEV; | ||
| 654 | } | ||
| 655 | |||
| 656 | static void __init setup_iommu_tex_classes(void) | ||
| 657 | { | ||
| 658 | msm_iommu_tex_class[MSM_IOMMU_ATTR_NONCACHED] = | ||
| 659 | get_tex_class(CP_NONCACHED, CP_NONCACHED, MT_NORMAL, 1); | ||
| 660 | |||
| 661 | msm_iommu_tex_class[MSM_IOMMU_ATTR_CACHED_WB_WA] = | ||
| 662 | get_tex_class(CP_WB_WA, CP_WB_WA, MT_NORMAL, 1); | ||
| 663 | |||
| 664 | msm_iommu_tex_class[MSM_IOMMU_ATTR_CACHED_WB_NWA] = | ||
| 665 | get_tex_class(CP_WB_NWA, CP_WB_NWA, MT_NORMAL, 1); | ||
| 666 | |||
| 667 | msm_iommu_tex_class[MSM_IOMMU_ATTR_CACHED_WT] = | ||
| 668 | get_tex_class(CP_WT, CP_WT, MT_NORMAL, 1); | ||
| 669 | } | ||
| 670 | |||
| 671 | static int __init msm_iommu_init(void) | ||
| 589 | { | 672 | { |
| 673 | setup_iommu_tex_classes(); | ||
| 590 | register_iommu(&msm_iommu_ops); | 674 | register_iommu(&msm_iommu_ops); |
| 591 | return 0; | 675 | return 0; |
| 592 | } | 676 | } |
diff --git a/arch/arm/mach-msm/iommu_dev.c b/arch/arm/mach-msm/iommu_dev.c index 9019cee2907..b83c73b41fd 100644 --- a/arch/arm/mach-msm/iommu_dev.c +++ b/arch/arm/mach-msm/iommu_dev.c | |||
| @@ -346,7 +346,7 @@ static struct platform_driver msm_iommu_ctx_driver = { | |||
| 346 | .remove = msm_iommu_ctx_remove, | 346 | .remove = msm_iommu_ctx_remove, |
| 347 | }; | 347 | }; |
| 348 | 348 | ||
| 349 | static int msm_iommu_driver_init(void) | 349 | static int __init msm_iommu_driver_init(void) |
| 350 | { | 350 | { |
| 351 | int ret; | 351 | int ret; |
| 352 | ret = platform_driver_register(&msm_iommu_driver); | 352 | ret = platform_driver_register(&msm_iommu_driver); |
| @@ -365,7 +365,7 @@ error: | |||
| 365 | return ret; | 365 | return ret; |
| 366 | } | 366 | } |
| 367 | 367 | ||
| 368 | static void msm_iommu_driver_exit(void) | 368 | static void __exit msm_iommu_driver_exit(void) |
| 369 | { | 369 | { |
| 370 | platform_driver_unregister(&msm_iommu_ctx_driver); | 370 | platform_driver_unregister(&msm_iommu_ctx_driver); |
| 371 | platform_driver_unregister(&msm_iommu_driver); | 371 | platform_driver_unregister(&msm_iommu_driver); |
diff --git a/arch/arm/mach-msm/sirc.c b/arch/arm/mach-msm/sirc.c index b0794524ba6..152eefda3ce 100644 --- a/arch/arm/mach-msm/sirc.c +++ b/arch/arm/mach-msm/sirc.c | |||
| @@ -40,9 +40,6 @@ static struct sirc_cascade_regs sirc_reg_table[] = { | |||
| 40 | } | 40 | } |
| 41 | }; | 41 | }; |
| 42 | 42 | ||
| 43 | static unsigned int save_type; | ||
| 44 | static unsigned int save_polarity; | ||
| 45 | |||
| 46 | /* Mask off the given interrupt. Keep the int_enable mask in sync with | 43 | /* Mask off the given interrupt. Keep the int_enable mask in sync with |
| 47 | the enable reg, so it can be restored after power collapse. */ | 44 | the enable reg, so it can be restored after power collapse. */ |
| 48 | static void sirc_irq_mask(unsigned int irq) | 45 | static void sirc_irq_mask(unsigned int irq) |
diff --git a/arch/arm/mach-msm/smd.c b/arch/arm/mach-msm/smd.c index f07dc7c738f..657be73297d 100644 --- a/arch/arm/mach-msm/smd.c +++ b/arch/arm/mach-msm/smd.c | |||
| @@ -14,6 +14,8 @@ | |||
| 14 | * | 14 | * |
| 15 | */ | 15 | */ |
| 16 | 16 | ||
| 17 | #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt | ||
| 18 | |||
| 17 | #include <linux/platform_device.h> | 19 | #include <linux/platform_device.h> |
| 18 | #include <linux/module.h> | 20 | #include <linux/module.h> |
| 19 | #include <linux/fs.h> | 21 | #include <linux/fs.h> |
| @@ -89,7 +91,7 @@ static void smd_diag(void) | |||
| 89 | x = smem_find(ID_DIAG_ERR_MSG, SZ_DIAG_ERR_MSG); | 91 | x = smem_find(ID_DIAG_ERR_MSG, SZ_DIAG_ERR_MSG); |
| 90 | if (x != 0) { | 92 | if (x != 0) { |
| 91 | x[SZ_DIAG_ERR_MSG - 1] = 0; | 93 | x[SZ_DIAG_ERR_MSG - 1] = 0; |
| 92 | pr_info("smem: DIAG '%s'\n", x); | 94 | pr_debug("DIAG '%s'\n", x); |
| 93 | } | 95 | } |
| 94 | } | 96 | } |
| 95 | 97 | ||
| @@ -312,7 +314,7 @@ static void smd_state_change(struct smd_channel *ch, | |||
| 312 | { | 314 | { |
| 313 | ch->last_state = next; | 315 | ch->last_state = next; |
| 314 | 316 | ||
| 315 | pr_info("SMD: ch %d %d -> %d\n", ch->n, last, next); | 317 | pr_debug("ch %d %d -> %d\n", ch->n, last, next); |
| 316 | 318 | ||
| 317 | switch (next) { | 319 | switch (next) { |
| 318 | case SMD_SS_OPENING: | 320 | case SMD_SS_OPENING: |
| @@ -601,7 +603,7 @@ static int smd_alloc_channel(const char *name, uint32_t cid, uint32_t type) | |||
| 601 | ch->pdev.name = ch->name; | 603 | ch->pdev.name = ch->name; |
| 602 | ch->pdev.id = -1; | 604 | ch->pdev.id = -1; |
| 603 | 605 | ||
| 604 | pr_info("smd_alloc_channel() cid=%02d size=%05d '%s'\n", | 606 | pr_debug("smd_alloc_channel() cid=%02d size=%05d '%s'\n", |
| 605 | ch->n, ch->fifo_size, ch->name); | 607 | ch->n, ch->fifo_size, ch->name); |
| 606 | 608 | ||
| 607 | mutex_lock(&smd_creation_mutex); | 609 | mutex_lock(&smd_creation_mutex); |
| @@ -621,7 +623,7 @@ static void smd_channel_probe_worker(struct work_struct *work) | |||
| 621 | 623 | ||
| 622 | shared = smem_find(ID_CH_ALLOC_TBL, sizeof(*shared) * 64); | 624 | shared = smem_find(ID_CH_ALLOC_TBL, sizeof(*shared) * 64); |
| 623 | if (!shared) { | 625 | if (!shared) { |
| 624 | pr_err("smd: cannot find allocation table\n"); | 626 | pr_err("cannot find allocation table\n"); |
| 625 | return; | 627 | return; |
| 626 | } | 628 | } |
| 627 | for (n = 0; n < 64; n++) { | 629 | for (n = 0; n < 64; n++) { |
| @@ -725,8 +727,6 @@ int smd_close(smd_channel_t *ch) | |||
| 725 | { | 727 | { |
| 726 | unsigned long flags; | 728 | unsigned long flags; |
| 727 | 729 | ||
| 728 | pr_info("smd_close(%p)\n", ch); | ||
| 729 | |||
| 730 | if (ch == 0) | 730 | if (ch == 0) |
| 731 | return -1; | 731 | return -1; |
| 732 | 732 | ||
| @@ -939,7 +939,6 @@ int smsm_set_sleep_duration(uint32_t delay) | |||
| 939 | int smd_core_init(void) | 939 | int smd_core_init(void) |
| 940 | { | 940 | { |
| 941 | int r; | 941 | int r; |
| 942 | pr_info("smd_core_init()\n"); | ||
| 943 | 942 | ||
| 944 | /* wait for essential items to be initialized */ | 943 | /* wait for essential items to be initialized */ |
| 945 | for (;;) { | 944 | for (;;) { |
| @@ -992,15 +991,11 @@ int smd_core_init(void) | |||
| 992 | smsm_change_state(SMSM_STATE_APPS_DEM, ~0, 0); | 991 | smsm_change_state(SMSM_STATE_APPS_DEM, ~0, 0); |
| 993 | #endif | 992 | #endif |
| 994 | 993 | ||
| 995 | pr_info("smd_core_init() done\n"); | ||
| 996 | |||
| 997 | return 0; | 994 | return 0; |
| 998 | } | 995 | } |
| 999 | 996 | ||
| 1000 | static int __devinit msm_smd_probe(struct platform_device *pdev) | 997 | static int __devinit msm_smd_probe(struct platform_device *pdev) |
| 1001 | { | 998 | { |
| 1002 | pr_info("smd_init()\n"); | ||
| 1003 | |||
| 1004 | /* | 999 | /* |
| 1005 | * If we haven't waited for the ARM9 to boot up till now, | 1000 | * If we haven't waited for the ARM9 to boot up till now, |
| 1006 | * then we need to wait here. Otherwise this should just | 1001 | * then we need to wait here. Otherwise this should just |
diff --git a/arch/arm/mach-msm/smd_debug.c b/arch/arm/mach-msm/smd_debug.c index f91c3b7bc65..8736afff82f 100644 --- a/arch/arm/mach-msm/smd_debug.c +++ b/arch/arm/mach-msm/smd_debug.c | |||
| @@ -270,8 +270,10 @@ void smsm_print_sleep_info(void) | |||
| 270 | { | 270 | { |
| 271 | unsigned long flags; | 271 | unsigned long flags; |
| 272 | uint32_t *ptr; | 272 | uint32_t *ptr; |
| 273 | #ifndef CONFIG_ARCH_MSM_SCORPION | ||
| 273 | struct tramp_gpio_smem *gpio; | 274 | struct tramp_gpio_smem *gpio; |
| 274 | struct smsm_interrupt_info *int_info; | 275 | struct smsm_interrupt_info *int_info; |
| 276 | #endif | ||
| 275 | 277 | ||
| 276 | 278 | ||
| 277 | spin_lock_irqsave(&smem_lock, flags); | 279 | spin_lock_irqsave(&smem_lock, flags); |
diff --git a/arch/arm/mach-omap2/board-omap3pandora.c b/arch/arm/mach-omap2/board-omap3pandora.c index 89ed1be2d62..8be26150605 100644 --- a/arch/arm/mach-omap2/board-omap3pandora.c +++ b/arch/arm/mach-omap2/board-omap3pandora.c | |||
| @@ -642,31 +642,13 @@ static void __init omap3pandora_init_irq(void) | |||
| 642 | omap_gpio_init(); | 642 | omap_gpio_init(); |
| 643 | } | 643 | } |
| 644 | 644 | ||
| 645 | static void pandora_wl1251_set_power(bool enable) | 645 | static void __init pandora_wl1251_init(void) |
| 646 | { | ||
| 647 | /* | ||
| 648 | * Keep power always on until wl1251_sdio driver learns to re-init | ||
| 649 | * the chip after powering it down and back up. | ||
| 650 | */ | ||
| 651 | } | ||
| 652 | |||
| 653 | static struct wl12xx_platform_data pandora_wl1251_pdata = { | ||
| 654 | .set_power = pandora_wl1251_set_power, | ||
| 655 | .use_eeprom = true, | ||
| 656 | }; | ||
| 657 | |||
| 658 | static struct platform_device pandora_wl1251_data = { | ||
| 659 | .name = "wl1251_data", | ||
| 660 | .id = -1, | ||
| 661 | .dev = { | ||
| 662 | .platform_data = &pandora_wl1251_pdata, | ||
| 663 | }, | ||
| 664 | }; | ||
| 665 | |||
| 666 | static void pandora_wl1251_init(void) | ||
| 667 | { | 646 | { |
| 647 | struct wl12xx_platform_data pandora_wl1251_pdata; | ||
| 668 | int ret; | 648 | int ret; |
| 669 | 649 | ||
| 650 | memset(&pandora_wl1251_pdata, 0, sizeof(pandora_wl1251_pdata)); | ||
| 651 | |||
| 670 | ret = gpio_request(PANDORA_WIFI_IRQ_GPIO, "wl1251 irq"); | 652 | ret = gpio_request(PANDORA_WIFI_IRQ_GPIO, "wl1251 irq"); |
| 671 | if (ret < 0) | 653 | if (ret < 0) |
| 672 | goto fail; | 654 | goto fail; |
| @@ -679,6 +661,11 @@ static void pandora_wl1251_init(void) | |||
| 679 | if (pandora_wl1251_pdata.irq < 0) | 661 | if (pandora_wl1251_pdata.irq < 0) |
| 680 | goto fail_irq; | 662 | goto fail_irq; |
| 681 | 663 | ||
| 664 | pandora_wl1251_pdata.use_eeprom = true; | ||
| 665 | ret = wl12xx_set_platform_data(&pandora_wl1251_pdata); | ||
| 666 | if (ret < 0) | ||
| 667 | goto fail_irq; | ||
| 668 | |||
| 682 | return; | 669 | return; |
| 683 | 670 | ||
| 684 | fail_irq: | 671 | fail_irq: |
| @@ -691,7 +678,6 @@ static struct platform_device *omap3pandora_devices[] __initdata = { | |||
| 691 | &pandora_leds_gpio, | 678 | &pandora_leds_gpio, |
| 692 | &pandora_keys_gpio, | 679 | &pandora_keys_gpio, |
| 693 | &pandora_dss_device, | 680 | &pandora_dss_device, |
| 694 | &pandora_wl1251_data, | ||
| 695 | &pandora_vwlan_device, | 681 | &pandora_vwlan_device, |
| 696 | }; | 682 | }; |
| 697 | 683 | ||
diff --git a/arch/arm/mach-omap2/board-zoom-peripherals.c b/arch/arm/mach-omap2/board-zoom-peripherals.c index 86c9b210295..9db9203667d 100644 --- a/arch/arm/mach-omap2/board-zoom-peripherals.c +++ b/arch/arm/mach-omap2/board-zoom-peripherals.c | |||
| @@ -216,7 +216,7 @@ static struct omap2_hsmmc_info mmc[] __initdata = { | |||
| 216 | { | 216 | { |
| 217 | .name = "wl1271", | 217 | .name = "wl1271", |
| 218 | .mmc = 3, | 218 | .mmc = 3, |
| 219 | .caps = MMC_CAP_4_BIT_DATA, | 219 | .caps = MMC_CAP_4_BIT_DATA | MMC_CAP_POWER_OFF_CARD, |
| 220 | .gpio_wp = -EINVAL, | 220 | .gpio_wp = -EINVAL, |
| 221 | .gpio_cd = -EINVAL, | 221 | .gpio_cd = -EINVAL, |
| 222 | .nonremovable = true, | 222 | .nonremovable = true, |
diff --git a/arch/arm/mach-omap2/io.c b/arch/arm/mach-omap2/io.c index 40562ddd3ee..a1939b1e6f8 100644 --- a/arch/arm/mach-omap2/io.c +++ b/arch/arm/mach-omap2/io.c | |||
| @@ -297,7 +297,7 @@ static int __init _omap2_init_reprogram_sdrc(void) | |||
| 297 | return 0; | 297 | return 0; |
| 298 | 298 | ||
| 299 | dpll3_m2_ck = clk_get(NULL, "dpll3_m2_ck"); | 299 | dpll3_m2_ck = clk_get(NULL, "dpll3_m2_ck"); |
| 300 | if (!dpll3_m2_ck) | 300 | if (IS_ERR(dpll3_m2_ck)) |
| 301 | return -EINVAL; | 301 | return -EINVAL; |
| 302 | 302 | ||
| 303 | rate = clk_get_rate(dpll3_m2_ck); | 303 | rate = clk_get_rate(dpll3_m2_ck); |
diff --git a/arch/arm/mach-omap2/pm-debug.c b/arch/arm/mach-omap2/pm-debug.c index 5e81517a7af..a8afb610c7d 100644 --- a/arch/arm/mach-omap2/pm-debug.c +++ b/arch/arm/mach-omap2/pm-debug.c | |||
| @@ -161,6 +161,23 @@ void omap2_pm_dump(int mode, int resume, unsigned int us) | |||
| 161 | printk(KERN_INFO "%-20s: 0x%08x\n", regs[i].name, regs[i].val); | 161 | printk(KERN_INFO "%-20s: 0x%08x\n", regs[i].name, regs[i].val); |
| 162 | } | 162 | } |
| 163 | 163 | ||
| 164 | void omap2_pm_wakeup_on_timer(u32 seconds, u32 milliseconds) | ||
| 165 | { | ||
| 166 | u32 tick_rate, cycles; | ||
| 167 | |||
| 168 | if (!seconds && !milliseconds) | ||
| 169 | return; | ||
| 170 | |||
| 171 | tick_rate = clk_get_rate(omap_dm_timer_get_fclk(gptimer_wakeup)); | ||
| 172 | cycles = tick_rate * seconds + tick_rate * milliseconds / 1000; | ||
| 173 | omap_dm_timer_stop(gptimer_wakeup); | ||
| 174 | omap_dm_timer_set_load_start(gptimer_wakeup, 0, 0xffffffff - cycles); | ||
| 175 | |||
| 176 | pr_info("PM: Resume timer in %u.%03u secs" | ||
| 177 | " (%d ticks at %d ticks/sec.)\n", | ||
| 178 | seconds, milliseconds, cycles, tick_rate); | ||
| 179 | } | ||
| 180 | |||
| 164 | #ifdef CONFIG_DEBUG_FS | 181 | #ifdef CONFIG_DEBUG_FS |
| 165 | #include <linux/debugfs.h> | 182 | #include <linux/debugfs.h> |
| 166 | #include <linux/seq_file.h> | 183 | #include <linux/seq_file.h> |
| @@ -354,23 +371,6 @@ void pm_dbg_update_time(struct powerdomain *pwrdm, int prev) | |||
| 354 | pwrdm->timer = t; | 371 | pwrdm->timer = t; |
| 355 | } | 372 | } |
| 356 | 373 | ||
| 357 | void omap2_pm_wakeup_on_timer(u32 seconds, u32 milliseconds) | ||
| 358 | { | ||
| 359 | u32 tick_rate, cycles; | ||
| 360 | |||
| 361 | if (!seconds && !milliseconds) | ||
| 362 | return; | ||
| 363 | |||
| 364 | tick_rate = clk_get_rate(omap_dm_timer_get_fclk(gptimer_wakeup)); | ||
| 365 | cycles = tick_rate * seconds + tick_rate * milliseconds / 1000; | ||
| 366 | omap_dm_timer_stop(gptimer_wakeup); | ||
| 367 | omap_dm_timer_set_load_start(gptimer_wakeup, 0, 0xffffffff - cycles); | ||
| 368 | |||
| 369 | pr_info("PM: Resume timer in %u.%03u secs" | ||
| 370 | " (%d ticks at %d ticks/sec.)\n", | ||
| 371 | seconds, milliseconds, cycles, tick_rate); | ||
| 372 | } | ||
| 373 | |||
| 374 | static int clkdm_dbg_show_counter(struct clockdomain *clkdm, void *user) | 374 | static int clkdm_dbg_show_counter(struct clockdomain *clkdm, void *user) |
| 375 | { | 375 | { |
| 376 | struct seq_file *s = (struct seq_file *)user; | 376 | struct seq_file *s = (struct seq_file *)user; |
diff --git a/arch/arm/mach-omap2/pm24xx.c b/arch/arm/mach-omap2/pm24xx.c index c85923e56b8..aaeea49b9bd 100644 --- a/arch/arm/mach-omap2/pm24xx.c +++ b/arch/arm/mach-omap2/pm24xx.c | |||
| @@ -53,6 +53,19 @@ | |||
| 53 | #include <plat/powerdomain.h> | 53 | #include <plat/powerdomain.h> |
| 54 | #include <plat/clockdomain.h> | 54 | #include <plat/clockdomain.h> |
| 55 | 55 | ||
| 56 | #ifdef CONFIG_SUSPEND | ||
| 57 | static suspend_state_t suspend_state = PM_SUSPEND_ON; | ||
| 58 | static inline bool is_suspending(void) | ||
| 59 | { | ||
| 60 | return (suspend_state != PM_SUSPEND_ON); | ||
| 61 | } | ||
| 62 | #else | ||
| 63 | static inline bool is_suspending(void) | ||
| 64 | { | ||
| 65 | return false; | ||
| 66 | } | ||
| 67 | #endif | ||
| 68 | |||
| 56 | static void (*omap2_sram_idle)(void); | 69 | static void (*omap2_sram_idle)(void); |
| 57 | static void (*omap2_sram_suspend)(u32 dllctrl, void __iomem *sdrc_dlla_ctrl, | 70 | static void (*omap2_sram_suspend)(u32 dllctrl, void __iomem *sdrc_dlla_ctrl, |
| 58 | void __iomem *sdrc_power); | 71 | void __iomem *sdrc_power); |
| @@ -120,8 +133,9 @@ static void omap2_enter_full_retention(void) | |||
| 120 | goto no_sleep; | 133 | goto no_sleep; |
| 121 | 134 | ||
| 122 | /* Block console output in case it is on one of the OMAP UARTs */ | 135 | /* Block console output in case it is on one of the OMAP UARTs */ |
| 123 | if (try_acquire_console_sem()) | 136 | if (!is_suspending()) |
| 124 | goto no_sleep; | 137 | if (try_acquire_console_sem()) |
| 138 | goto no_sleep; | ||
| 125 | 139 | ||
| 126 | omap_uart_prepare_idle(0); | 140 | omap_uart_prepare_idle(0); |
| 127 | omap_uart_prepare_idle(1); | 141 | omap_uart_prepare_idle(1); |
| @@ -136,7 +150,8 @@ static void omap2_enter_full_retention(void) | |||
| 136 | omap_uart_resume_idle(1); | 150 | omap_uart_resume_idle(1); |
| 137 | omap_uart_resume_idle(0); | 151 | omap_uart_resume_idle(0); |
| 138 | 152 | ||
| 139 | release_console_sem(); | 153 | if (!is_suspending()) |
| 154 | release_console_sem(); | ||
| 140 | 155 | ||
| 141 | no_sleep: | 156 | no_sleep: |
| 142 | if (omap2_pm_debug) { | 157 | if (omap2_pm_debug) { |
| @@ -284,6 +299,12 @@ out: | |||
| 284 | local_irq_enable(); | 299 | local_irq_enable(); |
| 285 | } | 300 | } |
| 286 | 301 | ||
| 302 | static int omap2_pm_begin(suspend_state_t state) | ||
| 303 | { | ||
| 304 | suspend_state = state; | ||
| 305 | return 0; | ||
| 306 | } | ||
| 307 | |||
| 287 | static int omap2_pm_prepare(void) | 308 | static int omap2_pm_prepare(void) |
| 288 | { | 309 | { |
| 289 | /* We cannot sleep in idle until we have resumed */ | 310 | /* We cannot sleep in idle until we have resumed */ |
| @@ -333,10 +354,17 @@ static void omap2_pm_finish(void) | |||
| 333 | enable_hlt(); | 354 | enable_hlt(); |
| 334 | } | 355 | } |
| 335 | 356 | ||
| 357 | static void omap2_pm_end(void) | ||
| 358 | { | ||
| 359 | suspend_state = PM_SUSPEND_ON; | ||
| 360 | } | ||
| 361 | |||
| 336 | static struct platform_suspend_ops omap_pm_ops = { | 362 | static struct platform_suspend_ops omap_pm_ops = { |
| 363 | .begin = omap2_pm_begin, | ||
| 337 | .prepare = omap2_pm_prepare, | 364 | .prepare = omap2_pm_prepare, |
| 338 | .enter = omap2_pm_enter, | 365 | .enter = omap2_pm_enter, |
| 339 | .finish = omap2_pm_finish, | 366 | .finish = omap2_pm_finish, |
| 367 | .end = omap2_pm_end, | ||
| 340 | .valid = suspend_valid_only_mem, | 368 | .valid = suspend_valid_only_mem, |
| 341 | }; | 369 | }; |
| 342 | 370 | ||
diff --git a/arch/arm/mach-omap2/pm34xx.c b/arch/arm/mach-omap2/pm34xx.c index 0ec8a04b747..648b8c50d02 100644 --- a/arch/arm/mach-omap2/pm34xx.c +++ b/arch/arm/mach-omap2/pm34xx.c | |||
| @@ -50,6 +50,19 @@ | |||
| 50 | #include "sdrc.h" | 50 | #include "sdrc.h" |
| 51 | #include "control.h" | 51 | #include "control.h" |
| 52 | 52 | ||
| 53 | #ifdef CONFIG_SUSPEND | ||
| 54 | static suspend_state_t suspend_state = PM_SUSPEND_ON; | ||
| 55 | static inline bool is_suspending(void) | ||
| 56 | { | ||
| 57 | return (suspend_state != PM_SUSPEND_ON); | ||
| 58 | } | ||
| 59 | #else | ||
| 60 | static inline bool is_suspending(void) | ||
| 61 | { | ||
| 62 | return false; | ||
| 63 | } | ||
| 64 | #endif | ||
| 65 | |||
| 53 | /* Scratchpad offsets */ | 66 | /* Scratchpad offsets */ |
| 54 | #define OMAP343X_TABLE_ADDRESS_OFFSET 0xc4 | 67 | #define OMAP343X_TABLE_ADDRESS_OFFSET 0xc4 |
| 55 | #define OMAP343X_TABLE_VALUE_OFFSET 0xc0 | 68 | #define OMAP343X_TABLE_VALUE_OFFSET 0xc0 |
| @@ -387,10 +400,11 @@ void omap_sram_idle(void) | |||
| 387 | } | 400 | } |
| 388 | 401 | ||
| 389 | /* Block console output in case it is on one of the OMAP UARTs */ | 402 | /* Block console output in case it is on one of the OMAP UARTs */ |
| 390 | if (per_next_state < PWRDM_POWER_ON || | 403 | if (!is_suspending()) |
| 391 | core_next_state < PWRDM_POWER_ON) | 404 | if (per_next_state < PWRDM_POWER_ON || |
| 392 | if (try_acquire_console_sem()) | 405 | core_next_state < PWRDM_POWER_ON) |
| 393 | goto console_still_active; | 406 | if (try_acquire_console_sem()) |
| 407 | goto console_still_active; | ||
| 394 | 408 | ||
| 395 | /* PER */ | 409 | /* PER */ |
| 396 | if (per_next_state < PWRDM_POWER_ON) { | 410 | if (per_next_state < PWRDM_POWER_ON) { |
| @@ -470,7 +484,8 @@ void omap_sram_idle(void) | |||
| 470 | omap_uart_resume_idle(3); | 484 | omap_uart_resume_idle(3); |
| 471 | } | 485 | } |
| 472 | 486 | ||
| 473 | release_console_sem(); | 487 | if (!is_suspending()) |
| 488 | release_console_sem(); | ||
| 474 | 489 | ||
| 475 | console_still_active: | 490 | console_still_active: |
| 476 | /* Disable IO-PAD and IO-CHAIN wakeup */ | 491 | /* Disable IO-PAD and IO-CHAIN wakeup */ |
| @@ -514,8 +529,6 @@ out: | |||
| 514 | } | 529 | } |
| 515 | 530 | ||
| 516 | #ifdef CONFIG_SUSPEND | 531 | #ifdef CONFIG_SUSPEND |
| 517 | static suspend_state_t suspend_state; | ||
| 518 | |||
| 519 | static int omap3_pm_prepare(void) | 532 | static int omap3_pm_prepare(void) |
| 520 | { | 533 | { |
| 521 | disable_hlt(); | 534 | disable_hlt(); |
diff --git a/arch/arm/mach-omap2/prcm-common.h b/arch/arm/mach-omap2/prcm-common.h index 298a22a754e..f81acee4738 100644 --- a/arch/arm/mach-omap2/prcm-common.h +++ b/arch/arm/mach-omap2/prcm-common.h | |||
| @@ -243,13 +243,14 @@ | |||
| 243 | #define OMAP24XX_EN_GPT1_MASK (1 << 0) | 243 | #define OMAP24XX_EN_GPT1_MASK (1 << 0) |
| 244 | 244 | ||
| 245 | /* PM_WKST_WKUP, CM_IDLEST_WKUP shared bits */ | 245 | /* PM_WKST_WKUP, CM_IDLEST_WKUP shared bits */ |
| 246 | #define OMAP24XX_ST_GPIOS_SHIFT (1 << 2) | 246 | #define OMAP24XX_ST_GPIOS_SHIFT 2 |
| 247 | #define OMAP24XX_ST_GPIOS_MASK 2 | 247 | #define OMAP24XX_ST_GPIOS_MASK (1 << 2) |
| 248 | #define OMAP24XX_ST_GPT1_SHIFT (1 << 0) | 248 | #define OMAP24XX_ST_GPT1_SHIFT 0 |
| 249 | #define OMAP24XX_ST_GPT1_MASK 0 | 249 | #define OMAP24XX_ST_GPT1_MASK (1 << 0) |
| 250 | 250 | ||
| 251 | /* CM_IDLEST_MDM and PM_WKST_MDM shared bits */ | 251 | /* CM_IDLEST_MDM and PM_WKST_MDM shared bits */ |
| 252 | #define OMAP2430_ST_MDM_SHIFT (1 << 0) | 252 | #define OMAP2430_ST_MDM_SHIFT 0 |
| 253 | #define OMAP2430_ST_MDM_MASK (1 << 0) | ||
| 253 | 254 | ||
| 254 | 255 | ||
| 255 | /* 3430 register bits shared between CM & PRM registers */ | 256 | /* 3430 register bits shared between CM & PRM registers */ |
diff --git a/arch/arm/mach-pxa/Kconfig b/arch/arm/mach-pxa/Kconfig index dd235ecc9d6..c93e73d54dd 100644 --- a/arch/arm/mach-pxa/Kconfig +++ b/arch/arm/mach-pxa/Kconfig | |||
| @@ -540,6 +540,7 @@ config MACH_ICONTROL | |||
| 540 | config ARCH_PXA_ESERIES | 540 | config ARCH_PXA_ESERIES |
| 541 | bool "PXA based Toshiba e-series PDAs" | 541 | bool "PXA based Toshiba e-series PDAs" |
| 542 | select PXA25x | 542 | select PXA25x |
| 543 | select FB_W100 | ||
| 543 | 544 | ||
| 544 | config MACH_E330 | 545 | config MACH_E330 |
| 545 | bool "Toshiba e330" | 546 | bool "Toshiba e330" |
diff --git a/arch/arm/mach-pxa/palmtx.c b/arch/arm/mach-pxa/palmtx.c index d2060a1d1d6..e5c9932b758 100644 --- a/arch/arm/mach-pxa/palmtx.c +++ b/arch/arm/mach-pxa/palmtx.c | |||
| @@ -241,7 +241,8 @@ static inline void palmtx_keys_init(void) {} | |||
| 241 | /****************************************************************************** | 241 | /****************************************************************************** |
| 242 | * NAND Flash | 242 | * NAND Flash |
| 243 | ******************************************************************************/ | 243 | ******************************************************************************/ |
| 244 | #if defined(CONFIG_MTD_NAND_GPIO) || defined(CONFIG_MTD_NAND_GPIO_MODULE) | 244 | #if defined(CONFIG_MTD_NAND_PLATFORM) || \ |
| 245 | defined(CONFIG_MTD_NAND_PLATFORM_MODULE) | ||
| 245 | static void palmtx_nand_cmd_ctl(struct mtd_info *mtd, int cmd, | 246 | static void palmtx_nand_cmd_ctl(struct mtd_info *mtd, int cmd, |
| 246 | unsigned int ctrl) | 247 | unsigned int ctrl) |
| 247 | { | 248 | { |
diff --git a/arch/arm/mach-pxa/sleep.S b/arch/arm/mach-pxa/sleep.S index 52c30b01a67..ae008110db4 100644 --- a/arch/arm/mach-pxa/sleep.S +++ b/arch/arm/mach-pxa/sleep.S | |||
| @@ -353,8 +353,8 @@ resume_turn_on_mmu: | |||
| 353 | 353 | ||
| 354 | @ Let us ensure we jump to resume_after_mmu only when the mcr above | 354 | @ Let us ensure we jump to resume_after_mmu only when the mcr above |
| 355 | @ actually took effect. They call it the "cpwait" operation. | 355 | @ actually took effect. They call it the "cpwait" operation. |
| 356 | mrc p15, 0, r1, c2, c0, 0 @ queue a dependency on CP15 | 356 | mrc p15, 0, r0, c2, c0, 0 @ queue a dependency on CP15 |
| 357 | sub pc, r2, r1, lsr #32 @ jump to virtual addr | 357 | sub pc, r2, r0, lsr #32 @ jump to virtual addr |
| 358 | nop | 358 | nop |
| 359 | nop | 359 | nop |
| 360 | nop | 360 | nop |
diff --git a/arch/arm/mach-s3c2412/Kconfig b/arch/arm/mach-s3c2412/Kconfig index fa2e5bffbb8..6983cb4d4ca 100644 --- a/arch/arm/mach-s3c2412/Kconfig +++ b/arch/arm/mach-s3c2412/Kconfig | |||
| @@ -28,9 +28,16 @@ config S3C2412_DMA | |||
| 28 | 28 | ||
| 29 | config S3C2412_PM | 29 | config S3C2412_PM |
| 30 | bool | 30 | bool |
| 31 | select S3C2412_PM_SLEEP | ||
| 31 | help | 32 | help |
| 32 | Internal config node to apply S3C2412 power management | 33 | Internal config node to apply S3C2412 power management |
| 33 | 34 | ||
| 35 | config S3C2412_PM_SLEEP | ||
| 36 | bool | ||
| 37 | help | ||
| 38 | Internal config node to apply sleep for S3C2412 power management. | ||
| 39 | Can be selected by another SoCs with similar sleep procedure. | ||
| 40 | |||
| 34 | # Note, the S3C2412 IOtiming support is in plat-s3c24xx | 41 | # Note, the S3C2412 IOtiming support is in plat-s3c24xx |
| 35 | 42 | ||
| 36 | config S3C2412_CPUFREQ | 43 | config S3C2412_CPUFREQ |
diff --git a/arch/arm/mach-s3c2412/Makefile b/arch/arm/mach-s3c2412/Makefile index 530ec46cbae..6c48a91ea39 100644 --- a/arch/arm/mach-s3c2412/Makefile +++ b/arch/arm/mach-s3c2412/Makefile | |||
| @@ -14,7 +14,8 @@ obj-$(CONFIG_CPU_S3C2412) += irq.o | |||
| 14 | obj-$(CONFIG_CPU_S3C2412) += clock.o | 14 | obj-$(CONFIG_CPU_S3C2412) += clock.o |
| 15 | obj-$(CONFIG_CPU_S3C2412) += gpio.o | 15 | obj-$(CONFIG_CPU_S3C2412) += gpio.o |
| 16 | obj-$(CONFIG_S3C2412_DMA) += dma.o | 16 | obj-$(CONFIG_S3C2412_DMA) += dma.o |
| 17 | obj-$(CONFIG_S3C2412_PM) += pm.o sleep.o | 17 | obj-$(CONFIG_S3C2412_PM) += pm.o |
| 18 | obj-$(CONFIG_S3C2412_PM_SLEEP) += sleep.o | ||
| 18 | obj-$(CONFIG_S3C2412_CPUFREQ) += cpu-freq.o | 19 | obj-$(CONFIG_S3C2412_CPUFREQ) += cpu-freq.o |
| 19 | 20 | ||
| 20 | # Machine support | 21 | # Machine support |
diff --git a/arch/arm/mach-s3c2416/Kconfig b/arch/arm/mach-s3c2416/Kconfig index 27b3e7c9d61..df8d14974c9 100644 --- a/arch/arm/mach-s3c2416/Kconfig +++ b/arch/arm/mach-s3c2416/Kconfig | |||
| @@ -27,6 +27,7 @@ config S3C2416_DMA | |||
| 27 | 27 | ||
| 28 | config S3C2416_PM | 28 | config S3C2416_PM |
| 29 | bool | 29 | bool |
| 30 | select S3C2412_PM_SLEEP | ||
| 30 | help | 31 | help |
| 31 | Internal config node to apply S3C2416 power management | 32 | Internal config node to apply S3C2416 power management |
| 32 | 33 | ||
diff --git a/arch/arm/mach-s5pv210/mach-aquila.c b/arch/arm/mach-s5pv210/mach-aquila.c index 28677caf361..461aa035afc 100644 --- a/arch/arm/mach-s5pv210/mach-aquila.c +++ b/arch/arm/mach-s5pv210/mach-aquila.c | |||
| @@ -378,6 +378,12 @@ static struct max8998_regulator_data aquila_regulators[] = { | |||
| 378 | static struct max8998_platform_data aquila_max8998_pdata = { | 378 | static struct max8998_platform_data aquila_max8998_pdata = { |
| 379 | .num_regulators = ARRAY_SIZE(aquila_regulators), | 379 | .num_regulators = ARRAY_SIZE(aquila_regulators), |
| 380 | .regulators = aquila_regulators, | 380 | .regulators = aquila_regulators, |
| 381 | .buck1_set1 = S5PV210_GPH0(3), | ||
| 382 | .buck1_set2 = S5PV210_GPH0(4), | ||
| 383 | .buck2_set3 = S5PV210_GPH0(5), | ||
| 384 | .buck1_max_voltage1 = 1200000, | ||
| 385 | .buck1_max_voltage2 = 1200000, | ||
| 386 | .buck2_max_voltage = 1200000, | ||
| 381 | }; | 387 | }; |
| 382 | #endif | 388 | #endif |
| 383 | 389 | ||
diff --git a/arch/arm/mach-s5pv210/mach-goni.c b/arch/arm/mach-s5pv210/mach-goni.c index b1dcf964a76..e22d5112fd4 100644 --- a/arch/arm/mach-s5pv210/mach-goni.c +++ b/arch/arm/mach-s5pv210/mach-goni.c | |||
| @@ -518,6 +518,12 @@ static struct max8998_regulator_data goni_regulators[] = { | |||
| 518 | static struct max8998_platform_data goni_max8998_pdata = { | 518 | static struct max8998_platform_data goni_max8998_pdata = { |
| 519 | .num_regulators = ARRAY_SIZE(goni_regulators), | 519 | .num_regulators = ARRAY_SIZE(goni_regulators), |
| 520 | .regulators = goni_regulators, | 520 | .regulators = goni_regulators, |
| 521 | .buck1_set1 = S5PV210_GPH0(3), | ||
| 522 | .buck1_set2 = S5PV210_GPH0(4), | ||
| 523 | .buck2_set3 = S5PV210_GPH0(5), | ||
| 524 | .buck1_max_voltage1 = 1200000, | ||
| 525 | .buck1_max_voltage2 = 1200000, | ||
| 526 | .buck2_max_voltage = 1200000, | ||
| 521 | }; | 527 | }; |
| 522 | #endif | 528 | #endif |
| 523 | 529 | ||
diff --git a/arch/arm/mach-shmobile/board-ap4evb.c b/arch/arm/mach-shmobile/board-ap4evb.c index d440e5f456a..b1222dc4338 100644 --- a/arch/arm/mach-shmobile/board-ap4evb.c +++ b/arch/arm/mach-shmobile/board-ap4evb.c | |||
| @@ -501,7 +501,12 @@ static struct platform_device keysc_device = { | |||
| 501 | static struct resource mipidsi0_resources[] = { | 501 | static struct resource mipidsi0_resources[] = { |
| 502 | [0] = { | 502 | [0] = { |
| 503 | .start = 0xffc60000, | 503 | .start = 0xffc60000, |
| 504 | .end = 0xffc68fff, | 504 | .end = 0xffc63073, |
| 505 | .flags = IORESOURCE_MEM, | ||
| 506 | }, | ||
| 507 | [1] = { | ||
| 508 | .start = 0xffc68000, | ||
| 509 | .end = 0xffc680ef, | ||
| 505 | .flags = IORESOURCE_MEM, | 510 | .flags = IORESOURCE_MEM, |
| 506 | }, | 511 | }, |
| 507 | }; | 512 | }; |
| @@ -509,6 +514,7 @@ static struct resource mipidsi0_resources[] = { | |||
| 509 | static struct sh_mipi_dsi_info mipidsi0_info = { | 514 | static struct sh_mipi_dsi_info mipidsi0_info = { |
| 510 | .data_format = MIPI_RGB888, | 515 | .data_format = MIPI_RGB888, |
| 511 | .lcd_chan = &lcdc_info.ch[0], | 516 | .lcd_chan = &lcdc_info.ch[0], |
| 517 | .vsynw_offset = 17, | ||
| 512 | }; | 518 | }; |
| 513 | 519 | ||
| 514 | static struct platform_device mipidsi0_device = { | 520 | static struct platform_device mipidsi0_device = { |
| @@ -521,44 +527,6 @@ static struct platform_device mipidsi0_device = { | |||
| 521 | }, | 527 | }, |
| 522 | }; | 528 | }; |
| 523 | 529 | ||
| 524 | /* This function will disappear when we switch to (runtime) PM */ | ||
| 525 | static int __init ap4evb_init_display_clk(void) | ||
| 526 | { | ||
| 527 | struct clk *lcdc_clk; | ||
| 528 | struct clk *dsitx_clk; | ||
| 529 | int ret; | ||
| 530 | |||
| 531 | lcdc_clk = clk_get(&lcdc_device.dev, "sh_mobile_lcdc_fb.0"); | ||
| 532 | if (IS_ERR(lcdc_clk)) | ||
| 533 | return PTR_ERR(lcdc_clk); | ||
| 534 | |||
| 535 | dsitx_clk = clk_get(&mipidsi0_device.dev, "sh-mipi-dsi.0"); | ||
| 536 | if (IS_ERR(dsitx_clk)) { | ||
| 537 | ret = PTR_ERR(dsitx_clk); | ||
| 538 | goto eclkdsitxget; | ||
| 539 | } | ||
| 540 | |||
| 541 | ret = clk_enable(lcdc_clk); | ||
| 542 | if (ret < 0) | ||
| 543 | goto eclklcdcon; | ||
| 544 | |||
| 545 | ret = clk_enable(dsitx_clk); | ||
| 546 | if (ret < 0) | ||
| 547 | goto eclkdsitxon; | ||
| 548 | |||
| 549 | return 0; | ||
| 550 | |||
| 551 | eclkdsitxon: | ||
| 552 | clk_disable(lcdc_clk); | ||
| 553 | eclklcdcon: | ||
| 554 | clk_put(dsitx_clk); | ||
| 555 | eclkdsitxget: | ||
| 556 | clk_put(lcdc_clk); | ||
| 557 | |||
| 558 | return ret; | ||
| 559 | } | ||
| 560 | device_initcall(ap4evb_init_display_clk); | ||
| 561 | |||
| 562 | static struct platform_device *qhd_devices[] __initdata = { | 530 | static struct platform_device *qhd_devices[] __initdata = { |
| 563 | &mipidsi0_device, | 531 | &mipidsi0_device, |
| 564 | &keysc_device, | 532 | &keysc_device, |
| @@ -764,10 +732,15 @@ static struct platform_device lcdc1_device = { | |||
| 764 | }, | 732 | }, |
| 765 | }; | 733 | }; |
| 766 | 734 | ||
| 735 | static long ap4evb_clk_optimize(unsigned long target, unsigned long *best_freq, | ||
| 736 | unsigned long *parent_freq); | ||
| 737 | |||
| 738 | |||
| 767 | static struct sh_mobile_hdmi_info hdmi_info = { | 739 | static struct sh_mobile_hdmi_info hdmi_info = { |
| 768 | .lcd_chan = &sh_mobile_lcdc1_info.ch[0], | 740 | .lcd_chan = &sh_mobile_lcdc1_info.ch[0], |
| 769 | .lcd_dev = &lcdc1_device.dev, | 741 | .lcd_dev = &lcdc1_device.dev, |
| 770 | .flags = HDMI_SND_SRC_SPDIF, | 742 | .flags = HDMI_SND_SRC_SPDIF, |
| 743 | .clk_optimize_parent = ap4evb_clk_optimize, | ||
| 771 | }; | 744 | }; |
| 772 | 745 | ||
| 773 | static struct resource hdmi_resources[] = { | 746 | static struct resource hdmi_resources[] = { |
| @@ -794,6 +767,25 @@ static struct platform_device hdmi_device = { | |||
| 794 | }, | 767 | }, |
| 795 | }; | 768 | }; |
| 796 | 769 | ||
| 770 | static long ap4evb_clk_optimize(unsigned long target, unsigned long *best_freq, | ||
| 771 | unsigned long *parent_freq) | ||
| 772 | { | ||
| 773 | struct clk *hdmi_ick = clk_get(&hdmi_device.dev, "ick"); | ||
| 774 | long error; | ||
| 775 | |||
| 776 | if (IS_ERR(hdmi_ick)) { | ||
| 777 | int ret = PTR_ERR(hdmi_ick); | ||
| 778 | pr_err("Cannot get HDMI ICK: %d\n", ret); | ||
| 779 | return ret; | ||
| 780 | } | ||
| 781 | |||
| 782 | error = clk_round_parent(hdmi_ick, target, best_freq, parent_freq, 1, 64); | ||
| 783 | |||
| 784 | clk_put(hdmi_ick); | ||
| 785 | |||
| 786 | return error; | ||
| 787 | } | ||
| 788 | |||
| 797 | static struct gpio_led ap4evb_leds[] = { | 789 | static struct gpio_led ap4evb_leds[] = { |
| 798 | { | 790 | { |
| 799 | .name = "led4", | 791 | .name = "led4", |
diff --git a/arch/arm/mach-shmobile/clock-sh7372.c b/arch/arm/mach-shmobile/clock-sh7372.c index 3aa02606943..66663adb21f 100644 --- a/arch/arm/mach-shmobile/clock-sh7372.c +++ b/arch/arm/mach-shmobile/clock-sh7372.c | |||
| @@ -507,7 +507,7 @@ enum { MSTP001, | |||
| 507 | MSTP223, | 507 | MSTP223, |
| 508 | MSTP207, MSTP206, MSTP204, MSTP203, MSTP202, MSTP201, MSTP200, | 508 | MSTP207, MSTP206, MSTP204, MSTP203, MSTP202, MSTP201, MSTP200, |
| 509 | MSTP329, MSTP328, MSTP323, MSTP322, MSTP314, MSTP313, MSTP312, | 509 | MSTP329, MSTP328, MSTP323, MSTP322, MSTP314, MSTP313, MSTP312, |
| 510 | MSTP415, MSTP413, MSTP411, MSTP410, MSTP406, MSTP403, | 510 | MSTP423, MSTP415, MSTP413, MSTP411, MSTP410, MSTP406, MSTP403, |
| 511 | MSTP_NR }; | 511 | MSTP_NR }; |
| 512 | 512 | ||
| 513 | #define MSTP(_parent, _reg, _bit, _flags) \ | 513 | #define MSTP(_parent, _reg, _bit, _flags) \ |
| @@ -543,6 +543,7 @@ static struct clk mstp_clks[MSTP_NR] = { | |||
| 543 | [MSTP314] = MSTP(&div4_clks[DIV4_HP], SMSTPCR3, 14, 0), /* SDHI0 */ | 543 | [MSTP314] = MSTP(&div4_clks[DIV4_HP], SMSTPCR3, 14, 0), /* SDHI0 */ |
| 544 | [MSTP313] = MSTP(&div4_clks[DIV4_HP], SMSTPCR3, 13, 0), /* SDHI1 */ | 544 | [MSTP313] = MSTP(&div4_clks[DIV4_HP], SMSTPCR3, 13, 0), /* SDHI1 */ |
| 545 | [MSTP312] = MSTP(&div4_clks[DIV4_HP], SMSTPCR3, 12, 0), /* MMC */ | 545 | [MSTP312] = MSTP(&div4_clks[DIV4_HP], SMSTPCR3, 12, 0), /* MMC */ |
| 546 | [MSTP423] = MSTP(&div4_clks[DIV4_B], SMSTPCR4, 23, 0), /* DSITX1 */ | ||
| 546 | [MSTP415] = MSTP(&div4_clks[DIV4_HP], SMSTPCR4, 15, 0), /* SDHI2 */ | 547 | [MSTP415] = MSTP(&div4_clks[DIV4_HP], SMSTPCR4, 15, 0), /* SDHI2 */ |
| 547 | [MSTP413] = MSTP(&pllc1_div2_clk, SMSTPCR4, 13, 0), /* HDMI */ | 548 | [MSTP413] = MSTP(&pllc1_div2_clk, SMSTPCR4, 13, 0), /* HDMI */ |
| 548 | [MSTP411] = MSTP(&div6_clks[DIV6_SUB], SMSTPCR4, 11, 0), /* IIC3 */ | 549 | [MSTP411] = MSTP(&div6_clks[DIV6_SUB], SMSTPCR4, 11, 0), /* IIC3 */ |
| @@ -596,9 +597,10 @@ static struct clk_lookup lookups[] = { | |||
| 596 | CLKDEV_CON_ID("spu_clk", &div6_clks[DIV6_SPU]), | 597 | CLKDEV_CON_ID("spu_clk", &div6_clks[DIV6_SPU]), |
| 597 | CLKDEV_CON_ID("vou_clk", &div6_clks[DIV6_VOU]), | 598 | CLKDEV_CON_ID("vou_clk", &div6_clks[DIV6_VOU]), |
| 598 | CLKDEV_CON_ID("hdmi_clk", &div6_reparent_clks[DIV6_HDMI]), | 599 | CLKDEV_CON_ID("hdmi_clk", &div6_reparent_clks[DIV6_HDMI]), |
| 599 | CLKDEV_CON_ID("dsit_clk", &div6_clks[DIV6_DSIT]), | 600 | CLKDEV_ICK_ID("dsit_clk", "sh-mipi-dsi.0", &div6_clks[DIV6_DSIT]), |
| 600 | CLKDEV_CON_ID("dsi0p_clk", &div6_clks[DIV6_DSI0P]), | 601 | CLKDEV_ICK_ID("dsit_clk", "sh-mipi-dsi.1", &div6_clks[DIV6_DSIT]), |
| 601 | CLKDEV_CON_ID("dsi1p_clk", &div6_clks[DIV6_DSI1P]), | 602 | CLKDEV_ICK_ID("dsi0p_clk", "sh-mipi-dsi.0", &div6_clks[DIV6_DSI0P]), |
| 603 | CLKDEV_ICK_ID("dsi1p_clk", "sh-mipi-dsi.1", &div6_clks[DIV6_DSI1P]), | ||
| 602 | 604 | ||
| 603 | /* MSTP32 clocks */ | 605 | /* MSTP32 clocks */ |
| 604 | CLKDEV_DEV_ID("i2c-sh_mobile.2", &mstp_clks[MSTP001]), /* IIC2 */ | 606 | CLKDEV_DEV_ID("i2c-sh_mobile.2", &mstp_clks[MSTP001]), /* IIC2 */ |
| @@ -610,7 +612,7 @@ static struct clk_lookup lookups[] = { | |||
| 610 | CLKDEV_DEV_ID("sh-mobile-csi2.0", &mstp_clks[MSTP126]), /* CSI2 */ | 612 | CLKDEV_DEV_ID("sh-mobile-csi2.0", &mstp_clks[MSTP126]), /* CSI2 */ |
| 611 | CLKDEV_DEV_ID("sh_tmu.0", &mstp_clks[MSTP125]), /* TMU00 */ | 613 | CLKDEV_DEV_ID("sh_tmu.0", &mstp_clks[MSTP125]), /* TMU00 */ |
| 612 | CLKDEV_DEV_ID("sh_tmu.1", &mstp_clks[MSTP125]), /* TMU01 */ | 614 | CLKDEV_DEV_ID("sh_tmu.1", &mstp_clks[MSTP125]), /* TMU01 */ |
| 613 | CLKDEV_DEV_ID("sh-mipi-dsi.0", &mstp_clks[MSTP118]), /* DSITX */ | 615 | CLKDEV_DEV_ID("sh-mipi-dsi.0", &mstp_clks[MSTP118]), /* DSITX0 */ |
| 614 | CLKDEV_DEV_ID("sh_mobile_lcdc_fb.1", &mstp_clks[MSTP117]), /* LCDC1 */ | 616 | CLKDEV_DEV_ID("sh_mobile_lcdc_fb.1", &mstp_clks[MSTP117]), /* LCDC1 */ |
| 615 | CLKDEV_DEV_ID("i2c-sh_mobile.0", &mstp_clks[MSTP116]), /* IIC0 */ | 617 | CLKDEV_DEV_ID("i2c-sh_mobile.0", &mstp_clks[MSTP116]), /* IIC0 */ |
| 616 | CLKDEV_DEV_ID("uio_pdrv_genirq.5", &mstp_clks[MSTP106]), /* JPU */ | 618 | CLKDEV_DEV_ID("uio_pdrv_genirq.5", &mstp_clks[MSTP106]), /* JPU */ |
| @@ -633,6 +635,7 @@ static struct clk_lookup lookups[] = { | |||
| 633 | CLKDEV_DEV_ID("sh_mobile_sdhi.0", &mstp_clks[MSTP314]), /* SDHI0 */ | 635 | CLKDEV_DEV_ID("sh_mobile_sdhi.0", &mstp_clks[MSTP314]), /* SDHI0 */ |
| 634 | CLKDEV_DEV_ID("sh_mobile_sdhi.1", &mstp_clks[MSTP313]), /* SDHI1 */ | 636 | CLKDEV_DEV_ID("sh_mobile_sdhi.1", &mstp_clks[MSTP313]), /* SDHI1 */ |
| 635 | CLKDEV_DEV_ID("sh_mmcif.0", &mstp_clks[MSTP312]), /* MMC */ | 637 | CLKDEV_DEV_ID("sh_mmcif.0", &mstp_clks[MSTP312]), /* MMC */ |
| 638 | CLKDEV_DEV_ID("sh-mipi-dsi.1", &mstp_clks[MSTP423]), /* DSITX1 */ | ||
| 636 | CLKDEV_DEV_ID("sh_mobile_sdhi.2", &mstp_clks[MSTP415]), /* SDHI2 */ | 639 | CLKDEV_DEV_ID("sh_mobile_sdhi.2", &mstp_clks[MSTP415]), /* SDHI2 */ |
| 637 | CLKDEV_DEV_ID("sh-mobile-hdmi", &mstp_clks[MSTP413]), /* HDMI */ | 640 | CLKDEV_DEV_ID("sh-mobile-hdmi", &mstp_clks[MSTP413]), /* HDMI */ |
| 638 | CLKDEV_DEV_ID("i2c-sh_mobile.3", &mstp_clks[MSTP411]), /* IIC3 */ | 641 | CLKDEV_DEV_ID("i2c-sh_mobile.3", &mstp_clks[MSTP411]), /* IIC3 */ |
diff --git a/arch/arm/mach-shmobile/include/mach/entry-macro.S b/arch/arm/mach-shmobile/include/mach/entry-macro.S index a285d13c741..f428c4db2b6 100644 --- a/arch/arm/mach-shmobile/include/mach/entry-macro.S +++ b/arch/arm/mach-shmobile/include/mach/entry-macro.S | |||
| @@ -1,4 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * Copyright (C) 2010 Magnus Damm | ||
| 2 | * Copyright (C) 2008 Renesas Solutions Corp. | 3 | * Copyright (C) 2008 Renesas Solutions Corp. |
| 3 | * | 4 | * |
| 4 | * This program is free software; you can redistribute it and/or modify | 5 | * This program is free software; you can redistribute it and/or modify |
| @@ -14,24 +15,45 @@ | |||
| 14 | * along with this program; if not, write to the Free Software | 15 | * along with this program; if not, write to the Free Software |
| 15 | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | 16 | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
| 16 | */ | 17 | */ |
| 17 | #include <mach/hardware.h> | ||
| 18 | #include <mach/irqs.h> | 18 | #include <mach/irqs.h> |
| 19 | 19 | ||
| 20 | #define INTCA_BASE 0xe6980000 | ||
| 21 | #define INTFLGA_OFFS 0x00000018 /* accept pending interrupt */ | ||
| 22 | #define INTEVTA_OFFS 0x00000020 /* vector number of accepted interrupt */ | ||
| 23 | #define INTLVLA_OFFS 0x00000030 /* priority level of accepted interrupt */ | ||
| 24 | #define INTLVLB_OFFS 0x00000034 /* previous priority level */ | ||
| 25 | |||
| 20 | .macro disable_fiq | 26 | .macro disable_fiq |
| 21 | .endm | 27 | .endm |
| 22 | 28 | ||
| 23 | .macro get_irqnr_preamble, base, tmp | 29 | .macro get_irqnr_preamble, base, tmp |
| 24 | ldr \base, =INTFLGA | 30 | ldr \base, =INTCA_BASE |
| 25 | .endm | 31 | .endm |
| 26 | 32 | ||
| 27 | .macro arch_ret_to_user, tmp1, tmp2 | 33 | .macro arch_ret_to_user, tmp1, tmp2 |
| 28 | .endm | 34 | .endm |
| 29 | 35 | ||
| 30 | .macro get_irqnr_and_base, irqnr, irqstat, base, tmp | 36 | .macro get_irqnr_and_base, irqnr, irqstat, base, tmp |
| 31 | ldr \irqnr, [\base] | 37 | /* The single INTFLGA read access below results in the following: |
| 38 | * | ||
| 39 | * 1. INTLVLB is updated with old priority value from INTLVLA | ||
| 40 | * 2. Highest priority interrupt is accepted | ||
| 41 | * 3. INTLVLA is updated to contain priority of accepted interrupt | ||
| 42 | * 4. Accepted interrupt vector is stored in INTFLGA and INTEVTA | ||
| 43 | */ | ||
| 44 | ldr \irqnr, [\base, #INTFLGA_OFFS] | ||
| 45 | |||
| 46 | /* Restore INTLVLA with the value saved in INTLVLB. | ||
| 47 | * This is required to support interrupt priorities properly. | ||
| 48 | */ | ||
| 49 | ldrb \tmp, [\base, #INTLVLB_OFFS] | ||
| 50 | strb \tmp, [\base, #INTLVLA_OFFS] | ||
| 51 | |||
| 52 | /* Handle invalid vector number case */ | ||
| 32 | cmp \irqnr, #0 | 53 | cmp \irqnr, #0 |
| 33 | beq 1000f | 54 | beq 1000f |
| 34 | /* intevt to irq number */ | 55 | |
| 56 | /* Convert vector to irq number, same as the evt2irq() macro */ | ||
| 35 | lsr \irqnr, \irqnr, #0x5 | 57 | lsr \irqnr, \irqnr, #0x5 |
| 36 | subs \irqnr, \irqnr, #16 | 58 | subs \irqnr, \irqnr, #16 |
| 37 | 59 | ||
diff --git a/arch/arm/mach-shmobile/include/mach/vmalloc.h b/arch/arm/mach-shmobile/include/mach/vmalloc.h index 4aecf6e3a85..2b8fd8b942f 100644 --- a/arch/arm/mach-shmobile/include/mach/vmalloc.h +++ b/arch/arm/mach-shmobile/include/mach/vmalloc.h | |||
| @@ -2,6 +2,6 @@ | |||
| 2 | #define __ASM_MACH_VMALLOC_H | 2 | #define __ASM_MACH_VMALLOC_H |
| 3 | 3 | ||
| 4 | /* Vmalloc at ... - 0xe5ffffff */ | 4 | /* Vmalloc at ... - 0xe5ffffff */ |
| 5 | #define VMALLOC_END 0xe6000000 | 5 | #define VMALLOC_END 0xe6000000UL |
| 6 | 6 | ||
| 7 | #endif /* __ASM_MACH_VMALLOC_H */ | 7 | #endif /* __ASM_MACH_VMALLOC_H */ |
diff --git a/arch/arm/mm/cache-feroceon-l2.c b/arch/arm/mm/cache-feroceon-l2.c index 6e77c042d8e..e0b0e7a4ec6 100644 --- a/arch/arm/mm/cache-feroceon-l2.c +++ b/arch/arm/mm/cache-feroceon-l2.c | |||
| @@ -13,13 +13,9 @@ | |||
| 13 | */ | 13 | */ |
| 14 | 14 | ||
| 15 | #include <linux/init.h> | 15 | #include <linux/init.h> |
| 16 | #include <linux/highmem.h> | ||
| 16 | #include <asm/cacheflush.h> | 17 | #include <asm/cacheflush.h> |
| 17 | #include <asm/kmap_types.h> | ||
| 18 | #include <asm/fixmap.h> | ||
| 19 | #include <asm/pgtable.h> | ||
| 20 | #include <asm/tlbflush.h> | ||
| 21 | #include <plat/cache-feroceon-l2.h> | 18 | #include <plat/cache-feroceon-l2.h> |
| 22 | #include "mm.h" | ||
| 23 | 19 | ||
| 24 | /* | 20 | /* |
| 25 | * Low-level cache maintenance operations. | 21 | * Low-level cache maintenance operations. |
| @@ -39,27 +35,30 @@ | |||
| 39 | * between which we don't want to be preempted. | 35 | * between which we don't want to be preempted. |
| 40 | */ | 36 | */ |
| 41 | 37 | ||
| 42 | static inline unsigned long l2_start_va(unsigned long paddr) | 38 | static inline unsigned long l2_get_va(unsigned long paddr) |
| 43 | { | 39 | { |
| 44 | #ifdef CONFIG_HIGHMEM | 40 | #ifdef CONFIG_HIGHMEM |
| 45 | /* | 41 | /* |
| 46 | * Let's do our own fixmap stuff in a minimal way here. | ||
| 47 | * Because range ops can't be done on physical addresses, | 42 | * Because range ops can't be done on physical addresses, |
| 48 | * we simply install a virtual mapping for it only for the | 43 | * we simply install a virtual mapping for it only for the |
| 49 | * TLB lookup to occur, hence no need to flush the untouched | 44 | * TLB lookup to occur, hence no need to flush the untouched |
| 50 | * memory mapping. This is protected with the disabling of | 45 | * memory mapping afterwards (note: a cache flush may happen |
| 51 | * interrupts by the caller. | 46 | * in some circumstances depending on the path taken in kunmap_atomic). |
| 52 | */ | 47 | */ |
| 53 | unsigned long idx = KM_L2_CACHE + KM_TYPE_NR * smp_processor_id(); | 48 | void *vaddr = kmap_atomic_pfn(paddr >> PAGE_SHIFT); |
| 54 | unsigned long vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx); | 49 | return (unsigned long)vaddr + (paddr & ~PAGE_MASK); |
| 55 | set_pte_ext(TOP_PTE(vaddr), pfn_pte(paddr >> PAGE_SHIFT, PAGE_KERNEL), 0); | ||
| 56 | local_flush_tlb_kernel_page(vaddr); | ||
| 57 | return vaddr + (paddr & ~PAGE_MASK); | ||
| 58 | #else | 50 | #else |
| 59 | return __phys_to_virt(paddr); | 51 | return __phys_to_virt(paddr); |
| 60 | #endif | 52 | #endif |
| 61 | } | 53 | } |
| 62 | 54 | ||
| 55 | static inline void l2_put_va(unsigned long vaddr) | ||
| 56 | { | ||
| 57 | #ifdef CONFIG_HIGHMEM | ||
| 58 | kunmap_atomic((void *)vaddr); | ||
| 59 | #endif | ||
| 60 | } | ||
| 61 | |||
| 63 | static inline void l2_clean_pa(unsigned long addr) | 62 | static inline void l2_clean_pa(unsigned long addr) |
| 64 | { | 63 | { |
| 65 | __asm__("mcr p15, 1, %0, c15, c9, 3" : : "r" (addr)); | 64 | __asm__("mcr p15, 1, %0, c15, c9, 3" : : "r" (addr)); |
| @@ -76,13 +75,14 @@ static inline void l2_clean_pa_range(unsigned long start, unsigned long end) | |||
| 76 | */ | 75 | */ |
| 77 | BUG_ON((start ^ end) >> PAGE_SHIFT); | 76 | BUG_ON((start ^ end) >> PAGE_SHIFT); |
| 78 | 77 | ||
| 79 | raw_local_irq_save(flags); | 78 | va_start = l2_get_va(start); |
| 80 | va_start = l2_start_va(start); | ||
| 81 | va_end = va_start + (end - start); | 79 | va_end = va_start + (end - start); |
| 80 | raw_local_irq_save(flags); | ||
| 82 | __asm__("mcr p15, 1, %0, c15, c9, 4\n\t" | 81 | __asm__("mcr p15, 1, %0, c15, c9, 4\n\t" |
| 83 | "mcr p15, 1, %1, c15, c9, 5" | 82 | "mcr p15, 1, %1, c15, c9, 5" |
| 84 | : : "r" (va_start), "r" (va_end)); | 83 | : : "r" (va_start), "r" (va_end)); |
| 85 | raw_local_irq_restore(flags); | 84 | raw_local_irq_restore(flags); |
| 85 | l2_put_va(va_start); | ||
| 86 | } | 86 | } |
| 87 | 87 | ||
| 88 | static inline void l2_clean_inv_pa(unsigned long addr) | 88 | static inline void l2_clean_inv_pa(unsigned long addr) |
| @@ -106,13 +106,14 @@ static inline void l2_inv_pa_range(unsigned long start, unsigned long end) | |||
| 106 | */ | 106 | */ |
| 107 | BUG_ON((start ^ end) >> PAGE_SHIFT); | 107 | BUG_ON((start ^ end) >> PAGE_SHIFT); |
| 108 | 108 | ||
| 109 | raw_local_irq_save(flags); | 109 | va_start = l2_get_va(start); |
| 110 | va_start = l2_start_va(start); | ||
| 111 | va_end = va_start + (end - start); | 110 | va_end = va_start + (end - start); |
| 111 | raw_local_irq_save(flags); | ||
| 112 | __asm__("mcr p15, 1, %0, c15, c11, 4\n\t" | 112 | __asm__("mcr p15, 1, %0, c15, c11, 4\n\t" |
| 113 | "mcr p15, 1, %1, c15, c11, 5" | 113 | "mcr p15, 1, %1, c15, c11, 5" |
| 114 | : : "r" (va_start), "r" (va_end)); | 114 | : : "r" (va_start), "r" (va_end)); |
| 115 | raw_local_irq_restore(flags); | 115 | raw_local_irq_restore(flags); |
| 116 | l2_put_va(va_start); | ||
| 116 | } | 117 | } |
| 117 | 118 | ||
| 118 | static inline void l2_inv_all(void) | 119 | static inline void l2_inv_all(void) |
diff --git a/arch/arm/mm/cache-v6.S b/arch/arm/mm/cache-v6.S index 99fa688dfad..c96fa1b3f49 100644 --- a/arch/arm/mm/cache-v6.S +++ b/arch/arm/mm/cache-v6.S | |||
| @@ -203,6 +203,10 @@ ENTRY(v6_flush_kern_dcache_area) | |||
| 203 | * - end - virtual end address of region | 203 | * - end - virtual end address of region |
| 204 | */ | 204 | */ |
| 205 | v6_dma_inv_range: | 205 | v6_dma_inv_range: |
| 206 | #ifdef CONFIG_DMA_CACHE_RWFO | ||
| 207 | ldrb r2, [r0] @ read for ownership | ||
| 208 | strb r2, [r0] @ write for ownership | ||
| 209 | #endif | ||
| 206 | tst r0, #D_CACHE_LINE_SIZE - 1 | 210 | tst r0, #D_CACHE_LINE_SIZE - 1 |
| 207 | bic r0, r0, #D_CACHE_LINE_SIZE - 1 | 211 | bic r0, r0, #D_CACHE_LINE_SIZE - 1 |
| 208 | #ifdef HARVARD_CACHE | 212 | #ifdef HARVARD_CACHE |
| @@ -211,6 +215,10 @@ v6_dma_inv_range: | |||
| 211 | mcrne p15, 0, r0, c7, c11, 1 @ clean unified line | 215 | mcrne p15, 0, r0, c7, c11, 1 @ clean unified line |
| 212 | #endif | 216 | #endif |
| 213 | tst r1, #D_CACHE_LINE_SIZE - 1 | 217 | tst r1, #D_CACHE_LINE_SIZE - 1 |
| 218 | #ifdef CONFIG_DMA_CACHE_RWFO | ||
| 219 | ldrneb r2, [r1, #-1] @ read for ownership | ||
| 220 | strneb r2, [r1, #-1] @ write for ownership | ||
| 221 | #endif | ||
| 214 | bic r1, r1, #D_CACHE_LINE_SIZE - 1 | 222 | bic r1, r1, #D_CACHE_LINE_SIZE - 1 |
| 215 | #ifdef HARVARD_CACHE | 223 | #ifdef HARVARD_CACHE |
| 216 | mcrne p15, 0, r1, c7, c14, 1 @ clean & invalidate D line | 224 | mcrne p15, 0, r1, c7, c14, 1 @ clean & invalidate D line |
| @@ -218,10 +226,6 @@ v6_dma_inv_range: | |||
| 218 | mcrne p15, 0, r1, c7, c15, 1 @ clean & invalidate unified line | 226 | mcrne p15, 0, r1, c7, c15, 1 @ clean & invalidate unified line |
| 219 | #endif | 227 | #endif |
| 220 | 1: | 228 | 1: |
| 221 | #ifdef CONFIG_DMA_CACHE_RWFO | ||
| 222 | ldr r2, [r0] @ read for ownership | ||
| 223 | str r2, [r0] @ write for ownership | ||
| 224 | #endif | ||
| 225 | #ifdef HARVARD_CACHE | 229 | #ifdef HARVARD_CACHE |
| 226 | mcr p15, 0, r0, c7, c6, 1 @ invalidate D line | 230 | mcr p15, 0, r0, c7, c6, 1 @ invalidate D line |
| 227 | #else | 231 | #else |
| @@ -229,6 +233,10 @@ v6_dma_inv_range: | |||
| 229 | #endif | 233 | #endif |
| 230 | add r0, r0, #D_CACHE_LINE_SIZE | 234 | add r0, r0, #D_CACHE_LINE_SIZE |
| 231 | cmp r0, r1 | 235 | cmp r0, r1 |
| 236 | #ifdef CONFIG_DMA_CACHE_RWFO | ||
| 237 | ldrlo r2, [r0] @ read for ownership | ||
| 238 | strlo r2, [r0] @ write for ownership | ||
| 239 | #endif | ||
| 232 | blo 1b | 240 | blo 1b |
| 233 | mov r0, #0 | 241 | mov r0, #0 |
| 234 | mcr p15, 0, r0, c7, c10, 4 @ drain write buffer | 242 | mcr p15, 0, r0, c7, c10, 4 @ drain write buffer |
| @@ -263,12 +271,12 @@ v6_dma_clean_range: | |||
| 263 | * - end - virtual end address of region | 271 | * - end - virtual end address of region |
| 264 | */ | 272 | */ |
| 265 | ENTRY(v6_dma_flush_range) | 273 | ENTRY(v6_dma_flush_range) |
| 266 | bic r0, r0, #D_CACHE_LINE_SIZE - 1 | ||
| 267 | 1: | ||
| 268 | #ifdef CONFIG_DMA_CACHE_RWFO | 274 | #ifdef CONFIG_DMA_CACHE_RWFO |
| 269 | ldr r2, [r0] @ read for ownership | 275 | ldrb r2, [r0] @ read for ownership |
| 270 | str r2, [r0] @ write for ownership | 276 | strb r2, [r0] @ write for ownership |
| 271 | #endif | 277 | #endif |
| 278 | bic r0, r0, #D_CACHE_LINE_SIZE - 1 | ||
| 279 | 1: | ||
| 272 | #ifdef HARVARD_CACHE | 280 | #ifdef HARVARD_CACHE |
| 273 | mcr p15, 0, r0, c7, c14, 1 @ clean & invalidate D line | 281 | mcr p15, 0, r0, c7, c14, 1 @ clean & invalidate D line |
| 274 | #else | 282 | #else |
| @@ -276,6 +284,10 @@ ENTRY(v6_dma_flush_range) | |||
| 276 | #endif | 284 | #endif |
| 277 | add r0, r0, #D_CACHE_LINE_SIZE | 285 | add r0, r0, #D_CACHE_LINE_SIZE |
| 278 | cmp r0, r1 | 286 | cmp r0, r1 |
| 287 | #ifdef CONFIG_DMA_CACHE_RWFO | ||
| 288 | ldrlob r2, [r0] @ read for ownership | ||
| 289 | strlob r2, [r0] @ write for ownership | ||
| 290 | #endif | ||
| 279 | blo 1b | 291 | blo 1b |
| 280 | mov r0, #0 | 292 | mov r0, #0 |
| 281 | mcr p15, 0, r0, c7, c10, 4 @ drain write buffer | 293 | mcr p15, 0, r0, c7, c10, 4 @ drain write buffer |
diff --git a/arch/arm/mm/cache-v7.S b/arch/arm/mm/cache-v7.S index a3ebf7a4f49..6136e68ce95 100644 --- a/arch/arm/mm/cache-v7.S +++ b/arch/arm/mm/cache-v7.S | |||
| @@ -173,15 +173,22 @@ ENTRY(v7_coherent_user_range) | |||
| 173 | UNWIND(.fnstart ) | 173 | UNWIND(.fnstart ) |
| 174 | dcache_line_size r2, r3 | 174 | dcache_line_size r2, r3 |
| 175 | sub r3, r2, #1 | 175 | sub r3, r2, #1 |
| 176 | bic r0, r0, r3 | 176 | bic r12, r0, r3 |
| 177 | 1: | 177 | 1: |
| 178 | USER( mcr p15, 0, r0, c7, c11, 1 ) @ clean D line to the point of unification | 178 | USER( mcr p15, 0, r12, c7, c11, 1 ) @ clean D line to the point of unification |
| 179 | add r12, r12, r2 | ||
| 180 | cmp r12, r1 | ||
| 181 | blo 1b | ||
| 179 | dsb | 182 | dsb |
| 180 | USER( mcr p15, 0, r0, c7, c5, 1 ) @ invalidate I line | 183 | icache_line_size r2, r3 |
| 181 | add r0, r0, r2 | 184 | sub r3, r2, #1 |
| 185 | bic r12, r0, r3 | ||
| 182 | 2: | 186 | 2: |
| 183 | cmp r0, r1 | 187 | USER( mcr p15, 0, r12, c7, c5, 1 ) @ invalidate I line |
| 184 | blo 1b | 188 | add r12, r12, r2 |
| 189 | cmp r12, r1 | ||
| 190 | blo 2b | ||
| 191 | 3: | ||
| 185 | mov r0, #0 | 192 | mov r0, #0 |
| 186 | ALT_SMP(mcr p15, 0, r0, c7, c1, 6) @ invalidate BTB Inner Shareable | 193 | ALT_SMP(mcr p15, 0, r0, c7, c1, 6) @ invalidate BTB Inner Shareable |
| 187 | ALT_UP(mcr p15, 0, r0, c7, c5, 6) @ invalidate BTB | 194 | ALT_UP(mcr p15, 0, r0, c7, c5, 6) @ invalidate BTB |
| @@ -194,10 +201,10 @@ ENTRY(v7_coherent_user_range) | |||
| 194 | * isn't mapped, just try the next page. | 201 | * isn't mapped, just try the next page. |
| 195 | */ | 202 | */ |
| 196 | 9001: | 203 | 9001: |
| 197 | mov r0, r0, lsr #12 | 204 | mov r12, r12, lsr #12 |
| 198 | mov r0, r0, lsl #12 | 205 | mov r12, r12, lsl #12 |
| 199 | add r0, r0, #4096 | 206 | add r12, r12, #4096 |
| 200 | b 2b | 207 | b 3b |
| 201 | UNWIND(.fnend ) | 208 | UNWIND(.fnend ) |
| 202 | ENDPROC(v7_coherent_kern_range) | 209 | ENDPROC(v7_coherent_kern_range) |
| 203 | ENDPROC(v7_coherent_user_range) | 210 | ENDPROC(v7_coherent_user_range) |
diff --git a/arch/arm/mm/cache-xsc3l2.c b/arch/arm/mm/cache-xsc3l2.c index c3154928bcc..5a32020471e 100644 --- a/arch/arm/mm/cache-xsc3l2.c +++ b/arch/arm/mm/cache-xsc3l2.c | |||
| @@ -17,14 +17,10 @@ | |||
| 17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | 17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
| 18 | */ | 18 | */ |
| 19 | #include <linux/init.h> | 19 | #include <linux/init.h> |
| 20 | #include <linux/highmem.h> | ||
| 20 | #include <asm/system.h> | 21 | #include <asm/system.h> |
| 21 | #include <asm/cputype.h> | 22 | #include <asm/cputype.h> |
| 22 | #include <asm/cacheflush.h> | 23 | #include <asm/cacheflush.h> |
| 23 | #include <asm/kmap_types.h> | ||
| 24 | #include <asm/fixmap.h> | ||
| 25 | #include <asm/pgtable.h> | ||
| 26 | #include <asm/tlbflush.h> | ||
| 27 | #include "mm.h" | ||
| 28 | 24 | ||
| 29 | #define CR_L2 (1 << 26) | 25 | #define CR_L2 (1 << 26) |
| 30 | 26 | ||
| @@ -71,16 +67,15 @@ static inline void xsc3_l2_inv_all(void) | |||
| 71 | dsb(); | 67 | dsb(); |
| 72 | } | 68 | } |
| 73 | 69 | ||
| 70 | static inline void l2_unmap_va(unsigned long va) | ||
| 71 | { | ||
| 74 | #ifdef CONFIG_HIGHMEM | 72 | #ifdef CONFIG_HIGHMEM |
| 75 | #define l2_map_save_flags(x) raw_local_save_flags(x) | 73 | if (va != -1) |
| 76 | #define l2_map_restore_flags(x) raw_local_irq_restore(x) | 74 | kunmap_atomic((void *)va); |
| 77 | #else | ||
| 78 | #define l2_map_save_flags(x) ((x) = 0) | ||
| 79 | #define l2_map_restore_flags(x) ((void)(x)) | ||
| 80 | #endif | 75 | #endif |
| 76 | } | ||
| 81 | 77 | ||
| 82 | static inline unsigned long l2_map_va(unsigned long pa, unsigned long prev_va, | 78 | static inline unsigned long l2_map_va(unsigned long pa, unsigned long prev_va) |
| 83 | unsigned long flags) | ||
| 84 | { | 79 | { |
| 85 | #ifdef CONFIG_HIGHMEM | 80 | #ifdef CONFIG_HIGHMEM |
| 86 | unsigned long va = prev_va & PAGE_MASK; | 81 | unsigned long va = prev_va & PAGE_MASK; |
| @@ -89,17 +84,10 @@ static inline unsigned long l2_map_va(unsigned long pa, unsigned long prev_va, | |||
| 89 | /* | 84 | /* |
| 90 | * Switching to a new page. Because cache ops are | 85 | * Switching to a new page. Because cache ops are |
| 91 | * using virtual addresses only, we must put a mapping | 86 | * using virtual addresses only, we must put a mapping |
| 92 | * in place for it. We also enable interrupts for a | 87 | * in place for it. |
| 93 | * short while and disable them again to protect this | ||
| 94 | * mapping. | ||
| 95 | */ | 88 | */ |
| 96 | unsigned long idx; | 89 | l2_unmap_va(prev_va); |
| 97 | raw_local_irq_restore(flags); | 90 | va = (unsigned long)kmap_atomic_pfn(pa >> PAGE_SHIFT); |
| 98 | idx = KM_L2_CACHE + KM_TYPE_NR * smp_processor_id(); | ||
| 99 | va = __fix_to_virt(FIX_KMAP_BEGIN + idx); | ||
| 100 | raw_local_irq_restore(flags | PSR_I_BIT); | ||
| 101 | set_pte_ext(TOP_PTE(va), pfn_pte(pa >> PAGE_SHIFT, PAGE_KERNEL), 0); | ||
| 102 | local_flush_tlb_kernel_page(va); | ||
| 103 | } | 91 | } |
| 104 | return va + (pa_offset >> (32 - PAGE_SHIFT)); | 92 | return va + (pa_offset >> (32 - PAGE_SHIFT)); |
| 105 | #else | 93 | #else |
| @@ -109,7 +97,7 @@ static inline unsigned long l2_map_va(unsigned long pa, unsigned long prev_va, | |||
| 109 | 97 | ||
| 110 | static void xsc3_l2_inv_range(unsigned long start, unsigned long end) | 98 | static void xsc3_l2_inv_range(unsigned long start, unsigned long end) |
| 111 | { | 99 | { |
| 112 | unsigned long vaddr, flags; | 100 | unsigned long vaddr; |
| 113 | 101 | ||
| 114 | if (start == 0 && end == -1ul) { | 102 | if (start == 0 && end == -1ul) { |
| 115 | xsc3_l2_inv_all(); | 103 | xsc3_l2_inv_all(); |
| @@ -117,13 +105,12 @@ static void xsc3_l2_inv_range(unsigned long start, unsigned long end) | |||
| 117 | } | 105 | } |
| 118 | 106 | ||
| 119 | vaddr = -1; /* to force the first mapping */ | 107 | vaddr = -1; /* to force the first mapping */ |
| 120 | l2_map_save_flags(flags); | ||
| 121 | 108 | ||
| 122 | /* | 109 | /* |
| 123 | * Clean and invalidate partial first cache line. | 110 | * Clean and invalidate partial first cache line. |
| 124 | */ | 111 | */ |
| 125 | if (start & (CACHE_LINE_SIZE - 1)) { | 112 | if (start & (CACHE_LINE_SIZE - 1)) { |
| 126 | vaddr = l2_map_va(start & ~(CACHE_LINE_SIZE - 1), vaddr, flags); | 113 | vaddr = l2_map_va(start & ~(CACHE_LINE_SIZE - 1), vaddr); |
| 127 | xsc3_l2_clean_mva(vaddr); | 114 | xsc3_l2_clean_mva(vaddr); |
| 128 | xsc3_l2_inv_mva(vaddr); | 115 | xsc3_l2_inv_mva(vaddr); |
| 129 | start = (start | (CACHE_LINE_SIZE - 1)) + 1; | 116 | start = (start | (CACHE_LINE_SIZE - 1)) + 1; |
| @@ -133,7 +120,7 @@ static void xsc3_l2_inv_range(unsigned long start, unsigned long end) | |||
| 133 | * Invalidate all full cache lines between 'start' and 'end'. | 120 | * Invalidate all full cache lines between 'start' and 'end'. |
| 134 | */ | 121 | */ |
| 135 | while (start < (end & ~(CACHE_LINE_SIZE - 1))) { | 122 | while (start < (end & ~(CACHE_LINE_SIZE - 1))) { |
| 136 | vaddr = l2_map_va(start, vaddr, flags); | 123 | vaddr = l2_map_va(start, vaddr); |
| 137 | xsc3_l2_inv_mva(vaddr); | 124 | xsc3_l2_inv_mva(vaddr); |
| 138 | start += CACHE_LINE_SIZE; | 125 | start += CACHE_LINE_SIZE; |
| 139 | } | 126 | } |
| @@ -142,31 +129,30 @@ static void xsc3_l2_inv_range(unsigned long start, unsigned long end) | |||
| 142 | * Clean and invalidate partial last cache line. | 129 | * Clean and invalidate partial last cache line. |
| 143 | */ | 130 | */ |
| 144 | if (start < end) { | 131 | if (start < end) { |
| 145 | vaddr = l2_map_va(start, vaddr, flags); | 132 | vaddr = l2_map_va(start, vaddr); |
| 146 | xsc3_l2_clean_mva(vaddr); | 133 | xsc3_l2_clean_mva(vaddr); |
| 147 | xsc3_l2_inv_mva(vaddr); | 134 | xsc3_l2_inv_mva(vaddr); |
| 148 | } | 135 | } |
| 149 | 136 | ||
| 150 | l2_map_restore_flags(flags); | 137 | l2_unmap_va(vaddr); |
| 151 | 138 | ||
| 152 | dsb(); | 139 | dsb(); |
| 153 | } | 140 | } |
| 154 | 141 | ||
| 155 | static void xsc3_l2_clean_range(unsigned long start, unsigned long end) | 142 | static void xsc3_l2_clean_range(unsigned long start, unsigned long end) |
| 156 | { | 143 | { |
| 157 | unsigned long vaddr, flags; | 144 | unsigned long vaddr; |
| 158 | 145 | ||
| 159 | vaddr = -1; /* to force the first mapping */ | 146 | vaddr = -1; /* to force the first mapping */ |
| 160 | l2_map_save_flags(flags); | ||
| 161 | 147 | ||
| 162 | start &= ~(CACHE_LINE_SIZE - 1); | 148 | start &= ~(CACHE_LINE_SIZE - 1); |
| 163 | while (start < end) { | 149 | while (start < end) { |
| 164 | vaddr = l2_map_va(start, vaddr, flags); | 150 | vaddr = l2_map_va(start, vaddr); |
| 165 | xsc3_l2_clean_mva(vaddr); | 151 | xsc3_l2_clean_mva(vaddr); |
| 166 | start += CACHE_LINE_SIZE; | 152 | start += CACHE_LINE_SIZE; |
| 167 | } | 153 | } |
| 168 | 154 | ||
| 169 | l2_map_restore_flags(flags); | 155 | l2_unmap_va(vaddr); |
| 170 | 156 | ||
| 171 | dsb(); | 157 | dsb(); |
| 172 | } | 158 | } |
| @@ -193,7 +179,7 @@ static inline void xsc3_l2_flush_all(void) | |||
| 193 | 179 | ||
| 194 | static void xsc3_l2_flush_range(unsigned long start, unsigned long end) | 180 | static void xsc3_l2_flush_range(unsigned long start, unsigned long end) |
| 195 | { | 181 | { |
| 196 | unsigned long vaddr, flags; | 182 | unsigned long vaddr; |
| 197 | 183 | ||
| 198 | if (start == 0 && end == -1ul) { | 184 | if (start == 0 && end == -1ul) { |
| 199 | xsc3_l2_flush_all(); | 185 | xsc3_l2_flush_all(); |
| @@ -201,17 +187,16 @@ static void xsc3_l2_flush_range(unsigned long start, unsigned long end) | |||
| 201 | } | 187 | } |
| 202 | 188 | ||
| 203 | vaddr = -1; /* to force the first mapping */ | 189 | vaddr = -1; /* to force the first mapping */ |
| 204 | l2_map_save_flags(flags); | ||
| 205 | 190 | ||
| 206 | start &= ~(CACHE_LINE_SIZE - 1); | 191 | start &= ~(CACHE_LINE_SIZE - 1); |
| 207 | while (start < end) { | 192 | while (start < end) { |
| 208 | vaddr = l2_map_va(start, vaddr, flags); | 193 | vaddr = l2_map_va(start, vaddr); |
| 209 | xsc3_l2_clean_mva(vaddr); | 194 | xsc3_l2_clean_mva(vaddr); |
| 210 | xsc3_l2_inv_mva(vaddr); | 195 | xsc3_l2_inv_mva(vaddr); |
| 211 | start += CACHE_LINE_SIZE; | 196 | start += CACHE_LINE_SIZE; |
| 212 | } | 197 | } |
| 213 | 198 | ||
| 214 | l2_map_restore_flags(flags); | 199 | l2_unmap_va(vaddr); |
| 215 | 200 | ||
| 216 | dsb(); | 201 | dsb(); |
| 217 | } | 202 | } |
diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c index ac6a36142fc..809f1bf9fa2 100644 --- a/arch/arm/mm/dma-mapping.c +++ b/arch/arm/mm/dma-mapping.c | |||
| @@ -17,6 +17,7 @@ | |||
| 17 | #include <linux/init.h> | 17 | #include <linux/init.h> |
| 18 | #include <linux/device.h> | 18 | #include <linux/device.h> |
| 19 | #include <linux/dma-mapping.h> | 19 | #include <linux/dma-mapping.h> |
| 20 | #include <linux/highmem.h> | ||
| 20 | 21 | ||
| 21 | #include <asm/memory.h> | 22 | #include <asm/memory.h> |
| 22 | #include <asm/highmem.h> | 23 | #include <asm/highmem.h> |
| @@ -480,10 +481,10 @@ static void dma_cache_maint_page(struct page *page, unsigned long offset, | |||
| 480 | op(vaddr, len, dir); | 481 | op(vaddr, len, dir); |
| 481 | kunmap_high(page); | 482 | kunmap_high(page); |
| 482 | } else if (cache_is_vipt()) { | 483 | } else if (cache_is_vipt()) { |
| 483 | pte_t saved_pte; | 484 | /* unmapped pages might still be cached */ |
| 484 | vaddr = kmap_high_l1_vipt(page, &saved_pte); | 485 | vaddr = kmap_atomic(page); |
| 485 | op(vaddr + offset, len, dir); | 486 | op(vaddr + offset, len, dir); |
| 486 | kunmap_high_l1_vipt(page, saved_pte); | 487 | kunmap_atomic(vaddr); |
| 487 | } | 488 | } |
| 488 | } else { | 489 | } else { |
| 489 | vaddr = page_address(page) + offset; | 490 | vaddr = page_address(page) + offset; |
diff --git a/arch/arm/mm/flush.c b/arch/arm/mm/flush.c index 391ffae7509..c29f2839f1d 100644 --- a/arch/arm/mm/flush.c +++ b/arch/arm/mm/flush.c | |||
| @@ -10,6 +10,7 @@ | |||
| 10 | #include <linux/module.h> | 10 | #include <linux/module.h> |
| 11 | #include <linux/mm.h> | 11 | #include <linux/mm.h> |
| 12 | #include <linux/pagemap.h> | 12 | #include <linux/pagemap.h> |
| 13 | #include <linux/highmem.h> | ||
| 13 | 14 | ||
| 14 | #include <asm/cacheflush.h> | 15 | #include <asm/cacheflush.h> |
| 15 | #include <asm/cachetype.h> | 16 | #include <asm/cachetype.h> |
| @@ -180,10 +181,10 @@ void __flush_dcache_page(struct address_space *mapping, struct page *page) | |||
| 180 | __cpuc_flush_dcache_area(addr, PAGE_SIZE); | 181 | __cpuc_flush_dcache_area(addr, PAGE_SIZE); |
| 181 | kunmap_high(page); | 182 | kunmap_high(page); |
| 182 | } else if (cache_is_vipt()) { | 183 | } else if (cache_is_vipt()) { |
| 183 | pte_t saved_pte; | 184 | /* unmapped pages might still be cached */ |
| 184 | addr = kmap_high_l1_vipt(page, &saved_pte); | 185 | addr = kmap_atomic(page); |
| 185 | __cpuc_flush_dcache_area(addr, PAGE_SIZE); | 186 | __cpuc_flush_dcache_area(addr, PAGE_SIZE); |
| 186 | kunmap_high_l1_vipt(page, saved_pte); | 187 | kunmap_atomic(addr); |
| 187 | } | 188 | } |
| 188 | } | 189 | } |
| 189 | 190 | ||
diff --git a/arch/arm/mm/highmem.c b/arch/arm/mm/highmem.c index c435fd9e1da..807c0573abb 100644 --- a/arch/arm/mm/highmem.c +++ b/arch/arm/mm/highmem.c | |||
| @@ -140,90 +140,3 @@ struct page *kmap_atomic_to_page(const void *ptr) | |||
| 140 | pte = TOP_PTE(vaddr); | 140 | pte = TOP_PTE(vaddr); |
| 141 | return pte_page(*pte); | 141 | return pte_page(*pte); |
| 142 | } | 142 | } |
| 143 | |||
| 144 | #ifdef CONFIG_CPU_CACHE_VIPT | ||
| 145 | |||
| 146 | #include <linux/percpu.h> | ||
| 147 | |||
| 148 | /* | ||
| 149 | * The VIVT cache of a highmem page is always flushed before the page | ||
| 150 | * is unmapped. Hence unmapped highmem pages need no cache maintenance | ||
| 151 | * in that case. | ||
| 152 | * | ||
| 153 | * However unmapped pages may still be cached with a VIPT cache, and | ||
| 154 | * it is not possible to perform cache maintenance on them using physical | ||
| 155 | * addresses unfortunately. So we have no choice but to set up a temporary | ||
| 156 | * virtual mapping for that purpose. | ||
| 157 | * | ||
| 158 | * Yet this VIPT cache maintenance may be triggered from DMA support | ||
| 159 | * functions which are possibly called from interrupt context. As we don't | ||
| 160 | * want to keep interrupt disabled all the time when such maintenance is | ||
| 161 | * taking place, we therefore allow for some reentrancy by preserving and | ||
| 162 | * restoring the previous fixmap entry before the interrupted context is | ||
| 163 | * resumed. If the reentrancy depth is 0 then there is no need to restore | ||
| 164 | * the previous fixmap, and leaving the current one in place allow it to | ||
| 165 | * be reused the next time without a TLB flush (common with DMA). | ||
| 166 | */ | ||
| 167 | |||
| 168 | static DEFINE_PER_CPU(int, kmap_high_l1_vipt_depth); | ||
| 169 | |||
| 170 | void *kmap_high_l1_vipt(struct page *page, pte_t *saved_pte) | ||
| 171 | { | ||
| 172 | unsigned int idx, cpu; | ||
| 173 | int *depth; | ||
| 174 | unsigned long vaddr, flags; | ||
| 175 | pte_t pte, *ptep; | ||
| 176 | |||
| 177 | if (!in_interrupt()) | ||
| 178 | preempt_disable(); | ||
| 179 | |||
| 180 | cpu = smp_processor_id(); | ||
| 181 | depth = &per_cpu(kmap_high_l1_vipt_depth, cpu); | ||
| 182 | |||
| 183 | idx = KM_L1_CACHE + KM_TYPE_NR * cpu; | ||
| 184 | vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx); | ||
| 185 | ptep = TOP_PTE(vaddr); | ||
| 186 | pte = mk_pte(page, kmap_prot); | ||
| 187 | |||
| 188 | raw_local_irq_save(flags); | ||
| 189 | (*depth)++; | ||
| 190 | if (pte_val(*ptep) == pte_val(pte)) { | ||
| 191 | *saved_pte = pte; | ||
| 192 | } else { | ||
| 193 | *saved_pte = *ptep; | ||
| 194 | set_pte_ext(ptep, pte, 0); | ||
| 195 | local_flush_tlb_kernel_page(vaddr); | ||
| 196 | } | ||
| 197 | raw_local_irq_restore(flags); | ||
| 198 | |||
| 199 | return (void *)vaddr; | ||
| 200 | } | ||
| 201 | |||
| 202 | void kunmap_high_l1_vipt(struct page *page, pte_t saved_pte) | ||
| 203 | { | ||
| 204 | unsigned int idx, cpu = smp_processor_id(); | ||
| 205 | int *depth = &per_cpu(kmap_high_l1_vipt_depth, cpu); | ||
| 206 | unsigned long vaddr, flags; | ||
| 207 | pte_t pte, *ptep; | ||
| 208 | |||
| 209 | idx = KM_L1_CACHE + KM_TYPE_NR * cpu; | ||
| 210 | vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx); | ||
| 211 | ptep = TOP_PTE(vaddr); | ||
| 212 | pte = mk_pte(page, kmap_prot); | ||
| 213 | |||
| 214 | BUG_ON(pte_val(*ptep) != pte_val(pte)); | ||
| 215 | BUG_ON(*depth <= 0); | ||
| 216 | |||
| 217 | raw_local_irq_save(flags); | ||
| 218 | (*depth)--; | ||
| 219 | if (*depth != 0 && pte_val(pte) != pte_val(saved_pte)) { | ||
| 220 | set_pte_ext(ptep, saved_pte, 0); | ||
| 221 | local_flush_tlb_kernel_page(vaddr); | ||
| 222 | } | ||
| 223 | raw_local_irq_restore(flags); | ||
| 224 | |||
| 225 | if (!in_interrupt()) | ||
| 226 | preempt_enable(); | ||
| 227 | } | ||
| 228 | |||
| 229 | #endif /* CONFIG_CPU_CACHE_VIPT */ | ||
diff --git a/arch/arm/mm/proc-macros.S b/arch/arm/mm/proc-macros.S index 7d63beaf974..b795afd0a2c 100644 --- a/arch/arm/mm/proc-macros.S +++ b/arch/arm/mm/proc-macros.S | |||
| @@ -61,17 +61,27 @@ | |||
| 61 | .endm | 61 | .endm |
| 62 | 62 | ||
| 63 | /* | 63 | /* |
| 64 | * cache_line_size - get the cache line size from the CSIDR register | 64 | * dcache_line_size - get the minimum D-cache line size from the CTR register |
| 65 | * (available on ARMv7+). It assumes that the CSSR register was configured | 65 | * on ARMv7. |
| 66 | * to access the L1 data cache CSIDR. | ||
| 67 | */ | 66 | */ |
| 68 | .macro dcache_line_size, reg, tmp | 67 | .macro dcache_line_size, reg, tmp |
| 69 | mrc p15, 1, \tmp, c0, c0, 0 @ read CSIDR | 68 | mrc p15, 0, \tmp, c0, c0, 1 @ read ctr |
| 70 | and \tmp, \tmp, #7 @ cache line size encoding | 69 | lsr \tmp, \tmp, #16 |
| 71 | mov \reg, #16 @ size offset | 70 | and \tmp, \tmp, #0xf @ cache line size encoding |
| 71 | mov \reg, #4 @ bytes per word | ||
| 72 | mov \reg, \reg, lsl \tmp @ actual cache line size | 72 | mov \reg, \reg, lsl \tmp @ actual cache line size |
| 73 | .endm | 73 | .endm |
| 74 | 74 | ||
| 75 | /* | ||
| 76 | * icache_line_size - get the minimum I-cache line size from the CTR register | ||
| 77 | * on ARMv7. | ||
| 78 | */ | ||
| 79 | .macro icache_line_size, reg, tmp | ||
| 80 | mrc p15, 0, \tmp, c0, c0, 1 @ read ctr | ||
| 81 | and \tmp, \tmp, #0xf @ cache line size encoding | ||
| 82 | mov \reg, #4 @ bytes per word | ||
| 83 | mov \reg, \reg, lsl \tmp @ actual cache line size | ||
| 84 | .endm | ||
| 75 | 85 | ||
| 76 | /* | 86 | /* |
| 77 | * Sanity check the PTE configuration for the code below - which makes | 87 | * Sanity check the PTE configuration for the code below - which makes |
diff --git a/arch/arm/plat-omap/counter_32k.c b/arch/arm/plat-omap/counter_32k.c index 155fe43a672..8722a136f3a 100644 --- a/arch/arm/plat-omap/counter_32k.c +++ b/arch/arm/plat-omap/counter_32k.c | |||
| @@ -16,6 +16,7 @@ | |||
| 16 | #include <linux/init.h> | 16 | #include <linux/init.h> |
| 17 | #include <linux/clk.h> | 17 | #include <linux/clk.h> |
| 18 | #include <linux/io.h> | 18 | #include <linux/io.h> |
| 19 | #include <linux/err.h> | ||
| 19 | 20 | ||
| 20 | #include <plat/common.h> | 21 | #include <plat/common.h> |
| 21 | #include <plat/board.h> | 22 | #include <plat/board.h> |
| @@ -164,7 +165,7 @@ static int __init omap_init_clocksource_32k(void) | |||
| 164 | return -ENODEV; | 165 | return -ENODEV; |
| 165 | 166 | ||
| 166 | sync_32k_ick = clk_get(NULL, "omap_32ksync_ick"); | 167 | sync_32k_ick = clk_get(NULL, "omap_32ksync_ick"); |
| 167 | if (sync_32k_ick) | 168 | if (!IS_ERR(sync_32k_ick)) |
| 168 | clk_enable(sync_32k_ick); | 169 | clk_enable(sync_32k_ick); |
| 169 | 170 | ||
| 170 | clocksource_32k.mult = clocksource_hz2mult(32768, | 171 | clocksource_32k.mult = clocksource_hz2mult(32768, |
diff --git a/arch/arm/plat-omap/sram.c b/arch/arm/plat-omap/sram.c index e2c8eebe6b3..74dac419d32 100644 --- a/arch/arm/plat-omap/sram.c +++ b/arch/arm/plat-omap/sram.c | |||
| @@ -166,7 +166,7 @@ static void __init omap_detect_sram(void) | |||
| 166 | cpu_is_omap1710()) | 166 | cpu_is_omap1710()) |
| 167 | omap_sram_size = 0x4000; /* 16K */ | 167 | omap_sram_size = 0x4000; /* 16K */ |
| 168 | else if (cpu_is_omap1611()) | 168 | else if (cpu_is_omap1611()) |
| 169 | omap_sram_size = 0x3e800; /* 250K */ | 169 | omap_sram_size = SZ_256K; |
| 170 | else { | 170 | else { |
| 171 | printk(KERN_ERR "Could not detect SRAM size\n"); | 171 | printk(KERN_ERR "Could not detect SRAM size\n"); |
| 172 | omap_sram_size = 0x4000; | 172 | omap_sram_size = 0x4000; |
diff --git a/arch/arm/plat-s3c24xx/Kconfig b/arch/arm/plat-s3c24xx/Kconfig index 5a27b1b538f..eb105e61c74 100644 --- a/arch/arm/plat-s3c24xx/Kconfig +++ b/arch/arm/plat-s3c24xx/Kconfig | |||
| @@ -8,7 +8,7 @@ config PLAT_S3C24XX | |||
| 8 | default y | 8 | default y |
| 9 | select NO_IOPORT | 9 | select NO_IOPORT |
| 10 | select ARCH_REQUIRE_GPIOLIB | 10 | select ARCH_REQUIRE_GPIOLIB |
| 11 | select S3C_DEVICE_NAND | 11 | select S3C_DEV_NAND |
| 12 | select S3C_GPIO_CFG_S3C24XX | 12 | select S3C_GPIO_CFG_S3C24XX |
| 13 | help | 13 | help |
| 14 | Base platform code for any Samsung S3C24XX device | 14 | Base platform code for any Samsung S3C24XX device |
diff --git a/arch/arm/tools/mach-types b/arch/arm/tools/mach-types index 55590a4d87c..2fea897ebeb 100644 --- a/arch/arm/tools/mach-types +++ b/arch/arm/tools/mach-types | |||
| @@ -12,7 +12,7 @@ | |||
| 12 | # | 12 | # |
| 13 | # http://www.arm.linux.org.uk/developer/machines/?action=new | 13 | # http://www.arm.linux.org.uk/developer/machines/?action=new |
| 14 | # | 14 | # |
| 15 | # Last update: Thu Sep 9 22:43:01 2010 | 15 | # Last update: Sun Dec 12 23:24:27 2010 |
| 16 | # | 16 | # |
| 17 | # machine_is_xxx CONFIG_xxxx MACH_TYPE_xxx number | 17 | # machine_is_xxx CONFIG_xxxx MACH_TYPE_xxx number |
| 18 | # | 18 | # |
| @@ -2321,7 +2321,7 @@ mx31txtr MACH_MX31TXTR MX31TXTR 2332 | |||
| 2321 | u380 MACH_U380 U380 2333 | 2321 | u380 MACH_U380 U380 2333 |
| 2322 | oamp3_hualu MACH_HUALU_BOARD HUALU_BOARD 2334 | 2322 | oamp3_hualu MACH_HUALU_BOARD HUALU_BOARD 2334 |
| 2323 | npcmx50 MACH_NPCMX50 NPCMX50 2335 | 2323 | npcmx50 MACH_NPCMX50 NPCMX50 2335 |
| 2324 | mx51_lange51 MACH_MX51_LANGE51 MX51_LANGE51 2336 | 2324 | mx51_efikamx MACH_MX51_EFIKAMX MX51_EFIKAMX 2336 |
| 2325 | mx51_lange52 MACH_MX51_LANGE52 MX51_LANGE52 2337 | 2325 | mx51_lange52 MACH_MX51_LANGE52 MX51_LANGE52 2337 |
| 2326 | riom MACH_RIOM RIOM 2338 | 2326 | riom MACH_RIOM RIOM 2338 |
| 2327 | comcas MACH_COMCAS COMCAS 2339 | 2327 | comcas MACH_COMCAS COMCAS 2339 |
| @@ -2355,7 +2355,7 @@ at91sam9263cs MACH_AT91SAM9263CS AT91SAM9263CS 2366 | |||
| 2355 | csb732 MACH_CSB732 CSB732 2367 | 2355 | csb732 MACH_CSB732 CSB732 2367 |
| 2356 | u8500 MACH_U8500 U8500 2368 | 2356 | u8500 MACH_U8500 U8500 2368 |
| 2357 | huqiu MACH_HUQIU HUQIU 2369 | 2357 | huqiu MACH_HUQIU HUQIU 2369 |
| 2358 | mx51_kunlun MACH_MX51_KUNLUN MX51_KUNLUN 2370 | 2358 | mx51_efikasb MACH_MX51_EFIKASB MX51_EFIKASB 2370 |
| 2359 | pmt1g MACH_PMT1G PMT1G 2371 | 2359 | pmt1g MACH_PMT1G PMT1G 2371 |
| 2360 | htcelf MACH_HTCELF HTCELF 2372 | 2360 | htcelf MACH_HTCELF HTCELF 2372 |
| 2361 | armadillo420 MACH_ARMADILLO420 ARMADILLO420 2373 | 2361 | armadillo420 MACH_ARMADILLO420 ARMADILLO420 2373 |
| @@ -2971,7 +2971,7 @@ premierwave_en MACH_PREMIERWAVE_EN PREMIERWAVE_EN 2985 | |||
| 2971 | wasabi MACH_WASABI WASABI 2986 | 2971 | wasabi MACH_WASABI WASABI 2986 |
| 2972 | vivow MACH_VIVOW VIVOW 2987 | 2972 | vivow MACH_VIVOW VIVOW 2987 |
| 2973 | mx50_rdp MACH_MX50_RDP MX50_RDP 2988 | 2973 | mx50_rdp MACH_MX50_RDP MX50_RDP 2988 |
| 2974 | universal MACH_UNIVERSAL UNIVERSAL 2989 | 2974 | universal_c210 MACH_UNIVERSAL_C210 UNIVERSAL_C210 2989 |
| 2975 | real6410 MACH_REAL6410 REAL6410 2990 | 2975 | real6410 MACH_REAL6410 REAL6410 2990 |
| 2976 | spx_sakura MACH_SPX_SAKURA SPX_SAKURA 2991 | 2976 | spx_sakura MACH_SPX_SAKURA SPX_SAKURA 2991 |
| 2977 | ij3k_2440 MACH_IJ3K_2440 IJ3K_2440 2992 | 2977 | ij3k_2440 MACH_IJ3K_2440 IJ3K_2440 2992 |
| @@ -3044,3 +3044,178 @@ harvest_desoto MACH_HARVEST_DESOTO HARVEST_DESOTO 3059 | |||
| 3044 | msm8x60_qrdc MACH_MSM8X60_QRDC MSM8X60_QRDC 3060 | 3044 | msm8x60_qrdc MACH_MSM8X60_QRDC MSM8X60_QRDC 3060 |
| 3045 | spear900 MACH_SPEAR900 SPEAR900 3061 | 3045 | spear900 MACH_SPEAR900 SPEAR900 3061 |
| 3046 | pcontrol_g20 MACH_PCONTROL_G20 PCONTROL_G20 3062 | 3046 | pcontrol_g20 MACH_PCONTROL_G20 PCONTROL_G20 3062 |
| 3047 | rdstor MACH_RDSTOR RDSTOR 3063 | ||
| 3048 | usdloader MACH_USDLOADER USDLOADER 3064 | ||
| 3049 | tsoploader MACH_TSOPLOADER TSOPLOADER 3065 | ||
| 3050 | kronos MACH_KRONOS KRONOS 3066 | ||
| 3051 | ffcore MACH_FFCORE FFCORE 3067 | ||
| 3052 | mone MACH_MONE MONE 3068 | ||
| 3053 | unit2s MACH_UNIT2S UNIT2S 3069 | ||
| 3054 | acer_a5 MACH_ACER_A5 ACER_A5 3070 | ||
| 3055 | etherpro_isp MACH_ETHERPRO_ISP ETHERPRO_ISP 3071 | ||
| 3056 | stretchs7000 MACH_STRETCHS7000 STRETCHS7000 3072 | ||
| 3057 | p87_smartsim MACH_P87_SMARTSIM P87_SMARTSIM 3073 | ||
| 3058 | tulip MACH_TULIP TULIP 3074 | ||
| 3059 | sunflower MACH_SUNFLOWER SUNFLOWER 3075 | ||
| 3060 | rib MACH_RIB RIB 3076 | ||
| 3061 | clod MACH_CLOD CLOD 3077 | ||
| 3062 | rump MACH_RUMP RUMP 3078 | ||
| 3063 | tenderloin MACH_TENDERLOIN TENDERLOIN 3079 | ||
| 3064 | shortloin MACH_SHORTLOIN SHORTLOIN 3080 | ||
| 3065 | crespo MACH_CRESPO CRESPO 3081 | ||
| 3066 | antares MACH_ANTARES ANTARES 3082 | ||
| 3067 | wb40n MACH_WB40N WB40N 3083 | ||
| 3068 | herring MACH_HERRING HERRING 3084 | ||
| 3069 | naxy400 MACH_NAXY400 NAXY400 3085 | ||
| 3070 | naxy1200 MACH_NAXY1200 NAXY1200 3086 | ||
| 3071 | vpr200 MACH_VPR200 VPR200 3087 | ||
| 3072 | bug20 MACH_BUG20 BUG20 3088 | ||
| 3073 | goflexnet MACH_GOFLEXNET GOFLEXNET 3089 | ||
| 3074 | torbreck MACH_TORBRECK TORBRECK 3090 | ||
| 3075 | saarb_mg1 MACH_SAARB_MG1 SAARB_MG1 3091 | ||
| 3076 | callisto MACH_CALLISTO CALLISTO 3092 | ||
| 3077 | multhsu MACH_MULTHSU MULTHSU 3093 | ||
| 3078 | saluda MACH_SALUDA SALUDA 3094 | ||
| 3079 | pemp_omap3_apollo MACH_PEMP_OMAP3_APOLLO PEMP_OMAP3_APOLLO 3095 | ||
| 3080 | vc0718 MACH_VC0718 VC0718 3096 | ||
| 3081 | mvblx MACH_MVBLX MVBLX 3097 | ||
| 3082 | inhand_apeiron MACH_INHAND_APEIRON INHAND_APEIRON 3098 | ||
| 3083 | inhand_fury MACH_INHAND_FURY INHAND_FURY 3099 | ||
| 3084 | inhand_siren MACH_INHAND_SIREN INHAND_SIREN 3100 | ||
| 3085 | hdnvp MACH_HDNVP HDNVP 3101 | ||
| 3086 | softwinner MACH_SOFTWINNER SOFTWINNER 3102 | ||
| 3087 | prima2_evb MACH_PRIMA2_EVB PRIMA2_EVB 3103 | ||
| 3088 | nas6210 MACH_NAS6210 NAS6210 3104 | ||
| 3089 | unisdev MACH_UNISDEV UNISDEV 3105 | ||
| 3090 | sbca11 MACH_SBCA11 SBCA11 3106 | ||
| 3091 | saga MACH_SAGA SAGA 3107 | ||
| 3092 | ns_k330 MACH_NS_K330 NS_K330 3108 | ||
| 3093 | tanna MACH_TANNA TANNA 3109 | ||
| 3094 | imate8502 MACH_IMATE8502 IMATE8502 3110 | ||
| 3095 | aspen MACH_ASPEN ASPEN 3111 | ||
| 3096 | daintree_cwac MACH_DAINTREE_CWAC DAINTREE_CWAC 3112 | ||
| 3097 | zmx25 MACH_ZMX25 ZMX25 3113 | ||
| 3098 | maple1 MACH_MAPLE1 MAPLE1 3114 | ||
| 3099 | qsd8x72_surf MACH_QSD8X72_SURF QSD8X72_SURF 3115 | ||
| 3100 | qsd8x72_ffa MACH_QSD8X72_FFA QSD8X72_FFA 3116 | ||
| 3101 | abilene MACH_ABILENE ABILENE 3117 | ||
| 3102 | eigen_ttr MACH_EIGEN_TTR EIGEN_TTR 3118 | ||
| 3103 | iomega_ix2_200 MACH_IOMEGA_IX2_200 IOMEGA_IX2_200 3119 | ||
| 3104 | coretec_vcx7400 MACH_CORETEC_VCX7400 CORETEC_VCX7400 3120 | ||
| 3105 | santiago MACH_SANTIAGO SANTIAGO 3121 | ||
| 3106 | mx257sol MACH_MX257SOL MX257SOL 3122 | ||
| 3107 | strasbourg MACH_STRASBOURG STRASBOURG 3123 | ||
| 3108 | msm8x60_fluid MACH_MSM8X60_FLUID MSM8X60_FLUID 3124 | ||
| 3109 | smartqv5 MACH_SMARTQV5 SMARTQV5 3125 | ||
| 3110 | smartqv3 MACH_SMARTQV3 SMARTQV3 3126 | ||
| 3111 | smartqv7 MACH_SMARTQV7 SMARTQV7 3127 | ||
| 3112 | paz00 MACH_PAZ00 PAZ00 3128 | ||
| 3113 | acmenetusfoxg20 MACH_ACMENETUSFOXG20 ACMENETUSFOXG20 3129 | ||
| 3114 | htcwillow MACH_HTCWILLOW HTCWILLOW 3130 | ||
| 3115 | fwbd_0404 MACH_FWBD_0404 FWBD_0404 3131 | ||
| 3116 | hdgu MACH_HDGU HDGU 3132 | ||
| 3117 | pyramid MACH_PYRAMID PYRAMID 3133 | ||
| 3118 | epiphan MACH_EPIPHAN EPIPHAN 3134 | ||
| 3119 | omap_bender MACH_OMAP_BENDER OMAP_BENDER 3135 | ||
| 3120 | gurnard MACH_GURNARD GURNARD 3136 | ||
| 3121 | gtl_it5100 MACH_GTL_IT5100 GTL_IT5100 3137 | ||
| 3122 | bcm2708 MACH_BCM2708 BCM2708 3138 | ||
| 3123 | mx51_ggc MACH_MX51_GGC MX51_GGC 3139 | ||
| 3124 | sharespace MACH_SHARESPACE SHARESPACE 3140 | ||
| 3125 | haba_knx_explorer MACH_HABA_KNX_EXPLORER HABA_KNX_EXPLORER 3141 | ||
| 3126 | simtec_kirkmod MACH_SIMTEC_KIRKMOD SIMTEC_KIRKMOD 3142 | ||
| 3127 | crux MACH_CRUX CRUX 3143 | ||
| 3128 | mx51_bravo MACH_MX51_BRAVO MX51_BRAVO 3144 | ||
| 3129 | charon MACH_CHARON CHARON 3145 | ||
| 3130 | picocom3 MACH_PICOCOM3 PICOCOM3 3146 | ||
| 3131 | picocom4 MACH_PICOCOM4 PICOCOM4 3147 | ||
| 3132 | serrano MACH_SERRANO SERRANO 3148 | ||
| 3133 | doubleshot MACH_DOUBLESHOT DOUBLESHOT 3149 | ||
| 3134 | evsy MACH_EVSY EVSY 3150 | ||
| 3135 | huashan MACH_HUASHAN HUASHAN 3151 | ||
| 3136 | lausanne MACH_LAUSANNE LAUSANNE 3152 | ||
| 3137 | emerald MACH_EMERALD EMERALD 3153 | ||
| 3138 | tqma35 MACH_TQMA35 TQMA35 3154 | ||
| 3139 | marvel MACH_MARVEL MARVEL 3155 | ||
| 3140 | manuae MACH_MANUAE MANUAE 3156 | ||
| 3141 | chacha MACH_CHACHA CHACHA 3157 | ||
| 3142 | lemon MACH_LEMON LEMON 3158 | ||
| 3143 | csc MACH_CSC CSC 3159 | ||
| 3144 | gira_knxip_router MACH_GIRA_KNXIP_ROUTER GIRA_KNXIP_ROUTER 3160 | ||
| 3145 | t20 MACH_T20 T20 3161 | ||
| 3146 | hdmini MACH_HDMINI HDMINI 3162 | ||
| 3147 | sciphone_g2 MACH_SCIPHONE_G2 SCIPHONE_G2 3163 | ||
| 3148 | express MACH_EXPRESS EXPRESS 3164 | ||
| 3149 | express_kt MACH_EXPRESS_KT EXPRESS_KT 3165 | ||
| 3150 | maximasp MACH_MAXIMASP MAXIMASP 3166 | ||
| 3151 | nitrogen_imx51 MACH_NITROGEN_IMX51 NITROGEN_IMX51 3167 | ||
| 3152 | nitrogen_imx53 MACH_NITROGEN_IMX53 NITROGEN_IMX53 3168 | ||
| 3153 | sunfire MACH_SUNFIRE SUNFIRE 3169 | ||
| 3154 | arowana MACH_AROWANA AROWANA 3170 | ||
| 3155 | tegra_daytona MACH_TEGRA_DAYTONA TEGRA_DAYTONA 3171 | ||
| 3156 | tegra_swordfish MACH_TEGRA_SWORDFISH TEGRA_SWORDFISH 3172 | ||
| 3157 | edison MACH_EDISON EDISON 3173 | ||
| 3158 | svp8500v1 MACH_SVP8500V1 SVP8500V1 3174 | ||
| 3159 | svp8500v2 MACH_SVP8500V2 SVP8500V2 3175 | ||
| 3160 | svp5500 MACH_SVP5500 SVP5500 3176 | ||
| 3161 | b5500 MACH_B5500 B5500 3177 | ||
| 3162 | s5500 MACH_S5500 S5500 3178 | ||
| 3163 | icon MACH_ICON ICON 3179 | ||
| 3164 | elephant MACH_ELEPHANT ELEPHANT 3180 | ||
| 3165 | msm8x60_fusion MACH_MSM8X60_FUSION MSM8X60_FUSION 3181 | ||
| 3166 | shooter MACH_SHOOTER SHOOTER 3182 | ||
| 3167 | spade_lte MACH_SPADE_LTE SPADE_LTE 3183 | ||
| 3168 | philhwani MACH_PHILHWANI PHILHWANI 3184 | ||
| 3169 | gsncomm MACH_GSNCOMM GSNCOMM 3185 | ||
| 3170 | strasbourg_a2 MACH_STRASBOURG_A2 STRASBOURG_A2 3186 | ||
| 3171 | mmm MACH_MMM MMM 3187 | ||
| 3172 | davinci_dm365_bv MACH_DAVINCI_DM365_BV DAVINCI_DM365_BV 3188 | ||
| 3173 | ag5evm MACH_AG5EVM AG5EVM 3189 | ||
| 3174 | sc575plc MACH_SC575PLC SC575PLC 3190 | ||
| 3175 | sc575hmi MACH_SC575IPC SC575IPC 3191 | ||
| 3176 | omap3_tdm3730 MACH_OMAP3_TDM3730 OMAP3_TDM3730 3192 | ||
| 3177 | g7 MACH_G7 G7 3193 | ||
| 3178 | top9000_eval MACH_TOP9000_EVAL TOP9000_EVAL 3194 | ||
| 3179 | top9000_su MACH_TOP9000_SU TOP9000_SU 3195 | ||
| 3180 | utm300 MACH_UTM300 UTM300 3196 | ||
| 3181 | tsunagi MACH_TSUNAGI TSUNAGI 3197 | ||
| 3182 | ts75xx MACH_TS75XX TS75XX 3198 | ||
| 3183 | msm8x60_fusn_ffa MACH_MSM8X60_FUSN_FFA MSM8X60_FUSN_FFA 3199 | ||
| 3184 | ts47xx MACH_TS47XX TS47XX 3200 | ||
| 3185 | da850_k5 MACH_DA850_K5 DA850_K5 3201 | ||
| 3186 | ax502 MACH_AX502 AX502 3202 | ||
| 3187 | igep0032 MACH_IGEP0032 IGEP0032 3203 | ||
| 3188 | antero MACH_ANTERO ANTERO 3204 | ||
| 3189 | synergy MACH_SYNERGY SYNERGY 3205 | ||
| 3190 | ics_if_voip MACH_ICS_IF_VOIP ICS_IF_VOIP 3206 | ||
| 3191 | wlf_cragg_6410 MACH_WLF_CRAGG_6410 WLF_CRAGG_6410 3207 | ||
| 3192 | punica MACH_PUNICA PUNICA 3208 | ||
| 3193 | sbc_nt250 MACH_SBC_NT250 SBC_NT250 3209 | ||
| 3194 | mx27_wmultra MACH_MX27_WMULTRA MX27_WMULTRA 3210 | ||
| 3195 | mackerel MACH_MACKEREL MACKEREL 3211 | ||
| 3196 | fa9x27 MACH_FA9X27 FA9X27 3213 | ||
| 3197 | ns2816tb MACH_NS2816TB NS2816TB 3214 | ||
| 3198 | ns2816_ntpad MACH_NS2816_NTPAD NS2816_NTPAD 3215 | ||
| 3199 | ns2816_ntnb MACH_NS2816_NTNB NS2816_NTNB 3216 | ||
| 3200 | kaen MACH_KAEN KAEN 3217 | ||
| 3201 | nv1000 MACH_NV1000 NV1000 3218 | ||
| 3202 | nuc950ts MACH_NUC950TS NUC950TS 3219 | ||
| 3203 | nokia_rm680 MACH_NOKIA_RM680 NOKIA_RM680 3220 | ||
| 3204 | ast2200 MACH_AST2200 AST2200 3221 | ||
| 3205 | lead MACH_LEAD LEAD 3222 | ||
| 3206 | unino1 MACH_UNINO1 UNINO1 3223 | ||
| 3207 | greeco MACH_GREECO GREECO 3224 | ||
| 3208 | verdi MACH_VERDI VERDI 3225 | ||
| 3209 | dm6446_adbox MACH_DM6446_ADBOX DM6446_ADBOX 3226 | ||
| 3210 | quad_salsa MACH_QUAD_SALSA QUAD_SALSA 3227 | ||
| 3211 | abb_gma_1_1 MACH_ABB_GMA_1_1 ABB_GMA_1_1 3228 | ||
| 3212 | svcid MACH_SVCID SVCID 3229 | ||
| 3213 | msm8960_sim MACH_MSM8960_SIM MSM8960_SIM 3230 | ||
| 3214 | msm8960_rumi3 MACH_MSM8960_RUMI3 MSM8960_RUMI3 3231 | ||
| 3215 | icon_g MACH_ICON_G ICON_G 3232 | ||
| 3216 | mb3 MACH_MB3 MB3 3233 | ||
| 3217 | gsia18s MACH_GSIA18S GSIA18S 3234 | ||
| 3218 | pivicc MACH_PIVICC PIVICC 3235 | ||
| 3219 | pcm048 MACH_PCM048 PCM048 3236 | ||
| 3220 | dds MACH_DDS DDS 3237 | ||
| 3221 | chalten_xa1 MACH_CHALTEN_XA1 CHALTEN_XA1 3238 | ||
