2012-07-17 18:26:41 +04:00
/*
* Broadcom specific AMBA
* ChipCommon NAND flash interface
*
* Licensed under the GNU / GPL . See COPYING for details .
*/
2013-01-30 11:46:53 +04:00
# include "bcma_private.h"
2022-01-07 21:46:11 +03:00
# include <linux/bitops.h>
2012-08-12 15:08:05 +04:00
# include <linux/platform_device.h>
2022-01-07 21:46:11 +03:00
# include <linux/platform_data/brcmnand.h>
2012-07-17 18:26:41 +04:00
# include <linux/bcma/bcma.h>
2022-01-07 21:46:11 +03:00
/* Alternate NAND controller driver name in order to allow both bcm47xxnflash
* and bcma_brcmnand to be built into the same kernel image .
*/
static const char * bcma_nflash_alt_name = " bcma_brcmnand " ;
2012-08-12 15:08:05 +04:00
struct platform_device bcma_nflash_dev = {
. name = " bcma_nflash " ,
. num_resources = 0 ,
} ;
2022-01-07 21:46:11 +03:00
static const char * probes [ ] = { " bcm47xxpart " , NULL } ;
2012-07-17 18:26:41 +04:00
/* Initialize NAND flash access */
int bcma_nflash_init ( struct bcma_drv_cc * cc )
{
2012-08-12 15:08:05 +04:00
struct bcma_bus * bus = cc - > core - > bus ;
2022-01-07 21:46:11 +03:00
u32 reg ;
2012-08-12 15:08:05 +04:00
if ( bus - > chipinfo . id ! = BCMA_CHIP_ID_BCM4706 & &
2013-01-27 17:30:29 +04:00
cc - > core - > id . rev ! = 38 ) {
2012-08-12 15:08:05 +04:00
bcma_err ( bus , " NAND flash on unsupported board! \n " ) ;
return - ENOTSUPP ;
}
if ( ! ( cc - > capabilities & BCMA_CC_CAP_NFLASH ) ) {
bcma_err ( bus , " NAND flash not present according to ChipCommon \n " ) ;
return - ENODEV ;
}
cc - > nflash . present = true ;
2012-09-29 22:33:51 +04:00
if ( cc - > core - > id . rev = = 38 & &
2022-01-07 21:46:11 +03:00
( cc - > status & BCMA_CC_CHIPST_5357_NAND_BOOT ) ) {
2012-09-29 22:33:51 +04:00
cc - > nflash . boot = true ;
2022-01-07 21:46:11 +03:00
/* Determine the chip select that is being used */
reg = bcma_cc_read32 ( cc , BCMA_CC_NAND_CS_NAND_SELECT ) & 0xff ;
cc - > nflash . brcmnand_info . chip_select = ffs ( reg ) - 1 ;
cc - > nflash . brcmnand_info . part_probe_types = probes ;
cc - > nflash . brcmnand_info . ecc_stepsize = 512 ;
cc - > nflash . brcmnand_info . ecc_strength = 1 ;
bcma_nflash_dev . name = bcma_nflash_alt_name ;
}
2012-08-12 15:08:05 +04:00
/* Prepare platform device, but don't register it yet. It's too early,
* malloc ( required by device_private_init ) is not available yet . */
bcma_nflash_dev . dev . platform_data = & cc - > nflash ;
2012-07-17 18:26:41 +04:00
return 0 ;
}