~ubuntu-branches/debian/experimental/linux-2.6/experimental

« back to all changes in this revision

Viewing changes to drivers/pcmcia/sa1111_generic.c

  • Committer: Package Import Robot
  • Author(s): maximilian attems, maximilian attems, Ben Hutchings
  • Date: 2012-06-06 10:25:57 UTC
  • mfrom: (1.2.38)
  • Revision ID: package-import@ubuntu.com-20120606102557-b9j3506wcwrqrnx8
Tags: 3.4.1-1~experimental.1
* New upstream release: http://kernelnewbies.org/Linux_3.4
* New upstream stable update:
  http://www.kernel.org/pub/linux/kernel/v3.x/ChangeLog-3.4.1

[ maximilian attems ]
* Enable DM_VERITY, NF_CONNTRACK_TIMEOUT, NF_CT_NETLINK_TIMEOUT,
  IP_NF_MATCH_RPFILTER, IP6_NF_MATCH_RPFILTER, NETFILTER_NETLINK_ACCT,
  NETFILTER_XT_MATCH_NFACCT, NET_SCH_PLUG, SCSI_UFSHCD, SCSI_VIRTIO,
  NET_TEAM, ATH6KL.

[ Ben Hutchings ]
* DFSG: Remove the new vs6624 driver, which contains non-free firmware
* aufs: Update to aufs3.4-20120521
* [rt] Update to 3.4-rt8 and reenable

Show diffs side-by-side

added added

removed removed

Lines of Context:
22
22
 
23
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
59
#define IDX_IRQ_S0_READY_NINT   (0)
26
60
#define IDX_IRQ_S0_CD_VALID     (1)
27
61
#define IDX_IRQ_S0_BVD1_STSCHG  (2)
29
63
#define IDX_IRQ_S1_CD_VALID     (4)
30
64
#define IDX_IRQ_S1_BVD1_STSCHG  (5)
31
65
 
32
 
static struct pcmcia_irqs irqs[] = {
33
 
        { 0, NO_IRQ, "SA1111 PCMCIA card detect" },
34
 
        { 0, NO_IRQ, "SA1111 PCMCIA BVD1"        },
35
 
        { 1, NO_IRQ, "SA1111 CF card detect"     },
36
 
        { 1, NO_IRQ, "SA1111 CF BVD1"            },
37
 
};
38
 
 
39
 
static int sa1111_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
40
 
{
41
 
        return soc_pcmcia_request_irqs(skt, irqs, ARRAY_SIZE(irqs));
42
 
}
43
 
 
44
 
static void sa1111_pcmcia_hw_shutdown(struct soc_pcmcia_socket *skt)
45
 
{
46
 
        soc_pcmcia_free_irqs(skt, irqs, ARRAY_SIZE(irqs));
47
 
}
48
 
 
49
66
void sa1111_pcmcia_socket_state(struct soc_pcmcia_socket *skt, struct pcmcia_state *state)
50
67
{
51
68
        struct sa1111_pcmcia_socket *s = to_skt(skt);
52
 
        unsigned long status = sa1111_readl(s->dev->mapbase + SA1111_PCSR);
 
69
        unsigned long status = sa1111_readl(s->dev->mapbase + PCSR);
53
70
 
54
71
        switch (skt->nr) {
55
72
        case 0:
105
122
                pccr_set_mask |= PCCR_S0_FLT|PCCR_S1_FLT;
106
123
 
107
124
        local_irq_save(flags);
108
 
        val = sa1111_readl(s->dev->mapbase + SA1111_PCCR);
 
125
        val = sa1111_readl(s->dev->mapbase + PCCR);
109
126
        val &= ~pccr_skt_mask;
110
127
        val |= pccr_set_mask & pccr_skt_mask;
111
 
        sa1111_writel(val, s->dev->mapbase + SA1111_PCCR);
 
128
        sa1111_writel(val, s->dev->mapbase + PCCR);
112
129
        local_irq_restore(flags);
113
130
 
114
131
        return 0;
115
132
}
116
133
 
117
 
void sa1111_pcmcia_socket_init(struct soc_pcmcia_socket *skt)
118
 
{
119
 
        soc_pcmcia_enable_irqs(skt, irqs, ARRAY_SIZE(irqs));
120
 
}
121
 
 
122
 
static void sa1111_pcmcia_socket_suspend(struct soc_pcmcia_socket *skt)
123
 
{
124
 
        soc_pcmcia_disable_irqs(skt, irqs, ARRAY_SIZE(irqs));
125
 
}
126
 
 
127
134
int sa1111_pcmcia_add(struct sa1111_dev *dev, struct pcmcia_low_level *ops,
128
135
        int (*add)(struct soc_pcmcia_socket *))
129
136
{
130
137
        struct sa1111_pcmcia_socket *s;
131
138
        int i, ret = 0;
132
139
 
133
 
        ops->hw_init = sa1111_pcmcia_hw_init;
134
 
        ops->hw_shutdown = sa1111_pcmcia_hw_shutdown;
135
140
        ops->socket_state = sa1111_pcmcia_socket_state;
136
 
        ops->socket_suspend = sa1111_pcmcia_socket_suspend;
137
141
 
138
142
        for (i = 0; i < ops->nr; i++) {
139
143
                s = kzalloc(sizeof(*s), GFP_KERNEL);
141
145
                        return -ENOMEM;
142
146
 
143
147
                s->soc.nr = ops->first + i;
144
 
                s->soc.ops = ops;
145
 
                s->soc.socket.owner = ops->owner;
146
 
                s->soc.socket.dev.parent = &dev->dev;
147
 
                s->soc.socket.pci_irq = s->soc.nr ?
148
 
                                dev->irq[IDX_IRQ_S0_READY_NINT] :
149
 
                                dev->irq[IDX_IRQ_S1_READY_NINT];
 
148
                soc_pcmcia_init_one(&s->soc, ops, &dev->dev);
150
149
                s->dev = dev;
 
150
                if (s->soc.nr) {
 
151
                        s->soc.socket.pci_irq = dev->irq[IDX_IRQ_S1_READY_NINT];
 
152
                        s->soc.stat[SOC_STAT_CD].irq = dev->irq[IDX_IRQ_S1_CD_VALID];
 
153
                        s->soc.stat[SOC_STAT_CD].name = "SA1111 CF card detect";
 
154
                        s->soc.stat[SOC_STAT_BVD1].irq = dev->irq[IDX_IRQ_S1_BVD1_STSCHG];
 
155
                        s->soc.stat[SOC_STAT_BVD1].name = "SA1111 CF BVD1";
 
156
                } else {
 
157
                        s->soc.socket.pci_irq = dev->irq[IDX_IRQ_S0_READY_NINT];
 
158
                        s->soc.stat[SOC_STAT_CD].irq = dev->irq[IDX_IRQ_S0_CD_VALID];
 
159
                        s->soc.stat[SOC_STAT_CD].name = "SA1111 PCMCIA card detect";
 
160
                        s->soc.stat[SOC_STAT_BVD1].irq = dev->irq[IDX_IRQ_S0_BVD1_STSCHG];
 
161
                        s->soc.stat[SOC_STAT_BVD1].name = "SA1111 PCMCIA BVD1";
 
162
                }
151
163
 
152
164
                ret = add(&s->soc);
153
165
                if (ret == 0) {
163
175
static int pcmcia_probe(struct sa1111_dev *dev)
164
176
{
165
177
        void __iomem *base;
 
178
        int ret;
 
179
 
 
180
        ret = sa1111_enable_device(dev);
 
181
        if (ret)
 
182
                return ret;
166
183
 
167
184
        dev_set_drvdata(&dev->dev, NULL);
168
185
 
169
 
        if (!request_mem_region(dev->res.start, 512,
170
 
                                SA1111_DRIVER_NAME(dev)))
 
186
        if (!request_mem_region(dev->res.start, 512, SA1111_DRIVER_NAME(dev))) {
 
187
                sa1111_disable_device(dev);
171
188
                return -EBUSY;
 
189
        }
172
190
 
173
191
        base = dev->mapbase;
174
192
 
175
 
        /* Initialize PCMCIA IRQs */
176
 
        irqs[0].irq = dev->irq[IDX_IRQ_S0_CD_VALID];
177
 
        irqs[1].irq = dev->irq[IDX_IRQ_S0_BVD1_STSCHG];
178
 
        irqs[2].irq = dev->irq[IDX_IRQ_S1_CD_VALID];
179
 
        irqs[3].irq = dev->irq[IDX_IRQ_S1_BVD1_STSCHG];
180
 
 
181
193
        /*
182
194
         * Initialise the suspend state.
183
195
         */
184
 
        sa1111_writel(PCSSR_S0_SLEEP | PCSSR_S1_SLEEP, base + SA1111_PCSSR);
185
 
        sa1111_writel(PCCR_S0_FLT | PCCR_S1_FLT, base + SA1111_PCCR);
 
196
        sa1111_writel(PCSSR_S0_SLEEP | PCSSR_S1_SLEEP, base + PCSSR);
 
197
        sa1111_writel(PCCR_S0_FLT | PCCR_S1_FLT, base + PCCR);
186
198
 
187
199
#ifdef CONFIG_SA1100_BADGE4
188
200
        pcmcia_badge4_init(&dev->dev);
212
224
        }
213
225
 
214
226
        release_mem_region(dev->res.start, 512);
 
227
        sa1111_disable_device(dev);
215
228
        return 0;
216
229
}
217
230