diff options
| author | Ian Lepore <ian@FreeBSD.org> | 2018-04-07 18:09:31 +0000 |
|---|---|---|
| committer | Ian Lepore <ian@FreeBSD.org> | 2018-04-07 18:09:31 +0000 |
| commit | 392bffb9b156261c866e26f094558335135c979a (patch) | |
| tree | d7ea1059d69a2b56d5b562b0f0f9ca0ccc633c9a /sys/dev | |
| parent | e55d32b7b35daa936f542d281fa1a6f1f51632df (diff) | |
Notes
Diffstat (limited to 'sys/dev')
| -rw-r--r-- | sys/dev/spibus/spibus.c | 32 |
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), |
