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
This commit is contained in:
Emmanuel Vadot 2020-10-02 18:18:01 +00:00
parent f31695cc64
commit 675aae732d
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=366369
9 changed files with 424 additions and 0 deletions

View File

@ -10,6 +10,7 @@ MAN= accept_filter.9 \
alq.9 \
altq.9 \
atomic.9 \
backlight.9 \
bhnd.9 \
bhnd_erom.9 \
bios.9 \

View File

@ -0,0 +1,77 @@
.\" Copyright (c) 2020 Emmanuel Vadot <manu@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@FreeBSD.org .

View File

@ -1312,6 +1312,8 @@ dev/ath/ath_rate/sample/sample.c optional ath_rate_sample \
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

View File

@ -0,0 +1,170 @@
/*-
* SPDX-License-Identifier: BSD-2-Clause-FreeBSD
*
* Copyright (c) 2020 Emmanuel Vadot <manu@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);

View File

@ -0,0 +1,33 @@
/*-
* SPDX-License-Identifier: BSD-2-Clause-FreeBSD
*
* Copyright (c) 2020 Emmanuel Vadot <manu@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);

View File

@ -0,0 +1,66 @@
#-
# SPDX-License-Identifier: BSD-2-Clause-FreeBSD
#
# Copyright (c) 2020 Emmanuel Vadot <manu@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;

View File

@ -59,6 +59,7 @@ SUBDIR= \
ath_rate \
ath_pci \
${_autofs} \
backlight \
${_bce} \
${_bcm283x_clkman} \
${_bcm283x_pwm} \

View File

@ -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>

61
sys/sys/backlight.h Normal file
View File

@ -0,0 +1,61 @@
/*-
* SPDX-License-Identifier: BSD-2-Clause-FreeBSD
*
* Copyright (c) 2020 Emmanuel Vadot <manu@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__ */