1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * Broadcom specific AMBA 3*4882a593Smuzhiyun * ChipCommon NAND flash interface 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Licensed under the GNU/GPL. See COPYING for details. 6*4882a593Smuzhiyun */ 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun #include "bcma_private.h" 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun #include <linux/platform_device.h> 11*4882a593Smuzhiyun #include <linux/bcma/bcma.h> 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun struct platform_device bcma_nflash_dev = { 14*4882a593Smuzhiyun .name = "bcma_nflash", 15*4882a593Smuzhiyun .num_resources = 0, 16*4882a593Smuzhiyun }; 17*4882a593Smuzhiyun 18*4882a593Smuzhiyun /* Initialize NAND flash access */ bcma_nflash_init(struct bcma_drv_cc * cc)19*4882a593Smuzhiyunint bcma_nflash_init(struct bcma_drv_cc *cc) 20*4882a593Smuzhiyun { 21*4882a593Smuzhiyun struct bcma_bus *bus = cc->core->bus; 22*4882a593Smuzhiyun 23*4882a593Smuzhiyun if (bus->chipinfo.id != BCMA_CHIP_ID_BCM4706 && 24*4882a593Smuzhiyun cc->core->id.rev != 38) { 25*4882a593Smuzhiyun bcma_err(bus, "NAND flash on unsupported board!\n"); 26*4882a593Smuzhiyun return -ENOTSUPP; 27*4882a593Smuzhiyun } 28*4882a593Smuzhiyun 29*4882a593Smuzhiyun if (!(cc->capabilities & BCMA_CC_CAP_NFLASH)) { 30*4882a593Smuzhiyun bcma_err(bus, "NAND flash not present according to ChipCommon\n"); 31*4882a593Smuzhiyun return -ENODEV; 32*4882a593Smuzhiyun } 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun cc->nflash.present = true; 35*4882a593Smuzhiyun if (cc->core->id.rev == 38 && 36*4882a593Smuzhiyun (cc->status & BCMA_CC_CHIPST_5357_NAND_BOOT)) 37*4882a593Smuzhiyun cc->nflash.boot = true; 38*4882a593Smuzhiyun 39*4882a593Smuzhiyun /* Prepare platform device, but don't register it yet. It's too early, 40*4882a593Smuzhiyun * malloc (required by device_private_init) is not available yet. */ 41*4882a593Smuzhiyun bcma_nflash_dev.dev.platform_data = &cc->nflash; 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun return 0; 44*4882a593Smuzhiyun } 45