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