fix emmc nano-pc-t4 (#3557)
* fix emmc nano-pc-t4 * fix node and del not used patch
This commit is contained in:
parent
2b06c6ca0b
commit
03ef96715e
@ -1,6 +1,6 @@
|
||||
# Rockchip RK3399 hexa core 4GB RAM SoC GBE USB3 USB-C WiFi/BT eMMC NVMe
|
||||
BOARD_NAME="NanoPC T4"
|
||||
BOARDFAMILY="rk3399"
|
||||
BOARDFAMILY="media"
|
||||
BOOTCONFIG="nanopc-t4-rk3399_defconfig"
|
||||
KERNEL_TARGET="legacy,current,edge"
|
||||
FULL_DESKTOP="yes"
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
#
|
||||
# Automatically generated file; DO NOT EDIT.
|
||||
# Linux/arm64 5.15.25 Kernel Configuration
|
||||
# Linux/arm64 5.15.30 Kernel Configuration
|
||||
#
|
||||
CONFIG_CC_VERSION_TEXT="aarch64-linux-gnu-gcc (GNU Toolchain for the A-profile Architecture 8.3-2019.03 (arm-rel-8.36)) 8.3.0"
|
||||
CONFIG_CC_IS_GCC=y
|
||||
@ -410,7 +410,6 @@ CONFIG_HZ=250
|
||||
CONFIG_SCHED_HRTICK=y
|
||||
CONFIG_ARCH_SPARSEMEM_ENABLE=y
|
||||
CONFIG_HW_PERF_EVENTS=y
|
||||
CONFIG_ARCH_HAS_FILTER_PGPROT=y
|
||||
CONFIG_PARAVIRT=y
|
||||
# CONFIG_PARAVIRT_TIME_ACCOUNTING is not set
|
||||
CONFIG_KEXEC=y
|
||||
@ -422,6 +421,7 @@ CONFIG_XEN_DOM0=y
|
||||
CONFIG_XEN=y
|
||||
CONFIG_FORCE_MAX_ZONEORDER=11
|
||||
CONFIG_UNMAP_KERNEL_AT_EL0=y
|
||||
CONFIG_MITIGATE_SPECTRE_BRANCH_HISTORY=y
|
||||
CONFIG_RODATA_FULL_DEFAULT_ENABLED=y
|
||||
# CONFIG_ARM64_SW_TTBR0_PAN is not set
|
||||
CONFIG_ARM64_TAGGED_ADDR_ABI=y
|
||||
@ -2403,7 +2403,6 @@ CONFIG_OF_KOBJ=y
|
||||
CONFIG_OF_DYNAMIC=y
|
||||
CONFIG_OF_ADDRESS=y
|
||||
CONFIG_OF_IRQ=y
|
||||
CONFIG_OF_NET=y
|
||||
CONFIG_OF_RESERVED_MEM=y
|
||||
CONFIG_OF_RESOLVE=y
|
||||
CONFIG_OF_OVERLAY=y
|
||||
@ -3607,6 +3606,7 @@ CONFIG_RTL8723_COMMON=m
|
||||
CONFIG_RTLBTCOEXIST=m
|
||||
CONFIG_RTL8XXXU=m
|
||||
CONFIG_RTL8XXXU_UNTESTED=y
|
||||
CONFIG_RTL8723CS=m
|
||||
CONFIG_RTW88=m
|
||||
CONFIG_RTW88_CORE=m
|
||||
CONFIG_RTW88_PCI=m
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
#
|
||||
# Automatically generated file; DO NOT EDIT.
|
||||
# Linux/arm64 5.16.12 Kernel Configuration
|
||||
# Linux/arm64 5.16.16 Kernel Configuration
|
||||
#
|
||||
CONFIG_CC_VERSION_TEXT="aarch64-linux-gnu-gcc (GNU Toolchain for the A-profile Architecture 8.3-2019.03 (arm-rel-8.36)) 8.3.0"
|
||||
CONFIG_CC_IS_GCC=y
|
||||
@ -376,6 +376,7 @@ CONFIG_ARM64_ERRATUM_1463225=y
|
||||
CONFIG_ARM64_ERRATUM_1542419=y
|
||||
CONFIG_ARM64_ERRATUM_1508412=y
|
||||
CONFIG_ARM64_ERRATUM_2051678=y
|
||||
# CONFIG_ARM64_ERRATUM_2077057 is not set
|
||||
CONFIG_ARM64_WORKAROUND_TSB_FLUSH_FAILURE=y
|
||||
CONFIG_ARM64_ERRATUM_2054223=y
|
||||
CONFIG_ARM64_ERRATUM_2067961=y
|
||||
@ -424,7 +425,6 @@ CONFIG_HZ=250
|
||||
CONFIG_SCHED_HRTICK=y
|
||||
CONFIG_ARCH_SPARSEMEM_ENABLE=y
|
||||
CONFIG_HW_PERF_EVENTS=y
|
||||
CONFIG_ARCH_HAS_FILTER_PGPROT=y
|
||||
CONFIG_PARAVIRT=y
|
||||
CONFIG_PARAVIRT_TIME_ACCOUNTING=y
|
||||
CONFIG_KEXEC=y
|
||||
@ -436,6 +436,7 @@ CONFIG_XEN_DOM0=y
|
||||
CONFIG_XEN=y
|
||||
CONFIG_FORCE_MAX_ZONEORDER=11
|
||||
CONFIG_UNMAP_KERNEL_AT_EL0=y
|
||||
CONFIG_MITIGATE_SPECTRE_BRANCH_HISTORY=y
|
||||
CONFIG_RODATA_FULL_DEFAULT_ENABLED=y
|
||||
# CONFIG_ARM64_SW_TTBR0_PAN is not set
|
||||
CONFIG_ARM64_TAGGED_ADDR_ABI=y
|
||||
@ -1939,7 +1940,7 @@ CONFIG_LIB80211=m
|
||||
CONFIG_LIB80211_CRYPT_WEP=m
|
||||
CONFIG_LIB80211_CRYPT_CCMP=m
|
||||
CONFIG_LIB80211_CRYPT_TKIP=m
|
||||
CONFIG_LIB80211_DEBUG=y
|
||||
# CONFIG_LIB80211_DEBUG is not set
|
||||
CONFIG_MAC80211=m
|
||||
CONFIG_MAC80211_HAS_RC=y
|
||||
CONFIG_MAC80211_RC_MINSTREL=y
|
||||
|
||||
@ -24,11 +24,19 @@ case $BRANCH in
|
||||
EXTRAWIFI="no"
|
||||
WIREGUARD="no"
|
||||
else
|
||||
KERNELSOURCE='https://github.com/ayufan-rock64/linux-kernel'
|
||||
KERNELBRANCH='tag:4.4.202-1237-rockchip-ayufan'
|
||||
KERNELPATCHDIR='rockchip64-'$BRANCH
|
||||
LINUXFAMILY=rockchip64
|
||||
LINUXCONFIG='linux-rockchip64-'$BRANCH
|
||||
if [[ $BOARD == nanopct4 ]]; then
|
||||
KERNELSOURCE='https://github.com/friendlyarm/kernel-rockchip'
|
||||
KERNELBRANCH='branch:nanopi4-linux-v4.4.y'
|
||||
KERNELPATCHDIR='rk3399-'$BRANCH
|
||||
LINUXFAMILY=rk3399
|
||||
LINUXCONFIG='linux-rk3399-'$BRANCH
|
||||
else
|
||||
KERNELSOURCE='https://github.com/ayufan-rock64/linux-kernel'
|
||||
KERNELBRANCH='tag:4.4.202-1237-rockchip-ayufan'
|
||||
KERNELPATCHDIR='rockchip64-'$BRANCH
|
||||
LINUXFAMILY=rockchip64
|
||||
LINUXCONFIG='linux-rockchip64-'$BRANCH
|
||||
fi
|
||||
fi
|
||||
;;
|
||||
|
||||
|
||||
@ -85,10 +85,14 @@ compilation_prepare()
|
||||
fi
|
||||
|
||||
if [[ "${version}" == "4.4."* ]] && \
|
||||
[[ "$LINUXFAMILY" == rockchip64 || "$LINUXFAMILY" == station* ]]; then
|
||||
[[ "$LINUXFAMILY" == rockchip64 || "$LINUXFAMILY" == media* ]]; then
|
||||
display_alert "Adjusting" "packaging" "info"
|
||||
cd "$kerneldir" || exit
|
||||
process_patch_file "${SRC}/patch/misc/general-packaging-4.4.y-rockchip64.patch" "applying"
|
||||
if [[ $BOARD == nanopct4 ]]; then
|
||||
process_patch_file "${SRC}/patch/misc/general-packaging-4.4.y-rk3399.patch" "applying"
|
||||
else
|
||||
process_patch_file "${SRC}/patch/misc/general-packaging-4.4.y-rockchip64.patch" "applying"
|
||||
fi
|
||||
fi
|
||||
|
||||
if [[ "${version}" == "4.4."* ]] && [[ "$LINUXFAMILY" == rockchip || "$LINUXFAMILY" == rk322x ]]; then
|
||||
|
||||
@ -14,7 +14,7 @@ new file mode 100644
|
||||
index 000000000..fae17f416
|
||||
--- /dev/null
|
||||
+++ b/arch/arm64/boot/dts/rockchip/rk3399-kobol-helios64.dts
|
||||
@@ -0,0 +1,1150 @@
|
||||
@@ -0,0 +1,1154 @@
|
||||
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
||||
+/*
|
||||
+ * Copyright (c) 2020 Aditya Prayoga (aditya@kobol.io)
|
||||
@ -981,8 +981,12 @@ index 000000000..fae17f416
|
||||
+};
|
||||
+
|
||||
+&sdhci {
|
||||
+ assigned-clock-rates = <150000000>;
|
||||
+ bus-width = <8>;
|
||||
+ mmc-hs200-1_8v;
|
||||
+ // hs400 is broken on Helios64 since 5.10.60
|
||||
+ // mmc-hs400-1_8v;
|
||||
+ // mmc-hs400-enhanced-strobe;
|
||||
+ supports-emmc;
|
||||
+ non-removable;
|
||||
+ disable-wp;
|
||||
|
||||
771
patch/kernel/archive/media-5.15/add-board-tinker-board-2.patch
Normal file
771
patch/kernel/archive/media-5.15/add-board-tinker-board-2.patch
Normal file
@ -0,0 +1,771 @@
|
||||
From 98250da85549f89a889424926d3552f4abd09a1f Mon Sep 17 00:00:00 2001
|
||||
From: tonymac32 <tonymckahan@gmail.com>
|
||||
Date: Tue, 2 Mar 2021 15:50:01 -0500
|
||||
Subject: [PATCH] Patching something
|
||||
|
||||
Signed-off-by: tonymac32 <tonymckahan@gmail.com>
|
||||
---
|
||||
.../boot/dts/rockchip/rk3399-tinker-2.dts | 613 ++++++++++++++++++
|
||||
1 files changed, 613 insertions(+)
|
||||
create mode 100644 arch/arm64/boot/dts/rockchip/rk3399-tinker-2.dts
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/rockchip/rk3399-tinker-2.dts b/arch/arm64/boot/dts/rockchip/rk3399-tinker-2.dts
|
||||
new file mode 100644
|
||||
index 000000000..dc337bee0
|
||||
--- /dev/null
|
||||
+++ b/arch/arm64/boot/dts/rockchip/rk3399-tinker-2.dts
|
||||
@@ -0,0 +1,751 @@
|
||||
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
||||
+/*
|
||||
+ * Copyright (c) 2016 Fuzhou Rockchip Electronics Co., Ltd
|
||||
+ * Copyright (c) 2021 Thomas McKahan
|
||||
+ */
|
||||
+
|
||||
+/dts-v1/;
|
||||
+#include <dt-bindings/pwm/pwm.h>
|
||||
+#include <dt-bindings/usb/pd.h>
|
||||
+#include "rk3399.dtsi"
|
||||
+#include "rk3399-op1-opp.dtsi"
|
||||
+
|
||||
+/ {
|
||||
+ model = "Asus Tinker Board 2";
|
||||
+ compatible = "rockchip,rk3399-evb", "rockchip,rk3399";
|
||||
+
|
||||
+ chosen {
|
||||
+ stdout-path = "serial2:1500000n8";
|
||||
+ };
|
||||
+
|
||||
+ board_info: board-info {
|
||||
+ compatible = "board-info";
|
||||
+
|
||||
+ hw-id0 = <&gpio4 RK_PA7 GPIO_ACTIVE_HIGH>;
|
||||
+ hw-id1 = <&gpio4 RK_PA6 GPIO_ACTIVE_HIGH>;
|
||||
+ hw-id2 = <&gpio4 RK_PA5 GPIO_ACTIVE_HIGH>;
|
||||
+
|
||||
+ pid-id0 = <&gpio2 RK_PA5 GPIO_ACTIVE_HIGH>;
|
||||
+ pid-id1 = <&gpio2 RK_PA3 GPIO_ACTIVE_HIGH>;
|
||||
+ pid-id2 = <&gpio2 RK_PA2 GPIO_ACTIVE_HIGH>;
|
||||
+
|
||||
+ ddr-id1 = <&gpio4 RK_PA4 GPIO_ACTIVE_HIGH>;
|
||||
+ ddr-id2 = <&gpio4 RK_PA0 GPIO_ACTIVE_HIGH>;
|
||||
+
|
||||
+ pmic-reset = <&gpio1 RK_PA6 GPIO_ACTIVE_HIGH>;
|
||||
+ };
|
||||
+
|
||||
+ clkin_gmac: external-gmac-clock {
|
||||
+ compatible = "fixed-clock";
|
||||
+ clock-frequency = <125000000>;
|
||||
+ clock-output-names = "clkin_gmac";
|
||||
+ #clock-cells = <0>;
|
||||
+ };
|
||||
+
|
||||
+ gpio-leds {
|
||||
+ compatible = "gpio-leds";
|
||||
+
|
||||
+ pwr-led {
|
||||
+ gpios = <&gpio0 RK_PA4 GPIO_ACTIVE_HIGH>;
|
||||
+ linux,default-trigger = "default-on";
|
||||
+ retain-state-suspended = <1>;
|
||||
+ };
|
||||
+
|
||||
+ act-led {
|
||||
+ gpios = <&gpio0 RK_PA3 GPIO_ACTIVE_HIGH>;
|
||||
+ linux,default-trigger="mmc0";
|
||||
+ };
|
||||
+
|
||||
+ rsv-led {
|
||||
+ gpios = <&gpio0 RK_PB2 GPIO_ACTIVE_HIGH>;
|
||||
+ linux,default-trigger="heartbeat";
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ vcc_lcd: vcc-lcd {
|
||||
+ compatible = "regulator-fixed";
|
||||
+ regulator-name = "vcc_lcd";
|
||||
+ gpio = <&gpio4 30 GPIO_ACTIVE_HIGH>;
|
||||
+ startup-delay-us = <20000>;
|
||||
+ enable-active-high;
|
||||
+ regulator-min-microvolt = <3300000>;
|
||||
+ regulator-max-microvolt = <3300000>;
|
||||
+ regulator-boot-on;
|
||||
+ vin-supply = <&vcc5v0_sys>;
|
||||
+ };
|
||||
+
|
||||
+ vcc3v3_sys: vcc3v3-sys {
|
||||
+ compatible = "regulator-fixed";
|
||||
+ regulator-name = "vcc3v3_sys";
|
||||
+ regulator-always-on;
|
||||
+ regulator-boot-on;
|
||||
+ regulator-min-microvolt = <3300000>;
|
||||
+ regulator-max-microvolt = <3300000>;
|
||||
+ };
|
||||
+
|
||||
+ vcc5v0_host: vcc5v0-host-regulator {
|
||||
+ compatible = "regulator-fixed";
|
||||
+ enable-active-high;
|
||||
+ gpio = <&gpio4 RK_PD1 GPIO_ACTIVE_HIGH>;
|
||||
+ pinctrl-names = "default";
|
||||
+ pinctrl-0 = <&vcc5v0_host_en>;
|
||||
+ regulator-name = "vcc5v0_host";
|
||||
+ vin-supply = <&vcc5v0_sys>;
|
||||
+ };
|
||||
+
|
||||
+ vcc5v0_sys: vcc5v0-sys {
|
||||
+ compatible = "regulator-fixed";
|
||||
+ regulator-name = "vcc5v0_sys";
|
||||
+ regulator-always-on;
|
||||
+ regulator-boot-on;
|
||||
+ regulator-min-microvolt = <5000000>;
|
||||
+ regulator-max-microvolt = <5000000>;
|
||||
+ };
|
||||
+
|
||||
+ vcc_phy: vcc-phy-regulator {
|
||||
+ compatible = "regulator-fixed";
|
||||
+ regulator-name = "vcc_phy";
|
||||
+ regulator-always-on;
|
||||
+ regulator-boot-on;
|
||||
+ };
|
||||
+
|
||||
+ vbus_typec: vbus-5vout {
|
||||
+ compatible = "regulator-fixed";
|
||||
+ enable-active-high;
|
||||
+ gpio = <&gpio1 RK_PA3 GPIO_ACTIVE_HIGH>;
|
||||
+ pinctrl-names = "default";
|
||||
+ pinctrl-0 = <&vcc5v0_typec0_en_pin>;
|
||||
+ regulator-name = "vbus_5vout";
|
||||
+ regulator-min-microvolt = <5000000>;
|
||||
+ regulator-max-microvolt = <5000000>;
|
||||
+ vin-supply = <&vcc5v0_sys>;
|
||||
+
|
||||
+ regulator-state-mem {
|
||||
+ regulator-off-in-suspend;
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ vdd_log: vdd-log {
|
||||
+ compatible = "pwm-regulator";
|
||||
+ pwms = <&pwm2 0 25000 1>;
|
||||
+ regulator-name = "vdd_log";
|
||||
+ regulator-min-microvolt = <800000>;
|
||||
+ regulator-max-microvolt = <1400000>;
|
||||
+ regulator-always-on;
|
||||
+ regulator-boot-on;
|
||||
+
|
||||
+ /* for rockchip boot on */
|
||||
+ rockchip,pwm_id= <2>;
|
||||
+ rockchip,pwm_voltage = <900000>;
|
||||
+ };
|
||||
+
|
||||
+ xin32k: xin32k {
|
||||
+ compatible = "fixed-clock";
|
||||
+ clock-frequency = <32768>;
|
||||
+ clock-output-names = "xin32k";
|
||||
+ #clock-cells = <0>;
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&cdn_dp {
|
||||
+ status = "okay";
|
||||
+ extcon = <&fusb0>;
|
||||
+};
|
||||
+
|
||||
+&cpu_l0 {
|
||||
+ cpu-supply = <&vdd_cpu_l>;
|
||||
+};
|
||||
+
|
||||
+&cpu_l1 {
|
||||
+ cpu-supply = <&vdd_cpu_l>;
|
||||
+};
|
||||
+
|
||||
+&cpu_l2 {
|
||||
+ cpu-supply = <&vdd_cpu_l>;
|
||||
+};
|
||||
+
|
||||
+&cpu_l3 {
|
||||
+ cpu-supply = <&vdd_cpu_l>;
|
||||
+};
|
||||
+
|
||||
+&cpu_b0 {
|
||||
+ cpu-supply = <&vdd_cpu_b>;
|
||||
+};
|
||||
+
|
||||
+&cpu_b1 {
|
||||
+ cpu-supply = <&vdd_cpu_b>;
|
||||
+};
|
||||
+
|
||||
+&emmc_phy {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&gmac {
|
||||
+ assigned-clocks = <&cru SCLK_RMII_SRC>;
|
||||
+ assigned-clock-parents = <&cru SCLK_MAC>;
|
||||
+ clock_in_out = "input";
|
||||
+ assigned-clock-rates = <125000000>;
|
||||
+ phy-supply = <&vcc_phy>;
|
||||
+ phy-mode = "rgmii";
|
||||
+ pinctrl-names = "default";
|
||||
+ pinctrl-0 = <&rgmii_pins>;
|
||||
+ snps,reset-gpio = <&gpio3 15 GPIO_ACTIVE_LOW>;
|
||||
+ snps,reset-active-low;
|
||||
+ snps,reset-delays-us = <0 16000 72000>;
|
||||
+ tx_delay = <0x25>;
|
||||
+ rx_delay = <0x20>;
|
||||
+ wakeup-enable = "0";
|
||||
+ status = "okay";
|
||||
+};
|
||||
+&gpu {
|
||||
+ mali-supply = <&vdd_gpu>;
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&hdmi {
|
||||
+ ddc-i2c-bus = <&i2c3>;
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&hdmi_sound {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&i2c0 {
|
||||
+ status = "okay";
|
||||
+
|
||||
+ rk808: pmic@1b {
|
||||
+ compatible = "rockchip,rk808";
|
||||
+ reg = <0x1b>;
|
||||
+ interrupt-parent = <&gpio1>;
|
||||
+ interrupts = <18 IRQ_TYPE_LEVEL_LOW>;
|
||||
+ pinctrl-names = "default";
|
||||
+ pinctrl-0 = <&pmic_int_l>;
|
||||
+ rockchip,system-power-controller;
|
||||
+ wakeup-source;
|
||||
+ #clock-cells = <1>;
|
||||
+ clock-output-names = "rk808-clkout1", "rk808-clkout2";
|
||||
+
|
||||
+ vcc1-supply = <&vcc3v3_sys>;
|
||||
+ vcc2-supply = <&vcc3v3_sys>;
|
||||
+ vcc3-supply = <&vcc3v3_sys>;
|
||||
+ vcc4-supply = <&vcc3v3_sys>;
|
||||
+ vcc6-supply = <&vcc3v3_sys>;
|
||||
+ vcc7-supply = <&vcc3v3_sys>;
|
||||
+ vcc8-supply = <&vcc3v3_sys>;
|
||||
+ vcc9-supply = <&vcc3v3_sys>;
|
||||
+ vcc10-supply = <&vcc3v3_sys>;
|
||||
+ vcc11-supply = <&vcc3v3_sys>;
|
||||
+ vcc12-supply = <&vcc3v3_sys>;
|
||||
+ vddio-supply = <&vcc1v8_pmu>;
|
||||
+
|
||||
+ regulators {
|
||||
+ vdd_center: DCDC_REG1 {
|
||||
+ regulator-name = "vdd_center";
|
||||
+ regulator-min-microvolt = <750000>;
|
||||
+ regulator-max-microvolt = <1350000>;
|
||||
+ regulator-ramp-delay = <6001>;
|
||||
+ regulator-always-on;
|
||||
+ regulator-boot-on;
|
||||
+ regulator-state-mem {
|
||||
+ regulator-on-in-suspend;
|
||||
+ regulator-suspend-microvolt = <900000>;
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ vdd_cpu_l: DCDC_REG2 {
|
||||
+ regulator-name = "vdd_cpu_l";
|
||||
+ regulator-min-microvolt = <750000>;
|
||||
+ regulator-max-microvolt = <1350000>;
|
||||
+ regulator-ramp-delay = <6001>;
|
||||
+ regulator-always-on;
|
||||
+ regulator-boot-on;
|
||||
+ regulator-state-mem {
|
||||
+ regulator-off-in-suspend;
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ vcc_ddr: DCDC_REG3 {
|
||||
+ regulator-name = "vcc_ddr";
|
||||
+ regulator-always-on;
|
||||
+ regulator-boot-on;
|
||||
+ regulator-state-mem {
|
||||
+ regulator-on-in-suspend;
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ vcc_1v8: DCDC_REG4 {
|
||||
+ regulator-name = "vcc_1v8";
|
||||
+ regulator-min-microvolt = <1800000>;
|
||||
+ regulator-max-microvolt = <1800000>;
|
||||
+ regulator-always-on;
|
||||
+ regulator-boot-on;
|
||||
+ regulator-state-mem {
|
||||
+ regulator-on-in-suspend;
|
||||
+ regulator-suspend-microvolt = <1800000>;
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ vcc3v3_dsi: LDO_REG1 {
|
||||
+ regulator-name = "vcc3v3_dsi";
|
||||
+ regulator-min-microvolt = <3300000>;
|
||||
+ regulator-max-microvolt = <3300000>;
|
||||
+ regulator-always-on;
|
||||
+ regulator-boot-on;
|
||||
+ regulator-state-mem {
|
||||
+ regulator-off-in-suspend;
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ vcca1v8_hdmi: LDO_REG2 {
|
||||
+ regulator-name = "vcca1v8_hdmi";
|
||||
+ regulator-min-microvolt = <1800000>;
|
||||
+ regulator-max-microvolt = <1800000>;
|
||||
+ regulator-always-on;
|
||||
+ regulator-boot-on;
|
||||
+ regulator-state-mem {
|
||||
+ regulator-off-in-suspend;
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ vcc1v8_pmu: LDO_REG3 {
|
||||
+ regulator-name = "vcc1v8_pmu";
|
||||
+ regulator-min-microvolt = <1800000>;
|
||||
+ regulator-max-microvolt = <1800000>;
|
||||
+ regulator-always-on;
|
||||
+ regulator-boot-on;
|
||||
+ regulator-state-mem {
|
||||
+ regulator-on-in-suspend;
|
||||
+ regulator-suspend-microvolt = <1800000>;
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ vccio_sd: LDO_REG4 {
|
||||
+ regulator-name = "vccio_sd";
|
||||
+ regulator-min-microvolt = <1800000>;
|
||||
+ regulator-max-microvolt = <3000000>;
|
||||
+ regulator-always-on;
|
||||
+ regulator-boot-on;
|
||||
+ regulator-state-mem {
|
||||
+ regulator-on-in-suspend;
|
||||
+ regulator-suspend-microvolt = <3000000>;
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ vcc3v3_csi: LDO_REG5 {
|
||||
+ regulator-name = "vcc3v3_csi";
|
||||
+ regulator-min-microvolt = <3300000>;
|
||||
+ regulator-max-microvolt = <3300000>;
|
||||
+ regulator-always-on;
|
||||
+ regulator-boot-on;
|
||||
+ regulator-state-mem {
|
||||
+ regulator-off-in-suspend;
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ vcc_1v5: LDO_REG6 {
|
||||
+ regulator-name = "vcc_1v5";
|
||||
+ regulator-min-microvolt = <1500000>;
|
||||
+ regulator-max-microvolt = <1500000>;
|
||||
+ regulator-always-on;
|
||||
+ regulator-boot-on;
|
||||
+ regulator-state-mem {
|
||||
+ regulator-on-in-suspend;
|
||||
+ regulator-suspend-microvolt = <1500000>;
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ vcca0v9_hdmi: LDO_REG7 {
|
||||
+ regulator-name = "vcca0v9_hdmi";
|
||||
+ regulator-min-microvolt = <900000>;
|
||||
+ regulator-max-microvolt = <900000>;
|
||||
+ regulator-always-on;
|
||||
+ regulator-boot-on;
|
||||
+ regulator-state-mem {
|
||||
+ regulator-off-in-suspend;
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ vcc_3v0: LDO_REG8 {
|
||||
+ regulator-name = "vcc_3v0";
|
||||
+ regulator-min-microvolt = <3000000>;
|
||||
+ regulator-max-microvolt = <3000000>;
|
||||
+ regulator-always-on;
|
||||
+ regulator-boot-on;
|
||||
+ regulator-state-mem {
|
||||
+ regulator-on-in-suspend;
|
||||
+ regulator-suspend-microvolt = <3000000>;
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ vcc3v3_s3: SWITCH_REG1 {
|
||||
+ regulator-name = "vcc3v3_s3";
|
||||
+ regulator-always-on;
|
||||
+ regulator-boot-on;
|
||||
+ regulator-state-mem {
|
||||
+ regulator-on-in-suspend;
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ vcc3v3_s0: SWITCH_REG2 {
|
||||
+ regulator-name = "vcc3v3_s0";
|
||||
+ regulator-always-on;
|
||||
+ regulator-boot-on;
|
||||
+ regulator-state-mem {
|
||||
+ regulator-off-in-suspend;
|
||||
+ };
|
||||
+ };
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ vdd_cpu_b: vdd_cpu_b {
|
||||
+ compatible = "fcs,fan53200";
|
||||
+ reg = <0x60>;
|
||||
+ vin-supply = <&vcc5v0_sys>;
|
||||
+ regulator-compatible = "fan53555-regulator";
|
||||
+ pinctrl-names = "default";
|
||||
+ pinctrl-0 = <&vsel1_gpio>;
|
||||
+ vsel-gpios = <&gpio1 17 GPIO_ACTIVE_HIGH>;
|
||||
+ regulator-name = "vdd_cpu_b";
|
||||
+ regulator-min-microvolt = <800000>;
|
||||
+ regulator-max-microvolt = <1250000>;
|
||||
+ regulator-ramp-delay = <1000>;
|
||||
+ fcs,suspend-voltage-selector = <1>;
|
||||
+ regulator-always-on;
|
||||
+ regulator-boot-on;
|
||||
+ status = "okay";
|
||||
+
|
||||
+ regulator-initial-state = <3>;
|
||||
+ regulator-state-mem {
|
||||
+ regulator-off-in-suspend;
|
||||
+ };
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&i2c3 {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&i2c4 {
|
||||
+
|
||||
+ status = "okay";
|
||||
+ i2c-scl-rising-time-ns = <475>;
|
||||
+ i2c-scl-falling-time-ns = <26>;
|
||||
+ fusb0: fusb30x@22 {
|
||||
+ compatible = "fcs,fusb302";
|
||||
+ reg = <0x22>;
|
||||
+ pinctrl-names = "default";
|
||||
+ pinctrl-0 = <&fusb0_int>;
|
||||
+ interrupt-parent = <&gpio1>;
|
||||
+ interrupts = <RK_PA2 IRQ_TYPE_LEVEL_LOW>;
|
||||
+ vbus-supply = <&vbus_typec>;
|
||||
+ status = "okay";
|
||||
+
|
||||
+ connector {
|
||||
+ compatible = "usb-c-connector";
|
||||
+ data-role = "dual";
|
||||
+ label = "USB-C";
|
||||
+ op-sink-microwatt = <1000000>;
|
||||
+ power-role = "dual";
|
||||
+ sink-pdos =
|
||||
+ <PDO_FIXED(5000, 2500, PDO_FIXED_USB_COMM)>;
|
||||
+ source-pdos =
|
||||
+ <PDO_FIXED(5000, 1400, PDO_FIXED_USB_COMM)>;
|
||||
+ try-power-role = "sink";
|
||||
+
|
||||
+ extcon-cables = <1 2 5 6 9 10 12 44>;
|
||||
+ typec-altmodes = <0xff01 1 0x001c0000 1>;
|
||||
+
|
||||
+ ports {
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+
|
||||
+ port@0 {
|
||||
+ reg = <0>;
|
||||
+
|
||||
+ usbc_hs: endpoint {
|
||||
+ remote-endpoint =
|
||||
+ <&u2phy0_typec_hs>;
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ port@1 {
|
||||
+ reg = <1>;
|
||||
+
|
||||
+ usbc_ss: endpoint {
|
||||
+ remote-endpoint =
|
||||
+ <&tcphy0_typec_ss>;
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ port@2 {
|
||||
+ reg = <2>;
|
||||
+
|
||||
+ usbc_dp: endpoint {
|
||||
+ remote-endpoint =
|
||||
+ <&tcphy0_typec_dp>;
|
||||
+ };
|
||||
+ };
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+
|
||||
+
|
||||
+
|
||||
+ };
|
||||
+
|
||||
+ vdd_gpu: vdd_gpu {
|
||||
+ compatible = "fcs,fan53200";
|
||||
+ reg = <0x60>;
|
||||
+ vin-supply = <&vcc5v0_sys>;
|
||||
+ regulator-compatible = "fan53555-regulator";
|
||||
+ pinctrl-names = "default";
|
||||
+ pinctrl-0 = <&vsel2_gpio>;
|
||||
+ vsel-gpios = <&gpio1 14 GPIO_ACTIVE_HIGH>;
|
||||
+ regulator-name = "vdd_gpu";
|
||||
+ regulator-min-microvolt = <800000>;
|
||||
+ regulator-max-microvolt = <1200000>;
|
||||
+ regulator-ramp-delay = <1000>;
|
||||
+ fcs,suspend-voltage-selector = <1>;
|
||||
+ regulator-always-on;
|
||||
+ regulator-boot-on;
|
||||
+ status = "okay";
|
||||
+
|
||||
+ regulator-initial-state = <3>;
|
||||
+ regulator-state-mem {
|
||||
+ regulator-off-in-suspend;
|
||||
+ };
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&i2c8 {
|
||||
+
|
||||
+ m24c08: m24c08@50 {
|
||||
+ compatible = "atmel,24c08";
|
||||
+ reg = <0x50>;
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&i2s0 {
|
||||
+ rockchip,playback-channels = <8>;
|
||||
+ rockchip,capture-channels = <8>;
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&i2s2 {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&pcie_phy {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&pcie0 {
|
||||
+ ep-gpios = <&gpio0 12 GPIO_ACTIVE_HIGH>;
|
||||
+ num-lanes = <4>;
|
||||
+ pinctrl-names = "default";
|
||||
+ pinctrl-0 = <&pcie_clkreqn_cpm>;
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&pwm0 {
|
||||
+ status = "disabled";
|
||||
+};
|
||||
+
|
||||
+&pwm2 {
|
||||
+ status = "okay";
|
||||
+ pinctrl-names = "active";
|
||||
+ pinctrl-0 = <&pwm2_pin_pull_down>;
|
||||
+};
|
||||
+
|
||||
+&pwm3 {
|
||||
+ status = "disabled";
|
||||
+};
|
||||
+
|
||||
+&saradc {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&sdhci {
|
||||
+ bus-width = <8>;
|
||||
+ mmc-hs400-1_8v;
|
||||
+ supports-emmc;
|
||||
+ mmc-hs400-enhanced-strobe;
|
||||
+ non-removable;
|
||||
+ keep-power-in-suspend;
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&sdmmc {
|
||||
+ clock-frequency = <150000000>;
|
||||
+ clock-freq-min-max = <100000 150000000>;
|
||||
+ supports-sd;
|
||||
+ bus-width = <4>;
|
||||
+ cap-mmc-highspeed;
|
||||
+ cap-sd-highspeed;
|
||||
+ disable-wp;
|
||||
+ num-slots = <1>;
|
||||
+ //sd-uhs-sdr104;
|
||||
+ vmmc-supply = <&vcc3v3_s3>;
|
||||
+ vqmmc-supply = <&vccio_sd>;
|
||||
+ pinctrl-names = "default";
|
||||
+ pinctrl-0 = <&sdmmc_clk &sdmmc_cmd &sdmmc_cd &sdmmc_bus4>;
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&tcphy0 {
|
||||
+ extcon = <&fusb0>;
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&tcphy0_dp {
|
||||
+ port {
|
||||
+ tcphy0_typec_dp: endpoint {
|
||||
+ remote-endpoint = <&usbc_dp>;
|
||||
+ };
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&tcphy0_usb3 {
|
||||
+ port {
|
||||
+ tcphy0_typec_ss: endpoint {
|
||||
+ remote-endpoint = <&usbc_ss>;
|
||||
+ };
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&tcphy1 {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&tsadc {
|
||||
+ /* tshut mode 0:CRU 1:GPIO */
|
||||
+ rockchip,hw-tshut-mode = <1>;
|
||||
+ /* tshut polarity 0:LOW 1:HIGH */
|
||||
+ rockchip,hw-tshut-polarity = <1>;
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&u2phy0 {
|
||||
+ status = "okay";
|
||||
+
|
||||
+ u2phy0_otg: otg-port {
|
||||
+ status = "okay";
|
||||
+ };
|
||||
+
|
||||
+ u2phy0_host: host-port {
|
||||
+ phy-supply = <&vcc5v0_host>;
|
||||
+ status = "okay";
|
||||
+ };
|
||||
+
|
||||
+ port {
|
||||
+ u2phy0_typec_hs: endpoint {
|
||||
+ remote-endpoint = <&usbc_hs>;
|
||||
+ };
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&u2phy1 {
|
||||
+ status = "okay";
|
||||
+
|
||||
+ u2phy1_otg: otg-port {
|
||||
+ status = "okay";
|
||||
+ };
|
||||
+
|
||||
+ u2phy1_host: host-port {
|
||||
+ phy-supply = <&vcc5v0_host>;
|
||||
+ status = "okay";
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&usbdrd3_0 {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&usbdrd_dwc3_0 {
|
||||
+ status = "okay";
|
||||
+ dr_mode = "host";
|
||||
+};
|
||||
+
|
||||
+&usbdrd3_1 {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&usbdrd_dwc3_1 {
|
||||
+ status = "okay";
|
||||
+ dr_mode = "host";
|
||||
+};
|
||||
+
|
||||
+&uart2 {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&usb_host0_ehci {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&usb_host0_ohci {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&usb_host1_ehci {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&usb_host1_ohci {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&pinctrl {
|
||||
+
|
||||
+ pmic {
|
||||
+ pmic_int_l: pmic-int-l {
|
||||
+ rockchip,pins =
|
||||
+ <1 18 RK_FUNC_GPIO &pcfg_pull_up>,
|
||||
+ <0 9 RK_FUNC_GPIO &pcfg_pull_none>; /* GPIO0_B1 */
|
||||
+ };
|
||||
+ vsel1_gpio: vsel1-gpio {
|
||||
+ rockchip,pins =
|
||||
+ <1 17 RK_FUNC_GPIO &pcfg_pull_down>;
|
||||
+ };
|
||||
+ vsel2_gpio: vsel2-gpio {
|
||||
+ rockchip,pins =
|
||||
+ <1 14 RK_FUNC_GPIO &pcfg_pull_down>;
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ usb2 {
|
||||
+ vcc5v0_host_en: vcc5v0-host-en {
|
||||
+ rockchip,pins =
|
||||
+ <4 RK_PD1 RK_FUNC_GPIO &pcfg_pull_none>;
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ usb-typec {
|
||||
+ vcc5v0_typec0_en_pin: vcc5v0-typec0-en-pin {
|
||||
+ rockchip,pins = <1 RK_PA3 RK_FUNC_GPIO &pcfg_pull_up>;
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ fusb30x {
|
||||
+ fusb0_int: fusb0-int {
|
||||
+ rockchip,pins = <1 2 RK_FUNC_GPIO &pcfg_pull_up>;
|
||||
+ };
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&vopl {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&vopl_mmu {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&vopb {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&vopb_mmu {
|
||||
+ status = "okay";
|
||||
+};
|
||||
--
|
||||
Created with Armbian build tools https://github.com/armbian/build
|
||||
|
||||
@ -15,7 +15,7 @@ index 26661c7b7..1462ed38b 100644
|
||||
+dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-nanopi-m4v2.dtb
|
||||
+dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-nanopi-r4s.dtb
|
||||
+dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-orangepi-4.dtb
|
||||
+dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-rock-pi-4.dtb
|
||||
+dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-tinker-2.dtb
|
||||
dtb-$(CONFIG_ARCH_ROCKCHIP) += px30-evb.dtb
|
||||
dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3308-evb.dtb
|
||||
dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3308-roc-cc.dtb
|
||||
|
||||
@ -0,0 +1,12 @@
|
||||
diff --git a/arch/arm64/boot/dts/rockchip/rk3399-kobol-helios64.dts b/arch/arm64/boot/dts/rockchip/rk3399-kobol-helios64.dts
|
||||
index e666bd5ae..df1fc943b 100644
|
||||
--- a/arch/arm64/boot/dts/rockchip/rk3399-kobol-helios64.dts
|
||||
+++ b/arch/arm64/boot/dts/rockchip/rk3399-kobol-helios64.dts
|
||||
@@ -478,6 +478,7 @@ rk808: pmic@1b {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pmic_int_l>;
|
||||
rockchip,system-power-controller;
|
||||
+ max-buck-steps-per-change = <4>;
|
||||
wakeup-source;
|
||||
|
||||
vcc1-supply = <&vcc5v0_sys>;
|
||||
@ -0,0 +1,147 @@
|
||||
From 5b697589bfd64a14ef1c991cffb5179ccb6cf880 Mon Sep 17 00:00:00 2001
|
||||
From: tonymac32 <tonymckahan@gmail.com>
|
||||
Date: Wed, 17 Feb 2021 00:54:00 -0500
|
||||
Subject: [PATCH] Patching something
|
||||
|
||||
Signed-off-by: tonymac32 <tonymckahan@gmail.com>
|
||||
---
|
||||
.../boot/dts/rockchip/rk3399-nanopc-t4.dts | 100 +++++++++++++++++++
|
||||
1 file changed, 98 insertions(+), 12 deletions(-)
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/rockchip/rk3399-nanopc-t4.dts b/arch/arm64/boot/dts/rockchip/rk3399-nanopc-t4.dts
|
||||
index e0d75617b..68f1a06fa 100644
|
||||
--- a/arch/arm64/boot/dts/rockchip/rk3399-nanopc-t4.dts
|
||||
+++ b/arch/arm64/boot/dts/rockchip/rk3399-nanopc-t4.dts
|
||||
@@ -9,6 +9,7 @@
|
||||
*/
|
||||
|
||||
/dts-v1/;
|
||||
+#include <dt-bindings/usb/pd.h>
|
||||
#include "rk3399-nanopi4.dtsi"
|
||||
|
||||
/ {
|
||||
@@ -66,6 +67,12 @@ fan: pwm-fan {
|
||||
};
|
||||
};
|
||||
|
||||
+&cdn_dp {
|
||||
+ status = "okay";
|
||||
+ extcon = <&fusb0>;
|
||||
+ phys = <&tcphy0_dp>;
|
||||
+};
|
||||
+
|
||||
&cpu_thermal {
|
||||
trips {
|
||||
cpu_warm: cpu_warm {
|
||||
@@ -94,6 +101,50 @@ map3 {
|
||||
};
|
||||
};
|
||||
|
||||
+&fusb0 {
|
||||
+
|
||||
+ connector {
|
||||
+ compatible = "usb-c-connector";
|
||||
+ label = "USB-C";
|
||||
+ power-role = "dual";
|
||||
+ data-role = "dual";
|
||||
+ try-power-role = "sink";
|
||||
+ source-pdos = <PDO_FIXED(5000, 1200, PDO_FIXED_USB_COMM)>;
|
||||
+ sink-pdos = <PDO_FIXED(5000, 500, PDO_FIXED_USB_COMM)>;
|
||||
+ op-sink-microwatt = <5000000>;
|
||||
+
|
||||
+ extcon-cables = <1 2 5 6 9 10 12 44>;
|
||||
+ typec-altmodes = <0xff01 1 0x001c0000 1>;
|
||||
+
|
||||
+ ports {
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+ port@0 {
|
||||
+ reg = <0>;
|
||||
+ usb_con_hs: endpoint {
|
||||
+ remote-endpoint =
|
||||
+ <&u2phy0_typec_hs>;
|
||||
+ };
|
||||
+ };
|
||||
+ port@1 {
|
||||
+ reg = <1>;
|
||||
+
|
||||
+ usb_con_ss: endpoint {
|
||||
+ remote-endpoint =
|
||||
+ <&tcphy0_typec_ss>;
|
||||
+ };
|
||||
+ };
|
||||
+ port@2 {
|
||||
+ reg = <2>;
|
||||
+ usb_con_dp: endpoint {
|
||||
+ remote-endpoint =
|
||||
+ <&tcphy0_typec_dp>;
|
||||
+ };
|
||||
+ };
|
||||
+ };
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
&pcie0 {
|
||||
num-lanes = <4>;
|
||||
vpcie3v3-supply = <&vcc3v3_sys>;
|
||||
@@ -113,12 +164,57 @@ &sdhci {
|
||||
mmc-hs400-enhanced-strobe;
|
||||
};
|
||||
|
||||
+&tcphy0 {
|
||||
+ extcon = <&fusb0>;
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&tcphy0_dp {
|
||||
+ port {
|
||||
+ tcphy0_typec_dp: endpoint {
|
||||
+ remote-endpoint = <&usb_con_dp>;
|
||||
+ };
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&tcphy0_usb3 {
|
||||
+ port {
|
||||
+ tcphy0_typec_ss: endpoint {
|
||||
+ remote-endpoint = <&usb_con_ss>;
|
||||
+ };
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&u2phy0 {
|
||||
+ extcon = <&fusb0>;
|
||||
+};
|
||||
+
|
||||
&u2phy0_host {
|
||||
phy-supply = <&vcc5v0_host0>;
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&u2phy0_otg {
|
||||
+ status = "okay";
|
||||
+
|
||||
+ port {
|
||||
+ u2phy0_typec_hs: endpoint {
|
||||
+ remote-endpoint = <&usb_con_hs>;
|
||||
+ };
|
||||
+ };
|
||||
};
|
||||
|
||||
&u2phy1_host {
|
||||
phy-supply = <&vcc5v0_host0>;
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&u2phy1_otg {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&usbdrd_dwc3_0 {
|
||||
+ extcon = <&fusb0>;
|
||||
};
|
||||
|
||||
&vcc5v0_sys {
|
||||
--
|
||||
Created with Armbian build tools https://github.com/armbian/build
|
||||
|
||||
447
patch/kernel/archive/media-5.15/board-pbp-add-dp-alt-mode.patch
Normal file
447
patch/kernel/archive/media-5.15/board-pbp-add-dp-alt-mode.patch
Normal file
@ -0,0 +1,447 @@
|
||||
From a1bbffd1cbb883be7fe3da1d09c29d57cfbeb2da Mon Sep 17 00:00:00 2001
|
||||
From: Dan Johansen <strit@manjaro.org>
|
||||
Date: Tue, 2 Jun 2020 20:20:29 +0200
|
||||
Subject: [PATCH] add-dp-alt-mode-to-PBP
|
||||
|
||||
---
|
||||
.../boot/dts/rockchip/rk3399-pinebook-pro.dts | 5 +
|
||||
drivers/phy/rockchip/phy-rockchip-typec.c | 17 +++
|
||||
drivers/usb/typec/altmodes/displayport.c | 58 +++++++-
|
||||
drivers/usb/typec/bus.c | 8 +-
|
||||
drivers/usb/typec/tcpm/tcpm.c | 139 +++++++++++++++++-
|
||||
5 files changed, 221 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/rockchip/rk3399-pinebook-pro.dts b/arch/arm64/boot/dts/rockchip/rk3399-pinebook-pro.dts
|
||||
index c49982dfd8fc..66cf08e8506f 100644
|
||||
--- a/arch/arm64/boot/dts/rockchip/rk3399-pinebook-pro.dts
|
||||
+++ b/arch/arm64/boot/dts/rockchip/rk3399-pinebook-pro.dts
|
||||
@@ -374,6 +374,7 @@ mains_charger: dc-charger {
|
||||
|
||||
&cdn_dp {
|
||||
status = "okay";
|
||||
+ extcon = <&fusb0>;
|
||||
};
|
||||
|
||||
&cpu_b0 {
|
||||
@@ -708,6 +709,9 @@ connector {
|
||||
<PDO_FIXED(5000, 1400, PDO_FIXED_USB_COMM)>;
|
||||
try-power-role = "sink";
|
||||
|
||||
+ extcon-cables = <1 2 5 6 9 10 12 44>;
|
||||
+ typec-altmodes = <0xff01 1 0x001c0000 1>;
|
||||
+
|
||||
ports {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
@@ -958,6 +962,7 @@ spiflash: flash@0 {
|
||||
};
|
||||
|
||||
&tcphy0 {
|
||||
+ extcon = <&fusb0>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
diff --git a/drivers/phy/rockchip/phy-rockchip-typec.c b/drivers/phy/rockchip/phy-rockchip-typec.c
|
||||
index 24563160197f..f5b497b4b97e 100644
|
||||
--- a/drivers/phy/rockchip/phy-rockchip-typec.c
|
||||
+++ b/drivers/phy/rockchip/phy-rockchip-typec.c
|
||||
@@ -40,6 +40,7 @@
|
||||
#include <linux/clk-provider.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/extcon.h>
|
||||
+#include <linux/extcon-provider.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/iopoll.h>
|
||||
#include <linux/kernel.h>
|
||||
@@ -1160,6 +1161,22 @@ static int rockchip_typec_phy_probe(struct platform_device *pdev)
|
||||
dev_err(dev, "Invalid or missing extcon\n");
|
||||
return PTR_ERR(tcphy->extcon);
|
||||
}
|
||||
+ } else {
|
||||
+ extcon_set_property_capability(tcphy->extcon, EXTCON_USB,
|
||||
+ EXTCON_PROP_USB_SS);
|
||||
+ extcon_set_property_capability(tcphy->extcon, EXTCON_USB_HOST,
|
||||
+ EXTCON_PROP_USB_SS);
|
||||
+ extcon_set_property_capability(tcphy->extcon, EXTCON_DISP_DP,
|
||||
+ EXTCON_PROP_USB_SS);
|
||||
+ extcon_set_property_capability(tcphy->extcon, EXTCON_USB,
|
||||
+ EXTCON_PROP_USB_TYPEC_POLARITY);
|
||||
+ extcon_set_property_capability(tcphy->extcon, EXTCON_USB_HOST,
|
||||
+ EXTCON_PROP_USB_TYPEC_POLARITY);
|
||||
+ extcon_set_property_capability(tcphy->extcon, EXTCON_DISP_DP,
|
||||
+ EXTCON_PROP_USB_TYPEC_POLARITY);
|
||||
+ extcon_sync(tcphy->extcon, EXTCON_USB);
|
||||
+ extcon_sync(tcphy->extcon, EXTCON_USB_HOST);
|
||||
+ extcon_sync(tcphy->extcon, EXTCON_DISP_DP);
|
||||
}
|
||||
|
||||
pm_runtime_enable(dev);
|
||||
diff --git a/drivers/usb/typec/altmodes/displayport.c b/drivers/usb/typec/altmodes/displayport.c
|
||||
index 0edfb89e04a8..40dd68c20159 100644
|
||||
--- a/drivers/usb/typec/altmodes/displayport.c
|
||||
+++ b/drivers/usb/typec/altmodes/displayport.c
|
||||
@@ -9,6 +9,8 @@
|
||||
*/
|
||||
|
||||
#include <linux/delay.h>
|
||||
+#include <linux/extcon.h>
|
||||
+#include <linux/extcon-provider.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/usb/pd_vdo.h>
|
||||
@@ -134,15 +136,53 @@ static int dp_altmode_status_update(struct dp_altmode *dp)
|
||||
return ret;
|
||||
}
|
||||
|
||||
+static void dp_altmode_update_extcon(struct dp_altmode *dp, bool disconnect) {
|
||||
+ const struct device *dev = &dp->port->dev;
|
||||
+ struct extcon_dev* edev = NULL;
|
||||
+
|
||||
+ while (dev) {
|
||||
+ edev = extcon_find_edev_by_node(dev->of_node);
|
||||
+ if(!IS_ERR(edev)) {
|
||||
+ break;
|
||||
+ }
|
||||
+ dev = dev->parent;
|
||||
+ }
|
||||
+
|
||||
+ if (IS_ERR_OR_NULL(edev)) {
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ if (disconnect || !dp->data.conf) {
|
||||
+ extcon_set_state_sync(edev, EXTCON_DISP_DP, false);
|
||||
+ } else {
|
||||
+ union extcon_property_value extcon_true = { .intval = true };
|
||||
+ extcon_set_state(edev, EXTCON_DISP_DP, true);
|
||||
+ if (DP_CONF_GET_PIN_ASSIGN(dp->data.conf) & DP_PIN_ASSIGN_MULTI_FUNC_MASK) {
|
||||
+ extcon_set_state_sync(edev, EXTCON_USB_HOST, true);
|
||||
+ extcon_set_property(edev, EXTCON_DISP_DP, EXTCON_PROP_USB_SS,
|
||||
+ extcon_true);
|
||||
+ } else {
|
||||
+ extcon_set_state_sync(edev, EXTCON_USB_HOST, false);
|
||||
+ }
|
||||
+ extcon_sync(edev, EXTCON_DISP_DP);
|
||||
+ extcon_set_state_sync(edev, EXTCON_USB, false);
|
||||
+ }
|
||||
+
|
||||
+}
|
||||
+
|
||||
static int dp_altmode_configured(struct dp_altmode *dp)
|
||||
{
|
||||
int ret;
|
||||
|
||||
sysfs_notify(&dp->alt->dev.kobj, "displayport", "configuration");
|
||||
|
||||
- if (!dp->data.conf)
|
||||
+ if (!dp->data.conf) {
|
||||
+ dp_altmode_update_extcon(dp, true);
|
||||
return typec_altmode_notify(dp->alt, TYPEC_STATE_USB,
|
||||
&dp->data);
|
||||
+ }
|
||||
+
|
||||
+ dp_altmode_update_extcon(dp, false);
|
||||
|
||||
ret = dp_altmode_notify(dp);
|
||||
if (ret)
|
||||
@@ -169,9 +209,11 @@ static int dp_altmode_configure_vdm(struct dp_altmode *dp, u32 conf)
|
||||
if (ret) {
|
||||
if (DP_CONF_GET_PIN_ASSIGN(dp->data.conf))
|
||||
dp_altmode_notify(dp);
|
||||
- else
|
||||
+ else {
|
||||
+ dp_altmode_update_extcon(dp, true);
|
||||
typec_altmode_notify(dp->alt, TYPEC_STATE_USB,
|
||||
&dp->data);
|
||||
+ }
|
||||
}
|
||||
|
||||
return ret;
|
||||
@@ -210,6 +252,8 @@ static void dp_altmode_work(struct work_struct *work)
|
||||
case DP_STATE_EXIT:
|
||||
if (typec_altmode_exit(dp->alt))
|
||||
dev_err(&dp->alt->dev, "Exit Mode Failed!\n");
|
||||
+ else
|
||||
+ dp_altmode_update_extcon(dp, true);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@@ -520,8 +564,14 @@ int dp_altmode_probe(struct typec_altmode *alt)
|
||||
if (!(DP_CAP_DFP_D_PIN_ASSIGN(port->vdo) &
|
||||
DP_CAP_UFP_D_PIN_ASSIGN(alt->vdo)) &&
|
||||
!(DP_CAP_UFP_D_PIN_ASSIGN(port->vdo) &
|
||||
- DP_CAP_DFP_D_PIN_ASSIGN(alt->vdo)))
|
||||
- return -ENODEV;
|
||||
+ DP_CAP_DFP_D_PIN_ASSIGN(alt->vdo))) {
|
||||
+ dev_err(&alt->dev, "No compatible pin configuration found:"\
|
||||
+ "%04lx -> %04lx, %04lx <- %04lx",
|
||||
+ DP_CAP_DFP_D_PIN_ASSIGN(port->vdo), DP_CAP_UFP_D_PIN_ASSIGN(alt->vdo),
|
||||
+ DP_CAP_UFP_D_PIN_ASSIGN(port->vdo), DP_CAP_DFP_D_PIN_ASSIGN(alt->vdo));
|
||||
+ return -ENODEV;
|
||||
+ }
|
||||
+
|
||||
|
||||
ret = sysfs_create_group(&alt->dev.kobj, &dp_altmode_group);
|
||||
if (ret)
|
||||
diff --git a/drivers/usb/typec/bus.c b/drivers/usb/typec/bus.c
|
||||
index e8ddb81cb6df..cbc01d73739c 100644
|
||||
--- a/drivers/usb/typec/bus.c
|
||||
+++ b/drivers/usb/typec/bus.c
|
||||
@@ -154,8 +154,14 @@ EXPORT_SYMBOL_GPL(typec_altmode_exit);
|
||||
*/
|
||||
void typec_altmode_attention(struct typec_altmode *adev, u32 vdo)
|
||||
{
|
||||
- struct typec_altmode *pdev = &to_altmode(adev)->partner->adev;
|
||||
+ struct typec_altmode *pdev;
|
||||
+ WARN_ONCE(!adev, "typec bus attention: adev is NULL!");
|
||||
+ WARN_ONCE(!to_altmode(adev)->partner, "typec bus attention: partner is NULL!");
|
||||
+ if(!adev || !to_altmode(adev)->partner) {
|
||||
+ return;
|
||||
+ }
|
||||
|
||||
+ pdev = &to_altmode(adev)->partner->adev;
|
||||
if (pdev->ops && pdev->ops->attention)
|
||||
pdev->ops->attention(pdev, vdo);
|
||||
}
|
||||
diff --git a/drivers/usb/typec/tcpm/tcpm.c b/drivers/usb/typec/tcpm/tcpm.c
|
||||
index 82b19ebd7838..6f00b17afc15 100644
|
||||
--- a/drivers/usb/typec/tcpm/tcpm.c
|
||||
+++ b/drivers/usb/typec/tcpm/tcpm.c
|
||||
@@ -8,6 +8,7 @@
|
||||
#include <linux/completion.h>
|
||||
#include <linux/debugfs.h>
|
||||
#include <linux/device.h>
|
||||
+#include <linux/extcon-provider.h>
|
||||
#include <linux/hrtimer.h>
|
||||
#include <linux/jiffies.h>
|
||||
#include <linux/kernel.h>
|
||||
@@ -476,6 +477,12 @@ struct tcpm_port {
|
||||
* SNK_READY for non-pd link.
|
||||
*/
|
||||
bool slow_charger_loop;
|
||||
+
|
||||
+#ifdef CONFIG_EXTCON
|
||||
+ struct extcon_dev *extcon;
|
||||
+ unsigned int *extcon_cables;
|
||||
+#endif
|
||||
+
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
struct dentry *dentry;
|
||||
struct mutex logbuffer_lock; /* log buffer access lock */
|
||||
@@ -607,6 +613,35 @@ static void tcpm_debugfs_exit(const struct tcpm_port *port) { }
|
||||
|
||||
#endif
|
||||
|
||||
+static void tcpm_update_extcon_data(struct tcpm_port *port, bool attached) {
|
||||
+#ifdef CONFIG_EXTCON
|
||||
+ unsigned int *capability = port->extcon_cables;
|
||||
+ if (port->data_role == TYPEC_HOST) {
|
||||
+ extcon_set_state(port->extcon, EXTCON_USB, false);
|
||||
+ extcon_set_state(port->extcon, EXTCON_USB_HOST, attached);
|
||||
+ } else {
|
||||
+ extcon_set_state(port->extcon, EXTCON_USB, true);
|
||||
+ extcon_set_state(port->extcon, EXTCON_USB_HOST, attached);
|
||||
+ }
|
||||
+ while (*capability != EXTCON_NONE) {
|
||||
+ if (attached) {
|
||||
+ union extcon_property_value val;
|
||||
+ val.intval = (port->polarity == TYPEC_POLARITY_CC2);
|
||||
+ extcon_set_property(port->extcon, *capability,
|
||||
+ EXTCON_PROP_USB_TYPEC_POLARITY, val);
|
||||
+ } else {
|
||||
+ extcon_set_state(port->extcon, *capability, false);
|
||||
+ }
|
||||
+ extcon_sync(port->extcon, *capability);
|
||||
+ capability++;
|
||||
+ }
|
||||
+ tcpm_log(port, "Extcon update (%s): %s, %s",
|
||||
+ attached ? "attached" : "detached",
|
||||
+ port->data_role == TYPEC_HOST ? "host" : "device",
|
||||
+ port->polarity == TYPEC_POLARITY_CC1 ? "normal" : "flipped");
|
||||
+#endif
|
||||
+}
|
||||
+
|
||||
static int tcpm_pd_transmit(struct tcpm_port *port,
|
||||
enum tcpm_transmit_type type,
|
||||
const struct pd_message *msg)
|
||||
@@ -834,6 +869,8 @@ static int tcpm_set_roles(struct tcpm_port *port, bool attached,
|
||||
typec_set_data_role(port->typec_port, data);
|
||||
typec_set_pwr_role(port->typec_port, role);
|
||||
|
||||
+ tcpm_update_extcon_data(port, attached);
|
||||
+
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1044,7 +1081,7 @@ static void svdm_consume_modes(struct tcpm_port *port, const __le32 *payload,
|
||||
paltmode->mode = i;
|
||||
paltmode->vdo = le32_to_cpu(payload[i]);
|
||||
|
||||
- tcpm_log(port, " Alternate mode %d: SVID 0x%04x, VDO %d: 0x%08x",
|
||||
+ tcpm_log(port, "Alternate mode %d: SVID 0x%04x, VDO %d: 0x%08x",
|
||||
pmdata->altmodes, paltmode->svid,
|
||||
paltmode->mode, paltmode->vdo);
|
||||
|
||||
@@ -1064,7 +1101,9 @@ static void tcpm_register_partner_altmodes(struct tcpm_port *port)
|
||||
tcpm_log(port, "Failed to register partner SVID 0x%04x",
|
||||
modep->altmode_desc[i].svid);
|
||||
altmode = NULL;
|
||||
- }
|
||||
+ } else {
|
||||
+ tcpm_log(port, "Registered altmode 0x%04x", modep->altmode_desc[i].svid);
|
||||
+ }
|
||||
port->partner_altmode[i] = altmode;
|
||||
}
|
||||
}
|
||||
@@ -1167,9 +1207,11 @@ static int tcpm_pd_svdm(struct tcpm_port *port, const __le32 *payload, int cnt,
|
||||
modep->svid_index++;
|
||||
if (modep->svid_index < modep->nsvids) {
|
||||
u16 svid = modep->svids[modep->svid_index];
|
||||
+ tcpm_log(port, "More modes available, sending discover");
|
||||
response[0] = VDO(svid, 1, svdm_version, CMD_DISCOVER_MODES);
|
||||
rlen = 1;
|
||||
} else {
|
||||
+ tcpm_log(port, "Got all patner modes, registering");
|
||||
tcpm_register_partner_altmodes(port);
|
||||
}
|
||||
break;
|
||||
@@ -2693,6 +2735,7 @@ static int tcpm_src_attach(struct tcpm_port *port)
|
||||
static void tcpm_typec_disconnect(struct tcpm_port *port)
|
||||
{
|
||||
if (port->connected) {
|
||||
+ tcpm_update_extcon_data(port, false);
|
||||
typec_unregister_partner(port->partner);
|
||||
port->partner = NULL;
|
||||
port->connected = false;
|
||||
@@ -2750,6 +2793,8 @@ static void tcpm_detach(struct tcpm_port *port)
|
||||
port->hard_reset_count = 0;
|
||||
|
||||
tcpm_reset_port(port);
|
||||
+
|
||||
+ tcpm_update_extcon_data(port, false);
|
||||
}
|
||||
|
||||
static void tcpm_src_detach(struct tcpm_port *port)
|
||||
@@ -4424,6 +4469,64 @@ void tcpm_tcpc_reset(struct tcpm_port *port)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(tcpm_tcpc_reset);
|
||||
|
||||
+unsigned int default_supported_cables[] = {
|
||||
+ EXTCON_NONE
|
||||
+};
|
||||
+
|
||||
+static int tcpm_fw_get_caps_late(struct tcpm_port *port,
|
||||
+ struct fwnode_handle *fwnode)
|
||||
+{
|
||||
+ int ret, i;
|
||||
+ ret = fwnode_property_count_u32(fwnode, "typec-altmodes");
|
||||
+ if (ret > 0) {
|
||||
+ u32 *props;
|
||||
+ if (ret % 4) {
|
||||
+ dev_err(port->dev, "Length of typec altmode array must be divisible by 4");
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+
|
||||
+ props = devm_kzalloc(port->dev, sizeof(u32) * ret, GFP_KERNEL);
|
||||
+ if (!props) {
|
||||
+ dev_err(port->dev, "Failed to allocate memory for altmode properties");
|
||||
+ return -ENOMEM;
|
||||
+ }
|
||||
+
|
||||
+ if(fwnode_property_read_u32_array(fwnode, "typec-altmodes", props, ret) < 0) {
|
||||
+ dev_err(port->dev, "Failed to read altmodes from port");
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+
|
||||
+ i = 0;
|
||||
+ while (ret > 0 && i < ARRAY_SIZE(port->port_altmode)) {
|
||||
+ struct typec_altmode *alt;
|
||||
+ struct typec_altmode_desc alt_desc = {
|
||||
+ .svid = props[i * 4],
|
||||
+ .mode = props[i * 4 + 1],
|
||||
+ .vdo = props[i * 4 + 2],
|
||||
+ .roles = props[i * 4 + 3],
|
||||
+ };
|
||||
+
|
||||
+
|
||||
+ tcpm_log(port, "Adding altmode SVID: 0x%04x, mode: %d, vdo: %u, role: %d",
|
||||
+ alt_desc.svid, alt_desc.mode, alt_desc.vdo, alt_desc.roles);
|
||||
+ alt = typec_port_register_altmode(port->typec_port,
|
||||
+ &alt_desc);
|
||||
+ if (IS_ERR(alt)) {
|
||||
+ tcpm_log(port,
|
||||
+ "%s: failed to register port alternate mode 0x%x",
|
||||
+ dev_name(port->dev), alt_desc.svid);
|
||||
+ break;
|
||||
+ }
|
||||
+ typec_altmode_set_drvdata(alt, port);
|
||||
+ alt->ops = &tcpm_altmode_ops;
|
||||
+ port->port_altmode[i] = alt;
|
||||
+ i++;
|
||||
+ ret -= 4;
|
||||
+ }
|
||||
+ }
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
static int tcpm_fw_get_caps(struct tcpm_port *port,
|
||||
struct fwnode_handle *fwnode)
|
||||
{
|
||||
@@ -4434,6 +4537,23 @@ static int tcpm_fw_get_caps(struct tcpm_port *port,
|
||||
if (!fwnode)
|
||||
return -EINVAL;
|
||||
|
||||
+#ifdef CONFIG_EXTCON
|
||||
+ ret = fwnode_property_count_u32(fwnode, "extcon-cables");
|
||||
+ if (ret > 0) {
|
||||
+ port->extcon_cables = devm_kzalloc(port->dev, sizeof(u32) * ret, GFP_KERNEL);
|
||||
+ if (!port->extcon_cables) {
|
||||
+ dev_err(port->dev, "Failed to allocate memory for extcon cable types. "\
|
||||
+ "Using default tyes");
|
||||
+ goto extcon_default;
|
||||
+ }
|
||||
+ fwnode_property_read_u32_array(fwnode, "extcon-cables", port->extcon_cables, ret);
|
||||
+ } else {
|
||||
+extcon_default:
|
||||
+ dev_info(port->dev, "No cable types defined, using default cables");
|
||||
+ port->extcon_cables = default_supported_cables;
|
||||
+ }
|
||||
+#endif
|
||||
+
|
||||
/* USB data support is optional */
|
||||
ret = fwnode_property_read_string(fwnode, "data-role", &cap_str);
|
||||
if (ret == 0) {
|
||||
@@ -4766,6 +4886,17 @@ struct tcpm_port *tcpm_register_port(struct device *dev, struct tcpc_dev *tcpc)
|
||||
goto out_destroy_wq;
|
||||
|
||||
port->try_role = port->typec_caps.prefer_role;
|
||||
+#ifdef CONFIG_EXTCON
|
||||
+ port->extcon = devm_extcon_dev_allocate(dev, port->extcon_cables);
|
||||
+ if (IS_ERR(port->extcon)) {
|
||||
+ dev_err(dev, "Failed to allocate extcon device: %ld", PTR_ERR(port->extcon));
|
||||
+ goto out_destroy_wq;
|
||||
+ }
|
||||
+ if((err = devm_extcon_dev_register(dev, port->extcon))) {
|
||||
+ dev_err(dev, "Failed to register extcon device: %d", err);
|
||||
+ goto out_destroy_wq;
|
||||
+ }
|
||||
+#endif
|
||||
|
||||
port->typec_caps.fwnode = tcpc->fwnode;
|
||||
port->typec_caps.revision = 0x0120; /* Type-C spec release 1.2 */
|
||||
@@ -4793,6 +4924,12 @@ struct tcpm_port *tcpm_register_port(struct device *dev, struct tcpc_dev *tcpc)
|
||||
goto out_role_sw_put;
|
||||
}
|
||||
|
||||
+ err = tcpm_fw_get_caps_late(port, tcpc->fwnode);
|
||||
+ if (err < 0) {
|
||||
+ dev_err(dev, "Failed to get altmodes from fwnode");
|
||||
+ goto out_destroy_wq;
|
||||
+ }
|
||||
+
|
||||
mutex_lock(&port->lock);
|
||||
tcpm_init(port);
|
||||
mutex_unlock(&port->lock);
|
||||
--
|
||||
2.26.2
|
||||
|
||||
@ -0,0 +1,47 @@
|
||||
From d0950717ad74ea4c85ccf7bc205b8545758de1df Mon Sep 17 00:00:00 2001
|
||||
From: tonymac32 <tonymckahan@gmail.com>
|
||||
Date: Sun, 8 Aug 2021 11:49:27 -0400
|
||||
Subject: [PATCH] board_rock64_mali-usb-supply
|
||||
|
||||
Signed-off-by: tonymac32 <tonymckahan@gmail.com>
|
||||
---
|
||||
arch/arm64/boot/dts/rockchip/rk3328-rock64.dts | 16 +++++-----------
|
||||
1 file changed, 5 insertions(+), 11 deletions(-)
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/rockchip/rk3328-rock64.dts b/arch/arm64/boot/dts/rockchip/rk3328-rock64.dts
|
||||
index b5f5513c6..df51ade34 100644
|
||||
--- a/arch/arm64/boot/dts/rockchip/rk3328-rock64.dts
|
||||
+++ b/arch/arm64/boot/dts/rockchip/rk3328-rock64.dts
|
||||
@@ -43,17 +43,6 @@ vcc_host_5v: vcc-host-5v-regulator {
|
||||
vin-supply = <&vcc_sys>;
|
||||
};
|
||||
|
||||
- vcc_host1_5v: vcc_otg_5v: vcc-host1-5v-regulator {
|
||||
- compatible = "regulator-fixed";
|
||||
- gpio = <&gpio0 RK_PA2 GPIO_ACTIVE_LOW>;
|
||||
- pinctrl-names = "default";
|
||||
- pinctrl-0 = <&usb20_host_drv>;
|
||||
- regulator-name = "vcc_host1_5v";
|
||||
- regulator-always-on;
|
||||
- regulator-boot-on;
|
||||
- vin-supply = <&vcc_sys>;
|
||||
- };
|
||||
-
|
||||
vcc_sys: vcc-sys {
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "vcc_sys";
|
||||
@@ -143,6 +132,11 @@ &emmc {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
+&gpu {
|
||||
+ status = "okay";
|
||||
+ mali-supply = <&vdd_logic>;
|
||||
+};
|
||||
+
|
||||
&gmac2io {
|
||||
assigned-clocks = <&cru SCLK_MAC2IO>, <&cru SCLK_MAC2IO_EXT>;
|
||||
assigned-clock-parents = <&gmac_clkin>, <&gmac_clkin>;
|
||||
--
|
||||
Created with Armbian build tools https://github.com/armbian/build
|
||||
|
||||
@ -1,30 +0,0 @@
|
||||
From 549dcdafe793000fbe38914a1f231d3c6034a6ec Mon Sep 17 00:00:00 2001
|
||||
From: Ezequiel Garcia <ezequiel@collabora.com>
|
||||
Date: Fri, 7 Jun 2019 21:35:01 -0300
|
||||
Subject: [PATCH] arm64: dts: rockchip: Enable HDMI audio on Rock Pi
|
||||
|
||||
This commit enables the hdmi-sound device needed to have
|
||||
audio over HDMI on the Rock Pi board.
|
||||
|
||||
Fixes: 1b5715c602fda ("arm64: dts: rockchip: add ROCK Pi 4 DTS support")
|
||||
Signed-off-by: Ezequiel Garcia <ezequiel@collabora.com>
|
||||
Signed-off-by: Heiko Stuebner <heiko@sntech.de>
|
||||
---
|
||||
arch/arm64/boot/dts/rockchip/rk3399-rock-pi-4.dtsi | 4 ++++
|
||||
1 file changed, 4 insertions(+)
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/rockchip/rk3399-rock-pi-4.dtsi b/arch/arm64/boot/dts/rockchip/rk3399-rock-pi-4.dtsi
|
||||
index 55e74f4d5cd0f..1ae1ebd4efdd0 100644
|
||||
--- a/arch/arm64/boot/dts/rockchip/rk3399-rock-pi-4.dtsi
|
||||
+++ b/arch/arm64/boot/dts/rockchip/rk3399-rock-pi-4.dtsi
|
||||
@@ -178,6 +178,10 @@
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
+&hdmi_sound {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
&i2c0 {
|
||||
clock-frequency = <400000>;
|
||||
i2c-scl-rising-time-ns = <168>;
|
||||
@ -1,55 +0,0 @@
|
||||
While mainlining Rock Pi 4 its leds were probably overlooked in the dts.
|
||||
Power led is not usable in currently available board revisions <= 1.4
|
||||
and is disabled in dts to not confuse users who would like to fiddle with it.
|
||||
|
||||
It could possibly be made controllable by its gpio with the help
|
||||
of soldering iron, steady hands, patience (SMD0402) and additional overlay
|
||||
to enable the led and its gpio pin in device tree.
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/rockchip/rk3399-rock-pi-4.dtsi b/arch/arm64/boot/dts/rockchip/rk3399-rock-pi-4.dtsi
|
||||
index e03062715..a97e02bc0 100644
|
||||
--- a/arch/arm64/boot/dts/rockchip/rk3399-rock-pi-4.dtsi
|
||||
+++ b/arch/arm64/boot/dts/rockchip/rk3399-rock-pi-4.dtsi
|
||||
@@ -111,6 +111,25 @@
|
||||
regulator-max-microvolt = <1400000>;
|
||||
vin-supply = <&vcc5v0_sys>;
|
||||
};
|
||||
+
|
||||
+ leds {
|
||||
+ compatible = "gpio-leds";
|
||||
+ pinctrl-names = "default";
|
||||
+ pinctrl-0 = <&power_led_gpio>, <&status_led_gpio>;
|
||||
+
|
||||
+ power-status {
|
||||
+ label = "power";
|
||||
+ gpios = <&gpio3 RK_PD4 GPIO_ACTIVE_HIGH>;
|
||||
+ linux,default-trigger = "default-on";
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
+
|
||||
+ system-status {
|
||||
+ label = "status";
|
||||
+ gpios = <&gpio3 RK_PD5 GPIO_ACTIVE_HIGH>;
|
||||
+ linux,default-trigger = "heartbeat";
|
||||
+ };
|
||||
+ };
|
||||
};
|
||||
|
||||
&cpu_l0 {
|
||||
@@ -457,6 +476,16 @@
|
||||
};
|
||||
};
|
||||
|
||||
+ leds {
|
||||
+ power_led_gpio: power_led_gpio {
|
||||
+ rockchip,pins = <3 RK_PD4 RK_FUNC_GPIO &pcfg_pull_none>;
|
||||
+ };
|
||||
+
|
||||
+ status_led_gpio: status_led_gpio {
|
||||
+ rockchip,pins = <3 RK_PD5 RK_FUNC_GPIO &pcfg_pull_none>;
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
pmic {
|
||||
pmic_int_l: pmic-int-l {
|
||||
rockchip,pins = <1 RK_PC5 RK_FUNC_GPIO &pcfg_pull_up>;
|
||||
@ -1,35 +0,0 @@
|
||||
diff --git a/arch/arm64/boot/dts/rockchip/rk3399-rock-pi-4.dtsi b/arch/arm64/boot/dts/rockchip/rk3399-rock-pi-4.dtsi
|
||||
index 1ae1ebd4e..2f84397d5 100644
|
||||
--- a/arch/arm64/boot/dts/rockchip/rk3399-rock-pi-4.dtsi
|
||||
+++ b/arch/arm64/boot/dts/rockchip/rk3399-rock-pi-4.dtsi
|
||||
@@ -62,6 +62,8 @@
|
||||
regulator-name = "vcc3v3_pcie";
|
||||
regulator-always-on;
|
||||
regulator-boot-on;
|
||||
+ regulator-min-microvolt = <3300000>;
|
||||
+ regulator-max-microvolt = <3300000>;
|
||||
vin-supply = <&vcc5v0_sys>;
|
||||
};
|
||||
|
||||
@@ -434,6 +459,21 @@
|
||||
gpio1830-supply = <&vcc_3v0>;
|
||||
};
|
||||
|
||||
+&pcie0 {
|
||||
+ ep-gpios = <&gpio4 RK_PD3 GPIO_ACTIVE_HIGH>;
|
||||
+ num-lanes = <4>;
|
||||
+ max-link-speed = <1>;
|
||||
+ pinctrl-names = "default";
|
||||
+ pinctrl-0 = <&pcie_clkreqnb_cpm>;
|
||||
+ vpcie12v-supply = <&vcc12v_dcin>;
|
||||
+ vpcie3v3-supply = <&vcc3v3_pcie>;
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&pcie_phy {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
&pmu_io_domains {
|
||||
status = "okay";
|
||||
|
||||
@ -1,22 +0,0 @@
|
||||
From e3ffe88f90644eddd0fa6ee8c9f324d54c3b7c39 Mon Sep 17 00:00:00 2001
|
||||
From: Igor Pecovnik <igor.pecovnik@gmail.com>
|
||||
Date: Tue, 4 Aug 2020 19:35:47 +0200
|
||||
Subject: [PATCH] Add DT link for backward compatibility
|
||||
|
||||
Signed-off-by: Igor Pecovnik <igor.pecovnik@gmail.com>
|
||||
---
|
||||
arch/arm64/boot/dts/rockchip/rk3399-rock-pi-4.dts | 1 +
|
||||
2 files changed, 2 insertions(+)
|
||||
create mode 120000 arch/arm64/boot/dts/rockchip/rk3399-rock-pi-4.dts
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/rockchip/rk3399-rock-pi-4.dts b/arch/arm64/boot/dts/rockchip/rk3399-rock-pi-4.dts
|
||||
new file mode 120000
|
||||
index 000000000..07e8a11b0
|
||||
--- /dev/null
|
||||
+++ b/arch/arm64/boot/dts/rockchip/rk3399-rock-pi-4.dts
|
||||
@@ -0,0 +1 @@
|
||||
+rk3399-rock-pi-4b.dts
|
||||
\ No newline at end of file
|
||||
--
|
||||
Created with Armbian build tools https://github.com/armbian/build
|
||||
|
||||
@ -1,10 +0,0 @@
|
||||
--- a/arch/arm64/boot/dts/rockchip/rk3399-rock-pi-4.dtsi 2021-01-21 12:54:16.967891868 +0800
|
||||
+++ b/arch/arm64/boot/dts/rockchip/rk3399-rock-pi-4.dtsi 2021-01-21 13:04:10.214771523 +0800
|
||||
@@ -697,6 +697,7 @@
|
||||
};
|
||||
|
||||
&sdhci {
|
||||
+ max-frequency = <150000000>;
|
||||
bus-width = <8>;
|
||||
mmc-hs400-1_8v;
|
||||
mmc-hs400-enhanced-strobe;
|
||||
@ -0,0 +1,73 @@
|
||||
diff --git a/Documentation/devicetree/bindings/extcon/extcon-usbc-virtual-pd.yaml b/Documentation/devicetree/bindings/extcon/extcon-usbc-virtual-pd.yaml
|
||||
new file mode 100644
|
||||
index 000000000000..8110fbe2ddc2
|
||||
--- /dev/null
|
||||
+++ b/Documentation/devicetree/bindings/extcon/extcon-usbc-virtual-pd.yaml
|
||||
@@ -0,0 +1,66 @@
|
||||
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
+%YAML 1.2
|
||||
+---
|
||||
+$id: http://devicetree.org/schemas/extcon/extcon-usbc-virtual-pd.yaml#
|
||||
+$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
+
|
||||
+title: Type-C Virtual PD extcon
|
||||
+
|
||||
+maintainers:
|
||||
+ - Jagan Teki <jagan@amarulasolutions.com>
|
||||
+
|
||||
+description: |
|
||||
+ USB Type-C protocol supports various modes of operations includes PD,
|
||||
+ USB3, and Altmode. If the platform design supports a Type-C connector
|
||||
+ then configuring these modes can be done via enumeration.
|
||||
+
|
||||
+ However, there are some platforms that design these modes as separate
|
||||
+ protocol connectors like design Display Port from on-chip USB3 controller.
|
||||
+ So we can access Type-C Altmode Display Port via onboard Display Port
|
||||
+ connector instead of a Type-C connector. These kinds of platforms require
|
||||
+ an explicit extcon driver in order to handle Power Delivery and
|
||||
+ Port Detection.
|
||||
+
|
||||
+properties:
|
||||
+ compatible:
|
||||
+ const: linux,extcon-usbc-virtual-pd
|
||||
+
|
||||
+ det-gpios:
|
||||
+ description: Detect GPIO pin. Pin can be Display Port Detect or USB ID.
|
||||
+ maxItems: 1
|
||||
+
|
||||
+ vpd-polarity:
|
||||
+ description: USB Type-C Polarity. false for Normal and true for Flip.
|
||||
+ type: boolean
|
||||
+
|
||||
+ vpd-super-speed:
|
||||
+ description: USB Super Speed. false for USB2 and true for USB3.
|
||||
+ type: boolean
|
||||
+
|
||||
+ vpd-data-role:
|
||||
+ description: USB Data roles for Virtual Type-C.
|
||||
+ $ref: /schemas/types.yaml#definitions/string
|
||||
+
|
||||
+ enum:
|
||||
+ - host
|
||||
+ - device
|
||||
+ - display-port
|
||||
+
|
||||
+required:
|
||||
+ - compatible
|
||||
+ - det-gpios
|
||||
+ - vpd-data-role
|
||||
+
|
||||
+additionalProperties: false
|
||||
+
|
||||
+examples:
|
||||
+ - |
|
||||
+ #include <dt-bindings/gpio/gpio.h>
|
||||
+ #include <dt-bindings/pinctrl/rockchip.h>
|
||||
+
|
||||
+ virtual_pd: virtual-pd {
|
||||
+ compatible = "linux,extcon-usbc-virtual-pd";
|
||||
+ det-gpios = <&gpio4 RK_PD1 GPIO_ACTIVE_LOW>;
|
||||
+ vpd-data-role = "display-port";
|
||||
+ vpd-super-speed;
|
||||
+ };
|
||||
|
||||
@ -0,0 +1,337 @@
|
||||
diff --git a/MAINTAINERS b/MAINTAINERS
|
||||
index 68f21d46614c..aeb161b19dae 100644
|
||||
--- a/MAINTAINERS
|
||||
+++ b/MAINTAINERS
|
||||
@@ -6466,6 +6466,12 @@ T: git git://git.kernel.org/pub/scm/linux/kernel/git/tytso/ext4.git
|
||||
F: Documentation/filesystems/ext4/
|
||||
F: fs/ext4/
|
||||
|
||||
+EXTCON DRIVER FOR TYPE-C VIRTUAL PD
|
||||
+M: Jagan Teki <jagan@amarulasolutions.com>
|
||||
+S: Maintained
|
||||
+F: Documentation/devicetree/bindings/extcon/extcon-usbc-virtual-pd.yaml
|
||||
+F: drivers/extcon/extcon-usbc-virtual-pd.c
|
||||
+
|
||||
Extended Verification Module (EVM)
|
||||
M: Mimi Zohar <zohar@linux.ibm.com>
|
||||
L: linux-integrity@vger.kernel.org
|
||||
diff --git a/drivers/extcon/Kconfig b/drivers/extcon/Kconfig
|
||||
index aac507bff135..edd6c3c52699 100644
|
||||
--- a/drivers/extcon/Kconfig
|
||||
+++ b/drivers/extcon/Kconfig
|
||||
@@ -186,4 +186,14 @@ config EXTCON_USBC_CROS_EC
|
||||
Say Y here to enable USB Type C cable detection extcon support when
|
||||
using Chrome OS EC based USB Type-C ports.
|
||||
|
||||
+config EXTCON_USBC_VIRTUAL_PD
|
||||
+ tristate "Virtual Type-C PD EXTCON support"
|
||||
+ depends on GPIOLIB || COMPILE_TEST
|
||||
+ help
|
||||
+ Say Y here to enable Virtual Type-C PD extcon driver support, if
|
||||
+ hardware platform designed Type-C modes separately.
|
||||
+
|
||||
+ Example, of designing Display Port separately from Type-C Altmode
|
||||
+ instead of accessing Altmode Display Port in Type-C connector.
|
||||
+
|
||||
endif
|
||||
diff --git a/drivers/extcon/Makefile b/drivers/extcon/Makefile
|
||||
index 52096fd8a216..c35191eef0e1 100644
|
||||
--- a/drivers/extcon/Makefile
|
||||
+++ b/drivers/extcon/Makefile
|
||||
@@ -25,3 +25,4 @@ obj-$(CONFIG_EXTCON_RT8973A) += extcon-rt8973a.o
|
||||
obj-$(CONFIG_EXTCON_USB_GPIO) += extcon-usb-gpio.o
|
||||
obj-$(CONFIG_EXTCON_USBC_CROS_EC) += extcon-usbc-cros-ec.o
|
||||
obj-$(CONFIG_EXTCON_USBC_TUSB320) += extcon-usbc-tusb320.o
|
||||
+obj-$(CONFIG_EXTCON_USBC_VIRTUAL_PD) += extcon-usbc-virtual-pd.o
|
||||
diff --git a/drivers/extcon/extcon-usbc-virtual-pd.c b/drivers/extcon/extcon-usbc-virtual-pd.c
|
||||
new file mode 100644
|
||||
index 000000000000..e0713670e33d
|
||||
--- /dev/null
|
||||
+++ b/drivers/extcon/extcon-usbc-virtual-pd.c
|
||||
@@ -0,0 +1,285 @@
|
||||
+// SPDX-License-Identifier: GPL-2.0-only
|
||||
+/*
|
||||
+ * Type-C Virtual PD Extcon driver
|
||||
+ *
|
||||
+ * Copyright (c) 2019 Fuzhou Rockchip Electronics Co., Ltd
|
||||
+ * Copyright (c) 2019 Radxa Limited
|
||||
+ * Copyright (c) 2019 Amarula Solutions(India)
|
||||
+ */
|
||||
+
|
||||
+#include <linux/extcon-provider.h>
|
||||
+#include <linux/gpio.h>
|
||||
+#include <linux/interrupt.h>
|
||||
+#include <linux/init.h>
|
||||
+#include <linux/irq.h>
|
||||
+#include <linux/kernel.h>
|
||||
+#include <linux/module.h>
|
||||
+#include <linux/of_gpio.h>
|
||||
+#include <linux/platform_device.h>
|
||||
+#include <linux/slab.h>
|
||||
+
|
||||
+static const unsigned int vpd_cable[] = {
|
||||
+ EXTCON_USB,
|
||||
+ EXTCON_USB_HOST,
|
||||
+ EXTCON_DISP_DP,
|
||||
+ EXTCON_NONE,
|
||||
+};
|
||||
+
|
||||
+enum vpd_data_role {
|
||||
+ DR_NONE,
|
||||
+ DR_HOST,
|
||||
+ DR_DEVICE,
|
||||
+ DR_DISPLAY_PORT,
|
||||
+};
|
||||
+
|
||||
+enum vpd_polarity {
|
||||
+ POLARITY_NORMAL,
|
||||
+ POLARITY_FLIP,
|
||||
+};
|
||||
+
|
||||
+enum vpd_usb_ss {
|
||||
+ USB_SS_USB2,
|
||||
+ USB_SS_USB3,
|
||||
+};
|
||||
+
|
||||
+struct vpd_extcon {
|
||||
+ struct device *dev;
|
||||
+ struct extcon_dev *extcon;
|
||||
+ struct gpio_desc *det_gpio;
|
||||
+
|
||||
+ u8 polarity;
|
||||
+ u8 usb_ss;
|
||||
+ enum vpd_data_role data_role;
|
||||
+
|
||||
+ int irq;
|
||||
+ bool enable_irq;
|
||||
+ struct work_struct work;
|
||||
+ struct delayed_work irq_work;
|
||||
+};
|
||||
+
|
||||
+static void vpd_extcon_irq_work(struct work_struct *work)
|
||||
+{
|
||||
+ struct vpd_extcon *vpd = container_of(work, struct vpd_extcon, irq_work.work);
|
||||
+ bool host_connected = false, device_connected = false, dp_connected = false;
|
||||
+ union extcon_property_value property;
|
||||
+ int det;
|
||||
+
|
||||
+ det = vpd->det_gpio ? gpiod_get_raw_value(vpd->det_gpio) : 0;
|
||||
+ if (det) {
|
||||
+ device_connected = (vpd->data_role == DR_DEVICE) ? true : false;
|
||||
+ host_connected = (vpd->data_role == DR_HOST) ? true : false;
|
||||
+ dp_connected = (vpd->data_role == DR_DISPLAY_PORT) ? true : false;
|
||||
+ }
|
||||
+
|
||||
+ extcon_set_state(vpd->extcon, EXTCON_USB, host_connected);
|
||||
+ extcon_set_state(vpd->extcon, EXTCON_USB_HOST, device_connected);
|
||||
+ extcon_set_state(vpd->extcon, EXTCON_DISP_DP, dp_connected);
|
||||
+
|
||||
+ property.intval = vpd->polarity;
|
||||
+ extcon_set_property(vpd->extcon, EXTCON_USB,
|
||||
+ EXTCON_PROP_USB_TYPEC_POLARITY, property);
|
||||
+ extcon_set_property(vpd->extcon, EXTCON_USB_HOST,
|
||||
+ EXTCON_PROP_USB_TYPEC_POLARITY, property);
|
||||
+ extcon_set_property(vpd->extcon, EXTCON_DISP_DP,
|
||||
+ EXTCON_PROP_USB_TYPEC_POLARITY, property);
|
||||
+
|
||||
+ property.intval = vpd->usb_ss;
|
||||
+ extcon_set_property(vpd->extcon, EXTCON_USB,
|
||||
+ EXTCON_PROP_USB_SS, property);
|
||||
+ extcon_set_property(vpd->extcon, EXTCON_USB_HOST,
|
||||
+ EXTCON_PROP_USB_SS, property);
|
||||
+ extcon_set_property(vpd->extcon, EXTCON_DISP_DP,
|
||||
+ EXTCON_PROP_USB_SS, property);
|
||||
+
|
||||
+ extcon_sync(vpd->extcon, EXTCON_USB);
|
||||
+ extcon_sync(vpd->extcon, EXTCON_USB_HOST);
|
||||
+ extcon_sync(vpd->extcon, EXTCON_DISP_DP);
|
||||
+}
|
||||
+
|
||||
+static irqreturn_t vpd_extcon_irq_handler(int irq, void *dev_id)
|
||||
+{
|
||||
+ struct vpd_extcon *vpd = dev_id;
|
||||
+
|
||||
+ schedule_delayed_work(&vpd->irq_work, msecs_to_jiffies(10));
|
||||
+
|
||||
+ return IRQ_HANDLED;
|
||||
+}
|
||||
+
|
||||
+static enum vpd_data_role vpd_extcon_data_role(struct vpd_extcon *vpd)
|
||||
+{
|
||||
+ const char *const data_roles[] = {
|
||||
+ [DR_NONE] = "NONE",
|
||||
+ [DR_HOST] = "host",
|
||||
+ [DR_DEVICE] = "device",
|
||||
+ [DR_DISPLAY_PORT] = "display-port",
|
||||
+ };
|
||||
+ struct device *dev = vpd->dev;
|
||||
+ int ret;
|
||||
+ const char *dr;
|
||||
+
|
||||
+ ret = device_property_read_string(dev, "vpd-data-role", &dr);
|
||||
+ if (ret < 0)
|
||||
+ return DR_NONE;
|
||||
+
|
||||
+ ret = match_string(data_roles, ARRAY_SIZE(data_roles), dr);
|
||||
+
|
||||
+ return (ret < 0) ? DR_NONE : ret;
|
||||
+}
|
||||
+
|
||||
+static int vpd_extcon_parse_dts(struct vpd_extcon *vpd)
|
||||
+{
|
||||
+ struct device *dev = vpd->dev;
|
||||
+ bool val = false;
|
||||
+ int ret;
|
||||
+
|
||||
+ val = device_property_read_bool(dev, "vpd-polarity");
|
||||
+ if (val)
|
||||
+ vpd->polarity = POLARITY_FLIP;
|
||||
+ else
|
||||
+ vpd->polarity = POLARITY_NORMAL;
|
||||
+
|
||||
+ val = device_property_read_bool(dev, "vpd-super-speed");
|
||||
+ if (val)
|
||||
+ vpd->usb_ss = USB_SS_USB3;
|
||||
+ else
|
||||
+ vpd->usb_ss = USB_SS_USB2;
|
||||
+
|
||||
+ vpd->data_role = vpd_extcon_data_role(vpd);
|
||||
+
|
||||
+ vpd->det_gpio = devm_gpiod_get_optional(dev, "det", GPIOD_OUT_LOW);
|
||||
+ if (IS_ERR(vpd->det_gpio)) {
|
||||
+ ret = PTR_ERR(vpd->det_gpio);
|
||||
+ dev_warn(dev, "failed to get det gpio: %d\n", ret);
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ vpd->irq = gpiod_to_irq(vpd->det_gpio);
|
||||
+ if (vpd->irq < 0) {
|
||||
+ dev_err(dev, "failed to get irq for gpio: %d\n", vpd->irq);
|
||||
+ return vpd->irq;
|
||||
+ }
|
||||
+
|
||||
+ ret = devm_request_threaded_irq(dev, vpd->irq, NULL,
|
||||
+ vpd_extcon_irq_handler,
|
||||
+ IRQF_TRIGGER_FALLING |
|
||||
+ IRQF_TRIGGER_RISING | IRQF_ONESHOT,
|
||||
+ NULL, vpd);
|
||||
+ if (ret)
|
||||
+ dev_err(dev, "failed to request gpio irq\n");
|
||||
+
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+static int vpd_extcon_probe(struct platform_device *pdev)
|
||||
+{
|
||||
+ struct vpd_extcon *vpd;
|
||||
+ struct device *dev = &pdev->dev;
|
||||
+ int ret;
|
||||
+
|
||||
+ vpd = devm_kzalloc(dev, sizeof(*vpd), GFP_KERNEL);
|
||||
+ if (!vpd)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ vpd->dev = dev;
|
||||
+ ret = vpd_extcon_parse_dts(vpd);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ INIT_DELAYED_WORK(&vpd->irq_work, vpd_extcon_irq_work);
|
||||
+
|
||||
+ vpd->extcon = devm_extcon_dev_allocate(dev, vpd_cable);
|
||||
+ if (IS_ERR(vpd->extcon)) {
|
||||
+ dev_err(dev, "allocat extcon failed\n");
|
||||
+ return PTR_ERR(vpd->extcon);
|
||||
+ }
|
||||
+
|
||||
+ ret = devm_extcon_dev_register(dev, vpd->extcon);
|
||||
+ if (ret) {
|
||||
+ dev_err(dev, "register extcon failed: %d\n", ret);
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ extcon_set_property_capability(vpd->extcon, EXTCON_USB,
|
||||
+ EXTCON_PROP_USB_VBUS);
|
||||
+ extcon_set_property_capability(vpd->extcon, EXTCON_USB_HOST,
|
||||
+ EXTCON_PROP_USB_VBUS);
|
||||
+
|
||||
+ extcon_set_property_capability(vpd->extcon, EXTCON_USB,
|
||||
+ EXTCON_PROP_USB_TYPEC_POLARITY);
|
||||
+ extcon_set_property_capability(vpd->extcon, EXTCON_USB_HOST,
|
||||
+ EXTCON_PROP_USB_TYPEC_POLARITY);
|
||||
+ extcon_set_property_capability(vpd->extcon, EXTCON_USB,
|
||||
+ EXTCON_PROP_USB_SS);
|
||||
+ extcon_set_property_capability(vpd->extcon, EXTCON_USB_HOST,
|
||||
+ EXTCON_PROP_USB_SS);
|
||||
+
|
||||
+ extcon_set_property_capability(vpd->extcon, EXTCON_DISP_DP,
|
||||
+ EXTCON_PROP_USB_SS);
|
||||
+ extcon_set_property_capability(vpd->extcon, EXTCON_DISP_DP,
|
||||
+ EXTCON_PROP_USB_TYPEC_POLARITY);
|
||||
+
|
||||
+ platform_set_drvdata(pdev, vpd);
|
||||
+
|
||||
+ vpd_extcon_irq_work(&vpd->irq_work.work);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int vpd_extcon_remove(struct platform_device *pdev)
|
||||
+{
|
||||
+ struct vpd_extcon *vpd = platform_get_drvdata(pdev);
|
||||
+
|
||||
+ cancel_delayed_work_sync(&vpd->irq_work);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+#ifdef CONFIG_PM_SLEEP
|
||||
+static int vpd_extcon_suspend(struct device *dev)
|
||||
+{
|
||||
+ struct vpd_extcon *vpd = dev_get_drvdata(dev);
|
||||
+
|
||||
+ if (!vpd->enable_irq) {
|
||||
+ disable_irq_nosync(vpd->irq);
|
||||
+ vpd->enable_irq = true;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int vpd_extcon_resume(struct device *dev)
|
||||
+{
|
||||
+ struct vpd_extcon *vpd = dev_get_drvdata(dev);
|
||||
+
|
||||
+ if (vpd->enable_irq) {
|
||||
+ enable_irq(vpd->irq);
|
||||
+ vpd->enable_irq = false;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+#endif
|
||||
+
|
||||
+static SIMPLE_DEV_PM_OPS(vpd_extcon_pm_ops,
|
||||
+ vpd_extcon_suspend, vpd_extcon_resume);
|
||||
+
|
||||
+static const struct of_device_id vpd_extcon_dt_match[] = {
|
||||
+ { .compatible = "linux,extcon-usbc-virtual-pd", },
|
||||
+ { /* sentinel */ }
|
||||
+};
|
||||
+
|
||||
+static struct platform_driver vpd_extcon_driver = {
|
||||
+ .probe = vpd_extcon_probe,
|
||||
+ .remove = vpd_extcon_remove,
|
||||
+ .driver = {
|
||||
+ .name = "extcon-usbc-virtual-pd",
|
||||
+ .pm = &vpd_extcon_pm_ops,
|
||||
+ .of_match_table = vpd_extcon_dt_match,
|
||||
+ },
|
||||
+};
|
||||
+
|
||||
+module_platform_driver(vpd_extcon_driver);
|
||||
+
|
||||
+MODULE_AUTHOR("Jagan Teki <jagan@amarulasolutions.com>");
|
||||
+MODULE_DESCRIPTION("Type-C Virtual PD extcon driver");
|
||||
+MODULE_LICENSE("GPL v2");
|
||||
|
||||
@ -0,0 +1,257 @@
|
||||
From 26e61cffb09c1f5519a4eeb9d9e99239d58b6c2d Mon Sep 17 00:00:00 2001
|
||||
From: Ondrej Jirman <megous@megous.com>
|
||||
Date: Thu, 1 Jul 2021 11:22:23 +0200
|
||||
Subject: [PATCH 302/467] Bluetooth: btrtl: add support for the RTL8723CS
|
||||
|
||||
The Realtek RTL8723CS is SDIO WiFi chip. It also contains a Bluetooth
|
||||
module which is connected via UART to the host.
|
||||
|
||||
It shares lmp subversion with 8703B, so Realtek's userspace
|
||||
initialization tool (rtk_hciattach) differentiates varieties of RTL8723CS
|
||||
(CG, VF, XX) with RTL8703B using vendor's command to read chip type.
|
||||
|
||||
Also this chip declares support for some features it doesn't support
|
||||
so add a quirk to indicate that these features are broken.
|
||||
|
||||
Signed-off-by: Vasily Khoruzhick <anarsoul@gmail.com>
|
||||
Signed-off-by: Ondrej Jirman <megous@megous.com>
|
||||
---
|
||||
drivers/bluetooth/btrtl.c | 119 +++++++++++++++++++++++++++++++++++++-
|
||||
drivers/bluetooth/btrtl.h | 5 ++
|
||||
2 files changed, 121 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/drivers/bluetooth/btrtl.c b/drivers/bluetooth/btrtl.c
|
||||
index 1f8afa024..fd293a9c4 100644
|
||||
--- a/drivers/bluetooth/btrtl.c
|
||||
+++ b/drivers/bluetooth/btrtl.c
|
||||
@@ -17,7 +17,12 @@
|
||||
|
||||
#define VERSION "0.1"
|
||||
|
||||
+#define RTL_CHIP_8723CS_CG 3
|
||||
+#define RTL_CHIP_8723CS_VF 4
|
||||
+#define RTL_CHIP_8723CS_XX 5
|
||||
#define RTL_EPATCH_SIGNATURE "Realtech"
|
||||
+#define RTL_ROM_LMP_3499 0x3499
|
||||
+#define RTL_ROM_LMP_8703B 0x8703
|
||||
#define RTL_ROM_LMP_8723A 0x1200
|
||||
#define RTL_ROM_LMP_8723B 0x8723
|
||||
#define RTL_ROM_LMP_8821A 0x8821
|
||||
@@ -30,6 +35,7 @@
|
||||
#define IC_MATCH_FL_HCIREV (1 << 1)
|
||||
#define IC_MATCH_FL_HCIVER (1 << 2)
|
||||
#define IC_MATCH_FL_HCIBUS (1 << 3)
|
||||
+#define IC_MATCH_FL_CHIP_TYPE (1 << 4)
|
||||
#define IC_INFO(lmps, hcir, hciv, bus) \
|
||||
.match_flags = IC_MATCH_FL_LMPSUBV | IC_MATCH_FL_HCIREV | \
|
||||
IC_MATCH_FL_HCIVER | IC_MATCH_FL_HCIBUS, \
|
||||
@@ -57,6 +63,7 @@ struct id_table {
|
||||
__u16 hci_rev;
|
||||
__u8 hci_ver;
|
||||
__u8 hci_bus;
|
||||
+ __u8 chip_type;
|
||||
bool config_needed;
|
||||
bool has_rom_version;
|
||||
char *fw_name;
|
||||
@@ -96,6 +103,39 @@ static const struct id_table ic_id_table[] = {
|
||||
.fw_name = "rtl_bt/rtl8723b_fw.bin",
|
||||
.cfg_name = "rtl_bt/rtl8723b_config" },
|
||||
|
||||
+ /* 8723CS-CG */
|
||||
+ { .match_flags = IC_MATCH_FL_LMPSUBV | IC_MATCH_FL_CHIP_TYPE |
|
||||
+ IC_MATCH_FL_HCIBUS,
|
||||
+ .lmp_subver = RTL_ROM_LMP_8703B,
|
||||
+ .chip_type = RTL_CHIP_8723CS_CG,
|
||||
+ .hci_bus = HCI_UART,
|
||||
+ .config_needed = true,
|
||||
+ .has_rom_version = true,
|
||||
+ .fw_name = "rtl_bt/rtl8723cs_cg_fw.bin",
|
||||
+ .cfg_name = "rtl_bt/rtl8723cs_cg_config" },
|
||||
+
|
||||
+ /* 8723CS-VF */
|
||||
+ { .match_flags = IC_MATCH_FL_LMPSUBV | IC_MATCH_FL_CHIP_TYPE |
|
||||
+ IC_MATCH_FL_HCIBUS,
|
||||
+ .lmp_subver = RTL_ROM_LMP_8703B,
|
||||
+ .chip_type = RTL_CHIP_8723CS_VF,
|
||||
+ .hci_bus = HCI_UART,
|
||||
+ .config_needed = true,
|
||||
+ .has_rom_version = true,
|
||||
+ .fw_name = "rtl_bt/rtl8723cs_vf_fw.bin",
|
||||
+ .cfg_name = "rtl_bt/rtl8723cs_vf_config" },
|
||||
+
|
||||
+ /* 8723CS-XX */
|
||||
+ { .match_flags = IC_MATCH_FL_LMPSUBV | IC_MATCH_FL_CHIP_TYPE |
|
||||
+ IC_MATCH_FL_HCIBUS,
|
||||
+ .lmp_subver = RTL_ROM_LMP_8703B,
|
||||
+ .chip_type = RTL_CHIP_8723CS_XX,
|
||||
+ .hci_bus = HCI_UART,
|
||||
+ .config_needed = true,
|
||||
+ .has_rom_version = true,
|
||||
+ .fw_name = "rtl_bt/rtl8723cs_xx_fw.bin",
|
||||
+ .cfg_name = "rtl_bt/rtl8723cs_xx_config" },
|
||||
+
|
||||
/* 8723D */
|
||||
{ IC_INFO(RTL_ROM_LMP_8723B, 0xd, 0x8, HCI_USB),
|
||||
.config_needed = true,
|
||||
@@ -175,7 +215,8 @@ static const struct id_table ic_id_table[] = {
|
||||
};
|
||||
|
||||
static const struct id_table *btrtl_match_ic(u16 lmp_subver, u16 hci_rev,
|
||||
- u8 hci_ver, u8 hci_bus)
|
||||
+ u8 hci_ver, u8 hci_bus,
|
||||
+ u8 chip_type)
|
||||
{
|
||||
int i;
|
||||
|
||||
@@ -192,6 +233,9 @@ static const struct id_table *btrtl_match_ic(u16 lmp_subver, u16 hci_rev,
|
||||
if ((ic_id_table[i].match_flags & IC_MATCH_FL_HCIBUS) &&
|
||||
(ic_id_table[i].hci_bus != hci_bus))
|
||||
continue;
|
||||
+ if ((ic_id_table[i].match_flags & IC_MATCH_FL_CHIP_TYPE) &&
|
||||
+ (ic_id_table[i].chip_type != chip_type))
|
||||
+ continue;
|
||||
|
||||
break;
|
||||
}
|
||||
@@ -274,6 +318,7 @@ static int rtlbt_parse_firmware(struct hci_dev *hdev,
|
||||
{ RTL_ROM_LMP_8723B, 1 },
|
||||
{ RTL_ROM_LMP_8821A, 2 },
|
||||
{ RTL_ROM_LMP_8761A, 3 },
|
||||
+ { RTL_ROM_LMP_8703B, 7 },
|
||||
{ RTL_ROM_LMP_8822B, 8 },
|
||||
{ RTL_ROM_LMP_8723B, 9 }, /* 8723D */
|
||||
{ RTL_ROM_LMP_8821A, 10 }, /* 8821C */
|
||||
@@ -552,6 +597,48 @@ static int btrtl_setup_rtl8723b(struct hci_dev *hdev,
|
||||
return ret;
|
||||
}
|
||||
|
||||
+static bool rtl_has_chip_type(u16 lmp_subver)
|
||||
+{
|
||||
+ switch (lmp_subver) {
|
||||
+ case RTL_ROM_LMP_8703B:
|
||||
+ return true;
|
||||
+ default:
|
||||
+ break;
|
||||
+ }
|
||||
+
|
||||
+ return false;
|
||||
+}
|
||||
+
|
||||
+static int rtl_read_chip_type(struct hci_dev *hdev, u8 *type)
|
||||
+{
|
||||
+ struct rtl_chip_type_evt *chip_type;
|
||||
+ struct sk_buff *skb;
|
||||
+ const unsigned char cmd_buf[] = {0x00, 0x94, 0xa0, 0x00, 0xb0};
|
||||
+
|
||||
+ /* Read RTL chip type command */
|
||||
+ skb = __hci_cmd_sync(hdev, 0xfc61, 5, cmd_buf, HCI_INIT_TIMEOUT);
|
||||
+ if (IS_ERR(skb)) {
|
||||
+ rtl_dev_err(hdev, "Read chip type failed (%ld)",
|
||||
+ PTR_ERR(skb));
|
||||
+ return PTR_ERR(skb);
|
||||
+ }
|
||||
+
|
||||
+ if (skb->len != sizeof(*chip_type)) {
|
||||
+ rtl_dev_err(hdev, "RTL chip type event length mismatch");
|
||||
+ kfree_skb(skb);
|
||||
+ return -EIO;
|
||||
+ }
|
||||
+
|
||||
+ chip_type = (struct rtl_chip_type_evt *)skb->data;
|
||||
+ rtl_dev_info(hdev, "chip_type status=%x type=%x",
|
||||
+ chip_type->status, chip_type->type);
|
||||
+
|
||||
+ *type = chip_type->type & 0x0f;
|
||||
+
|
||||
+ kfree_skb(skb);
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
void btrtl_free(struct btrtl_device_info *btrtl_dev)
|
||||
{
|
||||
kvfree(btrtl_dev->fw_data);
|
||||
@@ -568,7 +655,7 @@ struct btrtl_device_info *btrtl_initialize(struct hci_dev *hdev,
|
||||
struct hci_rp_read_local_version *resp;
|
||||
char cfg_name[40];
|
||||
u16 hci_rev, lmp_subver;
|
||||
- u8 hci_ver;
|
||||
+ u8 hci_ver, chip_type = 0;
|
||||
int ret;
|
||||
u16 opcode;
|
||||
u8 cmd[2];
|
||||
@@ -638,8 +725,14 @@ struct btrtl_device_info *btrtl_initialize(struct hci_dev *hdev,
|
||||
out_free:
|
||||
kfree_skb(skb);
|
||||
|
||||
+ if (rtl_has_chip_type(lmp_subver)) {
|
||||
+ ret = rtl_read_chip_type(hdev, &chip_type);
|
||||
+ if (ret)
|
||||
+ goto err_free;
|
||||
+ }
|
||||
+
|
||||
btrtl_dev->ic_info = btrtl_match_ic(lmp_subver, hci_rev, hci_ver,
|
||||
- hdev->bus);
|
||||
+ hdev->bus, chip_type);
|
||||
|
||||
if (!btrtl_dev->ic_info) {
|
||||
rtl_dev_info(hdev, "unknown IC info, lmp subver %04x, hci rev %04x, hci ver %04x",
|
||||
@@ -722,6 +815,7 @@ int btrtl_download_firmware(struct hci_dev *hdev,
|
||||
case RTL_ROM_LMP_8761A:
|
||||
case RTL_ROM_LMP_8822B:
|
||||
case RTL_ROM_LMP_8852A:
|
||||
+ case RTL_ROM_LMP_8703B:
|
||||
return btrtl_setup_rtl8723b(hdev, btrtl_dev);
|
||||
default:
|
||||
rtl_dev_info(hdev, "assuming no firmware upload needed");
|
||||
@@ -752,6 +846,19 @@ void btrtl_set_quirks(struct hci_dev *hdev, struct btrtl_device_info *btrtl_dev)
|
||||
rtl_dev_dbg(hdev, "WBS supported not enabled.");
|
||||
break;
|
||||
}
|
||||
+
|
||||
+ switch (btrtl_dev->ic_info->lmp_subver) {
|
||||
+ case RTL_ROM_LMP_8703B:
|
||||
+ /* 8723CS reports two pages for local ext features,
|
||||
+ * but it doesn't support any features from page 2 -
|
||||
+ * it either responds with garbage or with error status
|
||||
+ */
|
||||
+ set_bit(HCI_QUIRK_BROKEN_LOCAL_EXT_FTR_MAX_PAGE,
|
||||
+ &hdev->quirks);
|
||||
+ break;
|
||||
+ default:
|
||||
+ break;
|
||||
+ }
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(btrtl_set_quirks);
|
||||
|
||||
@@ -910,6 +1017,12 @@ MODULE_FIRMWARE("rtl_bt/rtl8723b_fw.bin");
|
||||
MODULE_FIRMWARE("rtl_bt/rtl8723b_config.bin");
|
||||
MODULE_FIRMWARE("rtl_bt/rtl8723bs_fw.bin");
|
||||
MODULE_FIRMWARE("rtl_bt/rtl8723bs_config.bin");
|
||||
+MODULE_FIRMWARE("rtl_bt/rtl8723cs_cg_fw.bin");
|
||||
+MODULE_FIRMWARE("rtl_bt/rtl8723cs_cg_config.bin");
|
||||
+MODULE_FIRMWARE("rtl_bt/rtl8723cs_vf_fw.bin");
|
||||
+MODULE_FIRMWARE("rtl_bt/rtl8723cs_vf_config.bin");
|
||||
+MODULE_FIRMWARE("rtl_bt/rtl8723cs_xx_fw.bin");
|
||||
+MODULE_FIRMWARE("rtl_bt/rtl8723cs_xx_config.bin");
|
||||
MODULE_FIRMWARE("rtl_bt/rtl8723ds_fw.bin");
|
||||
MODULE_FIRMWARE("rtl_bt/rtl8723ds_config.bin");
|
||||
MODULE_FIRMWARE("rtl_bt/rtl8761a_fw.bin");
|
||||
diff --git a/drivers/bluetooth/btrtl.h b/drivers/bluetooth/btrtl.h
|
||||
index 2c441bda3..1c6282241 100644
|
||||
--- a/drivers/bluetooth/btrtl.h
|
||||
+++ b/drivers/bluetooth/btrtl.h
|
||||
@@ -14,6 +14,11 @@
|
||||
|
||||
struct btrtl_device_info;
|
||||
|
||||
+struct rtl_chip_type_evt {
|
||||
+ __u8 status;
|
||||
+ __u8 type;
|
||||
+} __packed;
|
||||
+
|
||||
struct rtl_download_cmd {
|
||||
__u8 index;
|
||||
__u8 data[RTL_FRAG_LEN];
|
||||
--
|
||||
2.34.0
|
||||
|
||||
@ -0,0 +1,31 @@
|
||||
From 8fc0422773dc5274fa32e2a5a6ce2e1f0a96d78c Mon Sep 17 00:00:00 2001
|
||||
From: Vasily Khoruzhick <anarsoul@gmail.com>
|
||||
Date: Wed, 31 Oct 2018 20:07:41 -0700
|
||||
Subject: [PATCH 304/467] Bluetooth: hci_h5: Add support for binding RTL8723CS
|
||||
with device tree
|
||||
|
||||
RTL8723CS is often used in ARM boards, so add ability to bind it
|
||||
using device tree.
|
||||
|
||||
Signed-off-by: Vasily Khoruzhick <anarsoul@gmail.com>
|
||||
Signed-off-by: Ondrej Jirman <megous@megous.com>
|
||||
---
|
||||
drivers/bluetooth/hci_h5.c | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
diff --git a/drivers/bluetooth/hci_h5.c b/drivers/bluetooth/hci_h5.c
|
||||
index d49a39d17..c9b54335a 100644
|
||||
--- a/drivers/bluetooth/hci_h5.c
|
||||
+++ b/drivers/bluetooth/hci_h5.c
|
||||
@@ -1100,6 +1100,8 @@ static const struct of_device_id rtl_bluetooth_of_match[] = {
|
||||
.data = (const void *)&h5_data_rtl8723bs },
|
||||
{ .compatible = "realtek,rtl8723ds-bt",
|
||||
.data = (const void *)&h5_data_rtl8723bs },
|
||||
+ { .compatible = "realtek,rtl8723cs-bt",
|
||||
+ .data = (const void *)&h5_data_rtl8723bs },
|
||||
#endif
|
||||
{ },
|
||||
};
|
||||
--
|
||||
2.34.0
|
||||
|
||||
@ -0,0 +1,42 @@
|
||||
From f0c05140b92cca447cd55a93ad4de141d0f117f1 Mon Sep 17 00:00:00 2001
|
||||
From: Paolo Sabatino <paolo.sabatino@gmail.com>
|
||||
Date: Thu, 9 Dec 2021 22:47:36 +0000
|
||||
Subject: [PATCH] rtl8703bs: add chip type to list and info block
|
||||
|
||||
---
|
||||
drivers/bluetooth/btrtl.c | 12 ++++++++++++
|
||||
1 file changed, 12 insertions(+)
|
||||
|
||||
diff --git a/drivers/bluetooth/btrtl.c b/drivers/bluetooth/btrtl.c
|
||||
index ad4085eede4..2c227bf4e00 100644
|
||||
--- a/drivers/bluetooth/btrtl.c
|
||||
+++ b/drivers/bluetooth/btrtl.c
|
||||
@@ -20,6 +20,7 @@
|
||||
#define RTL_CHIP_8723CS_CG 3
|
||||
#define RTL_CHIP_8723CS_VF 4
|
||||
#define RTL_CHIP_8723CS_XX 5
|
||||
+#define RTL_CHIP_8703BS 7
|
||||
#define RTL_EPATCH_SIGNATURE "Realtech"
|
||||
#define RTL_ROM_LMP_3499 0x3499
|
||||
#define RTL_ROM_LMP_8703B 0x8703
|
||||
@@ -136,6 +137,17 @@ static const struct id_table ic_id_table[] = {
|
||||
.fw_name = "rtl_bt/rtl8723cs_xx_fw.bin",
|
||||
.cfg_name = "rtl_bt/rtl8723cs_xx_config" },
|
||||
|
||||
+ /* 8703BS */
|
||||
+ { .match_flags = IC_MATCH_FL_LMPSUBV | IC_MATCH_FL_CHIP_TYPE |
|
||||
+ IC_MATCH_FL_HCIBUS,
|
||||
+ .lmp_subver = RTL_ROM_LMP_8703B,
|
||||
+ .chip_type = RTL_CHIP_8703BS,
|
||||
+ .hci_bus = HCI_UART,
|
||||
+ .config_needed = true,
|
||||
+ .has_rom_version = true,
|
||||
+ .fw_name = "rtl_bt/rtl8723cs_xx_fw.bin",
|
||||
+ .cfg_name = "rtl_bt/rtl8723cs_xx_config" },
|
||||
+
|
||||
/* 8723D */
|
||||
{ IC_INFO(RTL_ROM_LMP_8723B, 0xd, 0x8, HCI_USB),
|
||||
.config_needed = true,
|
||||
--
|
||||
2.30.2
|
||||
|
||||
@ -65,7 +65,7 @@ index e69de29..9512445 100644
|
||||
+
|
||||
+Activates TWI/I2C bus 8
|
||||
+
|
||||
+I2C8 pins (pi-conn) (SCL, SDA): GPIO1-C5, GPIO1-C4
|
||||
+I2C8 pins (pi-conn) (pi-conn) (SCL, SDA): GPIO1-C5, GPIO1-C4
|
||||
+
|
||||
+### pcie-gen2
|
||||
+
|
||||
|
||||
@ -0,0 +1,26 @@
|
||||
From e5c9702bd2ffd09e48c118ab40c2764590af7929 Mon Sep 17 00:00:00 2001
|
||||
From: Paolo Sabatino <paolo.sabatino@gmail.com>
|
||||
Date: Sat, 1 May 2021 12:41:14 +0000
|
||||
Subject: [PATCH] Workaround to make several broadcom bluetooth serdev devices
|
||||
work even without proper MAC address
|
||||
|
||||
---
|
||||
drivers/bluetooth/btbcm.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/bluetooth/btbcm.c b/drivers/bluetooth/btbcm.c
|
||||
index 1b9743b7f..b274f1cdd 100644
|
||||
--- a/drivers/bluetooth/btbcm.c
|
||||
+++ b/drivers/bluetooth/btbcm.c
|
||||
@@ -87,7 +87,7 @@ int btbcm_check_bdaddr(struct hci_dev *hdev)
|
||||
!bacmp(&bda->bdaddr, BDADDR_BCM43341B)) {
|
||||
bt_dev_info(hdev, "BCM: Using default device address (%pMR)",
|
||||
&bda->bdaddr);
|
||||
- set_bit(HCI_QUIRK_INVALID_BDADDR, &hdev->quirks);
|
||||
+ //set_bit(HCI_QUIRK_INVALID_BDADDR, &hdev->quirks);
|
||||
}
|
||||
|
||||
kfree_skb(skb);
|
||||
--
|
||||
2.25.1
|
||||
|
||||
@ -0,0 +1,594 @@
|
||||
From 43231f566634df693fa20b677a84850750829d3d Mon Sep 17 00:00:00 2001
|
||||
From: Rock Shen <rock_shen@asus.com>
|
||||
Date: Tue, 27 Apr 2021 11:13:25 +0800
|
||||
Subject: [PATCH] regulator: add fan53200 regulator driver for Tinekr Board 2
|
||||
|
||||
1. Add fan53200 regulator support for vdd_cpu_b & vdd_gpu
|
||||
2. By Tinker2 HW design, Vsel gpio pin polarity was reversed, switch
|
||||
sleep_reg & vol_reg at fan53200_voltages_setup_fairchild
|
||||
3. Use vsel0 as suspend source, vsel1 as normal source
|
||||
|
||||
Signed-off-by: Rock Shen <rock_shen@asus.com>
|
||||
---
|
||||
arch/arm64/configs/defconfig | 1 +
|
||||
drivers/regulator/Kconfig | 11 +
|
||||
drivers/regulator/Makefile | 1 +
|
||||
drivers/regulator/fan53200.c | 519 +++++++++++++++++++++++++++++++++++++++++++
|
||||
4 files changed, 532 insertions(+)
|
||||
create mode 100644 drivers/regulator/fan53200.c
|
||||
|
||||
diff --git a/arch/arm64/configs/defconfig b/arch/arm64/configs/defconfig
|
||||
index 5cfe3cf..38cbba4 100644
|
||||
--- a/arch/arm64/configs/defconfig
|
||||
+++ b/arch/arm64/configs/defconfig
|
||||
@@ -583,6 +583,7 @@ CONFIG_REGULATOR_AXP20X=y
|
||||
CONFIG_REGULATOR_BD718XX=y
|
||||
CONFIG_REGULATOR_BD9571MWV=y
|
||||
CONFIG_REGULATOR_FAN53555=y
|
||||
+CONFIG_REGULATOR_FAN53200=y
|
||||
CONFIG_REGULATOR_GPIO=y
|
||||
CONFIG_REGULATOR_HI6421V530=y
|
||||
CONFIG_REGULATOR_HI655X=y
|
||||
diff --git a/drivers/regulator/Kconfig b/drivers/regulator/Kconfig
|
||||
index 020a00d..4ec41c5 100644
|
||||
--- a/drivers/regulator/Kconfig
|
||||
+++ b/drivers/regulator/Kconfig
|
||||
@@ -356,6 +356,17 @@ config REGULATOR_FAN53880
|
||||
(PMIC), it is controlled by I2C and provides one BUCK, one BOOST
|
||||
and four LDO outputs.
|
||||
|
||||
+config REGULATOR_FAN53200
|
||||
+ tristate "Fairchild FAN53200 Regulator"
|
||||
+ depends on I2C
|
||||
+ select REGMAP_I2C
|
||||
+ help
|
||||
+ This driver supports Fairchild FAN53200 Digitally Programmable
|
||||
+ TinyBuck Regulator. The FAN53200 is a step-down switching voltage
|
||||
+ regulator that delivers a digitally programmable output from an
|
||||
+ input voltage supply of 2.5V to 5.5V. The output voltage is
|
||||
+ programmed through an I2C interface.
|
||||
+
|
||||
config REGULATOR_GPIO
|
||||
tristate "GPIO regulator support"
|
||||
depends on GPIOLIB || COMPILE_TEST
|
||||
diff --git a/drivers/regulator/Makefile b/drivers/regulator/Makefile
|
||||
index 6ebae51..9d6ea41 100644
|
||||
--- a/drivers/regulator/Makefile
|
||||
+++ b/drivers/regulator/Makefile
|
||||
@@ -44,6 +44,7 @@ obj-$(CONFIG_REGULATOR_DBX500_PRCMU) += dbx500-prcmu.o
|
||||
obj-$(CONFIG_REGULATOR_DB8500_PRCMU) += db8500-prcmu.o
|
||||
obj-$(CONFIG_REGULATOR_FAN53555) += fan53555.o
|
||||
obj-$(CONFIG_REGULATOR_FAN53880) += fan53880.o
|
||||
+obj-$(CONFIG_REGULATOR_FAN53555) += fan53200.o
|
||||
obj-$(CONFIG_REGULATOR_GPIO) += gpio-regulator.o
|
||||
obj-$(CONFIG_REGULATOR_HI6421) += hi6421-regulator.o
|
||||
obj-$(CONFIG_REGULATOR_HI6421V530) += hi6421v530-regulator.o
|
||||
diff --git a/drivers/regulator/fan53200.c b/drivers/regulator/fan53200.c
|
||||
new file mode 100644
|
||||
index 0000000..e40570b
|
||||
--- /dev/null
|
||||
+++ b/drivers/regulator/fan53200.c
|
||||
@@ -0,0 +1,519 @@
|
||||
+/*
|
||||
+ * FAN53200 Fairchild Digitally Programmable TinyBuck Regulator Driver.
|
||||
+ *
|
||||
+ * Supported Part Numbers:
|
||||
+ * FAN53200UC35X/44X
|
||||
+ *
|
||||
+ * Copyright (c) 2021 ASUSTeK Computer Inc.
|
||||
+ * Rock Shen <rock_shen@asus.com>
|
||||
+ *
|
||||
+ * This package is free software; you can redistribute it and/or modify
|
||||
+ * it under the terms of the GNU General Public License version 2 as
|
||||
+ * published by the Free Software Foundation.
|
||||
+ *
|
||||
+ */
|
||||
+#include <linux/module.h>
|
||||
+#include <linux/param.h>
|
||||
+#include <linux/err.h>
|
||||
+#include <linux/platform_device.h>
|
||||
+#include <linux/regulator/driver.h>
|
||||
+#include <linux/regulator/machine.h>
|
||||
+#include <linux/regulator/of_regulator.h>
|
||||
+#include <linux/of_device.h>
|
||||
+#include <linux/i2c.h>
|
||||
+#include <linux/slab.h>
|
||||
+#include <linux/regmap.h>
|
||||
+#include <linux/gpio.h>
|
||||
+#include <linux/of_gpio.h>
|
||||
+
|
||||
+/* Voltage setting */
|
||||
+#define FAN53200_VSEL0 0x00
|
||||
+#define FAN53200_VSEL1 0x01
|
||||
+
|
||||
+/* Control register */
|
||||
+#define FAN53200_CONTROL 0x02
|
||||
+/* IC Type */
|
||||
+#define FAN53200_ID1 0x03
|
||||
+/* IC mask version */
|
||||
+#define FAN53200_ID2 0x04
|
||||
+
|
||||
+/* VSEL bit definitions */
|
||||
+#define VSEL_BUCK_EN (1 << 7)
|
||||
+#define VSEL_MODE (1 << 6)
|
||||
+#define VSEL_NSEL_MASK 0x3F
|
||||
+/* Chip ID and Verison */
|
||||
+#define DIE_ID 0x0F /* ID1 */
|
||||
+#define DIE_REV 0x0F /* ID2 */
|
||||
+/* Control bit definitions */
|
||||
+#define CTL_OUTPUT_DISCHG (1 << 7)
|
||||
+#define CTL_SLEW_MASK (0x7 << 4)
|
||||
+#define CTL_SLEW_SHIFT 4
|
||||
+#define CTL_RESET (1 << 2)
|
||||
+
|
||||
+#define TCS_VSEL_NSEL_MASK 0x7f
|
||||
+#define TCS_VSEL0_MODE (1 << 7)
|
||||
+#define TCS_VSEL1_MODE (1 << 6)
|
||||
+
|
||||
+#define TCS_SLEW_SHIFT 3
|
||||
+#define TCS_SLEW_MASK (0x3 < 3)
|
||||
+
|
||||
+#define FAN53200_NVOLTAGES 64 /* Numbers of voltages */
|
||||
+
|
||||
+enum fan53200_vendor {
|
||||
+ FAN53200_VENDOR_FAIRCHILD = 0,
|
||||
+};
|
||||
+
|
||||
+/* VSEL ID */
|
||||
+enum {
|
||||
+ FAN53200_VSEL_ID_0 = 0,
|
||||
+ FAN53200_VSEL_ID_1,
|
||||
+};
|
||||
+
|
||||
+enum {
|
||||
+ FAN53200_CHIP_ID_00 = 0x8001,
|
||||
+ FAN53200_CHIP_ID_01 = 0x8101,
|
||||
+};
|
||||
+
|
||||
+struct fan53200_platform_data {
|
||||
+ struct regulator_init_data *regulator;
|
||||
+ unsigned int slew_rate;
|
||||
+ /* Sleep VSEL ID */
|
||||
+ unsigned int sleep_vsel_id;
|
||||
+ struct gpio_desc *vsel_gpio;
|
||||
+};
|
||||
+
|
||||
+struct fan53200_device_info {
|
||||
+ enum fan53200_vendor vendor;
|
||||
+ struct regmap *regmap;
|
||||
+ struct device *dev;
|
||||
+ struct regulator_desc desc;
|
||||
+ struct regulator_dev *rdev;
|
||||
+ struct regulator_init_data *regulator;
|
||||
+ /* IC Type and Rev */
|
||||
+ int chip_id;
|
||||
+ int chip_rev;
|
||||
+ /* Voltage setting register */
|
||||
+ unsigned int vol_reg;
|
||||
+ unsigned int sleep_reg;
|
||||
+ unsigned int mode_reg;
|
||||
+ unsigned int vol_mask;
|
||||
+ unsigned int mode_mask;
|
||||
+ unsigned int slew_reg;
|
||||
+ unsigned int slew_mask;
|
||||
+ unsigned int slew_shift;
|
||||
+ /* Voltage range and step(linear) */
|
||||
+ unsigned int vsel_min;
|
||||
+ unsigned int vsel_step;
|
||||
+ unsigned int n_voltages;
|
||||
+ /* Voltage slew rate limiting */
|
||||
+ unsigned int slew_rate;
|
||||
+ /* Sleep voltage cache */
|
||||
+ unsigned int sleep_vol_cache;
|
||||
+ struct gpio_desc *vsel_gpio;
|
||||
+ unsigned int sleep_vsel_id;
|
||||
+};
|
||||
+
|
||||
+static unsigned int fan53200_map_mode(unsigned int mode)
|
||||
+{
|
||||
+ return mode == REGULATOR_MODE_FAST ?
|
||||
+ REGULATOR_MODE_FAST : REGULATOR_MODE_NORMAL;
|
||||
+}
|
||||
+
|
||||
+static int fan53200_set_suspend_voltage(struct regulator_dev *rdev, int uV)
|
||||
+{
|
||||
+ struct fan53200_device_info *di = rdev_get_drvdata(rdev);
|
||||
+ int ret;
|
||||
+
|
||||
+ if (di->sleep_vol_cache == uV)
|
||||
+ return 0;
|
||||
+ ret = regulator_map_voltage_linear(rdev, uV, uV);
|
||||
+ if (ret < 0)
|
||||
+ return ret;
|
||||
+ ret = regmap_update_bits(di->regmap, di->sleep_reg,
|
||||
+ di->vol_mask, ret);
|
||||
+ if (ret < 0)
|
||||
+ return ret;
|
||||
+ /* Cache the sleep voltage setting.
|
||||
+ * Might not be the real voltage which is rounded */
|
||||
+ di->sleep_vol_cache = uV;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int fan53200_set_suspend_enable(struct regulator_dev *rdev)
|
||||
+{
|
||||
+ struct fan53200_device_info *di = rdev_get_drvdata(rdev);
|
||||
+
|
||||
+ return regmap_update_bits(di->regmap, di->sleep_reg,
|
||||
+ VSEL_BUCK_EN, VSEL_BUCK_EN);
|
||||
+}
|
||||
+
|
||||
+static int fan53200_set_suspend_disable(struct regulator_dev *rdev)
|
||||
+{
|
||||
+ struct fan53200_device_info *di = rdev_get_drvdata(rdev);
|
||||
+
|
||||
+ return regmap_update_bits(di->regmap, di->sleep_reg,
|
||||
+ VSEL_BUCK_EN, 0);
|
||||
+}
|
||||
+
|
||||
+static int fan53200_set_enable(struct regulator_dev *rdev)
|
||||
+{
|
||||
+ struct fan53200_device_info *di = rdev_get_drvdata(rdev);
|
||||
+
|
||||
+ if (di->vsel_gpio) {
|
||||
+ gpiod_set_raw_value(di->vsel_gpio, !di->sleep_vsel_id);
|
||||
+ return 0;
|
||||
+ }
|
||||
+
|
||||
+ return regmap_update_bits(di->regmap, di->vol_reg,
|
||||
+ VSEL_BUCK_EN, VSEL_BUCK_EN);
|
||||
+}
|
||||
+
|
||||
+static int fan53200_set_disable(struct regulator_dev *rdev)
|
||||
+{
|
||||
+ struct fan53200_device_info *di = rdev_get_drvdata(rdev);
|
||||
+
|
||||
+ if (di->vsel_gpio) {
|
||||
+ gpiod_set_raw_value(di->vsel_gpio, di->sleep_vsel_id);
|
||||
+ return 0;
|
||||
+ }
|
||||
+
|
||||
+ return regmap_update_bits(di->regmap, di->vol_reg,
|
||||
+ VSEL_BUCK_EN, 0);
|
||||
+}
|
||||
+
|
||||
+static int fan53200_is_enabled(struct regulator_dev *rdev)
|
||||
+{
|
||||
+ struct fan53200_device_info *di = rdev_get_drvdata(rdev);
|
||||
+ unsigned int val;
|
||||
+ int ret = 0;
|
||||
+
|
||||
+ if (di->vsel_gpio) {
|
||||
+ if (di->sleep_vsel_id)
|
||||
+ return !gpiod_get_raw_value(di->vsel_gpio);
|
||||
+ else
|
||||
+ return gpiod_get_raw_value(di->vsel_gpio);
|
||||
+ }
|
||||
+
|
||||
+ ret = regmap_read(di->regmap, di->vol_reg, &val);
|
||||
+ if (ret < 0)
|
||||
+ return ret;
|
||||
+ if (val & VSEL_BUCK_EN)
|
||||
+ return 1;
|
||||
+ else
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int fan53200_set_mode(struct regulator_dev *rdev, unsigned int mode)
|
||||
+{
|
||||
+ struct fan53200_device_info *di = rdev_get_drvdata(rdev);
|
||||
+
|
||||
+ switch (mode) {
|
||||
+ case REGULATOR_MODE_FAST:
|
||||
+ regmap_update_bits(di->regmap, di->mode_reg,
|
||||
+ di->mode_mask, di->mode_mask);
|
||||
+ break;
|
||||
+ case REGULATOR_MODE_NORMAL:
|
||||
+ regmap_update_bits(di->regmap, di->mode_reg, di->mode_mask, 0);
|
||||
+ break;
|
||||
+ default:
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static unsigned int fan53200_get_mode(struct regulator_dev *rdev)
|
||||
+{
|
||||
+ struct fan53200_device_info *di = rdev_get_drvdata(rdev);
|
||||
+ unsigned int val;
|
||||
+ int ret = 0;
|
||||
+
|
||||
+ ret = regmap_read(di->regmap, di->mode_reg, &val);
|
||||
+ if (ret < 0)
|
||||
+ return ret;
|
||||
+ if (val & di->mode_mask)
|
||||
+ return REGULATOR_MODE_FAST;
|
||||
+ else
|
||||
+ return REGULATOR_MODE_NORMAL;
|
||||
+}
|
||||
+
|
||||
+static const int slew_rates[] = {
|
||||
+ 80000,
|
||||
+ 40000,
|
||||
+ 20000,
|
||||
+ 10000,
|
||||
+ 5000,
|
||||
+ 2500,
|
||||
+ 1250,
|
||||
+ 625,
|
||||
+};
|
||||
+
|
||||
+static int fan53200_set_ramp(struct regulator_dev *rdev, int ramp)
|
||||
+{
|
||||
+ struct fan53200_device_info *di = rdev_get_drvdata(rdev);
|
||||
+ int regval = -1, i;
|
||||
+
|
||||
+ for (i = 0; i < ARRAY_SIZE(slew_rates); i++) {
|
||||
+ if (ramp <= slew_rates[i])
|
||||
+ regval = i;
|
||||
+ else
|
||||
+ break;
|
||||
+ }
|
||||
+
|
||||
+ if (regval < 0) {
|
||||
+ dev_err(di->dev, "unsupported ramp value %d\n", ramp);
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+
|
||||
+ return regmap_update_bits(di->regmap, di->slew_reg,
|
||||
+ di->slew_mask, regval << di->slew_shift);
|
||||
+}
|
||||
+
|
||||
+static struct regulator_ops fan53200_regulator_ops = {
|
||||
+ .set_voltage_sel = regulator_set_voltage_sel_regmap,
|
||||
+ .get_voltage_sel = regulator_get_voltage_sel_regmap,
|
||||
+ .set_voltage_time_sel = regulator_set_voltage_time_sel,
|
||||
+ .map_voltage = regulator_map_voltage_linear,
|
||||
+ .list_voltage = regulator_list_voltage_linear,
|
||||
+ .set_suspend_voltage = fan53200_set_suspend_voltage,
|
||||
+ .enable = fan53200_set_enable,
|
||||
+ .disable = fan53200_set_disable,
|
||||
+ .is_enabled = fan53200_is_enabled,
|
||||
+ .set_mode = fan53200_set_mode,
|
||||
+ .get_mode = fan53200_get_mode,
|
||||
+ .set_ramp_delay = fan53200_set_ramp,
|
||||
+ .set_suspend_enable = fan53200_set_suspend_enable,
|
||||
+ .set_suspend_disable = fan53200_set_suspend_disable,
|
||||
+};
|
||||
+
|
||||
+static int fan53200_voltages_setup_fairchild(struct fan53200_device_info *di)
|
||||
+{
|
||||
+
|
||||
+ if (di->sleep_vsel_id) {
|
||||
+ di->sleep_reg = FAN53200_VSEL0;
|
||||
+ di->vol_reg = FAN53200_VSEL1;
|
||||
+ } else {
|
||||
+ di->sleep_reg = FAN53200_VSEL1;
|
||||
+ di->vol_reg = FAN53200_VSEL0;
|
||||
+ }
|
||||
+
|
||||
+ /* Init voltage range and step */
|
||||
+ di->vsel_min = 600000;
|
||||
+ di->vsel_step = 12500;
|
||||
+ di->vol_mask = VSEL_NSEL_MASK;
|
||||
+ di->mode_reg = di->vol_reg;
|
||||
+ di->mode_mask = VSEL_MODE;
|
||||
+ di->slew_reg = FAN53200_CONTROL;
|
||||
+ di->slew_mask = CTL_SLEW_MASK;
|
||||
+ di->slew_shift = CTL_SLEW_SHIFT;
|
||||
+ di->n_voltages = FAN53200_NVOLTAGES;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+/* For 00,01,03,05 options:
|
||||
+ * VOUT = 0.60V + NSELx * 10mV, from 0.60 to 1.23V.
|
||||
+ * For 04 option:
|
||||
+ * VOUT = 0.603V + NSELx * 12.826mV, from 0.603 to 1.411V.
|
||||
+ * */
|
||||
+static int fan53200_device_setup(struct fan53200_device_info *di,
|
||||
+ struct fan53200_platform_data *pdata)
|
||||
+{
|
||||
+ int ret = 0;
|
||||
+
|
||||
+ ret = fan53200_voltages_setup_fairchild(di);
|
||||
+
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+static int fan53200_regulator_register(struct fan53200_device_info *di,
|
||||
+ struct regulator_config *config)
|
||||
+{
|
||||
+ struct regulator_desc *rdesc = &di->desc;
|
||||
+
|
||||
+ rdesc->name = "fan53200-reg";
|
||||
+ rdesc->supply_name = "vin";
|
||||
+ rdesc->ops = &fan53200_regulator_ops;
|
||||
+ rdesc->type = REGULATOR_VOLTAGE;
|
||||
+ rdesc->n_voltages = di->n_voltages;
|
||||
+ rdesc->enable_reg = di->vol_reg;
|
||||
+ rdesc->enable_mask = VSEL_BUCK_EN;
|
||||
+ rdesc->min_uV = di->vsel_min;
|
||||
+ rdesc->uV_step = di->vsel_step;
|
||||
+ rdesc->vsel_reg = di->vol_reg;
|
||||
+ rdesc->vsel_mask = di->vol_mask;
|
||||
+ rdesc->owner = THIS_MODULE;
|
||||
+ rdesc->enable_time = 400;
|
||||
+
|
||||
+ di->rdev = devm_regulator_register(di->dev, &di->desc, config);
|
||||
+ return PTR_ERR_OR_ZERO(di->rdev);
|
||||
+}
|
||||
+
|
||||
+static const struct regmap_config fan53200_regmap_config = {
|
||||
+ .reg_bits = 8,
|
||||
+ .val_bits = 8,
|
||||
+};
|
||||
+
|
||||
+static struct fan53200_platform_data *fan53200_parse_dt(struct device *dev,
|
||||
+ struct device_node *np,
|
||||
+ const struct regulator_desc *desc)
|
||||
+{
|
||||
+ struct fan53200_platform_data *pdata;
|
||||
+ int ret, flag;
|
||||
+ u32 tmp;
|
||||
+
|
||||
+ pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL);
|
||||
+ if (!pdata)
|
||||
+ return NULL;
|
||||
+
|
||||
+ pdata->regulator = of_get_regulator_init_data(dev, np, desc);
|
||||
+ pdata->regulator->constraints.initial_state = PM_SUSPEND_MEM;
|
||||
+
|
||||
+ ret = of_property_read_u32(np, "fcs,suspend-voltage-selector",
|
||||
+ &tmp);
|
||||
+ if (!ret)
|
||||
+ pdata->sleep_vsel_id = tmp;
|
||||
+
|
||||
+ if (pdata->sleep_vsel_id)
|
||||
+ flag = GPIOD_OUT_LOW;
|
||||
+ else
|
||||
+ flag = GPIOD_OUT_HIGH;
|
||||
+
|
||||
+ pdata->vsel_gpio =
|
||||
+ devm_gpiod_get_index_optional(dev, "vsel", 0,
|
||||
+ flag);
|
||||
+ if (IS_ERR(pdata->vsel_gpio)) {
|
||||
+ ret = PTR_ERR(pdata->vsel_gpio);
|
||||
+ dev_err(dev, "failed to get vesl gpio (%d)\n", ret);
|
||||
+ }
|
||||
+
|
||||
+ return pdata;
|
||||
+}
|
||||
+
|
||||
+static const struct of_device_id fan53200_dt_ids[] = {
|
||||
+ {
|
||||
+ .compatible = "fcs,fan53200",
|
||||
+ .data = (void *)FAN53200_VENDOR_FAIRCHILD,
|
||||
+ },
|
||||
+ { }
|
||||
+};
|
||||
+MODULE_DEVICE_TABLE(of, fan53200_dt_ids);
|
||||
+
|
||||
+static int fan53200_regulator_probe(struct i2c_client *client,
|
||||
+ const struct i2c_device_id *id)
|
||||
+{
|
||||
+ struct device_node *np = client->dev.of_node;
|
||||
+ struct fan53200_device_info *di;
|
||||
+ struct fan53200_platform_data *pdata;
|
||||
+ struct regulator_config config = { };
|
||||
+ unsigned int val;
|
||||
+ int ret;
|
||||
+
|
||||
+ di = devm_kzalloc(&client->dev, sizeof(struct fan53200_device_info),
|
||||
+ GFP_KERNEL);
|
||||
+ if (!di)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ di->desc.of_map_mode = fan53200_map_mode;
|
||||
+
|
||||
+ pdata = dev_get_platdata(&client->dev);
|
||||
+ if (!pdata)
|
||||
+ pdata = fan53200_parse_dt(&client->dev, np, &di->desc);
|
||||
+
|
||||
+ if (!pdata || !pdata->regulator) {
|
||||
+ dev_err(&client->dev, "Platform data not found!\n");
|
||||
+ return -ENODEV;
|
||||
+ }
|
||||
+
|
||||
+ di->vsel_gpio = pdata->vsel_gpio;
|
||||
+ di->sleep_vsel_id = pdata->sleep_vsel_id;
|
||||
+
|
||||
+ di->regulator = pdata->regulator;
|
||||
+ if (client->dev.of_node) {
|
||||
+ const struct of_device_id *match;
|
||||
+
|
||||
+ match = of_match_device(of_match_ptr(fan53200_dt_ids),
|
||||
+ &client->dev);
|
||||
+ if (!match)
|
||||
+ return -ENODEV;
|
||||
+
|
||||
+ di->vendor = (unsigned long) match->data;
|
||||
+ } else {
|
||||
+ /* if no ramp constraint set, get the pdata ramp_delay */
|
||||
+ if (!di->regulator->constraints.ramp_delay) {
|
||||
+ int slew_idx = (pdata->slew_rate & 0x7)
|
||||
+ ? pdata->slew_rate : 0;
|
||||
+
|
||||
+ di->regulator->constraints.ramp_delay
|
||||
+ = slew_rates[slew_idx];
|
||||
+ }
|
||||
+
|
||||
+ di->vendor = id->driver_data;
|
||||
+ }
|
||||
+
|
||||
+ di->regmap = devm_regmap_init_i2c(client, &fan53200_regmap_config);
|
||||
+ if (IS_ERR(di->regmap)) {
|
||||
+ dev_err(&client->dev, "Failed to allocate regmap!\n");
|
||||
+ return PTR_ERR(di->regmap);
|
||||
+ }
|
||||
+ di->dev = &client->dev;
|
||||
+ i2c_set_clientdata(client, di);
|
||||
+ /* Get chip ID */
|
||||
+ ret = regmap_read(di->regmap, FAN53200_ID1, &val);
|
||||
+ if (ret < 0) {
|
||||
+ dev_err(&client->dev, "Failed to get chip ID!\n");
|
||||
+ return ret;
|
||||
+ }
|
||||
+ di->chip_id = val & DIE_ID;
|
||||
+ /* Get chip revision */
|
||||
+ ret = regmap_read(di->regmap, FAN53200_ID2, &val);
|
||||
+ if (ret < 0) {
|
||||
+ dev_err(&client->dev, "Failed to get chip Rev!\n");
|
||||
+ return ret;
|
||||
+ }
|
||||
+ di->chip_rev = val & DIE_REV;
|
||||
+ dev_info(&client->dev, "FAN53200 Option[%d] Rev[%d] Detected!\n",
|
||||
+ di->chip_id, di->chip_rev);
|
||||
+ /* Device init */
|
||||
+ ret = fan53200_device_setup(di, pdata);
|
||||
+ if (ret < 0) {
|
||||
+ dev_err(&client->dev, "Failed to setup device!\n");
|
||||
+ return ret;
|
||||
+ }
|
||||
+ /* Register regulator */
|
||||
+ config.dev = di->dev;
|
||||
+ config.init_data = di->regulator;
|
||||
+ config.regmap = di->regmap;
|
||||
+ config.driver_data = di;
|
||||
+ config.of_node = np;
|
||||
+
|
||||
+ ret = fan53200_regulator_register(di, &config);
|
||||
+ if (ret < 0)
|
||||
+ dev_err(&client->dev, "Failed to register regulator!\n");
|
||||
+ return ret;
|
||||
+
|
||||
+}
|
||||
+
|
||||
+static const struct i2c_device_id fan53200_id[] = {
|
||||
+ {
|
||||
+ .name = "fan53200",
|
||||
+ .driver_data = FAN53200_VENDOR_FAIRCHILD
|
||||
+ },
|
||||
+ { },
|
||||
+};
|
||||
+MODULE_DEVICE_TABLE(i2c, fan53200_id);
|
||||
+
|
||||
+static struct i2c_driver fan53200_regulator_driver = {
|
||||
+ .driver = {
|
||||
+ .name = "fan53200-regulator",
|
||||
+ .of_match_table = of_match_ptr(fan53200_dt_ids),
|
||||
+ },
|
||||
+ .probe = fan53200_regulator_probe,
|
||||
+ .id_table = fan53200_id,
|
||||
+};
|
||||
+
|
||||
+module_i2c_driver(fan53200_regulator_driver);
|
||||
+
|
||||
+MODULE_AUTHOR("Rock Shen <rock_shen@asus.com>");
|
||||
+MODULE_DESCRIPTION("FAN53200 regulator driver");
|
||||
+MODULE_LICENSE("GPL v2");
|
||||
--
|
||||
2.7.4
|
||||
|
||||
|
||||
25
patch/kernel/archive/media-5.15/rk3328-roc-pc-bt.patch
Normal file
25
patch/kernel/archive/media-5.15/rk3328-roc-pc-bt.patch
Normal file
@ -0,0 +1,25 @@
|
||||
--- a/arch/arm64/boot/dts/rockchip/rk3328-roc-pc.dts
|
||||
+++ b/arch/arm64/boot/dts/rockchip/rk3328-roc-pc.dts
|
||||
@@ -109,6 +109,21 @@
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
+&uart1 {
|
||||
+ status = "disabled";
|
||||
+};
|
||||
+
|
||||
+&uart2 {
|
||||
+ status = "okay";
|
||||
+
|
||||
+ bluetooth {
|
||||
+ compatible = "realtek,rtl8723ds-bt";
|
||||
+ enable-gpios = <&gpio1 RK_PD0 GPIO_ACTIVE_HIGH>;
|
||||
+ host-wake-gpios = <&gpio1 RK_PD2 GPIO_ACTIVE_HIGH>;
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+
|
||||
&usb20_host_drv {
|
||||
rockchip,pins = <0 RK_PA0 RK_FUNC_GPIO &pcfg_pull_up>;
|
||||
};
|
||||
|
||||
18
patch/kernel/archive/media-5.15/rk3399-nanopc-t4-emmc.patch
Normal file
18
patch/kernel/archive/media-5.15/rk3399-nanopc-t4-emmc.patch
Normal file
@ -0,0 +1,18 @@
|
||||
--- a/arch/arm64/boot/dts/rockchip/rk3399-nanopc-t4.dts
|
||||
+++ b/arch/arm64/boot/dts/rockchip/rk3399-nanopc-t4.dts
|
||||
@@ -109,10 +109,10 @@
|
||||
};
|
||||
};
|
||||
|
||||
-&sdhci {
|
||||
- mmc-hs400-1_8v;
|
||||
- mmc-hs400-enhanced-strobe;
|
||||
-};
|
||||
+//&sdhci {
|
||||
+// mmc-hs400-1_8v;
|
||||
+// mmc-hs400-enhanced-strobe;
|
||||
+//};
|
||||
|
||||
&u2phy0_host {
|
||||
phy-supply = <&vcc5v0_host0>;
|
||||
|
||||
@ -0,0 +1,26 @@
|
||||
diff --git a/drivers/net/wireless/realtek/Kconfig b/drivers/net/wireless/realtek/Kconfig
|
||||
index 8ea2d8d..600c44d 100644
|
||||
--- a/drivers/net/wireless/realtek/Kconfig
|
||||
+++ b/drivers/net/wireless/realtek/Kconfig
|
||||
@@ -13,8 +13,9 @@ config WLAN_VENDOR_REALTEK
|
||||
if WLAN_VENDOR_REALTEK
|
||||
|
||||
source "drivers/net/wireless/realtek/rtl818x/Kconfig"
|
||||
source "drivers/net/wireless/realtek/rtlwifi/Kconfig"
|
||||
source "drivers/net/wireless/realtek/rtl8xxxu/Kconfig"
|
||||
+source "drivers/net/wireless/realtek/rtl8723cs/Kconfig"
|
||||
source "drivers/net/wireless/realtek/rtw88/Kconfig"
|
||||
|
||||
endif # WLAN_VENDOR_REALTEK
|
||||
diff --git a/drivers/net/wireless/realtek/Makefile b/drivers/net/wireless/realtek/Makefile
|
||||
index 9c78deb5..07b47850 100644
|
||||
--- a/drivers/net/wireless/realtek/Makefile
|
||||
+++ b/drivers/net/wireless/realtek/Makefile
|
||||
@@ -4,6 +4,7 @@
|
||||
|
||||
obj-$(CONFIG_RTL8180) += rtl818x/
|
||||
obj-$(CONFIG_RTL8187) += rtl818x/
|
||||
+obj-$(CONFIG_RTL8723CS) += rtl8723cs/
|
||||
obj-$(CONFIG_RTLWIFI) += rtlwifi/
|
||||
obj-$(CONFIG_RTL8XXXU) += rtl8xxxu/
|
||||
|
||||
349058
patch/kernel/archive/media-5.15/wifi-4002-add-realtek-8723cs.patch
Normal file
349058
patch/kernel/archive/media-5.15/wifi-4002-add-realtek-8723cs.patch
Normal file
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,31 @@
|
||||
From 4f15b08033441eeb2004c2a7ec19c91e1e75c332 Mon Sep 17 00:00:00 2001
|
||||
From: The-going <48602507+The-going@users.noreply.github.com>
|
||||
Date: Mon, 22 Nov 2021 18:53:11 +0300
|
||||
Subject: [PATCH] wifi 4002 realtek 8723cs Fix IEEE80211_MAX_AMPDU_BUF
|
||||
redefined
|
||||
|
||||
After v4.19 linux kernel, this definition is not required.
|
||||
The 1 drivers/net/wireless/realtek/rtlwifi/base.c file uses
|
||||
the variable IEEE80211_MAX_AMPDU_BUF_HT.
|
||||
|
||||
See `git log -p b8042b3da925f390c1482b -3` command in
|
||||
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git
|
||||
---
|
||||
drivers/net/wireless/realtek/rtl8723cs/include/wifi.h | 1 -
|
||||
1 file changed, 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtl8723cs/include/wifi.h b/drivers/net/wireless/realtek/rtl8723cs/include/wifi.h
|
||||
index 9d21a5afd..8ef0fd7ff 100644
|
||||
--- a/drivers/net/wireless/realtek/rtl8723cs/include/wifi.h
|
||||
+++ b/drivers/net/wireless/realtek/rtl8723cs/include/wifi.h
|
||||
@@ -1006,7 +1006,6 @@ typedef enum _HT_CAP_AMPDU_DENSITY {
|
||||
* According to IEEE802.11n spec size varies from 8K to 64K (in powers of 2)
|
||||
*/
|
||||
#define IEEE80211_MIN_AMPDU_BUF 0x8
|
||||
-#define IEEE80211_MAX_AMPDU_BUF 0x40
|
||||
|
||||
|
||||
/* Spatial Multiplexing Power Save Modes */
|
||||
--
|
||||
2.33.1
|
||||
|
||||
@ -1,126 +0,0 @@
|
||||
From patchwork Mon Dec 20 11:06:20 2021
|
||||
Content-Type: text/plain; charset="utf-8"
|
||||
MIME-Version: 1.0
|
||||
Content-Transfer-Encoding: 7bit
|
||||
X-Patchwork-Submitter: Sascha Hauer <s.hauer@pengutronix.de>
|
||||
X-Patchwork-Id: 12687627
|
||||
Return-Path:
|
||||
<linux-rockchip-bounces+linux-rockchip=archiver.kernel.org@lists.infradead.org>
|
||||
X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on
|
||||
aws-us-west-2-korg-lkml-1.web.codeaurora.org
|
||||
Received: from bombadil.infradead.org (bombadil.infradead.org
|
||||
[198.137.202.133])
|
||||
(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
|
||||
(No client certificate requested)
|
||||
by smtp.lore.kernel.org (Postfix) with ESMTPS id 1EA65C433F5
|
||||
for <linux-rockchip@archiver.kernel.org>;
|
||||
Mon, 20 Dec 2021 11:22:51 +0000 (UTC)
|
||||
DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed;
|
||||
d=lists.infradead.org; s=bombadil.20210309; h=Sender:
|
||||
Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post:
|
||||
List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To:
|
||||
Message-Id:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description:
|
||||
Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:
|
||||
List-Owner; bh=hJzi0XcGjHA9VFX4kq1NPnW929Kww+63Uvr0HLYwkQM=; b=d/FKmFum7PoTCB
|
||||
P7hTNzQF65+cQor5wkXY01ebYlmUS+DALVvVED2iwmEWwKNK2lZts8JVKdWITohPM0xYr/UUv68Gr
|
||||
5BS00MKaOhYXsP5vpsaeWlnpSsQxQYzXwbKfoHeBalndwOx/lGfptr33JqJ/kwfZXN3zB6bWXrUIL
|
||||
EEu9Xbn/fPHuKlitsNI/NVmRM9vKWUgx+zCnvv2sBEdk1+gbuItAu5EbqyZt0Zy9+RAxkaM2FJTAD
|
||||
H9mkOoOara6tTFdATo7j0GXHfjNWeSDrSx3gHr1cPg03Z0YCjE7jfl/FOOrx4Kp9I8qXhT7iifXo2
|
||||
83CRlHWSD0FUXlvA7rbg==;
|
||||
Received: from localhost ([::1] helo=bombadil.infradead.org)
|
||||
by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux))
|
||||
id 1mzGkh-001wpZ-4f; Mon, 20 Dec 2021 11:22:47 +0000
|
||||
Received: from desiato.infradead.org ([2001:8b0:10b:1:d65d:64ff:fe57:4e05])
|
||||
by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux))
|
||||
id 1mzGVq-001oYV-5C
|
||||
for linux-rockchip@bombadil.infradead.org; Mon, 20 Dec 2021 11:07:26 +0000
|
||||
DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed;
|
||||
d=infradead.org; s=desiato.20200630; h=Content-Transfer-Encoding:MIME-Version
|
||||
:References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender:Reply-To:
|
||||
Content-Type:Content-ID:Content-Description;
|
||||
bh=uNA1iFcZ5tn4VZT/AL4rwhPRPOpqL/rUQIxtx+PGWE4=; b=TGbIm0cJYKKY6ruI02UgXsPDqS
|
||||
UPP89GMTwvuggr7VwgxlEjRgBp7hgEsM79X69qazGiIvwRMfRdfC9fVlXnXXNJ+RY0c/evwEUqrv6
|
||||
Psmcia82IKG3wsEHnXyRItwjvTg8uI3rpeswsqi8rZg4iObXNAMr6dzWlU90FmtE38xJAvLMScQr/
|
||||
OL7tuMp0wTaXD2l4QlARUKSR7vcncNDIeltRBkSqSHoiKWaPUdXHFubMkHMmRqBbDWJJwH+pOBGAg
|
||||
+hs7ODho3A18GIeIDKKVak5ABQFvScWxO6VU9ilwO+sJzAdI0evXuNVXZqEXYdgdKrLI6PxE0SZ6H
|
||||
+iFFACeg==;
|
||||
Received: from metis.ext.pengutronix.de
|
||||
([2001:67c:670:201:290:27ff:fe1d:cc33])
|
||||
by desiato.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux))
|
||||
id 1mzGVm-002UHM-QZ
|
||||
for linux-rockchip@lists.infradead.org; Mon, 20 Dec 2021 11:07:24 +0000
|
||||
Received: from dude02.hi.pengutronix.de ([2001:67c:670:100:1d::28])
|
||||
by metis.ext.pengutronix.de with esmtps
|
||||
(TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92)
|
||||
(envelope-from <sha@pengutronix.de>)
|
||||
id 1mzGVE-0004xB-DX; Mon, 20 Dec 2021 12:06:48 +0100
|
||||
Received: from sha by dude02.hi.pengutronix.de with local (Exim 4.94.2)
|
||||
(envelope-from <sha@pengutronix.de>)
|
||||
id 1mzGVA-00EmEV-NS; Mon, 20 Dec 2021 12:06:44 +0100
|
||||
From: Sascha Hauer <s.hauer@pengutronix.de>
|
||||
To: dri-devel@lists.freedesktop.org
|
||||
Cc: linux-arm-kernel@lists.infradead.org, linux-rockchip@lists.infradead.org,
|
||||
devicetree@vger.kernel.org, kernel@pengutronix.de,
|
||||
Andy Yan <andy.yan@rock-chips.com>,
|
||||
Benjamin Gaignard <benjamin.gaignard@collabora.com>,
|
||||
Michael Riesch <michael.riesch@wolfvision.net>,
|
||||
Sandy Huang <hjc@rock-chips.com>,
|
||||
=?utf-8?q?Heiko_St=C3=BCbner?= <heiko@sntech.de>,
|
||||
Peter Geis <pgwipeout@gmail.com>, Sascha Hauer <s.hauer@pengutronix.de>
|
||||
Subject: [PATCH 12/22] arm64: dts: rockchip: rk3399: reorder hmdi clocks
|
||||
Date: Mon, 20 Dec 2021 12:06:20 +0100
|
||||
Message-Id: <20211220110630.3521121-13-s.hauer@pengutronix.de>
|
||||
X-Mailer: git-send-email 2.30.2
|
||||
In-Reply-To: <20211220110630.3521121-1-s.hauer@pengutronix.de>
|
||||
References: <20211220110630.3521121-1-s.hauer@pengutronix.de>
|
||||
MIME-Version: 1.0
|
||||
X-SA-Exim-Connect-IP: 2001:67c:670:100:1d::28
|
||||
X-SA-Exim-Mail-From: sha@pengutronix.de
|
||||
X-SA-Exim-Scanned: No (on metis.ext.pengutronix.de);
|
||||
SAEximRunCond expanded to false
|
||||
X-PTX-Original-Recipient: linux-rockchip@lists.infradead.org
|
||||
X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3
|
||||
X-CRM114-CacheID: sfid-20211220_110723_153685_D07DE51E
|
||||
X-CRM114-Status: GOOD ( 10.45 )
|
||||
X-BeenThere: linux-rockchip@lists.infradead.org
|
||||
X-Mailman-Version: 2.1.34
|
||||
Precedence: list
|
||||
List-Id: Upstream kernel work for Rockchip platforms
|
||||
<linux-rockchip.lists.infradead.org>
|
||||
List-Unsubscribe: <http://lists.infradead.org/mailman/options/linux-rockchip>,
|
||||
<mailto:linux-rockchip-request@lists.infradead.org?subject=unsubscribe>
|
||||
List-Archive: <http://lists.infradead.org/pipermail/linux-rockchip/>
|
||||
List-Post: <mailto:linux-rockchip@lists.infradead.org>
|
||||
List-Help: <mailto:linux-rockchip-request@lists.infradead.org?subject=help>
|
||||
List-Subscribe: <http://lists.infradead.org/mailman/listinfo/linux-rockchip>,
|
||||
<mailto:linux-rockchip-request@lists.infradead.org?subject=subscribe>
|
||||
Sender: "Linux-rockchip" <linux-rockchip-bounces@lists.infradead.org>
|
||||
Errors-To:
|
||||
linux-rockchip-bounces+linux-rockchip=archiver.kernel.org@lists.infradead.org
|
||||
|
||||
The binding specifies the clock order to "cec", "grf", "vpll". Reorder
|
||||
the clocks accordingly.
|
||||
|
||||
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
|
||||
---
|
||||
arch/arm64/boot/dts/rockchip/rk3399.dtsi | 6 +++---
|
||||
1 file changed, 3 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/rockchip/rk3399.dtsi b/arch/arm64/boot/dts/rockchip/rk3399.dtsi
|
||||
index d3cdf6f42a303..080457a68e3c7 100644
|
||||
--- a/arch/arm64/boot/dts/rockchip/rk3399.dtsi
|
||||
+++ b/arch/arm64/boot/dts/rockchip/rk3399.dtsi
|
||||
@@ -1881,10 +1881,10 @@ hdmi: hdmi@ff940000 {
|
||||
interrupts = <GIC_SPI 23 IRQ_TYPE_LEVEL_HIGH 0>;
|
||||
clocks = <&cru PCLK_HDMI_CTRL>,
|
||||
<&cru SCLK_HDMI_SFR>,
|
||||
- <&cru PLL_VPLL>,
|
||||
+ <&cru SCLK_HDMI_CEC>,
|
||||
<&cru PCLK_VIO_GRF>,
|
||||
- <&cru SCLK_HDMI_CEC>;
|
||||
- clock-names = "iahb", "isfr", "vpll", "grf", "cec";
|
||||
+ <&cru PLL_VPLL>;
|
||||
+ clock-names = "iahb", "isfr", "cec", "grf", "vpll";
|
||||
power-domains = <&power RK3399_PD_HDCP>;
|
||||
reg-io-width = <4>;
|
||||
rockchip,grf = <&grf>;
|
||||
19
patch/kernel/archive/media-5.16/00-v93-rk356x-usb.patch
Normal file
19
patch/kernel/archive/media-5.16/00-v93-rk356x-usb.patch
Normal file
@ -0,0 +1,19 @@
|
||||
--- a/arch/arm64/boot/dts/rockchip/rk356x.dtsi
|
||||
+++ b/arch/arm64/boot/dts/rockchip/rk356x.dtsi
|
||||
@@ -304,6 +304,7 @@
|
||||
interrupts = <GIC_SPI 169 IRQ_TYPE_LEVEL_HIGH>;
|
||||
// dr_mode = "host";
|
||||
dr_mode = "otg";
|
||||
+ maximum-speed = "high-speed";
|
||||
phys = <&u2phy0_otg>, <&combphy0 PHY_TYPE_USB3>;
|
||||
phy-names = "usb2-phy", "usb3-phy";
|
||||
phy_type = "utmi_wide";
|
||||
@@ -339,6 +340,7 @@
|
||||
reg = <0x0 0xfd000000 0x0 0x400000>;
|
||||
interrupts = <GIC_SPI 170 IRQ_TYPE_LEVEL_HIGH>;
|
||||
dr_mode = "host";
|
||||
+ maximum-speed = "high-speed";
|
||||
phys = <&u2phy0_host>, <&combphy1 PHY_TYPE_USB3>;
|
||||
phy-names = "usb2-phy", "usb3-phy";
|
||||
phy_type = "utmi_wide";
|
||||
|
||||
18
patch/kernel/archive/media-5.16/rk3399-nanopc-t4-emmc.patch
Normal file
18
patch/kernel/archive/media-5.16/rk3399-nanopc-t4-emmc.patch
Normal file
@ -0,0 +1,18 @@
|
||||
--- a/arch/arm64/boot/dts/rockchip/rk3399-nanopc-t4.dts
|
||||
+++ b/arch/arm64/boot/dts/rockchip/rk3399-nanopc-t4.dts
|
||||
@@ -109,10 +109,10 @@
|
||||
};
|
||||
};
|
||||
|
||||
-&sdhci {
|
||||
- mmc-hs400-1_8v;
|
||||
- mmc-hs400-enhanced-strobe;
|
||||
-};
|
||||
+//&sdhci {
|
||||
+// mmc-hs400-1_8v;
|
||||
+// mmc-hs400-enhanced-strobe;
|
||||
+//};
|
||||
|
||||
&u2phy0_host {
|
||||
phy-supply = <&vcc5v0_host0>;
|
||||
|
||||
945
patch/kernel/archive/rockchip64-4.4/vcodec-fixes.patch
Normal file
945
patch/kernel/archive/rockchip64-4.4/vcodec-fixes.patch
Normal file
@ -0,0 +1,945 @@
|
||||
From e222e9913d3c70967bae92f1aed46de726974dc7 Mon Sep 17 00:00:00 2001
|
||||
From: Jonas Karlman <jonas@kwiboo.se>
|
||||
Date: Thu, 5 Jul 2018 00:14:14 +0200
|
||||
Subject: [PATCH] Revert "drm/drm-prime: cache dma_buf import context"
|
||||
|
||||
This reverts commit 5a90381e5acc2cf32be03099a14d05d4362b3348.
|
||||
---
|
||||
drivers/gpu/drm/drm_prime.c | 46 ++---------------------------
|
||||
drivers/gpu/drm/rockchip/rockchip_drm_gem.c | 1 +
|
||||
2 files changed, 3 insertions(+), 44 deletions(-)
|
||||
|
||||
diff --git a/drivers/gpu/drm/drm_prime.c b/drivers/gpu/drm/drm_prime.c
|
||||
index 6f207d5946dc..6b7417a194a3 100644
|
||||
--- a/drivers/gpu/drm/drm_prime.c
|
||||
+++ b/drivers/gpu/drm/drm_prime.c
|
||||
@@ -71,11 +71,6 @@ struct drm_prime_attachment {
|
||||
enum dma_data_direction dir;
|
||||
};
|
||||
|
||||
-struct drm_prime_callback_data {
|
||||
- struct drm_gem_object *obj;
|
||||
- struct sg_table *sgt;
|
||||
-};
|
||||
-
|
||||
static int drm_prime_add_buf_handle(struct drm_prime_file_private *prime_fpriv,
|
||||
struct dma_buf *dma_buf, uint32_t handle)
|
||||
{
|
||||
@@ -524,23 +519,6 @@ out_unlock:
|
||||
}
|
||||
EXPORT_SYMBOL(drm_gem_prime_handle_to_fd);
|
||||
|
||||
-static void drm_gem_prime_dmabuf_release_callback(void *data)
|
||||
-{
|
||||
- struct drm_prime_callback_data *cb_data = data;
|
||||
-
|
||||
- if (cb_data && cb_data->obj && cb_data->obj->import_attach) {
|
||||
- struct dma_buf_attachment *attach = cb_data->obj->import_attach;
|
||||
- struct sg_table *sgt = cb_data->sgt;
|
||||
-
|
||||
- if (sgt)
|
||||
- dma_buf_unmap_attachment(attach, sgt,
|
||||
- DMA_BIDIRECTIONAL);
|
||||
- dma_buf_detach(attach->dmabuf, attach);
|
||||
- drm_gem_object_unreference_unlocked(cb_data->obj);
|
||||
- kfree(cb_data);
|
||||
- }
|
||||
-}
|
||||
-
|
||||
/**
|
||||
* drm_gem_prime_import - helper library implementation of the import callback
|
||||
* @dev: drm_device to import into
|
||||
@@ -555,7 +533,6 @@ struct drm_gem_object *drm_gem_prime_import(struct drm_device *dev,
|
||||
struct dma_buf_attachment *attach;
|
||||
struct sg_table *sgt;
|
||||
struct drm_gem_object *obj;
|
||||
- struct drm_prime_callback_data *cb_data;
|
||||
int ret;
|
||||
|
||||
if (dma_buf->ops == &drm_gem_prime_dmabuf_ops) {
|
||||
@@ -570,13 +547,6 @@ struct drm_gem_object *drm_gem_prime_import(struct drm_device *dev,
|
||||
}
|
||||
}
|
||||
|
||||
- cb_data = dma_buf_get_release_callback_data(dma_buf,
|
||||
- drm_gem_prime_dmabuf_release_callback);
|
||||
- if (cb_data && cb_data->obj && cb_data->obj->dev == dev) {
|
||||
- drm_gem_object_reference(cb_data->obj);
|
||||
- return cb_data->obj;
|
||||
- }
|
||||
-
|
||||
if (!dev->driver->gem_prime_import_sg_table)
|
||||
return ERR_PTR(-EINVAL);
|
||||
|
||||
@@ -585,16 +555,11 @@ struct drm_gem_object *drm_gem_prime_import(struct drm_device *dev,
|
||||
return ERR_CAST(attach);
|
||||
|
||||
get_dma_buf(dma_buf);
|
||||
- cb_data = kmalloc(sizeof(*cb_data), GFP_KERNEL);
|
||||
- if (!cb_data) {
|
||||
- ret = -ENOMEM;
|
||||
- goto fail_detach;
|
||||
- }
|
||||
|
||||
sgt = dma_buf_map_attachment(attach, DMA_BIDIRECTIONAL);
|
||||
if (IS_ERR(sgt)) {
|
||||
ret = PTR_ERR(sgt);
|
||||
- goto fail_free;
|
||||
+ goto fail_detach;
|
||||
}
|
||||
|
||||
obj = dev->driver->gem_prime_import_sg_table(dev, attach, sgt);
|
||||
@@ -602,20 +567,13 @@ struct drm_gem_object *drm_gem_prime_import(struct drm_device *dev,
|
||||
ret = PTR_ERR(obj);
|
||||
goto fail_unmap;
|
||||
}
|
||||
+
|
||||
obj->import_attach = attach;
|
||||
- cb_data->obj = obj;
|
||||
- cb_data->sgt = sgt;
|
||||
- dma_buf_set_release_callback(dma_buf,
|
||||
- drm_gem_prime_dmabuf_release_callback, cb_data);
|
||||
- dma_buf_put(dma_buf);
|
||||
- drm_gem_object_reference(obj);
|
||||
|
||||
return obj;
|
||||
|
||||
fail_unmap:
|
||||
dma_buf_unmap_attachment(attach, sgt, DMA_BIDIRECTIONAL);
|
||||
-fail_free:
|
||||
- kfree(cb_data);
|
||||
fail_detach:
|
||||
dma_buf_detach(dma_buf, attach);
|
||||
dma_buf_put(dma_buf);
|
||||
diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_gem.c b/drivers/gpu/drm/rockchip/rockchip_drm_gem.c
|
||||
index 273a52b5eb66..85bbd19c87b0 100644
|
||||
--- a/drivers/gpu/drm/rockchip/rockchip_drm_gem.c
|
||||
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_gem.c
|
||||
@@ -649,6 +649,7 @@ void rockchip_gem_free_object(struct drm_gem_object *obj)
|
||||
dma_unmap_sg(drm->dev, rk_obj->sgt->sgl,
|
||||
rk_obj->sgt->nents, DMA_BIDIRECTIONAL);
|
||||
}
|
||||
+ drm_prime_gem_destroy(obj, rk_obj->sgt);
|
||||
} else {
|
||||
rockchip_gem_free_buf(rk_obj);
|
||||
}
|
||||
|
||||
From 0868438e92b0e9a44d6c6e711ef3be0a429ab4af Mon Sep 17 00:00:00 2001
|
||||
From: Rob Clark <robdclark@gmail.com>
|
||||
Date: Thu, 9 Jun 2016 15:29:19 -0400
|
||||
Subject: [PATCH] UPSTREAM: drm/prime: fix error path deadlock fail
|
||||
|
||||
There were a couple messed up things about this fail path.
|
||||
(1) it would drop object_name_lock twice
|
||||
(2) drm_gem_handle_delete() (in drm_gem_remove_prime_handles())
|
||||
needs to grab prime_lock
|
||||
|
||||
Reported-by: Alex Deucher <alexdeucher@gmail.com>
|
||||
Signed-off-by: Rob Clark <robdclark@gmail.com>
|
||||
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
|
||||
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
|
||||
Link: http://patchwork.freedesktop.org/patch/msgid/1465500559-17873-1-git-send-email-robdclark@gmail.com
|
||||
(cherry picked from commit bd6e2732f0e2894ce792f344c41fc32591436fe3)
|
||||
---
|
||||
drivers/gpu/drm/drm_prime.c | 10 ++++++----
|
||||
1 file changed, 6 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/drivers/gpu/drm/drm_prime.c b/drivers/gpu/drm/drm_prime.c
|
||||
index 6b7417a194a3..d8d85286764d 100644
|
||||
--- a/drivers/gpu/drm/drm_prime.c
|
||||
+++ b/drivers/gpu/drm/drm_prime.c
|
||||
@@ -628,7 +628,7 @@ int drm_gem_prime_fd_to_handle(struct drm_device *dev,
|
||||
get_dma_buf(dma_buf);
|
||||
}
|
||||
|
||||
- /* drm_gem_handle_create_tail unlocks dev->object_name_lock. */
|
||||
+ /* _handle_create_tail unconditionally unlocks dev->object_name_lock. */
|
||||
ret = drm_gem_handle_create_tail(file_priv, obj, handle);
|
||||
drm_gem_object_unreference_unlocked(obj);
|
||||
if (ret)
|
||||
@@ -636,11 +636,10 @@ int drm_gem_prime_fd_to_handle(struct drm_device *dev,
|
||||
|
||||
ret = drm_prime_add_buf_handle(&file_priv->prime,
|
||||
dma_buf, *handle);
|
||||
+ mutex_unlock(&file_priv->prime.lock);
|
||||
if (ret)
|
||||
goto fail;
|
||||
|
||||
- mutex_unlock(&file_priv->prime.lock);
|
||||
-
|
||||
dma_buf_put(dma_buf);
|
||||
|
||||
return 0;
|
||||
@@ -650,11 +649,14 @@ fail:
|
||||
* to detach.. which seems ok..
|
||||
*/
|
||||
drm_gem_handle_delete(file_priv, *handle);
|
||||
+ dma_buf_put(dma_buf);
|
||||
+ return ret;
|
||||
+
|
||||
out_unlock:
|
||||
mutex_unlock(&dev->object_name_lock);
|
||||
out_put:
|
||||
- dma_buf_put(dma_buf);
|
||||
mutex_unlock(&file_priv->prime.lock);
|
||||
+ dma_buf_put(dma_buf);
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL(drm_gem_prime_fd_to_handle);
|
||||
|
||||
From 8e4ac090d0a814f73d719887f96f7dc44112e03e Mon Sep 17 00:00:00 2001
|
||||
From: Chris Wilson <chris@chris-wilson.co.uk>
|
||||
Date: Mon, 26 Sep 2016 21:44:14 +0100
|
||||
Subject: [PATCH] UPSTREAM: drm: Convert prime dma-buf <-> handle to rbtree
|
||||
|
||||
Currently we use a linear walk to lookup a handle and return a dma-buf,
|
||||
and vice versa. A long overdue TODO task is to convert that to a
|
||||
hashtable. Since the initial implementation of dma-buf/prime, we now
|
||||
have resizeable hashtables we can use (and now a future task is to RCU
|
||||
enable the lookup!). However, this patch opts to use an rbtree instead
|
||||
to provide O(lgN) lookups (and insertion, deletion). rbtrees were chosen
|
||||
over using the RCU backed resizable hashtable to firstly avoid the
|
||||
reallocations (rbtrees can be embedded entirely within the parent
|
||||
struct) and to favour simpler code with predictable worst case
|
||||
behaviour. In simple testing, the difference between using the constant
|
||||
lookup and insertion of the rhashtable and the rbtree was less than 10%
|
||||
of the wall time (igt/benchmarks/prime_lookup) - both are dramatic
|
||||
improvements over the existing linear lists.
|
||||
|
||||
v2: Favour rbtree over rhashtable
|
||||
|
||||
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=94631
|
||||
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
|
||||
Cc: Sean Paul <seanpaul@chromium.org>
|
||||
Cc: David Herrmann <dh.herrmann@gmail.com>
|
||||
Reviewed-by: David Herrmann <dh.herrmann@gmail.com>
|
||||
Reviewed-by: Sean Paul <seanpaul@chromium.org>
|
||||
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
|
||||
Link: http://patchwork.freedesktop.org/patch/msgid/20160926204414.23222-1-chris@chris-wilson.co.uk
|
||||
(cherry picked from commit 077675c1e8a193a6355d4a7c8c7bf63be310b472)
|
||||
---
|
||||
drivers/gpu/drm/drm_prime.c | 85 +++++++++++++++++++++++++++++++++++++++------
|
||||
include/drm/drmP.h | 5 +--
|
||||
2 files changed, 77 insertions(+), 13 deletions(-)
|
||||
|
||||
diff --git a/drivers/gpu/drm/drm_prime.c b/drivers/gpu/drm/drm_prime.c
|
||||
index d8d85286764d..4c49e736bc9c 100644
|
||||
--- a/drivers/gpu/drm/drm_prime.c
|
||||
+++ b/drivers/gpu/drm/drm_prime.c
|
||||
@@ -28,6 +28,7 @@
|
||||
|
||||
#include <linux/export.h>
|
||||
#include <linux/dma-buf.h>
|
||||
+#include <linux/rbtree.h>
|
||||
#include <drm/drmP.h>
|
||||
#include <drm/drm_gem.h>
|
||||
|
||||
@@ -61,9 +62,11 @@
|
||||
*/
|
||||
|
||||
struct drm_prime_member {
|
||||
- struct list_head entry;
|
||||
struct dma_buf *dma_buf;
|
||||
uint32_t handle;
|
||||
+
|
||||
+ struct rb_node dmabuf_rb;
|
||||
+ struct rb_node handle_rb;
|
||||
};
|
||||
|
||||
struct drm_prime_attachment {
|
||||
@@ -75,6 +78,7 @@ static int drm_prime_add_buf_handle(struct drm_prime_file_private *prime_fpriv,
|
||||
struct dma_buf *dma_buf, uint32_t handle)
|
||||
{
|
||||
struct drm_prime_member *member;
|
||||
+ struct rb_node **p, *rb;
|
||||
|
||||
member = kmalloc(sizeof(*member), GFP_KERNEL);
|
||||
if (!member)
|
||||
@@ -83,18 +87,56 @@ static int drm_prime_add_buf_handle(struct drm_prime_file_private *prime_fpriv,
|
||||
get_dma_buf(dma_buf);
|
||||
member->dma_buf = dma_buf;
|
||||
member->handle = handle;
|
||||
- list_add(&member->entry, &prime_fpriv->head);
|
||||
+
|
||||
+ rb = NULL;
|
||||
+ p = &prime_fpriv->dmabufs.rb_node;
|
||||
+ while (*p) {
|
||||
+ struct drm_prime_member *pos;
|
||||
+
|
||||
+ rb = *p;
|
||||
+ pos = rb_entry(rb, struct drm_prime_member, dmabuf_rb);
|
||||
+ if (dma_buf > pos->dma_buf)
|
||||
+ p = &rb->rb_right;
|
||||
+ else
|
||||
+ p = &rb->rb_left;
|
||||
+ }
|
||||
+ rb_link_node(&member->dmabuf_rb, rb, p);
|
||||
+ rb_insert_color(&member->dmabuf_rb, &prime_fpriv->dmabufs);
|
||||
+
|
||||
+ rb = NULL;
|
||||
+ p = &prime_fpriv->handles.rb_node;
|
||||
+ while (*p) {
|
||||
+ struct drm_prime_member *pos;
|
||||
+
|
||||
+ rb = *p;
|
||||
+ pos = rb_entry(rb, struct drm_prime_member, handle_rb);
|
||||
+ if (handle > pos->handle)
|
||||
+ p = &rb->rb_right;
|
||||
+ else
|
||||
+ p = &rb->rb_left;
|
||||
+ }
|
||||
+ rb_link_node(&member->handle_rb, rb, p);
|
||||
+ rb_insert_color(&member->handle_rb, &prime_fpriv->handles);
|
||||
+
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct dma_buf *drm_prime_lookup_buf_by_handle(struct drm_prime_file_private *prime_fpriv,
|
||||
uint32_t handle)
|
||||
{
|
||||
- struct drm_prime_member *member;
|
||||
+ struct rb_node *rb;
|
||||
+
|
||||
+ rb = prime_fpriv->handles.rb_node;
|
||||
+ while (rb) {
|
||||
+ struct drm_prime_member *member;
|
||||
|
||||
- list_for_each_entry(member, &prime_fpriv->head, entry) {
|
||||
+ member = rb_entry(rb, struct drm_prime_member, handle_rb);
|
||||
if (member->handle == handle)
|
||||
return member->dma_buf;
|
||||
+ else if (member->handle < handle)
|
||||
+ rb = rb->rb_right;
|
||||
+ else
|
||||
+ rb = rb->rb_left;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
@@ -104,14 +146,23 @@ static int drm_prime_lookup_buf_handle(struct drm_prime_file_private *prime_fpri
|
||||
struct dma_buf *dma_buf,
|
||||
uint32_t *handle)
|
||||
{
|
||||
- struct drm_prime_member *member;
|
||||
+ struct rb_node *rb;
|
||||
+
|
||||
+ rb = prime_fpriv->dmabufs.rb_node;
|
||||
+ while (rb) {
|
||||
+ struct drm_prime_member *member;
|
||||
|
||||
- list_for_each_entry(member, &prime_fpriv->head, entry) {
|
||||
+ member = rb_entry(rb, struct drm_prime_member, dmabuf_rb);
|
||||
if (member->dma_buf == dma_buf) {
|
||||
*handle = member->handle;
|
||||
return 0;
|
||||
+ } else if (member->dma_buf < dma_buf) {
|
||||
+ rb = rb->rb_right;
|
||||
+ } else {
|
||||
+ rb = rb->rb_left;
|
||||
}
|
||||
}
|
||||
+
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
@@ -166,13 +217,24 @@ static void drm_gem_map_detach(struct dma_buf *dma_buf,
|
||||
void drm_prime_remove_buf_handle_locked(struct drm_prime_file_private *prime_fpriv,
|
||||
struct dma_buf *dma_buf)
|
||||
{
|
||||
- struct drm_prime_member *member, *safe;
|
||||
+ struct rb_node *rb;
|
||||
|
||||
- list_for_each_entry_safe(member, safe, &prime_fpriv->head, entry) {
|
||||
+ rb = prime_fpriv->dmabufs.rb_node;
|
||||
+ while (rb) {
|
||||
+ struct drm_prime_member *member;
|
||||
+
|
||||
+ member = rb_entry(rb, struct drm_prime_member, dmabuf_rb);
|
||||
if (member->dma_buf == dma_buf) {
|
||||
+ rb_erase(&member->handle_rb, &prime_fpriv->handles);
|
||||
+ rb_erase(&member->dmabuf_rb, &prime_fpriv->dmabufs);
|
||||
+
|
||||
dma_buf_put(dma_buf);
|
||||
- list_del(&member->entry);
|
||||
kfree(member);
|
||||
+ return;
|
||||
+ } else if (member->dma_buf < dma_buf) {
|
||||
+ rb = rb->rb_right;
|
||||
+ } else {
|
||||
+ rb = rb->rb_left;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -794,12 +856,13 @@ EXPORT_SYMBOL(drm_prime_gem_destroy);
|
||||
|
||||
void drm_prime_init_file_private(struct drm_prime_file_private *prime_fpriv)
|
||||
{
|
||||
- INIT_LIST_HEAD(&prime_fpriv->head);
|
||||
mutex_init(&prime_fpriv->lock);
|
||||
+ prime_fpriv->dmabufs = RB_ROOT;
|
||||
+ prime_fpriv->handles = RB_ROOT;
|
||||
}
|
||||
|
||||
void drm_prime_destroy_file_private(struct drm_prime_file_private *prime_fpriv)
|
||||
{
|
||||
/* by now drm_gem_release should've made sure the list is empty */
|
||||
- WARN_ON(!list_empty(&prime_fpriv->head));
|
||||
+ WARN_ON(!RB_EMPTY_ROOT(&prime_fpriv->dmabufs));
|
||||
}
|
||||
diff --git a/include/drm/drmP.h b/include/drm/drmP.h
|
||||
index 04edcd32b409..93da65df2e7e 100644
|
||||
--- a/include/drm/drmP.h
|
||||
+++ b/include/drm/drmP.h
|
||||
@@ -51,6 +51,7 @@
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/poll.h>
|
||||
#include <linux/ratelimit.h>
|
||||
+#include <linux/rbtree.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/types.h>
|
||||
@@ -365,10 +366,10 @@ struct drm_pending_event {
|
||||
void (*destroy)(struct drm_pending_event *event);
|
||||
};
|
||||
|
||||
-/* initial implementaton using a linked list - todo hashtab */
|
||||
struct drm_prime_file_private {
|
||||
- struct list_head head;
|
||||
struct mutex lock;
|
||||
+ struct rb_root dmabufs;
|
||||
+ struct rb_root handles;
|
||||
};
|
||||
|
||||
/** File private data */
|
||||
|
||||
From fcb8af30f524cd437434ec6ddea0231cc37529bc Mon Sep 17 00:00:00 2001
|
||||
From: Chris Wilson <chris@chris-wilson.co.uk>
|
||||
Date: Wed, 5 Oct 2016 13:21:44 +0100
|
||||
Subject: [PATCH] UPSTREAM: drm/prime: Take a ref on the drm_dev when exporting
|
||||
a dma_buf
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
dma_buf may live a long time, longer than the last direct user of the
|
||||
driver. We already hold a reference to the owner module (that prevents
|
||||
the object code from disappearing), but there is no reference to the
|
||||
drm_dev - so the pointers to the driver backend themselves may vanish.
|
||||
|
||||
v2: Resist temptation to fix the bug in armada_gem.c not setting the
|
||||
correct flags on the exported dma-buf (it should pass the flags through
|
||||
and not be arbitrarily setting O_RDWR).
|
||||
|
||||
Use a common wrapper for exporting the dmabuf and acquiring the
|
||||
reference to the drm_device.
|
||||
|
||||
Testcase: igt/vgem_basic/unload
|
||||
Suggested-by: Daniel Vetter <daniel.vetter@ffwll.ch>
|
||||
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
|
||||
Cc: Petri Latvala <petri.latvala@intel.com>
|
||||
Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
|
||||
Cc: stable@vger.kernel.org
|
||||
Tested-by: Petri Latvala <petri.latvala@intel.com>
|
||||
Reviewed-by: Christian König <christian.koenig@amd.com>
|
||||
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
|
||||
Link: http://patchwork.freedesktop.org/patch/msgid/20161005122145.1507-2-chris@chris-wilson.co.uk
|
||||
(cherry picked from commit a4fce9cb782ad340ee5576a38e934e5e75832dc6)
|
||||
---
|
||||
drivers/gpu/drm/armada/armada_gem.c | 2 +-
|
||||
drivers/gpu/drm/drm_prime.c | 30 +++++++++++++++++++++++++++++-
|
||||
drivers/gpu/drm/i915/i915_gem_dmabuf.c | 2 +-
|
||||
drivers/gpu/drm/tegra/gem.c | 2 +-
|
||||
drivers/gpu/drm/udl/udl_dmabuf.c | 2 +-
|
||||
include/drm/drmP.h | 4 ++++
|
||||
6 files changed, 37 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/drivers/gpu/drm/armada/armada_gem.c b/drivers/gpu/drm/armada/armada_gem.c
|
||||
index 60a688ef81c7..cd5bb991f49a 100644
|
||||
--- a/drivers/gpu/drm/armada/armada_gem.c
|
||||
+++ b/drivers/gpu/drm/armada/armada_gem.c
|
||||
@@ -546,7 +546,7 @@ armada_gem_prime_export(struct drm_device *dev, struct drm_gem_object *obj,
|
||||
exp_info.flags = O_RDWR;
|
||||
exp_info.priv = obj;
|
||||
|
||||
- return dma_buf_export(&exp_info);
|
||||
+ return drm_gem_dmabuf_export(dev, &exp_info);
|
||||
}
|
||||
|
||||
struct drm_gem_object *
|
||||
diff --git a/drivers/gpu/drm/drm_prime.c b/drivers/gpu/drm/drm_prime.c
|
||||
index 4c49e736bc9c..94b4872255c8 100644
|
||||
--- a/drivers/gpu/drm/drm_prime.c
|
||||
+++ b/drivers/gpu/drm/drm_prime.c
|
||||
@@ -283,19 +283,47 @@ static void drm_gem_unmap_dma_buf(struct dma_buf_attachment *attach,
|
||||
/* nothing to be done here */
|
||||
}
|
||||
|
||||
+/**
|
||||
+ * drm_gem_dmabuf_export - dma_buf export implementation for GEM
|
||||
+ * @dma_buf: buffer to be exported
|
||||
+ *
|
||||
+ * This wraps dma_buf_export() for use by generic GEM drivers that are using
|
||||
+ * drm_gem_dmabuf_release(). In addition to calling dma_buf_export(), we take
|
||||
+ * a reference to the drm_device which is released by drm_gem_dmabuf_release().
|
||||
+ *
|
||||
+ * Returns the new dmabuf.
|
||||
+ */
|
||||
+struct dma_buf *drm_gem_dmabuf_export(struct drm_device *dev,
|
||||
+ struct dma_buf_export_info *exp_info)
|
||||
+{
|
||||
+ struct dma_buf *dma_buf;
|
||||
+
|
||||
+ dma_buf = dma_buf_export(exp_info);
|
||||
+ if (!IS_ERR(dma_buf))
|
||||
+ drm_dev_ref(dev);
|
||||
+
|
||||
+ return dma_buf;
|
||||
+}
|
||||
+EXPORT_SYMBOL(drm_gem_dmabuf_export);
|
||||
+
|
||||
/**
|
||||
* drm_gem_dmabuf_release - dma_buf release implementation for GEM
|
||||
* @dma_buf: buffer to be released
|
||||
*
|
||||
* Generic release function for dma_bufs exported as PRIME buffers. GEM drivers
|
||||
* must use this in their dma_buf ops structure as the release callback.
|
||||
+ * drm_gem_dmabuf_release() should be used in conjunction with
|
||||
+ * drm_gem_dmabuf_export().
|
||||
*/
|
||||
void drm_gem_dmabuf_release(struct dma_buf *dma_buf)
|
||||
{
|
||||
struct drm_gem_object *obj = dma_buf->priv;
|
||||
+ struct drm_device *dev = obj->dev;
|
||||
|
||||
/* drop the reference on the export fd holds */
|
||||
drm_gem_object_unreference_unlocked(obj);
|
||||
+
|
||||
+ drm_dev_unref(dev);
|
||||
}
|
||||
EXPORT_SYMBOL(drm_gem_dmabuf_release);
|
||||
|
||||
@@ -444,7 +472,7 @@ struct dma_buf *drm_gem_prime_export(struct drm_device *dev,
|
||||
if (dev->driver->gem_prime_res_obj)
|
||||
exp_info.resv = dev->driver->gem_prime_res_obj(obj);
|
||||
|
||||
- return dma_buf_export(&exp_info);
|
||||
+ return drm_gem_dmabuf_export(dev, &exp_info);
|
||||
}
|
||||
EXPORT_SYMBOL(drm_gem_prime_export);
|
||||
|
||||
diff --git a/drivers/gpu/drm/i915/i915_gem_dmabuf.c b/drivers/gpu/drm/i915/i915_gem_dmabuf.c
|
||||
index e9c2bfd85b52..d4a021629bd6 100644
|
||||
--- a/drivers/gpu/drm/i915/i915_gem_dmabuf.c
|
||||
+++ b/drivers/gpu/drm/i915/i915_gem_dmabuf.c
|
||||
@@ -244,7 +244,7 @@ struct dma_buf *i915_gem_prime_export(struct drm_device *dev,
|
||||
return ERR_PTR(ret);
|
||||
}
|
||||
|
||||
- return dma_buf_export(&exp_info);
|
||||
+ return drm_gem_dmabuf_export(dev, &exp_info);
|
||||
}
|
||||
|
||||
static int i915_gem_object_get_pages_dmabuf(struct drm_i915_gem_object *obj)
|
||||
diff --git a/drivers/gpu/drm/tegra/gem.c b/drivers/gpu/drm/tegra/gem.c
|
||||
index 01e16e146bfe..da06f1c1ee0f 100644
|
||||
--- a/drivers/gpu/drm/tegra/gem.c
|
||||
+++ b/drivers/gpu/drm/tegra/gem.c
|
||||
@@ -625,7 +625,7 @@ struct dma_buf *tegra_gem_prime_export(struct drm_device *drm,
|
||||
exp_info.flags = flags;
|
||||
exp_info.priv = gem;
|
||||
|
||||
- return dma_buf_export(&exp_info);
|
||||
+ return drm_gem_dmabuf_export(drm, &exp_info);
|
||||
}
|
||||
|
||||
struct drm_gem_object *tegra_gem_prime_import(struct drm_device *drm,
|
||||
diff --git a/drivers/gpu/drm/udl/udl_dmabuf.c b/drivers/gpu/drm/udl/udl_dmabuf.c
|
||||
index e2243edd1ce3..ac90ffdb5912 100644
|
||||
--- a/drivers/gpu/drm/udl/udl_dmabuf.c
|
||||
+++ b/drivers/gpu/drm/udl/udl_dmabuf.c
|
||||
@@ -209,7 +209,7 @@ struct dma_buf *udl_gem_prime_export(struct drm_device *dev,
|
||||
exp_info.flags = flags;
|
||||
exp_info.priv = obj;
|
||||
|
||||
- return dma_buf_export(&exp_info);
|
||||
+ return drm_gem_dmabuf_export(dev, &exp_info);
|
||||
}
|
||||
|
||||
static int udl_prime_create(struct drm_device *dev,
|
||||
diff --git a/include/drm/drmP.h b/include/drm/drmP.h
|
||||
index 93da65df2e7e..4aba6478d718 100644
|
||||
--- a/include/drm/drmP.h
|
||||
+++ b/include/drm/drmP.h
|
||||
@@ -1124,6 +1124,8 @@ static inline int drm_debugfs_remove_files(const struct drm_info_list *files,
|
||||
}
|
||||
#endif
|
||||
|
||||
+struct dma_buf_export_info;
|
||||
+
|
||||
extern struct dma_buf *drm_gem_prime_export(struct drm_device *dev,
|
||||
struct drm_gem_object *obj,
|
||||
int flags);
|
||||
@@ -1134,6 +1136,8 @@ extern struct drm_gem_object *drm_gem_prime_import(struct drm_device *dev,
|
||||
struct dma_buf *dma_buf);
|
||||
extern int drm_gem_prime_fd_to_handle(struct drm_device *dev,
|
||||
struct drm_file *file_priv, int prime_fd, uint32_t *handle);
|
||||
+struct dma_buf *drm_gem_dmabuf_export(struct drm_device *dev,
|
||||
+ struct dma_buf_export_info *exp_info);
|
||||
extern void drm_gem_dmabuf_release(struct dma_buf *dma_buf);
|
||||
|
||||
extern int drm_prime_sg_to_page_addr_arrays(struct sg_table *sgt, struct page **pages,
|
||||
|
||||
From 2c0a8737dd35ba259d3bbbf1b956fb43da32f117 Mon Sep 17 00:00:00 2001
|
||||
From: Chris Wilson <chris@chris-wilson.co.uk>
|
||||
Date: Wed, 7 Dec 2016 21:45:27 +0000
|
||||
Subject: [PATCH] UPSTREAM: drm: Take ownership of the dmabuf->obj when
|
||||
exporting
|
||||
|
||||
Currently the reference for the dmabuf->obj is incremented for the
|
||||
dmabuf in drm_gem_prime_handle_to_fd() (at the high level userspace
|
||||
interface), but is released in drm_gem_dmabuf_release() (the lowlevel
|
||||
handler). Improve the symmetry of the dmabuf->obj ownership by acquiring
|
||||
the reference in drm_gem_dmabuf_export(). This makes it easier to use
|
||||
the prime functions directly.
|
||||
|
||||
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
|
||||
[danvet: Update kerneldoc.]
|
||||
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
|
||||
Link: http://patchwork.freedesktop.org/patch/msgid/20161207214527.22533-1-chris@chris-wilson.co.uk
|
||||
(cherry picked from commit 72a93e8dd52c9feea42f1258d555e6070680a347)
|
||||
---
|
||||
drivers/gpu/drm/drm_prime.c | 12 +++++++-----
|
||||
1 file changed, 7 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/drivers/gpu/drm/drm_prime.c b/drivers/gpu/drm/drm_prime.c
|
||||
index 94b4872255c8..dbd34fa7f71c 100644
|
||||
--- a/drivers/gpu/drm/drm_prime.c
|
||||
+++ b/drivers/gpu/drm/drm_prime.c
|
||||
@@ -289,7 +289,8 @@ static void drm_gem_unmap_dma_buf(struct dma_buf_attachment *attach,
|
||||
*
|
||||
* This wraps dma_buf_export() for use by generic GEM drivers that are using
|
||||
* drm_gem_dmabuf_release(). In addition to calling dma_buf_export(), we take
|
||||
- * a reference to the drm_device which is released by drm_gem_dmabuf_release().
|
||||
+ * a reference to the &drm_device and the exported &drm_gem_object (stored in
|
||||
+ * exp_info->priv) which is released by drm_gem_dmabuf_release().
|
||||
*
|
||||
* Returns the new dmabuf.
|
||||
*/
|
||||
@@ -299,8 +300,11 @@ struct dma_buf *drm_gem_dmabuf_export(struct drm_device *dev,
|
||||
struct dma_buf *dma_buf;
|
||||
|
||||
dma_buf = dma_buf_export(exp_info);
|
||||
- if (!IS_ERR(dma_buf))
|
||||
- drm_dev_ref(dev);
|
||||
+ if (IS_ERR(dma_buf))
|
||||
+ return dma_buf;
|
||||
+
|
||||
+ drm_dev_ref(dev);
|
||||
+ drm_gem_object_reference(exp_info->priv);
|
||||
|
||||
return dma_buf;
|
||||
}
|
||||
@@ -503,8 +507,6 @@ static struct dma_buf *export_and_register_object(struct drm_device *dev,
|
||||
*/
|
||||
obj->dma_buf = dmabuf;
|
||||
get_dma_buf(obj->dma_buf);
|
||||
- /* Grab a new ref since the callers is now used by the dma-buf */
|
||||
- drm_gem_object_reference(obj);
|
||||
|
||||
return dmabuf;
|
||||
}
|
||||
|
||||
From 595e921b1e908458bd1ee022c9a7ee08cf203ad9 Mon Sep 17 00:00:00 2001
|
||||
From: Lucas Stach <l.stach@pengutronix.de>
|
||||
Date: Thu, 30 Nov 2017 18:34:28 +0100
|
||||
Subject: [PATCH] UPSTREAM: drm/prime: skip CPU sync in map/unmap dma_buf
|
||||
|
||||
Dma-bufs should already be device coherent, as they are only pulled in the
|
||||
CPU domain via the begin/end cpu_access calls. As we cache the mapping set
|
||||
up by dma_map_sg a CPU sync at this point will not actually guarantee proper
|
||||
coherency on non-coherent architectures, so we can as well stop pretending.
|
||||
|
||||
This is an important performance fix for architectures which need explicit
|
||||
cache synchronization and userspace doing lots of dma-buf imports.
|
||||
Improves Weston on Etnaviv performance 5x, where before this patch > 90%
|
||||
of Weston CPU time was spent synchronizing caches for buffers which are
|
||||
already device coherent.
|
||||
|
||||
Signed-off-by: Lucas Stach <l.stach@pengutronix.de>
|
||||
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
|
||||
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
|
||||
Link: https://patchwork.freedesktop.org/patch/msgid/20171130173428.8666-1-l.stach@pengutronix.de
|
||||
(cherry picked from commit ca0e68e21aae10220eff71a297e7d794425add77)
|
||||
---
|
||||
drivers/gpu/drm/drm_prime.c | 11 ++++++++---
|
||||
1 file changed, 8 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/drivers/gpu/drm/drm_prime.c b/drivers/gpu/drm/drm_prime.c
|
||||
index dbd34fa7f71c..133362279591 100644
|
||||
--- a/drivers/gpu/drm/drm_prime.c
|
||||
+++ b/drivers/gpu/drm/drm_prime.c
|
||||
@@ -203,9 +203,12 @@ static void drm_gem_map_detach(struct dma_buf *dma_buf,
|
||||
|
||||
sgt = prime_attach->sgt;
|
||||
if (sgt) {
|
||||
+ DEFINE_DMA_ATTRS(attrs);
|
||||
+ dma_set_attr(DMA_ATTR_SKIP_CPU_SYNC, &attrs);
|
||||
if (prime_attach->dir != DMA_NONE)
|
||||
- dma_unmap_sg(attach->dev, sgt->sgl, sgt->nents,
|
||||
- prime_attach->dir);
|
||||
+ dma_unmap_sg_attrs(attach->dev, sgt->sgl, sgt->nents,
|
||||
+ prime_attach->dir,
|
||||
+ &attrs);
|
||||
sg_free_table(sgt);
|
||||
}
|
||||
|
||||
@@ -263,7 +266,9 @@ static struct sg_table *drm_gem_map_dma_buf(struct dma_buf_attachment *attach,
|
||||
sgt = obj->dev->driver->gem_prime_get_sg_table(obj);
|
||||
|
||||
if (!IS_ERR(sgt)) {
|
||||
- if (!dma_map_sg(attach->dev, sgt->sgl, sgt->nents, dir)) {
|
||||
+ DEFINE_DMA_ATTRS(attrs);
|
||||
+ dma_set_attr(DMA_ATTR_SKIP_CPU_SYNC, &attrs);
|
||||
+ if (!dma_map_sg_attrs(attach->dev, sgt->sgl, sgt->nents, dir, &attrs)) {
|
||||
sg_free_table(sgt);
|
||||
kfree(sgt);
|
||||
sgt = ERR_PTR(-ENOMEM);
|
||||
|
||||
From d314fd1a48e930d034eccd49342a23340c3f1c27 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Christian=20K=C3=B6nig?= <ckoenig.leichtzumerken@gmail.com>
|
||||
Date: Tue, 27 Feb 2018 12:49:56 +0100
|
||||
Subject: [PATCH] UPSTREAM: drm/prime: fix potential race in drm_gem_map_detach
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Unpin the GEM object only after freeing the sg table.
|
||||
|
||||
Signed-off-by: Christian König <christian.koenig@amd.com>
|
||||
Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
|
||||
Acked-by: Roger He <Hongbo.He@amd.com>
|
||||
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
|
||||
Link: https://patchwork.freedesktop.org/patch/msgid/20180227115000.4105-1-christian.koenig@amd.com
|
||||
(cherry picked from commit 681066ec1d41e4b299146bada52cef846b323c04)
|
||||
---
|
||||
drivers/gpu/drm/drm_prime.c | 36 ++++++++++++++++++------------------
|
||||
1 file changed, 18 insertions(+), 18 deletions(-)
|
||||
|
||||
diff --git a/drivers/gpu/drm/drm_prime.c b/drivers/gpu/drm/drm_prime.c
|
||||
index 133362279591..95ecc69d03a0 100644
|
||||
--- a/drivers/gpu/drm/drm_prime.c
|
||||
+++ b/drivers/gpu/drm/drm_prime.c
|
||||
@@ -193,28 +193,28 @@ static void drm_gem_map_detach(struct dma_buf *dma_buf,
|
||||
struct drm_prime_attachment *prime_attach = attach->priv;
|
||||
struct drm_gem_object *obj = dma_buf->priv;
|
||||
struct drm_device *dev = obj->dev;
|
||||
- struct sg_table *sgt;
|
||||
-
|
||||
- if (dev->driver->gem_prime_unpin)
|
||||
- dev->driver->gem_prime_unpin(obj);
|
||||
|
||||
- if (!prime_attach)
|
||||
- return;
|
||||
+ if (prime_attach) {
|
||||
+ struct sg_table *sgt = prime_attach->sgt;
|
||||
+
|
||||
+ if (sgt) {
|
||||
+ DEFINE_DMA_ATTRS(attrs);
|
||||
+ dma_set_attr(DMA_ATTR_SKIP_CPU_SYNC, &attrs);
|
||||
+ if (prime_attach->dir != DMA_NONE)
|
||||
+ dma_unmap_sg_attrs(attach->dev, sgt->sgl,
|
||||
+ sgt->nents,
|
||||
+ prime_attach->dir,
|
||||
+ &attrs);
|
||||
+ sg_free_table(sgt);
|
||||
+ }
|
||||
|
||||
- sgt = prime_attach->sgt;
|
||||
- if (sgt) {
|
||||
- DEFINE_DMA_ATTRS(attrs);
|
||||
- dma_set_attr(DMA_ATTR_SKIP_CPU_SYNC, &attrs);
|
||||
- if (prime_attach->dir != DMA_NONE)
|
||||
- dma_unmap_sg_attrs(attach->dev, sgt->sgl, sgt->nents,
|
||||
- prime_attach->dir,
|
||||
- &attrs);
|
||||
- sg_free_table(sgt);
|
||||
+ kfree(sgt);
|
||||
+ kfree(prime_attach);
|
||||
+ attach->priv = NULL;
|
||||
}
|
||||
|
||||
- kfree(sgt);
|
||||
- kfree(prime_attach);
|
||||
- attach->priv = NULL;
|
||||
+ if (dev->driver->gem_prime_unpin)
|
||||
+ dev->driver->gem_prime_unpin(obj);
|
||||
}
|
||||
|
||||
void drm_prime_remove_buf_handle_locked(struct drm_prime_file_private *prime_fpriv,
|
||||
|
||||
From c74449bbd7e3ee3f3195ac9da48271c83c56f101 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Christian=20K=C3=B6nig?= <ckoenig.leichtzumerken@gmail.com>
|
||||
Date: Tue, 27 Feb 2018 12:49:57 +0100
|
||||
Subject: [PATCH] UPSTREAM: drm/prime: make the pages array optional for
|
||||
drm_prime_sg_to_page_addr_arrays
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Most of the time we only need the dma addresses.
|
||||
|
||||
Signed-off-by: Christian König <christian.koenig@amd.com>
|
||||
Reviewed-by: Roger He <Hongbo.He@amd.com>
|
||||
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
|
||||
Link: https://patchwork.freedesktop.org/patch/msgid/20180227115000.4105-2-christian.koenig@amd.com
|
||||
Link: https://patchwork.freedesktop.org/patch/msgid/20180227115000.4105-3-christian.koenig@amd.com
|
||||
Link: https://patchwork.freedesktop.org/patch/msgid/20180227115000.4105-4-christian.koenig@amd.com
|
||||
Link: https://patchwork.freedesktop.org/patch/msgid/20180227115000.4105-5-christian.koenig@amd.com
|
||||
Link: https://patchwork.freedesktop.org/patch/msgid/BN6PR12MB18262C0DE9B5F07B9A42EAE7F2C60@BN6PR12MB1826.namprd12.prod.outlook.com
|
||||
(cherry picked from commit 186ca446aea19e49d2e1433dd170c6e1c211a52a)
|
||||
---
|
||||
drivers/gpu/drm/drm_prime.c | 20 ++++++++++----------
|
||||
1 file changed, 10 insertions(+), 10 deletions(-)
|
||||
|
||||
diff --git a/drivers/gpu/drm/drm_prime.c b/drivers/gpu/drm/drm_prime.c
|
||||
index 95ecc69d03a0..7ea65c4105c1 100644
|
||||
--- a/drivers/gpu/drm/drm_prime.c
|
||||
+++ b/drivers/gpu/drm/drm_prime.c
|
||||
@@ -827,40 +827,40 @@ EXPORT_SYMBOL(drm_prime_pages_to_sg);
|
||||
/**
|
||||
* drm_prime_sg_to_page_addr_arrays - convert an sg table into a page array
|
||||
* @sgt: scatter-gather table to convert
|
||||
- * @pages: array of page pointers to store the page array in
|
||||
+ * @pages: optional array of page pointers to store the page array in
|
||||
* @addrs: optional array to store the dma bus address of each page
|
||||
- * @max_pages: size of both the passed-in arrays
|
||||
+ * @max_entries: size of both the passed-in arrays
|
||||
*
|
||||
* Exports an sg table into an array of pages and addresses. This is currently
|
||||
* required by the TTM driver in order to do correct fault handling.
|
||||
*/
|
||||
int drm_prime_sg_to_page_addr_arrays(struct sg_table *sgt, struct page **pages,
|
||||
- dma_addr_t *addrs, int max_pages)
|
||||
+ dma_addr_t *addrs, int max_entries)
|
||||
{
|
||||
unsigned count;
|
||||
struct scatterlist *sg;
|
||||
struct page *page;
|
||||
- u32 len;
|
||||
- int pg_index;
|
||||
+ u32 len, index;
|
||||
dma_addr_t addr;
|
||||
|
||||
- pg_index = 0;
|
||||
+ index = 0;
|
||||
for_each_sg(sgt->sgl, sg, sgt->nents, count) {
|
||||
len = sg->length;
|
||||
page = sg_page(sg);
|
||||
addr = sg_dma_address(sg);
|
||||
|
||||
while (len > 0) {
|
||||
- if (WARN_ON(pg_index >= max_pages))
|
||||
+ if (WARN_ON(index >= max_entries))
|
||||
return -1;
|
||||
- pages[pg_index] = page;
|
||||
+ if (pages)
|
||||
+ pages[index] = page;
|
||||
if (addrs)
|
||||
- addrs[pg_index] = addr;
|
||||
+ addrs[index] = addr;
|
||||
|
||||
page++;
|
||||
addr += PAGE_SIZE;
|
||||
len -= PAGE_SIZE;
|
||||
- pg_index++;
|
||||
+ index++;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
|
||||
From 2fc969d64eb928db78c9fd99fb68d9d2442a8919 Mon Sep 17 00:00:00 2001
|
||||
From: Chris Wilson <chris@chris-wilson.co.uk>
|
||||
Date: Sat, 19 Aug 2017 13:05:58 +0100
|
||||
Subject: [PATCH] UPSTREAM: drm: Release driver tracking before making the
|
||||
object available again
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
This is the same bug as we fixed in commit f6cd7daecff5 ("drm: Release
|
||||
driver references to handle before making it available again"), but now
|
||||
the exposure is via the PRIME lookup tables. If we remove the
|
||||
object/handle from the PRIME lut, then a new request for the same
|
||||
object/fd will generate a new handle, thus for a short window that
|
||||
object is known to userspace by two different handles. Fix this by
|
||||
releasing the driver tracking before PRIME.
|
||||
|
||||
Fixes: 0ff926c7d4f0 ("drm/prime: add exported buffers to current fprivs
|
||||
imported buffer list (v2)")
|
||||
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
|
||||
Cc: David Airlie <airlied@linux.ie>
|
||||
Cc: Daniel Vetter <daniel.vetter@intel.com>
|
||||
Cc: Rob Clark <robdclark@gmail.com>
|
||||
Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
|
||||
Cc: Thierry Reding <treding@nvidia.com>
|
||||
Cc: stable@vger.kernel.org
|
||||
Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
|
||||
Signed-off-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
|
||||
Link: https://patchwork.freedesktop.org/patch/msgid/20170819120558.6465-1-chris@chris-wilson.co.uk
|
||||
(cherry picked from commit d0a133f7f5bc3583e460ba6bb54474a50ada5201)
|
||||
---
|
||||
drivers/gpu/drm/drm_gem.c | 6 +++---
|
||||
1 file changed, 3 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/drivers/gpu/drm/drm_gem.c b/drivers/gpu/drm/drm_gem.c
|
||||
index d7f39a03c2c9..966ea63581b1 100644
|
||||
--- a/drivers/gpu/drm/drm_gem.c
|
||||
+++ b/drivers/gpu/drm/drm_gem.c
|
||||
@@ -255,13 +255,13 @@ drm_gem_object_release_handle(int id, void *ptr, void *data)
|
||||
struct drm_gem_object *obj = ptr;
|
||||
struct drm_device *dev = obj->dev;
|
||||
|
||||
+ if (dev->driver->gem_close_object)
|
||||
+ dev->driver->gem_close_object(obj, file_priv);
|
||||
+
|
||||
if (drm_core_check_feature(dev, DRIVER_PRIME))
|
||||
drm_gem_remove_prime_handles(obj, file_priv);
|
||||
drm_vma_node_revoke(&obj->vma_node, file_priv->filp);
|
||||
|
||||
- if (dev->driver->gem_close_object)
|
||||
- dev->driver->gem_close_object(obj, file_priv);
|
||||
-
|
||||
drm_gem_object_handle_unreference_unlocked(obj);
|
||||
|
||||
return 0;
|
||||
|
||||
From 1d9b65acb4e776f43408afed2b0fd7b86fdb95ce Mon Sep 17 00:00:00 2001
|
||||
From: Jonas Karlman <jonas@kwiboo.se>
|
||||
Date: Sat, 17 Feb 2018 05:30:36 +0100
|
||||
Subject: [PATCH] vcodec: skip reduce freq
|
||||
|
||||
---
|
||||
drivers/video/rockchip/vcodec/vcodec_service.c | 4 +---
|
||||
1 file changed, 1 insertion(+), 3 deletions(-)
|
||||
|
||||
diff --git a/drivers/video/rockchip/vcodec/vcodec_service.c b/drivers/video/rockchip/vcodec/vcodec_service.c
|
||||
index c4ee73be92d3..9d5ee5c8b1f9 100644
|
||||
--- a/drivers/video/rockchip/vcodec/vcodec_service.c
|
||||
+++ b/drivers/video/rockchip/vcodec/vcodec_service.c
|
||||
@@ -1630,9 +1630,6 @@ static void try_set_reg(struct vpu_subdev_data *data)
|
||||
reg_from_wait_to_run(pservice, reg);
|
||||
reg_copy_to_hw(reg->data, reg);
|
||||
}
|
||||
- } else {
|
||||
- if (pservice->hw_ops->reduce_freq)
|
||||
- pservice->hw_ops->reduce_freq(pservice);
|
||||
}
|
||||
|
||||
mutex_unlock(&pservice->shutdown_lock);
|
||||
@@ -2385,6 +2382,7 @@ static void vcodec_set_freq_rk3328(struct vpu_service_info *pservice,
|
||||
if (curr == reg->freq)
|
||||
return;
|
||||
|
||||
+ atomic_set(&pservice->freq_status, reg->freq);
|
||||
if (pservice->dev_id == VCODEC_DEVICE_ID_RKVDEC) {
|
||||
if (reg->reg[1] & 0x00800000) {
|
||||
if (rkv_dec_get_fmt(reg->reg) == FMT_H264D)
|
||||
840
patch/kernel/archive/rockchip64-4.4/video-fixes.patch
Normal file
840
patch/kernel/archive/rockchip64-4.4/video-fixes.patch
Normal file
@ -0,0 +1,840 @@
|
||||
From 61382c4e328df487f69b2095865c2e9e2c9e4121 Mon Sep 17 00:00:00 2001
|
||||
From: Jonas Karlman <jonas@kwiboo.se>
|
||||
Date: Sun, 28 May 2017 09:08:50 +0200
|
||||
Subject: [PATCH] gpu/arm/mali400: default to performance gpu governor
|
||||
|
||||
---
|
||||
drivers/gpu/arm/mali400/mali/linux/mali_devfreq.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/gpu/arm/mali400/mali/linux/mali_devfreq.c b/drivers/gpu/arm/mali400/mali/linux/mali_devfreq.c
|
||||
index c9b8652f100d..6c97c530a2ae 100644
|
||||
--- a/drivers/gpu/arm/mali400/mali/linux/mali_devfreq.c
|
||||
+++ b/drivers/gpu/arm/mali400/mali/linux/mali_devfreq.c
|
||||
@@ -259,7 +259,7 @@ int mali_devfreq_init(struct mali_device *mdev)
|
||||
return -EFAULT;
|
||||
|
||||
mdev->devfreq = devfreq_add_device(mdev->dev, dp,
|
||||
- "simple_ondemand", NULL);
|
||||
+ "performance", NULL);
|
||||
if (IS_ERR(mdev->devfreq)) {
|
||||
mali_devfreq_term_freq_table(mdev);
|
||||
return PTR_ERR(mdev->devfreq);
|
||||
|
||||
diff --git a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c
|
||||
index a58edabe600c..7273561fe6b1 100644
|
||||
--- a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c
|
||||
+++ b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c
|
||||
@@ -510,9 +510,15 @@ dw_hdmi_rockchip_mode_valid(struct drm_connector *connector,
|
||||
return MODE_BAD;
|
||||
|
||||
hdmi = to_rockchip_hdmi(encoder);
|
||||
- if (hdmi->dev_type == RK3368_HDMI && mode->clock > 340000 &&
|
||||
+ if ((hdmi->dev_type == RK3368_HDMI || hdmi->dev_type == RK3328_HDMI) &&
|
||||
+ mode->clock > 340000 &&
|
||||
!drm_mode_is_420(&connector->display_info, mode))
|
||||
return MODE_BAD;
|
||||
+
|
||||
+ /* Skip bad clocks for RK3288 */
|
||||
+ if (hdmi->dev_type == RK3288_HDMI && (mode->clock < 27500 || mode->clock > 340000))
|
||||
+ return MODE_CLOCK_RANGE;
|
||||
+
|
||||
/*
|
||||
* ensure all drm display mode can work, if someone want support more
|
||||
* resolutions, please limit the possible_crtc, only connect to
|
||||
|
||||
From 28e3e0508d53dd697fc3dd75588bba08adee1bb0 Mon Sep 17 00:00:00 2001
|
||||
From: xuhuicong <xhc@rock-chips.com>
|
||||
Date: Fri, 23 Jun 2017 18:56:17 +0800
|
||||
Subject: [PATCH] drm/rockchip: hdmi: fix no sound some time
|
||||
|
||||
Change-Id: Ic9f931d9a5b7bca954363293a20ca242eb0bfa6f
|
||||
Signed-off-by: xuhuicong <xhc@rock-chips.com>
|
||||
---
|
||||
drivers/gpu/drm/bridge/synopsys/dw-hdmi.c | 7 +++----
|
||||
1 file changed, 3 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
|
||||
index 8cb2cb4e61a6..30b6bd979eb8 100644
|
||||
--- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
|
||||
+++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
|
||||
@@ -1991,10 +1991,6 @@ static void hdmi_av_composer(struct dw_hdmi *hdmi,
|
||||
HDMI_FC_INVIDCONF_IN_I_P_INTERLACED :
|
||||
HDMI_FC_INVIDCONF_IN_I_P_PROGRESSIVE;
|
||||
|
||||
- inv_val |= hdmi->sink_is_hdmi ?
|
||||
- HDMI_FC_INVIDCONF_DVI_MODEZ_HDMI_MODE :
|
||||
- HDMI_FC_INVIDCONF_DVI_MODEZ_DVI_MODE;
|
||||
-
|
||||
hdmi_writeb(hdmi, inv_val, HDMI_FC_INVIDCONF);
|
||||
|
||||
hdisplay = mode->hdisplay;
|
||||
@@ -2292,6 +2288,9 @@ static int dw_hdmi_setup(struct dw_hdmi *hdmi, struct drm_display_mode *mode)
|
||||
/* not for DVI mode */
|
||||
if (hdmi->sink_is_hdmi) {
|
||||
dev_dbg(hdmi->dev, "%s HDMI mode\n", __func__);
|
||||
+ hdmi_modb(hdmi, HDMI_FC_INVIDCONF_DVI_MODEZ_HDMI_MODE,
|
||||
+ HDMI_FC_INVIDCONF_DVI_MODEZ_HDMI_MODE,
|
||||
+ HDMI_FC_INVIDCONF);
|
||||
|
||||
/* HDMI Initialization Step F - Configure AVI InfoFrame */
|
||||
hdmi_config_AVI(hdmi, mode);
|
||||
|
||||
From 16f51adab10ab06bfecbd0ed9e444329debb426d Mon Sep 17 00:00:00 2001
|
||||
From: Jonas Karlman <jonas@kwiboo.se>
|
||||
Date: Sat, 18 Nov 2017 11:09:39 +0100
|
||||
Subject: [PATCH] rockchip: vop: force skip lines if image too big
|
||||
|
||||
---
|
||||
drivers/gpu/drm/rockchip/rockchip_drm_vop.c | 13 ++++++++++---
|
||||
1 file changed, 10 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
|
||||
index 76610608c723..1418402c2668 100644
|
||||
--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
|
||||
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
|
||||
@@ -1653,6 +1653,7 @@ static void vop_plane_atomic_update(struct drm_plane *plane,
|
||||
int ymirror, xmirror;
|
||||
uint32_t val;
|
||||
bool rb_swap, global_alpha_en;
|
||||
+ int skip_lines = 0;
|
||||
|
||||
#if defined(CONFIG_ROCKCHIP_DRM_DEBUG)
|
||||
bool AFBC_flag = false;
|
||||
@@ -1689,8 +1690,14 @@ static void vop_plane_atomic_update(struct drm_plane *plane,
|
||||
}
|
||||
|
||||
mode = &crtc->state->adjusted_mode;
|
||||
+
|
||||
+ /*
|
||||
+ * force skip lines if image too big.
|
||||
+ */
|
||||
actual_w = drm_rect_width(src) >> 16;
|
||||
- actual_h = drm_rect_height(src) >> 16;
|
||||
+ if (actual_w == 3840 && is_yuv_support(fb->pixel_format))
|
||||
+ skip_lines = 1;
|
||||
+ actual_h = drm_rect_height(src) >> (16 + skip_lines);
|
||||
act_info = (actual_h - 1) << 16 | ((actual_w - 1) & 0xffff);
|
||||
|
||||
dsp_info = (drm_rect_height(dest) - 1) << 16;
|
||||
@@ -1727,12 +1734,12 @@ static void vop_plane_atomic_update(struct drm_plane *plane,
|
||||
VOP_WIN_SET(vop, win, xmirror, xmirror);
|
||||
VOP_WIN_SET(vop, win, ymirror, ymirror);
|
||||
VOP_WIN_SET(vop, win, format, vop_plane_state->format);
|
||||
- VOP_WIN_SET(vop, win, yrgb_vir, fb->pitches[0] >> 2);
|
||||
+ VOP_WIN_SET(vop, win, yrgb_vir, fb->pitches[0] >> (2 - skip_lines));
|
||||
VOP_WIN_SET(vop, win, yrgb_mst, vop_plane_state->yrgb_mst);
|
||||
VOP_WIN_SET(vop, win, yrgb_mst1, vop_plane_state->yrgb_mst);
|
||||
|
||||
if (is_yuv_support(fb->pixel_format)) {
|
||||
- VOP_WIN_SET(vop, win, uv_vir, fb->pitches[1] >> 2);
|
||||
+ VOP_WIN_SET(vop, win, uv_vir, fb->pitches[1] >> (2 - skip_lines));
|
||||
VOP_WIN_SET(vop, win, uv_mst, vop_plane_state->uv_mst);
|
||||
}
|
||||
VOP_WIN_SET(vop, win, fmt_10, is_yuv_10bit(fb->pixel_format));
|
||||
|
||||
From d56d2c8dcd6dc828693bed0cf965d68e90431019 Mon Sep 17 00:00:00 2001
|
||||
From: Jonas Karlman <jonas@kwiboo.se>
|
||||
Date: Sat, 18 Nov 2017 23:17:24 +0100
|
||||
Subject: [PATCH] gpu/arm/midgard: default to performance gpu governor
|
||||
|
||||
---
|
||||
drivers/gpu/arm/midgard/backend/gpu/mali_kbase_devfreq.c | 5 ++---
|
||||
drivers/gpu/arm/midgard/mali_kbase_config_defaults.h | 3 +--
|
||||
2 files changed, 3 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_devfreq.c b/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_devfreq.c
|
||||
index 1495f06cd9b9..a6d2e0121015 100644
|
||||
--- a/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_devfreq.c
|
||||
+++ b/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_devfreq.c
|
||||
@@ -348,8 +348,7 @@ int kbase_devfreq_init(struct kbase_device *kbdev)
|
||||
dp = &kbdev->devfreq_profile;
|
||||
|
||||
dp->initial_freq = kbdev->current_freq;
|
||||
- /* .KP : set devfreq_dvfs_interval_in_ms */
|
||||
- dp->polling_ms = 20;
|
||||
+ dp->polling_ms = 100;
|
||||
dp->target = kbase_devfreq_target;
|
||||
dp->get_dev_status = kbase_devfreq_status;
|
||||
dp->get_cur_freq = kbase_devfreq_cur_freq;
|
||||
@@ -363,7 +362,7 @@ int kbase_devfreq_init(struct kbase_device *kbdev)
|
||||
return err;
|
||||
|
||||
kbdev->devfreq = devfreq_add_device(kbdev->dev, dp,
|
||||
- "simple_ondemand", NULL);
|
||||
+ "performance", NULL);
|
||||
if (IS_ERR(kbdev->devfreq)) {
|
||||
kbase_devfreq_term_freq_table(kbdev);
|
||||
return PTR_ERR(kbdev->devfreq);
|
||||
diff --git a/drivers/gpu/arm/midgard/mali_kbase_config_defaults.h b/drivers/gpu/arm/midgard/mali_kbase_config_defaults.h
|
||||
index 1cf44b3500cf..a6a1a52f0463 100644
|
||||
--- a/drivers/gpu/arm/midgard/mali_kbase_config_defaults.h
|
||||
+++ b/drivers/gpu/arm/midgard/mali_kbase_config_defaults.h
|
||||
@@ -109,8 +109,7 @@ enum {
|
||||
/*
|
||||
* Default period for DVFS sampling
|
||||
*/
|
||||
-// #define DEFAULT_PM_DVFS_PERIOD 100 /* 100ms */
|
||||
-#define DEFAULT_PM_DVFS_PERIOD 20 /* 20 ms */
|
||||
+#define DEFAULT_PM_DVFS_PERIOD 100 /* 100ms */
|
||||
|
||||
/*
|
||||
* Power Management poweroff tick granuality. This is in nanoseconds to
|
||||
|
||||
From 955a2a87c8fa737d78c022afef1ed32fd6f06760 Mon Sep 17 00:00:00 2001
|
||||
From: Jonas Karlman <jonas@kwiboo.se>
|
||||
Date: Sun, 10 Dec 2017 14:16:09 +0100
|
||||
Subject: [PATCH] uapi: install rockchip_drm header
|
||||
|
||||
---
|
||||
include/uapi/drm/Kbuild | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/include/uapi/drm/Kbuild b/include/uapi/drm/Kbuild
|
||||
index 38d437096c35..b7ae9969d41e 100644
|
||||
--- a/include/uapi/drm/Kbuild
|
||||
+++ b/include/uapi/drm/Kbuild
|
||||
@@ -11,6 +11,7 @@ header-y += nouveau_drm.h
|
||||
header-y += qxl_drm.h
|
||||
header-y += r128_drm.h
|
||||
header-y += radeon_drm.h
|
||||
+header-y += rockchip_drm.h
|
||||
header-y += savage_drm.h
|
||||
header-y += sis_drm.h
|
||||
header-y += tegra_drm.h
|
||||
|
||||
From f3f9dc1c2c697f0c9fefd501731a07ef64a026b1 Mon Sep 17 00:00:00 2001
|
||||
From: Jonas Karlman <jonas@kwiboo.se>
|
||||
Date: Tue, 12 Dec 2017 00:37:27 +0100
|
||||
Subject: [PATCH] clk: rockchip: fix round rate
|
||||
|
||||
---
|
||||
drivers/clk/rockchip/clk-pll.c | 11 +++++++++++
|
||||
1 file changed, 11 insertions(+)
|
||||
|
||||
diff --git a/drivers/clk/rockchip/clk-pll.c b/drivers/clk/rockchip/clk-pll.c
|
||||
index 0a9f31f2dd27..183114d824a7 100644
|
||||
--- a/drivers/clk/rockchip/clk-pll.c
|
||||
+++ b/drivers/clk/rockchip/clk-pll.c
|
||||
@@ -364,6 +364,17 @@ static const struct rockchip_pll_rate_table *rockchip_get_pll_settings(
|
||||
static long rockchip_pll_round_rate(struct clk_hw *hw,
|
||||
unsigned long drate, unsigned long *prate)
|
||||
{
|
||||
+ struct rockchip_clk_pll *pll = to_rockchip_clk_pll(hw);
|
||||
+ const struct rockchip_pll_rate_table *rate;
|
||||
+
|
||||
+ /* Get required rate settings from table */
|
||||
+ rate = rockchip_get_pll_settings(pll, drate);
|
||||
+ if (!rate) {
|
||||
+ pr_debug("%s: Invalid rate : %lu for pll clk %s\n", __func__,
|
||||
+ drate, __clk_get_name(hw->clk));
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+
|
||||
return drate;
|
||||
}
|
||||
|
||||
|
||||
From 5a5f5ea8edcc75ca49961a458ac0380e60f30a4d Mon Sep 17 00:00:00 2001
|
||||
From: Jonas Karlman <jonas@kwiboo.se>
|
||||
Date: Sun, 21 Jan 2018 17:20:00 +0100
|
||||
Subject: [PATCH] drm: fix HDR metadata infoframe length
|
||||
|
||||
HDR metadata infoframe length is 26 bytes (not 30) according to [1]
|
||||
(CTA-861-G: 6.9 Dynamic Range and Mastering InfoFrame)
|
||||
|
||||
Fixes activation of HDR mode on my LG OLED
|
||||
|
||||
[1] https://standards.cta.tech/kwspub/published_docs/CTA-861-G_FINAL_revised_2017.pdf
|
||||
---
|
||||
drivers/gpu/drm/bridge/synopsys/dw-hdmi.c | 2 +-
|
||||
drivers/gpu/drm/drm_edid.c | 4 ++--
|
||||
2 files changed, 3 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
|
||||
index 30b6bd979eb8..ec002a4a7a7d 100644
|
||||
--- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
|
||||
+++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
|
||||
@@ -1857,7 +1857,7 @@ static void hdmi_config_hdr_infoframe(struct dw_hdmi *hdmi)
|
||||
return;
|
||||
}
|
||||
|
||||
- hdmi_writeb(hdmi, 1, HDMI_FC_DRM_HB0);
|
||||
+ hdmi_writeb(hdmi, frame.version, HDMI_FC_DRM_HB0);
|
||||
hdmi_writeb(hdmi, frame.length, HDMI_FC_DRM_HB1);
|
||||
hdmi_writeb(hdmi, frame.eotf, HDMI_FC_DRM_PB0);
|
||||
hdmi_writeb(hdmi, frame.metadata_type, HDMI_FC_DRM_PB1);
|
||||
diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
|
||||
index bfe671071d9f..e3a0f561e8f0 100644
|
||||
--- a/drivers/gpu/drm/drm_edid.c
|
||||
+++ b/drivers/gpu/drm/drm_edid.c
|
||||
@@ -4735,10 +4735,10 @@ drm_hdmi_infoframe_set_hdr_metadata(struct hdmi_drm_infoframe *frame,
|
||||
|
||||
hdr_source_metadata = (struct hdr_static_metadata *)hdr_metadata;
|
||||
|
||||
- frame->length = sizeof(struct hdr_static_metadata);
|
||||
+ frame->length = 26;
|
||||
|
||||
frame->eotf = hdr_source_metadata->eotf;
|
||||
- frame->type = hdr_source_metadata->type;
|
||||
+ frame->metadata_type = hdr_source_metadata->type;
|
||||
|
||||
for (i = 0; i < 3; i++) {
|
||||
frame->display_primaries_x[i] =
|
||||
|
||||
From 19e9d690fe47e5e4b47760d060b11707bb44194b Mon Sep 17 00:00:00 2001
|
||||
From: Jonas Karlman <jonas@kwiboo.se>
|
||||
Date: Sun, 11 Feb 2018 19:21:41 +0100
|
||||
Subject: [PATCH] drm: bridge: dw-hdmi: default to underscan mode
|
||||
|
||||
---
|
||||
drivers/gpu/drm/bridge/synopsys/dw-hdmi.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
|
||||
index ec002a4a7a7d..393bd5b28f07 100644
|
||||
--- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
|
||||
+++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
|
||||
@@ -1691,7 +1691,7 @@ static void hdmi_config_AVI(struct dw_hdmi *hdmi, struct drm_display_mode *mode)
|
||||
break;
|
||||
}
|
||||
|
||||
- frame.scan_mode = HDMI_SCAN_MODE_NONE;
|
||||
+ frame.scan_mode = HDMI_SCAN_MODE_UNDERSCAN;
|
||||
|
||||
/*
|
||||
* The Designware IP uses a different byte format from standard
|
||||
|
||||
From 922cc477bd191cbfddae005b27a2c89cb9c9623a Mon Sep 17 00:00:00 2001
|
||||
From: Jonas Karlman <jonas@kwiboo.se>
|
||||
Date: Sun, 1 Jul 2018 23:17:47 +0200
|
||||
Subject: [PATCH] drm/rockchip: clip yuv
|
||||
|
||||
---
|
||||
drivers/gpu/drm/rockchip/rockchip_drm_vop.c | 2 ++
|
||||
drivers/gpu/drm/rockchip/rockchip_drm_vop.h | 2 ++
|
||||
drivers/gpu/drm/rockchip/rockchip_vop_reg.c | 3 +++
|
||||
3 files changed, 7 insertions(+)
|
||||
|
||||
diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
|
||||
index 1418402c2668..0916b4284f88 100644
|
||||
--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
|
||||
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
|
||||
@@ -1731,6 +1731,7 @@ static void vop_plane_atomic_update(struct drm_plane *plane,
|
||||
s = to_rockchip_crtc_state(crtc->state);
|
||||
|
||||
spin_lock(&vop->reg_lock);
|
||||
+ VOP_WIN_SET(vop, win, yuv_clip, 0);
|
||||
VOP_WIN_SET(vop, win, xmirror, xmirror);
|
||||
VOP_WIN_SET(vop, win, ymirror, ymirror);
|
||||
VOP_WIN_SET(vop, win, format, vop_plane_state->format);
|
||||
@@ -2544,6 +2545,7 @@ static void vop_update_csc(struct drm_crtc *crtc)
|
||||
VOP_CTRL_SET(vop, dsp_data_swap, 0);
|
||||
|
||||
VOP_CTRL_SET(vop, out_mode, s->output_mode);
|
||||
+ VOP_CTRL_SET(vop, yuv_clip, 0);
|
||||
|
||||
switch (s->bus_format) {
|
||||
case MEDIA_BUS_FMT_RGB565_1X16:
|
||||
diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.h b/drivers/gpu/drm/rockchip/rockchip_drm_vop.h
|
||||
index 618de17e608a..391998c7aa50 100644
|
||||
--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.h
|
||||
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.h
|
||||
@@ -178,6 +178,7 @@ struct vop_ctrl {
|
||||
struct vop_reg dsp_lut_en;
|
||||
|
||||
struct vop_reg out_mode;
|
||||
+ struct vop_reg yuv_clip;
|
||||
|
||||
struct vop_reg xmirror;
|
||||
struct vop_reg ymirror;
|
||||
@@ -409,6 +410,7 @@ struct vop_win_phy {
|
||||
struct vop_reg format;
|
||||
struct vop_reg fmt_10;
|
||||
struct vop_reg csc_mode;
|
||||
+ struct vop_reg yuv_clip;
|
||||
struct vop_reg xmirror;
|
||||
struct vop_reg ymirror;
|
||||
struct vop_reg rb_swap;
|
||||
diff --git a/drivers/gpu/drm/rockchip/rockchip_vop_reg.c b/drivers/gpu/drm/rockchip/rockchip_vop_reg.c
|
||||
index 9c96d5614e54..aeb1c7644bc9 100644
|
||||
--- a/drivers/gpu/drm/rockchip/rockchip_vop_reg.c
|
||||
+++ b/drivers/gpu/drm/rockchip/rockchip_vop_reg.c
|
||||
@@ -119,6 +119,7 @@ static const struct vop_win_phy rk3288_win01_data = {
|
||||
.fmt_10 = VOP_REG(RK3288_WIN0_CTRL0, 0x7, 4),
|
||||
.csc_mode = VOP_REG_VER(RK3288_WIN0_CTRL0, 0x3, 10, 3, 2, -1),
|
||||
.rb_swap = VOP_REG(RK3288_WIN0_CTRL0, 0x1, 12),
|
||||
+ .yuv_clip = VOP_REG(RK3288_WIN0_CTRL0, 0x1, 20),
|
||||
.xmirror = VOP_REG_VER(RK3368_WIN0_CTRL0, 0x1, 21, 3, 2, -1),
|
||||
.ymirror = VOP_REG_VER(RK3368_WIN0_CTRL0, 0x1, 22, 3, 2, -1),
|
||||
.act_info = VOP_REG(RK3288_WIN0_ACT_INFO, 0x1fff1fff, 0),
|
||||
@@ -286,6 +287,7 @@ static const struct vop_ctrl rk3288_ctrl_data = {
|
||||
.bcsh_color_bar = VOP_REG(RK3288_BCSH_COLOR_BAR, 0xffffff, 8),
|
||||
.bcsh_en = VOP_REG(RK3288_BCSH_COLOR_BAR, 0x1, 0),
|
||||
|
||||
+ .yuv_clip = VOP_REG(RK3288_DSP_CTRL0, 0x1, 21),
|
||||
.xmirror = VOP_REG(RK3288_DSP_CTRL0, 0x1, 22),
|
||||
.ymirror = VOP_REG(RK3288_DSP_CTRL0, 0x1, 23),
|
||||
|
||||
@@ -964,6 +966,7 @@ static const struct vop_ctrl rk3328_ctrl_data = {
|
||||
.dsp_lut_en = VOP_REG(RK3328_DSP_CTRL1, 0x1, 0),
|
||||
.out_mode = VOP_REG(RK3328_DSP_CTRL0, 0xf, 0),
|
||||
|
||||
+ .yuv_clip = VOP_REG(RK3328_DSP_CTRL0, 0x1, 21),
|
||||
.xmirror = VOP_REG(RK3328_DSP_CTRL0, 0x1, 22),
|
||||
.ymirror = VOP_REG(RK3328_DSP_CTRL0, 0x1, 23),
|
||||
|
||||
|
||||
From 991811443d72d7915afdee23c30843669a347d7c Mon Sep 17 00:00:00 2001
|
||||
From: Jonas Karlman <jonas@kwiboo.se>
|
||||
Date: Sun, 8 Jul 2018 12:38:00 +0200
|
||||
Subject: [PATCH] drm/atomic: use active_only flag for connector atomic
|
||||
begin/flush
|
||||
|
||||
---
|
||||
drivers/gpu/drm/drm_atomic_helper.c | 20 ++++++++++----------
|
||||
1 file changed, 10 insertions(+), 10 deletions(-)
|
||||
|
||||
diff --git a/drivers/gpu/drm/drm_atomic_helper.c b/drivers/gpu/drm/drm_atomic_helper.c
|
||||
index f77d4aa1e58b..4da489b54dc5 100644
|
||||
--- a/drivers/gpu/drm/drm_atomic_helper.c
|
||||
+++ b/drivers/gpu/drm/drm_atomic_helper.c
|
||||
@@ -1563,15 +1563,15 @@ void drm_atomic_helper_commit_planes(struct drm_device *dev,
|
||||
for_each_connector_in_state(old_state, connector, old_conn_state, i) {
|
||||
const struct drm_connector_helper_funcs *funcs;
|
||||
|
||||
- if (!connector->state->crtc)
|
||||
- continue;
|
||||
+ funcs = connector->helper_private;
|
||||
|
||||
- if (!connector->state->crtc->state->active)
|
||||
+ if (!funcs || !funcs->atomic_begin)
|
||||
continue;
|
||||
|
||||
- funcs = connector->helper_private;
|
||||
+ if (!connector->state->crtc)
|
||||
+ continue;
|
||||
|
||||
- if (!funcs || !funcs->atomic_begin)
|
||||
+ if (active_only && !connector->state->crtc->state->active)
|
||||
continue;
|
||||
|
||||
DRM_DEBUG_ATOMIC("flush beginning [CONNECTOR:%d:%s]\n",
|
||||
@@ -1645,15 +1645,15 @@ void drm_atomic_helper_commit_planes(struct drm_device *dev,
|
||||
for_each_connector_in_state(old_state, connector, old_conn_state, i) {
|
||||
const struct drm_connector_helper_funcs *funcs;
|
||||
|
||||
- if (!connector->state->crtc)
|
||||
- continue;
|
||||
+ funcs = connector->helper_private;
|
||||
|
||||
- if (!connector->state->crtc->state->active)
|
||||
+ if (!funcs || !funcs->atomic_flush)
|
||||
continue;
|
||||
|
||||
- funcs = connector->helper_private;
|
||||
+ if (!connector->state->crtc)
|
||||
+ continue;
|
||||
|
||||
- if (!funcs || !funcs->atomic_flush)
|
||||
+ if (active_only && !connector->state->crtc->state->active)
|
||||
continue;
|
||||
|
||||
DRM_DEBUG_ATOMIC("flushing [CONNECTOR:%d:%s]\n",
|
||||
|
||||
From 8d514d5127fbb4d49247f893ac6b803cbdd3304d Mon Sep 17 00:00:00 2001
|
||||
From: Jonas Karlman <jonas@kwiboo.se>
|
||||
Date: Sun, 22 Jul 2018 14:51:58 +0200
|
||||
Subject: [PATCH] drm: rockchip: dw-hdmi: only force YCbCr422 when max tmds is
|
||||
up to 340Mhz
|
||||
|
||||
---
|
||||
drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c | 4 +++-
|
||||
1 file changed, 3 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c
|
||||
index 7273561fe6b1..e2aad6e2149b 100644
|
||||
--- a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c
|
||||
+++ b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c
|
||||
@@ -728,7 +728,9 @@ dw_hdmi_rockchip_select_output(struct drm_connector_state *conn_state,
|
||||
/* BT2020 require color depth at lest 10bit */
|
||||
*color_depth = 10;
|
||||
/* We prefer use YCbCr422 to send 10bit */
|
||||
- if (info->color_formats & DRM_COLOR_FORMAT_YCRCB422)
|
||||
+ if (info->color_formats & DRM_COLOR_FORMAT_YCRCB422 &&
|
||||
+ info->max_tmds_clock <= 340000 &&
|
||||
+ hdmi->dev_type != RK3288_HDMI)
|
||||
*color_format = DRM_HDMI_OUTPUT_YCBCR422;
|
||||
}
|
||||
|
||||
|
||||
From 9d6de32c2e992b71e6634a284dc99ab1b3bd43e2 Mon Sep 17 00:00:00 2001
|
||||
From: Jonas Karlman <jonas@kwiboo.se>
|
||||
Date: Sun, 22 Jul 2018 15:09:16 +0200
|
||||
Subject: [PATCH] drm: bridge: dw-hdmi: signal full range for rgb output
|
||||
|
||||
---
|
||||
drivers/gpu/drm/bridge/synopsys/dw-hdmi.c | 8 ++++++++
|
||||
1 file changed, 8 insertions(+)
|
||||
|
||||
diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
|
||||
index 393bd5b28f07..91c5b8fc8fa0 100644
|
||||
--- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
|
||||
+++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
|
||||
@@ -1693,6 +1693,14 @@ static void hdmi_config_AVI(struct dw_hdmi *hdmi, struct drm_display_mode *mode)
|
||||
|
||||
frame.scan_mode = HDMI_SCAN_MODE_UNDERSCAN;
|
||||
|
||||
+ if (hdmi_bus_fmt_is_rgb(hdmi->hdmi_data.enc_out_bus_format)) {
|
||||
+ frame.quantization_range = HDMI_QUANTIZATION_RANGE_FULL;
|
||||
+ frame.ycc_quantization_range = HDMI_YCC_QUANTIZATION_RANGE_FULL;
|
||||
+ } else {
|
||||
+ frame.quantization_range = HDMI_QUANTIZATION_RANGE_LIMITED;
|
||||
+ frame.ycc_quantization_range = HDMI_YCC_QUANTIZATION_RANGE_LIMITED;
|
||||
+ }
|
||||
+
|
||||
/*
|
||||
* The Designware IP uses a different byte format from standard
|
||||
* AVI info frames, though generally the bits are in the correct
|
||||
|
||||
From 24a070f21767a8d381b81ab5fc5f39c2b9729b24 Mon Sep 17 00:00:00 2001
|
||||
From: Jonas Karlman <jonas@kwiboo.se>
|
||||
Date: Sat, 4 Aug 2018 15:19:39 +0200
|
||||
Subject: [PATCH] drm: add picture_aspect_ratio to hdmi 1.4 4k modes
|
||||
|
||||
---
|
||||
drivers/gpu/drm/drm_edid.c | 8 ++++----
|
||||
1 file changed, 4 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
|
||||
index f7d41950614e..69a1eb4ee382 100644
|
||||
--- a/drivers/gpu/drm/drm_edid.c
|
||||
+++ b/drivers/gpu/drm/drm_edid.c
|
||||
@@ -1233,25 +1233,25 @@ static const struct drm_display_mode edid_4k_modes[] = {
|
||||
3840, 4016, 4104, 4400, 0,
|
||||
2160, 2168, 2178, 2250, 0,
|
||||
DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
|
||||
- .vrefresh = 30, },
|
||||
+ .vrefresh = 30, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
|
||||
/* 2 - 3840x2160@25Hz */
|
||||
{ DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 297000,
|
||||
3840, 4896, 4984, 5280, 0,
|
||||
2160, 2168, 2178, 2250, 0,
|
||||
DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
|
||||
- .vrefresh = 25, },
|
||||
+ .vrefresh = 25, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
|
||||
/* 3 - 3840x2160@24Hz */
|
||||
{ DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 297000,
|
||||
3840, 5116, 5204, 5500, 0,
|
||||
2160, 2168, 2178, 2250, 0,
|
||||
DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
|
||||
- .vrefresh = 24, },
|
||||
+ .vrefresh = 24, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
|
||||
/* 4 - 4096x2160@24Hz (SMPTE) */
|
||||
{ DRM_MODE("4096x2160", DRM_MODE_TYPE_DRIVER, 297000,
|
||||
4096, 5116, 5204, 5500, 0,
|
||||
2160, 2168, 2178, 2250, 0,
|
||||
DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
|
||||
- .vrefresh = 24, },
|
||||
+ .vrefresh = 24, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_256_135, },
|
||||
};
|
||||
|
||||
/*** DDC fetch and block validation ***/
|
||||
|
||||
From daadd2b2e1bf5419694ebae5243e61e462885b03 Mon Sep 17 00:00:00 2001
|
||||
From: Jonas Karlman <jonas@kwiboo.se>
|
||||
Date: Sat, 4 Aug 2018 16:26:47 +0200
|
||||
Subject: [PATCH] drm: bridge: dw-hdmi: signal none colorimetry for rgb output
|
||||
|
||||
---
|
||||
drivers/gpu/drm/bridge/synopsys/dw-hdmi.c | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
|
||||
index 91c5b8fc8fa0..8261ba15f98e 100644
|
||||
--- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
|
||||
+++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
|
||||
@@ -1694,6 +1694,8 @@ static void hdmi_config_AVI(struct dw_hdmi *hdmi, struct drm_display_mode *mode)
|
||||
frame.scan_mode = HDMI_SCAN_MODE_UNDERSCAN;
|
||||
|
||||
if (hdmi_bus_fmt_is_rgb(hdmi->hdmi_data.enc_out_bus_format)) {
|
||||
+ frame.colorimetry = HDMI_COLORIMETRY_NONE;
|
||||
+ frame.extended_colorimetry = 0;
|
||||
frame.quantization_range = HDMI_QUANTIZATION_RANGE_FULL;
|
||||
frame.ycc_quantization_range = HDMI_YCC_QUANTIZATION_RANGE_FULL;
|
||||
} else {
|
||||
|
||||
From 88c6dbd7a37b01d4029102c6fdad2b1fc24098e0 Mon Sep 17 00:00:00 2001
|
||||
From: Jonas Karlman <jonas@kwiboo.se>
|
||||
Date: Sat, 4 Aug 2018 16:27:08 +0200
|
||||
Subject: [PATCH] drm: bridge: dw-hdmi: signal it content and content type
|
||||
|
||||
---
|
||||
drivers/gpu/drm/bridge/synopsys/dw-hdmi.c | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
|
||||
index 8261ba15f98e..cdfa295fc323 100644
|
||||
--- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
|
||||
+++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
|
||||
@@ -1692,6 +1692,8 @@ static void hdmi_config_AVI(struct dw_hdmi *hdmi, struct drm_display_mode *mode)
|
||||
}
|
||||
|
||||
frame.scan_mode = HDMI_SCAN_MODE_UNDERSCAN;
|
||||
+ frame.content_type = HDMI_CONTENT_TYPE_GRAPHICS;
|
||||
+ frame.itc = true;
|
||||
|
||||
if (hdmi_bus_fmt_is_rgb(hdmi->hdmi_data.enc_out_bus_format)) {
|
||||
frame.colorimetry = HDMI_COLORIMETRY_NONE;
|
||||
|
||||
From 7405c1596ae36388bc2d32dd8b72f0b1f22ffb41 Mon Sep 17 00:00:00 2001
|
||||
From: Randy Li <randy.li@rock-chips.com>
|
||||
Date: Thu, 20 Sep 2018 10:59:11 +0800
|
||||
Subject: [PATCH] Mali: midgard: fix the memory translation for aarch32
|
||||
|
||||
When the clients are 32 bits while the kernel is 64 bits,
|
||||
we need to translate the memory address before accessing.
|
||||
|
||||
Change-Id: I7f47ab94da258e9d170613252aae9b396623cf48
|
||||
Signed-off-by: Randy Li <randy.li@rock-chips.com>
|
||||
---
|
||||
drivers/gpu/arm/midgard/mali_kbase_core_linux.c | 88 +++++++++++++++++++------
|
||||
1 file changed, 69 insertions(+), 19 deletions(-)
|
||||
|
||||
diff --git a/drivers/gpu/arm/midgard/mali_kbase_core_linux.c b/drivers/gpu/arm/midgard/mali_kbase_core_linux.c
|
||||
index 24bafe2bf32c..65bc5ad2a7c2 100644
|
||||
--- a/drivers/gpu/arm/midgard/mali_kbase_core_linux.c
|
||||
+++ b/drivers/gpu/arm/midgard/mali_kbase_core_linux.c
|
||||
@@ -515,14 +515,20 @@ copy_failed:
|
||||
case KBASE_FUNC_JOB_SUBMIT:
|
||||
{
|
||||
struct kbase_uk_job_submit *job = args;
|
||||
+ void __user *user_addr = NULL;
|
||||
|
||||
if (sizeof(*job) != args_size)
|
||||
goto bad_size;
|
||||
|
||||
- if (kbase_jd_submit(kctx, job->addr.value,
|
||||
- job->nr_atoms,
|
||||
- job->stride,
|
||||
- false) != 0)
|
||||
+#ifdef CONFIG_COMPAT
|
||||
+ if (kbase_ctx_flag(kctx, KCTX_COMPAT))
|
||||
+ user_addr = compat_ptr(job->addr.compat_value);
|
||||
+ else
|
||||
+#endif
|
||||
+ user_addr = job->addr.value;
|
||||
+
|
||||
+ if (kbase_jd_submit(kctx, user_addr, job->nr_atoms,
|
||||
+ job->stride, false) != 0)
|
||||
ukh->ret = MALI_ERROR_FUNCTION_FAILED;
|
||||
break;
|
||||
}
|
||||
@@ -531,14 +537,20 @@ copy_failed:
|
||||
case KBASE_FUNC_JOB_SUBMIT_UK6:
|
||||
{
|
||||
struct kbase_uk_job_submit *job = args;
|
||||
+ void __user *user_addr = NULL;
|
||||
|
||||
if (sizeof(*job) != args_size)
|
||||
goto bad_size;
|
||||
|
||||
- if (kbase_jd_submit(kctx, job->addr.value,
|
||||
- job->nr_atoms,
|
||||
- job->stride,
|
||||
- true) != 0)
|
||||
+#ifdef CONFIG_COMPAT
|
||||
+ if (kbase_ctx_flag(kctx, KCTX_COMPAT))
|
||||
+ user_addr = compat_ptr(job->addr.compat_value);
|
||||
+ else
|
||||
+#endif
|
||||
+ user_addr = job->addr.value;
|
||||
+
|
||||
+ if (kbase_jd_submit(kctx, user_addr, job->nr_atoms,
|
||||
+ job->stride, true) != 0)
|
||||
ukh->ret = MALI_ERROR_FUNCTION_FAILED;
|
||||
break;
|
||||
}
|
||||
@@ -646,7 +658,8 @@ copy_failed:
|
||||
goto bad_size;
|
||||
|
||||
if (find->gpu_addr & ~PAGE_MASK) {
|
||||
- dev_warn(kbdev->dev, "kbase_legacy_dispatch case KBASE_FUNC_FIND_CPU_OFFSET: find->gpu_addr: passed parameter is invalid");
|
||||
+ dev_warn(kbdev->dev,
|
||||
+ "kbase_legacy_dispatch case KBASE_FUNC_FIND_CPU_OFFSET: find->gpu_addr: passed parameter is invalid");
|
||||
goto out_bad;
|
||||
}
|
||||
|
||||
@@ -674,8 +687,11 @@ copy_failed:
|
||||
goto bad_size;
|
||||
|
||||
/* version buffer size check is made in compile time assert */
|
||||
- memcpy(get_version->version_buffer, KERNEL_SIDE_DDK_VERSION_STRING, sizeof(KERNEL_SIDE_DDK_VERSION_STRING));
|
||||
- get_version->version_string_size = sizeof(KERNEL_SIDE_DDK_VERSION_STRING);
|
||||
+ memcpy(get_version->version_buffer,
|
||||
+ KERNEL_SIDE_DDK_VERSION_STRING,
|
||||
+ sizeof(KERNEL_SIDE_DDK_VERSION_STRING));
|
||||
+ get_version->version_string_size =
|
||||
+ sizeof(KERNEL_SIDE_DDK_VERSION_STRING);
|
||||
get_version->rk_version = ROCKCHIP_VERSION;
|
||||
break;
|
||||
}
|
||||
@@ -828,7 +844,8 @@ copy_failed:
|
||||
|
||||
#ifdef CONFIG_COMPAT
|
||||
if (kbase_ctx_flag(kctx, KCTX_COMPAT))
|
||||
- user_buf = compat_ptr(add_data->buf.compat_value);
|
||||
+ user_buf =
|
||||
+ compat_ptr(add_data->buf.compat_value);
|
||||
else
|
||||
#endif
|
||||
user_buf = add_data->buf.value;
|
||||
@@ -977,9 +994,9 @@ copy_failed:
|
||||
|
||||
return ret;
|
||||
|
||||
- bad_size:
|
||||
+bad_size:
|
||||
dev_err(kbdev->dev, "Wrong syscall size (%d) for %08x\n", args_size, id);
|
||||
- out_bad:
|
||||
+out_bad:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@@ -1317,7 +1334,16 @@ static int kbase_api_set_flags(struct kbase_context *kctx,
|
||||
static int kbase_api_job_submit(struct kbase_context *kctx,
|
||||
struct kbase_ioctl_job_submit *submit)
|
||||
{
|
||||
- return kbase_jd_submit(kctx, submit->addr.value, submit->nr_atoms,
|
||||
+ void __user *user_addr = NULL;
|
||||
+
|
||||
+#ifdef CONFIG_COMPAT
|
||||
+ if (kbase_ctx_flag(kctx, KCTX_COMPAT))
|
||||
+ user_addr = compat_ptr(submit->addr.compat_value);
|
||||
+ else
|
||||
+#endif
|
||||
+ user_addr = submit->addr.value;
|
||||
+
|
||||
+ return kbase_jd_submit(kctx, user_addr, submit->nr_atoms,
|
||||
submit->stride, false);
|
||||
}
|
||||
|
||||
@@ -1548,6 +1574,7 @@ static int kbase_api_mem_alias(struct kbase_context *kctx,
|
||||
union kbase_ioctl_mem_alias *alias)
|
||||
{
|
||||
struct base_mem_aliasing_info *ai;
|
||||
+ void __user *user_addr = NULL;
|
||||
u64 flags;
|
||||
int err;
|
||||
|
||||
@@ -1558,8 +1585,15 @@ static int kbase_api_mem_alias(struct kbase_context *kctx,
|
||||
if (!ai)
|
||||
return -ENOMEM;
|
||||
|
||||
- err = copy_from_user(ai, alias->in.aliasing_info.value,
|
||||
- sizeof(*ai) * alias->in.nents);
|
||||
+#ifdef CONFIG_COMPAT
|
||||
+ if (kbase_ctx_flag(kctx, KCTX_COMPAT))
|
||||
+ user_addr =
|
||||
+ compat_ptr(alias->in.aliasing_info.compat_value);
|
||||
+ else
|
||||
+#endif
|
||||
+ user_addr = alias->in.aliasing_info.value;
|
||||
+
|
||||
+ err = copy_from_user(ai, user_addr, sizeof(*ai) * alias->in.nents);
|
||||
if (err) {
|
||||
vfree(ai);
|
||||
return err;
|
||||
@@ -1586,10 +1620,18 @@ static int kbase_api_mem_import(struct kbase_context *kctx,
|
||||
{
|
||||
int ret;
|
||||
u64 flags = import->in.flags;
|
||||
+ void __user *phandle;
|
||||
+
|
||||
+#ifdef CONFIG_COMPAT
|
||||
+ if (kbase_ctx_flag(kctx, KCTX_COMPAT))
|
||||
+ phandle = compat_ptr(import->in.phandle.compat_value);
|
||||
+ else
|
||||
+#endif
|
||||
+ phandle = import->in.phandle.value;
|
||||
|
||||
ret = kbase_mem_import(kctx,
|
||||
import->in.type,
|
||||
- import->in.phandle.value,
|
||||
+ phandle,
|
||||
import->in.padding,
|
||||
&import->out.gpu_va,
|
||||
&import->out.va_pages,
|
||||
@@ -1654,6 +1696,7 @@ static int kbase_api_get_profiling_controls(struct kbase_context *kctx,
|
||||
static int kbase_api_mem_profile_add(struct kbase_context *kctx,
|
||||
struct kbase_ioctl_mem_profile_add *data)
|
||||
{
|
||||
+ char __user *user_buf;
|
||||
char *buf;
|
||||
int err;
|
||||
|
||||
@@ -1666,7 +1709,14 @@ static int kbase_api_mem_profile_add(struct kbase_context *kctx,
|
||||
if (ZERO_OR_NULL_PTR(buf))
|
||||
return -ENOMEM;
|
||||
|
||||
- err = copy_from_user(buf, data->buffer.value, data->len);
|
||||
+#ifdef CONFIG_COMPAT
|
||||
+ if (kbase_ctx_flag(kctx, KCTX_COMPAT))
|
||||
+ user_buf = compat_ptr(data->buffer.compat_value);
|
||||
+ else
|
||||
+#endif
|
||||
+ user_buf = data->buffer.value;
|
||||
+
|
||||
+ err = copy_from_user(buf, user_buf, data->len);
|
||||
if (err) {
|
||||
kfree(buf);
|
||||
return err;
|
||||
|
||||
From 309a27eaf2f4e429ef102e3eef70a2f908360c44 Mon Sep 17 00:00:00 2001
|
||||
From: Nick <nick@khadas.com>
|
||||
Date: Wed, 19 Sep 2018 22:14:58 +0800
|
||||
Subject: [PATCH] bump PD voltage & current for board without charge IC
|
||||
|
||||
---
|
||||
drivers/mfd/fusb302.c | 28 ++++++++++++++++++++++++++--
|
||||
1 file changed, 26 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/drivers/mfd/fusb302.c b/drivers/mfd/fusb302.c
|
||||
index 240cecac65b5..8fe4163214e0 100644
|
||||
--- a/drivers/mfd/fusb302.c
|
||||
+++ b/drivers/mfd/fusb302.c
|
||||
@@ -217,8 +217,32 @@ static int fusb302_set_pos_power_by_charge_ic(struct fusb30x_chip *chip)
|
||||
max_vol = 0;
|
||||
max_cur = 0;
|
||||
psy = power_supply_get_by_phandle(chip->dev->of_node, "charge-dev");
|
||||
- if (!psy || IS_ERR(psy))
|
||||
- return -1;
|
||||
+ if (!psy || IS_ERR(psy)) {
|
||||
+ int ret;
|
||||
+ u32 value;
|
||||
+
|
||||
+ ret = of_property_read_u32(chip->dev->of_node, "max-input-voltage", &value);
|
||||
+ if (ret) {
|
||||
+ dev_err(chip->dev, "'max-input-voltage' not found!\n");
|
||||
+ return -1;
|
||||
+ }
|
||||
+
|
||||
+ max_vol = value / 1000;
|
||||
+
|
||||
+ ret = of_property_read_u32(chip->dev->of_node, "max-input-current", &value);
|
||||
+
|
||||
+ if (ret) {
|
||||
+ dev_err(chip->dev, "'max-input-current' not found!\n");
|
||||
+ return -1;
|
||||
+ }
|
||||
+
|
||||
+ max_cur = value / 1000;
|
||||
+
|
||||
+ if (max_vol > 0 && max_cur > 0)
|
||||
+ fusb_set_pos_power(chip, max_vol, max_cur);
|
||||
+
|
||||
+ return 0;
|
||||
+ }
|
||||
|
||||
psp = POWER_SUPPLY_PROP_CHARGE_CONTROL_LIMIT_MAX;
|
||||
if (power_supply_get_property(psy, psp, &val) == 0)
|
||||
0
patch/kernel/archive/station-5.17/00-v5-01-23-drm-encoder-Add-of_graph-port-to-struct-drm_encoder.patch
Executable file → Normal file
0
patch/kernel/archive/station-5.17/00-v5-01-23-drm-encoder-Add-of_graph-port-to-struct-drm_encoder.patch
Executable file → Normal file
0
patch/kernel/archive/station-5.17/00-v5-03-23-drm-rockchip-dw_hdmi-rename-vpll-clock-to-reference-clock.patch
Executable file → Normal file
0
patch/kernel/archive/station-5.17/00-v5-03-23-drm-rockchip-dw_hdmi-rename-vpll-clock-to-reference-clock.patch
Executable file → Normal file
0
patch/kernel/archive/station-5.17/00-v5-04-23-dt-bindings-display-rockchip-dw-hdmi-use-ref-as-clock-name.patch
Executable file → Normal file
0
patch/kernel/archive/station-5.17/00-v5-04-23-dt-bindings-display-rockchip-dw-hdmi-use-ref-as-clock-name.patch
Executable file → Normal file
0
patch/kernel/archive/station-5.17/00-v5-06-23-drm-rockchip-dw_hdmi-add-rk3568-support.patch
Executable file → Normal file
0
patch/kernel/archive/station-5.17/00-v5-06-23-drm-rockchip-dw_hdmi-add-rk3568-support.patch
Executable file → Normal file
0
patch/kernel/archive/station-5.17/00-v5-07-23-dt-bindings-display-rockchip-dw-hdmi-Add-compatible-for-rk3568-HDMI.patch
Executable file → Normal file
0
patch/kernel/archive/station-5.17/00-v5-07-23-dt-bindings-display-rockchip-dw-hdmi-Add-compatible-for-rk3568-HDMI.patch
Executable file → Normal file
0
patch/kernel/archive/station-5.17/00-v5-08-23-drm-rockchip-dw_hdmi-add-regulator-support.patch
Executable file → Normal file
0
patch/kernel/archive/station-5.17/00-v5-08-23-drm-rockchip-dw_hdmi-add-regulator-support.patch
Executable file → Normal file
0
patch/kernel/archive/station-5.17/00-v5-09-23-dt-bindings-display-rockchip-dw-hdmi-Add-regulator-support.patch
Executable file → Normal file
0
patch/kernel/archive/station-5.17/00-v5-09-23-dt-bindings-display-rockchip-dw-hdmi-Add-regulator-support.patch
Executable file → Normal file
0
patch/kernel/archive/station-5.17/00-v5-10-23-drm-rockchip-dw_hdmi-Add-support-for-hclk.patch
Executable file → Normal file
0
patch/kernel/archive/station-5.17/00-v5-10-23-drm-rockchip-dw_hdmi-Add-support-for-hclk.patch
Executable file → Normal file
0
patch/kernel/archive/station-5.17/00-v5-11-23-dt-bindings-display-rockchip-dw-hdmi-Add-additional-clock.patch
Executable file → Normal file
0
patch/kernel/archive/station-5.17/00-v5-11-23-dt-bindings-display-rockchip-dw-hdmi-Add-additional-clock.patch
Executable file → Normal file
0
patch/kernel/archive/station-5.17/00-v5-12-23-drm-rockchip-dw_hdmi-Use-auto-generated-tables.patch
Executable file → Normal file
0
patch/kernel/archive/station-5.17/00-v5-12-23-drm-rockchip-dw_hdmi-Use-auto-generated-tables.patch
Executable file → Normal file
0
patch/kernel/archive/station-5.17/00-v5-13-23-drm-rockchip-dw_hdmi-drop-mode_valid-hook.patch
Executable file → Normal file
0
patch/kernel/archive/station-5.17/00-v5-13-23-drm-rockchip-dw_hdmi-drop-mode_valid-hook.patch
Executable file → Normal file
0
patch/kernel/archive/station-5.17/00-v5-14-23-drm-rockchip-dw_hdmi-Set-cur_ctr-to-0-always.patch
Executable file → Normal file
0
patch/kernel/archive/station-5.17/00-v5-14-23-drm-rockchip-dw_hdmi-Set-cur_ctr-to-0-always.patch
Executable file → Normal file
0
patch/kernel/archive/station-5.17/00-v5-15-23-drm-rockchip-dw_hdmi-add-default-594Mhz-clk-for-4K-60hz.patch
Executable file → Normal file
0
patch/kernel/archive/station-5.17/00-v5-15-23-drm-rockchip-dw_hdmi-add-default-594Mhz-clk-for-4K-60hz.patch
Executable file → Normal file
0
patch/kernel/archive/station-5.17/00-v5-16-23-dt-bindings-display-rockchip-dw-hdmi-Make-unwedge-pinctrl-optional.patch
Executable file → Normal file
0
patch/kernel/archive/station-5.17/00-v5-16-23-dt-bindings-display-rockchip-dw-hdmi-Make-unwedge-pinctrl-optional.patch
Executable file → Normal file
0
patch/kernel/archive/station-5.17/00-v5-17-23-arm64-dts-rockchip-rk356x-Add-VOP2-nodes.patch
Executable file → Normal file
0
patch/kernel/archive/station-5.17/00-v5-17-23-arm64-dts-rockchip-rk356x-Add-VOP2-nodes.patch
Executable file → Normal file
0
patch/kernel/archive/station-5.17/00-v5-18-23-arm64-dts-rockchip-rk356x-Add-HDMI-nodes.patch
Executable file → Normal file
0
patch/kernel/archive/station-5.17/00-v5-18-23-arm64-dts-rockchip-rk356x-Add-HDMI-nodes.patch
Executable file → Normal file
0
patch/kernel/archive/station-5.17/00-v5-19-23-arm64-dts-rockchip-rk3568-evb-Enable-VOP2-and-hdmi.patch
Executable file → Normal file
0
patch/kernel/archive/station-5.17/00-v5-19-23-arm64-dts-rockchip-rk3568-evb-Enable-VOP2-and-hdmi.patch
Executable file → Normal file
0
patch/kernel/archive/station-5.17/00-v5-20-23-arm64-dts-rockchip-enable-vop2-and-hdmi-tx-on-quartz64a.patch
Executable file → Normal file
0
patch/kernel/archive/station-5.17/00-v5-20-23-arm64-dts-rockchip-enable-vop2-and-hdmi-tx-on-quartz64a.patch
Executable file → Normal file
0
patch/kernel/archive/station-5.17/00-v5-21-23-drm-rockchip-Make-VOP-driver-optional.patch
Executable file → Normal file
0
patch/kernel/archive/station-5.17/00-v5-21-23-drm-rockchip-Make-VOP-driver-optional.patch
Executable file → Normal file
0
patch/kernel/archive/station-5.17/00-v5-22-23-drm-rockchip-Add-VOP2-driver.patch
Executable file → Normal file
0
patch/kernel/archive/station-5.17/00-v5-22-23-drm-rockchip-Add-VOP2-driver.patch
Executable file → Normal file
0
patch/kernel/archive/station-5.17/00-v5-23-23-dt-bindings-display-rockchip-Add-binding-for-VOP2.patch
Executable file → Normal file
0
patch/kernel/archive/station-5.17/00-v5-23-23-dt-bindings-display-rockchip-Add-binding-for-VOP2.patch
Executable file → Normal file
0
patch/kernel/archive/station-5.17/00-v5-mfd-rk808-add-reboot-support-to-rk808.c.patch
Executable file → Normal file
0
patch/kernel/archive/station-5.17/00-v5-mfd-rk808-add-reboot-support-to-rk808.c.patch
Executable file → Normal file
0
patch/kernel/archive/station-5.17/00-v6-1-5-dt-bindings-gpu-mali-bifrost-describe-clocks-for-the-rk356x-gpu.patch
Executable file → Normal file
0
patch/kernel/archive/station-5.17/00-v6-1-5-dt-bindings-gpu-mali-bifrost-describe-clocks-for-the-rk356x-gpu.patch
Executable file → Normal file
0
patch/kernel/archive/station-5.17/00-v6-2-5-arm64-dts-rockchip-add-gpu-node-to-rk356x.patch
Executable file → Normal file
0
patch/kernel/archive/station-5.17/00-v6-2-5-arm64-dts-rockchip-add-gpu-node-to-rk356x.patch
Executable file → Normal file
0
patch/kernel/archive/station-5.17/00-v6-3-5-arm64-dts-rockchip-add-cooling-map-and-trip-points-for-gpu-to-rk356x.patch
Executable file → Normal file
0
patch/kernel/archive/station-5.17/00-v6-3-5-arm64-dts-rockchip-add-cooling-map-and-trip-points-for-gpu-to-rk356x.patch
Executable file → Normal file
0
patch/kernel/archive/station-5.17/00-v6-4-5-arm64-dts-rockchip-enable-the-gpu-on-quartz64-a.patch
Executable file → Normal file
0
patch/kernel/archive/station-5.17/00-v6-4-5-arm64-dts-rockchip-enable-the-gpu-on-quartz64-a.patch
Executable file → Normal file
0
patch/kernel/archive/station-5.17/00-v6-5-5-arm64-dts-rockchip-enable-the-gpu-on-rk3568-evb1-v10.patch
Executable file → Normal file
0
patch/kernel/archive/station-5.17/00-v6-5-5-arm64-dts-rockchip-enable-the-gpu-on-rk3568-evb1-v10.patch
Executable file → Normal file
0
patch/kernel/archive/station-5.17/02-v2-2-4-arm64-dts-rockchip-add-Quartz64-A-pmu_io_domains.patch
Executable file → Normal file
0
patch/kernel/archive/station-5.17/02-v2-2-4-arm64-dts-rockchip-add-Quartz64-A-pmu_io_domains.patch
Executable file → Normal file
0
patch/kernel/archive/station-5.17/03-v2-3-4-arm64-dts-rockchip-add-Quartz64-A-sdmmc1-node.patch
Executable file → Normal file
0
patch/kernel/archive/station-5.17/03-v2-3-4-arm64-dts-rockchip-add-Quartz64-A-sdmmc1-node.patch
Executable file → Normal file
0
patch/kernel/archive/station-5.17/03-v2-4-4-arm64-dts-rockchip-add-Quartz64-A-con40-hardware.patch
Executable file → Normal file
0
patch/kernel/archive/station-5.17/03-v2-4-4-arm64-dts-rockchip-add-Quartz64-A-con40-hardware.patch
Executable file → Normal file
Loading…
Reference in New Issue
Block a user