Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[ARM] 3093/1: SharpSL PCMCIA Updates for Cxx00 models

Patch from Richard Purdie

The Sharp SL-Cxx00 models have a combined power control for the SD
and CF slot 0. This patch adds hooks to the scoop driver to allow
machines to provide a custom control function for this and such a
function is added for spitz/akita/borzoi.

It also moves the gpio init code into the machine files as this
is machine dependent and differs between some models. A couple of
warnings when compiling for collie are also fixed.

Signed-off-by: Richard Purdie
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>

authored by

Richard Purdie and committed by
Russell King
a63ae442 1d23b65d

+221 -112
-6
arch/arm/common/scoop.c
··· 19 19 20 20 #define SCOOP_REG(d,adr) (*(volatile unsigned short*)(d +(adr))) 21 21 22 - /* PCMCIA to Scoop linkage structures for pxa2xx_sharpsl.c 23 - There is no easy way to link multiple scoop devices into one 24 - single entity for the pxa2xx_pcmcia device */ 25 - int scoop_num; 26 - struct scoop_pcmcia_dev *scoop_devs; 27 - 28 22 struct scoop_dev { 29 23 void *base; 30 24 spinlock_t scoop_lock;
+39 -11
arch/arm/mach-pxa/corgi.c
··· 62 62 .io_out = CORGI_SCOOP_IO_OUT, 63 63 }; 64 64 65 - static struct scoop_pcmcia_dev corgi_pcmcia_scoop[] = { 66 - { 67 - .dev = &corgiscoop_device.dev, 68 - .irq = CORGI_IRQ_GPIO_CF_IRQ, 69 - .cd_irq = CORGI_IRQ_GPIO_CF_CD, 70 - .cd_irq_str = "PCMCIA0 CD", 71 - }, 72 - }; 73 - 74 65 struct platform_device corgiscoop_device = { 75 66 .name = "sharp-scoop", 76 67 .id = -1, ··· 71 80 .num_resources = ARRAY_SIZE(corgi_scoop_resources), 72 81 .resource = corgi_scoop_resources, 73 82 }; 83 + 84 + static void corgi_pcmcia_init(void) 85 + { 86 + /* Setup default state of GPIO outputs 87 + before we enable them as outputs. */ 88 + GPSR(GPIO48_nPOE) = GPIO_bit(GPIO48_nPOE) | 89 + GPIO_bit(GPIO49_nPWE) | GPIO_bit(GPIO50_nPIOR) | 90 + GPIO_bit(GPIO51_nPIOW) | GPIO_bit(GPIO52_nPCE_1) | 91 + GPIO_bit(GPIO53_nPCE_2); 92 + 93 + pxa_gpio_mode(GPIO48_nPOE_MD); 94 + pxa_gpio_mode(GPIO49_nPWE_MD); 95 + pxa_gpio_mode(GPIO50_nPIOR_MD); 96 + pxa_gpio_mode(GPIO51_nPIOW_MD); 97 + pxa_gpio_mode(GPIO55_nPREG_MD); 98 + pxa_gpio_mode(GPIO56_nPWAIT_MD); 99 + pxa_gpio_mode(GPIO57_nIOIS16_MD); 100 + pxa_gpio_mode(GPIO52_nPCE_1_MD); 101 + pxa_gpio_mode(GPIO53_nPCE_2_MD); 102 + pxa_gpio_mode(GPIO54_pSKTSEL_MD); 103 + } 104 + 105 + static struct scoop_pcmcia_dev corgi_pcmcia_scoop[] = { 106 + { 107 + .dev = &corgiscoop_device.dev, 108 + .irq = CORGI_IRQ_GPIO_CF_IRQ, 109 + .cd_irq = CORGI_IRQ_GPIO_CF_CD, 110 + .cd_irq_str = "PCMCIA0 CD", 111 + }, 112 + }; 113 + 114 + static struct scoop_pcmcia_config corgi_pcmcia_config = { 115 + .devs = &corgi_pcmcia_scoop[0], 116 + .num_devs = 1, 117 + .pcmcia_init = corgi_pcmcia_init, 118 + }; 119 + 120 + EXPORT_SYMBOL(corgiscoop_device); 74 121 75 122 76 123 /* ··· 323 294 pxa_set_mci_info(&corgi_mci_platform_data); 324 295 pxa_set_ficp_info(&corgi_ficp_platform_data); 325 296 326 - scoop_num = 1; 327 - scoop_devs = &corgi_pcmcia_scoop[0]; 297 + platform_scoop_config = &corgi_pcmcia_config; 328 298 329 299 platform_add_devices(devices, ARRAY_SIZE(devices)); 330 300 }
+30 -2
arch/arm/mach-pxa/poodle.c
··· 65 65 .resource = poodle_scoop_resources, 66 66 }; 67 67 68 + static void poodle_pcmcia_init(void) 69 + { 70 + /* Setup default state of GPIO outputs 71 + before we enable them as outputs. */ 72 + GPSR(GPIO48_nPOE) = GPIO_bit(GPIO48_nPOE) | 73 + GPIO_bit(GPIO49_nPWE) | GPIO_bit(GPIO50_nPIOR) | 74 + GPIO_bit(GPIO51_nPIOW) | GPIO_bit(GPIO52_nPCE_1) | 75 + GPIO_bit(GPIO53_nPCE_2); 76 + 77 + pxa_gpio_mode(GPIO48_nPOE_MD); 78 + pxa_gpio_mode(GPIO49_nPWE_MD); 79 + pxa_gpio_mode(GPIO50_nPIOR_MD); 80 + pxa_gpio_mode(GPIO51_nPIOW_MD); 81 + pxa_gpio_mode(GPIO55_nPREG_MD); 82 + pxa_gpio_mode(GPIO56_nPWAIT_MD); 83 + pxa_gpio_mode(GPIO57_nIOIS16_MD); 84 + pxa_gpio_mode(GPIO52_nPCE_1_MD); 85 + pxa_gpio_mode(GPIO53_nPCE_2_MD); 86 + pxa_gpio_mode(GPIO54_pSKTSEL_MD); 87 + } 88 + 68 89 static struct scoop_pcmcia_dev poodle_pcmcia_scoop[] = { 69 90 { 70 91 .dev = &poodle_scoop_device.dev, ··· 94 73 .cd_irq_str = "PCMCIA0 CD", 95 74 }, 96 75 }; 76 + 77 + static struct scoop_pcmcia_config poodle_pcmcia_config = { 78 + .devs = &poodle_pcmcia_scoop[0], 79 + .num_devs = 1, 80 + .pcmcia_init = poodle_pcmcia_init, 81 + }; 82 + 83 + EXPORT_SYMBOL(poodle_scoop_device); 97 84 98 85 99 86 /* LoCoMo device */ ··· 297 268 pxa_set_mci_info(&poodle_mci_platform_data); 298 269 pxa_set_ficp_info(&poodle_ficp_platform_data); 299 270 300 - scoop_num = 1; 301 - scoop_devs = &poodle_pcmcia_scoop[0]; 271 + platform_scoop_config = &poodle_pcmcia_config; 302 272 303 273 ret = platform_add_devices(devices, ARRAY_SIZE(devices)); 304 274 if (ret) {
+76 -19
arch/arm/mach-pxa/spitz.c
··· 104 104 .resource = spitz_scoop2_resources, 105 105 }; 106 106 107 + #define SPITZ_PWR_SD 0x01 108 + #define SPITZ_PWR_CF 0x02 109 + 110 + /* Power control is shared with between one of the CF slots and SD */ 111 + static void spitz_card_pwr_ctrl(int device, unsigned short new_cpr) 112 + { 113 + unsigned short cpr = read_scoop_reg(&spitzscoop_device.dev, SCOOP_CPR); 114 + 115 + if (new_cpr & 0x0007) { 116 + set_scoop_gpio(&spitzscoop_device.dev, SPITZ_SCP_CF_POWER); 117 + if (!(cpr & 0x0002) && !(cpr & 0x0004)) 118 + mdelay(5); 119 + if (device == SPITZ_PWR_CF) 120 + cpr |= 0x0002; 121 + if (device == SPITZ_PWR_SD) 122 + cpr |= 0x0004; 123 + write_scoop_reg(&spitzscoop_device.dev, SCOOP_CPR, cpr | new_cpr); 124 + } else { 125 + if (device == SPITZ_PWR_CF) 126 + cpr &= ~0x0002; 127 + if (device == SPITZ_PWR_SD) 128 + cpr &= ~0x0004; 129 + write_scoop_reg(&spitzscoop_device.dev, SCOOP_CPR, cpr | new_cpr); 130 + if (!(cpr & 0x0002) && !(cpr & 0x0004)) { 131 + mdelay(1); 132 + reset_scoop_gpio(&spitzscoop_device.dev, SPITZ_SCP_CF_POWER); 133 + } 134 + } 135 + } 136 + 137 + static void spitz_pcmcia_init(void) 138 + { 139 + /* Setup default state of GPIO outputs 140 + before we enable them as outputs. */ 141 + GPSR(GPIO48_nPOE) = GPIO_bit(GPIO48_nPOE) | 142 + GPIO_bit(GPIO49_nPWE) | GPIO_bit(GPIO50_nPIOR) | 143 + GPIO_bit(GPIO51_nPIOW) | GPIO_bit(GPIO54_nPCE_2); 144 + GPSR(GPIO85_nPCE_1) = GPIO_bit(GPIO85_nPCE_1); 145 + 146 + pxa_gpio_mode(GPIO48_nPOE_MD); 147 + pxa_gpio_mode(GPIO49_nPWE_MD); 148 + pxa_gpio_mode(GPIO50_nPIOR_MD); 149 + pxa_gpio_mode(GPIO51_nPIOW_MD); 150 + pxa_gpio_mode(GPIO55_nPREG_MD); 151 + pxa_gpio_mode(GPIO56_nPWAIT_MD); 152 + pxa_gpio_mode(GPIO57_nIOIS16_MD); 153 + pxa_gpio_mode(GPIO85_nPCE_1_MD); 154 + pxa_gpio_mode(GPIO54_nPCE_2_MD); 155 + pxa_gpio_mode(GPIO104_pSKTSEL_MD); 156 + } 157 + 158 + static void spitz_pcmcia_pwr(struct device *scoop, unsigned short cpr, int nr) 159 + { 160 + /* Only need to override behaviour for slot 0 */ 161 + if (nr == 0) 162 + spitz_card_pwr_ctrl(SPITZ_PWR_CF, cpr); 163 + else 164 + write_scoop_reg(scoop, SCOOP_CPR, cpr); 165 + } 166 + 107 167 static struct scoop_pcmcia_dev spitz_pcmcia_scoop[] = { 108 168 { 109 169 .dev = &spitzscoop_device.dev, ··· 176 116 .cd_irq = -1, 177 117 }, 178 118 }; 119 + 120 + static struct scoop_pcmcia_config spitz_pcmcia_config = { 121 + .devs = &spitz_pcmcia_scoop[0], 122 + .num_devs = 2, 123 + .pcmcia_init = spitz_pcmcia_init, 124 + .power_ctrl = spitz_pcmcia_pwr, 125 + }; 126 + 127 + EXPORT_SYMBOL(spitzscoop_device); 128 + EXPORT_SYMBOL(spitzscoop2_device); 179 129 180 130 181 131 /* ··· 305 235 return 0; 306 236 } 307 237 308 - /* Power control is shared with one of the CF slots so we have a mess */ 309 238 static void spitz_mci_setpower(struct device *dev, unsigned int vdd) 310 239 { 311 240 struct pxamci_platform_data* p_d = dev->platform_data; 312 241 313 - unsigned short cpr = read_scoop_reg(&spitzscoop_device.dev, SCOOP_CPR); 314 - 315 - if (( 1 << vdd) & p_d->ocr_mask) { 316 - /* printk(KERN_DEBUG "%s: on\n", __FUNCTION__); */ 317 - set_scoop_gpio(&spitzscoop_device.dev, SPITZ_SCP_CF_POWER); 318 - mdelay(2); 319 - write_scoop_reg(&spitzscoop_device.dev, SCOOP_CPR, cpr | 0x04); 320 - } else { 321 - /* printk(KERN_DEBUG "%s: off\n", __FUNCTION__); */ 322 - write_scoop_reg(&spitzscoop_device.dev, SCOOP_CPR, cpr & ~0x04); 323 - 324 - if (!(cpr | 0x02)) { 325 - mdelay(1); 326 - reset_scoop_gpio(&spitzscoop_device.dev, SPITZ_SCP_CF_POWER); 327 - } 328 - } 242 + if (( 1 << vdd) & p_d->ocr_mask) 243 + spitz_card_pwr_ctrl(SPITZ_PWR_SD, 0x0004); 244 + else 245 + spitz_card_pwr_ctrl(SPITZ_PWR_SD, 0x0000); 329 246 } 330 247 331 248 static int spitz_mci_get_ro(struct device *dev) ··· 408 351 409 352 static void __init spitz_init(void) 410 353 { 411 - scoop_num = 2; 412 - scoop_devs = &spitz_pcmcia_scoop[0]; 354 + platform_scoop_config = &spitz_pcmcia_config; 355 + 413 356 spitz_bl_machinfo.set_bl_intensity = spitz_bl_set_intensity; 414 357 415 358 common_init();
+68 -72
drivers/pcmcia/pxa2xx_sharpsl.c
··· 22 22 #include <asm/hardware.h> 23 23 #include <asm/irq.h> 24 24 #include <asm/hardware/scoop.h> 25 - #ifdef CONFIG_SA1100_COLLIE 26 - #include <asm/arch-sa1100/collie.h> 27 - #else 28 - #include <asm/arch-pxa/pxa-regs.h> 29 - #endif 30 25 31 26 #include "soc_common.h" 32 27 33 28 #define NO_KEEP_VS 0x0001 29 + 30 + /* PCMCIA to Scoop linkage 31 + 32 + There is no easy way to link multiple scoop devices into one 33 + single entity for the pxa2xx_pcmcia device so this structure 34 + is used which is setup by the platform code 35 + */ 36 + struct scoop_pcmcia_config *platform_scoop_config; 37 + #define SCOOP_DEV platform_scoop_config->devs 34 38 35 39 static void sharpsl_pcmcia_init_reset(struct scoop_pcmcia_dev *scoopdev) 36 40 { ··· 47 43 { 48 44 int ret; 49 45 50 - #ifndef CONFIG_SA1100_COLLIE 51 - /* 52 - * Setup default state of GPIO outputs 53 - * before we enable them as outputs. 54 - */ 55 - GPSR(GPIO48_nPOE) = 56 - GPIO_bit(GPIO48_nPOE) | 57 - GPIO_bit(GPIO49_nPWE) | 58 - GPIO_bit(GPIO50_nPIOR) | 59 - GPIO_bit(GPIO51_nPIOW) | 60 - GPIO_bit(GPIO52_nPCE_1) | 61 - GPIO_bit(GPIO53_nPCE_2); 62 - 63 - pxa_gpio_mode(GPIO48_nPOE_MD); 64 - pxa_gpio_mode(GPIO49_nPWE_MD); 65 - pxa_gpio_mode(GPIO50_nPIOR_MD); 66 - pxa_gpio_mode(GPIO51_nPIOW_MD); 67 - pxa_gpio_mode(GPIO52_nPCE_1_MD); 68 - pxa_gpio_mode(GPIO53_nPCE_2_MD); 69 - pxa_gpio_mode(GPIO54_pSKTSEL_MD); 70 - pxa_gpio_mode(GPIO55_nPREG_MD); 71 - pxa_gpio_mode(GPIO56_nPWAIT_MD); 72 - pxa_gpio_mode(GPIO57_nIOIS16_MD); 73 - #endif 46 + if (platform_scoop_config->pcmcia_init) 47 + platform_scoop_config->pcmcia_init(); 74 48 75 49 /* Register interrupts */ 76 - if (scoop_devs[skt->nr].cd_irq >= 0) { 50 + if (SCOOP_DEV[skt->nr].cd_irq >= 0) { 77 51 struct pcmcia_irqs cd_irq; 78 52 79 53 cd_irq.sock = skt->nr; 80 - cd_irq.irq = scoop_devs[skt->nr].cd_irq; 81 - cd_irq.str = scoop_devs[skt->nr].cd_irq_str; 54 + cd_irq.irq = SCOOP_DEV[skt->nr].cd_irq; 55 + cd_irq.str = SCOOP_DEV[skt->nr].cd_irq_str; 82 56 ret = soc_pcmcia_request_irqs(skt, &cd_irq, 1); 83 57 84 58 if (ret) { ··· 65 83 } 66 84 } 67 85 68 - skt->irq = scoop_devs[skt->nr].irq; 86 + skt->irq = SCOOP_DEV[skt->nr].irq; 69 87 70 88 return 0; 71 89 } 72 90 73 91 static void sharpsl_pcmcia_hw_shutdown(struct soc_pcmcia_socket *skt) 74 92 { 75 - if (scoop_devs[skt->nr].cd_irq >= 0) { 93 + if (SCOOP_DEV[skt->nr].cd_irq >= 0) { 76 94 struct pcmcia_irqs cd_irq; 77 95 78 96 cd_irq.sock = skt->nr; 79 - cd_irq.irq = scoop_devs[skt->nr].cd_irq; 80 - cd_irq.str = scoop_devs[skt->nr].cd_irq_str; 97 + cd_irq.irq = SCOOP_DEV[skt->nr].cd_irq; 98 + cd_irq.str = SCOOP_DEV[skt->nr].cd_irq_str; 81 99 soc_pcmcia_free_irqs(skt, &cd_irq, 1); 82 100 } 83 101 } ··· 87 105 struct pcmcia_state *state) 88 106 { 89 107 unsigned short cpr, csr; 90 - struct device *scoop = scoop_devs[skt->nr].dev; 108 + struct device *scoop = SCOOP_DEV[skt->nr].dev; 91 109 92 - cpr = read_scoop_reg(scoop_devs[skt->nr].dev, SCOOP_CPR); 110 + cpr = read_scoop_reg(SCOOP_DEV[skt->nr].dev, SCOOP_CPR); 93 111 94 112 write_scoop_reg(scoop, SCOOP_IRM, 0x00FF); 95 113 write_scoop_reg(scoop, SCOOP_ISR, 0x0000); ··· 98 116 if (csr & 0x0004) { 99 117 /* card eject */ 100 118 write_scoop_reg(scoop, SCOOP_CDR, 0x0000); 101 - scoop_devs[skt->nr].keep_vs = NO_KEEP_VS; 119 + SCOOP_DEV[skt->nr].keep_vs = NO_KEEP_VS; 102 120 } 103 - else if (!(scoop_devs[skt->nr].keep_vs & NO_KEEP_VS)) { 121 + else if (!(SCOOP_DEV[skt->nr].keep_vs & NO_KEEP_VS)) { 104 122 /* keep vs1,vs2 */ 105 123 write_scoop_reg(scoop, SCOOP_CDR, 0x0000); 106 - csr |= scoop_devs[skt->nr].keep_vs; 124 + csr |= SCOOP_DEV[skt->nr].keep_vs; 107 125 } 108 126 else if (cpr & 0x0003) { 109 127 /* power on */ 110 128 write_scoop_reg(scoop, SCOOP_CDR, 0x0000); 111 - scoop_devs[skt->nr].keep_vs = (csr & 0x00C0); 129 + SCOOP_DEV[skt->nr].keep_vs = (csr & 0x00C0); 112 130 } 113 131 else { 114 132 /* card detect */ 115 - write_scoop_reg(scoop, SCOOP_CDR, 0x0002); 133 + if ((machine_is_spitz() || machine_is_borzoi()) && skt->nr == 1) { 134 + write_scoop_reg(scoop, SCOOP_CDR, 0x0000); 135 + } else { 136 + write_scoop_reg(scoop, SCOOP_CDR, 0x0002); 137 + } 116 138 } 117 139 118 140 state->detect = (csr & 0x0004) ? 0 : 1; ··· 130 144 if ((cpr & 0x0080) && ((cpr & 0x8040) != 0x8040)) { 131 145 printk(KERN_ERR "sharpsl_pcmcia_socket_state(): CPR=%04X, Low voltage!\n", cpr); 132 146 } 133 - 134 147 } 135 148 136 149 ··· 137 152 const socket_state_t *state) 138 153 { 139 154 unsigned long flags; 140 - struct device *scoop = scoop_devs[skt->nr].dev; 155 + struct device *scoop = SCOOP_DEV[skt->nr].dev; 141 156 142 157 unsigned short cpr, ncpr, ccr, nccr, mcr, nmcr, imr, nimr; 143 158 ··· 162 177 nccr = (ccr = read_scoop_reg(scoop, SCOOP_CCR)) & ~0x0080; 163 178 nimr = (imr = read_scoop_reg(scoop, SCOOP_IMR)) & ~0x003E; 164 179 165 - ncpr |= (state->Vcc == 33) ? 0x0001 : 166 - (state->Vcc == 50) ? 0x0002 : 0; 180 + if ((machine_is_spitz() || machine_is_borzoi() || machine_is_akita()) && skt->nr == 0) { 181 + ncpr |= (state->Vcc == 33) ? 0x0002 : 182 + (state->Vcc == 50) ? 0x0002 : 0; 183 + } else { 184 + ncpr |= (state->Vcc == 33) ? 0x0001 : 185 + (state->Vcc == 50) ? 0x0002 : 0; 186 + } 167 187 nmcr |= (state->flags&SS_IOCARD) ? 0x0010 : 0; 168 188 ncpr |= (state->flags&SS_OUTPUT_ENA) ? 0x0080 : 0; 169 189 nccr |= (state->flags&SS_RESET)? 0x0080: 0; ··· 180 190 ((skt->status&SS_WRPROT) ? 0x0008 : 0); 181 191 182 192 if (!(ncpr & 0x0003)) { 183 - scoop_devs[skt->nr].keep_rd = 0; 184 - } else if (!scoop_devs[skt->nr].keep_rd) { 193 + SCOOP_DEV[skt->nr].keep_rd = 0; 194 + } else if (!SCOOP_DEV[skt->nr].keep_rd) { 185 195 if (nccr & 0x0080) 186 - scoop_devs[skt->nr].keep_rd = 1; 196 + SCOOP_DEV[skt->nr].keep_rd = 1; 187 197 else 188 198 nccr |= 0x0080; 189 199 } 190 200 191 201 if (mcr != nmcr) 192 202 write_scoop_reg(scoop, SCOOP_MCR, nmcr); 193 - if (cpr != ncpr) 194 - write_scoop_reg(scoop, SCOOP_CPR, ncpr); 203 + if (cpr != ncpr) { 204 + if (platform_scoop_config->power_ctrl) 205 + platform_scoop_config->power_ctrl(scoop, ncpr , skt->nr); 206 + else 207 + write_scoop_reg(scoop, SCOOP_CPR, ncpr); 208 + } 195 209 if (ccr != nccr) 196 210 write_scoop_reg(scoop, SCOOP_CCR, nccr); 197 211 if (imr != nimr) ··· 208 214 209 215 static void sharpsl_pcmcia_socket_init(struct soc_pcmcia_socket *skt) 210 216 { 211 - sharpsl_pcmcia_init_reset(&scoop_devs[skt->nr]); 217 + sharpsl_pcmcia_init_reset(&SCOOP_DEV[skt->nr]); 212 218 213 219 /* Enable interrupt */ 214 - write_scoop_reg(scoop_devs[skt->nr].dev, SCOOP_IMR, 0x00C0); 215 - write_scoop_reg(scoop_devs[skt->nr].dev, SCOOP_MCR, 0x0101); 216 - scoop_devs[skt->nr].keep_vs = NO_KEEP_VS; 220 + write_scoop_reg(SCOOP_DEV[skt->nr].dev, SCOOP_IMR, 0x00C0); 221 + write_scoop_reg(SCOOP_DEV[skt->nr].dev, SCOOP_MCR, 0x0101); 222 + SCOOP_DEV[skt->nr].keep_vs = NO_KEEP_VS; 217 223 218 224 if (machine_is_collie()) 219 225 /* We need to disable SS_OUTPUT_ENA here. */ 220 - write_scoop_reg(scoop_devs[skt->nr].dev, SCOOP_CPR, read_scoop_reg(scoop_devs[skt->nr].dev, SCOOP_CPR) & ~0x0080); 226 + write_scoop_reg(SCOOP_DEV[skt->nr].dev, SCOOP_CPR, read_scoop_reg(SCOOP_DEV[skt->nr].dev, SCOOP_CPR) & ~0x0080); 221 227 } 222 228 223 229 static void sharpsl_pcmcia_socket_suspend(struct soc_pcmcia_socket *skt) 224 230 { 225 231 /* CF_BUS_OFF */ 226 - sharpsl_pcmcia_init_reset(&scoop_devs[skt->nr]); 232 + sharpsl_pcmcia_init_reset(&SCOOP_DEV[skt->nr]); 227 233 228 234 if (machine_is_collie()) 229 235 /* We need to disable SS_OUTPUT_ENA here. */ 230 - write_scoop_reg(scoop_devs[skt->nr].dev, SCOOP_CPR, read_scoop_reg(scoop_devs[skt->nr].dev, SCOOP_CPR) & ~0x0080); 236 + write_scoop_reg(SCOOP_DEV[skt->nr].dev, SCOOP_CPR, read_scoop_reg(SCOOP_DEV[skt->nr].dev, SCOOP_CPR) & ~0x0080); 231 237 } 232 238 233 239 static struct pcmcia_low_level sharpsl_pcmcia_ops = { 234 - .owner = THIS_MODULE, 235 - .hw_init = sharpsl_pcmcia_hw_init, 236 - .hw_shutdown = sharpsl_pcmcia_hw_shutdown, 237 - .socket_state = sharpsl_pcmcia_socket_state, 238 - .configure_socket = sharpsl_pcmcia_configure_socket, 239 - .socket_init = sharpsl_pcmcia_socket_init, 240 - .socket_suspend = sharpsl_pcmcia_socket_suspend, 241 - .first = 0, 242 - .nr = 0, 240 + .owner = THIS_MODULE, 241 + .hw_init = sharpsl_pcmcia_hw_init, 242 + .hw_shutdown = sharpsl_pcmcia_hw_shutdown, 243 + .socket_state = sharpsl_pcmcia_socket_state, 244 + .configure_socket = sharpsl_pcmcia_configure_socket, 245 + .socket_init = sharpsl_pcmcia_socket_init, 246 + .socket_suspend = sharpsl_pcmcia_socket_suspend, 247 + .first = 0, 248 + .nr = 0, 243 249 }; 244 250 245 - static struct platform_device *sharpsl_pcmcia_device; 246 - 247 251 #ifdef CONFIG_SA1100_COLLIE 252 + #include "sa11xx_base.h" 253 + 248 254 int __init pcmcia_collie_init(struct device *dev) 249 255 { 250 256 int ret = -ENODEV; ··· 257 263 258 264 #else 259 265 266 + static struct platform_device *sharpsl_pcmcia_device; 267 + 260 268 static int __init sharpsl_pcmcia_init(void) 261 269 { 262 270 int ret; 263 271 264 - sharpsl_pcmcia_ops.nr=scoop_num; 272 + sharpsl_pcmcia_ops.nr=platform_scoop_config->num_devs; 265 273 sharpsl_pcmcia_device = kmalloc(sizeof(*sharpsl_pcmcia_device), GFP_KERNEL); 266 274 if (!sharpsl_pcmcia_device) 267 275 return -ENOMEM; ··· 271 275 memset(sharpsl_pcmcia_device, 0, sizeof(*sharpsl_pcmcia_device)); 272 276 sharpsl_pcmcia_device->name = "pxa2xx-pcmcia"; 273 277 sharpsl_pcmcia_device->dev.platform_data = &sharpsl_pcmcia_ops; 274 - sharpsl_pcmcia_device->dev.parent=scoop_devs[0].dev; 278 + sharpsl_pcmcia_device->dev.parent=platform_scoop_config->devs[0].dev; 275 279 276 280 ret = platform_device_register(sharpsl_pcmcia_device); 277 281 if (ret)
+8 -2
include/asm-arm/hardware/scoop.h
··· 52 52 unsigned char keep_rd; 53 53 }; 54 54 55 - extern int scoop_num; 56 - extern struct scoop_pcmcia_dev *scoop_devs; 55 + struct scoop_pcmcia_config { 56 + struct scoop_pcmcia_dev *devs; 57 + int num_devs; 58 + void (*pcmcia_init)(void); 59 + void (*power_ctrl)(struct device *scoop, unsigned short cpr, int nr); 60 + }; 61 + 62 + extern struct scoop_pcmcia_config *platform_scoop_config; 57 63 58 64 void reset_scoop(struct device *dev); 59 65 unsigned short set_scoop_gpio(struct device *dev, unsigned short bit);