Commit ea2f1590aaffbd02f1850c19c3895ff4d092c6e0

Authored by Daniel Ritz
Committed by Linus Torvalds
1 parent 36d57ac4a8

[PATCH] yenta: make ToPIC95 bridges work with 16bit cards

ToPIC95 brides (and maybe some other too) require to use the ExCA registers
to power up the socket if a 16bit card is pluged.  allow socket drivers to
set a flag so that yenta does just that.  also clean up yenta_get_status()
a bit to use the new yenta_get_power() function.

Side note: ToPIC97 bridges (at least in Rev.5 i have) don't require this.

Ryan Underwood <nemesis-lists@icequake.net> said:

 According to the mail that David Hinds received from a Toshiba engineer,
 ToPIC95 and 97 do require this, and ToPIC100 does not.  Maybe you have a
 later revision.

 For all chips, 16-bit cards can be enabled through ExCA.  So doesn't it
 make sense just to make this the default behavior for all Toshiba chips,
 to avoid corner cases showing up later?

Daniel responded:

 I disagree with ryan to change anything for topic97 bridges.  they work.
 and I couldn't find (read google) any report of a topic97 breaking on
 applying power with the CB registers.

 I'm having several toshba notebooks at work (and home) with topic95,97,100
 bridges.  Only the ones with a topic95 didn't work.

Signed-off-by: Daniel Ritz <daniel.ritz@gmx.ch>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>

Showing 3 changed files with 122 additions and 28 deletions Side-by-side Diff

drivers/pcmcia/topic.h
... ... @@ -101,6 +101,8 @@
101 101 #define TOPIC97_AVS_AUDIO_CONTROL 0x02
102 102 #define TOPIC97_AVS_VIDEO_CONTROL 0x01
103 103  
  104 +#define TOPIC_EXCA_IF_CONTROL 0x3e /* 8 bit */
  105 +#define TOPIC_EXCA_IFC_33V_ENA 0x01
104 106  
105 107 static void topic97_zoom_video(struct pcmcia_socket *sock, int onoff)
106 108 {
... ... @@ -134,6 +136,21 @@
134 136 {
135 137 /* ToPIC97/100 support ZV */
136 138 socket->socket.zoom_video = topic97_zoom_video;
  139 + return 0;
  140 +}
  141 +
  142 +
  143 +static int topic95_override(struct yenta_socket *socket)
  144 +{
  145 + u8 fctrl;
  146 +
  147 + /* enable 3.3V support for 16bit cards */
  148 + fctrl = exca_readb(socket, TOPIC_EXCA_IF_CONTROL);
  149 + exca_writeb(socket, TOPIC_EXCA_IF_CONTROL, fctrl | TOPIC_EXCA_IFC_33V_ENA);
  150 +
  151 + /* tell yenta to use exca registers to power 16bit cards */
  152 + socket->flags |= YENTA_16BIT_POWER_EXCA | YENTA_16BIT_POWER_DF;
  153 +
137 154 return 0;
138 155 }
139 156  
drivers/pcmcia/yenta_socket.c
... ... @@ -184,22 +184,52 @@
184 184 return 0;
185 185 }
186 186  
187   -static int yenta_Vcc_power(u32 control)
  187 +static void yenta_get_power(struct yenta_socket *socket, socket_state_t *state)
188 188 {
189   - switch (control & CB_SC_VCC_MASK) {
190   - case CB_SC_VCC_5V: return 50;
191   - case CB_SC_VCC_3V: return 33;
192   - default: return 0;
193   - }
194   -}
  189 + if (!(cb_readl(socket, CB_SOCKET_STATE) & CB_CBCARD) &&
  190 + (socket->flags & YENTA_16BIT_POWER_EXCA)) {
  191 + u8 reg, vcc, vpp;
195 192  
196   -static int yenta_Vpp_power(u32 control)
197   -{
198   - switch (control & CB_SC_VPP_MASK) {
199   - case CB_SC_VPP_12V: return 120;
200   - case CB_SC_VPP_5V: return 50;
201   - case CB_SC_VPP_3V: return 33;
202   - default: return 0;
  193 + reg = exca_readb(socket, I365_POWER);
  194 + vcc = reg & I365_VCC_MASK;
  195 + vpp = reg & I365_VPP1_MASK;
  196 + state->Vcc = state->Vpp = 0;
  197 +
  198 + if (socket->flags & YENTA_16BIT_POWER_DF) {
  199 + if (vcc == I365_VCC_3V)
  200 + state->Vcc = 33;
  201 + if (vcc == I365_VCC_5V)
  202 + state->Vcc = 50;
  203 + if (vpp == I365_VPP1_5V)
  204 + state->Vpp = state->Vcc;
  205 + if (vpp == I365_VPP1_12V)
  206 + state->Vpp = 120;
  207 + } else {
  208 + if (reg & I365_VCC_5V) {
  209 + state->Vcc = 50;
  210 + if (vpp == I365_VPP1_5V)
  211 + state->Vpp = 50;
  212 + if (vpp == I365_VPP1_12V)
  213 + state->Vpp = 120;
  214 + }
  215 + }
  216 + } else {
  217 + u32 control;
  218 +
  219 + control = cb_readl(socket, CB_SOCKET_CONTROL);
  220 +
  221 + switch (control & CB_SC_VCC_MASK) {
  222 + case CB_SC_VCC_5V: state->Vcc = 50; break;
  223 + case CB_SC_VCC_3V: state->Vcc = 33; break;
  224 + default: state->Vcc = 0;
  225 + }
  226 +
  227 + switch (control & CB_SC_VPP_MASK) {
  228 + case CB_SC_VPP_12V: state->Vpp = 120; break;
  229 + case CB_SC_VPP_5V: state->Vpp = 50; break;
  230 + case CB_SC_VPP_3V: state->Vpp = 33; break;
  231 + default: state->Vpp = 0;
  232 + }
203 233 }
204 234 }
205 235  
... ... @@ -211,8 +241,7 @@
211 241  
212 242 control = cb_readl(socket, CB_SOCKET_CONTROL);
213 243  
214   - state->Vcc = yenta_Vcc_power(control);
215   - state->Vpp = yenta_Vpp_power(control);
  244 + yenta_get_power(socket, state);
216 245 state->io_irq = socket->io_irq;
217 246  
218 247 if (cb_readl(socket, CB_SOCKET_STATE) & CB_CBCARD) {
219 248  
... ... @@ -246,19 +275,54 @@
246 275  
247 276 static void yenta_set_power(struct yenta_socket *socket, socket_state_t *state)
248 277 {
249   - u32 reg = 0; /* CB_SC_STPCLK? */
250   - switch (state->Vcc) {
251   - case 33: reg = CB_SC_VCC_3V; break;
252   - case 50: reg = CB_SC_VCC_5V; break;
253   - default: reg = 0; break;
  278 + /* some birdges require to use the ExCA registers to power 16bit cards */
  279 + if (!(cb_readl(socket, CB_SOCKET_STATE) & CB_CBCARD) &&
  280 + (socket->flags & YENTA_16BIT_POWER_EXCA)) {
  281 + u8 reg, old;
  282 + reg = old = exca_readb(socket, I365_POWER);
  283 + reg &= ~(I365_VCC_MASK | I365_VPP1_MASK | I365_VPP2_MASK);
  284 +
  285 + /* i82365SL-DF style */
  286 + if (socket->flags & YENTA_16BIT_POWER_DF) {
  287 + switch (state->Vcc) {
  288 + case 33: reg |= I365_VCC_3V; break;
  289 + case 50: reg |= I365_VCC_5V; break;
  290 + default: reg = 0; break;
  291 + }
  292 + switch (state->Vpp) {
  293 + case 33:
  294 + case 50: reg |= I365_VPP1_5V; break;
  295 + case 120: reg |= I365_VPP1_12V; break;
  296 + }
  297 + } else {
  298 + /* i82365SL-B style */
  299 + switch (state->Vcc) {
  300 + case 50: reg |= I365_VCC_5V; break;
  301 + default: reg = 0; break;
  302 + }
  303 + switch (state->Vpp) {
  304 + case 50: reg |= I365_VPP1_5V | I365_VPP2_5V; break;
  305 + case 120: reg |= I365_VPP1_12V | I365_VPP2_12V; break;
  306 + }
  307 + }
  308 +
  309 + if (reg != old)
  310 + exca_writeb(socket, I365_POWER, reg);
  311 + } else {
  312 + u32 reg = 0; /* CB_SC_STPCLK? */
  313 + switch (state->Vcc) {
  314 + case 33: reg = CB_SC_VCC_3V; break;
  315 + case 50: reg = CB_SC_VCC_5V; break;
  316 + default: reg = 0; break;
  317 + }
  318 + switch (state->Vpp) {
  319 + case 33: reg |= CB_SC_VPP_3V; break;
  320 + case 50: reg |= CB_SC_VPP_5V; break;
  321 + case 120: reg |= CB_SC_VPP_12V; break;
  322 + }
  323 + if (reg != cb_readl(socket, CB_SOCKET_CONTROL))
  324 + cb_writel(socket, CB_SOCKET_CONTROL, reg);
254 325 }
255   - switch (state->Vpp) {
256   - case 33: reg |= CB_SC_VPP_3V; break;
257   - case 50: reg |= CB_SC_VPP_5V; break;
258   - case 120: reg |= CB_SC_VPP_12V; break;
259   - }
260   - if (reg != cb_readl(socket, CB_SOCKET_CONTROL))
261   - cb_writel(socket, CB_SOCKET_CONTROL, reg);
262 326 }
263 327  
264 328 static int yenta_set_socket(struct pcmcia_socket *sock, socket_state_t *state)
... ... @@ -751,6 +815,7 @@
751 815 CARDBUS_TYPE_TI12XX,
752 816 CARDBUS_TYPE_TI1250,
753 817 CARDBUS_TYPE_RICOH,
  818 + CARDBUS_TYPE_TOPIC95,
754 819 CARDBUS_TYPE_TOPIC97,
755 820 CARDBUS_TYPE_O2MICRO,
756 821 };
... ... @@ -789,6 +854,9 @@
789 854 .save_state = ricoh_save_state,
790 855 .restore_state = ricoh_restore_state,
791 856 },
  857 + [CARDBUS_TYPE_TOPIC95] = {
  858 + .override = topic95_override,
  859 + },
792 860 [CARDBUS_TYPE_TOPIC97] = {
793 861 .override = topic97_override,
794 862 },
... ... @@ -1196,6 +1264,7 @@
1196 1264 CB_ID(PCI_VENDOR_ID_RICOH, PCI_DEVICE_ID_RICOH_RL5C476, RICOH),
1197 1265 CB_ID(PCI_VENDOR_ID_RICOH, PCI_DEVICE_ID_RICOH_RL5C478, RICOH),
1198 1266  
  1267 + CB_ID(PCI_VENDOR_ID_TOSHIBA, PCI_DEVICE_ID_TOSHIBA_TOPIC95, TOPIC95),
1199 1268 CB_ID(PCI_VENDOR_ID_TOSHIBA, PCI_DEVICE_ID_TOSHIBA_TOPIC97, TOPIC97),
1200 1269 CB_ID(PCI_VENDOR_ID_TOSHIBA, PCI_DEVICE_ID_TOSHIBA_TOPIC100, TOPIC97),
1201 1270  
drivers/pcmcia/yenta_socket.h
... ... @@ -95,6 +95,12 @@
95 95 */
96 96 #define CB_MEM_PAGE(map) (0x40 + (map))
97 97  
  98 +
  99 +/* control how 16bit cards are powered */
  100 +#define YENTA_16BIT_POWER_EXCA 0x00000001
  101 +#define YENTA_16BIT_POWER_DF 0x00000002
  102 +
  103 +
98 104 struct yenta_socket;
99 105  
100 106 struct cardbus_type {
... ... @@ -112,6 +118,8 @@
112 118  
113 119 struct pcmcia_socket socket;
114 120 struct cardbus_type *type;
  121 +
  122 + u32 flags;
115 123  
116 124 /* for PCI interrupt probing */
117 125 unsigned int probe_status;