svn commit: r366369 - in head: share/man/man9 sys/conf sys/dev/backlight sys/modules sys/modules/backlight sys/sys

Emmanuel Vadot manu at FreeBSD.org
Fri Oct 2 18:18:03 UTC 2020


Author: manu
Date: Fri Oct  2 18:18:01 2020
New Revision: 366369
URL: https://svnweb.freebsd.org/changeset/base/366369

Log:
  Add backlight subsystem
  
  This is a simple subsystem that allow drivers to register as a backlight.
  Each backlight creates a device node under /dev/backlight/backlightX and
  an alias based on the name provided.
  
  Relnotes:	yes
  Sponsored by:	The FreeBSD Foundation
  Differential Revision:	https://reviews.freebsd.org/D26250

Added:
  head/share/man/man9/backlight.9   (contents, props changed)
  head/sys/dev/backlight/
  head/sys/dev/backlight/backlight.c   (contents, props changed)
  head/sys/dev/backlight/backlight.h   (contents, props changed)
  head/sys/dev/backlight/backlight_if.m   (contents, props changed)
  head/sys/modules/backlight/
  head/sys/modules/backlight/Makefile   (contents, props changed)
  head/sys/sys/backlight.h   (contents, props changed)
Modified:
  head/share/man/man9/Makefile
  head/sys/conf/files
  head/sys/modules/Makefile

Modified: head/share/man/man9/Makefile
==============================================================================
--- head/share/man/man9/Makefile	Fri Oct  2 17:50:22 2020	(r366368)
+++ head/share/man/man9/Makefile	Fri Oct  2 18:18:01 2020	(r366369)
@@ -10,6 +10,7 @@ MAN=	accept_filter.9 \
 	alq.9 \
 	altq.9 \
 	atomic.9 \
+	backlight.9 \
 	bhnd.9 \
 	bhnd_erom.9 \
 	bios.9 \

Added: head/share/man/man9/backlight.9
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/share/man/man9/backlight.9	Fri Oct  2 18:18:01 2020	(r366369)
@@ -0,0 +1,77 @@
+.\" Copyright (c) 2020 Emmanuel Vadot <manu at freebsd.org>
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY EXPRESS OR
+.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+.\" IN NO EVENT SHALL THE DEVELOPERS BE LIABLE FOR ANY DIRECT, INDIRECT,
+.\" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+.\" NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+.\" DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+.\" THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+.\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+.\"
+.\" $FreeBSD$
+.\"
+.Dd October 02, 2020
+.Dt BACKLIGHT 9
+.Os
+.Sh NAME
+.Nm backlight ,
+.Nm backlight_register ,
+.Nm backlight_destroy ,
+.Nm BACKLIGHT_GET_STATUS ,
+.Nm BACKLIGHT_SET_STATUS ,
+.Nd BACKLIGHT methods
+.Sh SYNOPSIS
+.Cd "device backlight"
+.In "backlight_if.h"
+.In "sys/sys/backlight.h"
+.Ft int
+.Fn BACKLIGHT_GET_STATUS "device_t bus" "struct backlight_props *props"
+.Ft int
+.Fn BACKLIGHT_SET_STATUS "device_t bus" "struct backlight_props *props"
+.Ft struct cdev *
+.Fn backlight_register "const char *name" "device_t dev"
+.Ft int
+.Fn backlight_destroy "struct cdev *cdev"
+.Sh DESCRIPTION
+The backlight driver provides a generic way for handling a panel backlight.
+.Pp
+Drivers for backlight system register themselves globally using the
+.Fn backlight_register
+function.
+They must define two methods,
+.Fn BACKLIGHT_GET_STATUS
+which is used to query the current brightness level and
+.Fn BACKLIGHT_SET_STATUS
+which is used to update it.
+.Sh INTERFACE
+.Bl -tag -width indent
+.It Fn BACKLIGHT_GET_STATUS "device_t bus" "struct backlight_props *props"
+Driver fills the current brightless level and the optional supported levels.
+.It Fn BACKLIGHT_SET_STATUS "device_t bus" "struct backlight_props *props"
+Driver update the backlight level based on the brightness member of the props
+struct.
+.El
+.Sh FILES
+.Bl -tag -width "/dev/backlight/*"
+.It Pa /dev/backlight/*
+.Sh HISTORY
+The
+.Nm backlight
+interface first appear in
+.Fx 13.0 .
+The
+.Nm backlight
+driver and manual page was written by
+.An Emmanuel Vadot Aq Mt manu at FreeBSD.org .

Modified: head/sys/conf/files
==============================================================================
--- head/sys/conf/files	Fri Oct  2 17:50:22 2020	(r366368)
+++ head/sys/conf/files	Fri Oct  2 18:18:01 2020	(r366369)
@@ -1312,6 +1312,8 @@ dev/ath/ath_rate/sample/sample.c	optional ath_rate_sam
 dev/ath/ath_dfs/null/dfs_null.c	optional ath \
 	compile-with "${NORMAL_C} -I$S/dev/ath"
 #
+dev/backlight/backlight_if.m		optional backlight
+dev/backlight/backlight.c		optional backlight
 dev/bce/if_bce.c			optional bce
 dev/bfe/if_bfe.c			optional bfe
 dev/bge/if_bge.c			optional bge

Added: head/sys/dev/backlight/backlight.c
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/sys/dev/backlight/backlight.c	Fri Oct  2 18:18:01 2020	(r366369)
@@ -0,0 +1,170 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ *
+ * Copyright (c) 2020 Emmanuel Vadot <manu at FreeBSD.org>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/limits.h>
+#include <sys/bus.h>
+#include <sys/conf.h>
+#include <sys/kernel.h>
+#include <sys/malloc.h>
+#include <sys/module.h>
+#include <sys/lock.h>
+#include <sys/sx.h>
+
+#include <dev/backlight/backlight.h>
+
+#include "backlight_if.h"
+
+static struct sx backlight_sx;
+static MALLOC_DEFINE(M_BACKLIGHT, "BACKLIGHT", "Backlight driver");
+static struct unrhdr *backlight_unit;
+
+struct backlight_softc {
+	struct cdev *cdev;
+	struct cdev *alias;
+	int unit;
+	device_t dev;
+	uint32_t cached_brightness;
+};
+
+static int
+backlight_ioctl(struct cdev *dev, u_long cmd, caddr_t data,
+    int fflag, struct thread *td)
+{
+	struct backlight_softc *sc;
+	struct backlight_props props;
+	struct backlight_info info;
+	int error;
+
+	sc = dev->si_drv1;
+
+	switch (cmd) {
+	case BACKLIGHTGETSTATUS:
+		/* Call the driver function so it fills up the props */
+		bcopy(data, &props, sizeof(struct backlight_props));
+		error = BACKLIGHT_GET_STATUS(sc->dev, &props);
+		if (error == 0)
+			bcopy(&props, data, sizeof(struct backlight_props));
+		break;
+	case BACKLIGHTUPDATESTATUS:
+		bcopy(data, &props, sizeof(struct backlight_props));
+		if (props.brightness == sc->cached_brightness)
+			return (0);
+		error = BACKLIGHT_UPDATE_STATUS(sc->dev, &props);
+		if (error == 0) {
+			bcopy(&props, data, sizeof(struct backlight_props));
+			sc->cached_brightness = props.brightness;
+		}
+		break;
+	case BACKLIGHTGETINFO:
+		memset(&info, 0, sizeof(info));
+		error = BACKLIGHT_GET_INFO(sc->dev, &info);
+		if (error == 0)
+			bcopy(&info, data, sizeof(struct backlight_info));
+		break;
+	}
+
+	return (error);
+}
+
+static struct cdevsw backlight_cdevsw = {
+	.d_version =	D_VERSION,
+	.d_ioctl =	backlight_ioctl,
+	.d_name =	"backlight",
+};
+
+struct cdev *
+backlight_register(const char *name, device_t dev)
+{
+	struct make_dev_args args;
+	struct backlight_softc *sc;
+	struct backlight_props props;
+	int error;
+
+	sc = malloc(sizeof(*sc), M_BACKLIGHT, M_WAITOK | M_ZERO);
+
+	sx_xlock(&backlight_sx);
+	sc->unit = alloc_unr(backlight_unit);
+	sc->dev = dev;
+	make_dev_args_init(&args);
+	args.mda_flags = MAKEDEV_CHECKNAME | MAKEDEV_WAITOK;
+	args.mda_devsw = &backlight_cdevsw;
+	args.mda_uid = UID_ROOT;
+	args.mda_gid = GID_VIDEO;
+	args.mda_mode = 0660;
+	args.mda_si_drv1 = sc;
+	error = make_dev_s(&args, &sc->cdev, "backlight/backlight%d", sc->unit);
+
+	if (error != 0)
+		goto fail;
+
+	error = make_dev_alias_p(MAKEDEV_CHECKNAME | MAKEDEV_WAITOK,
+	  &sc->alias, sc->cdev, "backlight/%s%d", name, sc->unit);
+	if (error != 0)
+		device_printf(dev, "Cannot register with alias %s%d\n", name,
+		    sc->unit);
+
+	sx_xunlock(&backlight_sx);
+
+	error = BACKLIGHT_GET_STATUS(sc->dev, &props);
+	sc->cached_brightness = props.brightness;
+
+	return (sc->cdev);
+fail:
+	sx_xunlock(&backlight_sx);
+	return (NULL);
+}
+
+int
+backlight_destroy(struct cdev *dev)
+{
+	struct backlight_softc *sc;
+
+	sc = dev->si_drv1;
+	sx_xlock(&backlight_sx);
+	free_unr(backlight_unit, sc->unit);
+	destroy_dev(dev);
+	sx_xunlock(&backlight_sx);
+	return (0);
+}
+
+static void
+backlight_drvinit(void *unused)
+{
+
+	backlight_unit = new_unrhdr(0, INT_MAX, NULL);
+	sx_init(&backlight_sx, "Backlight sx");
+}
+
+SYSINIT(backlightdev, SI_SUB_DRIVERS, SI_ORDER_MIDDLE, backlight_drvinit, NULL);
+MODULE_VERSION(backlight, 1);

Added: head/sys/dev/backlight/backlight.h
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/sys/dev/backlight/backlight.h	Fri Oct  2 18:18:01 2020	(r366369)
@@ -0,0 +1,33 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ *
+ * Copyright (c) 2020 Emmanuel Vadot <manu at FreeBSD.org>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#include <sys/backlight.h>
+
+struct cdev *backlight_register(const char *name, device_t dev);
+int backlight_destroy(struct cdev *dev);

Added: head/sys/dev/backlight/backlight_if.m
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/sys/dev/backlight/backlight_if.m	Fri Oct  2 18:18:01 2020	(r366369)
@@ -0,0 +1,66 @@
+#-
+# SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+#
+# Copyright (c) 2020 Emmanuel Vadot <manu at FreeBSD.org>
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# $FreeBSD$
+
+#include <dev/backlight/backlight.h>
+
+INTERFACE backlight;
+
+CODE {
+	static int
+	backlight_default_update_status(device_t dev, struct backlight_props *props)
+	{
+		return (EOPNOTSUPP);
+	}
+
+	static int
+	backlight_default_get_status(device_t dev, struct backlight_props *props)
+	{
+		return (EOPNOTSUPP);
+	}
+
+	static int
+	backlight_default_get_info(device_t dev, struct backlight_info *info)
+	{
+		return (EOPNOTSUPP);
+	}
+};
+
+METHOD int update_status {
+	device_t dev;
+	struct backlight_props *props;
+} DEFAULT backlight_default_update_status;
+
+METHOD int get_status {
+	device_t dev;
+	struct backlight_props *props;
+} DEFAULT backlight_default_get_status;
+
+METHOD int get_info {
+	device_t dev;
+	struct backlight_info *info;
+} DEFAULT backlight_default_get_info;

Modified: head/sys/modules/Makefile
==============================================================================
--- head/sys/modules/Makefile	Fri Oct  2 17:50:22 2020	(r366368)
+++ head/sys/modules/Makefile	Fri Oct  2 18:18:01 2020	(r366369)
@@ -59,6 +59,7 @@ SUBDIR=	\
 	ath_rate \
 	ath_pci \
 	${_autofs} \
+	backlight \
 	${_bce} \
 	${_bcm283x_clkman} \
 	${_bcm283x_pwm} \

Added: head/sys/modules/backlight/Makefile
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/sys/modules/backlight/Makefile	Fri Oct  2 18:18:01 2020	(r366369)
@@ -0,0 +1,13 @@
+# $FreeBSD$
+
+.PATH:	${SRCTOP}/sys/dev/backlight
+KMOD=	backlight
+SRCS=	backlight.c
+
+SRCS+=	bus_if.h \
+	device_if.h \
+	opt_platform.h \
+	backlight_if.h \
+	backlight_if.c
+
+.include <bsd.kmod.mk>

Added: head/sys/sys/backlight.h
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/sys/sys/backlight.h	Fri Oct  2 18:18:01 2020	(r366369)
@@ -0,0 +1,61 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ *
+ * Copyright (c) 2020 Emmanuel Vadot <manu at FreeBSD.org>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#ifndef __BACKLIGHT_H__
+#define	__BACKLIGHT_H__
+
+#define	BACKLIGHTMAXLEVELS 100
+
+struct backlight_props {
+	uint32_t	brightness;
+	uint32_t	nlevels;
+	uint32_t	levels[BACKLIGHTMAXLEVELS];
+};
+
+enum backlight_info_type {
+	BACKLIGHT_TYPE_PANEL = 0,
+	BACKLIGHT_TYPE_KEYBOARD
+};
+
+#define	BACKLIGHTMAXNAMELENGTH	64
+
+struct backlight_info {
+	char				name[BACKLIGHTMAXNAMELENGTH];
+	enum backlight_info_type	type;
+};
+
+/*
+ * ioctls
+ */
+
+#define BACKLIGHTGETSTATUS	_IOWR('G', 0, struct backlight_props)
+#define BACKLIGHTUPDATESTATUS	_IOWR('G', 1, struct backlight_props)
+#define BACKLIGHTGETINFO	_IOWR('G', 2, struct backlight_info)
+
+#endif	/* __BACKLIGHT_H__ */


More information about the svn-src-head mailing list