Home | History | Annotate | Line # | Download | only in dev
ite8181.c revision 1.10
      1  1.10      sato /*	$NetBSD: ite8181.c,v 1.10 2001/03/12 08:54:26 sato 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.8      sato void	ite8181_get_backlight __P((struct ite8181_softc *));
    126   1.8      sato void	ite8181_init_brightness __P((struct ite8181_softc *));
    127   1.8      sato void	ite8181_init_contrast __P((struct ite8181_softc *));
    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.1      sato 
    288   1.1      sato 	/* Add a power hook to power saving */
    289   1.1      sato 	sc->sc_powerhook = powerhook_establish(ite8181_power, sc);
    290   1.1      sato 	if (sc->sc_powerhook == NULL)
    291   1.1      sato 		printf("%s: WARNING: unable to establish power hook\n",
    292   1.1      sato 			sc->sc_dev.dv_xname);
    293   1.1      sato 
    294   1.1      sato 	/* Add a hard power hook to power saving */
    295   1.1      sato 	sc->sc_hardpowerhook = config_hook(CONFIG_HOOK_PMEVENT,
    296   1.1      sato 					   CONFIG_HOOK_PMEVENT_HARDPOWER,
    297   1.1      sato 					   CONFIG_HOOK_SHARE,
    298   1.1      sato 					   ite8181_hardpower, sc);
    299   1.1      sato 	if (sc->sc_hardpowerhook == NULL)
    300   1.1      sato 		printf("%s: WARNING: unable to establish hard power hook\n",
    301   1.1      sato 			sc->sc_dev.dv_xname);
    302   1.1      sato 
    303   1.1      sato 	ite8181_erase_cursor(sc);
    304   1.1      sato 
    305   1.8      sato 	/* initialize backlight brightness and lcd contrast */
    306   1.8      sato 	sc->sc_brightness = sc->sc_contrast =
    307   1.8      sato 	sc->sc_max_brightness = sc->sc_max_contrast = -1;
    308   1.8      sato 	ite8181_get_backlight(sc);
    309   1.8      sato 	ite8181_init_brightness(sc);
    310   1.8      sato 	ite8181_init_contrast(sc);
    311   1.8      sato 
    312   1.1      sato 	if (console && hpcfb_cnattach(&sc->sc_fbconf) != 0) {
    313   1.1      sato 		panic("ite8181_attach: can't init fb console");
    314   1.1      sato 	}
    315   1.1      sato 
    316   1.1      sato 	ha.ha_console = console;
    317   1.1      sato 	ha.ha_accessops = &ite8181_ha;
    318   1.1      sato 	ha.ha_accessctx = sc;
    319   1.1      sato 	ha.ha_curfbconf = 0;
    320   1.1      sato 	ha.ha_nfbconf = 1;
    321   1.1      sato 	ha.ha_fbconflist = &sc->sc_fbconf;
    322   1.1      sato 	ha.ha_curdspconf = 0;
    323   1.1      sato 	ha.ha_ndspconf = 1;
    324   1.1      sato 	ha.ha_dspconflist = &sc->sc_dspconf;
    325   1.1      sato 
    326   1.1      sato 	config_found(&sc->sc_dev, &ha, hpcfbprint);
    327   1.1      sato 
    328   1.1      sato #if NBIVIDEO > 0
    329   1.1      sato 	/*
    330   1.1      sato 	 * bivideo is no longer need
    331   1.1      sato 	 */
    332   1.1      sato 	bivideo_dont_attach = 1;
    333   1.1      sato #endif /* NBIVIDEO > 0 */
    334   1.1      sato }
    335   1.1      sato 
    336   1.1      sato int ite8181_lcd_power(sc, on)
    337   1.1      sato 	struct ite8181_softc *sc;
    338   1.1      sato 	int on;
    339   1.1      sato {
    340   1.1      sato 	int lcd_p;
    341   1.1      sato 	int lcd_s;
    342   1.1      sato 	int lcd_seq;
    343   1.1      sato 	int loop = 10;
    344   1.1      sato 
    345   1.1      sato 	if (ite8181_lcd_control_disable) {
    346   1.1      sato 		VPRINTF(("ite8171_lcd_control_disable!: %s\n", on?"on":"off"));
    347   1.1      sato 		return 0;
    348   1.1      sato 	}
    349   1.1      sato 
    350   1.1      sato 	if (sc->sc_lcd != on) {
    351   1.1      sato 		ite8181_ema_write_1(sc, ITE8181_EMA_ENABLEEMA,
    352   1.1      sato 			ITE8181_EMA_ENABLEPASS);
    353   1.1      sato 		lcd_p = ite8181_ema_read_1(sc, ITE8181_EMA_LCDPOWER);
    354   1.1      sato 		lcd_s = ite8181_ema_read_1(sc, ITE8181_EMA_LCDPOWERSTAT);
    355   1.1      sato 		lcd_seq = ite8181_ema_read_1(sc, ITE8181_EMA_LCDPOWERSEQ);
    356   1.1      sato 		DPRINTFN(1,("ite8181_lcd_power(%d)< p=%x, s=%x, seq=%x\n",
    357   1.1      sato 			on,
    358   1.1      sato 			lcd_p, lcd_s, lcd_seq));
    359   1.1      sato 		if (on) {
    360   1.1      sato 			sc->sc_lcd = 1;
    361   1.1      sato 			lcd_seq |= (ITE8181_PUP0|ITE8181_PUP1|ITE8181_PUP2);
    362   1.1      sato 			ite8181_ema_write_1(sc, ITE8181_EMA_LCDPOWERSEQ, lcd_seq);
    363   1.1      sato 			lcd_p &= ~ITE8181_LCDSTANDBY;
    364   1.1      sato 			ite8181_ema_write_1(sc, ITE8181_EMA_LCDPOWER, lcd_p);
    365   1.1      sato 			/*
    366   1.1      sato 			 * XXX:
    367   1.1      sato 			 * IBM WorkPad z50 power unit has too weak power.
    368   1.1      sato 			 * So we must wait too many times to access self device
    369   1.1      sato 			 * after LCD panel and BackLight on.
    370   1.1      sato 			 * Currently delay is not enough ??? FIXME
    371   1.1      sato 			 */
    372   1.2      sato 			delay(ite8181_lcd_on_self_delay*MSEC);
    373   1.1      sato 			while (loop--) {
    374   1.1      sato 				lcd_p = ite8181_ema_read_1(sc, ITE8181_EMA_LCDPOWER);
    375   1.1      sato 				lcd_s = ite8181_ema_read_1(sc, ITE8181_EMA_LCDPOWERSTAT);
    376   1.1      sato 				lcd_seq = ite8181_ema_read_1(sc, ITE8181_EMA_LCDPOWERSEQ);
    377   1.1      sato 				DPRINTFN(1,("ite8181_lcd_power(%d)%d| p=%x, s=%x, seq=%x\n",
    378   1.1      sato 					on, loop,
    379   1.1      sato 					lcd_p, lcd_s, lcd_seq));
    380   1.1      sato 				/* XXX the states which are not described in manual.*/
    381   1.1      sato 				if (!(lcd_s&ITE8181_LCDPSTANDBY) &&
    382   1.1      sato 					!(lcd_s&ITE8181_LCDPUP) &&
    383   1.1      sato 					(lcd_s&ITE8181_LCDPON))
    384   1.1      sato 					break;
    385   1.1      sato 				delay(100);
    386   1.1      sato 			}
    387   1.1      sato 			lcd_s |= ITE8181_PPTOBEON;
    388   1.1      sato 			ite8181_ema_write_1(sc, ITE8181_EMA_LCDPOWERSTAT, lcd_s);
    389   1.1      sato 		} else {
    390   1.1      sato 			sc->sc_lcd = 0;
    391   1.1      sato 			lcd_p |= ITE8181_LCDSTANDBY;
    392   1.1      sato 			ite8181_ema_write_1(sc, ITE8181_EMA_LCDPOWER, lcd_p);
    393   1.1      sato 			while (loop--) {
    394   1.1      sato 				lcd_p = ite8181_ema_read_1(sc, ITE8181_EMA_LCDPOWER);
    395   1.1      sato 				lcd_s = ite8181_ema_read_1(sc, ITE8181_EMA_LCDPOWERSTAT);
    396   1.1      sato 				lcd_seq = ite8181_ema_read_1(sc, ITE8181_EMA_LCDPOWERSEQ);
    397   1.1      sato 				DPRINTFN(1,("ite8181_lcd_power(%d)%d| p=%x, s=%x, seq=%x\n",
    398   1.1      sato 					on, loop,
    399   1.1      sato 					lcd_p, lcd_s, lcd_seq));
    400   1.1      sato 				/* XXX the states which are not described in manual.*/
    401   1.1      sato 				if ((lcd_s&ITE8181_LCDPSTANDBY) &&
    402   1.1      sato 					!(lcd_s&ITE8181_LCDPDOWN) &&
    403   1.1      sato 					!(lcd_s&ITE8181_LCDPON))
    404   1.1      sato 					break;
    405   1.1      sato 				delay(100);
    406   1.1      sato 			}
    407   1.1      sato 			lcd_s &= ~ITE8181_PPTOBEON;
    408   1.1      sato 			ite8181_ema_write_1(sc, ITE8181_EMA_LCDPOWERSTAT, lcd_s);
    409   1.1      sato 		}
    410   1.1      sato 		DPRINTFN(1,("ite8181_lcd_power(%d)> p=%x, s=%x, seq=%x\n",
    411   1.1      sato 			on,
    412   1.1      sato 			ite8181_ema_read_1(sc, ITE8181_EMA_LCDPOWER),
    413   1.1      sato 			ite8181_ema_read_1(sc, ITE8181_EMA_LCDPOWERSTAT),
    414   1.1      sato 			ite8181_ema_read_1(sc, ITE8181_EMA_LCDPOWERSEQ)));
    415   1.1      sato 		ite8181_ema_write_1(sc, ITE8181_EMA_ENABLEEMA,
    416   1.1      sato 					ITE8181_EMA_DISABLEPASS);
    417   1.1      sato 	}
    418   1.1      sato 	return 0;
    419   1.1      sato }
    420   1.1      sato 
    421   1.1      sato static void
    422   1.1      sato ite8181_erase_cursor(sc)
    423   1.1      sato 	struct ite8181_softc *sc;
    424   1.1      sato {
    425   1.1      sato 	ite8181_gui_write_1(sc, ITE8181_GUI_C1C, 0); /* Cursor 1 Control Reg. */
    426   1.1      sato 	/* other ? */
    427   1.1      sato }
    428   1.1      sato 
    429   1.8      sato static void
    430   1.8      sato ite8181_update_powerstate(sc, updates)
    431   1.8      sato 	struct ite8181_softc *sc;
    432   1.8      sato 	int updates;
    433   1.8      sato {
    434   1.8      sato 	if (updates & PWRSTAT_LCD)
    435   1.8      sato 		config_hook_call(CONFIG_HOOK_POWERCONTROL,
    436   1.8      sato 		    CONFIG_HOOK_POWERCONTROL_LCD,
    437   1.9      sato 		    (void*)!(sc->sc_powerstate &
    438   1.9      sato 				(PWRSTAT_VIDEOOFF|PWRSTAT_SUSPEND)));
    439   1.8      sato 
    440   1.8      sato 	if (updates & PWRSTAT_BACKLIGHT)
    441   1.8      sato 		config_hook_call(CONFIG_HOOK_POWERCONTROL,
    442   1.8      sato 		    CONFIG_HOOK_POWERCONTROL_LCDLIGHT,
    443   1.9      sato 		    (void*)(!(sc->sc_powerstate &
    444   1.9      sato 				(PWRSTAT_VIDEOOFF|PWRSTAT_SUSPEND)) &&
    445   1.8      sato 			     (sc->sc_powerstate & PWRSTAT_BACKLIGHT)));
    446   1.8      sato }
    447   1.8      sato 
    448   1.1      sato static void
    449   1.1      sato ite8181_power(why, arg)
    450   1.1      sato 	int why;
    451   1.1      sato 	void *arg;
    452   1.1      sato {
    453  1.10      sato         struct ite8181_softc *sc = arg;
    454  1.10      sato 
    455  1.10      sato 	switch (why) {
    456  1.10      sato 	case PWR_STANDBY:
    457  1.10      sato 		sc->sc_powerstate |= PWRSTAT_SUSPEND;
    458  1.10      sato 		ite8181_update_powerstate(sc, PWRSTAT_ALL);
    459  1.10      sato 		break;
    460  1.10      sato 	case PWR_SUSPEND:
    461  1.10      sato 		sc->sc_powerstate |= PWRSTAT_SUSPEND;
    462  1.10      sato 		ite8181_update_powerstate(sc, PWRSTAT_ALL);
    463  1.10      sato 		break;
    464  1.10      sato 	case PWR_RESUME:
    465  1.10      sato 		sc->sc_powerstate &= ~PWRSTAT_SUSPEND;
    466  1.10      sato 		ite8181_update_powerstate(sc, PWRSTAT_ALL);
    467  1.10      sato 		break;
    468  1.10      sato 	}
    469   1.1      sato }
    470   1.1      sato 
    471   1.1      sato static int
    472   1.1      sato ite8181_hardpower(ctx, type, id, msg)
    473   1.1      sato 	void *ctx;
    474   1.1      sato 	int type;
    475   1.1      sato 	long id;
    476   1.1      sato 	void *msg;
    477   1.1      sato {
    478   1.1      sato 	struct ite8181_softc *sc = ctx;
    479   1.1      sato 	int why = (int)msg;
    480   1.1      sato 
    481   1.1      sato 	switch (why) {
    482   1.1      sato 	case PWR_STANDBY:
    483   1.1      sato 		/* ite8181_lcd_power(sc, 0); */
    484   1.1      sato 		delay(MSEC);
    485   1.1      sato 		break;
    486   1.1      sato 	case PWR_SUSPEND:
    487   1.1      sato 		ite8181_lcd_power(sc, 0);
    488   1.1      sato 		delay(MSEC);
    489   1.1      sato 		break;
    490   1.1      sato 	case PWR_RESUME:
    491   1.1      sato 		delay(MSEC);
    492   1.1      sato 		ite8181_lcd_power(sc, 1);
    493   1.1      sato 		/*
    494   1.1      sato 		 * XXX:
    495   1.1      sato 		 * IBM WorkPad z50 power unit has too weak power.
    496   1.1      sato 		 * So we must wait too many times to access other devices
    497   1.1      sato 		 * after LCD panel and BackLight on.
    498   1.1      sato 		 */
    499   1.2      sato 		delay(ite8181_lcd_on_delay*MSEC);
    500   1.1      sato 		break;
    501   1.1      sato 	}
    502   1.1      sato 
    503   1.1      sato 	/*
    504   1.1      sato 	 * you should wait until the
    505   1.1      sato 	 * power state transit sequence will end.
    506   1.1      sato 	 */
    507   1.1      sato 
    508   1.1      sato 	return (0);
    509   1.1      sato }
    510   1.1      sato 
    511   1.1      sato static int
    512   1.1      sato ite8181_fbinit(fb)
    513   1.1      sato 	struct hpcfb_fbconf *fb;
    514   1.1      sato {
    515   1.1      sato 
    516   1.1      sato 	/*
    517   1.1      sato 	 * get fb settings from bootinfo
    518   1.1      sato 	 */
    519   1.1      sato 	if (bootinfo == NULL ||
    520   1.1      sato 	    bootinfo->fb_addr == 0 ||
    521   1.1      sato 	    bootinfo->fb_line_bytes == 0 ||
    522   1.1      sato 	    bootinfo->fb_width == 0 ||
    523   1.1      sato 	    bootinfo->fb_height == 0) {
    524   1.1      sato 		printf("no frame buffer infomation.\n");
    525   1.1      sato 		return (-1);
    526   1.1      sato 	}
    527   1.1      sato 
    528   1.1      sato 	/* zero fill */
    529   1.1      sato 	bzero(fb, sizeof(*fb));
    530   1.1      sato 
    531   1.1      sato 	fb->hf_conf_index	= 0;	/* configuration index		*/
    532   1.1      sato 	fb->hf_nconfs		= 1;   	/* how many configurations	*/
    533   1.1      sato 	strcpy(fb->hf_name, "built-in video");
    534   1.1      sato 					/* frame buffer name		*/
    535   1.1      sato 	strcpy(fb->hf_conf_name, "default");
    536   1.1      sato 					/* configuration name		*/
    537   1.1      sato 	fb->hf_height		= bootinfo->fb_height;
    538   1.1      sato 	fb->hf_width		= bootinfo->fb_width;
    539   1.4  takemura 	fb->hf_baseaddr		= (u_long)bootinfo->fb_addr;
    540   1.4  takemura 	fb->hf_offset		= (u_long)bootinfo->fb_addr -
    541   1.4  takemura 				     mips_ptob(mips_btop(bootinfo->fb_addr));
    542   1.1      sato 					/* frame buffer start offset   	*/
    543   1.1      sato 	fb->hf_bytes_per_line	= bootinfo->fb_line_bytes;
    544   1.1      sato 	fb->hf_nplanes		= 1;
    545   1.1      sato 	fb->hf_bytes_per_plane	= bootinfo->fb_height *
    546   1.1      sato 					bootinfo->fb_line_bytes;
    547   1.1      sato 
    548   1.1      sato 	fb->hf_access_flags |= HPCFB_ACCESS_BYTE;
    549   1.1      sato 	fb->hf_access_flags |= HPCFB_ACCESS_WORD;
    550   1.1      sato 	fb->hf_access_flags |= HPCFB_ACCESS_DWORD;
    551   1.1      sato 
    552   1.1      sato 	switch (bootinfo->fb_type) {
    553   1.1      sato 		/*
    554   1.1      sato 		 * gray scale
    555   1.1      sato 		 */
    556   1.1      sato 	case BIFB_D2_M2L_3:
    557   1.1      sato 	case BIFB_D2_M2L_3x2:
    558   1.1      sato 		fb->hf_access_flags |= HPCFB_ACCESS_REVERSE;
    559   1.1      sato 		/* fall through */
    560   1.1      sato 	case BIFB_D2_M2L_0:
    561   1.1      sato 	case BIFB_D2_M2L_0x2:
    562   1.1      sato 		fb->hf_class = HPCFB_CLASS_GRAYSCALE;
    563   1.1      sato 		fb->hf_access_flags |= HPCFB_ACCESS_STATIC;
    564   1.1      sato 		fb->hf_pack_width = 8;
    565   1.1      sato 		fb->hf_pixels_per_pack = 4;
    566   1.1      sato 		fb->hf_pixel_width = 2;
    567   1.5      sato 		fb->hf_class_data_length = sizeof(struct hf_gray_tag);
    568   1.5      sato 		fb->hf_u.hf_gray.hf_flags = 0;	/* reserved for future use */
    569   1.5      sato 		break;
    570   1.5      sato 
    571   1.5      sato 	case BIFB_D4_M2L_F:
    572   1.5      sato 	case BIFB_D4_M2L_Fx2:
    573   1.5      sato 		fb->hf_access_flags |= HPCFB_ACCESS_REVERSE;
    574   1.5      sato 		/* fall through */
    575   1.5      sato 	case BIFB_D4_M2L_0:
    576   1.5      sato 	case BIFB_D4_M2L_0x2:
    577   1.5      sato 		fb->hf_class = HPCFB_CLASS_GRAYSCALE;
    578   1.5      sato 		fb->hf_access_flags |= HPCFB_ACCESS_STATIC;
    579   1.5      sato 		fb->hf_pack_width = 8;
    580   1.5      sato 		fb->hf_pixels_per_pack = 2;
    581   1.5      sato 		fb->hf_pixel_width = 4;
    582   1.1      sato 		fb->hf_class_data_length = sizeof(struct hf_gray_tag);
    583   1.1      sato 		fb->hf_u.hf_gray.hf_flags = 0;	/* reserved for future use */
    584   1.1      sato 		break;
    585   1.1      sato 
    586   1.1      sato 		/*
    587   1.1      sato 		 * indexed color
    588   1.1      sato 		 */
    589   1.1      sato 	case BIFB_D8_FF:
    590   1.1      sato 		fb->hf_access_flags |= HPCFB_ACCESS_REVERSE;
    591   1.1      sato 		/* fall through */
    592   1.1      sato 	case BIFB_D8_00:
    593   1.1      sato 		fb->hf_class = HPCFB_CLASS_INDEXCOLOR;
    594   1.1      sato 		fb->hf_access_flags |= HPCFB_ACCESS_STATIC;
    595   1.1      sato 		fb->hf_pack_width = 8;
    596   1.1      sato 		fb->hf_pixels_per_pack = 1;
    597   1.1      sato 		fb->hf_pixel_width = 8;
    598   1.1      sato 		fb->hf_class_data_length = sizeof(struct hf_indexed_tag);
    599   1.1      sato 		fb->hf_u.hf_indexed.hf_flags = 0; /* reserved for future use */
    600   1.1      sato 		break;
    601   1.1      sato 
    602   1.1      sato 		/*
    603   1.1      sato 		 * RGB color
    604   1.1      sato 		 */
    605   1.1      sato 	case BIFB_D16_FFFF:
    606   1.1      sato 		fb->hf_access_flags |= HPCFB_ACCESS_REVERSE;
    607   1.1      sato 		/* fall through */
    608   1.1      sato 	case BIFB_D16_0000:
    609   1.1      sato 		fb->hf_class = HPCFB_CLASS_RGBCOLOR;
    610   1.1      sato 		fb->hf_access_flags |= HPCFB_ACCESS_STATIC;
    611   1.1      sato #if BYTE_ORDER == LITTLE_ENDIAN
    612   1.1      sato 		fb->hf_swap_flags = HPCFB_SWAP_BYTE;
    613   1.1      sato #endif
    614   1.1      sato 		fb->hf_pack_width = 16;
    615   1.1      sato 		fb->hf_pixels_per_pack = 1;
    616   1.1      sato 		fb->hf_pixel_width = 16;
    617   1.1      sato 
    618   1.1      sato 		fb->hf_class_data_length = sizeof(struct hf_rgb_tag);
    619   1.1      sato 		fb->hf_u.hf_rgb.hf_flags = 0;	/* reserved for future use */
    620   1.1      sato 
    621   1.1      sato 		fb->hf_u.hf_rgb.hf_red_width = 5;
    622   1.1      sato 		fb->hf_u.hf_rgb.hf_red_shift = 11;
    623   1.1      sato 		fb->hf_u.hf_rgb.hf_green_width = 6;
    624   1.1      sato 		fb->hf_u.hf_rgb.hf_green_shift = 5;
    625   1.1      sato 		fb->hf_u.hf_rgb.hf_blue_width = 5;
    626   1.1      sato 		fb->hf_u.hf_rgb.hf_blue_shift = 0;
    627   1.1      sato 		fb->hf_u.hf_rgb.hf_alpha_width = 0;
    628   1.1      sato 		fb->hf_u.hf_rgb.hf_alpha_shift = 0;
    629   1.1      sato 		break;
    630   1.1      sato 
    631   1.1      sato 	default:
    632   1.1      sato 		printf("unknown type (=%d).\n", bootinfo->fb_type);
    633   1.1      sato 		return (-1);
    634   1.1      sato 		break;
    635   1.1      sato 	}
    636   1.1      sato 
    637   1.1      sato 	return (0); /* no error */
    638   1.1      sato }
    639   1.1      sato 
    640   1.1      sato int
    641   1.1      sato ite8181_ioctl(v, cmd, data, flag, p)
    642   1.1      sato 	void *v;
    643   1.1      sato 	u_long cmd;
    644   1.1      sato 	caddr_t data;
    645   1.1      sato 	int flag;
    646   1.1      sato 	struct proc *p;
    647   1.1      sato {
    648   1.1      sato 	struct ite8181_softc *sc = (struct ite8181_softc *)v;
    649   1.1      sato 	struct hpcfb_fbconf *fbconf;
    650   1.1      sato 	struct hpcfb_dspconf *dspconf;
    651   1.1      sato 	struct wsdisplay_cmap *cmap;
    652   1.8      sato 	struct wsdisplay_param *dispparam;
    653   1.1      sato 
    654   1.1      sato 	switch (cmd) {
    655   1.1      sato 	case WSDISPLAYIO_GETCMAP:
    656   1.1      sato 		cmap = (struct wsdisplay_cmap*)data;
    657   1.1      sato 
    658   1.1      sato 		if (sc->sc_fbconf.hf_class != HPCFB_CLASS_INDEXCOLOR ||
    659   1.1      sato 		    sc->sc_fbconf.hf_pack_width != 8 ||
    660   1.1      sato 		    256 <= cmap->index ||
    661   1.1      sato 		    256 < (cmap->index + cmap->count))
    662   1.1      sato 			return (EINVAL);
    663   1.1      sato 
    664   1.1      sato 		if (!uvm_useracc(cmap->red, cmap->count, B_WRITE) ||
    665   1.1      sato 		    !uvm_useracc(cmap->green, cmap->count, B_WRITE) ||
    666   1.1      sato 		    !uvm_useracc(cmap->blue, cmap->count, B_WRITE))
    667   1.1      sato 			return (EFAULT);
    668   1.1      sato 
    669   1.2      sato #ifdef ITE8181_WINCE_CMAP
    670   1.1      sato 		copyout(&bivideo_cmap_r[cmap->index], cmap->red, cmap->count);
    671   1.1      sato 		copyout(&bivideo_cmap_g[cmap->index], cmap->green,cmap->count);
    672   1.1      sato 		copyout(&bivideo_cmap_b[cmap->index], cmap->blue, cmap->count);
    673   1.1      sato 		return (0);
    674   1.2      sato #else /* ITE8181_WINCE_CMAP */
    675   1.2      sato 		return EINVAL;
    676   1.2      sato #endif /* ITE8181_WINCE_CMAP */
    677   1.1      sato 
    678   1.1      sato 	case WSDISPLAYIO_PUTCMAP:
    679   1.1      sato 		/*
    680   1.1      sato 		 * This driver can't set color map.
    681   1.1      sato 		 */
    682   1.1      sato 		return (EINVAL);
    683   1.9      sato 
    684   1.9      sato 	case WSDISPLAYIO_SVIDEO:
    685   1.9      sato 		if (*(int *)data == WSDISPLAYIO_VIDEO_OFF)
    686   1.9      sato 			sc->sc_powerstate |= PWRSTAT_VIDEOOFF;
    687   1.9      sato 		else
    688   1.9      sato 			sc->sc_powerstate &= ~PWRSTAT_VIDEOOFF;
    689   1.9      sato 		ite8181_update_powerstate(sc, PWRSTAT_ALL);
    690   1.9      sato 		return 0;
    691   1.9      sato 
    692   1.9      sato 	case WSDISPLAYIO_GVIDEO:
    693   1.9      sato 		*(int *)data = (sc->sc_powerstate&PWRSTAT_VIDEOOFF) ?
    694   1.9      sato 				WSDISPLAYIO_VIDEO_OFF:WSDISPLAYIO_VIDEO_ON;
    695   1.9      sato 		return 0;
    696   1.1      sato 
    697   1.8      sato 
    698   1.8      sato 	case WSDISPLAYIO_GETPARAM:
    699   1.8      sato 		dispparam = (struct wsdisplay_param*)data;
    700   1.8      sato 		switch (dispparam->param) {
    701   1.8      sato 		case WSDISPLAYIO_PARAM_BACKLIGHT:
    702   1.8      sato 			VPRINTF(("ite8181_ioctl: GETPARAM:BACKLIGHT call\n"));
    703   1.8      sato 			if (sc->sc_max_brightness == -1)
    704   1.8      sato 				ite8181_init_brightness(sc);
    705   1.8      sato 			ite8181_get_backlight(sc);
    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.8      sato 				    (sc->sc_powerstate & PWRSTAT_BACKLIGHT) ? 1 : 0;
    713   1.8      sato 			VPRINTF(("ite8181_ioctl: GETPARAM:BACKLIGHT:%d\n",
    714   1.8      sato 				dispparam->curval));
    715   1.8      sato 			return 0;
    716   1.8      sato 			break;
    717   1.8      sato 		case WSDISPLAYIO_PARAM_CONTRAST:
    718   1.8      sato 			VPRINTF(("ite8181_ioctl: GETPARAM:CONTRAST call\n"));
    719   1.8      sato 			if (sc->sc_max_contrast == -1)
    720   1.8      sato 				ite8181_init_contrast(sc);
    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.8      sato 				VPRINTF(("ite8181_ioctl: GETPARAM: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.8      sato 				VPRINTF(("ite8181_ioctl: GETPARAM:CONTRAST ret\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.8      sato 			VPRINTF(("ite8181_ioctl: GETPARAM:BRIGHTNESS call\n"));
    734   1.8      sato 			if (sc->sc_max_brightness == -1)
    735   1.8      sato 				ite8181_init_brightness(sc);
    736   1.8      sato 			if (sc->sc_max_brightness > 0) {
    737   1.8      sato 				dispparam->min = 0;
    738   1.8      sato 				dispparam->max = sc->sc_max_brightness;
    739   1.8      sato 				dispparam->curval = sc->sc_brightness;
    740   1.8      sato 				VPRINTF(("ite8181_ioctl: GETPARAM:BRIGHTNESS max=%d, current=%d\n", sc->sc_max_brightness, sc->sc_brightness));
    741   1.8      sato 				return 0;
    742   1.8      sato 			} else {
    743   1.8      sato 				VPRINTF(("ite8181_ioctl: GETPARAM:BRIGHTNESS ret\n"));
    744   1.8      sato 				return (EINVAL);
    745   1.8      sato 			}
    746   1.8      sato 			return (EINVAL);
    747   1.8      sato 		default:
    748   1.8      sato 			return (EINVAL);
    749   1.8      sato 		}
    750   1.8      sato 		return (0);
    751   1.8      sato 
    752   1.8      sato 	case WSDISPLAYIO_SETPARAM:
    753   1.8      sato 		dispparam = (struct wsdisplay_param*)data;
    754   1.8      sato 		switch (dispparam->param) {
    755   1.8      sato 		case WSDISPLAYIO_PARAM_BACKLIGHT:
    756   1.8      sato 			VPRINTF(("ite8181_ioctl: SETPARAM:BACKLIGHT call\n"));
    757   1.8      sato 			if (dispparam->curval < 0 ||
    758   1.8      sato 			    1 < dispparam->curval)
    759   1.8      sato 				return (EINVAL);
    760   1.8      sato 			if (sc->sc_max_brightness == -1)
    761   1.8      sato 				ite8181_init_brightness(sc);
    762   1.8      sato 			VPRINTF(("ite8181_ioctl: SETPARAM:max brightness=%d\n", sc->sc_max_brightness));
    763   1.8      sato 			if (sc->sc_max_brightness > 0) { /* dimmer */
    764   1.8      sato 				if (dispparam->curval == 0){
    765   1.8      sato 					sc->sc_brightness_save = sc->sc_brightness;
    766   1.8      sato 					ite8181_set_brightness(sc, 0);	/* min */
    767   1.8      sato 				} else {
    768   1.8      sato 					if (sc->sc_brightness_save == 0)
    769   1.8      sato 						sc->sc_brightness_save = sc->sc_max_brightness;
    770   1.8      sato 					ite8181_set_brightness(sc, sc->sc_brightness_save);
    771   1.8      sato 				}
    772   1.8      sato 				VPRINTF(("ite8181_ioctl: SETPARAM:BACKLIGHT: brightness=%d\n", sc->sc_brightness));
    773   1.8      sato 			} else { /* off */
    774   1.8      sato 				if (dispparam->curval == 0)
    775   1.8      sato 					sc->sc_powerstate &= ~PWRSTAT_BACKLIGHT;
    776   1.8      sato 				else
    777   1.8      sato 					sc->sc_powerstate |= PWRSTAT_BACKLIGHT;
    778   1.8      sato 				VPRINTF(("ite8181_ioctl: SETPARAM:BACKLIGHT: powerstate %d\n",
    779   1.8      sato 						(sc->sc_powerstate & PWRSTAT_BACKLIGHT)?1:0));
    780   1.8      sato 				ite8181_update_powerstate(sc, PWRSTAT_BACKLIGHT);
    781   1.8      sato 				VPRINTF(("ite8181_ioctl: SETPARAM:BACKLIGHT:%d\n",
    782   1.8      sato 					(sc->sc_powerstate & PWRSTAT_BACKLIGHT)?1:0));
    783   1.8      sato 			}
    784   1.8      sato 			return 0;
    785   1.8      sato 			break;
    786   1.8      sato 		case WSDISPLAYIO_PARAM_CONTRAST:
    787   1.8      sato 			VPRINTF(("ite8181_ioctl: SETPARAM:CONTRAST call\n"));
    788   1.8      sato 			if (sc->sc_max_contrast == -1)
    789   1.8      sato 				ite8181_init_contrast(sc);
    790   1.8      sato 			if (dispparam->curval < 0 ||
    791   1.8      sato 			    sc->sc_max_contrast < dispparam->curval)
    792   1.8      sato 				return (EINVAL);
    793   1.8      sato 			if (sc->sc_max_contrast > 0) {
    794   1.8      sato 				int org = sc->sc_contrast;
    795   1.8      sato 				ite8181_set_contrast(sc, dispparam->curval);
    796   1.8      sato 				VPRINTF(("ite8181_ioctl: SETPARAM:CONTRAST org=%d, current=%d\n", org, sc->sc_contrast));
    797   1.8      sato 				return 0;
    798   1.8      sato 			} else {
    799   1.8      sato 				VPRINTF(("ite8181_ioctl: SETPARAM:CONTRAST ret\n"));
    800   1.8      sato 				return (EINVAL);
    801   1.8      sato 			}
    802   1.8      sato 			break;
    803   1.8      sato 		case WSDISPLAYIO_PARAM_BRIGHTNESS:
    804   1.8      sato 			VPRINTF(("ite8181_ioctl: SETPARAM:BRIGHTNESS call\n"));
    805   1.8      sato 			if (sc->sc_max_brightness == -1)
    806   1.8      sato 				ite8181_init_brightness(sc);
    807   1.8      sato 			if (dispparam->curval < 0 ||
    808   1.8      sato 			    sc->sc_max_brightness < dispparam->curval)
    809   1.8      sato 				return (EINVAL);
    810   1.8      sato 			if (sc->sc_max_brightness > 0) {
    811   1.8      sato 				int org = sc->sc_brightness;
    812   1.8      sato 				ite8181_set_brightness(sc, dispparam->curval);
    813   1.8      sato 				VPRINTF(("ite8181_ioctl: SETPARAM:BRIGHTNESS org=%d, current=%d\n", org, sc->sc_brightness));
    814   1.8      sato 				return 0;
    815   1.8      sato 			} else {
    816   1.8      sato 				VPRINTF(("ite8181_ioctl: SETPARAM:BRIGHTNESS ret\n"));
    817   1.8      sato 				return (EINVAL);
    818   1.8      sato 			}
    819   1.8      sato 			break;
    820   1.8      sato 		default:
    821   1.8      sato 			return (EINVAL);
    822   1.8      sato 		}
    823   1.8      sato 		return (0);
    824   1.8      sato 
    825   1.1      sato 	case HPCFBIO_GCONF:
    826   1.1      sato 		fbconf = (struct hpcfb_fbconf *)data;
    827   1.1      sato 		if (fbconf->hf_conf_index != 0 &&
    828   1.1      sato 		    fbconf->hf_conf_index != HPCFB_CURRENT_CONFIG) {
    829   1.1      sato 			return (EINVAL);
    830   1.1      sato 		}
    831   1.1      sato 		*fbconf = sc->sc_fbconf;	/* structure assignment */
    832   1.1      sato 		return (0);
    833   1.1      sato 	case HPCFBIO_SCONF:
    834   1.1      sato 		fbconf = (struct hpcfb_fbconf *)data;
    835   1.1      sato 		if (fbconf->hf_conf_index != 0 &&
    836   1.1      sato 		    fbconf->hf_conf_index != HPCFB_CURRENT_CONFIG) {
    837   1.1      sato 			return (EINVAL);
    838   1.1      sato 		}
    839   1.1      sato 		/*
    840   1.1      sato 		 * nothing to do because we have only one configration
    841   1.1      sato 		 */
    842   1.1      sato 		return (0);
    843   1.1      sato 	case HPCFBIO_GDSPCONF:
    844   1.1      sato 		dspconf = (struct hpcfb_dspconf *)data;
    845   1.1      sato 		if ((dspconf->hd_unit_index != 0 &&
    846   1.1      sato 		     dspconf->hd_unit_index != HPCFB_CURRENT_UNIT) ||
    847   1.1      sato 		    (dspconf->hd_conf_index != 0 &&
    848   1.1      sato 		     dspconf->hd_conf_index != HPCFB_CURRENT_CONFIG)) {
    849   1.1      sato 			return (EINVAL);
    850   1.1      sato 		}
    851   1.1      sato 		*dspconf = sc->sc_dspconf;	/* structure assignment */
    852   1.1      sato 		return (0);
    853   1.1      sato 	case HPCFBIO_SDSPCONF:
    854   1.1      sato 		dspconf = (struct hpcfb_dspconf *)data;
    855   1.1      sato 		if ((dspconf->hd_unit_index != 0 &&
    856   1.1      sato 		     dspconf->hd_unit_index != HPCFB_CURRENT_UNIT) ||
    857   1.1      sato 		    (dspconf->hd_conf_index != 0 &&
    858   1.1      sato 		     dspconf->hd_conf_index != HPCFB_CURRENT_CONFIG)) {
    859   1.1      sato 			return (EINVAL);
    860   1.1      sato 		}
    861   1.1      sato 		/*
    862   1.1      sato 		 * nothing to do
    863   1.1      sato 		 * because we have only one unit and one configration
    864   1.1      sato 		 */
    865   1.1      sato 		return (0);
    866   1.1      sato 	case HPCFBIO_GOP:
    867   1.1      sato 	case HPCFBIO_SOP:
    868   1.1      sato 		/*
    869   1.1      sato 		 * curently not implemented...
    870   1.1      sato 		 */
    871   1.1      sato 		return (EINVAL);
    872   1.1      sato 	}
    873   1.1      sato 
    874   1.1      sato 	return (ENOTTY);
    875   1.1      sato }
    876   1.1      sato 
    877   1.1      sato paddr_t
    878   1.1      sato ite8181_mmap(ctx, offset, prot)
    879   1.1      sato 	void *ctx;
    880   1.1      sato 	off_t offset;
    881   1.1      sato 	int prot;
    882   1.1      sato {
    883   1.1      sato 	struct ite8181_softc *sc = (struct ite8181_softc *)ctx;
    884   1.1      sato 
    885   1.1      sato 	if (offset < 0 ||
    886   1.1      sato 	    (sc->sc_fbconf.hf_bytes_per_plane +
    887   1.1      sato 		sc->sc_fbconf.hf_offset) <  offset)
    888   1.1      sato 		return -1;
    889   1.1      sato 
    890   1.4  takemura 	return mips_btop((u_long)bootinfo->fb_addr + offset);
    891   1.8      sato }
    892   1.8      sato 
    893   1.8      sato void
    894   1.8      sato ite8181_get_backlight(sc)
    895   1.8      sato 	struct ite8181_softc *sc;
    896   1.8      sato {
    897   1.8      sato 	int val = -1;
    898   1.8      sato 
    899  1.10      sato 	if (config_hook_call(CONFIG_HOOK_GET,
    900  1.10      sato 	     CONFIG_HOOK_POWER_LCDLIGHT, &val) != -1) {
    901  1.10      sato 		if (val == 0)
    902  1.10      sato 			sc->sc_powerstate &= ~PWRSTAT_BACKLIGHT;
    903  1.10      sato 		else
    904  1.10      sato 			sc->sc_powerstate |= PWRSTAT_BACKLIGHT;
    905  1.10      sato 	} else /* assume backlight is on */
    906  1.10      sato 		sc->sc_powerstate |= PWRSTAT_BACKLIGHT;
    907   1.8      sato }
    908   1.8      sato 
    909   1.8      sato void
    910   1.8      sato ite8181_init_brightness(sc)
    911   1.8      sato 	struct ite8181_softc *sc;
    912   1.8      sato {
    913   1.8      sato 	int val = -1;
    914   1.8      sato 
    915   1.8      sato 	if (config_hook_call(CONFIG_HOOK_GET,
    916   1.8      sato 	     CONFIG_HOOK_BRIGHTNESS, &val) != -1) {
    917   1.8      sato 		sc->sc_brightness = val;
    918   1.8      sato 	}
    919   1.8      sato 	val = -1;
    920   1.8      sato 	if (config_hook_call(CONFIG_HOOK_GET,
    921   1.8      sato 	     CONFIG_HOOK_BRIGHTNESS_MAX, &val) != -1) {
    922   1.8      sato 		sc->sc_brightness_save = sc->sc_max_brightness = val;
    923   1.8      sato 	}
    924   1.8      sato 	return;
    925   1.8      sato }
    926   1.8      sato 
    927   1.8      sato 
    928   1.8      sato void
    929   1.8      sato ite8181_init_contrast(sc)
    930   1.8      sato 	struct ite8181_softc *sc;
    931   1.8      sato {
    932   1.8      sato 	int val = -1;
    933   1.8      sato 
    934   1.8      sato 	if (config_hook_call(CONFIG_HOOK_GET,
    935   1.8      sato 	     CONFIG_HOOK_CONTRAST, &val) != -1) {
    936   1.8      sato 		sc->sc_contrast = val;
    937   1.8      sato 	}
    938   1.8      sato 	val = -1;
    939   1.8      sato 	if (config_hook_call(CONFIG_HOOK_GET,
    940   1.8      sato 	     CONFIG_HOOK_CONTRAST_MAX, &val) != -1) {
    941   1.8      sato 		sc->sc_max_contrast = val;
    942   1.8      sato 	}
    943   1.8      sato 	return;
    944   1.8      sato }
    945   1.8      sato 
    946   1.8      sato void
    947   1.8      sato ite8181_set_brightness(sc, val)
    948   1.8      sato 	struct ite8181_softc *sc;
    949   1.8      sato 	int val;
    950   1.8      sato {
    951   1.8      sato 	sc->sc_brightness = val;
    952   1.8      sato 
    953   1.8      sato 	config_hook_call(CONFIG_HOOK_SET, CONFIG_HOOK_BRIGHTNESS, &val);
    954   1.8      sato 	if (config_hook_call(CONFIG_HOOK_GET,
    955   1.8      sato 	     CONFIG_HOOK_BRIGHTNESS, &val) != -1) {
    956   1.8      sato 		sc->sc_brightness = val;
    957   1.8      sato 	}
    958   1.8      sato }
    959   1.8      sato 
    960   1.8      sato void
    961   1.8      sato ite8181_set_contrast(sc, val)
    962   1.8      sato 	struct ite8181_softc *sc;
    963   1.8      sato 	int val;
    964   1.8      sato {
    965   1.8      sato 	sc->sc_contrast = val;
    966   1.8      sato 
    967   1.8      sato 	config_hook_call(CONFIG_HOOK_SET, CONFIG_HOOK_CONTRAST, &val);
    968   1.8      sato 	if (config_hook_call(CONFIG_HOOK_GET,
    969   1.8      sato 	     CONFIG_HOOK_CONTRAST, &val) != -1) {
    970   1.8      sato 		sc->sc_contrast = val;
    971   1.8      sato 	}
    972   1.1      sato }
    973