diff options
Diffstat (limited to 'arch')
| -rw-r--r-- | arch/mips/bcm63xx/Makefile | 2 | ||||
| -rw-r--r-- | arch/mips/bcm63xx/boards/board_bcm963xx.c | 4 | ||||
| -rw-r--r-- | arch/mips/bcm63xx/dev-pcmcia.c | 144 | ||||
| -rw-r--r-- | arch/mips/include/asm/mach-bcm63xx/bcm63xx_dev_pcmcia.h | 13 |
4 files changed, 162 insertions, 1 deletions
diff --git a/arch/mips/bcm63xx/Makefile b/arch/mips/bcm63xx/Makefile index cff75de8449b..c146d1ededed 100644 --- a/arch/mips/bcm63xx/Makefile +++ b/arch/mips/bcm63xx/Makefile | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | obj-y += clk.o cpu.o cs.o gpio.o irq.o prom.o setup.o timer.o \ | 1 | obj-y += clk.o cpu.o cs.o gpio.o irq.o prom.o setup.o timer.o \ |
| 2 | dev-dsp.o dev-enet.o dev-uart.o | 2 | dev-dsp.o dev-enet.o dev-pcmcia.o dev-uart.o |
| 3 | obj-$(CONFIG_EARLY_PRINTK) += early_printk.o | 3 | obj-$(CONFIG_EARLY_PRINTK) += early_printk.o |
| 4 | 4 | ||
| 5 | obj-y += boards/ | 5 | obj-y += boards/ |
diff --git a/arch/mips/bcm63xx/boards/board_bcm963xx.c b/arch/mips/bcm63xx/boards/board_bcm963xx.c index 5a327f3a7167..78e155d21be6 100644 --- a/arch/mips/bcm63xx/boards/board_bcm963xx.c +++ b/arch/mips/bcm63xx/boards/board_bcm963xx.c | |||
| @@ -23,6 +23,7 @@ | |||
| 23 | #include <bcm63xx_dev_pci.h> | 23 | #include <bcm63xx_dev_pci.h> |
| 24 | #include <bcm63xx_dev_enet.h> | 24 | #include <bcm63xx_dev_enet.h> |
| 25 | #include <bcm63xx_dev_dsp.h> | 25 | #include <bcm63xx_dev_dsp.h> |
| 26 | #include <bcm63xx_dev_pcmcia.h> | ||
| 26 | #include <bcm63xx_dev_uart.h> | 27 | #include <bcm63xx_dev_uart.h> |
| 27 | #include <board_bcm963xx.h> | 28 | #include <board_bcm963xx.h> |
| 28 | 29 | ||
| @@ -795,6 +796,9 @@ int __init board_register_devices(void) | |||
| 795 | 796 | ||
| 796 | bcm63xx_uart_register(); | 797 | bcm63xx_uart_register(); |
| 797 | 798 | ||
| 799 | if (board.has_pccard) | ||
| 800 | bcm63xx_pcmcia_register(); | ||
| 801 | |||
| 798 | if (board.has_enet0 && | 802 | if (board.has_enet0 && |
| 799 | !board_get_mac_address(board.enet0.mac_addr)) | 803 | !board_get_mac_address(board.enet0.mac_addr)) |
| 800 | bcm63xx_enet_register(0, &board.enet0); | 804 | bcm63xx_enet_register(0, &board.enet0); |
diff --git a/arch/mips/bcm63xx/dev-pcmcia.c b/arch/mips/bcm63xx/dev-pcmcia.c new file mode 100644 index 000000000000..de4d917fd54d --- /dev/null +++ b/arch/mips/bcm63xx/dev-pcmcia.c | |||
| @@ -0,0 +1,144 @@ | |||
| 1 | /* | ||
| 2 | * This file is subject to the terms and conditions of the GNU General Public | ||
| 3 | * License. See the file "COPYING" in the main directory of this archive | ||
| 4 | * for more details. | ||
| 5 | * | ||
| 6 | * Copyright (C) 2008 Maxime Bizon <mbizon@freebox.fr> | ||
| 7 | */ | ||
| 8 | |||
| 9 | #include <linux/init.h> | ||
| 10 | #include <linux/kernel.h> | ||
| 11 | #include <asm/bootinfo.h> | ||
| 12 | #include <linux/platform_device.h> | ||
| 13 | #include <bcm63xx_cs.h> | ||
| 14 | #include <bcm63xx_cpu.h> | ||
| 15 | #include <bcm63xx_dev_pcmcia.h> | ||
| 16 | #include <bcm63xx_io.h> | ||
| 17 | #include <bcm63xx_regs.h> | ||
| 18 | |||
| 19 | static struct resource pcmcia_resources[] = { | ||
| 20 | /* pcmcia registers */ | ||
| 21 | { | ||
| 22 | /* start & end filled at runtime */ | ||
| 23 | .flags = IORESOURCE_MEM, | ||
| 24 | }, | ||
| 25 | |||
| 26 | /* pcmcia memory zone resources */ | ||
| 27 | { | ||
| 28 | .start = BCM_PCMCIA_COMMON_BASE_PA, | ||
| 29 | .end = BCM_PCMCIA_COMMON_END_PA, | ||
| 30 | .flags = IORESOURCE_MEM, | ||
| 31 | }, | ||
| 32 | { | ||
| 33 | .start = BCM_PCMCIA_ATTR_BASE_PA, | ||
| 34 | .end = BCM_PCMCIA_ATTR_END_PA, | ||
| 35 | .flags = IORESOURCE_MEM, | ||
| 36 | }, | ||
| 37 | { | ||
| 38 | .start = BCM_PCMCIA_IO_BASE_PA, | ||
| 39 | .end = BCM_PCMCIA_IO_END_PA, | ||
| 40 | .flags = IORESOURCE_MEM, | ||
| 41 | }, | ||
| 42 | |||
| 43 | /* PCMCIA irq */ | ||
| 44 | { | ||
| 45 | /* start filled at runtime */ | ||
| 46 | .flags = IORESOURCE_IRQ, | ||
| 47 | }, | ||
| 48 | |||
| 49 | /* declare PCMCIA IO resource also */ | ||
| 50 | { | ||
| 51 | .start = BCM_PCMCIA_IO_BASE_PA, | ||
| 52 | .end = BCM_PCMCIA_IO_END_PA, | ||
| 53 | .flags = IORESOURCE_IO, | ||
| 54 | }, | ||
| 55 | }; | ||
| 56 | |||
| 57 | static struct bcm63xx_pcmcia_platform_data pd; | ||
| 58 | |||
| 59 | static struct platform_device bcm63xx_pcmcia_device = { | ||
| 60 | .name = "bcm63xx_pcmcia", | ||
| 61 | .id = 0, | ||
| 62 | .num_resources = ARRAY_SIZE(pcmcia_resources), | ||
| 63 | .resource = pcmcia_resources, | ||
| 64 | .dev = { | ||
| 65 | .platform_data = &pd, | ||
| 66 | }, | ||
| 67 | }; | ||
| 68 | |||
| 69 | static int __init config_pcmcia_cs(unsigned int cs, | ||
| 70 | u32 base, unsigned int size) | ||
| 71 | { | ||
| 72 | int ret; | ||
| 73 | |||
| 74 | ret = bcm63xx_set_cs_status(cs, 0); | ||
| 75 | if (!ret) | ||
| 76 | ret = bcm63xx_set_cs_base(cs, base, size); | ||
| 77 | if (!ret) | ||
| 78 | ret = bcm63xx_set_cs_status(cs, 1); | ||
| 79 | return ret; | ||
| 80 | } | ||
| 81 | |||
| 82 | static const __initdata struct { | ||
| 83 | unsigned int cs; | ||
| 84 | unsigned int base; | ||
| 85 | unsigned int size; | ||
| 86 | } pcmcia_cs[3] = { | ||
| 87 | { | ||
| 88 | .cs = MPI_CS_PCMCIA_COMMON, | ||
| 89 | .base = BCM_PCMCIA_COMMON_BASE_PA, | ||
| 90 | .size = BCM_PCMCIA_COMMON_SIZE | ||
| 91 | }, | ||
| 92 | { | ||
| 93 | .cs = MPI_CS_PCMCIA_ATTR, | ||
| 94 | .base = BCM_PCMCIA_ATTR_BASE_PA, | ||
| 95 | .size = BCM_PCMCIA_ATTR_SIZE | ||
| 96 | }, | ||
| 97 | { | ||
| 98 | .cs = MPI_CS_PCMCIA_IO, | ||
| 99 | .base = BCM_PCMCIA_IO_BASE_PA, | ||
| 100 | .size = BCM_PCMCIA_IO_SIZE | ||
| 101 | }, | ||
| 102 | }; | ||
| 103 | |||
| 104 | int __init bcm63xx_pcmcia_register(void) | ||
| 105 | { | ||
| 106 | int ret, i; | ||
| 107 | |||
| 108 | if (!BCMCPU_IS_6348() && !BCMCPU_IS_6358()) | ||
| 109 | return 0; | ||
| 110 | |||
| 111 | /* use correct pcmcia ready gpio depending on processor */ | ||
| 112 | switch (bcm63xx_get_cpu_id()) { | ||
| 113 | case BCM6348_CPU_ID: | ||
| 114 | pd.ready_gpio = 22; | ||
| 115 | break; | ||
| 116 | |||
| 117 | case BCM6358_CPU_ID: | ||
| 118 | pd.ready_gpio = 18; | ||
| 119 | break; | ||
| 120 | |||
| 121 | default: | ||
| 122 | return -ENODEV; | ||
| 123 | } | ||
| 124 | |||
| 125 | pcmcia_resources[0].start = bcm63xx_regset_address(RSET_PCMCIA); | ||
| 126 | pcmcia_resources[0].end = pcmcia_resources[0].start + | ||
| 127 | RSET_PCMCIA_SIZE - 1; | ||
| 128 | pcmcia_resources[4].start = bcm63xx_get_irq_number(IRQ_PCMCIA); | ||
| 129 | |||
| 130 | /* configure pcmcia chip selects */ | ||
| 131 | for (i = 0; i < 3; i++) { | ||
| 132 | ret = config_pcmcia_cs(pcmcia_cs[i].cs, | ||
| 133 | pcmcia_cs[i].base, | ||
| 134 | pcmcia_cs[i].size); | ||
| 135 | if (ret) | ||
| 136 | goto out_err; | ||
| 137 | } | ||
| 138 | |||
| 139 | return platform_device_register(&bcm63xx_pcmcia_device); | ||
| 140 | |||
| 141 | out_err: | ||
| 142 | printk(KERN_ERR "unable to set pcmcia chip select\n"); | ||
| 143 | return ret; | ||
| 144 | } | ||
diff --git a/arch/mips/include/asm/mach-bcm63xx/bcm63xx_dev_pcmcia.h b/arch/mips/include/asm/mach-bcm63xx/bcm63xx_dev_pcmcia.h new file mode 100644 index 000000000000..2beb3969ce3b --- /dev/null +++ b/arch/mips/include/asm/mach-bcm63xx/bcm63xx_dev_pcmcia.h | |||
| @@ -0,0 +1,13 @@ | |||
| 1 | #ifndef BCM63XX_DEV_PCMCIA_H_ | ||
| 2 | #define BCM63XX_DEV_PCMCIA_H_ | ||
| 3 | |||
| 4 | /* | ||
| 5 | * PCMCIA driver platform data | ||
| 6 | */ | ||
| 7 | struct bcm63xx_pcmcia_platform_data { | ||
| 8 | unsigned int ready_gpio; | ||
| 9 | }; | ||
| 10 | |||
| 11 | int bcm63xx_pcmcia_register(void); | ||
| 12 | |||
| 13 | #endif /* BCM63XX_DEV_PCMCIA_H_ */ | ||
