Home | History | Annotate | Line # | Download | only in dev
ite8181.c revision 1.13
      1  1.13    toshii /*	$NetBSD: ite8181.c,v 1.13 2001/07/17 01:41:38 toshii Exp $	*/
      2   1.1      sato 
      3   1.1      sato /*-
      4   1.8      sato  * Copyright (c) 2000,2001 SATO Kazumi
      5   1.1      sato  * All rights reserved.
      6   1.1      sato  *
      7   1.1      sato  * Redistribution and use in source and binary forms, with or without
      8   1.1      sato  * modification, are permitted provided that the following conditions
      9   1.1      sato  * are met:
     10   1.1      sato  * 1. Redistributions of source code must retain the above copyright
     11   1.1      sato  *    notice, this list of conditions and the following disclaimer.
     12   1.1      sato  * 2. Redistributions in binary form must reproduce the above copyright
     13   1.1      sato  *    notice, this list of conditions and the following disclaimer in the
     14   1.1      sato  *    documentation and/or other materials provided with the distribution.
     15   1.1      sato  *
     16   1.1      sato  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
     17   1.1      sato  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     18   1.1      sato  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     19   1.1      sato  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
     20   1.1      sato  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     21   1.1      sato  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     22   1.1      sato  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     23   1.1      sato  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     24   1.1      sato  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     25   1.1      sato  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     26   1.1      sato  * SUCH DAMAGE.
     27   1.1      sato  *
     28   1.1      sato  */
     29   1.1      sato 
     30   1.1      sato #include <sys/param.h>
     31   1.1      sato #include <sys/kernel.h>
     32   1.1      sato #include <sys/device.h>
     33   1.1      sato #include <sys/systm.h>
     34   1.1      sato #include <sys/boot_flag.h>
     35   1.2      sato #include <sys/buf.h>
     36   1.1      sato 
     37   1.1      sato #include <uvm/uvm_extern.h>
     38   1.1      sato 
     39   1.1      sato #include <dev/wscons/wsconsio.h>
     40   1.1      sato 
     41   1.1      sato #include <machine/bootinfo.h>
     42   1.1      sato #include <machine/bus.h>
     43   1.1      sato #include <machine/autoconf.h>
     44   1.1      sato #include <machine/config_hook.h>
     45   1.1      sato #include <machine/platid.h>
     46   1.1      sato #include <machine/platid_mask.h>
     47   1.1      sato 
     48   1.1      sato #include <hpcmips/dev/ite8181reg.h>
     49   1.1      sato #include <hpcmips/dev/ite8181var.h>
     50   1.1      sato #include "bivideo.h"
     51   1.1      sato #if NBIVIDEO > 0
     52   1.7       uch #include <dev/hpc/bivideovar.h>
     53   1.1      sato #endif
     54   1.7       uch #include <dev/hpc/hpccmapvar.h>
     55   1.1      sato 
     56   1.1      sato #define ITE8181DEBUG
     57   1.1      sato #ifdef ITE8181DEBUG
     58   1.1      sato #ifndef ITE8181DEBUG_CONF
     59   1.1      sato #define ITE8181DEBUG_CONF 0
     60   1.1      sato #endif
     61   1.1      sato int	ite8181_debug = ITE8181DEBUG_CONF;
     62   1.1      sato #define	DPRINTF(arg)     if (ite8181_debug) printf arg
     63   1.1      sato #define	DPRINTFN(n, arg) if (ite8181_debug > (n)) printf arg
     64   1.1      sato #define	VPRINTF(arg)     if (bootverbose || ite8181_debug) printf arg
     65   1.1      sato #define	VPRINTFN(n, arg) if (bootverbose || ite8181_debug > (n)) printf arg
     66   1.1      sato #else
     67   1.1      sato #define	DPRINTF(arg)
     68   1.1      sato #define DPRINTFN(n, arg)
     69   1.1      sato #define	VPRINTF(arg)     if (bootverbose) printf arg
     70   1.1      sato #define	VPRINTFN(n, arg) if (bootverbose) printf arg
     71   1.1      sato #endif
     72   1.1      sato 
     73   1.1      sato #ifndef ITE8181_LCD_CONTROL_ENABLE
     74   1.1      sato int ite8181_lcd_control_disable = 1;
     75   1.1      sato #else /* ITE8181_LCD_CONTROL_ENABLE */
     76   1.1      sato int ite8181_lcd_control_disable = 0;
     77   1.1      sato #endif /* ITE8181_LCD_CONTROL_ENABLE */
     78   1.1      sato 
     79   1.2      sato #define ITE8181_WINCE_CMAP
     80   1.2      sato 
     81   1.2      sato /*
     82   1.2      sato  * XXX:
     83   1.2      sato  * IBM WorkPad z50 power unit has too weak power.
     84   1.2      sato  * So we must wait too many times to access some device
     85   1.2      sato  * after LCD panel and BackLight on.
     86   1.2      sato  * Currently delay is not enough ??? FIXME
     87   1.2      sato  */
     88   1.2      sato #ifndef ITE8181_LCD_ON_SELF_DELAY
     89   1.3      sato #define ITE8181_LCD_ON_SELF_DELAY 1000
     90   1.2      sato #endif /* ITE8181_LCD_ON__SELF_DELAY */
     91   1.2      sato #ifndef ITE8181_LCD_ON_DELAY
     92   1.2      sato #define ITE8181_LCD_ON_DELAY 2000
     93   1.2      sato #endif /* ITE8181_LCD_ON_DELAY */
     94   1.2      sato int ite8181_lcd_on_self_delay = ITE8181_LCD_ON_SELF_DELAY; /* msec */
     95   1.2      sato int ite8181_lcd_on_delay = ITE8181_LCD_ON_DELAY; /* msec */
     96   1.2      sato 
     97   1.1      sato #define MSEC	1000
     98   1.1      sato /*
     99   1.1      sato  * function prototypes
    100   1.1      sato  */
    101   1.1      sato static void	ite8181_config_write_4 __P((bus_space_tag_t, bus_space_handle_t, int, int));
    102   1.1      sato static int	ite8181_config_read_4 __P((bus_space_tag_t, bus_space_handle_t, int));
    103   1.1      sato 
    104   1.1      sato static void	ite8181_gui_write_4 __P((struct ite8181_softc *, int, int));
    105   1.1      sato static int	ite8181_gui_read_4 __P((struct ite8181_softc *, int));
    106   1.1      sato 
    107   1.1      sato static void	ite8181_gui_write_1 __P((struct ite8181_softc *, int, int));
    108   1.1      sato static int	ite8181_gui_read_1 __P((struct ite8181_softc *, int));
    109   1.1      sato 
    110   1.1      sato static void	ite8181_graphics_write_1 __P((struct ite8181_softc *, int, int));
    111   1.1      sato static int	ite8181_graphics_read_1 __P((struct ite8181_softc *, int));
    112   1.1      sato 
    113   1.1      sato static void	ite8181_ema_write_1 __P((struct ite8181_softc *, int, int));
    114   1.1      sato static int	ite8181_ema_read_1 __P((struct ite8181_softc *, int));
    115   1.1      sato 
    116   1.1      sato static void	ite8181_power __P((int, void *));
    117   1.1      sato static int	ite8181_hardpower __P((void *, int, long, void *));
    118   1.1      sato static int	ite8181_fbinit __P((struct hpcfb_fbconf *));
    119   1.1      sato static int	ite8181_ioctl __P((void *, u_long, caddr_t, int, struct proc *));
    120   1.1      sato static paddr_t	ite8181_mmap __P((void *, off_t offset, int));
    121   1.1      sato static void	ite8181_erase_cursor __P((struct ite8181_softc *));
    122   1.1      sato static int	ite8181_lcd_power __P((struct ite8181_softc *, int));
    123   1.8      sato 
    124   1.8      sato static void	ite8181_update_powerstate __P((struct ite8181_softc *, int));
    125  1.11      sato void	ite8181_init_backlight __P((struct ite8181_softc *, int));
    126  1.11      sato void	ite8181_init_brightness __P((struct ite8181_softc *, int));
    127  1.11      sato void	ite8181_init_contrast __P((struct ite8181_softc *, int));
    128   1.8      sato void	ite8181_set_brightness __P((struct ite8181_softc *, int));
    129   1.8      sato void	ite8181_set_contrast __P((struct ite8181_softc *, int));
    130   1.8      sato 
    131   1.1      sato /*
    132   1.1      sato  * static variables
    133   1.1      sato  */
    134   1.1      sato struct hpcfb_accessops ite8181_ha = {
    135   1.1      sato 	ite8181_ioctl, ite8181_mmap
    136   1.1      sato };
    137   1.1      sato 
    138   1.1      sato inline int
    139   1.1      sato ite8181_config_read_4(iot, ioh, byteoffset)
    140   1.1      sato 	bus_space_tag_t iot;
    141   1.1      sato 	bus_space_handle_t ioh;
    142   1.1      sato 	int byteoffset;
    143   1.1      sato {
    144   1.1      sato 	return bus_space_read_4(iot, ioh, ITE8181_CONF_OFFSET + byteoffset);
    145   1.1      sato }
    146   1.1      sato 
    147   1.1      sato inline void
    148   1.1      sato ite8181_config_write_4(iot, ioh, byteoffset, data)
    149   1.1      sato 	bus_space_tag_t iot;
    150   1.1      sato 	bus_space_handle_t ioh;
    151   1.1      sato 	int byteoffset;
    152   1.1      sato 	int data;
    153   1.1      sato {
    154   1.1      sato 	bus_space_write_4(iot, ioh, ITE8181_CONF_OFFSET + byteoffset, data);
    155   1.1      sato }
    156   1.1      sato 
    157   1.1      sato inline int
    158   1.1      sato ite8181_gui_read_4(sc, byteoffset)
    159   1.1      sato 	struct ite8181_softc *sc;
    160   1.1      sato 	int byteoffset;
    161   1.1      sato {
    162   1.1      sato 	return bus_space_read_4(sc->sc_iot, sc->sc_ioh,
    163   1.1      sato 			sc->sc_gba + byteoffset);
    164   1.1      sato }
    165   1.1      sato 
    166   1.1      sato inline void
    167   1.1      sato ite8181_gui_write_4(sc, byteoffset, data)
    168   1.1      sato 	struct ite8181_softc *sc;
    169   1.1      sato 	int byteoffset;
    170   1.1      sato 	int data;
    171   1.1      sato {
    172   1.1      sato 	bus_space_write_4(sc->sc_iot, sc->sc_ioh, sc->sc_gba + byteoffset, data);
    173   1.1      sato }
    174   1.1      sato 
    175   1.1      sato inline int
    176   1.1      sato ite8181_gui_read_1(sc, byteoffset)
    177   1.1      sato 	struct ite8181_softc *sc;
    178   1.1      sato 	int byteoffset;
    179   1.1      sato {
    180   1.1      sato 	return bus_space_read_1(sc->sc_iot, sc->sc_ioh,
    181   1.1      sato 			sc->sc_gba + byteoffset);
    182   1.1      sato }
    183   1.1      sato 
    184   1.1      sato inline void
    185   1.1      sato ite8181_gui_write_1(sc, byteoffset, data)
    186   1.1      sato 	struct ite8181_softc *sc;
    187   1.1      sato 	int byteoffset;
    188   1.1      sato 	int data;
    189   1.1      sato {
    190   1.1      sato 	bus_space_write_1(sc->sc_iot, sc->sc_ioh, sc->sc_gba + byteoffset, data);
    191   1.1      sato }
    192   1.1      sato 
    193   1.1      sato inline int
    194   1.1      sato ite8181_graphics_read_1(sc, byteoffset)
    195   1.1      sato 	struct ite8181_softc *sc;
    196   1.1      sato 	int byteoffset;
    197   1.1      sato {
    198   1.1      sato 	return bus_space_read_1(sc->sc_iot, sc->sc_ioh,
    199   1.1      sato 			sc->sc_sba + byteoffset);
    200   1.1      sato }
    201   1.1      sato 
    202   1.1      sato inline void
    203   1.1      sato ite8181_graphics_write_1(sc, byteoffset, data)
    204   1.1      sato 	struct ite8181_softc *sc;
    205   1.1      sato 	int byteoffset;
    206   1.1      sato 	int data;
    207   1.1      sato {
    208   1.1      sato 	bus_space_write_1(sc->sc_iot, sc->sc_ioh, sc->sc_sba + byteoffset, data);
    209   1.1      sato }
    210   1.1      sato 
    211   1.1      sato inline int
    212   1.1      sato ite8181_ema_read_1(sc, byteoffset)
    213   1.1      sato 	struct ite8181_softc *sc;
    214   1.1      sato 	int byteoffset;
    215   1.1      sato {
    216   1.1      sato 	ite8181_graphics_write_1(sc, ITE8181_EMA_EXAX, byteoffset);
    217   1.1      sato 	return ite8181_graphics_read_1(sc, ITE8181_EMA_EXADATA);
    218   1.1      sato }
    219   1.1      sato 
    220   1.1      sato inline void
    221   1.1      sato ite8181_ema_write_1(sc, byteoffset, data)
    222   1.1      sato 	struct ite8181_softc *sc;
    223   1.1      sato 	int byteoffset;
    224   1.1      sato 	int data;
    225   1.1      sato {
    226   1.1      sato 	ite8181_graphics_write_1(sc, ITE8181_EMA_EXAX, byteoffset);
    227   1.1      sato 	ite8181_graphics_write_1(sc, ITE8181_EMA_EXADATA, data);
    228   1.1      sato }
    229   1.1      sato 
    230   1.1      sato int
    231   1.1      sato ite8181_probe(iot, ioh)
    232   1.1      sato 	bus_space_tag_t iot;
    233   1.1      sato 	bus_space_handle_t ioh;
    234   1.1      sato {
    235   1.1      sato 	unsigned long regval;
    236   1.1      sato 
    237   1.1      sato #if NBIVIDEO > 0
    238   1.1      sato 	if (bivideo_dont_attach)	/* some video driver already attached */
    239   1.1      sato 		return (0);
    240   1.1      sato #endif /* NBIVIDEO > 0 */
    241   1.1      sato 
    242   1.1      sato 	regval = ite8181_config_read_4(iot, ioh, ITE8181_ID);
    243   1.1      sato 	VPRINTF(("ite8181_probe: vendor id=%04lx product id=%04lx\n",
    244   1.1      sato 		 regval & 0xffff, (regval >> 16) & 0xffff));
    245   1.1      sato 	if (regval != ((ITE8181_PRODUCT_ID << 16) | ITE8181_VENDER_ID))
    246   1.1      sato 		return (0);
    247   1.1      sato 
    248   1.1      sato 	return (1);
    249   1.1      sato }
    250   1.1      sato 
    251   1.1      sato void
    252   1.1      sato ite8181_attach(sc)
    253   1.1      sato 	struct ite8181_softc *sc;
    254   1.1      sato {
    255   1.1      sato 	unsigned long regval;
    256   1.1      sato 	struct hpcfb_attach_args ha;
    257   1.1      sato 	int console = (bootinfo->bi_cnuse & BI_CNUSE_SERIAL) ? 0 : 1;
    258   1.1      sato 
    259   1.6      sato 	printf(": ");
    260   1.6      sato 	if (ite8181_fbinit(&sc->sc_fbconf) != 0) {
    261   1.6      sato 		/* just return so that hpcfb will not be attached */
    262   1.6      sato 		return;
    263   1.6      sato 	}
    264   1.6      sato 
    265   1.1      sato 	regval = ite8181_config_read_4(sc->sc_iot, sc->sc_ioh, ITE8181_CLASS);
    266   1.6      sato 	printf("ITE8181 Rev.%02lx", regval & ITE8181_REV_MASK);
    267   1.6      sato 	if (console) {
    268   1.6      sato 		printf(", console");
    269   1.6      sato 	}
    270   1.6      sato 	printf("\n");
    271   1.6      sato 	printf("%s: framebuffer address: 0x%08lx\n",
    272   1.6      sato 		sc->sc_dev.dv_xname, (u_long)bootinfo->fb_addr);
    273  1.10      sato 	if (ite8181_lcd_control_disable)
    274  1.10      sato 		printf("%s: ite8181 lcd coontrol is DISABLED.\n",
    275  1.10      sato 			sc->sc_dev.dv_xname);
    276   1.1      sato 
    277   1.1      sato 	/* set base offsets */
    278   1.1      sato 	sc->sc_mba = ite8181_config_read_4(sc->sc_iot, sc->sc_ioh, ITE8181_MBA);
    279   1.1      sato 	DPRINTFN(1, ("ite8181: Memory base offset %08x\n", sc->sc_mba));
    280   1.1      sato 	sc->sc_gba = ite8181_config_read_4(sc->sc_iot, sc->sc_ioh, ITE8181_GBA);
    281   1.1      sato 	DPRINTFN(1, ("ite8181: GUI base offset %08x\n", sc->sc_gba));
    282   1.1      sato 	sc->sc_sba = ite8181_config_read_4(sc->sc_iot, sc->sc_ioh, ITE8181_SBA);
    283   1.1      sato 	DPRINTFN(1, ("ite8181: Graphics base offset %08x\n", sc->sc_sba));
    284   1.1      sato 
    285   1.1      sato 	/* assume lcd is on */
    286   1.1      sato 	sc->sc_lcd = 1;
    287  1.11      sato 	/* erase wince cursor */
    288  1.11      sato 	ite8181_erase_cursor(sc);
    289   1.1      sato 
    290   1.1      sato 	/* Add a power hook to power saving */
    291   1.1      sato 	sc->sc_powerhook = powerhook_establish(ite8181_power, sc);
    292   1.1      sato 	if (sc->sc_powerhook == NULL)
    293   1.1      sato 		printf("%s: WARNING: unable to establish power hook\n",
    294   1.1      sato 			sc->sc_dev.dv_xname);
    295   1.1      sato 
    296   1.1      sato 	/* Add a hard power hook to power saving */
    297   1.1      sato 	sc->sc_hardpowerhook = config_hook(CONFIG_HOOK_PMEVENT,
    298   1.1      sato 					   CONFIG_HOOK_PMEVENT_HARDPOWER,
    299   1.1      sato 					   CONFIG_HOOK_SHARE,
    300   1.1      sato 					   ite8181_hardpower, sc);
    301   1.1      sato 	if (sc->sc_hardpowerhook == NULL)
    302   1.1      sato 		printf("%s: WARNING: unable to establish hard power hook\n",
    303   1.1      sato 			sc->sc_dev.dv_xname);
    304   1.1      sato 
    305   1.8      sato 	/* initialize backlight brightness and lcd contrast */
    306  1.11      sato 	sc->sc_lcd_inited = 0;
    307  1.11      sato 	ite8181_init_brightness(sc, 1);
    308  1.11      sato 	ite8181_init_contrast(sc, 1);
    309  1.11      sato 	ite8181_init_backlight(sc, 1);
    310   1.8      sato 
    311   1.1      sato 	if (console && hpcfb_cnattach(&sc->sc_fbconf) != 0) {
    312   1.1      sato 		panic("ite8181_attach: can't init fb console");
    313   1.1      sato 	}
    314   1.1      sato 
    315   1.1      sato 	ha.ha_console = console;
    316   1.1      sato 	ha.ha_accessops = &ite8181_ha;
    317   1.1      sato 	ha.ha_accessctx = sc;
    318   1.1      sato 	ha.ha_curfbconf = 0;
    319   1.1      sato 	ha.ha_nfbconf = 1;
    320   1.1      sato 	ha.ha_fbconflist = &sc->sc_fbconf;
    321   1.1      sato 	ha.ha_curdspconf = 0;
    322   1.1      sato 	ha.ha_ndspconf = 1;
    323   1.1      sato 	ha.ha_dspconflist = &sc->sc_dspconf;
    324   1.1      sato 
    325   1.1      sato 	config_found(&sc->sc_dev, &ha, hpcfbprint);
    326   1.1      sato 
    327   1.1      sato #if NBIVIDEO > 0
    328   1.1      sato 	/*
    329   1.1      sato 	 * bivideo is no longer need
    330   1.1      sato 	 */
    331   1.1      sato 	bivideo_dont_attach = 1;
    332   1.1      sato #endif /* NBIVIDEO > 0 */
    333   1.1      sato }
    334   1.1      sato 
    335   1.1      sato int ite8181_lcd_power(sc, on)
    336   1.1      sato 	struct ite8181_softc *sc;
    337   1.1      sato 	int on;
    338   1.1      sato {
    339   1.1      sato 	int lcd_p;
    340   1.1      sato 	int lcd_s;
    341   1.1      sato 	int lcd_seq;
    342   1.1      sato 	int loop = 10;
    343   1.1      sato 
    344   1.1      sato 	if (ite8181_lcd_control_disable) {
    345   1.1      sato 		VPRINTF(("ite8171_lcd_control_disable!: %s\n", on?"on":"off"));
    346   1.1      sato 		return 0;
    347   1.1      sato 	}
    348   1.1      sato 
    349   1.1      sato 	if (sc->sc_lcd != on) {
    350   1.1      sato 		ite8181_ema_write_1(sc, ITE8181_EMA_ENABLEEMA,
    351   1.1      sato 			ITE8181_EMA_ENABLEPASS);
    352   1.1      sato 		lcd_p = ite8181_ema_read_1(sc, ITE8181_EMA_LCDPOWER);
    353   1.1      sato 		lcd_s = ite8181_ema_read_1(sc, ITE8181_EMA_LCDPOWERSTAT);
    354   1.1      sato 		lcd_seq = ite8181_ema_read_1(sc, ITE8181_EMA_LCDPOWERSEQ);
    355   1.1      sato 		DPRINTFN(1,("ite8181_lcd_power(%d)< p=%x, s=%x, seq=%x\n",
    356   1.1      sato 			on,
    357   1.1      sato 			lcd_p, lcd_s, lcd_seq));
    358   1.1      sato 		if (on) {
    359   1.1      sato 			sc->sc_lcd = 1;
    360   1.1      sato 			lcd_seq |= (ITE8181_PUP0|ITE8181_PUP1|ITE8181_PUP2);
    361   1.1      sato 			ite8181_ema_write_1(sc, ITE8181_EMA_LCDPOWERSEQ, lcd_seq);
    362   1.1      sato 			lcd_p &= ~ITE8181_LCDSTANDBY;
    363   1.1      sato 			ite8181_ema_write_1(sc, ITE8181_EMA_LCDPOWER, lcd_p);
    364   1.1      sato 			/*
    365   1.1      sato 			 * XXX:
    366   1.1      sato 			 * IBM WorkPad z50 power unit has too weak power.
    367   1.1      sato 			 * So we must wait too many times to access self device
    368   1.1      sato 			 * after LCD panel and BackLight on.
    369   1.1      sato 			 * Currently delay is not enough ??? FIXME
    370   1.1      sato 			 */
    371   1.2      sato 			delay(ite8181_lcd_on_self_delay*MSEC);
    372   1.1      sato 			while (loop--) {
    373   1.1      sato 				lcd_p = ite8181_ema_read_1(sc, ITE8181_EMA_LCDPOWER);
    374   1.1      sato 				lcd_s = ite8181_ema_read_1(sc, ITE8181_EMA_LCDPOWERSTAT);
    375   1.1      sato 				lcd_seq = ite8181_ema_read_1(sc, ITE8181_EMA_LCDPOWERSEQ);
    376   1.1      sato 				DPRINTFN(1,("ite8181_lcd_power(%d)%d| p=%x, s=%x, seq=%x\n",
    377   1.1      sato 					on, loop,
    378   1.1      sato 					lcd_p, lcd_s, lcd_seq));
    379   1.1      sato 				/* XXX the states which are not described in manual.*/
    380   1.1      sato 				if (!(lcd_s&ITE8181_LCDPSTANDBY) &&
    381   1.1      sato 					!(lcd_s&ITE8181_LCDPUP) &&
    382   1.1      sato 					(lcd_s&ITE8181_LCDPON))
    383   1.1      sato 					break;
    384   1.1      sato 				delay(100);
    385   1.1      sato 			}
    386   1.1      sato 			lcd_s |= ITE8181_PPTOBEON;
    387   1.1      sato 			ite8181_ema_write_1(sc, ITE8181_EMA_LCDPOWERSTAT, lcd_s);
    388   1.1      sato 		} else {
    389   1.1      sato 			sc->sc_lcd = 0;
    390   1.1      sato 			lcd_p |= ITE8181_LCDSTANDBY;
    391   1.1      sato 			ite8181_ema_write_1(sc, ITE8181_EMA_LCDPOWER, lcd_p);
    392   1.1      sato 			while (loop--) {
    393   1.1      sato 				lcd_p = ite8181_ema_read_1(sc, ITE8181_EMA_LCDPOWER);
    394   1.1      sato 				lcd_s = ite8181_ema_read_1(sc, ITE8181_EMA_LCDPOWERSTAT);
    395   1.1      sato 				lcd_seq = ite8181_ema_read_1(sc, ITE8181_EMA_LCDPOWERSEQ);
    396   1.1      sato 				DPRINTFN(1,("ite8181_lcd_power(%d)%d| p=%x, s=%x, seq=%x\n",
    397   1.1      sato 					on, loop,
    398   1.1      sato 					lcd_p, lcd_s, lcd_seq));
    399   1.1      sato 				/* XXX the states which are not described in manual.*/
    400   1.1      sato 				if ((lcd_s&ITE8181_LCDPSTANDBY) &&
    401   1.1      sato 					!(lcd_s&ITE8181_LCDPDOWN) &&
    402   1.1      sato 					!(lcd_s&ITE8181_LCDPON))
    403   1.1      sato 					break;
    404   1.1      sato 				delay(100);
    405   1.1      sato 			}
    406   1.1      sato 			lcd_s &= ~ITE8181_PPTOBEON;
    407   1.1      sato 			ite8181_ema_write_1(sc, ITE8181_EMA_LCDPOWERSTAT, lcd_s);
    408   1.1      sato 		}
    409   1.1      sato 		DPRINTFN(1,("ite8181_lcd_power(%d)> p=%x, s=%x, seq=%x\n",
    410   1.1      sato 			on,
    411   1.1      sato 			ite8181_ema_read_1(sc, ITE8181_EMA_LCDPOWER),
    412   1.1      sato 			ite8181_ema_read_1(sc, ITE8181_EMA_LCDPOWERSTAT),
    413   1.1      sato 			ite8181_ema_read_1(sc, ITE8181_EMA_LCDPOWERSEQ)));
    414   1.1      sato 		ite8181_ema_write_1(sc, ITE8181_EMA_ENABLEEMA,
    415   1.1      sato 					ITE8181_EMA_DISABLEPASS);
    416   1.1      sato 	}
    417   1.1      sato 	return 0;
    418   1.1      sato }
    419   1.1      sato 
    420   1.1      sato static void
    421   1.1      sato ite8181_erase_cursor(sc)
    422   1.1      sato 	struct ite8181_softc *sc;
    423   1.1      sato {
    424   1.1      sato 	ite8181_gui_write_1(sc, ITE8181_GUI_C1C, 0); /* Cursor 1 Control Reg. */
    425   1.1      sato 	/* other ? */
    426   1.1      sato }
    427   1.1      sato 
    428   1.8      sato static void
    429   1.8      sato ite8181_update_powerstate(sc, updates)
    430   1.8      sato 	struct ite8181_softc *sc;
    431   1.8      sato 	int updates;
    432   1.8      sato {
    433   1.8      sato 	if (updates & PWRSTAT_LCD)
    434   1.8      sato 		config_hook_call(CONFIG_HOOK_POWERCONTROL,
    435   1.8      sato 		    CONFIG_HOOK_POWERCONTROL_LCD,
    436   1.9      sato 		    (void*)!(sc->sc_powerstate &
    437   1.9      sato 				(PWRSTAT_VIDEOOFF|PWRSTAT_SUSPEND)));
    438   1.8      sato 
    439   1.8      sato 	if (updates & PWRSTAT_BACKLIGHT)
    440   1.8      sato 		config_hook_call(CONFIG_HOOK_POWERCONTROL,
    441   1.8      sato 		    CONFIG_HOOK_POWERCONTROL_LCDLIGHT,
    442   1.9      sato 		    (void*)(!(sc->sc_powerstate &
    443   1.9      sato 				(PWRSTAT_VIDEOOFF|PWRSTAT_SUSPEND)) &&
    444   1.8      sato 			     (sc->sc_powerstate & PWRSTAT_BACKLIGHT)));
    445   1.8      sato }
    446   1.8      sato 
    447   1.1      sato static void
    448   1.1      sato ite8181_power(why, arg)
    449   1.1      sato 	int why;
    450   1.1      sato 	void *arg;
    451   1.1      sato {
    452  1.10      sato         struct ite8181_softc *sc = arg;
    453  1.10      sato 
    454  1.10      sato 	switch (why) {
    455  1.10      sato 	case PWR_STANDBY:
    456  1.10      sato 		sc->sc_powerstate |= PWRSTAT_SUSPEND;
    457  1.10      sato 		ite8181_update_powerstate(sc, PWRSTAT_ALL);
    458  1.10      sato 		break;
    459  1.10      sato 	case PWR_SUSPEND:
    460  1.10      sato 		sc->sc_powerstate |= PWRSTAT_SUSPEND;
    461  1.10      sato 		ite8181_update_powerstate(sc, PWRSTAT_ALL);
    462  1.10      sato 		break;
    463  1.10      sato 	case PWR_RESUME:
    464  1.10      sato 		sc->sc_powerstate &= ~PWRSTAT_SUSPEND;
    465  1.10      sato 		ite8181_update_powerstate(sc, PWRSTAT_ALL);
    466  1.10      sato 		break;
    467  1.10      sato 	}
    468   1.1      sato }
    469   1.1      sato 
    470   1.1      sato static int
    471   1.1      sato ite8181_hardpower(ctx, type, id, msg)
    472   1.1      sato 	void *ctx;
    473   1.1      sato 	int type;
    474   1.1      sato 	long id;
    475   1.1      sato 	void *msg;
    476   1.1      sato {
    477   1.1      sato 	struct ite8181_softc *sc = ctx;
    478   1.1      sato 	int why = (int)msg;
    479   1.1      sato 
    480   1.1      sato 	switch (why) {
    481   1.1      sato 	case PWR_STANDBY:
    482   1.1      sato 		/* ite8181_lcd_power(sc, 0); */
    483   1.1      sato 		delay(MSEC);
    484   1.1      sato 		break;
    485   1.1      sato 	case PWR_SUSPEND:
    486   1.1      sato 		ite8181_lcd_power(sc, 0);
    487   1.1      sato 		delay(MSEC);
    488   1.1      sato 		break;
    489   1.1      sato 	case PWR_RESUME:
    490   1.1      sato 		delay(MSEC);
    491   1.1      sato 		ite8181_lcd_power(sc, 1);
    492   1.1      sato 		/*
    493   1.1      sato 		 * XXX:
    494   1.1      sato 		 * IBM WorkPad z50 power unit has too weak power.
    495   1.1      sato 		 * So we must wait too many times to access other devices
    496   1.1      sato 		 * after LCD panel and BackLight on.
    497   1.1      sato 		 */
    498   1.2      sato 		delay(ite8181_lcd_on_delay*MSEC);
    499   1.1      sato 		break;
    500   1.1      sato 	}
    501   1.1      sato 
    502   1.1      sato 	/*
    503   1.1      sato 	 * you should wait until the
    504   1.1      sato 	 * power state transit sequence will end.
    505   1.1      sato 	 */
    506   1.1      sato 
    507   1.1      sato 	return (0);
    508   1.1      sato }
    509   1.1      sato 
    510   1.1      sato static int
    511   1.1      sato ite8181_fbinit(fb)
    512   1.1      sato 	struct hpcfb_fbconf *fb;
    513   1.1      sato {
    514   1.1      sato 
    515   1.1      sato 	/*
    516   1.1      sato 	 * get fb settings from bootinfo
    517   1.1      sato 	 */
    518   1.1      sato 	if (bootinfo == NULL ||
    519   1.1      sato 	    bootinfo->fb_addr == 0 ||
    520   1.1      sato 	    bootinfo->fb_line_bytes == 0 ||
    521   1.1      sato 	    bootinfo->fb_width == 0 ||
    522   1.1      sato 	    bootinfo->fb_height == 0) {
    523  1.13    toshii 		printf("no frame buffer information.\n");
    524   1.1      sato 		return (-1);
    525   1.1      sato 	}
    526   1.1      sato 
    527   1.1      sato 	/* zero fill */
    528   1.1      sato 	bzero(fb, sizeof(*fb));
    529   1.1      sato 
    530   1.1      sato 	fb->hf_conf_index	= 0;	/* configuration index		*/
    531   1.1      sato 	fb->hf_nconfs		= 1;   	/* how many configurations	*/
    532   1.1      sato 	strcpy(fb->hf_name, "built-in video");
    533   1.1      sato 					/* frame buffer name		*/
    534   1.1      sato 	strcpy(fb->hf_conf_name, "default");
    535   1.1      sato 					/* configuration name		*/
    536   1.1      sato 	fb->hf_height		= bootinfo->fb_height;
    537   1.1      sato 	fb->hf_width		= bootinfo->fb_width;
    538   1.4  takemura 	fb->hf_baseaddr		= (u_long)bootinfo->fb_addr;
    539   1.4  takemura 	fb->hf_offset		= (u_long)bootinfo->fb_addr -
    540   1.4  takemura 				     mips_ptob(mips_btop(bootinfo->fb_addr));
    541   1.1      sato 					/* frame buffer start offset   	*/
    542   1.1      sato 	fb->hf_bytes_per_line	= bootinfo->fb_line_bytes;
    543   1.1      sato 	fb->hf_nplanes		= 1;
    544   1.1      sato 	fb->hf_bytes_per_plane	= bootinfo->fb_height *
    545   1.1      sato 					bootinfo->fb_line_bytes;
    546   1.1      sato 
    547   1.1      sato 	fb->hf_access_flags |= HPCFB_ACCESS_BYTE;
    548   1.1      sato 	fb->hf_access_flags |= HPCFB_ACCESS_WORD;
    549   1.1      sato 	fb->hf_access_flags |= HPCFB_ACCESS_DWORD;
    550   1.1      sato 
    551   1.1      sato 	switch (bootinfo->fb_type) {
    552   1.1      sato 		/*
    553   1.1      sato 		 * gray scale
    554   1.1      sato 		 */
    555   1.1      sato 	case BIFB_D2_M2L_3:
    556   1.1      sato 	case BIFB_D2_M2L_3x2:
    557   1.1      sato 		fb->hf_access_flags |= HPCFB_ACCESS_REVERSE;
    558   1.1      sato 		/* fall through */
    559   1.1      sato 	case BIFB_D2_M2L_0:
    560   1.1      sato 	case BIFB_D2_M2L_0x2:
    561   1.1      sato 		fb->hf_class = HPCFB_CLASS_GRAYSCALE;
    562   1.1      sato 		fb->hf_access_flags |= HPCFB_ACCESS_STATIC;
    563   1.1      sato 		fb->hf_pack_width = 8;
    564   1.1      sato 		fb->hf_pixels_per_pack = 4;
    565   1.1      sato 		fb->hf_pixel_width = 2;
    566   1.5      sato 		fb->hf_class_data_length = sizeof(struct hf_gray_tag);
    567   1.5      sato 		fb->hf_u.hf_gray.hf_flags = 0;	/* reserved for future use */
    568   1.5      sato 		break;
    569   1.5      sato 
    570   1.5      sato 	case BIFB_D4_M2L_F:
    571   1.5      sato 	case BIFB_D4_M2L_Fx2:
    572   1.5      sato 		fb->hf_access_flags |= HPCFB_ACCESS_REVERSE;
    573   1.5      sato 		/* fall through */
    574   1.5      sato 	case BIFB_D4_M2L_0:
    575   1.5      sato 	case BIFB_D4_M2L_0x2:
    576   1.5      sato 		fb->hf_class = HPCFB_CLASS_GRAYSCALE;
    577   1.5      sato 		fb->hf_access_flags |= HPCFB_ACCESS_STATIC;
    578   1.5      sato 		fb->hf_pack_width = 8;
    579   1.5      sato 		fb->hf_pixels_per_pack = 2;
    580   1.5      sato 		fb->hf_pixel_width = 4;
    581   1.1      sato 		fb->hf_class_data_length = sizeof(struct hf_gray_tag);
    582   1.1      sato 		fb->hf_u.hf_gray.hf_flags = 0;	/* reserved for future use */
    583   1.1      sato 		break;
    584   1.1      sato 
    585   1.1      sato 		/*
    586   1.1      sato 		 * indexed color
    587   1.1      sato 		 */
    588   1.1      sato 	case BIFB_D8_FF:
    589   1.1      sato 		fb->hf_access_flags |= HPCFB_ACCESS_REVERSE;
    590   1.1      sato 		/* fall through */
    591   1.1      sato 	case BIFB_D8_00:
    592   1.1      sato 		fb->hf_class = HPCFB_CLASS_INDEXCOLOR;
    593   1.1      sato 		fb->hf_access_flags |= HPCFB_ACCESS_STATIC;
    594   1.1      sato 		fb->hf_pack_width = 8;
    595   1.1      sato 		fb->hf_pixels_per_pack = 1;
    596   1.1      sato 		fb->hf_pixel_width = 8;
    597   1.1      sato 		fb->hf_class_data_length = sizeof(struct hf_indexed_tag);
    598   1.1      sato 		fb->hf_u.hf_indexed.hf_flags = 0; /* reserved for future use */
    599   1.1      sato 		break;
    600   1.1      sato 
    601   1.1      sato 		/*
    602   1.1      sato 		 * RGB color
    603   1.1      sato 		 */
    604   1.1      sato 	case BIFB_D16_FFFF:
    605   1.1      sato 		fb->hf_access_flags |= HPCFB_ACCESS_REVERSE;
    606   1.1      sato 		/* fall through */
    607   1.1      sato 	case BIFB_D16_0000:
    608   1.1      sato 		fb->hf_class = HPCFB_CLASS_RGBCOLOR;
    609   1.1      sato 		fb->hf_access_flags |= HPCFB_ACCESS_STATIC;
    610  1.12      sato #if BYTE_ORDER == BIG_ENDIAN /* XXXX */
    611   1.1      sato 		fb->hf_swap_flags = HPCFB_SWAP_BYTE;
    612   1.1      sato #endif
    613   1.1      sato 		fb->hf_pack_width = 16;
    614   1.1      sato 		fb->hf_pixels_per_pack = 1;
    615   1.1      sato 		fb->hf_pixel_width = 16;
    616   1.1      sato 
    617   1.1      sato 		fb->hf_class_data_length = sizeof(struct hf_rgb_tag);
    618   1.1      sato 		fb->hf_u.hf_rgb.hf_flags = 0;	/* reserved for future use */
    619   1.1      sato 
    620   1.1      sato 		fb->hf_u.hf_rgb.hf_red_width = 5;
    621   1.1      sato 		fb->hf_u.hf_rgb.hf_red_shift = 11;
    622   1.1      sato 		fb->hf_u.hf_rgb.hf_green_width = 6;
    623   1.1      sato 		fb->hf_u.hf_rgb.hf_green_shift = 5;
    624   1.1      sato 		fb->hf_u.hf_rgb.hf_blue_width = 5;
    625   1.1      sato 		fb->hf_u.hf_rgb.hf_blue_shift = 0;
    626   1.1      sato 		fb->hf_u.hf_rgb.hf_alpha_width = 0;
    627   1.1      sato 		fb->hf_u.hf_rgb.hf_alpha_shift = 0;
    628   1.1      sato 		break;
    629   1.1      sato 
    630   1.1      sato 	default:
    631   1.1      sato 		printf("unknown type (=%d).\n", bootinfo->fb_type);
    632   1.1      sato 		return (-1);
    633   1.1      sato 		break;
    634   1.1      sato 	}
    635   1.1      sato 
    636   1.1      sato 	return (0); /* no error */
    637   1.1      sato }
    638   1.1      sato 
    639   1.1      sato int
    640   1.1      sato ite8181_ioctl(v, cmd, data, flag, p)
    641   1.1      sato 	void *v;
    642   1.1      sato 	u_long cmd;
    643   1.1      sato 	caddr_t data;
    644   1.1      sato 	int flag;
    645   1.1      sato 	struct proc *p;
    646   1.1      sato {
    647   1.1      sato 	struct ite8181_softc *sc = (struct ite8181_softc *)v;
    648   1.1      sato 	struct hpcfb_fbconf *fbconf;
    649   1.1      sato 	struct hpcfb_dspconf *dspconf;
    650   1.1      sato 	struct wsdisplay_cmap *cmap;
    651   1.8      sato 	struct wsdisplay_param *dispparam;
    652   1.1      sato 
    653   1.1      sato 	switch (cmd) {
    654   1.1      sato 	case WSDISPLAYIO_GETCMAP:
    655   1.1      sato 		cmap = (struct wsdisplay_cmap*)data;
    656   1.1      sato 
    657   1.1      sato 		if (sc->sc_fbconf.hf_class != HPCFB_CLASS_INDEXCOLOR ||
    658   1.1      sato 		    sc->sc_fbconf.hf_pack_width != 8 ||
    659   1.1      sato 		    256 <= cmap->index ||
    660   1.1      sato 		    256 < (cmap->index + cmap->count))
    661   1.1      sato 			return (EINVAL);
    662   1.1      sato 
    663   1.1      sato 		if (!uvm_useracc(cmap->red, cmap->count, B_WRITE) ||
    664   1.1      sato 		    !uvm_useracc(cmap->green, cmap->count, B_WRITE) ||
    665   1.1      sato 		    !uvm_useracc(cmap->blue, cmap->count, B_WRITE))
    666   1.1      sato 			return (EFAULT);
    667   1.1      sato 
    668   1.2      sato #ifdef ITE8181_WINCE_CMAP
    669   1.1      sato 		copyout(&bivideo_cmap_r[cmap->index], cmap->red, cmap->count);
    670   1.1      sato 		copyout(&bivideo_cmap_g[cmap->index], cmap->green,cmap->count);
    671   1.1      sato 		copyout(&bivideo_cmap_b[cmap->index], cmap->blue, cmap->count);
    672   1.1      sato 		return (0);
    673   1.2      sato #else /* ITE8181_WINCE_CMAP */
    674   1.2      sato 		return EINVAL;
    675   1.2      sato #endif /* ITE8181_WINCE_CMAP */
    676   1.1      sato 
    677   1.1      sato 	case WSDISPLAYIO_PUTCMAP:
    678   1.1      sato 		/*
    679   1.1      sato 		 * This driver can't set color map.
    680   1.1      sato 		 */
    681   1.1      sato 		return (EINVAL);
    682   1.9      sato 
    683   1.9      sato 	case WSDISPLAYIO_SVIDEO:
    684   1.9      sato 		if (*(int *)data == WSDISPLAYIO_VIDEO_OFF)
    685   1.9      sato 			sc->sc_powerstate |= PWRSTAT_VIDEOOFF;
    686   1.9      sato 		else
    687   1.9      sato 			sc->sc_powerstate &= ~PWRSTAT_VIDEOOFF;
    688   1.9      sato 		ite8181_update_powerstate(sc, PWRSTAT_ALL);
    689   1.9      sato 		return 0;
    690   1.9      sato 
    691   1.9      sato 	case WSDISPLAYIO_GVIDEO:
    692   1.9      sato 		*(int *)data = (sc->sc_powerstate&PWRSTAT_VIDEOOFF) ?
    693   1.9      sato 				WSDISPLAYIO_VIDEO_OFF:WSDISPLAYIO_VIDEO_ON;
    694   1.9      sato 		return 0;
    695   1.1      sato 
    696   1.8      sato 
    697   1.8      sato 	case WSDISPLAYIO_GETPARAM:
    698   1.8      sato 		dispparam = (struct wsdisplay_param*)data;
    699   1.8      sato 		switch (dispparam->param) {
    700   1.8      sato 		case WSDISPLAYIO_PARAM_BACKLIGHT:
    701  1.11      sato 			VPRINTF(("ite8181_ioctl: GET:BACKLIGHT\n"));
    702  1.11      sato 			ite8181_init_brightness(sc, 0);
    703  1.11      sato 			ite8181_init_backlight(sc, 0);
    704  1.11      sato 			VPRINTF(("ite8181_ioctl: GET:(real)BACKLIGHT %d\n",
    705  1.11      sato 				 (sc->sc_powerstate&PWRSTAT_BACKLIGHT)? 1: 0));
    706   1.8      sato 			dispparam->min = 0;
    707   1.8      sato 			dispparam->max = 1;
    708   1.8      sato 			if (sc->sc_max_brightness > 0)
    709   1.8      sato 				dispparam->curval = sc->sc_brightness > 0? 1: 0;
    710   1.8      sato 			else
    711   1.8      sato 				dispparam->curval =
    712  1.11      sato 				    (sc->sc_powerstate&PWRSTAT_BACKLIGHT) ? 1: 0;
    713  1.11      sato 			VPRINTF(("ite8181_ioctl: GET:BACKLIGHT:%d(%s)\n",
    714  1.11      sato 				dispparam->curval,
    715  1.11      sato 				sc->sc_max_brightness > 0? "brightness": "light"));
    716   1.8      sato 			return 0;
    717   1.8      sato 			break;
    718   1.8      sato 		case WSDISPLAYIO_PARAM_CONTRAST:
    719  1.11      sato 			VPRINTF(("ite8181_ioctl: GET:CONTRAST\n"));
    720  1.11      sato 			ite8181_init_contrast(sc, 0);
    721   1.8      sato 			if (sc->sc_max_contrast > 0) {
    722   1.8      sato 				dispparam->min = 0;
    723   1.8      sato 				dispparam->max = sc->sc_max_contrast;
    724   1.8      sato 				dispparam->curval = sc->sc_contrast;
    725  1.11      sato 				VPRINTF(("ite8181_ioctl: GET:CONTRAST max=%d, current=%d\n", sc->sc_max_contrast, sc->sc_contrast));
    726   1.8      sato 				return 0;
    727   1.8      sato 			} else {
    728  1.11      sato 				VPRINTF(("ite8181_ioctl: GET:CONTRAST EINVAL\n"));
    729   1.8      sato 				return (EINVAL);
    730   1.8      sato 			}
    731   1.8      sato 			break;
    732   1.8      sato 		case WSDISPLAYIO_PARAM_BRIGHTNESS:
    733  1.11      sato 			VPRINTF(("ite8181_ioctl: GET:BRIGHTNESS\n"));
    734  1.11      sato 			ite8181_init_brightness(sc, 0);
    735   1.8      sato 			if (sc->sc_max_brightness > 0) {
    736   1.8      sato 				dispparam->min = 0;
    737   1.8      sato 				dispparam->max = sc->sc_max_brightness;
    738   1.8      sato 				dispparam->curval = sc->sc_brightness;
    739  1.11      sato 				VPRINTF(("ite8181_ioctl: GET:BRIGHTNESS max=%d, current=%d\n", sc->sc_max_brightness, sc->sc_brightness));
    740   1.8      sato 				return 0;
    741   1.8      sato 			} else {
    742  1.11      sato 				VPRINTF(("ite8181_ioctl: GET:BRIGHTNESS EINVAL\n"));
    743   1.8      sato 				return (EINVAL);
    744   1.8      sato 			}
    745   1.8      sato 			return (EINVAL);
    746   1.8      sato 		default:
    747   1.8      sato 			return (EINVAL);
    748   1.8      sato 		}
    749   1.8      sato 		return (0);
    750   1.8      sato 
    751   1.8      sato 	case WSDISPLAYIO_SETPARAM:
    752   1.8      sato 		dispparam = (struct wsdisplay_param*)data;
    753   1.8      sato 		switch (dispparam->param) {
    754   1.8      sato 		case WSDISPLAYIO_PARAM_BACKLIGHT:
    755  1.11      sato 			VPRINTF(("ite8181_ioctl: SET:BACKLIGHT\n"));
    756   1.8      sato 			if (dispparam->curval < 0 ||
    757   1.8      sato 			    1 < dispparam->curval)
    758   1.8      sato 				return (EINVAL);
    759  1.11      sato 			ite8181_init_brightness(sc, 0);
    760  1.11      sato 			VPRINTF(("ite8181_ioctl: SET:max brightness=%d\n", sc->sc_max_brightness));
    761   1.8      sato 			if (sc->sc_max_brightness > 0) { /* dimmer */
    762   1.8      sato 				if (dispparam->curval == 0){
    763   1.8      sato 					sc->sc_brightness_save = sc->sc_brightness;
    764   1.8      sato 					ite8181_set_brightness(sc, 0);	/* min */
    765   1.8      sato 				} else {
    766   1.8      sato 					if (sc->sc_brightness_save == 0)
    767   1.8      sato 						sc->sc_brightness_save = sc->sc_max_brightness;
    768   1.8      sato 					ite8181_set_brightness(sc, sc->sc_brightness_save);
    769   1.8      sato 				}
    770  1.11      sato 				VPRINTF(("ite8181_ioctl: SET:BACKLIGHT:brightness=%d\n", sc->sc_brightness));
    771   1.8      sato 			} else { /* off */
    772   1.8      sato 				if (dispparam->curval == 0)
    773   1.8      sato 					sc->sc_powerstate &= ~PWRSTAT_BACKLIGHT;
    774   1.8      sato 				else
    775   1.8      sato 					sc->sc_powerstate |= PWRSTAT_BACKLIGHT;
    776  1.11      sato 				VPRINTF(("ite8181_ioctl: SET:BACKLIGHT:powerstate %d\n",
    777   1.8      sato 						(sc->sc_powerstate & PWRSTAT_BACKLIGHT)?1:0));
    778   1.8      sato 				ite8181_update_powerstate(sc, PWRSTAT_BACKLIGHT);
    779  1.11      sato 				VPRINTF(("ite8181_ioctl: SET:BACKLIGHT:%d\n",
    780   1.8      sato 					(sc->sc_powerstate & PWRSTAT_BACKLIGHT)?1:0));
    781   1.8      sato 			}
    782   1.8      sato 			return 0;
    783   1.8      sato 			break;
    784   1.8      sato 		case WSDISPLAYIO_PARAM_CONTRAST:
    785  1.11      sato 			VPRINTF(("ite8181_ioctl: SET:CONTRAST\n"));
    786  1.11      sato 			ite8181_init_contrast(sc, 0);
    787   1.8      sato 			if (dispparam->curval < 0 ||
    788   1.8      sato 			    sc->sc_max_contrast < dispparam->curval)
    789   1.8      sato 				return (EINVAL);
    790   1.8      sato 			if (sc->sc_max_contrast > 0) {
    791   1.8      sato 				int org = sc->sc_contrast;
    792   1.8      sato 				ite8181_set_contrast(sc, dispparam->curval);
    793  1.11      sato 				VPRINTF(("ite8181_ioctl: SET:CONTRAST org=%d, current=%d\n", org, sc->sc_contrast));
    794   1.8      sato 				return 0;
    795   1.8      sato 			} else {
    796  1.11      sato 				VPRINTF(("ite8181_ioctl: SET:CONTRAST EINVAL\n"));
    797   1.8      sato 				return (EINVAL);
    798   1.8      sato 			}
    799   1.8      sato 			break;
    800   1.8      sato 		case WSDISPLAYIO_PARAM_BRIGHTNESS:
    801  1.11      sato 			VPRINTF(("ite8181_ioctl: SET:BRIGHTNESS\n"));
    802  1.11      sato 			ite8181_init_brightness(sc, 0);
    803   1.8      sato 			if (dispparam->curval < 0 ||
    804   1.8      sato 			    sc->sc_max_brightness < dispparam->curval)
    805   1.8      sato 				return (EINVAL);
    806   1.8      sato 			if (sc->sc_max_brightness > 0) {
    807   1.8      sato 				int org = sc->sc_brightness;
    808   1.8      sato 				ite8181_set_brightness(sc, dispparam->curval);
    809  1.11      sato 				VPRINTF(("ite8181_ioctl: SET:BRIGHTNESS org=%d, current=%d\n", org, sc->sc_brightness));
    810   1.8      sato 				return 0;
    811   1.8      sato 			} else {
    812  1.11      sato 				VPRINTF(("ite8181_ioctl: SET:BRIGHTNESS EINVAL\n"));
    813   1.8      sato 				return (EINVAL);
    814   1.8      sato 			}
    815   1.8      sato 			break;
    816   1.8      sato 		default:
    817   1.8      sato 			return (EINVAL);
    818   1.8      sato 		}
    819   1.8      sato 		return (0);
    820   1.8      sato 
    821   1.1      sato 	case HPCFBIO_GCONF:
    822   1.1      sato 		fbconf = (struct hpcfb_fbconf *)data;
    823   1.1      sato 		if (fbconf->hf_conf_index != 0 &&
    824   1.1      sato 		    fbconf->hf_conf_index != HPCFB_CURRENT_CONFIG) {
    825   1.1      sato 			return (EINVAL);
    826   1.1      sato 		}
    827   1.1      sato 		*fbconf = sc->sc_fbconf;	/* structure assignment */
    828   1.1      sato 		return (0);
    829   1.1      sato 	case HPCFBIO_SCONF:
    830   1.1      sato 		fbconf = (struct hpcfb_fbconf *)data;
    831   1.1      sato 		if (fbconf->hf_conf_index != 0 &&
    832   1.1      sato 		    fbconf->hf_conf_index != HPCFB_CURRENT_CONFIG) {
    833   1.1      sato 			return (EINVAL);
    834   1.1      sato 		}
    835   1.1      sato 		/*
    836   1.1      sato 		 * nothing to do because we have only one configration
    837   1.1      sato 		 */
    838   1.1      sato 		return (0);
    839   1.1      sato 	case HPCFBIO_GDSPCONF:
    840   1.1      sato 		dspconf = (struct hpcfb_dspconf *)data;
    841   1.1      sato 		if ((dspconf->hd_unit_index != 0 &&
    842   1.1      sato 		     dspconf->hd_unit_index != HPCFB_CURRENT_UNIT) ||
    843   1.1      sato 		    (dspconf->hd_conf_index != 0 &&
    844   1.1      sato 		     dspconf->hd_conf_index != HPCFB_CURRENT_CONFIG)) {
    845   1.1      sato 			return (EINVAL);
    846   1.1      sato 		}
    847   1.1      sato 		*dspconf = sc->sc_dspconf;	/* structure assignment */
    848   1.1      sato 		return (0);
    849   1.1      sato 	case HPCFBIO_SDSPCONF:
    850   1.1      sato 		dspconf = (struct hpcfb_dspconf *)data;
    851   1.1      sato 		if ((dspconf->hd_unit_index != 0 &&
    852   1.1      sato 		     dspconf->hd_unit_index != HPCFB_CURRENT_UNIT) ||
    853   1.1      sato 		    (dspconf->hd_conf_index != 0 &&
    854   1.1      sato 		     dspconf->hd_conf_index != HPCFB_CURRENT_CONFIG)) {
    855   1.1      sato 			return (EINVAL);
    856   1.1      sato 		}
    857   1.1      sato 		/*
    858   1.1      sato 		 * nothing to do
    859   1.1      sato 		 * because we have only one unit and one configration
    860   1.1      sato 		 */
    861   1.1      sato 		return (0);
    862   1.1      sato 	case HPCFBIO_GOP:
    863   1.1      sato 	case HPCFBIO_SOP:
    864   1.1      sato 		/*
    865   1.1      sato 		 * curently not implemented...
    866   1.1      sato 		 */
    867   1.1      sato 		return (EINVAL);
    868   1.1      sato 	}
    869   1.1      sato 
    870   1.1      sato 	return (ENOTTY);
    871   1.1      sato }
    872   1.1      sato 
    873   1.1      sato paddr_t
    874   1.1      sato ite8181_mmap(ctx, offset, prot)
    875   1.1      sato 	void *ctx;
    876   1.1      sato 	off_t offset;
    877   1.1      sato 	int prot;
    878   1.1      sato {
    879   1.1      sato 	struct ite8181_softc *sc = (struct ite8181_softc *)ctx;
    880   1.1      sato 
    881   1.1      sato 	if (offset < 0 ||
    882   1.1      sato 	    (sc->sc_fbconf.hf_bytes_per_plane +
    883   1.1      sato 		sc->sc_fbconf.hf_offset) <  offset)
    884   1.1      sato 		return -1;
    885   1.1      sato 
    886   1.4  takemura 	return mips_btop((u_long)bootinfo->fb_addr + offset);
    887   1.8      sato }
    888   1.8      sato 
    889  1.11      sato 
    890   1.8      sato void
    891  1.11      sato ite8181_init_backlight(sc, inattach)
    892   1.8      sato 	struct ite8181_softc *sc;
    893  1.11      sato 	int inattach;
    894   1.8      sato {
    895   1.8      sato 	int val = -1;
    896   1.8      sato 
    897  1.11      sato 	if (sc->sc_lcd_inited&BACKLIGHT_INITED)
    898  1.11      sato 		return;
    899  1.11      sato 
    900  1.10      sato 	if (config_hook_call(CONFIG_HOOK_GET,
    901  1.10      sato 	     CONFIG_HOOK_POWER_LCDLIGHT, &val) != -1) {
    902  1.11      sato 		/* we can get real light state */
    903  1.11      sato 		VPRINTF(("ite8181_init_backlight: real backlight=%d\n", val));
    904  1.10      sato 		if (val == 0)
    905  1.10      sato 			sc->sc_powerstate &= ~PWRSTAT_BACKLIGHT;
    906  1.10      sato 		else
    907  1.10      sato 			sc->sc_powerstate |= PWRSTAT_BACKLIGHT;
    908  1.11      sato 		sc->sc_lcd_inited |= BACKLIGHT_INITED;
    909  1.11      sato 	} else if (inattach) {
    910  1.11      sato 		/*
    911  1.11      sato 		   we cannot get real light state in attach time
    912  1.11      sato 		   because light device not yet attached.
    913  1.11      sato 		   we will retry in !inattach.
    914  1.11      sato 		   temporary assume light is on.
    915  1.11      sato 		 */
    916  1.10      sato 		sc->sc_powerstate |= PWRSTAT_BACKLIGHT;
    917  1.11      sato 	} else {
    918  1.11      sato 		/* we cannot get real light state, so work by myself state */
    919  1.11      sato 		sc->sc_lcd_inited |= BACKLIGHT_INITED;
    920  1.11      sato 	}
    921   1.8      sato }
    922   1.8      sato 
    923   1.8      sato void
    924  1.11      sato ite8181_init_brightness(sc, inattach)
    925   1.8      sato 	struct ite8181_softc *sc;
    926  1.11      sato 	int inattach;
    927   1.8      sato {
    928   1.8      sato 	int val = -1;
    929   1.8      sato 
    930  1.11      sato 	if (sc->sc_lcd_inited&BRIGHTNESS_INITED)
    931  1.11      sato 		return;
    932  1.11      sato 
    933  1.11      sato 	VPRINTF(("ite8181_init_brightness\n"));
    934   1.8      sato 	if (config_hook_call(CONFIG_HOOK_GET,
    935   1.8      sato 	     CONFIG_HOOK_BRIGHTNESS_MAX, &val) != -1) {
    936  1.11      sato 		/* we can get real brightness max */
    937  1.11      sato 		VPRINTF(("ite8181_init_brightness: real brightness max=%d\n", val));
    938  1.11      sato 		sc->sc_max_brightness = val;
    939  1.11      sato 		val = -1;
    940  1.11      sato 		if (config_hook_call(CONFIG_HOOK_GET,
    941  1.11      sato 		     CONFIG_HOOK_BRIGHTNESS, &val) != -1) {
    942  1.11      sato 			/* we can get real brightness */
    943  1.11      sato 			VPRINTF(("ite8181_init_brightness: real brightness=%d\n", val));
    944  1.11      sato 			sc->sc_brightness_save = sc->sc_brightness = val;
    945  1.11      sato 		} else {
    946  1.11      sato 			sc->sc_brightness_save =
    947  1.11      sato 			sc->sc_brightness = sc->sc_max_brightness;
    948  1.11      sato 		}
    949  1.11      sato 		sc->sc_lcd_inited |= BRIGHTNESS_INITED;
    950  1.11      sato 	} else if (inattach) {
    951  1.11      sato 		/*
    952  1.11      sato 		   we cannot get real brightness in attach time
    953  1.11      sato 		   because brightness device not yet attached.
    954  1.11      sato 		   we will retry in !inattach.
    955  1.11      sato 		 */
    956  1.11      sato 		sc->sc_max_brightness = -1;
    957  1.11      sato 		sc->sc_brightness = -1;
    958  1.11      sato 		sc->sc_brightness_save = -1;
    959  1.11      sato 	} else {
    960  1.11      sato 		/* we cannot get real brightness */
    961  1.11      sato 		sc->sc_lcd_inited |= BRIGHTNESS_INITED;
    962   1.8      sato 	}
    963  1.11      sato 
    964   1.8      sato 	return;
    965   1.8      sato }
    966   1.8      sato 
    967   1.8      sato void
    968  1.11      sato ite8181_init_contrast(sc, inattach)
    969   1.8      sato 	struct ite8181_softc *sc;
    970  1.11      sato 	int inattach;
    971   1.8      sato {
    972   1.8      sato 	int val = -1;
    973   1.8      sato 
    974  1.11      sato 	if (sc->sc_lcd_inited&CONTRAST_INITED)
    975  1.11      sato 		return;
    976  1.11      sato 
    977  1.11      sato 	VPRINTF(("ite8181_init_contrast\n"));
    978   1.8      sato 	if (config_hook_call(CONFIG_HOOK_GET,
    979   1.8      sato 	     CONFIG_HOOK_CONTRAST_MAX, &val) != -1) {
    980  1.11      sato 		/* we can get real contrast max */
    981  1.11      sato 		VPRINTF(("ite8181_init_contrast: real contrast max=%d\n", val));
    982   1.8      sato 		sc->sc_max_contrast = val;
    983  1.11      sato 		val = -1;
    984  1.11      sato 		if (config_hook_call(CONFIG_HOOK_GET,
    985  1.11      sato 		     CONFIG_HOOK_CONTRAST, &val) != -1) {
    986  1.11      sato 			/* we can get real contrast */
    987  1.11      sato 			VPRINTF(("ite8181_init_contrast: real contrast=%d\n", val));
    988  1.11      sato 			sc->sc_contrast = val;
    989  1.11      sato 		} else {
    990  1.11      sato 			sc->sc_contrast = sc->sc_max_contrast;
    991  1.11      sato 		}
    992  1.11      sato 		sc->sc_lcd_inited |= CONTRAST_INITED;
    993  1.11      sato 	} else if (inattach) {
    994  1.11      sato 		/*
    995  1.11      sato 		   we cannot get real contrast in attach time
    996  1.11      sato 		   because contrast device not yet attached.
    997  1.11      sato 		   we will retry in !inattach.
    998  1.11      sato 		 */
    999  1.11      sato 		sc->sc_max_contrast = -1;
   1000  1.11      sato 		sc->sc_contrast = -1;
   1001  1.11      sato 	} else {
   1002  1.11      sato 		/* we cannot get real contrast */
   1003  1.11      sato 		sc->sc_lcd_inited |= CONTRAST_INITED;
   1004   1.8      sato 	}
   1005  1.11      sato 
   1006   1.8      sato 	return;
   1007   1.8      sato }
   1008  1.11      sato 
   1009   1.8      sato 
   1010   1.8      sato void
   1011   1.8      sato ite8181_set_brightness(sc, val)
   1012   1.8      sato 	struct ite8181_softc *sc;
   1013   1.8      sato 	int val;
   1014   1.8      sato {
   1015   1.8      sato 	sc->sc_brightness = val;
   1016   1.8      sato 
   1017   1.8      sato 	config_hook_call(CONFIG_HOOK_SET, CONFIG_HOOK_BRIGHTNESS, &val);
   1018   1.8      sato 	if (config_hook_call(CONFIG_HOOK_GET,
   1019   1.8      sato 	     CONFIG_HOOK_BRIGHTNESS, &val) != -1) {
   1020   1.8      sato 		sc->sc_brightness = val;
   1021   1.8      sato 	}
   1022   1.8      sato }
   1023   1.8      sato 
   1024   1.8      sato void
   1025   1.8      sato ite8181_set_contrast(sc, val)
   1026   1.8      sato 	struct ite8181_softc *sc;
   1027   1.8      sato 	int val;
   1028   1.8      sato {
   1029   1.8      sato 	sc->sc_contrast = val;
   1030   1.8      sato 
   1031   1.8      sato 	config_hook_call(CONFIG_HOOK_SET, CONFIG_HOOK_CONTRAST, &val);
   1032   1.8      sato 	if (config_hook_call(CONFIG_HOOK_GET,
   1033   1.8      sato 	     CONFIG_HOOK_CONTRAST, &val) != -1) {
   1034   1.8      sato 		sc->sc_contrast = val;
   1035   1.8      sato 	}
   1036   1.1      sato }
   1037