Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 371a0044 authored by Rafał Miłecki's avatar Rafał Miłecki Committed by John W. Linville
Browse files

bcma: detect and register NAND flash device

parent d57ef3a6
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -53,7 +53,7 @@ config BCMA_SFLASH

config BCMA_NFLASH
	bool
	depends on BCMA_DRIVER_MIPS && BROKEN
	depends on BCMA_DRIVER_MIPS
	default y

config BCMA_DRIVER_GMAC_CMN
+1 −0
Original line number Diff line number Diff line
@@ -66,6 +66,7 @@ static inline int bcma_sflash_init(struct bcma_drv_cc *cc)
#ifdef CONFIG_BCMA_NFLASH
/* driver_chipcommon_nflash.c */
int bcma_nflash_init(struct bcma_drv_cc *cc);
extern struct platform_device bcma_nflash_dev;
#else
static inline int bcma_nflash_init(struct bcma_drv_cc *cc)
{
+25 −3
Original line number Diff line number Diff line
@@ -5,15 +5,37 @@
 * Licensed under the GNU/GPL. See COPYING for details.
 */

#include <linux/platform_device.h>
#include <linux/bcma/bcma.h>
#include <linux/bcma/bcma_driver_chipcommon.h>
#include <linux/delay.h>

#include "bcma_private.h"

struct platform_device bcma_nflash_dev = {
	.name		= "bcma_nflash",
	.num_resources	= 0,
};

/* Initialize NAND flash access */
int bcma_nflash_init(struct bcma_drv_cc *cc)
{
	bcma_err(cc->core->bus, "NAND flash support is broken\n");
	struct bcma_bus *bus = cc->core->bus;

	if (bus->chipinfo.id != BCMA_CHIP_ID_BCM4706 &&
	    cc->core->id.rev != 0x38) {
		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;

	/* 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;

	return 0;
}
+8 −0
Original line number Diff line number Diff line
@@ -145,6 +145,14 @@ static int bcma_register_cores(struct bcma_bus *bus)
	}
#endif

#ifdef CONFIG_BCMA_NFLASH
	if (bus->drv_cc.nflash.present) {
		err = platform_device_register(&bcma_nflash_dev);
		if (err)
			bcma_err(bus, "Error registering NAND flash\n");
	}
#endif

	return 0;
}

+13 −0
Original line number Diff line number Diff line
@@ -519,6 +519,16 @@ struct bcma_sflash {
};
#endif

#ifdef CONFIG_BCMA_NFLASH
struct mtd_info;

struct bcma_nflash {
	bool present;

	struct mtd_info *mtd;
};
#endif

struct bcma_serial_port {
	void *regs;
	unsigned long clockspeed;
@@ -542,6 +552,9 @@ struct bcma_drv_cc {
#ifdef CONFIG_BCMA_SFLASH
	struct bcma_sflash sflash;
#endif
#ifdef CONFIG_BCMA_NFLASH
	struct bcma_nflash nflash;
#endif

	int nr_serial_ports;
	struct bcma_serial_port serial_ports[4];