j6x0lcd.c revision 1.6.2.1 1 1.6.2.1 riz /* $NetBSD: j6x0lcd.c,v 1.6.2.1 2005/08/14 22:23:29 riz Exp $ */
2 1.1 uwe
3 1.1 uwe /*
4 1.6.2.1 riz * Copyright (c) 2004, 2005 Valeriy E. Ushakov
5 1.1 uwe * All rights reserved.
6 1.1 uwe *
7 1.1 uwe * Redistribution and use in source and binary forms, with or without
8 1.1 uwe * modification, are permitted provided that the following conditions
9 1.1 uwe * are met:
10 1.1 uwe * 1. Redistributions of source code must retain the above copyright
11 1.1 uwe * notice, this list of conditions and the following disclaimer.
12 1.1 uwe * 2. Redistributions in binary form must reproduce the above copyright
13 1.1 uwe * notice, this list of conditions and the following disclaimer in the
14 1.1 uwe * documentation and/or other materials provided with the distribution.
15 1.1 uwe * 3. The name of the author may not be used to endorse or promote products
16 1.1 uwe * derived from this software without specific prior written permission
17 1.1 uwe *
18 1.1 uwe * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
19 1.1 uwe * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20 1.1 uwe * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21 1.1 uwe * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22 1.1 uwe * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23 1.1 uwe * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24 1.1 uwe * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25 1.1 uwe * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 1.1 uwe * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27 1.1 uwe * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 1.1 uwe */
29 1.1 uwe
30 1.1 uwe #include <sys/cdefs.h>
31 1.6.2.1 riz __KERNEL_RCSID(0, "$NetBSD: j6x0lcd.c,v 1.6.2.1 2005/08/14 22:23:29 riz Exp $");
32 1.1 uwe
33 1.1 uwe #include <sys/param.h>
34 1.1 uwe #include <sys/kernel.h>
35 1.1 uwe #include <sys/device.h>
36 1.1 uwe #include <sys/systm.h>
37 1.1 uwe #ifdef GPROF
38 1.1 uwe #include <sys/gmon.h>
39 1.1 uwe #endif
40 1.1 uwe
41 1.1 uwe #include <machine/platid.h>
42 1.1 uwe #include <machine/platid_mask.h>
43 1.1 uwe
44 1.1 uwe #include <machine/config_hook.h>
45 1.1 uwe
46 1.1 uwe #include <sh3/dacreg.h>
47 1.1 uwe #include <hpcsh/dev/hd64461/hd64461var.h> /* XXX: for hd64461_reg_read_2 &c */
48 1.1 uwe #include <hpcsh/dev/hd64461/hd64461reg.h>
49 1.1 uwe #include <hpcsh/dev/hd64461/hd64461gpioreg.h>
50 1.1 uwe
51 1.6.2.1 riz #define arraysize(ary) (sizeof(ary) / sizeof(ary[0]))
52 1.6.2.1 riz
53 1.1 uwe
54 1.1 uwe /*
55 1.1 uwe * LCD power: controlled by pin 0 in HD64461 GPIO port B.
56 1.1 uwe * 0 - power on
57 1.1 uwe * 1 - power off
58 1.1 uwe */
59 1.6.2.1 riz #define HD64461_GPBDR_J6X0_LCD_OFF 0x01
60 1.1 uwe
61 1.6.2.1 riz #define HD64461_GPBCR_J6X0_LCD_OFF_MASK 0xfffc
62 1.6.2.1 riz #define HD64461_GPBCR_J6X0_LCD_OFF_BITS 0x0001
63 1.1 uwe
64 1.1 uwe
65 1.1 uwe /*
66 1.1 uwe * LCD brightness: controlled by DAC channel 0. Larger channel values
67 1.1 uwe * mean dimmer. Values smaller (i.e. brighter) then 0x5e seems to
68 1.1 uwe * result in no visible changes.
69 1.1 uwe */
70 1.1 uwe #define J6X0LCD_BRIGHTNESS_DA_MAX 0x5e
71 1.1 uwe #define J6X0LCD_BRIGHTNESS_DA_MIN 0xff
72 1.1 uwe
73 1.1 uwe #define J6X0LCD_DA_TO_BRIGHTNESS(da) \
74 1.1 uwe (J6X0LCD_BRIGHTNESS_DA_MIN - (da))
75 1.1 uwe
76 1.1 uwe #define J6X0LCD_BRIGHTNESS_TO_DA(br) \
77 1.1 uwe (J6X0LCD_BRIGHTNESS_DA_MIN - (br))
78 1.1 uwe
79 1.1 uwe #define J6X0LCD_BRIGHTNESS_MAX \
80 1.1 uwe J6X0LCD_DA_TO_BRIGHTNESS(J6X0LCD_BRIGHTNESS_DA_MAX)
81 1.1 uwe
82 1.1 uwe /* convenience macro to accesses DAC registers */
83 1.1 uwe #define DAC_(x) (*((volatile uint8_t *)SH7709_DA ## x))
84 1.1 uwe
85 1.1 uwe
86 1.1 uwe /*
87 1.6.2.1 riz * LCD contrast in 680 is controlled by pins 6..3 of HD64461 GPIO
88 1.6.2.1 riz * port B. 6th pin is the least significant bit, 3rd pin is the most
89 1.6.2.1 riz * significant. The bits are inverted: 0 = .1111...; 1 = .0111...;
90 1.6.2.1 riz * etc. Larger values mean "blacker".
91 1.1 uwe *
92 1.6.2.1 riz * The contrast value is programmed by setting bits in the data
93 1.6.2.1 riz * register to all ones, and changing the mode of the pins in the
94 1.6.2.1 riz * control register, setting logical "ones" to GPIO output mode (1),
95 1.6.2.1 riz * and switching "zeroes" to input mode (3).
96 1.1 uwe */
97 1.6.2.1 riz #define HD64461_GPBDR_J680_CONTRAST_BITS 0x78 /* set */
98 1.6.2.1 riz #define HD64461_GPBCR_J680_CONTRAST_MASK 0xc03f
99 1.1 uwe
100 1.6.2.1 riz static const uint8_t j6x0lcd_contrast680_pins[] = { 6, 5, 4, 3 };
101 1.1 uwe
102 1.6.2.1 riz static const uint16_t j6x0lcd_contrast680_control_bits[] = {
103 1.6.2.1 riz 0x1540, 0x3540, 0x1d40, 0x3d40, 0x1740, 0x3740, 0x1f40, 0x3f40,
104 1.6.2.1 riz 0x15c0, 0x35c0, 0x1dc0, 0x3dc0, 0x17c0, 0x37c0, 0x1fc0, 0x3fc0
105 1.1 uwe };
106 1.1 uwe
107 1.1 uwe
108 1.6.2.1 riz /*
109 1.6.2.1 riz * LCD contrast in 620lx is controlled by pins 7,6,3,4,5 of HD64461
110 1.6.2.1 riz * GPIO port B (in the order from the least significant to the most
111 1.6.2.1 riz * significant). The bits are inverted: 0 = 11111...; 5 = 01110...;
112 1.6.2.1 riz * etc. Larger values mean "whiter".
113 1.6.2.1 riz *
114 1.6.2.1 riz * The contrast value is programmed by setting bits in the data
115 1.6.2.1 riz * register to all zeroes, and changing the mode of the pins in the
116 1.6.2.1 riz * control register, setting logical "ones" to GPIO output mode (1),
117 1.6.2.1 riz * and switching "zeroes" to input mode (3).
118 1.6.2.1 riz */
119 1.6.2.1 riz #define HD64461_GPBDR_J620LX_CONTRAST_BITS 0xf8 /* clear */
120 1.6.2.1 riz #define HD64461_GPBCR_J620LX_CONTRAST_MASK 0x003f
121 1.6.2.1 riz
122 1.6.2.1 riz static const uint8_t j6x0lcd_contrast620lx_pins[] = { 7, 6, 3, 4, 5 };
123 1.6.2.1 riz
124 1.6.2.1 riz static const uint16_t j6x0lcd_contrast620lx_control_bits[] = {
125 1.6.2.1 riz 0xffc0, 0x7fc0, 0xdfc0, 0x5fc0, 0xff40, 0x7f40, 0xdf40, 0x5f40,
126 1.6.2.1 riz 0xfdc0, 0x7dc0, 0xddc0, 0x5dc0, 0xfd40, 0x7d40, 0xdd40, 0x5d40,
127 1.6.2.1 riz 0xf7c0, 0x77c0, 0xd7c0, 0x57c0, 0xf740, 0x7740, 0xd740, 0x5740,
128 1.6.2.1 riz 0xf5c0, 0x75c0, 0xd5c0, 0x55c0, 0xf540, 0x7540, 0xd540, 0x5540
129 1.1 uwe };
130 1.1 uwe
131 1.1 uwe
132 1.6.2.1 riz
133 1.1 uwe struct j6x0lcd_softc {
134 1.1 uwe struct device sc_dev;
135 1.1 uwe int sc_brightness;
136 1.1 uwe int sc_contrast;
137 1.6.2.1 riz
138 1.6.2.1 riz int sc_contrast_max;
139 1.6.2.1 riz uint16_t sc_contrast_mask;
140 1.6.2.1 riz const uint16_t *sc_contrast_control_bits;
141 1.1 uwe };
142 1.1 uwe
143 1.1 uwe static int j6x0lcd_match(struct device *, struct cfdata *, void *);
144 1.1 uwe static void j6x0lcd_attach(struct device *, struct device *, void *);
145 1.1 uwe
146 1.1 uwe CFATTACH_DECL(j6x0lcd, sizeof(struct j6x0lcd_softc),
147 1.1 uwe j6x0lcd_match, j6x0lcd_attach, NULL, NULL);
148 1.1 uwe
149 1.1 uwe
150 1.1 uwe static int j6x0lcd_param(void *, int, long, void *);
151 1.1 uwe static int j6x0lcd_power(void *, int, long, void *);
152 1.1 uwe
153 1.6.2.1 riz static int j6x0lcd_contrast_raw(uint16_t, int, const uint8_t *);
154 1.6.2.1 riz static void j6x0lcd_contrast_set(struct j6x0lcd_softc *, int);
155 1.6.2.1 riz
156 1.6.2.1 riz
157 1.1 uwe
158 1.1 uwe static int
159 1.1 uwe j6x0lcd_match(struct device *parent, struct cfdata *cfp, void *aux)
160 1.1 uwe {
161 1.1 uwe
162 1.1 uwe /*
163 1.6.2.1 riz * XXX: platid_mask_MACH_HP_LX also matches 360LX. It's not
164 1.6.2.1 riz * confirmed whether touch panel in 360LX is connected this
165 1.6.2.1 riz * way. We may need to regroup platid masks.
166 1.1 uwe */
167 1.6.2.1 riz if (!platid_match(&platid, &platid_mask_MACH_HP_JORNADA_6XX)
168 1.6.2.1 riz && !platid_match(&platid, &platid_mask_MACH_HP_LX))
169 1.1 uwe return (0);
170 1.1 uwe
171 1.1 uwe if (strcmp(cfp->cf_name, "j6x0lcd") != 0)
172 1.1 uwe return (0);
173 1.1 uwe
174 1.1 uwe return (1);
175 1.1 uwe }
176 1.1 uwe
177 1.1 uwe
178 1.1 uwe static void
179 1.1 uwe j6x0lcd_attach(struct device *parent, struct device *self, void *aux)
180 1.1 uwe {
181 1.1 uwe struct j6x0lcd_softc *sc = (struct j6x0lcd_softc *)self;
182 1.1 uwe uint16_t bcr, bdr;
183 1.1 uwe uint8_t dcr, ddr;
184 1.1 uwe
185 1.4 uwe /*
186 1.1 uwe * Brightness is controlled by DAC channel 0.
187 1.1 uwe */
188 1.1 uwe dcr = DAC_(CR);
189 1.1 uwe dcr &= ~SH7709_DACR_DAE; /* want to control each channel separately */
190 1.1 uwe dcr |= SH7709_DACR_DAOE0; /* enable channel 0 */
191 1.1 uwe DAC_(CR) = dcr;
192 1.1 uwe
193 1.1 uwe ddr = DAC_(DR0);
194 1.1 uwe sc->sc_brightness = J6X0LCD_DA_TO_BRIGHTNESS(ddr);
195 1.1 uwe
196 1.1 uwe /*
197 1.1 uwe * Contrast and power are controlled by HD64461 GPIO port B.
198 1.1 uwe */
199 1.1 uwe bcr = hd64461_reg_read_2(HD64461_GPBCR_REG16);
200 1.1 uwe bdr = hd64461_reg_read_2(HD64461_GPBDR_REG16);
201 1.1 uwe
202 1.6.2.1 riz /*
203 1.6.2.1 riz * Make sure LCD is turned on.
204 1.6.2.1 riz */
205 1.6.2.1 riz bcr &= HD64461_GPBCR_J6X0_LCD_OFF_MASK;
206 1.6.2.1 riz bcr |= HD64461_GPBCR_J6X0_LCD_OFF_BITS; /* output mode */
207 1.1 uwe
208 1.6.2.1 riz bdr &= ~HD64461_GPBDR_J6X0_LCD_OFF;
209 1.1 uwe
210 1.6.2.1 riz /*
211 1.6.2.1 riz * 620LX and 680 have different contrast control.
212 1.6.2.1 riz */
213 1.6.2.1 riz if (platid_match(&platid, &platid_mask_MACH_HP_JORNADA_6XX)) {
214 1.6.2.1 riz bdr |= HD64461_GPBDR_J680_CONTRAST_BITS;
215 1.6.2.1 riz
216 1.6.2.1 riz sc->sc_contrast_mask =
217 1.6.2.1 riz HD64461_GPBCR_J680_CONTRAST_MASK;
218 1.6.2.1 riz sc->sc_contrast_control_bits =
219 1.6.2.1 riz j6x0lcd_contrast680_control_bits;
220 1.6.2.1 riz sc->sc_contrast_max =
221 1.6.2.1 riz arraysize(j6x0lcd_contrast680_control_bits) - 1;
222 1.6.2.1 riz
223 1.6.2.1 riz sc->sc_contrast = sc->sc_contrast_max
224 1.6.2.1 riz - j6x0lcd_contrast_raw(bcr,
225 1.6.2.1 riz arraysize(j6x0lcd_contrast680_pins),
226 1.6.2.1 riz j6x0lcd_contrast680_pins);
227 1.6.2.1 riz } else {
228 1.6.2.1 riz bdr &= ~HD64461_GPBDR_J620LX_CONTRAST_BITS;
229 1.6.2.1 riz
230 1.6.2.1 riz sc->sc_contrast_mask =
231 1.6.2.1 riz HD64461_GPBCR_J620LX_CONTRAST_MASK;
232 1.6.2.1 riz sc->sc_contrast_control_bits =
233 1.6.2.1 riz j6x0lcd_contrast620lx_control_bits;
234 1.6.2.1 riz sc->sc_contrast_max =
235 1.6.2.1 riz arraysize(j6x0lcd_contrast620lx_control_bits) - 1;
236 1.6.2.1 riz
237 1.6.2.1 riz sc->sc_contrast =
238 1.6.2.1 riz j6x0lcd_contrast_raw(bcr,
239 1.6.2.1 riz arraysize(j6x0lcd_contrast620lx_pins),
240 1.6.2.1 riz j6x0lcd_contrast620lx_pins);
241 1.6.2.1 riz }
242 1.1 uwe
243 1.1 uwe hd64461_reg_write_2(HD64461_GPBCR_REG16, bcr);
244 1.6.2.1 riz hd64461_reg_write_2(HD64461_GPBDR_REG16, bdr);
245 1.1 uwe
246 1.1 uwe printf(": brightness %d, contrast %d\n",
247 1.1 uwe sc->sc_brightness, sc->sc_contrast);
248 1.1 uwe
249 1.1 uwe
250 1.1 uwe /* LCD brightness hooks */
251 1.4 uwe config_hook(CONFIG_HOOK_GET, CONFIG_HOOK_BRIGHTNESS_MAX,
252 1.1 uwe CONFIG_HOOK_SHARE,
253 1.1 uwe j6x0lcd_param, sc);
254 1.4 uwe config_hook(CONFIG_HOOK_GET, CONFIG_HOOK_BRIGHTNESS,
255 1.1 uwe CONFIG_HOOK_SHARE,
256 1.1 uwe j6x0lcd_param, sc);
257 1.4 uwe config_hook(CONFIG_HOOK_SET, CONFIG_HOOK_BRIGHTNESS,
258 1.1 uwe CONFIG_HOOK_SHARE,
259 1.1 uwe j6x0lcd_param, sc);
260 1.1 uwe
261 1.1 uwe /* LCD contrast hooks */
262 1.4 uwe config_hook(CONFIG_HOOK_GET, CONFIG_HOOK_CONTRAST_MAX,
263 1.1 uwe CONFIG_HOOK_SHARE,
264 1.1 uwe j6x0lcd_param, sc);
265 1.4 uwe config_hook(CONFIG_HOOK_GET, CONFIG_HOOK_CONTRAST,
266 1.1 uwe CONFIG_HOOK_SHARE,
267 1.1 uwe j6x0lcd_param, sc);
268 1.4 uwe config_hook(CONFIG_HOOK_SET, CONFIG_HOOK_CONTRAST,
269 1.1 uwe CONFIG_HOOK_SHARE,
270 1.1 uwe j6x0lcd_param, sc);
271 1.1 uwe
272 1.1 uwe /* LCD on/off hook */
273 1.1 uwe config_hook(CONFIG_HOOK_POWERCONTROL,
274 1.2 uwe CONFIG_HOOK_POWERCONTROL_LCD,
275 1.1 uwe CONFIG_HOOK_SHARE,
276 1.1 uwe j6x0lcd_power, sc);
277 1.1 uwe }
278 1.1 uwe
279 1.1 uwe
280 1.6.2.1 riz /*
281 1.6.2.1 riz * Get raw contrast value programmed in GPIO port B control register.
282 1.6.2.1 riz * Used only at attach time to get initial contrast.
283 1.6.2.1 riz */
284 1.6.2.1 riz static int
285 1.6.2.1 riz j6x0lcd_contrast_raw(uint16_t bcr, int width, const uint8_t *pin)
286 1.6.2.1 riz {
287 1.6.2.1 riz int contrast;
288 1.6.2.1 riz int bit;
289 1.6.2.1 riz
290 1.6.2.1 riz contrast = 0;
291 1.6.2.1 riz for (bit = 0; bit < width; ++bit) {
292 1.6.2.1 riz unsigned int c, v;
293 1.6.2.1 riz
294 1.6.2.1 riz c = (bcr >> (pin[bit] << 1)) & 0x3;
295 1.6.2.1 riz if (c == 1) /* output mode? */
296 1.6.2.1 riz v = 1;
297 1.6.2.1 riz else
298 1.6.2.1 riz v = 0;
299 1.6.2.1 riz contrast |= (v << bit);
300 1.6.2.1 riz }
301 1.6.2.1 riz
302 1.6.2.1 riz return contrast;
303 1.6.2.1 riz }
304 1.6.2.1 riz
305 1.6.2.1 riz
306 1.6.2.1 riz /*
307 1.6.2.1 riz * Set contrast by programming GPIO port B control register.
308 1.6.2.1 riz * Data register has been initialized at attach time.
309 1.6.2.1 riz */
310 1.6.2.1 riz static void
311 1.6.2.1 riz j6x0lcd_contrast_set(struct j6x0lcd_softc *sc, int contrast)
312 1.6.2.1 riz {
313 1.6.2.1 riz uint16_t bcr;
314 1.6.2.1 riz
315 1.6.2.1 riz sc->sc_contrast = contrast;
316 1.6.2.1 riz
317 1.6.2.1 riz bcr = hd64461_reg_read_2(HD64461_GPBCR_REG16);
318 1.6.2.1 riz
319 1.6.2.1 riz bcr &= sc->sc_contrast_mask;
320 1.6.2.1 riz bcr |= sc->sc_contrast_control_bits[contrast];
321 1.6.2.1 riz
322 1.6.2.1 riz hd64461_reg_write_2(HD64461_GPBCR_REG16, bcr);
323 1.6.2.1 riz }
324 1.6.2.1 riz
325 1.6.2.1 riz
326 1.1 uwe static int
327 1.1 uwe j6x0lcd_param(ctx, type, id, msg)
328 1.1 uwe void *ctx;
329 1.1 uwe int type;
330 1.1 uwe long id;
331 1.1 uwe void *msg;
332 1.1 uwe {
333 1.1 uwe struct j6x0lcd_softc *sc = ctx;
334 1.1 uwe int value;
335 1.1 uwe uint8_t dr;
336 1.1 uwe
337 1.1 uwe switch (type) {
338 1.1 uwe case CONFIG_HOOK_GET:
339 1.1 uwe switch (id) {
340 1.1 uwe case CONFIG_HOOK_CONTRAST:
341 1.1 uwe *(int *)msg = sc->sc_contrast;
342 1.1 uwe return (0);
343 1.1 uwe
344 1.1 uwe case CONFIG_HOOK_CONTRAST_MAX:
345 1.6.2.1 riz *(int *)msg = sc->sc_contrast_max;
346 1.1 uwe return (0);
347 1.1 uwe
348 1.1 uwe case CONFIG_HOOK_BRIGHTNESS:
349 1.1 uwe *(int *)msg = sc->sc_brightness;
350 1.1 uwe return (0);
351 1.1 uwe
352 1.1 uwe case CONFIG_HOOK_BRIGHTNESS_MAX:
353 1.1 uwe *(int *)msg = J6X0LCD_BRIGHTNESS_MAX;
354 1.1 uwe return (0);
355 1.1 uwe }
356 1.1 uwe break;
357 1.1 uwe
358 1.1 uwe case CONFIG_HOOK_SET:
359 1.1 uwe value = *(int *)msg;
360 1.1 uwe if (value < 0)
361 1.1 uwe value = 0;
362 1.1 uwe
363 1.1 uwe switch (id) {
364 1.1 uwe case CONFIG_HOOK_CONTRAST:
365 1.6.2.1 riz if (value > sc->sc_contrast_max)
366 1.6.2.1 riz value = sc->sc_contrast_max;
367 1.6.2.1 riz j6x0lcd_contrast_set(sc, value);
368 1.1 uwe return (0);
369 1.1 uwe
370 1.1 uwe case CONFIG_HOOK_BRIGHTNESS:
371 1.1 uwe if (value > J6X0LCD_BRIGHTNESS_MAX)
372 1.1 uwe value = J6X0LCD_BRIGHTNESS_MAX;
373 1.1 uwe sc->sc_brightness = value;
374 1.1 uwe
375 1.1 uwe dr = J6X0LCD_BRIGHTNESS_TO_DA(value);
376 1.1 uwe DAC_(DR0) = dr;
377 1.1 uwe return (0);
378 1.1 uwe }
379 1.1 uwe break;
380 1.1 uwe }
381 1.1 uwe
382 1.1 uwe return (EINVAL);
383 1.1 uwe }
384 1.1 uwe
385 1.1 uwe
386 1.1 uwe static int
387 1.1 uwe j6x0lcd_power(ctx, type, id, msg)
388 1.4 uwe void *ctx;
389 1.4 uwe int type;
390 1.4 uwe long id;
391 1.1 uwe void *msg;
392 1.1 uwe {
393 1.1 uwe int on;
394 1.1 uwe uint16_t r;
395 1.1 uwe
396 1.1 uwe if (type != CONFIG_HOOK_POWERCONTROL
397 1.2 uwe || id != CONFIG_HOOK_POWERCONTROL_LCD)
398 1.1 uwe return (EINVAL);
399 1.1 uwe
400 1.1 uwe on = (int)msg;
401 1.1 uwe
402 1.1 uwe r = hd64461_reg_read_2(HD64461_GPBDR_REG16);
403 1.1 uwe if (on)
404 1.6.2.1 riz r &= ~HD64461_GPBDR_J6X0_LCD_OFF;
405 1.1 uwe else
406 1.6.2.1 riz r |= HD64461_GPBDR_J6X0_LCD_OFF;
407 1.1 uwe hd64461_reg_write_2(HD64461_GPBDR_REG16, r);
408 1.1 uwe
409 1.1 uwe return (0);
410 1.1 uwe }
411