Home | History | Annotate | Line # | Download | only in dev
j6x0lcd.c revision 1.7
      1  1.7  uwe /*	$NetBSD: j6x0lcd.c,v 1.7 2005/08/03 22:25:17 uwe Exp $ */
      2  1.1  uwe 
      3  1.1  uwe /*
      4  1.7  uwe  * 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.7  uwe __KERNEL_RCSID(0, "$NetBSD: j6x0lcd.c,v 1.7 2005/08/03 22:25:17 uwe 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.7  uwe #define arraysize(ary) (sizeof(ary) / sizeof(ary[0]))
     52  1.7  uwe 
     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.7  uwe #define HD64461_GPBDR_J6X0_LCD_OFF	0x01
     60  1.1  uwe 
     61  1.7  uwe #define HD64461_GPBCR_J6X0_LCD_OFF_MASK	0xfffc
     62  1.7  uwe #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.7  uwe  * LCD contrast in 680 is controlled by pins 6..3 of HD64461 GPIO
     88  1.7  uwe  * port B.  6th pin is the least significant bit, 3rd pin is the most
     89  1.7  uwe  * significant.  The bits are inverted: 0 = .1111...; 1 = .0111...;
     90  1.7  uwe  * etc.  Larger values mean "blacker".
     91  1.1  uwe  *
     92  1.7  uwe  * The contrast value is programmed by setting bits in the data
     93  1.7  uwe  * register to all ones, and changing the mode of the pins in the
     94  1.7  uwe  * control register, setting logical "ones" to GPIO output mode (1),
     95  1.7  uwe  * and switching "zeroes" to input mode (3).
     96  1.1  uwe  */
     97  1.7  uwe #define HD64461_GPBDR_J680_CONTRAST_BITS	0x78	/* set */
     98  1.7  uwe #define HD64461_GPBCR_J680_CONTRAST_MASK	0xc03f
     99  1.1  uwe 
    100  1.7  uwe static const uint8_t j6x0lcd_contrast680_pins[] = { 6, 5, 4, 3 };
    101  1.1  uwe 
    102  1.7  uwe static const uint16_t j6x0lcd_contrast680_control_bits[] = {
    103  1.7  uwe 	0x1540, 0x3540, 0x1d40, 0x3d40, 0x1740, 0x3740, 0x1f40, 0x3f40,
    104  1.7  uwe 	0x15c0, 0x35c0, 0x1dc0, 0x3dc0, 0x17c0, 0x37c0, 0x1fc0, 0x3fc0
    105  1.1  uwe };
    106  1.1  uwe 
    107  1.1  uwe 
    108  1.7  uwe /*
    109  1.7  uwe  * LCD contrast in 620lx is controlled by pins 7,6,3,4,5 of HD64461
    110  1.7  uwe  * GPIO port B (in the order from the least significant to the most
    111  1.7  uwe  * significant).  The bits are inverted: 0 = 11111...; 5 = 01110...;
    112  1.7  uwe  * etc.  Larger values mean "whiter".
    113  1.7  uwe  *
    114  1.7  uwe  * The contrast value is programmed by setting bits in the data
    115  1.7  uwe  * register to all zeroes, and changing the mode of the pins in the
    116  1.7  uwe  * control register, setting logical "ones" to GPIO output mode (1),
    117  1.7  uwe  * and switching "zeroes" to input mode (3).
    118  1.7  uwe  */
    119  1.7  uwe #define HD64461_GPBDR_J620LX_CONTRAST_BITS	0xf8	/* clear */
    120  1.7  uwe #define HD64461_GPBCR_J620LX_CONTRAST_MASK	0x003f
    121  1.7  uwe 
    122  1.7  uwe static const uint8_t j6x0lcd_contrast620lx_pins[] = { 7, 6, 3, 4, 5 };
    123  1.7  uwe 
    124  1.7  uwe static const uint16_t j6x0lcd_contrast620lx_control_bits[] = {
    125  1.7  uwe 	0xffc0, 0x7fc0, 0xdfc0, 0x5fc0, 0xff40, 0x7f40, 0xdf40, 0x5f40,
    126  1.7  uwe 	0xfdc0, 0x7dc0, 0xddc0, 0x5dc0, 0xfd40, 0x7d40, 0xdd40, 0x5d40,
    127  1.7  uwe 	0xf7c0, 0x77c0, 0xd7c0, 0x57c0, 0xf740, 0x7740, 0xd740, 0x5740,
    128  1.7  uwe 	0xf5c0, 0x75c0, 0xd5c0, 0x55c0, 0xf540, 0x7540, 0xd540, 0x5540
    129  1.1  uwe };
    130  1.1  uwe 
    131  1.1  uwe 
    132  1.7  uwe 
    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.7  uwe 
    138  1.7  uwe 	int sc_contrast_max;
    139  1.7  uwe 	uint16_t sc_contrast_mask;
    140  1.7  uwe 	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.7  uwe static int	j6x0lcd_contrast_raw(uint16_t, int, const uint8_t *);
    154  1.7  uwe static void	j6x0lcd_contrast_set(struct j6x0lcd_softc *, int);
    155  1.7  uwe 
    156  1.7  uwe 
    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.7  uwe 	 * XXX: platid_mask_MACH_HP_LX also matches 360LX.  It's not
    164  1.7  uwe 	 * confirmed whether touch panel in 360LX is connected this
    165  1.7  uwe 	 * way.  We may need to regroup platid masks.
    166  1.1  uwe 	 */
    167  1.7  uwe 	if (!platid_match(&platid, &platid_mask_MACH_HP_JORNADA_6XX)
    168  1.7  uwe 	    && !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.7  uwe 	/*
    203  1.7  uwe 	 * Make sure LCD is turned on.
    204  1.7  uwe 	 */
    205  1.7  uwe 	bcr &= HD64461_GPBCR_J6X0_LCD_OFF_MASK;
    206  1.7  uwe 	bcr |= HD64461_GPBCR_J6X0_LCD_OFF_BITS; /* output mode */
    207  1.7  uwe 
    208  1.7  uwe 	bdr &= ~HD64461_GPBDR_J6X0_LCD_OFF;
    209  1.1  uwe 
    210  1.7  uwe 	/*
    211  1.7  uwe 	 * 620LX and 680 have different contrast control.
    212  1.7  uwe 	 */
    213  1.7  uwe 	if (platid_match(&platid, &platid_mask_MACH_HP_JORNADA_6XX)) {
    214  1.7  uwe 		bdr |= HD64461_GPBDR_J680_CONTRAST_BITS;
    215  1.1  uwe 
    216  1.7  uwe 		sc->sc_contrast_mask =
    217  1.7  uwe 			HD64461_GPBCR_J680_CONTRAST_MASK;
    218  1.7  uwe 		sc->sc_contrast_control_bits =
    219  1.7  uwe 			j6x0lcd_contrast680_control_bits;
    220  1.7  uwe 		sc->sc_contrast_max =
    221  1.7  uwe 			arraysize(j6x0lcd_contrast680_control_bits) - 1;
    222  1.7  uwe 
    223  1.7  uwe 		sc->sc_contrast = sc->sc_contrast_max
    224  1.7  uwe 			- j6x0lcd_contrast_raw(bcr,
    225  1.7  uwe 				arraysize(j6x0lcd_contrast680_pins),
    226  1.7  uwe 				j6x0lcd_contrast680_pins);
    227  1.7  uwe 	} else {
    228  1.7  uwe 		bdr &= ~HD64461_GPBDR_J620LX_CONTRAST_BITS;
    229  1.7  uwe 
    230  1.7  uwe 		sc->sc_contrast_mask =
    231  1.7  uwe 			HD64461_GPBCR_J620LX_CONTRAST_MASK;
    232  1.7  uwe 		sc->sc_contrast_control_bits =
    233  1.7  uwe 			j6x0lcd_contrast620lx_control_bits;
    234  1.7  uwe 		sc->sc_contrast_max =
    235  1.7  uwe 			arraysize(j6x0lcd_contrast620lx_control_bits) - 1;
    236  1.7  uwe 
    237  1.7  uwe 		sc->sc_contrast =
    238  1.7  uwe 			j6x0lcd_contrast_raw(bcr,
    239  1.7  uwe 				arraysize(j6x0lcd_contrast620lx_pins),
    240  1.7  uwe 				j6x0lcd_contrast620lx_pins);
    241  1.7  uwe 	}
    242  1.1  uwe 
    243  1.1  uwe 	hd64461_reg_write_2(HD64461_GPBCR_REG16, bcr);
    244  1.7  uwe 	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.7  uwe /*
    281  1.7  uwe  * Get raw contrast value programmed in GPIO port B control register.
    282  1.7  uwe  * Used only at attach time to get initial contrast.
    283  1.7  uwe  */
    284  1.7  uwe static int
    285  1.7  uwe j6x0lcd_contrast_raw(uint16_t bcr, int width, const uint8_t *pin)
    286  1.7  uwe {
    287  1.7  uwe 	int contrast;
    288  1.7  uwe 	int bit;
    289  1.7  uwe 
    290  1.7  uwe 	contrast = 0;
    291  1.7  uwe 	for (bit = 0; bit < width; ++bit) {
    292  1.7  uwe 		unsigned int c, v;
    293  1.7  uwe 
    294  1.7  uwe 		c = (bcr >> (pin[bit] << 1)) & 0x3;
    295  1.7  uwe 		if (c == 1)	/* output mode? */
    296  1.7  uwe 			v = 1;
    297  1.7  uwe 		else
    298  1.7  uwe 			v = 0;
    299  1.7  uwe 		contrast |= (v << bit);
    300  1.7  uwe 	}
    301  1.7  uwe 
    302  1.7  uwe 	return contrast;
    303  1.7  uwe }
    304  1.7  uwe 
    305  1.7  uwe 
    306  1.7  uwe /*
    307  1.7  uwe  * Set contrast by programming GPIO port B control register.
    308  1.7  uwe  * Data register has been initialized at attach time.
    309  1.7  uwe  */
    310  1.7  uwe static void
    311  1.7  uwe j6x0lcd_contrast_set(struct j6x0lcd_softc *sc, int contrast)
    312  1.7  uwe {
    313  1.7  uwe 	uint16_t bcr;
    314  1.7  uwe 
    315  1.7  uwe 	sc->sc_contrast = contrast;
    316  1.7  uwe 
    317  1.7  uwe 	bcr = hd64461_reg_read_2(HD64461_GPBCR_REG16);
    318  1.7  uwe 
    319  1.7  uwe 	bcr &= sc->sc_contrast_mask;
    320  1.7  uwe 	bcr |= sc->sc_contrast_control_bits[contrast];
    321  1.7  uwe 
    322  1.7  uwe 	hd64461_reg_write_2(HD64461_GPBCR_REG16, bcr);
    323  1.7  uwe }
    324  1.7  uwe 
    325  1.7  uwe 
    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.7  uwe 			*(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.7  uwe 			if (value > sc->sc_contrast_max)
    366  1.7  uwe 				value = sc->sc_contrast_max;
    367  1.7  uwe 			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.7  uwe 		r &= ~HD64461_GPBDR_J6X0_LCD_OFF;
    405  1.1  uwe 	else
    406  1.7  uwe 		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