Home | History | Annotate | Line # | Download | only in dev
psh3lcd.c revision 1.2.22.1
      1  1.2.22.1        ad /*	$NetBSD: psh3lcd.c,v 1.2.22.1 2007/02/01 08:48:00 ad Exp $	*/
      2       1.1  kiyohara /*
      3       1.1  kiyohara  * Copyright (c) 2005 KIYOHARA Takashi
      4       1.1  kiyohara  * All rights reserved.
      5       1.1  kiyohara  *
      6       1.1  kiyohara  * Redistribution and use in source and binary forms, with or without
      7       1.1  kiyohara  * modification, are permitted provided that the following conditions
      8       1.1  kiyohara  * are met:
      9       1.1  kiyohara  * 1. Redistributions of source code must retain the above copyright
     10       1.1  kiyohara  *    notice, this list of conditions and the following disclaimer.
     11       1.1  kiyohara  * 2. Redistributions in binary form must reproduce the above copyright
     12       1.1  kiyohara  *    notice, this list of conditions and the following disclaimer in the
     13       1.1  kiyohara  *    documentation and/or other materials provided with the distribution.
     14       1.1  kiyohara  *
     15       1.1  kiyohara  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     16       1.1  kiyohara  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
     17       1.1  kiyohara  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
     18       1.1  kiyohara  * DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
     19       1.1  kiyohara  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
     20       1.1  kiyohara  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
     21       1.1  kiyohara  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     22       1.1  kiyohara  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
     23       1.1  kiyohara  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
     24       1.1  kiyohara  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     25       1.1  kiyohara  * POSSIBILITY OF SUCH DAMAGE.
     26       1.1  kiyohara  *
     27       1.1  kiyohara  */
     28       1.1  kiyohara 
     29       1.1  kiyohara #include <sys/cdefs.h>
     30       1.1  kiyohara 
     31  1.2.22.1        ad #include <sys/types.h>
     32       1.1  kiyohara #include <sys/param.h>
     33       1.1  kiyohara #include <sys/device.h>
     34  1.2.22.1        ad #include <sys/errno.h>
     35  1.2.22.1        ad #include <sys/kernel.h>
     36       1.1  kiyohara #include <sys/systm.h>
     37       1.1  kiyohara #include <sys/callout.h>
     38       1.1  kiyohara 
     39       1.1  kiyohara #include <machine/platid.h>
     40       1.1  kiyohara #include <machine/platid_mask.h>
     41       1.1  kiyohara 
     42       1.1  kiyohara #include <machine/config_hook.h>
     43       1.1  kiyohara 
     44       1.1  kiyohara #include <sh3/pfcreg.h>
     45       1.1  kiyohara #include <hpcsh/dev/hd64461/hd64461var.h>
     46       1.1  kiyohara #include <hpcsh/dev/hd64461/hd64461reg.h>
     47       1.1  kiyohara #include <hpcsh/dev/hd64461/hd64461gpioreg.h>
     48       1.1  kiyohara 
     49       1.1  kiyohara 
     50       1.1  kiyohara /*
     51       1.1  kiyohara  * LCD contrast INC#: controlled by pin 0 in HD64461 GPIO port A.
     52       1.1  kiyohara  * LCD contrast  CS#: controlled by pin 1 in HD64461 GPIO port A.
     53       1.1  kiyohara  * LCD contrast U/D#: controlled by pin 0 in SH7709 GPIO port D.
     54       1.1  kiyohara  *   0 - down
     55       1.1  kiyohara  *   1 - up
     56       1.1  kiyohara  */
     57       1.1  kiyohara #define PSH3LCD_CONTRAST_INC		0x01
     58       1.1  kiyohara #define PSH3LCD_CONTRAST_CS		0x02
     59       1.1  kiyohara #define PSH3LCD_CONTRAST_UD		0x01
     60       1.1  kiyohara 
     61       1.1  kiyohara /*
     62       1.1  kiyohara  * LCD brightness: controled by HG71C105FE at AREA2.
     63       1.1  kiyohara  *	XXXX: That is custom IC. We don't know spec.  X-<
     64       1.1  kiyohara  */
     65       1.1  kiyohara #define PSH3LCD_BRIGHTNESS_REG0		0xaa000072
     66       1.1  kiyohara #define PSH3LCD_BRIGHTNESS_REG1		0xaa000150
     67       1.1  kiyohara #define PSH3LCD_BRIGHTNESS_REG2		0xaa000152
     68       1.1  kiyohara 
     69       1.1  kiyohara /* brightness control data */
     70       1.1  kiyohara static const struct psh3lcd_x0_bcd {	/* 50PA, 30PA */
     71       1.1  kiyohara 	uint8_t reg0;
     72       1.1  kiyohara 	uint8_t reg1;
     73       1.1  kiyohara 	uint8_t reg2;
     74       1.1  kiyohara } psh3lcd_x0_bcd[] = {
     75       1.1  kiyohara 	{ 0x05, 0x08, 0x1e },
     76       1.1  kiyohara 	{ 0x05, 0x1d, 0x09 },
     77       1.1  kiyohara 	{ 0x04, 0x1e, 0x1e },
     78       1.1  kiyohara 	{ 0x06, 0x1e, 0x1e },
     79       1.1  kiyohara 	{ 0x07, 0x1e, 0x1e },
     80       1.1  kiyohara 	{ 0x00, 0x00, 0x00 }
     81       1.1  kiyohara };
     82       1.1  kiyohara static const struct psh3lcd_xx0_bcd {	/* 200JC */
     83       1.1  kiyohara 	uint8_t reg1;
     84       1.1  kiyohara 	uint8_t reg2;
     85       1.1  kiyohara } psh3lcd_xx0_bcd[] = {
     86       1.1  kiyohara 	{ 0x33, 0x0c },
     87       1.1  kiyohara 	{ 0x2d, 0x12 },
     88       1.1  kiyohara 	{ 0x26, 0x19 },
     89       1.1  kiyohara 	{ 0x20, 0x1f },
     90       1.1  kiyohara 	{ 0x1a, 0x25 },
     91       1.1  kiyohara 	{ 0x13, 0x2c },
     92       1.1  kiyohara 	{ 0x0d, 0x32 },
     93       1.1  kiyohara 	{ 0x07, 0x38 },
     94       1.1  kiyohara 	{ 0x01, 0x00 },
     95       1.1  kiyohara 	{ 0x00, 0x00 }
     96       1.1  kiyohara };
     97       1.1  kiyohara 
     98       1.1  kiyohara #define PSH3LCD_XX0_BRIGHTNESS_MAX	8
     99       1.1  kiyohara #define PSH3LCD_X0_BRIGHTNESS_MAX	4
    100       1.1  kiyohara 
    101       1.1  kiyohara #define PSH3LCD_CONTRAST_MAX		2	/* XXX */
    102       1.1  kiyohara #define PSH3LCD_CONTRAST		1
    103       1.1  kiyohara #define PSH3LCD_CONTRAST_UP		2
    104       1.1  kiyohara #define PSH3LCD_CONTRAST_DOWN		0
    105       1.1  kiyohara 
    106       1.1  kiyohara #define BCD_NO_MATCH	(-1)
    107       1.1  kiyohara 
    108       1.1  kiyohara 
    109       1.1  kiyohara struct psh3lcd_softc {
    110       1.1  kiyohara 	struct device sc_dev;
    111       1.1  kiyohara 	int sc_brightness;
    112       1.1  kiyohara 	int sc_brightness_max;
    113       1.1  kiyohara 	void (*sc_set_brightness)(int);
    114       1.1  kiyohara };
    115       1.1  kiyohara 
    116       1.1  kiyohara static int psh3lcd_match(struct device *, struct cfdata *, void *);
    117       1.1  kiyohara static void psh3lcd_attach(struct device *, struct device *, void *);
    118       1.1  kiyohara 
    119       1.1  kiyohara CFATTACH_DECL(psh3lcd, sizeof(struct psh3lcd_softc),
    120       1.1  kiyohara     psh3lcd_match, psh3lcd_attach, NULL, NULL);
    121       1.1  kiyohara 
    122       1.1  kiyohara 
    123       1.1  kiyohara static inline int psh3lcd_x0_bcd_get(void);
    124       1.1  kiyohara static inline int psh3lcd_xx0_bcd_get(void);
    125       1.1  kiyohara static void psh3lcd_x0_set_brightness(int);
    126       1.1  kiyohara static void psh3lcd_xx0_set_brightness(int);
    127       1.1  kiyohara static void psh3lcd_set_contrast(int);
    128       1.1  kiyohara static int psh3lcd_param(void *, int, long, void *);
    129       1.1  kiyohara static int psh3lcd_power(void *, int, long, void *);
    130       1.1  kiyohara 
    131       1.1  kiyohara 
    132       1.1  kiyohara static inline int
    133       1.1  kiyohara psh3lcd_x0_bcd_get()
    134       1.1  kiyohara {
    135       1.1  kiyohara 	int i;
    136       1.1  kiyohara 	uint8_t bcr0, bcr1, bcr2;
    137       1.1  kiyohara 
    138       1.1  kiyohara 	bcr0 = _reg_read_1(PSH3LCD_BRIGHTNESS_REG0);
    139       1.1  kiyohara 	bcr1 = _reg_read_1(PSH3LCD_BRIGHTNESS_REG1);
    140       1.1  kiyohara 	bcr2 = _reg_read_1(PSH3LCD_BRIGHTNESS_REG2);
    141       1.1  kiyohara 
    142       1.1  kiyohara 	for (i = 0; psh3lcd_x0_bcd[i].reg0 != 0; i++)
    143       1.1  kiyohara 		if (bcr0 == psh3lcd_x0_bcd[i].reg0 &&
    144       1.1  kiyohara 		    bcr1 == psh3lcd_x0_bcd[i].reg1 &&
    145       1.1  kiyohara 		    bcr2 == psh3lcd_x0_bcd[i].reg2)
    146       1.1  kiyohara 			break;
    147       1.1  kiyohara 	if (psh3lcd_x0_bcd[i].reg0 == 0)
    148  1.2.22.1        ad 		return BCD_NO_MATCH;
    149  1.2.22.1        ad 	return i;
    150       1.1  kiyohara }
    151       1.1  kiyohara 
    152       1.1  kiyohara static inline int
    153       1.1  kiyohara psh3lcd_xx0_bcd_get()
    154       1.1  kiyohara {
    155       1.1  kiyohara 	int i;
    156       1.1  kiyohara 	uint8_t bcr1, bcr2;
    157       1.1  kiyohara 
    158       1.1  kiyohara 	bcr1 = _reg_read_1(PSH3LCD_BRIGHTNESS_REG1);
    159       1.1  kiyohara 	bcr2 = _reg_read_1(PSH3LCD_BRIGHTNESS_REG2);
    160       1.1  kiyohara 
    161       1.1  kiyohara 	for (i = 0; psh3lcd_xx0_bcd[i].reg1 != 0; i++)
    162       1.1  kiyohara 		if (bcr1 == psh3lcd_xx0_bcd[i].reg1 &&
    163       1.1  kiyohara 		    bcr2 == psh3lcd_xx0_bcd[i].reg2)
    164       1.1  kiyohara 			break;
    165       1.1  kiyohara 	if (psh3lcd_xx0_bcd[i].reg1 == 0)
    166  1.2.22.1        ad 		return BCD_NO_MATCH;
    167  1.2.22.1        ad 	return i;
    168       1.1  kiyohara }
    169       1.1  kiyohara 
    170       1.1  kiyohara static void
    171       1.1  kiyohara psh3lcd_xx0_set_brightness(int index)
    172       1.1  kiyohara {
    173       1.1  kiyohara 
    174       1.1  kiyohara 	_reg_write_1(PSH3LCD_BRIGHTNESS_REG1, psh3lcd_xx0_bcd[index].reg1);
    175       1.1  kiyohara 	_reg_write_1(PSH3LCD_BRIGHTNESS_REG2, psh3lcd_xx0_bcd[index].reg2);
    176       1.1  kiyohara }
    177       1.1  kiyohara 
    178       1.1  kiyohara static void
    179       1.1  kiyohara psh3lcd_x0_set_brightness(int index)
    180       1.1  kiyohara {
    181       1.1  kiyohara 
    182       1.1  kiyohara 	_reg_write_1(PSH3LCD_BRIGHTNESS_REG0, psh3lcd_x0_bcd[index].reg0);
    183       1.1  kiyohara 	_reg_write_1(PSH3LCD_BRIGHTNESS_REG1, psh3lcd_x0_bcd[index].reg1);
    184       1.1  kiyohara 	_reg_write_1(PSH3LCD_BRIGHTNESS_REG2, psh3lcd_x0_bcd[index].reg2);
    185       1.1  kiyohara }
    186       1.1  kiyohara 
    187       1.1  kiyohara /*
    188       1.1  kiyohara  * contrast control function.  controlled by IC (X9313W).
    189       1.1  kiyohara  */
    190       1.1  kiyohara inline void
    191       1.1  kiyohara psh3lcd_set_contrast(int value)
    192       1.1  kiyohara {
    193       1.1  kiyohara 	uint16_t gpadr;
    194       1.1  kiyohara 	uint8_t pddr;
    195       1.1  kiyohara 
    196       1.1  kiyohara 	/* CS assert */
    197       1.1  kiyohara 	gpadr = hd64461_reg_read_2(HD64461_GPADR_REG16);
    198       1.1  kiyohara 	gpadr &= ~PSH3LCD_CONTRAST_CS;
    199       1.1  kiyohara 	hd64461_reg_write_2(HD64461_GPADR_REG16, gpadr);
    200       1.1  kiyohara 	delay(1);
    201       1.1  kiyohara 
    202       1.1  kiyohara 	/* set U/D# */
    203       1.1  kiyohara 	pddr = _reg_read_1(SH7709_PDDR);
    204       1.1  kiyohara 	if (value == PSH3LCD_CONTRAST_UP)
    205       1.1  kiyohara 		pddr |= PSH3LCD_CONTRAST_UD;
    206       1.1  kiyohara 	else if (value == PSH3LCD_CONTRAST_DOWN)
    207       1.1  kiyohara 		pddr &= ~PSH3LCD_CONTRAST_UD;
    208       1.1  kiyohara 	_reg_write_1(SH7709_PDDR, pddr);
    209       1.1  kiyohara 	delay(3);
    210       1.1  kiyohara 
    211       1.1  kiyohara 	/* INCrement */
    212       1.1  kiyohara 	hd64461_reg_write_2(HD64461_GPADR_REG16, gpadr & ~PSH3LCD_CONTRAST_INC);
    213       1.1  kiyohara 	delay(1);
    214       1.1  kiyohara 	hd64461_reg_write_2(HD64461_GPADR_REG16, gpadr);
    215       1.1  kiyohara 	delay(1);
    216       1.1  kiyohara 
    217       1.1  kiyohara 	/* CS deassert */
    218       1.1  kiyohara 	gpadr |= PSH3LCD_CONTRAST_CS;
    219       1.1  kiyohara 	hd64461_reg_write_2(HD64461_GPADR_REG16, gpadr);
    220       1.1  kiyohara 	delay(1);
    221       1.1  kiyohara }
    222       1.1  kiyohara 
    223  1.2.22.1        ad /* ARGSUSED */
    224       1.1  kiyohara static int
    225  1.2.22.1        ad psh3lcd_match(struct device *parent __unused, struct cfdata *cfp,
    226  1.2.22.1        ad 	      void *aux __unused)
    227       1.1  kiyohara {
    228       1.1  kiyohara 	uint8_t bcr0;
    229       1.1  kiyohara 
    230       1.1  kiyohara 	if (!platid_match(&platid, &platid_mask_MACH_HITACHI_PERSONA))
    231  1.2.22.1        ad 		return 0;
    232       1.1  kiyohara 
    233       1.1  kiyohara 	if (strcmp(cfp->cf_name, "psh3lcd") != 0)
    234  1.2.22.1        ad 		return 0;
    235       1.1  kiyohara 
    236       1.1  kiyohara 	bcr0 = _reg_read_1(PSH3LCD_BRIGHTNESS_REG0);
    237       1.1  kiyohara 	if (bcr0 == 0) {
    238       1.1  kiyohara 		if (psh3lcd_xx0_bcd_get() == BCD_NO_MATCH)
    239  1.2.22.1        ad 			return 0;
    240       1.1  kiyohara 	} else {
    241       1.1  kiyohara 		if (psh3lcd_x0_bcd_get() == BCD_NO_MATCH)
    242  1.2.22.1        ad 			return 0;
    243       1.1  kiyohara 	}
    244       1.1  kiyohara 
    245  1.2.22.1        ad 	return 1;
    246       1.1  kiyohara }
    247       1.1  kiyohara 
    248  1.2.22.1        ad /* ARGSUSED */
    249       1.1  kiyohara static void
    250  1.2.22.1        ad psh3lcd_attach(struct device *parent __unused, struct device *self,
    251  1.2.22.1        ad 	       void *aux __unused)
    252       1.1  kiyohara {
    253  1.2.22.1        ad 	struct psh3lcd_softc *sc = device_private(self);
    254       1.1  kiyohara 	uint8_t bcr0, bcr1, bcr2;
    255       1.1  kiyohara 
    256       1.1  kiyohara 	bcr0 = _reg_read_1(PSH3LCD_BRIGHTNESS_REG0);
    257       1.1  kiyohara 	bcr1 = _reg_read_1(PSH3LCD_BRIGHTNESS_REG1);
    258       1.1  kiyohara 	bcr2 = _reg_read_1(PSH3LCD_BRIGHTNESS_REG2);
    259       1.1  kiyohara 	if (bcr0 == 0) {
    260       1.1  kiyohara 		sc->sc_set_brightness = psh3lcd_xx0_set_brightness;
    261       1.1  kiyohara 		sc->sc_brightness = psh3lcd_xx0_bcd_get();
    262       1.1  kiyohara 		sc->sc_brightness_max = PSH3LCD_XX0_BRIGHTNESS_MAX;
    263       1.1  kiyohara 	} else {
    264       1.1  kiyohara 		sc->sc_set_brightness = psh3lcd_x0_set_brightness;
    265       1.1  kiyohara 		sc->sc_brightness = psh3lcd_x0_bcd_get();
    266       1.1  kiyohara 		sc->sc_brightness_max = PSH3LCD_X0_BRIGHTNESS_MAX;
    267       1.1  kiyohara 	}
    268  1.2.22.1        ad 	aprint_naive("\n");
    269  1.2.22.1        ad 	aprint_normal(": brightness %d\n", sc->sc_brightness);
    270       1.1  kiyohara 
    271       1.1  kiyohara 	/* LCD contrast hooks */
    272       1.1  kiyohara         config_hook(CONFIG_HOOK_GET,
    273       1.1  kiyohara 	    CONFIG_HOOK_CONTRAST_MAX, CONFIG_HOOK_SHARE, psh3lcd_param, sc);
    274       1.1  kiyohara         config_hook(CONFIG_HOOK_GET,
    275       1.1  kiyohara 	    CONFIG_HOOK_CONTRAST, CONFIG_HOOK_SHARE, psh3lcd_param, sc);
    276       1.1  kiyohara         config_hook(CONFIG_HOOK_SET,
    277       1.1  kiyohara 	    CONFIG_HOOK_CONTRAST, CONFIG_HOOK_SHARE, psh3lcd_param, sc);
    278       1.1  kiyohara 
    279       1.1  kiyohara 	/* LCD brightness hooks */
    280       1.1  kiyohara         config_hook(CONFIG_HOOK_GET,
    281       1.1  kiyohara 	    CONFIG_HOOK_BRIGHTNESS_MAX, CONFIG_HOOK_SHARE, psh3lcd_param, sc);
    282       1.1  kiyohara         config_hook(CONFIG_HOOK_GET,
    283       1.1  kiyohara 	    CONFIG_HOOK_BRIGHTNESS, CONFIG_HOOK_SHARE, psh3lcd_param, sc);
    284       1.1  kiyohara         config_hook(CONFIG_HOOK_SET,
    285       1.1  kiyohara 	    CONFIG_HOOK_BRIGHTNESS, CONFIG_HOOK_SHARE, psh3lcd_param, sc);
    286       1.1  kiyohara 
    287       1.1  kiyohara 	/* LCD on/off hook */
    288       1.1  kiyohara 	config_hook(CONFIG_HOOK_POWERCONTROL,
    289       1.1  kiyohara 	    CONFIG_HOOK_POWERCONTROL_LCD, CONFIG_HOOK_SHARE, psh3lcd_power, sc);
    290       1.1  kiyohara }
    291       1.1  kiyohara 
    292       1.1  kiyohara 
    293       1.1  kiyohara static int
    294       1.1  kiyohara psh3lcd_param(void *ctx, int type, long id, void *msg)
    295       1.1  kiyohara {
    296       1.1  kiyohara 	struct psh3lcd_softc *sc = ctx;
    297       1.1  kiyohara 	int value;
    298       1.1  kiyohara 
    299       1.1  kiyohara 	switch (type) {
    300       1.1  kiyohara 	case CONFIG_HOOK_GET:
    301       1.1  kiyohara 		switch (id) {
    302       1.1  kiyohara 		case CONFIG_HOOK_CONTRAST:
    303       1.1  kiyohara 			*(int *)msg = PSH3LCD_CONTRAST;
    304  1.2.22.1        ad 			return 0;
    305       1.1  kiyohara 
    306       1.1  kiyohara 		case CONFIG_HOOK_CONTRAST_MAX:
    307       1.1  kiyohara 			*(int *)msg = PSH3LCD_CONTRAST_MAX;
    308  1.2.22.1        ad 			return 0;
    309       1.1  kiyohara 
    310       1.1  kiyohara 		case CONFIG_HOOK_BRIGHTNESS:
    311       1.1  kiyohara 			*(int *)msg = sc->sc_brightness;
    312  1.2.22.1        ad 			return 0;
    313       1.1  kiyohara 
    314       1.1  kiyohara 		case CONFIG_HOOK_BRIGHTNESS_MAX:
    315       1.1  kiyohara 			*(int *)msg = sc->sc_brightness_max;
    316  1.2.22.1        ad 			return 0;
    317       1.1  kiyohara 		}
    318       1.1  kiyohara 		break;
    319       1.1  kiyohara 
    320       1.1  kiyohara 	case CONFIG_HOOK_SET:
    321       1.1  kiyohara 		value = *(int *)msg;
    322       1.1  kiyohara 
    323       1.1  kiyohara 		switch (id) {
    324       1.1  kiyohara 		case CONFIG_HOOK_CONTRAST:
    325       1.1  kiyohara 			if (value != PSH3LCD_CONTRAST_UP &&
    326       1.1  kiyohara 			    value != PSH3LCD_CONTRAST_DOWN)
    327  1.2.22.1        ad 				return EINVAL;
    328       1.1  kiyohara 			psh3lcd_set_contrast(value);
    329  1.2.22.1        ad 			return 0;
    330       1.1  kiyohara 
    331       1.1  kiyohara 		case CONFIG_HOOK_BRIGHTNESS:
    332       1.1  kiyohara 			if (value < 0)
    333       1.1  kiyohara 				value = 0;
    334       1.1  kiyohara 			if (value > sc->sc_brightness_max)
    335       1.1  kiyohara 				value = sc->sc_brightness_max;
    336       1.1  kiyohara 			sc->sc_brightness = value;
    337       1.1  kiyohara 			sc->sc_set_brightness(sc->sc_brightness);
    338  1.2.22.1        ad 			return 0;
    339       1.1  kiyohara 		}
    340       1.1  kiyohara 		break;
    341       1.1  kiyohara 	}
    342       1.1  kiyohara 
    343  1.2.22.1        ad 	return EINVAL;
    344       1.1  kiyohara }
    345       1.1  kiyohara 
    346       1.1  kiyohara 
    347       1.1  kiyohara static int
    348       1.1  kiyohara psh3lcd_power(void *ctx, int type, long id, void *msg)
    349       1.1  kiyohara {
    350       1.1  kiyohara 	struct psh3lcd_softc *sc = ctx;
    351       1.1  kiyohara 	int on;
    352       1.1  kiyohara 
    353       1.1  kiyohara 	if (type != CONFIG_HOOK_POWERCONTROL ||
    354       1.1  kiyohara 	    id != CONFIG_HOOK_POWERCONTROL_LCD)
    355  1.2.22.1        ad 		return EINVAL;
    356       1.1  kiyohara 
    357       1.1  kiyohara 	on = (int)msg;
    358       1.1  kiyohara 	if (on)
    359       1.1  kiyohara 		sc->sc_set_brightness(sc->sc_brightness);
    360       1.1  kiyohara 	else
    361       1.1  kiyohara 		sc->sc_set_brightness(sc->sc_brightness_max + 1);
    362       1.1  kiyohara 
    363  1.2.22.1        ad 	return 0;
    364       1.1  kiyohara }
    365