vrc4172pwm.c revision 1.22 1 1.22 chs /* $NetBSD: vrc4172pwm.c,v 1.22 2012/10/27 17:17:55 chs Exp $ */
2 1.1 sato
3 1.1 sato /*
4 1.8 sato * Copyright (c) 2000,2001 SATO Kazumi. All rights reserved.
5 1.1 sato *
6 1.1 sato * Redistribution and use in source and binary forms, with or without
7 1.1 sato * modification, are permitted provided that the following conditions
8 1.1 sato * are met:
9 1.1 sato * 1. Redistributions of source code must retain the above copyright
10 1.1 sato * notice, this list of conditions and the following disclaimer.
11 1.1 sato * 2. Redistributions in binary form must reproduce the above copyright
12 1.1 sato * notice, this list of conditions and the following disclaimer in the
13 1.1 sato * documentation and/or other materials provided with the distribution.
14 1.1 sato *
15 1.1 sato * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16 1.1 sato * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 1.1 sato * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 1.1 sato * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19 1.1 sato * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20 1.1 sato * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21 1.1 sato * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22 1.1 sato * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23 1.1 sato * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24 1.1 sato * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25 1.1 sato * SUCH DAMAGE.
26 1.1 sato */
27 1.18 lukem
28 1.18 lukem #include <sys/cdefs.h>
29 1.22 chs __KERNEL_RCSID(0, "$NetBSD: vrc4172pwm.c,v 1.22 2012/10/27 17:17:55 chs Exp $");
30 1.1 sato
31 1.1 sato #include <sys/param.h>
32 1.1 sato #include <sys/systm.h>
33 1.1 sato #include <sys/device.h>
34 1.1 sato #include <sys/reboot.h>
35 1.1 sato
36 1.1 sato #include <machine/bus.h>
37 1.1 sato #include <machine/config_hook.h>
38 1.1 sato #include <machine/platid.h>
39 1.3 sato #include <machine/platid_mask.h>
40 1.1 sato
41 1.3 sato #include <hpcmips/vr/vr.h>
42 1.15 takemura #include <hpcmips/vr/vripif.h>
43 1.1 sato #include <hpcmips/vr/vrc4172pwmvar.h>
44 1.1 sato #include <hpcmips/vr/vrc4172pwmreg.h>
45 1.1 sato
46 1.3 sato #include "locators.h"
47 1.1 sato
48 1.1 sato #ifdef VRC2PWMDEBUG
49 1.1 sato #ifndef VRC2PWMDEBUG_CONF
50 1.1 sato #define VRC2PWMDEBUG_CONF 0
51 1.1 sato #endif /* VRC2PWMDEBUG_CONF */
52 1.1 sato int vrc4172pwmdebug = VRC2PWMDEBUG_CONF;
53 1.1 sato #define DPRINTF(arg) if (vrc4172pwmdebug) printf arg;
54 1.1 sato #define VPRINTF(arg) if (bootverbose||vrc4172pwmdebug) printf arg;
55 1.3 sato #define VDUMPREG(arg) if (bootverbose||vrc4172pwmdebug) vrc4172pwm_dumpreg(arg);
56 1.1 sato #else /* VRC2PWMDEBUG */
57 1.1 sato #define DPRINTF(arg)
58 1.1 sato #define VPRINTF(arg) if (bootverbose) printf arg;
59 1.3 sato #define VDUMPREG(arg) if (bootverbose) vrc4172pwm_dumpreg(arg);
60 1.1 sato #endif /* VRC2PWMDEBUG */
61 1.1 sato
62 1.22 chs static int vrc4172pwmprobe(device_t, cfdata_t, void *);
63 1.22 chs static void vrc4172pwmattach(device_t, device_t, void *);
64 1.1 sato
65 1.13 uch static void vrc4172pwm_write(struct vrc4172pwm_softc *, int, unsigned short);
66 1.13 uch static unsigned short vrc4172pwm_read(struct vrc4172pwm_softc *, int);
67 1.1 sato
68 1.13 uch static int vrc4172pwm_event(void *, int, long, void *);
69 1.13 uch static int vrc4172pwm_pmevent(void *, int, long, void *);
70 1.1 sato
71 1.13 uch static void vrc4172pwm_dumpreg(struct vrc4172pwm_softc *);
72 1.13 uch static void vrc4172pwm_init_brightness(struct vrc4172pwm_softc *);
73 1.13 uch void vrc4172pwm_light(struct vrc4172pwm_softc *, int);
74 1.13 uch int vrc4172pwm_get_light(struct vrc4172pwm_softc *);
75 1.13 uch int vrc4172pwm_get_brightness(struct vrc4172pwm_softc *);
76 1.13 uch void vrc4172pwm_set_brightness(struct vrc4172pwm_softc *, int);
77 1.13 uch int vrc4172pwm_rawduty2brightness(struct vrc4172pwm_softc *);
78 1.13 uch int vrc4172pwm_brightness2rawduty(struct vrc4172pwm_softc *);
79 1.13 uch struct vrc4172pwm_param * vrc4172pwm_getparam(void);
80 1.13 uch void vrc4172pwm_dumpreg(struct vrc4172pwm_softc *);
81 1.1 sato
82 1.22 chs CFATTACH_DECL_NEW(vrc4172pwm, sizeof(struct vrc4172pwm_softc),
83 1.17 thorpej vrc4172pwmprobe, vrc4172pwmattach, NULL, NULL);
84 1.3 sato
85 1.3 sato /*
86 1.3 sato * platform related parameters
87 1.3 sato */
88 1.11 sato struct vrc4172pwm_param vrc4172pwm_mcr520_param = {
89 1.11 sato 1, /* probe broken */
90 1.11 sato 8, /* levels */
91 1.11 sato { 0x16, 0x1f, 0x24, 0x2a, 0x2f, 0x34, 0x3a, 0x3f }
92 1.11 sato };
93 1.11 sato
94 1.3 sato struct vrc4172pwm_param vrc4172pwm_mcr530_param = {
95 1.8 sato 0,
96 1.11 sato 8, /* levels */
97 1.3 sato { 0x16, 0x1b, 0x20, 0x25, 0x2a, 0x30, 0x37, 0x3f }
98 1.3 sato };
99 1.1 sato
100 1.8 sato struct vrc4172pwm_param vrc4172pwm_mcr700_param = {
101 1.8 sato 1, /* probe broken */
102 1.11 sato 8, /* levels */
103 1.8 sato { 0x12, 0x15, 0x18, 0x1d, 0x24, 0x2d, 0x38, 0x3f }
104 1.8 sato };
105 1.8 sato
106 1.9 sato struct vrc4172pwm_param vrc4172pwm_sigmarion_param = {
107 1.9 sato 0,
108 1.11 sato 8, /* levels */
109 1.9 sato { 0xe, 0x13, 0x18, 0x1c, 0x23, 0x29, 0x32, 0x3f }
110 1.9 sato };
111 1.9 sato
112 1.9 sato
113 1.4 sato struct platid_data vrc4172pwm_platid_param_table[] = {
114 1.13 uch { &platid_mask_MACH_NEC_MCR_430, &vrc4172pwm_mcr530_param},
115 1.13 uch { &platid_mask_MACH_NEC_MCR_510, &vrc4172pwm_mcr520_param},
116 1.13 uch { &platid_mask_MACH_NEC_MCR_520, &vrc4172pwm_mcr520_param},
117 1.13 uch { &platid_mask_MACH_NEC_MCR_520A, &vrc4172pwm_mcr520_param},
118 1.13 uch { &platid_mask_MACH_NEC_MCR_530, &vrc4172pwm_mcr530_param},
119 1.13 uch { &platid_mask_MACH_NEC_MCR_530A, &vrc4172pwm_mcr530_param},
120 1.13 uch { &platid_mask_MACH_NEC_MCR_SIGMARION, &vrc4172pwm_sigmarion_param},
121 1.13 uch { &platid_mask_MACH_NEC_MCR_700, &vrc4172pwm_mcr700_param},
122 1.13 uch { &platid_mask_MACH_NEC_MCR_700A, &vrc4172pwm_mcr700_param},
123 1.19 shin { &platid_mask_MACH_NEC_MCR_730, &vrc4172pwm_mcr700_param},
124 1.19 shin { &platid_mask_MACH_NEC_MCR_730A, &vrc4172pwm_mcr700_param},
125 1.3 sato { NULL, NULL}
126 1.1 sato };
127 1.1 sato
128 1.1 sato struct vrc4172pwm_softc *this_pwm;
129 1.1 sato
130 1.1 sato static inline void
131 1.13 uch vrc4172pwm_write(struct vrc4172pwm_softc *sc, int port, unsigned short val)
132 1.1 sato {
133 1.13 uch
134 1.1 sato bus_space_write_2(sc->sc_iot, sc->sc_ioh, port, val);
135 1.1 sato }
136 1.1 sato
137 1.1 sato static inline unsigned short
138 1.13 uch vrc4172pwm_read(struct vrc4172pwm_softc *sc, int port)
139 1.1 sato {
140 1.13 uch
141 1.13 uch return (bus_space_read_2(sc->sc_iot, sc->sc_ioh, port));
142 1.1 sato }
143 1.1 sato
144 1.1 sato static int
145 1.22 chs vrc4172pwmprobe(device_t parent, cfdata_t cf, void *aux)
146 1.1 sato {
147 1.3 sato platid_mask_t mask;
148 1.3 sato struct vrip_attach_args *va = aux;
149 1.3 sato bus_space_handle_t ioh;
150 1.8 sato #ifdef VRC4172PWM_BROKEN_PROBE
151 1.8 sato int probe = 0;
152 1.8 sato #else /* VRC4172PWM_BROKEN_PROBE */
153 1.8 sato int probe = 1;
154 1.8 sato #endif /* VRC4172PWM_BROKEN_PROBE */
155 1.3 sato int data;
156 1.8 sato int data2;
157 1.8 sato struct vrc4172pwm_param *param;
158 1.3 sato int ret = 0;
159 1.3 sato
160 1.15 takemura if (va->va_addr == VRIPIFCF_ADDR_DEFAULT)
161 1.13 uch return (0);
162 1.3 sato
163 1.15 takemura if (cf->cf_loc[VRIPIFCF_PLATFORM] == 0)
164 1.13 uch return (0);
165 1.15 takemura if (cf->cf_loc[VRIPIFCF_PLATFORM] != -1) { /* if specify */
166 1.15 takemura mask = PLATID_DEREF(cf->cf_loc[VRIPIFCF_PLATFORM]);
167 1.8 sato VPRINTF(("vrc4172pwmprobe: check platid\n"));
168 1.3 sato if (platid_match(&platid, &mask) == 0)
169 1.13 uch return (0);
170 1.8 sato param = vrc4172pwm_getparam();
171 1.8 sato if (param != NULL && param->brokenprobe)
172 1.8 sato probe = 0;
173 1.3 sato }
174 1.8 sato if (probe) {
175 1.13 uch if (bus_space_map(va->va_iot, va->va_addr, va->va_size, 0,
176 1.13 uch &ioh)) {
177 1.13 uch return (0);
178 1.8 sato }
179 1.8 sato data = bus_space_read_2(va->va_iot, ioh, VRC2_PWM_LCDDUTYEN);
180 1.8 sato bus_space_write_2(va->va_iot, ioh, VRC2_PWM_LCDDUTYEN, 0xff);
181 1.13 uch if ((data2 = bus_space_read_2(va->va_iot, ioh,
182 1.13 uch VRC2_PWM_LCDDUTYEN)) == VRC2_PWM_LCDEN_MASK) {
183 1.13 uch VPRINTF(("vrc4172pwmprobe:"
184 1.13 uch " VRC2_PWM_LCDDUTYEN found\n"));
185 1.8 sato ret = 1;
186 1.8 sato } else {
187 1.13 uch VPRINTF(("vrc4172pwmprobe: VRC2_PWM_LCDDUTYEN"
188 1.13 uch " not found org=%x, data=%x!=%x\n",
189 1.13 uch data, data2, VRC2_PWM_LCDEN_MASK));
190 1.8 sato }
191 1.8 sato bus_space_write_2(va->va_iot, ioh, VRC2_PWM_LCDDUTYEN, data);
192 1.8 sato bus_space_unmap(va->va_iot, ioh, va->va_size);
193 1.8 sato } else
194 1.3 sato ret = 1;
195 1.8 sato VPRINTF(("vrc4172pwmprobe: return %d\n", ret));
196 1.13 uch
197 1.13 uch return (ret);
198 1.1 sato }
199 1.1 sato
200 1.1 sato static void
201 1.22 chs vrc4172pwmattach(device_t parent, device_t self, void *aux)
202 1.1 sato {
203 1.22 chs struct vrc4172pwm_softc *sc = device_private(self);
204 1.1 sato struct vrip_attach_args *va = aux;
205 1.1 sato
206 1.1 sato bus_space_tag_t iot = va->va_iot;
207 1.1 sato bus_space_handle_t ioh;
208 1.1 sato
209 1.1 sato if (bus_space_map(iot, va->va_addr, 1, 0, &ioh)) {
210 1.1 sato printf(": can't map bus space\n");
211 1.1 sato return;
212 1.1 sato }
213 1.1 sato
214 1.1 sato sc->sc_iot = iot;
215 1.1 sato sc->sc_ioh = ioh;
216 1.1 sato
217 1.1 sato printf("\n");
218 1.1 sato
219 1.1 sato VDUMPREG(sc);
220 1.1 sato /* basic setup */
221 1.1 sato sc->sc_pmhook = config_hook(CONFIG_HOOK_PMEVENT,
222 1.13 uch CONFIG_HOOK_PMEVENT_HARDPOWER, CONFIG_HOOK_SHARE,
223 1.13 uch vrc4172pwm_pmevent, sc);
224 1.3 sato sc->sc_lcdhook = config_hook(CONFIG_HOOK_POWERCONTROL,
225 1.13 uch CONFIG_HOOK_POWERCONTROL_LCDLIGHT, CONFIG_HOOK_SHARE,
226 1.13 uch vrc4172pwm_event, sc);
227 1.3 sato sc->sc_getlcdhook = config_hook(CONFIG_HOOK_GET,
228 1.13 uch CONFIG_HOOK_POWER_LCDLIGHT, CONFIG_HOOK_SHARE,
229 1.13 uch vrc4172pwm_event, sc);
230 1.1 sato sc->sc_sethook = config_hook(CONFIG_HOOK_SET,
231 1.13 uch CONFIG_HOOK_BRIGHTNESS, CONFIG_HOOK_SHARE,
232 1.13 uch vrc4172pwm_event, sc);
233 1.1 sato sc->sc_gethook = config_hook(CONFIG_HOOK_GET,
234 1.13 uch CONFIG_HOOK_BRIGHTNESS, CONFIG_HOOK_SHARE,
235 1.13 uch vrc4172pwm_event, sc);
236 1.3 sato sc->sc_getmaxhook = config_hook(CONFIG_HOOK_GET,
237 1.13 uch CONFIG_HOOK_BRIGHTNESS_MAX, CONFIG_HOOK_SHARE,
238 1.13 uch vrc4172pwm_event, sc);
239 1.1 sato
240 1.3 sato vrc4172pwm_init_brightness(sc);
241 1.11 sato if (sc->sc_param == NULL)
242 1.13 uch printf("vrc4172pwm: NO parameter found. DISABLE pwm control\n");
243 1.1 sato this_pwm = sc;
244 1.1 sato }
245 1.1 sato
246 1.3 sato /*
247 1.3 sato * get platform related brightness paramerters
248 1.3 sato */
249 1.3 sato struct vrc4172pwm_param *
250 1.21 matt vrc4172pwm_getparam(void)
251 1.3 sato {
252 1.4 sato struct platid_data *p;
253 1.3 sato
254 1.14 takemura if ((p = platid_search_data(&platid, vrc4172pwm_platid_param_table)))
255 1.13 uch return (p->data);
256 1.13 uch
257 1.13 uch return (NULL);
258 1.3 sato }
259 1.3 sato
260 1.2 sato /*
261 1.2 sato *
262 1.2 sato * Initialize PWM brightness parameters
263 1.2 sato *
264 1.2 sato */
265 1.2 sato void
266 1.13 uch vrc4172pwm_init_brightness(struct vrc4172pwm_softc *sc)
267 1.2 sato {
268 1.3 sato sc->sc_param = vrc4172pwm_getparam();
269 1.2 sato sc->sc_raw_freq = vrc4172pwm_read(sc, VRC2_PWM_LCDFREQ);
270 1.2 sato sc->sc_raw_duty = vrc4172pwm_read(sc, VRC2_PWM_LCDDUTY);
271 1.3 sato sc->sc_brightness = vrc4172pwm_rawduty2brightness(sc);
272 1.10 sato sc->sc_light = vrc4172pwm_get_light(sc);
273 1.13 uch DPRINTF(("vrc4172pwm_init_brightness: param=0x%x, freq=0x%x,"
274 1.13 uch " duty=0x%x, blightness=%d light=%d\n", (int)sc->sc_param,
275 1.13 uch sc->sc_raw_freq, sc->sc_raw_duty, sc->sc_brightness,
276 1.13 uch sc->sc_light));
277 1.3 sato }
278 1.3 sato /*
279 1.3 sato * backlight on/off
280 1.3 sato */
281 1.3 sato void
282 1.13 uch vrc4172pwm_light(struct vrc4172pwm_softc *sc, int on)
283 1.3 sato {
284 1.6 sato int brightness;
285 1.6 sato
286 1.5 sato DPRINTF(("vrc4172pwm_light: %s\n", on?"ON":"OFF"));
287 1.6 sato if (on) {
288 1.6 sato vrc4172pwm_set_brightness(sc, sc->sc_brightness);
289 1.3 sato vrc4172pwm_write(sc, VRC2_PWM_LCDDUTYEN, VRC2_PWM_LCD_EN);
290 1.6 sato } else {
291 1.6 sato brightness = sc->sc_brightness; /* save */
292 1.6 sato vrc4172pwm_set_brightness(sc, 0);
293 1.13 uch /* need this, break sc->sc_brightness */
294 1.6 sato sc->sc_brightness = brightness; /* resume */
295 1.3 sato vrc4172pwm_write(sc, VRC2_PWM_LCDDUTYEN, VRC2_PWM_LCD_DIS);
296 1.6 sato }
297 1.10 sato sc->sc_light = on;
298 1.3 sato }
299 1.3 sato
300 1.3 sato /*
301 1.3 sato * get backlight on/off
302 1.3 sato */
303 1.10 sato int
304 1.13 uch vrc4172pwm_get_light(struct vrc4172pwm_softc *sc)
305 1.3 sato {
306 1.13 uch
307 1.13 uch return (VRC2_PWM_LCDEN_MASK&vrc4172pwm_read(sc, VRC2_PWM_LCDDUTYEN));
308 1.3 sato }
309 1.3 sato
310 1.3 sato /*
311 1.3 sato * set brightness
312 1.3 sato */
313 1.3 sato void
314 1.13 uch vrc4172pwm_set_brightness(struct vrc4172pwm_softc *sc, int val)
315 1.3 sato {
316 1.3 sato int raw;
317 1.3 sato
318 1.3 sato if (sc->sc_param == NULL)
319 1.3 sato return;
320 1.5 sato if (val < 0)
321 1.5 sato val = 0;
322 1.3 sato if (val > VRC2_PWM_MAX_BRIGHTNESS)
323 1.3 sato val = VRC2_PWM_MAX_BRIGHTNESS;
324 1.3 sato if (val > sc->sc_param->n_brightness)
325 1.3 sato val = sc->sc_param->n_brightness;
326 1.3 sato sc->sc_brightness = val;
327 1.3 sato raw = vrc4172pwm_brightness2rawduty(sc);
328 1.3 sato vrc4172pwm_write(sc, VRC2_PWM_LCDDUTY, raw);
329 1.5 sato DPRINTF(("vrc4172pwm_set_brightness: val=%d raw=0x%x\n", val, raw));
330 1.3 sato }
331 1.3 sato
332 1.3 sato /*
333 1.3 sato * get brightness
334 1.3 sato */
335 1.3 sato int
336 1.13 uch vrc4172pwm_get_brightness(struct vrc4172pwm_softc *sc)
337 1.3 sato {
338 1.13 uch
339 1.3 sato if (sc->sc_param == NULL)
340 1.13 uch return (VRC2_PWM_MAX_BRIGHTNESS);
341 1.13 uch
342 1.13 uch return (sc->sc_brightness);
343 1.3 sato }
344 1.3 sato
345 1.3 sato /*
346 1.3 sato * PWM duty to brightness
347 1.3 sato */
348 1.3 sato int
349 1.13 uch vrc4172pwm_rawduty2brightness(struct vrc4172pwm_softc *sc)
350 1.3 sato {
351 1.3 sato int i;
352 1.3 sato
353 1.3 sato if (sc->sc_param == NULL)
354 1.13 uch return (VRC2_PWM_MAX_BRIGHTNESS);
355 1.3 sato for (i = 0; i < sc->sc_param->n_brightness; i++) {
356 1.8 sato if (sc->sc_raw_duty <= sc->sc_param->bvalues[i])
357 1.3 sato break;
358 1.3 sato }
359 1.3 sato if (i >= sc->sc_param->n_brightness-1)
360 1.13 uch return (sc->sc_param->n_brightness-1);
361 1.3 sato else
362 1.13 uch return (i);
363 1.3 sato
364 1.3 sato }
365 1.3 sato
366 1.3 sato /*
367 1.3 sato * brightness to raw duty
368 1.3 sato */
369 1.3 sato int
370 1.13 uch vrc4172pwm_brightness2rawduty(struct vrc4172pwm_softc *sc)
371 1.3 sato {
372 1.13 uch
373 1.3 sato if (sc->sc_param == NULL)
374 1.13 uch return (VRC2_PWM_LCDDUTY_MASK);
375 1.13 uch
376 1.13 uch return (sc->sc_param->bvalues[sc->sc_brightness]);
377 1.2 sato }
378 1.1 sato
379 1.3 sato
380 1.1 sato /*
381 1.1 sato * PWM config hook events
382 1.1 sato *
383 1.1 sato */
384 1.1 sato int
385 1.13 uch vrc4172pwm_event(void *ctx, int type, long id, void *msg)
386 1.1 sato {
387 1.1 sato struct vrc4172pwm_softc *sc = (struct vrc4172pwm_softc *)ctx;
388 1.1 sato int why =(int)msg;
389 1.1 sato
390 1.1 sato if (type == CONFIG_HOOK_POWERCONTROL
391 1.13 uch && id == CONFIG_HOOK_POWERCONTROL_LCDLIGHT) {
392 1.7 sato DPRINTF(("vrc4172pwm:POWERCONTROL_LCDLIGHT: %d\n", why));
393 1.2 sato vrc4172pwm_light(sc, why);
394 1.1 sato } else if (type == CONFIG_HOOK_GET
395 1.13 uch && id == CONFIG_HOOK_POWER_LCDLIGHT) {
396 1.3 sato *(int *)msg = vrc4172pwm_get_light(sc);
397 1.7 sato DPRINTF(("vrc4172pwm:GET LCDLIGHT: %d\n", *(int *)msg));
398 1.3 sato } else if (type == CONFIG_HOOK_GET
399 1.13 uch && id == CONFIG_HOOK_BRIGHTNESS) {
400 1.3 sato *(int *)msg = vrc4172pwm_get_brightness(sc);
401 1.7 sato DPRINTF(("vrc4172pwm:GET BRIGHTNESS: %d\n", *(int *)msg));
402 1.3 sato } else if (type == CONFIG_HOOK_GET
403 1.13 uch && id == CONFIG_HOOK_BRIGHTNESS_MAX) {
404 1.3 sato if (sc->sc_param == NULL)
405 1.3 sato *(int *)msg = VRC2_PWM_MAX_BRIGHTNESS;
406 1.3 sato else
407 1.3 sato *(int *)msg = sc->sc_param->n_brightness-1;
408 1.7 sato DPRINTF(("vrc4172pwm:GET MAX BRIGHTNESS: %d\n", *(int *)msg));
409 1.1 sato } else if (type == CONFIG_HOOK_SET
410 1.13 uch && id == CONFIG_HOOK_BRIGHTNESS) {
411 1.7 sato DPRINTF(("vrc4172pwm:SET BRIGHTNESS: %d\n", *(int *)msg));
412 1.3 sato vrc4172pwm_set_brightness(sc, *(int *)msg);
413 1.6 sato } else {
414 1.13 uch DPRINTF(("vrc4172pwm:unknown event: type %d id %ld\n",
415 1.13 uch type, id));
416 1.13 uch return (1);
417 1.6 sato }
418 1.1 sato
419 1.1 sato return (0);
420 1.1 sato }
421 1.1 sato
422 1.1 sato /*
423 1.1 sato * PWM config hook events
424 1.1 sato *
425 1.1 sato */
426 1.1 sato int
427 1.13 uch vrc4172pwm_pmevent(void *ctx, int type, long id, void *msg)
428 1.1 sato {
429 1.1 sato struct vrc4172pwm_softc *sc = (struct vrc4172pwm_softc *)ctx;
430 1.1 sato int why =(int)msg;
431 1.1 sato
432 1.1 sato if (type != CONFIG_HOOK_PMEVENT)
433 1.13 uch return (1);
434 1.1 sato
435 1.1 sato switch (why) {
436 1.3 sato case PWR_STANDBY:
437 1.2 sato case PWR_SUSPEND:
438 1.10 sato sc->sc_light_save = sc->sc_light;
439 1.2 sato vrc4172pwm_light(sc, 0);
440 1.2 sato break;
441 1.2 sato case PWR_RESUME:
442 1.10 sato vrc4172pwm_light(sc, sc->sc_light_save);
443 1.2 sato break;
444 1.2 sato default:
445 1.13 uch return (1);
446 1.1 sato }
447 1.2 sato
448 1.1 sato return (0);
449 1.2 sato }
450 1.2 sato
451 1.2 sato /*
452 1.1 sato * dump pwm registers
453 1.1 sato */
454 1.1 sato void
455 1.13 uch vrc4172pwm_dumpreg(struct vrc4172pwm_softc *sc)
456 1.1 sato {
457 1.1 sato int en, freq, duty;
458 1.1 sato
459 1.1 sato en = vrc4172pwm_read(sc, VRC2_PWM_LCDDUTYEN);
460 1.1 sato freq = vrc4172pwm_read(sc, VRC2_PWM_LCDFREQ);
461 1.1 sato duty = vrc4172pwm_read(sc, VRC2_PWM_LCDDUTY);
462 1.1 sato
463 1.13 uch printf("vrc4172pwm: dumpreg: lightenable = %d,"
464 1.13 uch " freq = 0x%x, duty = 0x%x\n", en, freq, duty);
465 1.1 sato }
466 1.2 sato
467 1.1 sato /* end */
468