~ubuntu-branches/ubuntu/precise/linux-lowlatency/precise

« back to all changes in this revision

Viewing changes to arch/mips/cavium-octeon/flash_setup.c

  • Committer: Package Import Robot
  • Author(s): Alessio Igor Bogani
  • Date: 2011-10-26 11:13:05 UTC
  • Revision ID: package-import@ubuntu.com-20111026111305-tz023xykf0i6eosh
Tags: upstream-3.2.0
ImportĀ upstreamĀ versionĀ 3.2.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 *   Octeon Bootbus flash setup
 
3
 *
 
4
 * This file is subject to the terms and conditions of the GNU General Public
 
5
 * License.  See the file "COPYING" in the main directory of this archive
 
6
 * for more details.
 
7
 *
 
8
 * Copyright (C) 2007, 2008 Cavium Networks
 
9
 */
 
10
#include <linux/kernel.h>
 
11
#include <linux/export.h>
 
12
#include <linux/mtd/mtd.h>
 
13
#include <linux/mtd/map.h>
 
14
#include <linux/mtd/partitions.h>
 
15
 
 
16
#include <asm/octeon/octeon.h>
 
17
 
 
18
static struct map_info flash_map;
 
19
static struct mtd_info *mymtd;
 
20
static const char *part_probe_types[] = {
 
21
        "cmdlinepart",
 
22
#ifdef CONFIG_MTD_REDBOOT_PARTS
 
23
        "RedBoot",
 
24
#endif
 
25
        NULL
 
26
};
 
27
 
 
28
/**
 
29
 * Module/ driver initialization.
 
30
 *
 
31
 * Returns Zero on success
 
32
 */
 
33
static int __init flash_init(void)
 
34
{
 
35
        /*
 
36
         * Read the bootbus region 0 setup to determine the base
 
37
         * address of the flash.
 
38
         */
 
39
        union cvmx_mio_boot_reg_cfgx region_cfg;
 
40
        region_cfg.u64 = cvmx_read_csr(CVMX_MIO_BOOT_REG_CFGX(0));
 
41
        if (region_cfg.s.en) {
 
42
                /*
 
43
                 * The bootloader always takes the flash and sets its
 
44
                 * address so the entire flash fits below
 
45
                 * 0x1fc00000. This way the flash aliases to
 
46
                 * 0x1fc00000 for booting. Software can access the
 
47
                 * full flash at the true address, while core boot can
 
48
                 * access 4MB.
 
49
                 */
 
50
                /* Use this name so old part lines work */
 
51
                flash_map.name = "phys_mapped_flash";
 
52
                flash_map.phys = region_cfg.s.base << 16;
 
53
                flash_map.size = 0x1fc00000 - flash_map.phys;
 
54
                flash_map.bankwidth = 1;
 
55
                flash_map.virt = ioremap(flash_map.phys, flash_map.size);
 
56
                pr_notice("Bootbus flash: Setting flash for %luMB flash at "
 
57
                          "0x%08llx\n", flash_map.size >> 20, flash_map.phys);
 
58
                simple_map_init(&flash_map);
 
59
                mymtd = do_map_probe("cfi_probe", &flash_map);
 
60
                if (mymtd) {
 
61
                        mymtd->owner = THIS_MODULE;
 
62
                        mtd_device_parse_register(mymtd, part_probe_types,
 
63
                                                  0, NULL, 0);
 
64
                } else {
 
65
                        pr_err("Failed to register MTD device for flash\n");
 
66
                }
 
67
        }
 
68
        return 0;
 
69
}
 
70
 
 
71
late_initcall(flash_init);