mirror of
https://github.com/armbian/build
synced 2025-09-24 19:47:06 +07:00
File diff suppressed because it is too large
Load Diff
@@ -24,7 +24,7 @@ GOVERNOR=${GOVERNOR:-ondemand}
|
||||
case $BRANCH in
|
||||
|
||||
current)
|
||||
KERNELBRANCH='branch:linux-6.0.y'
|
||||
KERNELBRANCH='branch:linux-6.1.y'
|
||||
KERNELPATCHDIR='meson64-current'
|
||||
;;
|
||||
|
||||
|
||||
@@ -1,576 +0,0 @@
|
||||
From 9c2db9e795f4d73e78a02f6c8cb313e6bcf34f7e Mon Sep 17 00:00:00 2001
|
||||
From: Christian Hewitt <christianshewitt@gmail.com>
|
||||
Date: Wed, 16 Feb 2022 07:27:07 +0000
|
||||
Subject: [PATCH 69/90] WIP: dt-bindings: arm: amlogic: add support for Radxa
|
||||
Zero2
|
||||
|
||||
The Radxa Zero2 is a small form-factor SBC using the Amlogic
|
||||
A311D chip.
|
||||
|
||||
Signed-off-by: Christian Hewitt <christianshewitt@gmail.com>
|
||||
---
|
||||
Documentation/devicetree/bindings/arm/amlogic.yaml | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/Documentation/devicetree/bindings/arm/amlogic.yaml b/Documentation/devicetree/bindings/arm/amlogic.yaml
|
||||
index 05365bb50b29..d069aecabeb3 100644
|
||||
--- a/Documentation/devicetree/bindings/arm/amlogic.yaml
|
||||
+++ b/Documentation/devicetree/bindings/arm/amlogic.yaml
|
||||
@@ -152,6 +152,7 @@ properties:
|
||||
items:
|
||||
- enum:
|
||||
- khadas,vim3
|
||||
+ - radxa,zero2
|
||||
- const: amlogic,a311d
|
||||
- const: amlogic,g12b
|
||||
|
||||
--
|
||||
2.35.1
|
||||
|
||||
From aadb6d12609309106f6ab7a56face84c19859796 Mon Sep 17 00:00:00 2001
|
||||
From: Yuntian Zhang <yt@radxa.com>
|
||||
Date: Fri, 14 Jan 2022 15:50:02 +0000
|
||||
Subject: [PATCH 70/90] WIP: arm64: dts: meson: add support for Radxa Zero2
|
||||
|
||||
Radxa Zero2 is a small form factor SBC based on the Amlogic A311D
|
||||
chipset that ships in a number of eMMC configurations:
|
||||
|
||||
- Amlogic A311D (Quad A73 + Dual A53) CPU
|
||||
- 4GB LPDDR4 RAM
|
||||
- 32/64/128GB eMMC
|
||||
- Mali G52-MP4 GPU
|
||||
- HDMI 2.1 output (micro)
|
||||
- BCM4345 WiFi (2.4/5GHz a/b/g/n/ac) and BT 5.0
|
||||
- 1x USB 2.0 port - Type C (OTG)
|
||||
- 1x USB 3.0 port - Type C (Host)
|
||||
- 1x micro SD Card slot
|
||||
- 40 Pin GPIO header
|
||||
|
||||
Signed-off-by: Yuntian Zhang <yt@radxa.com>
|
||||
Signed-off-by: Christian Hewitt <christianshewitt@gmail.com>
|
||||
---
|
||||
arch/arm64/boot/dts/amlogic/Makefile | 1 +
|
||||
.../dts/amlogic/meson-g12b-radxa-zero2.dts | 499 ++++++++++++++++++
|
||||
2 files changed, 500 insertions(+)
|
||||
create mode 100644 arch/arm64/boot/dts/amlogic/meson-g12b-radxa-zero2.dts
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/amlogic/Makefile b/arch/arm64/boot/dts/amlogic/Makefile
|
||||
index 8773211df50e..f231280cd808 100644
|
||||
--- a/arch/arm64/boot/dts/amlogic/Makefile
|
||||
+++ b/arch/arm64/boot/dts/amlogic/Makefile
|
||||
@@ -12,6 +12,7 @@ dtb-$(CONFIG_ARCH_MESON) += meson-g12b-gtking-pro.dtb
|
||||
dtb-$(CONFIG_ARCH_MESON) += meson-g12b-gtking.dtb
|
||||
dtb-$(CONFIG_ARCH_MESON) += meson-g12b-odroid-n2-plus.dtb
|
||||
dtb-$(CONFIG_ARCH_MESON) += meson-g12b-odroid-n2.dtb
|
||||
+dtb-$(CONFIG_ARCH_MESON) += meson-g12b-radxa-zero2.dtb
|
||||
dtb-$(CONFIG_ARCH_MESON) += meson-g12b-s922x-khadas-vim3.dtb
|
||||
dtb-$(CONFIG_ARCH_MESON) += meson-g12b-ugoos-am6.dtb
|
||||
dtb-$(CONFIG_ARCH_MESON) += meson-gxbb-kii-pro.dtb
|
||||
diff --git a/arch/arm64/boot/dts/amlogic/meson-g12b-radxa-zero2.dts b/arch/arm64/boot/dts/amlogic/meson-g12b-radxa-zero2.dts
|
||||
new file mode 100644
|
||||
index 000000000000..fefa6f2b7abf
|
||||
--- /dev/null
|
||||
+++ b/arch/arm64/boot/dts/amlogic/meson-g12b-radxa-zero2.dts
|
||||
@@ -0,0 +1,499 @@
|
||||
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
||||
+/*
|
||||
+ * Copyright (c) 2019 BayLibre, SAS
|
||||
+ * Author: Neil Armstrong <narmstrong@baylibre.com>
|
||||
+ * Copyright (c) 2019 Christian Hewitt <christianshewitt@gmail.com>
|
||||
+ * Copyright (c) 2022 Radxa Limited
|
||||
+ * Author: Yuntian Zhang <yt@radxa.com>
|
||||
+ */
|
||||
+
|
||||
+/dts-v1/;
|
||||
+
|
||||
+#include "meson-g12b-a311d.dtsi"
|
||||
+#include <dt-bindings/input/input.h>
|
||||
+#include <dt-bindings/leds/common.h>
|
||||
+#include <dt-bindings/gpio/meson-g12a-gpio.h>
|
||||
+#include <dt-bindings/sound/meson-g12a-tohdmitx.h>
|
||||
+
|
||||
+/ {
|
||||
+ compatible = "radxa,zero2", "amlogic,a311d", "amlogic,g12b";
|
||||
+ model = "Radxa Zero2";
|
||||
+
|
||||
+ aliases {
|
||||
+ serial0 = &uart_AO;
|
||||
+ serial2 = &uart_A;
|
||||
+ };
|
||||
+
|
||||
+ chosen {
|
||||
+ stdout-path = "serial0:115200n8";
|
||||
+ };
|
||||
+
|
||||
+ memory@0 {
|
||||
+ device_type = "memory";
|
||||
+ reg = <0x0 0x0 0x0 0x80000000>;
|
||||
+ };
|
||||
+
|
||||
+ gpio-keys-polled {
|
||||
+ compatible = "gpio-keys-polled";
|
||||
+ poll-interval = <100>;
|
||||
+ power-button {
|
||||
+ label = "power";
|
||||
+ linux,code = <KEY_POWER>;
|
||||
+ gpios = <&gpio_ao GPIOAO_3 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>;
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ leds {
|
||||
+ compatible = "gpio-leds";
|
||||
+
|
||||
+ led-green {
|
||||
+ color = <LED_COLOR_ID_GREEN>;
|
||||
+ function = LED_FUNCTION_STATUS;
|
||||
+ gpios = <&gpio GPIOA_12 GPIO_ACTIVE_HIGH>;
|
||||
+ linux,default-trigger = "heartbeat";
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ cvbs-connector {
|
||||
+ status = "disabled";
|
||||
+ compatible = "composite-video-connector";
|
||||
+
|
||||
+ port {
|
||||
+ cvbs_connector_in: endpoint {
|
||||
+ remote-endpoint = <&cvbs_vdac_out>;
|
||||
+ };
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ hdmi-connector {
|
||||
+ compatible = "hdmi-connector";
|
||||
+ type = "a";
|
||||
+
|
||||
+ port {
|
||||
+ hdmi_connector_in: endpoint {
|
||||
+ remote-endpoint = <&hdmi_tx_tmds_out>;
|
||||
+ };
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ emmc_pwrseq: emmc-pwrseq {
|
||||
+ compatible = "mmc-pwrseq-emmc";
|
||||
+ reset-gpios = <&gpio BOOT_12 GPIO_ACTIVE_LOW>;
|
||||
+ };
|
||||
+
|
||||
+ sdio_pwrseq: sdio-pwrseq {
|
||||
+ compatible = "mmc-pwrseq-simple";
|
||||
+ reset-gpios = <&gpio GPIOX_6 GPIO_ACTIVE_LOW>;
|
||||
+ clocks = <&wifi32k>;
|
||||
+ clock-names = "ext_clock";
|
||||
+ };
|
||||
+
|
||||
+ ao_5v: regulator-ao_5v {
|
||||
+ compatible = "regulator-fixed";
|
||||
+ regulator-name = "AO_5V";
|
||||
+ regulator-min-microvolt = <5000000>;
|
||||
+ regulator-max-microvolt = <5000000>;
|
||||
+ regulator-always-on;
|
||||
+ };
|
||||
+
|
||||
+ vcc_1v8: regulator-vcc_1v8 {
|
||||
+ compatible = "regulator-fixed";
|
||||
+ regulator-name = "VCC_1V8";
|
||||
+ regulator-min-microvolt = <1800000>;
|
||||
+ regulator-max-microvolt = <1800000>;
|
||||
+ vin-supply = <&vcc_3v3>;
|
||||
+ regulator-always-on;
|
||||
+ };
|
||||
+
|
||||
+ vcc_3v3: regulator-vcc_3v3 {
|
||||
+ compatible = "regulator-fixed";
|
||||
+ regulator-name = "VCC_3V3";
|
||||
+ regulator-min-microvolt = <3300000>;
|
||||
+ regulator-max-microvolt = <3300000>;
|
||||
+ vin-supply = <&vddao_3v3>;
|
||||
+ regulator-always-on;
|
||||
+ /* FIXME: actually controlled by VDDCPU_B_EN */
|
||||
+ };
|
||||
+
|
||||
+ vddao_1v8: regulator-vddao_1v8 {
|
||||
+ compatible = "regulator-fixed";
|
||||
+ regulator-name = "VDDIO_AO1V8";
|
||||
+ regulator-min-microvolt = <1800000>;
|
||||
+ regulator-max-microvolt = <1800000>;
|
||||
+ vin-supply = <&vddao_3v3>;
|
||||
+ regulator-always-on;
|
||||
+ };
|
||||
+
|
||||
+ vddao_3v3: regulator-vddao_3v3 {
|
||||
+ compatible = "regulator-fixed";
|
||||
+ regulator-name = "VDDAO_3V3";
|
||||
+ regulator-min-microvolt = <3300000>;
|
||||
+ regulator-max-microvolt = <3300000>;
|
||||
+ vin-supply = <&ao_5v>;
|
||||
+ regulator-always-on;
|
||||
+ };
|
||||
+
|
||||
+ vddcpu_a: regulator-vddcpu-a {
|
||||
+ /*
|
||||
+ * MP8756GD Regulator.
|
||||
+ */
|
||||
+ compatible = "pwm-regulator";
|
||||
+
|
||||
+ regulator-name = "VDDCPU_A";
|
||||
+ regulator-min-microvolt = <730000>;
|
||||
+ regulator-max-microvolt = <1022000>;
|
||||
+
|
||||
+ pwm-supply = <&ao_5v>;
|
||||
+
|
||||
+ pwms = <&pwm_ab 0 1250 0>;
|
||||
+ pwm-dutycycle-range = <100 0>;
|
||||
+
|
||||
+ regulator-boot-on;
|
||||
+ regulator-always-on;
|
||||
+ };
|
||||
+
|
||||
+ vddcpu_b: regulator-vddcpu-b {
|
||||
+ /*
|
||||
+ * Silergy SY8120B1ABC Regulator.
|
||||
+ */
|
||||
+ compatible = "pwm-regulator";
|
||||
+
|
||||
+ regulator-name = "VDDCPU_B";
|
||||
+ regulator-min-microvolt = <730000>;
|
||||
+ regulator-max-microvolt = <1022000>;
|
||||
+
|
||||
+ pwm-supply = <&ao_5v>;
|
||||
+
|
||||
+ pwms = <&pwm_AO_cd 1 1250 0>;
|
||||
+ pwm-dutycycle-range = <100 0>;
|
||||
+
|
||||
+ regulator-boot-on;
|
||||
+ regulator-always-on;
|
||||
+ };
|
||||
+
|
||||
+ sound {
|
||||
+ compatible = "amlogic,axg-sound-card";
|
||||
+ model = "RADXA-ZERO2";
|
||||
+ audio-aux-devs = <&tdmout_b>;
|
||||
+ audio-routing = "TDMOUT_B IN 0", "FRDDR_A OUT 1",
|
||||
+ "TDMOUT_B IN 1", "FRDDR_B OUT 1",
|
||||
+ "TDMOUT_B IN 2", "FRDDR_C OUT 1",
|
||||
+ "TDM_B Playback", "TDMOUT_B OUT";
|
||||
+
|
||||
+ assigned-clocks = <&clkc CLKID_MPLL2>,
|
||||
+ <&clkc CLKID_MPLL0>,
|
||||
+ <&clkc CLKID_MPLL1>;
|
||||
+ assigned-clock-parents = <0>, <0>, <0>;
|
||||
+ assigned-clock-rates = <294912000>,
|
||||
+ <270950400>,
|
||||
+ <393216000>;
|
||||
+ status = "okay";
|
||||
+
|
||||
+ dai-link-0 {
|
||||
+ sound-dai = <&frddr_a>;
|
||||
+ };
|
||||
+
|
||||
+ dai-link-1 {
|
||||
+ sound-dai = <&frddr_b>;
|
||||
+ };
|
||||
+
|
||||
+ dai-link-2 {
|
||||
+ sound-dai = <&frddr_c>;
|
||||
+ };
|
||||
+
|
||||
+ /* 8ch hdmi interface */
|
||||
+ dai-link-3 {
|
||||
+ sound-dai = <&tdmif_b>;
|
||||
+ dai-format = "i2s";
|
||||
+ dai-tdm-slot-tx-mask-0 = <1 1>;
|
||||
+ dai-tdm-slot-tx-mask-1 = <1 1>;
|
||||
+ dai-tdm-slot-tx-mask-2 = <1 1>;
|
||||
+ dai-tdm-slot-tx-mask-3 = <1 1>;
|
||||
+ mclk-fs = <256>;
|
||||
+
|
||||
+ codec {
|
||||
+ sound-dai = <&tohdmitx TOHDMITX_I2S_IN_B>;
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ /* hdmi glue */
|
||||
+ dai-link-4 {
|
||||
+ sound-dai = <&tohdmitx TOHDMITX_I2S_OUT>;
|
||||
+
|
||||
+ codec {
|
||||
+ sound-dai = <&hdmi_tx>;
|
||||
+ };
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ wifi32k: wifi32k {
|
||||
+ compatible = "pwm-clock";
|
||||
+ #clock-cells = <0>;
|
||||
+ clock-frequency = <32768>;
|
||||
+ pwms = <&pwm_ef 0 30518 0>; /* PWM_E at 32.768KHz */
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&arb {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&cec_AO {
|
||||
+ pinctrl-0 = <&cec_ao_a_h_pins>;
|
||||
+ pinctrl-names = "default";
|
||||
+ status = "disabled";
|
||||
+ hdmi-phandle = <&hdmi_tx>;
|
||||
+};
|
||||
+
|
||||
+&cecb_AO {
|
||||
+ pinctrl-0 = <&cec_ao_b_h_pins>;
|
||||
+ pinctrl-names = "default";
|
||||
+ status = "okay";
|
||||
+ hdmi-phandle = <&hdmi_tx>;
|
||||
+};
|
||||
+
|
||||
+&clkc_audio {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&cpu0 {
|
||||
+ cpu-supply = <&vddcpu_b>;
|
||||
+ operating-points-v2 = <&cpu_opp_table_0>;
|
||||
+ clocks = <&clkc CLKID_CPU_CLK>;
|
||||
+ clock-latency = <50000>;
|
||||
+};
|
||||
+
|
||||
+&cpu1 {
|
||||
+ cpu-supply = <&vddcpu_b>;
|
||||
+ operating-points-v2 = <&cpu_opp_table_0>;
|
||||
+ clocks = <&clkc CLKID_CPU_CLK>;
|
||||
+ clock-latency = <50000>;
|
||||
+};
|
||||
+
|
||||
+&cpu100 {
|
||||
+ cpu-supply = <&vddcpu_a>;
|
||||
+ operating-points-v2 = <&cpub_opp_table_1>;
|
||||
+ clocks = <&clkc CLKID_CPUB_CLK>;
|
||||
+ clock-latency = <50000>;
|
||||
+};
|
||||
+
|
||||
+&cpu101 {
|
||||
+ cpu-supply = <&vddcpu_a>;
|
||||
+ operating-points-v2 = <&cpub_opp_table_1>;
|
||||
+ clocks = <&clkc CLKID_CPUB_CLK>;
|
||||
+ clock-latency = <50000>;
|
||||
+};
|
||||
+
|
||||
+&cpu102 {
|
||||
+ cpu-supply = <&vddcpu_a>;
|
||||
+ operating-points-v2 = <&cpub_opp_table_1>;
|
||||
+ clocks = <&clkc CLKID_CPUB_CLK>;
|
||||
+ clock-latency = <50000>;
|
||||
+};
|
||||
+
|
||||
+&cpu103 {
|
||||
+ cpu-supply = <&vddcpu_a>;
|
||||
+ operating-points-v2 = <&cpub_opp_table_1>;
|
||||
+ clocks = <&clkc CLKID_CPUB_CLK>;
|
||||
+ clock-latency = <50000>;
|
||||
+};
|
||||
+
|
||||
+&cvbs_vdac_port {
|
||||
+ cvbs_vdac_out: endpoint {
|
||||
+ remote-endpoint = <&cvbs_connector_in>;
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&frddr_a {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&frddr_b {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&frddr_c {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&gpio {
|
||||
+ gpio-line-names =
|
||||
+ /* GPIOZ */
|
||||
+ "PIN_27", "PIN_28", "PIN_7", "PIN_11", "PIN_13", "PIN_15", "PIN_18", "PIN_40",
|
||||
+ "", "", "", "", "", "", "", "",
|
||||
+ /* GPIOH */
|
||||
+ "", "", "", "", "PIN_19", "PIN_21", "PIN_24", "PIN_23",
|
||||
+ "",
|
||||
+ /* BOOT */
|
||||
+ "", "", "", "", "", "", "", "",
|
||||
+ "", "", "", "", "EMMC_PWRSEQ", "", "", "",
|
||||
+ /* GPIOC */
|
||||
+ "", "", "", "", "", "", "SD_CD", "PIN_36",
|
||||
+ /* GPIOA */
|
||||
+ "PIN_32", "PIN_12", "PIN_35", "", "", "PIN_38", "", "",
|
||||
+ "", "", "", "", "LED_GREEN", "PIN_31", "PIN_3", "PIN_5",
|
||||
+ /* GPIOX */
|
||||
+ "", "", "", "", "", "", "SDIO_PWRSEQ", "",
|
||||
+ "", "", "", "", "", "", "", "",
|
||||
+ "", "BT_SHUTDOWN", "", "";
|
||||
+};
|
||||
+
|
||||
+&gpio_ao {
|
||||
+ gpio-line-names =
|
||||
+ /* GPIOAO */
|
||||
+ "PIN_8", "PIN_10", "", "BTN_POWER", "", "", "", "PIN_29",
|
||||
+ "PIN_33", "PIN_37", "FAN", "",
|
||||
+ /* GPIOE */
|
||||
+ "", "", "";
|
||||
+};
|
||||
+
|
||||
+&hdmi_tx {
|
||||
+ status = "okay";
|
||||
+ pinctrl-0 = <&hdmitx_hpd_pins>, <&hdmitx_ddc_pins>;
|
||||
+ pinctrl-names = "default";
|
||||
+ hdmi-supply = <&ao_5v>;
|
||||
+};
|
||||
+
|
||||
+&hdmi_tx_tmds_port {
|
||||
+ hdmi_tx_tmds_out: endpoint {
|
||||
+ remote-endpoint = <&hdmi_connector_in>;
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&ir {
|
||||
+ status = "disabled";
|
||||
+ pinctrl-0 = <&remote_input_ao_pins>;
|
||||
+ pinctrl-names = "default";
|
||||
+};
|
||||
+
|
||||
+&pwm_ab {
|
||||
+ pinctrl-0 = <&pwm_a_e_pins>;
|
||||
+ pinctrl-names = "default";
|
||||
+ clocks = <&xtal>;
|
||||
+ clock-names = "clkin0";
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&pwm_ef {
|
||||
+ pinctrl-0 = <&pwm_e_pins>;
|
||||
+ pinctrl-names = "default";
|
||||
+ clocks = <&xtal>;
|
||||
+ clock-names = "clkin2";
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&pwm_AO_cd {
|
||||
+ pinctrl-0 = <&pwm_ao_d_e_pins>;
|
||||
+ pinctrl-names = "default";
|
||||
+ clocks = <&xtal>;
|
||||
+ clock-names = "clkin4";
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&saradc {
|
||||
+ status = "okay";
|
||||
+ vref-supply = <&vddao_1v8>;
|
||||
+};
|
||||
+
|
||||
+/* SDIO */
|
||||
+&sd_emmc_a {
|
||||
+ status = "okay";
|
||||
+ pinctrl-0 = <&sdio_pins>;
|
||||
+ pinctrl-1 = <&sdio_clk_gate_pins>;
|
||||
+ pinctrl-names = "default", "clk-gate";
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+
|
||||
+ bus-width = <4>;
|
||||
+ cap-sd-highspeed;
|
||||
+ max-frequency = <100000000>;
|
||||
+
|
||||
+ non-removable;
|
||||
+ disable-wp;
|
||||
+
|
||||
+ /* WiFi firmware requires power to be kept while in suspend */
|
||||
+ keep-power-in-suspend;
|
||||
+
|
||||
+ mmc-pwrseq = <&sdio_pwrseq>;
|
||||
+
|
||||
+ vmmc-supply = <&vddao_3v3>;
|
||||
+ vqmmc-supply = <&vddao_1v8>;
|
||||
+
|
||||
+ brcmf: wifi@1 {
|
||||
+ reg = <1>;
|
||||
+ compatible = "brcm,bcm4329-fmac";
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+/* SD card */
|
||||
+&sd_emmc_b {
|
||||
+ status = "okay";
|
||||
+ pinctrl-0 = <&sdcard_c_pins>;
|
||||
+ pinctrl-1 = <&sdcard_clk_gate_c_pins>;
|
||||
+ pinctrl-names = "default", "clk-gate";
|
||||
+
|
||||
+ bus-width = <4>;
|
||||
+ cap-sd-highspeed;
|
||||
+ max-frequency = <50000000>;
|
||||
+ disable-wp;
|
||||
+
|
||||
+ cd-gpios = <&gpio GPIOC_6 GPIO_ACTIVE_LOW>;
|
||||
+ vmmc-supply = <&vddao_3v3>;
|
||||
+ vqmmc-supply = <&vddao_3v3>;
|
||||
+};
|
||||
+
|
||||
+/* eMMC */
|
||||
+&sd_emmc_c {
|
||||
+ status = "okay";
|
||||
+ pinctrl-0 = <&emmc_ctrl_pins>, <&emmc_data_8b_pins>, <&emmc_ds_pins>;
|
||||
+ pinctrl-1 = <&emmc_clk_gate_pins>;
|
||||
+ pinctrl-names = "default", "clk-gate";
|
||||
+
|
||||
+ bus-width = <8>;
|
||||
+ cap-mmc-highspeed;
|
||||
+ mmc-ddr-1_8v;
|
||||
+ mmc-hs200-1_8v;
|
||||
+ max-frequency = <200000000>;
|
||||
+ disable-wp;
|
||||
+
|
||||
+ mmc-pwrseq = <&emmc_pwrseq>;
|
||||
+ vmmc-supply = <&vcc_3v3>;
|
||||
+ vqmmc-supply = <&vcc_1v8>;
|
||||
+};
|
||||
+
|
||||
+&tdmif_b {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&tdmout_b {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&tohdmitx {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&uart_A {
|
||||
+ status = "okay";
|
||||
+ pinctrl-0 = <&uart_a_pins>, <&uart_a_cts_rts_pins>;
|
||||
+ pinctrl-names = "default";
|
||||
+ uart-has-rtscts;
|
||||
+
|
||||
+ bluetooth {
|
||||
+ compatible = "brcm,bcm43438-bt";
|
||||
+ shutdown-gpios = <&gpio GPIOX_17 GPIO_ACTIVE_HIGH>;
|
||||
+ max-speed = <2000000>;
|
||||
+ clocks = <&wifi32k>;
|
||||
+ clock-names = "lpo";
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&uart_AO {
|
||||
+ status = "okay";
|
||||
+ pinctrl-0 = <&uart_ao_a_pins>;
|
||||
+ pinctrl-names = "default";
|
||||
+};
|
||||
+
|
||||
+&usb {
|
||||
+ status = "okay";
|
||||
+};
|
||||
--
|
||||
2.35.1
|
||||
|
||||
@@ -1,39 +0,0 @@
|
||||
From 4f925789d0713c48deb5067187c7e5acba397054 Mon Sep 17 00:00:00 2001
|
||||
From: David Heidelberg <david@ixit.cz>
|
||||
Date: Sat, 27 Nov 2021 07:23:35 +0000
|
||||
Subject: [PATCH 28/90] FROMLIST(v1): arm64: dts: meson: make dts use gpio-fan
|
||||
matrix instead of array
|
||||
|
||||
No functional changes.
|
||||
|
||||
Adjust to comply with dt-schema requirements
|
||||
and make possible to validate values.
|
||||
|
||||
Signed-off-by: David Heidelberg <david@ixit.cz>
|
||||
---
|
||||
arch/arm64/boot/dts/amlogic/meson-gxm-khadas-vim2.dts | 9 +++++----
|
||||
1 file changed, 5 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/amlogic/meson-gxm-khadas-vim2.dts b/arch/arm64/boot/dts/amlogic/meson-gxm-khadas-vim2.dts
|
||||
index 9c26d7489d2a..c5e3b5587135 100644
|
||||
--- a/arch/arm64/boot/dts/amlogic/meson-gxm-khadas-vim2.dts
|
||||
+++ b/arch/arm64/boot/dts/amlogic/meson-gxm-khadas-vim2.dts
|
||||
@@ -54,10 +54,11 @@ gpio_fan: gpio-fan {
|
||||
gpios = <&gpio GPIODV_14 GPIO_ACTIVE_HIGH
|
||||
&gpio GPIODV_15 GPIO_ACTIVE_HIGH>;
|
||||
/* Dummy RPM values since fan is optional */
|
||||
- gpio-fan,speed-map = <0 0
|
||||
- 1 1
|
||||
- 2 2
|
||||
- 3 3>;
|
||||
+ gpio-fan,speed-map =
|
||||
+ <0 0>,
|
||||
+ <1 1>,
|
||||
+ <2 2>,
|
||||
+ <3 3>;
|
||||
#cooling-cells = <2>;
|
||||
};
|
||||
|
||||
--
|
||||
2.35.1
|
||||
|
||||
@@ -1,38 +0,0 @@
|
||||
From 04ba78002ded0f9089b7fae6550a56ccd0669e65 Mon Sep 17 00:00:00 2001
|
||||
From: Christian Hewitt <christianshewitt@gmail.com>
|
||||
Date: Fri, 21 Feb 2020 04:43:22 +0000
|
||||
Subject: [PATCH 086/101] WIP: arm64: dts: meson: khadas-vim3: fix missing i2c3
|
||||
node
|
||||
|
||||
Fixes: c6d29c66e582 ("arm64: dts: meson-g12b-khadas-vim3: add initial device-tree")
|
||||
|
||||
The i2c3 node was missed in the original device-tree and is required for the
|
||||
optional Khadas 3705 fan to work.
|
||||
|
||||
Suggested-by: Art Nikpal <email2tema@gmail.com>
|
||||
Signed-off-by: Christian Hewittt <christianshewitt@gmail.com>
|
||||
---
|
||||
arch/arm64/boot/dts/amlogic/meson-khadas-vim3.dtsi | 7 +++++++
|
||||
1 file changed, 7 insertions(+)
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/amlogic/meson-khadas-vim3.dtsi b/arch/arm64/boot/dts/amlogic/meson-khadas-vim3.dtsi
|
||||
index 0ef60c7151cb..6022805d2032 100644
|
||||
--- a/arch/arm64/boot/dts/amlogic/meson-khadas-vim3.dtsi
|
||||
+++ b/arch/arm64/boot/dts/amlogic/meson-khadas-vim3.dtsi
|
||||
@@ -217,6 +217,13 @@
|
||||
};
|
||||
};
|
||||
|
||||
+&i2c3 {
|
||||
+ clock-frequency = <100000>;
|
||||
+ pinctrl-0 = <&i2c3_sda_a_pins>, <&i2c3_sck_a_pins>;
|
||||
+ pinctrl-names = "default";
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
&i2c_AO {
|
||||
status = "okay";
|
||||
pinctrl-0 = <&i2c_ao_sck_pins>, <&i2c_ao_sda_pins>;
|
||||
--
|
||||
2.17.1
|
||||
|
||||
@@ -1,60 +0,0 @@
|
||||
From 5ff8dfecb282089107d1bd3da6b612c5294fe0cb Mon Sep 17 00:00:00 2001
|
||||
From: Christian Hewitt <christianshewitt@gmail.com>
|
||||
Date: Thu, 21 Jan 2021 01:35:36 +0000
|
||||
Subject: [PATCH 07/90] HACK: arm64: dts: meson: add rtc/vrtc aliases to Khadas
|
||||
VIM
|
||||
|
||||
Add aliases to ensure the vrtc time (which normally proves first) is /dev/rtc1
|
||||
while the onboard rtc chip claims /dev/rtc0.
|
||||
|
||||
Signed-off-by: Christian Hewitt <christianshewitt@gmail.com>
|
||||
---
|
||||
arch/arm64/boot/dts/amlogic/meson-gxl-s905x-khadas-vim.dts | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-khadas-vim.dts b/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-khadas-vim.dts
|
||||
index 6ab1cc125b96..24af15e18026 100644
|
||||
--- a/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-khadas-vim.dts
|
||||
+++ b/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-khadas-vim.dts
|
||||
@@ -29,6 +29,8 @@ button-function {
|
||||
aliases {
|
||||
serial2 = &uart_AO_B;
|
||||
ethernet0 = ðmac;
|
||||
+ rtc0 = &rtc;
|
||||
+ rtc1 = &vrtc;
|
||||
};
|
||||
|
||||
gpio-keys-polled {
|
||||
--
|
||||
2.35.1
|
||||
|
||||
From 293a4281d04100f1a0ab8ced46a45fc557f6e130 Mon Sep 17 00:00:00 2001
|
||||
From: Christian Hewitt <christianshewitt@gmail.com>
|
||||
Date: Sat, 6 Nov 2021 13:01:08 +0000
|
||||
Subject: [PATCH 08/90] HACK: arm64: dts: meson: add rtc/vrtc aliases to Khadas
|
||||
VIM2
|
||||
|
||||
Add aliases to ensure the vrtc time (which normally proves first) is /dev/rtc1
|
||||
while the onboard rtc chip claims /dev/rtc0.
|
||||
|
||||
Signed-off-by: Christian Hewitt <christianshewitt@gmail.com>
|
||||
---
|
||||
arch/arm64/boot/dts/amlogic/meson-gxm-khadas-vim2.dts | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/amlogic/meson-gxm-khadas-vim2.dts b/arch/arm64/boot/dts/amlogic/meson-gxm-khadas-vim2.dts
|
||||
index 86bdc0baf032..9c26d7489d2a 100644
|
||||
--- a/arch/arm64/boot/dts/amlogic/meson-gxm-khadas-vim2.dts
|
||||
+++ b/arch/arm64/boot/dts/amlogic/meson-gxm-khadas-vim2.dts
|
||||
@@ -18,6 +18,8 @@ / {
|
||||
aliases {
|
||||
serial0 = &uart_AO;
|
||||
serial2 = &uart_AO_B;
|
||||
+ rtc0 = &rtc;
|
||||
+ rtc1 = &vrtc;
|
||||
};
|
||||
|
||||
chosen {
|
||||
--
|
||||
2.35.1
|
||||
|
||||
@@ -1,12 +0,0 @@
|
||||
diff --git a/arch/arm64/boot/dts/amlogic/meson-gxbb-nanopi-k2.dts b/arch/arm64/boot/dts/amlogic/meson-gxbb-nanopi-k2.dts
|
||||
index cbe99bd..80c87e0 100644
|
||||
--- a/arch/arm64/boot/dts/amlogic/meson-gxbb-nanopi-k2.dts
|
||||
+++ b/arch/arm64/boot/dts/amlogic/meson-gxbb-nanopi-k2.dts
|
||||
@@ -13,6 +13,7 @@
|
||||
|
||||
aliases {
|
||||
serial0 = &uart_AO;
|
||||
+ serial2 = &uart_C;
|
||||
ethernet0 = ðmac;
|
||||
};
|
||||
|
||||
@@ -1,22 +0,0 @@
|
||||
diff --git a/arch/arm64/boot/dts/amlogic/meson-gxbb-nanopi-k2.dts b/arch/arm64/boot/dts/amlogic/meson-gxbb-nanopi-k2.dts
|
||||
index 80c87e0bb..340559727 100644
|
||||
--- a/arch/arm64/boot/dts/amlogic/meson-gxbb-nanopi-k2.dts
|
||||
+++ b/arch/arm64/boot/dts/amlogic/meson-gxbb-nanopi-k2.dts
|
||||
@@ -382,7 +382,7 @@
|
||||
|
||||
/* eMMC */
|
||||
&sd_emmc_c {
|
||||
- status = "disabled";
|
||||
+ status = "okay";
|
||||
pinctrl-0 = <&emmc_pins>, <&emmc_ds_pins>;
|
||||
pinctrl-1 = <&emmc_clk_gate_pins>;
|
||||
pinctrl-names = "default", "clk-gate";
|
||||
@@ -392,8 +392,6 @@
|
||||
non-removable;
|
||||
disable-wp;
|
||||
cap-mmc-highspeed;
|
||||
- mmc-ddr-1_8v;
|
||||
- mmc-hs200-1_8v;
|
||||
|
||||
mmc-pwrseq = <&emmc_pwrseq>;
|
||||
vmmc-supply = <&vcc3v3>;
|
||||
@@ -1,32 +0,0 @@
|
||||
diff --git a/arch/arm64/boot/dts/amlogic/meson-gxbb-odroidc2.dts b/arch/arm64/boot/dts/amlogic/meson-gxbb-odroidc2.dts
|
||||
index 201596247fd9..b2cb12fb46fd 100644
|
||||
--- a/arch/arm64/boot/dts/amlogic/meson-gxbb-odroidc2.dts
|
||||
+++ b/arch/arm64/boot/dts/amlogic/meson-gxbb-odroidc2.dts
|
||||
@@ -17,6 +17,8 @@ / {
|
||||
|
||||
aliases {
|
||||
serial0 = &uart_AO;
|
||||
+ serial1 = &uart_A;
|
||||
+ serial2 = &uart_C;
|
||||
ethernet0 = ðmac;
|
||||
};
|
||||
|
||||
@@ -399,6 +401,18 @@ &uart_AO {
|
||||
pinctrl-names = "default";
|
||||
};
|
||||
|
||||
+&uart_A {
|
||||
+ status = "disabled";
|
||||
+ pinctrl-0 = <&uart_a_pins>;
|
||||
+ pinctrl-names = "default";
|
||||
+};
|
||||
+
|
||||
+&uart_C {
|
||||
+ status = "disabled";
|
||||
+ pinctrl-0 = <&uart_c_pins>;
|
||||
+ pinctrl-names = "default";
|
||||
+};
|
||||
+
|
||||
&usb0_phy {
|
||||
status = "disabled";
|
||||
phy-supply = <&usb_otg_pwr>;
|
||||
@@ -1,37 +0,0 @@
|
||||
diff --git a/arch/arm64/boot/dts/amlogic/meson-gxbb-odroidc2.dts b/arch/arm64/boot/dts/amlogic/meson-gxbb-odroidc2.dts
|
||||
index b2cb12fb46fd..c252de8e4b17 100644
|
||||
--- a/arch/arm64/boot/dts/amlogic/meson-gxbb-odroidc2.dts
|
||||
+++ b/arch/arm64/boot/dts/amlogic/meson-gxbb-odroidc2.dts
|
||||
@@ -176,6 +176,32 @@ hdmi_connector_in: endpoint {
|
||||
};
|
||||
};
|
||||
|
||||
+ spi-gpio {
|
||||
+ compatible = "spi-gpio";
|
||||
+ #address-cells = <0x1>;
|
||||
+ #size-cells = <0x0>;
|
||||
+ ranges;
|
||||
+ status = "disabled";
|
||||
+ sck-gpios = <&gpio GPIOX_2 0>;
|
||||
+ miso-gpios = <&gpio GPIOX_4 0>;
|
||||
+ mosi-gpios = <&gpio GPIOX_7 0>;
|
||||
+ cs-gpios = <&gpio GPIOX_3 0
|
||||
+ &gpio GPIOX_1 0>;
|
||||
+ num-chipselects = <2>;
|
||||
+
|
||||
+ /* clients */
|
||||
+ spidev0@0 {
|
||||
+ compatible = "spidev";
|
||||
+ reg = <0>;
|
||||
+ spi-max-frequency = <500000>;
|
||||
+ };
|
||||
+ spidev0@1 {
|
||||
+ compatible = "spidev";
|
||||
+ reg = <1>;
|
||||
+ spi-max-frequency = <500000>;
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
sound {
|
||||
compatible = "amlogic,gx-sound-card";
|
||||
model = "ODROID-C2";
|
||||
@@ -1,14 +0,0 @@
|
||||
diff --git a/arch/arm64/boot/dts/amlogic/meson-gxbb-odroidc2.dts b/arch/arm64/boot/dts/amlogic/meson-gxbb-odroidc2.dts
|
||||
index d147c853a..dbde670ba 100644
|
||||
--- a/arch/arm64/boot/dts/amlogic/meson-gxbb-odroidc2.dts
|
||||
+++ b/arch/arm64/boot/dts/amlogic/meson-gxbb-odroidc2.dts
|
||||
@@ -246,7 +246,8 @@
|
||||
};
|
||||
|
||||
&scpi_clocks {
|
||||
- status = "disabled";
|
||||
+ /* Works only with new blobs that have limited DVFS table */
|
||||
+ status = "okay";
|
||||
};
|
||||
|
||||
/* SD */
|
||||
@@ -1,29 +0,0 @@
|
||||
From 9058e8940ae84b1bc97693d9aca7b27f55bb1964 Mon Sep 17 00:00:00 2001
|
||||
From: Ricardo Pardini <ricardo@pardini.net>
|
||||
Date: Sun, 26 Jun 2022 03:47:06 +0200
|
||||
Subject: [PATCH] ODROID-HC4: add DT attributes to enable fan1_input
|
||||
|
||||
- from vendor kernel modified DT
|
||||
- this allows userspace fancontrol/pwmconfig to work
|
||||
---
|
||||
arch/arm64/boot/dts/amlogic/meson-sm1-odroid-hc4.dts | 4 ++++
|
||||
1 file changed, 4 insertions(+)
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/amlogic/meson-sm1-odroid-hc4.dts b/arch/arm64/boot/dts/amlogic/meson-sm1-odroid-hc4.dts
|
||||
index 0764f1bb5..2b0752144 100644
|
||||
--- a/arch/arm64/boot/dts/amlogic/meson-sm1-odroid-hc4.dts
|
||||
+++ b/arch/arm64/boot/dts/amlogic/meson-sm1-odroid-hc4.dts
|
||||
@@ -23,6 +23,10 @@ fan0: pwm-fan {
|
||||
cooling-max-state = <3>;
|
||||
cooling-levels = <0 120 170 220>;
|
||||
pwms = <&pwm_cd 1 40000 0>;
|
||||
+ fan-supply = <&vcc_5v>;
|
||||
+ interrupt-parent = <&gpio_intc>;
|
||||
+ interrupts = <84 IRQ_TYPE_EDGE_FALLING>;
|
||||
+ pulses-per-revolutions = <2>;
|
||||
};
|
||||
|
||||
leds {
|
||||
--
|
||||
2.36.1
|
||||
|
||||
@@ -1,40 +0,0 @@
|
||||
From 86d9151effff69d2a8fc2027a31dd60bd8c6eb05 Mon Sep 17 00:00:00 2001
|
||||
Message-Id: <86d9151effff69d2a8fc2027a31dd60bd8c6eb05.1627311993.git.stefan@agner.ch>
|
||||
In-Reply-To: <c7825747afd8bb975dc918f28e4afe8058a518f3.1627311993.git.stefan@agner.ch>
|
||||
References: <c7825747afd8bb975dc918f28e4afe8058a518f3.1627311993.git.stefan@agner.ch>
|
||||
From: Stefan Agner <stefan@agner.ch>
|
||||
Date: Mon, 11 Jan 2021 11:38:54 +0100
|
||||
Subject: [PATCH 5/9] arm64: dts: meson: g12b: add GPIO fan support
|
||||
|
||||
Add simple GPIO fan node to support a fan on GPIO J8. Unfortunately the
|
||||
pad used to control the fan does not support real PWM, hence the RPM
|
||||
cannot be modulated.
|
||||
|
||||
Signed-off-by: Stefan Agner <stefan@agner.ch>
|
||||
Tested-by: Ricardo Pardini <ricardo@pardini.net>
|
||||
---
|
||||
arch/arm64/boot/dts/amlogic/meson-g12b-odroid-n2.dtsi | 11 +++++++++++
|
||||
1 file changed, 11 insertions(+)
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/amlogic/meson-g12b-odroid-n2.dtsi b/arch/arm64/boot/dts/amlogic/meson-g12b-odroid-n2.dtsi
|
||||
--- a/arch/arm64/boot/dts/amlogic/meson-g12b-odroid-n2.dtsi (revision e209be874602b0a650b442801cbffe529aa7dfff)
|
||||
+++ b/arch/arm64/boot/dts/amlogic/meson-g12b-odroid-n2.dtsi (date 1655943404649)
|
||||
@@ -44,6 +44,15 @@
|
||||
reset-gpios = <&gpio BOOT_12 GPIO_ACTIVE_LOW>;
|
||||
};
|
||||
|
||||
+ /* 5V 80x80x10.8mm cooling fan from Hardkernel shop... */
|
||||
+ fan0: gpio-fan {
|
||||
+ #cooling-cells = <2>;
|
||||
+ compatible = "gpio-fan";
|
||||
+ gpio-fan,speed-map = <0 0 1600 1>;
|
||||
+ gpios = <&gpio_ao GPIOAO_10 GPIO_ACTIVE_HIGH>;
|
||||
+ status = "okay";
|
||||
+ };
|
||||
+
|
||||
leds {
|
||||
compatible = "gpio-leds";
|
||||
|
||||
--
|
||||
2.32.0
|
||||
|
||||
@@ -1,73 +0,0 @@
|
||||
From f1120f132dbdf2e7f7acf328de55bbdce877d882 Mon Sep 17 00:00:00 2001
|
||||
Message-Id: <f1120f132dbdf2e7f7acf328de55bbdce877d882.1627311993.git.stefan@agner.ch>
|
||||
In-Reply-To: <c7825747afd8bb975dc918f28e4afe8058a518f3.1627311993.git.stefan@agner.ch>
|
||||
References: <c7825747afd8bb975dc918f28e4afe8058a518f3.1627311993.git.stefan@agner.ch>
|
||||
From: Stefan Agner <stefan@agner.ch>
|
||||
Date: Mon, 11 Jan 2021 15:53:55 +0100
|
||||
Subject: [PATCH 6/9] arm64: dts: meson: g12b: odroid-n2: add fan as cooling
|
||||
device
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Add the GPIO fan as a cooling device for the CPU thermal zone. Since we
|
||||
have only full fan speed available with this, set the tripping point to
|
||||
30°C.
|
||||
|
||||
Signed-off-by: Stefan Agner <stefan@agner.ch>
|
||||
---
|
||||
.../dts/amlogic/meson-g12b-odroid-n2.dtsi | 38 +++++++++++++++++++
|
||||
1 file changed, 38 insertions(+)
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/amlogic/meson-g12b-odroid-n2.dtsi b/arch/arm64/boot/dts/amlogic/meson-g12b-odroid-n2.dtsi
|
||||
index e8a3ede698b5..dd345c6aa4b5 100644
|
||||
--- a/arch/arm64/boot/dts/amlogic/meson-g12b-odroid-n2.dtsi
|
||||
+++ b/arch/arm64/boot/dts/amlogic/meson-g12b-odroid-n2.dtsi
|
||||
@@ -388,6 +388,44 @@ &clkc_audio {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
+&cpu_thermal {
|
||||
+ trips {
|
||||
+ cpu_warm: cpu_warm {
|
||||
+ hysteresis = <5000>;
|
||||
+ temperature = <30000>;
|
||||
+ type = "active";
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ cooling-maps {
|
||||
+ map0 {
|
||||
+ cooling-device =
|
||||
+ <&fan0 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>;
|
||||
+ trip = <&cpu_warm>;
|
||||
+ };
|
||||
+ map1 {
|
||||
+ trip = <&cpu_passive>;
|
||||
+ cooling-device = <&cpu0 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
|
||||
+ <&cpu1 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
|
||||
+ <&cpu100 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
|
||||
+ <&cpu101 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
|
||||
+ <&cpu102 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
|
||||
+ <&cpu103 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
|
||||
+ <&fan0 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>;
|
||||
+ };
|
||||
+ map2 {
|
||||
+ trip = <&cpu_hot>;
|
||||
+ cooling-device = <&cpu0 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
|
||||
+ <&cpu1 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
|
||||
+ <&cpu100 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
|
||||
+ <&cpu101 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
|
||||
+ <&cpu102 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
|
||||
+ <&cpu103 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
|
||||
+ <&fan0 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>;
|
||||
+ };
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
&cpu0 {
|
||||
cpu-supply = <&vddcpu_b>;
|
||||
operating-points-v2 = <&cpu_opp_table_0>;
|
||||
--
|
||||
2.32.0
|
||||
|
||||
@@ -1,84 +0,0 @@
|
||||
Index: arch/arm64/boot/dts/amlogic/meson-g12b-odroid-n2-spi.dts
|
||||
IDEA additional info:
|
||||
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
|
||||
<+>UTF-8
|
||||
===================================================================
|
||||
diff --git a/arch/arm64/boot/dts/amlogic/meson-g12b-odroid-n2-spi.dts b/arch/arm64/boot/dts/amlogic/meson-g12b-odroid-n2-spi.dts
|
||||
new file mode 100644
|
||||
--- /dev/null (date 1630421486471)
|
||||
+++ b/arch/arm64/boot/dts/amlogic/meson-g12b-odroid-n2-spi.dts (date 1630421486471)
|
||||
@@ -0,0 +1,11 @@
|
||||
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
||||
+
|
||||
+/dts-v1/;
|
||||
+
|
||||
+#include "meson-g12b-odroid-n2.dts"
|
||||
+
|
||||
+/ {
|
||||
+ model = "Hardkernel ODROID-N2 with SPI";
|
||||
+};
|
||||
+
|
||||
+#include "meson-g12b-odroid-n2-enable-spi.dtsi"
|
||||
Index: arch/arm64/boot/dts/amlogic/meson-g12b-odroid-n2-plus-spi.dts
|
||||
IDEA additional info:
|
||||
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
|
||||
<+>UTF-8
|
||||
===================================================================
|
||||
diff --git a/arch/arm64/boot/dts/amlogic/meson-g12b-odroid-n2-plus-spi.dts b/arch/arm64/boot/dts/amlogic/meson-g12b-odroid-n2-plus-spi.dts
|
||||
new file mode 100644
|
||||
--- /dev/null (date 1630421477913)
|
||||
+++ b/arch/arm64/boot/dts/amlogic/meson-g12b-odroid-n2-plus-spi.dts (date 1630421477913)
|
||||
@@ -0,0 +1,11 @@
|
||||
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
||||
+
|
||||
+/dts-v1/;
|
||||
+
|
||||
+#include "meson-g12b-odroid-n2-plus.dts"
|
||||
+
|
||||
+/ {
|
||||
+ model = "Hardkernel ODROID-N2Plus with SPI";
|
||||
+};
|
||||
+
|
||||
+#include "meson-g12b-odroid-n2-enable-spi.dtsi"
|
||||
Index: arch/arm64/boot/dts/amlogic/meson-g12b-odroid-n2-enable-spi.dtsi
|
||||
IDEA additional info:
|
||||
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
|
||||
<+>UTF-8
|
||||
===================================================================
|
||||
diff --git a/arch/arm64/boot/dts/amlogic/meson-g12b-odroid-n2-enable-spi.dtsi b/arch/arm64/boot/dts/amlogic/meson-g12b-odroid-n2-enable-spi.dtsi
|
||||
new file mode 100644
|
||||
--- /dev/null (date 1630421525557)
|
||||
+++ b/arch/arm64/boot/dts/amlogic/meson-g12b-odroid-n2-enable-spi.dtsi (date 1630421525557)
|
||||
@@ -0,0 +1,13 @@
|
||||
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
||||
+
|
||||
+/*
|
||||
+ * Replace emmc_data_8b_pins to emmc_data_4b_pins from sd_emmc_c pinctrl-0, and change bus-width to 4 then spifc can be enabled.
|
||||
+ */
|
||||
+&sd_emmc_c {
|
||||
+ pinctrl-0 = <&emmc_ctrl_pins>, <&emmc_data_4b_pins>, <&emmc_ds_pins>;
|
||||
+ bus-width = <4>;
|
||||
+};
|
||||
+
|
||||
+&spifc {
|
||||
+ status = "okay";
|
||||
+};
|
||||
Index: arch/arm64/boot/dts/amlogic/Makefile
|
||||
IDEA additional info:
|
||||
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
|
||||
<+>UTF-8
|
||||
===================================================================
|
||||
diff --git a/arch/arm64/boot/dts/amlogic/Makefile b/arch/arm64/boot/dts/amlogic/Makefile
|
||||
index f231280cd808..da3225d31e38 100644
|
||||
--- a/arch/arm64/boot/dts/amlogic/Makefile
|
||||
+++ b/arch/arm64/boot/dts/amlogic/Makefile
|
||||
@@ -10,7 +10,9 @@ dtb-$(CONFIG_ARCH_MESON) += meson-g12b-a311d-khadas-vim3.dtb
|
||||
dtb-$(CONFIG_ARCH_MESON) += meson-g12b-gsking-x.dtb
|
||||
dtb-$(CONFIG_ARCH_MESON) += meson-g12b-gtking-pro.dtb
|
||||
dtb-$(CONFIG_ARCH_MESON) += meson-g12b-gtking.dtb
|
||||
+dtb-$(CONFIG_ARCH_MESON) += meson-g12b-odroid-n2-spi.dtb
|
||||
dtb-$(CONFIG_ARCH_MESON) += meson-g12b-odroid-n2-plus.dtb
|
||||
+dtb-$(CONFIG_ARCH_MESON) += meson-g12b-odroid-n2-plus-spi.dtb
|
||||
dtb-$(CONFIG_ARCH_MESON) += meson-g12b-odroid-n2.dtb
|
||||
dtb-$(CONFIG_ARCH_MESON) += meson-g12b-radxa-zero2.dtb
|
||||
dtb-$(CONFIG_ARCH_MESON) += meson-g12b-s922x-khadas-vim3.dtb
|
||||
@@ -1,46 +0,0 @@
|
||||
From 712b399ed54f49e0ac7ae92c57ed775604eaaed9 Mon Sep 17 00:00:00 2001
|
||||
From: Igor Pecovnik <igor.pecovnik@gmail.com>
|
||||
Date: Wed, 10 Feb 2021 18:07:08 +0100
|
||||
Subject: [PATCH] Add missing CPU opp values for clocking g12b / N2+ higher
|
||||
|
||||
Signed-off-by: Igor Pecovnik <igor.pecovnik@gmail.com>
|
||||
---
|
||||
.../arm64/boot/dts/amlogic/meson-g12b-a311d.dtsi | 16 ++++++++++++++++
|
||||
1 file changed, 16 insertions(+)
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/amlogic/meson-g12b-a311d.dtsi b/arch/arm64/boot/dts/amlogic/meson-g12b-a311d.dtsi
|
||||
index d61f43052..75030d197 100644
|
||||
--- a/arch/arm64/boot/dts/amlogic/meson-g12b-a311d.dtsi
|
||||
+++ b/arch/arm64/boot/dts/amlogic/meson-g12b-a311d.dtsi
|
||||
@@ -65,6 +65,14 @@ opp-1800000000 {
|
||||
opp-hz = /bits/ 64 <1800000000>;
|
||||
opp-microvolt = <1001000>;
|
||||
};
|
||||
+ opp-1908000000 {
|
||||
+ opp-hz = /bits/ 64 <1908000000>;
|
||||
+ opp-microvolt = <1030000>;
|
||||
+ };
|
||||
+ opp-2016000000 {
|
||||
+ opp-hz = /bits/ 64 <2016000000>;
|
||||
+ opp-microvolt = <1040000>;
|
||||
+ };
|
||||
};
|
||||
|
||||
cpub_opp_table_1: opp-table-1 {
|
||||
@@ -145,5 +153,13 @@ opp-2208000000 {
|
||||
opp-hz = /bits/ 64 <2208000000>;
|
||||
opp-microvolt = <1011000>;
|
||||
};
|
||||
+ opp-2304000000 {
|
||||
+ opp-hz = /bits/ 64 <2304000000>;
|
||||
+ opp-microvolt = <1030000>;
|
||||
+ };
|
||||
+ opp-2400000000 {
|
||||
+ opp-hz = /bits/ 64 <2400000000>;
|
||||
+ opp-microvolt = <1040000>;
|
||||
+ };
|
||||
};
|
||||
};
|
||||
--
|
||||
Created with Armbian build tools https://github.com/armbian/build
|
||||
|
||||
@@ -1,94 +0,0 @@
|
||||
From 795fad491189f7fd6034d6d639602119a4e60755 Mon Sep 17 00:00:00 2001
|
||||
From: Christian Hewitt <christianshewitt@gmail.com>
|
||||
Date: Tue, 17 Aug 2021 16:16:43 +0000
|
||||
Subject: [PATCH 68/90] WIP: arm64: dts: meson: radxa-zero: add support for the
|
||||
usb type-c controller
|
||||
|
||||
Radxa Zero uses an FUSB302 type-c controller, so lets enable it.
|
||||
|
||||
NB: Polarity swapping via GPIO is not implemented in the current driver
|
||||
(see drivers/usb/typec/tcpm/fusb302.c) so it is not possible to handle
|
||||
GPIOAO_6 for USB3 polarity control.
|
||||
|
||||
Suggested-by: Neil Armstrong <narmstrong@baylibre.com>
|
||||
Signed-off-by: Christian Hewitt <christianshewitt@gmail.com>
|
||||
---
|
||||
.../dts/amlogic/meson-g12a-radxa-zero.dts | 44 +++++++++++++++++++
|
||||
1 file changed, 44 insertions(+)
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/amlogic/meson-g12a-radxa-zero.dts b/arch/arm64/boot/dts/amlogic/meson-g12a-radxa-zero.dts
|
||||
index e3bb6df42ff3..5e3dc013409f 100644
|
||||
--- a/arch/arm64/boot/dts/amlogic/meson-g12a-radxa-zero.dts
|
||||
+++ b/arch/arm64/boot/dts/amlogic/meson-g12a-radxa-zero.dts
|
||||
@@ -60,6 +60,14 @@ sdio_pwrseq: sdio-pwrseq {
|
||||
clock-names = "ext_clock";
|
||||
};
|
||||
|
||||
+ typec2_vbus: regulator-typec2_vbus {
|
||||
+ compatible = "regulator-fixed";
|
||||
+ regulator-name = "TYPEC2_VBUS";
|
||||
+ regulator-min-microvolt = <5000000>;
|
||||
+ regulator-max-microvolt = <5000000>;
|
||||
+ vin-supply = <&ao_5v>;
|
||||
+ };
|
||||
+
|
||||
ao_5v: regulator-ao_5v {
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "AO_5V";
|
||||
@@ -191,6 +199,18 @@ wifi32k: wifi32k {
|
||||
};
|
||||
};
|
||||
|
||||
+&ao_pinctrl {
|
||||
+ /* Ensure the TYPE C controller irq pin is not driven by the SoC */
|
||||
+ fusb302_irq_pins: fusb302_irq {
|
||||
+ mux {
|
||||
+ groups = "GPIOAO_5";
|
||||
+ function = "gpio_aobus";
|
||||
+ bias-pull-up;
|
||||
+ output-disable;
|
||||
+ };
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
&arb {
|
||||
status = "okay";
|
||||
};
|
||||
@@ -278,6 +298,22 @@ &ir {
|
||||
pinctrl-names = "default";
|
||||
};
|
||||
|
||||
+&i2c_AO {
|
||||
+ fusb302@22 {
|
||||
+ compatible = "fcs,fusb302";
|
||||
+ reg = <0x22>;
|
||||
+
|
||||
+ pinctrl-0 = <&fusb302_irq_pins>;
|
||||
+ pinctrl-names = "default";
|
||||
+ interrupt-parent = <&gpio_intc>;
|
||||
+ interrupts = <59 IRQ_TYPE_LEVEL_LOW>;
|
||||
+
|
||||
+ vbus-supply = <&typec2_vbus>;
|
||||
+
|
||||
+ status = "okay";
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
&pwm_AO_cd {
|
||||
pinctrl-0 = <&pwm_ao_d_e_pins>;
|
||||
pinctrl-names = "default";
|
||||
@@ -403,3 +439,11 @@ &usb {
|
||||
status = "okay";
|
||||
dr_mode = "host";
|
||||
};
|
||||
+
|
||||
+&usb2_phy0 {
|
||||
+ phy-supply = <&typec2_vbus>;
|
||||
+};
|
||||
+
|
||||
+&usb3_pcie_phy {
|
||||
+ phy-supply = <&typec2_vbus>;
|
||||
+};
|
||||
--
|
||||
2.35.1
|
||||
|
||||
@@ -1,26 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Stephen <stephen@vamrs.com>
|
||||
Date: Thu, 28 Oct 2021 14:26:24 +0800
|
||||
Subject: [PATCH] arm64: dts: radxa zero: set dr_mode of usb node to otg
|
||||
|
||||
This enables dwc2 otg function.
|
||||
|
||||
Signed-off-by: Stephen <stephen@vamrs.com>
|
||||
Signed-off-by: Yuntian Zhang <yt@radxa.com>
|
||||
---
|
||||
arch/arm64/boot/dts/amlogic/meson-g12a-radxa-zero.dts | 1 -
|
||||
1 file changed, 1 deletion(-)
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/amlogic/meson-g12a-radxa-zero.dts b/arch/arm64/boot/dts/amlogic/meson-g12a-radxa-zero.dts
|
||||
index 9519e36ab7..9095ad9018 100644
|
||||
--- a/arch/arm64/boot/dts/amlogic/meson-g12a-radxa-zero.dts
|
||||
+++ b/arch/arm64/boot/dts/amlogic/meson-g12a-radxa-zero.dts
|
||||
@@ -426,5 +426,4 @@ &uart_AO {
|
||||
|
||||
&usb {
|
||||
status = "okay";
|
||||
- dr_mode = "host";
|
||||
};
|
||||
--
|
||||
2.36.1
|
||||
|
||||
@@ -1,12 +0,0 @@
|
||||
diff -Naur a/arch/arm64/boot/dts/amlogic/meson-g12a-radxa-zero.dts b/arch/arm64/boot/dts/amlogic/meson-g12a-radxa-zero.dts
|
||||
--- a/arch/arm64/boot/dts/amlogic/meson-g12a-radxa-zero.dts 2022-03-20 16:14:17.000000000 -0400
|
||||
+++ b/arch/arm64/boot/dts/amlogic/meson-g12a-radxa-zero.dts 2022-03-27 07:44:01.636737819 -0400
|
||||
@@ -310,7 +310,7 @@
|
||||
|
||||
bus-width = <4>;
|
||||
cap-sd-highspeed;
|
||||
- sd-uhs-sdr50;
|
||||
+ cap-mmc-highspeed;
|
||||
max-frequency = <100000000>;
|
||||
|
||||
non-removable;
|
||||
@@ -1,31 +0,0 @@
|
||||
From 2653defc5e22ba86bd1d455eb01fc7edd2958473 Mon Sep 17 00:00:00 2001
|
||||
From: The-going <48602507+The-going@users.noreply.github.com>
|
||||
Date: Wed, 2 Feb 2022 11:56:51 +0300
|
||||
Subject: [PATCH 08/50] drv:spi:spidev remove warnings
|
||||
|
||||
---
|
||||
drivers/spi/spidev.c | 7 ++++++-
|
||||
1 file changed, 6 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/spi/spidev.c b/drivers/spi/spidev.c
|
||||
index b2775d82d2d7..3c65d3d74559 100644
|
||||
--- a/drivers/spi/spidev.c
|
||||
+++ b/drivers/spi/spidev.c
|
||||
@@ -683,6 +683,7 @@ static const struct file_operations spidev_fops = {
|
||||
static struct class *spidev_class;
|
||||
|
||||
static const struct spi_device_id spidev_spi_ids[] = {
|
||||
+ { .name = "spi-dev" },
|
||||
{ .name = "dh2228fv" },
|
||||
{ .name = "ltc2488" },
|
||||
{ .name = "sx1301" },
|
||||
@@ -709,6 +710,7 @@ static int spidev_of_check(struct device *dev)
|
||||
}
|
||||
|
||||
static const struct of_device_id spidev_dt_ids[] = {
|
||||
+ { .compatible = "armbian,spi-dev", .data = &spidev_of_check },
|
||||
{ .compatible = "rohm,dh2228fv", .data = &spidev_of_check },
|
||||
{ .compatible = "lineartechnology,ltc2488", .data = &spidev_of_check },
|
||||
{ .compatible = "semtech,sx1301", .data = &spidev_of_check },
|
||||
--
|
||||
2.35.3
|
||||
@@ -1,135 +0,0 @@
|
||||
From e0252efa9190de31a2fc98eed28b273428a3fe36 Mon Sep 17 00:00:00 2001
|
||||
From: Neil Armstrong <narmstrong@baylibre.com>
|
||||
Date: Thu, 3 Nov 2016 15:29:23 +0100
|
||||
Subject: [PATCH 05/90] HACK: arm64: meson: add Amlogic Meson GX PM Suspend
|
||||
|
||||
The Amlogic Meson GX SoCs uses a non-standard argument to the
|
||||
PSCI CPU_SUSPEND call to enter system suspend.
|
||||
|
||||
Implement such call within platform_suspend_ops.
|
||||
|
||||
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
|
||||
---
|
||||
drivers/firmware/meson/Kconfig | 6 ++
|
||||
drivers/firmware/meson/Makefile | 1 +
|
||||
drivers/firmware/meson/meson_gx_pm.c | 86 ++++++++++++++++++++++++++++
|
||||
3 files changed, 93 insertions(+)
|
||||
create mode 100644 drivers/firmware/meson/meson_gx_pm.c
|
||||
|
||||
diff --git a/drivers/firmware/meson/Kconfig b/drivers/firmware/meson/Kconfig
|
||||
index f2fdd3756648..d3ead92ac61b 100644
|
||||
--- a/drivers/firmware/meson/Kconfig
|
||||
+++ b/drivers/firmware/meson/Kconfig
|
||||
@@ -9,3 +9,9 @@ config MESON_SM
|
||||
depends on ARM64_4K_PAGES
|
||||
help
|
||||
Say y here to enable the Amlogic secure monitor driver
|
||||
+
|
||||
+config MESON_GX_PM
|
||||
+ bool
|
||||
+ default ARCH_MESON if ARM64
|
||||
+ help
|
||||
+ Say y here to enable the Amlogic GX SoC Power Management
|
||||
diff --git a/drivers/firmware/meson/Makefile b/drivers/firmware/meson/Makefile
|
||||
index c6c09483b622..0193cdfee32f 100644
|
||||
--- a/drivers/firmware/meson/Makefile
|
||||
+++ b/drivers/firmware/meson/Makefile
|
||||
@@ -1,2 +1,3 @@
|
||||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
obj-$(CONFIG_MESON_SM) += meson_sm.o
|
||||
+obj-$(CONFIG_MESON_GX_PM) += meson_gx_pm.o
|
||||
diff --git a/drivers/firmware/meson/meson_gx_pm.c b/drivers/firmware/meson/meson_gx_pm.c
|
||||
new file mode 100644
|
||||
index 000000000000..c104c2e4c77f
|
||||
--- /dev/null
|
||||
+++ b/drivers/firmware/meson/meson_gx_pm.c
|
||||
@@ -0,0 +1,86 @@
|
||||
+/*
|
||||
+ * Amlogic Meson GX Power Management
|
||||
+ *
|
||||
+ * Copyright (c) 2016 Baylibre, SAS.
|
||||
+ * Author: Neil Armstrong <narmstrong@baylibre.com>
|
||||
+ *
|
||||
+ * This program is free software; you can redistribute it and/or modify it
|
||||
+ * under the terms of version 2 of the GNU General Public License as
|
||||
+ * published by the Free Software Foundation.
|
||||
+ *
|
||||
+ * This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
+ * more details.
|
||||
+ */
|
||||
+
|
||||
+#include <linux/module.h>
|
||||
+#include <linux/of.h>
|
||||
+#include <linux/platform_device.h>
|
||||
+#include <linux/suspend.h>
|
||||
+#include <linux/arm-smccc.h>
|
||||
+
|
||||
+#include <uapi/linux/psci.h>
|
||||
+
|
||||
+#include <asm/suspend.h>
|
||||
+
|
||||
+/*
|
||||
+ * The Amlogic GX SoCs uses a special argument value to the
|
||||
+ * PSCI CPU_SUSPEND method to enter SUSPEND_MEM.
|
||||
+ */
|
||||
+
|
||||
+#define MESON_SUSPEND_PARAM 0x0010000
|
||||
+#define PSCI_FN_NATIVE(version, name) PSCI_##version##_FN64_##name
|
||||
+
|
||||
+static int meson_gx_suspend_finish(unsigned long arg)
|
||||
+{
|
||||
+ struct arm_smccc_res res;
|
||||
+
|
||||
+ arm_smccc_smc(PSCI_FN_NATIVE(0_2, CPU_SUSPEND), arg,
|
||||
+ virt_to_phys(cpu_resume), 0, 0, 0, 0, 0, &res);
|
||||
+
|
||||
+ return res.a0;
|
||||
+}
|
||||
+
|
||||
+static int meson_gx_suspend_enter(suspend_state_t state)
|
||||
+{
|
||||
+ switch (state) {
|
||||
+ case PM_SUSPEND_MEM:
|
||||
+ return cpu_suspend(MESON_SUSPEND_PARAM,
|
||||
+ meson_gx_suspend_finish);
|
||||
+ }
|
||||
+
|
||||
+ return -EINVAL;
|
||||
+}
|
||||
+
|
||||
+static const struct platform_suspend_ops meson_gx_pm_ops = {
|
||||
+ .enter = meson_gx_suspend_enter,
|
||||
+ .valid = suspend_valid_only_mem,
|
||||
+};
|
||||
+
|
||||
+static const struct of_device_id meson_gx_pm_match[] = {
|
||||
+ { .compatible = "amlogic,meson-gx-pm", },
|
||||
+ { /* sentinel */ },
|
||||
+};
|
||||
+MODULE_DEVICE_TABLE(of, meson_gx_pm_match);
|
||||
+
|
||||
+static int meson_gx_pm_probe(struct platform_device *pdev)
|
||||
+{
|
||||
+ suspend_set_ops(&meson_gx_pm_ops);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static struct platform_driver meson_gx_pm_driver = {
|
||||
+ .probe = meson_gx_pm_probe,
|
||||
+ .driver = {
|
||||
+ .name = "meson-gx-pm",
|
||||
+ .of_match_table = meson_gx_pm_match,
|
||||
+ },
|
||||
+};
|
||||
+
|
||||
+module_platform_driver(meson_gx_pm_driver);
|
||||
+
|
||||
+MODULE_AUTHOR("Neil Armstrong <narmstrong@baylibre.com>");
|
||||
+MODULE_DESCRIPTION("Amlogic Meson GX PM driver");
|
||||
+MODULE_LICENSE("GPL v2");
|
||||
--
|
||||
2.35.1
|
||||
|
||||
@@ -1,91 +0,0 @@
|
||||
diff --git a/arch/arm/boot/.gitignore b/arch/arm/boot/.gitignore
|
||||
index 8c759326baf4..e6ce8f6ad4b1 100644
|
||||
--- a/arch/arm/boot/.gitignore
|
||||
+++ b/arch/arm/boot/.gitignore
|
||||
@@ -4,3 +4,5 @@ zImage
|
||||
xipImage
|
||||
bootpImage
|
||||
uImage
|
||||
+*.dtb*
|
||||
+*.scr
|
||||
diff --git a/scripts/Makefile.dtbinst b/scripts/Makefile.dtbinst
|
||||
index 190d781e84f4..6540de71182b 100644
|
||||
--- a/scripts/Makefile.dtbinst
|
||||
+++ b/scripts/Makefile.dtbinst
|
||||
@@ -18,9 +18,12 @@ include $(srctree)/scripts/Kbuild.include
|
||||
include $(src)/Makefile
|
||||
|
||||
dtbs := $(addprefix $(dst)/, $(dtb-y) $(if $(CONFIG_OF_ALL_DTBS),$(dtb-)))
|
||||
+dtbos := $(addprefix $(dst)/, $(dtbo-y))
|
||||
+scrs := $(addprefix $(dst)/, $(scr-y))
|
||||
+readmes := $(addprefix $(dst)/, $(dtbotxt-y))
|
||||
subdirs := $(addprefix $(obj)/, $(subdir-y) $(subdir-m))
|
||||
|
||||
-__dtbs_install: $(dtbs) $(subdirs)
|
||||
+__dtbs_install: $(dtbs) $(dtbos) $(scrs) $(readmes) $(subdirs)
|
||||
@:
|
||||
|
||||
quiet_cmd_dtb_install = INSTALL $@
|
||||
@@ -32,6 +35,15 @@ $(dst)/%.dtb: $(obj)/%.dtb
|
||||
$(dst)/%.dtbo: $(obj)/%.dtbo
|
||||
$(call cmd,dtb_install)
|
||||
|
||||
+$(dst)/%.dtbo: $(obj)/%.dtbo
|
||||
+ $(call cmd,dtb_install)
|
||||
+
|
||||
+$(dst)/%.scr: $(obj)/%.scr
|
||||
+ $(call cmd,dtb_install)
|
||||
+
|
||||
+$(dst)/README.meson-overlays: $(src)/README.meson-overlays
|
||||
+ $(call cmd,dtb_install)
|
||||
+
|
||||
PHONY += $(subdirs)
|
||||
$(subdirs):
|
||||
$(Q)$(MAKE) $(dtbinst)=$@ dst=$(patsubst $(obj)/%,$(dst)/%,$@)
|
||||
diff --git a/scripts/Makefile.lib b/scripts/Makefile.lib
|
||||
index d1425778664b..a28448cebd7c 100644
|
||||
--- a/scripts/Makefile.lib
|
||||
+++ b/scripts/Makefile.lib
|
||||
@@ -311,6 +311,9 @@ quiet_cmd_gzip = GZIP $@
|
||||
DTC ?= $(objtree)/scripts/dtc/dtc
|
||||
DTC_FLAGS += -Wno-interrupt_provider
|
||||
|
||||
+# Overlay support
|
||||
+DTC_FLAGS += -@ -Wno-unit_address_format -Wno-simple_bus_reg
|
||||
+
|
||||
# Disable noisy checks by default
|
||||
ifeq ($(findstring 1,$(KBUILD_EXTRA_WARN)),)
|
||||
DTC_FLAGS += -Wno-unit_address_vs_reg \
|
||||
@@ -371,7 +374,7 @@ DT_BINDING_DIR := Documentation/devicetree/bindings
|
||||
DT_TMP_SCHEMA := $(objtree)/$(DT_BINDING_DIR)/processed-schema.json
|
||||
|
||||
quiet_cmd_dtb_check = CHECK $@
|
||||
- cmd_dtb_check = $(DT_CHECKER) $(DT_CHECKER_FLAGS) -u $(srctree)/$(DT_BINDING_DIR) -p $(DT_TMP_SCHEMA) $@ || true
|
||||
+ cmd_dtb_check = $(DT_CHECKER) $(DT_CHECKER_FLAGS) -u $(srctree)/$(DT_BINDING_DIR) -p $(DT_TMP_SCHEMA) $@ || true
|
||||
endif
|
||||
|
||||
define rule_dtc
|
||||
@@ -385,6 +388,23 @@ $(obj)/%.dtb: $(src)/%.dts $(DTC) $(DT_TMP_SCHEMA) FORCE
|
||||
$(obj)/%.dtbo: $(src)/%.dts $(DTC) FORCE
|
||||
$(call if_changed_dep,dtc)
|
||||
|
||||
+quiet_cmd_dtco = DTCO $@
|
||||
+cmd_dtco = mkdir -p $(dir ${dtc-tmp}) ; \
|
||||
+ $(CPP) $(dtc_cpp_flags) -x assembler-with-cpp -o $(dtc-tmp) $< ; \
|
||||
+ $(DTC) -O dtb -o $@ -b 0 \
|
||||
+ -i $(dir $<) $(DTC_FLAGS) \
|
||||
+ -d $(depfile).dtc.tmp $(dtc-tmp) ; \
|
||||
+ cat $(depfile).pre.tmp $(depfile).dtc.tmp > $(depfile)
|
||||
+
|
||||
+$(obj)/%.dtbo: $(src)/%.dts FORCE
|
||||
+ $(call if_changed_dep,dtco)
|
||||
+
|
||||
+quiet_cmd_scr = MKIMAGE $@
|
||||
+cmd_scr = mkimage -C none -A $(ARCH) -T script -d $< $@
|
||||
+
|
||||
+$(obj)/%.scr: $(src)/%.scr-cmd FORCE
|
||||
+ $(call if_changed,scr)
|
||||
+
|
||||
dtc-tmp = $(subst $(comma),_,$(dot-target).dts.tmp)
|
||||
|
||||
# Bzip2
|
||||
@@ -1,29 +0,0 @@
|
||||
From 192ff185a6f85f2519cc4b97aa015a836f5a8fbb Mon Sep 17 00:00:00 2001
|
||||
From: Jonas Karlman <jonas@kwiboo.se>
|
||||
Date: Mon, 9 Jul 2018 21:25:15 +0200
|
||||
Subject: [PATCH 10/84] TEMP: drm: dw-hdmi: call hdmi_set_cts_n after clock is
|
||||
enabled
|
||||
|
||||
---
|
||||
drivers/gpu/drm/bridge/synopsys/dw-hdmi.c | 5 +++++
|
||||
1 file changed, 5 insertions(+)
|
||||
|
||||
diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
|
||||
index 3e1be9894ed1..733c3dec04de 100644
|
||||
--- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
|
||||
+++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
|
||||
@@ -781,6 +781,11 @@ static void hdmi_enable_audio_clk(struct dw_hdmi *hdmi, bool enable)
|
||||
else
|
||||
hdmi->mc_clkdis |= HDMI_MC_CLKDIS_AUDCLK_DISABLE;
|
||||
hdmi_writeb(hdmi, hdmi->mc_clkdis, HDMI_MC_CLKDIS);
|
||||
+
|
||||
+ if (enable) {
|
||||
+ hdmi_set_cts_n(hdmi, hdmi->audio_cts, 0);
|
||||
+ hdmi_set_cts_n(hdmi, hdmi->audio_cts, hdmi->audio_n);
|
||||
+ }
|
||||
}
|
||||
|
||||
static u8 *hdmi_audio_get_eld(struct dw_hdmi *hdmi)
|
||||
--
|
||||
2.7.1
|
||||
|
||||
@@ -1,39 +0,0 @@
|
||||
From 0eb45601fe5d6b3aa9eb7038bb51df6b5fb9f860 Mon Sep 17 00:00:00 2001
|
||||
From: Qinglang Miao <miaoqinglang@huawei.com>
|
||||
Date: Sat, 28 Nov 2020 16:10:04 +0000
|
||||
Subject: [PATCH 08/58] FROMLIST(v1): drm/panfrost: fix reference leak in
|
||||
panfrost_job_hw_submit
|
||||
|
||||
pm_runtime_get_sync will increment pm usage counter even it
|
||||
failed. Forgetting to putting operation will result in a
|
||||
reference leak here.
|
||||
|
||||
A new function pm_runtime_resume_and_get is introduced in
|
||||
[0] to keep usage counter balanced. So We fix the reference
|
||||
leak by replacing it with new funtion.
|
||||
|
||||
[0] dd8088d5a896 ("PM: runtime: Add pm_runtime_resume_and_get to deal with usage counter")
|
||||
|
||||
Fixes: f3ba91228e8e ("drm/panfrost: Add initial panfrost driver")
|
||||
Reported-by: Hulk Robot <hulkci@huawei.com>
|
||||
Signed-off-by: Qinglang Miao <miaoqinglang@huawei.com>
|
||||
---
|
||||
drivers/gpu/drm/panfrost/panfrost_job.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/gpu/drm/panfrost/panfrost_job.c b/drivers/gpu/drm/panfrost/panfrost_job.c
|
||||
index 04e6f6f9b742..d6d5c15184f9 100644
|
||||
--- a/drivers/gpu/drm/panfrost/panfrost_job.c
|
||||
+++ b/drivers/gpu/drm/panfrost/panfrost_job.c
|
||||
@@ -157,7 +157,7 @@ static void panfrost_job_hw_submit(struct panfrost_job *job, int js)
|
||||
|
||||
panfrost_devfreq_record_busy(&pfdev->pfdevfreq);
|
||||
|
||||
- ret = pm_runtime_get_sync(pfdev->dev);
|
||||
+ ret = pm_runtime_resume_and_get(pfdev->dev);
|
||||
if (ret < 0)
|
||||
return;
|
||||
|
||||
--
|
||||
2.25.1
|
||||
|
||||
@@ -1,31 +0,0 @@
|
||||
From 5c9793b46115c2fd774678de7ff5efd7d6ae8d72 Mon Sep 17 00:00:00 2001
|
||||
From: Christian Hewitt <christianshewitt@gmail.com>
|
||||
Date: Sat, 13 Apr 2019 05:45:18 +0000
|
||||
Subject: [PATCH 03/90] HACK: arm64: fix Kodi sysinfo CPU information
|
||||
|
||||
This allows the CPU information to show in the Kodi sysinfo screen, e.g.
|
||||
|
||||
"ARMv8 Processor rev 4 (v81)" on Amlogic devices
|
||||
|
||||
Signed-off-by: Christian Hewitt <christianshewitt@gmail.com>
|
||||
---
|
||||
arch/arm64/kernel/cpuinfo.c | 3 +--
|
||||
1 file changed, 1 insertion(+), 2 deletions(-)
|
||||
|
||||
diff --git a/arch/arm64/kernel/cpuinfo.c b/arch/arm64/kernel/cpuinfo.c
|
||||
index 591c18a889a5..fdd91a00a285 100644
|
||||
--- a/arch/arm64/kernel/cpuinfo.c
|
||||
+++ b/arch/arm64/kernel/cpuinfo.c
|
||||
@@ -151,8 +151,7 @@ static int c_show(struct seq_file *m, void *v)
|
||||
* "processor". Give glibc what it expects.
|
||||
*/
|
||||
seq_printf(m, "processor\t: %d\n", i);
|
||||
- if (compat)
|
||||
- seq_printf(m, "model name\t: ARMv8 Processor rev %d (%s)\n",
|
||||
+ seq_printf(m, "model name\t: ARMv8 Processor rev %d (%s)\n",
|
||||
MIDR_REVISION(midr), COMPAT_ELF_PLATFORM);
|
||||
|
||||
seq_printf(m, "BogoMIPS\t: %lu.%02lu\n",
|
||||
--
|
||||
2.35.1
|
||||
|
||||
@@ -1,76 +0,0 @@
|
||||
From 9175674ca107a9090936d7373927567f41d1ae7e Mon Sep 17 00:00:00 2001
|
||||
From: Dongjin Kim <tobetter@gmail.com>
|
||||
Date: Thu, 10 Sep 2020 11:01:33 +0900
|
||||
Subject: [PATCH] ODROID-COMMON: gpu/drm: add new display resolution 2560x1440
|
||||
|
||||
Signed-off-by: Joy Cho <joy.cho@hardkernel.com>
|
||||
Signed-off-by: Dongjin Kim <tobetter@gmail.com>
|
||||
---
|
||||
drivers/gpu/drm/meson/meson_vclk.c | 18 ++++++++++++++++++
|
||||
drivers/gpu/drm/meson/meson_venc.c | 5 +++--
|
||||
2 files changed, 21 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/drivers/gpu/drm/meson/meson_vclk.c b/drivers/gpu/drm/meson/meson_vclk.c
|
||||
index 2a82119eb58e..eb4c251d79b7 100644
|
||||
--- a/drivers/gpu/drm/meson/meson_vclk.c
|
||||
+++ b/drivers/gpu/drm/meson/meson_vclk.c
|
||||
@@ -357,6 +357,8 @@ enum {
|
||||
MESON_VCLK_HDMI_594000,
|
||||
/* 2970 /1 /1 /1 /5 /1 => /1 /2 */
|
||||
MESON_VCLK_HDMI_594000_YUV420,
|
||||
+/* 4830 /2 /1 /2 /5 /1 => /1 /1 */
|
||||
+ MESON_VCLK_HDMI_241500,
|
||||
};
|
||||
|
||||
struct meson_vclk_params {
|
||||
@@ -467,6 +469,18 @@ struct meson_vclk_params {
|
||||
.vid_pll_div = VID_PLL_DIV_5,
|
||||
.vclk_div = 1,
|
||||
},
|
||||
+ [MESON_VCLK_HDMI_241500] = {
|
||||
+ .pll_freq = 4830000,
|
||||
+ .phy_freq = 2415000,
|
||||
+ .venc_freq = 241500,
|
||||
+ .vclk_freq = 241500,
|
||||
+ .pixel_freq = 241500,
|
||||
+ .pll_od1 = 2,
|
||||
+ .pll_od2 = 1,
|
||||
+ .pll_od3 = 2,
|
||||
+ .vid_pll_div = VID_PLL_DIV_5,
|
||||
+ .vclk_div = 1,
|
||||
+ },
|
||||
{ /* sentinel */ },
|
||||
};
|
||||
|
||||
@@ -873,6 +887,10 @@ static void meson_vclk_set(struct meson_drm *priv, unsigned int pll_base_freq,
|
||||
m = 0xf7;
|
||||
frac = vic_alternate_clock ? 0x8148 : 0x10000;
|
||||
break;
|
||||
+ case 4830000:
|
||||
+ m = 0xc9;
|
||||
+ frac = 0xd560;
|
||||
+ break;
|
||||
}
|
||||
|
||||
meson_hdmi_pll_set_params(priv, m, frac, od1, od2, od3);
|
||||
diff --git a/drivers/gpu/drm/meson/meson_venc.c b/drivers/gpu/drm/meson/meson_venc.c
|
||||
index 3c55ed003359..559ab3b5e212 100644
|
||||
--- a/drivers/gpu/drm/meson/meson_venc.c
|
||||
+++ b/drivers/gpu/drm/meson/meson_venc.c
|
||||
@@ -866,10 +866,11 @@ meson_venc_hdmi_supported_mode(const struct drm_display_mode *mode)
|
||||
DRM_MODE_FLAG_PVSYNC | DRM_MODE_FLAG_NVSYNC))
|
||||
return MODE_BAD;
|
||||
|
||||
- if (mode->hdisplay < 640 || mode->hdisplay > 1920)
|
||||
+ /* support higher resolution than 1920x1080 */
|
||||
+ if (mode->hdisplay < 640 || mode->hdisplay > 2560)
|
||||
return MODE_BAD_HVALUE;
|
||||
|
||||
- if (mode->vdisplay < 480 || mode->vdisplay > 1200)
|
||||
+ if (mode->vdisplay < 480 || mode->vdisplay > 1600)
|
||||
return MODE_BAD_VVALUE;
|
||||
|
||||
return MODE_OK;
|
||||
--
|
||||
2.35.1
|
||||
|
||||
@@ -1,202 +0,0 @@
|
||||
From dd29d3d05631c4afdab56fb696424565a4afefba Mon Sep 17 00:00:00 2001
|
||||
From: Jonas Karlman <jonas@kwiboo.se>
|
||||
Date: Sun, 23 Dec 2018 02:24:38 +0100
|
||||
Subject: [PATCH 53/90] WIP: ASoC: hdmi-codec: reorder channel allocation list
|
||||
|
||||
Wrong channel allocation is selected by hdmi_codec_get_ch_alloc_table_idx().
|
||||
|
||||
E.g when ELD reports FL|FR|LFE|FC|RL|RR or FL|FR|LFE|FC|RL|RR|RC|RLC|RRC
|
||||
|
||||
ca_id 0x01 with speaker mask FL|FR|LFE gets selected instead of
|
||||
ca_id 0x03 with speaker mask FL|FR|LFE|FC for 4 channels
|
||||
|
||||
and
|
||||
|
||||
ca_id 0x04 with speaker mask FL|FR|RC gets selected instead of
|
||||
ca_id 0x0b with speaker mask FL|FR|LFE|FC|RL|RR for 6 channels
|
||||
|
||||
Fix this by reorder the channel allocation list with
|
||||
most specific speaker mask at the top.
|
||||
|
||||
Signed-off-by: Jonas Karlman <jonas@kwiboo.se>
|
||||
---
|
||||
sound/soc/codecs/hdmi-codec.c | 140 +++++++++++++++++++---------------
|
||||
1 file changed, 77 insertions(+), 63 deletions(-)
|
||||
|
||||
diff --git a/sound/soc/codecs/hdmi-codec.c b/sound/soc/codecs/hdmi-codec.c
|
||||
index b07607a9ecea..a12015471ea2 100644
|
||||
--- a/sound/soc/codecs/hdmi-codec.c
|
||||
+++ b/sound/soc/codecs/hdmi-codec.c
|
||||
@@ -188,84 +188,97 @@ static const struct snd_pcm_chmap_elem hdmi_codec_8ch_chmaps[] = {
|
||||
/*
|
||||
* hdmi_codec_channel_alloc: speaker configuration available for CEA
|
||||
*
|
||||
- * This is an ordered list that must match with hdmi_codec_8ch_chmaps struct
|
||||
+ * This is an ordered list where ca_id must exist in hdmi_codec_8ch_chmaps
|
||||
* The preceding ones have better chances to be selected by
|
||||
* hdmi_codec_get_ch_alloc_table_idx().
|
||||
*/
|
||||
static const struct hdmi_codec_cea_spk_alloc hdmi_codec_channel_alloc[] = {
|
||||
{ .ca_id = 0x00, .n_ch = 2,
|
||||
- .mask = FL | FR},
|
||||
- /* 2.1 */
|
||||
- { .ca_id = 0x01, .n_ch = 4,
|
||||
- .mask = FL | FR | LFE},
|
||||
- /* Dolby Surround */
|
||||
+ .mask = FL | FR },
|
||||
+ { .ca_id = 0x03, .n_ch = 4,
|
||||
+ .mask = FL | FR | LFE | FC },
|
||||
{ .ca_id = 0x02, .n_ch = 4,
|
||||
.mask = FL | FR | FC },
|
||||
- /* surround51 */
|
||||
+ { .ca_id = 0x01, .n_ch = 4,
|
||||
+ .mask = FL | FR | LFE },
|
||||
{ .ca_id = 0x0b, .n_ch = 6,
|
||||
- .mask = FL | FR | LFE | FC | RL | RR},
|
||||
- /* surround40 */
|
||||
- { .ca_id = 0x08, .n_ch = 6,
|
||||
- .mask = FL | FR | RL | RR },
|
||||
- /* surround41 */
|
||||
- { .ca_id = 0x09, .n_ch = 6,
|
||||
- .mask = FL | FR | LFE | RL | RR },
|
||||
- /* surround50 */
|
||||
+ .mask = FL | FR | LFE | FC | RL | RR },
|
||||
{ .ca_id = 0x0a, .n_ch = 6,
|
||||
.mask = FL | FR | FC | RL | RR },
|
||||
- /* 6.1 */
|
||||
- { .ca_id = 0x0f, .n_ch = 8,
|
||||
- .mask = FL | FR | LFE | FC | RL | RR | RC },
|
||||
- /* surround71 */
|
||||
+ { .ca_id = 0x09, .n_ch = 6,
|
||||
+ .mask = FL | FR | LFE | RL | RR },
|
||||
+ { .ca_id = 0x08, .n_ch = 6,
|
||||
+ .mask = FL | FR | RL | RR },
|
||||
+ { .ca_id = 0x07, .n_ch = 6,
|
||||
+ .mask = FL | FR | LFE | FC | RC },
|
||||
+ { .ca_id = 0x06, .n_ch = 6,
|
||||
+ .mask = FL | FR | FC | RC },
|
||||
+ { .ca_id = 0x05, .n_ch = 6,
|
||||
+ .mask = FL | FR | LFE | RC },
|
||||
+ { .ca_id = 0x04, .n_ch = 6,
|
||||
+ .mask = FL | FR | RC },
|
||||
{ .ca_id = 0x13, .n_ch = 8,
|
||||
.mask = FL | FR | LFE | FC | RL | RR | RLC | RRC },
|
||||
- /* others */
|
||||
- { .ca_id = 0x03, .n_ch = 8,
|
||||
- .mask = FL | FR | LFE | FC },
|
||||
- { .ca_id = 0x04, .n_ch = 8,
|
||||
- .mask = FL | FR | RC},
|
||||
- { .ca_id = 0x05, .n_ch = 8,
|
||||
- .mask = FL | FR | LFE | RC },
|
||||
- { .ca_id = 0x06, .n_ch = 8,
|
||||
- .mask = FL | FR | FC | RC },
|
||||
- { .ca_id = 0x07, .n_ch = 8,
|
||||
- .mask = FL | FR | LFE | FC | RC },
|
||||
- { .ca_id = 0x0c, .n_ch = 8,
|
||||
- .mask = FL | FR | RC | RL | RR },
|
||||
- { .ca_id = 0x0d, .n_ch = 8,
|
||||
- .mask = FL | FR | LFE | RL | RR | RC },
|
||||
- { .ca_id = 0x0e, .n_ch = 8,
|
||||
- .mask = FL | FR | FC | RL | RR | RC },
|
||||
- { .ca_id = 0x10, .n_ch = 8,
|
||||
- .mask = FL | FR | RL | RR | RLC | RRC },
|
||||
- { .ca_id = 0x11, .n_ch = 8,
|
||||
- .mask = FL | FR | LFE | RL | RR | RLC | RRC },
|
||||
+ { .ca_id = 0x1f, .n_ch = 8,
|
||||
+ .mask = FL | FR | LFE | FC | RL | RR | FLC | FRC },
|
||||
{ .ca_id = 0x12, .n_ch = 8,
|
||||
.mask = FL | FR | FC | RL | RR | RLC | RRC },
|
||||
- { .ca_id = 0x14, .n_ch = 8,
|
||||
- .mask = FL | FR | FLC | FRC },
|
||||
- { .ca_id = 0x15, .n_ch = 8,
|
||||
- .mask = FL | FR | LFE | FLC | FRC },
|
||||
- { .ca_id = 0x16, .n_ch = 8,
|
||||
- .mask = FL | FR | FC | FLC | FRC },
|
||||
- { .ca_id = 0x17, .n_ch = 8,
|
||||
- .mask = FL | FR | LFE | FC | FLC | FRC },
|
||||
- { .ca_id = 0x18, .n_ch = 8,
|
||||
- .mask = FL | FR | RC | FLC | FRC },
|
||||
- { .ca_id = 0x19, .n_ch = 8,
|
||||
- .mask = FL | FR | LFE | RC | FLC | FRC },
|
||||
- { .ca_id = 0x1a, .n_ch = 8,
|
||||
- .mask = FL | FR | RC | FC | FLC | FRC },
|
||||
- { .ca_id = 0x1b, .n_ch = 8,
|
||||
- .mask = FL | FR | LFE | RC | FC | FLC | FRC },
|
||||
- { .ca_id = 0x1c, .n_ch = 8,
|
||||
- .mask = FL | FR | RL | RR | FLC | FRC },
|
||||
- { .ca_id = 0x1d, .n_ch = 8,
|
||||
- .mask = FL | FR | LFE | RL | RR | FLC | FRC },
|
||||
{ .ca_id = 0x1e, .n_ch = 8,
|
||||
.mask = FL | FR | FC | RL | RR | FLC | FRC },
|
||||
- { .ca_id = 0x1f, .n_ch = 8,
|
||||
- .mask = FL | FR | LFE | FC | RL | RR | FLC | FRC },
|
||||
+ { .ca_id = 0x11, .n_ch = 8,
|
||||
+ .mask = FL | FR | LFE | RL | RR | RLC | RRC },
|
||||
+ { .ca_id = 0x1d, .n_ch = 8,
|
||||
+ .mask = FL | FR | LFE | RL | RR | FLC | FRC },
|
||||
+ { .ca_id = 0x10, .n_ch = 8,
|
||||
+ .mask = FL | FR | RL | RR | RLC | RRC },
|
||||
+ { .ca_id = 0x1c, .n_ch = 8,
|
||||
+ .mask = FL | FR | RL | RR | FLC | FRC },
|
||||
+ { .ca_id = 0x0f, .n_ch = 8,
|
||||
+ .mask = FL | FR | LFE | FC | RL | RR | RC },
|
||||
+ { .ca_id = 0x1b, .n_ch = 8,
|
||||
+ .mask = FL | FR | LFE | RC | FC | FLC | FRC },
|
||||
+ { .ca_id = 0x0e, .n_ch = 8,
|
||||
+ .mask = FL | FR | FC | RL | RR | RC },
|
||||
+ { .ca_id = 0x1a, .n_ch = 8,
|
||||
+ .mask = FL | FR | RC | FC | FLC | FRC },
|
||||
+ { .ca_id = 0x0d, .n_ch = 8,
|
||||
+ .mask = FL | FR | LFE | RL | RR | RC },
|
||||
+ { .ca_id = 0x19, .n_ch = 8,
|
||||
+ .mask = FL | FR | LFE | RC | FLC | FRC },
|
||||
+ { .ca_id = 0x0c, .n_ch = 8,
|
||||
+ .mask = FL | FR | RC | RL | RR },
|
||||
+ { .ca_id = 0x18, .n_ch = 8,
|
||||
+ .mask = FL | FR | RC | FLC | FRC },
|
||||
+ { .ca_id = 0x17, .n_ch = 8,
|
||||
+ .mask = FL | FR | LFE | FC | FLC | FRC },
|
||||
+ { .ca_id = 0x16, .n_ch = 8,
|
||||
+ .mask = FL | FR | FC | FLC | FRC },
|
||||
+ { .ca_id = 0x15, .n_ch = 8,
|
||||
+ .mask = FL | FR | LFE | FLC | FRC },
|
||||
+ { .ca_id = 0x14, .n_ch = 8,
|
||||
+ .mask = FL | FR | FLC | FRC },
|
||||
+ { .ca_id = 0x0b, .n_ch = 8,
|
||||
+ .mask = FL | FR | LFE | FC | RL | RR },
|
||||
+ { .ca_id = 0x0a, .n_ch = 8,
|
||||
+ .mask = FL | FR | FC | RL | RR },
|
||||
+ { .ca_id = 0x09, .n_ch = 8,
|
||||
+ .mask = FL | FR | LFE | RL | RR },
|
||||
+ { .ca_id = 0x08, .n_ch = 8,
|
||||
+ .mask = FL | FR | RL | RR },
|
||||
+ { .ca_id = 0x07, .n_ch = 8,
|
||||
+ .mask = FL | FR | LFE | FC | RC },
|
||||
+ { .ca_id = 0x06, .n_ch = 8,
|
||||
+ .mask = FL | FR | FC | RC },
|
||||
+ { .ca_id = 0x05, .n_ch = 8,
|
||||
+ .mask = FL | FR | LFE | RC },
|
||||
+ { .ca_id = 0x04, .n_ch = 8,
|
||||
+ .mask = FL | FR | RC },
|
||||
+ { .ca_id = 0x03, .n_ch = 8,
|
||||
+ .mask = FL | FR | LFE | FC },
|
||||
+ { .ca_id = 0x02, .n_ch = 8,
|
||||
+ .mask = FL | FR | FC },
|
||||
+ { .ca_id = 0x01, .n_ch = 8,
|
||||
+ .mask = FL | FR | LFE },
|
||||
};
|
||||
|
||||
struct hdmi_codec_priv {
|
||||
@@ -374,7 +387,8 @@ static int hdmi_codec_chmap_ctl_get(struct snd_kcontrol *kcontrol,
|
||||
struct snd_pcm_chmap *info = snd_kcontrol_chip(kcontrol);
|
||||
struct hdmi_codec_priv *hcp = info->private_data;
|
||||
|
||||
- map = info->chmap[hcp->chmap_idx].map;
|
||||
+ if (hcp->chmap_idx != HDMI_CODEC_CHMAP_IDX_UNKNOWN)
|
||||
+ map = info->chmap[hcp->chmap_idx].map;
|
||||
|
||||
for (i = 0; i < info->max_channels; i++) {
|
||||
if (hcp->chmap_idx == HDMI_CODEC_CHMAP_IDX_UNKNOWN)
|
||||
--
|
||||
2.35.1
|
||||
|
||||
@@ -1,141 +0,0 @@
|
||||
From 9f34f631a394fb13fbe5c4fca5e9ab3792d4c7d6 Mon Sep 17 00:00:00 2001
|
||||
From: Dongjin Kim <tobetter@gmail.com>
|
||||
Date: Wed, 30 Jun 2021 11:38:33 +0900
|
||||
Subject: [PATCH] ODROID-COMMON: hwmon: (pwm-fan): fix to add 'pwm1_enable' to
|
||||
set PWM fan mode
|
||||
|
||||
Change-Id: If0562f497703b8660206dad80d7933902bbf53e4
|
||||
---
|
||||
drivers/hwmon/pwm-fan.c | 67 +++++++++++++++++++++++++++++++++++++----
|
||||
1 file changed, 61 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/drivers/hwmon/pwm-fan.c b/drivers/hwmon/pwm-fan.c
|
||||
index f12b9a28a232..383a24316985 100644
|
||||
--- a/drivers/hwmon/pwm-fan.c
|
||||
+++ b/drivers/hwmon/pwm-fan.c
|
||||
@@ -8,6 +8,7 @@
|
||||
*/
|
||||
|
||||
#include <linux/hwmon.h>
|
||||
+#include <linux/hwmon-sysfs.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/mutex.h>
|
||||
@@ -44,6 +45,7 @@ struct pwm_fan_ctx {
|
||||
unsigned int pwm_fan_max_state;
|
||||
unsigned int *pwm_fan_cooling_levels;
|
||||
struct thermal_cooling_device *cdev;
|
||||
+ int enable;
|
||||
|
||||
struct hwmon_chip_info info;
|
||||
struct hwmon_channel_info fan_channel;
|
||||
@@ -99,6 +101,10 @@ static int __set_pwm(struct pwm_fan_ctx *ctx, unsigned long pwm)
|
||||
struct pwm_state *state = &ctx->pwm_state;
|
||||
|
||||
mutex_lock(&ctx->lock);
|
||||
+
|
||||
+ if (!ctx->enable)
|
||||
+ pwm = MAX_PWM;
|
||||
+
|
||||
if (ctx->pwm_value == pwm)
|
||||
goto exit_set_pwm_err;
|
||||
|
||||
@@ -183,6 +189,51 @@ static const struct hwmon_ops pwm_fan_hwmon_ops = {
|
||||
.write = pwm_fan_write,
|
||||
};
|
||||
|
||||
+static ssize_t enable_store(struct device *dev,
|
||||
+ struct device_attribute *attr,
|
||||
+ const char *buf, size_t count)
|
||||
+{
|
||||
+ struct pwm_fan_ctx *ctx = dev_get_drvdata(dev);
|
||||
+ int err;
|
||||
+ unsigned long val;
|
||||
+
|
||||
+ err = kstrtoul(buf, 10, &val);
|
||||
+ if (err)
|
||||
+ return err;
|
||||
+
|
||||
+ mutex_lock(&ctx->lock);
|
||||
+ ctx->enable = val;
|
||||
+ mutex_unlock(&ctx->lock);
|
||||
+
|
||||
+ err = __set_pwm(ctx, ctx->pwm_fan_cooling_levels[ctx->pwm_fan_state]);
|
||||
+
|
||||
+ return err ? err : count;
|
||||
+}
|
||||
+
|
||||
+static ssize_t enable_show(struct device *dev, struct device_attribute *attr,
|
||||
+ char *buf)
|
||||
+{
|
||||
+ struct pwm_fan_ctx *ctx = dev_get_drvdata(dev);
|
||||
+
|
||||
+ return sprintf(buf, "%u\n", ctx->enable);
|
||||
+}
|
||||
+
|
||||
+static SENSOR_DEVICE_ATTR_RW(pwm1_enable, enable, 0);
|
||||
+
|
||||
+static struct attribute *pwm_fan_attrs[] = {
|
||||
+ &sensor_dev_attr_pwm1_enable.dev_attr.attr,
|
||||
+ NULL,
|
||||
+};
|
||||
+
|
||||
+static const struct attribute_group pwm_fan_group = {
|
||||
+ .attrs = pwm_fan_attrs,
|
||||
+};
|
||||
+
|
||||
+static const struct attribute_group *pwm_fan_groups[] = {
|
||||
+ &pwm_fan_group,
|
||||
+ NULL,
|
||||
+};
|
||||
+
|
||||
/* thermal cooling device callbacks */
|
||||
static int pwm_fan_get_max_state(struct thermal_cooling_device *cdev,
|
||||
unsigned long *state)
|
||||
@@ -214,7 +265,7 @@ static int
|
||||
pwm_fan_set_cur_state(struct thermal_cooling_device *cdev, unsigned long state)
|
||||
{
|
||||
struct pwm_fan_ctx *ctx = cdev->devdata;
|
||||
- int ret;
|
||||
+ int ret = 0;
|
||||
|
||||
if (!ctx || (state > ctx->pwm_fan_max_state))
|
||||
return -EINVAL;
|
||||
@@ -222,10 +273,12 @@ pwm_fan_set_cur_state(struct thermal_cooling_device *cdev, unsigned long state)
|
||||
if (state == ctx->pwm_fan_state)
|
||||
return 0;
|
||||
|
||||
- ret = __set_pwm(ctx, ctx->pwm_fan_cooling_levels[state]);
|
||||
- if (ret) {
|
||||
- dev_err(&cdev->device, "Cannot set pwm!\n");
|
||||
- return ret;
|
||||
+ if (ctx->enable >= 2) {
|
||||
+ ret = __set_pwm(ctx, ctx->pwm_fan_cooling_levels[state]);
|
||||
+ if (ret) {
|
||||
+ dev_err(&cdev->device, "Cannot set pwm!\n");
|
||||
+ return ret;
|
||||
+ }
|
||||
}
|
||||
|
||||
ctx->pwm_fan_state = state;
|
||||
@@ -316,6 +369,8 @@ static int pwm_fan_probe(struct platform_device *pdev)
|
||||
if (IS_ERR(ctx->pwm))
|
||||
return dev_err_probe(dev, PTR_ERR(ctx->pwm), "Could not get PWM\n");
|
||||
|
||||
+ ctx->enable = 2;
|
||||
+
|
||||
platform_set_drvdata(pdev, ctx);
|
||||
|
||||
ctx->reg_en = devm_regulator_get_optional(dev, "fan");
|
||||
@@ -434,7 +489,7 @@ static int pwm_fan_probe(struct platform_device *pdev)
|
||||
ctx->info.info = channels;
|
||||
|
||||
hwmon = devm_hwmon_device_register_with_info(dev, "pwmfan",
|
||||
- ctx, &ctx->info, NULL);
|
||||
+ ctx, &ctx->info, pwm_fan_groups);
|
||||
if (IS_ERR(hwmon)) {
|
||||
dev_err(dev, "Failed to register hwmon device\n");
|
||||
return PTR_ERR(hwmon);
|
||||
--
|
||||
2.35.1
|
||||
|
||||
@@ -1,56 +0,0 @@
|
||||
From 4b6096bb3fd5bdc139a45e022e4a2380ea919dea Mon Sep 17 00:00:00 2001
|
||||
From: Christian Hewitt <christianshewitt@gmail.com>
|
||||
Date: Sat, 13 Apr 2019 05:41:51 +0000
|
||||
Subject: [PATCH 01/90] HACK: set meson-gx cma pool to 896MB
|
||||
|
||||
This change sets the CMA pool to a larger 896MB! value for vdec use
|
||||
|
||||
Signed-off-by: Christian Hewitt <christianshewitt@gmail.com>
|
||||
---
|
||||
arch/arm64/boot/dts/amlogic/meson-gx.dtsi | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/amlogic/meson-gx.dtsi b/arch/arm64/boot/dts/amlogic/meson-gx.dtsi
|
||||
index aa14ea017a61..99b8916e0c5d 100644
|
||||
--- a/arch/arm64/boot/dts/amlogic/meson-gx.dtsi
|
||||
+++ b/arch/arm64/boot/dts/amlogic/meson-gx.dtsi
|
||||
@@ -58,7 +58,7 @@ secmon_reserved_bl32: secmon@5300000 {
|
||||
linux,cma {
|
||||
compatible = "shared-dma-pool";
|
||||
reusable;
|
||||
- size = <0x0 0x10000000>;
|
||||
+ size = <0x0 0x38000000>;
|
||||
alignment = <0x0 0x400000>;
|
||||
linux,cma-default;
|
||||
};
|
||||
--
|
||||
2.35.1
|
||||
|
||||
From 18586e3d94827f63903c4cd596a0a06134261c00 Mon Sep 17 00:00:00 2001
|
||||
From: Christian Hewitt <christianshewitt@gmail.com>
|
||||
Date: Wed, 14 Aug 2019 19:58:14 +0000
|
||||
Subject: [PATCH 02/90] HACK: set meson-g12 cma pool to 896MB
|
||||
|
||||
This change sets the CMA pool to a larger 896MB! value for vdec use
|
||||
|
||||
Signed-off-by: Christian Hewitt <christianshewitt@gmail.com>
|
||||
---
|
||||
arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi b/arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi
|
||||
index f84d4b489e0b..04da23119ff1 100644
|
||||
--- a/arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi
|
||||
+++ b/arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi
|
||||
@@ -116,7 +116,7 @@ secmon_reserved_bl32: secmon@5300000 {
|
||||
linux,cma {
|
||||
compatible = "shared-dma-pool";
|
||||
reusable;
|
||||
- size = <0x0 0x10000000>;
|
||||
+ size = <0x0 0x38000000>;
|
||||
alignment = <0x0 0x400000>;
|
||||
linux,cma-default;
|
||||
};
|
||||
--
|
||||
2.35.1
|
||||
|
||||
@@ -1,637 +0,0 @@
|
||||
From b615e1a2ac4cc58734db101cd209aed0a11d2343 Mon Sep 17 00:00:00 2001
|
||||
From: Hyeonki Hong <hhk7734@gmail.com>
|
||||
Date: Thu, 5 Mar 2020 19:01:43 +0900
|
||||
Subject: [PATCH] ODROID-COMMON: input/touchscreen: Add D-WAV Multitouch
|
||||
driver.
|
||||
|
||||
Change-Id: Ia1c8c29d3f69c6ba5d630279c4cc98119b68ab71
|
||||
---
|
||||
drivers/hid/hid-ids.h | 6 +
|
||||
drivers/hid/hid-quirks.c | 3 +
|
||||
drivers/input/touchscreen/Kconfig | 10 +
|
||||
drivers/input/touchscreen/Makefile | 1 +
|
||||
drivers/input/touchscreen/dwav-usb-mt.c | 554 ++++++++++++++++++++++++
|
||||
5 files changed, 574 insertions(+)
|
||||
create mode 100644 drivers/input/touchscreen/dwav-usb-mt.c
|
||||
|
||||
diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h
|
||||
index a5a5a64c7abc..39c719033cd0 100644
|
||||
--- a/drivers/hid/hid-ids.h
|
||||
+++ b/drivers/hid/hid-ids.h
|
||||
@@ -1372,4 +1372,10 @@
|
||||
#define USB_VENDOR_ID_SIGNOTEC 0x2133
|
||||
#define USB_DEVICE_ID_SIGNOTEC_VIEWSONIC_PD1011 0x0018
|
||||
|
||||
+#define USB_DEVICE_ID_DWAV_MULTITOUCH 0x0005
|
||||
+
|
||||
+#define USB_VENDOR_ID_ODROID 0x16b4
|
||||
+#define USB_DEVICE_ID_VU5 0x0704
|
||||
+#define USB_DEVICE_ID_VU7PLUS 0x0705
|
||||
+
|
||||
#endif
|
||||
diff --git a/drivers/hid/hid-quirks.c b/drivers/hid/hid-quirks.c
|
||||
index ee7e504e7279..4d876faea391 100644
|
||||
--- a/drivers/hid/hid-quirks.c
|
||||
+++ b/drivers/hid/hid-quirks.c
|
||||
@@ -863,6 +863,9 @@ static const struct hid_device_id hid_ignore_list[] = {
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_SYNAPTICS, USB_DEVICE_ID_SYNAPTICS_DPAD) },
|
||||
#endif
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_YEALINK, USB_DEVICE_ID_YEALINK_P1K_P4K_B2K) },
|
||||
+
|
||||
+ { HID_USB_DEVICE(USB_VENDOR_ID_ODROID, USB_DEVICE_ID_VU5) },
|
||||
+ { HID_USB_DEVICE(USB_VENDOR_ID_ODROID, USB_DEVICE_ID_VU7PLUS) },
|
||||
{ }
|
||||
};
|
||||
|
||||
diff --git a/drivers/input/touchscreen/Kconfig b/drivers/input/touchscreen/Kconfig
|
||||
index 2f6adfb7b938..cec65479dc79 100644
|
||||
--- a/drivers/input/touchscreen/Kconfig
|
||||
+++ b/drivers/input/touchscreen/Kconfig
|
||||
@@ -1367,4 +1367,14 @@ config TOUCHSCREEN_ZINITIX
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called zinitix.
|
||||
|
||||
+config TOUCHSCREEN_DWAV_USB_MT
|
||||
+ tristate "D-WAV Scientific USB MultiTouch"
|
||||
+ depends on USB_ARCH_HAS_HCD
|
||||
+ select USB
|
||||
+ help
|
||||
+ Say Y here if you have a D-WAV Scientific USB(HID) based MultiTouch
|
||||
+ controller.
|
||||
+
|
||||
+ module will be called dwav-usb-mt.
|
||||
+
|
||||
endif
|
||||
diff --git a/drivers/input/touchscreen/Makefile b/drivers/input/touchscreen/Makefile
|
||||
index 39a8127cf6a5..f8bede5caafd 100644
|
||||
--- a/drivers/input/touchscreen/Makefile
|
||||
+++ b/drivers/input/touchscreen/Makefile
|
||||
@@ -115,3 +115,4 @@ obj-$(CONFIG_TOUCHSCREEN_ROHM_BU21023) += rohm_bu21023.o
|
||||
obj-$(CONFIG_TOUCHSCREEN_RASPBERRYPI_FW) += raspberrypi-ts.o
|
||||
obj-$(CONFIG_TOUCHSCREEN_IQS5XX) += iqs5xx.o
|
||||
obj-$(CONFIG_TOUCHSCREEN_ZINITIX) += zinitix.o
|
||||
+obj-$(CONFIG_TOUCHSCREEN_DWAV_USB_MT) += dwav-usb-mt.o
|
||||
diff --git a/drivers/input/touchscreen/dwav-usb-mt.c b/drivers/input/touchscreen/dwav-usb-mt.c
|
||||
new file mode 100644
|
||||
index 000000000000..7ec8b6dd15fd
|
||||
--- /dev/null
|
||||
+++ b/drivers/input/touchscreen/dwav-usb-mt.c
|
||||
@@ -0,0 +1,554 @@
|
||||
+// SPDX-License-Identifier: GPL-2.0+
|
||||
+/*
|
||||
+ * D-WAV Scientific USB(HID) MultiTouch Screen Driver(Based on usbtouchscreen.c)
|
||||
+ *
|
||||
+ * Copyright (C) Hardkernel, 2015
|
||||
+ */
|
||||
+
|
||||
+#include <linux/kernel.h>
|
||||
+#include <linux/slab.h>
|
||||
+#include <linux/input.h>
|
||||
+#include <linux/module.h>
|
||||
+#include <linux/init.h>
|
||||
+#include <linux/usb.h>
|
||||
+#include <linux/usb/input.h>
|
||||
+#include <linux/hid.h>
|
||||
+
|
||||
+#include <linux/input/mt.h>
|
||||
+
|
||||
+#define USB_VENDOR_ID_DWAV 0x0eef /* 800 x 480, 7" DWAV touch */
|
||||
+#define USB_DEVICE_ID_VU7 0x0005
|
||||
+
|
||||
+#define USB_VENDOR_ID_ODROID 0x16b4
|
||||
+#define USB_DEVICE_ID_VU5 0x0704
|
||||
+#define USB_DEVICE_ID_VU7PLUS 0x0705
|
||||
+
|
||||
+enum {
|
||||
+ ODROID_VU7 = 0, /* 800 x 480, 7" Touch */
|
||||
+ ODROID_VU5, /* 800 x 480, 5" Touch */
|
||||
+ ODROID_VU7PLUS, /* 1024 x 600, 7" Touch */
|
||||
+};
|
||||
+
|
||||
+struct usbtouch_device_info {
|
||||
+ char name[64];
|
||||
+ int max_x;
|
||||
+ int max_y;
|
||||
+ int max_press;
|
||||
+ int max_finger;
|
||||
+};
|
||||
+
|
||||
+const struct usbtouch_device_info DEV_INFO[] = {
|
||||
+ [ODROID_VU7] = {
|
||||
+ .name = "ODROID VU7 MultiTouch(800x480)",
|
||||
+ .max_x = 800,
|
||||
+ .max_y = 480,
|
||||
+ .max_press = 255,
|
||||
+ .max_finger = 5,
|
||||
+ },
|
||||
+ [ODROID_VU5] = {
|
||||
+ .name = "ODROID VU5 MultiTouch(800x480)",
|
||||
+ .max_x = 800,
|
||||
+ .max_y = 480,
|
||||
+ .max_press = 255,
|
||||
+ .max_finger = 5,
|
||||
+ },
|
||||
+ [ODROID_VU7PLUS] = {
|
||||
+ .name = "ODROID VU7 Plus MultiTouch(1024x600)",
|
||||
+ .max_x = 1024,
|
||||
+ .max_y = 600,
|
||||
+ .max_press = 255,
|
||||
+ .max_finger = 5,
|
||||
+ },
|
||||
+};
|
||||
+
|
||||
+static const struct usb_device_id dwav_usb_mt_devices[] = {
|
||||
+ {USB_DEVICE(USB_VENDOR_ID_DWAV, USB_DEVICE_ID_VU7),
|
||||
+ .driver_info = ODROID_VU7},
|
||||
+ {USB_DEVICE(USB_VENDOR_ID_ODROID, USB_DEVICE_ID_VU5),
|
||||
+ .driver_info = ODROID_VU5},
|
||||
+ {USB_DEVICE(USB_VENDOR_ID_ODROID, USB_DEVICE_ID_VU7PLUS),
|
||||
+ .driver_info = ODROID_VU7PLUS},
|
||||
+ {}
|
||||
+};
|
||||
+
|
||||
+struct dwav_raw { /* Total 25 bytes */
|
||||
+ unsigned char header; /* frame header 0xAA*/
|
||||
+ unsigned char press;
|
||||
+ /* Touch flag (1:valid touch data, 0:touch finished) */
|
||||
+ unsigned short x1; /* 1st x */
|
||||
+ unsigned short y1; /* 1st y */
|
||||
+ unsigned char end;
|
||||
+ /* 1st touch finish flags 0xBB, RPI only uses the first 7 bytes */
|
||||
+ unsigned char ids; /* touch ID(bit field) */
|
||||
+ unsigned short y2;
|
||||
+ unsigned short x2;
|
||||
+ unsigned short y3;
|
||||
+ unsigned short x3;
|
||||
+ unsigned short y4;
|
||||
+ unsigned short x4;
|
||||
+ unsigned short y5;
|
||||
+ unsigned short x5;
|
||||
+ unsigned char tail; /* frame end 0xCC */
|
||||
+};
|
||||
+
|
||||
+#define TS_EVENT_UNKNOWN 0x00
|
||||
+#define TS_EVENT_PRESS 0x01
|
||||
+#define TS_EVENT_RELEASE 0x02
|
||||
+
|
||||
+struct finger_t {
|
||||
+ unsigned int status; /* ts event type */
|
||||
+ unsigned int x; /* ts data x */
|
||||
+ unsigned int y; /* ts data y */
|
||||
+} __packed;
|
||||
+
|
||||
+struct dwav_usb_mt {
|
||||
+ char name[128], phys[64];
|
||||
+
|
||||
+ int dev_id;
|
||||
+ /* for URB Data DMA */
|
||||
+ dma_addr_t data_dma;
|
||||
+ unsigned char *data;
|
||||
+ int data_size;
|
||||
+
|
||||
+ struct urb *irq;
|
||||
+ struct usb_interface *interface;
|
||||
+ struct input_dev *input;
|
||||
+
|
||||
+ struct finger_t *finger;
|
||||
+};
|
||||
+
|
||||
+static void dwav_usb_mt_report(struct dwav_usb_mt *dwav_usb_mt)
|
||||
+{
|
||||
+ int id, max_x, max_y, max_press, max_finger;
|
||||
+
|
||||
+ max_x = DEV_INFO[dwav_usb_mt->dev_id].max_x;
|
||||
+ max_y = DEV_INFO[dwav_usb_mt->dev_id].max_y;
|
||||
+ max_press = DEV_INFO[dwav_usb_mt->dev_id].max_press;
|
||||
+ max_finger = DEV_INFO[dwav_usb_mt->dev_id].max_finger;
|
||||
+
|
||||
+ for (id = 0; id < max_finger; id++) {
|
||||
+
|
||||
+ if (dwav_usb_mt->finger[id].status == TS_EVENT_UNKNOWN)
|
||||
+ continue;
|
||||
+
|
||||
+ if (dwav_usb_mt->finger[id].x >= max_x ||
|
||||
+ dwav_usb_mt->finger[id].y >= max_y)
|
||||
+ continue;
|
||||
+
|
||||
+ input_mt_slot(dwav_usb_mt->input, id);
|
||||
+
|
||||
+ if (dwav_usb_mt->finger[id].status != TS_EVENT_RELEASE) {
|
||||
+ input_mt_report_slot_state(dwav_usb_mt->input,
|
||||
+ MT_TOOL_FINGER, true);
|
||||
+ input_report_abs(dwav_usb_mt->input,
|
||||
+ ABS_MT_POSITION_X,
|
||||
+ dwav_usb_mt->finger[id].x);
|
||||
+ input_report_abs(dwav_usb_mt->input,
|
||||
+ ABS_MT_POSITION_Y,
|
||||
+ dwav_usb_mt->finger[id].y);
|
||||
+ input_report_abs(dwav_usb_mt->input,
|
||||
+ ABS_MT_PRESSURE,
|
||||
+ max_press);
|
||||
+ } else {
|
||||
+ input_mt_report_slot_state(dwav_usb_mt->input,
|
||||
+ MT_TOOL_FINGER, false);
|
||||
+ dwav_usb_mt->finger[id].status = TS_EVENT_UNKNOWN;
|
||||
+ }
|
||||
+ input_mt_report_pointer_emulation(dwav_usb_mt->input, true);
|
||||
+ input_sync(dwav_usb_mt->input);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+static void dwav_usb_mt_process(struct dwav_usb_mt *dwav_usb_mt,
|
||||
+ unsigned char *pkt, int len)
|
||||
+{
|
||||
+ struct dwav_raw *dwav_raw = (struct dwav_raw *)pkt;
|
||||
+ unsigned char bit_mask, cnt;
|
||||
+
|
||||
+ for (cnt = 0, bit_mask = 0x01;
|
||||
+ cnt < DEV_INFO[dwav_usb_mt->dev_id].max_finger;
|
||||
+ cnt++, bit_mask <<= 1) {
|
||||
+ if ((dwav_raw->ids & bit_mask) && dwav_raw->press) {
|
||||
+ dwav_usb_mt->finger[cnt].status = TS_EVENT_PRESS;
|
||||
+ switch (cnt) {
|
||||
+ case 0:
|
||||
+ dwav_usb_mt->finger[cnt].x
|
||||
+ = cpu_to_be16(dwav_raw->x1);
|
||||
+ dwav_usb_mt->finger[cnt].y
|
||||
+ = cpu_to_be16(dwav_raw->y1);
|
||||
+ break;
|
||||
+ case 1:
|
||||
+ dwav_usb_mt->finger[cnt].x
|
||||
+ = cpu_to_be16(dwav_raw->x2);
|
||||
+ dwav_usb_mt->finger[cnt].y
|
||||
+ = cpu_to_be16(dwav_raw->y2);
|
||||
+ break;
|
||||
+ case 2:
|
||||
+ dwav_usb_mt->finger[cnt].x
|
||||
+ = cpu_to_be16(dwav_raw->x3);
|
||||
+ dwav_usb_mt->finger[cnt].y
|
||||
+ = cpu_to_be16(dwav_raw->y3);
|
||||
+ break;
|
||||
+ case 3:
|
||||
+ dwav_usb_mt->finger[cnt].x
|
||||
+ = cpu_to_be16(dwav_raw->x4);
|
||||
+ dwav_usb_mt->finger[cnt].y
|
||||
+ = cpu_to_be16(dwav_raw->y4);
|
||||
+ break;
|
||||
+ case 4:
|
||||
+ dwav_usb_mt->finger[cnt].x
|
||||
+ = cpu_to_be16(dwav_raw->x5);
|
||||
+ dwav_usb_mt->finger[cnt].y
|
||||
+ = cpu_to_be16(dwav_raw->y5);
|
||||
+ break;
|
||||
+ default:
|
||||
+ break;
|
||||
+ }
|
||||
+ } else {
|
||||
+ if (dwav_usb_mt->finger[cnt].status == TS_EVENT_PRESS)
|
||||
+ dwav_usb_mt->finger[cnt].status
|
||||
+ = TS_EVENT_RELEASE;
|
||||
+ else
|
||||
+ dwav_usb_mt->finger[cnt].status
|
||||
+ = TS_EVENT_UNKNOWN;
|
||||
+ }
|
||||
+ }
|
||||
+ dwav_usb_mt_report(dwav_usb_mt);
|
||||
+}
|
||||
+
|
||||
+static void dwav_usb_mt_irq(struct urb *urb)
|
||||
+{
|
||||
+ struct dwav_usb_mt *dwav_usb_mt = urb->context;
|
||||
+ struct device *dev = &dwav_usb_mt->interface->dev;
|
||||
+ int retval;
|
||||
+
|
||||
+ switch (urb->status) {
|
||||
+ case 0:
|
||||
+ /* success */
|
||||
+ break;
|
||||
+ case -ETIME:
|
||||
+ /* this urb is timing out */
|
||||
+ dev_dbg(dev, "%s - urb timed out - was the device unplugged?\n",
|
||||
+ __func__);
|
||||
+ return;
|
||||
+ case -ECONNRESET:
|
||||
+ case -ENOENT:
|
||||
+ case -ESHUTDOWN:
|
||||
+ case -EPIPE:
|
||||
+ /* this urb is terminated, clean up */
|
||||
+ dev_dbg(dev, "%s - urb shutting down with status: %d\n",
|
||||
+ __func__, urb->status);
|
||||
+ return;
|
||||
+ default:
|
||||
+ dev_dbg(dev, "%s - nonzero urb status received: %d\n",
|
||||
+ __func__, urb->status);
|
||||
+ goto exit;
|
||||
+ }
|
||||
+
|
||||
+ dwav_usb_mt_process(dwav_usb_mt, dwav_usb_mt->data, urb->actual_length);
|
||||
+
|
||||
+exit:
|
||||
+ usb_mark_last_busy(interface_to_usbdev(dwav_usb_mt->interface));
|
||||
+ retval = usb_submit_urb(urb, GFP_ATOMIC);
|
||||
+ if (retval) {
|
||||
+ dev_err(dev, "%s - usb_submit_urb failed with result: %d\n",
|
||||
+ __func__, retval);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+static int dwav_usb_mt_open(struct input_dev *input)
|
||||
+{
|
||||
+ struct dwav_usb_mt *dwav_usb_mt = input_get_drvdata(input);
|
||||
+ int r;
|
||||
+
|
||||
+ dwav_usb_mt->irq->dev = interface_to_usbdev(dwav_usb_mt->interface);
|
||||
+
|
||||
+ r = usb_autopm_get_interface(dwav_usb_mt->interface) ? -EIO : 0;
|
||||
+ if (r < 0)
|
||||
+ goto out;
|
||||
+
|
||||
+ if (usb_submit_urb(dwav_usb_mt->irq, GFP_KERNEL)) {
|
||||
+ r = -EIO;
|
||||
+ goto out_put;
|
||||
+ }
|
||||
+
|
||||
+ dwav_usb_mt->interface->needs_remote_wakeup = 1;
|
||||
+out_put:
|
||||
+ usb_autopm_put_interface(dwav_usb_mt->interface);
|
||||
+out:
|
||||
+ return r;
|
||||
+}
|
||||
+
|
||||
+static void dwav_usb_mt_close(struct input_dev *input)
|
||||
+{
|
||||
+ struct dwav_usb_mt *dwav_usb_mt = input_get_drvdata(input);
|
||||
+ int r;
|
||||
+
|
||||
+ usb_kill_urb(dwav_usb_mt->irq);
|
||||
+
|
||||
+ r = usb_autopm_get_interface(dwav_usb_mt->interface);
|
||||
+
|
||||
+ dwav_usb_mt->interface->needs_remote_wakeup = 0;
|
||||
+ if (!r)
|
||||
+ usb_autopm_put_interface(dwav_usb_mt->interface);
|
||||
+}
|
||||
+
|
||||
+static int dwav_usb_mt_suspend(struct usb_interface *intf, pm_message_t message)
|
||||
+{
|
||||
+ struct dwav_usb_mt *dwav_usb_mt = usb_get_intfdata(intf);
|
||||
+
|
||||
+ usb_kill_urb(dwav_usb_mt->irq);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int dwav_usb_mt_resume(struct usb_interface *intf)
|
||||
+{
|
||||
+ struct dwav_usb_mt *dwav_usb_mt = usb_get_intfdata(intf);
|
||||
+ struct input_dev *input = dwav_usb_mt->input;
|
||||
+ int result = 0;
|
||||
+
|
||||
+ mutex_lock(&input->mutex);
|
||||
+ if (input->users)
|
||||
+ result = usb_submit_urb(dwav_usb_mt->irq, GFP_NOIO);
|
||||
+ mutex_unlock(&input->mutex);
|
||||
+
|
||||
+ return result;
|
||||
+}
|
||||
+
|
||||
+static int dwav_usb_mt_reset_resume(struct usb_interface *intf)
|
||||
+{
|
||||
+ struct dwav_usb_mt *dwav_usb_mt = usb_get_intfdata(intf);
|
||||
+ struct input_dev *input = dwav_usb_mt->input;
|
||||
+ int err = 0;
|
||||
+
|
||||
+ /* restart IO if needed */
|
||||
+ mutex_lock(&input->mutex);
|
||||
+ if (input->users)
|
||||
+ err = usb_submit_urb(dwav_usb_mt->irq, GFP_NOIO);
|
||||
+ mutex_unlock(&input->mutex);
|
||||
+
|
||||
+ return err;
|
||||
+}
|
||||
+
|
||||
+static void dwav_usb_mt_free_buffers(struct usb_device *udev,
|
||||
+ struct dwav_usb_mt *dwav_usb_mt)
|
||||
+{
|
||||
+ usb_free_coherent(udev, dwav_usb_mt->data_size,
|
||||
+ dwav_usb_mt->data, dwav_usb_mt->data_dma);
|
||||
+}
|
||||
+
|
||||
+static struct usb_endpoint_descriptor *dwav_usb_mt_get_input_endpoint(
|
||||
+ struct usb_host_interface *interface)
|
||||
+{
|
||||
+ int i;
|
||||
+
|
||||
+ for (i = 0; i < interface->desc.bNumEndpoints; i++) {
|
||||
+ if (usb_endpoint_dir_in(&interface->endpoint[i].desc))
|
||||
+ return &interface->endpoint[i].desc;
|
||||
+ }
|
||||
+
|
||||
+ return NULL;
|
||||
+}
|
||||
+
|
||||
+static int dwav_usb_mt_init(struct dwav_usb_mt *dwav_usb_mt, void *dev)
|
||||
+{
|
||||
+ int err;
|
||||
+ struct input_dev *input_dev = (struct input_dev *)dev;
|
||||
+
|
||||
+ input_dev->name = dwav_usb_mt->name;
|
||||
+ input_dev->phys = dwav_usb_mt->phys;
|
||||
+
|
||||
+ input_set_drvdata(input_dev, dwav_usb_mt);
|
||||
+
|
||||
+ input_dev->open = dwav_usb_mt_open;
|
||||
+ input_dev->close = dwav_usb_mt_close;
|
||||
+
|
||||
+ input_dev->id.bustype = BUS_USB;
|
||||
+
|
||||
+ /* single touch */
|
||||
+ input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS);
|
||||
+ input_dev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH);
|
||||
+
|
||||
+ input_set_abs_params(input_dev, ABS_X, 0,
|
||||
+ DEV_INFO[dwav_usb_mt->dev_id].max_x, 0, 0);
|
||||
+ input_set_abs_params(input_dev, ABS_Y, 0,
|
||||
+ DEV_INFO[dwav_usb_mt->dev_id].max_y, 0, 0);
|
||||
+
|
||||
+ /* multi touch */
|
||||
+ input_set_abs_params(input_dev, ABS_MT_POSITION_X, 0,
|
||||
+ DEV_INFO[dwav_usb_mt->dev_id].max_x, 0, 0);
|
||||
+ input_set_abs_params(input_dev, ABS_MT_POSITION_Y, 0,
|
||||
+ DEV_INFO[dwav_usb_mt->dev_id].max_y, 0, 0);
|
||||
+ input_mt_init_slots(input_dev,
|
||||
+ DEV_INFO[dwav_usb_mt->dev_id].max_finger, 0);
|
||||
+
|
||||
+ err = input_register_device(input_dev);
|
||||
+ if (err) {
|
||||
+ pr_err("%s - input_register_device failed, err: %d\n",
|
||||
+ __func__, err);
|
||||
+ return err;
|
||||
+ }
|
||||
+
|
||||
+ dwav_usb_mt->input = input_dev;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int dwav_usb_mt_probe(struct usb_interface *intf,
|
||||
+ const struct usb_device_id *id)
|
||||
+{
|
||||
+ struct dwav_usb_mt *dwav_usb_mt = NULL;
|
||||
+ struct input_dev *input_dev = NULL;
|
||||
+ struct usb_endpoint_descriptor *endpoint;
|
||||
+ struct usb_device *udev = interface_to_usbdev(intf);
|
||||
+
|
||||
+ int err = 0;
|
||||
+
|
||||
+ endpoint = dwav_usb_mt_get_input_endpoint(intf->cur_altsetting);
|
||||
+ if (!endpoint)
|
||||
+ return -ENXIO;
|
||||
+
|
||||
+ dwav_usb_mt = kzalloc(sizeof(struct dwav_usb_mt), GFP_KERNEL);
|
||||
+ if (!dwav_usb_mt)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ dwav_usb_mt->dev_id = id->driver_info;
|
||||
+
|
||||
+ dwav_usb_mt->finger = kzalloc(sizeof(struct finger_t) *
|
||||
+ DEV_INFO[dwav_usb_mt->dev_id].max_finger,
|
||||
+ GFP_KERNEL);
|
||||
+
|
||||
+ if (!dwav_usb_mt->finger)
|
||||
+ goto err_free_mem;
|
||||
+
|
||||
+ input_dev = input_allocate_device();
|
||||
+ if (!input_dev)
|
||||
+ goto err_free_mem;
|
||||
+
|
||||
+ dwav_usb_mt->data_size = sizeof(struct dwav_raw);
|
||||
+ dwav_usb_mt->data = usb_alloc_coherent(udev, dwav_usb_mt->data_size,
|
||||
+ GFP_KERNEL, &dwav_usb_mt->data_dma);
|
||||
+ if (!dwav_usb_mt->data)
|
||||
+ goto err_free_mem;
|
||||
+
|
||||
+ dwav_usb_mt->irq = usb_alloc_urb(0, GFP_KERNEL);
|
||||
+ if (!dwav_usb_mt->irq) {
|
||||
+ dev_dbg(&intf->dev,
|
||||
+ "%s - usb_alloc_urb failed: usbtouch->irq\n",
|
||||
+ __func__);
|
||||
+ goto err_free_buffers;
|
||||
+ }
|
||||
+
|
||||
+ if (usb_endpoint_type(endpoint) == USB_ENDPOINT_XFER_INT) {
|
||||
+ usb_fill_int_urb(dwav_usb_mt->irq, udev,
|
||||
+ usb_rcvintpipe(udev, endpoint->bEndpointAddress),
|
||||
+ dwav_usb_mt->data, dwav_usb_mt->data_size,
|
||||
+ dwav_usb_mt_irq, dwav_usb_mt, endpoint->bInterval);
|
||||
+ } else {
|
||||
+ usb_fill_bulk_urb(dwav_usb_mt->irq, udev,
|
||||
+ usb_rcvbulkpipe(udev, endpoint->bEndpointAddress),
|
||||
+ dwav_usb_mt->data, dwav_usb_mt->data_size,
|
||||
+ dwav_usb_mt_irq, dwav_usb_mt);
|
||||
+ }
|
||||
+
|
||||
+ dwav_usb_mt->irq->dev = udev;
|
||||
+ dwav_usb_mt->irq->transfer_dma = dwav_usb_mt->data_dma;
|
||||
+ dwav_usb_mt->irq->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
|
||||
+
|
||||
+ dwav_usb_mt->interface = intf;
|
||||
+
|
||||
+ if (udev->manufacturer)
|
||||
+ strlcpy(dwav_usb_mt->name,
|
||||
+ udev->manufacturer, sizeof(dwav_usb_mt->name));
|
||||
+
|
||||
+ if (udev->product) {
|
||||
+ if (udev->manufacturer)
|
||||
+ strlcat(dwav_usb_mt->name,
|
||||
+ " ", sizeof(dwav_usb_mt->name));
|
||||
+
|
||||
+ strlcat(dwav_usb_mt->name,
|
||||
+ udev->product, sizeof(dwav_usb_mt->name));
|
||||
+ }
|
||||
+
|
||||
+ if (!strlen(dwav_usb_mt->name)) {
|
||||
+ snprintf(dwav_usb_mt->name, sizeof(dwav_usb_mt->name),
|
||||
+ "D-WAV Scientific MultiTouch %04x:%04x",
|
||||
+ le16_to_cpu(udev->descriptor.idVendor),
|
||||
+ le16_to_cpu(udev->descriptor.idProduct));
|
||||
+ }
|
||||
+
|
||||
+ usb_make_path(udev, dwav_usb_mt->phys, sizeof(dwav_usb_mt->phys));
|
||||
+ strlcat(dwav_usb_mt->phys, "/input0", sizeof(dwav_usb_mt->phys));
|
||||
+
|
||||
+ usb_to_input_id(udev, &input_dev->id);
|
||||
+
|
||||
+ input_dev->dev.parent = &intf->dev;
|
||||
+
|
||||
+ err = dwav_usb_mt_init(dwav_usb_mt, (void *)input_dev);
|
||||
+ if (err)
|
||||
+ goto err_free_urb;
|
||||
+
|
||||
+ usb_set_intfdata(intf, dwav_usb_mt);
|
||||
+
|
||||
+ dev_info(&intf->dev, "%s\n", DEV_INFO[dwav_usb_mt->dev_id].name);
|
||||
+
|
||||
+ return 0;
|
||||
+
|
||||
+err_free_urb:
|
||||
+ usb_free_urb(dwav_usb_mt->irq);
|
||||
+
|
||||
+err_free_buffers:
|
||||
+ dwav_usb_mt_free_buffers(udev, dwav_usb_mt);
|
||||
+
|
||||
+err_free_mem:
|
||||
+ if (input_dev)
|
||||
+ input_free_device(input_dev);
|
||||
+ kfree(dwav_usb_mt);
|
||||
+
|
||||
+ return err;
|
||||
+}
|
||||
+
|
||||
+static void dwav_usb_mt_disconnect(struct usb_interface *intf)
|
||||
+{
|
||||
+ struct dwav_usb_mt *dwav_usb_mt = usb_get_intfdata(intf);
|
||||
+
|
||||
+ if (!dwav_usb_mt)
|
||||
+ return;
|
||||
+
|
||||
+ dev_dbg(&intf->dev,
|
||||
+ "%s - dwav_usb_mt is initialized, cleaning up\n",
|
||||
+ __func__);
|
||||
+
|
||||
+ usb_set_intfdata(intf, NULL);
|
||||
+
|
||||
+ /* this will stop IO via close */
|
||||
+ input_unregister_device(dwav_usb_mt->input);
|
||||
+
|
||||
+ usb_free_urb(dwav_usb_mt->irq);
|
||||
+
|
||||
+ dwav_usb_mt_free_buffers(interface_to_usbdev(intf), dwav_usb_mt);
|
||||
+
|
||||
+ kfree(dwav_usb_mt);
|
||||
+}
|
||||
+
|
||||
+MODULE_DEVICE_TABLE(usb, dwav_usb_mt_devices);
|
||||
+
|
||||
+static struct usb_driver dwav_usb_mt_driver = {
|
||||
+ .name = "dwav_usb_mt",
|
||||
+ .probe = dwav_usb_mt_probe,
|
||||
+ .disconnect = dwav_usb_mt_disconnect,
|
||||
+ .suspend = dwav_usb_mt_suspend,
|
||||
+ .resume = dwav_usb_mt_resume,
|
||||
+ .reset_resume = dwav_usb_mt_reset_resume,
|
||||
+ .id_table = dwav_usb_mt_devices,
|
||||
+ .supports_autosuspend = 1,
|
||||
+};
|
||||
+
|
||||
+module_usb_driver(dwav_usb_mt_driver);
|
||||
+
|
||||
+MODULE_AUTHOR("Hardkernel Co.,Ltd");
|
||||
+MODULE_DESCRIPTION("D-WAV USB(HID) MultiTouch Driver");
|
||||
+MODULE_LICENSE("GPL");
|
||||
+
|
||||
+MODULE_ALIAS("dwav_usb_mt");
|
||||
\ No newline at end of file
|
||||
--
|
||||
2.35.1
|
||||
|
||||
@@ -1,16 +0,0 @@
|
||||
diff --git a/scripts/package/builddeb b/scripts/package/builddeb
|
||||
index 67cd420dcf89..e445d84b6cbc 100755
|
||||
--- a/scripts/package/builddeb
|
||||
+++ b/scripts/package/builddeb
|
||||
@@ -218,6 +218,11 @@ if [ "$ARCH" != "um" ]; then
|
||||
create_package linux-libc-dev debian/linux-libc-dev
|
||||
fi
|
||||
|
||||
+sed -e "s/exit 0//g" -i $tmpdir/DEBIAN/postinst
|
||||
+cat >> $tmpdir/DEBIAN/postinst <<EOT
|
||||
+mkimage -A arm64 -O linux -T kernel -C none -a 0x1080000 -e 0x1080000 -n "Linux" -d /$installed_image_path /boot/uImage > /dev/null 2>&1
|
||||
+exit 0
|
||||
+EOT
|
||||
create_package "$packagename" "$tmpdir"
|
||||
|
||||
if [ -n "$BUILD_DEBUG" ] ; then
|
||||
@@ -1,40 +0,0 @@
|
||||
From 03bfb3f6a703d7671508b698c5a552d0a0e0197b Mon Sep 17 00:00:00 2001
|
||||
From: Christian Hewitt <christianshewitt@gmail.com>
|
||||
Date: Tue, 7 Jan 2020 07:12:47 +0000
|
||||
Subject: [PATCH 055/101] HACK: media: cec: silence CEC timeout message
|
||||
|
||||
If testing with an AVR that does not pass-through CEC state the system
|
||||
log fills with timeout messages. Silence this to stop the log rotation
|
||||
and ensure other issues are visible.
|
||||
|
||||
[ 42.718009] cec-meson_ao_cec: message ff 84 50 00 01 timed out
|
||||
[ 45.021994] cec-meson_ao_cec: message ff 87 00 15 82 timed out
|
||||
[ 47.325965] cec-meson_ao_cec: message 10 timed out
|
||||
[ 49.630023] cec-meson_ao_cec: message 10 timed out
|
||||
[ 51.933960] cec-meson_ao_cec: message 10 timed out
|
||||
|
||||
Signed-off-by: Christian Hewitt <christianshewitt@gmail.com>
|
||||
---
|
||||
drivers/media/cec/core/cec-adap.c | 6 +++---
|
||||
1 file changed, 3 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/drivers/media/cec/core/cec-adap.c b/drivers/media/cec/core/cec-adap.c
|
||||
index 8bf91b5a7d0e..74a33366cc26 100644
|
||||
--- a/drivers/media/cec/core/cec-adap.c
|
||||
+++ b/drivers/media/cec/core/cec-adap.c
|
||||
@@ -501,9 +501,9 @@ int cec_thread_func(void *_adap)
|
||||
* default).
|
||||
*/
|
||||
if (adap->transmitting) {
|
||||
- pr_warn("cec-%s: message %*ph timed out\n", adap->name,
|
||||
- adap->transmitting->msg.len,
|
||||
- adap->transmitting->msg.msg);
|
||||
+ //pr_warn("cec-%s: message %*ph timed out\n", adap->name,
|
||||
+ // adap->transmitting->msg.len,
|
||||
+ // adap->transmitting->msg.msg);
|
||||
/* Just give up on this. */
|
||||
cec_data_cancel(adap->transmitting,
|
||||
CEC_TX_STATUS_TIMEOUT, 0);
|
||||
--
|
||||
2.17.1
|
||||
|
||||
@@ -1,38 +0,0 @@
|
||||
From 4d11a956070513a173dd9fd0d6e981918a6331e4 Mon Sep 17 00:00:00 2001
|
||||
From: Stefan Agner <stefan@agner.ch>
|
||||
Date: Wed, 15 Sep 2021 05:00:45 +0000
|
||||
Subject: [PATCH 11/90] HACK: of: partial revert of fdt.c changes
|
||||
|
||||
This resolves reports similar to the below which are present in dmesg
|
||||
since Linux 5.10; which are also causing crashes in some distros:
|
||||
|
||||
[ 0.000000] OF: fdt: Reserved memory: failed to reserve memory for node 'secmon@5000000': base 0x0000000005000000, size 3 MiB
|
||||
|
||||
Signed-off-by: Christian Hewitt <christianshewitt@gmail.com>
|
||||
---
|
||||
drivers/of/fdt.c | 9 ---------
|
||||
1 file changed, 9 deletions(-)
|
||||
|
||||
diff --git a/drivers/of/fdt.c b/drivers/of/fdt.c
|
||||
index ec315b060cd5..15e9c0c2a2c6 100644
|
||||
--- a/drivers/of/fdt.c
|
||||
+++ b/drivers/of/fdt.c
|
||||
@@ -481,15 +481,6 @@ static int __init early_init_dt_reserve_memory_arch(phys_addr_t base,
|
||||
phys_addr_t size, bool nomap)
|
||||
{
|
||||
if (nomap) {
|
||||
- /*
|
||||
- * If the memory is already reserved (by another region), we
|
||||
- * should not allow it to be marked nomap, but don't worry
|
||||
- * if the region isn't memory as it won't be mapped.
|
||||
- */
|
||||
- if (memblock_overlaps_region(&memblock.memory, base, size) &&
|
||||
- memblock_is_region_reserved(base, size))
|
||||
- return -EBUSY;
|
||||
-
|
||||
return memblock_mark_nomap(base, size);
|
||||
}
|
||||
return memblock_reserve(base, size);
|
||||
--
|
||||
2.35.1
|
||||
|
||||
@@ -1,233 +0,0 @@
|
||||
From 712edc341073c350a11658186609eafd292dbe8a Mon Sep 17 00:00:00 2001
|
||||
From: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
|
||||
Date: Sun, 3 Oct 2021 05:35:48 +0000
|
||||
Subject: [PATCH 27/90] FROMLIST(v1): ASoC: meson: aiu: Fix HDMI codec control
|
||||
selection
|
||||
|
||||
The HDMI controllers on Amlogic Meson SoCs which use the AIU
|
||||
audio-controller have two different audio format inputs:
|
||||
- I2S which is also the only configuration supported on GXBB, GXL and
|
||||
GXM SoCs since there's no SPDIF support in the DesignWare HDMI
|
||||
controller driver (at the time of writing this)
|
||||
- SPDIF can be used optionally, including pass-through formats
|
||||
|
||||
Switching between these requires us to set different registers:
|
||||
AIU_HDMI_CLK_DATA_CTRL[1:0] "HDMI_DATA_CLK_SEL":
|
||||
- 0x0 disables the HDMI output clock
|
||||
- 0x1 selects the PCM clock
|
||||
- 0x2 selects the AIU clock
|
||||
- 0x3 is reserved
|
||||
|
||||
AIU_HDMI_CLK_DATA_CTRL[5:4] "HDMI_DATA_SEL":
|
||||
- 0x0 outputs constant zero, disables HDMI data
|
||||
- 0x1 selects PCM data
|
||||
- 0x2 selects AIU I2S data
|
||||
- 0x3 is reserved
|
||||
|
||||
AIU_CLK_CTRL_MORE[6] "HDMITX_SEL_AOCLKX2":
|
||||
- 0x0 selects cts_i958 as AIU clk to hdmi_tx_audio_master_clk
|
||||
- 0x1 selects cts_aoclkx2_int as AIU clk to hdmi_tx_audio_master_clk
|
||||
|
||||
The Meson8/8b/8m2 vendor driver uses the following settings:
|
||||
SPDIF output to the HDMI controller:
|
||||
- 0x2 (AIU clock) in AIU_HDMI_CLK_DATA_CTRL[1:0]
|
||||
- 0x0 (no HDMI data) in AIU_HDMI_CLK_DATA_CTRL[5:4]
|
||||
- 0x0 (using cts_i958 as AIU clk) in AIU_CLK_CTRL_MORE[6]
|
||||
I2S output to the HDMI controller:
|
||||
- 0x2 (AIU clock) in AIU_HDMI_CLK_DATA_CTRL[1:0]
|
||||
- 0x2 (I2S data) in AIU_HDMI_CLK_DATA_CTRL[5:4]
|
||||
- 0x0 (using cts_aoclkx2_int as AIU clk) in AIU_CLK_CTRL_MORE[6]
|
||||
|
||||
The GXBB/GXL/GXM vendor driver uses the following settings:
|
||||
SPDIF output to the HDMI controller:
|
||||
- not setting AIU_HDMI_CLK_DATA_CTRL at all
|
||||
- 0x0 (using cts_i958 as AIU clk) in AIU_CLK_CTRL_MORE[6]
|
||||
I2S output to the HDMI controller:
|
||||
- 0x2 (AIU clock) in AIU_HDMI_CLK_DATA_CTRL[1:0]
|
||||
- 0x2 (I2S data) in AIU_HDMI_CLK_DATA_CTRL[5:4]
|
||||
- 0x0 (using cts_aoclkx2_int as AIU clk) in AIU_CLK_CTRL_MORE[6]
|
||||
|
||||
Set the three registers at the same time following what the vendor
|
||||
driver does on Meson8/8b/8m2 SoCs. This makes the SPDIF output to the
|
||||
HDMI controller work. The entries and order of the entries in the enum
|
||||
is not changed on purpose to not break old configurations.
|
||||
|
||||
Fixes: b82b734c0e9a7 ("ASoC: meson: aiu: add hdmi codec control support")
|
||||
Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
|
||||
---
|
||||
sound/soc/meson/aiu-codec-ctrl.c | 108 ++++++++++++++++++++++--------
|
||||
sound/soc/meson/aiu-encoder-i2s.c | 6 --
|
||||
2 files changed, 80 insertions(+), 34 deletions(-)
|
||||
|
||||
diff --git a/sound/soc/meson/aiu-codec-ctrl.c b/sound/soc/meson/aiu-codec-ctrl.c
|
||||
index c3ea733fce91..2b8575491aeb 100644
|
||||
--- a/sound/soc/meson/aiu-codec-ctrl.c
|
||||
+++ b/sound/soc/meson/aiu-codec-ctrl.c
|
||||
@@ -12,14 +12,60 @@
|
||||
#include "aiu.h"
|
||||
#include "meson-codec-glue.h"
|
||||
|
||||
-#define CTRL_CLK_SEL GENMASK(1, 0)
|
||||
-#define CTRL_DATA_SEL_SHIFT 4
|
||||
-#define CTRL_DATA_SEL (0x3 << CTRL_DATA_SEL_SHIFT)
|
||||
-
|
||||
-static const char * const aiu_codec_ctrl_mux_texts[] = {
|
||||
- "DISABLED", "PCM", "I2S",
|
||||
+#define AIU_HDMI_CLK_DATA_CTRL_CLK_SEL GENMASK(1, 0)
|
||||
+#define AIU_HDMI_CLK_DATA_CTRL_CLK_SEL_DISABLE 0x0
|
||||
+#define AIU_HDMI_CLK_DATA_CTRL_CLK_SEL_PCM 0x1
|
||||
+#define AIU_HDMI_CLK_DATA_CTRL_CLK_SEL_AIU 0x2
|
||||
+#define AIU_HDMI_CLK_DATA_CTRL_DATA_SEL GENMASK(5, 4)
|
||||
+#define AIU_HDMI_CLK_DATA_CTRL_DATA_SEL_OUTPUT_ZERO 0x0
|
||||
+#define AIU_HDMI_CLK_DATA_CTRL_DATA_SEL_PCM_DATA 0x1
|
||||
+#define AIU_HDMI_CLK_DATA_CTRL_DATA_SEL_I2S_DATA 0x2
|
||||
+
|
||||
+#define AIU_CLK_CTRL_MORE_AMCLK BIT(6)
|
||||
+
|
||||
+#define AIU_HDMI_CTRL_MUX_DISABLED 0
|
||||
+#define AIU_HDMI_CTRL_MUX_PCM 1
|
||||
+#define AIU_HDMI_CTRL_MUX_I2S 2
|
||||
+
|
||||
+static const char * const aiu_codec_hdmi_ctrl_mux_texts[] = {
|
||||
+ [AIU_HDMI_CTRL_MUX_DISABLED] = "DISABLED",
|
||||
+ [AIU_HDMI_CTRL_MUX_PCM] = "PCM",
|
||||
+ [AIU_HDMI_CTRL_MUX_I2S] = "I2S",
|
||||
};
|
||||
|
||||
+static int aiu_codec_ctrl_mux_get_enum(struct snd_kcontrol *kcontrol,
|
||||
+ struct snd_ctl_elem_value *ucontrol)
|
||||
+{
|
||||
+ struct snd_soc_component *component =
|
||||
+ snd_soc_dapm_kcontrol_component(kcontrol);
|
||||
+ unsigned int ctrl, more, mux = AIU_HDMI_CTRL_MUX_DISABLED;
|
||||
+
|
||||
+ ctrl = snd_soc_component_read(component, AIU_HDMI_CLK_DATA_CTRL);
|
||||
+ if (FIELD_GET(AIU_HDMI_CLK_DATA_CTRL_CLK_SEL, ctrl) !=
|
||||
+ AIU_HDMI_CLK_DATA_CTRL_CLK_SEL_AIU) {
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ more = snd_soc_component_read(component, AIU_CLK_CTRL_MORE);
|
||||
+ if (FIELD_GET(AIU_HDMI_CLK_DATA_CTRL_DATA_SEL, ctrl) ==
|
||||
+ AIU_HDMI_CLK_DATA_CTRL_DATA_SEL_I2S_DATA &&
|
||||
+ !!(more & AIU_CLK_CTRL_MORE_AMCLK)) {
|
||||
+ mux = AIU_HDMI_CTRL_MUX_I2S;
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ if (FIELD_GET(AIU_HDMI_CLK_DATA_CTRL_DATA_SEL, ctrl) ==
|
||||
+ AIU_HDMI_CLK_DATA_CTRL_DATA_SEL_OUTPUT_ZERO &&
|
||||
+ !(more & AIU_CLK_CTRL_MORE_AMCLK)) {
|
||||
+ mux = AIU_HDMI_CTRL_MUX_PCM;
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+out:
|
||||
+ ucontrol->value.enumerated.item[0] = mux;
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
static int aiu_codec_ctrl_mux_put_enum(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *ucontrol)
|
||||
{
|
||||
@@ -28,45 +74,51 @@ static int aiu_codec_ctrl_mux_put_enum(struct snd_kcontrol *kcontrol,
|
||||
struct snd_soc_dapm_context *dapm =
|
||||
snd_soc_dapm_kcontrol_dapm(kcontrol);
|
||||
struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
|
||||
- unsigned int mux, changed;
|
||||
+ unsigned int mux, ctrl, more;
|
||||
|
||||
mux = snd_soc_enum_item_to_val(e, ucontrol->value.enumerated.item[0]);
|
||||
- changed = snd_soc_component_test_bits(component, e->reg,
|
||||
- CTRL_DATA_SEL,
|
||||
- FIELD_PREP(CTRL_DATA_SEL, mux));
|
||||
|
||||
- if (!changed)
|
||||
- return 0;
|
||||
+ if (mux == AIU_HDMI_CTRL_MUX_I2S) {
|
||||
+ ctrl = FIELD_PREP(AIU_HDMI_CLK_DATA_CTRL_DATA_SEL,
|
||||
+ AIU_HDMI_CLK_DATA_CTRL_DATA_SEL_I2S_DATA);
|
||||
+ more = AIU_CLK_CTRL_MORE_AMCLK;
|
||||
+ } else {
|
||||
+ ctrl = FIELD_PREP(AIU_HDMI_CLK_DATA_CTRL_DATA_SEL,
|
||||
+ AIU_HDMI_CLK_DATA_CTRL_DATA_SEL_OUTPUT_ZERO);
|
||||
+ more = 0;
|
||||
+ }
|
||||
+
|
||||
+ if (mux == AIU_HDMI_CTRL_MUX_DISABLED) {
|
||||
+ ctrl |= FIELD_PREP(AIU_HDMI_CLK_DATA_CTRL_CLK_SEL,
|
||||
+ AIU_HDMI_CLK_DATA_CTRL_CLK_SEL_DISABLE);
|
||||
+ } else {
|
||||
+ ctrl |= FIELD_PREP(AIU_HDMI_CLK_DATA_CTRL_CLK_SEL,
|
||||
+ AIU_HDMI_CLK_DATA_CTRL_CLK_SEL_AIU);
|
||||
+ }
|
||||
|
||||
/* Force disconnect of the mux while updating */
|
||||
snd_soc_dapm_mux_update_power(dapm, kcontrol, 0, NULL, NULL);
|
||||
|
||||
- /* Reset the source first */
|
||||
- snd_soc_component_update_bits(component, e->reg,
|
||||
- CTRL_CLK_SEL |
|
||||
- CTRL_DATA_SEL,
|
||||
- FIELD_PREP(CTRL_CLK_SEL, 0) |
|
||||
- FIELD_PREP(CTRL_DATA_SEL, 0));
|
||||
+ snd_soc_component_update_bits(component, AIU_HDMI_CLK_DATA_CTRL,
|
||||
+ AIU_HDMI_CLK_DATA_CTRL_CLK_SEL |
|
||||
+ AIU_HDMI_CLK_DATA_CTRL_DATA_SEL,
|
||||
+ ctrl);
|
||||
|
||||
- /* Set the appropriate source */
|
||||
- snd_soc_component_update_bits(component, e->reg,
|
||||
- CTRL_CLK_SEL |
|
||||
- CTRL_DATA_SEL,
|
||||
- FIELD_PREP(CTRL_CLK_SEL, mux) |
|
||||
- FIELD_PREP(CTRL_DATA_SEL, mux));
|
||||
+ snd_soc_component_update_bits(component, AIU_CLK_CTRL_MORE,
|
||||
+ AIU_CLK_CTRL_MORE_AMCLK,
|
||||
+ more);
|
||||
|
||||
snd_soc_dapm_mux_update_power(dapm, kcontrol, mux, e, NULL);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
-static SOC_ENUM_SINGLE_DECL(aiu_hdmi_ctrl_mux_enum, AIU_HDMI_CLK_DATA_CTRL,
|
||||
- CTRL_DATA_SEL_SHIFT,
|
||||
- aiu_codec_ctrl_mux_texts);
|
||||
+static SOC_ENUM_SINGLE_VIRT_DECL(aiu_hdmi_ctrl_mux_enum,
|
||||
+ aiu_codec_hdmi_ctrl_mux_texts);
|
||||
|
||||
static const struct snd_kcontrol_new aiu_hdmi_ctrl_mux =
|
||||
SOC_DAPM_ENUM_EXT("HDMI Source", aiu_hdmi_ctrl_mux_enum,
|
||||
- snd_soc_dapm_get_enum_double,
|
||||
+ aiu_codec_ctrl_mux_get_enum,
|
||||
aiu_codec_ctrl_mux_put_enum);
|
||||
|
||||
static const struct snd_soc_dapm_widget aiu_hdmi_ctrl_widgets[] = {
|
||||
diff --git a/sound/soc/meson/aiu-encoder-i2s.c b/sound/soc/meson/aiu-encoder-i2s.c
|
||||
index 67729de41a73..88637deb2d7a 100644
|
||||
--- a/sound/soc/meson/aiu-encoder-i2s.c
|
||||
+++ b/sound/soc/meson/aiu-encoder-i2s.c
|
||||
@@ -23,7 +23,6 @@
|
||||
#define AIU_CLK_CTRL_AOCLK_INVERT BIT(6)
|
||||
#define AIU_CLK_CTRL_LRCLK_INVERT BIT(7)
|
||||
#define AIU_CLK_CTRL_LRCLK_SKEW GENMASK(9, 8)
|
||||
-#define AIU_CLK_CTRL_MORE_HDMI_AMCLK BIT(6)
|
||||
#define AIU_CLK_CTRL_MORE_I2S_DIV GENMASK(5, 0)
|
||||
#define AIU_CODEC_DAC_LRCLK_CTRL_DIV GENMASK(11, 0)
|
||||
|
||||
@@ -176,11 +175,6 @@ static int aiu_encoder_i2s_set_clocks(struct snd_soc_component *component,
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
- /* Make sure amclk is used for HDMI i2s as well */
|
||||
- snd_soc_component_update_bits(component, AIU_CLK_CTRL_MORE,
|
||||
- AIU_CLK_CTRL_MORE_HDMI_AMCLK,
|
||||
- AIU_CLK_CTRL_MORE_HDMI_AMCLK);
|
||||
-
|
||||
return 0;
|
||||
}
|
||||
|
||||
--
|
||||
2.35.1
|
||||
|
||||
@@ -1,35 +0,0 @@
|
||||
From b83c8168c58ccb96f92a4b6ecf1b8b7483fcced3 Mon Sep 17 00:00:00 2001
|
||||
From: Sergey Shtylyov <s.shtylyov@omp.ru>
|
||||
Date: Fri, 24 Dec 2021 06:09:57 +0000
|
||||
Subject: [PATCH 38/90] FROMLIST(v1): mmc: meson-gx: fix deferred probing
|
||||
|
||||
The driver overrides the error codes and IRQ0 returned by platform_get_irq()
|
||||
to -EINVAL, so if it returns -EPROBE_DEFER, the driver will fail the probe
|
||||
permanently instead of the deferred probing. Switch to propagating the error
|
||||
codes upstream. IRQ0 is no longer returned by platform_get_irq(), so we now
|
||||
can safely ignore it...
|
||||
|
||||
Fixes: cbcaac6d7dd2 ("mmc: meson-gx-mmc: Fix platform_get_irq's error checking")
|
||||
Signed-off-by: Sergey Shtylyov <s.shtylyov@omp.ru>
|
||||
---
|
||||
drivers/mmc/host/meson-gx-mmc.c | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/drivers/mmc/host/meson-gx-mmc.c b/drivers/mmc/host/meson-gx-mmc.c
|
||||
index 58ab9d90bc8b..1a11a4bf4d4f 100644
|
||||
--- a/drivers/mmc/host/meson-gx-mmc.c
|
||||
+++ b/drivers/mmc/host/meson-gx-mmc.c
|
||||
@@ -1183,8 +1183,8 @@ static int meson_mmc_probe(struct platform_device *pdev)
|
||||
}
|
||||
|
||||
host->irq = platform_get_irq(pdev, 0);
|
||||
- if (host->irq <= 0) {
|
||||
- ret = -EINVAL;
|
||||
+ if (host->irq < 0) {
|
||||
+ ret = host->irq;
|
||||
goto free_host;
|
||||
}
|
||||
|
||||
--
|
||||
2.35.1
|
||||
|
||||
@@ -1,59 +0,0 @@
|
||||
From 5c5664545a97520bbce591add5a7dbbea143b999 Mon Sep 17 00:00:00 2001
|
||||
From: Neil Armstrong <narmstrong@baylibre.com>
|
||||
Date: Thu, 14 Jan 2021 17:43:02 +0100
|
||||
Subject: [PATCH 54/90] WIP: mmc: meson-gx-mmc: set core clock phase to 270
|
||||
degrees for AXG compatible controllers
|
||||
|
||||
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
|
||||
---
|
||||
drivers/mmc/host/meson-gx-mmc.c | 6 +++++-
|
||||
1 file changed, 5 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/mmc/host/meson-gx-mmc.c b/drivers/mmc/host/meson-gx-mmc.c
|
||||
index 1a11a4bf4d4f..df60312a1765 100644
|
||||
--- a/drivers/mmc/host/meson-gx-mmc.c
|
||||
+++ b/drivers/mmc/host/meson-gx-mmc.c
|
||||
@@ -38,6 +38,7 @@
|
||||
#define CLK_RX_PHASE_MASK GENMASK(13, 12)
|
||||
#define CLK_PHASE_0 0
|
||||
#define CLK_PHASE_180 2
|
||||
+#define CLK_PHASE_270 3
|
||||
#define CLK_V2_TX_DELAY_MASK GENMASK(19, 16)
|
||||
#define CLK_V2_RX_DELAY_MASK GENMASK(23, 20)
|
||||
#define CLK_V2_ALWAYS_ON BIT(24)
|
||||
@@ -136,6 +137,7 @@ struct meson_mmc_data {
|
||||
unsigned int rx_delay_mask;
|
||||
unsigned int always_on;
|
||||
unsigned int adjust;
|
||||
+ unsigned int clk_core_phase;
|
||||
};
|
||||
|
||||
struct sd_emmc_desc {
|
||||
@@ -428,7 +430,7 @@ static int meson_mmc_clk_init(struct meson_host *host)
|
||||
/* init SD_EMMC_CLOCK to sane defaults w/min clock rate */
|
||||
clk_reg = CLK_ALWAYS_ON(host);
|
||||
clk_reg |= CLK_DIV_MASK;
|
||||
- clk_reg |= FIELD_PREP(CLK_CORE_PHASE_MASK, CLK_PHASE_180);
|
||||
+ clk_reg |= FIELD_PREP(CLK_CORE_PHASE_MASK, host->data->clk_core_phase);
|
||||
clk_reg |= FIELD_PREP(CLK_TX_PHASE_MASK, CLK_PHASE_0);
|
||||
clk_reg |= FIELD_PREP(CLK_RX_PHASE_MASK, CLK_PHASE_0);
|
||||
writel(clk_reg, host->regs + SD_EMMC_CLOCK);
|
||||
@@ -1337,6 +1339,7 @@ static const struct meson_mmc_data meson_gx_data = {
|
||||
.rx_delay_mask = CLK_V2_RX_DELAY_MASK,
|
||||
.always_on = CLK_V2_ALWAYS_ON,
|
||||
.adjust = SD_EMMC_ADJUST,
|
||||
+ .clk_core_phase = CLK_PHASE_180,
|
||||
};
|
||||
|
||||
static const struct meson_mmc_data meson_axg_data = {
|
||||
@@ -1344,6 +1347,7 @@ static const struct meson_mmc_data meson_axg_data = {
|
||||
.rx_delay_mask = CLK_V3_RX_DELAY_MASK,
|
||||
.always_on = CLK_V3_ALWAYS_ON,
|
||||
.adjust = SD_EMMC_V3_ADJUST,
|
||||
+ .clk_core_phase = CLK_PHASE_270,
|
||||
};
|
||||
|
||||
static const struct of_device_id meson_mmc_of_match[] = {
|
||||
--
|
||||
2.35.1
|
||||
|
||||
@@ -1,109 +0,0 @@
|
||||
From 3774482f10291d3cbd6b22514f976edc8732759e Mon Sep 17 00:00:00 2001
|
||||
From: Vyacheslav Bocharov <adeep@lexina.in>
|
||||
Date: Mon, 7 Nov 2022 16:19:08 +0300
|
||||
Subject: [PATCH 1/3] arm64: amlogic: mmc: meson-gx: Add core, tx, rx
|
||||
eMMC/SD/SDIO phase clock settings from devicetree data
|
||||
|
||||
The mmc driver has the same phase values for all meson platforms. However,
|
||||
some platforms (and even some boards) require different values. This patch
|
||||
transfers the values from the set in the code to the variables in the
|
||||
device-tree file.
|
||||
|
||||
Signed-off-by: Vyacheslav Bocharov <adeep@lexina.in>
|
||||
---
|
||||
drivers/mmc/host/meson-gx-mmc.c | 19 +++++++++-----
|
||||
include/dt-bindings/mmc/meson-gx-mmc.h | 35 ++++++++++++++++++++++++++
|
||||
2 files changed, 48 insertions(+), 6 deletions(-)
|
||||
create mode 100644 include/dt-bindings/mmc/meson-gx-mmc.h
|
||||
|
||||
diff --git a/drivers/mmc/host/meson-gx-mmc.c b/drivers/mmc/host/meson-gx-mmc.c
|
||||
index fc462995cf94..4fb09cfaa60f 100644
|
||||
--- a/drivers/mmc/host/meson-gx-mmc.c
|
||||
+++ b/drivers/mmc/host/meson-gx-mmc.c
|
||||
@@ -27,6 +27,7 @@
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/bitfield.h>
|
||||
#include <linux/pinctrl/consumer.h>
|
||||
+#include <dt-bindings/mmc/meson-gx-mmc.h>
|
||||
|
||||
#define DRIVER_NAME "meson-gx-mmc"
|
||||
|
||||
@@ -36,8 +37,6 @@
|
||||
#define CLK_CORE_PHASE_MASK GENMASK(9, 8)
|
||||
#define CLK_TX_PHASE_MASK GENMASK(11, 10)
|
||||
#define CLK_RX_PHASE_MASK GENMASK(13, 12)
|
||||
-#define CLK_PHASE_0 0
|
||||
-#define CLK_PHASE_180 2
|
||||
#define CLK_V2_TX_DELAY_MASK GENMASK(19, 16)
|
||||
#define CLK_V2_RX_DELAY_MASK GENMASK(23, 20)
|
||||
#define CLK_V2_ALWAYS_ON BIT(24)
|
||||
@@ -424,13 +423,21 @@ static int meson_mmc_clk_init(struct meson_host *host)
|
||||
const char *mux_parent_names[MUX_CLK_NUM_PARENTS];
|
||||
const char *clk_parent[1];
|
||||
u32 clk_reg;
|
||||
-
|
||||
+ u32 phase[3]; // <core_phase, tx_phase, rx_phase>
|
||||
+
|
||||
+ if (!(host->dev && host->dev->of_node) || (device_property_read_u32_array(host->dev,
|
||||
+ "amlogic,mmc-phase", phase, 3) < 0)) {
|
||||
+ dev_dbg(host->dev, "get amlogic,mmc-phase failed, use default phase settings\n");
|
||||
+ phase[0] = CLK_PHASE_180;
|
||||
+ phase[1] = CLK_PHASE_0;
|
||||
+ phase[2] = CLK_PHASE_0;
|
||||
+ }
|
||||
/* init SD_EMMC_CLOCK to sane defaults w/min clock rate */
|
||||
clk_reg = CLK_ALWAYS_ON(host);
|
||||
clk_reg |= CLK_DIV_MASK;
|
||||
- clk_reg |= FIELD_PREP(CLK_CORE_PHASE_MASK, CLK_PHASE_180);
|
||||
- clk_reg |= FIELD_PREP(CLK_TX_PHASE_MASK, CLK_PHASE_0);
|
||||
- clk_reg |= FIELD_PREP(CLK_RX_PHASE_MASK, CLK_PHASE_0);
|
||||
+ clk_reg |= FIELD_PREP(CLK_CORE_PHASE_MASK, phase[0]);
|
||||
+ clk_reg |= FIELD_PREP(CLK_TX_PHASE_MASK, phase[1]);
|
||||
+ clk_reg |= FIELD_PREP(CLK_RX_PHASE_MASK, phase[2]);
|
||||
writel(clk_reg, host->regs + SD_EMMC_CLOCK);
|
||||
|
||||
/* get the mux parents */
|
||||
diff --git a/include/dt-bindings/mmc/meson-gx-mmc.h b/include/dt-bindings/mmc/meson-gx-mmc.h
|
||||
new file mode 100644
|
||||
index 000000000000..cfc4a9d75b2b
|
||||
--- /dev/null
|
||||
+++ b/include/dt-bindings/mmc/meson-gx-mmc.h
|
||||
@@ -0,0 +1,35 @@
|
||||
+/* SPDX-License-Identifier: (GPL-2.0+ or MIT) */
|
||||
+/*
|
||||
+ * Copyright (c) 2022 Vyacheslav Bocharov
|
||||
+ * Author: Vyacheslav Bocharov <adeep@lexina.in>
|
||||
+ */
|
||||
+
|
||||
+#ifndef _DT_BINDINGS_MESON_GX_MMC_H
|
||||
+#define _DT_BINDINGS_MESON_GX_MMC_H
|
||||
+
|
||||
+/*
|
||||
+ * Cfg_rx_phase: RX clock phase
|
||||
+ * bits: 9:8 R/W
|
||||
+ * default: 0
|
||||
+ * Recommended value: 0
|
||||
+ *
|
||||
+ * Cfg_tx_phase: TX clock phase
|
||||
+ * bits: 9:8 R/W
|
||||
+ * default: 0
|
||||
+ * Recommended value: 2
|
||||
+ *
|
||||
+ * Cfg_co_phase: Core clock phase
|
||||
+ * bits: 9:8 R/W
|
||||
+ * default: 0
|
||||
+ * Recommended value: 2
|
||||
+ *
|
||||
+ * values: 0: 0 phase, 1: 90 phase, 2: 180 phase, 3: 270 phase.
|
||||
+ */
|
||||
+
|
||||
+#define CLK_PHASE_0 0
|
||||
+#define CLK_PHASE_90 1
|
||||
+#define CLK_PHASE_180 2
|
||||
+#define CLK_PHASE_270 3
|
||||
+
|
||||
+
|
||||
+#endif
|
||||
--
|
||||
2.30.2
|
||||
|
||||
@@ -1,44 +0,0 @@
|
||||
From facd1f172280739e8342fa6418755f62c76a01ce Mon Sep 17 00:00:00 2001
|
||||
From: Vyacheslav Bocharov <adeep@lexina.in>
|
||||
Date: Mon, 7 Nov 2022 16:19:08 +0300
|
||||
Subject: [PATCH 2/3] arm64: amlogic: dts: meson: update meson-axg device-tree
|
||||
for new core, tx, rx phase clock settings.
|
||||
|
||||
Use phase 270 for core MMC clock on axg meson boards.
|
||||
|
||||
Signed-off-by: Vyacheslav Bocharov <adeep@lexina.in>
|
||||
---
|
||||
arch/arm64/boot/dts/amlogic/meson-axg.dtsi | 3 +++
|
||||
1 file changed, 3 insertions(+)
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/amlogic/meson-axg.dtsi b/arch/arm64/boot/dts/amlogic/meson-axg.dtsi
|
||||
index 04f797b5a012..0af4784d84c7 100644
|
||||
--- a/arch/arm64/boot/dts/amlogic/meson-axg.dtsi
|
||||
+++ b/arch/arm64/boot/dts/amlogic/meson-axg.dtsi
|
||||
@@ -13,6 +13,7 @@
|
||||
#include <dt-bindings/reset/amlogic,meson-axg-audio-arb.h>
|
||||
#include <dt-bindings/reset/amlogic,meson-axg-reset.h>
|
||||
#include <dt-bindings/power/meson-axg-power.h>
|
||||
+#include <dt-bindings/mmc/meson-gx-mmc.h>
|
||||
|
||||
/ {
|
||||
compatible = "amlogic,meson-axg";
|
||||
@@ -1891,6 +1892,7 @@ sd_emmc_b: sd@5000 {
|
||||
<&clkc CLKID_SD_EMMC_B_CLK0>,
|
||||
<&clkc CLKID_FCLK_DIV2>;
|
||||
clock-names = "core", "clkin0", "clkin1";
|
||||
+ amlogic,mmc-phase = <CLK_PHASE_270 CLK_PHASE_0 CLK_PHASE_0>;
|
||||
resets = <&reset RESET_SD_EMMC_B>;
|
||||
};
|
||||
|
||||
@@ -1904,6 +1906,7 @@ sd_emmc_c: mmc@7000 {
|
||||
<&clkc CLKID_FCLK_DIV2>;
|
||||
clock-names = "core", "clkin0", "clkin1";
|
||||
resets = <&reset RESET_SD_EMMC_C>;
|
||||
+ amlogic,mmc-phase = <CLK_PHASE_270 CLK_PHASE_0 CLK_PHASE_0>;
|
||||
};
|
||||
|
||||
usb2_phy1: phy@9020 {
|
||||
--
|
||||
2.30.2
|
||||
|
||||
@@ -1,45 +0,0 @@
|
||||
From 74f23d8b8f7e1284689597961dde9a7d25774d2e Mon Sep 17 00:00:00 2001
|
||||
From: Vyacheslav Bocharov <adeep@lexina.in>
|
||||
Date: Thu, 10 Nov 2022 14:52:47 +0300
|
||||
Subject: [PATCH 3/3] arm64: dts: docs: Update mmc meson-gx documentation for
|
||||
new config option amlogic,mmc-phase
|
||||
|
||||
- amlogic,mmc-phases: 3-element array of clock phases for core, tx, rx
|
||||
clock with values:
|
||||
0: CLK_PHASE_0 - 0 phase
|
||||
1: CLK_PHASE_90 - 90 phase
|
||||
2: CLK_PHASE_180 - 180 phase
|
||||
3: CLK_PHASE_270 - 270 phase
|
||||
By default driver use <CLK_PHASE_180 CLK_PHASE_0 CLK_PHASE_0> value.
|
||||
|
||||
Signed-off-by: Vyacheslav Bocharov <adeep@lexina.in>
|
||||
---
|
||||
Documentation/devicetree/bindings/mmc/amlogic,meson-gx.txt | 7 +++++++
|
||||
1 file changed, 7 insertions(+)
|
||||
|
||||
diff --git a/Documentation/devicetree/bindings/mmc/amlogic,meson-gx.txt b/Documentation/devicetree/bindings/mmc/amlogic,meson-gx.txt
|
||||
index ccc5358db131..98c89c5b3455 100644
|
||||
--- a/Documentation/devicetree/bindings/mmc/amlogic,meson-gx.txt
|
||||
+++ b/Documentation/devicetree/bindings/mmc/amlogic,meson-gx.txt
|
||||
@@ -25,6 +25,12 @@ Required properties:
|
||||
Optional properties:
|
||||
- amlogic,dram-access-quirk: set when controller's internal DMA engine cannot access the
|
||||
DRAM memory, like on the G12A dedicated SDIO controller.
|
||||
+- amlogic,mmc-phases: 3-element array of clock phases for core, tx, rx clock with values:
|
||||
+ 0: CLK_PHASE_0 - 0 phase
|
||||
+ 1: CLK_PHASE_90 - 90 phase
|
||||
+ 2: CLK_PHASE_180 - 180 phase
|
||||
+ 3: CLK_PHASE_270 - 270 phase
|
||||
+ By default driver use <CLK_PHASE_180 CLK_PHASE_0 CLK_PHASE_0> value.
|
||||
|
||||
Example:
|
||||
|
||||
@@ -36,4 +42,5 @@ Example:
|
||||
clock-names = "core", "clkin0", "clkin1";
|
||||
pinctrl-0 = <&emmc_pins>;
|
||||
resets = <&reset RESET_SD_EMMC_A>;
|
||||
+ amlogic,mmc-phases = <CLK_PHASE_180 CLK_PHASE_0 CLK_PHASE_0>;
|
||||
};
|
||||
--
|
||||
2.30.2
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,157 +0,0 @@
|
||||
From a9f750c672c4c1238cccd1d8d76a138a5602d035 Mon Sep 17 00:00:00 2001
|
||||
From: benjamin545 <benjamin545@gmail.com>
|
||||
Date: Mon, 2 Aug 2021 15:18:40 -0400
|
||||
Subject: [PATCH 65/90] WIP: drivers: meson: vdec: add handling to HEVC decoder
|
||||
to show frames when ready
|
||||
|
||||
..rather than when no longer referenced
|
||||
|
||||
the HEVC decode driver would not show the next frame until it was no longer referenced,
|
||||
this would cause a backup of frames that were ready to render but held up by one or more
|
||||
frames that were still referenced. The decoded picture buffer would fill up and stall
|
||||
playback as no new frames could be placed in the decoded picture buffer.
|
||||
---
|
||||
drivers/staging/media/meson/vdec/codec_hevc.c | 52 ++++++++++++-------
|
||||
1 file changed, 34 insertions(+), 18 deletions(-)
|
||||
|
||||
diff --git a/drivers/staging/media/meson/vdec/codec_hevc.c b/drivers/staging/media/meson/vdec/codec_hevc.c
|
||||
index 3a6fd04a2d33..01218efde99b 100644
|
||||
--- a/drivers/staging/media/meson/vdec/codec_hevc.c
|
||||
+++ b/drivers/staging/media/meson/vdec/codec_hevc.c
|
||||
@@ -223,6 +223,7 @@ struct hevc_frame {
|
||||
u32 poc;
|
||||
|
||||
int referenced;
|
||||
+ int show;
|
||||
u32 num_reorder_pic;
|
||||
|
||||
u32 cur_slice_idx;
|
||||
@@ -448,9 +449,11 @@ static void codec_hevc_update_referenced(struct codec_hevc *hevc)
|
||||
((1 << (RPS_USED_BIT - 1)) - 1);
|
||||
if (param->p.CUR_RPS[i] & (1 << (RPS_USED_BIT - 1))) {
|
||||
poc_tmp = curr_poc -
|
||||
- ((1 << (RPS_USED_BIT - 1)) - delt);
|
||||
- } else
|
||||
+ ((1 << (RPS_USED_BIT - 1)) - delt);
|
||||
+ } else {
|
||||
poc_tmp = curr_poc + delt;
|
||||
+ }
|
||||
+
|
||||
if (poc_tmp == frame->poc) {
|
||||
is_referenced = 1;
|
||||
break;
|
||||
@@ -462,13 +465,13 @@ static void codec_hevc_update_referenced(struct codec_hevc *hevc)
|
||||
}
|
||||
|
||||
static struct hevc_frame *
|
||||
-codec_hevc_get_lowest_poc_frame(struct codec_hevc *hevc)
|
||||
+codec_hevc_get_next_ready_frame(struct codec_hevc *hevc)
|
||||
{
|
||||
struct hevc_frame *tmp, *ret = NULL;
|
||||
u32 poc = INT_MAX;
|
||||
|
||||
list_for_each_entry(tmp, &hevc->ref_frames_list, list) {
|
||||
- if (tmp->poc < poc) {
|
||||
+ if ((tmp->poc < poc) && tmp->show) {
|
||||
ret = tmp;
|
||||
poc = tmp->poc;
|
||||
}
|
||||
@@ -478,28 +481,35 @@ codec_hevc_get_lowest_poc_frame(struct codec_hevc *hevc)
|
||||
}
|
||||
|
||||
/* Try to output as many frames as possible */
|
||||
-static void codec_hevc_output_frames(struct amvdec_session *sess)
|
||||
+static void codec_hevc_show_frames(struct amvdec_session *sess)
|
||||
{
|
||||
- struct hevc_frame *tmp;
|
||||
+ struct hevc_frame *tmp, *n;
|
||||
struct codec_hevc *hevc = sess->priv;
|
||||
|
||||
- while ((tmp = codec_hevc_get_lowest_poc_frame(hevc))) {
|
||||
+ while ((tmp = codec_hevc_get_next_ready_frame(hevc))) {
|
||||
if (hevc->curr_poc &&
|
||||
- (tmp->referenced ||
|
||||
- tmp->num_reorder_pic >= hevc->frames_num))
|
||||
+ (hevc->frames_num <= tmp->num_reorder_pic))
|
||||
break;
|
||||
|
||||
dev_dbg(sess->core->dev, "DONE frame poc %u; vbuf %u\n",
|
||||
tmp->poc, tmp->vbuf->vb2_buf.index);
|
||||
amvdec_dst_buf_done_offset(sess, tmp->vbuf, tmp->offset,
|
||||
V4L2_FIELD_NONE, false);
|
||||
+
|
||||
+ tmp->show = 0;
|
||||
+ hevc->frames_num--;
|
||||
+ }
|
||||
+
|
||||
+ /* clean output frame buffer */
|
||||
+ list_for_each_entry_safe(tmp, n, &hevc->ref_frames_list, list) {
|
||||
+ if (tmp->referenced || tmp->show)
|
||||
+ continue;
|
||||
+
|
||||
list_del(&tmp->list);
|
||||
kfree(tmp);
|
||||
- hevc->frames_num--;
|
||||
}
|
||||
}
|
||||
|
||||
-
|
||||
static int
|
||||
codec_hevc_setup_workspace(struct amvdec_session *sess,
|
||||
struct codec_hevc *hevc)
|
||||
@@ -650,14 +660,17 @@ static int codec_hevc_start(struct amvdec_session *sess)
|
||||
static void codec_hevc_flush_output(struct amvdec_session *sess)
|
||||
{
|
||||
struct codec_hevc *hevc = sess->priv;
|
||||
- struct hevc_frame *tmp;
|
||||
+ struct hevc_frame *tmp, *n;
|
||||
|
||||
- while (!list_empty(&hevc->ref_frames_list)) {
|
||||
- tmp = codec_hevc_get_lowest_poc_frame(hevc);
|
||||
+ while ((tmp = codec_hevc_get_next_ready_frame(hevc))) {
|
||||
amvdec_dst_buf_done(sess, tmp->vbuf, V4L2_FIELD_NONE);
|
||||
+ tmp->show = 0;
|
||||
+ hevc->frames_num--;
|
||||
+ }
|
||||
+
|
||||
+ list_for_each_entry_safe(tmp, n, &hevc->ref_frames_list, list) {
|
||||
list_del(&tmp->list);
|
||||
kfree(tmp);
|
||||
- hevc->frames_num--;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -719,6 +732,7 @@ codec_hevc_prepare_new_frame(struct amvdec_session *sess)
|
||||
|
||||
new_frame->vbuf = vbuf;
|
||||
new_frame->referenced = 1;
|
||||
+ new_frame->show = 1;
|
||||
new_frame->poc = hevc->curr_poc;
|
||||
new_frame->cur_slice_type = params->p.slice_type;
|
||||
new_frame->num_reorder_pic = params->p.sps_num_reorder_pics_0;
|
||||
@@ -1267,7 +1281,7 @@ static int codec_hevc_process_segment(struct amvdec_session *sess)
|
||||
/* First slice: new frame */
|
||||
if (slice_segment_address == 0) {
|
||||
codec_hevc_update_referenced(hevc);
|
||||
- codec_hevc_output_frames(sess);
|
||||
+ codec_hevc_show_frames(sess);
|
||||
|
||||
hevc->cur_frame = codec_hevc_prepare_new_frame(sess);
|
||||
if (!hevc->cur_frame)
|
||||
@@ -1370,9 +1384,11 @@ static void codec_hevc_fetch_rpm(struct amvdec_session *sess)
|
||||
u16 *rpm_vaddr = hevc->workspace_vaddr + RPM_OFFSET;
|
||||
int i, j;
|
||||
|
||||
- for (i = 0; i < RPM_SIZE; i += 4)
|
||||
+ for (i = 0; i < RPM_SIZE; i += 4) {
|
||||
for (j = 0; j < 4; j++)
|
||||
- hevc->rpm_param.l.data[i + j] = rpm_vaddr[i + 3 - j];
|
||||
+ hevc->rpm_param.l.data[i + j] =
|
||||
+ rpm_vaddr[i + 3 - j];
|
||||
+ }
|
||||
}
|
||||
|
||||
static void codec_hevc_resume(struct amvdec_session *sess)
|
||||
--
|
||||
2.35.1
|
||||
|
||||
@@ -1,51 +0,0 @@
|
||||
From cb0c20e84a934c66961ace27f340cd7c98188dbe Mon Sep 17 00:00:00 2001
|
||||
From: Neil Armstrong <narmstrong@baylibre.com>
|
||||
Date: Mon, 22 Nov 2021 09:15:21 +0000
|
||||
Subject: [PATCH 67/90] WIP: drivers: meson: vdec: check if parser has really
|
||||
parser before marking input buffer as error
|
||||
|
||||
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
|
||||
---
|
||||
drivers/staging/media/meson/vdec/esparser.c | 14 ++++++++++----
|
||||
1 file changed, 10 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/drivers/staging/media/meson/vdec/esparser.c b/drivers/staging/media/meson/vdec/esparser.c
|
||||
index 9b6034936d32..bb9480f0a70c 100644
|
||||
--- a/drivers/staging/media/meson/vdec/esparser.c
|
||||
+++ b/drivers/staging/media/meson/vdec/esparser.c
|
||||
@@ -300,6 +300,7 @@ esparser_queue(struct amvdec_session *sess, struct vb2_v4l2_buffer *vbuf)
|
||||
u32 num_dst_bufs = 0;
|
||||
u32 offset;
|
||||
u32 pad_size;
|
||||
+ u32 wp, wp2;
|
||||
|
||||
/*
|
||||
* When max ref frame is held by VP9, this should be -= 3 to prevent a
|
||||
@@ -349,15 +350,20 @@ esparser_queue(struct amvdec_session *sess, struct vb2_v4l2_buffer *vbuf)
|
||||
}
|
||||
|
||||
pad_size = esparser_pad_start_code(core, vb, payload_size);
|
||||
+ wp = amvdec_read_parser(core, PARSER_VIDEO_WP);
|
||||
ret = esparser_write_data(core, phy, payload_size + pad_size);
|
||||
+ wp2 = amvdec_read_parser(core, PARSER_VIDEO_WP);
|
||||
|
||||
if (ret <= 0) {
|
||||
- dev_warn(core->dev, "esparser: input parsing error\n");
|
||||
- amvdec_remove_ts(sess, vb->timestamp);
|
||||
- v4l2_m2m_buf_done(vbuf, VB2_BUF_STATE_ERROR);
|
||||
amvdec_write_parser(core, PARSER_FETCH_CMD, 0);
|
||||
|
||||
- return 0;
|
||||
+ if (ret < 0 || wp2 == wp) {
|
||||
+ dev_err(core->dev, "esparser: input parsing error ret %d (%x <=> %x)\n", ret, wp, wp2);
|
||||
+ amvdec_remove_ts(sess, vb->timestamp);
|
||||
+ v4l2_m2m_buf_done(vbuf, VB2_BUF_STATE_ERROR);
|
||||
+
|
||||
+ return 0;
|
||||
+ }
|
||||
}
|
||||
|
||||
atomic_inc(&sess->esparser_queued_bufs);
|
||||
--
|
||||
2.35.1
|
||||
|
||||
@@ -1,586 +0,0 @@
|
||||
From df7d1adad3f60c8cb3f33235b6301093801b7b47 Mon Sep 17 00:00:00 2001
|
||||
From: benjamin545 <benjamin545@gmail.com>
|
||||
Date: Thu, 15 Jul 2021 16:32:39 -0400
|
||||
Subject: [PATCH 63/90] WIP: drivers: meson: vdec: improve mmu and fbc handling
|
||||
and add 10 bit handling
|
||||
|
||||
---
|
||||
drivers/staging/media/meson/vdec/codec_h264.c | 3 +-
|
||||
.../media/meson/vdec/codec_hevc_common.c | 164 +++++++++++-------
|
||||
.../media/meson/vdec/codec_hevc_common.h | 3 +-
|
||||
drivers/staging/media/meson/vdec/codec_vp9.c | 36 ++--
|
||||
drivers/staging/media/meson/vdec/esparser.c | 1 +
|
||||
drivers/staging/media/meson/vdec/vdec.h | 1 +
|
||||
.../staging/media/meson/vdec/vdec_helpers.c | 46 +++--
|
||||
.../staging/media/meson/vdec/vdec_helpers.h | 10 +-
|
||||
8 files changed, 163 insertions(+), 101 deletions(-)
|
||||
|
||||
diff --git a/drivers/staging/media/meson/vdec/codec_h264.c b/drivers/staging/media/meson/vdec/codec_h264.c
|
||||
index c61128fc4bb9..d53c9a464bde 100644
|
||||
--- a/drivers/staging/media/meson/vdec/codec_h264.c
|
||||
+++ b/drivers/staging/media/meson/vdec/codec_h264.c
|
||||
@@ -353,7 +353,8 @@ static void codec_h264_src_change(struct amvdec_session *sess)
|
||||
frame_width, frame_height, crop_right, crop_bottom);
|
||||
|
||||
codec_h264_set_par(sess);
|
||||
- amvdec_src_change(sess, frame_width, frame_height, h264->max_refs + 5);
|
||||
+ amvdec_src_change(sess, frame_width, frame_height,
|
||||
+ h264->max_refs + 5, 8);
|
||||
}
|
||||
|
||||
/*
|
||||
diff --git a/drivers/staging/media/meson/vdec/codec_hevc_common.c b/drivers/staging/media/meson/vdec/codec_hevc_common.c
|
||||
index 0315cc0911cd..d6ed82dc93ca 100644
|
||||
--- a/drivers/staging/media/meson/vdec/codec_hevc_common.c
|
||||
+++ b/drivers/staging/media/meson/vdec/codec_hevc_common.c
|
||||
@@ -30,8 +30,11 @@ const u16 vdec_hevc_parser_cmd[] = {
|
||||
void codec_hevc_setup_decode_head(struct amvdec_session *sess, int is_10bit)
|
||||
{
|
||||
struct amvdec_core *core = sess->core;
|
||||
- u32 body_size = amvdec_am21c_body_size(sess->width, sess->height);
|
||||
- u32 head_size = amvdec_am21c_head_size(sess->width, sess->height);
|
||||
+ u32 use_mmu = codec_hevc_use_mmu(core->platform->revision,
|
||||
+ sess->pixfmt_cap, is_10bit);
|
||||
+ u32 body_size = amvdec_amfbc_body_size(sess->width, sess->height,
|
||||
+ is_10bit, use_mmu);
|
||||
+ u32 head_size = amvdec_amfbc_head_size(sess->width, sess->height);
|
||||
|
||||
if (!codec_hevc_use_fbc(sess->pixfmt_cap, is_10bit)) {
|
||||
/* Enable 2-plane reference read mode */
|
||||
@@ -39,9 +42,17 @@ void codec_hevc_setup_decode_head(struct amvdec_session *sess, int is_10bit)
|
||||
return;
|
||||
}
|
||||
|
||||
+ /* enable mem saving mode for 8-bit */
|
||||
+ if (!is_10bit)
|
||||
+ amvdec_write_dos_bits(core, HEVC_SAO_CTRL5, BIT(9));
|
||||
+ else
|
||||
+ amvdec_clear_dos_bits(core, HEVC_SAO_CTRL5, BIT(9));
|
||||
+
|
||||
if (codec_hevc_use_mmu(core->platform->revision,
|
||||
sess->pixfmt_cap, is_10bit))
|
||||
amvdec_write_dos(core, HEVCD_MPP_DECOMP_CTL1, BIT(4));
|
||||
+ else if (!is_10bit)
|
||||
+ amvdec_write_dos(core, HEVCD_MPP_DECOMP_CTL1, BIT(3));
|
||||
else
|
||||
amvdec_write_dos(core, HEVCD_MPP_DECOMP_CTL1, 0);
|
||||
|
||||
@@ -73,7 +84,7 @@ static void codec_hevc_setup_buffers_gxbb(struct amvdec_session *sess,
|
||||
|
||||
idx = vb->index;
|
||||
|
||||
- if (codec_hevc_use_downsample(sess->pixfmt_cap, is_10bit))
|
||||
+ if (codec_hevc_use_fbc(sess->pixfmt_cap, is_10bit))
|
||||
buf_y_paddr = comm->fbc_buffer_paddr[idx];
|
||||
else
|
||||
buf_y_paddr = vb2_dma_contig_plane_dma_addr(vb, 0);
|
||||
@@ -114,8 +125,8 @@ static void codec_hevc_setup_buffers_gxl(struct amvdec_session *sess,
|
||||
{
|
||||
struct amvdec_core *core = sess->core;
|
||||
struct v4l2_m2m_buffer *buf;
|
||||
- u32 revision = core->platform->revision;
|
||||
u32 pixfmt_cap = sess->pixfmt_cap;
|
||||
+ const u32 revision = core->platform->revision;
|
||||
int i;
|
||||
|
||||
amvdec_write_dos(core, HEVCD_MPP_ANC2AXI_TBL_CONF_ADDR,
|
||||
@@ -127,12 +138,14 @@ static void codec_hevc_setup_buffers_gxl(struct amvdec_session *sess,
|
||||
dma_addr_t buf_uv_paddr = 0;
|
||||
u32 idx = vb->index;
|
||||
|
||||
- if (codec_hevc_use_mmu(revision, pixfmt_cap, is_10bit))
|
||||
- buf_y_paddr = comm->mmu_header_paddr[idx];
|
||||
- else if (codec_hevc_use_downsample(pixfmt_cap, is_10bit))
|
||||
- buf_y_paddr = comm->fbc_buffer_paddr[idx];
|
||||
- else
|
||||
- buf_y_paddr = vb2_dma_contig_plane_dma_addr(vb, 0);
|
||||
+ if (codec_hevc_use_downsample(pixfmt_cap, is_10bit)) {
|
||||
+ if (codec_hevc_use_mmu(revision, pixfmt_cap, is_10bit))
|
||||
+ buf_y_paddr = comm->mmu_header_paddr[idx];
|
||||
+ else
|
||||
+ buf_y_paddr = comm->fbc_buffer_paddr[idx];
|
||||
+ } else {
|
||||
+ buf_y_paddr = vb2_dma_contig_plane_dma_addr(vb, 0);
|
||||
+ }
|
||||
|
||||
amvdec_write_dos(core, HEVCD_MPP_ANC2AXI_TBL_DATA,
|
||||
buf_y_paddr >> 5);
|
||||
@@ -150,60 +163,67 @@ static void codec_hevc_setup_buffers_gxl(struct amvdec_session *sess,
|
||||
amvdec_write_dos(core, HEVCD_MPP_ANC_CANVAS_DATA_ADDR, 0);
|
||||
}
|
||||
|
||||
-void codec_hevc_free_fbc_buffers(struct amvdec_session *sess,
|
||||
+void codec_hevc_free_mmu_headers(struct amvdec_session *sess,
|
||||
struct codec_hevc_common *comm)
|
||||
{
|
||||
struct device *dev = sess->core->dev;
|
||||
- u32 am21_size = amvdec_am21c_size(sess->width, sess->height);
|
||||
int i;
|
||||
|
||||
for (i = 0; i < MAX_REF_PIC_NUM; ++i) {
|
||||
- if (comm->fbc_buffer_vaddr[i]) {
|
||||
- dma_free_coherent(dev, am21_size,
|
||||
- comm->fbc_buffer_vaddr[i],
|
||||
- comm->fbc_buffer_paddr[i]);
|
||||
- comm->fbc_buffer_vaddr[i] = NULL;
|
||||
+ if (comm->mmu_header_vaddr[i]) {
|
||||
+ dma_free_coherent(dev, MMU_COMPRESS_HEADER_SIZE,
|
||||
+ comm->mmu_header_vaddr[i],
|
||||
+ comm->mmu_header_paddr[i]);
|
||||
+ comm->mmu_header_vaddr[i] = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
-EXPORT_SYMBOL_GPL(codec_hevc_free_fbc_buffers);
|
||||
+EXPORT_SYMBOL_GPL(codec_hevc_free_mmu_headers);
|
||||
|
||||
-static int codec_hevc_alloc_fbc_buffers(struct amvdec_session *sess,
|
||||
+static int codec_hevc_alloc_mmu_headers(struct amvdec_session *sess,
|
||||
struct codec_hevc_common *comm)
|
||||
{
|
||||
struct device *dev = sess->core->dev;
|
||||
struct v4l2_m2m_buffer *buf;
|
||||
- u32 am21_size = amvdec_am21c_size(sess->width, sess->height);
|
||||
|
||||
v4l2_m2m_for_each_dst_buf(sess->m2m_ctx, buf) {
|
||||
u32 idx = buf->vb.vb2_buf.index;
|
||||
dma_addr_t paddr;
|
||||
- void *vaddr = dma_alloc_coherent(dev, am21_size, &paddr,
|
||||
- GFP_KERNEL);
|
||||
+ void *vaddr = dma_alloc_coherent(dev, MMU_COMPRESS_HEADER_SIZE,
|
||||
+ &paddr, GFP_KERNEL);
|
||||
if (!vaddr) {
|
||||
- codec_hevc_free_fbc_buffers(sess, comm);
|
||||
+ codec_hevc_free_mmu_headers(sess, comm);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
- comm->fbc_buffer_vaddr[idx] = vaddr;
|
||||
- comm->fbc_buffer_paddr[idx] = paddr;
|
||||
+ comm->mmu_header_vaddr[idx] = vaddr;
|
||||
+ comm->mmu_header_paddr[idx] = paddr;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
-void codec_hevc_free_mmu_headers(struct amvdec_session *sess,
|
||||
+void codec_hevc_free_fbc_buffers(struct amvdec_session *sess,
|
||||
struct codec_hevc_common *comm)
|
||||
{
|
||||
struct device *dev = sess->core->dev;
|
||||
+ u32 use_mmu;
|
||||
+ u32 am21_size;
|
||||
int i;
|
||||
|
||||
+ use_mmu = codec_hevc_use_mmu(sess->core->platform->revision,
|
||||
+ sess->pixfmt_cap,
|
||||
+ sess->bitdepth == 10 ? 1 : 0);
|
||||
+
|
||||
+ am21_size = amvdec_amfbc_size(sess->width, sess->height,
|
||||
+ sess->bitdepth == 10 ? 1 : 0, use_mmu);
|
||||
+
|
||||
for (i = 0; i < MAX_REF_PIC_NUM; ++i) {
|
||||
- if (comm->mmu_header_vaddr[i]) {
|
||||
- dma_free_coherent(dev, MMU_COMPRESS_HEADER_SIZE,
|
||||
- comm->mmu_header_vaddr[i],
|
||||
- comm->mmu_header_paddr[i]);
|
||||
- comm->mmu_header_vaddr[i] = NULL;
|
||||
+ if (comm->fbc_buffer_vaddr[i]) {
|
||||
+ dma_free_coherent(dev, am21_size,
|
||||
+ comm->fbc_buffer_vaddr[i],
|
||||
+ comm->fbc_buffer_paddr[i]);
|
||||
+ comm->fbc_buffer_vaddr[i] = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -213,33 +233,49 @@ void codec_hevc_free_mmu_headers(struct amvdec_session *sess,
|
||||
comm->mmu_map_paddr);
|
||||
comm->mmu_map_vaddr = NULL;
|
||||
}
|
||||
+
|
||||
+ codec_hevc_free_mmu_headers(sess, comm);
|
||||
}
|
||||
-EXPORT_SYMBOL_GPL(codec_hevc_free_mmu_headers);
|
||||
+EXPORT_SYMBOL_GPL(codec_hevc_free_fbc_buffers);
|
||||
|
||||
-static int codec_hevc_alloc_mmu_headers(struct amvdec_session *sess,
|
||||
+static int codec_hevc_alloc_fbc_buffers(struct amvdec_session *sess,
|
||||
struct codec_hevc_common *comm)
|
||||
{
|
||||
struct device *dev = sess->core->dev;
|
||||
struct v4l2_m2m_buffer *buf;
|
||||
+ u32 use_mmu;
|
||||
+ u32 am21_size;
|
||||
+ const u32 revision = sess->core->platform->revision;
|
||||
+ const u32 is_10bit = sess->bitdepth == 10 ? 1 : 0;
|
||||
+ int ret;
|
||||
|
||||
- comm->mmu_map_vaddr = dma_alloc_coherent(dev, MMU_MAP_SIZE,
|
||||
- &comm->mmu_map_paddr,
|
||||
- GFP_KERNEL);
|
||||
- if (!comm->mmu_map_vaddr)
|
||||
- return -ENOMEM;
|
||||
+ use_mmu = codec_hevc_use_mmu(revision, sess->pixfmt_cap,
|
||||
+ is_10bit);
|
||||
+
|
||||
+ am21_size = amvdec_amfbc_size(sess->width, sess->height,
|
||||
+ is_10bit, use_mmu);
|
||||
|
||||
v4l2_m2m_for_each_dst_buf(sess->m2m_ctx, buf) {
|
||||
u32 idx = buf->vb.vb2_buf.index;
|
||||
dma_addr_t paddr;
|
||||
- void *vaddr = dma_alloc_coherent(dev, MMU_COMPRESS_HEADER_SIZE,
|
||||
- &paddr, GFP_KERNEL);
|
||||
+ void *vaddr = dma_alloc_coherent(dev, am21_size, &paddr,
|
||||
+ GFP_KERNEL);
|
||||
if (!vaddr) {
|
||||
- codec_hevc_free_mmu_headers(sess, comm);
|
||||
+ codec_hevc_free_fbc_buffers(sess, comm);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
- comm->mmu_header_vaddr[idx] = vaddr;
|
||||
- comm->mmu_header_paddr[idx] = paddr;
|
||||
+ comm->fbc_buffer_vaddr[idx] = vaddr;
|
||||
+ comm->fbc_buffer_paddr[idx] = paddr;
|
||||
+ }
|
||||
+
|
||||
+ if (codec_hevc_use_mmu(revision, sess->pixfmt_cap, is_10bit) &&
|
||||
+ codec_hevc_use_downsample(sess->pixfmt_cap, is_10bit)) {
|
||||
+ ret = codec_hevc_alloc_mmu_headers(sess, comm);
|
||||
+ if (ret) {
|
||||
+ codec_hevc_free_fbc_buffers(sess, comm);
|
||||
+ return ret;
|
||||
+ }
|
||||
}
|
||||
|
||||
return 0;
|
||||
@@ -250,21 +286,24 @@ int codec_hevc_setup_buffers(struct amvdec_session *sess,
|
||||
int is_10bit)
|
||||
{
|
||||
struct amvdec_core *core = sess->core;
|
||||
+ struct device *dev = core->dev;
|
||||
int ret;
|
||||
|
||||
- if (codec_hevc_use_downsample(sess->pixfmt_cap, is_10bit)) {
|
||||
- ret = codec_hevc_alloc_fbc_buffers(sess, comm);
|
||||
- if (ret)
|
||||
- return ret;
|
||||
+ if (codec_hevc_use_mmu(core->platform->revision,
|
||||
+ sess->pixfmt_cap, is_10bit)) {
|
||||
+ comm->mmu_map_vaddr = dma_alloc_coherent(dev, MMU_MAP_SIZE,
|
||||
+ &comm->mmu_map_paddr,
|
||||
+ GFP_KERNEL);
|
||||
+ if (!comm->mmu_map_vaddr)
|
||||
+ return -ENOMEM;
|
||||
}
|
||||
|
||||
if (codec_hevc_use_mmu(core->platform->revision,
|
||||
- sess->pixfmt_cap, is_10bit)) {
|
||||
- ret = codec_hevc_alloc_mmu_headers(sess, comm);
|
||||
- if (ret) {
|
||||
- codec_hevc_free_fbc_buffers(sess, comm);
|
||||
- return ret;
|
||||
- }
|
||||
+ sess->pixfmt_cap, is_10bit) ||
|
||||
+ codec_hevc_use_downsample(sess->pixfmt_cap, is_10bit)) {
|
||||
+ ret = codec_hevc_alloc_fbc_buffers(sess, comm);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
}
|
||||
|
||||
if (core->platform->revision == VDEC_REVISION_GXBB)
|
||||
@@ -278,19 +317,24 @@ EXPORT_SYMBOL_GPL(codec_hevc_setup_buffers);
|
||||
|
||||
void codec_hevc_fill_mmu_map(struct amvdec_session *sess,
|
||||
struct codec_hevc_common *comm,
|
||||
- struct vb2_buffer *vb)
|
||||
+ struct vb2_buffer *vb,
|
||||
+ u32 is_10bit)
|
||||
{
|
||||
- u32 size = amvdec_am21c_size(sess->width, sess->height);
|
||||
- u32 nb_pages = size / PAGE_SIZE;
|
||||
+ u32 use_mmu;
|
||||
+ u32 size;
|
||||
+ u32 nb_pages;
|
||||
u32 *mmu_map = comm->mmu_map_vaddr;
|
||||
u32 first_page;
|
||||
u32 i;
|
||||
|
||||
- if (sess->pixfmt_cap == V4L2_PIX_FMT_NV12M)
|
||||
- first_page = comm->fbc_buffer_paddr[vb->index] >> PAGE_SHIFT;
|
||||
- else
|
||||
- first_page = vb2_dma_contig_plane_dma_addr(vb, 0) >> PAGE_SHIFT;
|
||||
+ use_mmu = codec_hevc_use_mmu(sess->core->platform->revision,
|
||||
+ sess->pixfmt_cap, is_10bit);
|
||||
+
|
||||
+ size = amvdec_amfbc_size(sess->width, sess->height, is_10bit,
|
||||
+ use_mmu);
|
||||
|
||||
+ nb_pages = size / PAGE_SIZE;
|
||||
+ first_page = comm->fbc_buffer_paddr[vb->index] >> PAGE_SHIFT;
|
||||
for (i = 0; i < nb_pages; ++i)
|
||||
mmu_map[i] = first_page + i;
|
||||
}
|
||||
diff --git a/drivers/staging/media/meson/vdec/codec_hevc_common.h b/drivers/staging/media/meson/vdec/codec_hevc_common.h
|
||||
index cf072b8a9da2..13f9f1d90a94 100644
|
||||
--- a/drivers/staging/media/meson/vdec/codec_hevc_common.h
|
||||
+++ b/drivers/staging/media/meson/vdec/codec_hevc_common.h
|
||||
@@ -64,6 +64,7 @@ int codec_hevc_setup_buffers(struct amvdec_session *sess,
|
||||
|
||||
void codec_hevc_fill_mmu_map(struct amvdec_session *sess,
|
||||
struct codec_hevc_common *comm,
|
||||
- struct vb2_buffer *vb);
|
||||
+ struct vb2_buffer *vb,
|
||||
+ u32 is_10bit);
|
||||
|
||||
#endif
|
||||
diff --git a/drivers/staging/media/meson/vdec/codec_vp9.c b/drivers/staging/media/meson/vdec/codec_vp9.c
|
||||
index 897f5d7a6aad..bfc312ec2a56 100644
|
||||
--- a/drivers/staging/media/meson/vdec/codec_vp9.c
|
||||
+++ b/drivers/staging/media/meson/vdec/codec_vp9.c
|
||||
@@ -458,12 +458,6 @@ struct codec_vp9 {
|
||||
struct list_head ref_frames_list;
|
||||
u32 frames_num;
|
||||
|
||||
- /* In case of downsampling (decoding with FBC but outputting in NV12M),
|
||||
- * we need to allocate additional buffers for FBC.
|
||||
- */
|
||||
- void *fbc_buffer_vaddr[MAX_REF_PIC_NUM];
|
||||
- dma_addr_t fbc_buffer_paddr[MAX_REF_PIC_NUM];
|
||||
-
|
||||
int ref_frame_map[REF_FRAMES];
|
||||
int next_ref_frame_map[REF_FRAMES];
|
||||
struct vp9_frame *frame_refs[REFS_PER_FRAME];
|
||||
@@ -901,11 +895,8 @@ static void codec_vp9_set_sao(struct amvdec_session *sess,
|
||||
buf_y_paddr =
|
||||
vb2_dma_contig_plane_dma_addr(vb, 0);
|
||||
|
||||
- if (codec_hevc_use_fbc(sess->pixfmt_cap, vp9->is_10bit)) {
|
||||
- val = amvdec_read_dos(core, HEVC_SAO_CTRL5) & ~0xff0200;
|
||||
- amvdec_write_dos(core, HEVC_SAO_CTRL5, val);
|
||||
- amvdec_write_dos(core, HEVC_CM_BODY_START_ADDR, buf_y_paddr);
|
||||
- }
|
||||
+ if (codec_hevc_use_fbc(sess->pixfmt_cap, vp9->is_10bit))
|
||||
+ amvdec_write_dos(core, HEVC_CM_BODY_START_ADDR, buf_y_paddr);
|
||||
|
||||
if (sess->pixfmt_cap == V4L2_PIX_FMT_NV12M) {
|
||||
buf_y_paddr =
|
||||
@@ -920,8 +911,12 @@ static void codec_vp9_set_sao(struct amvdec_session *sess,
|
||||
|
||||
if (codec_hevc_use_mmu(core->platform->revision, sess->pixfmt_cap,
|
||||
vp9->is_10bit)) {
|
||||
- amvdec_write_dos(core, HEVC_CM_HEADER_START_ADDR,
|
||||
- vp9->common.mmu_header_paddr[vb->index]);
|
||||
+ dma_addr_t header_adr;
|
||||
+ if (codec_hevc_use_downsample(sess->pixfmt_cap, vp9->is_10bit))
|
||||
+ header_adr = vp9->common.mmu_header_paddr[vb->index];
|
||||
+ else
|
||||
+ header_adr = vb2_dma_contig_plane_dma_addr(vb, 0);
|
||||
+ amvdec_write_dos(core, HEVC_CM_HEADER_START_ADDR, header_adr);
|
||||
/* use HEVC_CM_HEADER_START_ADDR */
|
||||
amvdec_write_dos_bits(core, HEVC_SAO_CTRL5, BIT(10));
|
||||
}
|
||||
@@ -1148,9 +1143,13 @@ static void codec_vp9_set_mc(struct amvdec_session *sess,
|
||||
{
|
||||
struct amvdec_core *core = sess->core;
|
||||
u32 scale = 0;
|
||||
+ u32 use_mmu;
|
||||
u32 sz;
|
||||
int i;
|
||||
|
||||
+ use_mmu = codec_hevc_use_mmu(core->platform->revision,
|
||||
+ sess->pixfmt_cap, vp9->is_10bit);
|
||||
+
|
||||
amvdec_write_dos(core, HEVCD_MPP_ANC_CANVAS_ACCCONFIG_ADDR, 1);
|
||||
codec_vp9_set_refs(sess, vp9);
|
||||
amvdec_write_dos(core, HEVCD_MPP_ANC_CANVAS_ACCCONFIG_ADDR,
|
||||
@@ -1166,8 +1165,9 @@ static void codec_vp9_set_mc(struct amvdec_session *sess,
|
||||
vp9->frame_refs[i]->height != vp9->height)
|
||||
scale = 1;
|
||||
|
||||
- sz = amvdec_am21c_body_size(vp9->frame_refs[i]->width,
|
||||
- vp9->frame_refs[i]->height);
|
||||
+ sz = amvdec_amfbc_body_size(vp9->frame_refs[i]->width,
|
||||
+ vp9->frame_refs[i]->height,
|
||||
+ vp9->is_10bit, use_mmu);
|
||||
|
||||
amvdec_write_dos(core, VP9D_MPP_REFINFO_DATA,
|
||||
vp9->frame_refs[i]->width);
|
||||
@@ -1283,7 +1283,8 @@ static void codec_vp9_process_frame(struct amvdec_session *sess)
|
||||
if (codec_hevc_use_mmu(core->platform->revision, sess->pixfmt_cap,
|
||||
vp9->is_10bit))
|
||||
codec_hevc_fill_mmu_map(sess, &vp9->common,
|
||||
- &vp9->cur_frame->vbuf->vb2_buf);
|
||||
+ &vp9->cur_frame->vbuf->vb2_buf,
|
||||
+ vp9->is_10bit);
|
||||
|
||||
intra_only = param->p.show_frame ? 0 : param->p.intra_only;
|
||||
|
||||
@@ -2132,7 +2133,8 @@ static irqreturn_t codec_vp9_threaded_isr(struct amvdec_session *sess)
|
||||
|
||||
codec_vp9_fetch_rpm(sess);
|
||||
if (codec_vp9_process_rpm(vp9)) {
|
||||
- amvdec_src_change(sess, vp9->width, vp9->height, 16);
|
||||
+ amvdec_src_change(sess, vp9->width, vp9->height, 16,
|
||||
+ vp9->is_10bit ? 10 : 8);
|
||||
|
||||
/* No frame is actually processed */
|
||||
vp9->cur_frame = NULL;
|
||||
diff --git a/drivers/staging/media/meson/vdec/esparser.c b/drivers/staging/media/meson/vdec/esparser.c
|
||||
index e18334e57fc0..610a92b9f6f2 100644
|
||||
--- a/drivers/staging/media/meson/vdec/esparser.c
|
||||
+++ b/drivers/staging/media/meson/vdec/esparser.c
|
||||
@@ -319,6 +319,7 @@ esparser_queue(struct amvdec_session *sess, struct vb2_v4l2_buffer *vbuf)
|
||||
if (esparser_vififo_get_free_space(sess) < payload_size ||
|
||||
atomic_read(&sess->esparser_queued_bufs) >= num_dst_bufs)
|
||||
return -EAGAIN;
|
||||
+
|
||||
} else if (esparser_vififo_get_free_space(sess) < payload_size) {
|
||||
return -EAGAIN;
|
||||
}
|
||||
diff --git a/drivers/staging/media/meson/vdec/vdec.h b/drivers/staging/media/meson/vdec/vdec.h
|
||||
index 0906b8fb5cc6..a48170fe4cff 100644
|
||||
--- a/drivers/staging/media/meson/vdec/vdec.h
|
||||
+++ b/drivers/staging/media/meson/vdec/vdec.h
|
||||
@@ -244,6 +244,7 @@ struct amvdec_session {
|
||||
u32 width;
|
||||
u32 height;
|
||||
u32 colorspace;
|
||||
+ u32 bitdepth;
|
||||
u8 ycbcr_enc;
|
||||
u8 quantization;
|
||||
u8 xfer_func;
|
||||
diff --git a/drivers/staging/media/meson/vdec/vdec_helpers.c b/drivers/staging/media/meson/vdec/vdec_helpers.c
|
||||
index 203d7afa085d..23a69c51c634 100644
|
||||
--- a/drivers/staging/media/meson/vdec/vdec_helpers.c
|
||||
+++ b/drivers/staging/media/meson/vdec/vdec_helpers.c
|
||||
@@ -50,32 +50,40 @@ void amvdec_write_parser(struct amvdec_core *core, u32 reg, u32 val)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(amvdec_write_parser);
|
||||
|
||||
-/* 4 KiB per 64x32 block */
|
||||
-u32 amvdec_am21c_body_size(u32 width, u32 height)
|
||||
+/* AMFBC body is made out of 64x32 blocks with varying block size */
|
||||
+u32 amvdec_amfbc_body_size(u32 width, u32 height, u32 is_10bit, u32 use_mmu)
|
||||
{
|
||||
u32 width_64 = ALIGN(width, 64) / 64;
|
||||
u32 height_32 = ALIGN(height, 32) / 32;
|
||||
+ u32 blk_size = 4096;
|
||||
|
||||
- return SZ_4K * width_64 * height_32;
|
||||
+ if (!is_10bit) {
|
||||
+ if (use_mmu)
|
||||
+ blk_size = 3200;
|
||||
+ else
|
||||
+ blk_size = 3072;
|
||||
+ }
|
||||
+
|
||||
+ return blk_size * width_64 * height_32;
|
||||
}
|
||||
-EXPORT_SYMBOL_GPL(amvdec_am21c_body_size);
|
||||
+EXPORT_SYMBOL_GPL(amvdec_amfbc_body_size);
|
||||
|
||||
/* 32 bytes per 128x64 block */
|
||||
-u32 amvdec_am21c_head_size(u32 width, u32 height)
|
||||
+u32 amvdec_amfbc_head_size(u32 width, u32 height)
|
||||
{
|
||||
u32 width_128 = ALIGN(width, 128) / 128;
|
||||
u32 height_64 = ALIGN(height, 64) / 64;
|
||||
|
||||
return 32 * width_128 * height_64;
|
||||
}
|
||||
-EXPORT_SYMBOL_GPL(amvdec_am21c_head_size);
|
||||
+EXPORT_SYMBOL_GPL(amvdec_amfbc_head_size);
|
||||
|
||||
-u32 amvdec_am21c_size(u32 width, u32 height)
|
||||
+u32 amvdec_amfbc_size(u32 width, u32 height, u32 is_10bit, u32 use_mmu)
|
||||
{
|
||||
- return ALIGN(amvdec_am21c_body_size(width, height) +
|
||||
- amvdec_am21c_head_size(width, height), SZ_64K);
|
||||
+ return ALIGN(amvdec_amfbc_body_size(width, height, is_10bit, use_mmu) +
|
||||
+ amvdec_amfbc_head_size(width, height), SZ_64K);
|
||||
}
|
||||
-EXPORT_SYMBOL_GPL(amvdec_am21c_size);
|
||||
+EXPORT_SYMBOL_GPL(amvdec_amfbc_size);
|
||||
|
||||
static int canvas_alloc(struct amvdec_session *sess, u8 *canvas_id)
|
||||
{
|
||||
@@ -436,7 +444,7 @@ void amvdec_set_par_from_dar(struct amvdec_session *sess,
|
||||
EXPORT_SYMBOL_GPL(amvdec_set_par_from_dar);
|
||||
|
||||
void amvdec_src_change(struct amvdec_session *sess, u32 width,
|
||||
- u32 height, u32 dpb_size)
|
||||
+ u32 height, u32 dpb_size, u32 bitdepth)
|
||||
{
|
||||
static const struct v4l2_event ev = {
|
||||
.type = V4L2_EVENT_SOURCE_CHANGE,
|
||||
@@ -444,25 +452,27 @@ void amvdec_src_change(struct amvdec_session *sess, u32 width,
|
||||
|
||||
v4l2_ctrl_s_ctrl(sess->ctrl_min_buf_capture, dpb_size);
|
||||
|
||||
+ sess->bitdepth = bitdepth;
|
||||
+
|
||||
/*
|
||||
* Check if the capture queue is already configured well for our
|
||||
- * usecase. If so, keep decoding with it and do not send the event
|
||||
+ * usecase. If so, keep decoding with it.
|
||||
*/
|
||||
if (sess->streamon_cap &&
|
||||
sess->width == width &&
|
||||
sess->height == height &&
|
||||
dpb_size <= sess->num_dst_bufs) {
|
||||
sess->fmt_out->codec_ops->resume(sess);
|
||||
- return;
|
||||
- }
|
||||
+ } else {
|
||||
+ sess->status = STATUS_NEEDS_RESUME;
|
||||
+ sess->changed_format = 0;
|
||||
+ }
|
||||
|
||||
- sess->changed_format = 0;
|
||||
sess->width = width;
|
||||
sess->height = height;
|
||||
- sess->status = STATUS_NEEDS_RESUME;
|
||||
|
||||
- dev_dbg(sess->core->dev, "Res. changed (%ux%u), DPB size %u\n",
|
||||
- width, height, dpb_size);
|
||||
+ dev_dbg(sess->core->dev, "Res. changed (%ux%u), DPB %u, bitdepth %u\n",
|
||||
+ width, height, dpb_size, bitdepth);
|
||||
v4l2_event_queue_fh(&sess->fh, &ev);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(amvdec_src_change);
|
||||
diff --git a/drivers/staging/media/meson/vdec/vdec_helpers.h b/drivers/staging/media/meson/vdec/vdec_helpers.h
|
||||
index 88137d15aa3a..fca4251f7599 100644
|
||||
--- a/drivers/staging/media/meson/vdec/vdec_helpers.h
|
||||
+++ b/drivers/staging/media/meson/vdec/vdec_helpers.h
|
||||
@@ -27,9 +27,10 @@ void amvdec_clear_dos_bits(struct amvdec_core *core, u32 reg, u32 val);
|
||||
u32 amvdec_read_parser(struct amvdec_core *core, u32 reg);
|
||||
void amvdec_write_parser(struct amvdec_core *core, u32 reg, u32 val);
|
||||
|
||||
-u32 amvdec_am21c_body_size(u32 width, u32 height);
|
||||
-u32 amvdec_am21c_head_size(u32 width, u32 height);
|
||||
-u32 amvdec_am21c_size(u32 width, u32 height);
|
||||
+/* Helpers for the Amlogic compressed framebuffer format */
|
||||
+u32 amvdec_amfbc_body_size(u32 width, u32 height, u32 is_10bit, u32 use_mmu);
|
||||
+u32 amvdec_amfbc_head_size(u32 width, u32 height);
|
||||
+u32 amvdec_amfbc_size(u32 width, u32 height, u32 is_10bit, u32 use_mmu);
|
||||
|
||||
/**
|
||||
* amvdec_dst_buf_done_idx() - Signal that a buffer is done decoding
|
||||
@@ -77,9 +78,10 @@ void amvdec_set_par_from_dar(struct amvdec_session *sess,
|
||||
* @width: picture width detected by the hardware
|
||||
* @height: picture height detected by the hardware
|
||||
* @dpb_size: Decoded Picture Buffer size (= amount of buffers for decoding)
|
||||
+ * @bitdepth: Bit depth (usually 10 or 8) of the coded content
|
||||
*/
|
||||
void amvdec_src_change(struct amvdec_session *sess, u32 width,
|
||||
- u32 height, u32 dpb_size);
|
||||
+ u32 height, u32 dpb_size, u32 bitdepth);
|
||||
|
||||
/**
|
||||
* amvdec_abort() - Abort the current decoding session
|
||||
--
|
||||
2.35.1
|
||||
|
||||
@@ -1,29 +0,0 @@
|
||||
From 4aca1a59251338a9f98b58fc67e7749fae32b3be Mon Sep 17 00:00:00 2001
|
||||
From: benjamin545 <benjamin545@gmail.com>
|
||||
Date: Thu, 15 Jul 2021 14:32:33 -0400
|
||||
Subject: [PATCH 62/90] WIP: drivers: meson: vdec: remove redundant if
|
||||
statement
|
||||
|
||||
checking if sess->fmt_out->pixfmt is V4L2_PIX_FMT_VP9 was already done
|
||||
as a condition to enter the if statement where this additional check is performed
|
||||
---
|
||||
drivers/staging/media/meson/vdec/esparser.c | 3 +--
|
||||
1 file changed, 1 insertion(+), 2 deletions(-)
|
||||
|
||||
diff --git a/drivers/staging/media/meson/vdec/esparser.c b/drivers/staging/media/meson/vdec/esparser.c
|
||||
index db7022707ff8..e18334e57fc0 100644
|
||||
--- a/drivers/staging/media/meson/vdec/esparser.c
|
||||
+++ b/drivers/staging/media/meson/vdec/esparser.c
|
||||
@@ -314,8 +314,7 @@ esparser_queue(struct amvdec_session *sess, struct vb2_v4l2_buffer *vbuf)
|
||||
num_dst_bufs = codec_ops->num_pending_bufs(sess);
|
||||
|
||||
num_dst_bufs += v4l2_m2m_num_dst_bufs_ready(sess->m2m_ctx);
|
||||
- if (sess->fmt_out->pixfmt == V4L2_PIX_FMT_VP9)
|
||||
- num_dst_bufs -= 3;
|
||||
+ num_dst_bufs -= 3;
|
||||
|
||||
if (esparser_vififo_get_free_space(sess) < payload_size ||
|
||||
atomic_read(&sess->esparser_queued_bufs) >= num_dst_bufs)
|
||||
--
|
||||
2.35.1
|
||||
|
||||
@@ -1,287 +0,0 @@
|
||||
From 58c5526eb1798e61e4e76d37140cf10c8d325bc7 Mon Sep 17 00:00:00 2001
|
||||
From: Zhang Ning <832666+zhangn1985@users.noreply.github.com>
|
||||
Date: Thu, 19 Sep 2019 16:20:31 +0800
|
||||
Subject: [PATCH] general: meson64 overlays
|
||||
|
||||
Signed-off-by: Zhang Ning <832666+zhangn1985@users.noreply.github.com>
|
||||
---
|
||||
arch/arm64/boot/dts/amlogic/Makefile | 2 ++
|
||||
arch/arm64/boot/dts/amlogic/overlay/Makefile | 20 ++++++++++++
|
||||
.../dts/amlogic/overlay/README.meson-overlays | 20 ++++++++++++
|
||||
.../dts/amlogic/overlay/meson-fixup.scr-cmd | 4 +++
|
||||
.../boot/dts/amlogic/overlay/meson-i2cA.dts | 17 ++++++++++
|
||||
.../boot/dts/amlogic/overlay/meson-i2cB.dts | 17 ++++++++++
|
||||
.../boot/dts/amlogic/overlay/meson-uartA.dts | 11 +++++++
|
||||
.../boot/dts/amlogic/overlay/meson-uartC.dts | 11 +++++++
|
||||
.../dts/amlogic/overlay/meson-w1-gpio.dts | 20 ++++++++++++
|
||||
.../dts/amlogic/overlay/meson-w1AB-gpio.dts | 32 +++++++++++++++++++
|
||||
scripts/Makefile.lib | 3 ++
|
||||
11 files changed, 157 insertions(+)
|
||||
create mode 100644 arch/arm64/boot/dts/amlogic/overlay/Makefile
|
||||
create mode 100644 arch/arm64/boot/dts/amlogic/overlay/README.meson-overlays
|
||||
create mode 100644 arch/arm64/boot/dts/amlogic/overlay/meson-fixup.scr-cmd
|
||||
create mode 100644 arch/arm64/boot/dts/amlogic/overlay/meson-i2cA.dts
|
||||
create mode 100644 arch/arm64/boot/dts/amlogic/overlay/meson-i2cB.dts
|
||||
create mode 100644 arch/arm64/boot/dts/amlogic/overlay/meson-uartA.dts
|
||||
create mode 100644 arch/arm64/boot/dts/amlogic/overlay/meson-uartC.dts
|
||||
create mode 100644 arch/arm64/boot/dts/amlogic/overlay/meson-w1-gpio.dts
|
||||
create mode 100644 arch/arm64/boot/dts/amlogic/overlay/meson-w1AB-gpio.dts
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/amlogic/Makefile b/arch/arm64/boot/dts/amlogic/Makefile
|
||||
index da3225d31e38..5387963c0ee4 100644
|
||||
--- a/arch/arm64/boot/dts/amlogic/Makefile
|
||||
+++ b/arch/arm64/boot/dts/amlogic/Makefile
|
||||
@@ -67,3 +67,5 @@ dtb-$(CONFIG_ARCH_MESON) += meson-sm1-odroid-hc4.dtb
|
||||
dtb-$(CONFIG_ARCH_MESON) += meson-sm1-sei610.dtb
|
||||
dtb-$(CONFIG_ARCH_MESON) += meson-sm1-x96-air-gbit.dtb
|
||||
dtb-$(CONFIG_ARCH_MESON) += meson-sm1-x96-air.dtb
|
||||
+
|
||||
+subdir-y := $(dts-dirs) overlay
|
||||
diff --git a/arch/arm64/boot/dts/amlogic/overlay/Makefile b/arch/arm64/boot/dts/amlogic/overlay/Makefile
|
||||
new file mode 100644
|
||||
index 0000000..4d83834
|
||||
--- /dev/null
|
||||
+++ b/arch/arm64/boot/dts/amlogic/overlay/Makefile
|
||||
@@ -0,0 +1,20 @@
|
||||
+# SPDX-License-Identifier: GPL-2.0
|
||||
+dtbo-$(CONFIG_ARCH_MESON) += \
|
||||
+ meson-i2cA.dtbo \
|
||||
+ meson-i2cB.dtbo \
|
||||
+ meson-uartA.dtbo \
|
||||
+ meson-uartC.dtbo \
|
||||
+ meson-w1-gpio.dtbo \
|
||||
+ meson-w1AB-gpio.dtbo \
|
||||
+ meson-g12-gxl-cma-pool-896MB.dtbo
|
||||
+
|
||||
+scr-$(CONFIG_ARCH_MESON) += \
|
||||
+ meson-fixup.scr
|
||||
+
|
||||
+dtbotxt-$(CONFIG_ARCH_MESON) += \
|
||||
+ README.meson-overlays
|
||||
+
|
||||
+targets += $(dtbo-y) $(scr-y) $(dtbotxt-y)
|
||||
+
|
||||
+always := $(dtbo-y) $(scr-y) $(dtbotxt-y)
|
||||
+clean-files := *.dtbo *.scr
|
||||
diff --git a/arch/arm64/boot/dts/amlogic/overlay/README.meson-overlays b/arch/arm64/boot/dts/amlogic/overlay/README.meson-overlays
|
||||
new file mode 100644
|
||||
index 000000000000..1b169a7a1525
|
||||
--- /dev/null
|
||||
+++ b/arch/arm64/boot/dts/amlogic/overlay/README.meson-overlays
|
||||
@@ -0,0 +1,20 @@
|
||||
+This document describes overlays provided in the kernel packages
|
||||
+For generic Armbian overlays documentation please see
|
||||
+https://docs.armbian.com/User-Guide_Allwinner_overlays/
|
||||
+
|
||||
+### Platform:
|
||||
+
|
||||
+meson (Amlogic)
|
||||
+
|
||||
+### Provided overlays:
|
||||
+
|
||||
+- i2c8
|
||||
+
|
||||
+### Overlay details:
|
||||
+
|
||||
+### i2c8
|
||||
+
|
||||
+Activates TWI/I2C bus 8
|
||||
+
|
||||
+I2C8 pins (SCL, SDA): GPIO1-C4, GPIO1-C5
|
||||
+
|
||||
diff --git a/arch/arm64/boot/dts/amlogic/overlay/meson-fixup.scr-cmd b/arch/arm64/boot/dts/amlogic/overlay/meson-fixup.scr-cmd
|
||||
new file mode 100644
|
||||
index 000000000000..d4c39e20a3a2
|
||||
--- /dev/null
|
||||
+++ b/arch/arm64/boot/dts/amlogic/overlay/meson-fixup.scr-cmd
|
||||
@@ -0,0 +1,4 @@
|
||||
+# overlays fixup script
|
||||
+# implements (or rather substitutes) overlay arguments functionality
|
||||
+# using u-boot scripting, environment variables and "fdt" command
|
||||
+
|
||||
diff --git a/arch/arm64/boot/dts/amlogic/overlay/meson-g12-gxl-cma-pool-896MB.dts b/arch/arm64/boot/dts/amlogic/overlay/meson-g12-gxl-cma-pool-896MB.dts
|
||||
new file mode 100644
|
||||
index 0000000..f8c476b
|
||||
--- /dev/null
|
||||
+++ b/arch/arm64/boot/dts/amlogic/overlay/meson-g12-gxl-cma-pool-896MB.dts
|
||||
@@ -0,0 +1,19 @@
|
||||
+/dts-v1/;
|
||||
+/plugin/;
|
||||
+
|
||||
+/ {
|
||||
+ compatible = "amlogic,g12a", "amlogic,g12b", "amlogic,meson-gxl";
|
||||
+
|
||||
+ fragment@0 {
|
||||
+ target-path = "/reserved-memory";
|
||||
+ __overlay__ {
|
||||
+ linux,cma {
|
||||
+ compatible = "shared-dma-pool";
|
||||
+ reusable;
|
||||
+ size = <0x0 0x38000000>;
|
||||
+ alignment = <0x0 0x400000>;
|
||||
+ linux,cma-default;
|
||||
+ };
|
||||
+ };
|
||||
+ };
|
||||
+};
|
||||
diff --git a/arch/arm64/boot/dts/amlogic/overlay/meson-i2cA.dts b/arch/arm64/boot/dts/amlogic/overlay/meson-i2cA.dts
|
||||
new file mode 100644
|
||||
index 000000000000..bfb72feb7e36
|
||||
--- /dev/null
|
||||
+++ b/arch/arm64/boot/dts/amlogic/overlay/meson-i2cA.dts
|
||||
@@ -0,0 +1,17 @@
|
||||
+/dts-v1/;
|
||||
+
|
||||
+/ {
|
||||
+ compatible = "amlogic,meson-gxbb";
|
||||
+ fragment@0 {
|
||||
+ target-path = "/aliases";
|
||||
+ __overlay__ {
|
||||
+ i2cA = "/soc/bus@c1100000/i2c@8500";
|
||||
+ };
|
||||
+ };
|
||||
+ fragment@1 {
|
||||
+ target-path = "/soc/bus@c1100000/i2c@8500";
|
||||
+ __overlay__ {
|
||||
+ status = "okay";
|
||||
+ };
|
||||
+ };
|
||||
+};
|
||||
diff --git a/arch/arm64/boot/dts/amlogic/overlay/meson-i2cB.dts b/arch/arm64/boot/dts/amlogic/overlay/meson-i2cB.dts
|
||||
new file mode 100644
|
||||
index 000000000000..d75867bce99b
|
||||
--- /dev/null
|
||||
+++ b/arch/arm64/boot/dts/amlogic/overlay/meson-i2cB.dts
|
||||
@@ -0,0 +1,17 @@
|
||||
+/dts-v1/;
|
||||
+
|
||||
+/ {
|
||||
+ compatible = "amlogic,meson-gxbb";
|
||||
+ fragment@0 {
|
||||
+ target-path = "/aliases";
|
||||
+ __overlay__ {
|
||||
+ i2cA = "/soc/bus@c1100000/i2c@87c0";
|
||||
+ };
|
||||
+ };
|
||||
+ fragment@1 {
|
||||
+ target-path = "/soc/bus@c1100000/i2c@87c0";
|
||||
+ __overlay__ {
|
||||
+ status = "okay";
|
||||
+ };
|
||||
+ };
|
||||
+};
|
||||
diff --git a/arch/arm64/boot/dts/amlogic/overlay/meson-uartA.dts b/arch/arm64/boot/dts/amlogic/overlay/meson-uartA.dts
|
||||
new file mode 100644
|
||||
index 000000000000..3aecd60aaf64
|
||||
--- /dev/null
|
||||
+++ b/arch/arm64/boot/dts/amlogic/overlay/meson-uartA.dts
|
||||
@@ -0,0 +1,11 @@
|
||||
+/dts-v1/;
|
||||
+
|
||||
+/ {
|
||||
+ compatible = "amlogic,meson-gxbb";
|
||||
+ fragment@0 {
|
||||
+ target-path = "/soc/bus@c1100000/serial@84c0";
|
||||
+ __overlay__ {
|
||||
+ status = "okay";
|
||||
+ };
|
||||
+ };
|
||||
+};
|
||||
diff --git a/arch/arm64/boot/dts/amlogic/overlay/meson-uartC.dts b/arch/arm64/boot/dts/amlogic/overlay/meson-uartC.dts
|
||||
new file mode 100644
|
||||
index 000000000000..2b40ee4c02d3
|
||||
--- /dev/null
|
||||
+++ b/arch/arm64/boot/dts/amlogic/overlay/meson-uartC.dts
|
||||
@@ -0,0 +1,11 @@
|
||||
+/dts-v1/;
|
||||
+
|
||||
+/ {
|
||||
+ compatible = "amlogic,meson-gxbb";
|
||||
+ fragment@0 {
|
||||
+ target-path = "/soc/bus@c1100000/serial@8700";
|
||||
+ __overlay__ {
|
||||
+ status = "okay";
|
||||
+ };
|
||||
+ };
|
||||
+};
|
||||
diff --git a/arch/arm64/boot/dts/amlogic/overlay/meson-w1-gpio.dts b/arch/arm64/boot/dts/amlogic/overlay/meson-w1-gpio.dts
|
||||
new file mode 100644
|
||||
index 000000000000..ac76a4f20ab7
|
||||
--- /dev/null
|
||||
+++ b/arch/arm64/boot/dts/amlogic/overlay/meson-w1-gpio.dts
|
||||
@@ -0,0 +1,20 @@
|
||||
+// Definitions for w1-gpio module (without external pullup)
|
||||
+/dts-v1/;
|
||||
+/plugin/;
|
||||
+
|
||||
+/ {
|
||||
+ compatible = "amlogic,meson-gxbb";
|
||||
+
|
||||
+ fragment@0 {
|
||||
+ target-path = "/";
|
||||
+ __overlay__ {
|
||||
+
|
||||
+ w1: onewire@0 {
|
||||
+ compatible = "w1-gpio";
|
||||
+ pinctrl-names = "default";
|
||||
+ gpios = <&gpio 91 6>; // GPIOY_16
|
||||
+ status = "okay";
|
||||
+ };
|
||||
+ };
|
||||
+ };
|
||||
+};
|
||||
diff --git a/arch/arm64/boot/dts/amlogic/overlay/meson-w1AB-gpio.dts b/arch/arm64/boot/dts/amlogic/overlay/meson-w1AB-gpio.dts
|
||||
new file mode 100644
|
||||
index 000000000000..f6b0d7eff158
|
||||
--- /dev/null
|
||||
+++ b/arch/arm64/boot/dts/amlogic/overlay/meson-w1AB-gpio.dts
|
||||
@@ -0,0 +1,32 @@
|
||||
+// Definitions for w1-gpio module (without external pullup)
|
||||
+/dts-v1/;
|
||||
+/plugin/;
|
||||
+
|
||||
+/ {
|
||||
+ compatible = "amlogic,meson-gxbb";
|
||||
+
|
||||
+ fragment@0 {
|
||||
+ target-path = "/";
|
||||
+ __overlay__ {
|
||||
+
|
||||
+ w1a: onewire@0 {
|
||||
+ compatible = "w1-gpio";
|
||||
+ pinctrl-names = "default";
|
||||
+ gpios = <&gpio 91 6>; // GPIOY_16
|
||||
+ status = "okay";
|
||||
+ };
|
||||
+ };
|
||||
+ };
|
||||
+ fragment@1 {
|
||||
+ target-path = "/";
|
||||
+ __overlay__ {
|
||||
+
|
||||
+ w1b: onewire@1 {
|
||||
+ compatible = "w1-gpio";
|
||||
+ pinctrl-names = "default";
|
||||
+ gpios = <&gpio 90 6>; // GPIOY_15
|
||||
+ status = "okay";
|
||||
+ };
|
||||
+ };
|
||||
+ };
|
||||
+};
|
||||
diff --git a/scripts/Makefile.lib b/scripts/Makefile.lib
|
||||
index a28448cebd7c..175e7b53eccf 100644
|
||||
--- a/scripts/Makefile.lib
|
||||
+++ b/scripts/Makefile.lib
|
||||
@@ -87,6 +87,9 @@ base-dtb-y := $(foreach m, $(multi-dtb-y), $(firstword $(call suffix-search, $m,
|
||||
|
||||
always-y += $(dtb-y)
|
||||
|
||||
+# Overlay targets
|
||||
+extra-y += $(dtbo-y) $(scr-y) $(dtbotxt-y)
|
||||
+
|
||||
# Add subdir path
|
||||
|
||||
extra-y := $(addprefix $(obj)/,$(extra-y))
|
||||
--
|
||||
2.30.2
|
||||
|
||||
@@ -1,14 +0,0 @@
|
||||
diff --git a/drivers/media/rc/meson-ir.c b/drivers/media/rc/meson-ir.c
|
||||
index 4b769111f78e..dd3aa1332f53 100644
|
||||
--- a/drivers/media/rc/meson-ir.c
|
||||
+++ b/drivers/media/rc/meson-ir.c
|
||||
@@ -91,7 +91,8 @@ static irqreturn_t meson_ir_irq(int irqno, void *dev_id)
|
||||
status = readl_relaxed(ir->reg + IR_DEC_STATUS);
|
||||
rawir.pulse = !!(status & STATUS_IR_DEC_IN);
|
||||
|
||||
- ir_raw_event_store_with_timeout(ir->rc, &rawir);
|
||||
+ if (ir_raw_event_store_with_filter(ir->rc, &rawir))
|
||||
+ ir_raw_event_handle(ir->rc);
|
||||
|
||||
spin_unlock(&ir->lock);
|
||||
|
||||
@@ -1,28 +0,0 @@
|
||||
From 2e01cc074cc426da4b390af025a736eda9aef80c Mon Sep 17 00:00:00 2001
|
||||
From: Koumes <koumes@centrum.cz>
|
||||
Date: Sat, 1 Jun 2019 21:20:26 +0000
|
||||
Subject: [PATCH] si2168: fix cmd timeout
|
||||
|
||||
Some demuxer si2168 commands may take 130-140 ms.
|
||||
(DVB-T/T2 tuner MyGica T230C v2).
|
||||
Details: https://github.com/CoreELEC/CoreELEC/pull/208
|
||||
---
|
||||
drivers/media/dvb-frontends/si2168.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/media/dvb-frontends/si2168.c b/drivers/media/dvb-frontends/si2168.c
|
||||
index b05e6772c..ffaba6f81 100644
|
||||
--- a/drivers/media/dvb-frontends/si2168.c
|
||||
+++ b/drivers/media/dvb-frontends/si2168.c
|
||||
@@ -42,7 +42,7 @@ static int si2168_cmd_execute(struct i2c_client *client, struct si2168_cmd *cmd)
|
||||
|
||||
if (cmd->rlen) {
|
||||
/* wait cmd execution terminate */
|
||||
- #define TIMEOUT 70
|
||||
+ #define TIMEOUT 200
|
||||
timeout = jiffies + msecs_to_jiffies(TIMEOUT);
|
||||
while (!time_after(jiffies, timeout)) {
|
||||
ret = i2c_master_recv(client, cmd->args, cmd->rlen);
|
||||
--
|
||||
2.17.1
|
||||
|
||||
@@ -1,37 +0,0 @@
|
||||
From 79828b7d8ee8674b1538514a754337554cd4f856 Mon Sep 17 00:00:00 2001
|
||||
From: ckkim <changkon12@gmail.com>
|
||||
Date: Thu, 20 Feb 2020 18:52:57 +0900
|
||||
Subject: [PATCH] ODROID-N2: sound/soc: remove mono channel as it currently
|
||||
doesn't work hdmi output.
|
||||
|
||||
Change-Id: I4d43b802815779687ade974f049f2b0517a411d1
|
||||
Signed-off-by: ckkim <changkon12@gmail.com>
|
||||
---
|
||||
sound/soc/meson/axg-frddr.c | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/sound/soc/meson/axg-frddr.c b/sound/soc/meson/axg-frddr.c
|
||||
index 37f4bb3469b5..b1cbeef98a73 100644
|
||||
--- a/sound/soc/meson/axg-frddr.c
|
||||
+++ b/sound/soc/meson/axg-frddr.c
|
||||
@@ -106,7 +106,7 @@ static struct snd_soc_dai_driver axg_frddr_dai_drv = {
|
||||
.name = "FRDDR",
|
||||
.playback = {
|
||||
.stream_name = "Playback",
|
||||
- .channels_min = 1,
|
||||
+ .channels_min = 2,
|
||||
.channels_max = AXG_FIFO_CH_MAX,
|
||||
.rates = AXG_FIFO_RATES,
|
||||
.formats = AXG_FIFO_FORMATS,
|
||||
@@ -180,7 +180,7 @@ static struct snd_soc_dai_driver g12a_frddr_dai_drv = {
|
||||
.name = "FRDDR",
|
||||
.playback = {
|
||||
.stream_name = "Playback",
|
||||
- .channels_min = 1,
|
||||
+ .channels_min = 2,
|
||||
.channels_max = AXG_FIFO_CH_MAX,
|
||||
.rates = AXG_FIFO_RATES,
|
||||
.formats = AXG_FIFO_FORMATS,
|
||||
--
|
||||
2.35.1
|
||||
|
||||
@@ -1,90 +0,0 @@
|
||||
From a5dc8bb92c6b67be7e48d442e821837b03fc129a Mon Sep 17 00:00:00 2001
|
||||
From: Andreas Rammhold <andreas@rammhold.de>
|
||||
Date: Thu, 28 Jan 2021 09:43:36 +0000
|
||||
Subject: [PATCH 17/58] FROMLIST(v1): spi-nor: add support for XT25F128B
|
||||
|
||||
This adds support for the XT25F128B as found on the RockPi4b SBC.
|
||||
|
||||
Signed-off-by: Andreas Rammhold <andreas@rammhold.de>
|
||||
---
|
||||
|
||||
This continues the efforts done in [1] & [2] that went stale. I've
|
||||
tested this patch on my RockPi4b which only has the xt25f128b (and not
|
||||
the xt25f32b as also propsed in [2]). I have tried to obtain a copy of
|
||||
the datasheets but was unable to find them. Not sure whre you would get
|
||||
them.
|
||||
|
||||
While [1] was already for the new spi-nor layout it was missing the bits
|
||||
in the core.{c,h} files.
|
||||
|
||||
[1]: https://patchwork.ozlabs.org/project/linux-mtd/patch/CAMgqO2y9MYDj6antOaWLBRKU8vGEwqCB-Y1TkXTSWsmsed+W6A@mail.gmail.com/
|
||||
[2]: https://patchwork.ozlabs.org/project/linux-mtd/patch/20200206171941.GA2398@makrotopia.org/
|
||||
---
|
||||
drivers/mtd/spi-nor/Makefile | 1 +
|
||||
drivers/mtd/spi-nor/core.c | 1 +
|
||||
drivers/mtd/spi-nor/core.h | 1 +
|
||||
drivers/mtd/spi-nor/xtx.c | 16 ++++++++++++++++
|
||||
4 files changed, 19 insertions(+)
|
||||
create mode 100644 drivers/mtd/spi-nor/xtx.c
|
||||
|
||||
diff --git a/drivers/mtd/spi-nor/Makefile b/drivers/mtd/spi-nor/Makefile
|
||||
index e347b435a038..8992c592a896 100644
|
||||
--- a/drivers/mtd/spi-nor/Makefile
|
||||
+++ b/drivers/mtd/spi-nor/Makefile
|
||||
@@ -17,6 +17,7 @@ spi-nor-objs += sst.o
|
||||
spi-nor-objs += winbond.o
|
||||
spi-nor-objs += xilinx.o
|
||||
spi-nor-objs += xmc.o
|
||||
+spi-nor-objs += xtx.o
|
||||
spi-nor-$(CONFIG_DEBUG_FS) += debugfs.o
|
||||
obj-$(CONFIG_MTD_SPI_NOR) += spi-nor.o
|
||||
|
||||
diff --git a/drivers/mtd/spi-nor/core.c b/drivers/mtd/spi-nor/core.c
|
||||
index 502967c76c5f..c171da5c8ca1 100644
|
||||
--- a/drivers/mtd/spi-nor/core.c
|
||||
+++ b/drivers/mtd/spi-nor/core.c
|
||||
@@ -1630,6 +1630,7 @@ static const struct spi_nor_manufacturer *manufacturers[] = {
|
||||
&spi_nor_winbond,
|
||||
&spi_nor_xilinx,
|
||||
&spi_nor_xmc,
|
||||
+ &spi_nor_xtx,
|
||||
};
|
||||
|
||||
static const struct flash_info *spi_nor_match_id(struct spi_nor *nor,
|
||||
diff --git a/drivers/mtd/spi-nor/core.h b/drivers/mtd/spi-nor/core.h
|
||||
index 3f841ec36e56..9e29d67b419b 100644
|
||||
--- a/drivers/mtd/spi-nor/core.h
|
||||
+++ b/drivers/mtd/spi-nor/core.h
|
||||
@@ -622,6 +622,7 @@ extern const struct spi_nor_manufacturer spi_nor_sst;
|
||||
extern const struct spi_nor_manufacturer spi_nor_winbond;
|
||||
extern const struct spi_nor_manufacturer spi_nor_xilinx;
|
||||
extern const struct spi_nor_manufacturer spi_nor_xmc;
|
||||
+extern const struct spi_nor_manufacturer spi_nor_xtx;
|
||||
|
||||
extern const struct attribute_group *spi_nor_sysfs_groups[];
|
||||
|
||||
diff --git a/drivers/mtd/spi-nor/xtx.c b/drivers/mtd/spi-nor/xtx.c
|
||||
new file mode 100644
|
||||
index 000000000000..73568854cf1e
|
||||
--- /dev/null
|
||||
+++ b/drivers/mtd/spi-nor/xtx.c
|
||||
@@ -0,0 +1,16 @@
|
||||
+// SPDX-License-Identifier: GPL-2.0
|
||||
+
|
||||
+#include <linux/mtd/spi-nor.h>
|
||||
+
|
||||
+#include "core.h"
|
||||
+
|
||||
+static const struct flash_info xtx_parts[] = {
|
||||
+ /* XTX (Shenzhen Xin Tian Xia Tech) */
|
||||
+ { "xt25f128b", INFO(0x0b4018, 0, 64 * 1024, 256) },
|
||||
+};
|
||||
+
|
||||
+const struct spi_nor_manufacturer spi_nor_xtx = {
|
||||
+ .name = "xtx",
|
||||
+ .parts = xtx_parts,
|
||||
+ .nparts = ARRAY_SIZE(xtx_parts),
|
||||
+};
|
||||
--
|
||||
2.30.2
|
||||
|
||||
@@ -1,54 +0,0 @@
|
||||
From 477a4f4816028d590f7b013e04b29319dbe66a24 Mon Sep 17 00:00:00 2001
|
||||
From: Heiner Kallweit <hkallweit1@gmail.com>
|
||||
Date: Wed, 23 Feb 2022 02:21:19 +0000
|
||||
Subject: [PATCH 50/90] FROMLIST(v1): usb: core: improve handling of hubs with
|
||||
no ports
|
||||
|
||||
I get the "hub doesn't have any ports" error message on a system with
|
||||
Amlogic S905W SoC. Seems the SoC has internal USB 3.0 supports but
|
||||
is crippled with regard to USB 3.0 ports.
|
||||
Maybe we shouldn't consider this scenario an error. So let's change
|
||||
the message to info level, but otherwise keep the handling of the
|
||||
scenario as it is today. With the patch it looks like this on my
|
||||
system.
|
||||
|
||||
dwc2 c9100000.usb: supply vusb_d not found, using dummy regulator
|
||||
dwc2 c9100000.usb: supply vusb_a not found, using dummy regulator
|
||||
dwc2 c9100000.usb: EPs: 7, dedicated fifos, 712 entries in SPRAM
|
||||
xhci-hcd xhci-hcd.0.auto: xHCI Host Controller
|
||||
xhci-hcd xhci-hcd.0.auto: new USB bus registered, assigned bus number 1
|
||||
xhci-hcd xhci-hcd.0.auto: hcc params 0x0228f664 hci version 0x100 quirks 0x0000000002010010
|
||||
xhci-hcd xhci-hcd.0.auto: irq 49, io mem 0xc9000000
|
||||
hub 1-0:1.0: USB hub found
|
||||
hub 1-0:1.0: 2 ports detected
|
||||
xhci-hcd xhci-hcd.0.auto: xHCI Host Controller
|
||||
xhci-hcd xhci-hcd.0.auto: new USB bus registered, assigned bus number 2
|
||||
xhci-hcd xhci-hcd.0.auto: Host supports USB 3.0 SuperSpeed
|
||||
usb usb2: We don't know the algorithms for LPM for this host, disabling LPM.
|
||||
hub 2-0:1.0: USB hub found
|
||||
hub 2-0:1.0: hub has no ports, exiting
|
||||
|
||||
Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
|
||||
---
|
||||
drivers/usb/core/hub.c | 5 ++---
|
||||
1 file changed, 2 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
|
||||
index 588f3ded89cd..4151b960915b 100644
|
||||
--- a/drivers/usb/core/hub.c
|
||||
+++ b/drivers/usb/core/hub.c
|
||||
@@ -1423,9 +1423,8 @@ static int hub_configure(struct usb_hub *hub,
|
||||
ret = -ENODEV;
|
||||
goto fail;
|
||||
} else if (hub->descriptor->bNbrPorts == 0) {
|
||||
- message = "hub doesn't have any ports!";
|
||||
- ret = -ENODEV;
|
||||
- goto fail;
|
||||
+ dev_info(hub_dev, "hub has no ports, exiting\n");
|
||||
+ return -ENODEV;
|
||||
}
|
||||
|
||||
/*
|
||||
--
|
||||
2.35.1
|
||||
|
||||
@@ -1,100 +0,0 @@
|
||||
From 369f3f5b1a0145b876407bd5900a90554cd89a05 Mon Sep 17 00:00:00 2001
|
||||
From: usera <adeep@lexina.in>
|
||||
Date: Mon, 12 Apr 2021 17:16:42 +0300
|
||||
Subject: [PATCH 5/5] Fix:meson64: add gpio irq (patch from
|
||||
https://lkml.org/lkml/2020/11/27/8)
|
||||
|
||||
Signed-off-by: Vyacheslav Bocharov <devel@lexina.in>
|
||||
---
|
||||
drivers/pinctrl/meson/pinctrl-meson.c | 41 +++++++++++++++++++++++++++
|
||||
drivers/pinctrl/meson/pinctrl-meson.h | 1 +
|
||||
2 files changed, 42 insertions(+)
|
||||
|
||||
diff --git a/drivers/pinctrl/meson/pinctrl-meson.c b/drivers/pinctrl/meson/pinctrl-meson.c
|
||||
index 49851444a6e3..3f295e9c561d 100644
|
||||
--- a/drivers/pinctrl/meson/pinctrl-meson.c
|
||||
+++ b/drivers/pinctrl/meson/pinctrl-meson.c
|
||||
@@ -51,6 +51,7 @@
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/regmap.h>
|
||||
#include <linux/seq_file.h>
|
||||
+#include <linux/of_irq.h>
|
||||
|
||||
#include "../core.h"
|
||||
#include "../pinctrl-utils.h"
|
||||
@@ -601,6 +602,40 @@ static int meson_gpio_get(struct gpio_chip *chip, unsigned gpio)
|
||||
return !!(val & BIT(bit));
|
||||
}
|
||||
|
||||
+static int meson_gpio_to_irq(struct gpio_chip *chip, unsigned int gpio)
|
||||
+{
|
||||
+ struct meson_pinctrl *pc = gpiochip_get_data(chip);
|
||||
+ struct meson_bank *bank;
|
||||
+ struct irq_fwspec fwspec;
|
||||
+ int hwirq;
|
||||
+
|
||||
+ if (meson_get_bank(pc, gpio, &bank))
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ if (bank->irq_first < 0) {
|
||||
+ dev_warn(pc->dev, "no support irq for pin[%d]\n", gpio);
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+ if (!pc->of_irq) {
|
||||
+ dev_err(pc->dev, "invalid device node of gpio INTC\n");
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+
|
||||
+ hwirq = gpio - bank->first + bank->irq_first;
|
||||
+ printk("gpio irq setup: hwirq: 0x%X irqfirst: 0x%X irqlast: 0x%X pin[%d]\n", hwirq, bank->irq_first, bank->irq_last, gpio);
|
||||
+ if (hwirq > bank->irq_last)
|
||||
+ {
|
||||
+ dev_warn(pc->dev, "no more irq for pin[%d]\n", gpio);
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+ fwspec.fwnode = of_node_to_fwnode(pc->of_irq);
|
||||
+ fwspec.param_count = 2;
|
||||
+ fwspec.param[0] = hwirq;
|
||||
+ fwspec.param[1] = IRQ_TYPE_NONE;
|
||||
+
|
||||
+ return irq_create_fwspec_mapping(&fwspec);
|
||||
+}
|
||||
+
|
||||
static int meson_gpiolib_register(struct meson_pinctrl *pc)
|
||||
{
|
||||
int ret;
|
||||
@@ -615,6 +650,7 @@ static int meson_gpiolib_register(struct meson_pinctrl *pc)
|
||||
pc->chip.direction_output = meson_gpio_direction_output;
|
||||
pc->chip.get = meson_gpio_get;
|
||||
pc->chip.set = meson_gpio_set;
|
||||
+ pc->chip.to_irq = meson_gpio_to_irq;
|
||||
pc->chip.base = -1;
|
||||
pc->chip.ngpio = pc->data->num_pins;
|
||||
pc->chip.can_sleep = false;
|
||||
@@ -685,6 +721,11 @@ static int meson_pinctrl_parse_dt(struct meson_pinctrl *pc,
|
||||
|
||||
pc->of_node = gpio_np;
|
||||
|
||||
+ pc->of_irq = of_find_compatible_node(NULL,
|
||||
+ NULL, "amlogic,meson-gpio-intc");
|
||||
+ if (!pc->of_irq)
|
||||
+ pc->of_irq = of_find_compatible_node(NULL,
|
||||
+ NULL, "amlogic,meson-gpio-intc-ext");
|
||||
pc->reg_mux = meson_map_resource(pc, gpio_np, "mux");
|
||||
if (IS_ERR_OR_NULL(pc->reg_mux)) {
|
||||
dev_err(pc->dev, "mux registers not found\n");
|
||||
diff --git a/drivers/pinctrl/meson/pinctrl-meson.h b/drivers/pinctrl/meson/pinctrl-meson.h
|
||||
index ff5372e0a475..07f277946d1b 100644
|
||||
--- a/drivers/pinctrl/meson/pinctrl-meson.h
|
||||
+++ b/drivers/pinctrl/meson/pinctrl-meson.h
|
||||
@@ -132,6 +132,7 @@ struct meson_pinctrl {
|
||||
struct regmap *reg_ds;
|
||||
struct gpio_chip chip;
|
||||
struct device_node *of_node;
|
||||
+ struct device_node *of_irq;
|
||||
};
|
||||
|
||||
#define FUNCTION(fn) \
|
||||
--
|
||||
2.35.1
|
||||
|
||||
@@ -1,867 +0,0 @@
|
||||
From 1307b424375ca85d1f3b021396c55f77dbeaf924 Mon Sep 17 00:00:00 2001
|
||||
From: Vyacheslav Bocharov <adeep@lexina.in>
|
||||
Date: Wed, 10 Aug 2022 13:40:37 +0300
|
||||
Subject: [PATCH 1/2] arm64: dts: meson-axg: add support for JetHub D1p (j110)
|
||||
|
||||
- add support for JetHome JetHub D1p (https://jethome.ru/d1p) is a home
|
||||
automation controller with the following features:
|
||||
- DIN Rail Mounting
|
||||
- Amlogic A113X (ARM Cortex-A53) quad-core up to 1.5GHz
|
||||
- no video out
|
||||
- 1/2/4GB LPDDR4
|
||||
- 8/16/32GB eMMC flash
|
||||
- 1 x USB 2.0
|
||||
- 1 x 10/100Mbps ethernet
|
||||
- WiFi / Bluetooth Realtek 8822CS or similar IEEE 802.11a/b/g/n/ac
|
||||
- TI CC2652P1 Zigbee Wireless Module with up to 20dBm output power
|
||||
and Zigbee 3.0 support.
|
||||
- 2 x gpio LEDS
|
||||
- GPIO user Button
|
||||
- 1 x 1-Wire
|
||||
- 2 x RS-485
|
||||
- 4 x dry contact digital GPIO inputs
|
||||
- 3 x relay GPIO outputs
|
||||
- DC source with a voltage of 9 to 56 V / Active POE
|
||||
|
||||
- unify device tree files for JetHub D1/D1p devices
|
||||
|
||||
Signed-off-by: Vyacheslav Bocharov <adeep@lexina.in>
|
||||
---
|
||||
arch/arm64/boot/dts/amlogic/Makefile | 2 +
|
||||
.../amlogic/meson-axg-jethome-jethub-j100.dts | 338 +----------------
|
||||
.../meson-axg-jethome-jethub-j110-rev-2.dts | 37 ++
|
||||
.../meson-axg-jethome-jethub-j110-rev-3.dts | 27 ++
|
||||
.../meson-axg-jethome-jethub-j1xx.dtsi | 351 ++++++++++++++++++
|
||||
5 files changed, 421 insertions(+), 334 deletions(-)
|
||||
create mode 100644 arch/arm64/boot/dts/amlogic/meson-axg-jethome-jethub-j110-rev-2.dts
|
||||
create mode 100644 arch/arm64/boot/dts/amlogic/meson-axg-jethome-jethub-j110-rev-3.dts
|
||||
create mode 100644 arch/arm64/boot/dts/amlogic/meson-axg-jethome-jethub-j1xx.dtsi
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/amlogic/Makefile b/arch/arm64/boot/dts/amlogic/Makefile
|
||||
index 8773211df50e..33e9c96af099 100644
|
||||
--- a/arch/arm64/boot/dts/amlogic/Makefile
|
||||
+++ b/arch/arm64/boot/dts/amlogic/Makefile
|
||||
@@ -1,6 +1,8 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
dtb-$(CONFIG_ARCH_MESON) += meson-a1-ad401.dtb
|
||||
dtb-$(CONFIG_ARCH_MESON) += meson-axg-jethome-jethub-j100.dtb
|
||||
+dtb-$(CONFIG_ARCH_MESON) += meson-axg-jethome-jethub-j110-rev-2.dtb
|
||||
+dtb-$(CONFIG_ARCH_MESON) += meson-axg-jethome-jethub-j110-rev-3.dtb
|
||||
dtb-$(CONFIG_ARCH_MESON) += meson-axg-s400.dtb
|
||||
dtb-$(CONFIG_ARCH_MESON) += meson-g12a-radxa-zero.dtb
|
||||
dtb-$(CONFIG_ARCH_MESON) += meson-g12a-sei510.dtb
|
||||
diff --git a/arch/arm64/boot/dts/amlogic/meson-axg-jethome-jethub-j100.dts b/arch/arm64/boot/dts/amlogic/meson-axg-jethome-jethub-j100.dts
|
||||
index 8b0d586aa84e..b2d6ba660914 100644
|
||||
--- a/arch/arm64/boot/dts/amlogic/meson-axg-jethome-jethub-j100.dts
|
||||
+++ b/arch/arm64/boot/dts/amlogic/meson-axg-jethome-jethub-j100.dts
|
||||
@@ -1,270 +1,29 @@
|
||||
// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
||||
/*
|
||||
- * Copyright (c) 2021 Vyacheslav Bocharov <adeep@lexina.in>
|
||||
- * Copyright (c) 2020 JetHome
|
||||
- * Author: Aleksandr Kazantsev <ak@tvip.ru>
|
||||
- * Author: Alexey Shevelkin <ash@tvip.ru>
|
||||
+ * Copyright (c) 2022 Vyacheslav Bocharov <adeep@lexina.in>
|
||||
+ * Copyright (c) 2022 JetHome
|
||||
* Author: Vyacheslav Bocharov <adeep@lexina.in>
|
||||
*/
|
||||
|
||||
/dts-v1/;
|
||||
|
||||
-#include "meson-axg.dtsi"
|
||||
-#include <dt-bindings/input/input.h>
|
||||
-#include <dt-bindings/thermal/thermal.h>
|
||||
+#include "meson-axg-jethome-jethub-j1xx.dtsi"
|
||||
|
||||
/ {
|
||||
compatible = "jethome,jethub-j100", "amlogic,a113d", "amlogic,meson-axg";
|
||||
- model = "JetHome JetHub J100";
|
||||
- aliases {
|
||||
- serial0 = &uart_AO; /* Console */
|
||||
- serial2 = &uart_AO_B; /* External UART (Wireless Module) */
|
||||
- ethernet0 = ðmac;
|
||||
- };
|
||||
-
|
||||
- chosen {
|
||||
- stdout-path = "serial0:115200n8";
|
||||
- };
|
||||
+ model = "JetHome JetHub D1 (J100)";
|
||||
|
||||
/* 1024MB RAM */
|
||||
memory@0 {
|
||||
device_type = "memory";
|
||||
reg = <0x0 0x0 0x0 0x40000000>;
|
||||
};
|
||||
-
|
||||
- reserved-memory {
|
||||
- linux,cma {
|
||||
- size = <0x0 0x400000>;
|
||||
- };
|
||||
- };
|
||||
-
|
||||
- emmc_pwrseq: emmc-pwrseq {
|
||||
- compatible = "mmc-pwrseq-emmc";
|
||||
- reset-gpios = <&gpio BOOT_9 GPIO_ACTIVE_LOW>;
|
||||
- };
|
||||
-
|
||||
- vcc_3v3: regulator-vcc_3v3 {
|
||||
- compatible = "regulator-fixed";
|
||||
- regulator-name = "VCC_3V3";
|
||||
- regulator-min-microvolt = <3300000>;
|
||||
- regulator-max-microvolt = <3300000>;
|
||||
- vin-supply = <&vddao_3v3>;
|
||||
- regulator-always-on;
|
||||
- };
|
||||
-
|
||||
- vcc_5v: regulator-vcc_5v {
|
||||
- compatible = "regulator-fixed";
|
||||
- regulator-name = "VCC5V";
|
||||
- regulator-min-microvolt = <5000000>;
|
||||
- regulator-max-microvolt = <5000000>;
|
||||
- regulator-always-on;
|
||||
- };
|
||||
-
|
||||
- vddao_3v3: regulator-vddao_3v3 {
|
||||
- compatible = "regulator-fixed";
|
||||
- regulator-name = "VDDAO_3V3";
|
||||
- regulator-min-microvolt = <3300000>;
|
||||
- regulator-max-microvolt = <3300000>;
|
||||
- vin-supply = <&vcc_5v>;
|
||||
- regulator-always-on;
|
||||
- };
|
||||
-
|
||||
- vddio_ao18: regulator-vddio_ao18 {
|
||||
- compatible = "regulator-fixed";
|
||||
- regulator-name = "VDDIO_AO18";
|
||||
- regulator-min-microvolt = <1800000>;
|
||||
- regulator-max-microvolt = <1800000>;
|
||||
- vin-supply = <&vddao_3v3>;
|
||||
- regulator-always-on;
|
||||
- };
|
||||
-
|
||||
- vddio_boot: regulator-vddio_boot {
|
||||
- compatible = "regulator-fixed";
|
||||
- regulator-name = "VDDIO_BOOT";
|
||||
- regulator-min-microvolt = <3300000>;
|
||||
- regulator-max-microvolt = <3300000>;
|
||||
- vin-supply = <&vddao_3v3>;
|
||||
- regulator-always-on;
|
||||
- };
|
||||
-
|
||||
- vccq_1v8: regulator-vccq_1v8 {
|
||||
- compatible = "regulator-fixed";
|
||||
- regulator-name = "VCCQ_1V8";
|
||||
- regulator-min-microvolt = <1800000>;
|
||||
- regulator-max-microvolt = <1800000>;
|
||||
- vin-supply = <&vddao_3v3>;
|
||||
- regulator-always-on;
|
||||
- };
|
||||
-
|
||||
- usb_pwr: regulator-usb_pwr {
|
||||
- compatible = "regulator-fixed";
|
||||
- regulator-name = "USB_PWR";
|
||||
- regulator-min-microvolt = <5000000>;
|
||||
- regulator-max-microvolt = <5000000>;
|
||||
- vin-supply = <&vcc_5v>;
|
||||
- regulator-always-on;
|
||||
- };
|
||||
-
|
||||
- sdio_pwrseq: sdio-pwrseq {
|
||||
- compatible = "mmc-pwrseq-simple";
|
||||
- reset-gpios = <&gpio GPIOX_7 GPIO_ACTIVE_LOW>;
|
||||
- clocks = <&wifi32k>;
|
||||
- clock-names = "ext_clock";
|
||||
- };
|
||||
-
|
||||
- wifi32k: wifi32k {
|
||||
- compatible = "pwm-clock";
|
||||
- #clock-cells = <0>;
|
||||
- clock-frequency = <32768>;
|
||||
- pwms = <&pwm_ab 0 30518 0>; /* PWM_A at 32.768KHz */
|
||||
- };
|
||||
-
|
||||
- thermal-zones {
|
||||
- cpu_thermal: cpu-thermal {
|
||||
- polling-delay-passive = <250>;
|
||||
- polling-delay = <1000>;
|
||||
- thermal-sensors = <&scpi_sensors 0>;
|
||||
- trips {
|
||||
- cpu_passive: cpu-passive {
|
||||
- temperature = <70000>; /* millicelsius */
|
||||
- hysteresis = <2000>; /* millicelsius */
|
||||
- type = "passive";
|
||||
- };
|
||||
-
|
||||
- cpu_hot: cpu-hot {
|
||||
- temperature = <80000>; /* millicelsius */
|
||||
- hysteresis = <2000>; /* millicelsius */
|
||||
- type = "hot";
|
||||
- };
|
||||
-
|
||||
- cpu_critical: cpu-critical {
|
||||
- temperature = <100000>; /* millicelsius */
|
||||
- hysteresis = <2000>; /* millicelsius */
|
||||
- type = "critical";
|
||||
- };
|
||||
- };
|
||||
-
|
||||
- cpu_cooling_maps: cooling-maps {
|
||||
- map0 {
|
||||
- trip = <&cpu_passive>;
|
||||
- cooling-device = <&cpu0 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
|
||||
- <&cpu1 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
|
||||
- <&cpu2 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
|
||||
- <&cpu3 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>;
|
||||
- };
|
||||
-
|
||||
- map1 {
|
||||
- trip = <&cpu_hot>;
|
||||
- cooling-device = <&cpu0 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
|
||||
- <&cpu1 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
|
||||
- <&cpu2 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
|
||||
- <&cpu3 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>;
|
||||
- };
|
||||
- };
|
||||
- };
|
||||
- };
|
||||
-
|
||||
- onewire {
|
||||
- compatible = "w1-gpio";
|
||||
- gpios = <&gpio GPIOA_14 GPIO_ACTIVE_HIGH>;
|
||||
- #gpio-cells = <1>;
|
||||
- };
|
||||
-};
|
||||
-
|
||||
-&efuse {
|
||||
- sn: sn@32 {
|
||||
- reg = <0x32 0x20>;
|
||||
- };
|
||||
-
|
||||
- eth_mac: eth_mac@0 {
|
||||
- reg = <0x0 0x6>;
|
||||
- };
|
||||
-
|
||||
- bt_mac: bt_mac@6 {
|
||||
- reg = <0x6 0x6>;
|
||||
- };
|
||||
-
|
||||
- wifi_mac: wifi_mac@c {
|
||||
- reg = <0xc 0x6>;
|
||||
- };
|
||||
-
|
||||
- bid: bid@12 {
|
||||
- reg = <0x12 0x20>;
|
||||
- };
|
||||
-};
|
||||
-
|
||||
-ðmac {
|
||||
- status = "okay";
|
||||
- pinctrl-0 = <ð_rmii_x_pins>;
|
||||
- pinctrl-names = "default";
|
||||
- phy-handle = <ð_phy0>;
|
||||
- phy-mode = "rmii";
|
||||
-
|
||||
- mdio {
|
||||
- compatible = "snps,dwmac-mdio";
|
||||
- #address-cells = <1>;
|
||||
- #size-cells = <0>;
|
||||
-
|
||||
- /* ICPlus IP101A/G Ethernet PHY (vendor_id=0x0243, model_id=0x0c54) */
|
||||
- eth_phy0: ethernet-phy@0 {
|
||||
- /* compatible = "ethernet-phy-id0243.0c54";*/
|
||||
- max-speed = <100>;
|
||||
- reg = <0>;
|
||||
-
|
||||
- reset-assert-us = <10000>;
|
||||
- reset-deassert-us = <10000>;
|
||||
- reset-gpios = <&gpio GPIOZ_5 GPIO_ACTIVE_LOW>;
|
||||
- };
|
||||
- };
|
||||
-};
|
||||
-
|
||||
-/* Internal I2C bus (on CPU module) */
|
||||
-&i2c1 {
|
||||
- status = "okay";
|
||||
- pinctrl-0 = <&i2c1_z_pins>;
|
||||
- pinctrl-names = "default";
|
||||
-
|
||||
- /* RTC */
|
||||
- pcf8563: pcf8563@51 {
|
||||
- compatible = "nxp,pcf8563";
|
||||
- reg = <0x51>;
|
||||
- status = "okay";
|
||||
- };
|
||||
};
|
||||
|
||||
-/* Peripheral I2C bus (on motherboard) */
|
||||
-&i2c_AO {
|
||||
- status = "okay";
|
||||
- pinctrl-0 = <&i2c_ao_sck_10_pins>, <&i2c_ao_sda_11_pins>;
|
||||
- pinctrl-names = "default";
|
||||
-};
|
||||
-
|
||||
-&pwm_ab {
|
||||
- status = "okay";
|
||||
- pinctrl-0 = <&pwm_a_x20_pins>;
|
||||
- pinctrl-names = "default";
|
||||
-};
|
||||
|
||||
/* wifi module */
|
||||
&sd_emmc_b {
|
||||
- status = "okay";
|
||||
- #address-cells = <1>;
|
||||
- #size-cells = <0>;
|
||||
-
|
||||
- pinctrl-0 = <&sdio_pins>;
|
||||
- pinctrl-1 = <&sdio_clk_gate_pins>;
|
||||
- pinctrl-names = "default", "clk-gate";
|
||||
-
|
||||
- bus-width = <4>;
|
||||
- cap-sd-highspeed;
|
||||
- max-frequency = <50000000>;
|
||||
non-removable;
|
||||
- disable-wp;
|
||||
-
|
||||
- mmc-pwrseq = <&sdio_pwrseq>;
|
||||
-
|
||||
- vmmc-supply = <&vddao_3v3>;
|
||||
- vqmmc-supply = <&vddio_boot>;
|
||||
|
||||
brcmf: wifi@1 {
|
||||
reg = <1>;
|
||||
@@ -272,99 +31,10 @@ brcmf: wifi@1 {
|
||||
};
|
||||
};
|
||||
|
||||
-/* emmc storage */
|
||||
-&sd_emmc_c {
|
||||
- status = "okay";
|
||||
- pinctrl-0 = <&emmc_pins>, <&emmc_ds_pins>;
|
||||
- pinctrl-1 = <&emmc_clk_gate_pins>;
|
||||
- pinctrl-names = "default", "clk-gate";
|
||||
-
|
||||
- bus-width = <8>;
|
||||
- cap-mmc-highspeed;
|
||||
- max-frequency = <200000000>;
|
||||
- non-removable;
|
||||
- disable-wp;
|
||||
- mmc-ddr-1_8v;
|
||||
- mmc-hs200-1_8v;
|
||||
-
|
||||
- mmc-pwrseq = <&emmc_pwrseq>;
|
||||
-
|
||||
- vmmc-supply = <&vcc_3v3>;
|
||||
- vqmmc-supply = <&vccq_1v8>;
|
||||
-};
|
||||
-
|
||||
/* UART Bluetooth */
|
||||
&uart_B {
|
||||
- status = "okay";
|
||||
- pinctrl-0 = <&uart_b_z_pins>, <&uart_b_z_cts_rts_pins>;
|
||||
- pinctrl-names = "default";
|
||||
- uart-has-rtscts;
|
||||
-
|
||||
bluetooth {
|
||||
compatible = "brcm,bcm43438-bt";
|
||||
shutdown-gpios = <&gpio GPIOZ_7 GPIO_ACTIVE_HIGH>;
|
||||
};
|
||||
};
|
||||
-
|
||||
-/* UART Console */
|
||||
-&uart_AO {
|
||||
- status = "okay";
|
||||
- pinctrl-0 = <&uart_ao_a_pins>;
|
||||
- pinctrl-names = "default";
|
||||
-};
|
||||
-
|
||||
-/* UART Wireless module */
|
||||
-&uart_AO_B {
|
||||
- status = "okay";
|
||||
- pinctrl-0 = <&uart_ao_b_pins>;
|
||||
- pinctrl-names = "default";
|
||||
-};
|
||||
-
|
||||
-&usb {
|
||||
- status = "okay";
|
||||
- phy-supply = <&usb_pwr>;
|
||||
-};
|
||||
-
|
||||
-&spicc1 {
|
||||
- status = "okay";
|
||||
- pinctrl-0 = <&spi1_x_pins>, <&spi1_ss0_x_pins>;
|
||||
- pinctrl-names = "default";
|
||||
-};
|
||||
-
|
||||
-&gpio {
|
||||
- gpio-line-names =
|
||||
- "", "", "", "", "", // 0 - 4
|
||||
- "", "", "", "", "", // 5 - 9
|
||||
- "UserButton", "", "", "", "", // 10 - 14
|
||||
- "", "", "", "", "", // 15 - 19
|
||||
- "", "", "", "", "", // 20 - 24
|
||||
- "", "LedRed", "LedGreen", "Output3", "Output2", // 25 - 29
|
||||
- "Output1", "", "", "", "", // 30 - 34
|
||||
- "", "ZigBeeBOOT", "", "", "", // 35 - 39
|
||||
- "1Wire", "ZigBeeRESET", "", "Input4", "Input3", // 40 - 44
|
||||
- "Input2", "Input1", "", "", "", // 45 - 49
|
||||
- "", "", "", "", "", // 50 - 54
|
||||
- "", "", "", "", "", // 55 - 59
|
||||
- "", "", "", "", "", // 60 - 64
|
||||
- "", "", "", "", "", // 65 - 69
|
||||
- "", "", "", "", "", // 70 - 74
|
||||
- "", "", "", "", "", // 75 - 79
|
||||
- "", "", "", "", "", // 80 - 84
|
||||
- "", ""; // 85-86
|
||||
-};
|
||||
-
|
||||
-&cpu0 {
|
||||
- #cooling-cells = <2>;
|
||||
-};
|
||||
-
|
||||
-&cpu1 {
|
||||
- #cooling-cells = <2>;
|
||||
-};
|
||||
-
|
||||
-&cpu2 {
|
||||
- #cooling-cells = <2>;
|
||||
-};
|
||||
-
|
||||
-&cpu3 {
|
||||
- #cooling-cells = <2>;
|
||||
-};
|
||||
diff --git a/arch/arm64/boot/dts/amlogic/meson-axg-jethome-jethub-j110-rev-2.dts b/arch/arm64/boot/dts/amlogic/meson-axg-jethome-jethub-j110-rev-2.dts
|
||||
new file mode 100644
|
||||
index 000000000000..0062667c4f65
|
||||
--- /dev/null
|
||||
+++ b/arch/arm64/boot/dts/amlogic/meson-axg-jethome-jethub-j110-rev-2.dts
|
||||
@@ -0,0 +1,37 @@
|
||||
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
||||
+/*
|
||||
+ * Copyright (c) 2022 Vyacheslav Bocharov <adeep@lexina.in>
|
||||
+ * Copyright (c) 2022 JetHome
|
||||
+ * Author: Vyacheslav Bocharov <adeep@lexina.in>
|
||||
+ */
|
||||
+
|
||||
+/dts-v1/;
|
||||
+
|
||||
+#include "meson-axg-jethome-jethub-j1xx.dtsi"
|
||||
+
|
||||
+/ {
|
||||
+ compatible = "jethome,jethub-j110", "amlogic,a113d", "amlogic,meson-axg";
|
||||
+ model = "JetHome JetHub D1p (J110) HW rev.2";
|
||||
+
|
||||
+ /* 2GiB or 4GiB RAM */
|
||||
+ memory@0 {
|
||||
+ device_type = "memory";
|
||||
+ reg = <0x0 0x0 0x0 0x80000000>;
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+
|
||||
+/* wifi module */
|
||||
+&sd_emmc_b {
|
||||
+ broken-cd;/* cd-gpios = <&gpio_ao GPIOAO_3 GPIO_ACTIVE_LOW>;*/
|
||||
+};
|
||||
+
|
||||
+/* UART Bluetooth */
|
||||
+&uart_B {
|
||||
+ bluetooth {
|
||||
+ compatible = "realtek,rtl8822cs-bt";
|
||||
+ enable-gpios = <&gpio GPIOZ_7 GPIO_ACTIVE_HIGH>;
|
||||
+ host-wake-gpios = <&gpio GPIOZ_8 GPIO_ACTIVE_HIGH>;
|
||||
+ device-wake-gpios = <&gpio GPIOZ_6 GPIO_ACTIVE_HIGH>;
|
||||
+ };
|
||||
+};
|
||||
diff --git a/arch/arm64/boot/dts/amlogic/meson-axg-jethome-jethub-j110-rev-3.dts b/arch/arm64/boot/dts/amlogic/meson-axg-jethome-jethub-j110-rev-3.dts
|
||||
new file mode 100644
|
||||
index 000000000000..c2d22b00c1cd
|
||||
--- /dev/null
|
||||
+++ b/arch/arm64/boot/dts/amlogic/meson-axg-jethome-jethub-j110-rev-3.dts
|
||||
@@ -0,0 +1,27 @@
|
||||
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
||||
+/*
|
||||
+ * Copyright (c) 2022 Vyacheslav Bocharov <adeep@lexina.in>
|
||||
+ * Copyright (c) 2022 JetHome
|
||||
+ * Author: Vyacheslav Bocharov <adeep@lexina.in>
|
||||
+ */
|
||||
+
|
||||
+/dts-v1/;
|
||||
+
|
||||
+#include "meson-axg-jethome-jethub-j1xx.dtsi"
|
||||
+
|
||||
+/ {
|
||||
+ compatible = "jethome,jethub-j110", "amlogic,a113d", "amlogic,meson-axg";
|
||||
+ model = "JetHome JetHub D1p (J110) Hw rev.3";
|
||||
+
|
||||
+ /* 2GiB or 4GiB RAM */
|
||||
+ memory@0 {
|
||||
+ device_type = "memory";
|
||||
+ reg = <0x0 0x0 0x0 0x80000000>;
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+
|
||||
+/* wifi module */
|
||||
+&sd_emmc_b {
|
||||
+ broken-cd;/* cd-gpios = <&gpio_ao GPIOAO_3 GPIO_ACTIVE_LOW>;*/
|
||||
+};
|
||||
diff --git a/arch/arm64/boot/dts/amlogic/meson-axg-jethome-jethub-j1xx.dtsi b/arch/arm64/boot/dts/amlogic/meson-axg-jethome-jethub-j1xx.dtsi
|
||||
new file mode 100644
|
||||
index 000000000000..5836b0030931
|
||||
--- /dev/null
|
||||
+++ b/arch/arm64/boot/dts/amlogic/meson-axg-jethome-jethub-j1xx.dtsi
|
||||
@@ -0,0 +1,351 @@
|
||||
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
||||
+/*
|
||||
+ * Copyright (c) 2022 Vyacheslav Bocharov <adeep@lexina.in>
|
||||
+ * Copyright (c) 2022 JetHome
|
||||
+ * Author: Vyacheslav Bocharov <adeep@lexina.in>
|
||||
+ * Author: Aleksandr Kazantsev <ak@tvip.ru>
|
||||
+ * Author: Alexey Shevelkin <ash@tvip.ru>
|
||||
+ */
|
||||
+
|
||||
+/dts-v1/;
|
||||
+
|
||||
+#include "meson-axg.dtsi"
|
||||
+#include <dt-bindings/input/input.h>
|
||||
+#include <dt-bindings/thermal/thermal.h>
|
||||
+
|
||||
+/ {
|
||||
+ aliases {
|
||||
+ serial0 = &uart_AO; /* Console */
|
||||
+ serial2 = &uart_AO_B; /* External UART (Wireless Module) */
|
||||
+ ethernet0 = ðmac;
|
||||
+ };
|
||||
+
|
||||
+ chosen {
|
||||
+ stdout-path = "serial0:115200n8";
|
||||
+ };
|
||||
+
|
||||
+ reserved-memory {
|
||||
+ linux,cma {
|
||||
+ size = <0x0 0x400000>;
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ emmc_pwrseq: emmc-pwrseq {
|
||||
+ compatible = "mmc-pwrseq-emmc";
|
||||
+ reset-gpios = <&gpio BOOT_9 GPIO_ACTIVE_LOW>;
|
||||
+ };
|
||||
+
|
||||
+ vcc_3v3: regulator-vcc_3v3 {
|
||||
+ compatible = "regulator-fixed";
|
||||
+ regulator-name = "VCC_3V3";
|
||||
+ regulator-min-microvolt = <3300000>;
|
||||
+ regulator-max-microvolt = <3300000>;
|
||||
+ vin-supply = <&vddao_3v3>;
|
||||
+ regulator-always-on;
|
||||
+ };
|
||||
+
|
||||
+ vcc_5v: regulator-vcc_5v {
|
||||
+ compatible = "regulator-fixed";
|
||||
+ regulator-name = "VCC5V";
|
||||
+ regulator-min-microvolt = <5000000>;
|
||||
+ regulator-max-microvolt = <5000000>;
|
||||
+ regulator-always-on;
|
||||
+ };
|
||||
+
|
||||
+ vddao_3v3: regulator-vddao_3v3 {
|
||||
+ compatible = "regulator-fixed";
|
||||
+ regulator-name = "VDDAO_3V3";
|
||||
+ regulator-min-microvolt = <3300000>;
|
||||
+ regulator-max-microvolt = <3300000>;
|
||||
+ vin-supply = <&vcc_5v>;
|
||||
+ regulator-always-on;
|
||||
+ };
|
||||
+
|
||||
+ vddio_ao18: regulator-vddio_ao18 {
|
||||
+ compatible = "regulator-fixed";
|
||||
+ regulator-name = "VDDIO_AO18";
|
||||
+ regulator-min-microvolt = <1800000>;
|
||||
+ regulator-max-microvolt = <1800000>;
|
||||
+ vin-supply = <&vddao_3v3>;
|
||||
+ regulator-always-on;
|
||||
+ };
|
||||
+
|
||||
+ vddio_boot: regulator-vddio_boot {
|
||||
+ compatible = "regulator-fixed";
|
||||
+ regulator-name = "VDDIO_BOOT";
|
||||
+ regulator-min-microvolt = <3300000>;
|
||||
+ regulator-max-microvolt = <3300000>;
|
||||
+ vin-supply = <&vddao_3v3>;
|
||||
+ regulator-always-on;
|
||||
+ };
|
||||
+
|
||||
+ vccq_1v8: regulator-vccq_1v8 {
|
||||
+ compatible = "regulator-fixed";
|
||||
+ regulator-name = "VCCQ_1V8";
|
||||
+ regulator-min-microvolt = <1800000>;
|
||||
+ regulator-max-microvolt = <1800000>;
|
||||
+ vin-supply = <&vddao_3v3>;
|
||||
+ regulator-always-on;
|
||||
+ };
|
||||
+
|
||||
+ usb_pwr: regulator-usb_pwr {
|
||||
+ compatible = "regulator-fixed";
|
||||
+ regulator-name = "USB_PWR";
|
||||
+ regulator-min-microvolt = <5000000>;
|
||||
+ regulator-max-microvolt = <5000000>;
|
||||
+ vin-supply = <&vcc_5v>;
|
||||
+ regulator-always-on;
|
||||
+ };
|
||||
+
|
||||
+ sdio_pwrseq: sdio-pwrseq {
|
||||
+ compatible = "mmc-pwrseq-simple";
|
||||
+ reset-gpios = <&gpio GPIOX_7 GPIO_ACTIVE_LOW>;
|
||||
+ clocks = <&wifi32k>;
|
||||
+ clock-names = "ext_clock";
|
||||
+ };
|
||||
+
|
||||
+ wifi32k: wifi32k {
|
||||
+ compatible = "pwm-clock";
|
||||
+ #clock-cells = <0>;
|
||||
+ clock-frequency = <32768>;
|
||||
+ pwms = <&pwm_ab 0 30518 0>; /* PWM_A at 32.768KHz */
|
||||
+ };
|
||||
+
|
||||
+ thermal-zones {
|
||||
+ cpu_thermal: cpu-thermal {
|
||||
+ polling-delay-passive = <250>;
|
||||
+ polling-delay = <1000>;
|
||||
+ thermal-sensors = <&scpi_sensors 0>;
|
||||
+ trips {
|
||||
+ cpu_passive: cpu-passive {
|
||||
+ temperature = <70000>; /* millicelsius */
|
||||
+ hysteresis = <2000>; /* millicelsius */
|
||||
+ type = "passive";
|
||||
+ };
|
||||
+
|
||||
+ cpu_hot: cpu-hot {
|
||||
+ temperature = <80000>; /* millicelsius */
|
||||
+ hysteresis = <2000>; /* millicelsius */
|
||||
+ type = "hot";
|
||||
+ };
|
||||
+
|
||||
+ cpu_critical: cpu-critical {
|
||||
+ temperature = <100000>; /* millicelsius */
|
||||
+ hysteresis = <2000>; /* millicelsius */
|
||||
+ type = "critical";
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ cpu_cooling_maps: cooling-maps {
|
||||
+ map0 {
|
||||
+ trip = <&cpu_passive>;
|
||||
+ cooling-device = <&cpu0 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
|
||||
+ <&cpu1 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
|
||||
+ <&cpu2 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
|
||||
+ <&cpu3 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>;
|
||||
+ };
|
||||
+
|
||||
+ map1 {
|
||||
+ trip = <&cpu_hot>;
|
||||
+ cooling-device = <&cpu0 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
|
||||
+ <&cpu1 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
|
||||
+ <&cpu2 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
|
||||
+ <&cpu3 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>;
|
||||
+ };
|
||||
+ };
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ onewire {
|
||||
+ compatible = "w1-gpio";
|
||||
+ gpios = <&gpio GPIOA_14 GPIO_ACTIVE_HIGH>;
|
||||
+ #gpio-cells = <1>;
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&efuse {
|
||||
+ sn: sn@32 {
|
||||
+ reg = <0x32 0x20>;
|
||||
+ };
|
||||
+
|
||||
+ eth_mac: eth_mac@0 {
|
||||
+ reg = <0x0 0x6>;
|
||||
+ };
|
||||
+
|
||||
+ bt_mac: bt_mac@6 {
|
||||
+ reg = <0x6 0x6>;
|
||||
+ };
|
||||
+
|
||||
+ wifi_mac: wifi_mac@c {
|
||||
+ reg = <0xc 0x6>;
|
||||
+ };
|
||||
+
|
||||
+ bid: bid@12 {
|
||||
+ reg = <0x12 0x20>;
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+ðmac {
|
||||
+ status = "okay";
|
||||
+ pinctrl-0 = <ð_rmii_x_pins>;
|
||||
+ pinctrl-names = "default";
|
||||
+ phy-handle = <ð_phy0>;
|
||||
+ phy-mode = "rmii";
|
||||
+
|
||||
+ mdio {
|
||||
+ compatible = "snps,dwmac-mdio";
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+
|
||||
+ /* ICPlus IP101A/G Ethernet PHY (vendor_id=0x0243, model_id=0x0c54) */
|
||||
+ eth_phy0: ethernet-phy@0 {
|
||||
+ /* compatible = "ethernet-phy-id0243.0c54";*/
|
||||
+ max-speed = <100>;
|
||||
+ reg = <0>;
|
||||
+
|
||||
+ reset-assert-us = <10000>;
|
||||
+ reset-deassert-us = <10000>;
|
||||
+ reset-gpios = <&gpio GPIOZ_5 GPIO_ACTIVE_LOW>;
|
||||
+ };
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+/* Internal I2C bus (on CPU module) */
|
||||
+&i2c1 {
|
||||
+ status = "okay";
|
||||
+ pinctrl-0 = <&i2c1_z_pins>;
|
||||
+ pinctrl-names = "default";
|
||||
+
|
||||
+ /* RTC */
|
||||
+ pcf8563: pcf8563@51 {
|
||||
+ compatible = "nxp,pcf8563";
|
||||
+ reg = <0x51>;
|
||||
+ status = "okay";
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+/* Peripheral I2C bus (on motherboard) */
|
||||
+&i2c_AO {
|
||||
+ status = "okay";
|
||||
+ pinctrl-0 = <&i2c_ao_sck_10_pins>, <&i2c_ao_sda_11_pins>;
|
||||
+ pinctrl-names = "default";
|
||||
+};
|
||||
+
|
||||
+&pwm_ab {
|
||||
+ status = "okay";
|
||||
+ pinctrl-0 = <&pwm_a_x20_pins>;
|
||||
+ pinctrl-names = "default";
|
||||
+};
|
||||
+
|
||||
+/* wifi module */
|
||||
+&sd_emmc_b {
|
||||
+ status = "okay";
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+
|
||||
+ pinctrl-0 = <&sdio_pins>;
|
||||
+ pinctrl-1 = <&sdio_clk_gate_pins>;
|
||||
+ pinctrl-names = "default", "clk-gate";
|
||||
+
|
||||
+ bus-width = <4>;
|
||||
+ cap-sd-highspeed;
|
||||
+ max-frequency = <50000000>;
|
||||
+ disable-wp;
|
||||
+
|
||||
+ mmc-pwrseq = <&sdio_pwrseq>;
|
||||
+
|
||||
+ vmmc-supply = <&vddao_3v3>;
|
||||
+ vqmmc-supply = <&vddio_boot>;
|
||||
+};
|
||||
+
|
||||
+/* emmc storage */
|
||||
+&sd_emmc_c {
|
||||
+ status = "okay";
|
||||
+ pinctrl-0 = <&emmc_pins>, <&emmc_ds_pins>;
|
||||
+ pinctrl-1 = <&emmc_clk_gate_pins>;
|
||||
+ pinctrl-names = "default", "clk-gate";
|
||||
+
|
||||
+ bus-width = <8>;
|
||||
+ cap-mmc-highspeed;
|
||||
+ max-frequency = <200000000>;
|
||||
+ non-removable;
|
||||
+ disable-wp;
|
||||
+ mmc-ddr-1_8v;
|
||||
+ mmc-hs200-1_8v;
|
||||
+
|
||||
+ mmc-pwrseq = <&emmc_pwrseq>;
|
||||
+
|
||||
+ vmmc-supply = <&vcc_3v3>;
|
||||
+ vqmmc-supply = <&vccq_1v8>;
|
||||
+};
|
||||
+
|
||||
+/* UART Bluetooth */
|
||||
+&uart_B {
|
||||
+ status = "okay";
|
||||
+ pinctrl-0 = <&uart_b_z_pins>, <&uart_b_z_cts_rts_pins>;
|
||||
+ pinctrl-names = "default";
|
||||
+ uart-has-rtscts;
|
||||
+};
|
||||
+
|
||||
+/* UART Console */
|
||||
+&uart_AO {
|
||||
+ status = "okay";
|
||||
+ pinctrl-0 = <&uart_ao_a_pins>;
|
||||
+ pinctrl-names = "default";
|
||||
+};
|
||||
+
|
||||
+/* UART Wireless module */
|
||||
+&uart_AO_B {
|
||||
+ status = "okay";
|
||||
+ pinctrl-0 = <&uart_ao_b_pins>;
|
||||
+ pinctrl-names = "default";
|
||||
+};
|
||||
+
|
||||
+&usb {
|
||||
+ status = "okay";
|
||||
+ phy-supply = <&usb_pwr>;
|
||||
+};
|
||||
+
|
||||
+&spicc1 {
|
||||
+ status = "okay";
|
||||
+ pinctrl-0 = <&spi1_x_pins>, <&spi1_ss0_x_pins>;
|
||||
+ pinctrl-names = "default";
|
||||
+};
|
||||
+
|
||||
+&gpio {
|
||||
+ gpio-line-names =
|
||||
+ "", "", "", "", "", // 0 - 4
|
||||
+ "", "", "", "", "", // 5 - 9
|
||||
+ "UserButton", "", "", "", "", // 10 - 14
|
||||
+ "", "", "", "", "", // 15 - 19
|
||||
+ "", "", "", "", "", // 20 - 24
|
||||
+ "", "LedRed", "LedGreen", "Output3", "Output2", // 25 - 29
|
||||
+ "Output1", "", "", "", "", // 30 - 34
|
||||
+ "", "ZigBeeBOOT", "", "", "", // 35 - 39
|
||||
+ "1Wire", "ZigBeeRESET", "", "Input4", "Input3", // 40 - 44
|
||||
+ "Input2", "Input1", "", "", "", // 45 - 49
|
||||
+ "", "", "", "", "", // 50 - 54
|
||||
+ "", "", "", "", "", // 55 - 59
|
||||
+ "", "", "", "", "", // 60 - 64
|
||||
+ "", "", "", "", "", // 65 - 69
|
||||
+ "", "", "", "", "", // 70 - 74
|
||||
+ "", "", "", "", "", // 75 - 79
|
||||
+ "", "", "", "", "", // 80 - 84
|
||||
+ "", ""; // 85-86
|
||||
+};
|
||||
+
|
||||
+&cpu0 {
|
||||
+ #cooling-cells = <2>;
|
||||
+};
|
||||
+
|
||||
+&cpu1 {
|
||||
+ #cooling-cells = <2>;
|
||||
+};
|
||||
+
|
||||
+&cpu2 {
|
||||
+ #cooling-cells = <2>;
|
||||
+};
|
||||
+
|
||||
+&cpu3 {
|
||||
+ #cooling-cells = <2>;
|
||||
+};
|
||||
--
|
||||
2.30.2
|
||||
|
||||
@@ -1,29 +0,0 @@
|
||||
From 08b0c478ad097372ab668f03db3890545aaca59d Mon Sep 17 00:00:00 2001
|
||||
From: Vyacheslav Bocharov <adeep@lexina.in>
|
||||
Date: Wed, 10 Aug 2022 13:51:46 +0300
|
||||
Subject: [PATCH 2/2] dt-bindings: arm: amlogic: add bindings for Jethub D1p
|
||||
(j110)
|
||||
|
||||
JetHome JetHub D1p is a home automation controller, modification
|
||||
of JetHub D1 based on Amlogic A113X
|
||||
|
||||
Signed-off-by: Vyacheslav Bocharov <adeep@lexina.in>
|
||||
---
|
||||
Documentation/devicetree/bindings/arm/amlogic.yaml | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/Documentation/devicetree/bindings/arm/amlogic.yaml b/Documentation/devicetree/bindings/arm/amlogic.yaml
|
||||
index 61a6cabb375b..9ac73e961146 100644
|
||||
--- a/Documentation/devicetree/bindings/arm/amlogic.yaml
|
||||
+++ b/Documentation/devicetree/bindings/arm/amlogic.yaml
|
||||
@@ -136,6 +136,7 @@ properties:
|
||||
- enum:
|
||||
- amlogic,s400
|
||||
- jethome,jethub-j100
|
||||
+ - jethome,jethub-j110
|
||||
- const: amlogic,a113d
|
||||
- const: amlogic,meson-axg
|
||||
|
||||
--
|
||||
2.30.2
|
||||
|
||||
@@ -1,41 +0,0 @@
|
||||
From 9c2b8d82e36bf5ce932e6561d13adf5c7c5d367f Mon Sep 17 00:00:00 2001
|
||||
From: Neil Armstrong <narmstrong@baylibre.com>
|
||||
Date: Thu, 3 Nov 2016 15:29:25 +0100
|
||||
Subject: [PATCH 06/90] HACK: arm64: dts: meson: add support for GX PM and
|
||||
Virtual RTC
|
||||
|
||||
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
|
||||
---
|
||||
arch/arm64/boot/dts/amlogic/meson-gx.dtsi | 9 +++++++++
|
||||
1 file changed, 9 insertions(+)
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/amlogic/meson-gx.dtsi b/arch/arm64/boot/dts/amlogic/meson-gx.dtsi
|
||||
index 99b8916e0c5d..d6dc407127cd 100644
|
||||
--- a/arch/arm64/boot/dts/amlogic/meson-gx.dtsi
|
||||
+++ b/arch/arm64/boot/dts/amlogic/meson-gx.dtsi
|
||||
@@ -221,6 +221,10 @@ sm: secure-monitor {
|
||||
};
|
||||
};
|
||||
|
||||
+ system-suspend {
|
||||
+ compatible = "amlogic,meson-gx-pm";
|
||||
+ };
|
||||
+
|
||||
efuse: efuse {
|
||||
compatible = "amlogic,meson-gx-efuse", "amlogic,meson-gxbb-efuse";
|
||||
#address-cells = <1>;
|
||||
@@ -459,6 +463,11 @@ clkc_AO: clock-controller {
|
||||
};
|
||||
};
|
||||
|
||||
+ vrtc: rtc@a8 {
|
||||
+ compatible = "amlogic,meson-vrtc";
|
||||
+ reg = <0x0 0x000a8 0x0 0x4>;
|
||||
+ };
|
||||
+
|
||||
cec_AO: cec@100 {
|
||||
compatible = "amlogic,meson-gx-ao-cec";
|
||||
reg = <0x0 0x00100 0x0 0x14>;
|
||||
--
|
||||
2.35.1
|
||||
|
||||
@@ -1,22 +0,0 @@
|
||||
diff --git a/arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi b/arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi
|
||||
index 7c029f552a23..b3c22861b022 100644
|
||||
--- a/arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi
|
||||
+++ b/arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi
|
||||
@@ -333,6 +333,8 @@ &hwrng {
|
||||
|
||||
&i2c_A {
|
||||
clocks = <&clkc CLKID_I2C>;
|
||||
+ pinctrl-names = "default";
|
||||
+ pinctrl-0 = <&i2c_a_pins>;
|
||||
};
|
||||
|
||||
&i2c_AO {
|
||||
@@ -341,6 +343,8 @@ &i2c_AO {
|
||||
|
||||
&i2c_B {
|
||||
clocks = <&clkc CLKID_I2C>;
|
||||
+ pinctrl-names = "default";
|
||||
+ pinctrl-0 = <&i2c_b_pins>;
|
||||
};
|
||||
|
||||
&i2c_C {
|
||||
@@ -1,39 +0,0 @@
|
||||
From 975c23d02776b023a75e6090b521a839e67a8c42 Mon Sep 17 00:00:00 2001
|
||||
From: Christian Hewitt <christianshewitt@gmail.com>
|
||||
Date: Sun, 21 Nov 2021 19:12:07 +0000
|
||||
Subject: [PATCH 66/90] WIP: drivers: meson: vdec: add HEVC support to GXBB
|
||||
|
||||
It's not clear whether the GXL firmware is the same one used with GXBB
|
||||
but let's try it and see!
|
||||
|
||||
Signed-off-by: Christian Hewitt <christianshewitt@gmail.com>
|
||||
---
|
||||
drivers/staging/media/meson/vdec/vdec_platform.c | 12 ++++++++++++
|
||||
1 file changed, 12 insertions(+)
|
||||
|
||||
diff --git a/drivers/staging/media/meson/vdec/vdec_platform.c b/drivers/staging/media/meson/vdec/vdec_platform.c
|
||||
index 8592cb3aaea9..810039a02b44 100644
|
||||
--- a/drivers/staging/media/meson/vdec/vdec_platform.c
|
||||
+++ b/drivers/staging/media/meson/vdec/vdec_platform.c
|
||||
@@ -16,6 +16,18 @@
|
||||
|
||||
static const struct amvdec_format vdec_formats_gxbb[] = {
|
||||
{
|
||||
+ .pixfmt = V4L2_PIX_FMT_HEVC,
|
||||
+ .min_buffers = 4,
|
||||
+ .max_buffers = 24,
|
||||
+ .max_width = 3840,
|
||||
+ .max_height = 2160,
|
||||
+ .vdec_ops = &vdec_hevc_ops,
|
||||
+ .codec_ops = &codec_hevc_ops,
|
||||
+ .firmware_path = "meson/vdec/gxl_hevc.bin",
|
||||
+ .pixfmts_cap = { V4L2_PIX_FMT_NV12M, 0 },
|
||||
+ .flags = V4L2_FMT_FLAG_COMPRESSED |
|
||||
+ V4L2_FMT_FLAG_DYN_RESOLUTION,
|
||||
+ }, {
|
||||
.pixfmt = V4L2_PIX_FMT_H264,
|
||||
.min_buffers = 2,
|
||||
.max_buffers = 24,
|
||||
--
|
||||
2.35.1
|
||||
|
||||
@@ -1,44 +0,0 @@
|
||||
From fa0fc8498a811c85bace6138f60b7d09f07d18b8 Mon Sep 17 00:00:00 2001
|
||||
From: Christian Hewitt <christianshewitt@gmail.com>
|
||||
Date: Thu, 25 Nov 2021 11:31:43 +0000
|
||||
Subject: [PATCH 43/90] FROMLIST(v1): drivers: meson: vdec: add VP9 support to
|
||||
GXM
|
||||
|
||||
VP9 support for GXM appears to have been missed from the original
|
||||
codec submission [0] but it works well, so let's add support.
|
||||
|
||||
[0] https://github.com/torvalds/linux/commit/00c43088aa680989407b6afbda295f67b3f123f1
|
||||
|
||||
Signed-off-by: Christian Hewitt <christianshewitt@gmail.com>
|
||||
---
|
||||
drivers/staging/media/meson/vdec/vdec_platform.c | 12 ++++++++++++
|
||||
1 file changed, 12 insertions(+)
|
||||
|
||||
diff --git a/drivers/staging/media/meson/vdec/vdec_platform.c b/drivers/staging/media/meson/vdec/vdec_platform.c
|
||||
index 810039a02b44..38f353c6d27d 100644
|
||||
--- a/drivers/staging/media/meson/vdec/vdec_platform.c
|
||||
+++ b/drivers/staging/media/meson/vdec/vdec_platform.c
|
||||
@@ -27,7 +27,19 @@ static const struct amvdec_format vdec_formats_gxbb[] = {
|
||||
.pixfmts_cap = { V4L2_PIX_FMT_NV12M, 0 },
|
||||
.flags = V4L2_FMT_FLAG_COMPRESSED |
|
||||
V4L2_FMT_FLAG_DYN_RESOLUTION,
|
||||
- }, {
|
||||
+ }, {
|
||||
+ .pixfmt = V4L2_PIX_FMT_VP9,
|
||||
+ .min_buffers = 16,
|
||||
+ .max_buffers = 24,
|
||||
+ .max_width = 3840,
|
||||
+ .max_height = 2160,
|
||||
+ .vdec_ops = &vdec_hevc_ops,
|
||||
+ .codec_ops = &codec_vp9_ops,
|
||||
+ .firmware_path = "meson/vdec/gxl_vp9.bin",
|
||||
+ .pixfmts_cap = { V4L2_PIX_FMT_NV12M, 0 },
|
||||
+ .flags = V4L2_FMT_FLAG_COMPRESSED |
|
||||
+ V4L2_FMT_FLAG_DYN_RESOLUTION,
|
||||
+ }, {
|
||||
.pixfmt = V4L2_PIX_FMT_H264,
|
||||
.min_buffers = 2,
|
||||
.max_buffers = 24,
|
||||
--
|
||||
2.35.1
|
||||
|
||||
@@ -1,34 +0,0 @@
|
||||
From a11802ecb5686153614aa19a089900c22928988c Mon Sep 17 00:00:00 2001
|
||||
From: Igor Pecovnik <igor.pecovnik@gmail.com>
|
||||
Date: Tue, 4 Aug 2020 22:51:56 +0200
|
||||
Subject: [PATCH] Add higher clocks for SM1 family
|
||||
|
||||
Signed-off-by: Igor Pecovnik <igor.pecovnik@gmail.com>
|
||||
---
|
||||
arch/arm64/boot/dts/amlogic/meson-sm1.dtsi | 10 ++++++++++
|
||||
1 file changed, 10 insertions(+)
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/amlogic/meson-sm1.dtsi b/arch/arm64/boot/dts/amlogic/meson-sm1.dtsi
|
||||
index d4ec735fb..a35cad1d4 100644
|
||||
--- a/arch/arm64/boot/dts/amlogic/meson-sm1.dtsi
|
||||
+++ b/arch/arm64/boot/dts/amlogic/meson-sm1.dtsi
|
||||
@@ -150,6 +150,16 @@ opp-1908000000 {
|
||||
opp-hz = /bits/ 64 <1908000000>;
|
||||
opp-microvolt = <950000>;
|
||||
};
|
||||
+
|
||||
+ opp-2016000000 {
|
||||
+ opp-hz = /bits/ 64 <2016000000>;
|
||||
+ opp-microvolt = <1000000>;
|
||||
+ };
|
||||
+
|
||||
+ opp-2100000000 {
|
||||
+ opp-hz = /bits/ 64 <2100000000>;
|
||||
+ opp-microvolt = <1022000>;
|
||||
+ };
|
||||
};
|
||||
};
|
||||
|
||||
--
|
||||
Created with Armbian build tools https://github.com/armbian/build
|
||||
|
||||
@@ -1,623 +0,0 @@
|
||||
diff --git a/Documentation/devicetree/bindings/arm/amlogic.yaml b/Documentation/devicetree/bindings/arm/amlogic.yaml
|
||||
index 61a6cab..f6d36a7 100644
|
||||
--- a/Documentation/devicetree/bindings/arm/amlogic.yaml
|
||||
+++ b/Documentation/devicetree/bindings/arm/amlogic.yaml
|
||||
@@ -152,6 +152,7 @@ properties:
|
||||
items:
|
||||
- enum:
|
||||
- khadas,vim3
|
||||
+ - bananapi,m2s
|
||||
- const: amlogic,a311d
|
||||
- const: amlogic,g12b
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/amlogic/Makefile b/arch/arm64/boot/dts/amlogic/Makefile
|
||||
index 8773211..cf57b0f 100644
|
||||
--- a/arch/arm64/boot/dts/amlogic/Makefile
|
||||
+++ b/arch/arm64/boot/dts/amlogic/Makefile
|
||||
@@ -7,6 +7,7 @@ dtb-$(CONFIG_ARCH_MESON) += meson-g12a-sei510.dtb
|
||||
dtb-$(CONFIG_ARCH_MESON) += meson-g12a-u200.dtb
|
||||
dtb-$(CONFIG_ARCH_MESON) += meson-g12a-x96-max.dtb
|
||||
dtb-$(CONFIG_ARCH_MESON) += meson-g12b-a311d-khadas-vim3.dtb
|
||||
+dtb-$(CONFIG_ARCH_MESON) += meson-g12b-a311d-bananapi-m2s.dtb
|
||||
dtb-$(CONFIG_ARCH_MESON) += meson-g12b-gsking-x.dtb
|
||||
dtb-$(CONFIG_ARCH_MESON) += meson-g12b-gtking-pro.dtb
|
||||
dtb-$(CONFIG_ARCH_MESON) += meson-g12b-gtking.dtb
|
||||
diff --git a/arch/arm64/boot/dts/amlogic/meson-g12b-a311d-bananapi-m2s.dts b/arch/arm64/boot/dts/amlogic/meson-g12b-a311d-bananapi-m2s.dts
|
||||
new file mode 100644
|
||||
index 0000000..5c4aa73
|
||||
--- /dev/null
|
||||
+++ b/arch/arm64/boot/dts/amlogic/meson-g12b-a311d-bananapi-m2s.dts
|
||||
@@ -0,0 +1,593 @@
|
||||
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
||||
+/*
|
||||
+ * Author: Jean Rhum <jeanrhum@gmail.com>
|
||||
+ * Adapted from bananapi-m2s 4.9 dts, mainline vim3 and radxa zero2 dts(i)
|
||||
+ */
|
||||
+
|
||||
+/dts-v1/;
|
||||
+
|
||||
+#include "meson-g12b-a311d.dtsi"
|
||||
+#include <dt-bindings/input/input.h>
|
||||
+#include <dt-bindings/leds/common.h>
|
||||
+#include <dt-bindings/gpio/meson-g12a-gpio.h>
|
||||
+#include <dt-bindings/sound/meson-g12a-tohdmitx.h>
|
||||
+
|
||||
+/ {
|
||||
+ compatible = "bananapi,m2s", "amlogic,a311d", "amlogic,g12b";
|
||||
+ model = "Bananapi M2S";
|
||||
+
|
||||
+ aliases {
|
||||
+ serial0 = &uart_AO;
|
||||
+ serial2 = &uart_A;
|
||||
+ ethernet0 = ðmac;
|
||||
+ };
|
||||
+
|
||||
+ chosen {
|
||||
+ stdout-path = "serial0:115200n8";
|
||||
+ };
|
||||
+
|
||||
+ memory@0 {
|
||||
+ device_type = "memory";
|
||||
+ reg = <0x0 0x0 0x0 0x80000000>;
|
||||
+ };
|
||||
+
|
||||
+ leds {
|
||||
+ compatible = "gpio-leds";
|
||||
+ status = "okay";
|
||||
+
|
||||
+ blue {
|
||||
+ label = "blue";
|
||||
+ gpios = <0x18 0x07 0x01>;
|
||||
+ default-state = "on";
|
||||
+ linux,default-trigger = "default-on";
|
||||
+ };
|
||||
+
|
||||
+ green {
|
||||
+ label = "green";
|
||||
+ gpios = <0x18 0x02 0x01>;
|
||||
+ default-state = "on";
|
||||
+ linux,default-trigger = "timer";
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+
|
||||
+ hdmi-connector {
|
||||
+ compatible = "hdmi-connector";
|
||||
+ type = "a";
|
||||
+
|
||||
+ port {
|
||||
+ hdmi_connector_in: endpoint {
|
||||
+ remote-endpoint = <&hdmi_tx_tmds_out>;
|
||||
+ };
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+
|
||||
+ emmc_pwrseq: emmc-pwrseq {
|
||||
+ compatible = "mmc-pwrseq-emmc";
|
||||
+ reset-gpios = <&gpio BOOT_12 GPIO_ACTIVE_LOW>;
|
||||
+ };
|
||||
+
|
||||
+ sdio_pwrseq: sdio-pwrseq {
|
||||
+ compatible = "mmc-pwrseq-simple";
|
||||
+ reset-gpios = <&gpio GPIOX_6 GPIO_ACTIVE_LOW>;
|
||||
+ clocks = <&wifi32k>;
|
||||
+ clock-names = "ext_clock";
|
||||
+ };
|
||||
+
|
||||
+ dc_in: regulator-dc_in {
|
||||
+ compatible = "regulator-fixed";
|
||||
+ regulator-name = "DC_IN";
|
||||
+ regulator-min-microvolt = <5000000>;
|
||||
+ regulator-max-microvolt = <5000000>;
|
||||
+ regulator-always-on;
|
||||
+ };
|
||||
+
|
||||
+ vcc_5v: regulator-vcc_5v {
|
||||
+ compatible = "regulator-fixed";
|
||||
+ regulator-name = "VCC_5V";
|
||||
+ regulator-min-microvolt = <5000000>;
|
||||
+ regulator-max-microvolt = <5000000>;
|
||||
+ vin-supply = <&dc_in>;
|
||||
+
|
||||
+ gpio = <&gpio GPIOH_8 GPIO_OPEN_DRAIN>;
|
||||
+ enable-active-high;
|
||||
+ };
|
||||
+
|
||||
+ vcc_1v8: regulator-vcc_1v8 {
|
||||
+ compatible = "regulator-fixed";
|
||||
+ regulator-name = "VCC_1V8";
|
||||
+ regulator-min-microvolt = <1800000>;
|
||||
+ regulator-max-microvolt = <1800000>;
|
||||
+ vin-supply = <&vcc_3v3>;
|
||||
+ regulator-always-on;
|
||||
+ };
|
||||
+
|
||||
+ vcc_3v3: regulator-vcc_3v3 {
|
||||
+ compatible = "regulator-fixed";
|
||||
+ regulator-name = "VCC_3V3";
|
||||
+ regulator-min-microvolt = <3300000>;
|
||||
+ regulator-max-microvolt = <3300000>;
|
||||
+ vin-supply = <&vsys_3v3>;
|
||||
+ regulator-always-on;
|
||||
+ /* FIXME: actually controlled by VDDCPU_B_EN */
|
||||
+ };
|
||||
+
|
||||
+ vddao_1v8: regulator-vddao_1v8 {
|
||||
+ compatible = "regulator-fixed";
|
||||
+ regulator-name = "VDDIO_AO1V8";
|
||||
+ regulator-min-microvolt = <1800000>;
|
||||
+ regulator-max-microvolt = <1800000>;
|
||||
+ vin-supply = <&vsys_3v3>;
|
||||
+ regulator-always-on;
|
||||
+ };
|
||||
+
|
||||
+ emmc_1v8: regulator-emmc_1v8 {
|
||||
+ compatible = "regulator-fixed";
|
||||
+ regulator-name = "EMMC_AO1V8";
|
||||
+ regulator-min-microvolt = <1800000>;
|
||||
+ regulator-max-microvolt = <1800000>;
|
||||
+ vin-supply = <&vcc_3v3>;
|
||||
+ regulator-always-on;
|
||||
+ };
|
||||
+
|
||||
+ vsys_3v3: regulator-vcc_3v3 {
|
||||
+ compatible = "regulator-fixed";
|
||||
+ regulator-name = "VSYS_3V3";
|
||||
+ regulator-min-microvolt = <3300000>;
|
||||
+ regulator-max-microvolt = <3300000>;
|
||||
+ vin-supply = <&dc_in>;
|
||||
+ regulator-always-on;
|
||||
+ };
|
||||
+
|
||||
+ usb_pwr: regulator-usb_pwr {
|
||||
+ compatible = "regulator-fixed";
|
||||
+ regulator-name = "USB_PWR";
|
||||
+ regulator-min-microvolt = <5000000>;
|
||||
+ regulator-max-microvolt = <5000000>;
|
||||
+ vin-supply = <&vcc_5v>;
|
||||
+
|
||||
+ gpio = <&gpio GPIOA_6 GPIO_ACTIVE_HIGH>;
|
||||
+ enable-active-high;
|
||||
+ };
|
||||
+
|
||||
+ hdmi-connector {
|
||||
+ compatible = "hdmi-connector";
|
||||
+ type = "a";
|
||||
+
|
||||
+ port {
|
||||
+ hdmi_connector_in: endpoint {
|
||||
+ remote-endpoint = <&hdmi_tx_tmds_out>;
|
||||
+ };
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ vddcpu_a: regulator-vddcpu-a {
|
||||
+ /*
|
||||
+ * MP8756GD Regulator.
|
||||
+ */
|
||||
+ compatible = "pwm-regulator";
|
||||
+
|
||||
+ regulator-name = "VDDCPU_A";
|
||||
+ regulator-min-microvolt = <730000>;
|
||||
+ regulator-max-microvolt = <1010000>;
|
||||
+
|
||||
+ pwm-supply = <&dc_in>;
|
||||
+
|
||||
+ pwms = <&pwm_ab 0 1250 0>;
|
||||
+ pwm-dutycycle-range = <100 0>;
|
||||
+
|
||||
+ regulator-boot-on;
|
||||
+ regulator-always-on;
|
||||
+ };
|
||||
+
|
||||
+ vddcpu_b: regulator-vddcpu-b {
|
||||
+ /*
|
||||
+ * Silergy SY8120B1ABC Regulator.
|
||||
+ */
|
||||
+ compatible = "pwm-regulator";
|
||||
+
|
||||
+ regulator-name = "VDDCPU_B";
|
||||
+ regulator-min-microvolt = <730000>;
|
||||
+ regulator-max-microvolt = <1010000>;
|
||||
+
|
||||
+ pwm-supply = <&dc_in>;
|
||||
+
|
||||
+ pwms = <&pwm_AO_cd 1 1250 0>;
|
||||
+ pwm-dutycycle-range = <100 0>;
|
||||
+
|
||||
+ regulator-boot-on;
|
||||
+ regulator-always-on;
|
||||
+ };
|
||||
+
|
||||
+ sound {
|
||||
+ compatible = "amlogic,axg-sound-card";
|
||||
+ model = "BANANAPI-M2S";
|
||||
+ audio-aux-devs = <&tdmout_b>;
|
||||
+ audio-routing = "TDMOUT_B IN 0", "FRDDR_A OUT 1",
|
||||
+ "TDMOUT_B IN 1", "FRDDR_B OUT 1",
|
||||
+ "TDMOUT_B IN 2", "FRDDR_C OUT 1",
|
||||
+ "TDM_B Playback", "TDMOUT_B OUT";
|
||||
+
|
||||
+ assigned-clocks = <&clkc CLKID_MPLL2>,
|
||||
+ <&clkc CLKID_MPLL0>,
|
||||
+ <&clkc CLKID_MPLL1>;
|
||||
+ assigned-clock-parents = <0>, <0>, <0>;
|
||||
+ assigned-clock-rates = <294912000>,
|
||||
+ <270950400>,
|
||||
+ <393216000>;
|
||||
+ status = "okay";
|
||||
+
|
||||
+ dai-link-0 {
|
||||
+ sound-dai = <&frddr_a>;
|
||||
+ };
|
||||
+
|
||||
+ dai-link-1 {
|
||||
+ sound-dai = <&frddr_b>;
|
||||
+ };
|
||||
+
|
||||
+ dai-link-2 {
|
||||
+ sound-dai = <&frddr_c>;
|
||||
+ };
|
||||
+
|
||||
+ /* 8ch hdmi interface */
|
||||
+ dai-link-3 {
|
||||
+ sound-dai = <&tdmif_b>;
|
||||
+ dai-format = "i2s";
|
||||
+ dai-tdm-slot-tx-mask-0 = <1 1>;
|
||||
+ dai-tdm-slot-tx-mask-1 = <1 1>;
|
||||
+ dai-tdm-slot-tx-mask-2 = <1 1>;
|
||||
+ dai-tdm-slot-tx-mask-3 = <1 1>;
|
||||
+ mclk-fs = <256>;
|
||||
+
|
||||
+ codec {
|
||||
+ sound-dai = <&tohdmitx TOHDMITX_I2S_IN_B>;
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ /* hdmi glue */
|
||||
+ dai-link-4 {
|
||||
+ sound-dai = <&tohdmitx TOHDMITX_I2S_OUT>;
|
||||
+
|
||||
+ codec {
|
||||
+ sound-dai = <&hdmi_tx>;
|
||||
+ };
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ wifi32k: wifi32k {
|
||||
+ compatible = "pwm-clock";
|
||||
+ #clock-cells = <0>;
|
||||
+ clock-frequency = <32768>;
|
||||
+ pwms = <&pwm_ef 0 30518 0>; /* PWM_E at 32.768KHz */
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+
|
||||
+&arb {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&clkc_audio {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&cec_AO {
|
||||
+ pinctrl-0 = <&cec_ao_a_h_pins>;
|
||||
+ pinctrl-names = "default";
|
||||
+ status = "disabled";
|
||||
+ hdmi-phandle = <&hdmi_tx>;
|
||||
+};
|
||||
+
|
||||
+&cecb_AO {
|
||||
+ pinctrl-0 = <&cec_ao_b_h_pins>;
|
||||
+ pinctrl-names = "default";
|
||||
+ status = "okay";
|
||||
+ hdmi-phandle = <&hdmi_tx>;
|
||||
+};
|
||||
+
|
||||
+
|
||||
+&cpu_thermal {
|
||||
+ trips {
|
||||
+ cpu_active: cpu-active {
|
||||
+ temperature = <80000>; /* millicelsius */
|
||||
+ hysteresis = <2000>; /* millicelsius */
|
||||
+ type = "active";
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+};
|
||||
+
|
||||
+
|
||||
+&saradc {
|
||||
+ status = "okay";
|
||||
+ vref-supply = <&vddao_1v8>;
|
||||
+};
|
||||
+
|
||||
+
|
||||
+&ext_mdio {
|
||||
+ external_phy: ethernet-phy@0 {
|
||||
+ /* Realtek RTL8211F (0x001cc916) */
|
||||
+ reg = <0>;
|
||||
+ max-speed = <1000>;
|
||||
+
|
||||
+ interrupt-parent = <&gpio_intc>;
|
||||
+ /* MAC_INTR on GPIOZ_14 */
|
||||
+ interrupts = <26 IRQ_TYPE_LEVEL_LOW>;
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+ðmac {
|
||||
+ pinctrl-0 = <ð_pins>, <ð_rgmii_pins>;
|
||||
+ pinctrl-names = "default";
|
||||
+ status = "okay";
|
||||
+ phy-mode = "rgmii";
|
||||
+ phy-handle = <&external_phy>;
|
||||
+ amlogic,tx-delay-ns = <2>;
|
||||
+};
|
||||
+
|
||||
+&frddr_a {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&frddr_b {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&frddr_c {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&hdmi_tx {
|
||||
+ status = "okay";
|
||||
+ pinctrl-0 = <&hdmitx_hpd_pins>, <&hdmitx_ddc_pins>;
|
||||
+ pinctrl-names = "default";
|
||||
+ hdmi-supply = <&vcc_5v>;
|
||||
+};
|
||||
+
|
||||
+&hdmi_tx_tmds_port {
|
||||
+ hdmi_tx_tmds_out: endpoint {
|
||||
+ remote-endpoint = <&hdmi_connector_in>;
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+
|
||||
+&cpu0 {
|
||||
+ cpu-supply = <&vddcpu_b>;
|
||||
+ operating-points-v2 = <&cpu_opp_table_0>;
|
||||
+ clocks = <&clkc CLKID_CPU_CLK>;
|
||||
+ clock-latency = <50000>;
|
||||
+};
|
||||
+
|
||||
+&cpu1 {
|
||||
+ cpu-supply = <&vddcpu_b>;
|
||||
+ operating-points-v2 = <&cpu_opp_table_0>;
|
||||
+ clocks = <&clkc CLKID_CPU_CLK>;
|
||||
+ clock-latency = <50000>;
|
||||
+};
|
||||
+
|
||||
+&cpu100 {
|
||||
+ cpu-supply = <&vddcpu_a>;
|
||||
+ operating-points-v2 = <&cpub_opp_table_1>;
|
||||
+ clocks = <&clkc CLKID_CPUB_CLK>;
|
||||
+ clock-latency = <50000>;
|
||||
+};
|
||||
+
|
||||
+&cpu101 {
|
||||
+ cpu-supply = <&vddcpu_a>;
|
||||
+ operating-points-v2 = <&cpub_opp_table_1>;
|
||||
+ clocks = <&clkc CLKID_CPUB_CLK>;
|
||||
+ clock-latency = <50000>;
|
||||
+};
|
||||
+
|
||||
+&cpu102 {
|
||||
+ cpu-supply = <&vddcpu_a>;
|
||||
+ operating-points-v2 = <&cpub_opp_table_1>;
|
||||
+ clocks = <&clkc CLKID_CPUB_CLK>;
|
||||
+ clock-latency = <50000>;
|
||||
+};
|
||||
+
|
||||
+&cpu103 {
|
||||
+ cpu-supply = <&vddcpu_a>;
|
||||
+ operating-points-v2 = <&cpub_opp_table_1>;
|
||||
+ clocks = <&clkc CLKID_CPUB_CLK>;
|
||||
+ clock-latency = <50000>;
|
||||
+};
|
||||
+
|
||||
+&pwm_ab {
|
||||
+ pinctrl-0 = <&pwm_a_e_pins>;
|
||||
+ pinctrl-names = "default";
|
||||
+ clocks = <&xtal>;
|
||||
+ clock-names = "clkin0";
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&pwm_ef {
|
||||
+ pinctrl-0 = <&pwm_e_pins>;
|
||||
+ pinctrl-names = "default";
|
||||
+ clocks = <&xtal>;
|
||||
+ clock-names = "clkin2";
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&pwm_AO_cd {
|
||||
+ pinctrl-0 = <&pwm_ao_d_e_pins>;
|
||||
+ pinctrl-names = "default";
|
||||
+ clocks = <&xtal>;
|
||||
+ clock-names = "clkin4";
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+
|
||||
+&ir {
|
||||
+ status = "disabled";
|
||||
+ pinctrl-0 = <&remote_input_ao_pins>;
|
||||
+ pinctrl-names = "default";
|
||||
+};
|
||||
+
|
||||
+
|
||||
+/* SDIO */
|
||||
+&sd_emmc_a {
|
||||
+ status = "okay";
|
||||
+ pinctrl-0 = <&sdio_pins>;
|
||||
+ pinctrl-1 = <&sdio_clk_gate_pins>;
|
||||
+ pinctrl-names = "default", "clk-gate";
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+
|
||||
+ bus-width = <4>;
|
||||
+ cap-sd-highspeed;
|
||||
+ max-frequency = <100000000>;
|
||||
+
|
||||
+ non-removable;
|
||||
+ disable-wp;
|
||||
+
|
||||
+ /* WiFi firmware requires power to be kept while in suspend */
|
||||
+ keep-power-in-suspend;
|
||||
+
|
||||
+ mmc-pwrseq = <&sdio_pwrseq>;
|
||||
+
|
||||
+ vmmc-supply = <&vsys_3v3>;
|
||||
+ vqmmc-supply = <&vddao_1v8>;
|
||||
+
|
||||
+ brcmf: wifi@1 {
|
||||
+ reg = <1>;
|
||||
+ compatible = "brcm,bcm4329-fmac";
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&gpio {
|
||||
+ gpio-line-names =
|
||||
+ /* GPIOZ */
|
||||
+ "PIN_27", "PIN_28", "PIN_7", "PIN_11", "PIN_13", "PIN_15", "PIN_18", "PIN_40",
|
||||
+ "", "", "", "", "", "", "", "",
|
||||
+ /* GPIOH */
|
||||
+ "", "", "", "", "PIN_19", "PIN_21", "PIN_24", "PIN_23",
|
||||
+ "",
|
||||
+ /* BOOT */
|
||||
+ "", "", "", "", "", "", "", "",
|
||||
+ "", "", "", "", "EMMC_PWRSEQ", "", "", "",
|
||||
+ /* GPIOC */
|
||||
+ "", "", "", "", "", "", "SD_CD", "PIN_36",
|
||||
+ /* GPIOA */
|
||||
+ "PIN_32", "PIN_12", "PIN_35", "", "", "PIN_38", "", "",
|
||||
+ "", "", "", "", "LED_GREEN", "PIN_31", "PIN_3", "PIN_5",
|
||||
+ /* GPIOX */
|
||||
+ "", "", "", "", "", "", "SDIO_PWRSEQ", "",
|
||||
+ "", "", "", "", "", "", "", "",
|
||||
+ "", "BT_SHUTDOWN", "", "";
|
||||
+};
|
||||
+
|
||||
+&gpio_ao {
|
||||
+ gpio-line-names =
|
||||
+ /* GPIOAO */
|
||||
+ "PIN_8", "PIN_10", "", "BTN_POWER", "", "", "", "PIN_29",
|
||||
+ "PIN_33", "PIN_37", "FAN", "",
|
||||
+ /* GPIOE */
|
||||
+ "", "", "";
|
||||
+};
|
||||
+
|
||||
+/* SD card */
|
||||
+&sd_emmc_b {
|
||||
+ status = "okay";
|
||||
+ pinctrl-0 = <&sdcard_c_pins>;
|
||||
+ pinctrl-1 = <&sdcard_clk_gate_c_pins>;
|
||||
+ pinctrl-names = "default", "clk-gate";
|
||||
+
|
||||
+ bus-width = <4>;
|
||||
+ cap-sd-highspeed;
|
||||
+ max-frequency = <50000000>;
|
||||
+ disable-wp;
|
||||
+
|
||||
+ cd-gpios = <&gpio GPIOC_6 GPIO_ACTIVE_LOW>;
|
||||
+ vmmc-supply = <&vsys_3v3>;
|
||||
+ vqmmc-supply = <&vsys_3v3>;
|
||||
+};
|
||||
+
|
||||
+/* eMMC */
|
||||
+&sd_emmc_c {
|
||||
+ status = "okay";
|
||||
+ pinctrl-0 = <&emmc_ctrl_pins>, <&emmc_data_8b_pins>, <&emmc_ds_pins>;
|
||||
+ pinctrl-1 = <&emmc_clk_gate_pins>;
|
||||
+ pinctrl-names = "default", "clk-gate";
|
||||
+
|
||||
+ bus-width = <8>;
|
||||
+ cap-mmc-highspeed;
|
||||
+ mmc-ddr-1_8v;
|
||||
+ mmc-hs200-1_8v;
|
||||
+ max-frequency = <200000000>;
|
||||
+ disable-wp;
|
||||
+
|
||||
+ mmc-pwrseq = <&emmc_pwrseq>;
|
||||
+ vmmc-supply = <&vcc_3v3>;
|
||||
+ vqmmc-supply = <&emmc_1v8>;
|
||||
+};
|
||||
+
|
||||
+
|
||||
+&tdmif_a {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&tdmin_a {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&tdmout_a {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&toddr_a {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&toddr_b {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&toddr_c {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&tohdmitx {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+
|
||||
+&uart_A {
|
||||
+ status = "okay";
|
||||
+ pinctrl-0 = <&uart_a_pins>, <&uart_a_cts_rts_pins>;
|
||||
+ pinctrl-names = "default";
|
||||
+ uart-has-rtscts;
|
||||
+
|
||||
+ bluetooth {
|
||||
+ compatible = "brcm,bcm43438-bt";
|
||||
+ shutdown-gpios = <&gpio GPIOX_17 GPIO_ACTIVE_HIGH>;
|
||||
+ max-speed = <2000000>;
|
||||
+ clocks = <&wifi32k>;
|
||||
+ clock-names = "lpo";
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&uart_AO {
|
||||
+ status = "okay";
|
||||
+ pinctrl-0 = <&uart_ao_a_pins>;
|
||||
+ pinctrl-names = "default";
|
||||
+};
|
||||
+
|
||||
+&usb2_phy0 {
|
||||
+ phy-supply = <&dc_in>;
|
||||
+};
|
||||
+
|
||||
+&usb2_phy1 {
|
||||
+ phy-supply = <&usb_pwr>;
|
||||
+};
|
||||
+
|
||||
+&usb3_pcie_phy {
|
||||
+ phy-supply = <&usb_pwr>;
|
||||
+};
|
||||
+
|
||||
+&usb {
|
||||
+ status = "okay";
|
||||
+ dr_mode = "peripheral";
|
||||
+};
|
||||
+
|
||||
@@ -1,652 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Christian Hewitt <christianshewitt@gmail.com>
|
||||
Date: Wed, 16 Feb 2022 07:27:07 +0000
|
||||
Subject: dt-bindings: arm: amlogic: add support for Radxa Zero2
|
||||
|
||||
The Radxa Zero2 is a small form-factor SBC using the Amlogic
|
||||
A311D chip.
|
||||
|
||||
Signed-off-by: Christian Hewitt <christianshewitt@gmail.com>
|
||||
Signed-off-by: Yuntian Zhang <yt@radxa.com>
|
||||
---
|
||||
Documentation/devicetree/bindings/arm/amlogic.yaml | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/Documentation/devicetree/bindings/arm/amlogic.yaml b/Documentation/devicetree/bindings/arm/amlogic.yaml
|
||||
index 61a6cabb375b..bf32821281b1 100644
|
||||
--- a/Documentation/devicetree/bindings/arm/amlogic.yaml
|
||||
+++ b/Documentation/devicetree/bindings/arm/amlogic.yaml
|
||||
@@ -152,6 +152,7 @@ properties:
|
||||
items:
|
||||
- enum:
|
||||
- khadas,vim3
|
||||
+ - radxa,zero2
|
||||
- const: amlogic,a311d
|
||||
- const: amlogic,g12b
|
||||
|
||||
--
|
||||
Armbian
|
||||
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Yuntian Zhang <yt@radxa.com>
|
||||
Date: Fri, 14 Jan 2022 15:50:02 +0000
|
||||
Subject: arm64: dts: meson: add support for Radxa Zero2
|
||||
|
||||
Radxa Zero2 is a small form factor SBC based on the Amlogic A311D
|
||||
chipset that ships in a number of eMMC configurations:
|
||||
|
||||
- Amlogic A311D (Quad A73 + Dual A53) CPU
|
||||
- 4GB LPDDR4 RAM
|
||||
- 32/64/128GB eMMC
|
||||
- Mali G52-MP4 GPU
|
||||
- HDMI 2.1 output (micro)
|
||||
- BCM4345 WiFi (2.4/5GHz a/b/g/n/ac) and BT 5.0
|
||||
- 1x USB 2.0 port - Type C (OTG)
|
||||
- 1x USB 3.0 port - Type C (Host)
|
||||
- 1x micro SD Card slot
|
||||
- 40 Pin GPIO header
|
||||
|
||||
Signed-off-by: Yuntian Zhang <yt@radxa.com>
|
||||
Signed-off-by: Christian Hewitt <christianshewitt@gmail.com>
|
||||
---
|
||||
arch/arm64/boot/dts/amlogic/Makefile | 1 +
|
||||
arch/arm64/boot/dts/amlogic/meson-g12b-radxa-zero2.dts | 576 ++++++++++
|
||||
2 files changed, 577 insertions(+)
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/amlogic/Makefile b/arch/arm64/boot/dts/amlogic/Makefile
|
||||
index 8773211df50e..f231280cd808 100644
|
||||
--- a/arch/arm64/boot/dts/amlogic/Makefile
|
||||
+++ b/arch/arm64/boot/dts/amlogic/Makefile
|
||||
@@ -12,6 +12,7 @@ dtb-$(CONFIG_ARCH_MESON) += meson-g12b-gtking-pro.dtb
|
||||
dtb-$(CONFIG_ARCH_MESON) += meson-g12b-gtking.dtb
|
||||
dtb-$(CONFIG_ARCH_MESON) += meson-g12b-odroid-n2-plus.dtb
|
||||
dtb-$(CONFIG_ARCH_MESON) += meson-g12b-odroid-n2.dtb
|
||||
+dtb-$(CONFIG_ARCH_MESON) += meson-g12b-radxa-zero2.dtb
|
||||
dtb-$(CONFIG_ARCH_MESON) += meson-g12b-s922x-khadas-vim3.dtb
|
||||
dtb-$(CONFIG_ARCH_MESON) += meson-g12b-ugoos-am6.dtb
|
||||
dtb-$(CONFIG_ARCH_MESON) += meson-gxbb-kii-pro.dtb
|
||||
diff --git a/arch/arm64/boot/dts/amlogic/meson-g12b-radxa-zero2.dts b/arch/arm64/boot/dts/amlogic/meson-g12b-radxa-zero2.dts
|
||||
new file mode 100644
|
||||
index 000000000000..e261ba2a4b47
|
||||
--- /dev/null
|
||||
+++ b/arch/arm64/boot/dts/amlogic/meson-g12b-radxa-zero2.dts
|
||||
@@ -0,0 +1,576 @@
|
||||
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
||||
+/*
|
||||
+ * Copyright (c) 2019 BayLibre, SAS
|
||||
+ * Author: Neil Armstrong <narmstrong@baylibre.com>
|
||||
+ * Copyright (c) 2019 Christian Hewitt <christianshewitt@gmail.com>
|
||||
+ * Copyright (c) 2022 Radxa Limited
|
||||
+ * Author: Yuntian Zhang <yt@radxa.com>
|
||||
+ */
|
||||
+
|
||||
+/dts-v1/;
|
||||
+
|
||||
+#include "meson-g12b-a311d.dtsi"
|
||||
+#include <dt-bindings/input/input.h>
|
||||
+#include <dt-bindings/leds/common.h>
|
||||
+#include <dt-bindings/gpio/meson-g12a-gpio.h>
|
||||
+#include <dt-bindings/sound/meson-g12a-tohdmitx.h>
|
||||
+
|
||||
+/ {
|
||||
+ compatible = "radxa,zero2", "amlogic,a311d", "amlogic,g12b";
|
||||
+ model = "Radxa Zero 2";
|
||||
+
|
||||
+ aliases {
|
||||
+ serial0 = &uart_AO;
|
||||
+ serial2 = &uart_A;
|
||||
+ };
|
||||
+
|
||||
+ chosen {
|
||||
+ stdout-path = "serial0:115200n8";
|
||||
+ };
|
||||
+
|
||||
+ fan0: pwm-fan {
|
||||
+ compatible = "pwm-fan";
|
||||
+ #cooling-cells = <2>;
|
||||
+ cooling-levels = <0 64 128 192 255>;
|
||||
+ pwms = <&pwm_AO_ab 0 40000 0>;
|
||||
+ };
|
||||
+
|
||||
+ memory@0 {
|
||||
+ device_type = "memory";
|
||||
+ reg = <0x0 0x0 0x0 0x80000000>;
|
||||
+ };
|
||||
+
|
||||
+ gpio-keys-polled {
|
||||
+ compatible = "gpio-keys-polled";
|
||||
+ poll-interval = <100>;
|
||||
+ power-button {
|
||||
+ label = "power";
|
||||
+ linux,code = <KEY_POWER>;
|
||||
+ gpios = <&gpio_ao GPIOAO_3 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>;
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ leds {
|
||||
+ compatible = "gpio-leds";
|
||||
+
|
||||
+ led-green {
|
||||
+ color = <LED_COLOR_ID_GREEN>;
|
||||
+ function = LED_FUNCTION_STATUS;
|
||||
+ gpios = <&gpio GPIOA_12 GPIO_ACTIVE_HIGH>;
|
||||
+ linux,default-trigger = "heartbeat";
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ cvbs-connector {
|
||||
+ status = "disabled";
|
||||
+ compatible = "composite-video-connector";
|
||||
+
|
||||
+ port {
|
||||
+ cvbs_connector_in: endpoint {
|
||||
+ remote-endpoint = <&cvbs_vdac_out>;
|
||||
+ };
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ hdmi-connector {
|
||||
+ compatible = "hdmi-connector";
|
||||
+ type = "a";
|
||||
+
|
||||
+ port {
|
||||
+ hdmi_connector_in: endpoint {
|
||||
+ remote-endpoint = <&hdmi_tx_tmds_out>;
|
||||
+ };
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ emmc_pwrseq: emmc-pwrseq {
|
||||
+ compatible = "mmc-pwrseq-emmc";
|
||||
+ reset-gpios = <&gpio BOOT_12 GPIO_ACTIVE_LOW>;
|
||||
+ };
|
||||
+
|
||||
+ sdio_pwrseq: sdio-pwrseq {
|
||||
+ compatible = "mmc-pwrseq-simple";
|
||||
+ reset-gpios = <&gpio GPIOX_6 GPIO_ACTIVE_LOW>;
|
||||
+ clocks = <&wifi32k>;
|
||||
+ clock-names = "ext_clock";
|
||||
+ };
|
||||
+
|
||||
+ typec2_vbus: regulator-typec2_vbus {
|
||||
+ compatible = "regulator-fixed";
|
||||
+ regulator-name = "TYPEC2_VBUS";
|
||||
+ regulator-min-microvolt = <5000000>;
|
||||
+ regulator-max-microvolt = <5000000>;
|
||||
+ vin-supply = <&ao_5v>;
|
||||
+ };
|
||||
+
|
||||
+ ao_5v: regulator-ao_5v {
|
||||
+ compatible = "regulator-fixed";
|
||||
+ regulator-name = "AO_5V";
|
||||
+ regulator-min-microvolt = <5000000>;
|
||||
+ regulator-max-microvolt = <5000000>;
|
||||
+ regulator-always-on;
|
||||
+ };
|
||||
+
|
||||
+ vcc_1v8: regulator-vcc_1v8 {
|
||||
+ compatible = "regulator-fixed";
|
||||
+ regulator-name = "VCC_1V8";
|
||||
+ regulator-min-microvolt = <1800000>;
|
||||
+ regulator-max-microvolt = <1800000>;
|
||||
+ vin-supply = <&vcc_3v3>;
|
||||
+ regulator-always-on;
|
||||
+ };
|
||||
+
|
||||
+ vcc_3v3: regulator-vcc_3v3 {
|
||||
+ compatible = "regulator-fixed";
|
||||
+ regulator-name = "VCC_3V3";
|
||||
+ regulator-min-microvolt = <3300000>;
|
||||
+ regulator-max-microvolt = <3300000>;
|
||||
+ vin-supply = <&vddao_3v3>;
|
||||
+ regulator-always-on;
|
||||
+ /* FIXME: actually controlled by VDDCPU_B_EN */
|
||||
+ };
|
||||
+
|
||||
+ vddao_1v8: regulator-vddao_1v8 {
|
||||
+ compatible = "regulator-fixed";
|
||||
+ regulator-name = "VDDIO_AO1V8";
|
||||
+ regulator-min-microvolt = <1800000>;
|
||||
+ regulator-max-microvolt = <1800000>;
|
||||
+ vin-supply = <&vddao_3v3>;
|
||||
+ regulator-always-on;
|
||||
+ };
|
||||
+
|
||||
+ vddao_3v3: regulator-vddao_3v3 {
|
||||
+ compatible = "regulator-fixed";
|
||||
+ regulator-name = "VDDAO_3V3";
|
||||
+ regulator-min-microvolt = <3300000>;
|
||||
+ regulator-max-microvolt = <3300000>;
|
||||
+ vin-supply = <&ao_5v>;
|
||||
+ regulator-always-on;
|
||||
+ };
|
||||
+
|
||||
+ vddcpu_a: regulator-vddcpu-a {
|
||||
+ /*
|
||||
+ * MP8756GD Regulator.
|
||||
+ */
|
||||
+ compatible = "pwm-regulator";
|
||||
+
|
||||
+ regulator-name = "VDDCPU_A";
|
||||
+ regulator-min-microvolt = <730000>;
|
||||
+ regulator-max-microvolt = <1022000>;
|
||||
+
|
||||
+ pwm-supply = <&ao_5v>;
|
||||
+
|
||||
+ pwms = <&pwm_ab 0 1250 0>;
|
||||
+ pwm-dutycycle-range = <100 0>;
|
||||
+
|
||||
+ regulator-boot-on;
|
||||
+ regulator-always-on;
|
||||
+ };
|
||||
+
|
||||
+ vddcpu_b: regulator-vddcpu-b {
|
||||
+ /*
|
||||
+ * Silergy SY8120B1ABC Regulator.
|
||||
+ */
|
||||
+ compatible = "pwm-regulator";
|
||||
+
|
||||
+ regulator-name = "VDDCPU_B";
|
||||
+ regulator-min-microvolt = <730000>;
|
||||
+ regulator-max-microvolt = <1022000>;
|
||||
+
|
||||
+ pwm-supply = <&ao_5v>;
|
||||
+
|
||||
+ pwms = <&pwm_AO_cd 1 1250 0>;
|
||||
+ pwm-dutycycle-range = <100 0>;
|
||||
+
|
||||
+ regulator-boot-on;
|
||||
+ regulator-always-on;
|
||||
+ };
|
||||
+
|
||||
+ sound {
|
||||
+ compatible = "amlogic,axg-sound-card";
|
||||
+ model = "RADXA-ZERO2";
|
||||
+ audio-aux-devs = <&tdmout_b>;
|
||||
+ audio-routing = "TDMOUT_B IN 0", "FRDDR_A OUT 1",
|
||||
+ "TDMOUT_B IN 1", "FRDDR_B OUT 1",
|
||||
+ "TDMOUT_B IN 2", "FRDDR_C OUT 1",
|
||||
+ "TDM_B Playback", "TDMOUT_B OUT";
|
||||
+
|
||||
+ assigned-clocks = <&clkc CLKID_MPLL2>,
|
||||
+ <&clkc CLKID_MPLL0>,
|
||||
+ <&clkc CLKID_MPLL1>;
|
||||
+ assigned-clock-parents = <0>, <0>, <0>;
|
||||
+ assigned-clock-rates = <294912000>,
|
||||
+ <270950400>,
|
||||
+ <393216000>;
|
||||
+ status = "okay";
|
||||
+
|
||||
+ dai-link-0 {
|
||||
+ sound-dai = <&frddr_a>;
|
||||
+ };
|
||||
+
|
||||
+ dai-link-1 {
|
||||
+ sound-dai = <&frddr_b>;
|
||||
+ };
|
||||
+
|
||||
+ dai-link-2 {
|
||||
+ sound-dai = <&frddr_c>;
|
||||
+ };
|
||||
+
|
||||
+ /* 8ch hdmi interface */
|
||||
+ dai-link-3 {
|
||||
+ sound-dai = <&tdmif_b>;
|
||||
+ dai-format = "i2s";
|
||||
+ dai-tdm-slot-tx-mask-0 = <1 1>;
|
||||
+ dai-tdm-slot-tx-mask-1 = <1 1>;
|
||||
+ dai-tdm-slot-tx-mask-2 = <1 1>;
|
||||
+ dai-tdm-slot-tx-mask-3 = <1 1>;
|
||||
+ mclk-fs = <256>;
|
||||
+
|
||||
+ codec {
|
||||
+ sound-dai = <&tohdmitx TOHDMITX_I2S_IN_B>;
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ /* hdmi glue */
|
||||
+ dai-link-4 {
|
||||
+ sound-dai = <&tohdmitx TOHDMITX_I2S_OUT>;
|
||||
+
|
||||
+ codec {
|
||||
+ sound-dai = <&hdmi_tx>;
|
||||
+ };
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ wifi32k: wifi32k {
|
||||
+ compatible = "pwm-clock";
|
||||
+ #clock-cells = <0>;
|
||||
+ clock-frequency = <32768>;
|
||||
+ pwms = <&pwm_ef 0 30518 0>; /* PWM_E at 32.768KHz */
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&periphs_pinctrl {
|
||||
+ /* Ensure the TYPE C controller irq pin is not driven by the SoC */
|
||||
+ fusb302_irq_pins: fusb302_irq {
|
||||
+ mux {
|
||||
+ groups = "GPIOA_13";
|
||||
+ function = "gpio_periphs";
|
||||
+ bias-pull-up;
|
||||
+ output-disable;
|
||||
+ };
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&arb {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&cec_AO {
|
||||
+ pinctrl-0 = <&cec_ao_a_h_pins>;
|
||||
+ pinctrl-names = "default";
|
||||
+ status = "disabled";
|
||||
+ hdmi-phandle = <&hdmi_tx>;
|
||||
+};
|
||||
+
|
||||
+&cecb_AO {
|
||||
+ pinctrl-0 = <&cec_ao_b_h_pins>;
|
||||
+ pinctrl-names = "default";
|
||||
+ status = "okay";
|
||||
+ hdmi-phandle = <&hdmi_tx>;
|
||||
+};
|
||||
+
|
||||
+&clkc_audio {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&cpu0 {
|
||||
+ cpu-supply = <&vddcpu_b>;
|
||||
+ operating-points-v2 = <&cpu_opp_table_0>;
|
||||
+ clocks = <&clkc CLKID_CPU_CLK>;
|
||||
+ clock-latency = <50000>;
|
||||
+};
|
||||
+
|
||||
+&cpu1 {
|
||||
+ cpu-supply = <&vddcpu_b>;
|
||||
+ operating-points-v2 = <&cpu_opp_table_0>;
|
||||
+ clocks = <&clkc CLKID_CPU_CLK>;
|
||||
+ clock-latency = <50000>;
|
||||
+};
|
||||
+
|
||||
+&cpu100 {
|
||||
+ cpu-supply = <&vddcpu_a>;
|
||||
+ operating-points-v2 = <&cpub_opp_table_1>;
|
||||
+ clocks = <&clkc CLKID_CPUB_CLK>;
|
||||
+ clock-latency = <50000>;
|
||||
+};
|
||||
+
|
||||
+&cpu101 {
|
||||
+ cpu-supply = <&vddcpu_a>;
|
||||
+ operating-points-v2 = <&cpub_opp_table_1>;
|
||||
+ clocks = <&clkc CLKID_CPUB_CLK>;
|
||||
+ clock-latency = <50000>;
|
||||
+};
|
||||
+
|
||||
+&cpu102 {
|
||||
+ cpu-supply = <&vddcpu_a>;
|
||||
+ operating-points-v2 = <&cpub_opp_table_1>;
|
||||
+ clocks = <&clkc CLKID_CPUB_CLK>;
|
||||
+ clock-latency = <50000>;
|
||||
+};
|
||||
+
|
||||
+&cpu103 {
|
||||
+ cpu-supply = <&vddcpu_a>;
|
||||
+ operating-points-v2 = <&cpub_opp_table_1>;
|
||||
+ clocks = <&clkc CLKID_CPUB_CLK>;
|
||||
+ clock-latency = <50000>;
|
||||
+};
|
||||
+
|
||||
+&cvbs_vdac_port {
|
||||
+ cvbs_vdac_out: endpoint {
|
||||
+ remote-endpoint = <&cvbs_connector_in>;
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&frddr_a {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&frddr_b {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&frddr_c {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&gpio {
|
||||
+ gpio-line-names =
|
||||
+ /* GPIOZ */
|
||||
+ "PIN_27", "PIN_28", "PIN_7", "PIN_11", "PIN_13", "PIN_15", "PIN_18", "PIN_40",
|
||||
+ "PIN_16", "PIN_22", "", "", "", "", "", "",
|
||||
+ /* GPIOH */
|
||||
+ "", "", "", "", "PIN_19", "PIN_21", "PIN_24", "PIN_23",
|
||||
+ "",
|
||||
+ /* BOOT */
|
||||
+ "", "", "", "", "", "", "", "",
|
||||
+ "", "", "", "", "EMMC_PWRSEQ", "", "", "",
|
||||
+ /* GPIOC */
|
||||
+ "", "", "", "", "", "", "SD_CD", "TYPEC_MUX",
|
||||
+ /* GPIOA */
|
||||
+ "PIN_32", "PIN_12", "PIN_35", "PIN_36", "PIN_31", "PIN_38", "", "",
|
||||
+ "", "", "", "", "LED_GREEN", "FUSB_IRQ", "PIN_3", "PIN_5",
|
||||
+ /* GPIOX */
|
||||
+ "", "", "", "", "", "", "SDIO_PWRSEQ", "",
|
||||
+ "", "", "", "", "", "", "", "",
|
||||
+ "", "BT_SHUTDOWN", "", "";
|
||||
+};
|
||||
+
|
||||
+&gpio_ao {
|
||||
+ gpio-line-names =
|
||||
+ /* GPIOAO */
|
||||
+ "PIN_8", "PIN_10", "", "BTN_POWER", "", "", "", "PIN_29",
|
||||
+ "PIN_33", "PIN_37", "", "FAN",
|
||||
+ /* GPIOE */
|
||||
+ "", "", "";
|
||||
+};
|
||||
+
|
||||
+&hdmi_tx {
|
||||
+ status = "okay";
|
||||
+ pinctrl-0 = <&hdmitx_hpd_pins>, <&hdmitx_ddc_pins>;
|
||||
+ pinctrl-names = "default";
|
||||
+ hdmi-supply = <&ao_5v>;
|
||||
+};
|
||||
+
|
||||
+&hdmi_tx_tmds_port {
|
||||
+ hdmi_tx_tmds_out: endpoint {
|
||||
+ remote-endpoint = <&hdmi_connector_in>;
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&cpu_thermal {
|
||||
+ cooling-maps {
|
||||
+ map0 {
|
||||
+ trip = <&cpu_passive>;
|
||||
+ cooling-device = <&fan0 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>;
|
||||
+ };
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&ddr_thermal {
|
||||
+ cooling-maps {
|
||||
+ map0 {
|
||||
+ trip = <&ddr_passive>;
|
||||
+ cooling-device = <&fan0 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>;
|
||||
+ };
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&ir {
|
||||
+ status = "disabled";
|
||||
+ pinctrl-0 = <&remote_input_ao_pins>;
|
||||
+ pinctrl-names = "default";
|
||||
+};
|
||||
+
|
||||
+&i2c3 {
|
||||
+ pinctrl-0 = <&i2c3_sda_a_pins>, <&i2c3_sck_a_pins>;
|
||||
+ pinctrl-names = "default";
|
||||
+ status = "okay";
|
||||
+
|
||||
+ fusb302@22 {
|
||||
+ compatible = "fcs,fusb302";
|
||||
+ reg = <0x22>;
|
||||
+
|
||||
+ pinctrl-0 = <&fusb302_irq_pins>;
|
||||
+ pinctrl-names = "default";
|
||||
+ interrupt-parent = <&gpio_intc>;
|
||||
+ interrupts = <74 IRQ_TYPE_LEVEL_LOW>;
|
||||
+
|
||||
+ vbus-supply = <&typec2_vbus>;
|
||||
+
|
||||
+ status = "okay";
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&pwm_ab {
|
||||
+ pinctrl-0 = <&pwm_a_e_pins>;
|
||||
+ pinctrl-names = "default";
|
||||
+ clocks = <&xtal>;
|
||||
+ clock-names = "clkin0";
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&pwm_ef {
|
||||
+ pinctrl-0 = <&pwm_e_pins>;
|
||||
+ pinctrl-names = "default";
|
||||
+ clocks = <&xtal>;
|
||||
+ clock-names = "clkin2";
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&pwm_AO_ab {
|
||||
+ pinctrl-0 = <&pwm_ao_a_pins>;
|
||||
+ pinctrl-names = "default";
|
||||
+ clocks = <&xtal>;
|
||||
+ clock-names = "clkin3";
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&pwm_AO_cd {
|
||||
+ pinctrl-0 = <&pwm_ao_d_e_pins>;
|
||||
+ pinctrl-names = "default";
|
||||
+ clocks = <&xtal>;
|
||||
+ clock-names = "clkin4";
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&saradc {
|
||||
+ status = "okay";
|
||||
+ vref-supply = <&vddao_1v8>;
|
||||
+};
|
||||
+
|
||||
+/* SDIO */
|
||||
+&sd_emmc_a {
|
||||
+ status = "okay";
|
||||
+ pinctrl-0 = <&sdio_pins>;
|
||||
+ pinctrl-1 = <&sdio_clk_gate_pins>;
|
||||
+ pinctrl-names = "default", "clk-gate";
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+
|
||||
+ bus-width = <4>;
|
||||
+ cap-sd-highspeed;
|
||||
+ max-frequency = <80000000>;
|
||||
+
|
||||
+ non-removable;
|
||||
+ disable-wp;
|
||||
+
|
||||
+ /* WiFi firmware requires power to be kept while in suspend */
|
||||
+ keep-power-in-suspend;
|
||||
+
|
||||
+ mmc-pwrseq = <&sdio_pwrseq>;
|
||||
+
|
||||
+ vmmc-supply = <&vddao_3v3>;
|
||||
+ vqmmc-supply = <&vddao_1v8>;
|
||||
+
|
||||
+ brcmf: wifi@1 {
|
||||
+ reg = <1>;
|
||||
+ compatible = "brcm,bcm4329-fmac";
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+/* SD card */
|
||||
+&sd_emmc_b {
|
||||
+ status = "okay";
|
||||
+ pinctrl-0 = <&sdcard_c_pins>;
|
||||
+ pinctrl-1 = <&sdcard_clk_gate_c_pins>;
|
||||
+ pinctrl-names = "default", "clk-gate";
|
||||
+
|
||||
+ bus-width = <4>;
|
||||
+ cap-sd-highspeed;
|
||||
+ max-frequency = <50000000>;
|
||||
+ disable-wp;
|
||||
+
|
||||
+ cd-gpios = <&gpio GPIOC_6 GPIO_ACTIVE_LOW>;
|
||||
+ vmmc-supply = <&vddao_3v3>;
|
||||
+ vqmmc-supply = <&vddao_3v3>;
|
||||
+};
|
||||
+
|
||||
+/* eMMC */
|
||||
+&sd_emmc_c {
|
||||
+ status = "okay";
|
||||
+ pinctrl-0 = <&emmc_ctrl_pins>, <&emmc_data_8b_pins>, <&emmc_ds_pins>;
|
||||
+ pinctrl-1 = <&emmc_clk_gate_pins>;
|
||||
+ pinctrl-names = "default", "clk-gate";
|
||||
+
|
||||
+ bus-width = <8>;
|
||||
+ cap-mmc-highspeed;
|
||||
+ mmc-ddr-1_8v;
|
||||
+ mmc-hs200-1_8v;
|
||||
+ max-frequency = <200000000>;
|
||||
+ disable-wp;
|
||||
+
|
||||
+ mmc-pwrseq = <&emmc_pwrseq>;
|
||||
+ vmmc-supply = <&vcc_3v3>;
|
||||
+ vqmmc-supply = <&vcc_1v8>;
|
||||
+};
|
||||
+
|
||||
+&tdmif_b {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&tdmout_b {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&tohdmitx {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&uart_A {
|
||||
+ status = "okay";
|
||||
+ pinctrl-0 = <&uart_a_pins>, <&uart_a_cts_rts_pins>;
|
||||
+ pinctrl-names = "default";
|
||||
+ uart-has-rtscts;
|
||||
+
|
||||
+ bluetooth {
|
||||
+ compatible = "brcm,bcm43438-bt";
|
||||
+ shutdown-gpios = <&gpio GPIOX_17 GPIO_ACTIVE_HIGH>;
|
||||
+ max-speed = <2000000>;
|
||||
+ clocks = <&wifi32k>;
|
||||
+ clock-names = "lpo";
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&uart_AO {
|
||||
+ status = "okay";
|
||||
+ pinctrl-0 = <&uart_ao_a_pins>;
|
||||
+ pinctrl-names = "default";
|
||||
+};
|
||||
+
|
||||
+&usb {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&usb3_pcie_phy {
|
||||
+ phy-supply = <&typec2_vbus>;
|
||||
+};
|
||||
--
|
||||
Armbian
|
||||
|
||||
@@ -1,38 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: David Heidelberg <david@ixit.cz>
|
||||
Date: Sat, 27 Nov 2021 07:23:35 +0000
|
||||
Subject: arm64: dts: meson: make dts use gpio-fan matrix instead of array
|
||||
|
||||
No functional changes.
|
||||
|
||||
Adjust to comply with dt-schema requirements
|
||||
and make possible to validate values.
|
||||
|
||||
Signed-off-by: David Heidelberg <david@ixit.cz>
|
||||
---
|
||||
arch/arm64/boot/dts/amlogic/meson-gxm-khadas-vim2.dts | 9 +++++----
|
||||
1 file changed, 5 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/amlogic/meson-gxm-khadas-vim2.dts b/arch/arm64/boot/dts/amlogic/meson-gxm-khadas-vim2.dts
|
||||
index f43c45daf7eb..a24102e3d369 100644
|
||||
--- a/arch/arm64/boot/dts/amlogic/meson-gxm-khadas-vim2.dts
|
||||
+++ b/arch/arm64/boot/dts/amlogic/meson-gxm-khadas-vim2.dts
|
||||
@@ -52,10 +52,11 @@ gpio_fan: gpio-fan {
|
||||
gpios = <&gpio GPIODV_14 GPIO_ACTIVE_HIGH
|
||||
&gpio GPIODV_15 GPIO_ACTIVE_HIGH>;
|
||||
/* Dummy RPM values since fan is optional */
|
||||
- gpio-fan,speed-map = <0 0
|
||||
- 1 1
|
||||
- 2 2
|
||||
- 3 3>;
|
||||
+ gpio-fan,speed-map =
|
||||
+ <0 0>,
|
||||
+ <1 1>,
|
||||
+ <2 2>,
|
||||
+ <3 3>;
|
||||
#cooling-cells = <2>;
|
||||
};
|
||||
|
||||
--
|
||||
Armbian
|
||||
|
||||
@@ -1,37 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Christian Hewitt <christianshewitt@gmail.com>
|
||||
Date: Fri, 21 Feb 2020 04:43:22 +0000
|
||||
Subject: WIP: arm64: dts: meson: khadas-vim3: fix missing i2c3 node
|
||||
|
||||
Fixes: c6d29c66e582 ("arm64: dts: meson-g12b-khadas-vim3: add initial device-tree")
|
||||
|
||||
The i2c3 node was missed in the original device-tree and is required for the
|
||||
optional Khadas 3705 fan to work.
|
||||
|
||||
Suggested-by: Art Nikpal <email2tema@gmail.com>
|
||||
Signed-off-by: Christian Hewittt <christianshewitt@gmail.com>
|
||||
---
|
||||
arch/arm64/boot/dts/amlogic/meson-khadas-vim3.dtsi | 7 +++++++
|
||||
1 file changed, 7 insertions(+)
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/amlogic/meson-khadas-vim3.dtsi b/arch/arm64/boot/dts/amlogic/meson-khadas-vim3.dtsi
|
||||
index c9705941e4ab..71a5c0aa2a9b 100644
|
||||
--- a/arch/arm64/boot/dts/amlogic/meson-khadas-vim3.dtsi
|
||||
+++ b/arch/arm64/boot/dts/amlogic/meson-khadas-vim3.dtsi
|
||||
@@ -333,6 +333,13 @@ hdmi_tx_tmds_out: endpoint {
|
||||
};
|
||||
};
|
||||
|
||||
+&i2c3 {
|
||||
+ clock-frequency = <100000>;
|
||||
+ pinctrl-0 = <&i2c3_sda_a_pins>, <&i2c3_sck_a_pins>;
|
||||
+ pinctrl-names = "default";
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
&i2c_AO {
|
||||
status = "okay";
|
||||
pinctrl-0 = <&i2c_ao_sck_pins>, <&i2c_ao_sda_pins>;
|
||||
--
|
||||
Armbian
|
||||
|
||||
@@ -1,58 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Christian Hewitt <christianshewitt@gmail.com>
|
||||
Date: Thu, 21 Jan 2021 01:35:36 +0000
|
||||
Subject: HACK: arm64: dts: meson: add rtc/vrtc aliases to Khadas VIM
|
||||
|
||||
Add aliases to ensure the vrtc time (which normally proves first) is /dev/rtc1
|
||||
while the onboard rtc chip claims /dev/rtc0.
|
||||
|
||||
Signed-off-by: Christian Hewitt <christianshewitt@gmail.com>
|
||||
---
|
||||
arch/arm64/boot/dts/amlogic/meson-gxl-s905x-khadas-vim.dts | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-khadas-vim.dts b/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-khadas-vim.dts
|
||||
index 6ab1cc125b96..24af15e18026 100644
|
||||
--- a/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-khadas-vim.dts
|
||||
+++ b/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-khadas-vim.dts
|
||||
@@ -29,6 +29,8 @@ button-function {
|
||||
aliases {
|
||||
serial2 = &uart_AO_B;
|
||||
ethernet0 = ðmac;
|
||||
+ rtc0 = &rtc;
|
||||
+ rtc1 = &vrtc;
|
||||
};
|
||||
|
||||
gpio-keys-polled {
|
||||
--
|
||||
Armbian
|
||||
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Christian Hewitt <christianshewitt@gmail.com>
|
||||
Date: Sat, 6 Nov 2021 13:01:08 +0000
|
||||
Subject: HACK: arm64: dts: meson: add rtc/vrtc aliases to Khadas VIM2
|
||||
|
||||
Add aliases to ensure the vrtc time (which normally proves first) is /dev/rtc1
|
||||
while the onboard rtc chip claims /dev/rtc0.
|
||||
|
||||
Signed-off-by: Christian Hewitt <christianshewitt@gmail.com>
|
||||
---
|
||||
arch/arm64/boot/dts/amlogic/meson-gxm-khadas-vim2.dts | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/amlogic/meson-gxm-khadas-vim2.dts b/arch/arm64/boot/dts/amlogic/meson-gxm-khadas-vim2.dts
|
||||
index a24102e3d369..9b0c7e9d0620 100644
|
||||
--- a/arch/arm64/boot/dts/amlogic/meson-gxm-khadas-vim2.dts
|
||||
+++ b/arch/arm64/boot/dts/amlogic/meson-gxm-khadas-vim2.dts
|
||||
@@ -18,6 +18,8 @@ / {
|
||||
aliases {
|
||||
serial0 = &uart_AO;
|
||||
serial2 = &uart_AO_B;
|
||||
+ rtc0 = &rtc;
|
||||
+ rtc1 = &vrtc;
|
||||
};
|
||||
|
||||
chosen {
|
||||
--
|
||||
Armbian
|
||||
|
||||
@@ -1,26 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Martin Ayotte <martinayotte@yahoo.ca>
|
||||
Date: Thu, 6 Dec 2018 18:03:17 -0500
|
||||
Subject: add uartC alias for nanopi-k2
|
||||
|
||||
add uartC alias for nanopi-k2
|
||||
- 839f2f151073928ed1e62d415ba5317f525b9e24: 1553615840: Martin Ayotte <martinayotte@yahoo.ca>: 'add uartA overlay for Odroid-C2'
|
||||
---
|
||||
arch/arm64/boot/dts/amlogic/meson-gxbb-nanopi-k2.dts | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/amlogic/meson-gxbb-nanopi-k2.dts b/arch/arm64/boot/dts/amlogic/meson-gxbb-nanopi-k2.dts
|
||||
index 7d94160f5802..cf577bc8d98b 100644
|
||||
--- a/arch/arm64/boot/dts/amlogic/meson-gxbb-nanopi-k2.dts
|
||||
+++ b/arch/arm64/boot/dts/amlogic/meson-gxbb-nanopi-k2.dts
|
||||
@@ -15,6 +15,7 @@ / {
|
||||
|
||||
aliases {
|
||||
serial0 = &uart_AO;
|
||||
+ serial2 = &uart_C;
|
||||
ethernet0 = ðmac;
|
||||
};
|
||||
|
||||
--
|
||||
Armbian
|
||||
|
||||
@@ -1,35 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Igor Pecovnik <igor.pecovnik@gmail.com>
|
||||
Date: Tue, 4 Jun 2019 21:35:48 +0200
|
||||
Subject: nanopik2 - enable eMMC
|
||||
|
||||
[ nanopik2 ] enable eMMC support for u-boot and kernel
|
||||
---
|
||||
arch/arm64/boot/dts/amlogic/meson-gxbb-nanopi-k2.dts | 4 +---
|
||||
1 file changed, 1 insertion(+), 3 deletions(-)
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/amlogic/meson-gxbb-nanopi-k2.dts b/arch/arm64/boot/dts/amlogic/meson-gxbb-nanopi-k2.dts
|
||||
index cf577bc8d98b..2ee48261a2ea 100644
|
||||
--- a/arch/arm64/boot/dts/amlogic/meson-gxbb-nanopi-k2.dts
|
||||
+++ b/arch/arm64/boot/dts/amlogic/meson-gxbb-nanopi-k2.dts
|
||||
@@ -359,7 +359,7 @@ &sd_emmc_b {
|
||||
|
||||
/* eMMC */
|
||||
&sd_emmc_c {
|
||||
- status = "disabled";
|
||||
+ status = "okay";
|
||||
pinctrl-0 = <&emmc_pins>, <&emmc_ds_pins>;
|
||||
pinctrl-1 = <&emmc_clk_gate_pins>;
|
||||
pinctrl-names = "default", "clk-gate";
|
||||
@@ -369,8 +369,6 @@ &sd_emmc_c {
|
||||
non-removable;
|
||||
disable-wp;
|
||||
cap-mmc-highspeed;
|
||||
- mmc-ddr-1_8v;
|
||||
- mmc-hs200-1_8v;
|
||||
|
||||
mmc-pwrseq = <&emmc_pwrseq>;
|
||||
vmmc-supply = <&vcc3v3>;
|
||||
--
|
||||
Armbian
|
||||
|
||||
@@ -1,50 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Martin Ayotte <martinayotte@yahoo.ca>
|
||||
Date: Thu, 26 Oct 2017 16:31:22 +0300
|
||||
Subject: add uartA and uartC for Odroid-C2
|
||||
|
||||
add uartA and uartC for Odroid-C2
|
||||
|
||||
- 839f2f151073928ed1e62d415ba5317f525b9e24: Martin Ayotte <martinayotte@yahoo.ca>: 'add uartA overlay for Odroid-C2'
|
||||
- b5c9e6ee8d4a97c5092109a12164c131eb4b46e9: Martin Ayotte <martinayotte@yahoo.ca>: 'add uartA for odroidc2 in NEXT'
|
||||
- 22ca2b92a002fe22e2a61428741618295c424664: Martin Ayotte <martinayotte@yahoo.ca>: 'fix missing pinctrl-0 for ODroidC2 uartA'
|
||||
- 140da6ad43f4a0d47c221271f62bb7c0a57064ea: Martin Ayotte <martinayotte@yahoo.ca>: 'add uartC to OdroidC2'
|
||||
---
|
||||
arch/arm64/boot/dts/amlogic/meson-gxbb-odroidc2.dts | 14 ++++++++++
|
||||
1 file changed, 14 insertions(+)
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/amlogic/meson-gxbb-odroidc2.dts b/arch/arm64/boot/dts/amlogic/meson-gxbb-odroidc2.dts
|
||||
index 201596247fd9..b2cb12fb46fd 100644
|
||||
--- a/arch/arm64/boot/dts/amlogic/meson-gxbb-odroidc2.dts
|
||||
+++ b/arch/arm64/boot/dts/amlogic/meson-gxbb-odroidc2.dts
|
||||
@@ -17,6 +17,8 @@ / {
|
||||
|
||||
aliases {
|
||||
serial0 = &uart_AO;
|
||||
+ serial1 = &uart_A;
|
||||
+ serial2 = &uart_C;
|
||||
ethernet0 = ðmac;
|
||||
};
|
||||
|
||||
@@ -399,6 +401,18 @@ &uart_AO {
|
||||
pinctrl-names = "default";
|
||||
};
|
||||
|
||||
+&uart_A {
|
||||
+ status = "disabled";
|
||||
+ pinctrl-0 = <&uart_a_pins>;
|
||||
+ pinctrl-names = "default";
|
||||
+};
|
||||
+
|
||||
+&uart_C {
|
||||
+ status = "disabled";
|
||||
+ pinctrl-0 = <&uart_c_pins>;
|
||||
+ pinctrl-names = "default";
|
||||
+};
|
||||
+
|
||||
&usb0_phy {
|
||||
status = "disabled";
|
||||
phy-supply = <&usb_otg_pwr>;
|
||||
--
|
||||
Armbian
|
||||
|
||||
@@ -1,52 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas McKahan <tonymckahan@gmail.com>
|
||||
Date: Sat, 6 Oct 2018 22:50:14 -0400
|
||||
Subject: Odroid C2 enable SPI
|
||||
|
||||
Odroid C2 enable SPI
|
||||
|
||||
- f928b31d8a1983fd8cfd9c97de084e532283b106: 1543550719: Thomas McKahan <tonymckahan@gmail.com>: '[ meson64-dev ] fix Odroid C2 boot, add spidev'
|
||||
---
|
||||
arch/arm64/boot/dts/amlogic/meson-gxbb-odroidc2.dts | 26 ++++++++++
|
||||
1 file changed, 26 insertions(+)
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/amlogic/meson-gxbb-odroidc2.dts b/arch/arm64/boot/dts/amlogic/meson-gxbb-odroidc2.dts
|
||||
index b2cb12fb46fd..c252de8e4b17 100644
|
||||
--- a/arch/arm64/boot/dts/amlogic/meson-gxbb-odroidc2.dts
|
||||
+++ b/arch/arm64/boot/dts/amlogic/meson-gxbb-odroidc2.dts
|
||||
@@ -176,6 +176,32 @@ hdmi_connector_in: endpoint {
|
||||
};
|
||||
};
|
||||
|
||||
+ spi-gpio {
|
||||
+ compatible = "spi-gpio";
|
||||
+ #address-cells = <0x1>;
|
||||
+ #size-cells = <0x0>;
|
||||
+ ranges;
|
||||
+ status = "disabled";
|
||||
+ sck-gpios = <&gpio GPIOX_2 0>;
|
||||
+ miso-gpios = <&gpio GPIOX_4 0>;
|
||||
+ mosi-gpios = <&gpio GPIOX_7 0>;
|
||||
+ cs-gpios = <&gpio GPIOX_3 0
|
||||
+ &gpio GPIOX_1 0>;
|
||||
+ num-chipselects = <2>;
|
||||
+
|
||||
+ /* clients */
|
||||
+ spidev0@0 {
|
||||
+ compatible = "spidev";
|
||||
+ reg = <0>;
|
||||
+ spi-max-frequency = <500000>;
|
||||
+ };
|
||||
+ spidev0@1 {
|
||||
+ compatible = "spidev";
|
||||
+ reg = <1>;
|
||||
+ spi-max-frequency = <500000>;
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
sound {
|
||||
compatible = "amlogic,gx-sound-card";
|
||||
model = "ODROID-C2";
|
||||
--
|
||||
Armbian
|
||||
|
||||
@@ -1,27 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: zador-blood-stained <zador-blood-stained@users.noreply.github.com>
|
||||
Date: Thu, 26 Oct 2017 16:31:22 +0300
|
||||
Subject: Enable odroidc2-dev DVFS
|
||||
|
||||
Enable odroidc2-dev DVFS (#763)
|
||||
---
|
||||
arch/arm64/boot/dts/amlogic/meson-gxbb-odroidc2.dts | 3 ++-
|
||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/amlogic/meson-gxbb-odroidc2.dts b/arch/arm64/boot/dts/amlogic/meson-gxbb-odroidc2.dts
|
||||
index c252de8e4b17..7af088c7366d 100644
|
||||
--- a/arch/arm64/boot/dts/amlogic/meson-gxbb-odroidc2.dts
|
||||
+++ b/arch/arm64/boot/dts/amlogic/meson-gxbb-odroidc2.dts
|
||||
@@ -376,7 +376,8 @@ &saradc {
|
||||
};
|
||||
|
||||
&scpi_clocks {
|
||||
- status = "disabled";
|
||||
+ /* Works only with new blobs that have limited DVFS table */
|
||||
+ status = "okay";
|
||||
};
|
||||
|
||||
/* SD */
|
||||
--
|
||||
Armbian
|
||||
|
||||
@@ -1,29 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Ricardo Pardini <ricardo@pardini.net>
|
||||
Date: Sun, 26 Jun 2022 03:47:06 +0200
|
||||
Subject: ODROID-HC4: add DT attributes to enable fan1_input
|
||||
|
||||
- from vendor kernel modified DT
|
||||
- this allows userspace fancontrol/pwmconfig to work
|
||||
---
|
||||
arch/arm64/boot/dts/amlogic/meson-sm1-odroid-hc4.dts | 4 ++++
|
||||
1 file changed, 4 insertions(+)
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/amlogic/meson-sm1-odroid-hc4.dts b/arch/arm64/boot/dts/amlogic/meson-sm1-odroid-hc4.dts
|
||||
index e3486f60645a..89ef6f07603c 100644
|
||||
--- a/arch/arm64/boot/dts/amlogic/meson-sm1-odroid-hc4.dts
|
||||
+++ b/arch/arm64/boot/dts/amlogic/meson-sm1-odroid-hc4.dts
|
||||
@@ -23,6 +23,10 @@ fan0: pwm-fan {
|
||||
cooling-max-state = <3>;
|
||||
cooling-levels = <0 120 170 220>;
|
||||
pwms = <&pwm_cd 1 40000 0>;
|
||||
+ fan-supply = <&vcc_5v>;
|
||||
+ interrupt-parent = <&gpio_intc>;
|
||||
+ interrupts = <84 IRQ_TYPE_EDGE_FALLING>;
|
||||
+ pulses-per-revolutions = <2>;
|
||||
};
|
||||
|
||||
leds {
|
||||
--
|
||||
Armbian
|
||||
|
||||
@@ -1,38 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Stefan Agner <stefan@agner.ch>
|
||||
Date: Mon, 11 Jan 2021 11:38:54 +0100
|
||||
Subject: arm64: dts: meson: g12b: add GPIO fan support
|
||||
|
||||
Add simple GPIO fan node to support a fan on GPIO J8. Unfortunately the
|
||||
pad used to control the fan does not support real PWM, hence the RPM
|
||||
cannot be modulated.
|
||||
|
||||
Signed-off-by: Stefan Agner <stefan@agner.ch>
|
||||
Tested-by: Ricardo Pardini <ricardo@pardini.net>
|
||||
---
|
||||
arch/arm64/boot/dts/amlogic/meson-g12b-odroid-n2.dtsi | 9 +++++++++
|
||||
1 file changed, 9 insertions(+)
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/amlogic/meson-g12b-odroid-n2.dtsi b/arch/arm64/boot/dts/amlogic/meson-g12b-odroid-n2.dtsi
|
||||
index fd3fa82e4c33..1365f2767855 100644
|
||||
--- a/arch/arm64/boot/dts/amlogic/meson-g12b-odroid-n2.dtsi
|
||||
+++ b/arch/arm64/boot/dts/amlogic/meson-g12b-odroid-n2.dtsi
|
||||
@@ -39,6 +39,15 @@ emmc_pwrseq: emmc-pwrseq {
|
||||
reset-gpios = <&gpio BOOT_12 GPIO_ACTIVE_LOW>;
|
||||
};
|
||||
|
||||
+ /* 5V 80x80x10.8mm cooling fan from Hardkernel shop... */
|
||||
+ fan0: gpio-fan {
|
||||
+ #cooling-cells = <2>;
|
||||
+ compatible = "gpio-fan";
|
||||
+ gpio-fan,speed-map = <0 0 1600 1>;
|
||||
+ gpios = <&gpio_ao GPIOAO_10 GPIO_ACTIVE_HIGH>;
|
||||
+ status = "okay";
|
||||
+ };
|
||||
+
|
||||
leds {
|
||||
compatible = "gpio-leds";
|
||||
|
||||
--
|
||||
Armbian
|
||||
|
||||
@@ -1,66 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Stefan Agner <stefan@agner.ch>
|
||||
Date: Mon, 11 Jan 2021 15:53:55 +0100
|
||||
Subject: arm64: dts: meson: g12b: odroid-n2: add fan as cooling device
|
||||
|
||||
Add the GPIO fan as a cooling device for the CPU thermal zone. Since we
|
||||
have only full fan speed available with this, set the tripping point to
|
||||
30 degrees Celsius.
|
||||
|
||||
Signed-off-by: Stefan Agner <stefan@agner.ch>
|
||||
---
|
||||
arch/arm64/boot/dts/amlogic/meson-g12b-odroid-n2.dtsi | 38 ++++++++++
|
||||
1 file changed, 38 insertions(+)
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/amlogic/meson-g12b-odroid-n2.dtsi b/arch/arm64/boot/dts/amlogic/meson-g12b-odroid-n2.dtsi
|
||||
index 1365f2767855..33323f119406 100644
|
||||
--- a/arch/arm64/boot/dts/amlogic/meson-g12b-odroid-n2.dtsi
|
||||
+++ b/arch/arm64/boot/dts/amlogic/meson-g12b-odroid-n2.dtsi
|
||||
@@ -377,6 +377,44 @@ &clkc_audio {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
+&cpu_thermal {
|
||||
+ trips {
|
||||
+ cpu_warm: cpu_warm {
|
||||
+ hysteresis = <5000>;
|
||||
+ temperature = <30000>;
|
||||
+ type = "active";
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ cooling-maps {
|
||||
+ map0 {
|
||||
+ cooling-device =
|
||||
+ <&fan0 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>;
|
||||
+ trip = <&cpu_warm>;
|
||||
+ };
|
||||
+ map1 {
|
||||
+ trip = <&cpu_passive>;
|
||||
+ cooling-device = <&cpu0 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
|
||||
+ <&cpu1 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
|
||||
+ <&cpu100 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
|
||||
+ <&cpu101 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
|
||||
+ <&cpu102 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
|
||||
+ <&cpu103 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
|
||||
+ <&fan0 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>;
|
||||
+ };
|
||||
+ map2 {
|
||||
+ trip = <&cpu_hot>;
|
||||
+ cooling-device = <&cpu0 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
|
||||
+ <&cpu1 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
|
||||
+ <&cpu100 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
|
||||
+ <&cpu101 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
|
||||
+ <&cpu102 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
|
||||
+ <&cpu103 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
|
||||
+ <&fan0 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>;
|
||||
+ };
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
&cpu0 {
|
||||
cpu-supply = <&vddcpu_b>;
|
||||
operating-points-v2 = <&cpu_opp_table_0>;
|
||||
--
|
||||
Armbian
|
||||
|
||||
@@ -1,85 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Ricardo Pardini <ricardo@pardini.net>
|
||||
Date: Thu, 2 Sep 2021 20:44:19 +0200
|
||||
Subject: ODROID N2(+): SPI-NOR enable via extra DTBs
|
||||
|
||||
Kernel DTS patch to add SPI-flash-enabled DTBs (slower eMMC), produces -spi .dtbs for n2 and n2-plus
|
||||
|
||||
Signed-off-by: Ricardo Pardini <ricardo@pardini.net>
|
||||
---
|
||||
arch/arm64/boot/dts/amlogic/Makefile | 2 ++
|
||||
arch/arm64/boot/dts/amlogic/meson-g12b-odroid-n2-enable-spi.dtsi | 13 ++++++++++
|
||||
arch/arm64/boot/dts/amlogic/meson-g12b-odroid-n2-plus-spi.dts | 11 ++++++++
|
||||
arch/arm64/boot/dts/amlogic/meson-g12b-odroid-n2-spi.dts | 11 ++++++++
|
||||
4 files changed, 37 insertions(+)
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/amlogic/Makefile b/arch/arm64/boot/dts/amlogic/Makefile
|
||||
index f231280cd808..da3225d31e38 100644
|
||||
--- a/arch/arm64/boot/dts/amlogic/Makefile
|
||||
+++ b/arch/arm64/boot/dts/amlogic/Makefile
|
||||
@@ -10,7 +10,9 @@ dtb-$(CONFIG_ARCH_MESON) += meson-g12b-a311d-khadas-vim3.dtb
|
||||
dtb-$(CONFIG_ARCH_MESON) += meson-g12b-gsking-x.dtb
|
||||
dtb-$(CONFIG_ARCH_MESON) += meson-g12b-gtking-pro.dtb
|
||||
dtb-$(CONFIG_ARCH_MESON) += meson-g12b-gtking.dtb
|
||||
+dtb-$(CONFIG_ARCH_MESON) += meson-g12b-odroid-n2-spi.dtb
|
||||
dtb-$(CONFIG_ARCH_MESON) += meson-g12b-odroid-n2-plus.dtb
|
||||
+dtb-$(CONFIG_ARCH_MESON) += meson-g12b-odroid-n2-plus-spi.dtb
|
||||
dtb-$(CONFIG_ARCH_MESON) += meson-g12b-odroid-n2.dtb
|
||||
dtb-$(CONFIG_ARCH_MESON) += meson-g12b-radxa-zero2.dtb
|
||||
dtb-$(CONFIG_ARCH_MESON) += meson-g12b-s922x-khadas-vim3.dtb
|
||||
diff --git a/arch/arm64/boot/dts/amlogic/meson-g12b-odroid-n2-enable-spi.dtsi b/arch/arm64/boot/dts/amlogic/meson-g12b-odroid-n2-enable-spi.dtsi
|
||||
new file mode 100644
|
||||
index 000000000000..a6f11e8cdfbe
|
||||
--- /dev/null
|
||||
+++ b/arch/arm64/boot/dts/amlogic/meson-g12b-odroid-n2-enable-spi.dtsi
|
||||
@@ -0,0 +1,13 @@
|
||||
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
||||
+
|
||||
+/*
|
||||
+ * Replace emmc_data_8b_pins to emmc_data_4b_pins from sd_emmc_c pinctrl-0, and change bus-width to 4 then spifc can be enabled.
|
||||
+ */
|
||||
+&sd_emmc_c {
|
||||
+ pinctrl-0 = <&emmc_ctrl_pins>, <&emmc_data_4b_pins>, <&emmc_ds_pins>;
|
||||
+ bus-width = <4>;
|
||||
+};
|
||||
+
|
||||
+&spifc {
|
||||
+ status = "okay";
|
||||
+};
|
||||
diff --git a/arch/arm64/boot/dts/amlogic/meson-g12b-odroid-n2-plus-spi.dts b/arch/arm64/boot/dts/amlogic/meson-g12b-odroid-n2-plus-spi.dts
|
||||
new file mode 100644
|
||||
index 000000000000..f50f6f39a941
|
||||
--- /dev/null
|
||||
+++ b/arch/arm64/boot/dts/amlogic/meson-g12b-odroid-n2-plus-spi.dts
|
||||
@@ -0,0 +1,11 @@
|
||||
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
||||
+
|
||||
+/dts-v1/;
|
||||
+
|
||||
+#include "meson-g12b-odroid-n2-plus.dts"
|
||||
+
|
||||
+/ {
|
||||
+ model = "Hardkernel ODROID-N2Plus with SPI";
|
||||
+};
|
||||
+
|
||||
+#include "meson-g12b-odroid-n2-enable-spi.dtsi"
|
||||
diff --git a/arch/arm64/boot/dts/amlogic/meson-g12b-odroid-n2-spi.dts b/arch/arm64/boot/dts/amlogic/meson-g12b-odroid-n2-spi.dts
|
||||
new file mode 100644
|
||||
index 000000000000..3d85c25d5fc4
|
||||
--- /dev/null
|
||||
+++ b/arch/arm64/boot/dts/amlogic/meson-g12b-odroid-n2-spi.dts
|
||||
@@ -0,0 +1,11 @@
|
||||
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
||||
+
|
||||
+/dts-v1/;
|
||||
+
|
||||
+#include "meson-g12b-odroid-n2.dts"
|
||||
+
|
||||
+/ {
|
||||
+ model = "Hardkernel ODROID-N2 with SPI";
|
||||
+};
|
||||
+
|
||||
+#include "meson-g12b-odroid-n2-enable-spi.dtsi"
|
||||
--
|
||||
Armbian
|
||||
|
||||
@@ -1,46 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Igor Pecovnik <igor.pecovnik@gmail.com>
|
||||
Date: Wed, 10 Feb 2021 18:07:08 +0100
|
||||
Subject: Add missing CPU opp values for clocking g12b / N2+ higher
|
||||
|
||||
Signed-off-by: Igor Pecovnik <igor.pecovnik@gmail.com>
|
||||
---
|
||||
arch/arm64/boot/dts/amlogic/meson-g12b-a311d.dtsi | 16 ++++++++++
|
||||
1 file changed, 16 insertions(+)
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/amlogic/meson-g12b-a311d.dtsi b/arch/arm64/boot/dts/amlogic/meson-g12b-a311d.dtsi
|
||||
index 8e9ad1e51d66..adc4cca55d7d 100644
|
||||
--- a/arch/arm64/boot/dts/amlogic/meson-g12b-a311d.dtsi
|
||||
+++ b/arch/arm64/boot/dts/amlogic/meson-g12b-a311d.dtsi
|
||||
@@ -45,6 +45,14 @@ opp-1800000000 {
|
||||
opp-hz = /bits/ 64 <1800000000>;
|
||||
opp-microvolt = <1001000>;
|
||||
};
|
||||
+ opp-1908000000 {
|
||||
+ opp-hz = /bits/ 64 <1908000000>;
|
||||
+ opp-microvolt = <1030000>;
|
||||
+ };
|
||||
+ opp-2016000000 {
|
||||
+ opp-hz = /bits/ 64 <2016000000>;
|
||||
+ opp-microvolt = <1040000>;
|
||||
+ };
|
||||
};
|
||||
|
||||
cpub_opp_table_1: opp-table-1 {
|
||||
@@ -105,5 +113,13 @@ opp-2208000000 {
|
||||
opp-hz = /bits/ 64 <2208000000>;
|
||||
opp-microvolt = <1011000>;
|
||||
};
|
||||
+ opp-2304000000 {
|
||||
+ opp-hz = /bits/ 64 <2304000000>;
|
||||
+ opp-microvolt = <1030000>;
|
||||
+ };
|
||||
+ opp-2400000000 {
|
||||
+ opp-hz = /bits/ 64 <2400000000>;
|
||||
+ opp-microvolt = <1040000>;
|
||||
+ };
|
||||
};
|
||||
};
|
||||
--
|
||||
Armbian
|
||||
|
||||
@@ -1,104 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Christian Hewitt <christianshewitt@gmail.com>
|
||||
Date: Tue, 17 Aug 2021 16:16:43 +0000
|
||||
Subject: arm64: dts: meson: radxa-zero: add support for the usb type-c
|
||||
controller
|
||||
|
||||
Radxa Zero uses an FUSB302 type-c controller, so lets enable it.
|
||||
|
||||
NB: Polarity swapping via GPIO is not implemented in the current driver
|
||||
(see drivers/usb/typec/tcpm/fusb302.c) so it is not possible to handle
|
||||
GPIOAO_6 for USB3 polarity control.
|
||||
|
||||
Includes:
|
||||
- arm64: dts: amlogic: fix interrupt storm from fusb302 on Radxa Zero
|
||||
it makes load average >1. use correct pin for interrupt from fusb302.
|
||||
|
||||
Signed-off-by: FUKAUMI Naoki <naoki@radxa.com>
|
||||
Suggested-by: Neil Armstrong <narmstrong@baylibre.com>
|
||||
Signed-off-by: Christian Hewitt <christianshewitt@gmail.com>
|
||||
Signed-off-by: Yuntian Zhang <yt@radxa.com>
|
||||
---
|
||||
arch/arm64/boot/dts/amlogic/meson-g12a-radxa-zero.dts | 48 ++++++++++
|
||||
1 file changed, 48 insertions(+)
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/amlogic/meson-g12a-radxa-zero.dts b/arch/arm64/boot/dts/amlogic/meson-g12a-radxa-zero.dts
|
||||
index e3bb6df42ff3..28eaaa83a00e 100644
|
||||
--- a/arch/arm64/boot/dts/amlogic/meson-g12a-radxa-zero.dts
|
||||
+++ b/arch/arm64/boot/dts/amlogic/meson-g12a-radxa-zero.dts
|
||||
@@ -60,6 +60,14 @@ sdio_pwrseq: sdio-pwrseq {
|
||||
clock-names = "ext_clock";
|
||||
};
|
||||
|
||||
+ typec2_vbus: regulator-typec2_vbus {
|
||||
+ compatible = "regulator-fixed";
|
||||
+ regulator-name = "TYPEC2_VBUS";
|
||||
+ regulator-min-microvolt = <5000000>;
|
||||
+ regulator-max-microvolt = <5000000>;
|
||||
+ vin-supply = <&ao_5v>;
|
||||
+ };
|
||||
+
|
||||
ao_5v: regulator-ao_5v {
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "AO_5V";
|
||||
@@ -191,6 +199,18 @@ wifi32k: wifi32k {
|
||||
};
|
||||
};
|
||||
|
||||
+&ao_pinctrl {
|
||||
+ /* Ensure the TYPE C controller irq pin is not driven by the SoC */
|
||||
+ fusb302_irq_pins: fusb302_irq {
|
||||
+ mux {
|
||||
+ groups = "GPIOAO_5";
|
||||
+ function = "gpio_aobus";
|
||||
+ bias-pull-up;
|
||||
+ output-disable;
|
||||
+ };
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
&arb {
|
||||
status = "okay";
|
||||
};
|
||||
@@ -278,6 +298,26 @@ &ir {
|
||||
pinctrl-names = "default";
|
||||
};
|
||||
|
||||
+&i2c3 {
|
||||
+ pinctrl-0 = <&i2c3_sda_a_pins>, <&i2c3_sck_a_pins>;
|
||||
+ pinctrl-names = "default";
|
||||
+ status = "okay";
|
||||
+
|
||||
+ fusb302@22 {
|
||||
+ compatible = "fcs,fusb302";
|
||||
+ reg = <0x22>;
|
||||
+
|
||||
+ pinctrl-0 = <&fusb302_irq_pins>;
|
||||
+ pinctrl-names = "default";
|
||||
+ interrupt-parent = <&gpio_intc>;
|
||||
+ interrupts = <5 IRQ_TYPE_LEVEL_LOW>;
|
||||
+
|
||||
+ vbus-supply = <&typec2_vbus>;
|
||||
+
|
||||
+ status = "okay";
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
&pwm_AO_cd {
|
||||
pinctrl-0 = <&pwm_ao_d_e_pins>;
|
||||
pinctrl-names = "default";
|
||||
@@ -403,3 +443,11 @@ &usb {
|
||||
status = "okay";
|
||||
dr_mode = "host";
|
||||
};
|
||||
+
|
||||
+&usb2_phy0 {
|
||||
+ phy-supply = <&typec2_vbus>;
|
||||
+};
|
||||
+
|
||||
+&usb3_pcie_phy {
|
||||
+ phy-supply = <&typec2_vbus>;
|
||||
+};
|
||||
--
|
||||
Armbian
|
||||
|
||||
@@ -1,28 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Stephen <stephen@vamrs.com>
|
||||
Date: Thu, 28 Oct 2021 14:26:24 +0800
|
||||
Subject: arm64: dts: radxa zero: set dr_mode of usb node to otg
|
||||
|
||||
This enables dwc2 otg function.
|
||||
|
||||
Signed-off-by: Stephen <stephen@vamrs.com>
|
||||
Signed-off-by: Yuntian Zhang <yt@radxa.com>
|
||||
---
|
||||
arch/arm64/boot/dts/amlogic/meson-g12a-radxa-zero.dts | 1 -
|
||||
1 file changed, 1 deletion(-)
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/amlogic/meson-g12a-radxa-zero.dts b/arch/arm64/boot/dts/amlogic/meson-g12a-radxa-zero.dts
|
||||
index 28eaaa83a00e..29cfcc045bea 100644
|
||||
--- a/arch/arm64/boot/dts/amlogic/meson-g12a-radxa-zero.dts
|
||||
+++ b/arch/arm64/boot/dts/amlogic/meson-g12a-radxa-zero.dts
|
||||
@@ -441,7 +441,6 @@ &uart_AO {
|
||||
|
||||
&usb {
|
||||
status = "okay";
|
||||
- dr_mode = "host";
|
||||
};
|
||||
|
||||
&usb2_phy0 {
|
||||
--
|
||||
Armbian
|
||||
|
||||
@@ -1,28 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Yuntian Zhang <yt@radxa.com>
|
||||
Date: Mon, 27 Jun 2022 15:06:32 +0800
|
||||
Subject: VENDOR: Radxa Zero Wi-Fi fix
|
||||
|
||||
Credit: c0rnelius from Armbian
|
||||
|
||||
Signed-off-by: Yuntian Zhang <yt@radxa.com>
|
||||
---
|
||||
arch/arm64/boot/dts/amlogic/meson-g12a-radxa-zero.dts | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/amlogic/meson-g12a-radxa-zero.dts b/arch/arm64/boot/dts/amlogic/meson-g12a-radxa-zero.dts
|
||||
index 29cfcc045bea..4e7781f87867 100644
|
||||
--- a/arch/arm64/boot/dts/amlogic/meson-g12a-radxa-zero.dts
|
||||
+++ b/arch/arm64/boot/dts/amlogic/meson-g12a-radxa-zero.dts
|
||||
@@ -350,7 +350,7 @@ &sd_emmc_a {
|
||||
|
||||
bus-width = <4>;
|
||||
cap-sd-highspeed;
|
||||
- sd-uhs-sdr50;
|
||||
+ cap-mmc-highspeed;
|
||||
max-frequency = <100000000>;
|
||||
|
||||
non-removable;
|
||||
--
|
||||
Armbian
|
||||
|
||||
@@ -1,36 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: The-going <48602507+The-going@users.noreply.github.com>
|
||||
Date: Wed, 2 Feb 2022 11:56:51 +0300
|
||||
Subject: drv:spi:spidev remove warnings
|
||||
|
||||
Remove SPIdev warnings
|
||||
|
||||
- ca478cc4e563655d99fd3380d3b1217481d6da7e: The-going <48602507+The-going@users.noreply.github.com>: 'Bugfix spidev (#3737)'
|
||||
- e7bd9b8f13af9ee054f44a422b2aca19746b9244: Tony <tonymckahan@gmail.com>: 'Add Spidev workarounds and clean patches (WIP) (#3812)'
|
||||
---
|
||||
drivers/spi/spidev.c | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
diff --git a/drivers/spi/spidev.c b/drivers/spi/spidev.c
|
||||
index b2775d82d2d7..3c65d3d74559 100644
|
||||
--- a/drivers/spi/spidev.c
|
||||
+++ b/drivers/spi/spidev.c
|
||||
@@ -683,6 +683,7 @@ static const struct file_operations spidev_fops = {
|
||||
static struct class *spidev_class;
|
||||
|
||||
static const struct spi_device_id spidev_spi_ids[] = {
|
||||
+ { .name = "spi-dev" },
|
||||
{ .name = "dh2228fv" },
|
||||
{ .name = "ltc2488" },
|
||||
{ .name = "sx1301" },
|
||||
@@ -709,6 +710,7 @@ static int spidev_of_check(struct device *dev)
|
||||
}
|
||||
|
||||
static const struct of_device_id spidev_dt_ids[] = {
|
||||
+ { .compatible = "armbian,spi-dev", .data = &spidev_of_check },
|
||||
{ .compatible = "rohm,dh2228fv", .data = &spidev_of_check },
|
||||
{ .compatible = "lineartechnology,ltc2488", .data = &spidev_of_check },
|
||||
{ .compatible = "semtech,sx1301", .data = &spidev_of_check },
|
||||
--
|
||||
Armbian
|
||||
|
||||
@@ -1,134 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Neil Armstrong <narmstrong@baylibre.com>
|
||||
Date: Thu, 3 Nov 2016 15:29:23 +0100
|
||||
Subject: HACK: arm64: meson: add Amlogic Meson GX PM Suspend
|
||||
|
||||
The Amlogic Meson GX SoCs uses a non-standard argument to the
|
||||
PSCI CPU_SUSPEND call to enter system suspend.
|
||||
|
||||
Implement such call within platform_suspend_ops.
|
||||
|
||||
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
|
||||
---
|
||||
drivers/firmware/meson/Kconfig | 6 +
|
||||
drivers/firmware/meson/Makefile | 1 +
|
||||
drivers/firmware/meson/meson_gx_pm.c | 86 ++++++++++
|
||||
3 files changed, 93 insertions(+)
|
||||
|
||||
diff --git a/drivers/firmware/meson/Kconfig b/drivers/firmware/meson/Kconfig
|
||||
index f2fdd3756648..d3ead92ac61b 100644
|
||||
--- a/drivers/firmware/meson/Kconfig
|
||||
+++ b/drivers/firmware/meson/Kconfig
|
||||
@@ -9,3 +9,9 @@ config MESON_SM
|
||||
depends on ARM64_4K_PAGES
|
||||
help
|
||||
Say y here to enable the Amlogic secure monitor driver
|
||||
+
|
||||
+config MESON_GX_PM
|
||||
+ bool
|
||||
+ default ARCH_MESON if ARM64
|
||||
+ help
|
||||
+ Say y here to enable the Amlogic GX SoC Power Management
|
||||
diff --git a/drivers/firmware/meson/Makefile b/drivers/firmware/meson/Makefile
|
||||
index c6c09483b622..0193cdfee32f 100644
|
||||
--- a/drivers/firmware/meson/Makefile
|
||||
+++ b/drivers/firmware/meson/Makefile
|
||||
@@ -1,2 +1,3 @@
|
||||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
obj-$(CONFIG_MESON_SM) += meson_sm.o
|
||||
+obj-$(CONFIG_MESON_GX_PM) += meson_gx_pm.o
|
||||
diff --git a/drivers/firmware/meson/meson_gx_pm.c b/drivers/firmware/meson/meson_gx_pm.c
|
||||
new file mode 100644
|
||||
index 000000000000..c104c2e4c77f
|
||||
--- /dev/null
|
||||
+++ b/drivers/firmware/meson/meson_gx_pm.c
|
||||
@@ -0,0 +1,86 @@
|
||||
+/*
|
||||
+ * Amlogic Meson GX Power Management
|
||||
+ *
|
||||
+ * Copyright (c) 2016 Baylibre, SAS.
|
||||
+ * Author: Neil Armstrong <narmstrong@baylibre.com>
|
||||
+ *
|
||||
+ * This program is free software; you can redistribute it and/or modify it
|
||||
+ * under the terms of version 2 of the GNU General Public License as
|
||||
+ * published by the Free Software Foundation.
|
||||
+ *
|
||||
+ * This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
+ * more details.
|
||||
+ */
|
||||
+
|
||||
+#include <linux/module.h>
|
||||
+#include <linux/of.h>
|
||||
+#include <linux/platform_device.h>
|
||||
+#include <linux/suspend.h>
|
||||
+#include <linux/arm-smccc.h>
|
||||
+
|
||||
+#include <uapi/linux/psci.h>
|
||||
+
|
||||
+#include <asm/suspend.h>
|
||||
+
|
||||
+/*
|
||||
+ * The Amlogic GX SoCs uses a special argument value to the
|
||||
+ * PSCI CPU_SUSPEND method to enter SUSPEND_MEM.
|
||||
+ */
|
||||
+
|
||||
+#define MESON_SUSPEND_PARAM 0x0010000
|
||||
+#define PSCI_FN_NATIVE(version, name) PSCI_##version##_FN64_##name
|
||||
+
|
||||
+static int meson_gx_suspend_finish(unsigned long arg)
|
||||
+{
|
||||
+ struct arm_smccc_res res;
|
||||
+
|
||||
+ arm_smccc_smc(PSCI_FN_NATIVE(0_2, CPU_SUSPEND), arg,
|
||||
+ virt_to_phys(cpu_resume), 0, 0, 0, 0, 0, &res);
|
||||
+
|
||||
+ return res.a0;
|
||||
+}
|
||||
+
|
||||
+static int meson_gx_suspend_enter(suspend_state_t state)
|
||||
+{
|
||||
+ switch (state) {
|
||||
+ case PM_SUSPEND_MEM:
|
||||
+ return cpu_suspend(MESON_SUSPEND_PARAM,
|
||||
+ meson_gx_suspend_finish);
|
||||
+ }
|
||||
+
|
||||
+ return -EINVAL;
|
||||
+}
|
||||
+
|
||||
+static const struct platform_suspend_ops meson_gx_pm_ops = {
|
||||
+ .enter = meson_gx_suspend_enter,
|
||||
+ .valid = suspend_valid_only_mem,
|
||||
+};
|
||||
+
|
||||
+static const struct of_device_id meson_gx_pm_match[] = {
|
||||
+ { .compatible = "amlogic,meson-gx-pm", },
|
||||
+ { /* sentinel */ },
|
||||
+};
|
||||
+MODULE_DEVICE_TABLE(of, meson_gx_pm_match);
|
||||
+
|
||||
+static int meson_gx_pm_probe(struct platform_device *pdev)
|
||||
+{
|
||||
+ suspend_set_ops(&meson_gx_pm_ops);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static struct platform_driver meson_gx_pm_driver = {
|
||||
+ .probe = meson_gx_pm_probe,
|
||||
+ .driver = {
|
||||
+ .name = "meson-gx-pm",
|
||||
+ .of_match_table = meson_gx_pm_match,
|
||||
+ },
|
||||
+};
|
||||
+
|
||||
+module_platform_driver(meson_gx_pm_driver);
|
||||
+
|
||||
+MODULE_AUTHOR("Neil Armstrong <narmstrong@baylibre.com>");
|
||||
+MODULE_DESCRIPTION("Amlogic Meson GX PM driver");
|
||||
+MODULE_LICENSE("GPL v2");
|
||||
--
|
||||
Armbian
|
||||
|
||||
@@ -1,106 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Martin Ayotte <martinayotte@yahoo.ca>
|
||||
Date: Sat, 11 Feb 2017 20:32:53 +0300
|
||||
Subject: add overlay-compilation-support to meson64-dev
|
||||
|
||||
- 871bed1a24e21952f7aeb1981c26ad5fc573be9d: Martin Ayotte <martinayotte@yahoo.ca>: 'add overlay-compilation-support to meson64-dev'
|
||||
---
|
||||
arch/arm/boot/.gitignore | 2 +
|
||||
scripts/Makefile.dtbinst | 14 +++++-
|
||||
scripts/Makefile.lib | 22 +++++++++-
|
||||
3 files changed, 36 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/arch/arm/boot/.gitignore b/arch/arm/boot/.gitignore
|
||||
index 8c759326baf4..e6ce8f6ad4b1 100644
|
||||
--- a/arch/arm/boot/.gitignore
|
||||
+++ b/arch/arm/boot/.gitignore
|
||||
@@ -4,3 +4,5 @@ zImage
|
||||
xipImage
|
||||
bootpImage
|
||||
uImage
|
||||
+*.dtb*
|
||||
+*.scr
|
||||
diff --git a/scripts/Makefile.dtbinst b/scripts/Makefile.dtbinst
|
||||
index 190d781e84f4..6540de71182b 100644
|
||||
--- a/scripts/Makefile.dtbinst
|
||||
+++ b/scripts/Makefile.dtbinst
|
||||
@@ -18,9 +18,12 @@ include $(srctree)/scripts/Kbuild.include
|
||||
include $(src)/Makefile
|
||||
|
||||
dtbs := $(addprefix $(dst)/, $(dtb-y) $(if $(CONFIG_OF_ALL_DTBS),$(dtb-)))
|
||||
+dtbos := $(addprefix $(dst)/, $(dtbo-y))
|
||||
+scrs := $(addprefix $(dst)/, $(scr-y))
|
||||
+readmes := $(addprefix $(dst)/, $(dtbotxt-y))
|
||||
subdirs := $(addprefix $(obj)/, $(subdir-y) $(subdir-m))
|
||||
|
||||
-__dtbs_install: $(dtbs) $(subdirs)
|
||||
+__dtbs_install: $(dtbs) $(dtbos) $(scrs) $(readmes) $(subdirs)
|
||||
@:
|
||||
|
||||
quiet_cmd_dtb_install = INSTALL $@
|
||||
@@ -32,6 +35,15 @@ $(dst)/%.dtb: $(obj)/%.dtb
|
||||
$(dst)/%.dtbo: $(obj)/%.dtbo
|
||||
$(call cmd,dtb_install)
|
||||
|
||||
+$(dst)/%.dtbo: $(obj)/%.dtbo
|
||||
+ $(call cmd,dtb_install)
|
||||
+
|
||||
+$(dst)/%.scr: $(obj)/%.scr
|
||||
+ $(call cmd,dtb_install)
|
||||
+
|
||||
+$(dst)/README.meson-overlays: $(src)/README.meson-overlays
|
||||
+ $(call cmd,dtb_install)
|
||||
+
|
||||
PHONY += $(subdirs)
|
||||
$(subdirs):
|
||||
$(Q)$(MAKE) $(dtbinst)=$@ dst=$(patsubst $(obj)/%,$(dst)/%,$@)
|
||||
diff --git a/scripts/Makefile.lib b/scripts/Makefile.lib
|
||||
index 3fb6a99e78c4..53a4121ca38c 100644
|
||||
--- a/scripts/Makefile.lib
|
||||
+++ b/scripts/Makefile.lib
|
||||
@@ -312,6 +312,9 @@ quiet_cmd_gzip = GZIP $@
|
||||
DTC ?= $(objtree)/scripts/dtc/dtc
|
||||
DTC_FLAGS += -Wno-interrupt_provider
|
||||
|
||||
+# Overlay support
|
||||
+DTC_FLAGS += -@ -Wno-unit_address_format -Wno-simple_bus_reg
|
||||
+
|
||||
# Disable noisy checks by default
|
||||
ifeq ($(findstring 1,$(KBUILD_EXTRA_WARN)),)
|
||||
DTC_FLAGS += -Wno-unit_address_vs_reg \
|
||||
@@ -372,7 +375,7 @@ DT_BINDING_DIR := Documentation/devicetree/bindings
|
||||
DT_TMP_SCHEMA := $(objtree)/$(DT_BINDING_DIR)/processed-schema.json
|
||||
|
||||
quiet_cmd_dtb_check = CHECK $@
|
||||
- cmd_dtb_check = $(DT_CHECKER) $(DT_CHECKER_FLAGS) -u $(srctree)/$(DT_BINDING_DIR) -p $(DT_TMP_SCHEMA) $@ || true
|
||||
+ cmd_dtb_check = $(DT_CHECKER) $(DT_CHECKER_FLAGS) -u $(srctree)/$(DT_BINDING_DIR) -p $(DT_TMP_SCHEMA) $@ || true
|
||||
endif
|
||||
|
||||
define rule_dtc
|
||||
@@ -386,6 +389,23 @@ $(obj)/%.dtb: $(src)/%.dts $(DTC) $(DT_TMP_SCHEMA) FORCE
|
||||
$(obj)/%.dtbo: $(src)/%.dts $(DTC) FORCE
|
||||
$(call if_changed_dep,dtc)
|
||||
|
||||
+quiet_cmd_dtco = DTCO $@
|
||||
+cmd_dtco = mkdir -p $(dir ${dtc-tmp}) ; \
|
||||
+ $(CPP) $(dtc_cpp_flags) -x assembler-with-cpp -o $(dtc-tmp) $< ; \
|
||||
+ $(DTC) -O dtb -o $@ -b 0 \
|
||||
+ -i $(dir $<) $(DTC_FLAGS) \
|
||||
+ -d $(depfile).dtc.tmp $(dtc-tmp) ; \
|
||||
+ cat $(depfile).pre.tmp $(depfile).dtc.tmp > $(depfile)
|
||||
+
|
||||
+$(obj)/%.dtbo: $(src)/%.dts FORCE
|
||||
+ $(call if_changed_dep,dtco)
|
||||
+
|
||||
+quiet_cmd_scr = MKIMAGE $@
|
||||
+cmd_scr = mkimage -C none -A $(ARCH) -T script -d $< $@
|
||||
+
|
||||
+$(obj)/%.scr: $(src)/%.scr-cmd FORCE
|
||||
+ $(call if_changed,scr)
|
||||
+
|
||||
dtc-tmp = $(subst $(comma),_,$(dot-target).dts.tmp)
|
||||
|
||||
# Bzip2
|
||||
--
|
||||
Armbian
|
||||
|
||||
@@ -1,30 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Jonas Karlman <jonas@kwiboo.se>
|
||||
Date: Mon, 9 Jul 2018 21:25:15 +0200
|
||||
Subject: TEMP: drm: dw-hdmi: call hdmi_set_cts_n after clock is enabled
|
||||
|
||||
Unknown patch. Archeology:
|
||||
- 99f6bef7de297253a659c22d4a35343a209f98b8: Igor Pecovnik <igorpecovnik@users.noreply.github.com>: 'Attach Meson64 CURRENT to 5.6.y and make DEV = CURRENT at this point. (#1956)'
|
||||
---
|
||||
drivers/gpu/drm/bridge/synopsys/dw-hdmi.c | 5 +++++
|
||||
1 file changed, 5 insertions(+)
|
||||
|
||||
diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
|
||||
index 40d8ca37f5bc..1ceb18f82f6d 100644
|
||||
--- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
|
||||
+++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
|
||||
@@ -782,6 +782,11 @@ static void hdmi_enable_audio_clk(struct dw_hdmi *hdmi, bool enable)
|
||||
else
|
||||
hdmi->mc_clkdis |= HDMI_MC_CLKDIS_AUDCLK_DISABLE;
|
||||
hdmi_writeb(hdmi, hdmi->mc_clkdis, HDMI_MC_CLKDIS);
|
||||
+
|
||||
+ if (enable) {
|
||||
+ hdmi_set_cts_n(hdmi, hdmi->audio_cts, 0);
|
||||
+ hdmi_set_cts_n(hdmi, hdmi->audio_cts, hdmi->audio_n);
|
||||
+ }
|
||||
}
|
||||
|
||||
static u8 *hdmi_audio_get_eld(struct dw_hdmi *hdmi)
|
||||
--
|
||||
Armbian
|
||||
|
||||
@@ -1,38 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Qinglang Miao <miaoqinglang@huawei.com>
|
||||
Date: Sat, 28 Nov 2020 16:10:04 +0000
|
||||
Subject: drm/panfrost: fix reference leak in panfrost_job_hw_submit
|
||||
|
||||
pm_runtime_get_sync will increment pm usage counter even it
|
||||
failed. Forgetting to putting operation will result in a
|
||||
reference leak here.
|
||||
|
||||
A new function pm_runtime_resume_and_get is introduced in
|
||||
[0] to keep usage counter balanced. So We fix the reference
|
||||
leak by replacing it with new funtion.
|
||||
|
||||
[0] dd8088d5a896 ("PM: runtime: Add pm_runtime_resume_and_get to deal with usage counter")
|
||||
|
||||
Fixes: f3ba91228e8e ("drm/panfrost: Add initial panfrost driver")
|
||||
Reported-by: Hulk Robot <hulkci@huawei.com>
|
||||
Signed-off-by: Qinglang Miao <miaoqinglang@huawei.com>
|
||||
---
|
||||
drivers/gpu/drm/panfrost/panfrost_job.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/gpu/drm/panfrost/panfrost_job.c b/drivers/gpu/drm/panfrost/panfrost_job.c
|
||||
index 7c4208476fbd..324a83dd7355 100644
|
||||
--- a/drivers/gpu/drm/panfrost/panfrost_job.c
|
||||
+++ b/drivers/gpu/drm/panfrost/panfrost_job.c
|
||||
@@ -193,7 +193,7 @@ static void panfrost_job_hw_submit(struct panfrost_job *job, int js)
|
||||
|
||||
panfrost_devfreq_record_busy(&pfdev->pfdevfreq);
|
||||
|
||||
- ret = pm_runtime_get_sync(pfdev->dev);
|
||||
+ ret = pm_runtime_resume_and_get(pfdev->dev);
|
||||
if (ret < 0)
|
||||
return;
|
||||
|
||||
--
|
||||
Armbian
|
||||
|
||||
@@ -1,31 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Christian Hewitt <christianshewitt@gmail.com>
|
||||
Date: Sat, 13 Apr 2019 05:45:18 +0000
|
||||
Subject: HACK: arm64: fix Kodi sysinfo CPU information
|
||||
|
||||
This allows the CPU information to show in the Kodi sysinfo screen, e.g.
|
||||
|
||||
"ARMv8 Processor rev 4 (v81)" on Amlogic devices
|
||||
|
||||
Signed-off-by: Christian Hewitt <christianshewitt@gmail.com>
|
||||
---
|
||||
arch/arm64/kernel/cpuinfo.c | 3 +--
|
||||
1 file changed, 1 insertion(+), 2 deletions(-)
|
||||
|
||||
diff --git a/arch/arm64/kernel/cpuinfo.c b/arch/arm64/kernel/cpuinfo.c
|
||||
index d7702f39b4d3..4b6ac49e34b4 100644
|
||||
--- a/arch/arm64/kernel/cpuinfo.c
|
||||
+++ b/arch/arm64/kernel/cpuinfo.c
|
||||
@@ -169,8 +169,7 @@ static int c_show(struct seq_file *m, void *v)
|
||||
* "processor". Give glibc what it expects.
|
||||
*/
|
||||
seq_printf(m, "processor\t: %d\n", i);
|
||||
- if (compat)
|
||||
- seq_printf(m, "model name\t: ARMv8 Processor rev %d (%s)\n",
|
||||
+ seq_printf(m, "model name\t: ARMv8 Processor rev %d (%s)\n",
|
||||
MIDR_REVISION(midr), COMPAT_ELF_PLATFORM);
|
||||
|
||||
seq_printf(m, "BogoMIPS\t: %lu.%02lu\n",
|
||||
--
|
||||
Armbian
|
||||
|
||||
@@ -1,76 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Dongjin Kim <tobetter@gmail.com>
|
||||
Date: Thu, 10 Sep 2020 11:01:33 +0900
|
||||
Subject: ODROID-COMMON: gpu/drm: add new display resolution 2560x1440
|
||||
|
||||
Signed-off-by: Joy Cho <joy.cho@hardkernel.com>
|
||||
Signed-off-by: Dongjin Kim <tobetter@gmail.com>
|
||||
---
|
||||
drivers/gpu/drm/meson/meson_vclk.c | 18 ++++++++++
|
||||
drivers/gpu/drm/meson/meson_venc.c | 5 +--
|
||||
2 files changed, 21 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/drivers/gpu/drm/meson/meson_vclk.c b/drivers/gpu/drm/meson/meson_vclk.c
|
||||
index 2a82119eb58e..eb4c251d79b7 100644
|
||||
--- a/drivers/gpu/drm/meson/meson_vclk.c
|
||||
+++ b/drivers/gpu/drm/meson/meson_vclk.c
|
||||
@@ -357,6 +357,8 @@ enum {
|
||||
MESON_VCLK_HDMI_594000,
|
||||
/* 2970 /1 /1 /1 /5 /1 => /1 /2 */
|
||||
MESON_VCLK_HDMI_594000_YUV420,
|
||||
+/* 4830 /2 /1 /2 /5 /1 => /1 /1 */
|
||||
+ MESON_VCLK_HDMI_241500,
|
||||
};
|
||||
|
||||
struct meson_vclk_params {
|
||||
@@ -467,6 +469,18 @@ struct meson_vclk_params {
|
||||
.vid_pll_div = VID_PLL_DIV_5,
|
||||
.vclk_div = 1,
|
||||
},
|
||||
+ [MESON_VCLK_HDMI_241500] = {
|
||||
+ .pll_freq = 4830000,
|
||||
+ .phy_freq = 2415000,
|
||||
+ .venc_freq = 241500,
|
||||
+ .vclk_freq = 241500,
|
||||
+ .pixel_freq = 241500,
|
||||
+ .pll_od1 = 2,
|
||||
+ .pll_od2 = 1,
|
||||
+ .pll_od3 = 2,
|
||||
+ .vid_pll_div = VID_PLL_DIV_5,
|
||||
+ .vclk_div = 1,
|
||||
+ },
|
||||
{ /* sentinel */ },
|
||||
};
|
||||
|
||||
@@ -873,6 +887,10 @@ static void meson_vclk_set(struct meson_drm *priv, unsigned int pll_base_freq,
|
||||
m = 0xf7;
|
||||
frac = vic_alternate_clock ? 0x8148 : 0x10000;
|
||||
break;
|
||||
+ case 4830000:
|
||||
+ m = 0xc9;
|
||||
+ frac = 0xd560;
|
||||
+ break;
|
||||
}
|
||||
|
||||
meson_hdmi_pll_set_params(priv, m, frac, od1, od2, od3);
|
||||
diff --git a/drivers/gpu/drm/meson/meson_venc.c b/drivers/gpu/drm/meson/meson_venc.c
|
||||
index 3c55ed003359..559ab3b5e212 100644
|
||||
--- a/drivers/gpu/drm/meson/meson_venc.c
|
||||
+++ b/drivers/gpu/drm/meson/meson_venc.c
|
||||
@@ -866,10 +866,11 @@ meson_venc_hdmi_supported_mode(const struct drm_display_mode *mode)
|
||||
DRM_MODE_FLAG_PVSYNC | DRM_MODE_FLAG_NVSYNC))
|
||||
return MODE_BAD;
|
||||
|
||||
- if (mode->hdisplay < 640 || mode->hdisplay > 1920)
|
||||
+ /* support higher resolution than 1920x1080 */
|
||||
+ if (mode->hdisplay < 640 || mode->hdisplay > 2560)
|
||||
return MODE_BAD_HVALUE;
|
||||
|
||||
- if (mode->vdisplay < 480 || mode->vdisplay > 1200)
|
||||
+ if (mode->vdisplay < 480 || mode->vdisplay > 1600)
|
||||
return MODE_BAD_VVALUE;
|
||||
|
||||
return MODE_OK;
|
||||
--
|
||||
Armbian
|
||||
|
||||
@@ -1,202 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Jonas Karlman <jonas@kwiboo.se>
|
||||
Date: Sun, 23 Dec 2018 02:24:38 +0100
|
||||
Subject: WIP: ASoC: hdmi-codec: reorder channel allocation list
|
||||
|
||||
Wrong channel allocation is selected by hdmi_codec_get_ch_alloc_table_idx().
|
||||
|
||||
E.g when ELD reports FL|FR|LFE|FC|RL|RR or FL|FR|LFE|FC|RL|RR|RC|RLC|RRC
|
||||
|
||||
ca_id 0x01 with speaker mask FL|FR|LFE gets selected instead of
|
||||
ca_id 0x03 with speaker mask FL|FR|LFE|FC for 4 channels
|
||||
|
||||
and
|
||||
|
||||
ca_id 0x04 with speaker mask FL|FR|RC gets selected instead of
|
||||
ca_id 0x0b with speaker mask FL|FR|LFE|FC|RL|RR for 6 channels
|
||||
|
||||
Fix this by reorder the channel allocation list with
|
||||
most specific speaker mask at the top.
|
||||
|
||||
Signed-off-by: Jonas Karlman <jonas@kwiboo.se>
|
||||
---
|
||||
sound/soc/codecs/hdmi-codec.c | 140 +++++-----
|
||||
1 file changed, 77 insertions(+), 63 deletions(-)
|
||||
|
||||
diff --git a/sound/soc/codecs/hdmi-codec.c b/sound/soc/codecs/hdmi-codec.c
|
||||
index 5679102de91f..36825921cefa 100644
|
||||
--- a/sound/soc/codecs/hdmi-codec.c
|
||||
+++ b/sound/soc/codecs/hdmi-codec.c
|
||||
@@ -188,84 +188,97 @@ static const struct snd_pcm_chmap_elem hdmi_codec_8ch_chmaps[] = {
|
||||
/*
|
||||
* hdmi_codec_channel_alloc: speaker configuration available for CEA
|
||||
*
|
||||
- * This is an ordered list that must match with hdmi_codec_8ch_chmaps struct
|
||||
+ * This is an ordered list where ca_id must exist in hdmi_codec_8ch_chmaps
|
||||
* The preceding ones have better chances to be selected by
|
||||
* hdmi_codec_get_ch_alloc_table_idx().
|
||||
*/
|
||||
static const struct hdmi_codec_cea_spk_alloc hdmi_codec_channel_alloc[] = {
|
||||
{ .ca_id = 0x00, .n_ch = 2,
|
||||
- .mask = FL | FR},
|
||||
- /* 2.1 */
|
||||
- { .ca_id = 0x01, .n_ch = 4,
|
||||
- .mask = FL | FR | LFE},
|
||||
- /* Dolby Surround */
|
||||
+ .mask = FL | FR },
|
||||
+ { .ca_id = 0x03, .n_ch = 4,
|
||||
+ .mask = FL | FR | LFE | FC },
|
||||
{ .ca_id = 0x02, .n_ch = 4,
|
||||
.mask = FL | FR | FC },
|
||||
- /* surround51 */
|
||||
+ { .ca_id = 0x01, .n_ch = 4,
|
||||
+ .mask = FL | FR | LFE },
|
||||
{ .ca_id = 0x0b, .n_ch = 6,
|
||||
- .mask = FL | FR | LFE | FC | RL | RR},
|
||||
- /* surround40 */
|
||||
- { .ca_id = 0x08, .n_ch = 6,
|
||||
- .mask = FL | FR | RL | RR },
|
||||
- /* surround41 */
|
||||
- { .ca_id = 0x09, .n_ch = 6,
|
||||
- .mask = FL | FR | LFE | RL | RR },
|
||||
- /* surround50 */
|
||||
+ .mask = FL | FR | LFE | FC | RL | RR },
|
||||
{ .ca_id = 0x0a, .n_ch = 6,
|
||||
.mask = FL | FR | FC | RL | RR },
|
||||
- /* 6.1 */
|
||||
- { .ca_id = 0x0f, .n_ch = 8,
|
||||
- .mask = FL | FR | LFE | FC | RL | RR | RC },
|
||||
- /* surround71 */
|
||||
+ { .ca_id = 0x09, .n_ch = 6,
|
||||
+ .mask = FL | FR | LFE | RL | RR },
|
||||
+ { .ca_id = 0x08, .n_ch = 6,
|
||||
+ .mask = FL | FR | RL | RR },
|
||||
+ { .ca_id = 0x07, .n_ch = 6,
|
||||
+ .mask = FL | FR | LFE | FC | RC },
|
||||
+ { .ca_id = 0x06, .n_ch = 6,
|
||||
+ .mask = FL | FR | FC | RC },
|
||||
+ { .ca_id = 0x05, .n_ch = 6,
|
||||
+ .mask = FL | FR | LFE | RC },
|
||||
+ { .ca_id = 0x04, .n_ch = 6,
|
||||
+ .mask = FL | FR | RC },
|
||||
{ .ca_id = 0x13, .n_ch = 8,
|
||||
.mask = FL | FR | LFE | FC | RL | RR | RLC | RRC },
|
||||
- /* others */
|
||||
- { .ca_id = 0x03, .n_ch = 8,
|
||||
- .mask = FL | FR | LFE | FC },
|
||||
- { .ca_id = 0x04, .n_ch = 8,
|
||||
- .mask = FL | FR | RC},
|
||||
- { .ca_id = 0x05, .n_ch = 8,
|
||||
- .mask = FL | FR | LFE | RC },
|
||||
- { .ca_id = 0x06, .n_ch = 8,
|
||||
- .mask = FL | FR | FC | RC },
|
||||
- { .ca_id = 0x07, .n_ch = 8,
|
||||
- .mask = FL | FR | LFE | FC | RC },
|
||||
- { .ca_id = 0x0c, .n_ch = 8,
|
||||
- .mask = FL | FR | RC | RL | RR },
|
||||
- { .ca_id = 0x0d, .n_ch = 8,
|
||||
- .mask = FL | FR | LFE | RL | RR | RC },
|
||||
- { .ca_id = 0x0e, .n_ch = 8,
|
||||
- .mask = FL | FR | FC | RL | RR | RC },
|
||||
- { .ca_id = 0x10, .n_ch = 8,
|
||||
- .mask = FL | FR | RL | RR | RLC | RRC },
|
||||
- { .ca_id = 0x11, .n_ch = 8,
|
||||
- .mask = FL | FR | LFE | RL | RR | RLC | RRC },
|
||||
+ { .ca_id = 0x1f, .n_ch = 8,
|
||||
+ .mask = FL | FR | LFE | FC | RL | RR | FLC | FRC },
|
||||
{ .ca_id = 0x12, .n_ch = 8,
|
||||
.mask = FL | FR | FC | RL | RR | RLC | RRC },
|
||||
- { .ca_id = 0x14, .n_ch = 8,
|
||||
- .mask = FL | FR | FLC | FRC },
|
||||
- { .ca_id = 0x15, .n_ch = 8,
|
||||
- .mask = FL | FR | LFE | FLC | FRC },
|
||||
- { .ca_id = 0x16, .n_ch = 8,
|
||||
- .mask = FL | FR | FC | FLC | FRC },
|
||||
- { .ca_id = 0x17, .n_ch = 8,
|
||||
- .mask = FL | FR | LFE | FC | FLC | FRC },
|
||||
- { .ca_id = 0x18, .n_ch = 8,
|
||||
- .mask = FL | FR | RC | FLC | FRC },
|
||||
- { .ca_id = 0x19, .n_ch = 8,
|
||||
- .mask = FL | FR | LFE | RC | FLC | FRC },
|
||||
- { .ca_id = 0x1a, .n_ch = 8,
|
||||
- .mask = FL | FR | RC | FC | FLC | FRC },
|
||||
- { .ca_id = 0x1b, .n_ch = 8,
|
||||
- .mask = FL | FR | LFE | RC | FC | FLC | FRC },
|
||||
- { .ca_id = 0x1c, .n_ch = 8,
|
||||
- .mask = FL | FR | RL | RR | FLC | FRC },
|
||||
- { .ca_id = 0x1d, .n_ch = 8,
|
||||
- .mask = FL | FR | LFE | RL | RR | FLC | FRC },
|
||||
{ .ca_id = 0x1e, .n_ch = 8,
|
||||
.mask = FL | FR | FC | RL | RR | FLC | FRC },
|
||||
- { .ca_id = 0x1f, .n_ch = 8,
|
||||
- .mask = FL | FR | LFE | FC | RL | RR | FLC | FRC },
|
||||
+ { .ca_id = 0x11, .n_ch = 8,
|
||||
+ .mask = FL | FR | LFE | RL | RR | RLC | RRC },
|
||||
+ { .ca_id = 0x1d, .n_ch = 8,
|
||||
+ .mask = FL | FR | LFE | RL | RR | FLC | FRC },
|
||||
+ { .ca_id = 0x10, .n_ch = 8,
|
||||
+ .mask = FL | FR | RL | RR | RLC | RRC },
|
||||
+ { .ca_id = 0x1c, .n_ch = 8,
|
||||
+ .mask = FL | FR | RL | RR | FLC | FRC },
|
||||
+ { .ca_id = 0x0f, .n_ch = 8,
|
||||
+ .mask = FL | FR | LFE | FC | RL | RR | RC },
|
||||
+ { .ca_id = 0x1b, .n_ch = 8,
|
||||
+ .mask = FL | FR | LFE | RC | FC | FLC | FRC },
|
||||
+ { .ca_id = 0x0e, .n_ch = 8,
|
||||
+ .mask = FL | FR | FC | RL | RR | RC },
|
||||
+ { .ca_id = 0x1a, .n_ch = 8,
|
||||
+ .mask = FL | FR | RC | FC | FLC | FRC },
|
||||
+ { .ca_id = 0x0d, .n_ch = 8,
|
||||
+ .mask = FL | FR | LFE | RL | RR | RC },
|
||||
+ { .ca_id = 0x19, .n_ch = 8,
|
||||
+ .mask = FL | FR | LFE | RC | FLC | FRC },
|
||||
+ { .ca_id = 0x0c, .n_ch = 8,
|
||||
+ .mask = FL | FR | RC | RL | RR },
|
||||
+ { .ca_id = 0x18, .n_ch = 8,
|
||||
+ .mask = FL | FR | RC | FLC | FRC },
|
||||
+ { .ca_id = 0x17, .n_ch = 8,
|
||||
+ .mask = FL | FR | LFE | FC | FLC | FRC },
|
||||
+ { .ca_id = 0x16, .n_ch = 8,
|
||||
+ .mask = FL | FR | FC | FLC | FRC },
|
||||
+ { .ca_id = 0x15, .n_ch = 8,
|
||||
+ .mask = FL | FR | LFE | FLC | FRC },
|
||||
+ { .ca_id = 0x14, .n_ch = 8,
|
||||
+ .mask = FL | FR | FLC | FRC },
|
||||
+ { .ca_id = 0x0b, .n_ch = 8,
|
||||
+ .mask = FL | FR | LFE | FC | RL | RR },
|
||||
+ { .ca_id = 0x0a, .n_ch = 8,
|
||||
+ .mask = FL | FR | FC | RL | RR },
|
||||
+ { .ca_id = 0x09, .n_ch = 8,
|
||||
+ .mask = FL | FR | LFE | RL | RR },
|
||||
+ { .ca_id = 0x08, .n_ch = 8,
|
||||
+ .mask = FL | FR | RL | RR },
|
||||
+ { .ca_id = 0x07, .n_ch = 8,
|
||||
+ .mask = FL | FR | LFE | FC | RC },
|
||||
+ { .ca_id = 0x06, .n_ch = 8,
|
||||
+ .mask = FL | FR | FC | RC },
|
||||
+ { .ca_id = 0x05, .n_ch = 8,
|
||||
+ .mask = FL | FR | LFE | RC },
|
||||
+ { .ca_id = 0x04, .n_ch = 8,
|
||||
+ .mask = FL | FR | RC },
|
||||
+ { .ca_id = 0x03, .n_ch = 8,
|
||||
+ .mask = FL | FR | LFE | FC },
|
||||
+ { .ca_id = 0x02, .n_ch = 8,
|
||||
+ .mask = FL | FR | FC },
|
||||
+ { .ca_id = 0x01, .n_ch = 8,
|
||||
+ .mask = FL | FR | LFE },
|
||||
};
|
||||
|
||||
struct hdmi_codec_priv {
|
||||
@@ -374,7 +387,8 @@ static int hdmi_codec_chmap_ctl_get(struct snd_kcontrol *kcontrol,
|
||||
struct snd_pcm_chmap *info = snd_kcontrol_chip(kcontrol);
|
||||
struct hdmi_codec_priv *hcp = info->private_data;
|
||||
|
||||
- map = info->chmap[hcp->chmap_idx].map;
|
||||
+ if (hcp->chmap_idx != HDMI_CODEC_CHMAP_IDX_UNKNOWN)
|
||||
+ map = info->chmap[hcp->chmap_idx].map;
|
||||
|
||||
for (i = 0; i < info->max_channels; i++) {
|
||||
if (hcp->chmap_idx == HDMI_CODEC_CHMAP_IDX_UNKNOWN)
|
||||
--
|
||||
Armbian
|
||||
|
||||
@@ -1,141 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Dongjin Kim <tobetter@gmail.com>
|
||||
Date: Wed, 30 Jun 2021 11:38:33 +0900
|
||||
Subject: ODROID-COMMON: hwmon: (pwm-fan): fix to add 'pwm1_enable' to set PWM
|
||||
fan mode
|
||||
|
||||
Change-Id: If0562f497703b8660206dad80d7933902bbf53e4
|
||||
---
|
||||
drivers/hwmon/pwm-fan.c | 67 +++++++++-
|
||||
1 file changed, 61 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/drivers/hwmon/pwm-fan.c b/drivers/hwmon/pwm-fan.c
|
||||
index 6c08551d8d14..e52e735c0ddf 100644
|
||||
--- a/drivers/hwmon/pwm-fan.c
|
||||
+++ b/drivers/hwmon/pwm-fan.c
|
||||
@@ -8,6 +8,7 @@
|
||||
*/
|
||||
|
||||
#include <linux/hwmon.h>
|
||||
+#include <linux/hwmon-sysfs.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/mutex.h>
|
||||
@@ -44,6 +45,7 @@ struct pwm_fan_ctx {
|
||||
unsigned int pwm_fan_max_state;
|
||||
unsigned int *pwm_fan_cooling_levels;
|
||||
struct thermal_cooling_device *cdev;
|
||||
+ int enable;
|
||||
|
||||
struct hwmon_chip_info info;
|
||||
struct hwmon_channel_info fan_channel;
|
||||
@@ -89,6 +91,10 @@ static int __set_pwm(struct pwm_fan_ctx *ctx, unsigned long pwm)
|
||||
struct pwm_state *state = &ctx->pwm_state;
|
||||
|
||||
mutex_lock(&ctx->lock);
|
||||
+
|
||||
+ if (!ctx->enable)
|
||||
+ pwm = MAX_PWM;
|
||||
+
|
||||
if (ctx->pwm_value == pwm)
|
||||
goto exit_set_pwm_err;
|
||||
|
||||
@@ -173,6 +179,51 @@ static const struct hwmon_ops pwm_fan_hwmon_ops = {
|
||||
.write = pwm_fan_write,
|
||||
};
|
||||
|
||||
+static ssize_t enable_store(struct device *dev,
|
||||
+ struct device_attribute *attr,
|
||||
+ const char *buf, size_t count)
|
||||
+{
|
||||
+ struct pwm_fan_ctx *ctx = dev_get_drvdata(dev);
|
||||
+ int err;
|
||||
+ unsigned long val;
|
||||
+
|
||||
+ err = kstrtoul(buf, 10, &val);
|
||||
+ if (err)
|
||||
+ return err;
|
||||
+
|
||||
+ mutex_lock(&ctx->lock);
|
||||
+ ctx->enable = val;
|
||||
+ mutex_unlock(&ctx->lock);
|
||||
+
|
||||
+ err = __set_pwm(ctx, ctx->pwm_fan_cooling_levels[ctx->pwm_fan_state]);
|
||||
+
|
||||
+ return err ? err : count;
|
||||
+}
|
||||
+
|
||||
+static ssize_t enable_show(struct device *dev, struct device_attribute *attr,
|
||||
+ char *buf)
|
||||
+{
|
||||
+ struct pwm_fan_ctx *ctx = dev_get_drvdata(dev);
|
||||
+
|
||||
+ return sprintf(buf, "%u\n", ctx->enable);
|
||||
+}
|
||||
+
|
||||
+static SENSOR_DEVICE_ATTR_RW(pwm1_enable, enable, 0);
|
||||
+
|
||||
+static struct attribute *pwm_fan_attrs[] = {
|
||||
+ &sensor_dev_attr_pwm1_enable.dev_attr.attr,
|
||||
+ NULL,
|
||||
+};
|
||||
+
|
||||
+static const struct attribute_group pwm_fan_group = {
|
||||
+ .attrs = pwm_fan_attrs,
|
||||
+};
|
||||
+
|
||||
+static const struct attribute_group *pwm_fan_groups[] = {
|
||||
+ &pwm_fan_group,
|
||||
+ NULL,
|
||||
+};
|
||||
+
|
||||
/* thermal cooling device callbacks */
|
||||
static int pwm_fan_get_max_state(struct thermal_cooling_device *cdev,
|
||||
unsigned long *state)
|
||||
@@ -204,7 +255,7 @@ static int
|
||||
pwm_fan_set_cur_state(struct thermal_cooling_device *cdev, unsigned long state)
|
||||
{
|
||||
struct pwm_fan_ctx *ctx = cdev->devdata;
|
||||
- int ret;
|
||||
+ int ret = 0;
|
||||
|
||||
if (!ctx || (state > ctx->pwm_fan_max_state))
|
||||
return -EINVAL;
|
||||
@@ -212,10 +263,12 @@ pwm_fan_set_cur_state(struct thermal_cooling_device *cdev, unsigned long state)
|
||||
if (state == ctx->pwm_fan_state)
|
||||
return 0;
|
||||
|
||||
- ret = __set_pwm(ctx, ctx->pwm_fan_cooling_levels[state]);
|
||||
- if (ret) {
|
||||
- dev_err(&cdev->device, "Cannot set pwm!\n");
|
||||
- return ret;
|
||||
+ if (ctx->enable >= 2) {
|
||||
+ ret = __set_pwm(ctx, ctx->pwm_fan_cooling_levels[state]);
|
||||
+ if (ret) {
|
||||
+ dev_err(&cdev->device, "Cannot set pwm!\n");
|
||||
+ return ret;
|
||||
+ }
|
||||
}
|
||||
|
||||
ctx->pwm_fan_state = state;
|
||||
@@ -306,6 +359,8 @@ static int pwm_fan_probe(struct platform_device *pdev)
|
||||
if (IS_ERR(ctx->pwm))
|
||||
return dev_err_probe(dev, PTR_ERR(ctx->pwm), "Could not get PWM\n");
|
||||
|
||||
+ ctx->enable = 2;
|
||||
+
|
||||
platform_set_drvdata(pdev, ctx);
|
||||
|
||||
ctx->reg_en = devm_regulator_get_optional(dev, "fan");
|
||||
@@ -424,7 +479,7 @@ static int pwm_fan_probe(struct platform_device *pdev)
|
||||
ctx->info.info = channels;
|
||||
|
||||
hwmon = devm_hwmon_device_register_with_info(dev, "pwmfan",
|
||||
- ctx, &ctx->info, NULL);
|
||||
+ ctx, &ctx->info, pwm_fan_groups);
|
||||
if (IS_ERR(hwmon)) {
|
||||
dev_err(dev, "Failed to register hwmon device\n");
|
||||
return PTR_ERR(hwmon);
|
||||
--
|
||||
Armbian
|
||||
|
||||
@@ -1,56 +0,0 @@
|
||||
From 4b6096bb3fd5bdc139a45e022e4a2380ea919dea Mon Sep 17 00:00:00 2001
|
||||
From: Christian Hewitt <christianshewitt@gmail.com>
|
||||
Date: Sat, 13 Apr 2019 05:41:51 +0000
|
||||
Subject: [PATCH 01/90] HACK: set meson-gx cma pool to 896MB
|
||||
|
||||
This change sets the CMA pool to a larger 896MB! value for vdec use
|
||||
|
||||
Signed-off-by: Christian Hewitt <christianshewitt@gmail.com>
|
||||
---
|
||||
arch/arm64/boot/dts/amlogic/meson-gx.dtsi | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/amlogic/meson-gx.dtsi b/arch/arm64/boot/dts/amlogic/meson-gx.dtsi
|
||||
index aa14ea017a61..99b8916e0c5d 100644
|
||||
--- a/arch/arm64/boot/dts/amlogic/meson-gx.dtsi
|
||||
+++ b/arch/arm64/boot/dts/amlogic/meson-gx.dtsi
|
||||
@@ -58,7 +58,7 @@ secmon_reserved_bl32: secmon@5300000 {
|
||||
linux,cma {
|
||||
compatible = "shared-dma-pool";
|
||||
reusable;
|
||||
- size = <0x0 0x10000000>;
|
||||
+ size = <0x0 0x38000000>;
|
||||
alignment = <0x0 0x400000>;
|
||||
linux,cma-default;
|
||||
};
|
||||
--
|
||||
2.35.1
|
||||
|
||||
From 18586e3d94827f63903c4cd596a0a06134261c00 Mon Sep 17 00:00:00 2001
|
||||
From: Christian Hewitt <christianshewitt@gmail.com>
|
||||
Date: Wed, 14 Aug 2019 19:58:14 +0000
|
||||
Subject: [PATCH 02/90] HACK: set meson-g12 cma pool to 896MB
|
||||
|
||||
This change sets the CMA pool to a larger 896MB! value for vdec use
|
||||
|
||||
Signed-off-by: Christian Hewitt <christianshewitt@gmail.com>
|
||||
---
|
||||
arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi b/arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi
|
||||
index f84d4b489e0b..04da23119ff1 100644
|
||||
--- a/arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi
|
||||
+++ b/arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi
|
||||
@@ -116,7 +116,7 @@ secmon_reserved_bl32: secmon@5300000 {
|
||||
linux,cma {
|
||||
compatible = "shared-dma-pool";
|
||||
reusable;
|
||||
- size = <0x0 0x10000000>;
|
||||
+ size = <0x0 0x38000000>;
|
||||
alignment = <0x0 0x400000>;
|
||||
linux,cma-default;
|
||||
};
|
||||
--
|
||||
2.35.1
|
||||
|
||||
@@ -1,635 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Hyeonki Hong <hhk7734@gmail.com>
|
||||
Date: Thu, 5 Mar 2020 19:01:43 +0900
|
||||
Subject: ODROID-COMMON: input/touchscreen: Add D-WAV Multitouch driver.
|
||||
|
||||
Change-Id: Ia1c8c29d3f69c6ba5d630279c4cc98119b68ab71
|
||||
---
|
||||
drivers/hid/hid-ids.h | 6 +
|
||||
drivers/hid/hid-quirks.c | 3 +
|
||||
drivers/input/touchscreen/Kconfig | 10 +
|
||||
drivers/input/touchscreen/Makefile | 1 +
|
||||
drivers/input/touchscreen/dwav-usb-mt.c | 554 ++++++++++
|
||||
5 files changed, 574 insertions(+)
|
||||
|
||||
diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h
|
||||
index 256795ed6247..81c98ae632c5 100644
|
||||
--- a/drivers/hid/hid-ids.h
|
||||
+++ b/drivers/hid/hid-ids.h
|
||||
@@ -1407,4 +1407,10 @@
|
||||
#define USB_VENDOR_ID_SIGNOTEC 0x2133
|
||||
#define USB_DEVICE_ID_SIGNOTEC_VIEWSONIC_PD1011 0x0018
|
||||
|
||||
+#define USB_DEVICE_ID_DWAV_MULTITOUCH 0x0005
|
||||
+
|
||||
+#define USB_VENDOR_ID_ODROID 0x16b4
|
||||
+#define USB_DEVICE_ID_VU5 0x0704
|
||||
+#define USB_DEVICE_ID_VU7PLUS 0x0705
|
||||
+
|
||||
#endif
|
||||
diff --git a/drivers/hid/hid-quirks.c b/drivers/hid/hid-quirks.c
|
||||
index 50e1c717fc0a..b2f1a4a7367d 100644
|
||||
--- a/drivers/hid/hid-quirks.c
|
||||
+++ b/drivers/hid/hid-quirks.c
|
||||
@@ -876,6 +876,9 @@ static const struct hid_device_id hid_ignore_list[] = {
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_SYNAPTICS, USB_DEVICE_ID_SYNAPTICS_DPAD) },
|
||||
#endif
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_YEALINK, USB_DEVICE_ID_YEALINK_P1K_P4K_B2K) },
|
||||
+
|
||||
+ { HID_USB_DEVICE(USB_VENDOR_ID_ODROID, USB_DEVICE_ID_VU5) },
|
||||
+ { HID_USB_DEVICE(USB_VENDOR_ID_ODROID, USB_DEVICE_ID_VU7PLUS) },
|
||||
{ }
|
||||
};
|
||||
|
||||
diff --git a/drivers/input/touchscreen/Kconfig b/drivers/input/touchscreen/Kconfig
|
||||
index 2d70c945b20a..b4043c6b68e7 100644
|
||||
--- a/drivers/input/touchscreen/Kconfig
|
||||
+++ b/drivers/input/touchscreen/Kconfig
|
||||
@@ -1379,4 +1379,14 @@ config TOUCHSCREEN_ZINITIX
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called zinitix.
|
||||
|
||||
+config TOUCHSCREEN_DWAV_USB_MT
|
||||
+ tristate "D-WAV Scientific USB MultiTouch"
|
||||
+ depends on USB_ARCH_HAS_HCD
|
||||
+ select USB
|
||||
+ help
|
||||
+ Say Y here if you have a D-WAV Scientific USB(HID) based MultiTouch
|
||||
+ controller.
|
||||
+
|
||||
+ module will be called dwav-usb-mt.
|
||||
+
|
||||
endif
|
||||
diff --git a/drivers/input/touchscreen/Makefile b/drivers/input/touchscreen/Makefile
|
||||
index 557f84fd2075..68feafadf7fe 100644
|
||||
--- a/drivers/input/touchscreen/Makefile
|
||||
+++ b/drivers/input/touchscreen/Makefile
|
||||
@@ -116,3 +116,4 @@ obj-$(CONFIG_TOUCHSCREEN_ROHM_BU21023) += rohm_bu21023.o
|
||||
obj-$(CONFIG_TOUCHSCREEN_RASPBERRYPI_FW) += raspberrypi-ts.o
|
||||
obj-$(CONFIG_TOUCHSCREEN_IQS5XX) += iqs5xx.o
|
||||
obj-$(CONFIG_TOUCHSCREEN_ZINITIX) += zinitix.o
|
||||
+obj-$(CONFIG_TOUCHSCREEN_DWAV_USB_MT) += dwav-usb-mt.o
|
||||
diff --git a/drivers/input/touchscreen/dwav-usb-mt.c b/drivers/input/touchscreen/dwav-usb-mt.c
|
||||
new file mode 100644
|
||||
index 000000000000..7ec8b6dd15fd
|
||||
--- /dev/null
|
||||
+++ b/drivers/input/touchscreen/dwav-usb-mt.c
|
||||
@@ -0,0 +1,554 @@
|
||||
+// SPDX-License-Identifier: GPL-2.0+
|
||||
+/*
|
||||
+ * D-WAV Scientific USB(HID) MultiTouch Screen Driver(Based on usbtouchscreen.c)
|
||||
+ *
|
||||
+ * Copyright (C) Hardkernel, 2015
|
||||
+ */
|
||||
+
|
||||
+#include <linux/kernel.h>
|
||||
+#include <linux/slab.h>
|
||||
+#include <linux/input.h>
|
||||
+#include <linux/module.h>
|
||||
+#include <linux/init.h>
|
||||
+#include <linux/usb.h>
|
||||
+#include <linux/usb/input.h>
|
||||
+#include <linux/hid.h>
|
||||
+
|
||||
+#include <linux/input/mt.h>
|
||||
+
|
||||
+#define USB_VENDOR_ID_DWAV 0x0eef /* 800 x 480, 7" DWAV touch */
|
||||
+#define USB_DEVICE_ID_VU7 0x0005
|
||||
+
|
||||
+#define USB_VENDOR_ID_ODROID 0x16b4
|
||||
+#define USB_DEVICE_ID_VU5 0x0704
|
||||
+#define USB_DEVICE_ID_VU7PLUS 0x0705
|
||||
+
|
||||
+enum {
|
||||
+ ODROID_VU7 = 0, /* 800 x 480, 7" Touch */
|
||||
+ ODROID_VU5, /* 800 x 480, 5" Touch */
|
||||
+ ODROID_VU7PLUS, /* 1024 x 600, 7" Touch */
|
||||
+};
|
||||
+
|
||||
+struct usbtouch_device_info {
|
||||
+ char name[64];
|
||||
+ int max_x;
|
||||
+ int max_y;
|
||||
+ int max_press;
|
||||
+ int max_finger;
|
||||
+};
|
||||
+
|
||||
+const struct usbtouch_device_info DEV_INFO[] = {
|
||||
+ [ODROID_VU7] = {
|
||||
+ .name = "ODROID VU7 MultiTouch(800x480)",
|
||||
+ .max_x = 800,
|
||||
+ .max_y = 480,
|
||||
+ .max_press = 255,
|
||||
+ .max_finger = 5,
|
||||
+ },
|
||||
+ [ODROID_VU5] = {
|
||||
+ .name = "ODROID VU5 MultiTouch(800x480)",
|
||||
+ .max_x = 800,
|
||||
+ .max_y = 480,
|
||||
+ .max_press = 255,
|
||||
+ .max_finger = 5,
|
||||
+ },
|
||||
+ [ODROID_VU7PLUS] = {
|
||||
+ .name = "ODROID VU7 Plus MultiTouch(1024x600)",
|
||||
+ .max_x = 1024,
|
||||
+ .max_y = 600,
|
||||
+ .max_press = 255,
|
||||
+ .max_finger = 5,
|
||||
+ },
|
||||
+};
|
||||
+
|
||||
+static const struct usb_device_id dwav_usb_mt_devices[] = {
|
||||
+ {USB_DEVICE(USB_VENDOR_ID_DWAV, USB_DEVICE_ID_VU7),
|
||||
+ .driver_info = ODROID_VU7},
|
||||
+ {USB_DEVICE(USB_VENDOR_ID_ODROID, USB_DEVICE_ID_VU5),
|
||||
+ .driver_info = ODROID_VU5},
|
||||
+ {USB_DEVICE(USB_VENDOR_ID_ODROID, USB_DEVICE_ID_VU7PLUS),
|
||||
+ .driver_info = ODROID_VU7PLUS},
|
||||
+ {}
|
||||
+};
|
||||
+
|
||||
+struct dwav_raw { /* Total 25 bytes */
|
||||
+ unsigned char header; /* frame header 0xAA*/
|
||||
+ unsigned char press;
|
||||
+ /* Touch flag (1:valid touch data, 0:touch finished) */
|
||||
+ unsigned short x1; /* 1st x */
|
||||
+ unsigned short y1; /* 1st y */
|
||||
+ unsigned char end;
|
||||
+ /* 1st touch finish flags 0xBB, RPI only uses the first 7 bytes */
|
||||
+ unsigned char ids; /* touch ID(bit field) */
|
||||
+ unsigned short y2;
|
||||
+ unsigned short x2;
|
||||
+ unsigned short y3;
|
||||
+ unsigned short x3;
|
||||
+ unsigned short y4;
|
||||
+ unsigned short x4;
|
||||
+ unsigned short y5;
|
||||
+ unsigned short x5;
|
||||
+ unsigned char tail; /* frame end 0xCC */
|
||||
+};
|
||||
+
|
||||
+#define TS_EVENT_UNKNOWN 0x00
|
||||
+#define TS_EVENT_PRESS 0x01
|
||||
+#define TS_EVENT_RELEASE 0x02
|
||||
+
|
||||
+struct finger_t {
|
||||
+ unsigned int status; /* ts event type */
|
||||
+ unsigned int x; /* ts data x */
|
||||
+ unsigned int y; /* ts data y */
|
||||
+} __packed;
|
||||
+
|
||||
+struct dwav_usb_mt {
|
||||
+ char name[128], phys[64];
|
||||
+
|
||||
+ int dev_id;
|
||||
+ /* for URB Data DMA */
|
||||
+ dma_addr_t data_dma;
|
||||
+ unsigned char *data;
|
||||
+ int data_size;
|
||||
+
|
||||
+ struct urb *irq;
|
||||
+ struct usb_interface *interface;
|
||||
+ struct input_dev *input;
|
||||
+
|
||||
+ struct finger_t *finger;
|
||||
+};
|
||||
+
|
||||
+static void dwav_usb_mt_report(struct dwav_usb_mt *dwav_usb_mt)
|
||||
+{
|
||||
+ int id, max_x, max_y, max_press, max_finger;
|
||||
+
|
||||
+ max_x = DEV_INFO[dwav_usb_mt->dev_id].max_x;
|
||||
+ max_y = DEV_INFO[dwav_usb_mt->dev_id].max_y;
|
||||
+ max_press = DEV_INFO[dwav_usb_mt->dev_id].max_press;
|
||||
+ max_finger = DEV_INFO[dwav_usb_mt->dev_id].max_finger;
|
||||
+
|
||||
+ for (id = 0; id < max_finger; id++) {
|
||||
+
|
||||
+ if (dwav_usb_mt->finger[id].status == TS_EVENT_UNKNOWN)
|
||||
+ continue;
|
||||
+
|
||||
+ if (dwav_usb_mt->finger[id].x >= max_x ||
|
||||
+ dwav_usb_mt->finger[id].y >= max_y)
|
||||
+ continue;
|
||||
+
|
||||
+ input_mt_slot(dwav_usb_mt->input, id);
|
||||
+
|
||||
+ if (dwav_usb_mt->finger[id].status != TS_EVENT_RELEASE) {
|
||||
+ input_mt_report_slot_state(dwav_usb_mt->input,
|
||||
+ MT_TOOL_FINGER, true);
|
||||
+ input_report_abs(dwav_usb_mt->input,
|
||||
+ ABS_MT_POSITION_X,
|
||||
+ dwav_usb_mt->finger[id].x);
|
||||
+ input_report_abs(dwav_usb_mt->input,
|
||||
+ ABS_MT_POSITION_Y,
|
||||
+ dwav_usb_mt->finger[id].y);
|
||||
+ input_report_abs(dwav_usb_mt->input,
|
||||
+ ABS_MT_PRESSURE,
|
||||
+ max_press);
|
||||
+ } else {
|
||||
+ input_mt_report_slot_state(dwav_usb_mt->input,
|
||||
+ MT_TOOL_FINGER, false);
|
||||
+ dwav_usb_mt->finger[id].status = TS_EVENT_UNKNOWN;
|
||||
+ }
|
||||
+ input_mt_report_pointer_emulation(dwav_usb_mt->input, true);
|
||||
+ input_sync(dwav_usb_mt->input);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+static void dwav_usb_mt_process(struct dwav_usb_mt *dwav_usb_mt,
|
||||
+ unsigned char *pkt, int len)
|
||||
+{
|
||||
+ struct dwav_raw *dwav_raw = (struct dwav_raw *)pkt;
|
||||
+ unsigned char bit_mask, cnt;
|
||||
+
|
||||
+ for (cnt = 0, bit_mask = 0x01;
|
||||
+ cnt < DEV_INFO[dwav_usb_mt->dev_id].max_finger;
|
||||
+ cnt++, bit_mask <<= 1) {
|
||||
+ if ((dwav_raw->ids & bit_mask) && dwav_raw->press) {
|
||||
+ dwav_usb_mt->finger[cnt].status = TS_EVENT_PRESS;
|
||||
+ switch (cnt) {
|
||||
+ case 0:
|
||||
+ dwav_usb_mt->finger[cnt].x
|
||||
+ = cpu_to_be16(dwav_raw->x1);
|
||||
+ dwav_usb_mt->finger[cnt].y
|
||||
+ = cpu_to_be16(dwav_raw->y1);
|
||||
+ break;
|
||||
+ case 1:
|
||||
+ dwav_usb_mt->finger[cnt].x
|
||||
+ = cpu_to_be16(dwav_raw->x2);
|
||||
+ dwav_usb_mt->finger[cnt].y
|
||||
+ = cpu_to_be16(dwav_raw->y2);
|
||||
+ break;
|
||||
+ case 2:
|
||||
+ dwav_usb_mt->finger[cnt].x
|
||||
+ = cpu_to_be16(dwav_raw->x3);
|
||||
+ dwav_usb_mt->finger[cnt].y
|
||||
+ = cpu_to_be16(dwav_raw->y3);
|
||||
+ break;
|
||||
+ case 3:
|
||||
+ dwav_usb_mt->finger[cnt].x
|
||||
+ = cpu_to_be16(dwav_raw->x4);
|
||||
+ dwav_usb_mt->finger[cnt].y
|
||||
+ = cpu_to_be16(dwav_raw->y4);
|
||||
+ break;
|
||||
+ case 4:
|
||||
+ dwav_usb_mt->finger[cnt].x
|
||||
+ = cpu_to_be16(dwav_raw->x5);
|
||||
+ dwav_usb_mt->finger[cnt].y
|
||||
+ = cpu_to_be16(dwav_raw->y5);
|
||||
+ break;
|
||||
+ default:
|
||||
+ break;
|
||||
+ }
|
||||
+ } else {
|
||||
+ if (dwav_usb_mt->finger[cnt].status == TS_EVENT_PRESS)
|
||||
+ dwav_usb_mt->finger[cnt].status
|
||||
+ = TS_EVENT_RELEASE;
|
||||
+ else
|
||||
+ dwav_usb_mt->finger[cnt].status
|
||||
+ = TS_EVENT_UNKNOWN;
|
||||
+ }
|
||||
+ }
|
||||
+ dwav_usb_mt_report(dwav_usb_mt);
|
||||
+}
|
||||
+
|
||||
+static void dwav_usb_mt_irq(struct urb *urb)
|
||||
+{
|
||||
+ struct dwav_usb_mt *dwav_usb_mt = urb->context;
|
||||
+ struct device *dev = &dwav_usb_mt->interface->dev;
|
||||
+ int retval;
|
||||
+
|
||||
+ switch (urb->status) {
|
||||
+ case 0:
|
||||
+ /* success */
|
||||
+ break;
|
||||
+ case -ETIME:
|
||||
+ /* this urb is timing out */
|
||||
+ dev_dbg(dev, "%s - urb timed out - was the device unplugged?\n",
|
||||
+ __func__);
|
||||
+ return;
|
||||
+ case -ECONNRESET:
|
||||
+ case -ENOENT:
|
||||
+ case -ESHUTDOWN:
|
||||
+ case -EPIPE:
|
||||
+ /* this urb is terminated, clean up */
|
||||
+ dev_dbg(dev, "%s - urb shutting down with status: %d\n",
|
||||
+ __func__, urb->status);
|
||||
+ return;
|
||||
+ default:
|
||||
+ dev_dbg(dev, "%s - nonzero urb status received: %d\n",
|
||||
+ __func__, urb->status);
|
||||
+ goto exit;
|
||||
+ }
|
||||
+
|
||||
+ dwav_usb_mt_process(dwav_usb_mt, dwav_usb_mt->data, urb->actual_length);
|
||||
+
|
||||
+exit:
|
||||
+ usb_mark_last_busy(interface_to_usbdev(dwav_usb_mt->interface));
|
||||
+ retval = usb_submit_urb(urb, GFP_ATOMIC);
|
||||
+ if (retval) {
|
||||
+ dev_err(dev, "%s - usb_submit_urb failed with result: %d\n",
|
||||
+ __func__, retval);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+static int dwav_usb_mt_open(struct input_dev *input)
|
||||
+{
|
||||
+ struct dwav_usb_mt *dwav_usb_mt = input_get_drvdata(input);
|
||||
+ int r;
|
||||
+
|
||||
+ dwav_usb_mt->irq->dev = interface_to_usbdev(dwav_usb_mt->interface);
|
||||
+
|
||||
+ r = usb_autopm_get_interface(dwav_usb_mt->interface) ? -EIO : 0;
|
||||
+ if (r < 0)
|
||||
+ goto out;
|
||||
+
|
||||
+ if (usb_submit_urb(dwav_usb_mt->irq, GFP_KERNEL)) {
|
||||
+ r = -EIO;
|
||||
+ goto out_put;
|
||||
+ }
|
||||
+
|
||||
+ dwav_usb_mt->interface->needs_remote_wakeup = 1;
|
||||
+out_put:
|
||||
+ usb_autopm_put_interface(dwav_usb_mt->interface);
|
||||
+out:
|
||||
+ return r;
|
||||
+}
|
||||
+
|
||||
+static void dwav_usb_mt_close(struct input_dev *input)
|
||||
+{
|
||||
+ struct dwav_usb_mt *dwav_usb_mt = input_get_drvdata(input);
|
||||
+ int r;
|
||||
+
|
||||
+ usb_kill_urb(dwav_usb_mt->irq);
|
||||
+
|
||||
+ r = usb_autopm_get_interface(dwav_usb_mt->interface);
|
||||
+
|
||||
+ dwav_usb_mt->interface->needs_remote_wakeup = 0;
|
||||
+ if (!r)
|
||||
+ usb_autopm_put_interface(dwav_usb_mt->interface);
|
||||
+}
|
||||
+
|
||||
+static int dwav_usb_mt_suspend(struct usb_interface *intf, pm_message_t message)
|
||||
+{
|
||||
+ struct dwav_usb_mt *dwav_usb_mt = usb_get_intfdata(intf);
|
||||
+
|
||||
+ usb_kill_urb(dwav_usb_mt->irq);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int dwav_usb_mt_resume(struct usb_interface *intf)
|
||||
+{
|
||||
+ struct dwav_usb_mt *dwav_usb_mt = usb_get_intfdata(intf);
|
||||
+ struct input_dev *input = dwav_usb_mt->input;
|
||||
+ int result = 0;
|
||||
+
|
||||
+ mutex_lock(&input->mutex);
|
||||
+ if (input->users)
|
||||
+ result = usb_submit_urb(dwav_usb_mt->irq, GFP_NOIO);
|
||||
+ mutex_unlock(&input->mutex);
|
||||
+
|
||||
+ return result;
|
||||
+}
|
||||
+
|
||||
+static int dwav_usb_mt_reset_resume(struct usb_interface *intf)
|
||||
+{
|
||||
+ struct dwav_usb_mt *dwav_usb_mt = usb_get_intfdata(intf);
|
||||
+ struct input_dev *input = dwav_usb_mt->input;
|
||||
+ int err = 0;
|
||||
+
|
||||
+ /* restart IO if needed */
|
||||
+ mutex_lock(&input->mutex);
|
||||
+ if (input->users)
|
||||
+ err = usb_submit_urb(dwav_usb_mt->irq, GFP_NOIO);
|
||||
+ mutex_unlock(&input->mutex);
|
||||
+
|
||||
+ return err;
|
||||
+}
|
||||
+
|
||||
+static void dwav_usb_mt_free_buffers(struct usb_device *udev,
|
||||
+ struct dwav_usb_mt *dwav_usb_mt)
|
||||
+{
|
||||
+ usb_free_coherent(udev, dwav_usb_mt->data_size,
|
||||
+ dwav_usb_mt->data, dwav_usb_mt->data_dma);
|
||||
+}
|
||||
+
|
||||
+static struct usb_endpoint_descriptor *dwav_usb_mt_get_input_endpoint(
|
||||
+ struct usb_host_interface *interface)
|
||||
+{
|
||||
+ int i;
|
||||
+
|
||||
+ for (i = 0; i < interface->desc.bNumEndpoints; i++) {
|
||||
+ if (usb_endpoint_dir_in(&interface->endpoint[i].desc))
|
||||
+ return &interface->endpoint[i].desc;
|
||||
+ }
|
||||
+
|
||||
+ return NULL;
|
||||
+}
|
||||
+
|
||||
+static int dwav_usb_mt_init(struct dwav_usb_mt *dwav_usb_mt, void *dev)
|
||||
+{
|
||||
+ int err;
|
||||
+ struct input_dev *input_dev = (struct input_dev *)dev;
|
||||
+
|
||||
+ input_dev->name = dwav_usb_mt->name;
|
||||
+ input_dev->phys = dwav_usb_mt->phys;
|
||||
+
|
||||
+ input_set_drvdata(input_dev, dwav_usb_mt);
|
||||
+
|
||||
+ input_dev->open = dwav_usb_mt_open;
|
||||
+ input_dev->close = dwav_usb_mt_close;
|
||||
+
|
||||
+ input_dev->id.bustype = BUS_USB;
|
||||
+
|
||||
+ /* single touch */
|
||||
+ input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS);
|
||||
+ input_dev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH);
|
||||
+
|
||||
+ input_set_abs_params(input_dev, ABS_X, 0,
|
||||
+ DEV_INFO[dwav_usb_mt->dev_id].max_x, 0, 0);
|
||||
+ input_set_abs_params(input_dev, ABS_Y, 0,
|
||||
+ DEV_INFO[dwav_usb_mt->dev_id].max_y, 0, 0);
|
||||
+
|
||||
+ /* multi touch */
|
||||
+ input_set_abs_params(input_dev, ABS_MT_POSITION_X, 0,
|
||||
+ DEV_INFO[dwav_usb_mt->dev_id].max_x, 0, 0);
|
||||
+ input_set_abs_params(input_dev, ABS_MT_POSITION_Y, 0,
|
||||
+ DEV_INFO[dwav_usb_mt->dev_id].max_y, 0, 0);
|
||||
+ input_mt_init_slots(input_dev,
|
||||
+ DEV_INFO[dwav_usb_mt->dev_id].max_finger, 0);
|
||||
+
|
||||
+ err = input_register_device(input_dev);
|
||||
+ if (err) {
|
||||
+ pr_err("%s - input_register_device failed, err: %d\n",
|
||||
+ __func__, err);
|
||||
+ return err;
|
||||
+ }
|
||||
+
|
||||
+ dwav_usb_mt->input = input_dev;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int dwav_usb_mt_probe(struct usb_interface *intf,
|
||||
+ const struct usb_device_id *id)
|
||||
+{
|
||||
+ struct dwav_usb_mt *dwav_usb_mt = NULL;
|
||||
+ struct input_dev *input_dev = NULL;
|
||||
+ struct usb_endpoint_descriptor *endpoint;
|
||||
+ struct usb_device *udev = interface_to_usbdev(intf);
|
||||
+
|
||||
+ int err = 0;
|
||||
+
|
||||
+ endpoint = dwav_usb_mt_get_input_endpoint(intf->cur_altsetting);
|
||||
+ if (!endpoint)
|
||||
+ return -ENXIO;
|
||||
+
|
||||
+ dwav_usb_mt = kzalloc(sizeof(struct dwav_usb_mt), GFP_KERNEL);
|
||||
+ if (!dwav_usb_mt)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ dwav_usb_mt->dev_id = id->driver_info;
|
||||
+
|
||||
+ dwav_usb_mt->finger = kzalloc(sizeof(struct finger_t) *
|
||||
+ DEV_INFO[dwav_usb_mt->dev_id].max_finger,
|
||||
+ GFP_KERNEL);
|
||||
+
|
||||
+ if (!dwav_usb_mt->finger)
|
||||
+ goto err_free_mem;
|
||||
+
|
||||
+ input_dev = input_allocate_device();
|
||||
+ if (!input_dev)
|
||||
+ goto err_free_mem;
|
||||
+
|
||||
+ dwav_usb_mt->data_size = sizeof(struct dwav_raw);
|
||||
+ dwav_usb_mt->data = usb_alloc_coherent(udev, dwav_usb_mt->data_size,
|
||||
+ GFP_KERNEL, &dwav_usb_mt->data_dma);
|
||||
+ if (!dwav_usb_mt->data)
|
||||
+ goto err_free_mem;
|
||||
+
|
||||
+ dwav_usb_mt->irq = usb_alloc_urb(0, GFP_KERNEL);
|
||||
+ if (!dwav_usb_mt->irq) {
|
||||
+ dev_dbg(&intf->dev,
|
||||
+ "%s - usb_alloc_urb failed: usbtouch->irq\n",
|
||||
+ __func__);
|
||||
+ goto err_free_buffers;
|
||||
+ }
|
||||
+
|
||||
+ if (usb_endpoint_type(endpoint) == USB_ENDPOINT_XFER_INT) {
|
||||
+ usb_fill_int_urb(dwav_usb_mt->irq, udev,
|
||||
+ usb_rcvintpipe(udev, endpoint->bEndpointAddress),
|
||||
+ dwav_usb_mt->data, dwav_usb_mt->data_size,
|
||||
+ dwav_usb_mt_irq, dwav_usb_mt, endpoint->bInterval);
|
||||
+ } else {
|
||||
+ usb_fill_bulk_urb(dwav_usb_mt->irq, udev,
|
||||
+ usb_rcvbulkpipe(udev, endpoint->bEndpointAddress),
|
||||
+ dwav_usb_mt->data, dwav_usb_mt->data_size,
|
||||
+ dwav_usb_mt_irq, dwav_usb_mt);
|
||||
+ }
|
||||
+
|
||||
+ dwav_usb_mt->irq->dev = udev;
|
||||
+ dwav_usb_mt->irq->transfer_dma = dwav_usb_mt->data_dma;
|
||||
+ dwav_usb_mt->irq->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
|
||||
+
|
||||
+ dwav_usb_mt->interface = intf;
|
||||
+
|
||||
+ if (udev->manufacturer)
|
||||
+ strlcpy(dwav_usb_mt->name,
|
||||
+ udev->manufacturer, sizeof(dwav_usb_mt->name));
|
||||
+
|
||||
+ if (udev->product) {
|
||||
+ if (udev->manufacturer)
|
||||
+ strlcat(dwav_usb_mt->name,
|
||||
+ " ", sizeof(dwav_usb_mt->name));
|
||||
+
|
||||
+ strlcat(dwav_usb_mt->name,
|
||||
+ udev->product, sizeof(dwav_usb_mt->name));
|
||||
+ }
|
||||
+
|
||||
+ if (!strlen(dwav_usb_mt->name)) {
|
||||
+ snprintf(dwav_usb_mt->name, sizeof(dwav_usb_mt->name),
|
||||
+ "D-WAV Scientific MultiTouch %04x:%04x",
|
||||
+ le16_to_cpu(udev->descriptor.idVendor),
|
||||
+ le16_to_cpu(udev->descriptor.idProduct));
|
||||
+ }
|
||||
+
|
||||
+ usb_make_path(udev, dwav_usb_mt->phys, sizeof(dwav_usb_mt->phys));
|
||||
+ strlcat(dwav_usb_mt->phys, "/input0", sizeof(dwav_usb_mt->phys));
|
||||
+
|
||||
+ usb_to_input_id(udev, &input_dev->id);
|
||||
+
|
||||
+ input_dev->dev.parent = &intf->dev;
|
||||
+
|
||||
+ err = dwav_usb_mt_init(dwav_usb_mt, (void *)input_dev);
|
||||
+ if (err)
|
||||
+ goto err_free_urb;
|
||||
+
|
||||
+ usb_set_intfdata(intf, dwav_usb_mt);
|
||||
+
|
||||
+ dev_info(&intf->dev, "%s\n", DEV_INFO[dwav_usb_mt->dev_id].name);
|
||||
+
|
||||
+ return 0;
|
||||
+
|
||||
+err_free_urb:
|
||||
+ usb_free_urb(dwav_usb_mt->irq);
|
||||
+
|
||||
+err_free_buffers:
|
||||
+ dwav_usb_mt_free_buffers(udev, dwav_usb_mt);
|
||||
+
|
||||
+err_free_mem:
|
||||
+ if (input_dev)
|
||||
+ input_free_device(input_dev);
|
||||
+ kfree(dwav_usb_mt);
|
||||
+
|
||||
+ return err;
|
||||
+}
|
||||
+
|
||||
+static void dwav_usb_mt_disconnect(struct usb_interface *intf)
|
||||
+{
|
||||
+ struct dwav_usb_mt *dwav_usb_mt = usb_get_intfdata(intf);
|
||||
+
|
||||
+ if (!dwav_usb_mt)
|
||||
+ return;
|
||||
+
|
||||
+ dev_dbg(&intf->dev,
|
||||
+ "%s - dwav_usb_mt is initialized, cleaning up\n",
|
||||
+ __func__);
|
||||
+
|
||||
+ usb_set_intfdata(intf, NULL);
|
||||
+
|
||||
+ /* this will stop IO via close */
|
||||
+ input_unregister_device(dwav_usb_mt->input);
|
||||
+
|
||||
+ usb_free_urb(dwav_usb_mt->irq);
|
||||
+
|
||||
+ dwav_usb_mt_free_buffers(interface_to_usbdev(intf), dwav_usb_mt);
|
||||
+
|
||||
+ kfree(dwav_usb_mt);
|
||||
+}
|
||||
+
|
||||
+MODULE_DEVICE_TABLE(usb, dwav_usb_mt_devices);
|
||||
+
|
||||
+static struct usb_driver dwav_usb_mt_driver = {
|
||||
+ .name = "dwav_usb_mt",
|
||||
+ .probe = dwav_usb_mt_probe,
|
||||
+ .disconnect = dwav_usb_mt_disconnect,
|
||||
+ .suspend = dwav_usb_mt_suspend,
|
||||
+ .resume = dwav_usb_mt_resume,
|
||||
+ .reset_resume = dwav_usb_mt_reset_resume,
|
||||
+ .id_table = dwav_usb_mt_devices,
|
||||
+ .supports_autosuspend = 1,
|
||||
+};
|
||||
+
|
||||
+module_usb_driver(dwav_usb_mt_driver);
|
||||
+
|
||||
+MODULE_AUTHOR("Hardkernel Co.,Ltd");
|
||||
+MODULE_DESCRIPTION("D-WAV USB(HID) MultiTouch Driver");
|
||||
+MODULE_LICENSE("GPL");
|
||||
+
|
||||
+MODULE_ALIAS("dwav_usb_mt");
|
||||
\ No newline at end of file
|
||||
--
|
||||
Armbian
|
||||
|
||||
@@ -1,30 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Igor Pecovnik <igorpecovnik@users.noreply.github.com>
|
||||
Date: Tue, 19 Nov 2019 23:25:39 +0100
|
||||
Subject: hack builddeb for meson64
|
||||
|
||||
Unknown patch. Archeology:
|
||||
- ff4c1488dab1e07d35923b6f8e33c992d9ca439f: Igor Pecovnik <igorpecovnik@users.noreply.github.com>: 'Move to 5.4.y (#1686)'
|
||||
---
|
||||
scripts/package/builddeb | 5 +++++
|
||||
1 file changed, 5 insertions(+)
|
||||
|
||||
diff --git a/scripts/package/builddeb b/scripts/package/builddeb
|
||||
index 67cd420dcf89..e445d84b6cbc 100755
|
||||
--- a/scripts/package/builddeb
|
||||
+++ b/scripts/package/builddeb
|
||||
@@ -218,6 +218,11 @@ if [ "$ARCH" != "um" ]; then
|
||||
create_package linux-libc-dev debian/linux-libc-dev
|
||||
fi
|
||||
|
||||
+sed -e "s/exit 0//g" -i $tmpdir/DEBIAN/postinst
|
||||
+cat >> $tmpdir/DEBIAN/postinst <<EOT
|
||||
+mkimage -A arm64 -O linux -T kernel -C none -a 0x1080000 -e 0x1080000 -n "Linux" -d /$installed_image_path /boot/uImage > /dev/null 2>&1
|
||||
+exit 0
|
||||
+EOT
|
||||
create_package "$packagename" "$tmpdir"
|
||||
|
||||
if [ -n "$BUILD_DEBUG" ] ; then
|
||||
--
|
||||
Armbian
|
||||
|
||||
@@ -1,40 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Christian Hewitt <christianshewitt@gmail.com>
|
||||
Date: Tue, 7 Jan 2020 07:12:47 +0000
|
||||
Subject: HACK: media: cec: silence CEC timeout message
|
||||
|
||||
If testing with an AVR that does not pass-through CEC state the system
|
||||
log fills with timeout messages. Silence this to stop the log rotation
|
||||
and ensure other issues are visible.
|
||||
|
||||
[ 42.718009] cec-meson_ao_cec: message ff 84 50 00 01 timed out
|
||||
[ 45.021994] cec-meson_ao_cec: message ff 87 00 15 82 timed out
|
||||
[ 47.325965] cec-meson_ao_cec: message 10 timed out
|
||||
[ 49.630023] cec-meson_ao_cec: message 10 timed out
|
||||
[ 51.933960] cec-meson_ao_cec: message 10 timed out
|
||||
|
||||
Signed-off-by: Christian Hewitt <christianshewitt@gmail.com>
|
||||
---
|
||||
drivers/media/cec/core/cec-adap.c | 6 +++---
|
||||
1 file changed, 3 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/drivers/media/cec/core/cec-adap.c b/drivers/media/cec/core/cec-adap.c
|
||||
index 41a79293ee02..777ed629aeb2 100644
|
||||
--- a/drivers/media/cec/core/cec-adap.c
|
||||
+++ b/drivers/media/cec/core/cec-adap.c
|
||||
@@ -501,9 +501,9 @@ int cec_thread_func(void *_adap)
|
||||
* default).
|
||||
*/
|
||||
if (adap->transmitting) {
|
||||
- pr_warn("cec-%s: message %*ph timed out\n", adap->name,
|
||||
- adap->transmitting->msg.len,
|
||||
- adap->transmitting->msg.msg);
|
||||
+ //pr_warn("cec-%s: message %*ph timed out\n", adap->name,
|
||||
+ // adap->transmitting->msg.len,
|
||||
+ // adap->transmitting->msg.msg);
|
||||
/* Just give up on this. */
|
||||
cec_data_cancel(adap->transmitting,
|
||||
CEC_TX_STATUS_TIMEOUT, 0);
|
||||
--
|
||||
Armbian
|
||||
|
||||
@@ -1,38 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Stefan Agner <stefan@agner.ch>
|
||||
Date: Wed, 15 Sep 2021 05:00:45 +0000
|
||||
Subject: HACK: of: partial revert of fdt.c changes
|
||||
|
||||
This resolves reports similar to the below which are present in dmesg
|
||||
since Linux 5.10; which are also causing crashes in some distros:
|
||||
|
||||
[ 0.000000] OF: fdt: Reserved memory: failed to reserve memory for node 'secmon@5000000': base 0x0000000005000000, size 3 MiB
|
||||
|
||||
Signed-off-by: Christian Hewitt <christianshewitt@gmail.com>
|
||||
---
|
||||
drivers/of/fdt.c | 9 ---------
|
||||
1 file changed, 9 deletions(-)
|
||||
|
||||
diff --git a/drivers/of/fdt.c b/drivers/of/fdt.c
|
||||
index 1c573e7a60bc..f9188a76500d 100644
|
||||
--- a/drivers/of/fdt.c
|
||||
+++ b/drivers/of/fdt.c
|
||||
@@ -481,15 +481,6 @@ static int __init early_init_dt_reserve_memory(phys_addr_t base,
|
||||
phys_addr_t size, bool nomap)
|
||||
{
|
||||
if (nomap) {
|
||||
- /*
|
||||
- * If the memory is already reserved (by another region), we
|
||||
- * should not allow it to be marked nomap, but don't worry
|
||||
- * if the region isn't memory as it won't be mapped.
|
||||
- */
|
||||
- if (memblock_overlaps_region(&memblock.memory, base, size) &&
|
||||
- memblock_is_region_reserved(base, size))
|
||||
- return -EBUSY;
|
||||
-
|
||||
return memblock_mark_nomap(base, size);
|
||||
}
|
||||
return memblock_reserve(base, size);
|
||||
--
|
||||
Armbian
|
||||
|
||||
@@ -1,232 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
|
||||
Date: Sun, 3 Oct 2021 05:35:48 +0000
|
||||
Subject: ASoC: meson: aiu: Fix HDMI codec control selection
|
||||
|
||||
The HDMI controllers on Amlogic Meson SoCs which use the AIU
|
||||
audio-controller have two different audio format inputs:
|
||||
- I2S which is also the only configuration supported on GXBB, GXL and
|
||||
GXM SoCs since there's no SPDIF support in the DesignWare HDMI
|
||||
controller driver (at the time of writing this)
|
||||
- SPDIF can be used optionally, including pass-through formats
|
||||
|
||||
Switching between these requires us to set different registers:
|
||||
AIU_HDMI_CLK_DATA_CTRL[1:0] "HDMI_DATA_CLK_SEL":
|
||||
- 0x0 disables the HDMI output clock
|
||||
- 0x1 selects the PCM clock
|
||||
- 0x2 selects the AIU clock
|
||||
- 0x3 is reserved
|
||||
|
||||
AIU_HDMI_CLK_DATA_CTRL[5:4] "HDMI_DATA_SEL":
|
||||
- 0x0 outputs constant zero, disables HDMI data
|
||||
- 0x1 selects PCM data
|
||||
- 0x2 selects AIU I2S data
|
||||
- 0x3 is reserved
|
||||
|
||||
AIU_CLK_CTRL_MORE[6] "HDMITX_SEL_AOCLKX2":
|
||||
- 0x0 selects cts_i958 as AIU clk to hdmi_tx_audio_master_clk
|
||||
- 0x1 selects cts_aoclkx2_int as AIU clk to hdmi_tx_audio_master_clk
|
||||
|
||||
The Meson8/8b/8m2 vendor driver uses the following settings:
|
||||
SPDIF output to the HDMI controller:
|
||||
- 0x2 (AIU clock) in AIU_HDMI_CLK_DATA_CTRL[1:0]
|
||||
- 0x0 (no HDMI data) in AIU_HDMI_CLK_DATA_CTRL[5:4]
|
||||
- 0x0 (using cts_i958 as AIU clk) in AIU_CLK_CTRL_MORE[6]
|
||||
I2S output to the HDMI controller:
|
||||
- 0x2 (AIU clock) in AIU_HDMI_CLK_DATA_CTRL[1:0]
|
||||
- 0x2 (I2S data) in AIU_HDMI_CLK_DATA_CTRL[5:4]
|
||||
- 0x0 (using cts_aoclkx2_int as AIU clk) in AIU_CLK_CTRL_MORE[6]
|
||||
|
||||
The GXBB/GXL/GXM vendor driver uses the following settings:
|
||||
SPDIF output to the HDMI controller:
|
||||
- not setting AIU_HDMI_CLK_DATA_CTRL at all
|
||||
- 0x0 (using cts_i958 as AIU clk) in AIU_CLK_CTRL_MORE[6]
|
||||
I2S output to the HDMI controller:
|
||||
- 0x2 (AIU clock) in AIU_HDMI_CLK_DATA_CTRL[1:0]
|
||||
- 0x2 (I2S data) in AIU_HDMI_CLK_DATA_CTRL[5:4]
|
||||
- 0x0 (using cts_aoclkx2_int as AIU clk) in AIU_CLK_CTRL_MORE[6]
|
||||
|
||||
Set the three registers at the same time following what the vendor
|
||||
driver does on Meson8/8b/8m2 SoCs. This makes the SPDIF output to the
|
||||
HDMI controller work. The entries and order of the entries in the enum
|
||||
is not changed on purpose to not break old configurations.
|
||||
|
||||
Fixes: b82b734c0e9a7 ("ASoC: meson: aiu: add hdmi codec control support")
|
||||
Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
|
||||
---
|
||||
sound/soc/meson/aiu-codec-ctrl.c | 108 +++++++---
|
||||
sound/soc/meson/aiu-encoder-i2s.c | 6 -
|
||||
2 files changed, 80 insertions(+), 34 deletions(-)
|
||||
|
||||
diff --git a/sound/soc/meson/aiu-codec-ctrl.c b/sound/soc/meson/aiu-codec-ctrl.c
|
||||
index 84c10956c241..c1aa13f4d65b 100644
|
||||
--- a/sound/soc/meson/aiu-codec-ctrl.c
|
||||
+++ b/sound/soc/meson/aiu-codec-ctrl.c
|
||||
@@ -12,14 +12,60 @@
|
||||
#include "aiu.h"
|
||||
#include "meson-codec-glue.h"
|
||||
|
||||
-#define CTRL_CLK_SEL GENMASK(1, 0)
|
||||
-#define CTRL_DATA_SEL_SHIFT 4
|
||||
-#define CTRL_DATA_SEL (0x3 << CTRL_DATA_SEL_SHIFT)
|
||||
-
|
||||
-static const char * const aiu_codec_ctrl_mux_texts[] = {
|
||||
- "DISABLED", "PCM", "I2S",
|
||||
+#define AIU_HDMI_CLK_DATA_CTRL_CLK_SEL GENMASK(1, 0)
|
||||
+#define AIU_HDMI_CLK_DATA_CTRL_CLK_SEL_DISABLE 0x0
|
||||
+#define AIU_HDMI_CLK_DATA_CTRL_CLK_SEL_PCM 0x1
|
||||
+#define AIU_HDMI_CLK_DATA_CTRL_CLK_SEL_AIU 0x2
|
||||
+#define AIU_HDMI_CLK_DATA_CTRL_DATA_SEL GENMASK(5, 4)
|
||||
+#define AIU_HDMI_CLK_DATA_CTRL_DATA_SEL_OUTPUT_ZERO 0x0
|
||||
+#define AIU_HDMI_CLK_DATA_CTRL_DATA_SEL_PCM_DATA 0x1
|
||||
+#define AIU_HDMI_CLK_DATA_CTRL_DATA_SEL_I2S_DATA 0x2
|
||||
+
|
||||
+#define AIU_CLK_CTRL_MORE_AMCLK BIT(6)
|
||||
+
|
||||
+#define AIU_HDMI_CTRL_MUX_DISABLED 0
|
||||
+#define AIU_HDMI_CTRL_MUX_PCM 1
|
||||
+#define AIU_HDMI_CTRL_MUX_I2S 2
|
||||
+
|
||||
+static const char * const aiu_codec_hdmi_ctrl_mux_texts[] = {
|
||||
+ [AIU_HDMI_CTRL_MUX_DISABLED] = "DISABLED",
|
||||
+ [AIU_HDMI_CTRL_MUX_PCM] = "PCM",
|
||||
+ [AIU_HDMI_CTRL_MUX_I2S] = "I2S",
|
||||
};
|
||||
|
||||
+static int aiu_codec_ctrl_mux_get_enum(struct snd_kcontrol *kcontrol,
|
||||
+ struct snd_ctl_elem_value *ucontrol)
|
||||
+{
|
||||
+ struct snd_soc_component *component =
|
||||
+ snd_soc_dapm_kcontrol_component(kcontrol);
|
||||
+ unsigned int ctrl, more, mux = AIU_HDMI_CTRL_MUX_DISABLED;
|
||||
+
|
||||
+ ctrl = snd_soc_component_read(component, AIU_HDMI_CLK_DATA_CTRL);
|
||||
+ if (FIELD_GET(AIU_HDMI_CLK_DATA_CTRL_CLK_SEL, ctrl) !=
|
||||
+ AIU_HDMI_CLK_DATA_CTRL_CLK_SEL_AIU) {
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ more = snd_soc_component_read(component, AIU_CLK_CTRL_MORE);
|
||||
+ if (FIELD_GET(AIU_HDMI_CLK_DATA_CTRL_DATA_SEL, ctrl) ==
|
||||
+ AIU_HDMI_CLK_DATA_CTRL_DATA_SEL_I2S_DATA &&
|
||||
+ !!(more & AIU_CLK_CTRL_MORE_AMCLK)) {
|
||||
+ mux = AIU_HDMI_CTRL_MUX_I2S;
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ if (FIELD_GET(AIU_HDMI_CLK_DATA_CTRL_DATA_SEL, ctrl) ==
|
||||
+ AIU_HDMI_CLK_DATA_CTRL_DATA_SEL_OUTPUT_ZERO &&
|
||||
+ !(more & AIU_CLK_CTRL_MORE_AMCLK)) {
|
||||
+ mux = AIU_HDMI_CTRL_MUX_PCM;
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+out:
|
||||
+ ucontrol->value.enumerated.item[0] = mux;
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
static int aiu_codec_ctrl_mux_put_enum(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *ucontrol)
|
||||
{
|
||||
@@ -28,45 +74,51 @@ static int aiu_codec_ctrl_mux_put_enum(struct snd_kcontrol *kcontrol,
|
||||
struct snd_soc_dapm_context *dapm =
|
||||
snd_soc_dapm_kcontrol_dapm(kcontrol);
|
||||
struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
|
||||
- unsigned int mux, changed;
|
||||
+ unsigned int mux, ctrl, more;
|
||||
|
||||
mux = snd_soc_enum_item_to_val(e, ucontrol->value.enumerated.item[0]);
|
||||
- changed = snd_soc_component_test_bits(component, e->reg,
|
||||
- CTRL_DATA_SEL,
|
||||
- FIELD_PREP(CTRL_DATA_SEL, mux));
|
||||
|
||||
- if (!changed)
|
||||
- return 0;
|
||||
+ if (mux == AIU_HDMI_CTRL_MUX_I2S) {
|
||||
+ ctrl = FIELD_PREP(AIU_HDMI_CLK_DATA_CTRL_DATA_SEL,
|
||||
+ AIU_HDMI_CLK_DATA_CTRL_DATA_SEL_I2S_DATA);
|
||||
+ more = AIU_CLK_CTRL_MORE_AMCLK;
|
||||
+ } else {
|
||||
+ ctrl = FIELD_PREP(AIU_HDMI_CLK_DATA_CTRL_DATA_SEL,
|
||||
+ AIU_HDMI_CLK_DATA_CTRL_DATA_SEL_OUTPUT_ZERO);
|
||||
+ more = 0;
|
||||
+ }
|
||||
+
|
||||
+ if (mux == AIU_HDMI_CTRL_MUX_DISABLED) {
|
||||
+ ctrl |= FIELD_PREP(AIU_HDMI_CLK_DATA_CTRL_CLK_SEL,
|
||||
+ AIU_HDMI_CLK_DATA_CTRL_CLK_SEL_DISABLE);
|
||||
+ } else {
|
||||
+ ctrl |= FIELD_PREP(AIU_HDMI_CLK_DATA_CTRL_CLK_SEL,
|
||||
+ AIU_HDMI_CLK_DATA_CTRL_CLK_SEL_AIU);
|
||||
+ }
|
||||
|
||||
/* Force disconnect of the mux while updating */
|
||||
snd_soc_dapm_mux_update_power(dapm, kcontrol, 0, NULL, NULL);
|
||||
|
||||
- /* Reset the source first */
|
||||
- snd_soc_component_update_bits(component, e->reg,
|
||||
- CTRL_CLK_SEL |
|
||||
- CTRL_DATA_SEL,
|
||||
- FIELD_PREP(CTRL_CLK_SEL, 0) |
|
||||
- FIELD_PREP(CTRL_DATA_SEL, 0));
|
||||
+ snd_soc_component_update_bits(component, AIU_HDMI_CLK_DATA_CTRL,
|
||||
+ AIU_HDMI_CLK_DATA_CTRL_CLK_SEL |
|
||||
+ AIU_HDMI_CLK_DATA_CTRL_DATA_SEL,
|
||||
+ ctrl);
|
||||
|
||||
- /* Set the appropriate source */
|
||||
- snd_soc_component_update_bits(component, e->reg,
|
||||
- CTRL_CLK_SEL |
|
||||
- CTRL_DATA_SEL,
|
||||
- FIELD_PREP(CTRL_CLK_SEL, mux) |
|
||||
- FIELD_PREP(CTRL_DATA_SEL, mux));
|
||||
+ snd_soc_component_update_bits(component, AIU_CLK_CTRL_MORE,
|
||||
+ AIU_CLK_CTRL_MORE_AMCLK,
|
||||
+ more);
|
||||
|
||||
snd_soc_dapm_mux_update_power(dapm, kcontrol, mux, e, NULL);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
-static SOC_ENUM_SINGLE_DECL(aiu_hdmi_ctrl_mux_enum, AIU_HDMI_CLK_DATA_CTRL,
|
||||
- CTRL_DATA_SEL_SHIFT,
|
||||
- aiu_codec_ctrl_mux_texts);
|
||||
+static SOC_ENUM_SINGLE_VIRT_DECL(aiu_hdmi_ctrl_mux_enum,
|
||||
+ aiu_codec_hdmi_ctrl_mux_texts);
|
||||
|
||||
static const struct snd_kcontrol_new aiu_hdmi_ctrl_mux =
|
||||
SOC_DAPM_ENUM_EXT("HDMI Source", aiu_hdmi_ctrl_mux_enum,
|
||||
- snd_soc_dapm_get_enum_double,
|
||||
+ aiu_codec_ctrl_mux_get_enum,
|
||||
aiu_codec_ctrl_mux_put_enum);
|
||||
|
||||
static const struct snd_soc_dapm_widget aiu_hdmi_ctrl_widgets[] = {
|
||||
diff --git a/sound/soc/meson/aiu-encoder-i2s.c b/sound/soc/meson/aiu-encoder-i2s.c
|
||||
index a0dd914c8ed1..21916034a46d 100644
|
||||
--- a/sound/soc/meson/aiu-encoder-i2s.c
|
||||
+++ b/sound/soc/meson/aiu-encoder-i2s.c
|
||||
@@ -23,7 +23,6 @@
|
||||
#define AIU_CLK_CTRL_AOCLK_INVERT BIT(6)
|
||||
#define AIU_CLK_CTRL_LRCLK_INVERT BIT(7)
|
||||
#define AIU_CLK_CTRL_LRCLK_SKEW GENMASK(9, 8)
|
||||
-#define AIU_CLK_CTRL_MORE_HDMI_AMCLK BIT(6)
|
||||
#define AIU_CLK_CTRL_MORE_I2S_DIV GENMASK(5, 0)
|
||||
#define AIU_CODEC_DAC_LRCLK_CTRL_DIV GENMASK(11, 0)
|
||||
|
||||
@@ -176,11 +175,6 @@ static int aiu_encoder_i2s_set_clocks(struct snd_soc_component *component,
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
- /* Make sure amclk is used for HDMI i2s as well */
|
||||
- snd_soc_component_update_bits(component, AIU_CLK_CTRL_MORE,
|
||||
- AIU_CLK_CTRL_MORE_HDMI_AMCLK,
|
||||
- AIU_CLK_CTRL_MORE_HDMI_AMCLK);
|
||||
-
|
||||
return 0;
|
||||
}
|
||||
|
||||
--
|
||||
Armbian
|
||||
|
||||
@@ -1,35 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Sergey Shtylyov <s.shtylyov@omp.ru>
|
||||
Date: Fri, 24 Dec 2021 06:09:57 +0000
|
||||
Subject: mmc: meson-gx: fix deferred probing
|
||||
|
||||
The driver overrides the error codes and IRQ0 returned by platform_get_irq()
|
||||
to -EINVAL, so if it returns -EPROBE_DEFER, the driver will fail the probe
|
||||
permanently instead of the deferred probing. Switch to propagating the error
|
||||
codes upstream. IRQ0 is no longer returned by platform_get_irq(), so we now
|
||||
can safely ignore it...
|
||||
|
||||
Fixes: cbcaac6d7dd2 ("mmc: meson-gx-mmc: Fix platform_get_irq's error checking")
|
||||
Signed-off-by: Sergey Shtylyov <s.shtylyov@omp.ru>
|
||||
---
|
||||
drivers/mmc/host/meson-gx-mmc.c | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/drivers/mmc/host/meson-gx-mmc.c b/drivers/mmc/host/meson-gx-mmc.c
|
||||
index fc462995cf94..a2aacbffc3bf 100644
|
||||
--- a/drivers/mmc/host/meson-gx-mmc.c
|
||||
+++ b/drivers/mmc/host/meson-gx-mmc.c
|
||||
@@ -1185,8 +1185,8 @@ static int meson_mmc_probe(struct platform_device *pdev)
|
||||
}
|
||||
|
||||
host->irq = platform_get_irq(pdev, 0);
|
||||
- if (host->irq <= 0) {
|
||||
- ret = -EINVAL;
|
||||
+ if (host->irq < 0) {
|
||||
+ ret = host->irq;
|
||||
goto free_host;
|
||||
}
|
||||
|
||||
--
|
||||
Armbian
|
||||
|
||||
@@ -1,59 +0,0 @@
|
||||
From 5c5664545a97520bbce591add5a7dbbea143b999 Mon Sep 17 00:00:00 2001
|
||||
From: Neil Armstrong <narmstrong@baylibre.com>
|
||||
Date: Thu, 14 Jan 2021 17:43:02 +0100
|
||||
Subject: [PATCH 54/90] WIP: mmc: meson-gx-mmc: set core clock phase to 270
|
||||
degrees for AXG compatible controllers
|
||||
|
||||
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
|
||||
---
|
||||
drivers/mmc/host/meson-gx-mmc.c | 6 +++++-
|
||||
1 file changed, 5 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/mmc/host/meson-gx-mmc.c b/drivers/mmc/host/meson-gx-mmc.c
|
||||
index 1a11a4bf4d4f..df60312a1765 100644
|
||||
--- a/drivers/mmc/host/meson-gx-mmc.c
|
||||
+++ b/drivers/mmc/host/meson-gx-mmc.c
|
||||
@@ -38,6 +38,7 @@
|
||||
#define CLK_RX_PHASE_MASK GENMASK(13, 12)
|
||||
#define CLK_PHASE_0 0
|
||||
#define CLK_PHASE_180 2
|
||||
+#define CLK_PHASE_270 3
|
||||
#define CLK_V2_TX_DELAY_MASK GENMASK(19, 16)
|
||||
#define CLK_V2_RX_DELAY_MASK GENMASK(23, 20)
|
||||
#define CLK_V2_ALWAYS_ON BIT(24)
|
||||
@@ -136,6 +137,7 @@ struct meson_mmc_data {
|
||||
unsigned int rx_delay_mask;
|
||||
unsigned int always_on;
|
||||
unsigned int adjust;
|
||||
+ unsigned int clk_core_phase;
|
||||
};
|
||||
|
||||
struct sd_emmc_desc {
|
||||
@@ -428,7 +430,7 @@ static int meson_mmc_clk_init(struct meson_host *host)
|
||||
/* init SD_EMMC_CLOCK to sane defaults w/min clock rate */
|
||||
clk_reg = CLK_ALWAYS_ON(host);
|
||||
clk_reg |= CLK_DIV_MASK;
|
||||
- clk_reg |= FIELD_PREP(CLK_CORE_PHASE_MASK, CLK_PHASE_180);
|
||||
+ clk_reg |= FIELD_PREP(CLK_CORE_PHASE_MASK, host->data->clk_core_phase);
|
||||
clk_reg |= FIELD_PREP(CLK_TX_PHASE_MASK, CLK_PHASE_0);
|
||||
clk_reg |= FIELD_PREP(CLK_RX_PHASE_MASK, CLK_PHASE_0);
|
||||
writel(clk_reg, host->regs + SD_EMMC_CLOCK);
|
||||
@@ -1337,6 +1339,7 @@ static const struct meson_mmc_data meson_gx_data = {
|
||||
.rx_delay_mask = CLK_V2_RX_DELAY_MASK,
|
||||
.always_on = CLK_V2_ALWAYS_ON,
|
||||
.adjust = SD_EMMC_ADJUST,
|
||||
+ .clk_core_phase = CLK_PHASE_180,
|
||||
};
|
||||
|
||||
static const struct meson_mmc_data meson_axg_data = {
|
||||
@@ -1344,6 +1347,7 @@ static const struct meson_mmc_data meson_axg_data = {
|
||||
.rx_delay_mask = CLK_V3_RX_DELAY_MASK,
|
||||
.always_on = CLK_V3_ALWAYS_ON,
|
||||
.adjust = SD_EMMC_V3_ADJUST,
|
||||
+ .clk_core_phase = CLK_PHASE_270,
|
||||
};
|
||||
|
||||
static const struct of_device_id meson_mmc_of_match[] = {
|
||||
--
|
||||
2.35.1
|
||||
|
||||
@@ -1,108 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Vyacheslav Bocharov <adeep@lexina.in>
|
||||
Date: Mon, 7 Nov 2022 16:19:08 +0300
|
||||
Subject: arm64: amlogic: mmc: meson-gx: Add core, tx, rx eMMC/SD/SDIO phase
|
||||
clock settings from devicetree data
|
||||
|
||||
The mmc driver has the same phase values for all meson platforms. However,
|
||||
some platforms (and even some boards) require different values. This patch
|
||||
transfers the values from the set in the code to the variables in the
|
||||
device-tree file.
|
||||
|
||||
Signed-off-by: Vyacheslav Bocharov <adeep@lexina.in>
|
||||
---
|
||||
drivers/mmc/host/meson-gx-mmc.c | 19 +++--
|
||||
include/dt-bindings/mmc/meson-gx-mmc.h | 35 ++++++++++
|
||||
2 files changed, 48 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/drivers/mmc/host/meson-gx-mmc.c b/drivers/mmc/host/meson-gx-mmc.c
|
||||
index a2aacbffc3bf..cce759ed9e15 100644
|
||||
--- a/drivers/mmc/host/meson-gx-mmc.c
|
||||
+++ b/drivers/mmc/host/meson-gx-mmc.c
|
||||
@@ -27,6 +27,7 @@
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/bitfield.h>
|
||||
#include <linux/pinctrl/consumer.h>
|
||||
+#include <dt-bindings/mmc/meson-gx-mmc.h>
|
||||
|
||||
#define DRIVER_NAME "meson-gx-mmc"
|
||||
|
||||
@@ -36,8 +37,6 @@
|
||||
#define CLK_CORE_PHASE_MASK GENMASK(9, 8)
|
||||
#define CLK_TX_PHASE_MASK GENMASK(11, 10)
|
||||
#define CLK_RX_PHASE_MASK GENMASK(13, 12)
|
||||
-#define CLK_PHASE_0 0
|
||||
-#define CLK_PHASE_180 2
|
||||
#define CLK_V2_TX_DELAY_MASK GENMASK(19, 16)
|
||||
#define CLK_V2_RX_DELAY_MASK GENMASK(23, 20)
|
||||
#define CLK_V2_ALWAYS_ON BIT(24)
|
||||
@@ -424,13 +423,21 @@ static int meson_mmc_clk_init(struct meson_host *host)
|
||||
const char *mux_parent_names[MUX_CLK_NUM_PARENTS];
|
||||
const char *clk_parent[1];
|
||||
u32 clk_reg;
|
||||
-
|
||||
+ u32 phase[3]; // <core_phase, tx_phase, rx_phase>
|
||||
+
|
||||
+ if (!(host->dev && host->dev->of_node) || (device_property_read_u32_array(host->dev,
|
||||
+ "amlogic,mmc-phase", phase, 3) < 0)) {
|
||||
+ dev_dbg(host->dev, "get amlogic,mmc-phase failed, use default phase settings\n");
|
||||
+ phase[0] = CLK_PHASE_180;
|
||||
+ phase[1] = CLK_PHASE_0;
|
||||
+ phase[2] = CLK_PHASE_0;
|
||||
+ }
|
||||
/* init SD_EMMC_CLOCK to sane defaults w/min clock rate */
|
||||
clk_reg = CLK_ALWAYS_ON(host);
|
||||
clk_reg |= CLK_DIV_MASK;
|
||||
- clk_reg |= FIELD_PREP(CLK_CORE_PHASE_MASK, CLK_PHASE_180);
|
||||
- clk_reg |= FIELD_PREP(CLK_TX_PHASE_MASK, CLK_PHASE_0);
|
||||
- clk_reg |= FIELD_PREP(CLK_RX_PHASE_MASK, CLK_PHASE_0);
|
||||
+ clk_reg |= FIELD_PREP(CLK_CORE_PHASE_MASK, phase[0]);
|
||||
+ clk_reg |= FIELD_PREP(CLK_TX_PHASE_MASK, phase[1]);
|
||||
+ clk_reg |= FIELD_PREP(CLK_RX_PHASE_MASK, phase[2]);
|
||||
writel(clk_reg, host->regs + SD_EMMC_CLOCK);
|
||||
|
||||
/* get the mux parents */
|
||||
diff --git a/include/dt-bindings/mmc/meson-gx-mmc.h b/include/dt-bindings/mmc/meson-gx-mmc.h
|
||||
new file mode 100644
|
||||
index 000000000000..cfc4a9d75b2b
|
||||
--- /dev/null
|
||||
+++ b/include/dt-bindings/mmc/meson-gx-mmc.h
|
||||
@@ -0,0 +1,35 @@
|
||||
+/* SPDX-License-Identifier: (GPL-2.0+ or MIT) */
|
||||
+/*
|
||||
+ * Copyright (c) 2022 Vyacheslav Bocharov
|
||||
+ * Author: Vyacheslav Bocharov <adeep@lexina.in>
|
||||
+ */
|
||||
+
|
||||
+#ifndef _DT_BINDINGS_MESON_GX_MMC_H
|
||||
+#define _DT_BINDINGS_MESON_GX_MMC_H
|
||||
+
|
||||
+/*
|
||||
+ * Cfg_rx_phase: RX clock phase
|
||||
+ * bits: 9:8 R/W
|
||||
+ * default: 0
|
||||
+ * Recommended value: 0
|
||||
+ *
|
||||
+ * Cfg_tx_phase: TX clock phase
|
||||
+ * bits: 9:8 R/W
|
||||
+ * default: 0
|
||||
+ * Recommended value: 2
|
||||
+ *
|
||||
+ * Cfg_co_phase: Core clock phase
|
||||
+ * bits: 9:8 R/W
|
||||
+ * default: 0
|
||||
+ * Recommended value: 2
|
||||
+ *
|
||||
+ * values: 0: 0 phase, 1: 90 phase, 2: 180 phase, 3: 270 phase.
|
||||
+ */
|
||||
+
|
||||
+#define CLK_PHASE_0 0
|
||||
+#define CLK_PHASE_90 1
|
||||
+#define CLK_PHASE_180 2
|
||||
+#define CLK_PHASE_270 3
|
||||
+
|
||||
+
|
||||
+#endif
|
||||
--
|
||||
Armbian
|
||||
|
||||
@@ -1,44 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Vyacheslav Bocharov <adeep@lexina.in>
|
||||
Date: Mon, 7 Nov 2022 16:19:08 +0300
|
||||
Subject: arm64: amlogic: dts: meson: update meson-axg device-tree for new
|
||||
core, tx, rx phase clock settings.
|
||||
|
||||
Use phase 270 for core MMC clock on axg meson boards.
|
||||
|
||||
Signed-off-by: Vyacheslav Bocharov <adeep@lexina.in>
|
||||
---
|
||||
arch/arm64/boot/dts/amlogic/meson-axg.dtsi | 3 +++
|
||||
1 file changed, 3 insertions(+)
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/amlogic/meson-axg.dtsi b/arch/arm64/boot/dts/amlogic/meson-axg.dtsi
|
||||
index 04f797b5a012..0af4784d84c7 100644
|
||||
--- a/arch/arm64/boot/dts/amlogic/meson-axg.dtsi
|
||||
+++ b/arch/arm64/boot/dts/amlogic/meson-axg.dtsi
|
||||
@@ -13,6 +13,7 @@
|
||||
#include <dt-bindings/reset/amlogic,meson-axg-audio-arb.h>
|
||||
#include <dt-bindings/reset/amlogic,meson-axg-reset.h>
|
||||
#include <dt-bindings/power/meson-axg-power.h>
|
||||
+#include <dt-bindings/mmc/meson-gx-mmc.h>
|
||||
|
||||
/ {
|
||||
compatible = "amlogic,meson-axg";
|
||||
@@ -1891,6 +1892,7 @@ sd_emmc_b: sd@5000 {
|
||||
<&clkc CLKID_SD_EMMC_B_CLK0>,
|
||||
<&clkc CLKID_FCLK_DIV2>;
|
||||
clock-names = "core", "clkin0", "clkin1";
|
||||
+ amlogic,mmc-phase = <CLK_PHASE_270 CLK_PHASE_0 CLK_PHASE_0>;
|
||||
resets = <&reset RESET_SD_EMMC_B>;
|
||||
};
|
||||
|
||||
@@ -1904,6 +1906,7 @@ sd_emmc_c: mmc@7000 {
|
||||
<&clkc CLKID_FCLK_DIV2>;
|
||||
clock-names = "core", "clkin0", "clkin1";
|
||||
resets = <&reset RESET_SD_EMMC_C>;
|
||||
+ amlogic,mmc-phase = <CLK_PHASE_270 CLK_PHASE_0 CLK_PHASE_0>;
|
||||
};
|
||||
|
||||
usb2_phy1: phy@9020 {
|
||||
--
|
||||
Armbian
|
||||
|
||||
@@ -1,45 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Vyacheslav Bocharov <adeep@lexina.in>
|
||||
Date: Thu, 10 Nov 2022 14:52:47 +0300
|
||||
Subject: arm64: dts: docs: Update mmc meson-gx documentation for new config
|
||||
option amlogic,mmc-phase
|
||||
|
||||
- amlogic,mmc-phases: 3-element array of clock phases for core, tx, rx
|
||||
clock with values:
|
||||
0: CLK_PHASE_0 - 0 phase
|
||||
1: CLK_PHASE_90 - 90 phase
|
||||
2: CLK_PHASE_180 - 180 phase
|
||||
3: CLK_PHASE_270 - 270 phase
|
||||
By default driver use <CLK_PHASE_180 CLK_PHASE_0 CLK_PHASE_0> value.
|
||||
|
||||
Signed-off-by: Vyacheslav Bocharov <adeep@lexina.in>
|
||||
---
|
||||
Documentation/devicetree/bindings/mmc/amlogic,meson-gx.txt | 7 +++++++
|
||||
1 file changed, 7 insertions(+)
|
||||
|
||||
diff --git a/Documentation/devicetree/bindings/mmc/amlogic,meson-gx.txt b/Documentation/devicetree/bindings/mmc/amlogic,meson-gx.txt
|
||||
index ccc5358db131..98c89c5b3455 100644
|
||||
--- a/Documentation/devicetree/bindings/mmc/amlogic,meson-gx.txt
|
||||
+++ b/Documentation/devicetree/bindings/mmc/amlogic,meson-gx.txt
|
||||
@@ -25,6 +25,12 @@ Required properties:
|
||||
Optional properties:
|
||||
- amlogic,dram-access-quirk: set when controller's internal DMA engine cannot access the
|
||||
DRAM memory, like on the G12A dedicated SDIO controller.
|
||||
+- amlogic,mmc-phases: 3-element array of clock phases for core, tx, rx clock with values:
|
||||
+ 0: CLK_PHASE_0 - 0 phase
|
||||
+ 1: CLK_PHASE_90 - 90 phase
|
||||
+ 2: CLK_PHASE_180 - 180 phase
|
||||
+ 3: CLK_PHASE_270 - 270 phase
|
||||
+ By default driver use <CLK_PHASE_180 CLK_PHASE_0 CLK_PHASE_0> value.
|
||||
|
||||
Example:
|
||||
|
||||
@@ -36,4 +42,5 @@ Example:
|
||||
clock-names = "core", "clkin0", "clkin1";
|
||||
pinctrl-0 = <&emmc_pins>;
|
||||
resets = <&reset RESET_SD_EMMC_A>;
|
||||
+ amlogic,mmc-phases = <CLK_PHASE_180 CLK_PHASE_0 CLK_PHASE_0>;
|
||||
};
|
||||
--
|
||||
Armbian
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,157 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: benjamin545 <benjamin545@gmail.com>
|
||||
Date: Mon, 2 Aug 2021 15:18:40 -0400
|
||||
Subject: WIP: drivers: meson: vdec: add handling to HEVC decoder to show
|
||||
frames when ready
|
||||
|
||||
..rather than when no longer referenced
|
||||
|
||||
the HEVC decode driver would not show the next frame until it was no longer referenced,
|
||||
this would cause a backup of frames that were ready to render but held up by one or more
|
||||
frames that were still referenced. The decoded picture buffer would fill up and stall
|
||||
playback as no new frames could be placed in the decoded picture buffer.
|
||||
---
|
||||
drivers/staging/media/meson/vdec/codec_hevc.c | 52 ++++++----
|
||||
1 file changed, 34 insertions(+), 18 deletions(-)
|
||||
|
||||
diff --git a/drivers/staging/media/meson/vdec/codec_hevc.c b/drivers/staging/media/meson/vdec/codec_hevc.c
|
||||
index 3a6fd04a2d33..01218efde99b 100644
|
||||
--- a/drivers/staging/media/meson/vdec/codec_hevc.c
|
||||
+++ b/drivers/staging/media/meson/vdec/codec_hevc.c
|
||||
@@ -223,6 +223,7 @@ struct hevc_frame {
|
||||
u32 poc;
|
||||
|
||||
int referenced;
|
||||
+ int show;
|
||||
u32 num_reorder_pic;
|
||||
|
||||
u32 cur_slice_idx;
|
||||
@@ -448,9 +449,11 @@ static void codec_hevc_update_referenced(struct codec_hevc *hevc)
|
||||
((1 << (RPS_USED_BIT - 1)) - 1);
|
||||
if (param->p.CUR_RPS[i] & (1 << (RPS_USED_BIT - 1))) {
|
||||
poc_tmp = curr_poc -
|
||||
- ((1 << (RPS_USED_BIT - 1)) - delt);
|
||||
- } else
|
||||
+ ((1 << (RPS_USED_BIT - 1)) - delt);
|
||||
+ } else {
|
||||
poc_tmp = curr_poc + delt;
|
||||
+ }
|
||||
+
|
||||
if (poc_tmp == frame->poc) {
|
||||
is_referenced = 1;
|
||||
break;
|
||||
@@ -462,13 +465,13 @@ static void codec_hevc_update_referenced(struct codec_hevc *hevc)
|
||||
}
|
||||
|
||||
static struct hevc_frame *
|
||||
-codec_hevc_get_lowest_poc_frame(struct codec_hevc *hevc)
|
||||
+codec_hevc_get_next_ready_frame(struct codec_hevc *hevc)
|
||||
{
|
||||
struct hevc_frame *tmp, *ret = NULL;
|
||||
u32 poc = INT_MAX;
|
||||
|
||||
list_for_each_entry(tmp, &hevc->ref_frames_list, list) {
|
||||
- if (tmp->poc < poc) {
|
||||
+ if ((tmp->poc < poc) && tmp->show) {
|
||||
ret = tmp;
|
||||
poc = tmp->poc;
|
||||
}
|
||||
@@ -478,28 +481,35 @@ codec_hevc_get_lowest_poc_frame(struct codec_hevc *hevc)
|
||||
}
|
||||
|
||||
/* Try to output as many frames as possible */
|
||||
-static void codec_hevc_output_frames(struct amvdec_session *sess)
|
||||
+static void codec_hevc_show_frames(struct amvdec_session *sess)
|
||||
{
|
||||
- struct hevc_frame *tmp;
|
||||
+ struct hevc_frame *tmp, *n;
|
||||
struct codec_hevc *hevc = sess->priv;
|
||||
|
||||
- while ((tmp = codec_hevc_get_lowest_poc_frame(hevc))) {
|
||||
+ while ((tmp = codec_hevc_get_next_ready_frame(hevc))) {
|
||||
if (hevc->curr_poc &&
|
||||
- (tmp->referenced ||
|
||||
- tmp->num_reorder_pic >= hevc->frames_num))
|
||||
+ (hevc->frames_num <= tmp->num_reorder_pic))
|
||||
break;
|
||||
|
||||
dev_dbg(sess->core->dev, "DONE frame poc %u; vbuf %u\n",
|
||||
tmp->poc, tmp->vbuf->vb2_buf.index);
|
||||
amvdec_dst_buf_done_offset(sess, tmp->vbuf, tmp->offset,
|
||||
V4L2_FIELD_NONE, false);
|
||||
+
|
||||
+ tmp->show = 0;
|
||||
+ hevc->frames_num--;
|
||||
+ }
|
||||
+
|
||||
+ /* clean output frame buffer */
|
||||
+ list_for_each_entry_safe(tmp, n, &hevc->ref_frames_list, list) {
|
||||
+ if (tmp->referenced || tmp->show)
|
||||
+ continue;
|
||||
+
|
||||
list_del(&tmp->list);
|
||||
kfree(tmp);
|
||||
- hevc->frames_num--;
|
||||
}
|
||||
}
|
||||
|
||||
-
|
||||
static int
|
||||
codec_hevc_setup_workspace(struct amvdec_session *sess,
|
||||
struct codec_hevc *hevc)
|
||||
@@ -650,14 +660,17 @@ static int codec_hevc_start(struct amvdec_session *sess)
|
||||
static void codec_hevc_flush_output(struct amvdec_session *sess)
|
||||
{
|
||||
struct codec_hevc *hevc = sess->priv;
|
||||
- struct hevc_frame *tmp;
|
||||
+ struct hevc_frame *tmp, *n;
|
||||
|
||||
- while (!list_empty(&hevc->ref_frames_list)) {
|
||||
- tmp = codec_hevc_get_lowest_poc_frame(hevc);
|
||||
+ while ((tmp = codec_hevc_get_next_ready_frame(hevc))) {
|
||||
amvdec_dst_buf_done(sess, tmp->vbuf, V4L2_FIELD_NONE);
|
||||
+ tmp->show = 0;
|
||||
+ hevc->frames_num--;
|
||||
+ }
|
||||
+
|
||||
+ list_for_each_entry_safe(tmp, n, &hevc->ref_frames_list, list) {
|
||||
list_del(&tmp->list);
|
||||
kfree(tmp);
|
||||
- hevc->frames_num--;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -719,6 +732,7 @@ codec_hevc_prepare_new_frame(struct amvdec_session *sess)
|
||||
|
||||
new_frame->vbuf = vbuf;
|
||||
new_frame->referenced = 1;
|
||||
+ new_frame->show = 1;
|
||||
new_frame->poc = hevc->curr_poc;
|
||||
new_frame->cur_slice_type = params->p.slice_type;
|
||||
new_frame->num_reorder_pic = params->p.sps_num_reorder_pics_0;
|
||||
@@ -1267,7 +1281,7 @@ static int codec_hevc_process_segment(struct amvdec_session *sess)
|
||||
/* First slice: new frame */
|
||||
if (slice_segment_address == 0) {
|
||||
codec_hevc_update_referenced(hevc);
|
||||
- codec_hevc_output_frames(sess);
|
||||
+ codec_hevc_show_frames(sess);
|
||||
|
||||
hevc->cur_frame = codec_hevc_prepare_new_frame(sess);
|
||||
if (!hevc->cur_frame)
|
||||
@@ -1370,9 +1384,11 @@ static void codec_hevc_fetch_rpm(struct amvdec_session *sess)
|
||||
u16 *rpm_vaddr = hevc->workspace_vaddr + RPM_OFFSET;
|
||||
int i, j;
|
||||
|
||||
- for (i = 0; i < RPM_SIZE; i += 4)
|
||||
+ for (i = 0; i < RPM_SIZE; i += 4) {
|
||||
for (j = 0; j < 4; j++)
|
||||
- hevc->rpm_param.l.data[i + j] = rpm_vaddr[i + 3 - j];
|
||||
+ hevc->rpm_param.l.data[i + j] =
|
||||
+ rpm_vaddr[i + 3 - j];
|
||||
+ }
|
||||
}
|
||||
|
||||
static void codec_hevc_resume(struct amvdec_session *sess)
|
||||
--
|
||||
Armbian
|
||||
|
||||
@@ -1,51 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Neil Armstrong <narmstrong@baylibre.com>
|
||||
Date: Mon, 22 Nov 2021 09:15:21 +0000
|
||||
Subject: WIP: drivers: meson: vdec: check if parser has really parser before
|
||||
marking input buffer as error
|
||||
|
||||
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
|
||||
---
|
||||
drivers/staging/media/meson/vdec/esparser.c | 14 +++++++---
|
||||
1 file changed, 10 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/drivers/staging/media/meson/vdec/esparser.c b/drivers/staging/media/meson/vdec/esparser.c
|
||||
index 6cea1839dcca..4b9ef97639c0 100644
|
||||
--- a/drivers/staging/media/meson/vdec/esparser.c
|
||||
+++ b/drivers/staging/media/meson/vdec/esparser.c
|
||||
@@ -300,6 +300,7 @@ esparser_queue(struct amvdec_session *sess, struct vb2_v4l2_buffer *vbuf)
|
||||
u32 num_dst_bufs = 0;
|
||||
u32 offset;
|
||||
u32 pad_size;
|
||||
+ u32 wp, wp2;
|
||||
|
||||
/*
|
||||
* When max ref frame is held by VP9, this should be -= 3 to prevent a
|
||||
@@ -354,15 +355,20 @@ esparser_queue(struct amvdec_session *sess, struct vb2_v4l2_buffer *vbuf)
|
||||
}
|
||||
|
||||
pad_size = esparser_pad_start_code(core, vb, payload_size);
|
||||
+ wp = amvdec_read_parser(core, PARSER_VIDEO_WP);
|
||||
ret = esparser_write_data(core, phy, payload_size + pad_size);
|
||||
+ wp2 = amvdec_read_parser(core, PARSER_VIDEO_WP);
|
||||
|
||||
if (ret <= 0) {
|
||||
- dev_warn(core->dev, "esparser: input parsing error\n");
|
||||
- amvdec_remove_ts(sess, vb->timestamp);
|
||||
- v4l2_m2m_buf_done(vbuf, VB2_BUF_STATE_ERROR);
|
||||
amvdec_write_parser(core, PARSER_FETCH_CMD, 0);
|
||||
|
||||
- return 0;
|
||||
+ if (ret < 0 || wp2 == wp) {
|
||||
+ dev_err(core->dev, "esparser: input parsing error ret %d (%x <=> %x)\n", ret, wp, wp2);
|
||||
+ amvdec_remove_ts(sess, vb->timestamp);
|
||||
+ v4l2_m2m_buf_done(vbuf, VB2_BUF_STATE_ERROR);
|
||||
+
|
||||
+ return 0;
|
||||
+ }
|
||||
}
|
||||
|
||||
atomic_inc(&sess->esparser_queued_bufs);
|
||||
--
|
||||
Armbian
|
||||
|
||||
@@ -1,587 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: benjamin545 <benjamin545@gmail.com>
|
||||
Date: Thu, 15 Jul 2021 16:32:39 -0400
|
||||
Subject: WIP: drivers: meson: vdec: improve mmu and fbc handling and add 10
|
||||
bit handling
|
||||
|
||||
Unknown patch. From LibreELEC?
|
||||
---
|
||||
drivers/staging/media/meson/vdec/codec_h264.c | 3 +-
|
||||
drivers/staging/media/meson/vdec/codec_hevc_common.c | 164 ++++++----
|
||||
drivers/staging/media/meson/vdec/codec_hevc_common.h | 3 +-
|
||||
drivers/staging/media/meson/vdec/codec_vp9.c | 36 +-
|
||||
drivers/staging/media/meson/vdec/esparser.c | 1 +
|
||||
drivers/staging/media/meson/vdec/vdec.h | 1 +
|
||||
drivers/staging/media/meson/vdec/vdec_helpers.c | 46 ++-
|
||||
drivers/staging/media/meson/vdec/vdec_helpers.h | 10 +-
|
||||
8 files changed, 163 insertions(+), 101 deletions(-)
|
||||
|
||||
diff --git a/drivers/staging/media/meson/vdec/codec_h264.c b/drivers/staging/media/meson/vdec/codec_h264.c
|
||||
index c61128fc4bb9..d53c9a464bde 100644
|
||||
--- a/drivers/staging/media/meson/vdec/codec_h264.c
|
||||
+++ b/drivers/staging/media/meson/vdec/codec_h264.c
|
||||
@@ -353,7 +353,8 @@ static void codec_h264_src_change(struct amvdec_session *sess)
|
||||
frame_width, frame_height, crop_right, crop_bottom);
|
||||
|
||||
codec_h264_set_par(sess);
|
||||
- amvdec_src_change(sess, frame_width, frame_height, h264->max_refs + 5);
|
||||
+ amvdec_src_change(sess, frame_width, frame_height,
|
||||
+ h264->max_refs + 5, 8);
|
||||
}
|
||||
|
||||
/*
|
||||
diff --git a/drivers/staging/media/meson/vdec/codec_hevc_common.c b/drivers/staging/media/meson/vdec/codec_hevc_common.c
|
||||
index 0315cc0911cd..d6ed82dc93ca 100644
|
||||
--- a/drivers/staging/media/meson/vdec/codec_hevc_common.c
|
||||
+++ b/drivers/staging/media/meson/vdec/codec_hevc_common.c
|
||||
@@ -30,8 +30,11 @@ const u16 vdec_hevc_parser_cmd[] = {
|
||||
void codec_hevc_setup_decode_head(struct amvdec_session *sess, int is_10bit)
|
||||
{
|
||||
struct amvdec_core *core = sess->core;
|
||||
- u32 body_size = amvdec_am21c_body_size(sess->width, sess->height);
|
||||
- u32 head_size = amvdec_am21c_head_size(sess->width, sess->height);
|
||||
+ u32 use_mmu = codec_hevc_use_mmu(core->platform->revision,
|
||||
+ sess->pixfmt_cap, is_10bit);
|
||||
+ u32 body_size = amvdec_amfbc_body_size(sess->width, sess->height,
|
||||
+ is_10bit, use_mmu);
|
||||
+ u32 head_size = amvdec_amfbc_head_size(sess->width, sess->height);
|
||||
|
||||
if (!codec_hevc_use_fbc(sess->pixfmt_cap, is_10bit)) {
|
||||
/* Enable 2-plane reference read mode */
|
||||
@@ -39,9 +42,17 @@ void codec_hevc_setup_decode_head(struct amvdec_session *sess, int is_10bit)
|
||||
return;
|
||||
}
|
||||
|
||||
+ /* enable mem saving mode for 8-bit */
|
||||
+ if (!is_10bit)
|
||||
+ amvdec_write_dos_bits(core, HEVC_SAO_CTRL5, BIT(9));
|
||||
+ else
|
||||
+ amvdec_clear_dos_bits(core, HEVC_SAO_CTRL5, BIT(9));
|
||||
+
|
||||
if (codec_hevc_use_mmu(core->platform->revision,
|
||||
sess->pixfmt_cap, is_10bit))
|
||||
amvdec_write_dos(core, HEVCD_MPP_DECOMP_CTL1, BIT(4));
|
||||
+ else if (!is_10bit)
|
||||
+ amvdec_write_dos(core, HEVCD_MPP_DECOMP_CTL1, BIT(3));
|
||||
else
|
||||
amvdec_write_dos(core, HEVCD_MPP_DECOMP_CTL1, 0);
|
||||
|
||||
@@ -73,7 +84,7 @@ static void codec_hevc_setup_buffers_gxbb(struct amvdec_session *sess,
|
||||
|
||||
idx = vb->index;
|
||||
|
||||
- if (codec_hevc_use_downsample(sess->pixfmt_cap, is_10bit))
|
||||
+ if (codec_hevc_use_fbc(sess->pixfmt_cap, is_10bit))
|
||||
buf_y_paddr = comm->fbc_buffer_paddr[idx];
|
||||
else
|
||||
buf_y_paddr = vb2_dma_contig_plane_dma_addr(vb, 0);
|
||||
@@ -114,8 +125,8 @@ static void codec_hevc_setup_buffers_gxl(struct amvdec_session *sess,
|
||||
{
|
||||
struct amvdec_core *core = sess->core;
|
||||
struct v4l2_m2m_buffer *buf;
|
||||
- u32 revision = core->platform->revision;
|
||||
u32 pixfmt_cap = sess->pixfmt_cap;
|
||||
+ const u32 revision = core->platform->revision;
|
||||
int i;
|
||||
|
||||
amvdec_write_dos(core, HEVCD_MPP_ANC2AXI_TBL_CONF_ADDR,
|
||||
@@ -127,12 +138,14 @@ static void codec_hevc_setup_buffers_gxl(struct amvdec_session *sess,
|
||||
dma_addr_t buf_uv_paddr = 0;
|
||||
u32 idx = vb->index;
|
||||
|
||||
- if (codec_hevc_use_mmu(revision, pixfmt_cap, is_10bit))
|
||||
- buf_y_paddr = comm->mmu_header_paddr[idx];
|
||||
- else if (codec_hevc_use_downsample(pixfmt_cap, is_10bit))
|
||||
- buf_y_paddr = comm->fbc_buffer_paddr[idx];
|
||||
- else
|
||||
- buf_y_paddr = vb2_dma_contig_plane_dma_addr(vb, 0);
|
||||
+ if (codec_hevc_use_downsample(pixfmt_cap, is_10bit)) {
|
||||
+ if (codec_hevc_use_mmu(revision, pixfmt_cap, is_10bit))
|
||||
+ buf_y_paddr = comm->mmu_header_paddr[idx];
|
||||
+ else
|
||||
+ buf_y_paddr = comm->fbc_buffer_paddr[idx];
|
||||
+ } else {
|
||||
+ buf_y_paddr = vb2_dma_contig_plane_dma_addr(vb, 0);
|
||||
+ }
|
||||
|
||||
amvdec_write_dos(core, HEVCD_MPP_ANC2AXI_TBL_DATA,
|
||||
buf_y_paddr >> 5);
|
||||
@@ -150,60 +163,67 @@ static void codec_hevc_setup_buffers_gxl(struct amvdec_session *sess,
|
||||
amvdec_write_dos(core, HEVCD_MPP_ANC_CANVAS_DATA_ADDR, 0);
|
||||
}
|
||||
|
||||
-void codec_hevc_free_fbc_buffers(struct amvdec_session *sess,
|
||||
+void codec_hevc_free_mmu_headers(struct amvdec_session *sess,
|
||||
struct codec_hevc_common *comm)
|
||||
{
|
||||
struct device *dev = sess->core->dev;
|
||||
- u32 am21_size = amvdec_am21c_size(sess->width, sess->height);
|
||||
int i;
|
||||
|
||||
for (i = 0; i < MAX_REF_PIC_NUM; ++i) {
|
||||
- if (comm->fbc_buffer_vaddr[i]) {
|
||||
- dma_free_coherent(dev, am21_size,
|
||||
- comm->fbc_buffer_vaddr[i],
|
||||
- comm->fbc_buffer_paddr[i]);
|
||||
- comm->fbc_buffer_vaddr[i] = NULL;
|
||||
+ if (comm->mmu_header_vaddr[i]) {
|
||||
+ dma_free_coherent(dev, MMU_COMPRESS_HEADER_SIZE,
|
||||
+ comm->mmu_header_vaddr[i],
|
||||
+ comm->mmu_header_paddr[i]);
|
||||
+ comm->mmu_header_vaddr[i] = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
-EXPORT_SYMBOL_GPL(codec_hevc_free_fbc_buffers);
|
||||
+EXPORT_SYMBOL_GPL(codec_hevc_free_mmu_headers);
|
||||
|
||||
-static int codec_hevc_alloc_fbc_buffers(struct amvdec_session *sess,
|
||||
+static int codec_hevc_alloc_mmu_headers(struct amvdec_session *sess,
|
||||
struct codec_hevc_common *comm)
|
||||
{
|
||||
struct device *dev = sess->core->dev;
|
||||
struct v4l2_m2m_buffer *buf;
|
||||
- u32 am21_size = amvdec_am21c_size(sess->width, sess->height);
|
||||
|
||||
v4l2_m2m_for_each_dst_buf(sess->m2m_ctx, buf) {
|
||||
u32 idx = buf->vb.vb2_buf.index;
|
||||
dma_addr_t paddr;
|
||||
- void *vaddr = dma_alloc_coherent(dev, am21_size, &paddr,
|
||||
- GFP_KERNEL);
|
||||
+ void *vaddr = dma_alloc_coherent(dev, MMU_COMPRESS_HEADER_SIZE,
|
||||
+ &paddr, GFP_KERNEL);
|
||||
if (!vaddr) {
|
||||
- codec_hevc_free_fbc_buffers(sess, comm);
|
||||
+ codec_hevc_free_mmu_headers(sess, comm);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
- comm->fbc_buffer_vaddr[idx] = vaddr;
|
||||
- comm->fbc_buffer_paddr[idx] = paddr;
|
||||
+ comm->mmu_header_vaddr[idx] = vaddr;
|
||||
+ comm->mmu_header_paddr[idx] = paddr;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
-void codec_hevc_free_mmu_headers(struct amvdec_session *sess,
|
||||
+void codec_hevc_free_fbc_buffers(struct amvdec_session *sess,
|
||||
struct codec_hevc_common *comm)
|
||||
{
|
||||
struct device *dev = sess->core->dev;
|
||||
+ u32 use_mmu;
|
||||
+ u32 am21_size;
|
||||
int i;
|
||||
|
||||
+ use_mmu = codec_hevc_use_mmu(sess->core->platform->revision,
|
||||
+ sess->pixfmt_cap,
|
||||
+ sess->bitdepth == 10 ? 1 : 0);
|
||||
+
|
||||
+ am21_size = amvdec_amfbc_size(sess->width, sess->height,
|
||||
+ sess->bitdepth == 10 ? 1 : 0, use_mmu);
|
||||
+
|
||||
for (i = 0; i < MAX_REF_PIC_NUM; ++i) {
|
||||
- if (comm->mmu_header_vaddr[i]) {
|
||||
- dma_free_coherent(dev, MMU_COMPRESS_HEADER_SIZE,
|
||||
- comm->mmu_header_vaddr[i],
|
||||
- comm->mmu_header_paddr[i]);
|
||||
- comm->mmu_header_vaddr[i] = NULL;
|
||||
+ if (comm->fbc_buffer_vaddr[i]) {
|
||||
+ dma_free_coherent(dev, am21_size,
|
||||
+ comm->fbc_buffer_vaddr[i],
|
||||
+ comm->fbc_buffer_paddr[i]);
|
||||
+ comm->fbc_buffer_vaddr[i] = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -213,33 +233,49 @@ void codec_hevc_free_mmu_headers(struct amvdec_session *sess,
|
||||
comm->mmu_map_paddr);
|
||||
comm->mmu_map_vaddr = NULL;
|
||||
}
|
||||
+
|
||||
+ codec_hevc_free_mmu_headers(sess, comm);
|
||||
}
|
||||
-EXPORT_SYMBOL_GPL(codec_hevc_free_mmu_headers);
|
||||
+EXPORT_SYMBOL_GPL(codec_hevc_free_fbc_buffers);
|
||||
|
||||
-static int codec_hevc_alloc_mmu_headers(struct amvdec_session *sess,
|
||||
+static int codec_hevc_alloc_fbc_buffers(struct amvdec_session *sess,
|
||||
struct codec_hevc_common *comm)
|
||||
{
|
||||
struct device *dev = sess->core->dev;
|
||||
struct v4l2_m2m_buffer *buf;
|
||||
+ u32 use_mmu;
|
||||
+ u32 am21_size;
|
||||
+ const u32 revision = sess->core->platform->revision;
|
||||
+ const u32 is_10bit = sess->bitdepth == 10 ? 1 : 0;
|
||||
+ int ret;
|
||||
|
||||
- comm->mmu_map_vaddr = dma_alloc_coherent(dev, MMU_MAP_SIZE,
|
||||
- &comm->mmu_map_paddr,
|
||||
- GFP_KERNEL);
|
||||
- if (!comm->mmu_map_vaddr)
|
||||
- return -ENOMEM;
|
||||
+ use_mmu = codec_hevc_use_mmu(revision, sess->pixfmt_cap,
|
||||
+ is_10bit);
|
||||
+
|
||||
+ am21_size = amvdec_amfbc_size(sess->width, sess->height,
|
||||
+ is_10bit, use_mmu);
|
||||
|
||||
v4l2_m2m_for_each_dst_buf(sess->m2m_ctx, buf) {
|
||||
u32 idx = buf->vb.vb2_buf.index;
|
||||
dma_addr_t paddr;
|
||||
- void *vaddr = dma_alloc_coherent(dev, MMU_COMPRESS_HEADER_SIZE,
|
||||
- &paddr, GFP_KERNEL);
|
||||
+ void *vaddr = dma_alloc_coherent(dev, am21_size, &paddr,
|
||||
+ GFP_KERNEL);
|
||||
if (!vaddr) {
|
||||
- codec_hevc_free_mmu_headers(sess, comm);
|
||||
+ codec_hevc_free_fbc_buffers(sess, comm);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
- comm->mmu_header_vaddr[idx] = vaddr;
|
||||
- comm->mmu_header_paddr[idx] = paddr;
|
||||
+ comm->fbc_buffer_vaddr[idx] = vaddr;
|
||||
+ comm->fbc_buffer_paddr[idx] = paddr;
|
||||
+ }
|
||||
+
|
||||
+ if (codec_hevc_use_mmu(revision, sess->pixfmt_cap, is_10bit) &&
|
||||
+ codec_hevc_use_downsample(sess->pixfmt_cap, is_10bit)) {
|
||||
+ ret = codec_hevc_alloc_mmu_headers(sess, comm);
|
||||
+ if (ret) {
|
||||
+ codec_hevc_free_fbc_buffers(sess, comm);
|
||||
+ return ret;
|
||||
+ }
|
||||
}
|
||||
|
||||
return 0;
|
||||
@@ -250,21 +286,24 @@ int codec_hevc_setup_buffers(struct amvdec_session *sess,
|
||||
int is_10bit)
|
||||
{
|
||||
struct amvdec_core *core = sess->core;
|
||||
+ struct device *dev = core->dev;
|
||||
int ret;
|
||||
|
||||
- if (codec_hevc_use_downsample(sess->pixfmt_cap, is_10bit)) {
|
||||
- ret = codec_hevc_alloc_fbc_buffers(sess, comm);
|
||||
- if (ret)
|
||||
- return ret;
|
||||
+ if (codec_hevc_use_mmu(core->platform->revision,
|
||||
+ sess->pixfmt_cap, is_10bit)) {
|
||||
+ comm->mmu_map_vaddr = dma_alloc_coherent(dev, MMU_MAP_SIZE,
|
||||
+ &comm->mmu_map_paddr,
|
||||
+ GFP_KERNEL);
|
||||
+ if (!comm->mmu_map_vaddr)
|
||||
+ return -ENOMEM;
|
||||
}
|
||||
|
||||
if (codec_hevc_use_mmu(core->platform->revision,
|
||||
- sess->pixfmt_cap, is_10bit)) {
|
||||
- ret = codec_hevc_alloc_mmu_headers(sess, comm);
|
||||
- if (ret) {
|
||||
- codec_hevc_free_fbc_buffers(sess, comm);
|
||||
- return ret;
|
||||
- }
|
||||
+ sess->pixfmt_cap, is_10bit) ||
|
||||
+ codec_hevc_use_downsample(sess->pixfmt_cap, is_10bit)) {
|
||||
+ ret = codec_hevc_alloc_fbc_buffers(sess, comm);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
}
|
||||
|
||||
if (core->platform->revision == VDEC_REVISION_GXBB)
|
||||
@@ -278,19 +317,24 @@ EXPORT_SYMBOL_GPL(codec_hevc_setup_buffers);
|
||||
|
||||
void codec_hevc_fill_mmu_map(struct amvdec_session *sess,
|
||||
struct codec_hevc_common *comm,
|
||||
- struct vb2_buffer *vb)
|
||||
+ struct vb2_buffer *vb,
|
||||
+ u32 is_10bit)
|
||||
{
|
||||
- u32 size = amvdec_am21c_size(sess->width, sess->height);
|
||||
- u32 nb_pages = size / PAGE_SIZE;
|
||||
+ u32 use_mmu;
|
||||
+ u32 size;
|
||||
+ u32 nb_pages;
|
||||
u32 *mmu_map = comm->mmu_map_vaddr;
|
||||
u32 first_page;
|
||||
u32 i;
|
||||
|
||||
- if (sess->pixfmt_cap == V4L2_PIX_FMT_NV12M)
|
||||
- first_page = comm->fbc_buffer_paddr[vb->index] >> PAGE_SHIFT;
|
||||
- else
|
||||
- first_page = vb2_dma_contig_plane_dma_addr(vb, 0) >> PAGE_SHIFT;
|
||||
+ use_mmu = codec_hevc_use_mmu(sess->core->platform->revision,
|
||||
+ sess->pixfmt_cap, is_10bit);
|
||||
+
|
||||
+ size = amvdec_amfbc_size(sess->width, sess->height, is_10bit,
|
||||
+ use_mmu);
|
||||
|
||||
+ nb_pages = size / PAGE_SIZE;
|
||||
+ first_page = comm->fbc_buffer_paddr[vb->index] >> PAGE_SHIFT;
|
||||
for (i = 0; i < nb_pages; ++i)
|
||||
mmu_map[i] = first_page + i;
|
||||
}
|
||||
diff --git a/drivers/staging/media/meson/vdec/codec_hevc_common.h b/drivers/staging/media/meson/vdec/codec_hevc_common.h
|
||||
index cf072b8a9da2..13f9f1d90a94 100644
|
||||
--- a/drivers/staging/media/meson/vdec/codec_hevc_common.h
|
||||
+++ b/drivers/staging/media/meson/vdec/codec_hevc_common.h
|
||||
@@ -64,6 +64,7 @@ int codec_hevc_setup_buffers(struct amvdec_session *sess,
|
||||
|
||||
void codec_hevc_fill_mmu_map(struct amvdec_session *sess,
|
||||
struct codec_hevc_common *comm,
|
||||
- struct vb2_buffer *vb);
|
||||
+ struct vb2_buffer *vb,
|
||||
+ u32 is_10bit);
|
||||
|
||||
#endif
|
||||
diff --git a/drivers/staging/media/meson/vdec/codec_vp9.c b/drivers/staging/media/meson/vdec/codec_vp9.c
|
||||
index 897f5d7a6aad..bfc312ec2a56 100644
|
||||
--- a/drivers/staging/media/meson/vdec/codec_vp9.c
|
||||
+++ b/drivers/staging/media/meson/vdec/codec_vp9.c
|
||||
@@ -458,12 +458,6 @@ struct codec_vp9 {
|
||||
struct list_head ref_frames_list;
|
||||
u32 frames_num;
|
||||
|
||||
- /* In case of downsampling (decoding with FBC but outputting in NV12M),
|
||||
- * we need to allocate additional buffers for FBC.
|
||||
- */
|
||||
- void *fbc_buffer_vaddr[MAX_REF_PIC_NUM];
|
||||
- dma_addr_t fbc_buffer_paddr[MAX_REF_PIC_NUM];
|
||||
-
|
||||
int ref_frame_map[REF_FRAMES];
|
||||
int next_ref_frame_map[REF_FRAMES];
|
||||
struct vp9_frame *frame_refs[REFS_PER_FRAME];
|
||||
@@ -901,11 +895,8 @@ static void codec_vp9_set_sao(struct amvdec_session *sess,
|
||||
buf_y_paddr =
|
||||
vb2_dma_contig_plane_dma_addr(vb, 0);
|
||||
|
||||
- if (codec_hevc_use_fbc(sess->pixfmt_cap, vp9->is_10bit)) {
|
||||
- val = amvdec_read_dos(core, HEVC_SAO_CTRL5) & ~0xff0200;
|
||||
- amvdec_write_dos(core, HEVC_SAO_CTRL5, val);
|
||||
- amvdec_write_dos(core, HEVC_CM_BODY_START_ADDR, buf_y_paddr);
|
||||
- }
|
||||
+ if (codec_hevc_use_fbc(sess->pixfmt_cap, vp9->is_10bit))
|
||||
+ amvdec_write_dos(core, HEVC_CM_BODY_START_ADDR, buf_y_paddr);
|
||||
|
||||
if (sess->pixfmt_cap == V4L2_PIX_FMT_NV12M) {
|
||||
buf_y_paddr =
|
||||
@@ -920,8 +911,12 @@ static void codec_vp9_set_sao(struct amvdec_session *sess,
|
||||
|
||||
if (codec_hevc_use_mmu(core->platform->revision, sess->pixfmt_cap,
|
||||
vp9->is_10bit)) {
|
||||
- amvdec_write_dos(core, HEVC_CM_HEADER_START_ADDR,
|
||||
- vp9->common.mmu_header_paddr[vb->index]);
|
||||
+ dma_addr_t header_adr;
|
||||
+ if (codec_hevc_use_downsample(sess->pixfmt_cap, vp9->is_10bit))
|
||||
+ header_adr = vp9->common.mmu_header_paddr[vb->index];
|
||||
+ else
|
||||
+ header_adr = vb2_dma_contig_plane_dma_addr(vb, 0);
|
||||
+ amvdec_write_dos(core, HEVC_CM_HEADER_START_ADDR, header_adr);
|
||||
/* use HEVC_CM_HEADER_START_ADDR */
|
||||
amvdec_write_dos_bits(core, HEVC_SAO_CTRL5, BIT(10));
|
||||
}
|
||||
@@ -1148,9 +1143,13 @@ static void codec_vp9_set_mc(struct amvdec_session *sess,
|
||||
{
|
||||
struct amvdec_core *core = sess->core;
|
||||
u32 scale = 0;
|
||||
+ u32 use_mmu;
|
||||
u32 sz;
|
||||
int i;
|
||||
|
||||
+ use_mmu = codec_hevc_use_mmu(core->platform->revision,
|
||||
+ sess->pixfmt_cap, vp9->is_10bit);
|
||||
+
|
||||
amvdec_write_dos(core, HEVCD_MPP_ANC_CANVAS_ACCCONFIG_ADDR, 1);
|
||||
codec_vp9_set_refs(sess, vp9);
|
||||
amvdec_write_dos(core, HEVCD_MPP_ANC_CANVAS_ACCCONFIG_ADDR,
|
||||
@@ -1166,8 +1165,9 @@ static void codec_vp9_set_mc(struct amvdec_session *sess,
|
||||
vp9->frame_refs[i]->height != vp9->height)
|
||||
scale = 1;
|
||||
|
||||
- sz = amvdec_am21c_body_size(vp9->frame_refs[i]->width,
|
||||
- vp9->frame_refs[i]->height);
|
||||
+ sz = amvdec_amfbc_body_size(vp9->frame_refs[i]->width,
|
||||
+ vp9->frame_refs[i]->height,
|
||||
+ vp9->is_10bit, use_mmu);
|
||||
|
||||
amvdec_write_dos(core, VP9D_MPP_REFINFO_DATA,
|
||||
vp9->frame_refs[i]->width);
|
||||
@@ -1283,7 +1283,8 @@ static void codec_vp9_process_frame(struct amvdec_session *sess)
|
||||
if (codec_hevc_use_mmu(core->platform->revision, sess->pixfmt_cap,
|
||||
vp9->is_10bit))
|
||||
codec_hevc_fill_mmu_map(sess, &vp9->common,
|
||||
- &vp9->cur_frame->vbuf->vb2_buf);
|
||||
+ &vp9->cur_frame->vbuf->vb2_buf,
|
||||
+ vp9->is_10bit);
|
||||
|
||||
intra_only = param->p.show_frame ? 0 : param->p.intra_only;
|
||||
|
||||
@@ -2132,7 +2133,8 @@ static irqreturn_t codec_vp9_threaded_isr(struct amvdec_session *sess)
|
||||
|
||||
codec_vp9_fetch_rpm(sess);
|
||||
if (codec_vp9_process_rpm(vp9)) {
|
||||
- amvdec_src_change(sess, vp9->width, vp9->height, 16);
|
||||
+ amvdec_src_change(sess, vp9->width, vp9->height, 16,
|
||||
+ vp9->is_10bit ? 10 : 8);
|
||||
|
||||
/* No frame is actually processed */
|
||||
vp9->cur_frame = NULL;
|
||||
diff --git a/drivers/staging/media/meson/vdec/esparser.c b/drivers/staging/media/meson/vdec/esparser.c
|
||||
index 4b9ef97639c0..98f1efa4ad31 100644
|
||||
--- a/drivers/staging/media/meson/vdec/esparser.c
|
||||
+++ b/drivers/staging/media/meson/vdec/esparser.c
|
||||
@@ -321,6 +321,7 @@ esparser_queue(struct amvdec_session *sess, struct vb2_v4l2_buffer *vbuf)
|
||||
if (esparser_vififo_get_free_space(sess) < payload_size ||
|
||||
atomic_read(&sess->esparser_queued_bufs) >= num_dst_bufs)
|
||||
return -EAGAIN;
|
||||
+
|
||||
} else if (esparser_vififo_get_free_space(sess) < payload_size) {
|
||||
return -EAGAIN;
|
||||
}
|
||||
diff --git a/drivers/staging/media/meson/vdec/vdec.h b/drivers/staging/media/meson/vdec/vdec.h
|
||||
index 0906b8fb5cc6..a48170fe4cff 100644
|
||||
--- a/drivers/staging/media/meson/vdec/vdec.h
|
||||
+++ b/drivers/staging/media/meson/vdec/vdec.h
|
||||
@@ -244,6 +244,7 @@ struct amvdec_session {
|
||||
u32 width;
|
||||
u32 height;
|
||||
u32 colorspace;
|
||||
+ u32 bitdepth;
|
||||
u8 ycbcr_enc;
|
||||
u8 quantization;
|
||||
u8 xfer_func;
|
||||
diff --git a/drivers/staging/media/meson/vdec/vdec_helpers.c b/drivers/staging/media/meson/vdec/vdec_helpers.c
|
||||
index 7d2a75653250..d684057509bf 100644
|
||||
--- a/drivers/staging/media/meson/vdec/vdec_helpers.c
|
||||
+++ b/drivers/staging/media/meson/vdec/vdec_helpers.c
|
||||
@@ -50,32 +50,40 @@ void amvdec_write_parser(struct amvdec_core *core, u32 reg, u32 val)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(amvdec_write_parser);
|
||||
|
||||
-/* 4 KiB per 64x32 block */
|
||||
-u32 amvdec_am21c_body_size(u32 width, u32 height)
|
||||
+/* AMFBC body is made out of 64x32 blocks with varying block size */
|
||||
+u32 amvdec_amfbc_body_size(u32 width, u32 height, u32 is_10bit, u32 use_mmu)
|
||||
{
|
||||
u32 width_64 = ALIGN(width, 64) / 64;
|
||||
u32 height_32 = ALIGN(height, 32) / 32;
|
||||
+ u32 blk_size = 4096;
|
||||
|
||||
- return SZ_4K * width_64 * height_32;
|
||||
+ if (!is_10bit) {
|
||||
+ if (use_mmu)
|
||||
+ blk_size = 3200;
|
||||
+ else
|
||||
+ blk_size = 3072;
|
||||
+ }
|
||||
+
|
||||
+ return blk_size * width_64 * height_32;
|
||||
}
|
||||
-EXPORT_SYMBOL_GPL(amvdec_am21c_body_size);
|
||||
+EXPORT_SYMBOL_GPL(amvdec_amfbc_body_size);
|
||||
|
||||
/* 32 bytes per 128x64 block */
|
||||
-u32 amvdec_am21c_head_size(u32 width, u32 height)
|
||||
+u32 amvdec_amfbc_head_size(u32 width, u32 height)
|
||||
{
|
||||
u32 width_128 = ALIGN(width, 128) / 128;
|
||||
u32 height_64 = ALIGN(height, 64) / 64;
|
||||
|
||||
return 32 * width_128 * height_64;
|
||||
}
|
||||
-EXPORT_SYMBOL_GPL(amvdec_am21c_head_size);
|
||||
+EXPORT_SYMBOL_GPL(amvdec_amfbc_head_size);
|
||||
|
||||
-u32 amvdec_am21c_size(u32 width, u32 height)
|
||||
+u32 amvdec_amfbc_size(u32 width, u32 height, u32 is_10bit, u32 use_mmu)
|
||||
{
|
||||
- return ALIGN(amvdec_am21c_body_size(width, height) +
|
||||
- amvdec_am21c_head_size(width, height), SZ_64K);
|
||||
+ return ALIGN(amvdec_amfbc_body_size(width, height, is_10bit, use_mmu) +
|
||||
+ amvdec_amfbc_head_size(width, height), SZ_64K);
|
||||
}
|
||||
-EXPORT_SYMBOL_GPL(amvdec_am21c_size);
|
||||
+EXPORT_SYMBOL_GPL(amvdec_amfbc_size);
|
||||
|
||||
static int canvas_alloc(struct amvdec_session *sess, u8 *canvas_id)
|
||||
{
|
||||
@@ -440,7 +448,7 @@ void amvdec_set_par_from_dar(struct amvdec_session *sess,
|
||||
EXPORT_SYMBOL_GPL(amvdec_set_par_from_dar);
|
||||
|
||||
void amvdec_src_change(struct amvdec_session *sess, u32 width,
|
||||
- u32 height, u32 dpb_size)
|
||||
+ u32 height, u32 dpb_size, u32 bitdepth)
|
||||
{
|
||||
static const struct v4l2_event ev = {
|
||||
.type = V4L2_EVENT_SOURCE_CHANGE,
|
||||
@@ -448,25 +456,27 @@ void amvdec_src_change(struct amvdec_session *sess, u32 width,
|
||||
|
||||
v4l2_ctrl_s_ctrl(sess->ctrl_min_buf_capture, dpb_size);
|
||||
|
||||
+ sess->bitdepth = bitdepth;
|
||||
+
|
||||
/*
|
||||
* Check if the capture queue is already configured well for our
|
||||
- * usecase. If so, keep decoding with it and do not send the event
|
||||
+ * usecase. If so, keep decoding with it.
|
||||
*/
|
||||
if (sess->streamon_cap &&
|
||||
sess->width == width &&
|
||||
sess->height == height &&
|
||||
dpb_size <= sess->num_dst_bufs) {
|
||||
sess->fmt_out->codec_ops->resume(sess);
|
||||
- return;
|
||||
- }
|
||||
+ } else {
|
||||
+ sess->status = STATUS_NEEDS_RESUME;
|
||||
+ sess->changed_format = 0;
|
||||
+ }
|
||||
|
||||
- sess->changed_format = 0;
|
||||
sess->width = width;
|
||||
sess->height = height;
|
||||
- sess->status = STATUS_NEEDS_RESUME;
|
||||
|
||||
- dev_dbg(sess->core->dev, "Res. changed (%ux%u), DPB size %u\n",
|
||||
- width, height, dpb_size);
|
||||
+ dev_dbg(sess->core->dev, "Res. changed (%ux%u), DPB %u, bitdepth %u\n",
|
||||
+ width, height, dpb_size, bitdepth);
|
||||
v4l2_event_queue_fh(&sess->fh, &ev);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(amvdec_src_change);
|
||||
diff --git a/drivers/staging/media/meson/vdec/vdec_helpers.h b/drivers/staging/media/meson/vdec/vdec_helpers.h
|
||||
index 4bf3e61d081b..1a711679d26a 100644
|
||||
--- a/drivers/staging/media/meson/vdec/vdec_helpers.h
|
||||
+++ b/drivers/staging/media/meson/vdec/vdec_helpers.h
|
||||
@@ -27,9 +27,10 @@ void amvdec_clear_dos_bits(struct amvdec_core *core, u32 reg, u32 val);
|
||||
u32 amvdec_read_parser(struct amvdec_core *core, u32 reg);
|
||||
void amvdec_write_parser(struct amvdec_core *core, u32 reg, u32 val);
|
||||
|
||||
-u32 amvdec_am21c_body_size(u32 width, u32 height);
|
||||
-u32 amvdec_am21c_head_size(u32 width, u32 height);
|
||||
-u32 amvdec_am21c_size(u32 width, u32 height);
|
||||
+/* Helpers for the Amlogic compressed framebuffer format */
|
||||
+u32 amvdec_amfbc_body_size(u32 width, u32 height, u32 is_10bit, u32 use_mmu);
|
||||
+u32 amvdec_amfbc_head_size(u32 width, u32 height);
|
||||
+u32 amvdec_amfbc_size(u32 width, u32 height, u32 is_10bit, u32 use_mmu);
|
||||
|
||||
/**
|
||||
* amvdec_dst_buf_done_idx() - Signal that a buffer is done decoding
|
||||
@@ -77,9 +78,10 @@ void amvdec_set_par_from_dar(struct amvdec_session *sess,
|
||||
* @width: picture width detected by the hardware
|
||||
* @height: picture height detected by the hardware
|
||||
* @dpb_size: Decoded Picture Buffer size (= amount of buffers for decoding)
|
||||
+ * @bitdepth: Bit depth (usually 10 or 8) of the coded content
|
||||
*/
|
||||
void amvdec_src_change(struct amvdec_session *sess, u32 width,
|
||||
- u32 height, u32 dpb_size);
|
||||
+ u32 height, u32 dpb_size, u32 bitdepth);
|
||||
|
||||
/**
|
||||
* amvdec_abort() - Abort the current decoding session
|
||||
--
|
||||
Armbian
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user