svn commit: r349415 - in stable/12: share/man/man9 sys/arm/allwinner sys/arm64/conf sys/conf sys/dev/pwm sys/dts/arm64/overlays sys/modules/dtb/allwinner sys/sys usr.sbin usr.sbin/pwm
Ian Lepore
ian at FreeBSD.org
Wed Jun 26 15:34:41 UTC 2019
Author: ian
Date: Wed Jun 26 15:34:35 2019
New Revision: 349415
URL: https://svnweb.freebsd.org/changeset/base/349415
Log:
MFC r341268, r342003-r342007, r342087-r342088, r342091
r341268 by manu:
arm64: allwinner: Add a dtbo to have cpu operating points
This enables cpufreq on A64 boards.
r342003 by manu:
Add a pwm subsystem so we can configure pwm controller from kernel and userland.
The pwm subsystem consist of API for PWM controllers, pwmbus to register them
and a pwm(8) utility to talk to them from userland.
Reviewed by: oshgobo (capsicum), bcr (manpage), 0mp (manpage)
Differential Revision: https://reviews.freebsd.org/D17938
r342004 by manu:
arm64: allwinner: Add pwm driver
Add a pwm driver for Allwinner PWM
Add pwm and aw_pwm to the GENERIC kernel
r342005 by manu:
arm64: allwinner: Add DTSO for pwm and r_pwm
Those are both dtso (overlays) for the two pwm controllers found on the A64.
r342006 by manu:
arm64: allwinner: Fix pwm dtso
Double patched files ended up in the tree
Reported by: kevans
r342007 by manu:
pwm: Fix some arches by using %ju and casting to uintmax_t
Reported by: ci.freebsd.org
r342087 by manu:
pwm: Convert period and duty to unsigned int
We don't need a 64 bits value to store nanoseconds
Discused with: ian, jhibbits
r342088 by manu:
pwm(8): Add percentage value support for duty cycle
r342091 by manu:
allwinner: aw_pwm: Read value at attach
The booloaded might have configured the pwm controller so read the values.
Added:
stable/12/share/man/man9/pwm.9
- copied unchanged from r342007, head/share/man/man9/pwm.9
stable/12/share/man/man9/pwmbus.9
- copied unchanged from r342007, head/share/man/man9/pwmbus.9
stable/12/sys/arm/allwinner/aw_pwm.c
- copied, changed from r342007, head/sys/arm/allwinner/aw_pwm.c
stable/12/sys/dev/pwm/
- copied from r342007, head/sys/dev/pwm/
stable/12/sys/dts/arm64/overlays/sun50i-a64-opp.dtso
- copied unchanged from r341268, head/sys/dts/arm64/overlays/sun50i-a64-opp.dtso
stable/12/sys/dts/arm64/overlays/sun50i-a64-pwm.dtso
- copied unchanged from r342007, head/sys/dts/arm64/overlays/sun50i-a64-pwm.dtso
stable/12/sys/dts/arm64/overlays/sun50i-a64-rpwm.dtso
- copied unchanged from r342007, head/sys/dts/arm64/overlays/sun50i-a64-rpwm.dtso
stable/12/sys/sys/pwm.h
- copied, changed from r342007, head/sys/sys/pwm.h
stable/12/usr.sbin/pwm/
- copied from r342007, head/usr.sbin/pwm/
Modified:
stable/12/share/man/man9/Makefile
stable/12/sys/arm64/conf/GENERIC
stable/12/sys/conf/files
stable/12/sys/conf/files.arm64
stable/12/sys/dev/pwm/pwm_if.m
stable/12/sys/dev/pwm/pwmbus.c
stable/12/sys/dev/pwm/pwmbus_if.m
stable/12/sys/modules/dtb/allwinner/Makefile
stable/12/usr.sbin/Makefile
stable/12/usr.sbin/pwm/pwm.8
stable/12/usr.sbin/pwm/pwm.c
Directory Properties:
stable/12/ (props changed)
Modified: stable/12/share/man/man9/Makefile
==============================================================================
--- stable/12/share/man/man9/Makefile Wed Jun 26 15:28:21 2019 (r349414)
+++ stable/12/share/man/man9/Makefile Wed Jun 26 15:34:35 2019 (r349415)
@@ -269,6 +269,8 @@ MAN= accept_filter.9 \
proc_rwmem.9 \
pseudofs.9 \
psignal.9 \
+ pwm.9 \
+ pwmbus.9 \
random.9 \
random_harvest.9 \
ratecheck.9 \
Copied: stable/12/share/man/man9/pwm.9 (from r342007, head/share/man/man9/pwm.9)
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ stable/12/share/man/man9/pwm.9 Wed Jun 26 15:34:35 2019 (r349415, copy of r342007, head/share/man/man9/pwm.9)
@@ -0,0 +1,93 @@
+.\" Copyright (c) 2018 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 November 12, 2018
+.Dt PWM 9
+.Os
+.Sh NAME
+.Nm pwm ,
+.Nm PWM_GET_BUS ,
+.Nm PWM_CHANNEL_CONFIG ,
+.Nm PWM_CHANNEL_GET_CONFIG ,
+.Nm PWM_CHANNEL_SET_FLAGS ,
+.Nm PWM_CHANNEL_GET_FLAGS ,
+.Nm PWM_CHANNEL_ENABLE ,
+.Nm PWM_CHANNEL_IS_ENABLED ,
+.Nm PWM_CHANNEL_MAX
+.Nd PWM methods
+.Sh SYNOPSIS
+.Cd "device pwm"
+.In "pwm_if.h"
+.Ft device_t
+.Fn PWM_GET_BUS "device_t dev"
+.Ft int
+.Fn PWM_CHANNEL_CONFIG "device_t dev" "int channel" "uint64_t period" "uint64_t duty"
+.Ft int
+.Fn PWM_CHANNEL_GET_CONFIG "device_t dev" "int channel" "uint64_t *period" "uint64_t *duty"
+.Ft int
+.Fn PWM_CHANNEL_SET_FLAGS "device_t dev" "int channel" "uint32_t flags"
+.Ft int
+.Fn PWM_CHANNEL_GET_FLAGS "device_t dev" "int channel" "uint32_t *flags"
+.Ft int
+.Fn PWM_CHANNEL_ENABLE "device_t dev" "int channel" "bool enable"
+.Ft int
+.Fn PWM_CHANNEL_IS_ENABLED "device_t dev" "int channel" "bool *enabled"
+.Ft int
+.Fn PWM_CHANNEL_MAX "device_t dev" "int channel" "int *nchannel"
+.Sh DESCRIPTION
+The PWM (Pulse-Width Modulation) interface allows the device driver to register to a global
+bus so other devices in the kernel can use them in a generic way.
+.Sh INTERFACE
+.Bl -tag -width indent
+.It Fn PWM_GET_BUS "device_t dev"
+Return the bus device.
+.It Fn PWM_CHANNEL_CONFIG "device_t dev" "int channel" "uint64_t period" "uint64_t duty"
+Configure the period and duty (in nanoseconds) in the PWM controller for the specified channel.
+Returns 0 on success or
+.Er EINVAL
+if the values are not supported by the controller or
+.Er EBUSY
+is the PWM controller is in use and does not support changing the value on the fly.
+.It Fn PWM_CHANNEL_GET_CONFIG "device_t dev" "int channel" "uint64_t *period" "uint64_t *duty"
+Get the current configuration of the period and duty for the specified channel.
+.It Fn PWM_CHANNEL_SET_FLAGS "device_t dev" "int channel" "uint32_t flags"
+Set the flags of the channel (like inverted polarity).
+.It Fn PWM_CHANNEL_GET_FLAGS "device_t dev" "int channel" "uint32_t *flags"
+Get the current flags for the channel.
+.It Fn PWM_CHANNEL_ENABLE "device_t dev" "int channel" "bool enable"
+Enable the PWM channel.
+.It Fn PWM_CHANNEL_ISENABLED "device_t dev" "int channel" "bool *enable"
+Test if the PWM channel is enabled.
+.It PWM_CHANNEL_MAX "device_t dev" "int channel" "int *nchannel"
+Get the maximum number of channels supported by the controller.
+.El
+.Sh HISTORY
+The
+.Nm pwm
+interface first appeared in
+.Fx 13.0 .
+The
+.Nm pwm
+interface and manual page was written by
+.An Emmanuel Vadot Aq Mt manu at FreeBSD.org .
Copied: stable/12/share/man/man9/pwmbus.9 (from r342007, head/share/man/man9/pwmbus.9)
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ stable/12/share/man/man9/pwmbus.9 Wed Jun 26 15:34:35 2019 (r349415, copy of r342007, head/share/man/man9/pwmbus.9)
@@ -0,0 +1,98 @@
+.\" Copyright (c) 2018 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 November 12, 2018
+.Dt PWMBUS 9
+.Os
+.Sh NAME
+.Nm pwmbus ,
+.Nm pwmbus_attach_bus ,
+.Nm PWMBUS_GET_BUS ,
+.Nm PWMBUS_CHANNEL_CONFIG ,
+.Nm PWMBUS_CHANNEL_GET_CONFIG ,
+.Nm PWMBUS_CHANNEL_SET_FLAGS ,
+.Nm PWMBUS_CHANNEL_GET_FLAGS ,
+.Nm PWMBUS_CHANNEL_ENABLE ,
+.Nm PWMBUS_CHANNEL_IS_ENABLED ,
+.Nm PWMBUS_CHANNEL_MAX
+.Nd PWMBUS methods
+.Sh SYNOPSIS
+.Cd "device pwm"
+.In "pwmbus_if.h"
+.Ft device_t
+.Fn pwmbus_attach_bus "device_t dev"
+.Ft int
+.Fn PWMBUS_CHANNEL_CONFIG "device_t bus" "int channel" "uint64_t period" "uint64_t duty"
+.Ft int
+.Fn PWMBUS_CHANNEL_GET_CONFIG "device_t bus" "int channel" "uint64_t *period" "uint64_t *duty"
+.Ft int
+.Fn PWMBUS_CHANNEL_SET_FLAGS "device_t bus" "int channel" "uint32_t flags"
+.Ft int
+.Fn PWMBUS_CHANNEL_GET_FLAGS "device_t bus" "int channel" "uint32_t *flags"
+.Ft int
+.Fn PWMBUS_CHANNEL_ENABLE "device_t bus" "int channel" "bool enable"
+.Ft int
+.Fn PWMBUS_CHANNEL_IS_ENABLED "device_t bus" "int channel" "bool *enabled"
+.Ft int
+.Fn PWMBUS_CHANNEL_MAX "device_t bus" "int channel" "int *nchannel"
+.Sh DESCRIPTION
+The PWMBUS (Pulse-Width Modulation) interface allows the device driver to register to a global
+bus so other devices in the kernel can use them in a generic way
+.Sh INTERFACE
+.Bl -tag -width indent
+.It Fn pwmbus_attach_bus "device_t dev"
+Attach the
+.Nm pwmbus
+to the device driver
+.It Fn PWMBUS_CHANNEL_CONFIG "device_t bus" "int channel" "uint64_t period" "uint64_t duty"
+Configure the period and duty (in nanoseconds) in the PWM controller on the bus for the specified channel.
+Returns 0 on success or
+.Er EINVAL
+is the values are not supported by the controller or
+.Er EBUSY
+is the PWMBUS controller is in use and doesn't support changing the value on the fly.
+.It Fn PWMBUS_CHANNEL_GET_CONFIG "device_t bus" "int channel" "uint64_t *period" "uint64_t *duty"
+Get the current configuration of the period and duty for the specified channel.
+.It Fn PWMBUS_CHANNEL_SET_FLAGS "device_t bus" "int channel" "uint32_t flags"
+Set the flags of the channel (like inverted polarity), if the driver or controller
+doesn't support this a default method is used.
+.It Fn PWMBUS_CHANNEL_GET_FLAGS "device_t bus" "int channel" "uint32_t *flags"
+Get the current flags for the channel, if the driver or controller
+doesn't support this, a default method is used.
+.It Fn PWMBUS_CHANNEL_ENABLE "device_t bus" "int channel" "bool enable"
+Enable the PWM channel.
+.It Fn PWMBUS_CHANNEL_ISENABLED "device_t bus" "int channel" "bool *enable"
+Test if the PWM channel is enabled.
+.It PWMBUS_CHANNEL_MAX "device_t bus" "int channel" "int *nchannel"
+Get the maximum number of channel supported by the controller.
+.El
+.Sh HISTORY
+The
+.Nm pwmbus
+interface first appear in
+.Fx 13.0 .
+The
+.Nm pwmbus
+interface and manual page was written by
+.An Emmanuel Vadot Aq Mt manu at FreeBSD.org .
Copied and modified: stable/12/sys/arm/allwinner/aw_pwm.c (from r342007, head/sys/arm/allwinner/aw_pwm.c)
==============================================================================
--- head/sys/arm/allwinner/aw_pwm.c Wed Dec 12 21:25:52 2018 (r342007, copy source)
+++ stable/12/sys/arm/allwinner/aw_pwm.c Wed Jun 26 15:34:35 2019 (r349415)
@@ -87,8 +87,8 @@ struct aw_pwm_softc {
struct resource *res;
uint64_t clk_freq;
- uint64_t period;
- uint64_t duty;
+ unsigned int period;
+ unsigned int duty;
uint32_t flags;
bool enabled;
};
@@ -136,7 +136,8 @@ static int
aw_pwm_attach(device_t dev)
{
struct aw_pwm_softc *sc;
- /* uint32_t reg; */
+ uint64_t clk_freq;
+ uint32_t reg;
int error;
sc = device_get_softc(dev);
@@ -160,6 +161,26 @@ aw_pwm_attach(device_t dev)
if ((sc->busdev = pwmbus_attach_bus(dev)) == NULL)
device_printf(dev, "Cannot attach pwm bus\n");
+ /* Read the configuration left by U-Boot */
+ reg = AW_PWM_READ(sc, AW_PWM_CTRL);
+ if (reg & (AW_PWM_CTRL_GATE | AW_PWM_CTRL_EN))
+ sc->enabled = true;
+
+ reg = AW_PWM_READ(sc, AW_PWM_CTRL);
+ reg &= AW_PWM_CTRL_PRESCALE_MASK;
+ if (reg > nitems(aw_pwm_clk_prescaler)) {
+ device_printf(dev, "Bad prescaler %x, cannot guess current settings\n", reg);
+ goto out;
+ }
+ clk_freq = sc->clk_freq / aw_pwm_clk_prescaler[reg];
+
+ reg = AW_PWM_READ(sc, AW_PWM_PERIOD);
+ sc->period = NS_PER_SEC /
+ (clk_freq / ((reg >> AW_PWM_PERIOD_TOTAL_SHIFT) & AW_PWM_PERIOD_TOTAL_MASK));
+ sc->duty = NS_PER_SEC /
+ (clk_freq / ((reg >> AW_PWM_PERIOD_ACTIVE_SHIFT) & AW_PWM_PERIOD_ACTIVE_MASK));
+
+out:
return (0);
fail:
@@ -191,7 +212,7 @@ aw_pwm_channel_max(device_t dev, int *nchannel)
}
static int
-aw_pwm_channel_config(device_t dev, int channel, uint64_t period, uint64_t duty)
+aw_pwm_channel_config(device_t dev, int channel, unsigned int period, unsigned int duty)
{
struct aw_pwm_softc *sc;
uint64_t period_freq, duty_freq;
@@ -254,7 +275,7 @@ aw_pwm_channel_config(device_t dev, int channel, uint6
}
static int
-aw_pwm_channel_get_config(device_t dev, int channel, uint64_t *period, uint64_t *duty)
+aw_pwm_channel_get_config(device_t dev, int channel, unsigned int *period, unsigned int *duty)
{
struct aw_pwm_softc *sc;
Modified: stable/12/sys/arm64/conf/GENERIC
==============================================================================
--- stable/12/sys/arm64/conf/GENERIC Wed Jun 26 15:28:21 2019 (r349414)
+++ stable/12/sys/arm64/conf/GENERIC Wed Jun 26 15:34:35 2019 (r349415)
@@ -231,6 +231,10 @@ device aw_thermal # Allwinner Thermal Sensor Controll
device spibus
device bcm2835_spi # Broadcom BCM283x SPI bus
+# PWM
+device pwm
+device aw_pwm
+
# Console
device vt
device kbdmux
Modified: stable/12/sys/conf/files
==============================================================================
--- stable/12/sys/conf/files Wed Jun 26 15:28:21 2019 (r349414)
+++ stable/12/sys/conf/files Wed Jun 26 15:34:35 2019 (r349415)
@@ -2775,6 +2775,11 @@ dev/puc/puc.c optional puc
dev/puc/puc_cfg.c optional puc
dev/puc/puc_pccard.c optional puc pccard
dev/puc/puc_pci.c optional puc pci
+dev/pwm/pwmc.c optional pwm
+dev/pwm/pwmbus.c optional pwm
+dev/pwm/pwm_if.m optional pwm
+dev/pwm/pwmbus_if.m optional pwm
+dev/pwm/ofw_pwm.c optional pwm fdt
dev/quicc/quicc_core.c optional quicc
dev/ral/rt2560.c optional ral
dev/ral/rt2661.c optional ral
Modified: stable/12/sys/conf/files.arm64
==============================================================================
--- stable/12/sys/conf/files.arm64 Wed Jun 26 15:28:21 2019 (r349414)
+++ stable/12/sys/conf/files.arm64 Wed Jun 26 15:34:35 2019 (r349415)
@@ -31,6 +31,7 @@ arm/allwinner/aw_gpio.c optional gpio aw_gpio fdt
arm/allwinner/aw_mmc.c optional mmc aw_mmc fdt | mmccam aw_mmc fdt
arm/allwinner/aw_nmi.c optional aw_nmi fdt \
compile-with "${NORMAL_C} -I$S/gnu/dts/include"
+arm/allwinner/aw_pwm.c optional aw_pwm fdt
arm/allwinner/aw_rsb.c optional aw_rsb fdt
arm/allwinner/aw_rtc.c optional aw_rtc fdt
arm/allwinner/aw_sid.c optional aw_sid nvmem fdt
Modified: stable/12/sys/dev/pwm/pwm_if.m
==============================================================================
--- head/sys/dev/pwm/pwm_if.m Wed Dec 12 21:25:52 2018 (r342007)
+++ stable/12/sys/dev/pwm/pwm_if.m Wed Jun 26 15:34:35 2019 (r349415)
@@ -46,8 +46,8 @@ METHOD device_t get_bus {
METHOD int channel_config {
device_t dev;
int channel;
- uint64_t period;
- uint64_t duty;
+ unsigned int period;
+ unsigned duty;
};
#
@@ -57,8 +57,8 @@ METHOD int channel_config {
METHOD int channel_get_config {
device_t dev;
int channel;
- uint64_t *period;
- uint64_t *duty;
+ unsigned int *period;
+ unsigned int *duty;
};
#
Modified: stable/12/sys/dev/pwm/pwmbus.c
==============================================================================
--- head/sys/dev/pwm/pwmbus.c Wed Dec 12 21:25:52 2018 (r342007)
+++ stable/12/sys/dev/pwm/pwmbus.c Wed Jun 26 15:34:35 2019 (r349415)
@@ -138,7 +138,7 @@ pwmbus_detach(device_t dev)
}
static int
-pwmbus_channel_config(device_t bus, int channel, uint64_t period, uint64_t duty)
+pwmbus_channel_config(device_t bus, int channel, unsigned int period, unsigned int duty)
{
struct pwmbus_softc *sc;
@@ -151,7 +151,7 @@ pwmbus_channel_config(device_t bus, int channel, uint6
}
static int
-pwmbus_channel_get_config(device_t bus, int channel, uint64_t *period, uint64_t *duty)
+pwmbus_channel_get_config(device_t bus, int channel, unsigned int *period, unsigned int *duty)
{
struct pwmbus_softc *sc;
Modified: stable/12/sys/dev/pwm/pwmbus_if.m
==============================================================================
--- head/sys/dev/pwm/pwmbus_if.m Wed Dec 12 21:25:52 2018 (r342007)
+++ stable/12/sys/dev/pwm/pwmbus_if.m Wed Jun 26 15:34:35 2019 (r349415)
@@ -59,8 +59,8 @@ HEADER {
METHOD int channel_config {
device_t bus;
int channel;
- uint64_t period;
- uint64_t duty;
+ unsigned int period;
+ unsigned int duty;
};
#
@@ -70,8 +70,8 @@ METHOD int channel_config {
METHOD int channel_get_config {
device_t bus;
int channel;
- uint64_t *period;
- uint64_t *duty;
+ unsigned int *period;
+ unsigned int *duty;
};
#
Copied: stable/12/sys/dts/arm64/overlays/sun50i-a64-opp.dtso (from r341268, head/sys/dts/arm64/overlays/sun50i-a64-opp.dtso)
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ stable/12/sys/dts/arm64/overlays/sun50i-a64-opp.dtso Wed Jun 26 15:34:35 2019 (r349415, copy of r341268, head/sys/dts/arm64/overlays/sun50i-a64-opp.dtso)
@@ -0,0 +1,72 @@
+/dts-v1/;
+/plugin/;
+
+/ {
+ compatible = "allwinner,sun50i-a64";
+};
+
+&{/} {
+ cpu0_opp_table: opp_table0 {
+ compatible = "operating-points-v2";
+ opp-shared;
+
+ opp-648000000 {
+ opp-hz = /bits/ 64 <648000000>;
+ opp-microvolt = <1040000>;
+ clock-latency-ns = <244144>; /* 8 32k periods */
+ };
+ opp-816000000 {
+ opp-hz = /bits/ 64 <816000000>;
+ opp-microvolt = <1100000>;
+ clock-latency-ns = <244144>; /* 8 32k periods */
+ };
+ opp-912000000 {
+ opp-hz = /bits/ 64 <912000000>;
+ opp-microvolt = <1120000>;
+ clock-latency-ns = <244144>; /* 8 32k periods */
+ };
+ opp-960000000 {
+ opp-hz = /bits/ 64 <960000000>;
+ opp-microvolt = <1160000>;
+ clock-latency-ns = <244144>; /* 8 32k periods */
+ };
+ opp-1008000000 {
+ opp-hz = /bits/ 64 <1008000000>;
+ opp-microvolt = <1200000>;
+ clock-latency-ns = <244144>; /* 8 32k periods */
+ };
+ opp-1056000000 {
+ opp-hz = /bits/ 64 <1056000000>;
+ opp-microvolt = <1240000>;
+ clock-latency-ns = <244144>; /* 8 32k periods */
+ };
+ opp-1104000000 {
+ opp-hz = /bits/ 64 <1104000000>;
+ opp-microvolt = <1260000>;
+ clock-latency-ns = <244144>; /* 8 32k periods */
+ };
+ opp-1152000000 {
+ opp-hz = /bits/ 64 <1152000000>;
+ opp-microvolt = <1300000>;
+ clock-latency-ns = <244144>; /* 8 32k periods */
+ };
+ };
+};
+
+&{/cpus/cpu at 0} {
+ operating-points-v2 = <&cpu0_opp_table>;
+ clocks = <&ccu 1>;
+ cpu-supply = <®_dcdc2>;
+};
+
+&{/cpus/cpu at 1} {
+ operating-points-v2 = <&cpu0_opp_table>;
+};
+
+&{/cpus/cpu at 2} {
+ operating-points-v2 = <&cpu0_opp_table>;
+};
+
+&{/cpus/cpu at 3} {
+ operating-points-v2 = <&cpu0_opp_table>;
+};
Copied: stable/12/sys/dts/arm64/overlays/sun50i-a64-pwm.dtso (from r342007, head/sys/dts/arm64/overlays/sun50i-a64-pwm.dtso)
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ stable/12/sys/dts/arm64/overlays/sun50i-a64-pwm.dtso Wed Jun 26 15:34:35 2019 (r349415, copy of r342007, head/sys/dts/arm64/overlays/sun50i-a64-pwm.dtso)
@@ -0,0 +1,26 @@
+/dts-v1/;
+/plugin/;
+
+/ {
+ compatible = "allwinner,sun50i-a64";
+};
+
+&{/soc} {
+ pwm: pwm at 1c21400 {
+ compatible = "allwinner,sun50i-a64-pwm",
+ "allwinner,sun5i-a13-pwm";
+ reg = <0x01c21400 0x400>;
+ clocks = <&osc24M>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&pwm_pin>;
+ #pwm-cells = <3>;
+ status = "disabled";
+ };
+};
+
+&{/soc/pinctrl at 1c20800} {
+ pwm_pin: pwm_pin {
+ pins = "PD22";
+ function = "pwm";
+ };
+};
Copied: stable/12/sys/dts/arm64/overlays/sun50i-a64-rpwm.dtso (from r342007, head/sys/dts/arm64/overlays/sun50i-a64-rpwm.dtso)
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ stable/12/sys/dts/arm64/overlays/sun50i-a64-rpwm.dtso Wed Jun 26 15:34:35 2019 (r349415, copy of r342007, head/sys/dts/arm64/overlays/sun50i-a64-rpwm.dtso)
@@ -0,0 +1,26 @@
+/dts-v1/;
+/plugin/;
+
+/ {
+ compatible = "allwinner,sun50i-a64";
+};
+
+&{/soc} {
+ r_pwm: pwm at 1f03800 {
+ compatible = "allwinner,sun50i-a64-pwm",
+ "allwinner,sun5i-a13-pwm";
+ reg = <0x01f03800 0x400>;
+ clocks = <&osc24M>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&r_pwm_pin>;
+ #pwm-cells = <3>;
+ status = "okay";
+ };
+};
+
+&{/soc/pinctrl at 1f02c00} {
+ r_pwm_pin: pwm {
+ pins = "PL10";
+ function = "s_pwm";
+ };
+};
Modified: stable/12/sys/modules/dtb/allwinner/Makefile
==============================================================================
--- stable/12/sys/modules/dtb/allwinner/Makefile Wed Jun 26 15:28:21 2019 (r349414)
+++ stable/12/sys/modules/dtb/allwinner/Makefile Wed Jun 26 15:34:35 2019 (r349415)
@@ -44,7 +44,10 @@ DTS= \
allwinner/sun50i-a64-sopine-baseboard.dts \
allwinner/sun50i-h5-orangepi-pc2.dts
-DTSO= sun50i-a64-sid.dtso \
+DTSO= sun50i-a64-opp.dtso \
+ sun50i-a64-pwm.dtso \
+ sun50i-a64-rpwm.dtso \
+ sun50i-a64-sid.dtso \
sun50i-a64-ths.dtso \
sun50i-a64-timer.dtso
Copied and modified: stable/12/sys/sys/pwm.h (from r342007, head/sys/sys/pwm.h)
==============================================================================
--- head/sys/sys/pwm.h Wed Dec 12 21:25:52 2018 (r342007, copy source)
+++ stable/12/sys/sys/pwm.h Wed Jun 26 15:34:35 2019 (r349415)
@@ -35,8 +35,8 @@
struct pwm_state {
int channel;
- uint64_t period;
- uint64_t duty;
+ unsigned int period;
+ unsigned int duty;
uint32_t flags;
bool enable;
};
Modified: stable/12/usr.sbin/Makefile
==============================================================================
--- stable/12/usr.sbin/Makefile Wed Jun 26 15:28:21 2019 (r349414)
+++ stable/12/usr.sbin/Makefile Wed Jun 26 15:34:35 2019 (r349415)
@@ -67,6 +67,7 @@ SUBDIR= adduser \
pstat \
pw \
pwd_mkdb \
+ pwm \
quot \
rarpd \
rmt \
Modified: stable/12/usr.sbin/pwm/pwm.8
==============================================================================
--- head/usr.sbin/pwm/pwm.8 Wed Dec 12 21:25:52 2018 (r342007)
+++ stable/12/usr.sbin/pwm/pwm.8 Wed Jun 26 15:34:35 2019 (r349415)
@@ -67,7 +67,7 @@ Show the configuration of the pwm channel
.It Fl p Ar period
Configure the period (in nanoseconds) of the pwm channel
.It Fl d Ar duty
-Configure the duty (in nanoseconds) of the pwm channel
+Configure the duty (in nanoseconds or percentage) of the pwm channel
.El
.Sh EXAMPLES
.Bl -bullet
@@ -76,9 +76,13 @@ Show the configuration of the pwm channel:
.Pp
pwm -f /dev/pwmc0 -C
.It
-Configure a 50000 ns period and a 25000 duty cycles:
+Configure a 50000 ns period and a 25000 duty cycle:
.Pp
pwm -f /dev/pwmc0 -p 50000 -d 25000
+.It
+Configure a 50% duty cycle:
+.Pp
+pwm -f /dev/pwmc0 -d 50%
.El
.Sh SEE ALSO
.Xr pwm 9 ,
Modified: stable/12/usr.sbin/pwm/pwm.c
==============================================================================
--- head/usr.sbin/pwm/pwm.c Wed Dec 12 21:25:52 2018 (r342007)
+++ stable/12/usr.sbin/pwm/pwm.c Wed Jun 26 15:34:35 2019 (r349415)
@@ -71,6 +71,7 @@ main(int argc, char *argv[])
int action, ch;
cap_rights_t right_ioctl;
const unsigned long pwm_ioctls[] = {PWMGETSTATE, PWMSETSTATE, PWMMAXCHANNEL};
+ char *percent;
action = 0;
fd = -1;
@@ -104,7 +105,9 @@ main(int argc, char *argv[])
if (action & ~(PWM_PERIOD | PWM_DUTY))
usage();
action = PWM_DUTY;
- duty = strtol(optarg, NULL, 10);
+ duty = strtol(optarg, &percent, 10);
+ if (*percent != '\0' && *percent != '%')
+ usage();
break;
case 'c':
if (channel != -1)
@@ -190,17 +193,21 @@ main(int argc, char *argv[])
}
break;
case PWM_SHOW_CONFIG:
- printf("period: %ju\nduty: %ju\nenabled:%d\n",
- (uintmax_t) state.period,
- (uintmax_t) state.duty,
+ printf("period: %u\nduty: %u\nenabled:%d\n",
+ state.period,
+ state.duty,
state.enable);
break;
case PWM_PERIOD:
case PWM_DUTY:
if (period != -1)
state.period = period;
- if (duty != -1)
- state.duty = duty;
+ if (duty != -1) {
+ if (*percent != '\0')
+ state.duty = state.period * duty / 100;
+ else
+ state.duty = duty;
+ }
if (ioctl(fd, PWMSETSTATE, &state) == -1) {
fprintf(stderr,
"Cannot configure the pwm controller\n");
More information about the svn-src-all
mailing list