ARM: omap1: move CF chipselect setup to board file
authorArnd Bergmann <arnd@arndb.de>
Mon, 5 Aug 2019 21:08:58 +0000 (23:08 +0200)
committerArnd Bergmann <arnd@arndb.de>
Thu, 21 Apr 2022 13:01:11 +0000 (15:01 +0200)
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: Tony Lindgren <tony@atomide.com>
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
arch/arm/mach-omap1/board-osk.c
drivers/pcmcia/Kconfig
drivers/pcmcia/omap_cf.c

index b627a43..5dbc8f1 100644 (file)
@@ -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
index 2ce261c..ec977f0 100644 (file)
@@ -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.
index f0b2c2d..093022c 100644 (file)
 
 #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,