OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [linux/] [linux-2.4/] [drivers/] [pcmcia/] [sa1100_neponset.c] - Blame information for rev 1765

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 1275 phoenix
/*
2
 * linux/drivers/pcmcia/sa1100_neponset.c
3
 *
4
 * Neponset PCMCIA specific routines
5
 */
6
#include <linux/kernel.h>
7
#include <linux/sched.h>
8
 
9
#include <asm/hardware.h>
10
#include <asm/arch/assabet.h>
11
#include <asm/hardware/sa1111.h>
12
 
13
#include "sa1100_generic.h"
14
#include "sa1111_generic.h"
15
 
16
static int neponset_pcmcia_init(struct pcmcia_init *init)
17
{
18
        /* Set GPIO_A<3:0> to be outputs for PCMCIA/CF power controller: */
19
        PA_DDR &= ~(GPIO_GPIO0 | GPIO_GPIO1 | GPIO_GPIO2 | GPIO_GPIO3);
20
 
21
        /* MAX1600 to standby mode: */
22
        PA_DWR &= ~(GPIO_GPIO0 | GPIO_GPIO1 | GPIO_GPIO2 | GPIO_GPIO3);
23
        NCR_0 &= ~(NCR_A0VPP | NCR_A1VPP);
24
 
25
        return sa1111_pcmcia_init(init);
26
}
27
 
28
static int
29
neponset_pcmcia_configure_socket(const struct pcmcia_configure *conf)
30
{
31
        unsigned int ncr_mask, pa_dwr_mask;
32
        unsigned int ncr_set, pa_dwr_set;
33
        int ret;
34
 
35
        /* Neponset uses the Maxim MAX1600, with the following connections:
36
 
37
         *   MAX1600      Neponset
38
         *
39
         *    A0VCC        SA-1111 GPIO A<1>
40
         *    A1VCC        SA-1111 GPIO A<0>
41
         *    A0VPP        CPLD NCR A0VPP
42
         *    A1VPP        CPLD NCR A1VPP
43
         *    B0VCC        SA-1111 GPIO A<2>
44
         *    B1VCC        SA-1111 GPIO A<3>
45
         *    B0VPP        ground (slot B is CF)
46
         *    B1VPP        ground (slot B is CF)
47
         *
48
         *     VX          VCC (5V)
49
         *     VY          VCC3_3 (3.3V)
50
         *     12INA       12V
51
         *     12INB       ground (slot B is CF)
52
         *
53
         * The MAX1600 CODE pin is tied to ground, placing the device in
54
         * "Standard Intel code" mode. Refer to the Maxim data sheet for
55
         * the corresponding truth table.
56
         */
57
 
58
        switch (conf->sock) {
59
        case 0:
60
                pa_dwr_mask = GPIO_GPIO0 | GPIO_GPIO1;
61
                ncr_mask = NCR_A0VPP | NCR_A1VPP;
62
 
63
                switch (conf->vcc) {
64
                default:
65
                case 0:          pa_dwr_set = 0;                  break;
66
                case 33:        pa_dwr_set = GPIO_GPIO1;        break;
67
                case 50:        pa_dwr_set = GPIO_GPIO0;        break;
68
                }
69
 
70
                switch (conf->vpp) {
71
                case 0:          ncr_set = 0;                     break;
72
                case 120:       ncr_set = NCR_A1VPP;            break;
73
                default:
74
                        if (conf->vpp == conf->vcc)
75
                                ncr_set = NCR_A0VPP;
76
                        else {
77
                                printk(KERN_ERR "%s(): unrecognized VPP %u\n",
78
                                       __FUNCTION__, conf->vpp);
79
                                return -1;
80
                        }
81
                }
82
                break;
83
 
84
        case 1:
85
                pa_dwr_mask = GPIO_GPIO2 | GPIO_GPIO3;
86
                ncr_mask = 0;
87
                ncr_set = 0;
88
 
89
                switch (conf->vcc) {
90
                default:
91
                case 0:          pa_dwr_set = 0;                  break;
92
                case 33:        pa_dwr_set = GPIO_GPIO2;        break;
93
                case 50:        pa_dwr_set = GPIO_GPIO3;        break;
94
                }
95
 
96
                if (conf->vpp != conf->vcc && conf->vpp != 0) {
97
                        printk(KERN_ERR "%s(): CF slot cannot support VPP %u\n",
98
                               __FUNCTION__, conf->vpp);
99
                        return -1;
100
                }
101
                break;
102
 
103
        default:
104
                return -1;
105
        }
106
 
107
        ret = sa1111_pcmcia_configure_socket(conf);
108
        if (ret == 0) {
109
                unsigned long flags;
110
 
111
                local_irq_save(flags);
112
                NCR_0 = (NCR_0 & ~ncr_mask) | ncr_set;
113
                PA_DWR = (PA_DWR & ~pa_dwr_mask) | pa_dwr_set;
114
                local_irq_restore(flags);
115
        }
116
 
117
        return 0;
118
}
119
 
120
struct pcmcia_low_level neponset_pcmcia_ops = {
121
        init:                   neponset_pcmcia_init,
122
        shutdown:               sa1111_pcmcia_shutdown,
123
        socket_state:           sa1111_pcmcia_socket_state,
124
        get_irq_info:           sa1111_pcmcia_get_irq_info,
125
        configure_socket:       neponset_pcmcia_configure_socket,
126
 
127
        socket_init:            sa1111_pcmcia_socket_init,
128
        socket_suspend:         sa1111_pcmcia_socket_suspend,
129
};

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.