From 15174efc6d6565b2c7833d53ad6b19d0fd7f30e8 Mon Sep 17 00:00:00 2001 From: Patrick Yavitz Date: Sun, 1 Mar 2026 09:07:17 -0500 Subject: [PATCH] SpacemiT: Add linux-7.0.y patch set Signed-off-by: Patrick Yavitz --- .../001-Update-MusePi-Pro-DTS.patch | 310 +++++++++ ...t-for-SpacemiT-K1-SoC-thermal-sensor.patch | 629 ++++++++++++++++++ ...-ranges-and-support-board-power-tree.patch | 236 +++++++ ...pacemit-pcie-driver-to-its-subfolder.patch | 94 +++ ...egulator-node-name-to-preferred-form.patch | 100 +++ ...reboot-cell-for-the-SpacemiT-P1-chip.patch | 29 + ...-usb-add-disconnect-function-support.patch | 60 ++ 7 files changed, 1458 insertions(+) create mode 100644 patch/kernel/archive/spacemit-7.0/001-Update-MusePi-Pro-DTS.patch create mode 100644 patch/kernel/archive/spacemit-7.0/002-PATCH-v3-0-3-thermal-spacemit-Add-support-for-SpacemiT-K1-SoC-thermal-sensor.patch create mode 100644 patch/kernel/archive/spacemit-7.0/003-PATCH-0-4-regulator-spacemit-p1-Fix-voltage-ranges-and-support-board-power-tree.patch create mode 100644 patch/kernel/archive/spacemit-7.0/004-PATCH-phy-move-spacemit-pcie-driver-to-its-subfolder.patch create mode 100644 patch/kernel/archive/spacemit-7.0/005-PATCH-riscv-dts-spacemit-adapt-regulator-node-name-to-preferred-form.patch create mode 100644 patch/kernel/archive/spacemit-7.0/006-PATCH-v5-2-2-mfd-simple-mfd-i2c-add-a-reboot-cell-for-the-SpacemiT-P1-chip.patch create mode 100644 patch/kernel/archive/spacemit-7.0/007-PATCH-v3-phy-k1-usb-add-disconnect-function-support.patch diff --git a/patch/kernel/archive/spacemit-7.0/001-Update-MusePi-Pro-DTS.patch b/patch/kernel/archive/spacemit-7.0/001-Update-MusePi-Pro-DTS.patch new file mode 100644 index 0000000000..a12c4753b4 --- /dev/null +++ b/patch/kernel/archive/spacemit-7.0/001-Update-MusePi-Pro-DTS.patch @@ -0,0 +1,310 @@ +From 87b63fe0a197562bfa30cc27954824a824a1fa0f Mon Sep 17 00:00:00 2001 +From: Patrick Yavitz +Date: Thu, 26 Feb 2026 07:29:43 -0500 +Subject: [PATCH] Update MusePi Pro DTS + +Signed-off-by: Patrick Yavitz +--- + .../riscv/boot/dts/spacemit/k1-musepi-pro.dts | 270 ++++++++++++++++++ + 1 file changed, 270 insertions(+) + +diff --git a/arch/riscv/boot/dts/spacemit/k1-musepi-pro.dts b/arch/riscv/boot/dts/spacemit/k1-musepi-pro.dts +index 29e333b670cf..9a2d4ce58b67 100644 +--- a/arch/riscv/boot/dts/spacemit/k1-musepi-pro.dts ++++ b/arch/riscv/boot/dts/spacemit/k1-musepi-pro.dts +@@ -16,6 +16,8 @@ / { + + aliases { + ethernet0 = ð0; ++ i2c2 = &i2c2; ++ i2c8 = &i2c8; + serial0 = &uart0; + }; + +@@ -33,6 +35,58 @@ led1 { + default-state = "on"; + }; + }; ++ ++ pcie_vcc_3v3: regulator-pcie-vcc3v3 { ++ compatible = "regulator-fixed"; ++ regulator-name = "PCIE_VCC3V3"; ++ regulator-min-microvolt = <3300000>; ++ regulator-max-microvolt = <3300000>; ++ regulator-always-on; ++ }; ++ ++ reg_dc_in: regulator-dc-in-12v { ++ compatible = "regulator-fixed"; ++ regulator-name = "dc_in_12v"; ++ regulator-min-microvolt = <12000000>; ++ regulator-max-microvolt = <12000000>; ++ regulator-boot-on; ++ regulator-always-on; ++ }; ++ ++ reg_vcc_4v: regulator-vcc-4v { ++ compatible = "regulator-fixed"; ++ regulator-name = "vcc_4v"; ++ regulator-min-microvolt = <4000000>; ++ regulator-max-microvolt = <4000000>; ++ regulator-boot-on; ++ regulator-always-on; ++ vin-supply = <®_dc_in>; ++ }; ++ ++ regulator-usb3-vbus-5v { ++ compatible = "regulator-fixed"; ++ regulator-name = "USB30_VBUS"; ++ regulator-min-microvolt = <5000000>; ++ regulator-max-microvolt = <5000000>; ++ regulator-always-on; ++ gpio = <&gpio K1_GPIO(79) GPIO_ACTIVE_HIGH>; ++ enable-active-high; ++ }; ++ ++ usb3_hub_5v: regulator-usb3-hub-5v { ++ compatible = "regulator-fixed"; ++ regulator-name = "USB30_HUB"; ++ regulator-min-microvolt = <5000000>; ++ regulator-max-microvolt = <5000000>; ++ gpio = <&gpio K1_GPIO(127) GPIO_ACTIVE_HIGH>; ++ enable-active-high; ++ }; ++}; ++ ++&combo_phy { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&pcie0_3_cfg>; ++ status = "okay"; + }; + + &emmc { +@@ -72,8 +126,224 @@ &pdma { + status = "okay"; + }; + ++&qspi { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&qspi_cfg>; ++ status = "okay"; ++}; ++ ++&i2c2 { ++ pinctrl-0 = <&i2c2_0_cfg>; ++ pinctrl-names = "default"; ++ status = "okay"; ++ ++ eeprom@50 { ++ compatible = "atmel,24c02"; ++ reg = <0x50>; ++ vcc-supply = <&buck3_1v8>; /* EEPROM_VCC1V8 */ ++ pagesize = <16>; ++ read-only; ++ size = <256>; ++ ++ nvmem-layout { ++ compatible = "onie,tlv-layout"; ++ ++ mac-address { ++ #nvmem-cell-cells = <1>; ++ }; ++ ++ num-macs { ++ }; ++ ++ serial-number { ++ }; ++ }; ++ }; ++}; ++ ++&i2c8 { ++ pinctrl-0 = <&i2c8_cfg>; ++ pinctrl-names = "default"; ++ status = "okay"; ++ ++ pmic@41 { ++ compatible = "spacemit,p1"; ++ reg = <0x41>; ++ interrupts = <64>; ++ vin1-supply = <®_vcc_4v>; ++ vin2-supply = <®_vcc_4v>; ++ vin3-supply = <®_vcc_4v>; ++ vin4-supply = <®_vcc_4v>; ++ vin5-supply = <®_vcc_4v>; ++ vin6-supply = <®_vcc_4v>; ++ aldoin-supply = <®_vcc_4v>; ++ dldoin1-supply = <&buck5>; ++ dldoin2-supply = <&buck5>; ++ ++ regulators { ++ buck1 { ++ regulator-min-microvolt = <500000>; ++ regulator-max-microvolt = <3450000>; ++ regulator-ramp-delay = <5000>; ++ regulator-always-on; ++ }; ++ ++ buck2 { ++ regulator-min-microvolt = <500000>; ++ regulator-max-microvolt = <3450000>; ++ regulator-ramp-delay = <5000>; ++ regulator-always-on; ++ }; ++ ++ buck3_1v8: buck3 { ++ regulator-min-microvolt = <500000>; ++ regulator-max-microvolt = <1800000>; ++ regulator-ramp-delay = <5000>; ++ regulator-always-on; ++ }; ++ ++ buck4: buck4 { ++ regulator-min-microvolt = <500000>; ++ regulator-max-microvolt = <3300000>; ++ regulator-ramp-delay = <5000>; ++ regulator-always-on; ++ }; ++ ++ buck5: buck5 { ++ regulator-min-microvolt = <500000>; ++ regulator-max-microvolt = <3450000>; ++ regulator-ramp-delay = <5000>; ++ regulator-always-on; ++ }; ++ ++ buck6 { ++ regulator-min-microvolt = <500000>; ++ regulator-max-microvolt = <3450000>; ++ regulator-ramp-delay = <5000>; ++ regulator-always-on; ++ }; ++ ++ aldo1: aldo1 { ++ regulator-min-microvolt = <500000>; ++ regulator-max-microvolt = <3400000>; ++ regulator-boot-on; ++ }; ++ ++ aldo2 { ++ regulator-min-microvolt = <500000>; ++ regulator-max-microvolt = <3400000>; ++ }; ++ ++ aldo3 { ++ regulator-min-microvolt = <500000>; ++ regulator-max-microvolt = <3400000>; ++ }; ++ ++ aldo4 { ++ regulator-min-microvolt = <500000>; ++ regulator-max-microvolt = <3400000>; ++ }; ++ ++ dldo1 { ++ regulator-min-microvolt = <500000>; ++ regulator-max-microvolt = <3400000>; ++ regulator-boot-on; ++ }; ++ ++ dldo2 { ++ regulator-min-microvolt = <500000>; ++ regulator-max-microvolt = <3400000>; ++ }; ++ ++ dldo3 { ++ regulator-min-microvolt = <500000>; ++ regulator-max-microvolt = <3400000>; ++ }; ++ ++ dldo4 { ++ regulator-min-microvolt = <500000>; ++ regulator-max-microvolt = <3400000>; ++ regulator-always-on; ++ }; ++ ++ dldo5 { ++ regulator-min-microvolt = <500000>; ++ regulator-max-microvolt = <3400000>; ++ }; ++ ++ dldo6 { ++ regulator-min-microvolt = <500000>; ++ regulator-max-microvolt = <3400000>; ++ regulator-always-on; ++ }; ++ ++ dldo7 { ++ regulator-min-microvolt = <500000>; ++ regulator-max-microvolt = <3400000>; ++ }; ++ }; ++ }; ++}; ++ ++&pcie1_phy { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&pcie1_3_cfg>; ++ status = "okay"; ++}; ++ ++&pcie1_port { ++ phys = <&pcie1_phy>; ++}; ++ ++&pcie1 { ++ vpcie3v3-supply = <&pcie_vcc_3v3>; ++ status = "okay"; ++}; ++ ++&pcie2_phy { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&pcie2_4_cfg>; ++ status = "okay"; ++}; ++ ++&pcie2_port { ++ phys = <&pcie2_phy>; ++}; ++ ++&pcie2 { ++ vpcie3v3-supply = <&pcie_vcc_3v3>; ++ status = "okay"; ++}; ++ + &uart0 { + pinctrl-0 = <&uart0_2_cfg>; + pinctrl-names = "default"; + status = "okay"; + }; ++ ++&usbphy2 { ++ status = "okay"; ++}; ++ ++&usb_dwc3 { ++ dr_mode = "host"; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ status = "okay"; ++ ++ hub_2_0: hub@1 { ++ compatible = "usb2109,2817"; ++ reg = <0x1>; ++ vdd-supply = <&usb3_hub_5v>; ++ peer-hub = <&hub_3_0>; ++ reset-gpios = <&gpio K1_GPIO(123) GPIO_ACTIVE_LOW>; ++ }; ++ ++ hub_3_0: hub@2 { ++ compatible = "usb2109,817"; ++ reg = <0x2>; ++ vdd-supply = <&usb3_hub_5v>; ++ peer-hub = <&hub_2_0>; ++ reset-gpios = <&gpio K1_GPIO(123) GPIO_ACTIVE_LOW>; ++ }; ++}; +-- +2.51.0 + diff --git a/patch/kernel/archive/spacemit-7.0/002-PATCH-v3-0-3-thermal-spacemit-Add-support-for-SpacemiT-K1-SoC-thermal-sensor.patch b/patch/kernel/archive/spacemit-7.0/002-PATCH-v3-0-3-thermal-spacemit-Add-support-for-SpacemiT-K1-SoC-thermal-sensor.patch new file mode 100644 index 0000000000..9ef5ff1f86 --- /dev/null +++ b/patch/kernel/archive/spacemit-7.0/002-PATCH-v3-0-3-thermal-spacemit-Add-support-for-SpacemiT-K1-SoC-thermal-sensor.patch @@ -0,0 +1,629 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Shuwei Wu +Date: Mon, 19 Jan 2026 10:41:23 +0800 +Subject: [PATCH v3 3/3] riscv: dts: spacemit: Add thermal sensor for K1 SoC + +Include the Thermal Sensor node in the SpacemiT K1 dtsi +with definitions for registers, clocks, and interrupts. +Additionally, configure thermal zones for the soc, package, gpu, and +clusters to enable temperature monitoring via the thermal framework. + +Signed-off-by: Shuwei Wu +--- +Changes in v2: +- Update compatible to "spacemit,k1-tsensor" +--- + arch/riscv/boot/dts/spacemit/k1.dtsi | 101 +++++++++++++++++++++++++++++++++++ + 1 file changed, 101 insertions(+) + +diff --git a/arch/riscv/boot/dts/spacemit/k1.dtsi b/arch/riscv/boot/dts/spacemit/k1.dtsi +index 7818ca4979b6..0fe7396ea6e4 100644 +--- a/arch/riscv/boot/dts/spacemit/k1.dtsi ++++ b/arch/riscv/boot/dts/spacemit/k1.dtsi +@@ -338,6 +338,96 @@ osc_32k: clock-32k { + }; + }; + ++ thermal-zones { ++ soc-thermal { ++ polling-delay-passive = <0>; ++ polling-delay = <0>; ++ thermal-sensors = <&thermal 0>; ++ ++ trips { ++ soc-crit { ++ temperature = <115000>; ++ hysteresis = <0>; ++ type = "critical"; ++ }; ++ }; ++ }; ++ ++ package-thermal { ++ polling-delay-passive = <0>; ++ polling-delay = <0>; ++ thermal-sensors = <&thermal 1>; ++ ++ trips { ++ package-crit { ++ temperature = <115000>; ++ hysteresis = <0>; ++ type = "critical"; ++ }; ++ }; ++ }; ++ ++ gpu-thermal { ++ polling-delay-passive = <100>; ++ polling-delay = <0>; ++ thermal-sensors = <&thermal 2>; ++ ++ trips { ++ gpu-alert { ++ temperature = <85000>; ++ hysteresis = <2000>; ++ type = "passive"; ++ }; ++ ++ gpu-crit { ++ temperature = <115000>; ++ hysteresis = <0>; ++ type = "critical"; ++ }; ++ }; ++ }; ++ ++ cluster0-thermal { ++ polling-delay-passive = <100>; ++ polling-delay = <0>; ++ thermal-sensors = <&thermal 3>; ++ ++ trips { ++ cluster0-alert { ++ temperature = <85000>; ++ hysteresis = <2000>; ++ type = "passive"; ++ }; ++ ++ cluster0-crit { ++ temperature = <115000>; ++ hysteresis = <0>; ++ type = "critical"; ++ }; ++ }; ++ }; ++ ++ cluster1-thermal { ++ polling-delay-passive = <100>; ++ polling-delay = <0>; ++ thermal-sensors = <&thermal 4>; ++ ++ trips { ++ cluster1-alert { ++ temperature = <85000>; ++ hysteresis = <2000>; ++ type = "passive"; ++ }; ++ ++ cluster1-crit { ++ temperature = <115000>; ++ hysteresis = <0>; ++ type = "critical"; ++ }; ++ }; ++ }; ++ }; ++ + soc { + compatible = "simple-bus"; + interrupt-parent = <&plic>; +@@ -434,6 +524,17 @@ syscon_apbc: system-controller@d4015000 { + #reset-cells = <1>; + }; + ++ thermal: thermal@d4018000 { ++ compatible = "spacemit,k1-tsensor"; ++ reg = <0x0 0xd4018000 0x0 0x100>; ++ clocks = <&syscon_apbc CLK_TSEN>, ++ <&syscon_apbc CLK_TSEN_BUS>; ++ clock-names = "core", "bus"; ++ interrupts = <61>; ++ resets = <&syscon_apbc RESET_TSEN>; ++ #thermal-sensor-cells = <1>; ++ }; ++ + i2c6: i2c@d4018800 { + compatible = "spacemit,k1-i2c"; + reg = <0x0 0xd4018800 0x0 0x38>; + +-- +2.52.0 + + +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Shuwei Wu +Date: Mon, 19 Jan 2026 10:41:21 +0800 +Subject: [PATCH v3 1/3] dt-bindings: thermal: Add SpacemiT K1 thermal + sensor + +Document the SpacemiT K1 Thermal Sensor, which supports +monitoring temperatures for five zones: soc, package, gpu, cluster0, +and cluster1. + +Reviewed-by: Krzysztof Kozlowski +Signed-off-by: Shuwei Wu +--- +Changes in v2: +- Rename binding file to spacemit,k1-tsensor.yaml and update compatible +--- + .../bindings/thermal/spacemit,k1-tsensor.yaml | 76 ++++++++++++++++++++++ + 1 file changed, 76 insertions(+) + +diff --git a/Documentation/devicetree/bindings/thermal/spacemit,k1-tsensor.yaml b/Documentation/devicetree/bindings/thermal/spacemit,k1-tsensor.yaml +new file mode 100644 +index 000000000000..328101a7f083 +--- /dev/null ++++ b/Documentation/devicetree/bindings/thermal/spacemit,k1-tsensor.yaml +@@ -0,0 +1,76 @@ ++# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) ++%YAML 1.2 ++--- ++$id: http://devicetree.org/schemas/thermal/spacemit,k1-tsensor.yaml# ++$schema: http://devicetree.org/meta-schemas/core.yaml# ++ ++title: SpacemiT K1 Thermal Sensor ++ ++description: ++ The SpacemiT K1 Thermal Sensor monitors the temperature of the SoC ++ using multiple internal sensors (e.g., soc, package, gpu, clusters). ++ ++maintainers: ++ - Shuwei Wu ++ ++$ref: thermal-sensor.yaml# ++ ++properties: ++ compatible: ++ const: spacemit,k1-tsensor ++ ++ reg: ++ maxItems: 1 ++ ++ clocks: ++ items: ++ - description: Core clock for thermal sensor ++ - description: Bus clock for thermal sensor ++ ++ clock-names: ++ items: ++ - const: core ++ - const: bus ++ ++ interrupts: ++ maxItems: 1 ++ ++ resets: ++ items: ++ - description: Reset for the thermal sensor ++ ++ "#thermal-sensor-cells": ++ const: 1 ++ description: ++ The first cell indicates the sensor ID. ++ 0 = soc ++ 1 = package ++ 2 = gpu ++ 3 = cluster0 ++ 4 = cluster1 ++ ++required: ++ - compatible ++ - reg ++ - clocks ++ - clock-names ++ - interrupts ++ - resets ++ - "#thermal-sensor-cells" ++ ++additionalProperties: false ++ ++examples: ++ - | ++ #include ++ ++ thermal@d4018000 { ++ compatible = "spacemit,k1-tsensor"; ++ reg = <0xd4018000 0x100>; ++ clocks = <&syscon_apbc CLK_TSEN>, ++ <&syscon_apbc CLK_TSEN_BUS>; ++ clock-names = "core", "bus"; ++ interrupts = <61>; ++ resets = <&syscon_apbc RESET_TSEN>; ++ #thermal-sensor-cells = <1>; ++ }; + +-- +2.52.0 + + +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Shuwei Wu +Date: Mon, 19 Jan 2026 10:41:22 +0800 +Subject: [PATCH v3 2/3] thermal: spacemit: k1: Add thermal sensor support + +The thermal sensor on K1 supports monitoring five temperature zones. +The driver registers these sensors with the thermal framework +and supports standard operations: +- Reading temperature (millidegree Celsius) +- Setting high/low thresholds for interrupts + +Signed-off-by: Shuwei Wu +--- +Changes in v3: +- Align multi-line assignments as suggested by reviewer +- Remove unnecessary variable definitions + +Changes in v2: +- Rename k1_thermal.c to k1_tsensor.c for better hardware alignment +- Move driver to drivers/thermal/spacemit/ +- Add Kconfig/Makefile for spacemit and update top-level build files +- Refactor names, style, code alignment, and comments +- Simplify probe and error handling +--- + drivers/thermal/Kconfig | 2 + + drivers/thermal/Makefile | 1 + + drivers/thermal/spacemit/Kconfig | 19 +++ + drivers/thermal/spacemit/Makefile | 3 + + drivers/thermal/spacemit/k1_tsensor.c | 281 ++++++++++++++++++++++++++++++++++ + 5 files changed, 306 insertions(+) + +diff --git a/drivers/thermal/Kconfig b/drivers/thermal/Kconfig +index b10080d61860..1c4a5cd5a23e 100644 +--- a/drivers/thermal/Kconfig ++++ b/drivers/thermal/Kconfig +@@ -472,6 +472,8 @@ endmenu + + source "drivers/thermal/renesas/Kconfig" + ++source "drivers/thermal/spacemit/Kconfig" ++ + source "drivers/thermal/tegra/Kconfig" + + config GENERIC_ADC_THERMAL +diff --git a/drivers/thermal/Makefile b/drivers/thermal/Makefile +index bb21e7ea7fc6..3b249195c088 100644 +--- a/drivers/thermal/Makefile ++++ b/drivers/thermal/Makefile +@@ -65,6 +65,7 @@ obj-y += mediatek/ + obj-$(CONFIG_GENERIC_ADC_THERMAL) += thermal-generic-adc.o + obj-$(CONFIG_UNIPHIER_THERMAL) += uniphier_thermal.o + obj-$(CONFIG_AMLOGIC_THERMAL) += amlogic_thermal.o ++obj-y += spacemit/ + obj-$(CONFIG_SPRD_THERMAL) += sprd_thermal.o + obj-$(CONFIG_KHADAS_MCU_FAN_THERMAL) += khadas_mcu_fan.o + obj-$(CONFIG_LOONGSON2_THERMAL) += loongson2_thermal.o +diff --git a/drivers/thermal/spacemit/Kconfig b/drivers/thermal/spacemit/Kconfig +new file mode 100644 +index 000000000000..fbfd22f8fcd3 +--- /dev/null ++++ b/drivers/thermal/spacemit/Kconfig +@@ -0,0 +1,19 @@ ++# SPDX-License-Identifier: GPL-2.0-only ++menu "SpacemiT thermal drivers" ++depends on ARCH_SPACEMIT || COMPILE_TEST ++ ++config SPACEMIT_K1_TSENSOR ++ tristate "SpacemiT K1 thermal sensor driver" ++ depends on ARCH_SPACEMIT || COMPILE_TEST ++ help ++ This driver provides support for the thermal sensor ++ integrated in the SpacemiT K1 SoC. ++ ++ The thermal sensor monitors temperatures for five thermal zones: ++ soc, package, gpu, cluster0, and cluster1. It supports reporting ++ temperature values and handling high/low threshold interrupts. ++ ++ Say Y here if you want to enable thermal monitoring on SpacemiT K1. ++ If compiled as a module, it will be called k1_tsensor. ++ ++endmenu +diff --git a/drivers/thermal/spacemit/Makefile b/drivers/thermal/spacemit/Makefile +new file mode 100644 +index 000000000000..82b30741e4ec +--- /dev/null ++++ b/drivers/thermal/spacemit/Makefile +@@ -0,0 +1,3 @@ ++# SPDX-License-Identifier: GPL-2.0-only ++ ++obj-$(CONFIG_SPACEMIT_K1_TSENSOR) += k1_tsensor.o +diff --git a/drivers/thermal/spacemit/k1_tsensor.c b/drivers/thermal/spacemit/k1_tsensor.c +new file mode 100644 +index 000000000000..4788ab47a086 +--- /dev/null ++++ b/drivers/thermal/spacemit/k1_tsensor.c +@@ -0,0 +1,281 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* ++ * Thermal sensor driver for SpacemiT K1 SoC ++ * ++ * Copyright (C) 2026 Shuwei Wu ++ */ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include "../thermal_hwmon.h" ++ ++#define K1_TSENSOR_PCTRL_REG 0x00 ++#define K1_TSENSOR_PCTRL_ENABLE BIT(0) ++#define K1_TSENSOR_PCTRL_TEMP_MODE BIT(3) ++#define K1_TSENSOR_PCTRL_RAW_SEL BIT(7) ++ ++#define K1_TSENSOR_PCTRL_CTUNE GENMASK(11, 8) ++#define K1_TSENSOR_PCTRL_SW_CTRL GENMASK(21, 18) ++#define K1_TSENSOR_PCTRL_HW_AUTO_MODE BIT(23) ++ ++#define K1_TSENSOR_EN_REG 0x08 ++#define K1_TSENSOR_EN_ALL GENMASK(MAX_SENSOR_NUMBER - 1, 0) ++ ++#define K1_TSENSOR_TIME_REG 0x0C ++#define K1_TSENSOR_TIME_WAIT_REF_CNT GENMASK(3, 0) ++#define K1_TSENSOR_TIME_ADC_CNT_RST GENMASK(7, 4) ++#define K1_TSENSOR_TIME_FILTER_PERIOD GENMASK(21, 20) ++#define K1_TSENSOR_TIME_MASK GENMASK(23, 0) ++ ++#define K1_TSENSOR_INT_CLR_REG 0x10 ++#define K1_TSENSOR_INT_EN_REG 0x14 ++#define K1_TSENSOR_INT_STA_REG 0x18 ++ ++#define K1_TSENSOR_INT_EN_MASK BIT(0) ++#define K1_TSENSOR_INT_MASK(x) (GENMASK(2, 1) << ((x) * 2)) ++ ++#define K1_TSENSOR_DATA_BASE_REG 0x20 ++#define K1_TSENSOR_DATA_REG(x) (K1_TSENSOR_DATA_BASE_REG + ((x) / 2) * 4) ++#define K1_TSENSOR_DATA_LOW_MASK GENMASK(15, 0) ++#define K1_TSENSOR_DATA_HIGH_MASK GENMASK(31, 16) ++ ++#define K1_TSENSOR_THRSH_BASE_REG 0x40 ++#define K1_TSENSOR_THRSH_REG(x) (K1_TSENSOR_THRSH_BASE_REG + ((x) * 4)) ++#define K1_TSENSOR_THRSH_LOW_MASK GENMASK(15, 0) ++#define K1_TSENSOR_THRSH_HIGH_MASK GENMASK(31, 16) ++ ++#define MAX_SENSOR_NUMBER 5 ++ ++/* Hardware offset value required for temperature calculation */ ++#define TEMPERATURE_OFFSET 278 ++ ++struct k1_tsensor_channel { ++ struct k1_tsensor *ts; ++ struct thermal_zone_device *tzd; ++ int id; ++}; ++ ++struct k1_tsensor { ++ void __iomem *base; ++ struct k1_tsensor_channel ch[MAX_SENSOR_NUMBER]; ++}; ++ ++static void k1_tsensor_init(struct k1_tsensor *ts) ++{ ++ u32 val; ++ ++ /* Disable all the interrupts */ ++ writel(0xffffffff, ts->base + K1_TSENSOR_INT_EN_REG); ++ ++ /* Configure ADC sampling time and filter period */ ++ val = readl(ts->base + K1_TSENSOR_TIME_REG); ++ val &= ~K1_TSENSOR_TIME_MASK; ++ val |= K1_TSENSOR_TIME_FILTER_PERIOD | ++ K1_TSENSOR_TIME_ADC_CNT_RST | ++ K1_TSENSOR_TIME_WAIT_REF_CNT; ++ writel(val, ts->base + K1_TSENSOR_TIME_REG); ++ ++ /* ++ * Enable all sensors' auto mode, enable dither control, ++ * consecutive mode, and power up sensor. ++ */ ++ val = readl(ts->base + K1_TSENSOR_PCTRL_REG); ++ val &= ~K1_TSENSOR_PCTRL_SW_CTRL; ++ val &= ~K1_TSENSOR_PCTRL_CTUNE; ++ val |= K1_TSENSOR_PCTRL_RAW_SEL | ++ K1_TSENSOR_PCTRL_TEMP_MODE | ++ K1_TSENSOR_PCTRL_HW_AUTO_MODE | ++ K1_TSENSOR_PCTRL_ENABLE; ++ writel(val, ts->base + K1_TSENSOR_PCTRL_REG); ++ ++ /* Enable thermal interrupt */ ++ val = readl(ts->base + K1_TSENSOR_INT_EN_REG); ++ val |= K1_TSENSOR_INT_EN_MASK; ++ writel(val, ts->base + K1_TSENSOR_INT_EN_REG); ++ ++ /* Enable each sensor */ ++ val = readl(ts->base + K1_TSENSOR_EN_REG); ++ val |= K1_TSENSOR_EN_ALL; ++ writel(val, ts->base + K1_TSENSOR_EN_REG); ++} ++ ++static void k1_tsensor_enable_irq(struct k1_tsensor_channel *ch) ++{ ++ struct k1_tsensor *ts = ch->ts; ++ u32 val; ++ ++ val = readl(ts->base + K1_TSENSOR_INT_CLR_REG); ++ val |= K1_TSENSOR_INT_MASK(ch->id); ++ writel(val, ts->base + K1_TSENSOR_INT_CLR_REG); ++ ++ val = readl(ts->base + K1_TSENSOR_INT_EN_REG); ++ val &= ~K1_TSENSOR_INT_MASK(ch->id); ++ writel(val, ts->base + K1_TSENSOR_INT_EN_REG); ++} ++ ++/* ++ * The conversion formula used is: ++ * T(m°C) = (((raw_value & mask) >> shift) - TEMPERATURE_OFFSET) * 1000 ++ */ ++static int k1_tsensor_get_temp(struct thermal_zone_device *tz, int *temp) ++{ ++ struct k1_tsensor_channel *ch = thermal_zone_device_priv(tz); ++ struct k1_tsensor *ts = ch->ts; ++ u32 val; ++ ++ val = readl(ts->base + K1_TSENSOR_DATA_REG(ch->id)); ++ if (ch->id % 2) ++ *temp = FIELD_GET(K1_TSENSOR_DATA_HIGH_MASK, val); ++ else ++ *temp = FIELD_GET(K1_TSENSOR_DATA_LOW_MASK, val); ++ ++ *temp -= TEMPERATURE_OFFSET; ++ *temp *= 1000; ++ ++ return 0; ++} ++ ++/* ++ * For each sensor, the hardware threshold register is 32 bits: ++ * - Lower 16 bits [15:0] configure the low threshold temperature. ++ * - Upper 16 bits [31:16] configure the high threshold temperature. ++ */ ++static int k1_tsensor_set_trips(struct thermal_zone_device *tz, int low, int high) ++{ ++ struct k1_tsensor_channel *ch = thermal_zone_device_priv(tz); ++ struct k1_tsensor *ts = ch->ts; ++ u32 val; ++ ++ if (low >= high) ++ return -EINVAL; ++ ++ if (low < 0) ++ low = 0; ++ ++ high = high / 1000 + TEMPERATURE_OFFSET; ++ low = low / 1000 + TEMPERATURE_OFFSET; ++ ++ val = readl(ts->base + K1_TSENSOR_THRSH_REG(ch->id)); ++ val &= ~K1_TSENSOR_THRSH_HIGH_MASK; ++ val |= FIELD_PREP(K1_TSENSOR_THRSH_HIGH_MASK, high); ++ ++ val &= ~K1_TSENSOR_THRSH_LOW_MASK; ++ val |= FIELD_PREP(K1_TSENSOR_THRSH_LOW_MASK, low); ++ writel(val, ts->base + K1_TSENSOR_THRSH_REG(ch->id)); ++ ++ return 0; ++} ++ ++static const struct thermal_zone_device_ops k1_tsensor_ops = { ++ .get_temp = k1_tsensor_get_temp, ++ .set_trips = k1_tsensor_set_trips, ++}; ++ ++static irqreturn_t k1_tsensor_irq_thread(int irq, void *data) ++{ ++ struct k1_tsensor *ts = (struct k1_tsensor *)data; ++ int mask, status, i; ++ ++ status = readl(ts->base + K1_TSENSOR_INT_STA_REG); ++ ++ for (i = 0; i < MAX_SENSOR_NUMBER; i++) { ++ if (status & K1_TSENSOR_INT_MASK(i)) { ++ mask = readl(ts->base + K1_TSENSOR_INT_CLR_REG); ++ mask |= K1_TSENSOR_INT_MASK(i); ++ writel(mask, ts->base + K1_TSENSOR_INT_CLR_REG); ++ thermal_zone_device_update(ts->ch[i].tzd, THERMAL_EVENT_UNSPECIFIED); ++ } ++ } ++ ++ return IRQ_HANDLED; ++} ++ ++static int k1_tsensor_probe(struct platform_device *pdev) ++{ ++ struct device *dev = &pdev->dev; ++ struct k1_tsensor *ts; ++ struct reset_control *reset; ++ struct clk *clk; ++ int i, irq, ret; ++ ++ ts = devm_kzalloc(dev, sizeof(*ts), GFP_KERNEL); ++ if (!ts) ++ return -ENOMEM; ++ ++ ts->base = devm_platform_ioremap_resource(pdev, 0); ++ if (IS_ERR(ts->base)) ++ return dev_err_probe(dev, PTR_ERR(ts->base), "Failed to get reg\n"); ++ ++ reset = devm_reset_control_get_exclusive_deasserted(dev, NULL); ++ if (IS_ERR(reset)) ++ return dev_err_probe(dev, PTR_ERR(reset), "Failed to get/deassert reset control\n"); ++ ++ clk = devm_clk_get_enabled(dev, "core"); ++ if (IS_ERR(clk)) ++ return dev_err_probe(dev, PTR_ERR(clk), "Failed to get core clock\n"); ++ ++ clk = devm_clk_get_enabled(dev, "bus"); ++ if (IS_ERR(clk)) ++ return dev_err_probe(dev, PTR_ERR(clk), "Failed to get bus clock\n"); ++ ++ k1_tsensor_init(ts); ++ ++ for (i = 0; i < MAX_SENSOR_NUMBER; ++i) { ++ ts->ch[i].id = i; ++ ts->ch[i].ts = ts; ++ ts->ch[i].tzd = devm_thermal_of_zone_register(dev, i, ts->ch + i, &k1_tsensor_ops); ++ if (IS_ERR(ts->ch[i].tzd)) ++ return PTR_ERR(ts->ch[i].tzd); ++ ++ /* Attach sysfs hwmon attributes for userspace monitoring */ ++ ret = devm_thermal_add_hwmon_sysfs(dev, ts->ch[i].tzd); ++ if (ret) ++ dev_warn(dev, "Failed to add hwmon sysfs attributes\n"); ++ ++ k1_tsensor_enable_irq(ts->ch + i); ++ } ++ ++ irq = platform_get_irq(pdev, 0); ++ if (irq < 0) ++ return irq; ++ ++ ret = devm_request_threaded_irq(dev, irq, NULL, ++ k1_tsensor_irq_thread, ++ IRQF_ONESHOT, "k1_tsensor", ts); ++ if (ret < 0) ++ return ret; ++ ++ platform_set_drvdata(pdev, ts); ++ ++ return 0; ++} ++ ++static const struct of_device_id k1_tsensor_dt_ids[] = { ++ { .compatible = "spacemit,k1-tsensor" }, ++ { /* sentinel */ } ++}; ++ ++MODULE_DEVICE_TABLE(of, k1_tsensor_dt_ids); ++ ++static struct platform_driver k1_tsensor_driver = { ++ .driver = { ++ .name = "k1_tsensor", ++ .of_match_table = k1_tsensor_dt_ids, ++ }, ++ .probe = k1_tsensor_probe, ++}; ++module_platform_driver(k1_tsensor_driver); ++ ++MODULE_DESCRIPTION("SpacemiT K1 Thermal Sensor Driver"); ++MODULE_AUTHOR("Shuwei Wu "); ++MODULE_LICENSE("GPL"); + +-- +2.52.0 + diff --git a/patch/kernel/archive/spacemit-7.0/003-PATCH-0-4-regulator-spacemit-p1-Fix-voltage-ranges-and-support-board-power-tree.patch b/patch/kernel/archive/spacemit-7.0/003-PATCH-0-4-regulator-spacemit-p1-Fix-voltage-ranges-and-support-board-power-tree.patch new file mode 100644 index 0000000000..6b3ebf5896 --- /dev/null +++ b/patch/kernel/archive/spacemit-7.0/003-PATCH-0-4-regulator-spacemit-p1-Fix-voltage-ranges-and-support-board-power-tree.patch @@ -0,0 +1,236 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Guodong Xu +Date: Thu, 22 Jan 2026 17:43:43 +0800 +Subject: [PATCH 2/4] dt-bindings: mfd: spacemit,p1: Add individual + regulator supply properties + +Add supply properties that match the P1 PMIC's actual hardware topology +where each buck converter has its own VIN pin and LDO groups share +common input pins. Supply names are defined according to the pinout +names in the P1 datasheet. + +This allows different boards to describe their actual +power tree connections in devicetree rather than hardcoding supply +relationships in the driver. + +Signed-off-by: Guodong Xu +--- + .../devicetree/bindings/mfd/spacemit,p1.yaml | 58 +++++++++++++++++++++- + 1 file changed, 56 insertions(+), 2 deletions(-) + +diff --git a/Documentation/devicetree/bindings/mfd/spacemit,p1.yaml b/Documentation/devicetree/bindings/mfd/spacemit,p1.yaml +index c6593ac6ef6adb72fc48af570dc13fc9edf77ccb..abdc93b9a67b1872c8fe6955abd950622a0b69e8 100644 +--- a/Documentation/devicetree/bindings/mfd/spacemit,p1.yaml ++++ b/Documentation/devicetree/bindings/mfd/spacemit,p1.yaml +@@ -27,8 +27,41 @@ properties: + interrupts: + maxItems: 1 + +- vin-supply: +- description: Input supply phandle. ++ vin1-supply: ++ description: ++ Power supply for BUCK1. Required if BUCK1 is defined. ++ ++ vin2-supply: ++ description: ++ Power supply for BUCK2. Required if BUCK2 is defined. ++ ++ vin3-supply: ++ description: ++ Power supply for BUCK3. Required if BUCK3 is defined. ++ ++ vin4-supply: ++ description: ++ Power supply for BUCK4. Required if BUCK4 is defined. ++ ++ vin5-supply: ++ description: ++ Power supply for BUCK5. Required if BUCK5 is defined. ++ ++ vin6-supply: ++ description: ++ Power supply for BUCK6. Required if BUCK6 is defined. ++ ++ aldoin-supply: ++ description: ++ Power supply for ALDO1-4. Required if any are defined. ++ ++ dldoin1-supply: ++ description: ++ Power supply for DLDO1-4. Required if any are defined. ++ ++ dldoin2-supply: ++ description: ++ Power supply for DLDO5-7. Required if any are defined. + + regulators: + type: object +@@ -50,6 +83,15 @@ unevaluatedProperties: false + + examples: + - | ++ / { ++ reg_vcc_5v: regulator-vcc-5v { ++ compatible = "regulator-fixed"; ++ regulator-name = "vcc_5v"; ++ regulator-min-microvolt = <5000000>; ++ regulator-max-microvolt = <5000000>; ++ }; ++ }; ++ + i2c { + #address-cells = <1>; + #size-cells = <0>; +@@ -58,6 +100,10 @@ examples: + compatible = "spacemit,p1"; + reg = <0x41>; + interrupts = <64>; ++ vin1-supply = <®_vcc_5v>; ++ vin5-supply = <®_vcc_5v>; ++ aldoin-supply = <®_vcc_5v>; ++ dldoin1-supply = <&buck5>; + + regulators { + buck1 { +@@ -68,6 +114,14 @@ examples: + regulator-always-on; + }; + ++ buck5: buck5 { ++ regulator-name = "buck5"; ++ regulator-min-microvolt = <500000>; ++ regulator-max-microvolt = <3450000>; ++ regulator-ramp-delay = <5000>; ++ regulator-always-on; ++ }; ++ + aldo1 { + regulator-name = "aldo1"; + regulator-min-microvolt = <500000>; + +-- +2.43.0 + + +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Guodong Xu +Date: Thu, 22 Jan 2026 17:43:44 +0800 +Subject: [PATCH 3/4] regulator: spacemit-p1: Update supply names + +Update supply names to match the P1 PMIC's actual hardware pinout where +each buck has an individual VIN pin (vin1-vin6) and LDO groups have +dedicated input pins (aldoin, dldoin1, dldoin2). + +The supply is a board design decision and should not be hardcoded to any +existing power source. This allows boards to specify their actual power +tree topology in devicetree. + +Signed-off-by: Guodong Xu +--- + drivers/regulator/spacemit-p1.c | 25 ++++++++++++++----------- + 1 file changed, 14 insertions(+), 11 deletions(-) + +diff --git a/drivers/regulator/spacemit-p1.c b/drivers/regulator/spacemit-p1.c +index 2b585ba01a93d0ce163c33e14c8022a506bdce11..57e6e00a73fa416fd6e557eb5bcada7dc69df444 100644 +--- a/drivers/regulator/spacemit-p1.c ++++ b/drivers/regulator/spacemit-p1.c +@@ -87,13 +87,16 @@ static const struct linear_range p1_ldo_ranges[] = { + } + + #define P1_BUCK_DESC(_n) \ +- P1_REG_DESC(BUCK, buck, _n, "vin", 0x47, BUCK_MASK, 255, p1_buck_ranges) ++ P1_REG_DESC(BUCK, buck, _n, "vin" #_n, 0x47, BUCK_MASK, 255, p1_buck_ranges) + + #define P1_ALDO_DESC(_n) \ +- P1_REG_DESC(ALDO, aldo, _n, "vin", 0x5b, LDO_MASK, 128, p1_ldo_ranges) ++ P1_REG_DESC(ALDO, aldo, _n, "aldoin", 0x5b, LDO_MASK, 128, p1_ldo_ranges) + +-#define P1_DLDO_DESC(_n) \ +- P1_REG_DESC(DLDO, dldo, _n, "buck5", 0x67, LDO_MASK, 128, p1_ldo_ranges) ++#define P1_DLDO1_DESC(_n) \ ++ P1_REG_DESC(DLDO, dldo, _n, "dldoin1", 0x67, LDO_MASK, 128, p1_ldo_ranges) ++ ++#define P1_DLDO2_DESC(_n) \ ++ P1_REG_DESC(DLDO, dldo, _n, "dldoin2", 0x67, LDO_MASK, 128, p1_ldo_ranges) + + static const struct regulator_desc p1_regulator_desc[] = { + P1_BUCK_DESC(1), +@@ -108,13 +111,13 @@ static const struct regulator_desc p1_regulator_desc[] = { + P1_ALDO_DESC(3), + P1_ALDO_DESC(4), + +- P1_DLDO_DESC(1), +- P1_DLDO_DESC(2), +- P1_DLDO_DESC(3), +- P1_DLDO_DESC(4), +- P1_DLDO_DESC(5), +- P1_DLDO_DESC(6), +- P1_DLDO_DESC(7), ++ P1_DLDO1_DESC(1), ++ P1_DLDO1_DESC(2), ++ P1_DLDO1_DESC(3), ++ P1_DLDO1_DESC(4), ++ P1_DLDO2_DESC(5), ++ P1_DLDO2_DESC(6), ++ P1_DLDO2_DESC(7), + }; + + static int p1_regulator_probe(struct platform_device *pdev) + +-- +2.43.0 + + +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Guodong Xu +Date: Thu, 22 Jan 2026 17:43:45 +0800 +Subject: [PATCH 4/4] riscv: dts: spacemit: k1-bananapi-f3: Update PMIC + supply properties + +Update individual supply properties in pmic node to accurately specify +the board's power tree topology. + +Previously these relationships were hardcoded in the driver; now they +are explicitly defined in the devicetree per the updated binding +document spacemit,p1.yaml. + +Signed-off-by: Guodong Xu +--- + arch/riscv/boot/dts/spacemit/k1-bananapi-f3.dts | 12 ++++++++++-- + 1 file changed, 10 insertions(+), 2 deletions(-) + +diff --git a/arch/riscv/boot/dts/spacemit/k1-bananapi-f3.dts b/arch/riscv/boot/dts/spacemit/k1-bananapi-f3.dts +index 02f218a16318e5b6f512bcc37035fac37c25ee84..c30697732b627d764bdae9bc8ba44d7b503f0897 100644 +--- a/arch/riscv/boot/dts/spacemit/k1-bananapi-f3.dts ++++ b/arch/riscv/boot/dts/spacemit/k1-bananapi-f3.dts +@@ -157,7 +157,15 @@ pmic@41 { + compatible = "spacemit,p1"; + reg = <0x41>; + interrupts = <64>; +- vin-supply = <®_vcc_4v>; ++ vin1-supply = <®_vcc_4v>; ++ vin2-supply = <®_vcc_4v>; ++ vin3-supply = <®_vcc_4v>; ++ vin4-supply = <®_vcc_4v>; ++ vin5-supply = <®_vcc_4v>; ++ vin6-supply = <®_vcc_4v>; ++ aldoin-supply = <®_vcc_4v>; ++ dldoin1-supply = <&buck5>; ++ dldoin2-supply = <&buck5>; + + regulators { + buck1 { +@@ -188,7 +196,7 @@ buck4 { + regulator-always-on; + }; + +- buck5 { ++ buck5: buck5 { + regulator-min-microvolt = <500000>; + regulator-max-microvolt = <3450000>; + regulator-ramp-delay = <5000>; + +-- +2.43.0 + diff --git a/patch/kernel/archive/spacemit-7.0/004-PATCH-phy-move-spacemit-pcie-driver-to-its-subfolder.patch b/patch/kernel/archive/spacemit-7.0/004-PATCH-phy-move-spacemit-pcie-driver-to-its-subfolder.patch new file mode 100644 index 0000000000..b16670be4b --- /dev/null +++ b/patch/kernel/archive/spacemit-7.0/004-PATCH-phy-move-spacemit-pcie-driver-to-its-subfolder.patch @@ -0,0 +1,94 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Vinod Koul +Subject: [PATCH] phy: move spacemit pcie driver to its subfolder +Date: Mon, 23 Feb 2026 12:12:39 +0530 + +Commit fe4bc1a08638 ("phy: spacemit: support K1 USB2.0 PHY controller") +created spacemit subfolder with usb driver while commit 57e920b92724 +("phy: spacemit: Introduce PCIe/combo PHY") added pcie driver in phy +folder. Move latter into spacemit subfolder and rename file to +phy-k1-pcie.c + +Signed-off-by: Vinod Koul +--- + drivers/phy/Kconfig | 12 ------------ + drivers/phy/Makefile | 1 - + drivers/phy/spacemit/Kconfig | 12 ++++++++++++ + drivers/phy/spacemit/Makefile | 1 + + .../phy-k1-pcie.c} | 0 + 5 files changed, 13 insertions(+), 13 deletions(-) + rename drivers/phy/{phy-spacemit-k1-pcie.c => spacemit/phy-k1-pcie.c} (100%) + +diff --git a/drivers/phy/Kconfig b/drivers/phy/Kconfig +index 02467dfd4fb0..c0574e44f0a3 100644 +--- a/drivers/phy/Kconfig ++++ b/drivers/phy/Kconfig +@@ -134,18 +134,6 @@ config PHY_NXP_PTN3222 + schemes. It supports all three USB 2.0 data rates: Low Speed, Full + Speed and High Speed. + +-config PHY_SPACEMIT_K1_PCIE +- tristate "PCIe and combo PHY driver for the SpacemiT K1 SoC" +- depends on ARCH_SPACEMIT || COMPILE_TEST +- depends on COMMON_CLK +- depends on HAS_IOMEM +- depends on OF +- select GENERIC_PHY +- default ARCH_SPACEMIT +- help +- Enable support for the PCIe and USB 3 combo PHY and two +- PCIe-only PHYs used in the SpacemiT K1 SoC. +- + source "drivers/phy/allwinner/Kconfig" + source "drivers/phy/amlogic/Kconfig" + source "drivers/phy/apple/Kconfig" +diff --git a/drivers/phy/Makefile b/drivers/phy/Makefile +index a648c2e02a83..2773d596e543 100644 +--- a/drivers/phy/Makefile ++++ b/drivers/phy/Makefile +@@ -16,7 +16,6 @@ obj-$(CONFIG_PHY_SNPS_EUSB2) += phy-snps-eusb2.o + obj-$(CONFIG_USB_LGM_PHY) += phy-lgm-usb.o + obj-$(CONFIG_PHY_AIROHA_PCIE) += phy-airoha-pcie.o + obj-$(CONFIG_PHY_NXP_PTN3222) += phy-nxp-ptn3222.o +-obj-$(CONFIG_PHY_SPACEMIT_K1_PCIE) += phy-spacemit-k1-pcie.o + obj-$(CONFIG_GENERIC_PHY) += allwinner/ \ + amlogic/ \ + apple/ \ +diff --git a/drivers/phy/spacemit/Kconfig b/drivers/phy/spacemit/Kconfig +index 0136aee2e8a2..50b0005acf66 100644 +--- a/drivers/phy/spacemit/Kconfig ++++ b/drivers/phy/spacemit/Kconfig +@@ -2,6 +2,18 @@ + # + # Phy drivers for SpacemiT platforms + # ++config PHY_SPACEMIT_K1_PCIE ++ tristate "PCIe and combo PHY driver for the SpacemiT K1 SoC" ++ depends on ARCH_SPACEMIT || COMPILE_TEST ++ depends on COMMON_CLK ++ depends on HAS_IOMEM ++ depends on OF ++ select GENERIC_PHY ++ default ARCH_SPACEMIT ++ help ++ Enable support for the PCIe and USB 3 combo PHY and two ++ PCIe-only PHYs used in the SpacemiT K1 SoC. ++ + config PHY_SPACEMIT_K1_USB2 + tristate "SpacemiT K1 USB 2.0 PHY support" + depends on (ARCH_SPACEMIT || COMPILE_TEST) && OF +diff --git a/drivers/phy/spacemit/Makefile b/drivers/phy/spacemit/Makefile +index fec0b425a948..a821a21d6142 100644 +--- a/drivers/phy/spacemit/Makefile ++++ b/drivers/phy/spacemit/Makefile +@@ -1,2 +1,3 @@ + # SPDX-License-Identifier: GPL-2.0-only ++obj-$(CONFIG_PHY_SPACEMIT_K1_PCIE) += phy-k1-pcie.o + obj-$(CONFIG_PHY_SPACEMIT_K1_USB2) += phy-k1-usb2.o +diff --git a/drivers/phy/phy-spacemit-k1-pcie.c b/drivers/phy/spacemit/phy-k1-pcie.c +similarity index 100% +rename from drivers/phy/phy-spacemit-k1-pcie.c +rename to drivers/phy/spacemit/phy-k1-pcie.c +-- +2.43.0 + diff --git a/patch/kernel/archive/spacemit-7.0/005-PATCH-riscv-dts-spacemit-adapt-regulator-node-name-to-preferred-form.patch b/patch/kernel/archive/spacemit-7.0/005-PATCH-riscv-dts-spacemit-adapt-regulator-node-name-to-preferred-form.patch new file mode 100644 index 0000000000..e4ec0f0c7c --- /dev/null +++ b/patch/kernel/archive/spacemit-7.0/005-PATCH-riscv-dts-spacemit-adapt-regulator-node-name-to-preferred-form.patch @@ -0,0 +1,100 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Yixun Lan +Date: Thu, 26 Feb 2026 09:35:00 +0000 +Subject: [PATCH] riscv: dts: spacemit: adapt regulator node name to + preferred form + +The preferred node name for fixed-regulators has changed to pattern [1]: + '^regulator(-[0-9]+v[0-9]+|-[0-9a-z-]+)?$' + +Adjust all SpacemiT DT regulator node names to fix this. + +Link: https://lore.kernel.org/r/20240426215147.3138211-1-robh@kernel.org [1] +Signed-off-by: Yixun Lan +--- +In Review of adding DTS for OrangePi, Chukun mentioned fixed-regulator +has preferred node names [1], so let's change it now. + +This isn't strictly a bug, so I've not added the Fixes tag. + +Link: https://lore.kernel.org/r/20260123145015.1926865-1-amadeus@jmu.edu.cn [1] +--- + arch/riscv/boot/dts/spacemit/k1-bananapi-f3.dts | 10 +++++----- + arch/riscv/boot/dts/spacemit/k1-milkv-jupiter.dts | 4 ++-- + 2 files changed, 7 insertions(+), 7 deletions(-) + +diff --git a/arch/riscv/boot/dts/spacemit/k1-bananapi-f3.dts b/arch/riscv/boot/dts/spacemit/k1-bananapi-f3.dts +index 5971605754b3..d55f3e148ed2 100644 +--- a/arch/riscv/boot/dts/spacemit/k1-bananapi-f3.dts ++++ b/arch/riscv/boot/dts/spacemit/k1-bananapi-f3.dts +@@ -33,7 +33,7 @@ led1 { + }; + }; + +- pcie_vcc_3v3: pcie-vcc3v3 { ++ pcie_vcc_3v3: regulator-pcie-vcc3v3 { + compatible = "regulator-fixed"; + regulator-name = "PCIE_VCC3V3"; + regulator-min-microvolt = <3300000>; +@@ -41,7 +41,7 @@ pcie_vcc_3v3: pcie-vcc3v3 { + regulator-always-on; + }; + +- reg_dc_in: dc-in-12v { ++ reg_dc_in: regulator-dc-in-12v { + compatible = "regulator-fixed"; + regulator-name = "dc_in_12v"; + regulator-min-microvolt = <12000000>; +@@ -50,7 +50,7 @@ reg_dc_in: dc-in-12v { + regulator-always-on; + }; + +- reg_vcc_4v: vcc-4v { ++ reg_vcc_4v: regulator-vcc-4v { + compatible = "regulator-fixed"; + regulator-name = "vcc_4v"; + regulator-min-microvolt = <4000000>; +@@ -60,7 +60,7 @@ reg_vcc_4v: vcc-4v { + vin-supply = <®_dc_in>; + }; + +- usb3-vbus-5v { ++ regulator-usb3-vbus-5v { + compatible = "regulator-fixed"; + regulator-name = "USB30_VBUS"; + regulator-min-microvolt = <5000000>; +@@ -70,7 +70,7 @@ usb3-vbus-5v { + enable-active-high; + }; + +- usb3_hub_5v: usb3-hub-5v { ++ usb3_hub_5v: regulator-usb3-hub-5v { + compatible = "regulator-fixed"; + regulator-name = "USB30_HUB"; + regulator-min-microvolt = <5000000>; +diff --git a/arch/riscv/boot/dts/spacemit/k1-milkv-jupiter.dts b/arch/riscv/boot/dts/spacemit/k1-milkv-jupiter.dts +index 800a112d5d70..931887aee8e0 100644 +--- a/arch/riscv/boot/dts/spacemit/k1-milkv-jupiter.dts ++++ b/arch/riscv/boot/dts/spacemit/k1-milkv-jupiter.dts +@@ -21,7 +21,7 @@ chosen { + stdout-path = "serial0"; + }; + +- reg_dc_in: dc-in-12v { ++ reg_dc_in: regulator-dc-in-12v { + compatible = "regulator-fixed"; + regulator-name = "dc_in_12v"; + regulator-min-microvolt = <12000000>; +@@ -30,7 +30,7 @@ reg_dc_in: dc-in-12v { + regulator-always-on; + }; + +- reg_vcc_4v: vcc-4v { ++ reg_vcc_4v: regulator-vcc-4v { + compatible = "regulator-fixed"; + regulator-name = "vcc_4v"; + regulator-min-microvolt = <4000000>; + +-- +2.43.0 + diff --git a/patch/kernel/archive/spacemit-7.0/006-PATCH-v5-2-2-mfd-simple-mfd-i2c-add-a-reboot-cell-for-the-SpacemiT-P1-chip.patch b/patch/kernel/archive/spacemit-7.0/006-PATCH-v5-2-2-mfd-simple-mfd-i2c-add-a-reboot-cell-for-the-SpacemiT-P1-chip.patch new file mode 100644 index 0000000000..907f98306e --- /dev/null +++ b/patch/kernel/archive/spacemit-7.0/006-PATCH-v5-2-2-mfd-simple-mfd-i2c-add-a-reboot-cell-for-the-SpacemiT-P1-chip.patch @@ -0,0 +1,29 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Aurelien Jarno +Subject: [PATCH v5 2/2] mfd: simple-mfd-i2c: add a reboot cell for the SpacemiT P1 chip +Date: Mon, 3 Nov 2025 00:02:00 +0100 + +Add a "spacemit-p1-reboot" cell for the SpacemiT P1 chip. + +Signed-off-by: Aurelien Jarno +--- +v5: no changes + + drivers/mfd/simple-mfd-i2c.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/drivers/mfd/simple-mfd-i2c.c b/drivers/mfd/simple-mfd-i2c.c +index 0a607a1e3ca1d..542d378cdcd1f 100644 +--- a/drivers/mfd/simple-mfd-i2c.c ++++ b/drivers/mfd/simple-mfd-i2c.c +@@ -99,6 +99,7 @@ static const struct regmap_config spacemit_p1_regmap_config = { + }; + + static const struct mfd_cell spacemit_p1_cells[] = { ++ { .name = "spacemit-p1-reboot", }, + { .name = "spacemit-p1-regulator", }, + { .name = "spacemit-p1-rtc", }, + }; +-- +2.47.2 + diff --git a/patch/kernel/archive/spacemit-7.0/007-PATCH-v3-phy-k1-usb-add-disconnect-function-support.patch b/patch/kernel/archive/spacemit-7.0/007-PATCH-v3-phy-k1-usb-add-disconnect-function-support.patch new file mode 100644 index 0000000000..8f38b7600e --- /dev/null +++ b/patch/kernel/archive/spacemit-7.0/007-PATCH-v3-phy-k1-usb-add-disconnect-function-support.patch @@ -0,0 +1,60 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Yixun Lan +Subject: [PATCH v3] phy: k1-usb: add disconnect function support +Date: Mon, 16 Feb 2026 23:26:53 +0800 + +A disconnect status BIT of USB2 PHY need to be cleared, otherwise +it will fail to work properly during next connection when devices +connect to roothub directly. + +Fixes: fe4bc1a08638 ("phy: spacemit: support K1 USB2.0 PHY controller") +Signed-off-by: Yixun Lan +--- + +Change in v3: + - split from v2 as bug fix + - fix alignment to open parenthesis + - http://lore.kernel.org/r/20260216090112.n5jjpui3luqsybb5@skbuf + - Link to v2: https://lore.kernel.org/r/20260214-11-k3-usb2-phy-v2-0-6ed31e031ab4@kernel.org +--- + drivers/phy/spacemit/phy-k1-usb2.c | 14 ++++++++++++++ + 1 file changed, 14 insertions(+) + +diff --git a/drivers/phy/spacemit/phy-k1-usb2.c b/drivers/phy/spacemit/phy-k1-usb2.c +index 342061380012..9215d0b223b2 100644 +--- a/drivers/phy/spacemit/phy-k1-usb2.c ++++ b/drivers/phy/spacemit/phy-k1-usb2.c +@@ -48,6 +48,9 @@ + #define PHY_CLK_HSTXP_EN BIT(3) /* clock hstxp enable */ + #define PHY_HSTXP_MODE BIT(4) /* 0: force en_txp to be 1; 1: no force */ + ++#define PHY_K1_HS_HOST_DISC 0x40 ++#define PHY_K1_HS_HOST_DISC_CLR BIT(0) ++ + #define PHY_PLL_DIV_CFG 0x98 + #define PHY_FDIV_FRACT_8_15 GENMASK(7, 0) + #define PHY_FDIV_FRACT_16_19 GENMASK(11, 8) +@@ -142,9 +145,20 @@ static int spacemit_usb2phy_exit(struct phy *phy) + return 0; + } + ++static int spacemit_usb2phy_disconnect(struct phy *phy, int port) ++{ ++ struct spacemit_usb2phy *sphy = phy_get_drvdata(phy); ++ ++ regmap_update_bits(sphy->regmap_base, PHY_K1_HS_HOST_DISC, ++ PHY_K1_HS_HOST_DISC_CLR, PHY_K1_HS_HOST_DISC_CLR); ++ ++ return 0; ++} ++ + static const struct phy_ops spacemit_usb2phy_ops = { + .init = spacemit_usb2phy_init, + .exit = spacemit_usb2phy_exit, ++ .disconnect = spacemit_usb2phy_disconnect, + .owner = THIS_MODULE, + }; + +-- +2.52.0 +