diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2012-03-27 21:17:02 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-03-27 21:17:02 -0400 |
commit | 9e4db1c3eed55c22328d8022c2c80adb3093833f (patch) | |
tree | 9643545e6bd182f1d3e19942f590a6a1e3198320 /drivers/pcmcia | |
parent | de8856d2c11f562c60ed9340a83db4a4f829a6e6 (diff) | |
parent | aae528d9a8ad79d4b21b1b723abc9447fdb0d200 (diff) |
Merge branch 'platforms' of git://git.linaro.org/people/rmk/linux-arm
Pull ARM platform updates from Russell King:
"This covers platform stuff for platforms I have a direct interest in
(iow, I have the hardware). Essentially:
- as we no longer support any other Acorn platforms other than RiscPC
anymore, we can collect all that code into mach-rpc.
- convert Acorn expansion card stuff to use IRQ allocation functions,
and get rid of NO_IRQ from there.
- cleanups to the ebsa110 platform to move some private stuff out of
its header files.
- large amount of SA11x0 updates:
- conversion of private DMA implementation to DMA engine support
(this actually gives us greater flexibility in drivers over the old
API.)
- re-worked ucb1x00 updates - convert to genirq, remove sa11x0
dependencies, fix various minor issues
- move platform specific sa11x0 framebuffer data into platform files
in arch/arm instead of keeping this in the driver itself
- update sa11x0 IrDA driver for DMA engine, and allow it to use DMA
for SIR transmissions as well as FIR
- rework sa1111 support for genirq, and irq allocation
- fix sa1111 IRQ support so it works again
- use sparse IRQ support
After this, I have one more pull request remaining from my current
set, which I think is going to be the most problematical as it
generates 8 conflicts."
Fixed up the trivial conflict in arch/arm/mach-rpc/Makefile as per
Russell.
* 'platforms' of git://git.linaro.org/people/rmk/linux-arm: (125 commits)
ARM: 7343/1: sa11x0: convert to sparse IRQ
ARM: 7342/2: sa1100: prepare for sparse irq conversion
ARM: 7341/1: input: prepare jornada720 keyboard and ts for sa11x0 sparse irq
ARM: 7340/1: rtc: sa1100: include mach/irqs.h instead of asm/irq.h
ARM: sa11x0: remove unused DMA controller definitions
ARM: sa11x0: remove old SoC private DMA driver
USB: sa1111: add hcd .reset method
USB: sa1111: add OHCI shutdown methods
USB: sa1111: reorganize ohci-sa1111.c
USB: sa1111: get rid of nasty printk(KERN_DEBUG "%s: ...", __FILE__)
USB: sa1111: sparse and checkpatch cleanups
ARM: sa11x0: don't static map sa1111
ARM: sa1111: use dev_err() rather than printk()
ARM: sa1111: cleanup sub-device registration and unregistration
ARM: sa1111: only setup DMA for DMA capable devices
ARM: sa1111: register sa1111 devices with dmabounce in bus notifier
ARM: sa1111: move USB interface register definitions to ohci-sa1111.c
ARM: sa1111: move PCMCIA interface register definitions to sa1111_generic.c
ARM: sa1111: move PS/2 interface register definitions to sa1111p2.c
ARM: sa1111: delete unused physical GPIO register definitions
...
Diffstat (limited to 'drivers/pcmcia')
-rw-r--r-- | drivers/pcmcia/sa1111_generic.c | 55 | ||||
-rw-r--r-- | drivers/pcmcia/sa1111_neponset.c | 7 |
2 files changed, 49 insertions, 13 deletions
diff --git a/drivers/pcmcia/sa1111_generic.c b/drivers/pcmcia/sa1111_generic.c index ef5848f65241..70f728ce1856 100644 --- a/drivers/pcmcia/sa1111_generic.c +++ b/drivers/pcmcia/sa1111_generic.c | |||
@@ -22,6 +22,40 @@ | |||
22 | 22 | ||
23 | #include "sa1111_generic.h" | 23 | #include "sa1111_generic.h" |
24 | 24 | ||
25 | /* | ||
26 | * These are offsets from the above base. | ||
27 | */ | ||
28 | #define PCCR 0x0000 | ||
29 | #define PCSSR 0x0004 | ||
30 | #define PCSR 0x0008 | ||
31 | |||
32 | #define PCSR_S0_READY (1<<0) | ||
33 | #define PCSR_S1_READY (1<<1) | ||
34 | #define PCSR_S0_DETECT (1<<2) | ||
35 | #define PCSR_S1_DETECT (1<<3) | ||
36 | #define PCSR_S0_VS1 (1<<4) | ||
37 | #define PCSR_S0_VS2 (1<<5) | ||
38 | #define PCSR_S1_VS1 (1<<6) | ||
39 | #define PCSR_S1_VS2 (1<<7) | ||
40 | #define PCSR_S0_WP (1<<8) | ||
41 | #define PCSR_S1_WP (1<<9) | ||
42 | #define PCSR_S0_BVD1 (1<<10) | ||
43 | #define PCSR_S0_BVD2 (1<<11) | ||
44 | #define PCSR_S1_BVD1 (1<<12) | ||
45 | #define PCSR_S1_BVD2 (1<<13) | ||
46 | |||
47 | #define PCCR_S0_RST (1<<0) | ||
48 | #define PCCR_S1_RST (1<<1) | ||
49 | #define PCCR_S0_FLT (1<<2) | ||
50 | #define PCCR_S1_FLT (1<<3) | ||
51 | #define PCCR_S0_PWAITEN (1<<4) | ||
52 | #define PCCR_S1_PWAITEN (1<<5) | ||
53 | #define PCCR_S0_PSE (1<<6) | ||
54 | #define PCCR_S1_PSE (1<<7) | ||
55 | |||
56 | #define PCSSR_S0_SLEEP (1<<0) | ||
57 | #define PCSSR_S1_SLEEP (1<<1) | ||
58 | |||
25 | #define IDX_IRQ_S0_READY_NINT (0) | 59 | #define IDX_IRQ_S0_READY_NINT (0) |
26 | #define IDX_IRQ_S0_CD_VALID (1) | 60 | #define IDX_IRQ_S0_CD_VALID (1) |
27 | #define IDX_IRQ_S0_BVD1_STSCHG (2) | 61 | #define IDX_IRQ_S0_BVD1_STSCHG (2) |
@@ -32,7 +66,7 @@ | |||
32 | void sa1111_pcmcia_socket_state(struct soc_pcmcia_socket *skt, struct pcmcia_state *state) | 66 | void sa1111_pcmcia_socket_state(struct soc_pcmcia_socket *skt, struct pcmcia_state *state) |
33 | { | 67 | { |
34 | struct sa1111_pcmcia_socket *s = to_skt(skt); | 68 | struct sa1111_pcmcia_socket *s = to_skt(skt); |
35 | unsigned long status = sa1111_readl(s->dev->mapbase + SA1111_PCSR); | 69 | unsigned long status = sa1111_readl(s->dev->mapbase + PCSR); |
36 | 70 | ||
37 | switch (skt->nr) { | 71 | switch (skt->nr) { |
38 | case 0: | 72 | case 0: |
@@ -88,10 +122,10 @@ int sa1111_pcmcia_configure_socket(struct soc_pcmcia_socket *skt, const socket_s | |||
88 | pccr_set_mask |= PCCR_S0_FLT|PCCR_S1_FLT; | 122 | pccr_set_mask |= PCCR_S0_FLT|PCCR_S1_FLT; |
89 | 123 | ||
90 | local_irq_save(flags); | 124 | local_irq_save(flags); |
91 | val = sa1111_readl(s->dev->mapbase + SA1111_PCCR); | 125 | val = sa1111_readl(s->dev->mapbase + PCCR); |
92 | val &= ~pccr_skt_mask; | 126 | val &= ~pccr_skt_mask; |
93 | val |= pccr_set_mask & pccr_skt_mask; | 127 | val |= pccr_set_mask & pccr_skt_mask; |
94 | sa1111_writel(val, s->dev->mapbase + SA1111_PCCR); | 128 | sa1111_writel(val, s->dev->mapbase + PCCR); |
95 | local_irq_restore(flags); | 129 | local_irq_restore(flags); |
96 | 130 | ||
97 | return 0; | 131 | return 0; |
@@ -141,20 +175,26 @@ int sa1111_pcmcia_add(struct sa1111_dev *dev, struct pcmcia_low_level *ops, | |||
141 | static int pcmcia_probe(struct sa1111_dev *dev) | 175 | static int pcmcia_probe(struct sa1111_dev *dev) |
142 | { | 176 | { |
143 | void __iomem *base; | 177 | void __iomem *base; |
178 | int ret; | ||
179 | |||
180 | ret = sa1111_enable_device(dev); | ||
181 | if (ret) | ||
182 | return ret; | ||
144 | 183 | ||
145 | dev_set_drvdata(&dev->dev, NULL); | 184 | dev_set_drvdata(&dev->dev, NULL); |
146 | 185 | ||
147 | if (!request_mem_region(dev->res.start, 512, | 186 | if (!request_mem_region(dev->res.start, 512, SA1111_DRIVER_NAME(dev))) { |
148 | SA1111_DRIVER_NAME(dev))) | 187 | sa1111_disable_device(dev); |
149 | return -EBUSY; | 188 | return -EBUSY; |
189 | } | ||
150 | 190 | ||
151 | base = dev->mapbase; | 191 | base = dev->mapbase; |
152 | 192 | ||
153 | /* | 193 | /* |
154 | * Initialise the suspend state. | 194 | * Initialise the suspend state. |
155 | */ | 195 | */ |
156 | sa1111_writel(PCSSR_S0_SLEEP | PCSSR_S1_SLEEP, base + SA1111_PCSSR); | 196 | sa1111_writel(PCSSR_S0_SLEEP | PCSSR_S1_SLEEP, base + PCSSR); |
157 | sa1111_writel(PCCR_S0_FLT | PCCR_S1_FLT, base + SA1111_PCCR); | 197 | sa1111_writel(PCCR_S0_FLT | PCCR_S1_FLT, base + PCCR); |
158 | 198 | ||
159 | #ifdef CONFIG_SA1100_BADGE4 | 199 | #ifdef CONFIG_SA1100_BADGE4 |
160 | pcmcia_badge4_init(&dev->dev); | 200 | pcmcia_badge4_init(&dev->dev); |
@@ -184,6 +224,7 @@ static int __devexit pcmcia_remove(struct sa1111_dev *dev) | |||
184 | } | 224 | } |
185 | 225 | ||
186 | release_mem_region(dev->res.start, 512); | 226 | release_mem_region(dev->res.start, 512); |
227 | sa1111_disable_device(dev); | ||
187 | return 0; | 228 | return 0; |
188 | } | 229 | } |
189 | 230 | ||
diff --git a/drivers/pcmcia/sa1111_neponset.c b/drivers/pcmcia/sa1111_neponset.c index 50f297d850e7..1d78739c4c07 100644 --- a/drivers/pcmcia/sa1111_neponset.c +++ b/drivers/pcmcia/sa1111_neponset.c | |||
@@ -94,12 +94,7 @@ neponset_pcmcia_configure_socket(struct soc_pcmcia_socket *skt, const socket_sta | |||
94 | 94 | ||
95 | ret = sa1111_pcmcia_configure_socket(skt, state); | 95 | ret = sa1111_pcmcia_configure_socket(skt, state); |
96 | if (ret == 0) { | 96 | if (ret == 0) { |
97 | unsigned long flags; | 97 | neponset_ncr_frob(ncr_mask, ncr_set); |
98 | |||
99 | local_irq_save(flags); | ||
100 | NCR_0 = (NCR_0 & ~ncr_mask) | ncr_set; | ||
101 | |||
102 | local_irq_restore(flags); | ||
103 | sa1111_set_io(s->dev, pa_dwr_mask, pa_dwr_set); | 98 | sa1111_set_io(s->dev, pa_dwr_mask, pa_dwr_set); |
104 | } | 99 | } |
105 | 100 | ||