diff options
| author | Arnd Bergmann <arnd@arndb.de> | 2013-04-08 19:40:57 +0200 | 
|---|---|---|
| committer | Arnd Bergmann <arnd@arndb.de> | 2013-04-08 19:40:57 +0200 | 
| commit | 86feb64f5bfe75da74f4a2faf18b5e57be9cde5e (patch) | |
| tree | 410e5dbd7e23b32671cc297e52b42a0d6595f454 /arch/arm/mach-omap2/gpmc-nand.c | |
| parent | dc2d3db8137fba0f62d7517e1bea8a47f69fcbc4 (diff) | |
| parent | aecb65a34a780cd07fbaa652cc5d640f13f3ed5f (diff) | |
| download | olio-linux-3.10-86feb64f5bfe75da74f4a2faf18b5e57be9cde5e.tar.xz olio-linux-3.10-86feb64f5bfe75da74f4a2faf18b5e57be9cde5e.zip  | |
Merge tag 'omap-for-v3.10/gpmc-signed' of git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap into next/drivers
From Tony Lindgren <tony@atomide.com>:
GPMC updates from Jon Hunter <jon-hunter@ti.com>:
Adds GPMC (General Purpose Memory Controller) DT support for
NOR flash and Ethernet and includes various GPMC cleans-up
and fixes.
This series is dependent on commit 7185684 (ARM: OMAP: use
consistent error checking) from RMK's clean-up branch and commit
31d9adc (ARM: OMAP2+: Fix broken gpmc support).
* tag 'omap-for-v3.10/gpmc-signed' of git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap: (29 commits)
  ARM: OMAP2+: Add GPMC DT support for Ethernet child nodes
  ARM: OMAP2+: rename gpmc_probe_nor_child() to gpmc_probe_generic_child()
  ARM: OMAP2+: return -ENODEV if GPMC child device creation fails
  ARM: OMAP2+: Allow GPMC probe to complete even if CS mapping fails
  ARM: OMAP2+: Remove unnecesssary GPMC definitions and variable
  ARM: OMAP2+: Detect incorrectly aligned GPMC base address
  ARM: OMAP2+: Convert ONENAND to retrieve GPMC settings from DT
  ARM: OMAP2+: Convert NAND to retrieve GPMC settings from DT
  ARM: OMAP2+: Add device-tree support for NOR flash
  ARM: OMAP2+: Add additional GPMC timing parameters
  ARM: OMAP2+: Add function to read GPMC settings from device-tree
  ARM: OMAP2+: Don't configure of chip-select options in gpmc_cs_configure()
  ARM: OMAP2+: Convert TUSB to use gpmc_cs_program_settings()
  ARM: OMAP2+: Convert SMC91x to use gpmc_cs_program_settings()
  ARM: OMAP2+: Convert NAND to use gpmc_cs_program_settings()
  ARM: OMAP2+: Convert ONENAND to use gpmc_cs_program_settings()
  ARM: OMAP2+: Add function for configuring GPMC settings
  ARM: OMAP2+: Add structure for storing GPMC settings
  ARM: OMAP2+: Add variable to store number of GPMC waitpins
  ARM: OMAP2+: Simplify code configuring ONENAND devices
  ...
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Diffstat (limited to 'arch/arm/mach-omap2/gpmc-nand.c')
| -rw-r--r-- | arch/arm/mach-omap2/gpmc-nand.c | 42 | 
1 files changed, 29 insertions, 13 deletions
diff --git a/arch/arm/mach-omap2/gpmc-nand.c b/arch/arm/mach-omap2/gpmc-nand.c index afc1e8c32d6..d9c27195caf 100644 --- a/arch/arm/mach-omap2/gpmc-nand.c +++ b/arch/arm/mach-omap2/gpmc-nand.c @@ -74,14 +74,6 @@ static int omap2_nand_gpmc_retime(  	t.cs_wr_off = gpmc_t->cs_wr_off;  	t.wr_cycle = gpmc_t->wr_cycle; -	/* Configure GPMC */ -	if (gpmc_nand_data->devsize == NAND_BUSWIDTH_16) -		gpmc_cs_configure(gpmc_nand_data->cs, GPMC_CONFIG_DEV_SIZE, 1); -	else -		gpmc_cs_configure(gpmc_nand_data->cs, GPMC_CONFIG_DEV_SIZE, 0); -	gpmc_cs_configure(gpmc_nand_data->cs, -			GPMC_CONFIG_DEV_TYPE, GPMC_DEVICETYPE_NAND); -	gpmc_cs_configure(gpmc_nand_data->cs, GPMC_CONFIG_WP, 0);  	err = gpmc_cs_set_timings(gpmc_nand_data->cs, &t);  	if (err)  		return err; @@ -115,14 +107,18 @@ int gpmc_nand_init(struct omap_nand_platform_data *gpmc_nand_data,  		   struct gpmc_timings *gpmc_t)  {  	int err	= 0; +	struct gpmc_settings s;  	struct device *dev = &gpmc_nand_device.dev; +	memset(&s, 0, sizeof(struct gpmc_settings)); +  	gpmc_nand_device.dev.platform_data = gpmc_nand_data;  	err = gpmc_cs_request(gpmc_nand_data->cs, NAND_IO_SIZE,  				(unsigned long *)&gpmc_nand_resource[0].start);  	if (err < 0) { -		dev_err(dev, "Cannot request GPMC CS\n"); +		dev_err(dev, "Cannot request GPMC CS %d, error %d\n", +			gpmc_nand_data->cs, err);  		return err;  	} @@ -140,11 +136,31 @@ int gpmc_nand_init(struct omap_nand_platform_data *gpmc_nand_data,  			dev_err(dev, "Unable to set gpmc timings: %d\n", err);  			return err;  		} -	} -	/* Enable RD PIN Monitoring Reg */ -	if (gpmc_nand_data->dev_ready) { -		gpmc_cs_configure(gpmc_nand_data->cs, GPMC_CONFIG_RDY_BSY, 1); +		if (gpmc_nand_data->of_node) { +			gpmc_read_settings_dt(gpmc_nand_data->of_node, &s); +		} else { +			s.device_nand = true; + +			/* Enable RD PIN Monitoring Reg */ +			if (gpmc_nand_data->dev_ready) { +				s.wait_on_read = true; +				s.wait_on_write = true; +			} +		} + +		if (gpmc_nand_data->devsize == NAND_BUSWIDTH_16) +			s.device_width = GPMC_DEVWIDTH_16BIT; +		else +			s.device_width = GPMC_DEVWIDTH_8BIT; + +		err = gpmc_cs_program_settings(gpmc_nand_data->cs, &s); +		if (err < 0) +			goto out_free_cs; + +		err = gpmc_configure(GPMC_CONFIG_WP, 0); +		if (err < 0) +			goto out_free_cs;  	}  	gpmc_update_nand_reg(&gpmc_nand_data->reg, gpmc_nand_data->cs);  |