xref: /netbsd-src/sys/arch/hpcmips/dev/mq200priv.h (revision 95e1ffb15694e54f29f8baaa4232152b703c2a5a)
1*95e1ffb1Schristos /*	$NetBSD: mq200priv.h,v 1.4 2005/12/11 12:17:33 christos Exp $	*/
244e4c533Stakemura 
344e4c533Stakemura /*-
444e4c533Stakemura  * Copyright (c) 2001 TAKEMURA Shin
544e4c533Stakemura  * All rights reserved.
644e4c533Stakemura  *
744e4c533Stakemura  * Redistribution and use in source and binary forms, with or without
844e4c533Stakemura  * modification, are permitted provided that the following conditions
944e4c533Stakemura  * are met:
1044e4c533Stakemura  * 1. Redistributions of source code must retain the above copyright
1144e4c533Stakemura  *    notice, this list of conditions and the following disclaimer.
1244e4c533Stakemura  * 2. Redistributions in binary form must reproduce the above copyright
1344e4c533Stakemura  *    notice, this list of conditions and the following disclaimer in the
1444e4c533Stakemura  *    documentation and/or other materials provided with the distribution.
1544e4c533Stakemura  * 3. The name of the author may not be used to endorse or promote products
1644e4c533Stakemura  *    derived from this software without specific prior written permission.
1744e4c533Stakemura  *
1844e4c533Stakemura  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
1944e4c533Stakemura  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2044e4c533Stakemura  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2144e4c533Stakemura  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
2244e4c533Stakemura  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2344e4c533Stakemura  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2444e4c533Stakemura  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2544e4c533Stakemura  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2644e4c533Stakemura  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2744e4c533Stakemura  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2844e4c533Stakemura  * SUCH DAMAGE.
2944e4c533Stakemura  *
3044e4c533Stakemura  */
3144e4c533Stakemura 
3244e4c533Stakemura struct mq200_crt_param {
3344e4c533Stakemura 	u_int16_t width, height, clock;
3444e4c533Stakemura 	u_int16_t hdtotal;
3544e4c533Stakemura 	u_int16_t vdtotal;
3644e4c533Stakemura 	u_int16_t hsstart, hsend;
3744e4c533Stakemura 	u_int16_t vsstart, vsend;
3844e4c533Stakemura 	u_int32_t opt;
3944e4c533Stakemura };
4044e4c533Stakemura #define MQ200_CRT_640x480_60Hz	0
4144e4c533Stakemura #define MQ200_CRT_800x600_60Hz	1
4244e4c533Stakemura #define MQ200_CRT_1024x768_60Hz	2
4344e4c533Stakemura 
4444e4c533Stakemura struct mq200_clock_setting {
4544e4c533Stakemura 	u_int8_t	mem, ge, gc[2];
4644e4c533Stakemura 	int		pll1, pll2, pll3;
4744e4c533Stakemura };
4844e4c533Stakemura 
4944e4c533Stakemura struct mq200_md_param {
5044e4c533Stakemura 	platid_t	*md_platform;
5144e4c533Stakemura 	short		md_fp_width, md_fp_height;
5244e4c533Stakemura 	int		md_baseclock;
5344e4c533Stakemura 	int		md_flags;
5444e4c533Stakemura #define MQ200_MD_HAVECRT	(1<<0)
5544e4c533Stakemura #define MQ200_MD_HAVEFP		(1<<1)
5644e4c533Stakemura 	u_int32_t	*md_init_ops;
5744e4c533Stakemura 	const struct mq200_clock_setting *md_clock_settings;
5844e4c533Stakemura 	u_int32_t	md_init_dcmisc;
5944e4c533Stakemura 	u_int32_t	md_init_pmc;
6044e4c533Stakemura 	u_int32_t	md_init_mm01;
6144e4c533Stakemura };
6244e4c533Stakemura 
6344e4c533Stakemura extern struct mq200_crt_param mq200_crt_params[];
6444e4c533Stakemura extern int mq200_crt_nparams;
65957e5645She extern const char *mq200_clknames[];
6644e4c533Stakemura 
67a09206fdStakemura int mq200_pllparam(int reqout, u_int32_t *res);
6844e4c533Stakemura void mq200_set_pll(struct mq200_softc *, int, int);
6944e4c533Stakemura void mq200_setup_regctx(struct mq200_softc *sc);
7044e4c533Stakemura void mq200_setup(struct mq200_softc *sc);
7144e4c533Stakemura void mq200_win_enable(struct mq200_softc *sc, int gc,
7244e4c533Stakemura 			   u_int32_t depth, u_int32_t start,
7344e4c533Stakemura 			   int width, int height, int stride);
7444e4c533Stakemura void mq200_win_disable(struct mq200_softc *sc, int gc);
7544e4c533Stakemura void mq200_setupmd(struct mq200_softc *sc);
7644e4c533Stakemura void mq200_mdsetup(struct mq200_softc *sc);
7744e4c533Stakemura 
7844e4c533Stakemura void mq200_dump_gc(struct mq200_softc *sc, int gc);
7944e4c533Stakemura void mq200_dump_fp(struct mq200_softc *sc);
8044e4c533Stakemura void mq200_dump_dc(struct mq200_softc *sc);
8144e4c533Stakemura void mq200_dump_pll(struct mq200_softc *sc);
8244e4c533Stakemura void mq200_dump_all(struct mq200_softc *sc);
8344e4c533Stakemura char* mq200_regname(struct mq200_softc *sc, int offset, char *buf, int size);
8444e4c533Stakemura 
8544e4c533Stakemura #ifdef MQ200_DEBUG
8644e4c533Stakemura #ifndef MQ200DEBUG_CONF
8744e4c533Stakemura #define MQ200DEBUG_CONF 0
8844e4c533Stakemura #endif
8944e4c533Stakemura extern int mq200_debug;
9044e4c533Stakemura #define DPRINTF(fmt, args...)	do { if (mq200_debug) printf("mq200: " fmt, ##args); } while(0)
9144e4c533Stakemura #define	VPRINTF(fmt, args...)	do { if (bootverbose || mq200_debug) printf("mq200: " fmt, ##args); } while(0)
9244e4c533Stakemura #else
9344e4c533Stakemura #define	DPRINTF(fmt, args...)	do { } while (0)
9444e4c533Stakemura #define	VPRINTF(fmt, args...)	do { if (bootverbose) printf("mq200: " fmt, ##args); } while(0)
9544e4c533Stakemura #endif
9644e4c533Stakemura 
9744e4c533Stakemura /*
9844e4c533Stakemura  * register access wrappers
9944e4c533Stakemura  */
10044e4c533Stakemura static inline void
mq200_writex(struct mq200_softc * sc,int offset,u_int32_t data)10144e4c533Stakemura mq200_writex(struct mq200_softc *sc, int offset, u_int32_t data)
10244e4c533Stakemura {
10344e4c533Stakemura #ifdef _KERNEL
10444e4c533Stakemura 	bus_space_write_4(sc->sc_iot, sc->sc_ioh, offset, data);
10544e4c533Stakemura #else
10644e4c533Stakemura 	*(volatile unsigned long*)(sc->sc_baseaddr + offset) = data;
10744e4c533Stakemura #endif
10844e4c533Stakemura }
10944e4c533Stakemura 
11044e4c533Stakemura #ifdef MQ200_DEBUG
11144e4c533Stakemura void
11244e4c533Stakemura mq200_write(struct mq200_softc *sc, int offset, u_int32_t data);
11344e4c533Stakemura #else
11444e4c533Stakemura static inline void
mq200_write(struct mq200_softc * sc,int offset,u_int32_t data)11544e4c533Stakemura mq200_write(struct mq200_softc *sc, int offset, u_int32_t data)
11644e4c533Stakemura {
11744e4c533Stakemura 	mq200_writex(sc, offset, data);
11844e4c533Stakemura }
11944e4c533Stakemura #endif /* MQ200_DEBUG */
12044e4c533Stakemura 
12144e4c533Stakemura static inline void
mq200_write2(struct mq200_softc * sc,struct mq200_regctx * reg,u_int32_t data)12244e4c533Stakemura mq200_write2(struct mq200_softc *sc, struct mq200_regctx *reg, u_int32_t data)
12344e4c533Stakemura {
12444e4c533Stakemura 	reg->val = data;
12544e4c533Stakemura 	mq200_writex(sc, reg->offset, reg->val);
12644e4c533Stakemura }
12744e4c533Stakemura 
12844e4c533Stakemura static inline u_int32_t
mq200_read(struct mq200_softc * sc,int offset)12944e4c533Stakemura mq200_read(struct mq200_softc *sc, int offset)
13044e4c533Stakemura {
13144e4c533Stakemura #ifdef _KERNEL
13244e4c533Stakemura 	return bus_space_read_4(sc->sc_iot, sc->sc_ioh, offset);
13344e4c533Stakemura #else
13444e4c533Stakemura 	return *(volatile unsigned long*)(sc->sc_baseaddr + offset);
13544e4c533Stakemura #endif
13644e4c533Stakemura }
13744e4c533Stakemura 
13844e4c533Stakemura static inline void
mq200_mod(struct mq200_softc * sc,struct mq200_regctx * reg,u_int32_t mask,u_int32_t data)13944e4c533Stakemura mq200_mod(struct mq200_softc *sc, struct mq200_regctx *reg, u_int32_t mask, u_int32_t data)
14044e4c533Stakemura {
14144e4c533Stakemura 	reg->val &= ~mask;
14244e4c533Stakemura 	reg->val |= data;
14344e4c533Stakemura 	mq200_writex(sc, reg->offset, reg->val);
14444e4c533Stakemura }
14544e4c533Stakemura 
14644e4c533Stakemura static inline void
mq200_on(struct mq200_softc * sc,struct mq200_regctx * reg,unsigned long data)14744e4c533Stakemura mq200_on(struct mq200_softc *sc, struct mq200_regctx *reg, unsigned long data)
14844e4c533Stakemura {
14944e4c533Stakemura 	mq200_mod(sc, reg, data, data);
15044e4c533Stakemura }
15144e4c533Stakemura 
15244e4c533Stakemura static inline void
mq200_off(struct mq200_softc * sc,struct mq200_regctx * reg,unsigned long data)15344e4c533Stakemura mq200_off(struct mq200_softc *sc, struct mq200_regctx *reg, unsigned long data)
15444e4c533Stakemura {
15544e4c533Stakemura 	mq200_mod(sc, reg, data, 0);
15644e4c533Stakemura }
157