From: kettenis Date: Mon, 27 Aug 2018 13:56:11 +0000 (+0000) Subject: Add glue for the USB3 controller on the HiKey 970. X-Git-Url: http://artulab.com/gitweb/?a=commitdiff_plain;h=0fb29ed22399aa9f2a65422428d50db13630c51e;p=openbsd Add glue for the USB3 controller on the HiKey 970. --- diff --git a/sys/arch/arm64/conf/GENERIC b/sys/arch/arm64/conf/GENERIC index b84499d29d2..289dffddc38 100644 --- a/sys/arch/arm64/conf/GENERIC +++ b/sys/arch/arm64/conf/GENERIC @@ -1,4 +1,4 @@ -# $OpenBSD: GENERIC,v 1.86 2018/08/27 10:03:26 kettenis Exp $ +# $OpenBSD: GENERIC,v 1.87 2018/08/27 13:56:11 kettenis Exp $ # # GENERIC machine description file # @@ -132,6 +132,9 @@ bcmtemp* at fdt? dwctwo* at fdt? usb* at dwctwo? +# HiSilicon SoCs +hidwusb* at fdt? + # Marvell SoCs mvclock* at fdt? early 1 mvicu* at fdt? early 1 diff --git a/sys/arch/arm64/conf/RAMDISK b/sys/arch/arm64/conf/RAMDISK index f018b43fee9..e0d2c4f64bc 100644 --- a/sys/arch/arm64/conf/RAMDISK +++ b/sys/arch/arm64/conf/RAMDISK @@ -1,4 +1,4 @@ -# $OpenBSD: RAMDISK,v 1.69 2018/08/26 19:50:08 kettenis Exp $ +# $OpenBSD: RAMDISK,v 1.70 2018/08/27 13:56:11 kettenis Exp $ # # GENERIC machine description file # @@ -128,6 +128,9 @@ bcmrng* at fdt? dwctwo* at fdt? usb* at dwctwo? +# HiSilicon SoCs +hidwusb* at fdt? + # Marvell SoCs mvclock* at fdt? early 1 mvicu* at fdt? early 1 diff --git a/sys/dev/fdt/files.fdt b/sys/dev/fdt/files.fdt index 985d86bf2f7..66d67870b46 100644 --- a/sys/dev/fdt/files.fdt +++ b/sys/dev/fdt/files.fdt @@ -1,4 +1,4 @@ -# $OpenBSD: files.fdt,v 1.70 2018/08/26 19:50:08 kettenis Exp $ +# $OpenBSD: files.fdt,v 1.71 2018/08/27 13:56:11 kettenis Exp $ # # Config file and device description for machine-independent FDT code. # Included by ports that need it. @@ -119,6 +119,10 @@ device syscon: fdt attach syscon at fdt file dev/fdt/syscon.c syscon +device hidwusb: fdt +attach hidwusb at fdt +file dev/fdt/hidwusb.c hidwusb + device rkclock attach rkclock at fdt file dev/fdt/rkclock.c rkclock diff --git a/sys/dev/fdt/hidwusb.c b/sys/dev/fdt/hidwusb.c new file mode 100644 index 00000000000..fbdbbea4dbe --- /dev/null +++ b/sys/dev/fdt/hidwusb.c @@ -0,0 +1,88 @@ +/* $OpenBSD: hidwusb.c,v 1.1 2018/08/27 13:56:11 kettenis Exp $ */ +/* + * Copyright (c) 2017, 2018 Mark kettenis + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include +#include +#include + +#include +#include + +#include + +#include +#include +#include +#include + +/* + * This driver is based on preliminary device tree bindings and will + * almost certainly need changes once the official bindings land in + * mainline Linux. Support for these preliminary bindings will be + * dropped as soon as official bindings are available. + */ + +struct hidwusb_softc { + struct simplebus_softc sc_sbus; +}; + +int hidwusb_match(struct device *, void *, void *); +void hidwusb_attach(struct device *, struct device *, void *); + +struct cfattach hidwusb_ca = { + sizeof(struct hidwusb_softc), hidwusb_match, hidwusb_attach +}; + +struct cfdriver hidwusb_cd = { + NULL, "hidwusb", DV_DULL +}; + +int +hidwusb_match(struct device *parent, void *match, void *aux) +{ + struct fdt_attach_args *faa = aux; + + return OF_is_compatible(faa->fa_node, "hisilicon,kirin970-dwc3"); +} + +void +hidwusb_attach(struct device *parent, struct device *self, void *aux) +{ + struct hidwusb_softc *sc = (struct hidwusb_softc *)self; + struct fdt_attach_args *faa = aux; + uint32_t gpio[3]; + int node; + + /* + * The HiKey970 has a switch to select between the Type-C and + * a hub with Type-A connectors. Switch to the USB Type-C + * connector as we can't power up the hub yet. + */ + node = OF_finddevice("/soc/hikey_usbhub"); + if (node) { + if (OF_getpropintarray(node, "typc_vbus_int_gpio,typec-gpios", + gpio, sizeof(gpio)) == sizeof(gpio)) { + gpio_controller_config_pin(gpio, GPIO_CONFIG_OUTPUT); + gpio_controller_set_pin(gpio, 1); + } + } + + clock_enable_all(faa->fa_node); + reset_deassert_all(faa->fa_node); + + simplebus_attach(parent, &sc->sc_sbus.sc_dev, faa); +}