aboutsummaryrefslogtreecommitdiff
path: root/sys/dev
diff options
context:
space:
mode:
authorIan Lepore <ian@FreeBSD.org>2018-04-07 18:09:31 +0000
committerIan Lepore <ian@FreeBSD.org>2018-04-07 18:09:31 +0000
commit392bffb9b156261c866e26f094558335135c979a (patch)
treed7ea1059d69a2b56d5b562b0f0f9ca0ccc633c9a /sys/dev
parente55d32b7b35daa936f542d281fa1a6f1f51632df (diff)
Notes
Diffstat (limited to 'sys/dev')
-rw-r--r--sys/dev/spibus/spibus.c32
1 files changed, 32 insertions, 0 deletions
diff --git a/sys/dev/spibus/spibus.c b/sys/dev/spibus/spibus.c
index 3c6a631a258c5..d205e3d865aeb 100644
--- a/sys/dev/spibus/spibus.c
+++ b/sys/dev/spibus/spibus.c
@@ -160,6 +160,37 @@ spibus_read_ivar(device_t bus, device_t child, int which, uintptr_t *result)
return (0);
}
+static int
+spibus_write_ivar(device_t bus, device_t child, int which, uintptr_t value)
+{
+ struct spibus_ivar *devi = SPIBUS_IVAR(child);
+
+ if (devi == NULL || device_get_parent(child) != bus)
+ return (EDOOFUS);
+
+ switch (which) {
+ case SPIBUS_IVAR_CLOCK:
+ /* Any non-zero value is allowed for max clock frequency. */
+ if (value == 0)
+ return (EINVAL);
+ devi->clock = (uint32_t)value;
+ break;
+ case SPIBUS_IVAR_CS:
+ /* Chip select cannot be changed. */
+ return (EINVAL);
+ case SPIBUS_IVAR_MODE:
+ /* Valid SPI modes are 0-3. */
+ if (value > 3)
+ return (EINVAL);
+ devi->mode = (uint32_t)value;
+ break;
+ default:
+ return (EINVAL);
+ }
+
+ return (0);
+}
+
static device_t
spibus_add_child(device_t dev, u_int order, const char *name, int unit)
{
@@ -211,6 +242,7 @@ static device_method_t spibus_methods[] = {
DEVMETHOD(bus_print_child, spibus_print_child),
DEVMETHOD(bus_probe_nomatch, spibus_probe_nomatch),
DEVMETHOD(bus_read_ivar, spibus_read_ivar),
+ DEVMETHOD(bus_write_ivar, spibus_write_ivar),
DEVMETHOD(bus_child_pnpinfo_str, spibus_child_pnpinfo_str),
DEVMETHOD(bus_child_location_str, spibus_child_location_str),
DEVMETHOD(bus_hinted_child, spibus_hinted_child),