Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'arc-v3.15-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/vgupta/arc

Pull ARC changes from Vineet Gupta:
- Support for external initrd from Noam
- Fix broken serial console in nsimosci Virtual Platform
- Reuse of ENTRY/END assembler macros across hand asm code
- Other minor fixes here and there

* tag 'arc-v3.15-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/vgupta/arc:
ARC: [nsimosci] Unbork console
ARC: [nsimosci] Change .dts to use generic 8250 UART
ARC: [SMP] General Fixes
ARC: Remove unused DT template file
ARC: [clockevent] simplify timer ISR
ARC: [clockevent] can't be SoC specific
ARC: Remove ARC_HAS_COH_RTSC
ARC: switch to generic ENTRY/END assembler annotations
ARC: support external initrd
ARC: add uImage to .gitignore
ARC: [arcfpga] Fix __initconst data const-correctness

+114 -115
+1
arch/arc/boot/.gitignore
··· 1 1 *.dtb* 2 + uImage
+7 -5
arch/arc/boot/dts/nsimosci.dts
··· 11 11 12 12 / { 13 13 compatible = "snps,nsimosci"; 14 - clock-frequency = <80000000>; /* 80 MHZ */ 14 + clock-frequency = <20000000>; /* 20 MHZ */ 15 15 #address-cells = <1>; 16 16 #size-cells = <1>; 17 17 interrupt-parent = <&intc>; 18 18 19 19 chosen { 20 - bootargs = "console=tty0 consoleblank=0"; 20 + /* this is for console on PGU */ 21 + /* bootargs = "console=tty0 consoleblank=0"; */ 22 + /* this is for console on serial */ 23 + bootargs = "earlycon=uart8250,mmio32,0xc0000000,115200n8 console=ttyS0,115200n8 consoleblank=0 debug"; 21 24 }; 22 25 23 26 aliases { ··· 47 44 }; 48 45 49 46 uart0: serial@c0000000 { 50 - compatible = "snps,dw-apb-uart"; 47 + compatible = "ns8250"; 51 48 reg = <0xc0000000 0x2000>; 52 49 interrupts = <11>; 53 - #clock-frequency = <80000000>; 54 50 clock-frequency = <3686400>; 55 51 baud = <115200>; 56 52 reg-shift = <2>; 57 53 reg-io-width = <4>; 58 - status = "okay"; 54 + no-loopback-test = <1>; 59 55 }; 60 56 61 57 pgu0: pgu@c9000000 {
-10
arch/arc/boot/dts/skeleton.dts
··· 1 - /* 2 - * Copyright (C) 2012 Synopsys, Inc. (www.synopsys.com) 3 - * 4 - * This program is free software; you can redistribute it and/or modify 5 - * it under the terms of the GNU General Public License version 2 as 6 - * published by the Free Software Foundation. 7 - */ 8 - /dts-v1/; 9 - 10 - /include/ "skeleton.dtsi"
+1
arch/arc/configs/nsimosci_defconfig
··· 54 54 CONFIG_SERIAL_8250=y 55 55 CONFIG_SERIAL_8250_CONSOLE=y 56 56 CONFIG_SERIAL_8250_DW=y 57 + CONFIG_SERIAL_OF_PLATFORM=y 57 58 CONFIG_SERIAL_ARC=y 58 59 CONFIG_SERIAL_ARC_CONSOLE=y 59 60 # CONFIG_HW_RANDOM is not set
-14
arch/arc/include/asm/linkage.h
··· 13 13 14 14 #define ASM_NL ` /* use '`' to mark new line in macro */ 15 15 16 - /* Can't use the ENTRY macro in linux/linkage.h 17 - * gas considers ';' as comment vs. newline 18 - */ 19 - .macro ARC_ENTRY name 20 - .global \name 21 - .align 4 22 - \name: 23 - .endm 24 - 25 - .macro ARC_EXIT name 26 - #define ASM_PREV_SYM_ADDR(name) .-##name 27 - .size \ name, ASM_PREV_SYM_ADDR(\name) 28 - .endm 29 - 30 16 /* annotation for data we want in DCCM - if enabled in .config */ 31 17 .macro ARCFP_DATA nm 32 18 #ifdef CONFIG_ARC_HAS_DCCM
+1 -1
arch/arc/kernel/ctx_sw_asm.S
··· 62 62 ld.ab blink, [sp, 4] 63 63 j [blink] 64 64 65 - ARC_EXIT __switch_to 65 + END(__switch_to)
+26 -26
arch/arc/kernel/entry.S
··· 141 141 VECTOR reserved ; Reserved Exceptions 142 142 .endr 143 143 144 - #include <linux/linkage.h> /* ARC_{EXTRY,EXIT} */ 144 + #include <linux/linkage.h> /* {EXTRY,EXIT} */ 145 145 #include <asm/entry.h> /* SAVE_ALL_{INT1,INT2,SYS...} */ 146 146 #include <asm/errno.h> 147 147 #include <asm/arcregs.h> ··· 184 184 ; --------------------------------------------- 185 185 ; Level 2 ISR: Can interrupt a Level 1 ISR 186 186 ; --------------------------------------------- 187 - ARC_ENTRY handle_interrupt_level2 187 + ENTRY(handle_interrupt_level2) 188 188 189 189 ; TODO-vineetg for SMP this wont work 190 190 ; free up r9 as scratchpad ··· 225 225 226 226 b ret_from_exception 227 227 228 - ARC_EXIT handle_interrupt_level2 228 + END(handle_interrupt_level2) 229 229 230 230 #endif 231 231 232 232 ; --------------------------------------------- 233 233 ; Level 1 ISR 234 234 ; --------------------------------------------- 235 - ARC_ENTRY handle_interrupt_level1 235 + ENTRY(handle_interrupt_level1) 236 236 237 237 /* free up r9 as scratchpad */ 238 238 #ifdef CONFIG_SMP ··· 265 265 sr r8, [AUX_IRQ_LV12] ; clear bit in Sticky Status Reg 266 266 267 267 b ret_from_exception 268 - ARC_EXIT handle_interrupt_level1 268 + END(handle_interrupt_level1) 269 269 270 270 ;################### Non TLB Exception Handling ############################# 271 271 ··· 273 273 ; Instruction Error Exception Handler 274 274 ; --------------------------------------------- 275 275 276 - ARC_ENTRY instr_service 276 + ENTRY(instr_service) 277 277 278 278 EXCEPTION_PROLOGUE 279 279 ··· 284 284 285 285 bl do_insterror_or_kprobe 286 286 b ret_from_exception 287 - ARC_EXIT instr_service 287 + END(instr_service) 288 288 289 289 ; --------------------------------------------- 290 290 ; Memory Error Exception Handler 291 291 ; --------------------------------------------- 292 292 293 - ARC_ENTRY mem_service 293 + ENTRY(mem_service) 294 294 295 295 EXCEPTION_PROLOGUE 296 296 ··· 301 301 302 302 bl do_memory_error 303 303 b ret_from_exception 304 - ARC_EXIT mem_service 304 + END(mem_service) 305 305 306 306 ; --------------------------------------------- 307 307 ; Machine Check Exception Handler 308 308 ; --------------------------------------------- 309 309 310 - ARC_ENTRY EV_MachineCheck 310 + ENTRY(EV_MachineCheck) 311 311 312 312 EXCEPTION_PROLOGUE 313 313 ··· 331 331 332 332 j do_machine_check_fault 333 333 334 - ARC_EXIT EV_MachineCheck 334 + END(EV_MachineCheck) 335 335 336 336 ; --------------------------------------------- 337 337 ; Protection Violation Exception Handler 338 338 ; --------------------------------------------- 339 339 340 - ARC_ENTRY EV_TLBProtV 340 + ENTRY(EV_TLBProtV) 341 341 342 342 EXCEPTION_PROLOGUE 343 343 ··· 385 385 386 386 b ret_from_exception 387 387 388 - ARC_EXIT EV_TLBProtV 388 + END(EV_TLBProtV) 389 389 390 390 ; --------------------------------------------- 391 391 ; Privilege Violation Exception Handler 392 392 ; --------------------------------------------- 393 - ARC_ENTRY EV_PrivilegeV 393 + ENTRY(EV_PrivilegeV) 394 394 395 395 EXCEPTION_PROLOGUE 396 396 ··· 401 401 402 402 bl do_privilege_fault 403 403 b ret_from_exception 404 - ARC_EXIT EV_PrivilegeV 404 + END(EV_PrivilegeV) 405 405 406 406 ; --------------------------------------------- 407 407 ; Extension Instruction Exception Handler 408 408 ; --------------------------------------------- 409 - ARC_ENTRY EV_Extension 409 + ENTRY(EV_Extension) 410 410 411 411 EXCEPTION_PROLOGUE 412 412 ··· 417 417 418 418 bl do_extension_fault 419 419 b ret_from_exception 420 - ARC_EXIT EV_Extension 420 + END(EV_Extension) 421 421 422 422 ;######################### System Call Tracing ######################### 423 423 ··· 504 504 ; (2) Break Points 505 505 ;------------------------------------------------------------------ 506 506 507 - ARC_ENTRY EV_Trap 507 + ENTRY(EV_Trap) 508 508 509 509 EXCEPTION_PROLOGUE 510 510 ··· 534 534 jl [r9] ; Entry into Sys Call Handler 535 535 536 536 ; fall through to ret_from_system_call 537 - ARC_EXIT EV_Trap 537 + END(EV_Trap) 538 538 539 - ARC_ENTRY ret_from_system_call 539 + ENTRY(ret_from_system_call) 540 540 541 541 st r0, [sp, PT_r0] ; sys call return value in pt_regs 542 542 ··· 546 546 ; 547 547 ; If ret to user mode do we need to handle signals, schedule() et al. 548 548 549 - ARC_ENTRY ret_from_exception 549 + ENTRY(ret_from_exception) 550 550 551 551 ; Pre-{IRQ,Trap,Exception} K/U mode from pt_regs->status32 552 552 ld r8, [sp, PT_status32] ; returning to User/Kernel Mode ··· 726 726 debug_marker_syscall: 727 727 rtie 728 728 729 - ARC_EXIT ret_from_exception 729 + END(ret_from_exception) 730 730 731 - ARC_ENTRY ret_from_fork 731 + ENTRY(ret_from_fork) 732 732 ; when the forked child comes here from the __switch_to function 733 733 ; r0 has the last task pointer. 734 734 ; put last task in scheduler queue ··· 745 745 ; special case of kernel_thread entry point returning back due to 746 746 ; kernel_execve() - pretend return from syscall to ret to userland 747 747 b ret_from_exception 748 - ARC_EXIT ret_from_fork 748 + END(ret_from_fork) 749 749 750 750 ;################### Special Sys Call Wrappers ########################## 751 751 752 - ARC_ENTRY sys_clone_wrapper 752 + ENTRY(sys_clone_wrapper) 753 753 SAVE_CALLEE_SAVED_USER 754 754 bl @sys_clone 755 755 DISCARD_CALLEE_SAVED_USER ··· 759 759 bnz tracesys_exit 760 760 761 761 b ret_from_system_call 762 - ARC_EXIT sys_clone_wrapper 762 + END(sys_clone_wrapper) 763 763 764 764 #ifdef CONFIG_ARC_DW2_UNWIND 765 765 ; Workaround for bug 94179 (STAR ):
+4 -3
arch/arc/kernel/head.S
··· 24 24 .globl stext 25 25 stext: 26 26 ;------------------------------------------------------------------- 27 - ; Don't clobber r0-r4 yet. It might have bootloader provided info 27 + ; Don't clobber r0-r2 yet. It might have bootloader provided info 28 28 ;------------------------------------------------------------------- 29 29 30 30 sr @_int_vec_base_lds, [AUX_INTR_VEC_BASE] 31 31 32 32 #ifdef CONFIG_SMP 33 - ; Only Boot (Master) proceeds. Others wait in platform dependent way 33 + ; Ensure Boot (Master) proceeds. Others wait in platform dependent way 34 34 ; IDENTITY Reg [ 3 2 1 0 ] 35 35 ; (cpu-id) ^^^ => Zero for UP ARC700 36 36 ; => #Core-ID if SMP (Master 0) ··· 39 39 ; need to make sure only boot cpu takes this path. 40 40 GET_CPU_ID r5 41 41 cmp r5, 0 42 - jnz arc_platform_smp_wait_to_boot 42 + mov.ne r0, r5 43 + jne arc_platform_smp_wait_to_boot 43 44 #endif 44 45 ; Clear BSS before updating any globals 45 46 ; XXX: use ZOL here
+16 -21
arch/arc/kernel/time.c
··· 155 155 write_aux_reg(ARC_REG_TIMER0_CTRL, TIMER_CTRL_IE | TIMER_CTRL_NH); 156 156 } 157 157 158 - /* 159 - * Acknowledge the interrupt (oneshot) and optionally re-arm it (periodic) 160 - * -Any write to CTRL Reg will ack the intr (NH bit: Count when not halted) 161 - * -Rearming is done by setting the IE bit 162 - * 163 - * Small optimisation: Normal code would have been 164 - * if (irq_reenable) 165 - * CTRL_REG = (IE | NH); 166 - * else 167 - * CTRL_REG = NH; 168 - * However since IE is BIT0 we can fold the branch 169 - */ 170 - static void arc_timer_event_ack(unsigned int irq_reenable) 171 - { 172 - write_aux_reg(ARC_REG_TIMER0_CTRL, irq_reenable | TIMER_CTRL_NH); 173 - } 174 158 175 159 static int arc_clkevent_set_next_event(unsigned long delta, 176 160 struct clock_event_device *dev) ··· 191 207 192 208 static irqreturn_t timer_irq_handler(int irq, void *dev_id) 193 209 { 194 - struct clock_event_device *clk = this_cpu_ptr(&arc_clockevent_device); 210 + /* 211 + * Note that generic IRQ core could have passed @evt for @dev_id if 212 + * irq_set_chip_and_handler() asked for handle_percpu_devid_irq() 213 + */ 214 + struct clock_event_device *evt = this_cpu_ptr(&arc_clockevent_device); 215 + int irq_reenable = evt->mode == CLOCK_EVT_MODE_PERIODIC; 195 216 196 - arc_timer_event_ack(clk->mode == CLOCK_EVT_MODE_PERIODIC); 197 - clk->event_handler(clk); 217 + /* 218 + * Any write to CTRL reg ACks the interrupt, we rewrite the 219 + * Count when [N]ot [H]alted bit. 220 + * And re-arm it if perioid by [I]nterrupt [E]nable bit 221 + */ 222 + write_aux_reg(ARC_REG_TIMER0_CTRL, irq_reenable | TIMER_CTRL_NH); 223 + 224 + evt->event_handler(evt); 225 + 198 226 return IRQ_HANDLED; 199 227 } 200 228 ··· 218 222 219 223 /* 220 224 * Setup the local event timer for @cpu 221 - * N.B. weak so that some exotic ARC SoCs can completely override it 222 225 */ 223 - void __weak arc_local_timer_setup(unsigned int cpu) 226 + void arc_local_timer_setup(unsigned int cpu) 224 227 { 225 228 struct clock_event_device *clk = &per_cpu(arc_clockevent_device, cpu); 226 229
+3 -3
arch/arc/lib/memcmp.S
··· 6 6 * published by the Free Software Foundation. 7 7 */ 8 8 9 - #include <asm/linkage.h> 9 + #include <linux/linkage.h> 10 10 11 11 #ifdef __LITTLE_ENDIAN__ 12 12 #define WORD2 r2 ··· 16 16 #define SHIFT r2 17 17 #endif 18 18 19 - ARC_ENTRY memcmp 19 + ENTRY(memcmp) 20 20 or r12,r0,r1 21 21 asl_s r12,r12,30 22 22 sub r3,r2,1 ··· 121 121 .Lnil: 122 122 j_s.d [blink] 123 123 mov r0,0 124 - ARC_EXIT memcmp 124 + END(memcmp)
+3 -3
arch/arc/lib/memcpy-700.S
··· 6 6 * published by the Free Software Foundation. 7 7 */ 8 8 9 - #include <asm/linkage.h> 9 + #include <linux/linkage.h> 10 10 11 - ARC_ENTRY memcpy 11 + ENTRY(memcpy) 12 12 or r3,r0,r1 13 13 asl_s r3,r3,30 14 14 mov_s r5,r0 ··· 63 63 .Lendbloop: 64 64 j_s.d [blink] 65 65 stb r12,[r5,0] 66 - ARC_EXIT memcpy 66 + END(memcpy)
+5 -5
arch/arc/lib/memset.S
··· 6 6 * published by the Free Software Foundation. 7 7 */ 8 8 9 - #include <asm/linkage.h> 9 + #include <linux/linkage.h> 10 10 11 11 #define SMALL 7 /* Must be at least 6 to deal with alignment/loop issues. */ 12 12 13 - ARC_ENTRY memset 13 + ENTRY(memset) 14 14 mov_s r4,r0 15 15 or r12,r0,r2 16 16 bmsk.f r12,r12,1 ··· 46 46 stb.ab r1,[r4,1] 47 47 .Ltiny_end: 48 48 j_s [blink] 49 - ARC_EXIT memset 49 + END(memset) 50 50 51 51 ; memzero: @r0 = mem, @r1 = size_t 52 52 ; memset: @r0 = mem, @r1 = char, @r2 = size_t 53 53 54 - ARC_ENTRY memzero 54 + ENTRY(memzero) 55 55 ; adjust bzero args to memset args 56 56 mov r2, r1 57 57 mov r1, 0 58 58 b memset ;tail call so need to tinker with blink 59 - ARC_EXIT memzero 59 + END(memzero)
+3 -3
arch/arc/lib/strchr-700.S
··· 11 11 presence of the norm instruction makes it easier to operate on whole 12 12 words branch-free. */ 13 13 14 - #include <asm/linkage.h> 14 + #include <linux/linkage.h> 15 15 16 - ARC_ENTRY strchr 16 + ENTRY(strchr) 17 17 extb_s r1,r1 18 18 asl r5,r1,8 19 19 bmsk r2,r0,1 ··· 130 130 j_s.d [blink] 131 131 mov.mi r0,0 132 132 #endif /* ENDIAN */ 133 - ARC_EXIT strchr 133 + END(strchr)
+3 -3
arch/arc/lib/strcmp.S
··· 13 13 source 1; however, that would increase the overhead for loop setup / finish, 14 14 and strcmp might often terminate early. */ 15 15 16 - #include <asm/linkage.h> 16 + #include <linux/linkage.h> 17 17 18 - ARC_ENTRY strcmp 18 + ENTRY(strcmp) 19 19 or r2,r0,r1 20 20 bmsk_s r2,r2,1 21 21 brne r2,0,.Lcharloop ··· 93 93 .Lcmpend: 94 94 j_s.d [blink] 95 95 sub r0,r2,r3 96 - ARC_EXIT strcmp 96 + END(strcmp)
+3 -3
arch/arc/lib/strcpy-700.S
··· 16 16 there, but the it is not likely to be taken often, and it 17 17 would also be likey to cost an unaligned mispredict at the next call. */ 18 18 19 - #include <asm/linkage.h> 19 + #include <linux/linkage.h> 20 20 21 - ARC_ENTRY strcpy 21 + ENTRY(strcpy) 22 22 or r2,r0,r1 23 23 bmsk_s r2,r2,1 24 24 brne.d r2,0,charloop ··· 67 67 brne.d r3,0,charloop 68 68 stb.ab r3,[r10,1] 69 69 j [blink] 70 - ARC_EXIT strcpy 70 + END(strcpy)
+3 -3
arch/arc/lib/strlen.S
··· 6 6 * published by the Free Software Foundation. 7 7 */ 8 8 9 - #include <asm/linkage.h> 9 + #include <linux/linkage.h> 10 10 11 - ARC_ENTRY strlen 11 + ENTRY(strlen) 12 12 or r3,r0,7 13 13 ld r2,[r3,-7] 14 14 ld.a r6,[r3,-3] ··· 80 80 .Learly_end: 81 81 b.d .Lend 82 82 sub_s.ne r1,r1,r1 83 - ARC_EXIT strlen 83 + END(strlen)
+1 -2
arch/arc/mm/cache_arc700.c
··· 100 100 #define DC_CTRL_INV_MODE_FLUSH 0x40 101 101 #define DC_CTRL_FLUSH_STATUS 0x100 102 102 103 - char *arc_cache_mumbojumbo(int cpu_id, char *buf, int len) 103 + char *arc_cache_mumbojumbo(int c, char *buf, int len) 104 104 { 105 105 int n = 0; 106 - unsigned int c = smp_processor_id(); 107 106 108 107 #define PR_CACHE(p, enb, str) \ 109 108 { \
+27
arch/arc/mm/init.c
··· 10 10 #include <linux/mm.h> 11 11 #include <linux/bootmem.h> 12 12 #include <linux/memblock.h> 13 + #ifdef CONFIG_BLK_DEV_INITRD 14 + #include <linux/initrd.h> 15 + #endif 13 16 #include <linux/swap.h> 14 17 #include <linux/module.h> 15 18 #include <asm/page.h> ··· 44 41 arc_mem_sz = size & PAGE_MASK; 45 42 pr_info("Memory size set via devicetree %ldM\n", TO_MB(arc_mem_sz)); 46 43 } 44 + 45 + #ifdef CONFIG_BLK_DEV_INITRD 46 + static int __init early_initrd(char *p) 47 + { 48 + unsigned long start, size; 49 + char *endp; 50 + 51 + start = memparse(p, &endp); 52 + if (*endp == ',') { 53 + size = memparse(endp + 1, NULL); 54 + 55 + initrd_start = (unsigned long)__va(start); 56 + initrd_end = (unsigned long)__va(start + size); 57 + } 58 + return 0; 59 + } 60 + early_param("initrd", early_initrd); 61 + #endif 47 62 48 63 /* 49 64 * First memory setup routine called from setup_arch() ··· 100 79 /*------------- reserve kernel image -----------------------*/ 101 80 memblock_reserve(CONFIG_LINUX_LINK_BASE, 102 81 __pa(_end) - CONFIG_LINUX_LINK_BASE); 82 + 83 + #ifdef CONFIG_BLK_DEV_INITRD 84 + /*------------- reserve initrd image -----------------------*/ 85 + if (initrd_start) 86 + memblock_reserve(__pa(initrd_start), initrd_end - initrd_start); 87 + #endif 103 88 104 89 memblock_dump_all(); 105 90
+4 -6
arch/arc/mm/tlbex.S
··· 260 260 ; I-TLB Miss Exception Handler 261 261 ;----------------------------------------------------------------------------- 262 262 263 - ARC_ENTRY EV_TLBMissI 263 + ENTRY(EV_TLBMissI) 264 264 265 265 TLBMISS_FREEUP_REGS 266 266 ··· 293 293 TLBMISS_RESTORE_REGS 294 294 rtie 295 295 296 - ARC_EXIT EV_TLBMissI 296 + END(EV_TLBMissI) 297 297 298 298 ;----------------------------------------------------------------------------- 299 299 ; D-TLB Miss Exception Handler 300 300 ;----------------------------------------------------------------------------- 301 301 302 - ARC_ENTRY EV_TLBMissD 302 + ENTRY(EV_TLBMissD) 303 303 304 304 TLBMISS_FREEUP_REGS 305 305 ··· 381 381 bl do_page_fault 382 382 b ret_from_exception 383 383 384 - ARC_EXIT EV_TLBMissD 385 - 386 - ARC_ENTRY EV_TLBMissB ; Bogus entry to measure sz of DTLBMiss hdlr 384 + END(EV_TLBMissD)
-1
arch/arc/plat-arcfpga/Kconfig
··· 33 33 bool "ARC SMP Extensions (ISS Models only)" 34 34 default n 35 35 depends on SMP 36 - select ARC_HAS_COH_RTSC 37 36 help 38 37 SMP Extensions to ARC700, in a "simulation only" Model, supported in 39 38 ARC ISS (Instruction Set Simulator).
+3 -3
arch/arc/plat-arcfpga/platform.c
··· 201 201 * callback set, by matching the DT compatible name. 202 202 */ 203 203 204 - static const char *aa4_compat[] __initdata = { 204 + static const char *aa4_compat[] __initconst = { 205 205 "snps,arc-angel4", 206 206 NULL, 207 207 }; ··· 216 216 #endif 217 217 MACHINE_END 218 218 219 - static const char *ml509_compat[] __initdata = { 219 + static const char *ml509_compat[] __initconst = { 220 220 "snps,arc-ml509", 221 221 NULL, 222 222 }; ··· 231 231 #endif 232 232 MACHINE_END 233 233 234 - static const char *nsimosci_compat[] __initdata = { 234 + static const char *nsimosci_compat[] __initconst = { 235 235 "snps,nsimosci", 236 236 NULL, 237 237 };