Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 | /* SPDX-License-Identifier: GPL-2.0 */ /* * linux/arch/arm/boot/compressed/head-sharpsl.S * * Copyright (C) 2004-2005 Richard Purdie <rpurdie@rpsys.net> * * Sharp's bootloader doesn't pass any kind of machine ID * so we have to figure out the machine for ourselves... * * Support for Poodle, Corgi (SL-C700), Shepherd (SL-C750) * Husky (SL-C760), Tosa (SL-C6000), Spitz (SL-C3000), * Akita (SL-C1000) and Borzoi (SL-C3100). * */ #include <linux/linkage.h> #include <asm/mach-types.h> #ifndef CONFIG_PXA_SHARPSL #error What am I doing here... #endif .section ".start", "ax" __SharpSL_start: /* Check for TC6393 - if found we have a Tosa */ ldr r7, .TOSAID mov r1, #0x10000000 @ Base address of TC6393 chip mov r6, #0x03 ldrh r3, [r1, #8] @ Load TC6393XB Revison: This is 0x0003 cmp r6, r3 beq .SHARPEND @ Success -> tosa /* Check for pxa270 - if found, branch */ mrc p15, 0, r4, c0, c0 @ Get Processor ID and r4, r4, #0xffffff00 ldr r3, .PXA270ID cmp r4, r3 beq .PXA270 /* Check for w100 - if not found we have a Poodle */ ldr r1, .W100ADDR @ Base address of w100 chip + regs offset mov r6, #0x31 @ Load Magic Init value str r6, [r1, #0x280] @ to SCRATCH_UMSK mov r5, #0x3000 .W100LOOP: subs r5, r5, #1 bne .W100LOOP mov r6, #0x30 @ Load 2nd Magic Init value str r6, [r1, #0x280] @ to SCRATCH_UMSK ldr r6, [r1, #0] @ Load Chip ID ldr r3, .W100ID ldr r7, .POODLEID cmp r6, r3 bne .SHARPEND @ We have no w100 - Poodle /* Check for pxa250 - if found we have a Corgi */ ldr r7, .CORGIID ldr r3, .PXA255ID cmp r4, r3 blo .SHARPEND @ We have a PXA250 - Corgi /* Check for 64MiB flash - if found we have a Shepherd */ bl get_flash_ids ldr r7, .SHEPHERDID cmp r3, #0x76 @ 64MiB flash beq .SHARPEND @ We have Shepherd /* Must be a Husky */ ldr r7, .HUSKYID @ Must be Husky b .SHARPEND .PXA270: /* Check for 16MiB flash - if found we have Spitz */ bl get_flash_ids ldr r7, .SPITZID cmp r3, #0x73 @ 16MiB flash beq .SHARPEND @ We have Spitz /* Check for a second SCOOP chip - if found we have Borzoi */ ldr r1, .SCOOP2ADDR ldr r7, .BORZOIID mov r6, #0x0140 strh r6, [r1] ldrh r6, [r1] cmp r6, #0x0140 beq .SHARPEND @ We have Borzoi /* Must be Akita */ ldr r7, .AKITAID b .SHARPEND @ We have Borzoi .PXA255ID: .word 0x69052d00 @ PXA255 Processor ID .PXA270ID: .word 0x69054100 @ PXA270 Processor ID .W100ID: .word 0x57411002 @ w100 Chip ID .W100ADDR: .word 0x08010000 @ w100 Chip ID Reg Address .SCOOP2ADDR: .word 0x08800040 .POODLEID: .word MACH_TYPE_POODLE .CORGIID: .word MACH_TYPE_CORGI .SHEPHERDID: .word MACH_TYPE_SHEPHERD .HUSKYID: .word MACH_TYPE_HUSKY .TOSAID: .word MACH_TYPE_TOSA .SPITZID: .word MACH_TYPE_SPITZ .AKITAID: .word MACH_TYPE_AKITA .BORZOIID: .word MACH_TYPE_BORZOI /* * Return: r2 - NAND Manufacturer ID * r3 - NAND Chip ID * Corrupts: r1 */ get_flash_ids: mov r1, #0x0c000000 @ Base address of NAND chip ldrb r3, [r1, #24] @ Load FLASHCTL bic r3, r3, #0x11 @ SET NCE orr r3, r3, #0x0a @ SET CLR + FLWP strb r3, [r1, #24] @ Save to FLASHCTL mov r2, #0x90 @ Command "readid" strb r2, [r1, #20] @ Save to FLASHIO bic r3, r3, #2 @ CLR CLE orr r3, r3, #4 @ SET ALE strb r3, [r1, #24] @ Save to FLASHCTL mov r2, #0 @ Address 0x00 strb r2, [r1, #20] @ Save to FLASHIO bic r3, r3, #4 @ CLR ALE strb r3, [r1, #24] @ Save to FLASHCTL .fids1: ldrb r3, [r1, #24] @ Load FLASHCTL tst r3, #32 @ Is chip ready? beq .fids1 ldrb r2, [r1, #20] @ NAND Manufacturer ID ldrb r3, [r1, #20] @ NAND Chip ID mov pc, lr .SHARPEND: |