hc
2023-12-11 d2ccde1c8e90d38cee87a1b0309ad2827f3fd30d
kernel/drivers/pcmcia/sa1111_neponset.c
....@@ -10,12 +10,10 @@
1010 #include <linux/errno.h>
1111 #include <linux/init.h>
1212
13
-#include <mach/hardware.h>
1413 #include <asm/mach-types.h>
15
-#include <mach/neponset.h>
16
-#include <asm/hardware/sa1111.h>
1714
1815 #include "sa1111_generic.h"
16
+#include "max1600.h"
1917
2018 /*
2119 * Neponset uses the Maxim MAX1600, with the following connections:
....@@ -40,70 +38,36 @@
4038 * "Standard Intel code" mode. Refer to the Maxim data sheet for
4139 * the corresponding truth table.
4240 */
41
+static int neponset_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
42
+{
43
+ struct max1600 *m;
44
+ int ret;
45
+
46
+ ret = max1600_init(skt->socket.dev.parent, &m,
47
+ skt->nr ? MAX1600_CHAN_B : MAX1600_CHAN_A,
48
+ MAX1600_CODE_LOW);
49
+ if (ret == 0)
50
+ skt->driver_data = m;
51
+
52
+ return ret;
53
+}
4354
4455 static int
4556 neponset_pcmcia_configure_socket(struct soc_pcmcia_socket *skt, const socket_state_t *state)
4657 {
47
- struct sa1111_pcmcia_socket *s = to_skt(skt);
48
- unsigned int ncr_mask, ncr_set, pa_dwr_mask, pa_dwr_set;
58
+ struct max1600 *m = skt->driver_data;
4959 int ret;
5060
51
- switch (skt->nr) {
52
- case 0:
53
- pa_dwr_mask = GPIO_A0 | GPIO_A1;
54
- ncr_mask = NCR_A0VPP | NCR_A1VPP;
55
-
56
- if (state->Vpp == 0)
57
- ncr_set = 0;
58
- else if (state->Vpp == 120)
59
- ncr_set = NCR_A1VPP;
60
- else if (state->Vpp == state->Vcc)
61
- ncr_set = NCR_A0VPP;
62
- else {
63
- printk(KERN_ERR "%s(): unrecognized VPP %u\n",
64
- __func__, state->Vpp);
65
- return -1;
66
- }
67
- break;
68
-
69
- case 1:
70
- pa_dwr_mask = GPIO_A2 | GPIO_A3;
71
- ncr_mask = 0;
72
- ncr_set = 0;
73
-
74
- if (state->Vpp != state->Vcc && state->Vpp != 0) {
75
- printk(KERN_ERR "%s(): CF slot cannot support VPP %u\n",
76
- __func__, state->Vpp);
77
- return -1;
78
- }
79
- break;
80
-
81
- default:
82
- return -1;
83
- }
84
-
85
- /*
86
- * pa_dwr_set is the mask for selecting Vcc on both sockets.
87
- * pa_dwr_mask selects which bits (and therefore socket) we change.
88
- */
89
- switch (state->Vcc) {
90
- default:
91
- case 0: pa_dwr_set = 0; break;
92
- case 33: pa_dwr_set = GPIO_A1|GPIO_A2; break;
93
- case 50: pa_dwr_set = GPIO_A0|GPIO_A3; break;
94
- }
95
-
9661 ret = sa1111_pcmcia_configure_socket(skt, state);
97
- if (ret == 0) {
98
- neponset_ncr_frob(ncr_mask, ncr_set);
99
- sa1111_set_io(s->dev, pa_dwr_mask, pa_dwr_set);
100
- }
62
+ if (ret == 0)
63
+ ret = max1600_configure(m, state->Vcc, state->Vpp);
10164
10265 return ret;
10366 }
10467
10568 static struct pcmcia_low_level neponset_pcmcia_ops = {
10669 .owner = THIS_MODULE,
70
+ .hw_init = neponset_pcmcia_hw_init,
10771 .configure_socket = neponset_pcmcia_configure_socket,
10872 .first = 0,
10973 .nr = 2,
....@@ -111,13 +75,6 @@
11175
11276 int pcmcia_neponset_init(struct sa1111_dev *sadev)
11377 {
114
- /*
115
- * Set GPIO_A<3:0> to be outputs for the MAX1600,
116
- * and switch to standby mode.
117
- */
118
- sa1111_set_io_dir(sadev, GPIO_A0|GPIO_A1|GPIO_A2|GPIO_A3, 0, 0);
119
- sa1111_set_io(sadev, GPIO_A0|GPIO_A1|GPIO_A2|GPIO_A3, 0);
120
- sa1111_set_sleep_io(sadev, GPIO_A0|GPIO_A1|GPIO_A2|GPIO_A3, 0);
12178 sa11xx_drv_pcmcia_ops(&neponset_pcmcia_ops);
12279 return sa1111_pcmcia_add(sadev, &neponset_pcmcia_ops,
12380 sa11xx_drv_pcmcia_add_one);