Lines Matching +full:syscon +full:- +full:dev

1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
29 * Driver for simple syscon poweroff and reset devices. The device tree
32 * https://www.kernel.org/doc/Documentation/devicetree/bindings/power/reset/syscon-poweroff.txt
33 * https://www.kernel.org/doc/Documentation/devicetree/bindings/power/reset/syscon-reboot.txt
46 #include <dev/ofw/ofw_bus.h>
47 #include <dev/ofw/ofw_bus_subr.h>
48 #include <dev/ofw/openfirm.h>
51 #include "syscon.h"
54 struct syscon *regmap;
63 syscon_power_shutdown_final(device_t dev, int howto) in syscon_power_shutdown_final() argument
68 sc = device_get_softc(dev); in syscon_power_shutdown_final()
69 if (sc->reboot) in syscon_power_shutdown_final()
75 SYSCON_MODIFY_4(sc->regmap, sc->offset, sc->mask, in syscon_power_shutdown_final()
76 sc->value & sc->mask); in syscon_power_shutdown_final()
80 syscon_power_probe(device_t dev) in syscon_power_probe() argument
83 if (!ofw_bus_status_okay(dev)) in syscon_power_probe()
86 if (ofw_bus_is_compatible(dev, "syscon-poweroff")) { in syscon_power_probe()
87 device_set_desc(dev, "Syscon poweroff"); in syscon_power_probe()
89 } else if (ofw_bus_is_compatible(dev, "syscon-reboot")) { in syscon_power_probe()
90 device_set_desc(dev, "Syscon reboot"); in syscon_power_probe()
98 syscon_power_attach(device_t dev) in syscon_power_attach() argument
105 sc = device_get_softc(dev); in syscon_power_attach()
106 node = ofw_bus_get_node(dev); in syscon_power_attach()
109 device_printf(dev, "could not find regmap\n"); in syscon_power_attach()
113 error = syscon_get_by_ofw_property(dev, node, "regmap", &sc->regmap); in syscon_power_attach()
115 device_printf(dev, "could not get syscon\n"); in syscon_power_attach()
121 device_printf(dev, "could not get offset\n"); in syscon_power_attach()
125 OF_getencprop(node, "offset", &sc->offset, sizeof(sc->offset)); in syscon_power_attach()
132 device_printf(dev, "cannot handle mask\n"); in syscon_power_attach()
136 OF_getencprop(node, "mask", &sc->mask, sizeof(sc->mask)); in syscon_power_attach()
138 sc->mask = 0xffffffff; in syscon_power_attach()
149 device_printf(dev, "must have a value or a mask\n"); in syscon_power_attach()
153 sc->value = sc->mask; in syscon_power_attach()
157 device_printf(dev, "cannot handle value\n"); in syscon_power_attach()
161 OF_getencprop(node, "value", &sc->value, sizeof(sc->value)); in syscon_power_attach()
165 sc->reboot = ofw_bus_is_compatible(dev, "syscon-reboot"); in syscon_power_attach()
166 sc->shutdown_tag = EVENTHANDLER_REGISTER(shutdown_final, in syscon_power_attach()
167 syscon_power_shutdown_final, dev, in syscon_power_attach()
168 sc->reboot ? SHUTDOWN_PRI_LAST + 150 : SHUTDOWN_PRI_LAST); in syscon_power_attach()
174 syscon_power_detach(device_t dev) in syscon_power_detach() argument
178 sc = device_get_softc(dev); in syscon_power_detach()
179 EVENTHANDLER_DEREGISTER(shutdown_final, sc->shutdown_tag); in syscon_power_detach()