diff options
Diffstat (limited to 'arch/mips/bcm63xx/dev-flash.c')
| -rw-r--r-- | arch/mips/bcm63xx/dev-flash.c | 60 | 
1 files changed, 54 insertions, 6 deletions
diff --git a/arch/mips/bcm63xx/dev-flash.c b/arch/mips/bcm63xx/dev-flash.c index af5273868baa..1051faedab2d 100644 --- a/arch/mips/bcm63xx/dev-flash.c +++ b/arch/mips/bcm63xx/dev-flash.c @@ -7,6 +7,7 @@   *   * Copyright (C) 2008 Maxime Bizon <mbizon@freebox.fr>   * Copyright (C) 2008 Florian Fainelli <florian@openwrt.org> + * Copyright (C) 2012 Jonas Gorski <jonas.gorski@gmail.com>   */  #include <linux/init.h> @@ -54,16 +55,63 @@ static struct platform_device mtd_dev = {  	},  }; +static int __init bcm63xx_detect_flash_type(void) +{ +	u32 val; + +	switch (bcm63xx_get_cpu_id()) { +	case BCM6338_CPU_ID: +	case BCM6345_CPU_ID: +	case BCM6348_CPU_ID: +		/* no way to auto detect so assume parallel */ +		return BCM63XX_FLASH_TYPE_PARALLEL; +	case BCM6358_CPU_ID: +		val = bcm_gpio_readl(GPIO_STRAPBUS_REG); +		if (val & STRAPBUS_6358_BOOT_SEL_PARALLEL) +			return BCM63XX_FLASH_TYPE_PARALLEL; +		else +			return BCM63XX_FLASH_TYPE_SERIAL; +	case BCM6368_CPU_ID: +		val = bcm_gpio_readl(GPIO_STRAPBUS_REG); +		switch (val & STRAPBUS_6368_BOOT_SEL_MASK) { +		case STRAPBUS_6368_BOOT_SEL_NAND: +			return BCM63XX_FLASH_TYPE_NAND; +		case STRAPBUS_6368_BOOT_SEL_SERIAL: +			return BCM63XX_FLASH_TYPE_SERIAL; +		case STRAPBUS_6368_BOOT_SEL_PARALLEL: +			return BCM63XX_FLASH_TYPE_PARALLEL; +		} +	default: +		return -EINVAL; +	} +} +  int __init bcm63xx_flash_register(void)  { +	int flash_type;  	u32 val; -	/* read base address of boot chip select (0) */ -	val = bcm_mpi_readl(MPI_CSBASE_REG(0)); -	val &= MPI_CSBASE_BASE_MASK; +	flash_type = bcm63xx_detect_flash_type(); -	mtd_resources[0].start = val; -	mtd_resources[0].end = 0x1FFFFFFF; +	switch (flash_type) { +	case BCM63XX_FLASH_TYPE_PARALLEL: +		/* read base address of boot chip select (0) */ +		val = bcm_mpi_readl(MPI_CSBASE_REG(0)); +		val &= MPI_CSBASE_BASE_MASK; -	return platform_device_register(&mtd_dev); +		mtd_resources[0].start = val; +		mtd_resources[0].end = 0x1FFFFFFF; + +		return platform_device_register(&mtd_dev); +	case BCM63XX_FLASH_TYPE_SERIAL: +		pr_warn("unsupported serial flash detected\n"); +		return -ENODEV; +	case BCM63XX_FLASH_TYPE_NAND: +		pr_warn("unsupported NAND flash detected\n"); +		return -ENODEV; +	default: +		pr_err("flash detection failed for BCM%x: %d\n", +		       bcm63xx_get_cpu_id(), flash_type); +		return -ENODEV; +	}  }  | 
