Commit b34e7b4f05730e6f26e9d8d3736271b0e4cdeac2
Committed by
Eric Miao
1 parent
4c738b2568
Exists in
master
and in
6 other branches
ARM: scoop: drop pcmcia_init callback
A pcmcia_init callback isn't used on any of the platforms. Drop it. Signed-off-by: Dmitry Eremin-Solenikov <dbaryshkov@gmail.com> Signed-off-by: Eric Miao <eric.y.miao@gmail.com>
Showing 2 changed files with 0 additions and 4 deletions Inline Diff
arch/arm/include/asm/hardware/scoop.h
1 | /* | 1 | /* |
2 | * Definitions for the SCOOP interface found on various Sharp PDAs | 2 | * Definitions for the SCOOP interface found on various Sharp PDAs |
3 | * | 3 | * |
4 | * Copyright (c) 2004 Richard Purdie | 4 | * Copyright (c) 2004 Richard Purdie |
5 | * | 5 | * |
6 | * This program is free software; you can redistribute it and/or modify | 6 | * This program is free software; you can redistribute it and/or modify |
7 | * it under the terms of the GNU General Public License version 2 as | 7 | * it under the terms of the GNU General Public License version 2 as |
8 | * published by the Free Software Foundation. | 8 | * published by the Free Software Foundation. |
9 | * | 9 | * |
10 | */ | 10 | */ |
11 | 11 | ||
12 | #define SCOOP_MCR 0x00 | 12 | #define SCOOP_MCR 0x00 |
13 | #define SCOOP_CDR 0x04 | 13 | #define SCOOP_CDR 0x04 |
14 | #define SCOOP_CSR 0x08 | 14 | #define SCOOP_CSR 0x08 |
15 | #define SCOOP_CPR 0x0C | 15 | #define SCOOP_CPR 0x0C |
16 | #define SCOOP_CCR 0x10 | 16 | #define SCOOP_CCR 0x10 |
17 | #define SCOOP_IRR 0x14 | 17 | #define SCOOP_IRR 0x14 |
18 | #define SCOOP_IRM 0x14 | 18 | #define SCOOP_IRM 0x14 |
19 | #define SCOOP_IMR 0x18 | 19 | #define SCOOP_IMR 0x18 |
20 | #define SCOOP_ISR 0x1C | 20 | #define SCOOP_ISR 0x1C |
21 | #define SCOOP_GPCR 0x20 | 21 | #define SCOOP_GPCR 0x20 |
22 | #define SCOOP_GPWR 0x24 | 22 | #define SCOOP_GPWR 0x24 |
23 | #define SCOOP_GPRR 0x28 | 23 | #define SCOOP_GPRR 0x28 |
24 | 24 | ||
25 | #define SCOOP_CPR_OUT (1 << 7) | 25 | #define SCOOP_CPR_OUT (1 << 7) |
26 | #define SCOOP_CPR_SD_3V (1 << 2) | 26 | #define SCOOP_CPR_SD_3V (1 << 2) |
27 | #define SCOOP_CPR_CF_XV (1 << 1) | 27 | #define SCOOP_CPR_CF_XV (1 << 1) |
28 | #define SCOOP_CPR_CF_3V (1 << 0) | 28 | #define SCOOP_CPR_CF_3V (1 << 0) |
29 | 29 | ||
30 | #define SCOOP_GPCR_PA22 (1 << 12) | 30 | #define SCOOP_GPCR_PA22 (1 << 12) |
31 | #define SCOOP_GPCR_PA21 (1 << 11) | 31 | #define SCOOP_GPCR_PA21 (1 << 11) |
32 | #define SCOOP_GPCR_PA20 (1 << 10) | 32 | #define SCOOP_GPCR_PA20 (1 << 10) |
33 | #define SCOOP_GPCR_PA19 (1 << 9) | 33 | #define SCOOP_GPCR_PA19 (1 << 9) |
34 | #define SCOOP_GPCR_PA18 (1 << 8) | 34 | #define SCOOP_GPCR_PA18 (1 << 8) |
35 | #define SCOOP_GPCR_PA17 (1 << 7) | 35 | #define SCOOP_GPCR_PA17 (1 << 7) |
36 | #define SCOOP_GPCR_PA16 (1 << 6) | 36 | #define SCOOP_GPCR_PA16 (1 << 6) |
37 | #define SCOOP_GPCR_PA15 (1 << 5) | 37 | #define SCOOP_GPCR_PA15 (1 << 5) |
38 | #define SCOOP_GPCR_PA14 (1 << 4) | 38 | #define SCOOP_GPCR_PA14 (1 << 4) |
39 | #define SCOOP_GPCR_PA13 (1 << 3) | 39 | #define SCOOP_GPCR_PA13 (1 << 3) |
40 | #define SCOOP_GPCR_PA12 (1 << 2) | 40 | #define SCOOP_GPCR_PA12 (1 << 2) |
41 | #define SCOOP_GPCR_PA11 (1 << 1) | 41 | #define SCOOP_GPCR_PA11 (1 << 1) |
42 | 42 | ||
43 | struct scoop_config { | 43 | struct scoop_config { |
44 | unsigned short io_out; | 44 | unsigned short io_out; |
45 | unsigned short io_dir; | 45 | unsigned short io_dir; |
46 | unsigned short suspend_clr; | 46 | unsigned short suspend_clr; |
47 | unsigned short suspend_set; | 47 | unsigned short suspend_set; |
48 | int gpio_base; | 48 | int gpio_base; |
49 | }; | 49 | }; |
50 | 50 | ||
51 | /* Structure for linking scoop devices to PCMCIA sockets */ | 51 | /* Structure for linking scoop devices to PCMCIA sockets */ |
52 | struct scoop_pcmcia_dev { | 52 | struct scoop_pcmcia_dev { |
53 | struct device *dev; /* Pointer to this socket's scoop device */ | 53 | struct device *dev; /* Pointer to this socket's scoop device */ |
54 | int irq; /* irq for socket */ | 54 | int irq; /* irq for socket */ |
55 | int cd_irq; | 55 | int cd_irq; |
56 | const char *cd_irq_str; | 56 | const char *cd_irq_str; |
57 | unsigned char keep_vs; | 57 | unsigned char keep_vs; |
58 | unsigned char keep_rd; | 58 | unsigned char keep_rd; |
59 | }; | 59 | }; |
60 | 60 | ||
61 | struct scoop_pcmcia_config { | 61 | struct scoop_pcmcia_config { |
62 | struct scoop_pcmcia_dev *devs; | 62 | struct scoop_pcmcia_dev *devs; |
63 | int num_devs; | 63 | int num_devs; |
64 | void (*pcmcia_init)(void); | ||
65 | void (*power_ctrl)(struct device *scoop, unsigned short cpr, int nr); | 64 | void (*power_ctrl)(struct device *scoop, unsigned short cpr, int nr); |
66 | }; | 65 | }; |
67 | 66 | ||
68 | extern struct scoop_pcmcia_config *platform_scoop_config; | 67 | extern struct scoop_pcmcia_config *platform_scoop_config; |
69 | 68 | ||
70 | void reset_scoop(struct device *dev); | 69 | void reset_scoop(struct device *dev); |
71 | unsigned short read_scoop_reg(struct device *dev, unsigned short reg); | 70 | unsigned short read_scoop_reg(struct device *dev, unsigned short reg); |
72 | void write_scoop_reg(struct device *dev, unsigned short reg, unsigned short data); | 71 | void write_scoop_reg(struct device *dev, unsigned short reg, unsigned short data); |
73 | 72 |
drivers/pcmcia/pxa2xx_sharpsl.c
1 | /* | 1 | /* |
2 | * Sharp SL-C7xx Series PCMCIA routines | 2 | * Sharp SL-C7xx Series PCMCIA routines |
3 | * | 3 | * |
4 | * Copyright (c) 2004-2005 Richard Purdie | 4 | * Copyright (c) 2004-2005 Richard Purdie |
5 | * | 5 | * |
6 | * Based on Sharp's 2.4 kernel patches and pxa2xx_mainstone.c | 6 | * Based on Sharp's 2.4 kernel patches and pxa2xx_mainstone.c |
7 | * | 7 | * |
8 | * This program is free software; you can redistribute it and/or modify | 8 | * This program is free software; you can redistribute it and/or modify |
9 | * it under the terms of the GNU General Public License version 2 as | 9 | * it under the terms of the GNU General Public License version 2 as |
10 | * published by the Free Software Foundation. | 10 | * published by the Free Software Foundation. |
11 | * | 11 | * |
12 | */ | 12 | */ |
13 | 13 | ||
14 | #include <linux/module.h> | 14 | #include <linux/module.h> |
15 | #include <linux/init.h> | 15 | #include <linux/init.h> |
16 | #include <linux/kernel.h> | 16 | #include <linux/kernel.h> |
17 | #include <linux/errno.h> | 17 | #include <linux/errno.h> |
18 | #include <linux/interrupt.h> | 18 | #include <linux/interrupt.h> |
19 | #include <linux/platform_device.h> | 19 | #include <linux/platform_device.h> |
20 | 20 | ||
21 | #include <asm/mach-types.h> | 21 | #include <asm/mach-types.h> |
22 | #include <mach/hardware.h> | 22 | #include <mach/hardware.h> |
23 | #include <asm/irq.h> | 23 | #include <asm/irq.h> |
24 | #include <asm/hardware/scoop.h> | 24 | #include <asm/hardware/scoop.h> |
25 | 25 | ||
26 | #include "soc_common.h" | 26 | #include "soc_common.h" |
27 | 27 | ||
28 | #define NO_KEEP_VS 0x0001 | 28 | #define NO_KEEP_VS 0x0001 |
29 | #define SCOOP_DEV platform_scoop_config->devs | 29 | #define SCOOP_DEV platform_scoop_config->devs |
30 | 30 | ||
31 | static void sharpsl_pcmcia_init_reset(struct soc_pcmcia_socket *skt) | 31 | static void sharpsl_pcmcia_init_reset(struct soc_pcmcia_socket *skt) |
32 | { | 32 | { |
33 | struct scoop_pcmcia_dev *scoopdev = &SCOOP_DEV[skt->nr]; | 33 | struct scoop_pcmcia_dev *scoopdev = &SCOOP_DEV[skt->nr]; |
34 | 34 | ||
35 | reset_scoop(scoopdev->dev); | 35 | reset_scoop(scoopdev->dev); |
36 | 36 | ||
37 | /* Shared power controls need to be handled carefully */ | 37 | /* Shared power controls need to be handled carefully */ |
38 | if (platform_scoop_config->power_ctrl) | 38 | if (platform_scoop_config->power_ctrl) |
39 | platform_scoop_config->power_ctrl(scoopdev->dev, 0x0000, skt->nr); | 39 | platform_scoop_config->power_ctrl(scoopdev->dev, 0x0000, skt->nr); |
40 | else | 40 | else |
41 | write_scoop_reg(scoopdev->dev, SCOOP_CPR, 0x0000); | 41 | write_scoop_reg(scoopdev->dev, SCOOP_CPR, 0x0000); |
42 | 42 | ||
43 | scoopdev->keep_vs = NO_KEEP_VS; | 43 | scoopdev->keep_vs = NO_KEEP_VS; |
44 | scoopdev->keep_rd = 0; | 44 | scoopdev->keep_rd = 0; |
45 | } | 45 | } |
46 | 46 | ||
47 | static int sharpsl_pcmcia_hw_init(struct soc_pcmcia_socket *skt) | 47 | static int sharpsl_pcmcia_hw_init(struct soc_pcmcia_socket *skt) |
48 | { | 48 | { |
49 | int ret; | 49 | int ret; |
50 | 50 | ||
51 | if (platform_scoop_config->pcmcia_init) | ||
52 | platform_scoop_config->pcmcia_init(); | ||
53 | |||
54 | /* Register interrupts */ | 51 | /* Register interrupts */ |
55 | if (SCOOP_DEV[skt->nr].cd_irq >= 0) { | 52 | if (SCOOP_DEV[skt->nr].cd_irq >= 0) { |
56 | struct pcmcia_irqs cd_irq; | 53 | struct pcmcia_irqs cd_irq; |
57 | 54 | ||
58 | cd_irq.sock = skt->nr; | 55 | cd_irq.sock = skt->nr; |
59 | cd_irq.irq = SCOOP_DEV[skt->nr].cd_irq; | 56 | cd_irq.irq = SCOOP_DEV[skt->nr].cd_irq; |
60 | cd_irq.str = SCOOP_DEV[skt->nr].cd_irq_str; | 57 | cd_irq.str = SCOOP_DEV[skt->nr].cd_irq_str; |
61 | ret = soc_pcmcia_request_irqs(skt, &cd_irq, 1); | 58 | ret = soc_pcmcia_request_irqs(skt, &cd_irq, 1); |
62 | 59 | ||
63 | if (ret) { | 60 | if (ret) { |
64 | printk(KERN_ERR "Request for Compact Flash IRQ failed\n"); | 61 | printk(KERN_ERR "Request for Compact Flash IRQ failed\n"); |
65 | return ret; | 62 | return ret; |
66 | } | 63 | } |
67 | } | 64 | } |
68 | 65 | ||
69 | skt->socket.pci_irq = SCOOP_DEV[skt->nr].irq; | 66 | skt->socket.pci_irq = SCOOP_DEV[skt->nr].irq; |
70 | 67 | ||
71 | return 0; | 68 | return 0; |
72 | } | 69 | } |
73 | 70 | ||
74 | static void sharpsl_pcmcia_hw_shutdown(struct soc_pcmcia_socket *skt) | 71 | static void sharpsl_pcmcia_hw_shutdown(struct soc_pcmcia_socket *skt) |
75 | { | 72 | { |
76 | if (SCOOP_DEV[skt->nr].cd_irq >= 0) { | 73 | if (SCOOP_DEV[skt->nr].cd_irq >= 0) { |
77 | struct pcmcia_irqs cd_irq; | 74 | struct pcmcia_irqs cd_irq; |
78 | 75 | ||
79 | cd_irq.sock = skt->nr; | 76 | cd_irq.sock = skt->nr; |
80 | cd_irq.irq = SCOOP_DEV[skt->nr].cd_irq; | 77 | cd_irq.irq = SCOOP_DEV[skt->nr].cd_irq; |
81 | cd_irq.str = SCOOP_DEV[skt->nr].cd_irq_str; | 78 | cd_irq.str = SCOOP_DEV[skt->nr].cd_irq_str; |
82 | soc_pcmcia_free_irqs(skt, &cd_irq, 1); | 79 | soc_pcmcia_free_irqs(skt, &cd_irq, 1); |
83 | } | 80 | } |
84 | } | 81 | } |
85 | 82 | ||
86 | 83 | ||
87 | static void sharpsl_pcmcia_socket_state(struct soc_pcmcia_socket *skt, | 84 | static void sharpsl_pcmcia_socket_state(struct soc_pcmcia_socket *skt, |
88 | struct pcmcia_state *state) | 85 | struct pcmcia_state *state) |
89 | { | 86 | { |
90 | unsigned short cpr, csr; | 87 | unsigned short cpr, csr; |
91 | struct device *scoop = SCOOP_DEV[skt->nr].dev; | 88 | struct device *scoop = SCOOP_DEV[skt->nr].dev; |
92 | 89 | ||
93 | cpr = read_scoop_reg(SCOOP_DEV[skt->nr].dev, SCOOP_CPR); | 90 | cpr = read_scoop_reg(SCOOP_DEV[skt->nr].dev, SCOOP_CPR); |
94 | 91 | ||
95 | write_scoop_reg(scoop, SCOOP_IRM, 0x00FF); | 92 | write_scoop_reg(scoop, SCOOP_IRM, 0x00FF); |
96 | write_scoop_reg(scoop, SCOOP_ISR, 0x0000); | 93 | write_scoop_reg(scoop, SCOOP_ISR, 0x0000); |
97 | write_scoop_reg(scoop, SCOOP_IRM, 0x0000); | 94 | write_scoop_reg(scoop, SCOOP_IRM, 0x0000); |
98 | csr = read_scoop_reg(scoop, SCOOP_CSR); | 95 | csr = read_scoop_reg(scoop, SCOOP_CSR); |
99 | if (csr & 0x0004) { | 96 | if (csr & 0x0004) { |
100 | /* card eject */ | 97 | /* card eject */ |
101 | write_scoop_reg(scoop, SCOOP_CDR, 0x0000); | 98 | write_scoop_reg(scoop, SCOOP_CDR, 0x0000); |
102 | SCOOP_DEV[skt->nr].keep_vs = NO_KEEP_VS; | 99 | SCOOP_DEV[skt->nr].keep_vs = NO_KEEP_VS; |
103 | } | 100 | } |
104 | else if (!(SCOOP_DEV[skt->nr].keep_vs & NO_KEEP_VS)) { | 101 | else if (!(SCOOP_DEV[skt->nr].keep_vs & NO_KEEP_VS)) { |
105 | /* keep vs1,vs2 */ | 102 | /* keep vs1,vs2 */ |
106 | write_scoop_reg(scoop, SCOOP_CDR, 0x0000); | 103 | write_scoop_reg(scoop, SCOOP_CDR, 0x0000); |
107 | csr |= SCOOP_DEV[skt->nr].keep_vs; | 104 | csr |= SCOOP_DEV[skt->nr].keep_vs; |
108 | } | 105 | } |
109 | else if (cpr & 0x0003) { | 106 | else if (cpr & 0x0003) { |
110 | /* power on */ | 107 | /* power on */ |
111 | write_scoop_reg(scoop, SCOOP_CDR, 0x0000); | 108 | write_scoop_reg(scoop, SCOOP_CDR, 0x0000); |
112 | SCOOP_DEV[skt->nr].keep_vs = (csr & 0x00C0); | 109 | SCOOP_DEV[skt->nr].keep_vs = (csr & 0x00C0); |
113 | } | 110 | } |
114 | else { | 111 | else { |
115 | /* card detect */ | 112 | /* card detect */ |
116 | if ((machine_is_spitz() || machine_is_borzoi()) && skt->nr == 1) { | 113 | if ((machine_is_spitz() || machine_is_borzoi()) && skt->nr == 1) { |
117 | write_scoop_reg(scoop, SCOOP_CDR, 0x0000); | 114 | write_scoop_reg(scoop, SCOOP_CDR, 0x0000); |
118 | } else { | 115 | } else { |
119 | write_scoop_reg(scoop, SCOOP_CDR, 0x0002); | 116 | write_scoop_reg(scoop, SCOOP_CDR, 0x0002); |
120 | } | 117 | } |
121 | } | 118 | } |
122 | 119 | ||
123 | state->detect = (csr & 0x0004) ? 0 : 1; | 120 | state->detect = (csr & 0x0004) ? 0 : 1; |
124 | state->ready = (csr & 0x0002) ? 1 : 0; | 121 | state->ready = (csr & 0x0002) ? 1 : 0; |
125 | state->bvd1 = (csr & 0x0010) ? 1 : 0; | 122 | state->bvd1 = (csr & 0x0010) ? 1 : 0; |
126 | state->bvd2 = (csr & 0x0020) ? 1 : 0; | 123 | state->bvd2 = (csr & 0x0020) ? 1 : 0; |
127 | state->wrprot = (csr & 0x0008) ? 1 : 0; | 124 | state->wrprot = (csr & 0x0008) ? 1 : 0; |
128 | state->vs_3v = (csr & 0x0040) ? 0 : 1; | 125 | state->vs_3v = (csr & 0x0040) ? 0 : 1; |
129 | state->vs_Xv = (csr & 0x0080) ? 0 : 1; | 126 | state->vs_Xv = (csr & 0x0080) ? 0 : 1; |
130 | 127 | ||
131 | if ((cpr & 0x0080) && ((cpr & 0x8040) != 0x8040)) { | 128 | if ((cpr & 0x0080) && ((cpr & 0x8040) != 0x8040)) { |
132 | printk(KERN_ERR "sharpsl_pcmcia_socket_state(): CPR=%04X, Low voltage!\n", cpr); | 129 | printk(KERN_ERR "sharpsl_pcmcia_socket_state(): CPR=%04X, Low voltage!\n", cpr); |
133 | } | 130 | } |
134 | } | 131 | } |
135 | 132 | ||
136 | 133 | ||
137 | static int sharpsl_pcmcia_configure_socket(struct soc_pcmcia_socket *skt, | 134 | static int sharpsl_pcmcia_configure_socket(struct soc_pcmcia_socket *skt, |
138 | const socket_state_t *state) | 135 | const socket_state_t *state) |
139 | { | 136 | { |
140 | unsigned long flags; | 137 | unsigned long flags; |
141 | struct device *scoop = SCOOP_DEV[skt->nr].dev; | 138 | struct device *scoop = SCOOP_DEV[skt->nr].dev; |
142 | 139 | ||
143 | unsigned short cpr, ncpr, ccr, nccr, mcr, nmcr, imr, nimr; | 140 | unsigned short cpr, ncpr, ccr, nccr, mcr, nmcr, imr, nimr; |
144 | 141 | ||
145 | switch (state->Vcc) { | 142 | switch (state->Vcc) { |
146 | case 0: break; | 143 | case 0: break; |
147 | case 33: break; | 144 | case 33: break; |
148 | case 50: break; | 145 | case 50: break; |
149 | default: | 146 | default: |
150 | printk(KERN_ERR "sharpsl_pcmcia_configure_socket(): bad Vcc %u\n", state->Vcc); | 147 | printk(KERN_ERR "sharpsl_pcmcia_configure_socket(): bad Vcc %u\n", state->Vcc); |
151 | return -1; | 148 | return -1; |
152 | } | 149 | } |
153 | 150 | ||
154 | if ((state->Vpp!=state->Vcc) && (state->Vpp!=0)) { | 151 | if ((state->Vpp!=state->Vcc) && (state->Vpp!=0)) { |
155 | printk(KERN_ERR "CF slot cannot support Vpp %u\n", state->Vpp); | 152 | printk(KERN_ERR "CF slot cannot support Vpp %u\n", state->Vpp); |
156 | return -1; | 153 | return -1; |
157 | } | 154 | } |
158 | 155 | ||
159 | local_irq_save(flags); | 156 | local_irq_save(flags); |
160 | 157 | ||
161 | nmcr = (mcr = read_scoop_reg(scoop, SCOOP_MCR)) & ~0x0010; | 158 | nmcr = (mcr = read_scoop_reg(scoop, SCOOP_MCR)) & ~0x0010; |
162 | ncpr = (cpr = read_scoop_reg(scoop, SCOOP_CPR)) & ~0x0083; | 159 | ncpr = (cpr = read_scoop_reg(scoop, SCOOP_CPR)) & ~0x0083; |
163 | nccr = (ccr = read_scoop_reg(scoop, SCOOP_CCR)) & ~0x0080; | 160 | nccr = (ccr = read_scoop_reg(scoop, SCOOP_CCR)) & ~0x0080; |
164 | nimr = (imr = read_scoop_reg(scoop, SCOOP_IMR)) & ~0x003E; | 161 | nimr = (imr = read_scoop_reg(scoop, SCOOP_IMR)) & ~0x003E; |
165 | 162 | ||
166 | if ((machine_is_spitz() || machine_is_borzoi() || machine_is_akita()) && skt->nr == 0) { | 163 | if ((machine_is_spitz() || machine_is_borzoi() || machine_is_akita()) && skt->nr == 0) { |
167 | ncpr |= (state->Vcc == 33) ? 0x0002 : | 164 | ncpr |= (state->Vcc == 33) ? 0x0002 : |
168 | (state->Vcc == 50) ? 0x0002 : 0; | 165 | (state->Vcc == 50) ? 0x0002 : 0; |
169 | } else { | 166 | } else { |
170 | ncpr |= (state->Vcc == 33) ? 0x0001 : | 167 | ncpr |= (state->Vcc == 33) ? 0x0001 : |
171 | (state->Vcc == 50) ? 0x0002 : 0; | 168 | (state->Vcc == 50) ? 0x0002 : 0; |
172 | } | 169 | } |
173 | nmcr |= (state->flags&SS_IOCARD) ? 0x0010 : 0; | 170 | nmcr |= (state->flags&SS_IOCARD) ? 0x0010 : 0; |
174 | ncpr |= (state->flags&SS_OUTPUT_ENA) ? 0x0080 : 0; | 171 | ncpr |= (state->flags&SS_OUTPUT_ENA) ? 0x0080 : 0; |
175 | nccr |= (state->flags&SS_RESET)? 0x0080: 0; | 172 | nccr |= (state->flags&SS_RESET)? 0x0080: 0; |
176 | nimr |= ((skt->status&SS_DETECT) ? 0x0004 : 0)| | 173 | nimr |= ((skt->status&SS_DETECT) ? 0x0004 : 0)| |
177 | ((skt->status&SS_READY) ? 0x0002 : 0)| | 174 | ((skt->status&SS_READY) ? 0x0002 : 0)| |
178 | ((skt->status&SS_BATDEAD)? 0x0010 : 0)| | 175 | ((skt->status&SS_BATDEAD)? 0x0010 : 0)| |
179 | ((skt->status&SS_BATWARN)? 0x0020 : 0)| | 176 | ((skt->status&SS_BATWARN)? 0x0020 : 0)| |
180 | ((skt->status&SS_STSCHG) ? 0x0010 : 0)| | 177 | ((skt->status&SS_STSCHG) ? 0x0010 : 0)| |
181 | ((skt->status&SS_WRPROT) ? 0x0008 : 0); | 178 | ((skt->status&SS_WRPROT) ? 0x0008 : 0); |
182 | 179 | ||
183 | if (!(ncpr & 0x0003)) { | 180 | if (!(ncpr & 0x0003)) { |
184 | SCOOP_DEV[skt->nr].keep_rd = 0; | 181 | SCOOP_DEV[skt->nr].keep_rd = 0; |
185 | } else if (!SCOOP_DEV[skt->nr].keep_rd) { | 182 | } else if (!SCOOP_DEV[skt->nr].keep_rd) { |
186 | if (nccr & 0x0080) | 183 | if (nccr & 0x0080) |
187 | SCOOP_DEV[skt->nr].keep_rd = 1; | 184 | SCOOP_DEV[skt->nr].keep_rd = 1; |
188 | else | 185 | else |
189 | nccr |= 0x0080; | 186 | nccr |= 0x0080; |
190 | } | 187 | } |
191 | 188 | ||
192 | if (mcr != nmcr) | 189 | if (mcr != nmcr) |
193 | write_scoop_reg(scoop, SCOOP_MCR, nmcr); | 190 | write_scoop_reg(scoop, SCOOP_MCR, nmcr); |
194 | if (cpr != ncpr) { | 191 | if (cpr != ncpr) { |
195 | if (platform_scoop_config->power_ctrl) | 192 | if (platform_scoop_config->power_ctrl) |
196 | platform_scoop_config->power_ctrl(scoop, ncpr , skt->nr); | 193 | platform_scoop_config->power_ctrl(scoop, ncpr , skt->nr); |
197 | else | 194 | else |
198 | write_scoop_reg(scoop, SCOOP_CPR, ncpr); | 195 | write_scoop_reg(scoop, SCOOP_CPR, ncpr); |
199 | } | 196 | } |
200 | if (ccr != nccr) | 197 | if (ccr != nccr) |
201 | write_scoop_reg(scoop, SCOOP_CCR, nccr); | 198 | write_scoop_reg(scoop, SCOOP_CCR, nccr); |
202 | if (imr != nimr) | 199 | if (imr != nimr) |
203 | write_scoop_reg(scoop, SCOOP_IMR, nimr); | 200 | write_scoop_reg(scoop, SCOOP_IMR, nimr); |
204 | 201 | ||
205 | local_irq_restore(flags); | 202 | local_irq_restore(flags); |
206 | 203 | ||
207 | return 0; | 204 | return 0; |
208 | } | 205 | } |
209 | 206 | ||
210 | static void sharpsl_pcmcia_socket_init(struct soc_pcmcia_socket *skt) | 207 | static void sharpsl_pcmcia_socket_init(struct soc_pcmcia_socket *skt) |
211 | { | 208 | { |
212 | sharpsl_pcmcia_init_reset(skt); | 209 | sharpsl_pcmcia_init_reset(skt); |
213 | 210 | ||
214 | /* Enable interrupt */ | 211 | /* Enable interrupt */ |
215 | write_scoop_reg(SCOOP_DEV[skt->nr].dev, SCOOP_IMR, 0x00C0); | 212 | write_scoop_reg(SCOOP_DEV[skt->nr].dev, SCOOP_IMR, 0x00C0); |
216 | write_scoop_reg(SCOOP_DEV[skt->nr].dev, SCOOP_MCR, 0x0101); | 213 | write_scoop_reg(SCOOP_DEV[skt->nr].dev, SCOOP_MCR, 0x0101); |
217 | SCOOP_DEV[skt->nr].keep_vs = NO_KEEP_VS; | 214 | SCOOP_DEV[skt->nr].keep_vs = NO_KEEP_VS; |
218 | } | 215 | } |
219 | 216 | ||
220 | static void sharpsl_pcmcia_socket_suspend(struct soc_pcmcia_socket *skt) | 217 | static void sharpsl_pcmcia_socket_suspend(struct soc_pcmcia_socket *skt) |
221 | { | 218 | { |
222 | sharpsl_pcmcia_init_reset(skt); | 219 | sharpsl_pcmcia_init_reset(skt); |
223 | } | 220 | } |
224 | 221 | ||
225 | static struct pcmcia_low_level sharpsl_pcmcia_ops __initdata = { | 222 | static struct pcmcia_low_level sharpsl_pcmcia_ops __initdata = { |
226 | .owner = THIS_MODULE, | 223 | .owner = THIS_MODULE, |
227 | .hw_init = sharpsl_pcmcia_hw_init, | 224 | .hw_init = sharpsl_pcmcia_hw_init, |
228 | .hw_shutdown = sharpsl_pcmcia_hw_shutdown, | 225 | .hw_shutdown = sharpsl_pcmcia_hw_shutdown, |
229 | .socket_state = sharpsl_pcmcia_socket_state, | 226 | .socket_state = sharpsl_pcmcia_socket_state, |
230 | .configure_socket = sharpsl_pcmcia_configure_socket, | 227 | .configure_socket = sharpsl_pcmcia_configure_socket, |
231 | .socket_init = sharpsl_pcmcia_socket_init, | 228 | .socket_init = sharpsl_pcmcia_socket_init, |
232 | .socket_suspend = sharpsl_pcmcia_socket_suspend, | 229 | .socket_suspend = sharpsl_pcmcia_socket_suspend, |
233 | .first = 0, | 230 | .first = 0, |
234 | .nr = 0, | 231 | .nr = 0, |
235 | }; | 232 | }; |
236 | 233 | ||
237 | #ifdef CONFIG_SA1100_COLLIE | 234 | #ifdef CONFIG_SA1100_COLLIE |
238 | #include "sa11xx_base.h" | 235 | #include "sa11xx_base.h" |
239 | 236 | ||
240 | int __devinit pcmcia_collie_init(struct device *dev) | 237 | int __devinit pcmcia_collie_init(struct device *dev) |
241 | { | 238 | { |
242 | int ret = -ENODEV; | 239 | int ret = -ENODEV; |
243 | 240 | ||
244 | if (machine_is_collie()) | 241 | if (machine_is_collie()) |
245 | ret = sa11xx_drv_pcmcia_probe(dev, &sharpsl_pcmcia_ops, 0, 1); | 242 | ret = sa11xx_drv_pcmcia_probe(dev, &sharpsl_pcmcia_ops, 0, 1); |
246 | 243 | ||
247 | return ret; | 244 | return ret; |
248 | } | 245 | } |
249 | 246 | ||
250 | #else | 247 | #else |
251 | 248 | ||
252 | static struct platform_device *sharpsl_pcmcia_device; | 249 | static struct platform_device *sharpsl_pcmcia_device; |
253 | 250 | ||
254 | static int __init sharpsl_pcmcia_init(void) | 251 | static int __init sharpsl_pcmcia_init(void) |
255 | { | 252 | { |
256 | int ret; | 253 | int ret; |
257 | 254 | ||
258 | if (!platform_scoop_config) | 255 | if (!platform_scoop_config) |
259 | return -ENODEV; | 256 | return -ENODEV; |
260 | 257 | ||
261 | sharpsl_pcmcia_ops.nr = platform_scoop_config->num_devs; | 258 | sharpsl_pcmcia_ops.nr = platform_scoop_config->num_devs; |
262 | sharpsl_pcmcia_device = platform_device_alloc("pxa2xx-pcmcia", -1); | 259 | sharpsl_pcmcia_device = platform_device_alloc("pxa2xx-pcmcia", -1); |
263 | 260 | ||
264 | if (!sharpsl_pcmcia_device) | 261 | if (!sharpsl_pcmcia_device) |
265 | return -ENOMEM; | 262 | return -ENOMEM; |
266 | 263 | ||
267 | ret = platform_device_add_data(sharpsl_pcmcia_device, | 264 | ret = platform_device_add_data(sharpsl_pcmcia_device, |
268 | &sharpsl_pcmcia_ops, sizeof(sharpsl_pcmcia_ops)); | 265 | &sharpsl_pcmcia_ops, sizeof(sharpsl_pcmcia_ops)); |
269 | if (ret == 0) { | 266 | if (ret == 0) { |
270 | sharpsl_pcmcia_device->dev.parent = platform_scoop_config->devs[0].dev; | 267 | sharpsl_pcmcia_device->dev.parent = platform_scoop_config->devs[0].dev; |
271 | ret = platform_device_add(sharpsl_pcmcia_device); | 268 | ret = platform_device_add(sharpsl_pcmcia_device); |
272 | } | 269 | } |
273 | 270 | ||
274 | if (ret) | 271 | if (ret) |
275 | platform_device_put(sharpsl_pcmcia_device); | 272 | platform_device_put(sharpsl_pcmcia_device); |
276 | 273 | ||
277 | return ret; | 274 | return ret; |
278 | } | 275 | } |
279 | 276 | ||
280 | static void __exit sharpsl_pcmcia_exit(void) | 277 | static void __exit sharpsl_pcmcia_exit(void) |
281 | { | 278 | { |
282 | platform_device_unregister(sharpsl_pcmcia_device); | 279 | platform_device_unregister(sharpsl_pcmcia_device); |
283 | } | 280 | } |
284 | 281 | ||
285 | fs_initcall(sharpsl_pcmcia_init); | 282 | fs_initcall(sharpsl_pcmcia_init); |
286 | module_exit(sharpsl_pcmcia_exit); | 283 | module_exit(sharpsl_pcmcia_exit); |
287 | #endif | 284 | #endif |
288 | 285 | ||
289 | MODULE_DESCRIPTION("Sharp SL Series PCMCIA Support"); | 286 | MODULE_DESCRIPTION("Sharp SL Series PCMCIA Support"); |
290 | MODULE_LICENSE("GPL"); | 287 | MODULE_LICENSE("GPL"); |
291 | MODULE_ALIAS("platform:pxa2xx-pcmcia"); | 288 | MODULE_ALIAS("platform:pxa2xx-pcmcia"); |
292 | 289 |