uboot/board/micronas/vct/ebi_nor_flash.c
<<
>>
Prefs
   1/*
   2 * (C) Copyright 2008 Stefan Roese <sr@denx.de>, DENX Software Engineering
   3 *
   4 * This program is free software; you can redistribute it and/or
   5 * modify it under the terms of the GNU General Public License as
   6 * published by the Free Software Foundation; either version 2 of
   7 * the License, or (at your option) any later version.
   8 *
   9 * This program is distributed in the hope that it will be useful,
  10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12 * GNU General Public License for more details.
  13 *
  14 * You should have received a copy of the GNU General Public License
  15 * along with this program; if not, write to the Free Software
  16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
  17 * MA 02111-1307 USA
  18 */
  19
  20#include <common.h>
  21#include <asm/io.h>
  22#include "vct.h"
  23
  24static u32 ebi_read(u32 addr)
  25{
  26        addr &= ~0xFC000000;
  27
  28        reg_write(EBI_CPU_IO_ACCS(EBI_BASE), EXT_DEVICE_CHANNEL_2 | addr);
  29        ebi_wait();
  30
  31        return reg_read(EBI_IO_ACCS_DATA(EBI_BASE));
  32}
  33
  34static int ebi_write_u16(u32 addr, u32 data, int fetchIO)
  35{
  36        u32 val = (data << 16);
  37
  38        addr &= ~0xFC000000;
  39
  40        ebi_wait();
  41
  42        reg_write(EBI_IO_ACCS_DATA(EBI_BASE), val);
  43        reg_write(EBI_CPU_IO_ACCS(EBI_BASE),
  44                  EXT_DEVICE_CHANNEL_2 | EBI_CPU_WRITE | addr);
  45        ebi_wait();
  46
  47        if (fetchIO) {
  48                u32 counter = 0;
  49                while (!(reg_read(EBI_SIG_LEVEL(EBI_BASE)) & EXT_CPU_IORDY_SL)) {
  50                        if (counter++ > 0xFFFFFF)
  51                                return 1;
  52                }
  53        }
  54
  55        return 0;
  56}
  57
  58static u16 ebi_read_u16(u32 addr)
  59{
  60        return ((ebi_read(addr) >> 16) & 0xFFFF);
  61}
  62
  63static u8 ebi_read_u8(u32 addr)
  64{
  65        u32 val = ebi_read(addr) >> 16;
  66
  67        if (addr & 0x1)
  68                return val & 0xff;
  69        else
  70                return (val >> 8) & 0xff;
  71}
  72
  73/*
  74 * EBI initialization for NOR FLASH access
  75 */
  76int ebi_init_nor_flash(void)
  77{
  78        reg_write(EBI_DEV1_CONFIG1(EBI_BASE), 0x83000);
  79
  80        reg_write(EBI_DEV2_CONFIG1(EBI_BASE), 0x400002);
  81        reg_write(EBI_DEV2_CONFIG2(EBI_BASE), 0x50);
  82
  83        reg_write(EBI_DEV2_TIM1_RD1(EBI_BASE), 0x409113);
  84        reg_write(EBI_DEV2_TIM1_RD2(EBI_BASE), 0xFF01000);
  85        reg_write(EBI_DEV2_TIM1_WR1(EBI_BASE), 0x04003113);
  86        reg_write(EBI_DEV2_TIM1_WR2(EBI_BASE), 0x3FC12011);
  87        reg_write(EBI_DEV2_TIM_EXT(EBI_BASE), 0xFFF00000);
  88
  89        return 0;
  90}
  91
  92/*
  93 * Accessor functions replacing the "weak" functions in
  94 * drivers/mtd/cfi_flash.c
  95 */
  96void flash_write8(u8 value, void *addr)
  97{
  98        ebi_write_u16((u32)addr, value, 0);
  99}
 100
 101void flash_write16(u16 value, void *addr)
 102{
 103        ebi_write_u16((u32)addr, value, 0);
 104}
 105
 106u8 flash_read8(void *addr)
 107{
 108        return ebi_read_u8((u32)addr);
 109}
 110
 111u16 flash_read16(void *addr)
 112{
 113        return ebi_read_u16((u32)addr);
 114}
 115
 116u32 flash_read32(void *addr)
 117{
 118        return ((u32)ebi_read_u16((u32)addr) << 16) |
 119                ebi_read_u16((u32)addr + 2);
 120}
 121
 122void *board_flash_read_memcpy(void *dest, const void *src, size_t count)
 123{
 124        u16 *tmp = (u16 *)dest, *s = (u16 *)src;
 125        int i;
 126
 127        for (i = 0; i < count; i += 2)
 128                *tmp++ = flash_read16(s++);
 129
 130        return dest;
 131}
 132