Module Name:    src
Committed By:   macallan
Date:           Fri Feb  1 02:53:48 UTC 2013

Modified Files:
        src/sys/arch/arm/omap: omapfb.c

Log Message:
support WSDISPLAYIO_SVIDEO and _GVIDEO, now screen blanking in X works


To generate a diff of this commit:
cvs rdiff -u -r1.17 -r1.18 src/sys/arch/arm/omap/omapfb.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/arm/omap/omapfb.c
diff -u src/sys/arch/arm/omap/omapfb.c:1.17 src/sys/arch/arm/omap/omapfb.c:1.18
--- src/sys/arch/arm/omap/omapfb.c:1.17	Thu Jan 31 21:10:37 2013
+++ src/sys/arch/arm/omap/omapfb.c	Fri Feb  1 02:53:47 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: omapfb.c,v 1.17 2013/01/31 21:10:37 macallan Exp $	*/
+/*	$NetBSD: omapfb.c,v 1.18 2013/02/01 02:53:47 macallan Exp $	*/
 
 /*
  * Copyright (c) 2010 Michael Lorenz
@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: omapfb.c,v 1.17 2013/01/31 21:10:37 macallan Exp $");
+__KERNEL_RCSID(0, "$NetBSD: omapfb.c,v 1.18 2013/02/01 02:53:47 macallan Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -77,6 +77,8 @@ struct omapfb_softc {
 	void *sc_fbaddr, *sc_vramaddr;
 	bus_addr_t sc_fbhwaddr;
 	uint32_t *sc_clut;
+	uint32_t sc_dispc_config;
+	int sc_video_is_on;
 	struct vcons_screen sc_console_screen;
 	struct wsscreen_descr sc_defaultscreen_descr;
 	const struct wsscreen_descr *sc_screens[1];
@@ -108,6 +110,7 @@ static void 	omapfb_putpalreg(struct oma
 			    uint8_t, uint8_t);
 
 static int	omapfb_set_depth(struct omapfb_softc *, int);
+static void	omapfb_set_video(struct omapfb_softc *, int);
 
 #if NOMAPDMA > 0
 static void	omapfb_init(struct omapfb_softc *);
@@ -186,6 +189,8 @@ omapfb_attach(device_t parent, device_t 
 		return;
 	}
 
+	sc->sc_video_is_on = 1;
+
 	/*
 	 * XXX
 	 * different u-boot versions initialize the graphics controller in
@@ -301,6 +306,7 @@ omapfb_attach(device_t parent, device_t 
 	reg = bus_space_read_4(sc->sc_iot, sc->sc_regh, OMAPFB_DISPC_CONFIG);
 	reg = OMAP_DISPC_CTRL_ACTIVE_MTRX;
 	bus_space_write_4(sc->sc_iot, sc->sc_regh, OMAPFB_DISPC_CONFIG, reg);
+	sc->sc_dispc_config = reg;
 
 	sc->sc_fbhwaddr = sc->sc_dmamem->ds_addr + 0x1000;
 	bus_space_write_4(sc->sc_iot, sc->sc_regh, OMAPFB_DISPC_GFX_BASE_0, 
@@ -498,6 +504,7 @@ omapfb_ioctl(void *v, void *vs, u_long c
 				}
 			}
 			return 0;
+
 		case WSDISPLAYIO_GET_FBINFO:
 			{
 				struct wsdisplayio_fbinfo *fbi = data;
@@ -522,6 +529,20 @@ omapfb_ioctl(void *v, void *vs, u_long c
 
 			}
 			return 0;
+
+		case WSDISPLAYIO_GVIDEO:
+			{
+				int *on = data;
+				*on = sc->sc_video_is_on;
+			}
+			return 0;
+
+		case WSDISPLAYIO_SVIDEO:
+			{
+				int *on = data;
+				omapfb_set_video(sc, *on);
+			}
+			return 0;
 	}
 	return EPASSTHROUGH;
 }
@@ -713,6 +734,38 @@ omapfb_set_depth(struct omapfb_softc *sc
 	return 0;
 }
 
+static void
+omapfb_set_video(struct omapfb_softc *sc, int on)
+{
+	uint32_t reg;
+
+	if (on == sc->sc_video_is_on)
+		return;
+	if (on) {
+		bus_space_write_4(sc->sc_iot, sc->sc_regh,
+		    OMAPFB_DISPC_CONFIG, sc->sc_dispc_config);
+		on = 1;
+	} else {
+		bus_space_write_4(sc->sc_iot, sc->sc_regh,
+		    OMAPFB_DISPC_CONFIG, sc->sc_dispc_config |
+		    OMAP_DISPC_CFG_VSYNC_GATED | OMAP_DISPC_CFG_HSYNC_GATED |
+		    OMAP_DISPC_CFG_PIXELCLK_GATED |
+		    OMAP_DISPC_CFG_PIXELDATA_GATED);
+	}
+
+	/*
+	 * now tell the video controller that we're done mucking around and 
+	 * actually update its settings
+	 */
+	reg = bus_space_read_4(sc->sc_iot, sc->sc_regh, OMAPFB_DISPC_CONTROL);
+	bus_space_write_4(sc->sc_iot, sc->sc_regh, OMAPFB_DISPC_CONTROL,
+	    reg | OMAP_DISPC_CTRL_GO_LCD | OMAP_DISPC_CTRL_GO_DIGITAL);
+
+	aprint_debug_dev(sc->sc_dev, "%s %08x\n", __func__,
+	    bus_space_read_4(sc->sc_iot, sc->sc_regh, OMAPFB_DISPC_CONFIG));
+	sc->sc_video_is_on = on;
+}
+
 #if NOMAPDMA > 0
 static void
 omapfb_init(struct omapfb_softc *sc)

Reply via email to