svn commit: r335506 - in head/sys: conf dev/spibus
Ian Lepore
ian at FreeBSD.org
Thu Jun 21 21:16:27 UTC 2018
Author: ian
Date: Thu Jun 21 21:16:26 2018
New Revision: 335506
URL: https://svnweb.freebsd.org/changeset/base/335506
Log:
Incorporate bus and chip select numbers into spigen(4) cdev names. Rather
than assigning spigen device names in order of creation, this uses a device
name that corresponds to the owning spibus and chip-select index.
Example: /dev/spigen0.1 would be a child of spibus0, and use cs = 1
The intent is for systems like Raspberry Pi to have a consistent way of
using an SPI interface with a specific cs value from a user application.
Otherwise, there is no consistent way of knowing which cs pin will be
assigned to a particular spigen device. The alternative is to specify
everything in "the right order" in an overlay file, which is less than
ideal. Additionally, this duplicates (to some extent) the way Linux handles
a similar situation with their 'spidev' device, so it would be somewhat
familiar to those who also use Linux.
A new kernel config option, SPIGEN_LEGACY_CDEVNAME, causes the driver to
also create /dev/spigenN device name aliases, with N incrementing in the
order of device instantiation. This is provided to ease the transition
for existing systems using the original naming convention (particularly
when these changes are MFC'd to stable branches).
Differential Revision: https://reviews.freebsd.org/D15301
Modified:
head/sys/conf/NOTES
head/sys/conf/options
head/sys/dev/spibus/spibus.c
head/sys/dev/spibus/spigen.c
Modified: head/sys/conf/NOTES
==============================================================================
--- head/sys/conf/NOTES Thu Jun 21 21:15:04 2018 (r335505)
+++ head/sys/conf/NOTES Thu Jun 21 21:16:26 2018 (r335506)
@@ -3044,3 +3044,6 @@ options UINPUT_DEBUG # enable uinput debug msgs
# Encrypted kernel crash dumps.
options EKCD
+
+# Enable legacy /dev/spigenN name aliases for /dev/spigenX.Y devices.
+options SPIGEN_LEGACY_CDEVNAME # legacy device names for spigen
Modified: head/sys/conf/options
==============================================================================
--- head/sys/conf/options Thu Jun 21 21:15:04 2018 (r335505)
+++ head/sys/conf/options Thu Jun 21 21:16:26 2018 (r335506)
@@ -992,6 +992,9 @@ BHND_LOGLEVEL opt_global.h
# GPIO and child devices
GPIO_SPI_DEBUG opt_gpio.h
+# SPI devices
+SPIGEN_LEGACY_CDEVNAME opt_spi.h
+
# etherswitch(4) driver
RTL8366_SOFT_RESET opt_etherswitch.h
Modified: head/sys/dev/spibus/spibus.c
==============================================================================
--- head/sys/dev/spibus/spibus.c Thu Jun 21 21:15:04 2018 (r335505)
+++ head/sys/dev/spibus/spibus.c Thu Jun 21 21:16:26 2018 (r335506)
@@ -122,8 +122,10 @@ spibus_child_location_str(device_t bus, device_t child
size_t buflen)
{
struct spibus_ivar *devi = SPIBUS_IVAR(child);
+ int cs;
- snprintf(buf, buflen, "cs=%d", devi->cs);
+ cs = devi->cs & ~SPIBUS_CS_HIGH; /* trim 'cs high' bit */
+ snprintf(buf, buflen, "bus=%d cs=%d", device_get_unit(bus), cs);
return (0);
}
Modified: head/sys/dev/spibus/spigen.c
==============================================================================
--- head/sys/dev/spibus/spigen.c Thu Jun 21 21:15:04 2018 (r335505)
+++ head/sys/dev/spibus/spigen.c Thu Jun 21 21:16:26 2018 (r335506)
@@ -26,6 +26,7 @@
__FBSDID("$FreeBSD$");
#include "opt_platform.h"
+#include "opt_spi.h"
#include <sys/param.h>
#include <sys/systm.h>
@@ -64,6 +65,9 @@ __FBSDID("$FreeBSD$");
struct spigen_softc {
device_t sc_dev;
struct cdev *sc_cdev;
+#ifdef SPIGEN_LEGACY_CDEVNAME
+ struct cdev *sc_adev; /* alias device */
+#endif
struct mtx sc_mtx;
uint32_t sc_command_length_max; /* cannot change while mmapped */
uint32_t sc_data_length_max; /* cannot change while mmapped */
@@ -186,15 +190,46 @@ spigen_attach(device_t dev)
{
struct spigen_softc *sc;
const int unit = device_get_unit(dev);
+ int cs, res;
+ struct make_dev_args mda;
+ spibus_get_cs(dev, &cs);
+ cs &= ~SPIBUS_CS_HIGH; /* trim 'cs high' bit */
+
sc = device_get_softc(dev);
sc->sc_dev = dev;
- sc->sc_cdev = make_dev(&spigen_cdevsw, unit,
- UID_ROOT, GID_OPERATOR, 0660, "spigen%d", unit);
- sc->sc_cdev->si_drv1 = dev;
sc->sc_command_length_max = PAGE_SIZE;
sc->sc_data_length_max = PAGE_SIZE;
+
mtx_init(&sc->sc_mtx, device_get_nameunit(dev), NULL, MTX_DEF);
+
+ make_dev_args_init(&mda);
+ mda.mda_flags = MAKEDEV_WAITOK;
+ mda.mda_devsw = &spigen_cdevsw;
+ mda.mda_cr = NULL;
+ mda.mda_uid = UID_ROOT;
+ mda.mda_gid = GID_OPERATOR;
+ mda.mda_mode = 0660;
+ mda.mda_unit = unit;
+ mda.mda_si_drv1 = dev;
+
+ res = make_dev_s(&mda, &(sc->sc_cdev), "spigen%d.%d",
+ device_get_unit(device_get_parent(dev)), cs);
+ if (res) {
+ return res;
+ }
+
+#ifdef SPIGEN_LEGACY_CDEVNAME
+ res = make_dev_alias_p(0, &sc->sc_adev, sc->sc_cdev, "spigen%d", unit);
+ if (res) {
+ if (sc->sc_cdev) {
+ destroy_dev(sc->sc_cdev);
+ sc->sc_cdev = NULL;
+ }
+ return res;
+ }
+#endif
+
spigen_sysctl_init(sc);
return (0);
@@ -429,8 +464,13 @@ spigen_detach(device_t dev)
mtx_destroy(&sc->sc_mtx);
- if (sc->sc_cdev)
- destroy_dev(sc->sc_cdev);
+#ifdef SPIGEN_LEGACY_CDEVNAME
+ if (sc->sc_adev)
+ destroy_dev(sc->sc_adev);
+#endif
+
+ if (sc->sc_cdev)
+ destroy_dev(sc->sc_cdev);
return (0);
}
More information about the svn-src-all
mailing list