linux/arch/mips/bcm63xx/dev-flash.c
<<
>>
Prefs
   1/*
   2 * Broadcom BCM63xx flash registration
   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) 2008 Maxime Bizon <mbizon@freebox.fr>
   9 * Copyright (C) 2008 Florian Fainelli <florian@openwrt.org>
  10 * Copyright (C) 2012 Jonas Gorski <jonas.gorski@gmail.com>
  11 */
  12
  13#include <linux/init.h>
  14#include <linux/kernel.h>
  15#include <linux/platform_device.h>
  16#include <linux/mtd/mtd.h>
  17#include <linux/mtd/partitions.h>
  18#include <linux/mtd/physmap.h>
  19
  20#include <bcm63xx_cpu.h>
  21#include <bcm63xx_dev_flash.h>
  22#include <bcm63xx_regs.h>
  23#include <bcm63xx_io.h>
  24
  25static struct mtd_partition mtd_partitions[] = {
  26        {
  27                .name           = "cfe",
  28                .offset         = 0x0,
  29                .size           = 0x40000,
  30        }
  31};
  32
  33static const char *bcm63xx_part_types[] = { "bcm63xxpart", NULL };
  34
  35static struct physmap_flash_data flash_data = {
  36        .width                  = 2,
  37        .parts                  = mtd_partitions,
  38        .part_probe_types       = bcm63xx_part_types,
  39};
  40
  41static struct resource mtd_resources[] = {
  42        {
  43                .start          = 0,    /* filled at runtime */
  44                .end            = 0,    /* filled at runtime */
  45                .flags          = IORESOURCE_MEM,
  46        }
  47};
  48
  49static struct platform_device mtd_dev = {
  50        .name                   = "physmap-flash",
  51        .resource               = mtd_resources,
  52        .num_resources          = ARRAY_SIZE(mtd_resources),
  53        .dev                    = {
  54                .platform_data  = &flash_data,
  55        },
  56};
  57
  58static int __init bcm63xx_detect_flash_type(void)
  59{
  60        u32 val;
  61
  62        switch (bcm63xx_get_cpu_id()) {
  63        case BCM6328_CPU_ID:
  64                val = bcm_misc_readl(MISC_STRAPBUS_6328_REG);
  65                if (val & STRAPBUS_6328_BOOT_SEL_SERIAL)
  66                        return BCM63XX_FLASH_TYPE_SERIAL;
  67                else
  68                        return BCM63XX_FLASH_TYPE_NAND;
  69        case BCM6338_CPU_ID:
  70        case BCM6345_CPU_ID:
  71        case BCM6348_CPU_ID:
  72                /* no way to auto detect so assume parallel */
  73                return BCM63XX_FLASH_TYPE_PARALLEL;
  74        case BCM3368_CPU_ID:
  75        case BCM6358_CPU_ID:
  76                val = bcm_gpio_readl(GPIO_STRAPBUS_REG);
  77                if (val & STRAPBUS_6358_BOOT_SEL_PARALLEL)
  78                        return BCM63XX_FLASH_TYPE_PARALLEL;
  79                else
  80                        return BCM63XX_FLASH_TYPE_SERIAL;
  81        case BCM6362_CPU_ID:
  82                val = bcm_misc_readl(MISC_STRAPBUS_6362_REG);
  83                if (val & STRAPBUS_6362_BOOT_SEL_SERIAL)
  84                        return BCM63XX_FLASH_TYPE_SERIAL;
  85                else
  86                        return BCM63XX_FLASH_TYPE_NAND;
  87        case BCM6368_CPU_ID:
  88                val = bcm_gpio_readl(GPIO_STRAPBUS_REG);
  89                switch (val & STRAPBUS_6368_BOOT_SEL_MASK) {
  90                case STRAPBUS_6368_BOOT_SEL_NAND:
  91                        return BCM63XX_FLASH_TYPE_NAND;
  92                case STRAPBUS_6368_BOOT_SEL_SERIAL:
  93                        return BCM63XX_FLASH_TYPE_SERIAL;
  94                case STRAPBUS_6368_BOOT_SEL_PARALLEL:
  95                        return BCM63XX_FLASH_TYPE_PARALLEL;
  96                }
  97        default:
  98                return -EINVAL;
  99        }
 100}
 101
 102int __init bcm63xx_flash_register(void)
 103{
 104        int flash_type;
 105        u32 val;
 106
 107        flash_type = bcm63xx_detect_flash_type();
 108
 109        switch (flash_type) {
 110        case BCM63XX_FLASH_TYPE_PARALLEL:
 111                /* read base address of boot chip select (0) */
 112                val = bcm_mpi_readl(MPI_CSBASE_REG(0));
 113                val &= MPI_CSBASE_BASE_MASK;
 114
 115                mtd_resources[0].start = val;
 116                mtd_resources[0].end = 0x1FFFFFFF;
 117
 118                return platform_device_register(&mtd_dev);
 119        case BCM63XX_FLASH_TYPE_SERIAL:
 120                pr_warn("unsupported serial flash detected\n");
 121                return -ENODEV;
 122        case BCM63XX_FLASH_TYPE_NAND:
 123                pr_warn("unsupported NAND flash detected\n");
 124                return -ENODEV;
 125        default:
 126                pr_err("flash detection failed for BCM%x: %d\n",
 127                       bcm63xx_get_cpu_id(), flash_type);
 128                return -ENODEV;
 129        }
 130}
 131