1*94673892Sjsg /* $OpenBSD: hidwusb.c,v 1.4 2023/09/22 01:10:44 jsg Exp $ */
20fb29ed2Skettenis /*
3e8df7912Skettenis * Copyright (c) 2017, 2018 Mark Kettenis <kettenis@openbsd.org>
40fb29ed2Skettenis *
50fb29ed2Skettenis * Permission to use, copy, modify, and distribute this software for any
60fb29ed2Skettenis * purpose with or without fee is hereby granted, provided that the above
70fb29ed2Skettenis * copyright notice and this permission notice appear in all copies.
80fb29ed2Skettenis *
90fb29ed2Skettenis * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
100fb29ed2Skettenis * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
110fb29ed2Skettenis * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
120fb29ed2Skettenis * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
130fb29ed2Skettenis * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
140fb29ed2Skettenis * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
150fb29ed2Skettenis * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
160fb29ed2Skettenis */
170fb29ed2Skettenis
180fb29ed2Skettenis #include <sys/param.h>
190fb29ed2Skettenis #include <sys/systm.h>
200fb29ed2Skettenis #include <sys/device.h>
210fb29ed2Skettenis
220fb29ed2Skettenis #include <machine/bus.h>
230fb29ed2Skettenis #include <machine/fdt.h>
24*94673892Sjsg #include <machine/simplebusvar.h>
250fb29ed2Skettenis
260fb29ed2Skettenis #include <dev/ofw/openfirm.h>
270fb29ed2Skettenis #include <dev/ofw/ofw_clock.h>
280fb29ed2Skettenis #include <dev/ofw/ofw_gpio.h>
290fb29ed2Skettenis #include <dev/ofw/fdt.h>
300fb29ed2Skettenis
310fb29ed2Skettenis /*
320fb29ed2Skettenis * This driver is based on preliminary device tree bindings and will
330fb29ed2Skettenis * almost certainly need changes once the official bindings land in
340fb29ed2Skettenis * mainline Linux. Support for these preliminary bindings will be
350fb29ed2Skettenis * dropped as soon as official bindings are available.
360fb29ed2Skettenis */
370fb29ed2Skettenis
380fb29ed2Skettenis struct hidwusb_softc {
390fb29ed2Skettenis struct simplebus_softc sc_sbus;
400fb29ed2Skettenis };
410fb29ed2Skettenis
420fb29ed2Skettenis int hidwusb_match(struct device *, void *, void *);
430fb29ed2Skettenis void hidwusb_attach(struct device *, struct device *, void *);
440fb29ed2Skettenis
459fdf0c62Smpi const struct cfattach hidwusb_ca = {
460fb29ed2Skettenis sizeof(struct hidwusb_softc), hidwusb_match, hidwusb_attach
470fb29ed2Skettenis };
480fb29ed2Skettenis
490fb29ed2Skettenis struct cfdriver hidwusb_cd = {
500fb29ed2Skettenis NULL, "hidwusb", DV_DULL
510fb29ed2Skettenis };
520fb29ed2Skettenis
530fb29ed2Skettenis int
hidwusb_match(struct device * parent,void * match,void * aux)540fb29ed2Skettenis hidwusb_match(struct device *parent, void *match, void *aux)
550fb29ed2Skettenis {
560fb29ed2Skettenis struct fdt_attach_args *faa = aux;
570fb29ed2Skettenis
580fb29ed2Skettenis return OF_is_compatible(faa->fa_node, "hisilicon,kirin970-dwc3");
590fb29ed2Skettenis }
600fb29ed2Skettenis
610fb29ed2Skettenis void
hidwusb_attach(struct device * parent,struct device * self,void * aux)620fb29ed2Skettenis hidwusb_attach(struct device *parent, struct device *self, void *aux)
630fb29ed2Skettenis {
640fb29ed2Skettenis struct hidwusb_softc *sc = (struct hidwusb_softc *)self;
650fb29ed2Skettenis struct fdt_attach_args *faa = aux;
660fb29ed2Skettenis uint32_t gpio[3];
670fb29ed2Skettenis int node;
680fb29ed2Skettenis
690fb29ed2Skettenis /*
700fb29ed2Skettenis * The HiKey970 has a switch to select between the Type-C and
710fb29ed2Skettenis * a hub with Type-A connectors. Switch to the USB Type-C
720fb29ed2Skettenis * connector as we can't power up the hub yet.
730fb29ed2Skettenis */
740fb29ed2Skettenis node = OF_finddevice("/soc/hikey_usbhub");
750fb29ed2Skettenis if (node) {
760fb29ed2Skettenis if (OF_getpropintarray(node, "typc_vbus_int_gpio,typec-gpios",
770fb29ed2Skettenis gpio, sizeof(gpio)) == sizeof(gpio)) {
780fb29ed2Skettenis gpio_controller_config_pin(gpio, GPIO_CONFIG_OUTPUT);
790fb29ed2Skettenis gpio_controller_set_pin(gpio, 1);
800fb29ed2Skettenis }
810fb29ed2Skettenis }
820fb29ed2Skettenis
830fb29ed2Skettenis clock_enable_all(faa->fa_node);
840fb29ed2Skettenis reset_deassert_all(faa->fa_node);
850fb29ed2Skettenis
860fb29ed2Skettenis simplebus_attach(parent, &sc->sc_sbus.sc_dev, faa);
870fb29ed2Skettenis }
88