plumpower.c revision 1.1 1 /* $NetBSD: plumpower.c,v 1.1 1999/11/21 06:50:26 uch Exp $ */
2
3 /*
4 * Copyright (c) 1999, by UCHIYAMA Yasushi
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. The name of the developer may NOT be used to endorse or promote products
13 * derived from this software without specific prior written permission.
14 *
15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25 * SUCH DAMAGE.
26 *
27 */
28
29 #include "opt_tx39_debug.h"
30
31 #include <sys/param.h>
32 #include <sys/systm.h>
33 #include <sys/device.h>
34 #include <sys/malloc.h>
35
36 #include <machine/bus.h>
37 #include <machine/intr.h>
38
39 #include <hpcmips/tx/tx39var.h>
40 #include <hpcmips/dev/plumvar.h>
41 #include <hpcmips/dev/plumpowervar.h>
42 #include <hpcmips/dev/plumpowerreg.h>
43
44 int plumpower_match __P((struct device*, struct cfdata*, void*));
45 void plumpower_attach __P((struct device*, struct device*, void*));
46
47 struct plumpower_softc {
48 struct device sc_dev;
49 plum_chipset_tag_t sc_pc;
50 bus_space_tag_t sc_regt;
51 bus_space_handle_t sc_regh;
52 };
53
54 struct cfattach plumpower_ca = {
55 sizeof(struct plumpower_softc), plumpower_match, plumpower_attach
56 };
57
58 void plumpower_dump __P((struct plumpower_softc*));
59
60 int
61 plumpower_match(parent, cf, aux)
62 struct device *parent;
63 struct cfdata *cf;
64 void *aux;
65 {
66 return 2; /* 1st attach group */
67 }
68
69 void
70 plumpower_attach(parent, self, aux)
71 struct device *parent;
72 struct device *self;
73 void *aux;
74 {
75 struct plum_attach_args *pa = aux;
76 struct plumpower_softc *sc = (void*)self;
77
78 printf("\n");
79 sc->sc_pc = pa->pa_pc;
80 sc->sc_regt = pa->pa_regt;
81
82 if (bus_space_map(sc->sc_regt, PLUM_POWER_REGBASE,
83 PLUM_POWER_REGSIZE, 0, &sc->sc_regh)) {
84 printf(": register map failed\n");
85 return;
86 }
87 plum_conf_register_power(sc->sc_pc, (void*)sc);
88
89 #ifdef FULLPOWER
90 plum_conf_write(sc->sc_regt, sc->sc_regh, PLUM_POWER_PWRCONT_REG, ~0);
91 delay(1000*1000);
92 plum_conf_write(sc->sc_regt, sc->sc_regh, PLUM_POWER_CLKCONT_REG, ~0);
93 delay(1000*1000);
94 #endif
95 plumpower_dump(sc);
96
97 /* Enable MCS interface */
98 plum_conf_write(sc->sc_regt, sc->sc_regh, PLUM_POWER_INPENA_REG,
99 PLUM_POWER_INPENA);
100 }
101
102 void
103 plum_power_ioreset(pc)
104 plum_chipset_tag_t pc;
105 {
106 struct plumpower_softc *sc = pc->pc_powert;
107 bus_space_tag_t regt = sc->sc_regt;
108 bus_space_handle_t regh = sc->sc_regh;
109
110 plum_conf_write(regt, regh, PLUM_POWER_RESETC_REG,
111 PLUM_POWER_RESETC_IO5CL1 |
112 PLUM_POWER_RESETC_IO5CL1);
113 delay(100*1000);
114 plum_conf_write(regt, regh, PLUM_POWER_RESETC_REG, 0);
115 delay(100*1000);
116 }
117
118 void*
119 plum_power_establish(pc, src)
120 plum_chipset_tag_t pc;
121 int src;
122 {
123 struct plumpower_softc *sc = pc->pc_powert;
124 bus_space_tag_t regt = sc->sc_regt;
125 bus_space_handle_t regh = sc->sc_regh;
126 plumreg_t pwrreg, clkreg;
127
128 pwrreg = plum_conf_read(regt, regh, PLUM_POWER_PWRCONT_REG);
129 clkreg = plum_conf_read(regt, regh, PLUM_POWER_CLKCONT_REG);
130
131 switch(src) {
132 default:
133 panic("plum_power_establish: unknown power source");
134 case PLUM_PWR_LCD:
135 pwrreg |= (PLUM_POWER_PWRCONT_LCDOE |
136 PLUM_POWER_PWRCONT_LCDPWR |
137 PLUM_POWER_PWRCONT_LCDDSP);
138 break;
139 case PLUM_PWR_BKL:
140 pwrreg |= PLUM_POWER_PWRCONT_BKLIGHT;
141 break;
142 case PLUM_PWR_IO5:
143 pwrreg |= (PLUM_POWER_PWRCONT_IO5PWR |
144 PLUM_POWER_PWRCONT_IO5OE);
145 clkreg |= PLUM_POWER_CLKCONT_IO5CLK;
146 break;
147 case PLUM_PWR_EXTPW0:
148 pwrreg |= PLUM_POWER_PWRCONT_EXTPW0;
149 break;
150 case PLUM_PWR_EXTPW1:
151 pwrreg |= PLUM_POWER_PWRCONT_EXTPW1;
152 break;
153 case PLUM_PWR_EXTPW2:
154 pwrreg |= PLUM_POWER_PWRCONT_EXTPW2;
155 break;
156 case PLUM_PWR_USB:
157 pwrreg |= PLUM_POWER_PWRCONT_USBEN;
158 clkreg |= (PLUM_POWER_CLKCONT_USBCLK1 |
159 PLUM_POWER_CLKCONT_USBCLK2);
160 break;
161 case PLUM_PWR_SM:
162 clkreg |= PLUM_POWER_CLKCONT_SMCLK;
163 break;
164 case PLUM_PWR_PCC1:
165 clkreg |= PLUM_POWER_CLKCONT_PCCCLK1;
166 break;
167 case PLUM_PWR_PCC2:
168 clkreg |= PLUM_POWER_CLKCONT_PCCCLK2;
169 break;
170 }
171
172 plum_conf_write(regt, regh, PLUM_POWER_PWRCONT_REG, pwrreg);
173 plum_conf_write(regt, regh, PLUM_POWER_CLKCONT_REG, clkreg);
174
175 return (void*)src;
176 }
177
178 void
179 plum_power_disestablish(pc, ph)
180 plum_chipset_tag_t pc;
181 int ph;
182 {
183 struct plumpower_softc *sc = pc->pc_powert;
184 bus_space_tag_t regt = sc->sc_regt;
185 bus_space_handle_t regh = sc->sc_regh;
186 int src = (int)ph;
187 plumreg_t pwrreg, clkreg;
188
189 pwrreg = plum_conf_read(regt, regh, PLUM_POWER_PWRCONT_REG);
190 clkreg = plum_conf_read(regt, regh, PLUM_POWER_CLKCONT_REG);
191
192 switch(src) {
193 default:
194 panic("plum_power_disestablish: unknown power source");
195 case PLUM_PWR_LCD:
196 pwrreg &= ~(PLUM_POWER_PWRCONT_LCDOE |
197 PLUM_POWER_PWRCONT_LCDPWR |
198 PLUM_POWER_PWRCONT_LCDDSP);
199 break;
200 case PLUM_PWR_BKL:
201 pwrreg &= ~PLUM_POWER_PWRCONT_BKLIGHT;
202 break;
203 case PLUM_PWR_IO5:
204 pwrreg &= ~(PLUM_POWER_PWRCONT_IO5PWR |
205 PLUM_POWER_PWRCONT_IO5OE);
206 clkreg &= ~PLUM_POWER_CLKCONT_IO5CLK;
207 break;
208 case PLUM_PWR_EXTPW0:
209 pwrreg &= ~PLUM_POWER_PWRCONT_EXTPW0;
210 break;
211 case PLUM_PWR_EXTPW1:
212 pwrreg &= ~PLUM_POWER_PWRCONT_EXTPW1;
213 break;
214 case PLUM_PWR_EXTPW2:
215 pwrreg &= ~PLUM_POWER_PWRCONT_EXTPW2;
216 break;
217 case PLUM_PWR_USB:
218 pwrreg &= ~PLUM_POWER_PWRCONT_USBEN;
219 clkreg &= ~(PLUM_POWER_CLKCONT_USBCLK1 |
220 PLUM_POWER_CLKCONT_USBCLK2);
221 break;
222 case PLUM_PWR_SM:
223 clkreg &= ~PLUM_POWER_CLKCONT_SMCLK;
224 break;
225 case PLUM_PWR_PCC1:
226 clkreg &= ~PLUM_POWER_CLKCONT_PCCCLK1;
227 break;
228 case PLUM_PWR_PCC2:
229 clkreg &= ~PLUM_POWER_CLKCONT_PCCCLK2;
230 break;
231 }
232
233 plum_conf_write(regt, regh, PLUM_POWER_PWRCONT_REG, pwrreg);
234 plum_conf_write(regt, regh, PLUM_POWER_CLKCONT_REG, clkreg);
235
236 }
237
238 #define ISPOWERSUPPLY(r, m) __is_set_print(r, PLUM_POWER_PWRCONT_##m, #m)
239 #define ISCLOCKSUPPLY(r, m) __is_set_print(r, PLUM_POWER_CLKCONT_##m, #m)
240
241 void
242 plumpower_dump(sc)
243 struct plumpower_softc *sc;
244 {
245 bus_space_tag_t regt = sc->sc_regt;
246 bus_space_handle_t regh = sc->sc_regh;
247 plumreg_t reg;
248
249 reg = plum_conf_read(regt, regh, PLUM_POWER_PWRCONT_REG);
250 printf(" power:");
251 ISPOWERSUPPLY(reg, USBEN);
252 ISPOWERSUPPLY(reg, IO5OE);
253 ISPOWERSUPPLY(reg, LCDOE);
254 ISPOWERSUPPLY(reg, EXTPW2);
255 ISPOWERSUPPLY(reg, EXTPW1);
256 ISPOWERSUPPLY(reg, EXTPW0);
257 ISPOWERSUPPLY(reg, IO5PWR);
258 ISPOWERSUPPLY(reg, BKLIGHT);
259 ISPOWERSUPPLY(reg, LCDPWR);
260 ISPOWERSUPPLY(reg, LCDDSP);
261 reg = plum_conf_read(regt, regh, PLUM_POWER_CLKCONT_REG);
262 printf("\n clock:");
263 ISCLOCKSUPPLY(reg, USBCLK2);
264 ISCLOCKSUPPLY(reg, USBCLK1);
265 ISCLOCKSUPPLY(reg, IO5CLK);
266 ISCLOCKSUPPLY(reg, SMCLK);
267 ISCLOCKSUPPLY(reg, PCCCLK2);
268 ISCLOCKSUPPLY(reg, PCCCLK1);
269 reg = plum_conf_read(regt, regh, PLUM_POWER_INPENA_REG);
270 printf("\n MCS interface %sebled",
271 reg & PLUM_POWER_INPENA ? "en" : "dis");
272 reg = plum_conf_read(regt, regh, PLUM_POWER_RESETC_REG);
273 printf("\n IO5 reset:%s %s",
274 reg & PLUM_POWER_RESETC_IO5CL0 ? "CLRL" : "",
275 reg & PLUM_POWER_RESETC_IO5CL1 ? "CLRH" : "");
276
277 reg = plum_conf_read(regt, regh, PLUM_POWER_TESTMD_REG);
278 printf("\n Test mode set:");
279 bitdisp(reg);
280 printf("\n");
281 }
282
283
284