hc
2023-02-13 e440ec23c5a540cdd3f7464e8779219be6fd3d95
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
/*
 * topic.h 1.8 1999/08/28 04:01:47
 *
 * The contents of this file are subject to the Mozilla Public License
 * Version 1.1 (the "License"); you may not use this file except in
 * compliance with the License. You may obtain a copy of the License
 * at http://www.mozilla.org/MPL/
 *
 * Software distributed under the License is distributed on an "AS IS"
 * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
 * the License for the specific language governing rights and
 * limitations under the License. 
 *
 * The initial developer of the original code is David A. Hinds
 * <dahinds@users.sourceforge.net>.  Portions created by David A. Hinds
 * are Copyright (C) 1999 David A. Hinds.  All Rights Reserved.
 *
 * Alternatively, the contents of this file may be used under the
 * terms of the GNU General Public License version 2 (the "GPL"), in which
 * case the provisions of the GPL are applicable instead of the
 * above.  If you wish to allow the use of your version of this file
 * only under the terms of the GPL and not to allow others to use
 * your version of this file under the MPL, indicate your decision by
 * deleting the provisions above and replace them with the notice and
 * other provisions required by the GPL.  If you do not delete the
 * provisions above, a recipient may use your version of this file
 * under either the MPL or the GPL.
 * topic.h $Release$ 1999/08/28 04:01:47
 */
 
#ifndef _LINUX_TOPIC_H
#define _LINUX_TOPIC_H
 
/* Register definitions for Toshiba ToPIC95/97/100 controllers */
 
#define TOPIC_SOCKET_CONTROL        0x0090    /* 32 bit */
#define  TOPIC_SCR_IRQSEL        0x00000001
 
#define TOPIC_SLOT_CONTROL        0x00a0    /* 8 bit */
#define  TOPIC_SLOT_SLOTON        0x80
#define  TOPIC_SLOT_SLOTEN        0x40
#define  TOPIC_SLOT_ID_LOCK        0x20
#define  TOPIC_SLOT_ID_WP        0x10
#define  TOPIC_SLOT_PORT_MASK        0x0c
#define  TOPIC_SLOT_PORT_SHIFT        2
#define  TOPIC_SLOT_OFS_MASK        0x03
 
#define TOPIC_CARD_CONTROL        0x00a1    /* 8 bit */
#define  TOPIC_CCR_INTB            0x20
#define  TOPIC_CCR_INTA            0x10
#define  TOPIC_CCR_CLOCK        0x0c
#define  TOPIC_CCR_PCICLK        0x0c
#define  TOPIC_CCR_PCICLK_2        0x08
#define  TOPIC_CCR_CCLK            0x04
 
#define TOPIC97_INT_CONTROL        0x00a1    /* 8 bit */
#define  TOPIC97_ICR_INTB        0x20
#define  TOPIC97_ICR_INTA        0x10
#define  TOPIC97_ICR_STSIRQNP        0x04
#define  TOPIC97_ICR_IRQNP        0x02
#define  TOPIC97_ICR_IRQSEL        0x01
 
#define TOPIC_CARD_DETECT        0x00a3    /* 8 bit */
#define  TOPIC_CDR_MODE_PC32        0x80
#define  TOPIC_CDR_VS1            0x04
#define  TOPIC_CDR_VS2            0x02
#define  TOPIC_CDR_SW_DETECT        0x01
 
#define TOPIC_REGISTER_CONTROL        0x00a4    /* 32 bit */
#define  TOPIC_RCR_RESUME_RESET        0x80000000
#define  TOPIC_RCR_REMOVE_RESET        0x40000000
#define  TOPIC97_RCR_CLKRUN_ENA        0x20000000
#define  TOPIC97_RCR_TESTMODE        0x10000000
#define  TOPIC97_RCR_IOPLUP        0x08000000
#define  TOPIC_RCR_BUFOFF_PWROFF    0x02000000
#define  TOPIC_RCR_BUFOFF_SIGOFF    0x01000000
#define  TOPIC97_RCR_CB_DEV_MASK    0x0000f800
#define  TOPIC97_RCR_CB_DEV_SHIFT    11
#define  TOPIC97_RCR_RI_DISABLE        0x00000004
#define  TOPIC97_RCR_CAUDIO_OFF        0x00000002
#define  TOPIC_RCR_CAUDIO_INVERT    0x00000001
 
#define TOPIC97_MISC1            0x00ad  /* 8bit */
#define  TOPIC97_MISC1_CLOCKRUN_ENABLE    0x80
#define  TOPIC97_MISC1_CLOCKRUN_MODE    0x40
#define  TOPIC97_MISC1_DETECT_REQ_ENA    0x10
#define  TOPIC97_MISC1_SCK_CLEAR_DIS    0x04
#define  TOPIC97_MISC1_R2_LOW_ENABLE    0x10
 
#define TOPIC97_MISC2            0x00ae  /* 8 bit */
#define  TOPIC97_MISC2_SPWRCLK_MASK    0x70
#define  TOPIC97_MISC2_SPWRMOD        0x08
#define  TOPIC97_MISC2_SPWR_ENABLE    0x04
#define  TOPIC97_MISC2_ZV_MODE        0x02
#define  TOPIC97_MISC2_ZV_ENABLE    0x01
 
#define TOPIC97_ZOOM_VIDEO_CONTROL    0x009c  /* 8 bit */
#define  TOPIC97_ZV_CONTROL_ENABLE    0x01
 
#define TOPIC97_AUDIO_VIDEO_SWITCH    0x003c  /* 8 bit */
#define  TOPIC97_AVS_AUDIO_CONTROL    0x02
#define  TOPIC97_AVS_VIDEO_CONTROL    0x01
 
#define TOPIC_EXCA_IF_CONTROL        0x3e    /* 8 bit */
#define TOPIC_EXCA_IFC_33V_ENA        0x01
 
#define TOPIC_PCI_CFG_PPBCN        0x3e    /* 16-bit */
#define TOPIC_PCI_CFG_PPBCN_WBEN    0x0400
 
static void topic97_zoom_video(struct pcmcia_socket *sock, int onoff)
{
   struct yenta_socket *socket = container_of(sock, struct yenta_socket, socket);
   u8 reg_zv, reg;
 
   reg_zv = config_readb(socket, TOPIC97_ZOOM_VIDEO_CONTROL);
   if (onoff) {
       reg_zv |= TOPIC97_ZV_CONTROL_ENABLE;
       config_writeb(socket, TOPIC97_ZOOM_VIDEO_CONTROL, reg_zv);
 
       reg = config_readb(socket, TOPIC97_AUDIO_VIDEO_SWITCH);
       reg |= TOPIC97_AVS_AUDIO_CONTROL | TOPIC97_AVS_VIDEO_CONTROL;
       config_writeb(socket, TOPIC97_AUDIO_VIDEO_SWITCH, reg);
   } else {
       reg_zv &= ~TOPIC97_ZV_CONTROL_ENABLE;
       config_writeb(socket, TOPIC97_ZOOM_VIDEO_CONTROL, reg_zv);
 
       reg = config_readb(socket, TOPIC97_AUDIO_VIDEO_SWITCH);
       reg &= ~(TOPIC97_AVS_AUDIO_CONTROL | TOPIC97_AVS_VIDEO_CONTROL);
       config_writeb(socket, TOPIC97_AUDIO_VIDEO_SWITCH, reg);
   }
}
 
static int topic97_override(struct yenta_socket *socket)
{
   /* ToPIC97/100 support ZV */
   socket->socket.zoom_video = topic97_zoom_video;
   return 0;
}
 
 
static int topic95_override(struct yenta_socket *socket)
{
   u8 fctrl;
   u16 ppbcn;
 
   /* enable 3.3V support for 16bit cards */
   fctrl = exca_readb(socket, TOPIC_EXCA_IF_CONTROL);
   exca_writeb(socket, TOPIC_EXCA_IF_CONTROL, fctrl | TOPIC_EXCA_IFC_33V_ENA);
 
   /* tell yenta to use exca registers to power 16bit cards */
   socket->flags |= YENTA_16BIT_POWER_EXCA | YENTA_16BIT_POWER_DF;
 
   /* Disable write buffers to prevent lockups under load with numerous
      Cardbus cards, observed on Tecra 500CDT and reported elsewhere on the
      net.  This is not a power-on default according to the datasheet
      but some BIOSes seem to set it. */
   if (pci_read_config_word(socket->dev, TOPIC_PCI_CFG_PPBCN, &ppbcn) == 0
       && socket->dev->revision <= 7
       && (ppbcn & TOPIC_PCI_CFG_PPBCN_WBEN)) {
       ppbcn &= ~TOPIC_PCI_CFG_PPBCN_WBEN;
       pci_write_config_word(socket->dev, TOPIC_PCI_CFG_PPBCN, ppbcn);
       dev_info(&socket->dev->dev, "Disabled ToPIC95 Cardbus write buffers.\n");
   }
 
   return 0;
}
 
#endif /* _LINUX_TOPIC_H */