svn commit: r349086 - in head/sys: arm/allwinner conf dev/pwm
Ian Lepore
ian at FreeBSD.org
Sat Jun 15 22:25:41 UTC 2019
Author: ian
Date: Sat Jun 15 22:25:39 2019
New Revision: 349086
URL: https://svnweb.freebsd.org/changeset/base/349086
Log:
Restructure the pwm device hirearchy and interfaces.
The pwm and pwmbus interfaces were nearly identical, this merges them into a
single pwmbus interface. The pwmbus driver now implements the pwmbus
interface by simply passing all calls through to its parent (the hardware
driver). The channel_count method moves from pwm to pwmbus, and the
get_bus method is deleted (just no longer needed).
The net effect is that the interface for doing pwm stuff is now the same
regardless of whether you're a child of pwmbus, or some random driver
elsewhere in the hierarchy that is bypassing the pwmbus layer and is talking
directly to the hardware driver via cross-hierarchy connections established
using fdt data.
The pwmc driver is now a child of pwmbus, instead of being its sibling
(that's why the get_bus method is no longer needed; pwmc now gets the
device_t of the bus using device_get_parent()).
Deleted:
head/sys/dev/pwm/pwm_if.m
Modified:
head/sys/arm/allwinner/aw_pwm.c
head/sys/conf/files
head/sys/dev/pwm/ofw_pwm.c
head/sys/dev/pwm/pwmbus.c
head/sys/dev/pwm/pwmbus.h
head/sys/dev/pwm/pwmbus_if.m
head/sys/dev/pwm/pwmc.c
Modified: head/sys/arm/allwinner/aw_pwm.c
==============================================================================
--- head/sys/arm/allwinner/aw_pwm.c Sat Jun 15 21:51:55 2019 (r349085)
+++ head/sys/arm/allwinner/aw_pwm.c Sat Jun 15 22:25:39 2019 (r349086)
@@ -46,7 +46,7 @@ __FBSDID("$FreeBSD$");
#include <dev/pwm/pwmbus.h>
-#include "pwm_if.h"
+#include "pwmbus_if.h"
#define AW_PWM_CTRL 0x00
#define AW_PWM_CTRL_PRESCALE_MASK 0xF
@@ -346,28 +346,18 @@ aw_pwm_channel_is_enabled(device_t dev, int channel, b
return (0);
}
-static device_t
-aw_pwm_get_bus(device_t dev)
-{
- struct aw_pwm_softc *sc;
-
- sc = device_get_softc(dev);
-
- return (sc->busdev);
-}
static device_method_t aw_pwm_methods[] = {
/* Device interface */
DEVMETHOD(device_probe, aw_pwm_probe),
DEVMETHOD(device_attach, aw_pwm_attach),
DEVMETHOD(device_detach, aw_pwm_detach),
- /* pwm interface */
- DEVMETHOD(pwm_get_bus, aw_pwm_get_bus),
- DEVMETHOD(pwm_channel_count, aw_pwm_channel_count),
- DEVMETHOD(pwm_channel_config, aw_pwm_channel_config),
- DEVMETHOD(pwm_channel_get_config, aw_pwm_channel_get_config),
- DEVMETHOD(pwm_channel_enable, aw_pwm_channel_enable),
- DEVMETHOD(pwm_channel_is_enabled, aw_pwm_channel_is_enabled),
+ /* pwmbus interface */
+ DEVMETHOD(pwmbus_channel_count, aw_pwm_channel_count),
+ DEVMETHOD(pwmbus_channel_config, aw_pwm_channel_config),
+ DEVMETHOD(pwmbus_channel_get_config, aw_pwm_channel_get_config),
+ DEVMETHOD(pwmbus_channel_enable, aw_pwm_channel_enable),
+ DEVMETHOD(pwmbus_channel_is_enabled, aw_pwm_channel_is_enabled),
DEVMETHOD_END
};
Modified: head/sys/conf/files
==============================================================================
--- head/sys/conf/files Sat Jun 15 21:51:55 2019 (r349085)
+++ head/sys/conf/files Sat Jun 15 22:25:39 2019 (r349086)
@@ -2702,7 +2702,6 @@ dev/puc/puc_pccard.c optional puc pccard
dev/puc/puc_pci.c optional puc pci
dev/pwm/pwmc.c optional pwm | pwmc
dev/pwm/pwmbus.c optional pwm | pwmbus
-dev/pwm/pwm_if.m optional pwm | pwmbus
dev/pwm/pwmbus_if.m optional pwm | pwmbus
dev/pwm/ofw_pwm.c optional pwm fdt | pwmbus fdt
dev/quicc/quicc_core.c optional quicc
Modified: head/sys/dev/pwm/ofw_pwm.c
==============================================================================
--- head/sys/dev/pwm/ofw_pwm.c Sat Jun 15 21:51:55 2019 (r349085)
+++ head/sys/dev/pwm/ofw_pwm.c Sat Jun 15 22:25:39 2019 (r349086)
@@ -40,7 +40,7 @@ __FBSDID("$FreeBSD$");
#include <dev/pwm/pwmbus.h>
-#include "pwm_if.h"
+#include "pwmbus_if.h"
int
pwm_get_by_ofw_propidx(device_t consumer, phandle_t node,
@@ -58,12 +58,6 @@ pwm_get_by_ofw_propidx(device_t consumer, phandle_t no
channel.dev = OF_device_from_xref(xref);
if (channel.dev == NULL) {
- OF_prop_free(cells);
- return (ENODEV);
- }
-
- channel.busdev = PWM_GET_BUS(channel.dev);
- if (channel.busdev == NULL) {
OF_prop_free(cells);
return (ENODEV);
}
Modified: head/sys/dev/pwm/pwmbus.c
==============================================================================
--- head/sys/dev/pwm/pwmbus.c Sat Jun 15 21:51:55 2019 (r349085)
+++ head/sys/dev/pwm/pwmbus.c Sat Jun 15 22:25:39 2019 (r349086)
@@ -47,7 +47,6 @@ __FBSDID("$FreeBSD$");
#include <dev/pwm/pwmbus.h>
#include "pwmbus_if.h"
-#include "pwm_if.h"
struct pwmbus_channel_data {
int reserved;
@@ -55,8 +54,8 @@ struct pwmbus_channel_data {
};
struct pwmbus_softc {
- device_t busdev;
device_t dev;
+ device_t parent;
int nchannels;
};
@@ -75,15 +74,18 @@ pwmbus_attach(device_t dev)
struct pwmbus_softc *sc;
sc = device_get_softc(dev);
- sc->busdev = dev;
- sc->dev = device_get_parent(dev);
+ sc->dev = dev;
+ sc->parent = device_get_parent(dev);
- if (PWM_CHANNEL_COUNT(sc->dev, &sc->nchannels) != 0 ||
- sc->nchannels == 0)
+ if (PWMBUS_CHANNEL_COUNT(sc->parent, &sc->nchannels) != 0 ||
+ sc->nchannels == 0) {
+ device_printf(sc->dev, "No channels on parent %s\n",
+ device_get_nameunit(sc->parent));
return (ENXIO);
+ }
- if (bootverbose)
- device_printf(dev, "Registering %d channel(s)\n", sc->nchannels);
+ device_add_child(sc->dev, "pwmc", -1);
+
bus_generic_probe(dev);
return (bus_generic_attach(dev));
@@ -101,96 +103,61 @@ pwmbus_detach(device_t dev)
}
static int
-pwmbus_channel_config(device_t bus, int chan, u_int period, u_int duty)
+pwmbus_channel_config(device_t dev, int chan, u_int period, u_int duty)
{
- struct pwmbus_softc *sc;
-
- sc = device_get_softc(bus);
-
- if (chan > sc->nchannels)
- return (EINVAL);
-
- return (PWM_CHANNEL_CONFIG(sc->dev, chan, period, duty));
+ return (PWMBUS_CHANNEL_CONFIG(device_get_parent(dev), chan, period, duty));
}
static int
-pwmbus_channel_get_config(device_t bus, int chan, u_int *period, u_int *duty)
+pwmbus_channel_get_config(device_t dev, int chan, u_int *period, u_int *duty)
{
- struct pwmbus_softc *sc;
-
- sc = device_get_softc(bus);
-
- if (chan > sc->nchannels)
- return (EINVAL);
-
- return (PWM_CHANNEL_GET_CONFIG(sc->dev, chan, period, duty));
+ return (PWMBUS_CHANNEL_GET_CONFIG(device_get_parent(dev), chan, period, duty));
}
static int
-pwmbus_channel_set_flags(device_t bus, int chan, uint32_t flags)
+pwmbus_channel_get_flags(device_t dev, int chan, uint32_t *flags)
{
- struct pwmbus_softc *sc;
-
- sc = device_get_softc(bus);
-
- if (chan > sc->nchannels)
- return (EINVAL);
-
- return (PWM_CHANNEL_SET_FLAGS(sc->dev, chan, flags));
+ return (PWMBUS_CHANNEL_GET_FLAGS(device_get_parent(dev), chan, flags));
}
static int
-pwmbus_channel_get_flags(device_t bus, int chan, uint32_t *flags)
+pwmbus_channel_enable(device_t dev, int chan, bool enable)
{
- struct pwmbus_softc *sc;
-
- sc = device_get_softc(bus);
-
- if (chan > sc->nchannels)
- return (EINVAL);
-
- return (PWM_CHANNEL_GET_FLAGS(sc->dev, chan, flags));
+ return (PWMBUS_CHANNEL_ENABLE(device_get_parent(dev), chan, enable));
}
static int
-pwmbus_channel_enable(device_t bus, int chan, bool enable)
+pwmbus_channel_set_flags(device_t dev, int chan, uint32_t flags)
{
- struct pwmbus_softc *sc;
-
- sc = device_get_softc(bus);
-
- if (chan > sc->nchannels)
- return (EINVAL);
-
- return (PWM_CHANNEL_ENABLE(sc->dev, chan, enable));
+ return (PWMBUS_CHANNEL_SET_FLAGS(device_get_parent(dev), chan, flags));
}
static int
-pwmbus_channel_is_enabled(device_t bus, int chan, bool *enable)
+pwmbus_channel_is_enabled(device_t dev, int chan, bool *enable)
{
- struct pwmbus_softc *sc;
+ return (PWMBUS_CHANNEL_IS_ENABLED(device_get_parent(dev), chan, enable));
+}
- sc = device_get_softc(bus);
-
- if (chan > sc->nchannels)
- return (EINVAL);
-
- return (PWM_CHANNEL_IS_ENABLED(sc->dev, chan, enable));
+static int
+pwmbus_channel_count(device_t dev, int *nchannel)
+{
+ return (PWMBUS_CHANNEL_COUNT(device_get_parent(dev), nchannel));
}
static device_method_t pwmbus_methods[] = {
/* device_if */
- DEVMETHOD(device_probe, pwmbus_probe),
+ DEVMETHOD(device_probe, pwmbus_probe),
DEVMETHOD(device_attach, pwmbus_attach),
DEVMETHOD(device_detach, pwmbus_detach),
- /* pwm interface */
- DEVMETHOD(pwmbus_channel_config, pwmbus_channel_config),
- DEVMETHOD(pwmbus_channel_get_config, pwmbus_channel_get_config),
- DEVMETHOD(pwmbus_channel_set_flags, pwmbus_channel_set_flags),
- DEVMETHOD(pwmbus_channel_get_flags, pwmbus_channel_get_flags),
- DEVMETHOD(pwmbus_channel_enable, pwmbus_channel_enable),
- DEVMETHOD(pwmbus_channel_is_enabled, pwmbus_channel_is_enabled),
+ /* pwmbus_if */
+ DEVMETHOD(pwmbus_channel_count, pwmbus_channel_count),
+ DEVMETHOD(pwmbus_channel_config, pwmbus_channel_config),
+ DEVMETHOD(pwmbus_channel_get_config, pwmbus_channel_get_config),
+ DEVMETHOD(pwmbus_channel_set_flags, pwmbus_channel_set_flags),
+ DEVMETHOD(pwmbus_channel_get_flags, pwmbus_channel_get_flags),
+ DEVMETHOD(pwmbus_channel_enable, pwmbus_channel_enable),
+ DEVMETHOD(pwmbus_channel_is_enabled, pwmbus_channel_is_enabled),
DEVMETHOD_END
};
Modified: head/sys/dev/pwm/pwmbus.h
==============================================================================
--- head/sys/dev/pwm/pwmbus.h Sat Jun 15 21:51:55 2019 (r349085)
+++ head/sys/dev/pwm/pwmbus.h Sat Jun 15 22:25:39 2019 (r349086)
@@ -34,7 +34,6 @@
struct pwm_channel {
device_t dev;
- device_t busdev;
int channel;
uint64_t period;
uint64_t duty;
Modified: head/sys/dev/pwm/pwmbus_if.m
==============================================================================
--- head/sys/dev/pwm/pwmbus_if.m Sat Jun 15 21:51:55 2019 (r349085)
+++ head/sys/dev/pwm/pwmbus_if.m Sat Jun 15 22:25:39 2019 (r349086)
@@ -105,3 +105,11 @@ METHOD int channel_is_enabled {
int channel;
bool *enabled;
};
+
+#
+# Get the number of channels
+#
+METHOD int channel_count {
+ device_t bus;
+ int *nchannel;
+};
Modified: head/sys/dev/pwm/pwmc.c
==============================================================================
--- head/sys/dev/pwm/pwmc.c Sat Jun 15 21:51:55 2019 (r349085)
+++ head/sys/dev/pwm/pwmc.c Sat Jun 15 22:25:39 2019 (r349086)
@@ -40,11 +40,9 @@ __FBSDID("$FreeBSD$");
#include <dev/pwm/pwmc.h>
#include "pwmbus_if.h"
-#include "pwm_if.h"
struct pwmc_softc {
device_t dev;
- device_t pdev;
struct cdev *pwm_dev;
char name[32];
};
@@ -60,14 +58,12 @@ pwm_ioctl(struct cdev *dev, u_long cmd, caddr_t data,
int rv = 0;
sc = dev->si_drv1;
- bus = PWM_GET_BUS(sc->pdev);
- if (bus == NULL)
- return (EINVAL);
+ bus = device_get_parent(sc->dev);
switch (cmd) {
case PWMMAXCHANNEL:
nchannel = -1;
- rv = PWM_CHANNEL_COUNT(sc->pdev, &nchannel);
+ rv = PWMBUS_CHANNEL_COUNT(bus, &nchannel);
bcopy(&nchannel, data, sizeof(nchannel));
break;
case PWMSETSTATE:
@@ -106,7 +102,7 @@ pwmc_probe(device_t dev)
{
device_set_desc(dev, "PWM Controller");
- return (0);
+ return (BUS_PROBE_NOWILDCARD);
}
static int
@@ -117,7 +113,6 @@ pwmc_attach(device_t dev)
sc = device_get_softc(dev);
sc->dev = dev;
- sc->pdev = device_get_parent(dev);
snprintf(sc->name, sizeof(sc->name), "pwmc%d", device_get_unit(dev));
make_dev_args_init(&args);
@@ -161,5 +156,6 @@ static driver_t pwmc_driver = {
};
static devclass_t pwmc_devclass;
-DRIVER_MODULE(pwmc, pwm, pwmc_driver, pwmc_devclass, 0, 0);
+DRIVER_MODULE(pwmc, pwmbus, pwmc_driver, pwmc_devclass, 0, 0);
+MODULE_DEPEND(pwmc, pwmbus, 1, 1, 1);
MODULE_VERSION(pwmc, 1);
More information about the svn-src-all
mailing list