Module Name:    src
Committed By:   macallan
Date:           Thu Sep  9 01:22:11 UTC 2010

Modified Files:
        src/sys/dev/pci: r128fb.c r128fbreg.h

Log Message:
add backlight control via PMF
TODO: support wsconsctl


To generate a diff of this commit:
cvs rdiff -u -r1.10 -r1.11 src/sys/dev/pci/r128fb.c
cvs rdiff -u -r1.1 -r1.2 src/sys/dev/pci/r128fbreg.h

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

Modified files:

Index: src/sys/dev/pci/r128fb.c
diff -u src/sys/dev/pci/r128fb.c:1.10 src/sys/dev/pci/r128fb.c:1.11
--- src/sys/dev/pci/r128fb.c:1.10	Thu Oct  1 19:02:27 2009
+++ src/sys/dev/pci/r128fb.c	Thu Sep  9 01:22:11 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: r128fb.c,v 1.10 2009/10/01 19:02:27 jmmv Exp $	*/
+/*	$NetBSD: r128fb.c,v 1.11 2010/09/09 01:22:11 macallan Exp $	*/
 
 /*
  * Copyright (c) 2007 Michael Lorenz
@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: r128fb.c,v 1.10 2009/10/01 19:02:27 jmmv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: r128fb.c,v 1.11 2010/09/09 01:22:11 macallan Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -59,6 +59,14 @@
 
 #include <dev/i2c/i2cvar.h>
 
+#include "opt_r128fb.h"
+
+#ifdef R128FB_DEBUG
+#define DPRINTF printf
+#else
+#define DPRINTF while(0) printf
+#endif
+
 struct r128fb_softc {
 	device_t sc_dev;
 
@@ -74,7 +82,7 @@
 	bus_size_t sc_fbsize, sc_regsize;
 
 	int sc_width, sc_height, sc_depth, sc_stride;
-	int sc_locked;
+	int sc_locked, sc_have_backlight, sc_bl_level;
 	void *sc_fbaddr;
 	struct vcons_screen sc_console_screen;
 	struct wsscreen_descr sc_defaultscreen_descr;
@@ -124,6 +132,10 @@
 static void	r128fb_copyrows(void *, int, int, int);
 static void	r128fb_eraserows(void *, int, int, long);
 
+static void	r128fb_brightness_up(device_t);
+static void	r128fb_brightness_down(device_t);
+static void	r128fb_set_backlight(struct r128fb_softc *, int);
+
 struct wsdisplay_accessops r128fb_accessops = {
 	r128fb_ioctl,
 	r128fb_mmap,
@@ -191,6 +203,7 @@
 	unsigned long		defattr;
 	bool			is_console;
 	int i, j;
+	uint32_t reg;
 
 	sc->sc_pc = pa->pa_pc;
 	sc->sc_pcitag = pa->pa_tag;
@@ -305,7 +318,21 @@
 	aa.accesscookie = &sc->vd;
 
 	config_found(sc->sc_dev, &aa, wsemuldisplaydevprint);
-	
+
+	/* no suspend/resume support yet */
+	pmf_device_register(sc->sc_dev, NULL, NULL);
+	reg = bus_space_read_4(sc->sc_memt, sc->sc_regh, R128_LVDS_GEN_CNTL);
+	DPRINTF("reg: %08x\n", reg);
+	if (reg & R128_LVDS_ON) {
+		sc->sc_have_backlight = 1;
+		sc->sc_bl_level = 255 -
+		    ((reg & R128_LEVEL_MASK) >> R128_LEVEL_SHIFT);
+		pmf_event_register(sc->sc_dev, PMFE_DISPLAY_BRIGHTNESS_UP,
+		    r128fb_brightness_up, TRUE);
+		pmf_event_register(sc->sc_dev, PMFE_DISPLAY_BRIGHTNESS_DOWN,
+		    r128fb_brightness_down, TRUE);
+	} else
+		sc->sc_have_backlight = 0;	
 }
 
 static int
@@ -787,3 +814,37 @@
 	}
 }
 
+static void
+r128fb_set_backlight(struct r128fb_softc *sc, int level)
+{
+	uint32_t reg;
+
+	if (level > 255) level = 255;
+	if (level < 0) level = 0;
+	if (level == sc->sc_bl_level)
+		return;
+	sc->sc_bl_level = level;
+	level = 255 - level;
+	reg = bus_space_read_4(sc->sc_memt, sc->sc_regh, R128_LVDS_GEN_CNTL);
+	reg &= ~R128_LEVEL_MASK;
+	reg |= level << R128_LEVEL_SHIFT;
+	bus_space_write_4(sc->sc_memt, sc->sc_regh, R128_LVDS_GEN_CNTL, reg);
+	DPRINTF("level: %d reg %08x\n", level, reg);
+}
+	
+
+static void
+r128fb_brightness_up(device_t dev)
+{
+	struct r128fb_softc *sc = device_private(dev);
+
+	r128fb_set_backlight(sc, sc->sc_bl_level + 8);
+}
+
+static void
+r128fb_brightness_down(device_t dev)
+{
+	struct r128fb_softc *sc = device_private(dev);
+
+	r128fb_set_backlight(sc, sc->sc_bl_level - 8);
+}

Index: src/sys/dev/pci/r128fbreg.h
diff -u src/sys/dev/pci/r128fbreg.h:1.1 src/sys/dev/pci/r128fbreg.h:1.2
--- src/sys/dev/pci/r128fbreg.h:1.1	Wed Nov  7 19:09:09 2007
+++ src/sys/dev/pci/r128fbreg.h	Thu Sep  9 01:22:10 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: r128fbreg.h,v 1.1 2007/11/07 19:09:09 macallan Exp $	*/
+/*	$NetBSD: r128fbreg.h,v 1.2 2010/09/09 01:22:10 macallan Exp $	*/
 
 /*
  * Copyright 1999, 2000 ATI Technologies Inc., Markham, Ontario,
@@ -55,9 +55,35 @@
 #ifndef R128FB_REG_H
 #define R128FB_REG_H
 
-#define R128_PALETTE_DATA                 0x00b4
-#define R128_PALETTE_INDEX                0x00b0
+/* RAMDAC */
+#define R128_PALETTE_DATA		0x00b4
+#define R128_PALETTE_INDEX		0x00b0
+
+/* flat panel registers */
+#define R128_FP_PANEL_CNTL		0x0288
+	#define FPCNT_DIGON		  0x00000001	/* FP dig. voltage */
+	#define FPCNT_BACKLIGHT_ON	  0x00000002
+	#define FPCNT_BL_MODULATION_ON	  0x00000004
+	#define FPCNT_BL_CLK_SEL	  0x00000008	/* 1 - divide by 3 */
+	#define FPCNT_MONID_EN		  0x00000010	/* use MONID pins for
+							   backlight control */
+	#define FPCNT_FPENABLE_POL	  0x00000020	/* 1 - active low */
+	#define FPCNT_LEVEL_MASK	  0x0000ff00
+	#define FPCNT_LEVEL_SHIFT	  8
+
+#define R128_LVDS_GEN_CNTL                0x02d0
+#       define R128_LVDS_ON               (1   <<  0)
+#       define R128_LVDS_DISPLAY_DIS      (1   <<  1)
+#       define R128_LVDS_EN               (1   <<  7)
+#       define R128_LVDS_DIGON            (1   << 18)
+#       define R128_LVDS_BLON             (1   << 19)
+#       define R128_LVDS_SEL_CRTC2        (1   << 23)
+#       define R128_HSYNC_DELAY_SHIFT     28
+#       define R128_HSYNC_DELAY_MASK      (0xf << 28)
+#	define R128_LEVEL_MASK	          0x0000ff00
+#	define R128_LEVEL_SHIFT	          8
 
+/* drawing engine */
 #define R128_PC_NGUI_CTLSTAT              0x0184
 #       define R128_PC_FLUSH_GUI          (3 << 0)
 #       define R128_PC_RI_GUI             (1 << 2)

Reply via email to