svn commit: r350592 - in stable/12: release/arm64 release/tools sys/arm/allwinner sys/conf sys/dev/extres/phy

Emmanuel Vadot manu at FreeBSD.org
Mon Aug 5 16:36:14 UTC 2019


Author: manu
Date: Mon Aug  5 16:36:11 2019
New Revision: 350592
URL: https://svnweb.freebsd.org/changeset/base/350592

Log:
  MFC r340845-r340848, r340971, r340981, r342076
  
  r340845:
  Derive PHY class to new one specialized for USB PHY functions.
  
  Submitted by:	mmel
  
  r340846:
  aw_usbphy: Convert to usbphy subclass
  
  Instead of routing the phy when enabling it, do the configuration
  and routing in the phynode_usb_set_mode function.
  While here, if we don't have a vbus detection method, enable the phy
  if requested.
  
  r340847:
  a10_ehci: Always set the phy to host mode
  
  r340848:
  axp8xx: Rework the enable part and add the GPIOXLDO regulators
  
  r340971:
  aw_usbphy: Do not error if it's not phy 0
  
  Only phy0 can switch between host/otg, do not error if we request
  host mode on phy != 0.
  
  X-MFC with:	r340846
  
  r340981:
  release: arm64: Add PINEBOOK config
  
  Add a configuration for PINEBOOK image.
  Pinebook is a arm64 laptop based on a Pine64 board.
  
  Since the usb trackpad need a quirk, add a common function for adding
  quirk for arm board.
  A default one is supplied as most board to not need quirks.
  
  Reviewed by:	gjb
  Differential Revision:	https://reviews.freebsd.org/D18337
  
  r342076:
  arm64: allwinner: axp81x: Fix double invertion for FLDO1
  
  This fix booting on A64 boards when disabling the unused regulators at boot.
  We did disable all the regulator handled by register 0x13 which of course contain
  mandatory regulators for the board to be up.
  
  Reported by:	Mark Millard <marklmi at yahoo.com>
  X-MFC-With:	r340848

Added:
  stable/12/release/arm64/PINEBOOK.conf
     - copied unchanged from r340981, head/release/arm64/PINEBOOK.conf
  stable/12/sys/dev/extres/phy/phy_internal.h
     - copied unchanged from r340848, head/sys/dev/extres/phy/phy_internal.h
  stable/12/sys/dev/extres/phy/phy_usb.c
     - copied unchanged from r340848, head/sys/dev/extres/phy/phy_usb.c
  stable/12/sys/dev/extres/phy/phy_usb.h
     - copied unchanged from r340848, head/sys/dev/extres/phy/phy_usb.h
  stable/12/sys/dev/extres/phy/phynode_usb_if.m
     - copied unchanged from r340848, head/sys/dev/extres/phy/phynode_usb_if.m
Modified:
  stable/12/release/tools/arm.subr
  stable/12/sys/arm/allwinner/a10_ehci.c
  stable/12/sys/arm/allwinner/aw_usbphy.c
  stable/12/sys/arm/allwinner/axp81x.c
  stable/12/sys/conf/files
  stable/12/sys/dev/extres/phy/phy.c
Directory Properties:
  stable/12/   (props changed)

Copied: stable/12/release/arm64/PINEBOOK.conf (from r340981, head/release/arm64/PINEBOOK.conf)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ stable/12/release/arm64/PINEBOOK.conf	Mon Aug  5 16:36:11 2019	(r350592, copy of r340981, head/release/arm64/PINEBOOK.conf)
@@ -0,0 +1,42 @@
+#!/bin/sh
+#
+# $FreeBSD$
+#
+
+EMBEDDED_TARGET_ARCH="aarch64"
+EMBEDDED_TARGET="arm64"
+EMBEDDEDBUILD=1
+EMBEDDEDPORTS="sysutils/u-boot-pinebook"
+FAT_SIZE="54m -b 1m"
+FAT_TYPE="16"
+IMAGE_SIZE="2560M"
+KERNEL="GENERIC"
+MD_ARGS="-x 63 -y 255"
+NODOC=1
+PART_SCHEME="MBR"
+FDT_OVERLAYS="sun50i-a64-sid,sun50i-a64-ths,sun50i-a64-timer"
+export BOARDNAME="PINEBOOK"
+
+arm_install_uboot() {
+	UBOOT_DIR="/usr/local/share/u-boot/u-boot-pinebook"
+	UBOOT_FILES="u-boot-sunxi-with-spl.bin"
+	chroot ${CHROOTDIR} dd if=${UBOOT_DIR}/${UBOOT_FILES} \
+		of=/dev/${mddev} bs=1k seek=8 conv=sync
+
+	return 0
+}
+
+arm_do_quirk() {
+	echo '# Enable quirk for trackpad' \
+	     >> ${CHROOTDIR}/${DESTDIR}/boot/loader.conf
+	echo 'usb_quirk_load=YES' \
+	     >> ${CHROOTDIR}/${DESTDIR}/boot/loader.conf
+	echo 'ums_load=YES' \
+	     >> ${CHROOTDIR}/${DESTDIR}/boot/loader.conf
+	echo 'hw.usb.quirk="0x258a 0x000c 0x0000 0xffff UQ_CFG_INDEX=1"' \
+	     >> ${CHROOTDIR}/${DESTDIR}/boot/loader.conf
+	# We want EFIFB but there is no node and so we cannot know
+	# which regulator is used for powering lcd/hdmi
+	echo 'hw.regulator.disable_unused=0' \
+	     >> ${CHROOTDIR}/${DESTDIR}/boot/loader.conf
+}

Modified: stable/12/release/tools/arm.subr
==============================================================================
--- stable/12/release/tools/arm.subr	Mon Aug  5 15:56:44 2019	(r350591)
+++ stable/12/release/tools/arm.subr	Mon Aug  5 16:36:11 2019	(r350592)
@@ -174,6 +174,7 @@ arm_install_base() {
 	arm64_setup_multicons
 	arm_setup_fdt_overlays
 	arm_setup_minimal_loader
+	arm_do_quirk
 
 	echo '# Custom /etc/fstab for FreeBSD embedded images' \
 		> ${CHROOTDIR}/${DESTDIR}/etc/fstab
@@ -237,4 +238,8 @@ arm_install_uboot() {
 	# Override in the arm/KERNEL.conf file.
 
 	return 0
+}
+
+arm_do_quirk() {
+	# Override in the arm{,64}/BOARD.conf file.
 }

Modified: stable/12/sys/arm/allwinner/a10_ehci.c
==============================================================================
--- stable/12/sys/arm/allwinner/a10_ehci.c	Mon Aug  5 15:56:44 2019	(r350591)
+++ stable/12/sys/arm/allwinner/a10_ehci.c	Mon Aug  5 16:36:11 2019	(r350592)
@@ -63,7 +63,7 @@ __FBSDID("$FreeBSD$");
 #include <arm/allwinner/aw_machdep.h>
 #include <dev/extres/clk/clk.h>
 #include <dev/extres/hwreset/hwreset.h>
-#include <dev/extres/phy/phy.h>
+#include <dev/extres/phy/phy_usb.h>
 
 #define EHCI_HC_DEVSTR			"Allwinner Integrated USB 2.0 controller"
 
@@ -242,6 +242,11 @@ a10_ehci_attach(device_t self)
 
 	/* Enable USB PHY */
 	if (phy_get_by_ofw_name(self, 0, "usb", &aw_sc->phy) == 0) {
+		err = phy_usb_set_mode(aw_sc->phy, PHY_USB_MODE_HOST);
+		if (err != 0) {
+			device_printf(self, "Could not set phy to host mode\n");
+			goto error;
+		}
 		err = phy_enable(aw_sc->phy);
 		if (err != 0) {
 			device_printf(self, "Could not enable phy\n");

Modified: stable/12/sys/arm/allwinner/aw_usbphy.c
==============================================================================
--- stable/12/sys/arm/allwinner/aw_usbphy.c	Mon Aug  5 15:56:44 2019	(r350591)
+++ stable/12/sys/arm/allwinner/aw_usbphy.c	Mon Aug  5 16:36:11 2019	(r350592)
@@ -49,7 +49,7 @@ __FBSDID("$FreeBSD$");
 #include <dev/extres/clk/clk.h>
 #include <dev/extres/hwreset/hwreset.h>
 #include <dev/extres/regulator/regulator.h>
-#include <dev/extres/phy/phy.h>
+#include <dev/extres/phy/phy_usb.h>
 
 #include "phynode_if.h"
 
@@ -139,17 +139,22 @@ struct awusbphy_softc {
 	gpio_pin_t		vbus_det_pin;
 	int			vbus_det_valid;
 	struct aw_usbphy_conf	*phy_conf;
+	int			mode;
 };
 
  /* Phy class and methods. */
 static int awusbphy_phy_enable(struct phynode *phy, bool enable);
-static phynode_method_t awusbphy_phynode_methods[] = {
+static int awusbphy_get_mode(struct phynode *phy, int *mode);
+static int awusbphy_set_mode(struct phynode *phy, int mode);
+static phynode_usb_method_t awusbphy_phynode_methods[] = {
 	PHYNODEMETHOD(phynode_enable, awusbphy_phy_enable),
+	PHYNODEMETHOD(phynode_usb_get_mode, awusbphy_get_mode),
+	PHYNODEMETHOD(phynode_usb_set_mode, awusbphy_set_mode),
 
 	PHYNODEMETHOD_END
 };
 DEFINE_CLASS_1(awusbphy_phynode, awusbphy_phynode_class, awusbphy_phynode_methods,
-    0, phynode_class);
+  sizeof(struct phynode_usb_sc), phynode_usb_class);
 
 #define	RD4(res, o)	bus_read_4(res, (o))
 #define	WR4(res, o, v)	bus_write_4(res, (o), (v))
@@ -165,6 +170,18 @@ DEFINE_CLASS_1(awusbphy_phynode, awusbphy_phynode_clas
 #define	 PMU_ULPI_BYPASS	(1 << 0)
 #define	PMU_UNK_H3	0x10
 #define	 PMU_UNK_H3_CLR		0x2
+#define	PHY_CSR		0x00
+#define	 ID_PULLUP_EN		(1 << 17)
+#define	 DPDM_PULLUP_EN		(1 << 16)
+#define	 FORCE_ID		(0x3 << 14)
+#define	 FORCE_ID_SHIFT		14
+#define	 FORCE_ID_LOW		2
+#define	 FORCE_VBUS_VALID	(0x3 << 12)
+#define	 FORCE_VBUS_VALID_SHIFT	12
+#define	 FORCE_VBUS_VALID_HIGH	3
+#define	 VBUS_CHANGE_DET	(1 << 6)
+#define	 ID_CHANGE_DET		(1 << 5)
+#define	 DPDM_CHANGE_DET	(1 << 4)
 
 static void
 awusbphy_configure(device_t dev, int phyno)
@@ -287,7 +304,7 @@ awusbphy_vbus_detect(device_t dev, int *val)
 		return (0);
 	}
 
-	*val = 1;
+	*val = 0;
 	return (0);
 }
 
@@ -315,30 +332,22 @@ awusbphy_phy_enable(struct phynode *phynode, bool enab
 	if (reg == NULL)
 		return (0);
 
-	if (enable) {
+	if (phy == 0) {
 		/* If an external vbus is detected, do not enable phy 0 */
-		if (phy == 0) {
-			error = awusbphy_vbus_detect(dev, &vbus_det);
-			if (error)
-				goto out;
+		error = awusbphy_vbus_detect(dev, &vbus_det);
+		if (error)
+			goto out;
 
-			/* Depending on the PHY we need to route OTG to OHCI/EHCI */
-			if (sc->phy_conf->phy0_route == true) {
-				if (vbus_det == 0)
-					/* Host mode */
-					CLR4(sc->phy_ctrl, OTG_PHY_CFG,
-					     OTG_PHY_ROUTE_OTG);
-				else
-					/* Peripheral mode */
-					SET4(sc->phy_ctrl, OTG_PHY_CFG,
-					     OTG_PHY_ROUTE_OTG);
-			}
-			if (vbus_det == 1)
-				return (0);
-		} else
-			error = 0;
-		if (error == 0)
-			error = regulator_enable(reg);
+		if (vbus_det == 1) {
+			if (bootverbose)
+				device_printf(dev, "External VBUS detected, not enabling the regulator\n");
+
+			return (0);
+		}
+	}
+	if (enable) {
+		/* Depending on the PHY we need to route OTG to OHCI/EHCI */
+		error = regulator_enable(reg);
 	} else
 		error = regulator_disable(reg);
 
@@ -350,6 +359,73 @@ out:
 		return (error);
 	}
 
+	return (0);
+}
+
+static int
+awusbphy_get_mode(struct phynode *phynode, int *mode)
+{
+	struct awusbphy_softc *sc;
+	device_t dev;
+
+	dev = phynode_get_device(phynode);
+	sc = device_get_softc(dev);
+
+	*mode = sc->mode;
+
+	return (0);
+}
+
+static int
+awusbphy_set_mode(struct phynode *phynode, int mode)
+{
+	device_t dev;
+	intptr_t phy;
+	struct awusbphy_softc *sc;
+	uint32_t val;
+	int error, vbus_det;
+
+	dev = phynode_get_device(phynode);
+	phy = phynode_get_id(phynode);
+	sc = device_get_softc(dev);
+
+	if (phy != 0) {
+		if (mode != PHY_USB_MODE_HOST)
+			return (EINVAL);
+		return (0);
+	}
+
+	switch (mode) {
+	case PHY_USB_MODE_HOST:
+		val = bus_read_4(sc->phy_ctrl, PHY_CSR);
+		val &= ~(VBUS_CHANGE_DET | ID_CHANGE_DET | DPDM_CHANGE_DET);
+		val |= (ID_PULLUP_EN | DPDM_PULLUP_EN);
+		val &= ~FORCE_ID;
+		val |= (FORCE_ID_LOW << FORCE_ID_SHIFT);
+		val &= ~FORCE_VBUS_VALID;
+		val |= (FORCE_VBUS_VALID_HIGH << FORCE_VBUS_VALID_SHIFT);
+		bus_write_4(sc->phy_ctrl, PHY_CSR, val);
+		if (sc->phy_conf->phy0_route == true) {
+			error = awusbphy_vbus_detect(dev, &vbus_det);
+			if (error)
+				goto out;
+			if (vbus_det == 0)
+				CLR4(sc->phy_ctrl, OTG_PHY_CFG,
+				  OTG_PHY_ROUTE_OTG);
+			else
+				SET4(sc->phy_ctrl, OTG_PHY_CFG,
+				  OTG_PHY_ROUTE_OTG);
+		}
+		break;
+	case PHY_USB_MODE_OTG:
+		/* TODO */
+		break;
+	}
+
+	sc->mode = mode;
+
+
+out:
 	return (0);
 }
 

Modified: stable/12/sys/arm/allwinner/axp81x.c
==============================================================================
--- stable/12/sys/arm/allwinner/axp81x.c	Mon Aug  5 15:56:44 2019	(r350591)
+++ stable/12/sys/arm/allwinner/axp81x.c	Mon Aug  5 16:36:11 2019	(r350592)
@@ -126,12 +126,16 @@ MALLOC_DEFINE(M_AXP8XX_REG, "AXP8xx regulator", "AXP8x
 #define	AXP_IRQSTAT5		0x4c
 #define	 AXP_IRQSTAT5_POKSIRQ	(1 << 4)
 #define	AXP_GPIO0_CTRL		0x90
+#define	AXP_GPIO0LDO_CTRL	0x91
 #define	AXP_GPIO1_CTRL		0x92
+#define	AXP_GPIO1LDO_CTRL	0x93
 #define	 AXP_GPIO_FUNC		(0x7 << 0)
 #define	 AXP_GPIO_FUNC_SHIFT	0
 #define	 AXP_GPIO_FUNC_DRVLO	0
 #define	 AXP_GPIO_FUNC_DRVHI	1
 #define	 AXP_GPIO_FUNC_INPUT	2
+#define	 AXP_GPIO_FUNC_LDO_ON	3
+#define	 AXP_GPIO_FUNC_LDO_OFF	4
 #define	AXP_GPIO_SIGBIT		0x94
 #define	AXP_GPIO_PD		0x97
 
@@ -166,6 +170,8 @@ struct axp8xx_regdef {
 	char			*supply_name;
 	uint8_t			enable_reg;
 	uint8_t			enable_mask;
+	uint8_t			enable_value;
+	uint8_t			disable_value;
 	uint8_t			voltage_reg;
 	int			voltage_min;
 	int			voltage_max;
@@ -197,6 +203,8 @@ enum axp8xx_reg_id {
 	AXP8XX_REG_ID_FLDO1,
 	AXP8XX_REG_ID_FLDO2,
 	AXP813_REG_ID_FLDO3,
+	AXP8XX_REG_ID_GPIO0_LDO,
+	AXP8XX_REG_ID_GPIO1_LDO,
 };
 
 static struct axp8xx_regdef axp803_regdefs[] = {
@@ -204,7 +212,8 @@ static struct axp8xx_regdef axp803_regdefs[] = {
 		.id = AXP803_REG_ID_DC1SW,
 		.name = "dc1sw",
 		.enable_reg = AXP_POWERCTL2,
-		.enable_mask = AXP_POWERCTL2_DC1SW,
+		.enable_mask = (uint8_t) AXP_POWERCTL2_DC1SW,
+		.enable_value = AXP_POWERCTL2_DC1SW,
 	},
 };
 
@@ -213,7 +222,8 @@ static struct axp8xx_regdef axp813_regdefs[] = {
 		.id = AXP813_REG_ID_DCDC7,
 		.name = "dcdc7",
 		.enable_reg = AXP_POWERCTL1,
-		.enable_mask = AXP_POWERCTL1_DCDC7,
+		.enable_mask = (uint8_t) AXP_POWERCTL1_DCDC7,
+		.enable_value = AXP_POWERCTL1_DCDC7,
 		.voltage_reg = AXP_VOLTCTL_DCDC7,
 		.voltage_min = 600,
 		.voltage_max = 1520,
@@ -229,7 +239,8 @@ static struct axp8xx_regdef axp8xx_common_regdefs[] = 
 		.id = AXP8XX_REG_ID_DCDC1,
 		.name = "dcdc1",
 		.enable_reg = AXP_POWERCTL1,
-		.enable_mask = AXP_POWERCTL1_DCDC1,
+		.enable_mask = (uint8_t) AXP_POWERCTL1_DCDC1,
+		.enable_value = AXP_POWERCTL1_DCDC1,
 		.voltage_reg = AXP_VOLTCTL_DCDC1,
 		.voltage_min = 1600,
 		.voltage_max = 3400,
@@ -240,7 +251,8 @@ static struct axp8xx_regdef axp8xx_common_regdefs[] = 
 		.id = AXP8XX_REG_ID_DCDC2,
 		.name = "dcdc2",
 		.enable_reg = AXP_POWERCTL1,
-		.enable_mask = AXP_POWERCTL1_DCDC2,
+		.enable_mask = (uint8_t) AXP_POWERCTL1_DCDC2,
+		.enable_value = AXP_POWERCTL1_DCDC2,
 		.voltage_reg = AXP_VOLTCTL_DCDC2,
 		.voltage_min = 500,
 		.voltage_max = 1300,
@@ -253,7 +265,8 @@ static struct axp8xx_regdef axp8xx_common_regdefs[] = 
 		.id = AXP8XX_REG_ID_DCDC3,
 		.name = "dcdc3",
 		.enable_reg = AXP_POWERCTL1,
-		.enable_mask = AXP_POWERCTL1_DCDC3,
+		.enable_mask = (uint8_t) AXP_POWERCTL1_DCDC3,
+		.enable_value = AXP_POWERCTL1_DCDC3,
 		.voltage_reg = AXP_VOLTCTL_DCDC3,
 		.voltage_min = 500,
 		.voltage_max = 1300,
@@ -266,7 +279,8 @@ static struct axp8xx_regdef axp8xx_common_regdefs[] = 
 		.id = AXP8XX_REG_ID_DCDC4,
 		.name = "dcdc4",
 		.enable_reg = AXP_POWERCTL1,
-		.enable_mask = AXP_POWERCTL1_DCDC4,
+		.enable_mask = (uint8_t) AXP_POWERCTL1_DCDC4,
+		.enable_value = AXP_POWERCTL1_DCDC4,
 		.voltage_reg = AXP_VOLTCTL_DCDC4,
 		.voltage_min = 500,
 		.voltage_max = 1300,
@@ -279,7 +293,8 @@ static struct axp8xx_regdef axp8xx_common_regdefs[] = 
 		.id = AXP8XX_REG_ID_DCDC5,
 		.name = "dcdc5",
 		.enable_reg = AXP_POWERCTL1,
-		.enable_mask = AXP_POWERCTL1_DCDC5,
+		.enable_mask = (uint8_t) AXP_POWERCTL1_DCDC5,
+		.enable_value = AXP_POWERCTL1_DCDC5,
 		.voltage_reg = AXP_VOLTCTL_DCDC5,
 		.voltage_min = 800,
 		.voltage_max = 1840,
@@ -292,7 +307,8 @@ static struct axp8xx_regdef axp8xx_common_regdefs[] = 
 		.id = AXP8XX_REG_ID_DCDC6,
 		.name = "dcdc6",
 		.enable_reg = AXP_POWERCTL1,
-		.enable_mask = AXP_POWERCTL1_DCDC6,
+		.enable_mask = (uint8_t) AXP_POWERCTL1_DCDC6,
+		.enable_value = AXP_POWERCTL1_DCDC6,
 		.voltage_reg = AXP_VOLTCTL_DCDC6,
 		.voltage_min = 600,
 		.voltage_max = 1520,
@@ -305,7 +321,8 @@ static struct axp8xx_regdef axp8xx_common_regdefs[] = 
 		.id = AXP8XX_REG_ID_DLDO1,
 		.name = "dldo1",
 		.enable_reg = AXP_POWERCTL2,
-		.enable_mask = AXP_POWERCTL2_DLDO1,
+		.enable_mask = (uint8_t) AXP_POWERCTL2_DLDO1,
+		.enable_value = AXP_POWERCTL2_DLDO1,
 		.voltage_reg = AXP_VOLTCTL_DLDO1,
 		.voltage_min = 700,
 		.voltage_max = 3300,
@@ -316,7 +333,8 @@ static struct axp8xx_regdef axp8xx_common_regdefs[] = 
 		.id = AXP8XX_REG_ID_DLDO2,
 		.name = "dldo2",
 		.enable_reg = AXP_POWERCTL2,
-		.enable_mask = AXP_POWERCTL2_DLDO2,
+		.enable_mask = (uint8_t) AXP_POWERCTL2_DLDO2,
+		.enable_value = AXP_POWERCTL2_DLDO2,
 		.voltage_reg = AXP_VOLTCTL_DLDO2,
 		.voltage_min = 700,
 		.voltage_max = 4200,
@@ -329,7 +347,8 @@ static struct axp8xx_regdef axp8xx_common_regdefs[] = 
 		.id = AXP8XX_REG_ID_DLDO3,
 		.name = "dldo3",
 		.enable_reg = AXP_POWERCTL2,
-		.enable_mask = AXP_POWERCTL2_DLDO3,
+		.enable_mask = (uint8_t) AXP_POWERCTL2_DLDO3,
+		.enable_value = AXP_POWERCTL2_DLDO3,
 		.voltage_reg = AXP_VOLTCTL_DLDO3,
 		.voltage_min = 700,
 		.voltage_max = 3300,
@@ -340,7 +359,8 @@ static struct axp8xx_regdef axp8xx_common_regdefs[] = 
 		.id = AXP8XX_REG_ID_DLDO4,
 		.name = "dldo4",
 		.enable_reg = AXP_POWERCTL2,
-		.enable_mask = AXP_POWERCTL2_DLDO4,
+		.enable_mask = (uint8_t) AXP_POWERCTL2_DLDO4,
+		.enable_value = AXP_POWERCTL2_DLDO4,
 		.voltage_reg = AXP_VOLTCTL_DLDO4,
 		.voltage_min = 700,
 		.voltage_max = 3300,
@@ -351,7 +371,8 @@ static struct axp8xx_regdef axp8xx_common_regdefs[] = 
 		.id = AXP8XX_REG_ID_ALDO1,
 		.name = "aldo1",
 		.enable_reg = AXP_POWERCTL3,
-		.enable_mask = AXP_POWERCTL3_ALDO1,
+		.enable_mask = (uint8_t) AXP_POWERCTL3_ALDO1,
+		.enable_value = AXP_POWERCTL3_ALDO1,
 		.voltage_min = 700,
 		.voltage_max = 3300,
 		.voltage_step1 = 100,
@@ -361,7 +382,8 @@ static struct axp8xx_regdef axp8xx_common_regdefs[] = 
 		.id = AXP8XX_REG_ID_ALDO2,
 		.name = "aldo2",
 		.enable_reg = AXP_POWERCTL3,
-		.enable_mask = AXP_POWERCTL3_ALDO2,
+		.enable_mask = (uint8_t) AXP_POWERCTL3_ALDO2,
+		.enable_value = AXP_POWERCTL3_ALDO2,
 		.voltage_min = 700,
 		.voltage_max = 3300,
 		.voltage_step1 = 100,
@@ -371,7 +393,8 @@ static struct axp8xx_regdef axp8xx_common_regdefs[] = 
 		.id = AXP8XX_REG_ID_ALDO3,
 		.name = "aldo3",
 		.enable_reg = AXP_POWERCTL3,
-		.enable_mask = AXP_POWERCTL3_ALDO3,
+		.enable_mask = (uint8_t) AXP_POWERCTL3_ALDO3,
+		.enable_value = AXP_POWERCTL3_ALDO3,
 		.voltage_min = 700,
 		.voltage_max = 3300,
 		.voltage_step1 = 100,
@@ -381,7 +404,8 @@ static struct axp8xx_regdef axp8xx_common_regdefs[] = 
 		.id = AXP8XX_REG_ID_ELDO1,
 		.name = "eldo1",
 		.enable_reg = AXP_POWERCTL2,
-		.enable_mask = AXP_POWERCTL2_ELDO1,
+		.enable_mask = (uint8_t) AXP_POWERCTL2_ELDO1,
+		.enable_value = AXP_POWERCTL2_ELDO1,
 		.voltage_min = 700,
 		.voltage_max = 1900,
 		.voltage_step1 = 50,
@@ -391,7 +415,8 @@ static struct axp8xx_regdef axp8xx_common_regdefs[] = 
 		.id = AXP8XX_REG_ID_ELDO2,
 		.name = "eldo2",
 		.enable_reg = AXP_POWERCTL2,
-		.enable_mask = AXP_POWERCTL2_ELDO2,
+		.enable_mask = (uint8_t) AXP_POWERCTL2_ELDO2,
+		.enable_value = AXP_POWERCTL2_ELDO2,
 		.voltage_min = 700,
 		.voltage_max = 1900,
 		.voltage_step1 = 50,
@@ -401,7 +426,8 @@ static struct axp8xx_regdef axp8xx_common_regdefs[] = 
 		.id = AXP8XX_REG_ID_ELDO3,
 		.name = "eldo3",
 		.enable_reg = AXP_POWERCTL2,
-		.enable_mask = AXP_POWERCTL2_ELDO3,
+		.enable_mask = (uint8_t) AXP_POWERCTL2_ELDO3,
+		.enable_value = AXP_POWERCTL2_ELDO3,
 		.voltage_min = 700,
 		.voltage_max = 1900,
 		.voltage_step1 = 50,
@@ -411,7 +437,8 @@ static struct axp8xx_regdef axp8xx_common_regdefs[] = 
 		.id = AXP8XX_REG_ID_FLDO1,
 		.name = "fldo1",
 		.enable_reg = AXP_POWERCTL3,
-		.enable_mask = AXP_POWERCTL3_FLDO1,
+		.enable_mask = (uint8_t) AXP_POWERCTL3_FLDO1,
+		.enable_value = AXP_POWERCTL3_FLDO1,
 		.voltage_min = 700,
 		.voltage_max = 1450,
 		.voltage_step1 = 50,
@@ -421,12 +448,39 @@ static struct axp8xx_regdef axp8xx_common_regdefs[] = 
 		.id = AXP8XX_REG_ID_FLDO2,
 		.name = "fldo2",
 		.enable_reg = AXP_POWERCTL3,
-		.enable_mask = AXP_POWERCTL3_FLDO2,
+		.enable_mask = (uint8_t) AXP_POWERCTL3_FLDO2,
+		.enable_value = AXP_POWERCTL3_FLDO2,
 		.voltage_min = 700,
 		.voltage_max = 1450,
 		.voltage_step1 = 50,
 		.voltage_nstep1 = 15,
 	},
+	{
+		.id = AXP8XX_REG_ID_GPIO0_LDO,
+		.name = "ldo-io0",
+		.enable_reg = AXP_GPIO0_CTRL,
+		.enable_mask = (uint8_t) AXP_GPIO_FUNC,
+		.enable_value = AXP_GPIO_FUNC_LDO_ON,
+		.disable_value = AXP_GPIO_FUNC_LDO_OFF,
+		.voltage_reg = AXP_GPIO0LDO_CTRL,
+		.voltage_min = 700,
+		.voltage_max = 3300,
+		.voltage_step1 = 100,
+		.voltage_nstep1 = 26,
+	},
+	{
+		.id = AXP8XX_REG_ID_GPIO1_LDO,
+		.name = "ldo-io1",
+		.enable_reg = AXP_GPIO1_CTRL,
+		.enable_mask = (uint8_t) AXP_GPIO_FUNC,
+		.enable_value = AXP_GPIO_FUNC_LDO_ON,
+		.disable_value = AXP_GPIO_FUNC_LDO_OFF,
+		.voltage_reg = AXP_GPIO1LDO_CTRL,
+		.voltage_min = 700,
+		.voltage_max = 3300,
+		.voltage_step1 = 100,
+		.voltage_nstep1 = 26,
+	},
 };
 
 struct axp8xx_softc;
@@ -520,10 +574,15 @@ axp8xx_regnode_enable(struct regnode *regnode, bool en
 		    sc->def->name);
 
 	axp8xx_read(sc->base_dev, sc->def->enable_reg, &val, 1);
+	val &= ~sc->def->enable_mask;
 	if (enable)
-		val |= sc->def->enable_mask;
-	else
-		val &= ~sc->def->enable_mask;
+		val |= sc->def->enable_value;
+	else {
+		if (sc->def->disable_value)
+			val |= sc->def->disable_value;
+		else
+			val &= ~sc->def->enable_value;
+	}
 	axp8xx_write(sc->base_dev, sc->def->enable_reg, val);
 
 	*udelay = 0;

Modified: stable/12/sys/conf/files
==============================================================================
--- stable/12/sys/conf/files	Mon Aug  5 15:56:44 2019	(r350591)
+++ stable/12/sys/conf/files	Mon Aug  5 16:36:11 2019	(r350592)
@@ -1756,6 +1756,8 @@ dev/extres/clk/clk_mux.c	optional ext_resources clk fd
 dev/extres/phy/phy.c		optional ext_resources phy fdt
 dev/extres/phy/phydev_if.m	optional ext_resources phy fdt
 dev/extres/phy/phynode_if.m	optional ext_resources phy fdt
+dev/extres/phy/phy_usb.c	optional ext_resources phy fdt
+dev/extres/phy/phynode_usb_if.m	optional ext_resources phy fdt
 dev/extres/hwreset/hwreset.c	optional ext_resources hwreset fdt
 dev/extres/hwreset/hwreset_if.m	optional ext_resources hwreset fdt
 dev/extres/nvmem/nvmem.c	optional ext_resources nvmem fdt

Modified: stable/12/sys/dev/extres/phy/phy.c
==============================================================================
--- stable/12/sys/dev/extres/phy/phy.c	Mon Aug  5 15:56:44 2019	(r350591)
+++ stable/12/sys/dev/extres/phy/phy.c	Mon Aug  5 16:36:11 2019	(r350592)
@@ -43,18 +43,12 @@ __FBSDID("$FreeBSD$");
 #endif
 
 #include  <dev/extres/phy/phy.h>
+#include  <dev/extres/phy/phy_internal.h>
 
 #include "phydev_if.h"
 
 MALLOC_DEFINE(M_PHY, "phy", "Phy framework");
 
-/* Forward declarations. */
-struct phy;
-struct phynode;
-
-typedef TAILQ_HEAD(phynode_list, phynode) phynode_list_t;
-typedef TAILQ_HEAD(phy_list, phy) phy_list_t;
-
 /* Default phy methods. */
 static int phynode_method_init(struct phynode *phynode);
 static int phynode_method_enable(struct phynode *phynode, bool disable);
@@ -73,52 +67,9 @@ static phynode_method_t phynode_methods[] = {
 };
 DEFINE_CLASS_0(phynode, phynode_class, phynode_methods, 0);
 
-/*
- * Phy node
- */
-struct phynode {
-	KOBJ_FIELDS;
-
-	TAILQ_ENTRY(phynode)	phylist_link;	/* Global list entry */
-	phy_list_t		consumers_list;	/* Consumers list */
-
-
-	/* Details of this device. */
-	const char		*name;		/* Globally unique name */
-
-	device_t		pdev;		/* Producer device_t */
-	void			*softc;		/* Producer softc */
-	intptr_t		id;		/* Per producer unique id */
-#ifdef FDT
-	 phandle_t		ofw_node;	/* OFW node of phy */
-#endif
-	struct sx		lock;		/* Lock for this phy */
-	int			ref_cnt;	/* Reference counter */
-	int			enable_cnt;	/* Enabled counter */
-};
-
-struct phy {
-	device_t		cdev;		/* consumer device*/
-	struct phynode		*phynode;
-	TAILQ_ENTRY(phy)	link;		/* Consumers list entry */
-
-	int			enable_cnt;
-};
-
 static phynode_list_t phynode_list = TAILQ_HEAD_INITIALIZER(phynode_list);
 
-static struct sx		phynode_topo_lock;
 SX_SYSINIT(phy_topology, &phynode_topo_lock, "Phy topology lock");
-
-#define PHY_TOPO_SLOCK()	sx_slock(&phynode_topo_lock)
-#define PHY_TOPO_XLOCK()	sx_xlock(&phynode_topo_lock)
-#define PHY_TOPO_UNLOCK()	sx_unlock(&phynode_topo_lock)
-#define PHY_TOPO_ASSERT()	sx_assert(&phynode_topo_lock, SA_LOCKED)
-#define PHY_TOPO_XASSERT() 	sx_assert(&phynode_topo_lock, SA_XLOCKED)
-
-#define PHYNODE_SLOCK(_sc)	sx_slock(&((_sc)->lock))
-#define PHYNODE_XLOCK(_sc)	sx_xlock(&((_sc)->lock))
-#define PHYNODE_UNLOCK(_sc)	sx_unlock(&((_sc)->lock))
 
 /* ----------------------------------------------------------------------------
  *

Copied: stable/12/sys/dev/extres/phy/phy_internal.h (from r340848, head/sys/dev/extres/phy/phy_internal.h)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ stable/12/sys/dev/extres/phy/phy_internal.h	Mon Aug  5 16:36:11 2019	(r350592, copy of r340848, head/sys/dev/extres/phy/phy_internal.h)
@@ -0,0 +1,83 @@
+/*-
+ * Copyright 2018 Michal Meloun <mmel at FreeBSD.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#ifndef DEV_EXTRES_PHY_INTERNAL_H
+#define DEV_EXTRES_PHY_INTERNAL_H
+
+/* Forward declarations. */
+struct phy;
+struct phynode;
+
+typedef TAILQ_HEAD(phynode_list, phynode) phynode_list_t;
+typedef TAILQ_HEAD(phy_list, phy) phy_list_t;
+
+/*
+ * Phy node
+ */
+struct phynode {
+	KOBJ_FIELDS;
+
+	TAILQ_ENTRY(phynode)	phylist_link;	/* Global list entry */
+	phy_list_t		consumers_list;	/* Consumers list */
+
+
+	/* Details of this device. */
+	const char		*name;		/* Globally unique name */
+
+	device_t		pdev;		/* Producer device_t */
+	void			*softc;		/* Producer softc */
+	intptr_t		id;		/* Per producer unique id */
+#ifdef FDT
+	 phandle_t		ofw_node;	/* OFW node of phy */
+#endif
+	struct sx		lock;		/* Lock for this phy */
+	int			ref_cnt;	/* Reference counter */
+	int			enable_cnt;	/* Enabled counter */
+};
+
+struct phy {
+	device_t		cdev;		/* consumer device*/
+	struct phynode		*phynode;
+	TAILQ_ENTRY(phy)	link;		/* Consumers list entry */
+
+	int			enable_cnt;
+};
+
+
+#define PHY_TOPO_SLOCK()	sx_slock(&phynode_topo_lock)
+#define PHY_TOPO_XLOCK()	sx_xlock(&phynode_topo_lock)
+#define PHY_TOPO_UNLOCK()	sx_unlock(&phynode_topo_lock)
+#define PHY_TOPO_ASSERT()	sx_assert(&phynode_topo_lock, SA_LOCKED)
+#define PHY_TOPO_XASSERT() 	sx_assert(&phynode_topo_lock, SA_XLOCKED)
+
+#define PHYNODE_SLOCK(_sc)	sx_slock(&((_sc)->lock))
+#define PHYNODE_XLOCK(_sc)	sx_xlock(&((_sc)->lock))
+#define PHYNODE_UNLOCK(_sc)	sx_unlock(&((_sc)->lock))
+
+struct sx		phynode_topo_lock;
+
+#endif /* DEV_EXTRES_PHY_INTERNAL_H */

Copied: stable/12/sys/dev/extres/phy/phy_usb.c (from r340848, head/sys/dev/extres/phy/phy_usb.c)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ stable/12/sys/dev/extres/phy/phy_usb.c	Mon Aug  5 16:36:11 2019	(r350592, copy of r340848, head/sys/dev/extres/phy/phy_usb.c)
@@ -0,0 +1,149 @@
+/*-
+ * Copyright 2018 Michal Meloun <mmel at FreeBSD.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/param.h>
+#include <sys/kernel.h>
+#include <sys/lock.h>
+#include <sys/queue.h>
+#include <sys/sx.h>
+
+
+#include <dev/extres/phy/phy_usb.h>
+#include <dev/extres/phy/phy_internal.h>
+
+#include "phydev_if.h"
+
+/*
+ * USB phy controller methods.
+ */
+static phynode_usb_method_t phynode_usb_methods[] = {
+
+	PHYNODEUSBMETHOD_END
+};
+DEFINE_CLASS_1(phynode_usb, phynode_usb_class, phynode_usb_methods,
+    0, phynode_class);
+
+/*
+ * Create and initialize phy object, but do not register it.
+ */
+struct phynode *
+phynode_usb_create(device_t pdev, phynode_class_t phynode_class,
+    struct phynode_usb_init_def *def)
+
+{
+	struct phynode *phynode;
+	struct phynode_usb_sc *sc;
+
+	phynode = phynode_create(pdev, phynode_class, &def->phynode_init_def);
+	if (phynode == NULL)
+		return (NULL);
+	sc = phynode_get_softc(phynode);
+	sc->std_param = def->std_param;
+	return (phynode);
+}
+
+struct phynode
+*phynode_usb_register(struct phynode *phynode)
+{
+
+	return (phynode_register(phynode));
+}
+
+/* --------------------------------------------------------------------------
+ *
+ * Real consumers executive
+ *
+ */
+
+/*
+ * Set USB phy mode. (PHY_USB_MODE_*)
+ */
+int
+phynode_usb_set_mode(struct phynode *phynode, int usb_mode)
+{
+	int rv;
+
+	PHY_TOPO_ASSERT();
+
+	PHYNODE_XLOCK(phynode);
+	rv = PHYNODE_USB_SET_MODE(phynode, usb_mode);
+	PHYNODE_UNLOCK(phynode);
+	return (rv);
+}
+
+/*
+ * Get USB phy mode. (PHY_USB_MODE_*)
+ */
+int
+phynode_usb_get_mode(struct phynode *phynode, int *usb_mode)
+{
+	int rv;
+
+	PHY_TOPO_ASSERT();
+
+	PHYNODE_XLOCK(phynode);
+	rv = PHYNODE_USB_GET_MODE(phynode, usb_mode);
+	PHYNODE_UNLOCK(phynode);
+	return (rv);
+}
+
+ /* --------------------------------------------------------------------------
+ *
+ * USB phy consumers interface.
+ *
+ */
+int phy_usb_set_mode(phy_t phy, int usb_mode)
+{
+	int rv;
+	struct phynode *phynode;
+
+	phynode = phy->phynode;
+	KASSERT(phynode->ref_cnt > 0,
+	   ("Attempt to access unreferenced phy.\n"));
+
+	PHY_TOPO_SLOCK();
+	rv = phynode_usb_set_mode(phynode, usb_mode);
+	PHY_TOPO_UNLOCK();
+	return (rv);
+}
+
+int phy_usb_get_mode(phy_t phy, int *usb_mode)
+{
+	int rv;
+	struct phynode *phynode;
+
+	phynode = phy->phynode;
+	KASSERT(phynode->ref_cnt > 0,
+	   ("Attempt to access unreferenced phy.\n"));
+
+	PHY_TOPO_SLOCK();
+	rv = phynode_usb_get_mode(phynode, usb_mode);
+	PHY_TOPO_UNLOCK();
+	return (rv);
+}

Copied: stable/12/sys/dev/extres/phy/phy_usb.h (from r340848, head/sys/dev/extres/phy/phy_usb.h)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ stable/12/sys/dev/extres/phy/phy_usb.h	Mon Aug  5 16:36:11 2019	(r350592, copy of r340848, head/sys/dev/extres/phy/phy_usb.h)
@@ -0,0 +1,85 @@
+/*-
+ * Copyright 2018 Michal Meloun <mmel at FreeBSD.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _DEV_EXTRES_PHY_USB_H_
+#define _DEV_EXTRES_PHY_USB_H_
+
+#include <dev/extres/phy/phy.h>
+#include "phynode_usb_if.h"
+
+#define	PHY_USB_MODE_UNKNOWN	0
+#define	PHY_USB_MODE_HOST	1
+#define	PHY_USB_MODE_OTG	2
+#define	PHY_USB_MODE_DEVICE	3
+
+/* Standard USB phy parameters. */
+struct phynode_usb_std_param {
+	int	usb_mode;
+};
+
+struct phynode_usb_sc {
+   struct phynode_usb_std_param		std_param;
+};
+
+/* Initialization parameters. */
+struct phynode_usb_init_def {
+	struct phynode_init_def		phynode_init_def;
+	struct phynode_usb_std_param	std_param; /* Standard parameters */
+};
+
+
+/*
+ * Shorthands for constructing method tables.
+ */
+#define	PHYNODEUSBMETHOD	KOBJMETHOD
+#define	PHYNODEUSBMETHOD_END	KOBJMETHOD_END
+#define phynode_usb_method_t	kobj_method_t
+#define phynode_usb_class_t	kobj_class_t
+DECLARE_CLASS(phynode_usb_class);
+
+struct phynode *phynode_usb_create(device_t pdev, phynode_class_t phynode_class,
+    struct phynode_usb_init_def *def);
+struct phynode *phynode_usb_register(struct phynode *phynode);
+
+#if 0
+/* XXX to be implemented */
+#ifdef FDT
+int phynode_usb_parse_ofw_stdparam(device_t dev, phandle_t node,
+    struct phynode_usb_init_def *def);
+#endif
+#endif
+
+/* Phynode functions. */
+int phynode_usb_set_mode(struct phynode *phynode, int usb_mode);
+int phynode_usb_get_mode(struct phynode *phynode, int *usb_mode);
+
+/* Consumer functions. */
+int phy_usb_set_mode(phy_t phy, int usb_mode);
+int phy_usb_get_mode(phy_t phy, int *usb_mode);
+
+#endif /*_DEV_EXTRES_PHY_USB_H_*/

Copied: stable/12/sys/dev/extres/phy/phynode_usb_if.m (from r340848, head/sys/dev/extres/phy/phynode_usb_if.m)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ stable/12/sys/dev/extres/phy/phynode_usb_if.m	Mon Aug  5 16:36:11 2019	(r350592, copy of r340848, head/sys/dev/extres/phy/phynode_usb_if.m)
@@ -0,0 +1,51 @@
+#-
+# Copyright 2018 Michal Meloun <mmel at FreeBSD.org>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# $FreeBSD$
+#
+

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***


More information about the svn-src-all mailing list