Commit d87d44f7 authored by Arnd Bergmann's avatar Arnd Bergmann
Browse files

ARM: omap1: move CF chipselect setup to board file



There is only one board that uses the omap_cf driver, so
moving the chipselect configuration there does not lead
to code duplication but avoids the use of mach/tc.h
in drivers.

Acked-by: default avatarTony Lindgren <tony@atomide.com>
Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
parent 58d37dc1
Loading
Loading
Loading
Loading
+33 −5
Original line number Diff line number Diff line
@@ -153,14 +153,14 @@ static struct resource osk5912_cf_resources[] = {
	[0] = {
		.flags	= IORESOURCE_IRQ,
	},
	[1] = {
		.flags = IORESOURCE_MEM,
	},
};

static struct platform_device osk5912_cf_device = {
	.name		= "omap_cf",
	.id		= -1,
	.dev = {
		.platform_data	= (void *) 2 /* CS2 */,
	},
	.num_resources	= ARRAY_SIZE(osk5912_cf_resources),
	.resource	= osk5912_cf_resources,
};
@@ -275,13 +275,41 @@ static void __init osk_init_smc91x(void)
	omap_writel(l, EMIFS_CCS(1));
}

static void __init osk_init_cf(void)
static void __init osk_init_cf(int seg)
{
	struct resource *res = &osk5912_cf_resources[1];

	omap_cfg_reg(M7_1610_GPIO62);
	if ((gpio_request(62, "cf_irq")) < 0) {
		printk("Error requesting gpio 62 for CF irq\n");
		return;
	}

	switch (seg) {
	/* NOTE: CS0 could be configured too ... */
	case 1:
		res->start = OMAP_CS1_PHYS;
		break;
	case 2:
		res->start = OMAP_CS2_PHYS;
		break;
	case 3:
		res->start = omap_cs3_phys();
		break;
	}

	res->end = res->start + SZ_8K - 1;
	osk5912_cf_device.dev.platform_data = (void *)(uintptr_t)seg;

	/* NOTE:  better EMIFS setup might support more cards; but the
	 * TRM only shows how to affect regular flash signals, not their
	 * CF/PCMCIA variants...
	 */
	pr_debug("%s: cs%d, previous ccs %08x acs %08x\n", __func__,
		seg, omap_readl(EMIFS_CCS(seg)), omap_readl(EMIFS_ACS(seg)));
	omap_writel(0x0004a1b3, EMIFS_CCS(seg));	/* synch mode 4 etc */
	omap_writel(0x00000000, EMIFS_ACS(seg));	/* OE hold/setup */

	/* the CF I/O IRQ is really active-low */
	irq_set_irq_type(gpio_to_irq(62), IRQ_TYPE_EDGE_FALLING);
}
@@ -580,7 +608,7 @@ static void __init osk_init(void)
	u32 l;

	osk_init_smc91x();
	osk_init_cf();
	osk_init_cf(2); /* CS2 */

	/* Workaround for wrong CS3 (NOR flash) timing
	 * There are some U-Boot versions out there which configure
+2 −1
Original line number Diff line number Diff line
@@ -246,7 +246,8 @@ config PCMCIA_VRC4171

config OMAP_CF
	tristate "OMAP CompactFlash Controller"
	depends on PCMCIA && ARCH_OMAP16XX
	depends on PCMCIA
	depends on ARCH_OMAP16XX || (ARM && COMPILE_TEST)
	help
	  Say Y here to support the CompactFlash controller on OMAP.
	  Note that this doesn't support "True IDE" mode.
+7 −31
Original line number Diff line number Diff line
@@ -16,13 +16,12 @@

#include <pcmcia/ss.h>

#include <mach/hardware.h>
#include <asm/io.h>
#include <linux/sizes.h>

#include <mach/mux.h>
#include <mach/tc.h>

#include <linux/soc/ti/omap1-io.h>
#include <linux/soc/ti/omap1-soc.h>
#include <linux/soc/ti/omap1-mux.h>

/* NOTE:  don't expect this to support many I/O cards.  The 16xx chips have
 * hard-wired timings to support Compact Flash memory cards; they won't work
@@ -205,6 +204,7 @@ static int __init omap_cf_probe(struct platform_device *pdev)
	struct omap_cf_socket	*cf;
	int			irq;
	int			status;
	struct resource		*res;

	seg = (int) pdev->dev.platform_data;
	if (seg == 0 || seg > 3)
@@ -215,6 +215,8 @@ static int __init omap_cf_probe(struct platform_device *pdev)
	if (irq < 0)
		return -EINVAL;

	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);

	cf = kzalloc(sizeof *cf, GFP_KERNEL);
	if (!cf)
		return -ENOMEM;
@@ -230,24 +232,7 @@ static int __init omap_cf_probe(struct platform_device *pdev)
		goto fail0;
	cf->irq = irq;
	cf->socket.pci_irq = irq;

	switch (seg) {
	/* NOTE: CS0 could be configured too ... */
	case 1:
		cf->phys_cf = OMAP_CS1_PHYS;
		break;
	case 2:
		cf->phys_cf = OMAP_CS2_PHYS;
		break;
	case 3:
		cf->phys_cf = omap_cs3_phys();
		break;
	default:
		goto  fail1;
	}
	cf->iomem.start = cf->phys_cf;
	cf->iomem.end = cf->iomem.end + SZ_8K - 1;
	cf->iomem.flags = IORESOURCE_MEM;
	cf->phys_cf = res->start;

	/* pcmcia layer only remaps "real" memory */
	cf->socket.io_offset = (unsigned long)
@@ -273,15 +258,6 @@ static int __init omap_cf_probe(struct platform_device *pdev)

	pr_info("%s: cs%d on irq %d\n", driver_name, seg, irq);

	/* NOTE:  better EMIFS setup might support more cards; but the
	 * TRM only shows how to affect regular flash signals, not their
	 * CF/PCMCIA variants...
	 */
	pr_debug("%s: cs%d, previous ccs %08x acs %08x\n", driver_name,
		seg, omap_readl(EMIFS_CCS(seg)), omap_readl(EMIFS_ACS(seg)));
	omap_writel(0x0004a1b3, EMIFS_CCS(seg));	/* synch mode 4 etc */
	omap_writel(0x00000000, EMIFS_ACS(seg));	/* OE hold/setup */

	/* CF uses armxor_ck, which is "always" available */

	pr_debug("%s: sts %04x cfg %04x control %04x %s\n", driver_name,