| 
									
										
										
										
											2011-01-11 04:01:08 +01:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * sh7372 MMCIF loader | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Copyright (C) 2010 Magnus Damm | 
					
						
							|  |  |  |  * Copyright (C) 2010 Simon Horman | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This file is subject to the terms and conditions of the GNU General Public | 
					
						
							|  |  |  |  * License.  See the file "COPYING" in the main directory of this archive | 
					
						
							|  |  |  |  * for more details. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <linux/mmc/sh_mmcif.h>
 | 
					
						
							| 
									
										
										
										
											2011-03-24 07:04:38 +00:00
										 |  |  | #include <linux/mmc/boot.h>
 | 
					
						
							| 
									
										
										
										
											2011-03-24 07:04:37 +00:00
										 |  |  | #include <mach/mmc.h>
 | 
					
						
							| 
									
										
										
										
											2011-01-11 04:01:08 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | #define MMCIF_BASE      (void __iomem *)0xe6bd0000
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define PORT84CR	(void __iomem *)0xe6050054
 | 
					
						
							|  |  |  | #define PORT85CR	(void __iomem *)0xe6050055
 | 
					
						
							|  |  |  | #define PORT86CR	(void __iomem *)0xe6050056
 | 
					
						
							|  |  |  | #define PORT87CR	(void __iomem *)0xe6050057
 | 
					
						
							|  |  |  | #define PORT88CR	(void __iomem *)0xe6050058
 | 
					
						
							|  |  |  | #define PORT89CR	(void __iomem *)0xe6050059
 | 
					
						
							|  |  |  | #define PORT90CR	(void __iomem *)0xe605005a
 | 
					
						
							|  |  |  | #define PORT91CR	(void __iomem *)0xe605005b
 | 
					
						
							|  |  |  | #define PORT92CR	(void __iomem *)0xe605005c
 | 
					
						
							|  |  |  | #define PORT99CR	(void __iomem *)0xe6050063
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define SMSTPCR3	(void __iomem *)0xe615013c
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* SH7372 specific MMCIF loader
 | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * loads the zImage from an MMC card starting from block 1. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * The image must be start with a vrl4 header and | 
					
						
							|  |  |  |  * the zImage must start at offset 512 of the image. That is, | 
					
						
							|  |  |  |  * at block 2 (=byte 1024) on the media | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Use the following line to write the vrl4 formated zImage | 
					
						
							|  |  |  |  * to an MMC card | 
					
						
							|  |  |  |  * # dd if=vrl4.out of=/dev/sdx bs=512 seek=1 | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2011-04-26 06:29:53 +01:00
										 |  |  | asmlinkage void mmc_loader(unsigned char *buf, unsigned long len) | 
					
						
							| 
									
										
										
										
											2011-01-11 04:01:08 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-24 07:04:37 +00:00
										 |  |  | 	mmc_init_progress(); | 
					
						
							| 
									
										
										
										
											2011-03-24 07:04:38 +00:00
										 |  |  | 	mmc_update_progress(MMC_PROGRESS_ENTER); | 
					
						
							| 
									
										
										
										
											2011-01-11 04:01:08 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	/* Initialise MMC
 | 
					
						
							|  |  |  | 	 * registers: PORT84CR-PORT92CR | 
					
						
							|  |  |  | 	 *            (MMCD0_0-MMCD0_7,MMCCMD0 Control) | 
					
						
							|  |  |  | 	 * value: 0x04 - select function 4 | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	 __raw_writeb(0x04, PORT84CR); | 
					
						
							|  |  |  | 	 __raw_writeb(0x04, PORT85CR); | 
					
						
							|  |  |  | 	 __raw_writeb(0x04, PORT86CR); | 
					
						
							|  |  |  | 	 __raw_writeb(0x04, PORT87CR); | 
					
						
							|  |  |  | 	 __raw_writeb(0x04, PORT88CR); | 
					
						
							|  |  |  | 	 __raw_writeb(0x04, PORT89CR); | 
					
						
							|  |  |  | 	 __raw_writeb(0x04, PORT90CR); | 
					
						
							|  |  |  | 	 __raw_writeb(0x04, PORT91CR); | 
					
						
							|  |  |  | 	 __raw_writeb(0x04, PORT92CR); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* Initialise MMC
 | 
					
						
							|  |  |  | 	 * registers: PORT99CR (MMCCLK0 Control) | 
					
						
							|  |  |  | 	 * value: 0x10 | 0x04 - enable output | select function 4 | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	__raw_writeb(0x14, PORT99CR); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* Enable clock to MMC hardware block */ | 
					
						
							|  |  |  | 	__raw_writel(__raw_readl(SMSTPCR3) & ~(1 << 12), SMSTPCR3); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-24 07:04:38 +00:00
										 |  |  | 	mmc_update_progress(MMC_PROGRESS_INIT); | 
					
						
							| 
									
										
										
										
											2011-01-11 04:01:08 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	/* setup MMCIF hardware */ | 
					
						
							|  |  |  | 	sh_mmcif_boot_init(MMCIF_BASE); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-24 07:04:38 +00:00
										 |  |  | 	mmc_update_progress(MMC_PROGRESS_LOAD); | 
					
						
							| 
									
										
										
										
											2011-01-11 04:01:08 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	/* load kernel via MMCIF interface */ | 
					
						
							|  |  |  | 	sh_mmcif_boot_do_read(MMCIF_BASE, 2, /* Kernel is at block 2 */ | 
					
						
							|  |  |  | 			      (len + SH_MMCIF_BBS - 1) / SH_MMCIF_BBS, buf); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* Disable clock to MMC hardware block */ | 
					
						
							| 
									
										
										
										
											2011-08-03 06:08:54 +00:00
										 |  |  | 	__raw_writel(__raw_readl(SMSTPCR3) | (1 << 12), SMSTPCR3); | 
					
						
							| 
									
										
										
										
											2011-01-11 04:01:08 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-24 07:04:38 +00:00
										 |  |  | 	mmc_update_progress(MMC_PROGRESS_DONE); | 
					
						
							| 
									
										
										
										
											2011-01-11 04:01:08 +01:00
										 |  |  | } |