0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013 #include <linux/module.h>
0014 #include <linux/kernel.h>
0015 #include <linux/device.h>
0016 #include <linux/errno.h>
0017 #include <linux/init.h>
0018 #include <linux/delay.h>
0019
0020 #include <asm/hardware/sa1111.h>
0021 #include <asm/mach-types.h>
0022
0023 #include "sa1111_generic.h"
0024 #include "max1600.h"
0025
0026 static int lubbock_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
0027 {
0028 struct max1600 *m;
0029 int ret;
0030
0031 ret = max1600_init(skt->socket.dev.parent, &m,
0032 skt->nr ? MAX1600_CHAN_B : MAX1600_CHAN_A,
0033 MAX1600_CODE_HIGH);
0034 if (ret == 0)
0035 skt->driver_data = m;
0036
0037 return ret;
0038 }
0039
0040 static int
0041 lubbock_pcmcia_configure_socket(struct soc_pcmcia_socket *skt,
0042 const socket_state_t *state)
0043 {
0044 struct max1600 *m = skt->driver_data;
0045 int ret = 0;
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069
0070
0071
0072
0073
0074
0075
0076
0077 again:
0078 switch (skt->nr) {
0079 case 0:
0080 case 1:
0081 break;
0082
0083 default:
0084 ret = -1;
0085 }
0086
0087 if (ret == 0)
0088 ret = sa1111_pcmcia_configure_socket(skt, state);
0089 if (ret == 0)
0090 ret = max1600_configure(m, state->Vcc, state->Vpp);
0091
0092 #if 1
0093 if (ret == 0 && state->Vcc == 33) {
0094 struct pcmcia_state new_state;
0095
0096
0097
0098
0099
0100
0101
0102
0103
0104
0105
0106 mdelay(3);
0107
0108 sa1111_pcmcia_socket_state(skt, &new_state);
0109
0110 if (!new_state.vs_3v && !new_state.vs_Xv) {
0111
0112
0113
0114 max1600_configure(m, 0, 0);
0115
0116
0117
0118
0119 mdelay(100);
0120
0121
0122
0123
0124
0125
0126
0127 ((socket_state_t *)state)->Vcc = 50;
0128 ((socket_state_t *)state)->Vpp = 50;
0129 goto again;
0130 }
0131 }
0132 #endif
0133
0134 return ret;
0135 }
0136
0137 static struct pcmcia_low_level lubbock_pcmcia_ops = {
0138 .owner = THIS_MODULE,
0139 .hw_init = lubbock_pcmcia_hw_init,
0140 .configure_socket = lubbock_pcmcia_configure_socket,
0141 .first = 0,
0142 .nr = 2,
0143 };
0144
0145 #include "pxa2xx_base.h"
0146
0147 int pcmcia_lubbock_init(struct sa1111_dev *sadev)
0148 {
0149 pxa2xx_drv_pcmcia_ops(&lubbock_pcmcia_ops);
0150 pxa2xx_configure_sockets(&sadev->dev, &lubbock_pcmcia_ops);
0151 return sa1111_pcmcia_add(sadev, &lubbock_pcmcia_ops,
0152 pxa2xx_drv_pcmcia_add_one);
0153 }
0154
0155 MODULE_LICENSE("GPL");