root/arch/mips/bcm63xx/dev-flash.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. bcm63xx_detect_flash_type
  2. bcm63xx_flash_register

   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 
  25 static struct mtd_partition mtd_partitions[] = {
  26         {
  27                 .name           = "cfe",
  28                 .offset         = 0x0,
  29                 .size           = 0x40000,
  30         }
  31 };
  32 
  33 static const char *bcm63xx_part_types[] = { "bcm63xxpart", NULL };
  34 
  35 static struct physmap_flash_data flash_data = {
  36         .width                  = 2,
  37         .parts                  = mtd_partitions,
  38         .part_probe_types       = bcm63xx_part_types,
  39 };
  40 
  41 static struct resource mtd_resources[] = {
  42         {
  43                 .start          = 0,    /* filled at runtime */
  44                 .end            = 0,    /* filled at runtime */
  45                 .flags          = IORESOURCE_MEM,
  46         }
  47 };
  48 
  49 static 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 
  58 static 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                 /* fall through */
  98         default:
  99                 return -EINVAL;
 100         }
 101 }
 102 
 103 int __init bcm63xx_flash_register(void)
 104 {
 105         int flash_type;
 106         u32 val;
 107 
 108         flash_type = bcm63xx_detect_flash_type();
 109 
 110         switch (flash_type) {
 111         case BCM63XX_FLASH_TYPE_PARALLEL:
 112                 /* read base address of boot chip select (0) */
 113                 val = bcm_mpi_readl(MPI_CSBASE_REG(0));
 114                 val &= MPI_CSBASE_BASE_MASK;
 115 
 116                 mtd_resources[0].start = val;
 117                 mtd_resources[0].end = 0x1FFFFFFF;
 118 
 119                 return platform_device_register(&mtd_dev);
 120         case BCM63XX_FLASH_TYPE_SERIAL:
 121                 pr_warn("unsupported serial flash detected\n");
 122                 return -ENODEV;
 123         case BCM63XX_FLASH_TYPE_NAND:
 124                 pr_warn("unsupported NAND flash detected\n");
 125                 return -ENODEV;
 126         default:
 127                 pr_err("flash detection failed for BCM%x: %d\n",
 128                        bcm63xx_get_cpu_id(), flash_type);
 129                 return -ENODEV;
 130         }
 131 }

/* [<][>][^][v][top][bottom][index][help] */