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-stable
mailing list