mirror of
https://github.com/coolsnowwolf/lede.git
synced 2025-04-16 04:13:31 +00:00
qualcommbe: ipq95xx: add qualcomm wifi7 be target support
This commit is contained in:
parent
d49a280942
commit
c14fe39288
@ -521,7 +521,7 @@ $(eval $(call KernelPackage,usb-dwc3))
|
||||
|
||||
define KernelPackage/usb-dwc3-qcom
|
||||
TITLE:=DWC3 Qualcomm USB driver
|
||||
DEPENDS:=@(TARGET_ipq40xx||TARGET_ipq806x||TARGET_qualcommax) +kmod-usb-dwc3
|
||||
DEPENDS:=@(TARGET_ipq40xx||TARGET_ipq806x||TARGET_qualcommax||TARGET_qualcommbe) +kmod-usb-dwc3
|
||||
KCONFIG:= CONFIG_USB_DWC3_QCOM
|
||||
FILES:= $(LINUX_DIR)/drivers/usb/dwc3/dwc3-qcom.ko
|
||||
AUTOLOAD:=$(call AutoLoad,53,dwc3-qcom,1)
|
||||
|
@ -1,18 +0,0 @@
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
ARCH:=aarch64
|
||||
BOARD:=ipq95xx
|
||||
BOARDNAME:=Qualcomm Atheros IPQ95XX
|
||||
FEATURES:=squashfs fpu ramdisk nand pcie
|
||||
CPU_TYPE:=cortex-a73
|
||||
SUBTARGETS:=generic
|
||||
|
||||
KERNELNAME:=Image dtbs
|
||||
KERNEL_PATCHVER:=6.1
|
||||
|
||||
include $(INCLUDE_DIR)/target.mk
|
||||
|
||||
DEFAULT_PACKAGES += \
|
||||
e2fsprogs uboot-envtools kmod-leds-gpio kmod-gpio-button-hotplug
|
||||
|
||||
$(eval $(call BuildTarget))
|
@ -1,3 +0,0 @@
|
||||
::sysinit:/etc/init.d/rcS S boot
|
||||
::shutdown:/etc/init.d/rcS K shutdown
|
||||
ttyMSM0::askfirst:/usr/libexec/login.sh
|
File diff suppressed because it is too large
Load Diff
@ -1,70 +0,0 @@
|
||||
# CONFIG_32BIT is not set
|
||||
CONFIG_64BIT=y
|
||||
# CONFIG_ACPI is not set
|
||||
# CONFIG_ARCH_BCM_IPROC is not set
|
||||
# CONFIG_ARCH_EXYNOS7 is not set
|
||||
CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y
|
||||
CONFIG_ARCH_HAS_HOLES_MEMORYMODEL=y
|
||||
# CONFIG_ARCH_LAYERSCAPE is not set
|
||||
CONFIG_ARCH_PHYS_ADDR_T_64BIT=y
|
||||
# CONFIG_ARCH_SEATTLE is not set
|
||||
CONFIG_ARCH_SELECT_MEMORY_MODEL=y
|
||||
CONFIG_ARCH_SPARSEMEM_DEFAULT=y
|
||||
CONFIG_ARCH_SPARSEMEM_ENABLE=y
|
||||
# CONFIG_ARCH_SPRD is not set
|
||||
# CONFIG_ARCH_STRATIX10 is not set
|
||||
# CONFIG_ARCH_THUNDER is not set
|
||||
CONFIG_ARCH_WANT_COMPAT_IPC_PARSE_VERSION=y
|
||||
CONFIG_ARCH_WANT_FRAME_POINTERS=y
|
||||
CONFIG_ARCH_WANT_HUGE_PMD_SHARE=y
|
||||
# CONFIG_ARCH_XGENE is not set
|
||||
# CONFIG_ARCH_ZYNQMP is not set
|
||||
CONFIG_ARM64=y
|
||||
# CONFIG_ARM64_16K_PAGES is not set
|
||||
CONFIG_ARM64_4K_PAGES=y
|
||||
# CONFIG_ARM64_64K_PAGES is not set
|
||||
# CONFIG_ARM64_CRYPTO is not set
|
||||
# CONFIG_ARM64_ERRATUM_819472 is not set
|
||||
# CONFIG_ARM64_ERRATUM_824069 is not set
|
||||
# CONFIG_ARM64_ERRATUM_826319 is not set
|
||||
# CONFIG_ARM64_ERRATUM_827319 is not set
|
||||
# CONFIG_ARM64_ERRATUM_832075 is not set
|
||||
# CONFIG_ARM64_ERRATUM_843419 is not set
|
||||
# CONFIG_ARM64_ERRATUM_845719 is not set
|
||||
CONFIG_ARM64_HW_AFDBM=y
|
||||
# CONFIG_ARM64_LSE_ATOMICS is not set
|
||||
CONFIG_ARM64_PAN=y
|
||||
# CONFIG_ARM64_PTDUMP is not set
|
||||
# CONFIG_ARM64_RANDOMIZE_TEXT_OFFSET is not set
|
||||
CONFIG_ARM64_VA_BITS=39
|
||||
CONFIG_ARM64_VA_BITS_39=y
|
||||
# CONFIG_ARM64_VA_BITS_48 is not set
|
||||
# CONFIG_ARMV8_DEPRECATED is not set
|
||||
# CONFIG_CAVIUM_ERRATUM_22375 is not set
|
||||
# CONFIG_CAVIUM_ERRATUM_23154 is not set
|
||||
# CONFIG_CAVIUM_ERRATUM_27456 is not set
|
||||
# CONFIG_COMMON_CLK_VERSATILE is not set
|
||||
CONFIG_COMMON_CLK_XGENE=y
|
||||
CONFIG_COMPAT=y
|
||||
CONFIG_COMPAT_BINFMT_ELF=y
|
||||
# CONFIG_CRYPTO_MANAGER_DISABLE_TESTS is not set
|
||||
# CONFIG_DEBUG_ALIGN_RODATA is not set
|
||||
CONFIG_FRAME_WARN=2048
|
||||
# CONFIG_GPIO_XGENE is not set
|
||||
# CONFIG_HUGETLBFS is not set
|
||||
# CONFIG_I2C_CADENCE is not set
|
||||
# CONFIG_KASAN is not set
|
||||
# CONFIG_KVM is not set
|
||||
# CONFIG_NET_VENDOR_CAVIUM is not set
|
||||
# CONFIG_PCI_HISI is not set
|
||||
CONFIG_PHYS_ADDR_T_64BIT=y
|
||||
# CONFIG_PHY_XGENE is not set
|
||||
# CONFIG_POWER_RESET_XGENE is not set
|
||||
CONFIG_QCOM_SCM_64=y
|
||||
# CONFIG_RTC_DRV_EFI is not set
|
||||
CONFIG_SPARSEMEM=y
|
||||
CONFIG_SPARSEMEM_EXTREME=y
|
||||
CONFIG_SPARSEMEM_MANUAL=y
|
||||
CONFIG_SPARSEMEM_VMEMMAP=y
|
||||
CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y
|
||||
CONFIG_VIRTUALIZATION=y
|
@ -1,8 +0,0 @@
|
||||
|
||||
SUBTARGET:=generic
|
||||
BOARDNAME:=QTI IPQ95xx(64bit) based boards
|
||||
CPU_TYPE:=cortex-a73
|
||||
|
||||
define Target/Description
|
||||
Build images for IPQ95xx 64 bit system.
|
||||
endef
|
@ -1,35 +0,0 @@
|
||||
include $(TOPDIR)/rules.mk
|
||||
include $(INCLUDE_DIR)/image.mk
|
||||
|
||||
define Device/Default
|
||||
PROFILES := Default
|
||||
DTS_DIR := $(LINUX_DIR)/arch/$(LINUX_KARCH)/boot/dts/$(if $(CONFIG_TARGET_ipq95xx_generic),qcom)
|
||||
KERNEL_DEPENDS = $$(wildcard $(DTS_DIR)/$$(DEVICE_DTS).dts)
|
||||
KERNEL_LOADADDR := 0x40000000
|
||||
DEVICE_DTS = $$(SOC)-$(lastword $(subst _, ,$(1)))
|
||||
DEVICE_DTS_CONFIG := config-1
|
||||
IMAGES := sysupgrade.bin
|
||||
IMAGE/sysupgrade.bin = sysupgrade-tar | append-metadata
|
||||
IMAGE/sysupgrade.bin/squashfs :=
|
||||
endef
|
||||
|
||||
define Device/FitImage
|
||||
KERNEL_SUFFIX := -fit-uImage.itb
|
||||
KERNEL = kernel-bin | gzip | fit gzip $$(DTS_DIR)/$$(DEVICE_DTS).dtb
|
||||
KERNEL_NAME := Image
|
||||
endef
|
||||
|
||||
define Device/FitImageLzma
|
||||
KERNEL_SUFFIX := -fit-uImage.itb
|
||||
KERNEL = kernel-bin | lzma | fit lzma $$(DTS_DIR)/$$(DEVICE_DTS).dtb
|
||||
KERNEL_NAME := Image
|
||||
endef
|
||||
|
||||
include generic.mk
|
||||
|
||||
define Image/Build
|
||||
$(call Image/Build/$(1),$(1))
|
||||
dd if=$(KDIR)/root$(2).$(1) of=$(BIN_DIR)/$(IMG_PREFIX)-$(1)-root$(3).img bs=2k conv=sync
|
||||
endef
|
||||
|
||||
$(eval $(call BuildImage))
|
@ -1,27 +0,0 @@
|
||||
From d86de60f5e324034e1e917881ff0b46f2f9f00e7 Mon Sep 17 00:00:00 2001
|
||||
From: devi priya <quic_devipriy@quicinc.com>
|
||||
Date: Fri, 13 Jan 2023 20:33:05 +0530
|
||||
Subject: [PATCH 01/41] soc: qcom: smd-rpm: Add IPQ9574 compatible
|
||||
|
||||
Adding compatible string to support RPM communication over SMD for
|
||||
IPQ9574 SoC
|
||||
|
||||
Co-developed-by: Praveenkumar I <quic_ipkumar@quicinc.com>
|
||||
Signed-off-by: Praveenkumar I <quic_ipkumar@quicinc.com>
|
||||
Signed-off-by: devi priya <quic_devipriy@quicinc.com>
|
||||
Signed-off-by: Bjorn Andersson <andersson@kernel.org>
|
||||
Link: https://lore.kernel.org/r/20230113150310.29709-2-quic_devipriy@quicinc.com
|
||||
---
|
||||
drivers/soc/qcom/smd-rpm.c | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
--- a/drivers/soc/qcom/smd-rpm.c
|
||||
+++ b/drivers/soc/qcom/smd-rpm.c
|
||||
@@ -233,6 +233,7 @@ static void qcom_smd_rpm_remove(struct r
|
||||
static const struct of_device_id qcom_smd_rpm_of_match[] = {
|
||||
{ .compatible = "qcom,rpm-apq8084" },
|
||||
{ .compatible = "qcom,rpm-ipq6018" },
|
||||
+ { .compatible = "qcom,rpm-ipq9574" },
|
||||
{ .compatible = "qcom,rpm-msm8226" },
|
||||
{ .compatible = "qcom,rpm-msm8909" },
|
||||
{ .compatible = "qcom,rpm-msm8916" },
|
@ -1,122 +0,0 @@
|
||||
From 19cd9f8fc024ba70659411f00fd8c4f4a3814647 Mon Sep 17 00:00:00 2001
|
||||
From: Kathiravan T <quic_kathirav@quicinc.com>
|
||||
Date: Fri, 17 Feb 2023 14:03:04 +0530
|
||||
Subject: [PATCH 02/41] clk: qcom: apss-ipq-pll: refactor the driver to
|
||||
accommodate different PLL types
|
||||
|
||||
APSS PLL found on the IPQ8074 and IPQ6018 are of type Huayra PLL. But,
|
||||
IPQ5332 APSS PLL is of type Stromer Plus. To accommodate both these PLLs,
|
||||
refactor the driver to take the clk_alpha_pll, alpha_pll_config via driver
|
||||
data.
|
||||
|
||||
Reviewed-by: Konrad Dybcio <konrad.dybcio@linaro.org>
|
||||
Signed-off-by: Kathiravan T <quic_kathirav@quicinc.com>
|
||||
Signed-off-by: Bjorn Andersson <andersson@kernel.org>
|
||||
Link: https://lore.kernel.org/r/20230217083308.12017-2-quic_kathirav@quicinc.com
|
||||
---
|
||||
drivers/clk/qcom/apss-ipq-pll.c | 60 ++++++++++++++++++++++-----------
|
||||
1 file changed, 41 insertions(+), 19 deletions(-)
|
||||
|
||||
--- a/drivers/clk/qcom/apss-ipq-pll.c
|
||||
+++ b/drivers/clk/qcom/apss-ipq-pll.c
|
||||
@@ -8,20 +8,27 @@
|
||||
|
||||
#include "clk-alpha-pll.h"
|
||||
|
||||
-static const u8 ipq_pll_offsets[] = {
|
||||
- [PLL_OFF_L_VAL] = 0x08,
|
||||
- [PLL_OFF_ALPHA_VAL] = 0x10,
|
||||
- [PLL_OFF_USER_CTL] = 0x18,
|
||||
- [PLL_OFF_CONFIG_CTL] = 0x20,
|
||||
- [PLL_OFF_CONFIG_CTL_U] = 0x24,
|
||||
- [PLL_OFF_STATUS] = 0x28,
|
||||
- [PLL_OFF_TEST_CTL] = 0x30,
|
||||
- [PLL_OFF_TEST_CTL_U] = 0x34,
|
||||
+/*
|
||||
+ * Even though APSS PLL type is of existing one (like Huayra), its offsets
|
||||
+ * are different from the one mentioned in the clk-alpha-pll.c, since the
|
||||
+ * PLL is specific to APSS, so lets the define the same.
|
||||
+ */
|
||||
+static const u8 ipq_pll_offsets[][PLL_OFF_MAX_REGS] = {
|
||||
+ [CLK_ALPHA_PLL_TYPE_HUAYRA] = {
|
||||
+ [PLL_OFF_L_VAL] = 0x08,
|
||||
+ [PLL_OFF_ALPHA_VAL] = 0x10,
|
||||
+ [PLL_OFF_USER_CTL] = 0x18,
|
||||
+ [PLL_OFF_CONFIG_CTL] = 0x20,
|
||||
+ [PLL_OFF_CONFIG_CTL_U] = 0x24,
|
||||
+ [PLL_OFF_STATUS] = 0x28,
|
||||
+ [PLL_OFF_TEST_CTL] = 0x30,
|
||||
+ [PLL_OFF_TEST_CTL_U] = 0x34,
|
||||
+ },
|
||||
};
|
||||
|
||||
-static struct clk_alpha_pll ipq_pll = {
|
||||
+static struct clk_alpha_pll ipq_pll_huayra = {
|
||||
.offset = 0x0,
|
||||
- .regs = ipq_pll_offsets,
|
||||
+ .regs = ipq_pll_offsets[CLK_ALPHA_PLL_TYPE_HUAYRA],
|
||||
.flags = SUPPORTS_DYNAMIC_UPDATE,
|
||||
.clkr = {
|
||||
.enable_reg = 0x0,
|
||||
@@ -61,6 +68,21 @@ static const struct alpha_pll_config ipq
|
||||
.test_ctl_hi_val = 0x4000,
|
||||
};
|
||||
|
||||
+struct apss_pll_data {
|
||||
+ struct clk_alpha_pll *pll;
|
||||
+ const struct alpha_pll_config *pll_config;
|
||||
+};
|
||||
+
|
||||
+static struct apss_pll_data ipq8074_pll_data = {
|
||||
+ .pll = &ipq_pll_huayra,
|
||||
+ .pll_config = &ipq8074_pll_config,
|
||||
+};
|
||||
+
|
||||
+static struct apss_pll_data ipq6018_pll_data = {
|
||||
+ .pll = &ipq_pll_huayra,
|
||||
+ .pll_config = &ipq6018_pll_config,
|
||||
+};
|
||||
+
|
||||
static const struct regmap_config ipq_pll_regmap_config = {
|
||||
.reg_bits = 32,
|
||||
.reg_stride = 4,
|
||||
@@ -71,7 +93,7 @@ static const struct regmap_config ipq_pl
|
||||
|
||||
static int apss_ipq_pll_probe(struct platform_device *pdev)
|
||||
{
|
||||
- const struct alpha_pll_config *ipq_pll_config;
|
||||
+ const struct apss_pll_data *data;
|
||||
struct device *dev = &pdev->dev;
|
||||
struct regmap *regmap;
|
||||
void __iomem *base;
|
||||
@@ -85,23 +107,23 @@ static int apss_ipq_pll_probe(struct pla
|
||||
if (IS_ERR(regmap))
|
||||
return PTR_ERR(regmap);
|
||||
|
||||
- ipq_pll_config = of_device_get_match_data(&pdev->dev);
|
||||
- if (!ipq_pll_config)
|
||||
+ data = of_device_get_match_data(&pdev->dev);
|
||||
+ if (!data)
|
||||
return -ENODEV;
|
||||
|
||||
- clk_alpha_pll_configure(&ipq_pll, regmap, ipq_pll_config);
|
||||
+ clk_alpha_pll_configure(data->pll, regmap, data->pll_config);
|
||||
|
||||
- ret = devm_clk_register_regmap(dev, &ipq_pll.clkr);
|
||||
+ ret = devm_clk_register_regmap(dev, &data->pll->clkr);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
return devm_of_clk_add_hw_provider(dev, of_clk_hw_simple_get,
|
||||
- &ipq_pll.clkr.hw);
|
||||
+ &data->pll->clkr.hw);
|
||||
}
|
||||
|
||||
static const struct of_device_id apss_ipq_pll_match_table[] = {
|
||||
- { .compatible = "qcom,ipq6018-a53pll", .data = &ipq6018_pll_config },
|
||||
- { .compatible = "qcom,ipq8074-a53pll", .data = &ipq8074_pll_config },
|
||||
+ { .compatible = "qcom,ipq6018-a53pll", .data = &ipq6018_pll_data },
|
||||
+ { .compatible = "qcom,ipq8074-a53pll", .data = &ipq8074_pll_data },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, apss_ipq_pll_match_table);
|
@ -1,222 +0,0 @@
|
||||
From 5bd9fcb9c152a9ed0c9bb22e403d4df359faad7b Mon Sep 17 00:00:00 2001
|
||||
From: Varadarajan Narayanan <quic_varada@quicinc.com>
|
||||
Date: Tue, 7 Mar 2023 11:52:24 +0530
|
||||
Subject: [PATCH 03/41] clk: qcom: clk-alpha-pll: Add support for Stromer PLLs
|
||||
|
||||
Add programming sequence support for managing the Stromer
|
||||
PLLs.
|
||||
|
||||
Reviewed-by: Stephen Boyd <sboyd@kernel.org>
|
||||
Co-developed-by: Sricharan R <quic_srichara@quicinc.com>
|
||||
Signed-off-by: Sricharan R <quic_srichara@quicinc.com>
|
||||
Signed-off-by: Varadarajan Narayanan <quic_varada@quicinc.com>
|
||||
Signed-off-by: Kathiravan T <quic_kathirav@quicinc.com>
|
||||
Signed-off-by: Bjorn Andersson <andersson@kernel.org>
|
||||
Link: https://lore.kernel.org/r/20230307062232.4889-2-quic_kathirav@quicinc.com
|
||||
---
|
||||
drivers/clk/qcom/clk-alpha-pll.c | 128 ++++++++++++++++++++++++++++++-
|
||||
drivers/clk/qcom/clk-alpha-pll.h | 13 +++-
|
||||
2 files changed, 139 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/clk/qcom/clk-alpha-pll.c
|
||||
+++ b/drivers/clk/qcom/clk-alpha-pll.c
|
||||
@@ -1,7 +1,7 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* Copyright (c) 2015, 2018, The Linux Foundation. All rights reserved.
|
||||
- * Copyright (c) 2021, Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
+ * Copyright (c) 2021, 2023, Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
@@ -188,6 +188,18 @@ const u8 clk_alpha_pll_regs[][PLL_OFF_MA
|
||||
[PLL_OFF_CONFIG_CTL] = 0x1C,
|
||||
[PLL_OFF_STATUS] = 0x20,
|
||||
},
|
||||
+ [CLK_ALPHA_PLL_TYPE_STROMER] = {
|
||||
+ [PLL_OFF_L_VAL] = 0x08,
|
||||
+ [PLL_OFF_ALPHA_VAL] = 0x10,
|
||||
+ [PLL_OFF_ALPHA_VAL_U] = 0x14,
|
||||
+ [PLL_OFF_USER_CTL] = 0x18,
|
||||
+ [PLL_OFF_USER_CTL_U] = 0x1c,
|
||||
+ [PLL_OFF_CONFIG_CTL] = 0x20,
|
||||
+ [PLL_OFF_CONFIG_CTL_U] = 0xff,
|
||||
+ [PLL_OFF_TEST_CTL] = 0x30,
|
||||
+ [PLL_OFF_TEST_CTL_U] = 0x34,
|
||||
+ [PLL_OFF_STATUS] = 0x28,
|
||||
+ },
|
||||
};
|
||||
EXPORT_SYMBOL_GPL(clk_alpha_pll_regs);
|
||||
|
||||
@@ -199,6 +211,8 @@ EXPORT_SYMBOL_GPL(clk_alpha_pll_regs);
|
||||
#define ALPHA_BITWIDTH 32U
|
||||
#define ALPHA_SHIFT(w) min(w, ALPHA_BITWIDTH)
|
||||
|
||||
+#define ALPHA_PLL_STATUS_REG_SHIFT 8
|
||||
+
|
||||
#define PLL_HUAYRA_M_WIDTH 8
|
||||
#define PLL_HUAYRA_M_SHIFT 8
|
||||
#define PLL_HUAYRA_M_MASK 0xff
|
||||
@@ -2360,3 +2374,115 @@ const struct clk_ops clk_alpha_pll_rivia
|
||||
.round_rate = clk_rivian_evo_pll_round_rate,
|
||||
};
|
||||
EXPORT_SYMBOL_GPL(clk_alpha_pll_rivian_evo_ops);
|
||||
+
|
||||
+void clk_stromer_pll_configure(struct clk_alpha_pll *pll, struct regmap *regmap,
|
||||
+ const struct alpha_pll_config *config)
|
||||
+{
|
||||
+ u32 val, val_u, mask, mask_u;
|
||||
+
|
||||
+ regmap_write(regmap, PLL_L_VAL(pll), config->l);
|
||||
+ regmap_write(regmap, PLL_ALPHA_VAL(pll), config->alpha);
|
||||
+ regmap_write(regmap, PLL_CONFIG_CTL(pll), config->config_ctl_val);
|
||||
+
|
||||
+ if (pll_has_64bit_config(pll))
|
||||
+ regmap_write(regmap, PLL_CONFIG_CTL_U(pll),
|
||||
+ config->config_ctl_hi_val);
|
||||
+
|
||||
+ if (pll_alpha_width(pll) > 32)
|
||||
+ regmap_write(regmap, PLL_ALPHA_VAL_U(pll), config->alpha_hi);
|
||||
+
|
||||
+ val = config->main_output_mask;
|
||||
+ val |= config->aux_output_mask;
|
||||
+ val |= config->aux2_output_mask;
|
||||
+ val |= config->early_output_mask;
|
||||
+ val |= config->pre_div_val;
|
||||
+ val |= config->post_div_val;
|
||||
+ val |= config->vco_val;
|
||||
+ val |= config->alpha_en_mask;
|
||||
+ val |= config->alpha_mode_mask;
|
||||
+
|
||||
+ mask = config->main_output_mask;
|
||||
+ mask |= config->aux_output_mask;
|
||||
+ mask |= config->aux2_output_mask;
|
||||
+ mask |= config->early_output_mask;
|
||||
+ mask |= config->pre_div_mask;
|
||||
+ mask |= config->post_div_mask;
|
||||
+ mask |= config->vco_mask;
|
||||
+ mask |= config->alpha_en_mask;
|
||||
+ mask |= config->alpha_mode_mask;
|
||||
+
|
||||
+ regmap_update_bits(regmap, PLL_USER_CTL(pll), mask, val);
|
||||
+
|
||||
+ /* Stromer APSS PLL does not enable LOCK_DET by default, so enable it */
|
||||
+ val_u = config->status_val << ALPHA_PLL_STATUS_REG_SHIFT;
|
||||
+ val_u |= config->lock_det;
|
||||
+
|
||||
+ mask_u = config->status_mask;
|
||||
+ mask_u |= config->lock_det;
|
||||
+
|
||||
+ regmap_update_bits(regmap, PLL_USER_CTL_U(pll), mask_u, val_u);
|
||||
+ regmap_write(regmap, PLL_TEST_CTL(pll), config->test_ctl_val);
|
||||
+ regmap_write(regmap, PLL_TEST_CTL_U(pll), config->test_ctl_hi_val);
|
||||
+
|
||||
+ if (pll->flags & SUPPORTS_FSM_MODE)
|
||||
+ qcom_pll_set_fsm_mode(regmap, PLL_MODE(pll), 6, 0);
|
||||
+}
|
||||
+EXPORT_SYMBOL_GPL(clk_stromer_pll_configure);
|
||||
+
|
||||
+static int clk_alpha_pll_stromer_determine_rate(struct clk_hw *hw,
|
||||
+ struct clk_rate_request *req)
|
||||
+{
|
||||
+ u32 l;
|
||||
+ u64 a;
|
||||
+
|
||||
+ req->rate = alpha_pll_round_rate(req->rate, req->best_parent_rate,
|
||||
+ &l, &a, ALPHA_REG_BITWIDTH);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int clk_alpha_pll_stromer_set_rate(struct clk_hw *hw, unsigned long rate,
|
||||
+ unsigned long prate)
|
||||
+{
|
||||
+ struct clk_alpha_pll *pll = to_clk_alpha_pll(hw);
|
||||
+ int ret;
|
||||
+ u32 l;
|
||||
+ u64 a;
|
||||
+
|
||||
+ rate = alpha_pll_round_rate(rate, prate, &l, &a, ALPHA_REG_BITWIDTH);
|
||||
+
|
||||
+ regmap_write(pll->clkr.regmap, PLL_L_VAL(pll), l);
|
||||
+ regmap_write(pll->clkr.regmap, PLL_ALPHA_VAL(pll), a);
|
||||
+ regmap_write(pll->clkr.regmap, PLL_ALPHA_VAL_U(pll),
|
||||
+ a >> ALPHA_BITWIDTH);
|
||||
+
|
||||
+ regmap_update_bits(pll->clkr.regmap, PLL_USER_CTL(pll),
|
||||
+ PLL_ALPHA_EN, PLL_ALPHA_EN);
|
||||
+
|
||||
+ if (!clk_hw_is_enabled(hw))
|
||||
+ return 0;
|
||||
+
|
||||
+ /*
|
||||
+ * Stromer PLL supports Dynamic programming.
|
||||
+ * It allows the PLL frequency to be changed on-the-fly without first
|
||||
+ * execution of a shutdown procedure followed by a bring up procedure.
|
||||
+ */
|
||||
+ regmap_update_bits(pll->clkr.regmap, PLL_MODE(pll), PLL_UPDATE,
|
||||
+ PLL_UPDATE);
|
||||
+
|
||||
+ ret = wait_for_pll_update(pll);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ return wait_for_pll_enable_lock(pll);
|
||||
+}
|
||||
+
|
||||
+const struct clk_ops clk_alpha_pll_stromer_ops = {
|
||||
+ .enable = clk_alpha_pll_enable,
|
||||
+ .disable = clk_alpha_pll_disable,
|
||||
+ .is_enabled = clk_alpha_pll_is_enabled,
|
||||
+ .recalc_rate = clk_alpha_pll_recalc_rate,
|
||||
+ .determine_rate = clk_alpha_pll_stromer_determine_rate,
|
||||
+ .set_rate = clk_alpha_pll_stromer_set_rate,
|
||||
+};
|
||||
+EXPORT_SYMBOL_GPL(clk_alpha_pll_stromer_ops);
|
||||
--- a/drivers/clk/qcom/clk-alpha-pll.h
|
||||
+++ b/drivers/clk/qcom/clk-alpha-pll.h
|
||||
@@ -1,5 +1,9 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
-/* Copyright (c) 2015, 2018, The Linux Foundation. All rights reserved. */
|
||||
+/*
|
||||
+ * Copyright (c) 2015, 2018, 2021 The Linux Foundation. All rights reserved.
|
||||
+ * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
+ */
|
||||
+
|
||||
|
||||
#ifndef __QCOM_CLK_ALPHA_PLL_H__
|
||||
#define __QCOM_CLK_ALPHA_PLL_H__
|
||||
@@ -21,6 +25,7 @@ enum {
|
||||
CLK_ALPHA_PLL_TYPE_RIVIAN_EVO,
|
||||
CLK_ALPHA_PLL_TYPE_DEFAULT_EVO,
|
||||
CLK_ALPHA_PLL_TYPE_BRAMMO_EVO,
|
||||
+ CLK_ALPHA_PLL_TYPE_STROMER,
|
||||
CLK_ALPHA_PLL_TYPE_MAX,
|
||||
};
|
||||
|
||||
@@ -128,6 +133,9 @@ struct alpha_pll_config {
|
||||
u32 post_div_mask;
|
||||
u32 vco_val;
|
||||
u32 vco_mask;
|
||||
+ u32 status_val;
|
||||
+ u32 status_mask;
|
||||
+ u32 lock_det;
|
||||
};
|
||||
|
||||
extern const struct clk_ops clk_alpha_pll_ops;
|
||||
@@ -136,6 +144,7 @@ extern const struct clk_ops clk_alpha_pl
|
||||
extern const struct clk_ops clk_alpha_pll_postdiv_ops;
|
||||
extern const struct clk_ops clk_alpha_pll_huayra_ops;
|
||||
extern const struct clk_ops clk_alpha_pll_postdiv_ro_ops;
|
||||
+extern const struct clk_ops clk_alpha_pll_stromer_ops;
|
||||
|
||||
extern const struct clk_ops clk_alpha_pll_fabia_ops;
|
||||
extern const struct clk_ops clk_alpha_pll_fixed_fabia_ops;
|
||||
@@ -184,5 +193,7 @@ void clk_lucid_evo_pll_configure(struct
|
||||
const struct alpha_pll_config *config);
|
||||
void clk_rivian_evo_pll_configure(struct clk_alpha_pll *pll, struct regmap *regmap,
|
||||
const struct alpha_pll_config *config);
|
||||
+void clk_stromer_pll_configure(struct clk_alpha_pll *pll, struct regmap *regmap,
|
||||
+ const struct alpha_pll_config *config);
|
||||
|
||||
#endif
|
@ -1,33 +0,0 @@
|
||||
From d1429c2349b80274255a676404d15bb2e25fa4b9 Mon Sep 17 00:00:00 2001
|
||||
From: Varadarajan Narayanan <quic_varada@quicinc.com>
|
||||
Date: Tue, 14 Mar 2023 11:43:34 +0530
|
||||
Subject: [PATCH 04/41] soc: qcom: socinfo: Add IDs for IPQ9574 and its
|
||||
variants
|
||||
|
||||
Add SOC ID for Qualcomm IPQ9574, IPQ9570, IPQ9554, IPQ9550,
|
||||
IPQ9514 and IPQ9510
|
||||
|
||||
Signed-off-by: Varadarajan Narayanan <quic_varada@quicinc.com>
|
||||
Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
|
||||
Reviewed-by: Kathiravan T <quic_kathirav@quicinc.com>
|
||||
Signed-off-by: Bjorn Andersson <andersson@kernel.org>
|
||||
Link: https://lore.kernel.org/r/1678774414-14414-3-git-send-email-quic_varada@quicinc.com
|
||||
---
|
||||
drivers/soc/qcom/socinfo.c | 6 ++++++
|
||||
1 file changed, 6 insertions(+)
|
||||
|
||||
--- a/drivers/soc/qcom/socinfo.c
|
||||
+++ b/drivers/soc/qcom/socinfo.c
|
||||
@@ -280,6 +280,12 @@ static const struct soc_id soc_id[] = {
|
||||
{ 487, "SC7280" },
|
||||
{ 495, "SC7180P" },
|
||||
{ 507, "SM6375" },
|
||||
+ { 510, "IPQ9514" },
|
||||
+ { 511, "IPQ9550" },
|
||||
+ { 512, "IPQ9554" },
|
||||
+ { 513, "IPQ9570" },
|
||||
+ { 514, "IPQ9574" },
|
||||
+ { 521, "IPQ9510" },
|
||||
};
|
||||
|
||||
static const char *socinfo_machine(struct device *dev, unsigned int id)
|
@ -1,393 +0,0 @@
|
||||
From 036302b2ff40f3922ce839b44c4c731cb52d8766 Mon Sep 17 00:00:00 2001
|
||||
From: Devi Priya <quic_devipriy@quicinc.com>
|
||||
Date: Thu, 16 Mar 2023 12:59:39 +0530
|
||||
Subject: [PATCH 05/41] arm64: dts: qcom: Add ipq9574 SoC and AL02 board
|
||||
support
|
||||
|
||||
Add initial device tree support for Qualcomm IPQ9574 SoC and AL02 board
|
||||
|
||||
Co-developed-by: Anusha Rao <quic_anusha@quicinc.com>
|
||||
Signed-off-by: Anusha Rao <quic_anusha@quicinc.com>
|
||||
Co-developed-by: Poovendhan Selvaraj <quic_poovendh@quicinc.com>
|
||||
Signed-off-by: Poovendhan Selvaraj <quic_poovendh@quicinc.com>
|
||||
Signed-off-by: Devi Priya <quic_devipriy@quicinc.com>
|
||||
Signed-off-by: Bjorn Andersson <andersson@kernel.org>
|
||||
Link: https://lore.kernel.org/r/20230316072940.29137-6-quic_devipriy@quicinc.com
|
||||
---
|
||||
arch/arm64/boot/dts/qcom/Makefile | 1 +
|
||||
arch/arm64/boot/dts/qcom/ipq9574-al02-c7.dts | 84 ++++++
|
||||
arch/arm64/boot/dts/qcom/ipq9574.dtsi | 270 +++++++++++++++++++
|
||||
3 files changed, 355 insertions(+)
|
||||
create mode 100644 arch/arm64/boot/dts/qcom/ipq9574-al02-c7.dts
|
||||
create mode 100644 arch/arm64/boot/dts/qcom/ipq9574.dtsi
|
||||
|
||||
--- a/arch/arm64/boot/dts/qcom/Makefile
|
||||
+++ b/arch/arm64/boot/dts/qcom/Makefile
|
||||
@@ -7,6 +7,7 @@ dtb-$(CONFIG_ARCH_QCOM) += ipq6018-cp01-
|
||||
dtb-$(CONFIG_ARCH_QCOM) += ipq8074-hk01.dtb
|
||||
dtb-$(CONFIG_ARCH_QCOM) += ipq8074-hk10-c1.dtb
|
||||
dtb-$(CONFIG_ARCH_QCOM) += ipq8074-hk10-c2.dtb
|
||||
+dtb-$(CONFIG_ARCH_QCOM) += ipq9574-al02-c7.dtb
|
||||
dtb-$(CONFIG_ARCH_QCOM) += msm8916-alcatel-idol347.dtb
|
||||
dtb-$(CONFIG_ARCH_QCOM) += msm8916-asus-z00l.dtb
|
||||
dtb-$(CONFIG_ARCH_QCOM) += msm8916-huawei-g7.dtb
|
||||
--- /dev/null
|
||||
+++ b/arch/arm64/boot/dts/qcom/ipq9574-al02-c7.dts
|
||||
@@ -0,0 +1,84 @@
|
||||
+// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)
|
||||
+/*
|
||||
+ * IPQ9574 AL02-C7 board device tree source
|
||||
+ *
|
||||
+ * Copyright (c) 2020-2021 The Linux Foundation. All rights reserved.
|
||||
+ * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
+ */
|
||||
+
|
||||
+/dts-v1/;
|
||||
+
|
||||
+#include "ipq9574.dtsi"
|
||||
+
|
||||
+/ {
|
||||
+ model = "Qualcomm Technologies, Inc. IPQ9574/AP-AL02-C7";
|
||||
+ compatible = "qcom,ipq9574-ap-al02-c7", "qcom,ipq9574";
|
||||
+
|
||||
+ aliases {
|
||||
+ serial0 = &blsp1_uart2;
|
||||
+ };
|
||||
+
|
||||
+ chosen {
|
||||
+ stdout-path = "serial0:115200n8";
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&blsp1_uart2 {
|
||||
+ pinctrl-0 = <&uart2_pins>;
|
||||
+ pinctrl-names = "default";
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&sdhc_1 {
|
||||
+ pinctrl-0 = <&sdc_default_state>;
|
||||
+ pinctrl-names = "default";
|
||||
+ mmc-ddr-1_8v;
|
||||
+ mmc-hs200-1_8v;
|
||||
+ mmc-hs400-1_8v;
|
||||
+ mmc-hs400-enhanced-strobe;
|
||||
+ max-frequency = <384000000>;
|
||||
+ bus-width = <8>;
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&sleep_clk {
|
||||
+ clock-frequency = <32000>;
|
||||
+};
|
||||
+
|
||||
+&tlmm {
|
||||
+ sdc_default_state: sdc-default-state {
|
||||
+ clk-pins {
|
||||
+ pins = "gpio5";
|
||||
+ function = "sdc_clk";
|
||||
+ drive-strength = <8>;
|
||||
+ bias-disable;
|
||||
+ };
|
||||
+
|
||||
+ cmd-pins {
|
||||
+ pins = "gpio4";
|
||||
+ function = "sdc_cmd";
|
||||
+ drive-strength = <8>;
|
||||
+ bias-pull-up;
|
||||
+ };
|
||||
+
|
||||
+ data-pins {
|
||||
+ pins = "gpio0", "gpio1", "gpio2",
|
||||
+ "gpio3", "gpio6", "gpio7",
|
||||
+ "gpio8", "gpio9";
|
||||
+ function = "sdc_data";
|
||||
+ drive-strength = <8>;
|
||||
+ bias-pull-up;
|
||||
+ };
|
||||
+
|
||||
+ rclk-pins {
|
||||
+ pins = "gpio10";
|
||||
+ function = "sdc_rclk";
|
||||
+ drive-strength = <8>;
|
||||
+ bias-pull-down;
|
||||
+ };
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&xo_board_clk {
|
||||
+ clock-frequency = <24000000>;
|
||||
+};
|
||||
--- /dev/null
|
||||
+++ b/arch/arm64/boot/dts/qcom/ipq9574.dtsi
|
||||
@@ -0,0 +1,270 @@
|
||||
+// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)
|
||||
+/*
|
||||
+ * IPQ9574 SoC device tree source
|
||||
+ *
|
||||
+ * Copyright (c) 2020-2021 The Linux Foundation. All rights reserved.
|
||||
+ * Copyright (c) 2023, Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
+ */
|
||||
+
|
||||
+#include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||
+#include <dt-bindings/clock/qcom,ipq9574-gcc.h>
|
||||
+#include <dt-bindings/reset/qcom,ipq9574-gcc.h>
|
||||
+
|
||||
+/ {
|
||||
+ interrupt-parent = <&intc>;
|
||||
+ #address-cells = <2>;
|
||||
+ #size-cells = <2>;
|
||||
+
|
||||
+ clocks {
|
||||
+ bias_pll_ubi_nc_clk: bias-pll-ubi-nc-clk {
|
||||
+ compatible = "fixed-clock";
|
||||
+ clock-frequency = <353000000>;
|
||||
+ #clock-cells = <0>;
|
||||
+ };
|
||||
+
|
||||
+ sleep_clk: sleep-clk {
|
||||
+ compatible = "fixed-clock";
|
||||
+ #clock-cells = <0>;
|
||||
+ };
|
||||
+
|
||||
+ xo_board_clk: xo-board-clk {
|
||||
+ compatible = "fixed-clock";
|
||||
+ #clock-cells = <0>;
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ cpus {
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+
|
||||
+ CPU0: cpu@0 {
|
||||
+ device_type = "cpu";
|
||||
+ compatible = "arm,cortex-a73";
|
||||
+ reg = <0x0>;
|
||||
+ enable-method = "psci";
|
||||
+ next-level-cache = <&L2_0>;
|
||||
+ };
|
||||
+
|
||||
+ CPU1: cpu@1 {
|
||||
+ device_type = "cpu";
|
||||
+ compatible = "arm,cortex-a73";
|
||||
+ reg = <0x1>;
|
||||
+ enable-method = "psci";
|
||||
+ next-level-cache = <&L2_0>;
|
||||
+ };
|
||||
+
|
||||
+ CPU2: cpu@2 {
|
||||
+ device_type = "cpu";
|
||||
+ compatible = "arm,cortex-a73";
|
||||
+ reg = <0x2>;
|
||||
+ enable-method = "psci";
|
||||
+ next-level-cache = <&L2_0>;
|
||||
+ };
|
||||
+
|
||||
+ CPU3: cpu@3 {
|
||||
+ device_type = "cpu";
|
||||
+ compatible = "arm,cortex-a73";
|
||||
+ reg = <0x3>;
|
||||
+ enable-method = "psci";
|
||||
+ next-level-cache = <&L2_0>;
|
||||
+ };
|
||||
+
|
||||
+ L2_0: l2-cache {
|
||||
+ compatible = "cache";
|
||||
+ cache-level = <2>;
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ memory@40000000 {
|
||||
+ device_type = "memory";
|
||||
+ /* We expect the bootloader to fill in the size */
|
||||
+ reg = <0x0 0x40000000 0x0 0x0>;
|
||||
+ };
|
||||
+
|
||||
+ pmu {
|
||||
+ compatible = "arm,cortex-a73-pmu";
|
||||
+ interrupts = <GIC_PPI 7 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_HIGH)>;
|
||||
+ };
|
||||
+
|
||||
+ psci {
|
||||
+ compatible = "arm,psci-1.0";
|
||||
+ method = "smc";
|
||||
+ };
|
||||
+
|
||||
+ reserved-memory {
|
||||
+ #address-cells = <2>;
|
||||
+ #size-cells = <2>;
|
||||
+ ranges;
|
||||
+
|
||||
+ tz_region: tz@4a600000 {
|
||||
+ reg = <0x0 0x4a600000 0x0 0x400000>;
|
||||
+ no-map;
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ soc: soc@0 {
|
||||
+ compatible = "simple-bus";
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <1>;
|
||||
+ ranges = <0 0 0 0xffffffff>;
|
||||
+
|
||||
+ tlmm: pinctrl@1000000 {
|
||||
+ compatible = "qcom,ipq9574-tlmm";
|
||||
+ reg = <0x01000000 0x300000>;
|
||||
+ interrupts = <GIC_SPI 208 IRQ_TYPE_LEVEL_HIGH>;
|
||||
+ gpio-controller;
|
||||
+ #gpio-cells = <2>;
|
||||
+ gpio-ranges = <&tlmm 0 0 65>;
|
||||
+ interrupt-controller;
|
||||
+ #interrupt-cells = <2>;
|
||||
+
|
||||
+ uart2_pins: uart2-state {
|
||||
+ pins = "gpio34", "gpio35";
|
||||
+ function = "blsp2_uart";
|
||||
+ drive-strength = <8>;
|
||||
+ bias-disable;
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ gcc: clock-controller@1800000 {
|
||||
+ compatible = "qcom,ipq9574-gcc";
|
||||
+ reg = <0x01800000 0x80000>;
|
||||
+ clocks = <&xo_board_clk>,
|
||||
+ <&sleep_clk>,
|
||||
+ <&bias_pll_ubi_nc_clk>,
|
||||
+ <0>,
|
||||
+ <0>,
|
||||
+ <0>,
|
||||
+ <0>,
|
||||
+ <0>;
|
||||
+ #clock-cells = <1>;
|
||||
+ #reset-cells = <1>;
|
||||
+ #power-domain-cells = <1>;
|
||||
+ };
|
||||
+
|
||||
+ sdhc_1: mmc@7804000 {
|
||||
+ compatible = "qcom,ipq9574-sdhci", "qcom,sdhci-msm-v5";
|
||||
+ reg = <0x07804000 0x1000>, <0x07805000 0x1000>;
|
||||
+ reg-names = "hc", "cqhci";
|
||||
+
|
||||
+ interrupts = <GIC_SPI 123 IRQ_TYPE_LEVEL_HIGH>,
|
||||
+ <GIC_SPI 138 IRQ_TYPE_LEVEL_HIGH>;
|
||||
+ interrupt-names = "hc_irq", "pwr_irq";
|
||||
+
|
||||
+ clocks = <&gcc GCC_SDCC1_AHB_CLK>,
|
||||
+ <&gcc GCC_SDCC1_APPS_CLK>,
|
||||
+ <&xo_board_clk>;
|
||||
+ clock-names = "iface", "core", "xo";
|
||||
+ non-removable;
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
+
|
||||
+ blsp1_uart2: serial@78b1000 {
|
||||
+ compatible = "qcom,msm-uartdm-v1.4", "qcom,msm-uartdm";
|
||||
+ reg = <0x078b1000 0x200>;
|
||||
+ interrupts = <GIC_SPI 306 IRQ_TYPE_LEVEL_HIGH>;
|
||||
+ clocks = <&gcc GCC_BLSP1_UART3_APPS_CLK>,
|
||||
+ <&gcc GCC_BLSP1_AHB_CLK>;
|
||||
+ clock-names = "core", "iface";
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
+
|
||||
+ intc: interrupt-controller@b000000 {
|
||||
+ compatible = "qcom,msm-qgic2";
|
||||
+ reg = <0x0b000000 0x1000>, /* GICD */
|
||||
+ <0x0b002000 0x1000>, /* GICC */
|
||||
+ <0x0b001000 0x1000>, /* GICH */
|
||||
+ <0x0b004000 0x1000>; /* GICV */
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <1>;
|
||||
+ interrupt-controller;
|
||||
+ #interrupt-cells = <3>;
|
||||
+ interrupts = <GIC_PPI 9 IRQ_TYPE_LEVEL_HIGH>;
|
||||
+ ranges = <0 0x0b00c000 0x3000>;
|
||||
+
|
||||
+ v2m0: v2m@0 {
|
||||
+ compatible = "arm,gic-v2m-frame";
|
||||
+ reg = <0x00000000 0xffd>;
|
||||
+ msi-controller;
|
||||
+ };
|
||||
+
|
||||
+ v2m1: v2m@1000 {
|
||||
+ compatible = "arm,gic-v2m-frame";
|
||||
+ reg = <0x00001000 0xffd>;
|
||||
+ msi-controller;
|
||||
+ };
|
||||
+
|
||||
+ v2m2: v2m@2000 {
|
||||
+ compatible = "arm,gic-v2m-frame";
|
||||
+ reg = <0x00002000 0xffd>;
|
||||
+ msi-controller;
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ timer@b120000 {
|
||||
+ compatible = "arm,armv7-timer-mem";
|
||||
+ reg = <0x0b120000 0x1000>;
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <1>;
|
||||
+ ranges;
|
||||
+
|
||||
+ frame@b120000 {
|
||||
+ reg = <0x0b121000 0x1000>,
|
||||
+ <0x0b122000 0x1000>;
|
||||
+ frame-number = <0>;
|
||||
+ interrupts = <GIC_SPI 8 IRQ_TYPE_LEVEL_HIGH>,
|
||||
+ <GIC_SPI 7 IRQ_TYPE_LEVEL_HIGH>;
|
||||
+ };
|
||||
+
|
||||
+ frame@b123000 {
|
||||
+ reg = <0x0b123000 0x1000>;
|
||||
+ frame-number = <1>;
|
||||
+ interrupts = <GIC_SPI 9 IRQ_TYPE_LEVEL_HIGH>;
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
+
|
||||
+ frame@b124000 {
|
||||
+ reg = <0x0b124000 0x1000>;
|
||||
+ frame-number = <2>;
|
||||
+ interrupts = <GIC_SPI 10 IRQ_TYPE_LEVEL_HIGH>;
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
+
|
||||
+ frame@b125000 {
|
||||
+ reg = <0x0b125000 0x1000>;
|
||||
+ frame-number = <3>;
|
||||
+ interrupts = <GIC_SPI 11 IRQ_TYPE_LEVEL_HIGH>;
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
+
|
||||
+ frame@b126000 {
|
||||
+ reg = <0x0b126000 0x1000>;
|
||||
+ frame-number = <4>;
|
||||
+ interrupts = <GIC_SPI 12 IRQ_TYPE_LEVEL_HIGH>;
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
+
|
||||
+ frame@b127000 {
|
||||
+ reg = <0x0b127000 0x1000>;
|
||||
+ frame-number = <5>;
|
||||
+ interrupts = <GIC_SPI 13 IRQ_TYPE_LEVEL_HIGH>;
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
+
|
||||
+ frame@b128000 {
|
||||
+ reg = <0x0b128000 0x1000>;
|
||||
+ frame-number = <6>;
|
||||
+ interrupts = <GIC_SPI 14 IRQ_TYPE_LEVEL_HIGH>;
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ timer {
|
||||
+ compatible = "arm,armv8-timer";
|
||||
+ interrupts = <GIC_PPI 2 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>,
|
||||
+ <GIC_PPI 3 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>,
|
||||
+ <GIC_PPI 4 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>,
|
||||
+ <GIC_PPI 1 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>;
|
||||
+ };
|
||||
+};
|
@ -1,33 +0,0 @@
|
||||
From 10899f01cc0a72a2a06b2baa2261c5b898e4a26d Mon Sep 17 00:00:00 2001
|
||||
From: Devi Priya <quic_devipriy@quicinc.com>
|
||||
Date: Thu, 16 Mar 2023 12:59:40 +0530
|
||||
Subject: [PATCH 06/41] arm64: defconfig: Enable IPQ9574 SoC base configs
|
||||
|
||||
Enables clk & pinctrl related configs for Qualcomm IPQ9574 SoC
|
||||
|
||||
Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
|
||||
Signed-off-by: Devi Priya <quic_devipriy@quicinc.com>
|
||||
Signed-off-by: Bjorn Andersson <andersson@kernel.org>
|
||||
Link: https://lore.kernel.org/r/20230316072940.29137-7-quic_devipriy@quicinc.com
|
||||
---
|
||||
arch/arm64/configs/defconfig | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
--- a/arch/arm64/configs/defconfig
|
||||
+++ b/arch/arm64/configs/defconfig
|
||||
@@ -537,6 +537,7 @@ CONFIG_PINCTRL_IMX93=y
|
||||
CONFIG_PINCTRL_MSM=y
|
||||
CONFIG_PINCTRL_IPQ8074=y
|
||||
CONFIG_PINCTRL_IPQ6018=y
|
||||
+CONFIG_PINCTRL_IPQ9574=y
|
||||
CONFIG_PINCTRL_MSM8916=y
|
||||
CONFIG_PINCTRL_MSM8994=y
|
||||
CONFIG_PINCTRL_MSM8996=y
|
||||
@@ -1068,6 +1069,7 @@ CONFIG_QCOM_CLK_SMD_RPM=y
|
||||
CONFIG_QCOM_CLK_RPMH=y
|
||||
CONFIG_IPQ_GCC_6018=y
|
||||
CONFIG_IPQ_GCC_8074=y
|
||||
+CONFIG_IPQ_GCC_9574=y
|
||||
CONFIG_MSM_GCC_8916=y
|
||||
CONFIG_MSM_GCC_8994=y
|
||||
CONFIG_MSM_MMCC_8996=y
|
File diff suppressed because it is too large
Load Diff
@ -1,470 +0,0 @@
|
||||
From 471b2c31ee9c3a0ab76f9ccb6a514cb9713afd80 Mon Sep 17 00:00:00 2001
|
||||
From: Devi Priya <quic_devipriy@quicinc.com>
|
||||
Date: Thu, 16 Mar 2023 12:59:35 +0530
|
||||
Subject: [PATCH 08/41] dt-bindings: clock: Add ipq9574 clock and reset
|
||||
definitions
|
||||
|
||||
Add clock and reset ID definitions for ipq9574
|
||||
|
||||
Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
|
||||
Co-developed-by: Anusha Rao <quic_anusha@quicinc.com>
|
||||
Signed-off-by: Anusha Rao <quic_anusha@quicinc.com>
|
||||
Signed-off-by: Devi Priya <quic_devipriy@quicinc.com>
|
||||
Signed-off-by: Bjorn Andersson <andersson@kernel.org>
|
||||
Link: https://lore.kernel.org/r/20230316072940.29137-2-quic_devipriy@quicinc.com
|
||||
---
|
||||
.../bindings/clock/qcom,ipq9574-gcc.yaml | 61 +++++
|
||||
include/dt-bindings/clock/qcom,ipq9574-gcc.h | 213 ++++++++++++++++++
|
||||
include/dt-bindings/reset/qcom,ipq9574-gcc.h | 164 ++++++++++++++
|
||||
3 files changed, 438 insertions(+)
|
||||
create mode 100644 Documentation/devicetree/bindings/clock/qcom,ipq9574-gcc.yaml
|
||||
create mode 100644 include/dt-bindings/clock/qcom,ipq9574-gcc.h
|
||||
create mode 100644 include/dt-bindings/reset/qcom,ipq9574-gcc.h
|
||||
|
||||
--- /dev/null
|
||||
+++ b/Documentation/devicetree/bindings/clock/qcom,ipq9574-gcc.yaml
|
||||
@@ -0,0 +1,61 @@
|
||||
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
+%YAML 1.2
|
||||
+---
|
||||
+$id: http://devicetree.org/schemas/clock/qcom,ipq9574-gcc.yaml#
|
||||
+$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
+
|
||||
+title: Qualcomm Global Clock & Reset Controller on IPQ9574
|
||||
+
|
||||
+maintainers:
|
||||
+ - Anusha Rao <quic_anusha@quicinc.com>
|
||||
+
|
||||
+description: |
|
||||
+ Qualcomm global clock control module provides the clocks, resets and power
|
||||
+ domains on IPQ9574
|
||||
+
|
||||
+ See also::
|
||||
+ include/dt-bindings/clock/qcom,ipq9574-gcc.h
|
||||
+ include/dt-bindings/reset/qcom,ipq9574-gcc.h
|
||||
+
|
||||
+properties:
|
||||
+ compatible:
|
||||
+ const: qcom,ipq9574-gcc
|
||||
+
|
||||
+ clocks:
|
||||
+ items:
|
||||
+ - description: Board XO source
|
||||
+ - description: Sleep clock source
|
||||
+ - description: Bias PLL ubi clock source
|
||||
+ - description: PCIE30 PHY0 pipe clock source
|
||||
+ - description: PCIE30 PHY1 pipe clock source
|
||||
+ - description: PCIE30 PHY2 pipe clock source
|
||||
+ - description: PCIE30 PHY3 pipe clock source
|
||||
+ - description: USB3 PHY pipe clock source
|
||||
+
|
||||
+required:
|
||||
+ - compatible
|
||||
+ - clocks
|
||||
+
|
||||
+allOf:
|
||||
+ - $ref: qcom,gcc.yaml#
|
||||
+
|
||||
+unevaluatedProperties: false
|
||||
+
|
||||
+examples:
|
||||
+ - |
|
||||
+ clock-controller@1800000 {
|
||||
+ compatible = "qcom,ipq9574-gcc";
|
||||
+ reg = <0x01800000 0x80000>;
|
||||
+ clocks = <&xo_board_clk>,
|
||||
+ <&sleep_clk>,
|
||||
+ <&bias_pll_ubi_nc_clk>,
|
||||
+ <&pcie30_phy0_pipe_clk>,
|
||||
+ <&pcie30_phy1_pipe_clk>,
|
||||
+ <&pcie30_phy2_pipe_clk>,
|
||||
+ <&pcie30_phy3_pipe_clk>,
|
||||
+ <&usb3phy_0_cc_pipe_clk>;
|
||||
+ #clock-cells = <1>;
|
||||
+ #reset-cells = <1>;
|
||||
+ #power-domain-cells = <1>;
|
||||
+ };
|
||||
+...
|
||||
--- /dev/null
|
||||
+++ b/include/dt-bindings/clock/qcom,ipq9574-gcc.h
|
||||
@@ -0,0 +1,213 @@
|
||||
+/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
|
||||
+/*
|
||||
+ * Copyright (c) 2018-2023 The Linux Foundation. All rights reserved.
|
||||
+ */
|
||||
+
|
||||
+#ifndef _DT_BINDINGS_CLOCK_IPQ_GCC_9574_H
|
||||
+#define _DT_BINDINGS_CLOCK_IPQ_GCC_9574_H
|
||||
+
|
||||
+#define GPLL0_MAIN 0
|
||||
+#define GPLL0 1
|
||||
+#define GPLL2_MAIN 2
|
||||
+#define GPLL2 3
|
||||
+#define GPLL4_MAIN 4
|
||||
+#define GPLL4 5
|
||||
+#define GCC_SLEEP_CLK_SRC 6
|
||||
+#define APSS_AHB_CLK_SRC 7
|
||||
+#define APSS_AXI_CLK_SRC 8
|
||||
+#define BLSP1_QUP1_I2C_APPS_CLK_SRC 9
|
||||
+#define BLSP1_QUP1_SPI_APPS_CLK_SRC 10
|
||||
+#define BLSP1_QUP2_I2C_APPS_CLK_SRC 11
|
||||
+#define BLSP1_QUP2_SPI_APPS_CLK_SRC 12
|
||||
+#define BLSP1_QUP3_I2C_APPS_CLK_SRC 13
|
||||
+#define BLSP1_QUP3_SPI_APPS_CLK_SRC 14
|
||||
+#define BLSP1_QUP4_I2C_APPS_CLK_SRC 15
|
||||
+#define BLSP1_QUP4_SPI_APPS_CLK_SRC 16
|
||||
+#define BLSP1_QUP5_I2C_APPS_CLK_SRC 17
|
||||
+#define BLSP1_QUP5_SPI_APPS_CLK_SRC 18
|
||||
+#define BLSP1_QUP6_I2C_APPS_CLK_SRC 19
|
||||
+#define BLSP1_QUP6_SPI_APPS_CLK_SRC 20
|
||||
+#define BLSP1_UART1_APPS_CLK_SRC 21
|
||||
+#define BLSP1_UART2_APPS_CLK_SRC 22
|
||||
+#define BLSP1_UART3_APPS_CLK_SRC 23
|
||||
+#define BLSP1_UART4_APPS_CLK_SRC 24
|
||||
+#define BLSP1_UART5_APPS_CLK_SRC 25
|
||||
+#define BLSP1_UART6_APPS_CLK_SRC 26
|
||||
+#define GCC_APSS_AHB_CLK 27
|
||||
+#define GCC_APSS_AXI_CLK 28
|
||||
+#define GCC_BLSP1_QUP1_I2C_APPS_CLK 29
|
||||
+#define GCC_BLSP1_QUP1_SPI_APPS_CLK 30
|
||||
+#define GCC_BLSP1_QUP2_I2C_APPS_CLK 31
|
||||
+#define GCC_BLSP1_QUP2_SPI_APPS_CLK 32
|
||||
+#define GCC_BLSP1_QUP3_I2C_APPS_CLK 33
|
||||
+#define GCC_BLSP1_QUP3_SPI_APPS_CLK 34
|
||||
+#define GCC_BLSP1_QUP4_I2C_APPS_CLK 35
|
||||
+#define GCC_BLSP1_QUP4_SPI_APPS_CLK 36
|
||||
+#define GCC_BLSP1_QUP5_I2C_APPS_CLK 37
|
||||
+#define GCC_BLSP1_QUP5_SPI_APPS_CLK 38
|
||||
+#define GCC_BLSP1_QUP6_I2C_APPS_CLK 39
|
||||
+#define GCC_BLSP1_QUP6_SPI_APPS_CLK 40
|
||||
+#define GCC_BLSP1_UART1_APPS_CLK 41
|
||||
+#define GCC_BLSP1_UART2_APPS_CLK 42
|
||||
+#define GCC_BLSP1_UART3_APPS_CLK 43
|
||||
+#define GCC_BLSP1_UART4_APPS_CLK 44
|
||||
+#define GCC_BLSP1_UART5_APPS_CLK 45
|
||||
+#define GCC_BLSP1_UART6_APPS_CLK 46
|
||||
+#define PCIE0_AXI_M_CLK_SRC 47
|
||||
+#define GCC_PCIE0_AXI_M_CLK 48
|
||||
+#define PCIE1_AXI_M_CLK_SRC 49
|
||||
+#define GCC_PCIE1_AXI_M_CLK 50
|
||||
+#define PCIE2_AXI_M_CLK_SRC 51
|
||||
+#define GCC_PCIE2_AXI_M_CLK 52
|
||||
+#define PCIE3_AXI_M_CLK_SRC 53
|
||||
+#define GCC_PCIE3_AXI_M_CLK 54
|
||||
+#define PCIE0_AXI_S_CLK_SRC 55
|
||||
+#define GCC_PCIE0_AXI_S_BRIDGE_CLK 56
|
||||
+#define GCC_PCIE0_AXI_S_CLK 57
|
||||
+#define PCIE1_AXI_S_CLK_SRC 58
|
||||
+#define GCC_PCIE1_AXI_S_BRIDGE_CLK 59
|
||||
+#define GCC_PCIE1_AXI_S_CLK 60
|
||||
+#define PCIE2_AXI_S_CLK_SRC 61
|
||||
+#define GCC_PCIE2_AXI_S_BRIDGE_CLK 62
|
||||
+#define GCC_PCIE2_AXI_S_CLK 63
|
||||
+#define PCIE3_AXI_S_CLK_SRC 64
|
||||
+#define GCC_PCIE3_AXI_S_BRIDGE_CLK 65
|
||||
+#define GCC_PCIE3_AXI_S_CLK 66
|
||||
+#define PCIE0_PIPE_CLK_SRC 67
|
||||
+#define PCIE1_PIPE_CLK_SRC 68
|
||||
+#define PCIE2_PIPE_CLK_SRC 69
|
||||
+#define PCIE3_PIPE_CLK_SRC 70
|
||||
+#define PCIE_AUX_CLK_SRC 71
|
||||
+#define GCC_PCIE0_AUX_CLK 72
|
||||
+#define GCC_PCIE1_AUX_CLK 73
|
||||
+#define GCC_PCIE2_AUX_CLK 74
|
||||
+#define GCC_PCIE3_AUX_CLK 75
|
||||
+#define PCIE0_RCHNG_CLK_SRC 76
|
||||
+#define GCC_PCIE0_RCHNG_CLK 77
|
||||
+#define PCIE1_RCHNG_CLK_SRC 78
|
||||
+#define GCC_PCIE1_RCHNG_CLK 79
|
||||
+#define PCIE2_RCHNG_CLK_SRC 80
|
||||
+#define GCC_PCIE2_RCHNG_CLK 81
|
||||
+#define PCIE3_RCHNG_CLK_SRC 82
|
||||
+#define GCC_PCIE3_RCHNG_CLK 83
|
||||
+#define GCC_PCIE0_AHB_CLK 84
|
||||
+#define GCC_PCIE1_AHB_CLK 85
|
||||
+#define GCC_PCIE2_AHB_CLK 86
|
||||
+#define GCC_PCIE3_AHB_CLK 87
|
||||
+#define USB0_AUX_CLK_SRC 88
|
||||
+#define GCC_USB0_AUX_CLK 89
|
||||
+#define USB0_MASTER_CLK_SRC 90
|
||||
+#define GCC_USB0_MASTER_CLK 91
|
||||
+#define GCC_SNOC_USB_CLK 92
|
||||
+#define GCC_ANOC_USB_AXI_CLK 93
|
||||
+#define USB0_MOCK_UTMI_CLK_SRC 94
|
||||
+#define USB0_MOCK_UTMI_DIV_CLK_SRC 95
|
||||
+#define GCC_USB0_MOCK_UTMI_CLK 96
|
||||
+#define USB0_PIPE_CLK_SRC 97
|
||||
+#define GCC_USB0_PHY_CFG_AHB_CLK 98
|
||||
+#define SDCC1_APPS_CLK_SRC 99
|
||||
+#define GCC_SDCC1_APPS_CLK 100
|
||||
+#define SDCC1_ICE_CORE_CLK_SRC 101
|
||||
+#define GCC_SDCC1_ICE_CORE_CLK 102
|
||||
+#define GCC_SDCC1_AHB_CLK 103
|
||||
+#define PCNOC_BFDCD_CLK_SRC 104
|
||||
+#define GCC_NSSCFG_CLK 105
|
||||
+#define GCC_NSSNOC_NSSCC_CLK 106
|
||||
+#define GCC_NSSCC_CLK 107
|
||||
+#define GCC_NSSNOC_PCNOC_1_CLK 108
|
||||
+#define GCC_QDSS_DAP_AHB_CLK 109
|
||||
+#define GCC_QDSS_CFG_AHB_CLK 110
|
||||
+#define GCC_QPIC_AHB_CLK 111
|
||||
+#define GCC_QPIC_CLK 112
|
||||
+#define GCC_BLSP1_AHB_CLK 113
|
||||
+#define GCC_MDIO_AHB_CLK 114
|
||||
+#define GCC_PRNG_AHB_CLK 115
|
||||
+#define GCC_UNIPHY0_AHB_CLK 116
|
||||
+#define GCC_UNIPHY1_AHB_CLK 117
|
||||
+#define GCC_UNIPHY2_AHB_CLK 118
|
||||
+#define GCC_CMN_12GPLL_AHB_CLK 119
|
||||
+#define GCC_CMN_12GPLL_APU_CLK 120
|
||||
+#define SYSTEM_NOC_BFDCD_CLK_SRC 121
|
||||
+#define GCC_NSSNOC_SNOC_CLK 122
|
||||
+#define GCC_NSSNOC_SNOC_1_CLK 123
|
||||
+#define GCC_QDSS_ETR_USB_CLK 124
|
||||
+#define WCSS_AHB_CLK_SRC 125
|
||||
+#define GCC_Q6_AHB_CLK 126
|
||||
+#define GCC_Q6_AHB_S_CLK 127
|
||||
+#define GCC_WCSS_ECAHB_CLK 128
|
||||
+#define GCC_WCSS_ACMT_CLK 129
|
||||
+#define GCC_SYS_NOC_WCSS_AHB_CLK 130
|
||||
+#define WCSS_AXI_M_CLK_SRC 131
|
||||
+#define GCC_ANOC_WCSS_AXI_M_CLK 132
|
||||
+#define QDSS_AT_CLK_SRC 133
|
||||
+#define GCC_Q6SS_ATBM_CLK 134
|
||||
+#define GCC_WCSS_DBG_IFC_ATB_CLK 135
|
||||
+#define GCC_NSSNOC_ATB_CLK 136
|
||||
+#define GCC_QDSS_AT_CLK 137
|
||||
+#define GCC_SYS_NOC_AT_CLK 138
|
||||
+#define GCC_PCNOC_AT_CLK 139
|
||||
+#define GCC_USB0_EUD_AT_CLK 140
|
||||
+#define GCC_QDSS_EUD_AT_CLK 141
|
||||
+#define QDSS_STM_CLK_SRC 142
|
||||
+#define GCC_QDSS_STM_CLK 143
|
||||
+#define GCC_SYS_NOC_QDSS_STM_AXI_CLK 144
|
||||
+#define QDSS_TRACECLKIN_CLK_SRC 145
|
||||
+#define GCC_QDSS_TRACECLKIN_CLK 146
|
||||
+#define QDSS_TSCTR_CLK_SRC 147
|
||||
+#define GCC_Q6_TSCTR_1TO2_CLK 148
|
||||
+#define GCC_WCSS_DBG_IFC_NTS_CLK 149
|
||||
+#define GCC_QDSS_TSCTR_DIV2_CLK 150
|
||||
+#define GCC_QDSS_TS_CLK 151
|
||||
+#define GCC_QDSS_TSCTR_DIV4_CLK 152
|
||||
+#define GCC_NSS_TS_CLK 153
|
||||
+#define GCC_QDSS_TSCTR_DIV8_CLK 154
|
||||
+#define GCC_QDSS_TSCTR_DIV16_CLK 155
|
||||
+#define GCC_Q6SS_PCLKDBG_CLK 156
|
||||
+#define GCC_Q6SS_TRIG_CLK 157
|
||||
+#define GCC_WCSS_DBG_IFC_APB_CLK 158
|
||||
+#define GCC_WCSS_DBG_IFC_DAPBUS_CLK 159
|
||||
+#define GCC_QDSS_DAP_CLK 160
|
||||
+#define GCC_QDSS_APB2JTAG_CLK 161
|
||||
+#define GCC_QDSS_TSCTR_DIV3_CLK 162
|
||||
+#define QPIC_IO_MACRO_CLK_SRC 163
|
||||
+#define GCC_QPIC_IO_MACRO_CLK 164
|
||||
+#define Q6_AXI_CLK_SRC 165
|
||||
+#define GCC_Q6_AXIM_CLK 166
|
||||
+#define GCC_WCSS_Q6_TBU_CLK 167
|
||||
+#define GCC_MEM_NOC_Q6_AXI_CLK 168
|
||||
+#define Q6_AXIM2_CLK_SRC 169
|
||||
+#define NSSNOC_MEMNOC_BFDCD_CLK_SRC 170
|
||||
+#define GCC_NSSNOC_MEMNOC_CLK 171
|
||||
+#define GCC_NSSNOC_MEM_NOC_1_CLK 172
|
||||
+#define GCC_NSS_TBU_CLK 173
|
||||
+#define GCC_MEM_NOC_NSSNOC_CLK 174
|
||||
+#define LPASS_AXIM_CLK_SRC 175
|
||||
+#define LPASS_SWAY_CLK_SRC 176
|
||||
+#define ADSS_PWM_CLK_SRC 177
|
||||
+#define GCC_ADSS_PWM_CLK 178
|
||||
+#define GP1_CLK_SRC 179
|
||||
+#define GP2_CLK_SRC 180
|
||||
+#define GP3_CLK_SRC 181
|
||||
+#define DDRSS_SMS_SLOW_CLK_SRC 182
|
||||
+#define GCC_XO_CLK_SRC 183
|
||||
+#define GCC_XO_CLK 184
|
||||
+#define GCC_NSSNOC_QOSGEN_REF_CLK 185
|
||||
+#define GCC_NSSNOC_TIMEOUT_REF_CLK 186
|
||||
+#define GCC_XO_DIV4_CLK 187
|
||||
+#define GCC_UNIPHY0_SYS_CLK 188
|
||||
+#define GCC_UNIPHY1_SYS_CLK 189
|
||||
+#define GCC_UNIPHY2_SYS_CLK 190
|
||||
+#define GCC_CMN_12GPLL_SYS_CLK 191
|
||||
+#define GCC_NSSNOC_XO_DCD_CLK 192
|
||||
+#define GCC_Q6SS_BOOT_CLK 193
|
||||
+#define UNIPHY_SYS_CLK_SRC 194
|
||||
+#define NSS_TS_CLK_SRC 195
|
||||
+#define GCC_ANOC_PCIE0_1LANE_M_CLK 196
|
||||
+#define GCC_ANOC_PCIE1_1LANE_M_CLK 197
|
||||
+#define GCC_ANOC_PCIE2_2LANE_M_CLK 198
|
||||
+#define GCC_ANOC_PCIE3_2LANE_M_CLK 199
|
||||
+#define GCC_SNOC_PCIE0_1LANE_S_CLK 200
|
||||
+#define GCC_SNOC_PCIE1_1LANE_S_CLK 201
|
||||
+#define GCC_SNOC_PCIE2_2LANE_S_CLK 202
|
||||
+#define GCC_SNOC_PCIE3_2LANE_S_CLK 203
|
||||
+#endif
|
||||
--- /dev/null
|
||||
+++ b/include/dt-bindings/reset/qcom,ipq9574-gcc.h
|
||||
@@ -0,0 +1,164 @@
|
||||
+/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
|
||||
+/*
|
||||
+ * Copyright (c) 2018-2023, The Linux Foundation. All rights reserved.
|
||||
+ */
|
||||
+
|
||||
+#ifndef _DT_BINDINGS_RESET_IPQ_GCC_9574_H
|
||||
+#define _DT_BINDINGS_RESET_IPQ_GCC_9574_H
|
||||
+
|
||||
+#define GCC_ADSS_BCR 0
|
||||
+#define GCC_APC0_VOLTAGE_DROOP_DETECTOR_BCR 1
|
||||
+#define GCC_BLSP1_BCR 2
|
||||
+#define GCC_BLSP1_QUP1_BCR 3
|
||||
+#define GCC_BLSP1_QUP2_BCR 4
|
||||
+#define GCC_BLSP1_QUP3_BCR 5
|
||||
+#define GCC_BLSP1_QUP4_BCR 6
|
||||
+#define GCC_BLSP1_QUP5_BCR 7
|
||||
+#define GCC_BLSP1_QUP6_BCR 8
|
||||
+#define GCC_BLSP1_UART1_BCR 9
|
||||
+#define GCC_BLSP1_UART2_BCR 10
|
||||
+#define GCC_BLSP1_UART3_BCR 11
|
||||
+#define GCC_BLSP1_UART4_BCR 12
|
||||
+#define GCC_BLSP1_UART5_BCR 13
|
||||
+#define GCC_BLSP1_UART6_BCR 14
|
||||
+#define GCC_BOOT_ROM_BCR 15
|
||||
+#define GCC_MDIO_BCR 16
|
||||
+#define GCC_NSS_BCR 17
|
||||
+#define GCC_NSS_TBU_BCR 18
|
||||
+#define GCC_PCIE0_BCR 19
|
||||
+#define GCC_PCIE0_LINK_DOWN_BCR 20
|
||||
+#define GCC_PCIE0_PHY_BCR 21
|
||||
+#define GCC_PCIE0PHY_PHY_BCR 22
|
||||
+#define GCC_PCIE1_BCR 23
|
||||
+#define GCC_PCIE1_LINK_DOWN_BCR 24
|
||||
+#define GCC_PCIE1_PHY_BCR 25
|
||||
+#define GCC_PCIE1PHY_PHY_BCR 26
|
||||
+#define GCC_PCIE2_BCR 27
|
||||
+#define GCC_PCIE2_LINK_DOWN_BCR 28
|
||||
+#define GCC_PCIE2_PHY_BCR 29
|
||||
+#define GCC_PCIE2PHY_PHY_BCR 30
|
||||
+#define GCC_PCIE3_BCR 31
|
||||
+#define GCC_PCIE3_LINK_DOWN_BCR 32
|
||||
+#define GCC_PCIE3_PHY_BCR 33
|
||||
+#define GCC_PCIE3PHY_PHY_BCR 34
|
||||
+#define GCC_PRNG_BCR 35
|
||||
+#define GCC_QUSB2_0_PHY_BCR 36
|
||||
+#define GCC_SDCC_BCR 37
|
||||
+#define GCC_TLMM_BCR 38
|
||||
+#define GCC_UNIPHY0_BCR 39
|
||||
+#define GCC_UNIPHY1_BCR 40
|
||||
+#define GCC_UNIPHY2_BCR 41
|
||||
+#define GCC_USB0_PHY_BCR 42
|
||||
+#define GCC_USB3PHY_0_PHY_BCR 43
|
||||
+#define GCC_USB_BCR 44
|
||||
+#define GCC_ANOC0_TBU_BCR 45
|
||||
+#define GCC_ANOC1_TBU_BCR 46
|
||||
+#define GCC_ANOC_BCR 47
|
||||
+#define GCC_APSS_TCU_BCR 48
|
||||
+#define GCC_CMN_BLK_BCR 49
|
||||
+#define GCC_CMN_BLK_AHB_ARES 50
|
||||
+#define GCC_CMN_BLK_SYS_ARES 51
|
||||
+#define GCC_CMN_BLK_APU_ARES 52
|
||||
+#define GCC_DCC_BCR 53
|
||||
+#define GCC_DDRSS_BCR 54
|
||||
+#define GCC_IMEM_BCR 55
|
||||
+#define GCC_LPASS_BCR 56
|
||||
+#define GCC_MPM_BCR 57
|
||||
+#define GCC_MSG_RAM_BCR 58
|
||||
+#define GCC_NSSNOC_MEMNOC_1_ARES 59
|
||||
+#define GCC_NSSNOC_PCNOC_1_ARES 60
|
||||
+#define GCC_NSSNOC_SNOC_1_ARES 61
|
||||
+#define GCC_NSSNOC_XO_DCD_ARES 62
|
||||
+#define GCC_NSSNOC_TS_ARES 63
|
||||
+#define GCC_NSSCC_ARES 64
|
||||
+#define GCC_NSSNOC_NSSCC_ARES 65
|
||||
+#define GCC_NSSNOC_ATB_ARES 66
|
||||
+#define GCC_NSSNOC_MEMNOC_ARES 67
|
||||
+#define GCC_NSSNOC_QOSGEN_REF_ARES 68
|
||||
+#define GCC_NSSNOC_SNOC_ARES 69
|
||||
+#define GCC_NSSNOC_TIMEOUT_REF_ARES 70
|
||||
+#define GCC_NSS_CFG_ARES 71
|
||||
+#define GCC_UBI0_DBG_ARES 72
|
||||
+#define GCC_PCIE0_AHB_ARES 73
|
||||
+#define GCC_PCIE0_AUX_ARES 74
|
||||
+#define GCC_PCIE0_AXI_M_ARES 75
|
||||
+#define GCC_PCIE0_AXI_M_STICKY_ARES 76
|
||||
+#define GCC_PCIE0_AXI_S_ARES 77
|
||||
+#define GCC_PCIE0_AXI_S_STICKY_ARES 78
|
||||
+#define GCC_PCIE0_CORE_STICKY_ARES 79
|
||||
+#define GCC_PCIE0_PIPE_ARES 80
|
||||
+#define GCC_PCIE1_AHB_ARES 81
|
||||
+#define GCC_PCIE1_AUX_ARES 82
|
||||
+#define GCC_PCIE1_AXI_M_ARES 83
|
||||
+#define GCC_PCIE1_AXI_M_STICKY_ARES 84
|
||||
+#define GCC_PCIE1_AXI_S_ARES 85
|
||||
+#define GCC_PCIE1_AXI_S_STICKY_ARES 86
|
||||
+#define GCC_PCIE1_CORE_STICKY_ARES 87
|
||||
+#define GCC_PCIE1_PIPE_ARES 88
|
||||
+#define GCC_PCIE2_AHB_ARES 89
|
||||
+#define GCC_PCIE2_AUX_ARES 90
|
||||
+#define GCC_PCIE2_AXI_M_ARES 91
|
||||
+#define GCC_PCIE2_AXI_M_STICKY_ARES 92
|
||||
+#define GCC_PCIE2_AXI_S_ARES 93
|
||||
+#define GCC_PCIE2_AXI_S_STICKY_ARES 94
|
||||
+#define GCC_PCIE2_CORE_STICKY_ARES 95
|
||||
+#define GCC_PCIE2_PIPE_ARES 96
|
||||
+#define GCC_PCIE3_AHB_ARES 97
|
||||
+#define GCC_PCIE3_AUX_ARES 98
|
||||
+#define GCC_PCIE3_AXI_M_ARES 99
|
||||
+#define GCC_PCIE3_AXI_M_STICKY_ARES 100
|
||||
+#define GCC_PCIE3_AXI_S_ARES 101
|
||||
+#define GCC_PCIE3_AXI_S_STICKY_ARES 102
|
||||
+#define GCC_PCIE3_CORE_STICKY_ARES 103
|
||||
+#define GCC_PCIE3_PIPE_ARES 104
|
||||
+#define GCC_PCNOC_BCR 105
|
||||
+#define GCC_PCNOC_BUS_TIMEOUT0_BCR 106
|
||||
+#define GCC_PCNOC_BUS_TIMEOUT1_BCR 107
|
||||
+#define GCC_PCNOC_BUS_TIMEOUT2_BCR 108
|
||||
+#define GCC_PCNOC_BUS_TIMEOUT3_BCR 109
|
||||
+#define GCC_PCNOC_BUS_TIMEOUT4_BCR 110
|
||||
+#define GCC_PCNOC_BUS_TIMEOUT5_BCR 111
|
||||
+#define GCC_PCNOC_BUS_TIMEOUT6_BCR 112
|
||||
+#define GCC_PCNOC_BUS_TIMEOUT7_BCR 113
|
||||
+#define GCC_PCNOC_BUS_TIMEOUT8_BCR 114
|
||||
+#define GCC_PCNOC_BUS_TIMEOUT9_BCR 115
|
||||
+#define GCC_PCNOC_TBU_BCR 116
|
||||
+#define GCC_Q6SS_DBG_ARES 117
|
||||
+#define GCC_Q6_AHB_ARES 118
|
||||
+#define GCC_Q6_AHB_S_ARES 119
|
||||
+#define GCC_Q6_AXIM2_ARES 120
|
||||
+#define GCC_Q6_AXIM_ARES 121
|
||||
+#define GCC_QDSS_BCR 122
|
||||
+#define GCC_QPIC_BCR 123
|
||||
+#define GCC_QPIC_AHB_ARES 124
|
||||
+#define GCC_QPIC_ARES 125
|
||||
+#define GCC_RBCPR_BCR 126
|
||||
+#define GCC_RBCPR_MX_BCR 127
|
||||
+#define GCC_SEC_CTRL_BCR 128
|
||||
+#define GCC_SMMU_CFG_BCR 129
|
||||
+#define GCC_SNOC_BCR 130
|
||||
+#define GCC_SPDM_BCR 131
|
||||
+#define GCC_TME_BCR 132
|
||||
+#define GCC_UNIPHY0_SYS_RESET 133
|
||||
+#define GCC_UNIPHY0_AHB_RESET 134
|
||||
+#define GCC_UNIPHY0_XPCS_RESET 135
|
||||
+#define GCC_UNIPHY1_SYS_RESET 136
|
||||
+#define GCC_UNIPHY1_AHB_RESET 137
|
||||
+#define GCC_UNIPHY1_XPCS_RESET 138
|
||||
+#define GCC_UNIPHY2_SYS_RESET 139
|
||||
+#define GCC_UNIPHY2_AHB_RESET 140
|
||||
+#define GCC_UNIPHY2_XPCS_RESET 141
|
||||
+#define GCC_USB_MISC_RESET 142
|
||||
+#define GCC_WCSSAON_RESET 143
|
||||
+#define GCC_WCSS_ACMT_ARES 144
|
||||
+#define GCC_WCSS_AHB_S_ARES 145
|
||||
+#define GCC_WCSS_AXI_M_ARES 146
|
||||
+#define GCC_WCSS_BCR 147
|
||||
+#define GCC_WCSS_DBG_ARES 148
|
||||
+#define GCC_WCSS_DBG_BDG_ARES 149
|
||||
+#define GCC_WCSS_ECAHB_ARES 150
|
||||
+#define GCC_WCSS_Q6_BCR 151
|
||||
+#define GCC_WCSS_Q6_TBU_BCR 152
|
||||
+#define GCC_TCSR_BCR 153
|
||||
+
|
||||
+#endif
|
@ -1,879 +0,0 @@
|
||||
From 1d437190764f774f61f1ab389b4c074e0f69bbb1 Mon Sep 17 00:00:00 2001
|
||||
From: Devi Priya <quic_devipriy@quicinc.com>
|
||||
Date: Thu, 16 Mar 2023 12:59:38 +0530
|
||||
Subject: [PATCH 09/41] pinctrl: qcom: Add IPQ9574 pinctrl driver
|
||||
|
||||
Add pinctrl definitions for the TLMM of IPQ9574
|
||||
|
||||
Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
|
||||
Co-developed-by: Anusha Rao <quic_anusha@quicinc.com>
|
||||
Signed-off-by: Anusha Rao <quic_anusha@quicinc.com>
|
||||
Signed-off-by: Devi Priya <quic_devipriy@quicinc.com>
|
||||
Link: https://lore.kernel.org/r/20230316072940.29137-5-quic_devipriy@quicinc.com
|
||||
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
|
||||
---
|
||||
drivers/pinctrl/qcom/Kconfig | 11 +
|
||||
drivers/pinctrl/qcom/Makefile | 1 +
|
||||
drivers/pinctrl/qcom/pinctrl-ipq9574.c | 826 +++++++++++++++++++++++++
|
||||
3 files changed, 838 insertions(+)
|
||||
create mode 100644 drivers/pinctrl/qcom/pinctrl-ipq9574.c
|
||||
|
||||
--- a/drivers/pinctrl/qcom/Kconfig
|
||||
+++ b/drivers/pinctrl/qcom/Kconfig
|
||||
@@ -70,6 +70,17 @@ config PINCTRL_IPQ6018
|
||||
Qualcomm Technologies Inc. IPQ6018 platform. Select this for
|
||||
IPQ6018.
|
||||
|
||||
+config PINCTRL_IPQ9574
|
||||
+ tristate "Qualcomm Technologies, Inc. IPQ9574 pin controller driver"
|
||||
+ depends on OF || COMPILE_TEST
|
||||
+ depends on ARM64 || COMPILE_TEST
|
||||
+ depends on PINCTRL_MSM
|
||||
+ help
|
||||
+ This is the pinctrl, pinmux, pinconf and gpiolib driver for
|
||||
+ the Qualcomm Technologies Inc. TLMM block found on the
|
||||
+ Qualcomm Technologies Inc. IPQ9574 platform. Select this for
|
||||
+ IPQ9574.
|
||||
+
|
||||
config PINCTRL_MSM8226
|
||||
tristate "Qualcomm 8226 pin controller driver"
|
||||
depends on OF
|
||||
--- a/drivers/pinctrl/qcom/Makefile
|
||||
+++ b/drivers/pinctrl/qcom/Makefile
|
||||
@@ -7,6 +7,7 @@ obj-$(CONFIG_PINCTRL_IPQ4019) += pinctrl
|
||||
obj-$(CONFIG_PINCTRL_IPQ8064) += pinctrl-ipq8064.o
|
||||
obj-$(CONFIG_PINCTRL_IPQ8074) += pinctrl-ipq8074.o
|
||||
obj-$(CONFIG_PINCTRL_IPQ6018) += pinctrl-ipq6018.o
|
||||
+obj-$(CONFIG_PINCTRL_IPQ9574) += pinctrl-ipq9574.o
|
||||
obj-$(CONFIG_PINCTRL_MSM8226) += pinctrl-msm8226.o
|
||||
obj-$(CONFIG_PINCTRL_MSM8660) += pinctrl-msm8660.o
|
||||
obj-$(CONFIG_PINCTRL_MSM8960) += pinctrl-msm8960.o
|
||||
--- /dev/null
|
||||
+++ b/drivers/pinctrl/qcom/pinctrl-ipq9574.c
|
||||
@@ -0,0 +1,826 @@
|
||||
+// SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
+/*
|
||||
+ * Copyright (c) 2023 The Linux Foundation. All rights reserved.
|
||||
+ */
|
||||
+
|
||||
+#include <linux/module.h>
|
||||
+#include <linux/of.h>
|
||||
+#include <linux/platform_device.h>
|
||||
+#include <linux/pinctrl/pinctrl.h>
|
||||
+
|
||||
+#include "pinctrl-msm.h"
|
||||
+
|
||||
+#define FUNCTION(fname) \
|
||||
+ [msm_mux_##fname] = { \
|
||||
+ .name = #fname, \
|
||||
+ .groups = fname##_groups, \
|
||||
+ .ngroups = ARRAY_SIZE(fname##_groups), \
|
||||
+ }
|
||||
+
|
||||
+#define REG_SIZE 0x1000
|
||||
+#define PINGROUP(id, f1, f2, f3, f4, f5, f6, f7, f8, f9) \
|
||||
+ { \
|
||||
+ .name = "gpio" #id, \
|
||||
+ .pins = gpio##id##_pins, \
|
||||
+ .npins = (unsigned int)ARRAY_SIZE(gpio##id##_pins), \
|
||||
+ .funcs = (int[]){ \
|
||||
+ msm_mux_gpio, /* gpio mode */ \
|
||||
+ msm_mux_##f1, \
|
||||
+ msm_mux_##f2, \
|
||||
+ msm_mux_##f3, \
|
||||
+ msm_mux_##f4, \
|
||||
+ msm_mux_##f5, \
|
||||
+ msm_mux_##f6, \
|
||||
+ msm_mux_##f7, \
|
||||
+ msm_mux_##f8, \
|
||||
+ msm_mux_##f9 \
|
||||
+ }, \
|
||||
+ .nfuncs = 10, \
|
||||
+ .ctl_reg = REG_SIZE * id, \
|
||||
+ .io_reg = 0x4 + REG_SIZE * id, \
|
||||
+ .intr_cfg_reg = 0x8 + REG_SIZE * id, \
|
||||
+ .intr_status_reg = 0xc + REG_SIZE * id, \
|
||||
+ .intr_target_reg = 0x8 + REG_SIZE * id, \
|
||||
+ .mux_bit = 2, \
|
||||
+ .pull_bit = 0, \
|
||||
+ .drv_bit = 6, \
|
||||
+ .oe_bit = 9, \
|
||||
+ .in_bit = 0, \
|
||||
+ .out_bit = 1, \
|
||||
+ .intr_enable_bit = 0, \
|
||||
+ .intr_status_bit = 0, \
|
||||
+ .intr_target_bit = 5, \
|
||||
+ .intr_target_kpss_val = 3, \
|
||||
+ .intr_raw_status_bit = 4, \
|
||||
+ .intr_polarity_bit = 1, \
|
||||
+ .intr_detection_bit = 2, \
|
||||
+ .intr_detection_width = 2, \
|
||||
+ }
|
||||
+
|
||||
+static const struct pinctrl_pin_desc ipq9574_pins[] = {
|
||||
+ PINCTRL_PIN(0, "GPIO_0"),
|
||||
+ PINCTRL_PIN(1, "GPIO_1"),
|
||||
+ PINCTRL_PIN(2, "GPIO_2"),
|
||||
+ PINCTRL_PIN(3, "GPIO_3"),
|
||||
+ PINCTRL_PIN(4, "GPIO_4"),
|
||||
+ PINCTRL_PIN(5, "GPIO_5"),
|
||||
+ PINCTRL_PIN(6, "GPIO_6"),
|
||||
+ PINCTRL_PIN(7, "GPIO_7"),
|
||||
+ PINCTRL_PIN(8, "GPIO_8"),
|
||||
+ PINCTRL_PIN(9, "GPIO_9"),
|
||||
+ PINCTRL_PIN(10, "GPIO_10"),
|
||||
+ PINCTRL_PIN(11, "GPIO_11"),
|
||||
+ PINCTRL_PIN(12, "GPIO_12"),
|
||||
+ PINCTRL_PIN(13, "GPIO_13"),
|
||||
+ PINCTRL_PIN(14, "GPIO_14"),
|
||||
+ PINCTRL_PIN(15, "GPIO_15"),
|
||||
+ PINCTRL_PIN(16, "GPIO_16"),
|
||||
+ PINCTRL_PIN(17, "GPIO_17"),
|
||||
+ PINCTRL_PIN(18, "GPIO_18"),
|
||||
+ PINCTRL_PIN(19, "GPIO_19"),
|
||||
+ PINCTRL_PIN(20, "GPIO_20"),
|
||||
+ PINCTRL_PIN(21, "GPIO_21"),
|
||||
+ PINCTRL_PIN(22, "GPIO_22"),
|
||||
+ PINCTRL_PIN(23, "GPIO_23"),
|
||||
+ PINCTRL_PIN(24, "GPIO_24"),
|
||||
+ PINCTRL_PIN(25, "GPIO_25"),
|
||||
+ PINCTRL_PIN(26, "GPIO_26"),
|
||||
+ PINCTRL_PIN(27, "GPIO_27"),
|
||||
+ PINCTRL_PIN(28, "GPIO_28"),
|
||||
+ PINCTRL_PIN(29, "GPIO_29"),
|
||||
+ PINCTRL_PIN(30, "GPIO_30"),
|
||||
+ PINCTRL_PIN(31, "GPIO_31"),
|
||||
+ PINCTRL_PIN(32, "GPIO_32"),
|
||||
+ PINCTRL_PIN(33, "GPIO_33"),
|
||||
+ PINCTRL_PIN(34, "GPIO_34"),
|
||||
+ PINCTRL_PIN(35, "GPIO_35"),
|
||||
+ PINCTRL_PIN(36, "GPIO_36"),
|
||||
+ PINCTRL_PIN(37, "GPIO_37"),
|
||||
+ PINCTRL_PIN(38, "GPIO_38"),
|
||||
+ PINCTRL_PIN(39, "GPIO_39"),
|
||||
+ PINCTRL_PIN(40, "GPIO_40"),
|
||||
+ PINCTRL_PIN(41, "GPIO_41"),
|
||||
+ PINCTRL_PIN(42, "GPIO_42"),
|
||||
+ PINCTRL_PIN(43, "GPIO_43"),
|
||||
+ PINCTRL_PIN(44, "GPIO_44"),
|
||||
+ PINCTRL_PIN(45, "GPIO_45"),
|
||||
+ PINCTRL_PIN(46, "GPIO_46"),
|
||||
+ PINCTRL_PIN(47, "GPIO_47"),
|
||||
+ PINCTRL_PIN(48, "GPIO_48"),
|
||||
+ PINCTRL_PIN(49, "GPIO_49"),
|
||||
+ PINCTRL_PIN(50, "GPIO_50"),
|
||||
+ PINCTRL_PIN(51, "GPIO_51"),
|
||||
+ PINCTRL_PIN(52, "GPIO_52"),
|
||||
+ PINCTRL_PIN(53, "GPIO_53"),
|
||||
+ PINCTRL_PIN(54, "GPIO_54"),
|
||||
+ PINCTRL_PIN(55, "GPIO_55"),
|
||||
+ PINCTRL_PIN(56, "GPIO_56"),
|
||||
+ PINCTRL_PIN(57, "GPIO_57"),
|
||||
+ PINCTRL_PIN(58, "GPIO_58"),
|
||||
+ PINCTRL_PIN(59, "GPIO_59"),
|
||||
+ PINCTRL_PIN(60, "GPIO_60"),
|
||||
+ PINCTRL_PIN(61, "GPIO_61"),
|
||||
+ PINCTRL_PIN(62, "GPIO_62"),
|
||||
+ PINCTRL_PIN(63, "GPIO_63"),
|
||||
+ PINCTRL_PIN(64, "GPIO_64"),
|
||||
+};
|
||||
+
|
||||
+#define DECLARE_MSM_GPIO_PINS(pin) \
|
||||
+ static const unsigned int gpio##pin##_pins[] = { pin }
|
||||
+DECLARE_MSM_GPIO_PINS(0);
|
||||
+DECLARE_MSM_GPIO_PINS(1);
|
||||
+DECLARE_MSM_GPIO_PINS(2);
|
||||
+DECLARE_MSM_GPIO_PINS(3);
|
||||
+DECLARE_MSM_GPIO_PINS(4);
|
||||
+DECLARE_MSM_GPIO_PINS(5);
|
||||
+DECLARE_MSM_GPIO_PINS(6);
|
||||
+DECLARE_MSM_GPIO_PINS(7);
|
||||
+DECLARE_MSM_GPIO_PINS(8);
|
||||
+DECLARE_MSM_GPIO_PINS(9);
|
||||
+DECLARE_MSM_GPIO_PINS(10);
|
||||
+DECLARE_MSM_GPIO_PINS(11);
|
||||
+DECLARE_MSM_GPIO_PINS(12);
|
||||
+DECLARE_MSM_GPIO_PINS(13);
|
||||
+DECLARE_MSM_GPIO_PINS(14);
|
||||
+DECLARE_MSM_GPIO_PINS(15);
|
||||
+DECLARE_MSM_GPIO_PINS(16);
|
||||
+DECLARE_MSM_GPIO_PINS(17);
|
||||
+DECLARE_MSM_GPIO_PINS(18);
|
||||
+DECLARE_MSM_GPIO_PINS(19);
|
||||
+DECLARE_MSM_GPIO_PINS(20);
|
||||
+DECLARE_MSM_GPIO_PINS(21);
|
||||
+DECLARE_MSM_GPIO_PINS(22);
|
||||
+DECLARE_MSM_GPIO_PINS(23);
|
||||
+DECLARE_MSM_GPIO_PINS(24);
|
||||
+DECLARE_MSM_GPIO_PINS(25);
|
||||
+DECLARE_MSM_GPIO_PINS(26);
|
||||
+DECLARE_MSM_GPIO_PINS(27);
|
||||
+DECLARE_MSM_GPIO_PINS(28);
|
||||
+DECLARE_MSM_GPIO_PINS(29);
|
||||
+DECLARE_MSM_GPIO_PINS(30);
|
||||
+DECLARE_MSM_GPIO_PINS(31);
|
||||
+DECLARE_MSM_GPIO_PINS(32);
|
||||
+DECLARE_MSM_GPIO_PINS(33);
|
||||
+DECLARE_MSM_GPIO_PINS(34);
|
||||
+DECLARE_MSM_GPIO_PINS(35);
|
||||
+DECLARE_MSM_GPIO_PINS(36);
|
||||
+DECLARE_MSM_GPIO_PINS(37);
|
||||
+DECLARE_MSM_GPIO_PINS(38);
|
||||
+DECLARE_MSM_GPIO_PINS(39);
|
||||
+DECLARE_MSM_GPIO_PINS(40);
|
||||
+DECLARE_MSM_GPIO_PINS(41);
|
||||
+DECLARE_MSM_GPIO_PINS(42);
|
||||
+DECLARE_MSM_GPIO_PINS(43);
|
||||
+DECLARE_MSM_GPIO_PINS(44);
|
||||
+DECLARE_MSM_GPIO_PINS(45);
|
||||
+DECLARE_MSM_GPIO_PINS(46);
|
||||
+DECLARE_MSM_GPIO_PINS(47);
|
||||
+DECLARE_MSM_GPIO_PINS(48);
|
||||
+DECLARE_MSM_GPIO_PINS(49);
|
||||
+DECLARE_MSM_GPIO_PINS(50);
|
||||
+DECLARE_MSM_GPIO_PINS(51);
|
||||
+DECLARE_MSM_GPIO_PINS(52);
|
||||
+DECLARE_MSM_GPIO_PINS(53);
|
||||
+DECLARE_MSM_GPIO_PINS(54);
|
||||
+DECLARE_MSM_GPIO_PINS(55);
|
||||
+DECLARE_MSM_GPIO_PINS(56);
|
||||
+DECLARE_MSM_GPIO_PINS(57);
|
||||
+DECLARE_MSM_GPIO_PINS(58);
|
||||
+DECLARE_MSM_GPIO_PINS(59);
|
||||
+DECLARE_MSM_GPIO_PINS(60);
|
||||
+DECLARE_MSM_GPIO_PINS(61);
|
||||
+DECLARE_MSM_GPIO_PINS(62);
|
||||
+DECLARE_MSM_GPIO_PINS(63);
|
||||
+DECLARE_MSM_GPIO_PINS(64);
|
||||
+
|
||||
+enum ipq9574_functions {
|
||||
+ msm_mux_atest_char,
|
||||
+ msm_mux_atest_char0,
|
||||
+ msm_mux_atest_char1,
|
||||
+ msm_mux_atest_char2,
|
||||
+ msm_mux_atest_char3,
|
||||
+ msm_mux_audio_pdm0,
|
||||
+ msm_mux_audio_pdm1,
|
||||
+ msm_mux_audio_pri,
|
||||
+ msm_mux_audio_sec,
|
||||
+ msm_mux_blsp0_spi,
|
||||
+ msm_mux_blsp0_uart,
|
||||
+ msm_mux_blsp1_i2c,
|
||||
+ msm_mux_blsp1_spi,
|
||||
+ msm_mux_blsp1_uart,
|
||||
+ msm_mux_blsp2_i2c,
|
||||
+ msm_mux_blsp2_spi,
|
||||
+ msm_mux_blsp2_uart,
|
||||
+ msm_mux_blsp3_i2c,
|
||||
+ msm_mux_blsp3_spi,
|
||||
+ msm_mux_blsp3_uart,
|
||||
+ msm_mux_blsp4_i2c,
|
||||
+ msm_mux_blsp4_spi,
|
||||
+ msm_mux_blsp4_uart,
|
||||
+ msm_mux_blsp5_i2c,
|
||||
+ msm_mux_blsp5_uart,
|
||||
+ msm_mux_cri_trng0,
|
||||
+ msm_mux_cri_trng1,
|
||||
+ msm_mux_cri_trng2,
|
||||
+ msm_mux_cri_trng3,
|
||||
+ msm_mux_cxc0,
|
||||
+ msm_mux_cxc1,
|
||||
+ msm_mux_dbg_out,
|
||||
+ msm_mux_dwc_ddrphy,
|
||||
+ msm_mux_gcc_plltest,
|
||||
+ msm_mux_gcc_tlmm,
|
||||
+ msm_mux_gpio,
|
||||
+ msm_mux_mac,
|
||||
+ msm_mux_mdc,
|
||||
+ msm_mux_mdio,
|
||||
+ msm_mux_pcie0_clk,
|
||||
+ msm_mux_pcie0_wake,
|
||||
+ msm_mux_pcie1_clk,
|
||||
+ msm_mux_pcie1_wake,
|
||||
+ msm_mux_pcie2_clk,
|
||||
+ msm_mux_pcie2_wake,
|
||||
+ msm_mux_pcie3_clk,
|
||||
+ msm_mux_pcie3_wake,
|
||||
+ msm_mux_prng_rosc0,
|
||||
+ msm_mux_prng_rosc1,
|
||||
+ msm_mux_prng_rosc2,
|
||||
+ msm_mux_prng_rosc3,
|
||||
+ msm_mux_pta,
|
||||
+ msm_mux_pwm,
|
||||
+ msm_mux_qdss_cti_trig_in_a0,
|
||||
+ msm_mux_qdss_cti_trig_in_a1,
|
||||
+ msm_mux_qdss_cti_trig_in_b0,
|
||||
+ msm_mux_qdss_cti_trig_in_b1,
|
||||
+ msm_mux_qdss_cti_trig_out_a0,
|
||||
+ msm_mux_qdss_cti_trig_out_a1,
|
||||
+ msm_mux_qdss_cti_trig_out_b0,
|
||||
+ msm_mux_qdss_cti_trig_out_b1,
|
||||
+ msm_mux_qdss_traceclk_a,
|
||||
+ msm_mux_qdss_traceclk_b,
|
||||
+ msm_mux_qdss_tracectl_a,
|
||||
+ msm_mux_qdss_tracectl_b,
|
||||
+ msm_mux_qdss_tracedata_a,
|
||||
+ msm_mux_qdss_tracedata_b,
|
||||
+ msm_mux_qspi_data,
|
||||
+ msm_mux_qspi_clk,
|
||||
+ msm_mux_qspi_cs,
|
||||
+ msm_mux_rx0,
|
||||
+ msm_mux_rx1,
|
||||
+ msm_mux_sdc_data,
|
||||
+ msm_mux_sdc_clk,
|
||||
+ msm_mux_sdc_cmd,
|
||||
+ msm_mux_sdc_rclk,
|
||||
+ msm_mux_tsens_max,
|
||||
+ msm_mux_wci20,
|
||||
+ msm_mux_wci21,
|
||||
+ msm_mux_wsa_swrm,
|
||||
+ msm_mux__,
|
||||
+};
|
||||
+
|
||||
+static const char * const gpio_groups[] = {
|
||||
+ "gpio0", "gpio1", "gpio2", "gpio3", "gpio4", "gpio5", "gpio6", "gpio7",
|
||||
+ "gpio8", "gpio9", "gpio10", "gpio11", "gpio12", "gpio13", "gpio14",
|
||||
+ "gpio15", "gpio16", "gpio17", "gpio18", "gpio19", "gpio20", "gpio21",
|
||||
+ "gpio22", "gpio23", "gpio24", "gpio25", "gpio26", "gpio27", "gpio28",
|
||||
+ "gpio29", "gpio30", "gpio31", "gpio32", "gpio33", "gpio34", "gpio35",
|
||||
+ "gpio36", "gpio37", "gpio38", "gpio39", "gpio40", "gpio41", "gpio42",
|
||||
+ "gpio43", "gpio44", "gpio45", "gpio46", "gpio47", "gpio48", "gpio49",
|
||||
+ "gpio50", "gpio51", "gpio52", "gpio53", "gpio54", "gpio55", "gpio56",
|
||||
+ "gpio57", "gpio58", "gpio59", "gpio60", "gpio61", "gpio62", "gpio63",
|
||||
+ "gpio64",
|
||||
+};
|
||||
+
|
||||
+static const char * const sdc_data_groups[] = {
|
||||
+ "gpio0",
|
||||
+ "gpio1",
|
||||
+ "gpio2",
|
||||
+ "gpio3",
|
||||
+ "gpio6",
|
||||
+ "gpio7",
|
||||
+ "gpio8",
|
||||
+ "gpio9",
|
||||
+};
|
||||
+
|
||||
+static const char * const qspi_data_groups[] = {
|
||||
+ "gpio0",
|
||||
+ "gpio1",
|
||||
+ "gpio2",
|
||||
+ "gpio3",
|
||||
+};
|
||||
+
|
||||
+static const char * const qdss_traceclk_b_groups[] = {
|
||||
+ "gpio0",
|
||||
+};
|
||||
+
|
||||
+static const char * const qdss_tracectl_b_groups[] = {
|
||||
+ "gpio1",
|
||||
+};
|
||||
+
|
||||
+static const char * const qdss_tracedata_b_groups[] = {
|
||||
+ "gpio2", "gpio3", "gpio4", "gpio5", "gpio6", "gpio7", "gpio8", "gpio9",
|
||||
+ "gpio10", "gpio11", "gpio12", "gpio13", "gpio14", "gpio15", "gpio16",
|
||||
+ "gpio17",
|
||||
+};
|
||||
+
|
||||
+static const char * const sdc_cmd_groups[] = {
|
||||
+ "gpio4",
|
||||
+};
|
||||
+
|
||||
+static const char * const qspi_cs_groups[] = {
|
||||
+ "gpio4",
|
||||
+};
|
||||
+
|
||||
+static const char * const sdc_clk_groups[] = {
|
||||
+ "gpio5",
|
||||
+};
|
||||
+
|
||||
+static const char * const qspi_clk_groups[] = {
|
||||
+ "gpio5",
|
||||
+};
|
||||
+
|
||||
+static const char * const sdc_rclk_groups[] = {
|
||||
+ "gpio10",
|
||||
+};
|
||||
+
|
||||
+static const char * const blsp0_spi_groups[] = {
|
||||
+ "gpio11", "gpio12", "gpio13", "gpio14",
|
||||
+};
|
||||
+
|
||||
+static const char * const blsp0_uart_groups[] = {
|
||||
+ "gpio11", "gpio12", "gpio13", "gpio14",
|
||||
+};
|
||||
+
|
||||
+static const char * const blsp3_spi_groups[] = {
|
||||
+ "gpio15", "gpio16", "gpio17", "gpio18", "gpio19", "gpio20", "gpio21",
|
||||
+};
|
||||
+
|
||||
+static const char * const blsp3_i2c_groups[] = {
|
||||
+ "gpio15", "gpio16",
|
||||
+};
|
||||
+
|
||||
+static const char * const blsp3_uart_groups[] = {
|
||||
+ "gpio15", "gpio16", "gpio17", "gpio18",
|
||||
+};
|
||||
+
|
||||
+static const char * const dbg_out_groups[] = {
|
||||
+ "gpio17",
|
||||
+};
|
||||
+
|
||||
+static const char * const cri_trng0_groups[] = {
|
||||
+ "gpio20", "gpio38",
|
||||
+};
|
||||
+
|
||||
+static const char * const cri_trng1_groups[] = {
|
||||
+ "gpio21", "gpio34",
|
||||
+};
|
||||
+
|
||||
+static const char * const pcie0_clk_groups[] = {
|
||||
+ "gpio22",
|
||||
+};
|
||||
+
|
||||
+static const char * const pta_groups[] = {
|
||||
+ "gpio22", "gpio23", "gpio24", "gpio54", "gpio55", "gpio56", "gpio61",
|
||||
+ "gpio62", "gpio63",
|
||||
+};
|
||||
+
|
||||
+static const char * const wci21_groups[] = {
|
||||
+ "gpio23", "gpio24",
|
||||
+};
|
||||
+
|
||||
+static const char * const cxc0_groups[] = {
|
||||
+ "gpio23", "gpio24",
|
||||
+};
|
||||
+
|
||||
+static const char * const pcie0_wake_groups[] = {
|
||||
+ "gpio24",
|
||||
+};
|
||||
+
|
||||
+static const char * const qdss_cti_trig_out_b0_groups[] = {
|
||||
+ "gpio24",
|
||||
+};
|
||||
+
|
||||
+static const char * const pcie1_clk_groups[] = {
|
||||
+ "gpio25",
|
||||
+};
|
||||
+
|
||||
+static const char * const qdss_cti_trig_in_b0_groups[] = {
|
||||
+ "gpio25",
|
||||
+};
|
||||
+
|
||||
+static const char * const atest_char0_groups[] = {
|
||||
+ "gpio26",
|
||||
+};
|
||||
+
|
||||
+static const char * const qdss_cti_trig_out_b1_groups[] = {
|
||||
+ "gpio26",
|
||||
+};
|
||||
+
|
||||
+static const char * const pcie1_wake_groups[] = {
|
||||
+ "gpio27",
|
||||
+};
|
||||
+
|
||||
+static const char * const atest_char1_groups[] = {
|
||||
+ "gpio27",
|
||||
+};
|
||||
+
|
||||
+static const char * const qdss_cti_trig_in_b1_groups[] = {
|
||||
+ "gpio27",
|
||||
+};
|
||||
+
|
||||
+static const char * const pcie2_clk_groups[] = {
|
||||
+ "gpio28",
|
||||
+};
|
||||
+
|
||||
+static const char * const atest_char2_groups[] = {
|
||||
+ "gpio28",
|
||||
+};
|
||||
+
|
||||
+static const char * const atest_char3_groups[] = {
|
||||
+ "gpio29",
|
||||
+};
|
||||
+
|
||||
+static const char * const pcie2_wake_groups[] = {
|
||||
+ "gpio30",
|
||||
+};
|
||||
+
|
||||
+static const char * const pwm_groups[] = {
|
||||
+ "gpio30", "gpio31", "gpio32", "gpio33", "gpio44", "gpio45", "gpio46",
|
||||
+ "gpio47", "gpio50", "gpio51", "gpio52", "gpio53", "gpio54", "gpio55",
|
||||
+ "gpio56", "gpio57", "gpio58", "gpio59", "gpio60",
|
||||
+};
|
||||
+
|
||||
+static const char * const atest_char_groups[] = {
|
||||
+ "gpio30",
|
||||
+};
|
||||
+
|
||||
+static const char * const pcie3_clk_groups[] = {
|
||||
+ "gpio31",
|
||||
+};
|
||||
+
|
||||
+static const char * const qdss_cti_trig_in_a1_groups[] = {
|
||||
+ "gpio31",
|
||||
+};
|
||||
+
|
||||
+static const char * const qdss_cti_trig_out_a1_groups[] = {
|
||||
+ "gpio32",
|
||||
+};
|
||||
+
|
||||
+static const char * const pcie3_wake_groups[] = {
|
||||
+ "gpio33",
|
||||
+};
|
||||
+
|
||||
+static const char * const qdss_cti_trig_in_a0_groups[] = {
|
||||
+ "gpio33",
|
||||
+};
|
||||
+
|
||||
+static const char * const blsp2_uart_groups[] = {
|
||||
+ "gpio34", "gpio35",
|
||||
+};
|
||||
+
|
||||
+static const char * const blsp2_i2c_groups[] = {
|
||||
+ "gpio34", "gpio35",
|
||||
+};
|
||||
+
|
||||
+static const char * const blsp2_spi_groups[] = {
|
||||
+ "gpio34", "gpio35", "gpio36", "gpio37",
|
||||
+};
|
||||
+
|
||||
+static const char * const blsp1_uart_groups[] = {
|
||||
+ "gpio34", "gpio35", "gpio36", "gpio37",
|
||||
+};
|
||||
+
|
||||
+static const char * const qdss_cti_trig_out_a0_groups[] = {
|
||||
+ "gpio34",
|
||||
+};
|
||||
+
|
||||
+static const char * const cri_trng2_groups[] = {
|
||||
+ "gpio35",
|
||||
+};
|
||||
+
|
||||
+static const char * const blsp1_i2c_groups[] = {
|
||||
+ "gpio36", "gpio37",
|
||||
+};
|
||||
+
|
||||
+static const char * const cri_trng3_groups[] = {
|
||||
+ "gpio36",
|
||||
+};
|
||||
+
|
||||
+static const char * const dwc_ddrphy_groups[] = {
|
||||
+ "gpio37",
|
||||
+};
|
||||
+
|
||||
+static const char * const mdc_groups[] = {
|
||||
+ "gpio38",
|
||||
+};
|
||||
+
|
||||
+static const char * const mdio_groups[] = {
|
||||
+ "gpio39",
|
||||
+};
|
||||
+
|
||||
+static const char * const audio_pri_groups[] = {
|
||||
+ "gpio40", "gpio41", "gpio42", "gpio43", "gpio61", "gpio61",
|
||||
+};
|
||||
+
|
||||
+static const char * const audio_pdm0_groups[] = {
|
||||
+ "gpio40", "gpio41", "gpio42", "gpio43",
|
||||
+};
|
||||
+
|
||||
+static const char * const qdss_traceclk_a_groups[] = {
|
||||
+ "gpio43",
|
||||
+};
|
||||
+
|
||||
+static const char * const audio_sec_groups[] = {
|
||||
+ "gpio44", "gpio45", "gpio46", "gpio47", "gpio62", "gpio62",
|
||||
+};
|
||||
+
|
||||
+static const char * const wsa_swrm_groups[] = {
|
||||
+ "gpio44", "gpio45",
|
||||
+};
|
||||
+
|
||||
+static const char * const qdss_tracectl_a_groups[] = {
|
||||
+ "gpio44",
|
||||
+};
|
||||
+
|
||||
+static const char * const qdss_tracedata_a_groups[] = {
|
||||
+ "gpio45", "gpio46", "gpio47", "gpio48", "gpio49", "gpio50", "gpio51",
|
||||
+ "gpio52", "gpio53", "gpio54", "gpio55", "gpio56", "gpio57", "gpio58",
|
||||
+ "gpio59", "gpio60",
|
||||
+};
|
||||
+
|
||||
+static const char * const rx1_groups[] = {
|
||||
+ "gpio46",
|
||||
+};
|
||||
+
|
||||
+static const char * const mac_groups[] = {
|
||||
+ "gpio46", "gpio47", "gpio57", "gpio58",
|
||||
+};
|
||||
+
|
||||
+static const char * const blsp5_i2c_groups[] = {
|
||||
+ "gpio48", "gpio49",
|
||||
+};
|
||||
+
|
||||
+static const char * const blsp5_uart_groups[] = {
|
||||
+ "gpio48", "gpio49",
|
||||
+};
|
||||
+
|
||||
+static const char * const blsp4_uart_groups[] = {
|
||||
+ "gpio50", "gpio51", "gpio52", "gpio53",
|
||||
+};
|
||||
+
|
||||
+static const char * const blsp4_i2c_groups[] = {
|
||||
+ "gpio50", "gpio51",
|
||||
+};
|
||||
+
|
||||
+static const char * const blsp4_spi_groups[] = {
|
||||
+ "gpio50", "gpio51", "gpio52", "gpio53",
|
||||
+};
|
||||
+
|
||||
+static const char * const wci20_groups[] = {
|
||||
+ "gpio57", "gpio58",
|
||||
+};
|
||||
+
|
||||
+static const char * const cxc1_groups[] = {
|
||||
+ "gpio57", "gpio58",
|
||||
+};
|
||||
+
|
||||
+static const char * const rx0_groups[] = {
|
||||
+ "gpio59",
|
||||
+};
|
||||
+
|
||||
+static const char * const prng_rosc0_groups[] = {
|
||||
+ "gpio60",
|
||||
+};
|
||||
+
|
||||
+static const char * const gcc_plltest_groups[] = {
|
||||
+ "gpio60", "gpio62",
|
||||
+};
|
||||
+
|
||||
+static const char * const blsp1_spi_groups[] = {
|
||||
+ "gpio61", "gpio62", "gpio63", "gpio64",
|
||||
+};
|
||||
+
|
||||
+static const char * const audio_pdm1_groups[] = {
|
||||
+ "gpio61", "gpio62", "gpio63", "gpio64",
|
||||
+};
|
||||
+
|
||||
+static const char * const prng_rosc1_groups[] = {
|
||||
+ "gpio61",
|
||||
+};
|
||||
+
|
||||
+static const char * const gcc_tlmm_groups[] = {
|
||||
+ "gpio61",
|
||||
+};
|
||||
+
|
||||
+static const char * const prng_rosc2_groups[] = {
|
||||
+ "gpio62",
|
||||
+};
|
||||
+
|
||||
+static const char * const prng_rosc3_groups[] = {
|
||||
+ "gpio63",
|
||||
+};
|
||||
+
|
||||
+static const char * const tsens_max_groups[] = {
|
||||
+ "gpio64",
|
||||
+};
|
||||
+
|
||||
+static const struct msm_function ipq9574_functions[] = {
|
||||
+ FUNCTION(atest_char),
|
||||
+ FUNCTION(atest_char0),
|
||||
+ FUNCTION(atest_char1),
|
||||
+ FUNCTION(atest_char2),
|
||||
+ FUNCTION(atest_char3),
|
||||
+ FUNCTION(audio_pdm0),
|
||||
+ FUNCTION(audio_pdm1),
|
||||
+ FUNCTION(audio_pri),
|
||||
+ FUNCTION(audio_sec),
|
||||
+ FUNCTION(blsp0_spi),
|
||||
+ FUNCTION(blsp0_uart),
|
||||
+ FUNCTION(blsp1_i2c),
|
||||
+ FUNCTION(blsp1_spi),
|
||||
+ FUNCTION(blsp1_uart),
|
||||
+ FUNCTION(blsp2_i2c),
|
||||
+ FUNCTION(blsp2_spi),
|
||||
+ FUNCTION(blsp2_uart),
|
||||
+ FUNCTION(blsp3_i2c),
|
||||
+ FUNCTION(blsp3_spi),
|
||||
+ FUNCTION(blsp3_uart),
|
||||
+ FUNCTION(blsp4_i2c),
|
||||
+ FUNCTION(blsp4_spi),
|
||||
+ FUNCTION(blsp4_uart),
|
||||
+ FUNCTION(blsp5_i2c),
|
||||
+ FUNCTION(blsp5_uart),
|
||||
+ FUNCTION(cri_trng0),
|
||||
+ FUNCTION(cri_trng1),
|
||||
+ FUNCTION(cri_trng2),
|
||||
+ FUNCTION(cri_trng3),
|
||||
+ FUNCTION(cxc0),
|
||||
+ FUNCTION(cxc1),
|
||||
+ FUNCTION(dbg_out),
|
||||
+ FUNCTION(dwc_ddrphy),
|
||||
+ FUNCTION(gcc_plltest),
|
||||
+ FUNCTION(gcc_tlmm),
|
||||
+ FUNCTION(gpio),
|
||||
+ FUNCTION(mac),
|
||||
+ FUNCTION(mdc),
|
||||
+ FUNCTION(mdio),
|
||||
+ FUNCTION(pcie0_clk),
|
||||
+ FUNCTION(pcie0_wake),
|
||||
+ FUNCTION(pcie1_clk),
|
||||
+ FUNCTION(pcie1_wake),
|
||||
+ FUNCTION(pcie2_clk),
|
||||
+ FUNCTION(pcie2_wake),
|
||||
+ FUNCTION(pcie3_clk),
|
||||
+ FUNCTION(pcie3_wake),
|
||||
+ FUNCTION(prng_rosc0),
|
||||
+ FUNCTION(prng_rosc1),
|
||||
+ FUNCTION(prng_rosc2),
|
||||
+ FUNCTION(prng_rosc3),
|
||||
+ FUNCTION(pta),
|
||||
+ FUNCTION(pwm),
|
||||
+ FUNCTION(qdss_cti_trig_in_a0),
|
||||
+ FUNCTION(qdss_cti_trig_in_a1),
|
||||
+ FUNCTION(qdss_cti_trig_in_b0),
|
||||
+ FUNCTION(qdss_cti_trig_in_b1),
|
||||
+ FUNCTION(qdss_cti_trig_out_a0),
|
||||
+ FUNCTION(qdss_cti_trig_out_a1),
|
||||
+ FUNCTION(qdss_cti_trig_out_b0),
|
||||
+ FUNCTION(qdss_cti_trig_out_b1),
|
||||
+ FUNCTION(qdss_traceclk_a),
|
||||
+ FUNCTION(qdss_traceclk_b),
|
||||
+ FUNCTION(qdss_tracectl_a),
|
||||
+ FUNCTION(qdss_tracectl_b),
|
||||
+ FUNCTION(qdss_tracedata_a),
|
||||
+ FUNCTION(qdss_tracedata_b),
|
||||
+ FUNCTION(qspi_data),
|
||||
+ FUNCTION(qspi_clk),
|
||||
+ FUNCTION(qspi_cs),
|
||||
+ FUNCTION(rx0),
|
||||
+ FUNCTION(rx1),
|
||||
+ FUNCTION(sdc_data),
|
||||
+ FUNCTION(sdc_clk),
|
||||
+ FUNCTION(sdc_cmd),
|
||||
+ FUNCTION(sdc_rclk),
|
||||
+ FUNCTION(tsens_max),
|
||||
+ FUNCTION(wci20),
|
||||
+ FUNCTION(wci21),
|
||||
+ FUNCTION(wsa_swrm),
|
||||
+};
|
||||
+
|
||||
+static const struct msm_pingroup ipq9574_groups[] = {
|
||||
+ PINGROUP(0, sdc_data, qspi_data, qdss_traceclk_b, _, _, _, _, _, _),
|
||||
+ PINGROUP(1, sdc_data, qspi_data, qdss_tracectl_b, _, _, _, _, _, _),
|
||||
+ PINGROUP(2, sdc_data, qspi_data, qdss_tracedata_b, _, _, _, _, _, _),
|
||||
+ PINGROUP(3, sdc_data, qspi_data, qdss_tracedata_b, _, _, _, _, _, _),
|
||||
+ PINGROUP(4, sdc_cmd, qspi_cs, qdss_tracedata_b, _, _, _, _, _, _),
|
||||
+ PINGROUP(5, sdc_clk, qspi_clk, qdss_tracedata_b, _, _, _, _, _, _),
|
||||
+ PINGROUP(6, sdc_data, qdss_tracedata_b, _, _, _, _, _, _, _),
|
||||
+ PINGROUP(7, sdc_data, qdss_tracedata_b, _, _, _, _, _, _, _),
|
||||
+ PINGROUP(8, sdc_data, qdss_tracedata_b, _, _, _, _, _, _, _),
|
||||
+ PINGROUP(9, sdc_data, qdss_tracedata_b, _, _, _, _, _, _, _),
|
||||
+ PINGROUP(10, sdc_rclk, qdss_tracedata_b, _, _, _, _, _, _, _),
|
||||
+ PINGROUP(11, blsp0_spi, blsp0_uart, qdss_tracedata_b, _, _, _, _, _, _),
|
||||
+ PINGROUP(12, blsp0_spi, blsp0_uart, qdss_tracedata_b, _, _, _, _, _, _),
|
||||
+ PINGROUP(13, blsp0_spi, blsp0_uart, qdss_tracedata_b, _, _, _, _, _, _),
|
||||
+ PINGROUP(14, blsp0_spi, blsp0_uart, qdss_tracedata_b, _, _, _, _, _, _),
|
||||
+ PINGROUP(15, blsp3_spi, blsp3_i2c, blsp3_uart, qdss_tracedata_b, _, _, _, _, _),
|
||||
+ PINGROUP(16, blsp3_spi, blsp3_i2c, blsp3_uart, qdss_tracedata_b, _, _, _, _, _),
|
||||
+ PINGROUP(17, blsp3_spi, blsp3_uart, dbg_out, qdss_tracedata_b, _, _, _, _, _),
|
||||
+ PINGROUP(18, blsp3_spi, blsp3_uart, _, _, _, _, _, _, _),
|
||||
+ PINGROUP(19, blsp3_spi, _, _, _, _, _, _, _, _),
|
||||
+ PINGROUP(20, blsp3_spi, _, cri_trng0, _, _, _, _, _, _),
|
||||
+ PINGROUP(21, blsp3_spi, _, cri_trng1, _, _, _, _, _, _),
|
||||
+ PINGROUP(22, pcie0_clk, _, pta, _, _, _, _, _, _),
|
||||
+ PINGROUP(23, _, pta, wci21, cxc0, _, _, _, _, _),
|
||||
+ PINGROUP(24, pcie0_wake, _, pta, wci21, cxc0, _, qdss_cti_trig_out_b0, _, _),
|
||||
+ PINGROUP(25, pcie1_clk, _, _, qdss_cti_trig_in_b0, _, _, _, _, _),
|
||||
+ PINGROUP(26, _, atest_char0, _, qdss_cti_trig_out_b1, _, _, _, _, _),
|
||||
+ PINGROUP(27, pcie1_wake, _, atest_char1, qdss_cti_trig_in_b1, _, _, _, _, _),
|
||||
+ PINGROUP(28, pcie2_clk, atest_char2, _, _, _, _, _, _, _),
|
||||
+ PINGROUP(29, atest_char3, _, _, _, _, _, _, _, _),
|
||||
+ PINGROUP(30, pcie2_wake, pwm, atest_char, _, _, _, _, _, _),
|
||||
+ PINGROUP(31, pcie3_clk, pwm, _, qdss_cti_trig_in_a1, _, _, _, _, _),
|
||||
+ PINGROUP(32, pwm, _, qdss_cti_trig_out_a1, _, _, _, _, _, _),
|
||||
+ PINGROUP(33, pcie3_wake, pwm, _, qdss_cti_trig_in_a0, _, _, _, _, _),
|
||||
+ PINGROUP(34, blsp2_uart, blsp2_i2c, blsp2_spi, blsp1_uart, _, cri_trng1, qdss_cti_trig_out_a0, _, _),
|
||||
+ PINGROUP(35, blsp2_uart, blsp2_i2c, blsp2_spi, blsp1_uart, _, cri_trng2, _, _, _),
|
||||
+ PINGROUP(36, blsp1_uart, blsp1_i2c, blsp2_spi, _, cri_trng3, _, _, _, _),
|
||||
+ PINGROUP(37, blsp1_uart, blsp1_i2c, blsp2_spi, _, dwc_ddrphy, _, _, _, _),
|
||||
+ PINGROUP(38, mdc, _, cri_trng0, _, _, _, _, _, _),
|
||||
+ PINGROUP(39, mdio, _, _, _, _, _, _, _, _),
|
||||
+ PINGROUP(40, audio_pri, audio_pdm0, _, _, _, _, _, _, _),
|
||||
+ PINGROUP(41, audio_pri, audio_pdm0, _, _, _, _, _, _, _),
|
||||
+ PINGROUP(42, audio_pri, audio_pdm0, _, _, _, _, _, _, _),
|
||||
+ PINGROUP(43, audio_pri, audio_pdm0, _, qdss_traceclk_a, _, _, _, _, _),
|
||||
+ PINGROUP(44, pwm, audio_sec, wsa_swrm, _, qdss_tracectl_a, _, _, _, _),
|
||||
+ PINGROUP(45, pwm, audio_sec, wsa_swrm, _, qdss_tracedata_a, _, _, _, _),
|
||||
+ PINGROUP(46, pwm, audio_sec, rx1, mac, _, qdss_tracedata_a, _, _, _),
|
||||
+ PINGROUP(47, pwm, audio_sec, mac, _, qdss_tracedata_a, _, _, _, _),
|
||||
+ PINGROUP(48, blsp5_i2c, blsp5_uart, _, qdss_tracedata_a, _, _, _, _, _),
|
||||
+ PINGROUP(49, blsp5_i2c, blsp5_uart, _, qdss_tracedata_a, _, _, _, _, _),
|
||||
+ PINGROUP(50, blsp4_uart, blsp4_i2c, blsp4_spi, pwm, qdss_tracedata_a, _, _, _, _),
|
||||
+ PINGROUP(51, blsp4_uart, blsp4_i2c, blsp4_spi, pwm, qdss_tracedata_a, _, _, _, _),
|
||||
+ PINGROUP(52, blsp4_uart, blsp4_spi, pwm, qdss_tracedata_a, _, _, _, _, _),
|
||||
+ PINGROUP(53, blsp4_uart, blsp4_spi, pwm, qdss_tracedata_a, _, _, _, _, _),
|
||||
+ PINGROUP(54, pta, pwm, qdss_tracedata_a, _, _, _, _, _, _),
|
||||
+ PINGROUP(55, pta, pwm, qdss_tracedata_a, _, _, _, _, _, _),
|
||||
+ PINGROUP(56, pta, pwm, qdss_tracedata_a, _, _, _, _, _, _),
|
||||
+ PINGROUP(57, wci20, cxc1, mac, pwm, qdss_tracedata_a, _, _, _, _),
|
||||
+ PINGROUP(58, wci20, cxc1, mac, pwm, qdss_tracedata_a, _, _, _, _),
|
||||
+ PINGROUP(59, rx0, pwm, qdss_tracedata_a, _, _, _, _, _, _),
|
||||
+ PINGROUP(60, pwm, prng_rosc0, qdss_tracedata_a, _, gcc_plltest, _, _, _, _),
|
||||
+ PINGROUP(61, blsp1_spi, audio_pri, audio_pdm1, audio_pri, pta, prng_rosc1, gcc_tlmm, _, _),
|
||||
+ PINGROUP(62, blsp1_spi, audio_sec, audio_pdm1, audio_sec, pta, prng_rosc2, gcc_plltest, _, _),
|
||||
+ PINGROUP(63, blsp1_spi, audio_pdm1, pta, prng_rosc3, _, _, _, _, _),
|
||||
+ PINGROUP(64, blsp1_spi, audio_pdm1, tsens_max, _, _, _, _, _, _),
|
||||
+};
|
||||
+
|
||||
+/* Reserving GPIO59 for controlling the QFPROM LDO regulator */
|
||||
+static const int ipq9574_reserved_gpios[] = {
|
||||
+ 59, -1
|
||||
+};
|
||||
+
|
||||
+static const struct msm_pinctrl_soc_data ipq9574_pinctrl = {
|
||||
+ .pins = ipq9574_pins,
|
||||
+ .npins = ARRAY_SIZE(ipq9574_pins),
|
||||
+ .functions = ipq9574_functions,
|
||||
+ .nfunctions = ARRAY_SIZE(ipq9574_functions),
|
||||
+ .groups = ipq9574_groups,
|
||||
+ .ngroups = ARRAY_SIZE(ipq9574_groups),
|
||||
+ .reserved_gpios = ipq9574_reserved_gpios,
|
||||
+ .ngpios = 65,
|
||||
+};
|
||||
+
|
||||
+static int ipq9574_pinctrl_probe(struct platform_device *pdev)
|
||||
+{
|
||||
+ return msm_pinctrl_probe(pdev, &ipq9574_pinctrl);
|
||||
+}
|
||||
+
|
||||
+static const struct of_device_id ipq9574_pinctrl_of_match[] = {
|
||||
+ { .compatible = "qcom,ipq9574-tlmm", },
|
||||
+ { }
|
||||
+};
|
||||
+MODULE_DEVICE_TABLE(of, ipq9574_pinctrl_of_match);
|
||||
+
|
||||
+static struct platform_driver ipq9574_pinctrl_driver = {
|
||||
+ .driver = {
|
||||
+ .name = "ipq9574-tlmm",
|
||||
+ .of_match_table = ipq9574_pinctrl_of_match,
|
||||
+ },
|
||||
+ .probe = ipq9574_pinctrl_probe,
|
||||
+ .remove = msm_pinctrl_remove,
|
||||
+};
|
||||
+
|
||||
+static int __init ipq9574_pinctrl_init(void)
|
||||
+{
|
||||
+ return platform_driver_register(&ipq9574_pinctrl_driver);
|
||||
+}
|
||||
+arch_initcall(ipq9574_pinctrl_init);
|
||||
+
|
||||
+static void __exit ipq9574_pinctrl_exit(void)
|
||||
+{
|
||||
+ platform_driver_unregister(&ipq9574_pinctrl_driver);
|
||||
+}
|
||||
+module_exit(ipq9574_pinctrl_exit);
|
||||
+
|
||||
+MODULE_DESCRIPTION("QTI IPQ9574 TLMM driver");
|
||||
+MODULE_LICENSE("GPL");
|
@ -1,43 +0,0 @@
|
||||
From 7fd33c757ae079f5fcba4ab1de145392247462d0 Mon Sep 17 00:00:00 2001
|
||||
From: Devi Priya <quic_devipriy@quicinc.com>
|
||||
Date: Thu, 6 Apr 2023 11:43:13 +0530
|
||||
Subject: [PATCH 10/41] arm64: dts: qcom: ipq9574: Add support for APSS clock
|
||||
controller
|
||||
|
||||
Add the APCS & A73 PLL nodes to support CPU frequency scaling.
|
||||
|
||||
Signed-off-by: Devi Priya <quic_devipriy@quicinc.com>
|
||||
Reviewed-by: Konrad Dybcio <konrad.dybcio@linaro.org>
|
||||
Signed-off-by: Bjorn Andersson <andersson@kernel.org>
|
||||
Link: https://lore.kernel.org/r/20230406061314.10916-5-quic_devipriy@quicinc.com
|
||||
---
|
||||
arch/arm64/boot/dts/qcom/ipq9574.dtsi | 18 ++++++++++++++++++
|
||||
1 file changed, 18 insertions(+)
|
||||
|
||||
--- a/arch/arm64/boot/dts/qcom/ipq9574.dtsi
|
||||
+++ b/arch/arm64/boot/dts/qcom/ipq9574.dtsi
|
||||
@@ -201,6 +201,24 @@
|
||||
};
|
||||
};
|
||||
|
||||
+ apcs_glb: mailbox@b111000 {
|
||||
+ compatible = "qcom,ipq9574-apcs-apps-global",
|
||||
+ "qcom,ipq6018-apcs-apps-global";
|
||||
+ reg = <0x0b111000 0x1000>;
|
||||
+ #clock-cells = <1>;
|
||||
+ clocks = <&a73pll>, <&xo_board_clk>;
|
||||
+ clock-names = "pll", "xo";
|
||||
+ #mbox-cells = <1>;
|
||||
+ };
|
||||
+
|
||||
+ a73pll: clock@b116000 {
|
||||
+ compatible = "qcom,ipq9574-a73pll";
|
||||
+ reg = <0x0b116000 0x40>;
|
||||
+ #clock-cells = <0>;
|
||||
+ clocks = <&xo_board_clk>;
|
||||
+ clock-names = "xo";
|
||||
+ };
|
||||
+
|
||||
timer@b120000 {
|
||||
compatible = "arm,armv7-timer-mem";
|
||||
reg = <0x0b120000 0x1000>;
|
@ -1,61 +0,0 @@
|
||||
From f2e33970f45a9ce5c94da83980d1e95e21a565fe Mon Sep 17 00:00:00 2001
|
||||
From: Devi Priya <quic_devipriy@quicinc.com>
|
||||
Date: Thu, 6 Apr 2023 11:43:11 +0530
|
||||
Subject: [PATCH 11/41] clk: qcom: apss-ipq-pll: Add support for IPQ9574
|
||||
|
||||
Add the compatible and configuration values for A73 Huayra PLL found
|
||||
on IPQ9574.
|
||||
|
||||
Co-developed-by: Praveenkumar I <quic_ipkumar@quicinc.com>
|
||||
Signed-off-by: Praveenkumar I <quic_ipkumar@quicinc.com>
|
||||
Signed-off-by: Devi Priya <quic_devipriy@quicinc.com>
|
||||
Acked-by: Stephen Boyd <sboyd@kernel.org>
|
||||
Reviewed-by: Konrad Dybcio <konrad.dybcio@linaro.org>
|
||||
Signed-off-by: Bjorn Andersson <andersson@kernel.org>
|
||||
Link: https://lore.kernel.org/r/20230406061314.10916-3-quic_devipriy@quicinc.com
|
||||
---
|
||||
drivers/clk/qcom/apss-ipq-pll.c | 19 +++++++++++++++++++
|
||||
1 file changed, 19 insertions(+)
|
||||
|
||||
--- a/drivers/clk/qcom/apss-ipq-pll.c
|
||||
+++ b/drivers/clk/qcom/apss-ipq-pll.c
|
||||
@@ -68,6 +68,18 @@ static const struct alpha_pll_config ipq
|
||||
.test_ctl_hi_val = 0x4000,
|
||||
};
|
||||
|
||||
+static const struct alpha_pll_config ipq9574_pll_config = {
|
||||
+ .l = 0x3b,
|
||||
+ .config_ctl_val = 0x200d4828,
|
||||
+ .config_ctl_hi_val = 0x6,
|
||||
+ .early_output_mask = BIT(3),
|
||||
+ .aux2_output_mask = BIT(2),
|
||||
+ .aux_output_mask = BIT(1),
|
||||
+ .main_output_mask = BIT(0),
|
||||
+ .test_ctl_val = 0x0,
|
||||
+ .test_ctl_hi_val = 0x4000,
|
||||
+};
|
||||
+
|
||||
struct apss_pll_data {
|
||||
struct clk_alpha_pll *pll;
|
||||
const struct alpha_pll_config *pll_config;
|
||||
@@ -83,6 +95,12 @@ static struct apss_pll_data ipq6018_pll_
|
||||
.pll_config = &ipq6018_pll_config,
|
||||
};
|
||||
|
||||
+static struct apss_pll_data ipq9574_pll_data = {
|
||||
+ .pll_type = CLK_ALPHA_PLL_TYPE_HUAYRA,
|
||||
+ .pll = &ipq_pll_huayra,
|
||||
+ .pll_config = &ipq9574_pll_config,
|
||||
+};
|
||||
+
|
||||
static const struct regmap_config ipq_pll_regmap_config = {
|
||||
.reg_bits = 32,
|
||||
.reg_stride = 4,
|
||||
@@ -124,6 +142,7 @@ static int apss_ipq_pll_probe(struct pla
|
||||
static const struct of_device_id apss_ipq_pll_match_table[] = {
|
||||
{ .compatible = "qcom,ipq6018-a53pll", .data = &ipq6018_pll_data },
|
||||
{ .compatible = "qcom,ipq8074-a53pll", .data = &ipq8074_pll_data },
|
||||
+ { .compatible = "qcom,ipq9574-a73pll", .data = &ipq9574_pll_data },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, apss_ipq_pll_match_table);
|
@ -1,38 +0,0 @@
|
||||
From 10b07ee264b5cc807939be4cbc60a3abad3ddf03 Mon Sep 17 00:00:00 2001
|
||||
From: Devi Priya <quic_devipriy@quicinc.com>
|
||||
Date: Fri, 7 Apr 2023 21:27:24 +0530
|
||||
Subject: [PATCH 12/41] regulator: qcom_smd: Add MP5496 S1 regulator
|
||||
|
||||
Adding support for MP5496 S1 regulator on IPQ9574 SoC.
|
||||
|
||||
Co-developed-by: Praveenkumar I <quic_ipkumar@quicinc.com>
|
||||
Signed-off-by: Praveenkumar I <quic_ipkumar@quicinc.com>
|
||||
Signed-off-by: Devi Priya <quic_devipriy@quicinc.com>
|
||||
Reviewed-by: Konrad Dybcio <konrad.dybcio@linaro.org>
|
||||
Link: https://lore.kernel.org/r/20230407155727.20615-3-quic_devipriy@quicinc.com
|
||||
Signed-off-by: Mark Brown <broonie@kernel.org>
|
||||
---
|
||||
drivers/regulator/qcom_smd-regulator.c | 5 +++--
|
||||
1 file changed, 3 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/regulator/qcom_smd-regulator.c
|
||||
+++ b/drivers/regulator/qcom_smd-regulator.c
|
||||
@@ -731,7 +731,7 @@ static const struct regulator_desc pms40
|
||||
.ops = &rpm_smps_ldo_ops,
|
||||
};
|
||||
|
||||
-static const struct regulator_desc mp5496_smpa2 = {
|
||||
+static const struct regulator_desc mp5496_smps = {
|
||||
.linear_ranges = (struct linear_range[]) {
|
||||
REGULATOR_LINEAR_RANGE(600000, 0, 127, 12500),
|
||||
},
|
||||
@@ -776,7 +776,8 @@ struct rpm_regulator_data {
|
||||
};
|
||||
|
||||
static const struct rpm_regulator_data rpm_mp5496_regulators[] = {
|
||||
- { "s2", QCOM_SMD_RPM_SMPA, 2, &mp5496_smpa2, "s2" },
|
||||
+ { "s1", QCOM_SMD_RPM_SMPA, 1, &mp5496_smps, "s1" },
|
||||
+ { "s2", QCOM_SMD_RPM_SMPA, 2, &mp5496_smps, "s2" },
|
||||
{ "l2", QCOM_SMD_RPM_LDOA, 2, &mp5496_ldoa2, "l2" },
|
||||
{}
|
||||
};
|
@ -1,203 +0,0 @@
|
||||
From 89978464908147356b67ee57dd07482dc7ffe332 Mon Sep 17 00:00:00 2001
|
||||
From: Devi Priya <quic_devipriy@quicinc.com>
|
||||
Date: Tue, 25 Apr 2023 14:10:10 +0530
|
||||
Subject: [PATCH 13/41] arm64: dts: qcom: ipq9574: rename al02-c7 dts to rdp433
|
||||
|
||||
Rename the dts after Reference Design Platform(RDP) to adopt
|
||||
standard naming convention.
|
||||
|
||||
Acked-by: Konrad Dybcio <konrad.dybcio@linaro.org>
|
||||
Signed-off-by: Devi Priya <quic_devipriy@quicinc.com>
|
||||
Signed-off-by: Bjorn Andersson <andersson@kernel.org>
|
||||
Link: https://lore.kernel.org/r/20230425084010.15581-7-quic_devipriy@quicinc.com
|
||||
---
|
||||
arch/arm64/boot/dts/qcom/Makefile | 2 +-
|
||||
.../boot/dts/qcom/{ipq9574-al02-c7.dts => ipq9574-rdp433.dts} | 2 +-
|
||||
2 files changed, 2 insertions(+), 2 deletions(-)
|
||||
rename arch/arm64/boot/dts/qcom/{ipq9574-al02-c7.dts => ipq9574-rdp433.dts} (97%)
|
||||
|
||||
--- a/arch/arm64/boot/dts/qcom/Makefile
|
||||
+++ b/arch/arm64/boot/dts/qcom/Makefile
|
||||
@@ -7,7 +7,7 @@ dtb-$(CONFIG_ARCH_QCOM) += ipq6018-cp01-
|
||||
dtb-$(CONFIG_ARCH_QCOM) += ipq8074-hk01.dtb
|
||||
dtb-$(CONFIG_ARCH_QCOM) += ipq8074-hk10-c1.dtb
|
||||
dtb-$(CONFIG_ARCH_QCOM) += ipq8074-hk10-c2.dtb
|
||||
-dtb-$(CONFIG_ARCH_QCOM) += ipq9574-al02-c7.dtb
|
||||
+dtb-$(CONFIG_ARCH_QCOM) += ipq9574-rdp433.dtb
|
||||
dtb-$(CONFIG_ARCH_QCOM) += msm8916-alcatel-idol347.dtb
|
||||
dtb-$(CONFIG_ARCH_QCOM) += msm8916-asus-z00l.dtb
|
||||
dtb-$(CONFIG_ARCH_QCOM) += msm8916-huawei-g7.dtb
|
||||
--- a/arch/arm64/boot/dts/qcom/ipq9574-al02-c7.dts
|
||||
+++ /dev/null
|
||||
@@ -1,84 +0,0 @@
|
||||
-// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)
|
||||
-/*
|
||||
- * IPQ9574 AL02-C7 board device tree source
|
||||
- *
|
||||
- * Copyright (c) 2020-2021 The Linux Foundation. All rights reserved.
|
||||
- * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
- */
|
||||
-
|
||||
-/dts-v1/;
|
||||
-
|
||||
-#include "ipq9574.dtsi"
|
||||
-
|
||||
-/ {
|
||||
- model = "Qualcomm Technologies, Inc. IPQ9574/AP-AL02-C7";
|
||||
- compatible = "qcom,ipq9574-ap-al02-c7", "qcom,ipq9574";
|
||||
-
|
||||
- aliases {
|
||||
- serial0 = &blsp1_uart2;
|
||||
- };
|
||||
-
|
||||
- chosen {
|
||||
- stdout-path = "serial0:115200n8";
|
||||
- };
|
||||
-};
|
||||
-
|
||||
-&blsp1_uart2 {
|
||||
- pinctrl-0 = <&uart2_pins>;
|
||||
- pinctrl-names = "default";
|
||||
- status = "okay";
|
||||
-};
|
||||
-
|
||||
-&sdhc_1 {
|
||||
- pinctrl-0 = <&sdc_default_state>;
|
||||
- pinctrl-names = "default";
|
||||
- mmc-ddr-1_8v;
|
||||
- mmc-hs200-1_8v;
|
||||
- mmc-hs400-1_8v;
|
||||
- mmc-hs400-enhanced-strobe;
|
||||
- max-frequency = <384000000>;
|
||||
- bus-width = <8>;
|
||||
- status = "okay";
|
||||
-};
|
||||
-
|
||||
-&sleep_clk {
|
||||
- clock-frequency = <32000>;
|
||||
-};
|
||||
-
|
||||
-&tlmm {
|
||||
- sdc_default_state: sdc-default-state {
|
||||
- clk-pins {
|
||||
- pins = "gpio5";
|
||||
- function = "sdc_clk";
|
||||
- drive-strength = <8>;
|
||||
- bias-disable;
|
||||
- };
|
||||
-
|
||||
- cmd-pins {
|
||||
- pins = "gpio4";
|
||||
- function = "sdc_cmd";
|
||||
- drive-strength = <8>;
|
||||
- bias-pull-up;
|
||||
- };
|
||||
-
|
||||
- data-pins {
|
||||
- pins = "gpio0", "gpio1", "gpio2",
|
||||
- "gpio3", "gpio6", "gpio7",
|
||||
- "gpio8", "gpio9";
|
||||
- function = "sdc_data";
|
||||
- drive-strength = <8>;
|
||||
- bias-pull-up;
|
||||
- };
|
||||
-
|
||||
- rclk-pins {
|
||||
- pins = "gpio10";
|
||||
- function = "sdc_rclk";
|
||||
- drive-strength = <8>;
|
||||
- bias-pull-down;
|
||||
- };
|
||||
- };
|
||||
-};
|
||||
-
|
||||
-&xo_board_clk {
|
||||
- clock-frequency = <24000000>;
|
||||
-};
|
||||
--- /dev/null
|
||||
+++ b/arch/arm64/boot/dts/qcom/ipq9574-rdp433.dts
|
||||
@@ -0,0 +1,84 @@
|
||||
+// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)
|
||||
+/*
|
||||
+ * IPQ9574 RDP433 board device tree source
|
||||
+ *
|
||||
+ * Copyright (c) 2020-2021 The Linux Foundation. All rights reserved.
|
||||
+ * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
+ */
|
||||
+
|
||||
+/dts-v1/;
|
||||
+
|
||||
+#include "ipq9574.dtsi"
|
||||
+
|
||||
+/ {
|
||||
+ model = "Qualcomm Technologies, Inc. IPQ9574/AP-AL02-C7";
|
||||
+ compatible = "qcom,ipq9574-ap-al02-c7", "qcom,ipq9574";
|
||||
+
|
||||
+ aliases {
|
||||
+ serial0 = &blsp1_uart2;
|
||||
+ };
|
||||
+
|
||||
+ chosen {
|
||||
+ stdout-path = "serial0:115200n8";
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&blsp1_uart2 {
|
||||
+ pinctrl-0 = <&uart2_pins>;
|
||||
+ pinctrl-names = "default";
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&sdhc_1 {
|
||||
+ pinctrl-0 = <&sdc_default_state>;
|
||||
+ pinctrl-names = "default";
|
||||
+ mmc-ddr-1_8v;
|
||||
+ mmc-hs200-1_8v;
|
||||
+ mmc-hs400-1_8v;
|
||||
+ mmc-hs400-enhanced-strobe;
|
||||
+ max-frequency = <384000000>;
|
||||
+ bus-width = <8>;
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&sleep_clk {
|
||||
+ clock-frequency = <32000>;
|
||||
+};
|
||||
+
|
||||
+&tlmm {
|
||||
+ sdc_default_state: sdc-default-state {
|
||||
+ clk-pins {
|
||||
+ pins = "gpio5";
|
||||
+ function = "sdc_clk";
|
||||
+ drive-strength = <8>;
|
||||
+ bias-disable;
|
||||
+ };
|
||||
+
|
||||
+ cmd-pins {
|
||||
+ pins = "gpio4";
|
||||
+ function = "sdc_cmd";
|
||||
+ drive-strength = <8>;
|
||||
+ bias-pull-up;
|
||||
+ };
|
||||
+
|
||||
+ data-pins {
|
||||
+ pins = "gpio0", "gpio1", "gpio2",
|
||||
+ "gpio3", "gpio6", "gpio7",
|
||||
+ "gpio8", "gpio9";
|
||||
+ function = "sdc_data";
|
||||
+ drive-strength = <8>;
|
||||
+ bias-pull-up;
|
||||
+ };
|
||||
+
|
||||
+ rclk-pins {
|
||||
+ pins = "gpio10";
|
||||
+ function = "sdc_rclk";
|
||||
+ drive-strength = <8>;
|
||||
+ bias-pull-down;
|
||||
+ };
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&xo_board_clk {
|
||||
+ clock-frequency = <24000000>;
|
||||
+};
|
@ -1,39 +0,0 @@
|
||||
From 20576d5e55831df510ed60f53d83c6e0618c2343 Mon Sep 17 00:00:00 2001
|
||||
From: Devi Priya <quic_devipriy@quicinc.com>
|
||||
Date: Tue, 25 Apr 2023 14:10:09 +0530
|
||||
Subject: [PATCH 14/41] arm64: dts: qcom: ipq9574: Drop bias_pll_ubi_nc_clk
|
||||
input
|
||||
|
||||
Drop unused bias_pll_ubi_nc_clk input to the clock controller.
|
||||
|
||||
Signed-off-by: Devi Priya <quic_devipriy@quicinc.com>
|
||||
Signed-off-by: Bjorn Andersson <andersson@kernel.org>
|
||||
Link: https://lore.kernel.org/r/20230425084010.15581-6-quic_devipriy@quicinc.com
|
||||
---
|
||||
arch/arm64/boot/dts/qcom/ipq9574.dtsi | 8 +-------
|
||||
1 file changed, 1 insertion(+), 7 deletions(-)
|
||||
|
||||
--- a/arch/arm64/boot/dts/qcom/ipq9574.dtsi
|
||||
+++ b/arch/arm64/boot/dts/qcom/ipq9574.dtsi
|
||||
@@ -16,12 +16,6 @@
|
||||
#size-cells = <2>;
|
||||
|
||||
clocks {
|
||||
- bias_pll_ubi_nc_clk: bias-pll-ubi-nc-clk {
|
||||
- compatible = "fixed-clock";
|
||||
- clock-frequency = <353000000>;
|
||||
- #clock-cells = <0>;
|
||||
- };
|
||||
-
|
||||
sleep_clk: sleep-clk {
|
||||
compatible = "fixed-clock";
|
||||
#clock-cells = <0>;
|
||||
@@ -131,7 +125,7 @@
|
||||
reg = <0x01800000 0x80000>;
|
||||
clocks = <&xo_board_clk>,
|
||||
<&sleep_clk>,
|
||||
- <&bias_pll_ubi_nc_clk>,
|
||||
+ <0>,
|
||||
<0>,
|
||||
<0>,
|
||||
<0>,
|
@ -1,37 +0,0 @@
|
||||
From d7a20702b072333cc36cc78eb715295d65159196 Mon Sep 17 00:00:00 2001
|
||||
From: Devi Priya <quic_devipriy@quicinc.com>
|
||||
Date: Tue, 25 Apr 2023 14:10:05 +0530
|
||||
Subject: [PATCH 15/41] arm64: dts: qcom: ipq9574: Update the size of GICC &
|
||||
GICV regions
|
||||
|
||||
Update the size of GICC and GICV regions to 8kB as the GICC_DIR & GICV_DIR
|
||||
registers lie in the second 4kB region. Also, add target CPU encoding.
|
||||
|
||||
Fixes: 97cb36ff52a1 ("arm64: dts: qcom: Add ipq9574 SoC and AL02 board support")
|
||||
Signed-off-by: Devi Priya <quic_devipriy@quicinc.com>
|
||||
Signed-off-by: Bjorn Andersson <andersson@kernel.org>
|
||||
Link: https://lore.kernel.org/r/20230425084010.15581-2-quic_devipriy@quicinc.com
|
||||
---
|
||||
arch/arm64/boot/dts/qcom/ipq9574.dtsi | 6 +++---
|
||||
1 file changed, 3 insertions(+), 3 deletions(-)
|
||||
|
||||
--- a/arch/arm64/boot/dts/qcom/ipq9574.dtsi
|
||||
+++ b/arch/arm64/boot/dts/qcom/ipq9574.dtsi
|
||||
@@ -166,14 +166,14 @@
|
||||
intc: interrupt-controller@b000000 {
|
||||
compatible = "qcom,msm-qgic2";
|
||||
reg = <0x0b000000 0x1000>, /* GICD */
|
||||
- <0x0b002000 0x1000>, /* GICC */
|
||||
+ <0x0b002000 0x2000>, /* GICC */
|
||||
<0x0b001000 0x1000>, /* GICH */
|
||||
- <0x0b004000 0x1000>; /* GICV */
|
||||
+ <0x0b004000 0x2000>; /* GICV */
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
interrupt-controller;
|
||||
#interrupt-cells = <3>;
|
||||
- interrupts = <GIC_PPI 9 IRQ_TYPE_LEVEL_HIGH>;
|
||||
+ interrupts = <GIC_PPI 9 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_HIGH)>;
|
||||
ranges = <0 0x0b00c000 0x3000>;
|
||||
|
||||
v2m0: v2m@0 {
|
@ -1,158 +0,0 @@
|
||||
From e218ade7d728582bce795f6cce6fff39c4107dd5 Mon Sep 17 00:00:00 2001
|
||||
From: Devi Priya <quic_devipriy@quicinc.com>
|
||||
Date: Wed, 10 May 2023 16:13:59 +0530
|
||||
Subject: [PATCH 16/41] arm64: dts: qcom: ipq9574: add support for RDP418
|
||||
variant
|
||||
|
||||
Add the initial device tree support for the Reference Design Platform (RDP)
|
||||
418 based on IPQ9574 family of SoCs. This patch adds support for Console
|
||||
UART, SPI NOR, eMMC and SMPA1 regulator node.
|
||||
|
||||
Co-developed-by: Anusha Rao <quic_anusha@quicinc.com>
|
||||
Signed-off-by: Anusha Rao <quic_anusha@quicinc.com>
|
||||
Signed-off-by: Devi Priya <quic_devipriy@quicinc.com>
|
||||
Signed-off-by: Bjorn Andersson <andersson@kernel.org>
|
||||
Link: https://lore.kernel.org/r/20230510104359.16678-3-quic_devipriy@quicinc.com
|
||||
---
|
||||
arch/arm64/boot/dts/qcom/Makefile | 1 +
|
||||
arch/arm64/boot/dts/qcom/ipq9574-rdp418.dts | 124 ++++++++++++++++++++
|
||||
2 files changed, 125 insertions(+)
|
||||
create mode 100644 arch/arm64/boot/dts/qcom/ipq9574-rdp418.dts
|
||||
|
||||
--- a/arch/arm64/boot/dts/qcom/Makefile
|
||||
+++ b/arch/arm64/boot/dts/qcom/Makefile
|
||||
@@ -7,6 +7,7 @@ dtb-$(CONFIG_ARCH_QCOM) += ipq6018-cp01-
|
||||
dtb-$(CONFIG_ARCH_QCOM) += ipq8074-hk01.dtb
|
||||
dtb-$(CONFIG_ARCH_QCOM) += ipq8074-hk10-c1.dtb
|
||||
dtb-$(CONFIG_ARCH_QCOM) += ipq8074-hk10-c2.dtb
|
||||
+dtb-$(CONFIG_ARCH_QCOM) += ipq9574-rdp418.dtb
|
||||
dtb-$(CONFIG_ARCH_QCOM) += ipq9574-rdp433.dtb
|
||||
dtb-$(CONFIG_ARCH_QCOM) += msm8916-alcatel-idol347.dtb
|
||||
dtb-$(CONFIG_ARCH_QCOM) += msm8916-asus-z00l.dtb
|
||||
--- /dev/null
|
||||
+++ b/arch/arm64/boot/dts/qcom/ipq9574-rdp418.dts
|
||||
@@ -0,0 +1,124 @@
|
||||
+// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)
|
||||
+/*
|
||||
+ * IPQ9574 RDP418 board device tree source
|
||||
+ *
|
||||
+ * Copyright (c) 2020-2021 The Linux Foundation. All rights reserved.
|
||||
+ * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
+ */
|
||||
+
|
||||
+/dts-v1/;
|
||||
+
|
||||
+#include "ipq9574.dtsi"
|
||||
+
|
||||
+/ {
|
||||
+ model = "Qualcomm Technologies, Inc. IPQ9574/AP-AL02-C2";
|
||||
+ compatible = "qcom,ipq9574-ap-al02-c2", "qcom,ipq9574";
|
||||
+
|
||||
+ aliases {
|
||||
+ serial0 = &blsp1_uart2;
|
||||
+ };
|
||||
+
|
||||
+ chosen {
|
||||
+ stdout-path = "serial0:115200n8";
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&blsp1_spi0 {
|
||||
+ pinctrl-0 = <&spi_0_pins>;
|
||||
+ pinctrl-names = "default";
|
||||
+ status = "okay";
|
||||
+
|
||||
+ flash@0 {
|
||||
+ compatible = "micron,n25q128a11", "jedec,spi-nor";
|
||||
+ reg = <0>;
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <1>;
|
||||
+ spi-max-frequency = <50000000>;
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&blsp1_uart2 {
|
||||
+ pinctrl-0 = <&uart2_pins>;
|
||||
+ pinctrl-names = "default";
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&rpm_requests {
|
||||
+ regulators {
|
||||
+ compatible = "qcom,rpm-mp5496-regulators";
|
||||
+
|
||||
+ ipq9574_s1: s1 {
|
||||
+ /*
|
||||
+ * During kernel bootup, the SoC runs at 800MHz with 875mV set by the bootloaders.
|
||||
+ * During regulator registration, kernel not knowing the initial voltage,
|
||||
+ * considers it as zero and brings up the regulators with minimum supported voltage.
|
||||
+ * Update the regulator-min-microvolt with SVS voltage of 725mV so that
|
||||
+ * the regulators are brought up with 725mV which is sufficient for all the
|
||||
+ * corner parts to operate at 800MHz
|
||||
+ */
|
||||
+ regulator-min-microvolt = <725000>;
|
||||
+ regulator-max-microvolt = <1075000>;
|
||||
+ };
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&sdhc_1 {
|
||||
+ pinctrl-0 = <&sdc_default_state>;
|
||||
+ pinctrl-names = "default";
|
||||
+ mmc-ddr-1_8v;
|
||||
+ mmc-hs200-1_8v;
|
||||
+ mmc-hs400-1_8v;
|
||||
+ mmc-hs400-enhanced-strobe;
|
||||
+ max-frequency = <384000000>;
|
||||
+ bus-width = <8>;
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&sleep_clk {
|
||||
+ clock-frequency = <32000>;
|
||||
+};
|
||||
+
|
||||
+&tlmm {
|
||||
+ sdc_default_state: sdc-default-state {
|
||||
+ clk-pins {
|
||||
+ pins = "gpio5";
|
||||
+ function = "sdc_clk";
|
||||
+ drive-strength = <8>;
|
||||
+ bias-disable;
|
||||
+ };
|
||||
+
|
||||
+ cmd-pins {
|
||||
+ pins = "gpio4";
|
||||
+ function = "sdc_cmd";
|
||||
+ drive-strength = <8>;
|
||||
+ bias-pull-up;
|
||||
+ };
|
||||
+
|
||||
+ data-pins {
|
||||
+ pins = "gpio0", "gpio1", "gpio2",
|
||||
+ "gpio3", "gpio6", "gpio7",
|
||||
+ "gpio8", "gpio9";
|
||||
+ function = "sdc_data";
|
||||
+ drive-strength = <8>;
|
||||
+ bias-pull-up;
|
||||
+ };
|
||||
+
|
||||
+ rclk-pins {
|
||||
+ pins = "gpio10";
|
||||
+ function = "sdc_rclk";
|
||||
+ drive-strength = <8>;
|
||||
+ bias-pull-down;
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ spi_0_pins: spi-0-state {
|
||||
+ pins = "gpio11", "gpio12", "gpio13", "gpio14";
|
||||
+ function = "blsp0_spi";
|
||||
+ drive-strength = <8>;
|
||||
+ bias-disable;
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&xo_board_clk {
|
||||
+ clock-frequency = <24000000>;
|
||||
+};
|
@ -1,43 +0,0 @@
|
||||
From dcd3cd850131c36cc52ccee74e509d6cf194af2b Mon Sep 17 00:00:00 2001
|
||||
From: Poovendhan Selvaraj <quic_poovendh@quicinc.com>
|
||||
Date: Thu, 11 May 2023 13:28:14 +0530
|
||||
Subject: [PATCH 17/41] arm64: dts: qcom: ipq9574: Add SMEM support
|
||||
|
||||
Add the required nodes to support SMEM
|
||||
|
||||
Signed-off-by: Poovendhan Selvaraj <quic_poovendh@quicinc.com>
|
||||
Signed-off-by: Bjorn Andersson <andersson@kernel.org>
|
||||
Link: https://lore.kernel.org/r/20230511075814.2370-3-quic_poovendh@quicinc.com
|
||||
---
|
||||
arch/arm64/boot/dts/qcom/ipq9574.dtsi | 13 +++++++++++++
|
||||
1 file changed, 13 insertions(+)
|
||||
|
||||
--- a/arch/arm64/boot/dts/qcom/ipq9574.dtsi
|
||||
+++ b/arch/arm64/boot/dts/qcom/ipq9574.dtsi
|
||||
@@ -94,6 +94,13 @@
|
||||
reg = <0x0 0x4a600000 0x0 0x400000>;
|
||||
no-map;
|
||||
};
|
||||
+
|
||||
+ smem@4aa00000 {
|
||||
+ compatible = "qcom,smem";
|
||||
+ reg = <0x0 0x4aa00000 0x0 0x00100000>;
|
||||
+ hwlocks = <&tcsr_mutex 0>;
|
||||
+ no-map;
|
||||
+ };
|
||||
};
|
||||
|
||||
soc: soc@0 {
|
||||
@@ -136,6 +143,12 @@
|
||||
#power-domain-cells = <1>;
|
||||
};
|
||||
|
||||
+ tcsr_mutex: hwlock@1905000 {
|
||||
+ compatible = "qcom,tcsr-mutex";
|
||||
+ reg = <0x01905000 0x20000>;
|
||||
+ #hwlock-cells = <1>;
|
||||
+ };
|
||||
+
|
||||
sdhc_1: mmc@7804000 {
|
||||
compatible = "qcom,ipq9574-sdhci", "qcom,sdhci-msm-v5";
|
||||
reg = <0x07804000 0x1000>, <0x07805000 0x1000>;
|
@ -1,113 +0,0 @@
|
||||
From 013dab443b763648d450931df3f73a6c783c8197 Mon Sep 17 00:00:00 2001
|
||||
From: Devi Priya <quic_devipriy@quicinc.com>
|
||||
Date: Tue, 16 May 2023 19:20:13 +0530
|
||||
Subject: [PATCH 18/41] arm64: dts: qcom: ipq9574: add support for RDP449
|
||||
variant
|
||||
|
||||
Add the initial device tree support for the Reference Design Platform (RDP)
|
||||
449 based on IPQ9574 family of SoCs. This patch adds support for Console
|
||||
UART, SPI NOR and SMPA1 regulator node.
|
||||
|
||||
Signed-off-by: Devi Priya <quic_devipriy@quicinc.com>
|
||||
Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
|
||||
Signed-off-by: Bjorn Andersson <andersson@kernel.org>
|
||||
Link: https://lore.kernel.org/r/20230516135013.3547-3-quic_devipriy@quicinc.com
|
||||
---
|
||||
arch/arm64/boot/dts/qcom/Makefile | 1 +
|
||||
arch/arm64/boot/dts/qcom/ipq9574-rdp449.dts | 80 +++++++++++++++++++++
|
||||
2 files changed, 81 insertions(+)
|
||||
create mode 100644 arch/arm64/boot/dts/qcom/ipq9574-rdp449.dts
|
||||
|
||||
--- a/arch/arm64/boot/dts/qcom/Makefile
|
||||
+++ b/arch/arm64/boot/dts/qcom/Makefile
|
||||
@@ -9,6 +9,7 @@ dtb-$(CONFIG_ARCH_QCOM) += ipq8074-hk10-
|
||||
dtb-$(CONFIG_ARCH_QCOM) += ipq8074-hk10-c2.dtb
|
||||
dtb-$(CONFIG_ARCH_QCOM) += ipq9574-rdp418.dtb
|
||||
dtb-$(CONFIG_ARCH_QCOM) += ipq9574-rdp433.dtb
|
||||
+dtb-$(CONFIG_ARCH_QCOM) += ipq9574-rdp449.dtb
|
||||
dtb-$(CONFIG_ARCH_QCOM) += msm8916-alcatel-idol347.dtb
|
||||
dtb-$(CONFIG_ARCH_QCOM) += msm8916-asus-z00l.dtb
|
||||
dtb-$(CONFIG_ARCH_QCOM) += msm8916-huawei-g7.dtb
|
||||
--- /dev/null
|
||||
+++ b/arch/arm64/boot/dts/qcom/ipq9574-rdp449.dts
|
||||
@@ -0,0 +1,80 @@
|
||||
+// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)
|
||||
+/*
|
||||
+ * IPQ9574 RDP449 board device tree source
|
||||
+ *
|
||||
+ * Copyright (c) 2020-2021 The Linux Foundation. All rights reserved.
|
||||
+ * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
+ */
|
||||
+
|
||||
+/dts-v1/;
|
||||
+
|
||||
+#include "ipq9574.dtsi"
|
||||
+
|
||||
+/ {
|
||||
+ model = "Qualcomm Technologies, Inc. IPQ9574/AP-AL02-C6";
|
||||
+ compatible = "qcom,ipq9574-ap-al02-c6", "qcom,ipq9574";
|
||||
+
|
||||
+ aliases {
|
||||
+ serial0 = &blsp1_uart2;
|
||||
+ };
|
||||
+
|
||||
+ chosen {
|
||||
+ stdout-path = "serial0:115200n8";
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&blsp1_spi0 {
|
||||
+ pinctrl-0 = <&spi_0_pins>;
|
||||
+ pinctrl-names = "default";
|
||||
+ status = "okay";
|
||||
+
|
||||
+ flash@0 {
|
||||
+ compatible = "micron,n25q128a11", "jedec,spi-nor";
|
||||
+ reg = <0>;
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <1>;
|
||||
+ spi-max-frequency = <50000000>;
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&blsp1_uart2 {
|
||||
+ pinctrl-0 = <&uart2_pins>;
|
||||
+ pinctrl-names = "default";
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&rpm_requests {
|
||||
+ regulators {
|
||||
+ compatible = "qcom,rpm-mp5496-regulators";
|
||||
+
|
||||
+ ipq9574_s1: s1 {
|
||||
+ /*
|
||||
+ * During kernel bootup, the SoC runs at 800MHz with 875mV set by the bootloaders.
|
||||
+ * During regulator registration, kernel not knowing the initial voltage,
|
||||
+ * considers it as zero and brings up the regulators with minimum supported voltage.
|
||||
+ * Update the regulator-min-microvolt with SVS voltage of 725mV so that
|
||||
+ * the regulators are brought up with 725mV which is sufficient for all the
|
||||
+ * corner parts to operate at 800MHz
|
||||
+ */
|
||||
+ regulator-min-microvolt = <725000>;
|
||||
+ regulator-max-microvolt = <1075000>;
|
||||
+ };
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&sleep_clk {
|
||||
+ clock-frequency = <32000>;
|
||||
+};
|
||||
+
|
||||
+&tlmm {
|
||||
+ spi_0_pins: spi-0-state {
|
||||
+ pins = "gpio11", "gpio12", "gpio13", "gpio14";
|
||||
+ function = "blsp0_spi";
|
||||
+ drive-strength = <8>;
|
||||
+ bias-disable;
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&xo_board_clk {
|
||||
+ clock-frequency = <24000000>;
|
||||
+};
|
@ -1,122 +0,0 @@
|
||||
From 13ad51cfa78defdafd717ed89785c7bab8330a7b Mon Sep 17 00:00:00 2001
|
||||
From: Devi Priya <quic_devipriy@quicinc.com>
|
||||
Date: Wed, 17 May 2023 22:55:27 +0530
|
||||
Subject: [PATCH 19/41] arm64: dts: qcom: ipq9574: Add cpufreq support
|
||||
|
||||
Add cpu freq nodes in the device tree to bump cpu frequency above 800MHz.
|
||||
|
||||
Reviewed-by: Konrad Dybcio <konrad.dybcio@linaro.org>
|
||||
Co-developed-by: Praveenkumar I <quic_ipkumar@quicinc.com>
|
||||
Signed-off-by: Praveenkumar I <quic_ipkumar@quicinc.com>
|
||||
Signed-off-by: Devi Priya <quic_devipriy@quicinc.com>
|
||||
Signed-off-by: Bjorn Andersson <andersson@kernel.org>
|
||||
Link: https://lore.kernel.org/r/20230517172527.1968-4-quic_devipriy@quicinc.com
|
||||
---
|
||||
arch/arm64/boot/dts/qcom/ipq9574.dtsi | 60 ++++++++++++++++++++++++++-
|
||||
1 file changed, 59 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/arch/arm64/boot/dts/qcom/ipq9574.dtsi
|
||||
+++ b/arch/arm64/boot/dts/qcom/ipq9574.dtsi
|
||||
@@ -6,8 +6,9 @@
|
||||
* Copyright (c) 2023, Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
*/
|
||||
|
||||
-#include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||
+#include <dt-bindings/clock/qcom,apss-ipq.h>
|
||||
#include <dt-bindings/clock/qcom,ipq9574-gcc.h>
|
||||
+#include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||
#include <dt-bindings/reset/qcom,ipq9574-gcc.h>
|
||||
|
||||
/ {
|
||||
@@ -37,6 +38,10 @@
|
||||
reg = <0x0>;
|
||||
enable-method = "psci";
|
||||
next-level-cache = <&L2_0>;
|
||||
+ clocks = <&apcs_glb APCS_ALIAS0_CORE_CLK>;
|
||||
+ clock-names = "cpu";
|
||||
+ operating-points-v2 = <&cpu_opp_table>;
|
||||
+ cpu-supply = <&ipq9574_s1>;
|
||||
};
|
||||
|
||||
CPU1: cpu@1 {
|
||||
@@ -45,6 +50,10 @@
|
||||
reg = <0x1>;
|
||||
enable-method = "psci";
|
||||
next-level-cache = <&L2_0>;
|
||||
+ clocks = <&apcs_glb APCS_ALIAS0_CORE_CLK>;
|
||||
+ clock-names = "cpu";
|
||||
+ operating-points-v2 = <&cpu_opp_table>;
|
||||
+ cpu-supply = <&ipq9574_s1>;
|
||||
};
|
||||
|
||||
CPU2: cpu@2 {
|
||||
@@ -53,6 +62,10 @@
|
||||
reg = <0x2>;
|
||||
enable-method = "psci";
|
||||
next-level-cache = <&L2_0>;
|
||||
+ clocks = <&apcs_glb APCS_ALIAS0_CORE_CLK>;
|
||||
+ clock-names = "cpu";
|
||||
+ operating-points-v2 = <&cpu_opp_table>;
|
||||
+ cpu-supply = <&ipq9574_s1>;
|
||||
};
|
||||
|
||||
CPU3: cpu@3 {
|
||||
@@ -61,6 +74,10 @@
|
||||
reg = <0x3>;
|
||||
enable-method = "psci";
|
||||
next-level-cache = <&L2_0>;
|
||||
+ clocks = <&apcs_glb APCS_ALIAS0_CORE_CLK>;
|
||||
+ clock-names = "cpu";
|
||||
+ operating-points-v2 = <&cpu_opp_table>;
|
||||
+ cpu-supply = <&ipq9574_s1>;
|
||||
};
|
||||
|
||||
L2_0: l2-cache {
|
||||
@@ -75,6 +92,47 @@
|
||||
reg = <0x0 0x40000000 0x0 0x0>;
|
||||
};
|
||||
|
||||
+ cpu_opp_table: opp-table-cpu {
|
||||
+ compatible = "operating-points-v2";
|
||||
+ opp-shared;
|
||||
+
|
||||
+ opp-936000000 {
|
||||
+ opp-hz = /bits/ 64 <936000000>;
|
||||
+ opp-microvolt = <725000>;
|
||||
+ clock-latency-ns = <200000>;
|
||||
+ };
|
||||
+
|
||||
+ opp-1104000000 {
|
||||
+ opp-hz = /bits/ 64 <1104000000>;
|
||||
+ opp-microvolt = <787500>;
|
||||
+ clock-latency-ns = <200000>;
|
||||
+ };
|
||||
+
|
||||
+ opp-1416000000 {
|
||||
+ opp-hz = /bits/ 64 <1416000000>;
|
||||
+ opp-microvolt = <862500>;
|
||||
+ clock-latency-ns = <200000>;
|
||||
+ };
|
||||
+
|
||||
+ opp-1488000000 {
|
||||
+ opp-hz = /bits/ 64 <1488000000>;
|
||||
+ opp-microvolt = <925000>;
|
||||
+ clock-latency-ns = <200000>;
|
||||
+ };
|
||||
+
|
||||
+ opp-1800000000 {
|
||||
+ opp-hz = /bits/ 64 <1800000000>;
|
||||
+ opp-microvolt = <987500>;
|
||||
+ clock-latency-ns = <200000>;
|
||||
+ };
|
||||
+
|
||||
+ opp-2208000000 {
|
||||
+ opp-hz = /bits/ 64 <2208000000>;
|
||||
+ opp-microvolt = <1062500>;
|
||||
+ clock-latency-ns = <200000>;
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
pmu {
|
||||
compatible = "arm,cortex-a73-pmu";
|
||||
interrupts = <GIC_PPI 7 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_HIGH)>;
|
@ -1,45 +0,0 @@
|
||||
From d02b30b6e397d2ab09a703bb873fe722406ab06a Mon Sep 17 00:00:00 2001
|
||||
From: Devi Priya <quic_devipriy@quicinc.com>
|
||||
Date: Wed, 17 May 2023 22:55:26 +0530
|
||||
Subject: [PATCH 20/41] arm64: dts: qcom: ipq9574: Add SMPA1 regulator node
|
||||
|
||||
Add support for SMPA1 regulator node in IPQ9574.
|
||||
|
||||
Reviewed-by: Konrad Dybcio <konrad.dybcio@linaro.org>
|
||||
Co-developed-by: Praveenkumar I <quic_ipkumar@quicinc.com>
|
||||
Signed-off-by: Praveenkumar I <quic_ipkumar@quicinc.com>
|
||||
Signed-off-by: Devi Priya <quic_devipriy@quicinc.com>
|
||||
Signed-off-by: Bjorn Andersson <andersson@kernel.org>
|
||||
Link: https://lore.kernel.org/r/20230517172527.1968-3-quic_devipriy@quicinc.com
|
||||
---
|
||||
arch/arm64/boot/dts/qcom/ipq9574-rdp433.dts | 19 +++++++++++++++++++
|
||||
1 file changed, 19 insertions(+)
|
||||
|
||||
--- a/arch/arm64/boot/dts/qcom/ipq9574-rdp433.dts
|
||||
+++ b/arch/arm64/boot/dts/qcom/ipq9574-rdp433.dts
|
||||
@@ -29,6 +29,25 @@
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
+&rpm_requests {
|
||||
+ regulators {
|
||||
+ compatible = "qcom,rpm-mp5496-regulators";
|
||||
+
|
||||
+ ipq9574_s1: s1 {
|
||||
+ /*
|
||||
+ * During kernel bootup, the SoC runs at 800MHz with 875mV set by the bootloaders.
|
||||
+ * During regulator registration, kernel not knowing the initial voltage,
|
||||
+ * considers it as zero and brings up the regulators with minimum supported voltage.
|
||||
+ * Update the regulator-min-microvolt with SVS voltage of 725mV so that
|
||||
+ * the regulators are brought up with 725mV which is sufficient for all the
|
||||
+ * corner parts to operate at 800MHz
|
||||
+ */
|
||||
+ regulator-min-microvolt = <725000>;
|
||||
+ regulator-max-microvolt = <1075000>;
|
||||
+ };
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
&sdhc_1 {
|
||||
pinctrl-0 = <&sdc_default_state>;
|
||||
pinctrl-names = "default";
|
@ -1,50 +0,0 @@
|
||||
From 3ef03d409e8cb97d6659fa7b130b14f1726ea8bb Mon Sep 17 00:00:00 2001
|
||||
From: Devi Priya <quic_devipriy@quicinc.com>
|
||||
Date: Wed, 17 May 2023 22:55:25 +0530
|
||||
Subject: [PATCH 21/41] arm64: dts: qcom: ipq9574: Add RPM related nodes
|
||||
|
||||
Add RPM Glink & RPM message RAM nodes to support frequency scaling
|
||||
on IPQ9574.
|
||||
|
||||
Reviewed-by: Konrad Dybcio <konrad.dybcio@linaro.org>
|
||||
Co-developed-by: Praveenkumar I <quic_ipkumar@quicinc.com>
|
||||
Signed-off-by: Praveenkumar I <quic_ipkumar@quicinc.com>
|
||||
Signed-off-by: Devi Priya <quic_devipriy@quicinc.com>
|
||||
Signed-off-by: Bjorn Andersson <andersson@kernel.org>
|
||||
Link: https://lore.kernel.org/r/20230517172527.1968-2-quic_devipriy@quicinc.com
|
||||
---
|
||||
arch/arm64/boot/dts/qcom/ipq9574.dtsi | 17 +++++++++++++++++
|
||||
1 file changed, 17 insertions(+)
|
||||
|
||||
--- a/arch/arm64/boot/dts/qcom/ipq9574.dtsi
|
||||
+++ b/arch/arm64/boot/dts/qcom/ipq9574.dtsi
|
||||
@@ -161,12 +161,29 @@
|
||||
};
|
||||
};
|
||||
|
||||
+ rpm-glink {
|
||||
+ compatible = "qcom,glink-rpm";
|
||||
+ interrupts = <GIC_SPI 168 IRQ_TYPE_EDGE_RISING>;
|
||||
+ qcom,rpm-msg-ram = <&rpm_msg_ram>;
|
||||
+ mboxes = <&apcs_glb 0>;
|
||||
+
|
||||
+ rpm_requests: rpm-requests {
|
||||
+ compatible = "qcom,rpm-ipq9574";
|
||||
+ qcom,glink-channels = "rpm_requests";
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
soc: soc@0 {
|
||||
compatible = "simple-bus";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
ranges = <0 0 0 0xffffffff>;
|
||||
|
||||
+ rpm_msg_ram: sram@60000 {
|
||||
+ compatible = "qcom,rpm-msg-ram";
|
||||
+ reg = <0x00060000 0x6000>;
|
||||
+ };
|
||||
+
|
||||
tlmm: pinctrl@1000000 {
|
||||
compatible = "qcom,ipq9574-tlmm";
|
||||
reg = <0x01000000 0x300000>;
|
@ -1,247 +0,0 @@
|
||||
From 0a8b1ac041c37115b7d09afeb203ed8900225cd1 Mon Sep 17 00:00:00 2001
|
||||
From: Kathiravan T <quic_kathirav@quicinc.com>
|
||||
Date: Wed, 17 May 2023 12:58:06 +0530
|
||||
Subject: [PATCH 22/41] arm64: dts: qcom: ipq9574: add few device nodes
|
||||
|
||||
Add QUP(SPI / I2C) peripheral, PRNG, WDOG and the remaining UART nodes.
|
||||
While at it, enable the SPI NOR in RDP433 board.
|
||||
|
||||
Signed-off-by: Kathiravan T <quic_kathirav@quicinc.com>
|
||||
Signed-off-by: Bjorn Andersson <andersson@kernel.org>
|
||||
Link: https://lore.kernel.org/r/20230517072806.13170-1-quic_kathirav@quicinc.com
|
||||
---
|
||||
arch/arm64/boot/dts/qcom/ipq9574.dtsi | 202 ++++++++++++++++++++++++++
|
||||
1 file changed, 202 insertions(+)
|
||||
|
||||
--- a/arch/arm64/boot/dts/qcom/ipq9574.dtsi
|
||||
+++ b/arch/arm64/boot/dts/qcom/ipq9574.dtsi
|
||||
@@ -184,6 +184,13 @@
|
||||
reg = <0x00060000 0x6000>;
|
||||
};
|
||||
|
||||
+ rng: rng@e3000 {
|
||||
+ compatible = "qcom,prng-ee";
|
||||
+ reg = <0x000e3000 0x1000>;
|
||||
+ clocks = <&gcc GCC_PRNG_AHB_CLK>;
|
||||
+ clock-names = "core";
|
||||
+ };
|
||||
+
|
||||
tlmm: pinctrl@1000000 {
|
||||
compatible = "qcom,ipq9574-tlmm";
|
||||
reg = <0x01000000 0x300000>;
|
||||
@@ -241,6 +248,36 @@
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
+ blsp_dma: dma-controller@7884000 {
|
||||
+ compatible = "qcom,bam-v1.7.0";
|
||||
+ reg = <0x07884000 0x2b000>;
|
||||
+ interrupts = <GIC_SPI 238 IRQ_TYPE_LEVEL_HIGH>;
|
||||
+ clocks = <&gcc GCC_BLSP1_AHB_CLK>;
|
||||
+ clock-names = "bam_clk";
|
||||
+ #dma-cells = <1>;
|
||||
+ qcom,ee = <0>;
|
||||
+ };
|
||||
+
|
||||
+ blsp1_uart0: serial@78af000 {
|
||||
+ compatible = "qcom,msm-uartdm-v1.4", "qcom,msm-uartdm";
|
||||
+ reg = <0x078af000 0x200>;
|
||||
+ interrupts = <GIC_SPI 107 IRQ_TYPE_LEVEL_HIGH>;
|
||||
+ clocks = <&gcc GCC_BLSP1_UART1_APPS_CLK>,
|
||||
+ <&gcc GCC_BLSP1_AHB_CLK>;
|
||||
+ clock-names = "core", "iface";
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
+
|
||||
+ blsp1_uart1: serial@78b0000 {
|
||||
+ compatible = "qcom,msm-uartdm-v1.4", "qcom,msm-uartdm";
|
||||
+ reg = <0x078b0000 0x200>;
|
||||
+ interrupts = <GIC_SPI 108 IRQ_TYPE_LEVEL_HIGH>;
|
||||
+ clocks = <&gcc GCC_BLSP1_UART2_APPS_CLK>,
|
||||
+ <&gcc GCC_BLSP1_AHB_CLK>;
|
||||
+ clock-names = "core", "iface";
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
+
|
||||
blsp1_uart2: serial@78b1000 {
|
||||
compatible = "qcom,msm-uartdm-v1.4", "qcom,msm-uartdm";
|
||||
reg = <0x078b1000 0x200>;
|
||||
@@ -251,6 +288,163 @@
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
+ blsp1_uart3: serial@78b2000 {
|
||||
+ compatible = "qcom,msm-uartdm-v1.4", "qcom,msm-uartdm";
|
||||
+ reg = <0x078b2000 0x200>;
|
||||
+ interrupts = <GIC_SPI 307 IRQ_TYPE_LEVEL_HIGH>;
|
||||
+ clocks = <&gcc GCC_BLSP1_UART4_APPS_CLK>,
|
||||
+ <&gcc GCC_BLSP1_AHB_CLK>;
|
||||
+ clock-names = "core", "iface";
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
+
|
||||
+ blsp1_uart4: serial@78b3000 {
|
||||
+ compatible = "qcom,msm-uartdm-v1.4", "qcom,msm-uartdm";
|
||||
+ reg = <0x078b3000 0x200>;
|
||||
+ interrupts = <GIC_SPI 308 IRQ_TYPE_LEVEL_HIGH>;
|
||||
+ clocks = <&gcc GCC_BLSP1_UART5_APPS_CLK>,
|
||||
+ <&gcc GCC_BLSP1_AHB_CLK>;
|
||||
+ clock-names = "core", "iface";
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
+
|
||||
+ blsp1_uart5: serial@78b4000 {
|
||||
+ compatible = "qcom,msm-uartdm-v1.4", "qcom,msm-uartdm";
|
||||
+ reg = <0x078b4000 0x200>;
|
||||
+ interrupts = <GIC_SPI 309 IRQ_TYPE_LEVEL_HIGH>;
|
||||
+ clocks = <&gcc GCC_BLSP1_UART6_APPS_CLK>,
|
||||
+ <&gcc GCC_BLSP1_AHB_CLK>;
|
||||
+ clock-names = "core", "iface";
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
+
|
||||
+ blsp1_spi0: spi@78b5000 {
|
||||
+ compatible = "qcom,spi-qup-v2.2.1";
|
||||
+ reg = <0x078b5000 0x600>;
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+ interrupts = <GIC_SPI 95 IRQ_TYPE_LEVEL_HIGH>;
|
||||
+ clocks = <&gcc GCC_BLSP1_QUP1_SPI_APPS_CLK>,
|
||||
+ <&gcc GCC_BLSP1_AHB_CLK>;
|
||||
+ clock-names = "core", "iface";
|
||||
+ dmas = <&blsp_dma 12>, <&blsp_dma 13>;
|
||||
+ dma-names = "tx", "rx";
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
+
|
||||
+ blsp1_i2c1: i2c@78b6000 {
|
||||
+ compatible = "qcom,i2c-qup-v2.2.1";
|
||||
+ reg = <0x078b6000 0x600>;
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+ interrupts = <GIC_SPI 96 IRQ_TYPE_LEVEL_HIGH>;
|
||||
+ clocks = <&gcc GCC_BLSP1_QUP2_I2C_APPS_CLK>,
|
||||
+ <&gcc GCC_BLSP1_AHB_CLK>;
|
||||
+ clock-names = "core", "iface";
|
||||
+ dmas = <&blsp_dma 14>, <&blsp_dma 15>;
|
||||
+ dma-names = "tx", "rx";
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
+
|
||||
+ blsp1_spi1: spi@78b6000 {
|
||||
+ compatible = "qcom,spi-qup-v2.2.1";
|
||||
+ reg = <0x078b6000 0x600>;
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+ interrupts = <GIC_SPI 96 IRQ_TYPE_LEVEL_HIGH>;
|
||||
+ clocks = <&gcc GCC_BLSP1_QUP2_SPI_APPS_CLK>,
|
||||
+ <&gcc GCC_BLSP1_AHB_CLK>;
|
||||
+ clock-names = "core", "iface";
|
||||
+ dmas = <&blsp_dma 14>, <&blsp_dma 15>;
|
||||
+ dma-names = "tx", "rx";
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
+
|
||||
+ blsp1_i2c2: i2c@78b7000 {
|
||||
+ compatible = "qcom,i2c-qup-v2.2.1";
|
||||
+ reg = <0x078b7000 0x600>;
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+ interrupts = <GIC_SPI 97 IRQ_TYPE_LEVEL_HIGH>;
|
||||
+ clocks = <&gcc GCC_BLSP1_QUP3_I2C_APPS_CLK>,
|
||||
+ <&gcc GCC_BLSP1_AHB_CLK>;
|
||||
+ clock-names = "core", "iface";
|
||||
+ dmas = <&blsp_dma 16>, <&blsp_dma 17>;
|
||||
+ dma-names = "tx", "rx";
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
+
|
||||
+ blsp1_spi2: spi@78b7000 {
|
||||
+ compatible = "qcom,spi-qup-v2.2.1";
|
||||
+ reg = <0x078b7000 0x600>;
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+ interrupts = <GIC_SPI 97 IRQ_TYPE_LEVEL_HIGH>;
|
||||
+ clocks = <&gcc GCC_BLSP1_QUP3_SPI_APPS_CLK>,
|
||||
+ <&gcc GCC_BLSP1_AHB_CLK>;
|
||||
+ clock-names = "core", "iface";
|
||||
+ dmas = <&blsp_dma 16>, <&blsp_dma 17>;
|
||||
+ dma-names = "tx", "rx";
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
+
|
||||
+ blsp1_i2c3: i2c@78b8000 {
|
||||
+ compatible = "qcom,i2c-qup-v2.2.1";
|
||||
+ reg = <0x078b8000 0x600>;
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+ interrupts = <GIC_SPI 98 IRQ_TYPE_LEVEL_HIGH>;
|
||||
+ clocks = <&gcc GCC_BLSP1_QUP4_I2C_APPS_CLK>,
|
||||
+ <&gcc GCC_BLSP1_AHB_CLK>;
|
||||
+ clock-names = "core", "iface";
|
||||
+ dmas = <&blsp_dma 18>, <&blsp_dma 19>;
|
||||
+ dma-names = "tx", "rx";
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
+
|
||||
+ blsp1_spi3: spi@78b8000 {
|
||||
+ compatible = "qcom,spi-qup-v2.2.1";
|
||||
+ reg = <0x078b8000 0x600>;
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+ interrupts = <GIC_SPI 98 IRQ_TYPE_LEVEL_HIGH>;
|
||||
+ spi-max-frequency = <50000000>;
|
||||
+ clocks = <&gcc GCC_BLSP1_QUP4_SPI_APPS_CLK>,
|
||||
+ <&gcc GCC_BLSP1_AHB_CLK>;
|
||||
+ clock-names = "core", "iface";
|
||||
+ dmas = <&blsp_dma 18>, <&blsp_dma 19>;
|
||||
+ dma-names = "tx", "rx";
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
+
|
||||
+ blsp1_i2c4: i2c@78b9000 {
|
||||
+ compatible = "qcom,i2c-qup-v2.2.1";
|
||||
+ reg = <0x078b9000 0x600>;
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+ interrupts = <GIC_SPI 299 IRQ_TYPE_LEVEL_HIGH>;
|
||||
+ clocks = <&gcc GCC_BLSP1_QUP5_I2C_APPS_CLK>,
|
||||
+ <&gcc GCC_BLSP1_AHB_CLK>;
|
||||
+ clock-names = "core", "iface";
|
||||
+ dmas = <&blsp_dma 20>, <&blsp_dma 21>;
|
||||
+ dma-names = "tx", "rx";
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
+
|
||||
+ blsp1_spi4: spi@78b9000 {
|
||||
+ compatible = "qcom,spi-qup-v2.2.1";
|
||||
+ reg = <0x078b9000 0x600>;
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+ interrupts = <GIC_SPI 299 IRQ_TYPE_LEVEL_HIGH>;
|
||||
+ clocks = <&gcc GCC_BLSP1_QUP5_SPI_APPS_CLK>,
|
||||
+ <&gcc GCC_BLSP1_AHB_CLK>;
|
||||
+ clock-names = "core", "iface";
|
||||
+ dmas = <&blsp_dma 20>, <&blsp_dma 21>;
|
||||
+ dma-names = "tx", "rx";
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
+
|
||||
intc: interrupt-controller@b000000 {
|
||||
compatible = "qcom,msm-qgic2";
|
||||
reg = <0x0b000000 0x1000>, /* GICD */
|
||||
@@ -301,6 +495,14 @@
|
||||
clock-names = "xo";
|
||||
};
|
||||
|
||||
+ watchdog: watchdog@b017000 {
|
||||
+ compatible = "qcom,apss-wdt-ipq9574", "qcom,kpss-wdt";
|
||||
+ reg = <0x0b017000 0x1000>;
|
||||
+ interrupts = <GIC_SPI 3 IRQ_TYPE_EDGE_RISING>;
|
||||
+ clocks = <&sleep_clk>;
|
||||
+ timeout-sec = <30>;
|
||||
+ };
|
||||
+
|
||||
timer@b120000 {
|
||||
compatible = "arm,armv7-timer-mem";
|
||||
reg = <0x0b120000 0x1000>;
|
@ -1,60 +0,0 @@
|
||||
From d8dc9c70bb55769ebcf17ed9b1ff085c7fb09bff Mon Sep 17 00:00:00 2001
|
||||
From: Vignesh Viswanathan <quic_viswanat@quicinc.com>
|
||||
Date: Fri, 26 May 2023 16:36:53 +0530
|
||||
Subject: [PATCH 23/41] arm64: dts: qcom: add few more reserved memory region
|
||||
|
||||
In IPQ SoCs, bootloader will collect the system RAM contents upon crash
|
||||
for the post morterm analysis. If we don't reserve the memory region used
|
||||
by bootloader, obviously linux will consume it and upon next boot on
|
||||
crash, bootloader will be loaded in the same region, which will lead to
|
||||
loose some of the data, sometimes we may miss out critical information.
|
||||
So lets reserve the region used by the bootloader.
|
||||
|
||||
Similarly SBL copies some data into the reserved region and it will be
|
||||
used in the crash scenario. So reserve 1MB for SBL as well.
|
||||
|
||||
While at it, drop the size padding in the reserved memory region,
|
||||
wherever applicable.
|
||||
|
||||
Signed-off-by: Vignesh Viswanathan <quic_viswanat@quicinc.com>
|
||||
Signed-off-by: Bjorn Andersson <andersson@kernel.org>
|
||||
Link: https://lore.kernel.org/r/20230526110653.27777-4-quic_viswanat@quicinc.com
|
||||
---
|
||||
arch/arm64/boot/dts/qcom/ipq6018.dtsi | 16 +++++++++++++---
|
||||
arch/arm64/boot/dts/qcom/ipq8074.dtsi | 14 ++++++++++++--
|
||||
2 files changed, 25 insertions(+), 5 deletions(-)
|
||||
|
||||
--- a/arch/arm64/boot/dts/qcom/ipq6018.dtsi
|
||||
+++ b/arch/arm64/boot/dts/qcom/ipq6018.dtsi
|
||||
@@ -150,18 +150,28 @@
|
||||
no-map;
|
||||
};
|
||||
|
||||
+ bootloader@4a100000 {
|
||||
+ reg = <0x0 0x4a100000 0x0 0x400000>;
|
||||
+ no-map;
|
||||
+ };
|
||||
+
|
||||
+ sbl@4a500000 {
|
||||
+ reg = <0x0 0x4a500000 0x0 0x100000>;
|
||||
+ no-map;
|
||||
+ };
|
||||
+
|
||||
tz: memory@4a600000 {
|
||||
- reg = <0x0 0x4a600000 0x0 0x00400000>;
|
||||
+ reg = <0x0 0x4a600000 0x0 0x400000>;
|
||||
no-map;
|
||||
};
|
||||
|
||||
smem_region: memory@4aa00000 {
|
||||
- reg = <0x0 0x4aa00000 0x0 0x00100000>;
|
||||
+ reg = <0x0 0x4aa00000 0x0 0x100000>;
|
||||
no-map;
|
||||
};
|
||||
|
||||
q6_region: memory@4ab00000 {
|
||||
- reg = <0x0 0x4ab00000 0x0 0x05500000>;
|
||||
+ reg = <0x0 0x4ab00000 0x0 0x5500000>;
|
||||
no-map;
|
||||
};
|
||||
};
|
@ -1,33 +0,0 @@
|
||||
From 040e839870bb864a62a1e769fdfbbc5de64a724d Mon Sep 17 00:00:00 2001
|
||||
From: Kathiravan T <quic_kathirav@quicinc.com>
|
||||
Date: Fri, 26 May 2023 18:23:05 +0530
|
||||
Subject: [PATCH 24/41] arm64: dts: qcom: ipq9574: add QFPROM node
|
||||
|
||||
IPQ9574 has efuse region to determine the various HW quirks. Lets
|
||||
add the initial support and the individual fuses will be added as they
|
||||
are required.
|
||||
|
||||
Reviewed-by: Konrad Dybcio <konrad.dybcio@linaro.org>
|
||||
Signed-off-by: Kathiravan T <quic_kathirav@quicinc.com>
|
||||
Signed-off-by: Bjorn Andersson <andersson@kernel.org>
|
||||
Link: https://lore.kernel.org/r/20230526125305.19626-5-quic_kathirav@quicinc.com
|
||||
---
|
||||
arch/arm64/boot/dts/qcom/ipq9574.dtsi | 7 +++++++
|
||||
1 file changed, 7 insertions(+)
|
||||
|
||||
--- a/arch/arm64/boot/dts/qcom/ipq9574.dtsi
|
||||
+++ b/arch/arm64/boot/dts/qcom/ipq9574.dtsi
|
||||
@@ -191,6 +191,13 @@
|
||||
clock-names = "core";
|
||||
};
|
||||
|
||||
+ qfprom: efuse@a4000 {
|
||||
+ compatible = "qcom,ipq9574-qfprom", "qcom,qfprom";
|
||||
+ reg = <0x000a4000 0x5a1>;
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <1>;
|
||||
+ };
|
||||
+
|
||||
tlmm: pinctrl@1000000 {
|
||||
compatible = "qcom,ipq9574-tlmm";
|
||||
reg = <0x01000000 0x300000>;
|
@ -1,112 +0,0 @@
|
||||
From cc88e897a8fe19d2a611a51321577c11a7997e68 Mon Sep 17 00:00:00 2001
|
||||
From: Devi Priya <quic_devipriy@quicinc.com>
|
||||
Date: Fri, 26 May 2023 21:01:52 +0530
|
||||
Subject: [PATCH 25/41] arm64: dts: qcom: ipq9574: add support for RDP453
|
||||
variant
|
||||
|
||||
Add the initial device tree support for the Reference Design Platform (RDP)
|
||||
453 based on IPQ9574 family of SoCs. This patch adds support for Console
|
||||
UART, SPI NOR and SMPA1 regulator node.
|
||||
|
||||
Signed-off-by: Devi Priya <quic_devipriy@quicinc.com>
|
||||
Signed-off-by: Bjorn Andersson <andersson@kernel.org>
|
||||
Link: https://lore.kernel.org/r/20230526153152.777-3-quic_devipriy@quicinc.com
|
||||
---
|
||||
arch/arm64/boot/dts/qcom/Makefile | 1 +
|
||||
arch/arm64/boot/dts/qcom/ipq9574-rdp453.dts | 80 +++++++++++++++++++++
|
||||
2 files changed, 81 insertions(+)
|
||||
create mode 100644 arch/arm64/boot/dts/qcom/ipq9574-rdp453.dts
|
||||
|
||||
--- a/arch/arm64/boot/dts/qcom/Makefile
|
||||
+++ b/arch/arm64/boot/dts/qcom/Makefile
|
||||
@@ -10,6 +10,7 @@ dtb-$(CONFIG_ARCH_QCOM) += ipq8074-hk10-
|
||||
dtb-$(CONFIG_ARCH_QCOM) += ipq9574-rdp418.dtb
|
||||
dtb-$(CONFIG_ARCH_QCOM) += ipq9574-rdp433.dtb
|
||||
dtb-$(CONFIG_ARCH_QCOM) += ipq9574-rdp449.dtb
|
||||
+dtb-$(CONFIG_ARCH_QCOM) += ipq9574-rdp453.dtb
|
||||
dtb-$(CONFIG_ARCH_QCOM) += msm8916-alcatel-idol347.dtb
|
||||
dtb-$(CONFIG_ARCH_QCOM) += msm8916-asus-z00l.dtb
|
||||
dtb-$(CONFIG_ARCH_QCOM) += msm8916-huawei-g7.dtb
|
||||
--- /dev/null
|
||||
+++ b/arch/arm64/boot/dts/qcom/ipq9574-rdp453.dts
|
||||
@@ -0,0 +1,80 @@
|
||||
+// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)
|
||||
+/*
|
||||
+ * IPQ9574 RDP453 board device tree source
|
||||
+ *
|
||||
+ * Copyright (c) 2020-2021 The Linux Foundation. All rights reserved.
|
||||
+ * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
+ */
|
||||
+
|
||||
+/dts-v1/;
|
||||
+
|
||||
+#include "ipq9574.dtsi"
|
||||
+
|
||||
+/ {
|
||||
+ model = "Qualcomm Technologies, Inc. IPQ9574/AP-AL02-C8";
|
||||
+ compatible = "qcom,ipq9574-ap-al02-c8", "qcom,ipq9574";
|
||||
+
|
||||
+ aliases {
|
||||
+ serial0 = &blsp1_uart2;
|
||||
+ };
|
||||
+
|
||||
+ chosen {
|
||||
+ stdout-path = "serial0:115200n8";
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&blsp1_spi0 {
|
||||
+ pinctrl-0 = <&spi_0_pins>;
|
||||
+ pinctrl-names = "default";
|
||||
+ status = "okay";
|
||||
+
|
||||
+ flash@0 {
|
||||
+ compatible = "micron,n25q128a11", "jedec,spi-nor";
|
||||
+ reg = <0>;
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <1>;
|
||||
+ spi-max-frequency = <50000000>;
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&blsp1_uart2 {
|
||||
+ pinctrl-0 = <&uart2_pins>;
|
||||
+ pinctrl-names = "default";
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&rpm_requests {
|
||||
+ regulators {
|
||||
+ compatible = "qcom,rpm-mp5496-regulators";
|
||||
+
|
||||
+ ipq9574_s1: s1 {
|
||||
+ /*
|
||||
+ * During kernel bootup, the SoC runs at 800MHz with 875mV set by the bootloaders.
|
||||
+ * During regulator registration, kernel not knowing the initial voltage,
|
||||
+ * considers it as zero and brings up the regulators with minimum supported voltage.
|
||||
+ * Update the regulator-min-microvolt with SVS voltage of 725mV so that
|
||||
+ * the regulators are brought up with 725mV which is sufficient for all the
|
||||
+ * corner parts to operate at 800MHz
|
||||
+ */
|
||||
+ regulator-min-microvolt = <725000>;
|
||||
+ regulator-max-microvolt = <1075000>;
|
||||
+ };
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&sleep_clk {
|
||||
+ clock-frequency = <32000>;
|
||||
+};
|
||||
+
|
||||
+&tlmm {
|
||||
+ spi_0_pins: spi-0-state {
|
||||
+ pins = "gpio11", "gpio12", "gpio13", "gpio14";
|
||||
+ function = "blsp0_spi";
|
||||
+ drive-strength = <8>;
|
||||
+ bias-disable;
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&xo_board_clk {
|
||||
+ clock-frequency = <24000000>;
|
||||
+};
|
@ -1,112 +0,0 @@
|
||||
From acd0e1607b9d113fe2240a571358d8bbdb6f2504 Mon Sep 17 00:00:00 2001
|
||||
From: Poovendhan Selvaraj <quic_poovendh@quicinc.com>
|
||||
Date: Wed, 31 May 2023 08:56:48 +0530
|
||||
Subject: [PATCH 26/41] arm64: dts: qcom: ipq9574: add support for RDP454
|
||||
variant
|
||||
|
||||
Add the initial device tree support for the Reference Design Platform (RDP)
|
||||
454 based on IPQ9574 family of SoCs. This patch adds support for Console
|
||||
UART, SPI NOR and SMPA1 regulator node.
|
||||
|
||||
Signed-off-by: Poovendhan Selvaraj <quic_poovendh@quicinc.com>
|
||||
Signed-off-by: Bjorn Andersson <andersson@kernel.org>
|
||||
Link: https://lore.kernel.org/r/20230531032648.23816-3-quic_poovendh@quicinc.com
|
||||
---
|
||||
arch/arm64/boot/dts/qcom/Makefile | 1 +
|
||||
arch/arm64/boot/dts/qcom/ipq9574-rdp454.dts | 80 +++++++++++++++++++++
|
||||
2 files changed, 81 insertions(+)
|
||||
create mode 100644 arch/arm64/boot/dts/qcom/ipq9574-rdp454.dts
|
||||
|
||||
--- a/arch/arm64/boot/dts/qcom/Makefile
|
||||
+++ b/arch/arm64/boot/dts/qcom/Makefile
|
||||
@@ -11,6 +11,7 @@ dtb-$(CONFIG_ARCH_QCOM) += ipq9574-rdp41
|
||||
dtb-$(CONFIG_ARCH_QCOM) += ipq9574-rdp433.dtb
|
||||
dtb-$(CONFIG_ARCH_QCOM) += ipq9574-rdp449.dtb
|
||||
dtb-$(CONFIG_ARCH_QCOM) += ipq9574-rdp453.dtb
|
||||
+dtb-$(CONFIG_ARCH_QCOM) += ipq9574-rdp454.dtb
|
||||
dtb-$(CONFIG_ARCH_QCOM) += msm8916-alcatel-idol347.dtb
|
||||
dtb-$(CONFIG_ARCH_QCOM) += msm8916-asus-z00l.dtb
|
||||
dtb-$(CONFIG_ARCH_QCOM) += msm8916-huawei-g7.dtb
|
||||
--- /dev/null
|
||||
+++ b/arch/arm64/boot/dts/qcom/ipq9574-rdp454.dts
|
||||
@@ -0,0 +1,80 @@
|
||||
+// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)
|
||||
+/*
|
||||
+ * IPQ9574 RDP454 board device tree source
|
||||
+ *
|
||||
+ * Copyright (c) 2020-2021 The Linux Foundation. All rights reserved.
|
||||
+ * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
+ */
|
||||
+
|
||||
+/dts-v1/;
|
||||
+
|
||||
+#include "ipq9574.dtsi"
|
||||
+
|
||||
+/ {
|
||||
+ model = "Qualcomm Technologies, Inc. IPQ9574/AP-AL02-C9";
|
||||
+ compatible = "qcom,ipq9574-ap-al02-c9", "qcom,ipq9574";
|
||||
+
|
||||
+ aliases {
|
||||
+ serial0 = &blsp1_uart2;
|
||||
+ };
|
||||
+
|
||||
+ chosen {
|
||||
+ stdout-path = "serial0:115200n8";
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&blsp1_spi0 {
|
||||
+ pinctrl-0 = <&spi_0_pins>;
|
||||
+ pinctrl-names = "default";
|
||||
+ status = "okay";
|
||||
+
|
||||
+ flash@0 {
|
||||
+ compatible = "micron,n25q128a11", "jedec,spi-nor";
|
||||
+ reg = <0>;
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <1>;
|
||||
+ spi-max-frequency = <50000000>;
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&blsp1_uart2 {
|
||||
+ pinctrl-0 = <&uart2_pins>;
|
||||
+ pinctrl-names = "default";
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&rpm_requests {
|
||||
+ regulators {
|
||||
+ compatible = "qcom,rpm-mp5496-regulators";
|
||||
+
|
||||
+ ipq9574_s1: s1 {
|
||||
+ /*
|
||||
+ * During kernel bootup, the SoC runs at 800MHz with 875mV set by the bootloaders.
|
||||
+ * During regulator registration, kernel not knowing the initial voltage,
|
||||
+ * considers it as zero and brings up the regulators with minimum supported voltage.
|
||||
+ * Update the regulator-min-microvolt with SVS voltage of 725mV so that
|
||||
+ * the regulators are brought up with 725mV which is sufficient for all the
|
||||
+ * corner parts to operate at 800MHz
|
||||
+ */
|
||||
+ regulator-min-microvolt = <725000>;
|
||||
+ regulator-max-microvolt = <1075000>;
|
||||
+ };
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&sleep_clk {
|
||||
+ clock-frequency = <32000>;
|
||||
+};
|
||||
+
|
||||
+&tlmm {
|
||||
+ spi_0_pins: spi-0-state {
|
||||
+ pins = "gpio11", "gpio12", "gpio13", "gpio14";
|
||||
+ function = "blsp0_spi";
|
||||
+ drive-strength = <8>;
|
||||
+ bias-disable;
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&xo_board_clk {
|
||||
+ clock-frequency = <24000000>;
|
||||
+};
|
@ -1,55 +0,0 @@
|
||||
From cf53f8937fa9241f6d873a469c04d509e3062539 Mon Sep 17 00:00:00 2001
|
||||
From: Anusha Rao <quic_anusha@quicinc.com>
|
||||
Date: Fri, 2 Jun 2023 14:14:31 +0530
|
||||
Subject: [PATCH 27/41] arm64: dts: qcom: ipq9574: add few more reserved memory
|
||||
region
|
||||
|
||||
In IPQ SoCs, bootloader will collect the system RAM contents upon crash
|
||||
for post-morterm analysis. If we don't reserve the memory region used
|
||||
by bootloader, obviously linux will consume it and upon next boot on
|
||||
crash, bootloader will be loaded in the same region, which will lead to
|
||||
loss of some data, sometimes we may miss out critical information.
|
||||
So lets reserve the region used by the bootloader.
|
||||
|
||||
Similarly SBL copies some data into the reserved region and it will be
|
||||
used in the crash scenario. So reserve 1MB for SBL as well.
|
||||
|
||||
While at it, drop the size padding in the reserved memory region,
|
||||
wherever applicable
|
||||
|
||||
Signed-off-by: Anusha Rao <quic_anusha@quicinc.com>
|
||||
Reviewed-by: Kathiravan T <quic_kathirav@quicinc.com>
|
||||
Signed-off-by: Bjorn Andersson <andersson@kernel.org>
|
||||
Link: https://lore.kernel.org/r/20230602084431.19134-1-quic_anusha@quicinc.com
|
||||
---
|
||||
arch/arm64/boot/dts/qcom/ipq9574.dtsi | 12 +++++++++++-
|
||||
1 file changed, 11 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/arch/arm64/boot/dts/qcom/ipq9574.dtsi
|
||||
+++ b/arch/arm64/boot/dts/qcom/ipq9574.dtsi
|
||||
@@ -148,6 +148,16 @@
|
||||
#size-cells = <2>;
|
||||
ranges;
|
||||
|
||||
+ bootloader@4a100000 {
|
||||
+ reg = <0x0 0x4a100000 0x0 0x400000>;
|
||||
+ no-map;
|
||||
+ };
|
||||
+
|
||||
+ sbl@4a500000 {
|
||||
+ reg = <0x0 0x4a500000 0x0 0x100000>;
|
||||
+ no-map;
|
||||
+ };
|
||||
+
|
||||
tz_region: tz@4a600000 {
|
||||
reg = <0x0 0x4a600000 0x0 0x400000>;
|
||||
no-map;
|
||||
@@ -155,7 +165,7 @@
|
||||
|
||||
smem@4aa00000 {
|
||||
compatible = "qcom,smem";
|
||||
- reg = <0x0 0x4aa00000 0x0 0x00100000>;
|
||||
+ reg = <0x0 0x4aa00000 0x0 0x100000>;
|
||||
hwlocks = <&tcsr_mutex 0>;
|
||||
no-map;
|
||||
};
|
@ -1,54 +0,0 @@
|
||||
From 366d78e84d2a737d75d72b2fb201aacac3a86696 Mon Sep 17 00:00:00 2001
|
||||
From: Devi Priya <quic_devipriy@quicinc.com>
|
||||
Date: Thu, 15 Jun 2023 14:18:41 +0530
|
||||
Subject: [PATCH 28/41] arm64: dts: qcom: ipq9574: Use assigned-clock-rates for
|
||||
QUP I2C core clks
|
||||
|
||||
Use assigned-clock-rates property for configuring the QUP I2C core clocks
|
||||
to operate at nominal frequency.
|
||||
|
||||
Signed-off-by: Devi Priya <quic_devipriy@quicinc.com>
|
||||
Link: https://lore.kernel.org/r/20230615084841.12375-1-quic_devipriy@quicinc.com
|
||||
Signed-off-by: Bjorn Andersson <andersson@kernel.org>
|
||||
---
|
||||
arch/arm64/boot/dts/qcom/ipq9574.dtsi | 8 ++++++++
|
||||
1 file changed, 8 insertions(+)
|
||||
|
||||
--- a/arch/arm64/boot/dts/qcom/ipq9574.dtsi
|
||||
+++ b/arch/arm64/boot/dts/qcom/ipq9574.dtsi
|
||||
@@ -358,6 +358,8 @@
|
||||
clocks = <&gcc GCC_BLSP1_QUP2_I2C_APPS_CLK>,
|
||||
<&gcc GCC_BLSP1_AHB_CLK>;
|
||||
clock-names = "core", "iface";
|
||||
+ assigned-clocks = <&gcc GCC_BLSP1_QUP2_I2C_APPS_CLK>;
|
||||
+ assigned-clock-rates = <50000000>;
|
||||
dmas = <&blsp_dma 14>, <&blsp_dma 15>;
|
||||
dma-names = "tx", "rx";
|
||||
status = "disabled";
|
||||
@@ -386,6 +388,8 @@
|
||||
clocks = <&gcc GCC_BLSP1_QUP3_I2C_APPS_CLK>,
|
||||
<&gcc GCC_BLSP1_AHB_CLK>;
|
||||
clock-names = "core", "iface";
|
||||
+ assigned-clocks = <&gcc GCC_BLSP1_QUP3_I2C_APPS_CLK>;
|
||||
+ assigned-clock-rates = <50000000>;
|
||||
dmas = <&blsp_dma 16>, <&blsp_dma 17>;
|
||||
dma-names = "tx", "rx";
|
||||
status = "disabled";
|
||||
@@ -414,6 +418,8 @@
|
||||
clocks = <&gcc GCC_BLSP1_QUP4_I2C_APPS_CLK>,
|
||||
<&gcc GCC_BLSP1_AHB_CLK>;
|
||||
clock-names = "core", "iface";
|
||||
+ assigned-clocks = <&gcc GCC_BLSP1_QUP4_I2C_APPS_CLK>;
|
||||
+ assigned-clock-rates = <50000000>;
|
||||
dmas = <&blsp_dma 18>, <&blsp_dma 19>;
|
||||
dma-names = "tx", "rx";
|
||||
status = "disabled";
|
||||
@@ -443,6 +449,8 @@
|
||||
clocks = <&gcc GCC_BLSP1_QUP5_I2C_APPS_CLK>,
|
||||
<&gcc GCC_BLSP1_AHB_CLK>;
|
||||
clock-names = "core", "iface";
|
||||
+ assigned-clocks = <&gcc GCC_BLSP1_QUP5_I2C_APPS_CLK>;
|
||||
+ assigned-clock-rates = <50000000>;
|
||||
dmas = <&blsp_dma 20>, <&blsp_dma 21>;
|
||||
dma-names = "tx", "rx";
|
||||
status = "disabled";
|
@ -1,31 +0,0 @@
|
||||
From 4de55890566a8ca941af940c1ada4826c069969e Mon Sep 17 00:00:00 2001
|
||||
From: Vignesh Viswanathan <quic_viswanat@quicinc.com>
|
||||
Date: Mon, 4 Sep 2023 22:55:15 +0530
|
||||
Subject: [PATCH 29/41] arm64: dts: qcom: ipq9574: Fix hwlock index for SMEM
|
||||
|
||||
SMEM uses lock index 3 of the TCSR Mutex hwlock for allocations
|
||||
in SMEM region shared by the Host and FW.
|
||||
|
||||
Fix the SMEM hwlock index to 3 for IPQ9574.
|
||||
|
||||
Cc: stable@vger.kernel.org
|
||||
Fixes: 46384ac7a618 ("arm64: dts: qcom: ipq9574: Add SMEM support")
|
||||
Signed-off-by: Vignesh Viswanathan <quic_viswanat@quicinc.com>
|
||||
Acked-by: Konrad Dybcio <konrad.dybcio@linaro.org>
|
||||
Link: https://lore.kernel.org/r/20230904172516.479866-5-quic_viswanat@quicinc.com
|
||||
Signed-off-by: Bjorn Andersson <andersson@kernel.org>
|
||||
---
|
||||
arch/arm64/boot/dts/qcom/ipq9574.dtsi | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/arch/arm64/boot/dts/qcom/ipq9574.dtsi
|
||||
+++ b/arch/arm64/boot/dts/qcom/ipq9574.dtsi
|
||||
@@ -166,7 +166,7 @@
|
||||
smem@4aa00000 {
|
||||
compatible = "qcom,smem";
|
||||
reg = <0x0 0x4aa00000 0x0 0x100000>;
|
||||
- hwlocks = <&tcsr_mutex 0>;
|
||||
+ hwlocks = <&tcsr_mutex 3>;
|
||||
no-map;
|
||||
};
|
||||
};
|
@ -1,35 +0,0 @@
|
||||
From ceeec9e4dbd9561b9483b3ad8648e66eba3c8016 Mon Sep 17 00:00:00 2001
|
||||
From: Kathiravan Thirumoorthy <quic_kathirav@quicinc.com>
|
||||
Date: Thu, 14 Sep 2023 12:30:00 +0530
|
||||
Subject: [PATCH 30/41] arm64: dts: qcom: ipq9574: include the GPLL0 as clock
|
||||
provider for mailbox
|
||||
|
||||
While the kernel is booting up, APSS clock / CPU clock will be running
|
||||
at 800MHz with GPLL0 as source. Once the cpufreq driver is available,
|
||||
APSS PLL will be configured to the rate based on the opp table and the
|
||||
source also will be changed to APSS_PLL_EARLY. So allow the mailbox to
|
||||
consume the GPLL0, with this inclusion, CPU Freq correctly reports that
|
||||
CPU is running at 800MHz rather than 24MHz.
|
||||
|
||||
Signed-off-by: Kathiravan Thirumoorthy <quic_kathirav@quicinc.com>
|
||||
Reviewed-by: Konrad Dybcio <konrad.dybcio@linaro.org>
|
||||
Link: https://lore.kernel.org/r/20230913-gpll_cleanup-v2-10-c8ceb1a37680@quicinc.com
|
||||
[bjorn: Updated commit message, as requested by Kathiravan]
|
||||
Signed-off-by: Bjorn Andersson <andersson@kernel.org>
|
||||
---
|
||||
arch/arm64/boot/dts/qcom/ipq9574.dtsi | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/arch/arm64/boot/dts/qcom/ipq9574.dtsi
|
||||
+++ b/arch/arm64/boot/dts/qcom/ipq9574.dtsi
|
||||
@@ -507,8 +507,8 @@
|
||||
"qcom,ipq6018-apcs-apps-global";
|
||||
reg = <0x0b111000 0x1000>;
|
||||
#clock-cells = <1>;
|
||||
- clocks = <&a73pll>, <&xo_board_clk>;
|
||||
- clock-names = "pll", "xo";
|
||||
+ clocks = <&a73pll>, <&xo_board_clk>, <&gcc GPLL0>;
|
||||
+ clock-names = "pll", "xo", "gpll0";
|
||||
#mbox-cells = <1>;
|
||||
};
|
||||
|
@ -1,45 +0,0 @@
|
||||
From 618e80e9a977954c06fd6fa5d65b6f712562bdaf Mon Sep 17 00:00:00 2001
|
||||
From: Kathiravan Thirumoorthy <quic_kathirav@quicinc.com>
|
||||
Date: Thu, 14 Sep 2023 12:29:57 +0530
|
||||
Subject: [PATCH 31/41] clk: qcom: apss-ipq6018: add the GPLL0 clock also as
|
||||
clock provider
|
||||
|
||||
While the kernel is booting up, APSS PLL will be running at 800MHz with
|
||||
GPLL0 as source. Once the cpufreq driver is available, APSS PLL will be
|
||||
configured and select the rate based on the opp table and the source will
|
||||
be changed to APSS_PLL_EARLY.
|
||||
|
||||
Without this patch, CPU Freq driver reports that CPU is running at 24MHz
|
||||
instead of the 800MHz.
|
||||
|
||||
Reviewed-by: Konrad Dybcio <konrad.dybcio@linaro.org>
|
||||
Tested-by: Robert Marko <robimarko@gmail.com>
|
||||
Signed-off-by: Kathiravan Thirumoorthy <quic_kathirav@quicinc.com>
|
||||
Link: https://lore.kernel.org/r/20230913-gpll_cleanup-v2-7-c8ceb1a37680@quicinc.com
|
||||
Signed-off-by: Bjorn Andersson <andersson@kernel.org>
|
||||
---
|
||||
drivers/clk/qcom/apss-ipq6018.c | 3 +++
|
||||
1 file changed, 3 insertions(+)
|
||||
|
||||
--- a/drivers/clk/qcom/apss-ipq6018.c
|
||||
+++ b/drivers/clk/qcom/apss-ipq6018.c
|
||||
@@ -20,16 +20,19 @@
|
||||
|
||||
enum {
|
||||
P_XO,
|
||||
+ P_GPLL0,
|
||||
P_APSS_PLL_EARLY,
|
||||
};
|
||||
|
||||
static const struct clk_parent_data parents_apcs_alias0_clk_src[] = {
|
||||
{ .fw_name = "xo" },
|
||||
+ { .fw_name = "gpll0" },
|
||||
{ .fw_name = "pll" },
|
||||
};
|
||||
|
||||
static const struct parent_map parents_apcs_alias0_clk_src_map[] = {
|
||||
{ P_XO, 0 },
|
||||
+ { P_GPLL0, 4 },
|
||||
{ P_APSS_PLL_EARLY, 5 },
|
||||
};
|
||||
|
@ -1,57 +0,0 @@
|
||||
From f0869d5304a548b18bd0402ed2ebe6e6fa66ec04 Mon Sep 17 00:00:00 2001
|
||||
From: Kathiravan Thirumoorthy <quic_kathirav@quicinc.com>
|
||||
Date: Thu, 14 Sep 2023 12:29:54 +0530
|
||||
Subject: [PATCH 32/41] clk: qcom: ipq9574: drop the CLK_SET_RATE_PARENT flag
|
||||
from GPLL clocks
|
||||
|
||||
GPLL clock rates are fixed and shouldn't be scaled based on the request
|
||||
from dependent clocks. Doing so will result in the unexpected behaviour.
|
||||
So drop the CLK_SET_RATE_PARENT flag from the GPLL clocks.
|
||||
|
||||
----
|
||||
Changes in V2:
|
||||
- No changes
|
||||
|
||||
Fixes: d75b82cff488 ("clk: qcom: Add Global Clock Controller driver for IPQ9574")
|
||||
Signed-off-by: Kathiravan Thirumoorthy <quic_kathirav@quicinc.com>
|
||||
Reviewed-by: Konrad Dybcio <konrad.dybcio@linaro.org>
|
||||
Link: https://lore.kernel.org/r/20230913-gpll_cleanup-v2-4-c8ceb1a37680@quicinc.com
|
||||
Signed-off-by: Bjorn Andersson <andersson@kernel.org>
|
||||
---
|
||||
drivers/clk/qcom/gcc-ipq9574.c | 4 ----
|
||||
1 file changed, 4 deletions(-)
|
||||
|
||||
--- a/drivers/clk/qcom/gcc-ipq9574.c
|
||||
+++ b/drivers/clk/qcom/gcc-ipq9574.c
|
||||
@@ -87,7 +87,6 @@ static struct clk_fixed_factor gpll0_out
|
||||
&gpll0_main.clkr.hw
|
||||
},
|
||||
.num_parents = 1,
|
||||
- .flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_fixed_factor_ops,
|
||||
},
|
||||
};
|
||||
@@ -102,7 +101,6 @@ static struct clk_alpha_pll_postdiv gpll
|
||||
&gpll0_main.clkr.hw
|
||||
},
|
||||
.num_parents = 1,
|
||||
- .flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_alpha_pll_postdiv_ro_ops,
|
||||
},
|
||||
};
|
||||
@@ -132,7 +130,6 @@ static struct clk_alpha_pll_postdiv gpll
|
||||
&gpll4_main.clkr.hw
|
||||
},
|
||||
.num_parents = 1,
|
||||
- .flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_alpha_pll_postdiv_ro_ops,
|
||||
},
|
||||
};
|
||||
@@ -162,7 +159,6 @@ static struct clk_alpha_pll_postdiv gpll
|
||||
&gpll2_main.clkr.hw
|
||||
},
|
||||
.num_parents = 1,
|
||||
- .flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_alpha_pll_postdiv_ro_ops,
|
||||
},
|
||||
};
|
@ -1,48 +0,0 @@
|
||||
From e9449be0c59beb0de16b7719ae5d9555a1a1ada7 Mon Sep 17 00:00:00 2001
|
||||
From: Kathiravan Thirumoorthy <quic_kathirav@quicinc.com>
|
||||
Date: Mon, 25 Sep 2023 13:59:22 +0530
|
||||
Subject: [PATCH 33/41] firmware: qcom_scm: use 64-bit calling convention only
|
||||
when client is 64-bit
|
||||
|
||||
Per the "SMC calling convention specification", the 64-bit calling
|
||||
convention can only be used when the client is 64-bit. Whereas the
|
||||
32-bit calling convention can be used by either a 32-bit or a 64-bit
|
||||
client.
|
||||
|
||||
Currently during SCM probe, irrespective of the client, 64-bit calling
|
||||
convention is made, which is incorrect and may lead to the undefined
|
||||
behaviour when the client is 32-bit. Let's fix it.
|
||||
|
||||
Cc: stable@vger.kernel.org
|
||||
Fixes: 9a434cee773a ("firmware: qcom_scm: Dynamically support SMCCC and legacy conventions")
|
||||
Reviewed-By: Elliot Berman <quic_eberman@quicinc.com>
|
||||
Signed-off-by: Kathiravan Thirumoorthy <quic_kathirav@quicinc.com>
|
||||
Link: https://lore.kernel.org/r/20230925-scm-v3-1-8790dff6a749@quicinc.com
|
||||
Signed-off-by: Bjorn Andersson <andersson@kernel.org>
|
||||
---
|
||||
drivers/firmware/qcom_scm.c | 7 +++++++
|
||||
1 file changed, 7 insertions(+)
|
||||
|
||||
--- a/drivers/firmware/qcom_scm.c
|
||||
+++ b/drivers/firmware/qcom_scm.c
|
||||
@@ -171,6 +171,12 @@ static enum qcom_scm_convention __get_co
|
||||
*/
|
||||
#if IS_ENABLED(CONFIG_ARM64)
|
||||
/*
|
||||
+ * Per the "SMC calling convention specification", the 64-bit calling
|
||||
+ * convention can only be used when the client is 64-bit, otherwise
|
||||
+ * system will encounter the undefined behaviour.
|
||||
+ */
|
||||
+#if IS_ENABLED(CONFIG_ARM64)
|
||||
+ /*
|
||||
* Device isn't required as there is only one argument - no device
|
||||
* needed to dma_map_single to secure world
|
||||
*/
|
||||
@@ -286,6 +292,7 @@ static bool __qcom_scm_is_call_available
|
||||
pr_err("Unknown SMC convention being used\n");
|
||||
return false;
|
||||
}
|
||||
+#endif
|
||||
|
||||
ret = qcom_scm_call(dev, &desc, &res);
|
||||
|
@ -1,99 +0,0 @@
|
||||
From 539a79c58042c7902bfff6453a589d5dc2e0230c Mon Sep 17 00:00:00 2001
|
||||
From: Varadarajan Narayanan <quic_varada@quicinc.com>
|
||||
Date: Fri, 20 Oct 2023 11:49:32 +0530
|
||||
Subject: [PATCH 36/41] clk: qcom: clk-alpha-pll: introduce stromer plus ops
|
||||
|
||||
Stromer plus APSS PLL does not support dynamic frequency scaling.
|
||||
To switch between frequencies, we have to shut down the PLL,
|
||||
configure the L and ALPHA values and turn on again. So introduce the
|
||||
separate set of ops for Stromer Plus PLL.
|
||||
|
||||
Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
|
||||
Signed-off-by: Kathiravan T <quic_kathirav@quicinc.com>
|
||||
Signed-off-by: Varadarajan Narayanan <quic_varada@quicinc.com>
|
||||
Link: https://lore.kernel.org/r/2affa6c63ff0c4342230623a7d4eef02ec7c02d4.1697781921.git.quic_varada@quicinc.com
|
||||
Signed-off-by: Bjorn Andersson <andersson@kernel.org>
|
||||
---
|
||||
drivers/clk/qcom/clk-alpha-pll.c | 63 ++++++++++++++++++++++++++++++++
|
||||
drivers/clk/qcom/clk-alpha-pll.h | 1 +
|
||||
2 files changed, 64 insertions(+)
|
||||
|
||||
--- a/drivers/clk/qcom/clk-alpha-pll.c
|
||||
+++ b/drivers/clk/qcom/clk-alpha-pll.c
|
||||
@@ -2486,3 +2486,66 @@ const struct clk_ops clk_alpha_pll_strom
|
||||
.set_rate = clk_alpha_pll_stromer_set_rate,
|
||||
};
|
||||
EXPORT_SYMBOL_GPL(clk_alpha_pll_stromer_ops);
|
||||
+
|
||||
+static int clk_alpha_pll_stromer_plus_set_rate(struct clk_hw *hw,
|
||||
+ unsigned long rate,
|
||||
+ unsigned long prate)
|
||||
+{
|
||||
+ struct clk_alpha_pll *pll = to_clk_alpha_pll(hw);
|
||||
+ u32 l, alpha_width = pll_alpha_width(pll);
|
||||
+ int ret, pll_mode;
|
||||
+ u64 a;
|
||||
+
|
||||
+ rate = alpha_pll_round_rate(rate, prate, &l, &a, alpha_width);
|
||||
+
|
||||
+ ret = regmap_read(pll->clkr.regmap, PLL_MODE(pll), &pll_mode);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ regmap_write(pll->clkr.regmap, PLL_MODE(pll), 0);
|
||||
+
|
||||
+ /* Delay of 2 output clock ticks required until output is disabled */
|
||||
+ udelay(1);
|
||||
+
|
||||
+ regmap_write(pll->clkr.regmap, PLL_L_VAL(pll), l);
|
||||
+
|
||||
+ if (alpha_width > ALPHA_BITWIDTH)
|
||||
+ a <<= alpha_width - ALPHA_BITWIDTH;
|
||||
+
|
||||
+ regmap_write(pll->clkr.regmap, PLL_ALPHA_VAL(pll), a);
|
||||
+ regmap_write(pll->clkr.regmap, PLL_ALPHA_VAL_U(pll),
|
||||
+ a >> ALPHA_BITWIDTH);
|
||||
+
|
||||
+ regmap_write(pll->clkr.regmap, PLL_MODE(pll), PLL_BYPASSNL);
|
||||
+
|
||||
+ /* Wait five micro seconds or more */
|
||||
+ udelay(5);
|
||||
+ regmap_update_bits(pll->clkr.regmap, PLL_MODE(pll), PLL_RESET_N,
|
||||
+ PLL_RESET_N);
|
||||
+
|
||||
+ /* The lock time should be less than 50 micro seconds worst case */
|
||||
+ usleep_range(50, 60);
|
||||
+
|
||||
+ ret = wait_for_pll_enable_lock(pll);
|
||||
+ if (ret) {
|
||||
+ pr_err("Wait for PLL enable lock failed [%s] %d\n",
|
||||
+ clk_hw_get_name(hw), ret);
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ if (pll_mode & PLL_OUTCTRL)
|
||||
+ regmap_update_bits(pll->clkr.regmap, PLL_MODE(pll), PLL_OUTCTRL,
|
||||
+ PLL_OUTCTRL);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+const struct clk_ops clk_alpha_pll_stromer_plus_ops = {
|
||||
+ .prepare = clk_alpha_pll_enable,
|
||||
+ .unprepare = clk_alpha_pll_disable,
|
||||
+ .is_enabled = clk_alpha_pll_is_enabled,
|
||||
+ .recalc_rate = clk_alpha_pll_recalc_rate,
|
||||
+ .determine_rate = clk_alpha_pll_stromer_determine_rate,
|
||||
+ .set_rate = clk_alpha_pll_stromer_plus_set_rate,
|
||||
+};
|
||||
+EXPORT_SYMBOL_GPL(clk_alpha_pll_stromer_plus_ops);
|
||||
--- a/drivers/clk/qcom/clk-alpha-pll.h
|
||||
+++ b/drivers/clk/qcom/clk-alpha-pll.h
|
||||
@@ -145,6 +145,7 @@ extern const struct clk_ops clk_alpha_pl
|
||||
extern const struct clk_ops clk_alpha_pll_huayra_ops;
|
||||
extern const struct clk_ops clk_alpha_pll_postdiv_ro_ops;
|
||||
extern const struct clk_ops clk_alpha_pll_stromer_ops;
|
||||
+extern const struct clk_ops clk_alpha_pll_stromer_plus_ops;
|
||||
|
||||
extern const struct clk_ops clk_alpha_pll_fabia_ops;
|
||||
extern const struct clk_ops clk_alpha_pll_fixed_fabia_ops;
|
@ -1,61 +0,0 @@
|
||||
From ff1925f7070d4cc3c5772565672632854444317e Mon Sep 17 00:00:00 2001
|
||||
From: Anusha Rao <quic_anusha@quicinc.com>
|
||||
Date: Wed, 27 Sep 2023 12:13:19 +0530
|
||||
Subject: [PATCH 38/41] arm64: dts: qcom: ipq9574: Enable WPS buttons
|
||||
|
||||
Add support for wps buttons on GPIO 37.
|
||||
|
||||
Reviewed-by: Konrad Dybcio <konrad.dybcio@linaro.org>
|
||||
Signed-off-by: Anusha Rao <quic_anusha@quicinc.com>
|
||||
Signed-off-by: Kathiravan Thirumoorthy <quic_kathirav@quicinc.com>
|
||||
Link: https://lore.kernel.org/r/20230927-common-rdp-v3-2-3d07b3ff6d42@quicinc.com
|
||||
Signed-off-by: Bjorn Andersson <andersson@kernel.org>
|
||||
---
|
||||
.../boot/dts/qcom/ipq9574-rdp-common.dtsi | 22 +++++++++++++++++++
|
||||
1 file changed, 22 insertions(+)
|
||||
|
||||
--- a/arch/arm64/boot/dts/qcom/ipq9574-rdp-common.dtsi
|
||||
+++ b/arch/arm64/boot/dts/qcom/ipq9574-rdp-common.dtsi
|
||||
@@ -8,6 +8,8 @@
|
||||
|
||||
/dts-v1/;
|
||||
|
||||
+#include <dt-bindings/gpio/gpio.h>
|
||||
+#include <dt-bindings/input/input.h>
|
||||
#include "ipq9574.dtsi"
|
||||
|
||||
/ {
|
||||
@@ -36,6 +38,19 @@
|
||||
regulator-always-on;
|
||||
regulator-name = "fixed_0p925";
|
||||
};
|
||||
+
|
||||
+ gpio-keys {
|
||||
+ compatible = "gpio-keys";
|
||||
+ pinctrl-0 = <&gpio_keys_default>;
|
||||
+ pinctrl-names = "default";
|
||||
+
|
||||
+ button-wps {
|
||||
+ label = "wps";
|
||||
+ linux,code = <KEY_WPS_BUTTON>;
|
||||
+ gpios = <&tlmm 37 GPIO_ACTIVE_LOW>;
|
||||
+ debounce-interval = <60>;
|
||||
+ };
|
||||
+ };
|
||||
};
|
||||
|
||||
&blsp1_spi0 {
|
||||
@@ -95,6 +110,13 @@
|
||||
drive-strength = <8>;
|
||||
bias-disable;
|
||||
};
|
||||
+
|
||||
+ gpio_keys_default: gpio-keys-default-state {
|
||||
+ pins = "gpio37";
|
||||
+ function = "gpio";
|
||||
+ drive-strength = <8>;
|
||||
+ bias-pull-up;
|
||||
+ };
|
||||
};
|
||||
|
||||
&xo_board_clk {
|
@ -1,126 +0,0 @@
|
||||
From 7b20271bc8c2982ab1e7bcfcf896ca5320b16a6f Mon Sep 17 00:00:00 2001
|
||||
From: Kathiravan T <quic_kathirav@quicinc.com>
|
||||
Date: Fri, 17 Feb 2023 14:03:06 +0530
|
||||
Subject: [PATCH 39/41] clk: qcom: apss-ipq-pll: add support for IPQ5332
|
||||
|
||||
IPQ5332 APSS PLL is of type Stromer Plus. Add support for the same.
|
||||
|
||||
To configure the stromer plus PLL separate API
|
||||
(clock_stromer_pll_configure) to be used. To achieve this, introduce the
|
||||
new member pll_type in device data structure and call the appropriate
|
||||
function based on this.
|
||||
|
||||
Reviewed-by: Konrad Dybcio <konrad.dybcio@linaro.org>
|
||||
Signed-off-by: Kathiravan T <quic_kathirav@quicinc.com>
|
||||
Signed-off-by: Bjorn Andersson <andersson@kernel.org>
|
||||
Link: https://lore.kernel.org/r/20230217083308.12017-4-quic_kathirav@quicinc.com
|
||||
---
|
||||
drivers/clk/qcom/apss-ipq-pll.c | 59 ++++++++++++++++++++++++++++++++-
|
||||
1 file changed, 58 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/clk/qcom/apss-ipq-pll.c
|
||||
+++ b/drivers/clk/qcom/apss-ipq-pll.c
|
||||
@@ -24,6 +24,18 @@ static const u8 ipq_pll_offsets[][PLL_OF
|
||||
[PLL_OFF_TEST_CTL] = 0x30,
|
||||
[PLL_OFF_TEST_CTL_U] = 0x34,
|
||||
},
|
||||
+
|
||||
+ [CLK_ALPHA_PLL_TYPE_STROMER_PLUS] = {
|
||||
+ [PLL_OFF_L_VAL] = 0x08,
|
||||
+ [PLL_OFF_ALPHA_VAL] = 0x10,
|
||||
+ [PLL_OFF_ALPHA_VAL_U] = 0x14,
|
||||
+ [PLL_OFF_USER_CTL] = 0x18,
|
||||
+ [PLL_OFF_USER_CTL_U] = 0x1c,
|
||||
+ [PLL_OFF_CONFIG_CTL] = 0x20,
|
||||
+ [PLL_OFF_STATUS] = 0x28,
|
||||
+ [PLL_OFF_TEST_CTL] = 0x30,
|
||||
+ [PLL_OFF_TEST_CTL_U] = 0x34,
|
||||
+ },
|
||||
};
|
||||
|
||||
static struct clk_alpha_pll ipq_pll_huayra = {
|
||||
@@ -44,6 +56,38 @@ static struct clk_alpha_pll ipq_pll_huay
|
||||
},
|
||||
};
|
||||
|
||||
+static struct clk_alpha_pll ipq_pll_stromer_plus = {
|
||||
+ .offset = 0x0,
|
||||
+ .regs = ipq_pll_offsets[CLK_ALPHA_PLL_TYPE_STROMER_PLUS],
|
||||
+ .flags = SUPPORTS_DYNAMIC_UPDATE,
|
||||
+ .clkr = {
|
||||
+ .enable_reg = 0x0,
|
||||
+ .enable_mask = BIT(0),
|
||||
+ .hw.init = &(struct clk_init_data){
|
||||
+ .name = "a53pll",
|
||||
+ .parent_data = &(const struct clk_parent_data) {
|
||||
+ .fw_name = "xo",
|
||||
+ },
|
||||
+ .num_parents = 1,
|
||||
+ .ops = &clk_alpha_pll_stromer_ops,
|
||||
+ },
|
||||
+ },
|
||||
+};
|
||||
+
|
||||
+static const struct alpha_pll_config ipq5332_pll_config = {
|
||||
+ .l = 0x3e,
|
||||
+ .config_ctl_val = 0x4001075b,
|
||||
+ .config_ctl_hi_val = 0x304,
|
||||
+ .main_output_mask = BIT(0),
|
||||
+ .aux_output_mask = BIT(1),
|
||||
+ .early_output_mask = BIT(3),
|
||||
+ .alpha_en_mask = BIT(24),
|
||||
+ .status_val = 0x3,
|
||||
+ .status_mask = GENMASK(10, 8),
|
||||
+ .lock_det = BIT(2),
|
||||
+ .test_ctl_hi_val = 0x00400003,
|
||||
+};
|
||||
+
|
||||
static const struct alpha_pll_config ipq6018_pll_config = {
|
||||
.l = 0x37,
|
||||
.config_ctl_val = 0x240d4828,
|
||||
@@ -81,16 +125,25 @@ static const struct alpha_pll_config ipq
|
||||
};
|
||||
|
||||
struct apss_pll_data {
|
||||
+ int pll_type;
|
||||
struct clk_alpha_pll *pll;
|
||||
const struct alpha_pll_config *pll_config;
|
||||
};
|
||||
|
||||
+static struct apss_pll_data ipq5332_pll_data = {
|
||||
+ .pll_type = CLK_ALPHA_PLL_TYPE_STROMER_PLUS,
|
||||
+ .pll = &ipq_pll_stromer_plus,
|
||||
+ .pll_config = &ipq5332_pll_config,
|
||||
+};
|
||||
+
|
||||
static struct apss_pll_data ipq8074_pll_data = {
|
||||
+ .pll_type = CLK_ALPHA_PLL_TYPE_HUAYRA,
|
||||
.pll = &ipq_pll_huayra,
|
||||
.pll_config = &ipq8074_pll_config,
|
||||
};
|
||||
|
||||
static struct apss_pll_data ipq6018_pll_data = {
|
||||
+ .pll_type = CLK_ALPHA_PLL_TYPE_HUAYRA,
|
||||
.pll = &ipq_pll_huayra,
|
||||
.pll_config = &ipq6018_pll_config,
|
||||
};
|
||||
@@ -129,7 +182,10 @@ static int apss_ipq_pll_probe(struct pla
|
||||
if (!data)
|
||||
return -ENODEV;
|
||||
|
||||
- clk_alpha_pll_configure(data->pll, regmap, data->pll_config);
|
||||
+ if (data->pll_type == CLK_ALPHA_PLL_TYPE_HUAYRA)
|
||||
+ clk_alpha_pll_configure(data->pll, regmap, data->pll_config);
|
||||
+ else if (data->pll_type == CLK_ALPHA_PLL_TYPE_STROMER_PLUS)
|
||||
+ clk_stromer_pll_configure(data->pll, regmap, data->pll_config);
|
||||
|
||||
ret = devm_clk_register_regmap(dev, &data->pll->clkr);
|
||||
if (ret)
|
||||
@@ -140,6 +196,7 @@ static int apss_ipq_pll_probe(struct pla
|
||||
}
|
||||
|
||||
static const struct of_device_id apss_ipq_pll_match_table[] = {
|
||||
+ { .compatible = "qcom,ipq5332-a53pll", .data = &ipq5332_pll_data },
|
||||
{ .compatible = "qcom,ipq6018-a53pll", .data = &ipq6018_pll_data },
|
||||
{ .compatible = "qcom,ipq8074-a53pll", .data = &ipq8074_pll_data },
|
||||
{ .compatible = "qcom,ipq9574-a73pll", .data = &ipq9574_pll_data },
|
@ -1,34 +0,0 @@
|
||||
From 998d251c67072059c80a5747d19e8c34a154a213 Mon Sep 17 00:00:00 2001
|
||||
From: Varadarajan Narayanan <quic_varada@quicinc.com>
|
||||
Date: Fri, 20 Oct 2023 11:49:33 +0530
|
||||
Subject: [PATCH 40/41] clk: qcom: apss-ipq-pll: Use stromer plus ops for
|
||||
stromer plus pll
|
||||
|
||||
The set rate and determine rate operations are different between
|
||||
Stromer and Stromer Plus PLLs. Since the programming sequence is
|
||||
different, the PLLs dont get configured properly and random,
|
||||
inexplicable crash/freeze is seen. Hence, use stromer plus ops
|
||||
for ipq_pll_stromer_plus.
|
||||
|
||||
Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
|
||||
Acked-by: Stephen Boyd <sboyd@kernel.org>
|
||||
Fixes: c7ef7fbb1ccf ("clk: qcom: apss-ipq-pll: add support for IPQ5332")
|
||||
Signed-off-by: Kathiravan T <quic_kathirav@quicinc.com>
|
||||
Signed-off-by: Varadarajan Narayanan <quic_varada@quicinc.com>
|
||||
Link: https://lore.kernel.org/r/c86ecaa23dc4f39650bcf4a3bd54a617a932e4fd.1697781921.git.quic_varada@quicinc.com
|
||||
Signed-off-by: Bjorn Andersson <andersson@kernel.org>
|
||||
---
|
||||
drivers/clk/qcom/apss-ipq-pll.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/clk/qcom/apss-ipq-pll.c
|
||||
+++ b/drivers/clk/qcom/apss-ipq-pll.c
|
||||
@@ -69,7 +69,7 @@ static struct clk_alpha_pll ipq_pll_stro
|
||||
.fw_name = "xo",
|
||||
},
|
||||
.num_parents = 1,
|
||||
- .ops = &clk_alpha_pll_stromer_ops,
|
||||
+ .ops = &clk_alpha_pll_stromer_plus_ops,
|
||||
},
|
||||
},
|
||||
};
|
@ -1,48 +0,0 @@
|
||||
From d10112948b0ff58b749f6f89a963185a190ce885 Mon Sep 17 00:00:00 2001
|
||||
From: Kathiravan T <quic_kathirav@quicinc.com>
|
||||
Date: Tue, 7 Mar 2023 11:52:25 +0530
|
||||
Subject: [PATCH 41/41] clk: qcom: Add STROMER PLUS PLL type for IPQ5332
|
||||
|
||||
Add the support for stromer plus pll, which is found on the IPQ5332
|
||||
SoCs. Programming sequence is same as the stromer pll, so we can re-use
|
||||
the same.
|
||||
|
||||
Reviewed-by: Stephen Boyd <sboyd@kernel.org>
|
||||
Signed-off-by: Kathiravan T <quic_kathirav@quicinc.com>
|
||||
Signed-off-by: Bjorn Andersson <andersson@kernel.org>
|
||||
Link: https://lore.kernel.org/r/20230307062232.4889-3-quic_kathirav@quicinc.com
|
||||
---
|
||||
drivers/clk/qcom/clk-alpha-pll.c | 11 +++++++++++
|
||||
drivers/clk/qcom/clk-alpha-pll.h | 1 +
|
||||
2 files changed, 12 insertions(+)
|
||||
|
||||
--- a/drivers/clk/qcom/clk-alpha-pll.c
|
||||
+++ b/drivers/clk/qcom/clk-alpha-pll.c
|
||||
@@ -200,6 +200,17 @@ const u8 clk_alpha_pll_regs[][PLL_OFF_MA
|
||||
[PLL_OFF_TEST_CTL_U] = 0x34,
|
||||
[PLL_OFF_STATUS] = 0x28,
|
||||
},
|
||||
+ [CLK_ALPHA_PLL_TYPE_STROMER_PLUS] = {
|
||||
+ [PLL_OFF_L_VAL] = 0x04,
|
||||
+ [PLL_OFF_USER_CTL] = 0x08,
|
||||
+ [PLL_OFF_USER_CTL_U] = 0x0c,
|
||||
+ [PLL_OFF_CONFIG_CTL] = 0x10,
|
||||
+ [PLL_OFF_TEST_CTL] = 0x14,
|
||||
+ [PLL_OFF_TEST_CTL_U] = 0x18,
|
||||
+ [PLL_OFF_STATUS] = 0x1c,
|
||||
+ [PLL_OFF_ALPHA_VAL] = 0x24,
|
||||
+ [PLL_OFF_ALPHA_VAL_U] = 0x28,
|
||||
+ },
|
||||
};
|
||||
EXPORT_SYMBOL_GPL(clk_alpha_pll_regs);
|
||||
|
||||
--- a/drivers/clk/qcom/clk-alpha-pll.h
|
||||
+++ b/drivers/clk/qcom/clk-alpha-pll.h
|
||||
@@ -26,6 +26,7 @@ enum {
|
||||
CLK_ALPHA_PLL_TYPE_DEFAULT_EVO,
|
||||
CLK_ALPHA_PLL_TYPE_BRAMMO_EVO,
|
||||
CLK_ALPHA_PLL_TYPE_STROMER,
|
||||
+ CLK_ALPHA_PLL_TYPE_STROMER_PLUS,
|
||||
CLK_ALPHA_PLL_TYPE_MAX,
|
||||
};
|
||||
|
20
target/linux/qualcommbe/Makefile
Normal file
20
target/linux/qualcommbe/Makefile
Normal file
@ -0,0 +1,20 @@
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
ARCH:=aarch64
|
||||
BOARD:=qualcommbe
|
||||
BOARDNAME:=Qualcomm Atheros 802.11be WiSoC-s
|
||||
FEATURES:=squashfs ramdisk fpu nand rtc emmc source-only
|
||||
KERNELNAME:=Image
|
||||
CPU_TYPE:=cortex-a53
|
||||
SUBTARGETS:=ipq95xx
|
||||
|
||||
KERNEL_PATCHVER:=6.6
|
||||
|
||||
include $(INCLUDE_DIR)/target.mk
|
||||
DEFAULT_PACKAGES += \
|
||||
kmod-usb3 kmod-usb-dwc3 kmod-usb-dwc3-qcom \
|
||||
kmod-leds-gpio kmod-gpio-button-hotplug \
|
||||
wpad-basic-mbedtls uboot-envtools \
|
||||
e2fsprogs kmod-fs-ext4 losetup
|
||||
|
||||
$(eval $(call BuildTarget))
|
579
target/linux/qualcommbe/config-6.6
Normal file
579
target/linux/qualcommbe/config-6.6
Normal file
@ -0,0 +1,579 @@
|
||||
CONFIG_64BIT=y
|
||||
CONFIG_ARCH_BINFMT_ELF_EXTRA_PHDRS=y
|
||||
CONFIG_ARCH_CORRECT_STACKTRACE_ON_KRETPROBE=y
|
||||
CONFIG_ARCH_DEFAULT_KEXEC_IMAGE_VERIFY_SIG=y
|
||||
CONFIG_ARCH_DMA_ADDR_T_64BIT=y
|
||||
CONFIG_ARCH_FORCE_MAX_ORDER=10
|
||||
CONFIG_ARCH_HIBERNATION_POSSIBLE=y
|
||||
CONFIG_ARCH_KEEP_MEMBLOCK=y
|
||||
CONFIG_ARCH_MHP_MEMMAP_ON_MEMORY_ENABLE=y
|
||||
CONFIG_ARCH_MMAP_RND_BITS=18
|
||||
CONFIG_ARCH_MMAP_RND_BITS_MAX=24
|
||||
CONFIG_ARCH_MMAP_RND_BITS_MIN=18
|
||||
CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MIN=11
|
||||
CONFIG_ARCH_PROC_KCORE_TEXT=y
|
||||
CONFIG_ARCH_QCOM=y
|
||||
CONFIG_ARCH_SPARSEMEM_ENABLE=y
|
||||
CONFIG_ARCH_STACKWALK=y
|
||||
CONFIG_ARCH_SUSPEND_POSSIBLE=y
|
||||
CONFIG_ARCH_WANTS_NO_INSTR=y
|
||||
CONFIG_ARCH_WANTS_THP_SWAP=y
|
||||
CONFIG_ARM64=y
|
||||
CONFIG_ARM64_4K_PAGES=y
|
||||
CONFIG_ARM64_ERRATUM_1165522=y
|
||||
CONFIG_ARM64_ERRATUM_1286807=y
|
||||
CONFIG_ARM64_ERRATUM_2051678=y
|
||||
CONFIG_ARM64_ERRATUM_2054223=y
|
||||
CONFIG_ARM64_ERRATUM_2067961=y
|
||||
CONFIG_ARM64_ERRATUM_2077057=y
|
||||
CONFIG_ARM64_ERRATUM_2658417=y
|
||||
CONFIG_ARM64_LD_HAS_FIX_ERRATUM_843419=y
|
||||
CONFIG_ARM64_PAGE_SHIFT=12
|
||||
CONFIG_ARM64_PA_BITS=48
|
||||
CONFIG_ARM64_PA_BITS_48=y
|
||||
CONFIG_ARM64_PTR_AUTH=y
|
||||
CONFIG_ARM64_PTR_AUTH_KERNEL=y
|
||||
CONFIG_ARM64_SME=y
|
||||
CONFIG_ARM64_SVE=y
|
||||
CONFIG_ARM64_TAGGED_ADDR_ABI=y
|
||||
CONFIG_ARM64_VA_BITS=39
|
||||
CONFIG_ARM64_VA_BITS_39=y
|
||||
CONFIG_ARM64_WORKAROUND_REPEAT_TLBI=y
|
||||
CONFIG_ARM64_WORKAROUND_SPECULATIVE_AT=y
|
||||
CONFIG_ARM64_WORKAROUND_TSB_FLUSH_FAILURE=y
|
||||
CONFIG_ARM_AMBA=y
|
||||
CONFIG_ARM_ARCH_TIMER=y
|
||||
CONFIG_ARM_ARCH_TIMER_EVTSTREAM=y
|
||||
CONFIG_ARM_GIC=y
|
||||
CONFIG_ARM_GIC_V2M=y
|
||||
CONFIG_ARM_GIC_V3=y
|
||||
CONFIG_ARM_GIC_V3_ITS=y
|
||||
CONFIG_ARM_GIC_V3_ITS_PCI=y
|
||||
# CONFIG_ARM_MHU_V2 is not set
|
||||
CONFIG_ARM_PSCI_CPUIDLE=y
|
||||
CONFIG_ARM_PSCI_FW=y
|
||||
# CONFIG_ARM_QCOM_CPUFREQ_HW is not set
|
||||
CONFIG_ARM_QCOM_CPUFREQ_NVMEM=y
|
||||
CONFIG_AT803X_PHY=y
|
||||
CONFIG_AUDIT_ARCH_COMPAT_GENERIC=y
|
||||
CONFIG_BLK_DEV_LOOP=y
|
||||
CONFIG_BLK_DEV_SD=y
|
||||
CONFIG_BLK_MQ_PCI=y
|
||||
CONFIG_BLK_MQ_VIRTIO=y
|
||||
CONFIG_BLK_PM=y
|
||||
CONFIG_BUILTIN_RETURN_ADDRESS_STRIPS_PAC=y
|
||||
CONFIG_CAVIUM_TX2_ERRATUM_219=y
|
||||
CONFIG_CC_HAVE_SHADOW_CALL_STACK=y
|
||||
CONFIG_CC_HAVE_STACKPROTECTOR_SYSREG=y
|
||||
CONFIG_CLONE_BACKWARDS=y
|
||||
CONFIG_COMMON_CLK=y
|
||||
CONFIG_COMMON_CLK_QCOM=y
|
||||
CONFIG_COMPACT_UNEVICTABLE_DEFAULT=1
|
||||
# CONFIG_COMPAT_32BIT_TIME is not set
|
||||
CONFIG_CONTEXT_TRACKING=y
|
||||
CONFIG_CONTEXT_TRACKING_IDLE=y
|
||||
CONFIG_COREDUMP=y
|
||||
CONFIG_CPUFREQ_DT=y
|
||||
CONFIG_CPUFREQ_DT_PLATDEV=y
|
||||
CONFIG_CPU_FREQ=y
|
||||
# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set
|
||||
CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL=y
|
||||
CONFIG_CPU_FREQ_GOV_ATTR_SET=y
|
||||
# CONFIG_CPU_FREQ_GOV_CONSERVATIVE is not set
|
||||
# CONFIG_CPU_FREQ_GOV_ONDEMAND is not set
|
||||
CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
|
||||
# CONFIG_CPU_FREQ_GOV_POWERSAVE is not set
|
||||
CONFIG_CPU_FREQ_GOV_SCHEDUTIL=y
|
||||
# CONFIG_CPU_FREQ_GOV_USERSPACE is not set
|
||||
CONFIG_CPU_FREQ_STAT=y
|
||||
CONFIG_CPU_FREQ_THERMAL=y
|
||||
CONFIG_CPU_IDLE=y
|
||||
CONFIG_CPU_IDLE_GOV_MENU=y
|
||||
CONFIG_CPU_IDLE_MULTIPLE_DRIVERS=y
|
||||
CONFIG_CPU_LITTLE_ENDIAN=y
|
||||
CONFIG_CPU_PM=y
|
||||
CONFIG_CPU_RMAP=y
|
||||
CONFIG_CPU_THERMAL=y
|
||||
CONFIG_CRC16=y
|
||||
CONFIG_CRC8=y
|
||||
CONFIG_CRYPTO_AUTHENC=y
|
||||
CONFIG_CRYPTO_CBC=y
|
||||
CONFIG_CRYPTO_DEFLATE=y
|
||||
CONFIG_CRYPTO_DEV_QCE=y
|
||||
CONFIG_CRYPTO_DEV_QCE_AEAD=y
|
||||
# CONFIG_CRYPTO_DEV_QCE_ENABLE_AEAD is not set
|
||||
CONFIG_CRYPTO_DEV_QCE_ENABLE_ALL=y
|
||||
# CONFIG_CRYPTO_DEV_QCE_ENABLE_SHA is not set
|
||||
# CONFIG_CRYPTO_DEV_QCE_ENABLE_SKCIPHER is not set
|
||||
CONFIG_CRYPTO_DEV_QCE_SHA=y
|
||||
CONFIG_CRYPTO_DEV_QCE_SKCIPHER=y
|
||||
CONFIG_CRYPTO_DEV_QCE_SW_MAX_LEN=512
|
||||
CONFIG_CRYPTO_DEV_QCOM_RNG=y
|
||||
CONFIG_CRYPTO_ECB=y
|
||||
CONFIG_CRYPTO_HASH_INFO=y
|
||||
CONFIG_CRYPTO_HW=y
|
||||
CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=y
|
||||
CONFIG_CRYPTO_LIB_DES=y
|
||||
CONFIG_CRYPTO_LIB_GF128MUL=y
|
||||
CONFIG_CRYPTO_LIB_SHA1=y
|
||||
CONFIG_CRYPTO_LIB_SHA256=y
|
||||
CONFIG_CRYPTO_LIB_UTILS=y
|
||||
CONFIG_CRYPTO_LZO=y
|
||||
CONFIG_CRYPTO_RNG=y
|
||||
CONFIG_CRYPTO_RNG2=y
|
||||
CONFIG_CRYPTO_SHA1=y
|
||||
CONFIG_CRYPTO_SHA256=y
|
||||
CONFIG_CRYPTO_XTS=y
|
||||
CONFIG_CRYPTO_ZSTD=y
|
||||
CONFIG_DCACHE_WORD_ACCESS=y
|
||||
CONFIG_DEBUG_BUGVERBOSE=y
|
||||
CONFIG_DEBUG_INFO=y
|
||||
CONFIG_DEV_COREDUMP=y
|
||||
CONFIG_DMADEVICES=y
|
||||
CONFIG_DMA_BOUNCE_UNALIGNED_KMALLOC=y
|
||||
CONFIG_DMA_DIRECT_REMAP=y
|
||||
CONFIG_DMA_ENGINE=y
|
||||
CONFIG_DMA_OF=y
|
||||
CONFIG_DMA_VIRTUAL_CHANNELS=y
|
||||
CONFIG_DTC=y
|
||||
CONFIG_DT_IDLE_STATES=y
|
||||
CONFIG_EDAC_SUPPORT=y
|
||||
CONFIG_EXCLUSIVE_SYSTEM_RAM=y
|
||||
CONFIG_FIXED_PHY=y
|
||||
CONFIG_FIX_EARLYCON_MEM=y
|
||||
CONFIG_FRAME_POINTER=y
|
||||
CONFIG_FS_IOMAP=y
|
||||
CONFIG_FUJITSU_ERRATUM_010001=y
|
||||
CONFIG_FUNCTION_ALIGNMENT=4
|
||||
CONFIG_FUNCTION_ALIGNMENT_4B=y
|
||||
CONFIG_FWNODE_MDIO=y
|
||||
CONFIG_FW_LOADER_PAGED_BUF=y
|
||||
CONFIG_FW_LOADER_SYSFS=y
|
||||
CONFIG_GCC_ASM_GOTO_OUTPUT_WORKAROUND=y
|
||||
CONFIG_GCC_SUPPORTS_DYNAMIC_FTRACE_WITH_ARGS=y
|
||||
CONFIG_GENERIC_ALLOCATOR=y
|
||||
CONFIG_GENERIC_ARCH_TOPOLOGY=y
|
||||
CONFIG_GENERIC_BUG=y
|
||||
CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y
|
||||
CONFIG_GENERIC_CLOCKEVENTS=y
|
||||
CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y
|
||||
CONFIG_GENERIC_CPU_AUTOPROBE=y
|
||||
CONFIG_GENERIC_CPU_VULNERABILITIES=y
|
||||
CONFIG_GENERIC_CSUM=y
|
||||
CONFIG_GENERIC_EARLY_IOREMAP=y
|
||||
CONFIG_GENERIC_GETTIMEOFDAY=y
|
||||
CONFIG_GENERIC_IDLE_POLL_SETUP=y
|
||||
CONFIG_GENERIC_IOREMAP=y
|
||||
CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK=y
|
||||
CONFIG_GENERIC_IRQ_SHOW=y
|
||||
CONFIG_GENERIC_IRQ_SHOW_LEVEL=y
|
||||
CONFIG_GENERIC_LIB_DEVMEM_IS_ALLOWED=y
|
||||
CONFIG_GENERIC_MSI_IRQ=y
|
||||
CONFIG_GENERIC_PCI_IOMAP=y
|
||||
CONFIG_GENERIC_PHY=y
|
||||
CONFIG_GENERIC_PINCONF=y
|
||||
CONFIG_GENERIC_PINCTRL_GROUPS=y
|
||||
CONFIG_GENERIC_PINMUX_FUNCTIONS=y
|
||||
CONFIG_GENERIC_SCHED_CLOCK=y
|
||||
CONFIG_GENERIC_SMP_IDLE_THREAD=y
|
||||
CONFIG_GENERIC_STRNCPY_FROM_USER=y
|
||||
CONFIG_GENERIC_STRNLEN_USER=y
|
||||
CONFIG_GENERIC_TIME_VSYSCALL=y
|
||||
CONFIG_GLOB=y
|
||||
CONFIG_GPIOLIB_IRQCHIP=y
|
||||
CONFIG_GPIO_CDEV=y
|
||||
CONFIG_HARDIRQS_SW_RESEND=y
|
||||
CONFIG_HAS_DMA=y
|
||||
CONFIG_HAS_IOMEM=y
|
||||
CONFIG_HAS_IOPORT=y
|
||||
CONFIG_HAS_IOPORT_MAP=y
|
||||
CONFIG_HWSPINLOCK=y
|
||||
CONFIG_HWSPINLOCK_QCOM=y
|
||||
CONFIG_I2C=y
|
||||
CONFIG_I2C_BOARDINFO=y
|
||||
CONFIG_I2C_CHARDEV=y
|
||||
CONFIG_I2C_HELPER_AUTO=y
|
||||
# CONFIG_I2C_QCOM_CCI is not set
|
||||
CONFIG_I2C_QUP=y
|
||||
CONFIG_IIO=y
|
||||
CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000
|
||||
CONFIG_INITRAMFS_SOURCE=""
|
||||
CONFIG_IPQ_APSS_6018=y
|
||||
CONFIG_IPQ_APSS_PLL=y
|
||||
# CONFIG_IPQ_GCC_4019 is not set
|
||||
# CONFIG_IPQ_GCC_5018 is not set
|
||||
# CONFIG_IPQ_GCC_5332 is not set
|
||||
# CONFIG_IPQ_GCC_6018 is not set
|
||||
# CONFIG_IPQ_GCC_8074 is not set
|
||||
# CONFIG_IPQ_GCC_9574 is not set
|
||||
CONFIG_IRQCHIP=y
|
||||
CONFIG_IRQ_DOMAIN=y
|
||||
CONFIG_IRQ_DOMAIN_HIERARCHY=y
|
||||
CONFIG_IRQ_FASTEOI_HIERARCHY_HANDLERS=y
|
||||
CONFIG_IRQ_FORCED_THREADING=y
|
||||
CONFIG_IRQ_WORK=y
|
||||
# CONFIG_KPSS_XCC is not set
|
||||
CONFIG_LEDS_TLC591XX=y
|
||||
CONFIG_LIBFDT=y
|
||||
CONFIG_LOCK_DEBUGGING_SUPPORT=y
|
||||
CONFIG_LOCK_SPIN_ON_OWNER=y
|
||||
CONFIG_LZO_COMPRESS=y
|
||||
CONFIG_LZO_DECOMPRESS=y
|
||||
CONFIG_MAILBOX=y
|
||||
# CONFIG_MAILBOX_TEST is not set
|
||||
CONFIG_MDIO_BUS=y
|
||||
CONFIG_MDIO_DEVICE=y
|
||||
CONFIG_MDIO_DEVRES=y
|
||||
CONFIG_MDIO_IPQ4019=y
|
||||
# CONFIG_MFD_QCOM_RPM is not set
|
||||
CONFIG_MFD_SYSCON=y
|
||||
CONFIG_MIGRATION=y
|
||||
# CONFIG_MITIGATE_SPECTRE_BRANCH_HISTORY is not set
|
||||
CONFIG_MMC=y
|
||||
CONFIG_MMC_BLOCK=y
|
||||
CONFIG_MMC_BLOCK_MINORS=32
|
||||
CONFIG_MMC_CQHCI=y
|
||||
CONFIG_MMC_SDHCI=y
|
||||
CONFIG_MMC_SDHCI_IO_ACCESSORS=y
|
||||
CONFIG_MMC_SDHCI_MSM=y
|
||||
# CONFIG_MMC_SDHCI_PCI is not set
|
||||
CONFIG_MMC_SDHCI_PLTFM=y
|
||||
CONFIG_MMU_LAZY_TLB_REFCOUNT=y
|
||||
CONFIG_MODULES_USE_ELF_RELA=y
|
||||
# CONFIG_MSM_GCC_8916 is not set
|
||||
# CONFIG_MSM_GCC_8917 is not set
|
||||
# CONFIG_MSM_GCC_8939 is not set
|
||||
# CONFIG_MSM_GCC_8976 is not set
|
||||
# CONFIG_MSM_GCC_8994 is not set
|
||||
# CONFIG_MSM_GCC_8996 is not set
|
||||
# CONFIG_MSM_GCC_8998 is not set
|
||||
# CONFIG_MSM_GPUCC_8998 is not set
|
||||
# CONFIG_MSM_MMCC_8996 is not set
|
||||
# CONFIG_MSM_MMCC_8998 is not set
|
||||
CONFIG_MTD_NAND_CORE=y
|
||||
CONFIG_MTD_NAND_ECC=y
|
||||
CONFIG_MTD_NAND_ECC_SW_HAMMING=y
|
||||
CONFIG_MTD_NAND_QCOM=y
|
||||
CONFIG_MTD_QCOMSMEM_PARTS=y
|
||||
CONFIG_MTD_RAW_NAND=y
|
||||
CONFIG_MTD_SPI_NOR=y
|
||||
CONFIG_MTD_UBI=y
|
||||
CONFIG_MTD_UBI_BEB_LIMIT=20
|
||||
CONFIG_MTD_UBI_BLOCK=y
|
||||
CONFIG_MTD_UBI_WL_THRESHOLD=4096
|
||||
CONFIG_MUTEX_SPIN_ON_OWNER=y
|
||||
CONFIG_NEED_DMA_MAP_STATE=y
|
||||
CONFIG_NEED_SG_DMA_LENGTH=y
|
||||
CONFIG_NET_EGRESS=y
|
||||
CONFIG_NET_FLOW_LIMIT=y
|
||||
CONFIG_NET_INGRESS=y
|
||||
CONFIG_NET_SELFTESTS=y
|
||||
CONFIG_NET_SWITCHDEV=y
|
||||
CONFIG_NET_XGRESS=y
|
||||
CONFIG_NLS=y
|
||||
CONFIG_NO_HZ_COMMON=y
|
||||
CONFIG_NO_HZ_IDLE=y
|
||||
CONFIG_NR_CPUS=4
|
||||
CONFIG_NVIDIA_CARMEL_CNP_ERRATUM=y
|
||||
CONFIG_NVMEM=y
|
||||
CONFIG_NVMEM_LAYOUTS=y
|
||||
CONFIG_NVMEM_QCOM_QFPROM=y
|
||||
# CONFIG_NVMEM_QCOM_SEC_QFPROM is not set
|
||||
CONFIG_NVMEM_SYSFS=y
|
||||
CONFIG_NVMEM_U_BOOT_ENV=y
|
||||
CONFIG_OF=y
|
||||
CONFIG_OF_ADDRESS=y
|
||||
CONFIG_OF_EARLY_FLATTREE=y
|
||||
CONFIG_OF_FLATTREE=y
|
||||
CONFIG_OF_GPIO=y
|
||||
CONFIG_OF_IRQ=y
|
||||
CONFIG_OF_KOBJ=y
|
||||
CONFIG_OF_MDIO=y
|
||||
CONFIG_PADATA=y
|
||||
CONFIG_PAGE_POOL=y
|
||||
CONFIG_PAGE_SIZE_LESS_THAN_256KB=y
|
||||
CONFIG_PAGE_SIZE_LESS_THAN_64KB=y
|
||||
CONFIG_PAHOLE_HAS_LANG_EXCLUDE=y
|
||||
CONFIG_PARTITION_PERCPU=y
|
||||
CONFIG_PCI=y
|
||||
CONFIG_PCIEAER=y
|
||||
CONFIG_PCIEASPM=y
|
||||
CONFIG_PCIEASPM_DEFAULT=y
|
||||
# CONFIG_PCIEASPM_PERFORMANCE is not set
|
||||
# CONFIG_PCIEASPM_POWERSAVE is not set
|
||||
# CONFIG_PCIEASPM_POWER_SUPERSAVE is not set
|
||||
CONFIG_PCIEPORTBUS=y
|
||||
CONFIG_PCIE_DW=y
|
||||
CONFIG_PCIE_DW_HOST=y
|
||||
CONFIG_PCIE_PME=y
|
||||
CONFIG_PCIE_QCOM=y
|
||||
CONFIG_PCI_DOMAINS=y
|
||||
CONFIG_PCI_DOMAINS_GENERIC=y
|
||||
CONFIG_PCI_MSI=y
|
||||
CONFIG_PER_VMA_LOCK=y
|
||||
CONFIG_PGTABLE_LEVELS=3
|
||||
CONFIG_PHYLIB=y
|
||||
CONFIG_PHYLIB_LEDS=y
|
||||
CONFIG_PHYS_ADDR_T_64BIT=y
|
||||
# CONFIG_PHY_QCOM_APQ8064_SATA is not set
|
||||
# CONFIG_PHY_QCOM_EDP is not set
|
||||
# CONFIG_PHY_QCOM_EUSB2_REPEATER is not set
|
||||
# CONFIG_PHY_QCOM_IPQ4019_USB is not set
|
||||
# CONFIG_PHY_QCOM_IPQ806X_SATA is not set
|
||||
# CONFIG_PHY_QCOM_IPQ806X_USB is not set
|
||||
# CONFIG_PHY_QCOM_M31_USB is not set
|
||||
# CONFIG_PHY_QCOM_PCIE2 is not set
|
||||
CONFIG_PHY_QCOM_QMP=y
|
||||
CONFIG_PHY_QCOM_QMP_COMBO=y
|
||||
CONFIG_PHY_QCOM_QMP_PCIE=y
|
||||
CONFIG_PHY_QCOM_QMP_PCIE_8996=y
|
||||
CONFIG_PHY_QCOM_QMP_UFS=y
|
||||
CONFIG_PHY_QCOM_QMP_USB=y
|
||||
# CONFIG_PHY_QCOM_QMP_USB_LEGACY is not set
|
||||
CONFIG_PHY_QCOM_QUSB2=y
|
||||
# CONFIG_PHY_QCOM_SGMII_ETH is not set
|
||||
# CONFIG_PHY_QCOM_SNPS_EUSB2 is not set
|
||||
# CONFIG_PHY_QCOM_USB_HS_28NM is not set
|
||||
# CONFIG_PHY_QCOM_USB_SNPS_FEMTO_V2 is not set
|
||||
# CONFIG_PHY_QCOM_USB_SS is not set
|
||||
CONFIG_PINCTRL=y
|
||||
# CONFIG_PINCTRL_IPQ5018 is not set
|
||||
# CONFIG_PINCTRL_IPQ5332 is not set
|
||||
# CONFIG_PINCTRL_IPQ6018 is not set
|
||||
# CONFIG_PINCTRL_IPQ8074 is not set
|
||||
# CONFIG_PINCTRL_IPQ9574 is not set
|
||||
CONFIG_PINCTRL_MSM=y
|
||||
# CONFIG_PINCTRL_MSM8916 is not set
|
||||
# CONFIG_PINCTRL_MSM8976 is not set
|
||||
# CONFIG_PINCTRL_MSM8994 is not set
|
||||
# CONFIG_PINCTRL_MSM8996 is not set
|
||||
# CONFIG_PINCTRL_MSM8998 is not set
|
||||
# CONFIG_PINCTRL_QCM2290 is not set
|
||||
# CONFIG_PINCTRL_QCOM_SSBI_PMIC is not set
|
||||
# CONFIG_PINCTRL_QCS404 is not set
|
||||
# CONFIG_PINCTRL_QDU1000 is not set
|
||||
# CONFIG_PINCTRL_SA8775P is not set
|
||||
# CONFIG_PINCTRL_SC7180 is not set
|
||||
# CONFIG_PINCTRL_SC8280XP is not set
|
||||
# CONFIG_PINCTRL_SDM660 is not set
|
||||
# CONFIG_PINCTRL_SDM670 is not set
|
||||
# CONFIG_PINCTRL_SDM845 is not set
|
||||
# CONFIG_PINCTRL_SDX75 is not set
|
||||
# CONFIG_PINCTRL_SM6350 is not set
|
||||
# CONFIG_PINCTRL_SM6375 is not set
|
||||
# CONFIG_PINCTRL_SM7150 is not set
|
||||
# CONFIG_PINCTRL_SM8150 is not set
|
||||
# CONFIG_PINCTRL_SM8250 is not set
|
||||
# CONFIG_PINCTRL_SM8450 is not set
|
||||
# CONFIG_PINCTRL_SM8550 is not set
|
||||
CONFIG_PM=y
|
||||
CONFIG_PM_CLK=y
|
||||
CONFIG_PM_OPP=y
|
||||
CONFIG_POSIX_CPU_TIMERS_TASK_WORK=y
|
||||
CONFIG_POWER_RESET=y
|
||||
# CONFIG_POWER_RESET_MSM is not set
|
||||
CONFIG_POWER_SUPPLY=y
|
||||
CONFIG_PREEMPT_NONE_BUILD=y
|
||||
CONFIG_PRINTK_TIME=y
|
||||
CONFIG_PTP_1588_CLOCK_OPTIONAL=y
|
||||
CONFIG_QCA807X_PHY=y
|
||||
CONFIG_QCA808X_PHY=y
|
||||
# CONFIG_QCM_DISPCC_2290 is not set
|
||||
# CONFIG_QCM_GCC_2290 is not set
|
||||
# CONFIG_QCOM_A53PLL is not set
|
||||
# CONFIG_QCOM_AOSS_QMP is not set
|
||||
CONFIG_QCOM_APCS_IPC=y
|
||||
# CONFIG_QCOM_APM is not set
|
||||
# CONFIG_QCOM_APR is not set
|
||||
CONFIG_QCOM_BAM_DMA=y
|
||||
# CONFIG_QCOM_CLK_APCC_MSM8996 is not set
|
||||
# CONFIG_QCOM_CLK_APCS_MSM8916 is not set
|
||||
# CONFIG_QCOM_COMMAND_DB is not set
|
||||
# CONFIG_QCOM_CPR is not set
|
||||
# CONFIG_QCOM_EBI2 is not set
|
||||
# CONFIG_QCOM_FASTRPC is not set
|
||||
# CONFIG_QCOM_GENI_SE is not set
|
||||
# CONFIG_QCOM_GSBI is not set
|
||||
# CONFIG_QCOM_HFPLL is not set
|
||||
# CONFIG_QCOM_ICC_BWMON is not set
|
||||
# CONFIG_QCOM_IPCC is not set
|
||||
# CONFIG_QCOM_LLCC is not set
|
||||
CONFIG_QCOM_MDT_LOADER=y
|
||||
# CONFIG_QCOM_MPM is not set
|
||||
CONFIG_QCOM_NET_PHYLIB=y
|
||||
# CONFIG_QCOM_OCMEM is not set
|
||||
# CONFIG_QCOM_PDC is not set
|
||||
CONFIG_QCOM_PIL_INFO=y
|
||||
# CONFIG_QCOM_Q6V5_ADSP is not set
|
||||
CONFIG_QCOM_Q6V5_COMMON=y
|
||||
# CONFIG_QCOM_Q6V5_MSS is not set
|
||||
# CONFIG_QCOM_Q6V5_PAS is not set
|
||||
CONFIG_QCOM_Q6V5_WCSS=y
|
||||
# CONFIG_QCOM_RAMP_CTRL is not set
|
||||
# CONFIG_QCOM_RMTFS_MEM is not set
|
||||
# CONFIG_QCOM_RPMH is not set
|
||||
# CONFIG_QCOM_RPM_MASTER_STATS is not set
|
||||
CONFIG_QCOM_RPROC_COMMON=y
|
||||
CONFIG_QCOM_SCM=y
|
||||
# CONFIG_QCOM_SCM_DOWNLOAD_MODE_DEFAULT is not set
|
||||
# CONFIG_QCOM_SMD_RPM is not set
|
||||
CONFIG_QCOM_SMEM=y
|
||||
CONFIG_QCOM_SMEM_STATE=y
|
||||
CONFIG_QCOM_SMP2P=y
|
||||
# CONFIG_QCOM_SMSM is not set
|
||||
CONFIG_QCOM_SOCINFO=y
|
||||
# CONFIG_QCOM_SPM is not set
|
||||
# CONFIG_QCOM_STATS is not set
|
||||
# CONFIG_QCOM_SYSMON is not set
|
||||
CONFIG_QCOM_TSENS=y
|
||||
# CONFIG_QCOM_WCNSS_CTRL is not set
|
||||
# CONFIG_QCOM_WCNSS_PIL is not set
|
||||
CONFIG_QCOM_WDT=y
|
||||
# CONFIG_QCS_GCC_404 is not set
|
||||
# CONFIG_QCS_Q6SSTOP_404 is not set
|
||||
# CONFIG_QCS_TURING_404 is not set
|
||||
# CONFIG_QDU_GCC_1000 is not set
|
||||
CONFIG_QUEUED_RWLOCKS=y
|
||||
CONFIG_QUEUED_SPINLOCKS=y
|
||||
CONFIG_RANDSTRUCT_NONE=y
|
||||
CONFIG_RAS=y
|
||||
CONFIG_RATIONAL=y
|
||||
CONFIG_REGMAP=y
|
||||
CONFIG_REGMAP_I2C=y
|
||||
CONFIG_REGMAP_MMIO=y
|
||||
CONFIG_REGULATOR=y
|
||||
# CONFIG_REGULATOR_CPR3 is not set
|
||||
CONFIG_REGULATOR_FIXED_VOLTAGE=y
|
||||
# CONFIG_REGULATOR_QCOM_REFGEN is not set
|
||||
# CONFIG_REGULATOR_VQMMC_IPQ4019 is not set
|
||||
CONFIG_RELOCATABLE=y
|
||||
CONFIG_REMOTEPROC=y
|
||||
CONFIG_REMOTEPROC_CDEV=y
|
||||
CONFIG_RESET_CONTROLLER=y
|
||||
# CONFIG_RESET_QCOM_AOSS is not set
|
||||
# CONFIG_RESET_QCOM_PDC is not set
|
||||
CONFIG_RFS_ACCEL=y
|
||||
CONFIG_RODATA_FULL_DEFAULT_ENABLED=y
|
||||
CONFIG_RPMSG=y
|
||||
CONFIG_RPMSG_CHAR=y
|
||||
# CONFIG_RPMSG_CTRL is not set
|
||||
# CONFIG_RPMSG_NS is not set
|
||||
CONFIG_RPMSG_QCOM_GLINK=y
|
||||
CONFIG_RPMSG_QCOM_GLINK_RPM=y
|
||||
CONFIG_RPMSG_QCOM_GLINK_SMEM=y
|
||||
CONFIG_RPMSG_QCOM_SMD=y
|
||||
# CONFIG_RPMSG_TTY is not set
|
||||
CONFIG_RPS=y
|
||||
CONFIG_RTC_CLASS=y
|
||||
CONFIG_RTC_I2C_AND_SPI=y
|
||||
CONFIG_RWSEM_SPIN_ON_OWNER=y
|
||||
# CONFIG_SA_GCC_8775P is not set
|
||||
# CONFIG_SA_GPUCC_8775P is not set
|
||||
# CONFIG_SCHED_CORE is not set
|
||||
CONFIG_SCHED_MC=y
|
||||
CONFIG_SCHED_SMT=y
|
||||
CONFIG_SCHED_THERMAL_PRESSURE=y
|
||||
CONFIG_SCSI=y
|
||||
CONFIG_SCSI_COMMON=y
|
||||
# CONFIG_SCSI_LOWLEVEL is not set
|
||||
# CONFIG_SCSI_PROC_FS is not set
|
||||
# CONFIG_SC_CAMCC_7280 is not set
|
||||
# CONFIG_SC_DISPCC_7180 is not set
|
||||
# CONFIG_SC_DISPCC_8280XP is not set
|
||||
# CONFIG_SC_GCC_7180 is not set
|
||||
# CONFIG_SC_GCC_8280XP is not set
|
||||
# CONFIG_SC_GPUCC_7180 is not set
|
||||
# CONFIG_SC_LPASSCC_7280 is not set
|
||||
# CONFIG_SC_LPASSCC_8280XP is not set
|
||||
# CONFIG_SC_LPASS_CORECC_7180 is not set
|
||||
# CONFIG_SC_LPASS_CORECC_7280 is not set
|
||||
# CONFIG_SC_MSS_7180 is not set
|
||||
# CONFIG_SC_VIDEOCC_7180 is not set
|
||||
# CONFIG_SDM_CAMCC_845 is not set
|
||||
# CONFIG_SDM_DISPCC_845 is not set
|
||||
# CONFIG_SDM_GCC_660 is not set
|
||||
# CONFIG_SDM_GCC_845 is not set
|
||||
# CONFIG_SDM_GPUCC_845 is not set
|
||||
# CONFIG_SDM_LPASSCC_845 is not set
|
||||
# CONFIG_SDM_VIDEOCC_845 is not set
|
||||
# CONFIG_SDX_GCC_75 is not set
|
||||
CONFIG_SERIAL_8250_FSL=y
|
||||
CONFIG_SERIAL_MCTRL_GPIO=y
|
||||
CONFIG_SERIAL_MSM=y
|
||||
CONFIG_SERIAL_MSM_CONSOLE=y
|
||||
CONFIG_SGL_ALLOC=y
|
||||
CONFIG_SG_POOL=y
|
||||
CONFIG_SMP=y
|
||||
# CONFIG_SM_CAMCC_6350 is not set
|
||||
# CONFIG_SM_CAMCC_8450 is not set
|
||||
# CONFIG_SM_GCC_7150 is not set
|
||||
# CONFIG_SM_GCC_8150 is not set
|
||||
# CONFIG_SM_GCC_8250 is not set
|
||||
# CONFIG_SM_GCC_8450 is not set
|
||||
# CONFIG_SM_GCC_8550 is not set
|
||||
# CONFIG_SM_GPUCC_6115 is not set
|
||||
# CONFIG_SM_GPUCC_6125 is not set
|
||||
# CONFIG_SM_GPUCC_6350 is not set
|
||||
# CONFIG_SM_GPUCC_6375 is not set
|
||||
# CONFIG_SM_GPUCC_8150 is not set
|
||||
# CONFIG_SM_GPUCC_8250 is not set
|
||||
# CONFIG_SM_GPUCC_8350 is not set
|
||||
# CONFIG_SM_GPUCC_8450 is not set
|
||||
# CONFIG_SM_GPUCC_8550 is not set
|
||||
# CONFIG_SM_TCSRCC_8550 is not set
|
||||
# CONFIG_SM_VIDEOCC_8150 is not set
|
||||
# CONFIG_SM_VIDEOCC_8250 is not set
|
||||
# CONFIG_SM_VIDEOCC_8350 is not set
|
||||
# CONFIG_SM_VIDEOCC_8450 is not set
|
||||
# CONFIG_SM_VIDEOCC_8550 is not set
|
||||
CONFIG_SOCK_RX_QUEUE_MAPPING=y
|
||||
CONFIG_SOC_BUS=y
|
||||
CONFIG_SOFTIRQ_ON_OWN_STACK=y
|
||||
CONFIG_SPARSEMEM=y
|
||||
CONFIG_SPARSEMEM_EXTREME=y
|
||||
CONFIG_SPARSEMEM_VMEMMAP=y
|
||||
CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y
|
||||
CONFIG_SPARSE_IRQ=y
|
||||
CONFIG_SPI=y
|
||||
CONFIG_SPI_MASTER=y
|
||||
CONFIG_SPI_MEM=y
|
||||
CONFIG_SPI_QUP=y
|
||||
CONFIG_SQUASHFS_DECOMP_MULTI_PERCPU=y
|
||||
CONFIG_SWIOTLB=y
|
||||
CONFIG_SWPHY=y
|
||||
CONFIG_SYSCTL_EXCEPTION_TRACE=y
|
||||
CONFIG_THERMAL=y
|
||||
CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE=y
|
||||
CONFIG_THERMAL_EMERGENCY_POWEROFF_DELAY_MS=0
|
||||
CONFIG_THERMAL_GOV_STEP_WISE=y
|
||||
CONFIG_THERMAL_OF=y
|
||||
CONFIG_THREAD_INFO_IN_TASK=y
|
||||
CONFIG_TICK_CPU_ACCOUNTING=y
|
||||
CONFIG_TIMER_OF=y
|
||||
CONFIG_TIMER_PROBE=y
|
||||
CONFIG_TRACE_IRQFLAGS_NMI_SUPPORT=y
|
||||
CONFIG_TREE_RCU=y
|
||||
CONFIG_TREE_SRCU=y
|
||||
CONFIG_UBIFS_FS=y
|
||||
CONFIG_UBIFS_FS_ADVANCED_COMPR=y
|
||||
# CONFIG_UCLAMP_TASK is not set
|
||||
CONFIG_UNMAP_KERNEL_AT_EL0=y
|
||||
CONFIG_USB=y
|
||||
CONFIG_USB_COMMON=y
|
||||
CONFIG_USB_SUPPORT=y
|
||||
CONFIG_VIRTIO=y
|
||||
CONFIG_VIRTIO_ANCHOR=y
|
||||
# CONFIG_VIRTIO_BLK is not set
|
||||
# CONFIG_VIRTIO_NET is not set
|
||||
CONFIG_VMAP_STACK=y
|
||||
CONFIG_WANT_DEV_COREDUMP=y
|
||||
CONFIG_WATCHDOG_CORE=y
|
||||
CONFIG_WATCHDOG_SYSFS=y
|
||||
CONFIG_XPS=y
|
||||
CONFIG_XXHASH=y
|
||||
CONFIG_ZLIB_DEFLATE=y
|
||||
CONFIG_ZLIB_INFLATE=y
|
||||
CONFIG_ZONE_DMA32=y
|
||||
CONFIG_ZSTD_COMMON=y
|
||||
CONFIG_ZSTD_COMPRESS=y
|
||||
CONFIG_ZSTD_DECOMPRESS=y
|
41
target/linux/qualcommbe/image/Makefile
Normal file
41
target/linux/qualcommbe/image/Makefile
Normal file
@ -0,0 +1,41 @@
|
||||
include $(TOPDIR)/rules.mk
|
||||
include $(INCLUDE_DIR)/image.mk
|
||||
|
||||
define Device/Default
|
||||
PROFILES := Default
|
||||
KERNEL_LOADADDR := 0x41000000
|
||||
DEVICE_DTS = $$(SOC)-$(lastword $(subst _, ,$(1)))
|
||||
DEVICE_DTS_CONFIG := config@1
|
||||
DEVICE_DTS_DIR := $(DTS_DIR)/qcom
|
||||
IMAGES := sysupgrade.bin
|
||||
IMAGE/sysupgrade.bin = sysupgrade-tar | append-metadata
|
||||
IMAGE/sysupgrade.bin/squashfs :=
|
||||
endef
|
||||
|
||||
define Device/FitImage
|
||||
KERNEL_SUFFIX := -uImage.itb
|
||||
KERNEL = kernel-bin | libdeflate-gzip | fit gzip $$(KDIR)/image-$$(DEVICE_DTS).dtb
|
||||
KERNEL_NAME := Image
|
||||
endef
|
||||
|
||||
define Device/FitImageLzma
|
||||
KERNEL_SUFFIX := -uImage.itb
|
||||
KERNEL = kernel-bin | lzma | fit lzma $$(KDIR)/image-$$(DEVICE_DTS).dtb
|
||||
KERNEL_NAME := Image
|
||||
endef
|
||||
|
||||
define Device/EmmcImage
|
||||
IMAGES += factory.bin
|
||||
IMAGE/factory.bin := append-rootfs | pad-rootfs | pad-to 64k
|
||||
IMAGE/sysupgrade.bin/squashfs := append-rootfs | pad-to 64k | sysupgrade-tar rootfs=$$$$@ | append-metadata
|
||||
endef
|
||||
|
||||
define Device/UbiFit
|
||||
KERNEL_IN_UBI := 1
|
||||
IMAGES += factory.ubi
|
||||
IMAGE/factory.ubi := append-ubi
|
||||
endef
|
||||
|
||||
include $(SUBTARGET).mk
|
||||
|
||||
$(eval $(call BuildImage))
|
@ -1,14 +1,14 @@
|
||||
define Device/qcom_rdp433
|
||||
$(call Device/FitImageLzma)
|
||||
DEVICE_VENDOR := QTI
|
||||
DEVICE_VENDOR := Qualcomm Technologies, Inc.
|
||||
DEVICE_MODEL := RDP433
|
||||
DEVICE_VARIANT := AP-AL02-C4
|
||||
BOARD_NAME := ap-al02.1-c4
|
||||
BUILD_DTS_ipq9574-rdp433 := 1
|
||||
DEVICE_DTS_CONFIG := config@rdp433
|
||||
SOC := ipq9574
|
||||
KERNEL_INSTALL := 1
|
||||
KERNEL_SIZE := 6096k
|
||||
IMAGE_SIZE := 25344k
|
||||
IMAGE/sysupgrade.bin := append-kernel | pad-to $$$$(KERNEL_SIZE) | append-rootfs | pad-rootfs | append-metadata
|
||||
IMAGE/sysupgrade.bin := append-kernel | pad-to 64k | append-rootfs | pad-rootfs | check-size | append-metadata
|
||||
endef
|
||||
TARGET_DEVICES += qcom_rdp433
|
@ -0,0 +1,28 @@
|
||||
#
|
||||
# Copyright (c) 2015 The Linux Foundation. All rights reserved.
|
||||
# Copyright (c) 2011-2015 OpenWrt.org
|
||||
#
|
||||
|
||||
. /lib/functions/uci-defaults.sh
|
||||
. /lib/functions/system.sh
|
||||
|
||||
ipq95xx_setup_interfaces()
|
||||
{
|
||||
local board="$1"
|
||||
|
||||
case "$board" in
|
||||
qcom,ipq9574-ap-al02-c7)
|
||||
ucidef_set_interfaces_lan_wan "lan1 lan2 lan3 lan4 lan5" "wan"
|
||||
;;
|
||||
*)
|
||||
echo "Unsupported hardware. Network interfaces not initialized"
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
board_config_update
|
||||
board=$(board_name)
|
||||
ipq95xx_setup_interfaces $board
|
||||
board_config_flush
|
||||
|
||||
exit 0
|
@ -0,0 +1,12 @@
|
||||
PART_NAME=firmware
|
||||
|
||||
RAMFS_COPY_BIN='fw_printenv fw_setenv head'
|
||||
RAMFS_COPY_DATA='/etc/fw_env.config /var/lock/fw_printenv.lock'
|
||||
|
||||
platform_do_upgrade() {
|
||||
case "$(board_name)" in
|
||||
*)
|
||||
default_do_upgrade "$1"
|
||||
;;
|
||||
esac
|
||||
}
|
61
target/linux/qualcommbe/ipq95xx/config-default
Normal file
61
target/linux/qualcommbe/ipq95xx/config-default
Normal file
@ -0,0 +1,61 @@
|
||||
CONFIG_AQUANTIA_PHY=y
|
||||
CONFIG_ARM_PSCI_CPUIDLE_DOMAIN=y
|
||||
CONFIG_DT_IDLE_GENPD=y
|
||||
CONFIG_GRO_CELLS=y
|
||||
CONFIG_IPQ_GCC_9574=y
|
||||
CONFIG_MDIO_BITBANG=y
|
||||
CONFIG_MDIO_GPIO=y
|
||||
# CONFIG_MFD_HI6421_SPMI is not set
|
||||
CONFIG_MFD_SPMI_PMIC=y
|
||||
CONFIG_NET_DEVLINK=y
|
||||
CONFIG_NET_DSA=y
|
||||
CONFIG_NET_DSA_QCA8K=y
|
||||
CONFIG_NET_DSA_TAG_QCA=y
|
||||
# CONFIG_NVMEM_SPMI_SDAM is not set
|
||||
CONFIG_PHYLINK=y
|
||||
CONFIG_PINCTRL_IPQ9574=y
|
||||
CONFIG_PINCTRL_QCOM_SPMI_PMIC=y
|
||||
# CONFIG_PM8916_WATCHDOG is not set
|
||||
CONFIG_PM_GENERIC_DOMAINS=y
|
||||
CONFIG_PM_GENERIC_DOMAINS_OF=y
|
||||
# CONFIG_POWER_RESET_QCOM_PON is not set
|
||||
CONFIG_QCA83XX_PHY=y
|
||||
CONFIG_QCOM_APM=y
|
||||
# CONFIG_QCOM_COINCELL is not set
|
||||
CONFIG_QCOM_GDSC=y
|
||||
CONFIG_QCOM_SPMI_ADC5=y
|
||||
# CONFIG_QCOM_SPMI_RRADC is not set
|
||||
CONFIG_QCOM_VADC_COMMON=y
|
||||
CONFIG_REGMAP_SPMI=y
|
||||
CONFIG_REGULATOR_CPR3=y
|
||||
# CONFIG_REGULATOR_CPR3_NPU is not set
|
||||
CONFIG_REGULATOR_CPR4_APSS=y
|
||||
# CONFIG_REGULATOR_QCOM_LABIBB is not set
|
||||
CONFIG_REGULATOR_QCOM_SPMI=y
|
||||
# CONFIG_REGULATOR_QCOM_USB_VBUS is not set
|
||||
CONFIG_REGULATOR_USERSPACE_CONSUMER=y
|
||||
CONFIG_RTC_DRV_PM8XXX=y
|
||||
CONFIG_SPMI=y
|
||||
# CONFIG_SPMI_HISI3670 is not set
|
||||
CONFIG_SPMI_MSM_PMIC_ARB=y
|
||||
# CONFIG_SPMI_PMIC_CLKDIV is not set
|
||||
CONFIG_SPI_QPIC_SNAND=y
|
||||
CONFIG_IPQ_CMN_PLL=y
|
||||
CONFIG_IPQ_NSSCC_9574=y
|
||||
CONFIG_IPQ_NSSCC_QCA8K=y
|
||||
CONFIG_QCOM_PPE=y
|
||||
CONFIG_QCOM_IPA=y
|
||||
CONFIG_INTERCONNECT_QCOM=y
|
||||
CONFIG_INTERCONNECT_QCOM_OSM_L3=y
|
||||
CONFIG_MTD_SPI_NAND=y
|
||||
CONFIG_QCOM_SMD_RPM=y
|
||||
CONFIG_REGULATOR_QCOM_SMD_RPM=y
|
||||
# CONFIG_QCOM_CLK_SMD_RPM is not set
|
||||
# CONFIG_QCOM_RPMPD is not set
|
||||
# CONFIG_INTERCONNECT_QCOM_MSM8916 is not set
|
||||
# CONFIG_INTERCONNECT_QCOM_MSM8939 is not set
|
||||
# CONFIG_INTERCONNECT_QCOM_MSM8996 is not set
|
||||
# CONFIG_INTERCONNECT_QCOM_MSM8974 is not set
|
||||
# CONFIG_INTERCONNECT_QCOM_QCM2290 is not set
|
||||
# CONFIG_INTERCONNECT_QCOM_QCS404 is not set
|
||||
# CONFIG_INTERCONNECT_QCOM_SDM660 is not set
|
7
target/linux/qualcommbe/ipq95xx/target.mk
Normal file
7
target/linux/qualcommbe/ipq95xx/target.mk
Normal file
@ -0,0 +1,7 @@
|
||||
SUBTARGET:=ipq95xx
|
||||
BOARDNAME:=Qualcomm Atheros IPQ95xx
|
||||
DEFAULT_PACKAGES +=
|
||||
|
||||
define Target/Description
|
||||
Build firmware images for Qualcomm Atheros IPQ95XX based boards.
|
||||
endef
|
@ -1,7 +1,7 @@
|
||||
From 0f868f286529001ee37334815f4962b8a2f283dd Mon Sep 17 00:00:00 2001
|
||||
From 0e8527d076cfb3fa55777a2ece735852fcf3e850 Mon Sep 17 00:00:00 2001
|
||||
From: Anusha Rao <quic_anusha@quicinc.com>
|
||||
Date: Wed, 27 Sep 2023 12:13:18 +0530
|
||||
Subject: [PATCH 34/41] arm64: dts: qcom: ipq9574: Add common RDP dtsi file
|
||||
Subject: [PATCH] arm64: dts: qcom: ipq9574: Add common RDP dtsi file
|
||||
|
||||
Add a dtsi file to include interfaces that are common
|
||||
across RDPs.
|
||||
@ -11,18 +11,21 @@ Signed-off-by: Kathiravan Thirumoorthy <quic_kathirav@quicinc.com>
|
||||
Link: https://lore.kernel.org/r/20230927-common-rdp-v3-1-3d07b3ff6d42@quicinc.com
|
||||
Signed-off-by: Bjorn Andersson <andersson@kernel.org>
|
||||
---
|
||||
.../boot/dts/qcom/ipq9574-rdp-common.dtsi | 102 ++++++++++++++++++
|
||||
arch/arm64/boot/dts/qcom/ipq9574-rdp418.dts | 63 +----------
|
||||
arch/arm64/boot/dts/qcom/ipq9574-rdp433.dts | 38 +------
|
||||
arch/arm64/boot/dts/qcom/ipq9574-rdp449.dts | 65 +----------
|
||||
arch/arm64/boot/dts/qcom/ipq9574-rdp453.dts | 65 +----------
|
||||
arch/arm64/boot/dts/qcom/ipq9574-rdp454.dts | 66 +-----------
|
||||
6 files changed, 107 insertions(+), 292 deletions(-)
|
||||
.../boot/dts/qcom/ipq9574-rdp-common.dtsi | 125 ++++++++++++++++++
|
||||
arch/arm64/boot/dts/qcom/ipq9574-rdp418.dts | 63 +--------
|
||||
arch/arm64/boot/dts/qcom/ipq9574-rdp433.dts | 91 +------------
|
||||
arch/arm64/boot/dts/qcom/ipq9574-rdp449.dts | 65 +--------
|
||||
arch/arm64/boot/dts/qcom/ipq9574-rdp453.dts | 65 +--------
|
||||
arch/arm64/boot/dts/qcom/ipq9574-rdp454.dts | 66 +--------
|
||||
6 files changed, 130 insertions(+), 345 deletions(-)
|
||||
create mode 100644 arch/arm64/boot/dts/qcom/ipq9574-rdp-common.dtsi
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/qcom/ipq9574-rdp-common.dtsi b/arch/arm64/boot/dts/qcom/ipq9574-rdp-common.dtsi
|
||||
new file mode 100644
|
||||
index 000000000000..40a7aefd0540
|
||||
--- /dev/null
|
||||
+++ b/arch/arm64/boot/dts/qcom/ipq9574-rdp-common.dtsi
|
||||
@@ -0,0 +1,102 @@
|
||||
@@ -0,0 +1,125 @@
|
||||
+// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)
|
||||
+/*
|
||||
+ * IPQ9574 RDP board common device tree source
|
||||
@ -122,9 +125,34 @@ Signed-off-by: Bjorn Andersson <andersson@kernel.org>
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&usb_0_dwc3 {
|
||||
+ dr_mode = "host";
|
||||
+};
|
||||
+
|
||||
+&usb_0_qmpphy {
|
||||
+ vdda-pll-supply = <&mp5496_l2>;
|
||||
+ vdda-phy-supply = <®ulator_fixed_0p925>;
|
||||
+
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&usb_0_qusbphy {
|
||||
+ vdd-supply = <®ulator_fixed_0p925>;
|
||||
+ vdda-pll-supply = <&mp5496_l2>;
|
||||
+ vdda-phy-dpdm-supply = <®ulator_fixed_3p3>;
|
||||
+
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&usb3 {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&xo_board_clk {
|
||||
+ clock-frequency = <24000000>;
|
||||
+};
|
||||
diff --git a/arch/arm64/boot/dts/qcom/ipq9574-rdp418.dts b/arch/arm64/boot/dts/qcom/ipq9574-rdp418.dts
|
||||
index 2b093e02637b..f4f9199d4ab1 100644
|
||||
--- a/arch/arm64/boot/dts/qcom/ipq9574-rdp418.dts
|
||||
+++ b/arch/arm64/boot/dts/qcom/ipq9574-rdp418.dts
|
||||
@@ -8,58 +8,12 @@
|
||||
@ -187,7 +215,7 @@ Signed-off-by: Bjorn Andersson <andersson@kernel.org>
|
||||
};
|
||||
|
||||
&sdhc_1 {
|
||||
@@ -74,10 +28,6 @@
|
||||
@@ -74,10 +28,6 @@ &sdhc_1 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
@ -198,7 +226,7 @@ Signed-off-by: Bjorn Andersson <andersson@kernel.org>
|
||||
&tlmm {
|
||||
sdc_default_state: sdc-default-state {
|
||||
clk-pins {
|
||||
@@ -110,15 +60,4 @@
|
||||
@@ -110,15 +60,4 @@ rclk-pins {
|
||||
bias-pull-down;
|
||||
};
|
||||
};
|
||||
@ -214,9 +242,11 @@ Signed-off-by: Bjorn Andersson <andersson@kernel.org>
|
||||
-&xo_board_clk {
|
||||
- clock-frequency = <24000000>;
|
||||
};
|
||||
diff --git a/arch/arm64/boot/dts/qcom/ipq9574-rdp433.dts b/arch/arm64/boot/dts/qcom/ipq9574-rdp433.dts
|
||||
index 877026ccc6e2..1bb8d96c9a82 100644
|
||||
--- a/arch/arm64/boot/dts/qcom/ipq9574-rdp433.dts
|
||||
+++ b/arch/arm64/boot/dts/qcom/ipq9574-rdp433.dts
|
||||
@@ -8,44 +8,12 @@
|
||||
@@ -8,69 +8,11 @@
|
||||
|
||||
/dts-v1/;
|
||||
|
||||
@ -226,7 +256,7 @@ Signed-off-by: Bjorn Andersson <andersson@kernel.org>
|
||||
/ {
|
||||
model = "Qualcomm Technologies, Inc. IPQ9574/AP-AL02-C7";
|
||||
compatible = "qcom,ipq9574-ap-al02-c7", "qcom,ipq9574";
|
||||
|
||||
-
|
||||
- aliases {
|
||||
- serial0 = &blsp1_uart2;
|
||||
- };
|
||||
@ -234,6 +264,24 @@ Signed-off-by: Bjorn Andersson <andersson@kernel.org>
|
||||
- chosen {
|
||||
- stdout-path = "serial0:115200n8";
|
||||
- };
|
||||
-
|
||||
- regulator_fixed_3p3: s3300 {
|
||||
- compatible = "regulator-fixed";
|
||||
- regulator-min-microvolt = <3300000>;
|
||||
- regulator-max-microvolt = <3300000>;
|
||||
- regulator-boot-on;
|
||||
- regulator-always-on;
|
||||
- regulator-name = "fixed_3p3";
|
||||
- };
|
||||
-
|
||||
- regulator_fixed_0p925: s0925 {
|
||||
- compatible = "regulator-fixed";
|
||||
- regulator-min-microvolt = <925000>;
|
||||
- regulator-max-microvolt = <925000>;
|
||||
- regulator-boot-on;
|
||||
- regulator-always-on;
|
||||
- regulator-name = "fixed_0p925";
|
||||
- };
|
||||
-};
|
||||
-
|
||||
-&blsp1_uart2 {
|
||||
@ -258,18 +306,61 @@ Signed-off-by: Bjorn Andersson <andersson@kernel.org>
|
||||
- regulator-min-microvolt = <725000>;
|
||||
- regulator-max-microvolt = <1075000>;
|
||||
- };
|
||||
-
|
||||
- mp5496_l2: l2 {
|
||||
- regulator-min-microvolt = <1800000>;
|
||||
- regulator-max-microvolt = <1800000>;
|
||||
- regulator-always-on;
|
||||
- regulator-boot-on;
|
||||
- };
|
||||
- };
|
||||
};
|
||||
|
||||
&sdhc_1 {
|
||||
@@ -97,7 +65,3 @@
|
||||
@@ -85,10 +27,6 @@ &sdhc_1 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
-&sleep_clk {
|
||||
- clock-frequency = <32000>;
|
||||
-};
|
||||
-
|
||||
&tlmm {
|
||||
sdc_default_state: sdc-default-state {
|
||||
clk-pins {
|
||||
@@ -122,30 +60,3 @@ rclk-pins {
|
||||
};
|
||||
};
|
||||
};
|
||||
-
|
||||
-&usb_0_dwc3 {
|
||||
- dr_mode = "host";
|
||||
-};
|
||||
-
|
||||
-&usb_0_qmpphy {
|
||||
- vdda-pll-supply = <&mp5496_l2>;
|
||||
- vdda-phy-supply = <®ulator_fixed_0p925>;
|
||||
-
|
||||
- status = "okay";
|
||||
-};
|
||||
-
|
||||
-&usb_0_qusbphy {
|
||||
- vdd-supply = <®ulator_fixed_0p925>;
|
||||
- vdda-pll-supply = <&mp5496_l2>;
|
||||
- vdda-phy-dpdm-supply = <®ulator_fixed_3p3>;
|
||||
-
|
||||
- status = "okay";
|
||||
-};
|
||||
-
|
||||
-&usb3 {
|
||||
- status = "okay";
|
||||
-};
|
||||
-
|
||||
-&xo_board_clk {
|
||||
- clock-frequency = <24000000>;
|
||||
-};
|
||||
diff --git a/arch/arm64/boot/dts/qcom/ipq9574-rdp449.dts b/arch/arm64/boot/dts/qcom/ipq9574-rdp449.dts
|
||||
index c8fa54e1a62c..d36d1078763e 100644
|
||||
--- a/arch/arm64/boot/dts/qcom/ipq9574-rdp449.dts
|
||||
+++ b/arch/arm64/boot/dts/qcom/ipq9574-rdp449.dts
|
||||
@@ -8,73 +8,10 @@
|
||||
@ -347,6 +438,8 @@ Signed-off-by: Bjorn Andersson <andersson@kernel.org>
|
||||
-&xo_board_clk {
|
||||
- clock-frequency = <24000000>;
|
||||
};
|
||||
diff --git a/arch/arm64/boot/dts/qcom/ipq9574-rdp453.dts b/arch/arm64/boot/dts/qcom/ipq9574-rdp453.dts
|
||||
index f01de6628c3b..c30c9fbedf26 100644
|
||||
--- a/arch/arm64/boot/dts/qcom/ipq9574-rdp453.dts
|
||||
+++ b/arch/arm64/boot/dts/qcom/ipq9574-rdp453.dts
|
||||
@@ -8,73 +8,10 @@
|
||||
@ -424,6 +517,8 @@ Signed-off-by: Bjorn Andersson <andersson@kernel.org>
|
||||
-&xo_board_clk {
|
||||
- clock-frequency = <24000000>;
|
||||
};
|
||||
diff --git a/arch/arm64/boot/dts/qcom/ipq9574-rdp454.dts b/arch/arm64/boot/dts/qcom/ipq9574-rdp454.dts
|
||||
index 6efae3426cb8..0dc382f5d5ec 100644
|
||||
--- a/arch/arm64/boot/dts/qcom/ipq9574-rdp454.dts
|
||||
+++ b/arch/arm64/boot/dts/qcom/ipq9574-rdp454.dts
|
||||
@@ -8,73 +8,9 @@
|
||||
@ -501,3 +596,6 @@ Signed-off-by: Bjorn Andersson <andersson@kernel.org>
|
||||
-&xo_board_clk {
|
||||
- clock-frequency = <24000000>;
|
||||
};
|
||||
--
|
||||
2.45.2
|
||||
|
@ -0,0 +1,307 @@
|
||||
From 80bbd1c355d661678d2a25bd36e739b6925e7a4e Mon Sep 17 00:00:00 2001
|
||||
From: Luo Jie <quic_luoj@quicinc.com>
|
||||
Date: Wed, 5 Jun 2024 20:45:39 +0800
|
||||
Subject: [PATCH] dt-bindings: clock: add qca8386/qca8084 clock and reset
|
||||
definitions
|
||||
|
||||
QCA8386/QCA8084 includes the clock & reset controller that is
|
||||
accessed by MDIO bus. Two work modes are supported, qca8386 works
|
||||
as switch mode, qca8084 works as PHY mode.
|
||||
|
||||
Reviewed-by: Rob Herring <robh@kernel.org>
|
||||
Signed-off-by: Luo Jie <quic_luoj@quicinc.com>
|
||||
Link: https://lore.kernel.org/r/20240605124541.2711467-3-quic_luoj@quicinc.com
|
||||
Signed-off-by: Bjorn Andersson <andersson@kernel.org>
|
||||
---
|
||||
.../bindings/clock/qcom,qca8k-nsscc.yaml | 86 +++++++++++++++
|
||||
include/dt-bindings/clock/qcom,qca8k-nsscc.h | 101 ++++++++++++++++++
|
||||
include/dt-bindings/reset/qcom,qca8k-nsscc.h | 76 +++++++++++++
|
||||
3 files changed, 263 insertions(+)
|
||||
create mode 100644 Documentation/devicetree/bindings/clock/qcom,qca8k-nsscc.yaml
|
||||
create mode 100644 include/dt-bindings/clock/qcom,qca8k-nsscc.h
|
||||
create mode 100644 include/dt-bindings/reset/qcom,qca8k-nsscc.h
|
||||
|
||||
diff --git a/Documentation/devicetree/bindings/clock/qcom,qca8k-nsscc.yaml b/Documentation/devicetree/bindings/clock/qcom,qca8k-nsscc.yaml
|
||||
new file mode 100644
|
||||
index 000000000000..61473385da2d
|
||||
--- /dev/null
|
||||
+++ b/Documentation/devicetree/bindings/clock/qcom,qca8k-nsscc.yaml
|
||||
@@ -0,0 +1,86 @@
|
||||
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
+%YAML 1.2
|
||||
+---
|
||||
+$id: http://devicetree.org/schemas/clock/qcom,qca8k-nsscc.yaml#
|
||||
+$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
+
|
||||
+title: Qualcomm NSS Clock & Reset Controller on QCA8386/QCA8084
|
||||
+
|
||||
+maintainers:
|
||||
+ - Bjorn Andersson <andersson@kernel.org>
|
||||
+ - Luo Jie <quic_luoj@quicinc.com>
|
||||
+
|
||||
+description: |
|
||||
+ Qualcomm NSS clock control module provides the clocks and resets
|
||||
+ on QCA8386(switch mode)/QCA8084(PHY mode)
|
||||
+
|
||||
+ See also::
|
||||
+ include/dt-bindings/clock/qcom,qca8k-nsscc.h
|
||||
+ include/dt-bindings/reset/qcom,qca8k-nsscc.h
|
||||
+
|
||||
+properties:
|
||||
+ compatible:
|
||||
+ oneOf:
|
||||
+ - const: qcom,qca8084-nsscc
|
||||
+ - items:
|
||||
+ - enum:
|
||||
+ - qcom,qca8082-nsscc
|
||||
+ - qcom,qca8085-nsscc
|
||||
+ - qcom,qca8384-nsscc
|
||||
+ - qcom,qca8385-nsscc
|
||||
+ - qcom,qca8386-nsscc
|
||||
+ - const: qcom,qca8084-nsscc
|
||||
+
|
||||
+ clocks:
|
||||
+ items:
|
||||
+ - description: Chip reference clock source
|
||||
+ - description: UNIPHY0 RX 312P5M/125M clock source
|
||||
+ - description: UNIPHY0 TX 312P5M/125M clock source
|
||||
+ - description: UNIPHY1 RX 312P5M/125M clock source
|
||||
+ - description: UNIPHY1 TX 312P5M/125M clock source
|
||||
+ - description: UNIPHY1 RX 312P5M clock source
|
||||
+ - description: UNIPHY1 TX 312P5M clock source
|
||||
+
|
||||
+ reg:
|
||||
+ items:
|
||||
+ - description: MDIO bus address for Clock & Reset Controller register
|
||||
+
|
||||
+ reset-gpios:
|
||||
+ description: GPIO connected to the chip
|
||||
+ maxItems: 1
|
||||
+
|
||||
+required:
|
||||
+ - compatible
|
||||
+ - clocks
|
||||
+ - reg
|
||||
+ - reset-gpios
|
||||
+
|
||||
+allOf:
|
||||
+ - $ref: qcom,gcc.yaml#
|
||||
+
|
||||
+unevaluatedProperties: false
|
||||
+
|
||||
+examples:
|
||||
+ - |
|
||||
+ #include <dt-bindings/gpio/gpio.h>
|
||||
+ mdio {
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+
|
||||
+ clock-controller@18 {
|
||||
+ compatible = "qcom,qca8084-nsscc";
|
||||
+ reg = <0x18>;
|
||||
+ reset-gpios = <&tlmm 51 GPIO_ACTIVE_LOW>;
|
||||
+ clocks = <&pcs0_pll>,
|
||||
+ <&qca8k_uniphy0_rx>,
|
||||
+ <&qca8k_uniphy0_tx>,
|
||||
+ <&qca8k_uniphy1_rx>,
|
||||
+ <&qca8k_uniphy1_tx>,
|
||||
+ <&qca8k_uniphy1_rx312p5m>,
|
||||
+ <&qca8k_uniphy1_tx312p5m>;
|
||||
+ #clock-cells = <1>;
|
||||
+ #reset-cells = <1>;
|
||||
+ #power-domain-cells = <1>;
|
||||
+ };
|
||||
+ };
|
||||
+...
|
||||
diff --git a/include/dt-bindings/clock/qcom,qca8k-nsscc.h b/include/dt-bindings/clock/qcom,qca8k-nsscc.h
|
||||
new file mode 100644
|
||||
index 000000000000..0ac3e4c69a1a
|
||||
--- /dev/null
|
||||
+++ b/include/dt-bindings/clock/qcom,qca8k-nsscc.h
|
||||
@@ -0,0 +1,101 @@
|
||||
+/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
|
||||
+/*
|
||||
+ * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
+ */
|
||||
+
|
||||
+#ifndef _DT_BINDINGS_CLK_QCOM_QCA8K_NSS_CC_H
|
||||
+#define _DT_BINDINGS_CLK_QCOM_QCA8K_NSS_CC_H
|
||||
+
|
||||
+#define NSS_CC_SWITCH_CORE_CLK_SRC 0
|
||||
+#define NSS_CC_SWITCH_CORE_CLK 1
|
||||
+#define NSS_CC_APB_BRIDGE_CLK 2
|
||||
+#define NSS_CC_MAC0_TX_CLK_SRC 3
|
||||
+#define NSS_CC_MAC0_TX_DIV_CLK_SRC 4
|
||||
+#define NSS_CC_MAC0_TX_CLK 5
|
||||
+#define NSS_CC_MAC0_TX_SRDS1_CLK 6
|
||||
+#define NSS_CC_MAC0_RX_CLK_SRC 7
|
||||
+#define NSS_CC_MAC0_RX_DIV_CLK_SRC 8
|
||||
+#define NSS_CC_MAC0_RX_CLK 9
|
||||
+#define NSS_CC_MAC0_RX_SRDS1_CLK 10
|
||||
+#define NSS_CC_MAC1_TX_CLK_SRC 11
|
||||
+#define NSS_CC_MAC1_TX_DIV_CLK_SRC 12
|
||||
+#define NSS_CC_MAC1_SRDS1_CH0_XGMII_RX_DIV_CLK_SRC 13
|
||||
+#define NSS_CC_MAC1_SRDS1_CH0_RX_CLK 14
|
||||
+#define NSS_CC_MAC1_TX_CLK 15
|
||||
+#define NSS_CC_MAC1_GEPHY0_TX_CLK 16
|
||||
+#define NSS_CC_MAC1_SRDS1_CH0_XGMII_RX_CLK 17
|
||||
+#define NSS_CC_MAC1_RX_CLK_SRC 18
|
||||
+#define NSS_CC_MAC1_RX_DIV_CLK_SRC 19
|
||||
+#define NSS_CC_MAC1_SRDS1_CH0_XGMII_TX_DIV_CLK_SRC 20
|
||||
+#define NSS_CC_MAC1_SRDS1_CH0_TX_CLK 21
|
||||
+#define NSS_CC_MAC1_RX_CLK 22
|
||||
+#define NSS_CC_MAC1_GEPHY0_RX_CLK 23
|
||||
+#define NSS_CC_MAC1_SRDS1_CH0_XGMII_TX_CLK 24
|
||||
+#define NSS_CC_MAC2_TX_CLK_SRC 25
|
||||
+#define NSS_CC_MAC2_TX_DIV_CLK_SRC 26
|
||||
+#define NSS_CC_MAC2_SRDS1_CH1_XGMII_RX_DIV_CLK_SRC 27
|
||||
+#define NSS_CC_MAC2_SRDS1_CH1_RX_CLK 28
|
||||
+#define NSS_CC_MAC2_TX_CLK 29
|
||||
+#define NSS_CC_MAC2_GEPHY1_TX_CLK 30
|
||||
+#define NSS_CC_MAC2_SRDS1_CH1_XGMII_RX_CLK 31
|
||||
+#define NSS_CC_MAC2_RX_CLK_SRC 32
|
||||
+#define NSS_CC_MAC2_RX_DIV_CLK_SRC 33
|
||||
+#define NSS_CC_MAC2_SRDS1_CH1_XGMII_TX_DIV_CLK_SRC 34
|
||||
+#define NSS_CC_MAC2_SRDS1_CH1_TX_CLK 35
|
||||
+#define NSS_CC_MAC2_RX_CLK 36
|
||||
+#define NSS_CC_MAC2_GEPHY1_RX_CLK 37
|
||||
+#define NSS_CC_MAC2_SRDS1_CH1_XGMII_TX_CLK 38
|
||||
+#define NSS_CC_MAC3_TX_CLK_SRC 39
|
||||
+#define NSS_CC_MAC3_TX_DIV_CLK_SRC 40
|
||||
+#define NSS_CC_MAC3_SRDS1_CH2_XGMII_RX_DIV_CLK_SRC 41
|
||||
+#define NSS_CC_MAC3_SRDS1_CH2_RX_CLK 42
|
||||
+#define NSS_CC_MAC3_TX_CLK 43
|
||||
+#define NSS_CC_MAC3_GEPHY2_TX_CLK 44
|
||||
+#define NSS_CC_MAC3_SRDS1_CH2_XGMII_RX_CLK 45
|
||||
+#define NSS_CC_MAC3_RX_CLK_SRC 46
|
||||
+#define NSS_CC_MAC3_RX_DIV_CLK_SRC 47
|
||||
+#define NSS_CC_MAC3_SRDS1_CH2_XGMII_TX_DIV_CLK_SRC 48
|
||||
+#define NSS_CC_MAC3_SRDS1_CH2_TX_CLK 49
|
||||
+#define NSS_CC_MAC3_RX_CLK 50
|
||||
+#define NSS_CC_MAC3_GEPHY2_RX_CLK 51
|
||||
+#define NSS_CC_MAC3_SRDS1_CH2_XGMII_TX_CLK 52
|
||||
+#define NSS_CC_MAC4_TX_CLK_SRC 53
|
||||
+#define NSS_CC_MAC4_TX_DIV_CLK_SRC 54
|
||||
+#define NSS_CC_MAC4_SRDS1_CH3_XGMII_RX_DIV_CLK_SRC 55
|
||||
+#define NSS_CC_MAC4_SRDS1_CH3_RX_CLK 56
|
||||
+#define NSS_CC_MAC4_TX_CLK 57
|
||||
+#define NSS_CC_MAC4_GEPHY3_TX_CLK 58
|
||||
+#define NSS_CC_MAC4_SRDS1_CH3_XGMII_RX_CLK 59
|
||||
+#define NSS_CC_MAC4_RX_CLK_SRC 60
|
||||
+#define NSS_CC_MAC4_RX_DIV_CLK_SRC 61
|
||||
+#define NSS_CC_MAC4_SRDS1_CH3_XGMII_TX_DIV_CLK_SRC 62
|
||||
+#define NSS_CC_MAC4_SRDS1_CH3_TX_CLK 63
|
||||
+#define NSS_CC_MAC4_RX_CLK 64
|
||||
+#define NSS_CC_MAC4_GEPHY3_RX_CLK 65
|
||||
+#define NSS_CC_MAC4_SRDS1_CH3_XGMII_TX_CLK 66
|
||||
+#define NSS_CC_MAC5_TX_CLK_SRC 67
|
||||
+#define NSS_CC_MAC5_TX_DIV_CLK_SRC 68
|
||||
+#define NSS_CC_MAC5_TX_SRDS0_CLK 69
|
||||
+#define NSS_CC_MAC5_TX_CLK 70
|
||||
+#define NSS_CC_MAC5_RX_CLK_SRC 71
|
||||
+#define NSS_CC_MAC5_RX_DIV_CLK_SRC 72
|
||||
+#define NSS_CC_MAC5_RX_SRDS0_CLK 73
|
||||
+#define NSS_CC_MAC5_RX_CLK 74
|
||||
+#define NSS_CC_MAC5_TX_SRDS0_CLK_SRC 75
|
||||
+#define NSS_CC_MAC5_RX_SRDS0_CLK_SRC 76
|
||||
+#define NSS_CC_AHB_CLK_SRC 77
|
||||
+#define NSS_CC_AHB_CLK 78
|
||||
+#define NSS_CC_SEC_CTRL_AHB_CLK 79
|
||||
+#define NSS_CC_TLMM_CLK 80
|
||||
+#define NSS_CC_TLMM_AHB_CLK 81
|
||||
+#define NSS_CC_CNOC_AHB_CLK 82
|
||||
+#define NSS_CC_MDIO_AHB_CLK 83
|
||||
+#define NSS_CC_MDIO_MASTER_AHB_CLK 84
|
||||
+#define NSS_CC_SYS_CLK_SRC 85
|
||||
+#define NSS_CC_SRDS0_SYS_CLK 86
|
||||
+#define NSS_CC_SRDS1_SYS_CLK 87
|
||||
+#define NSS_CC_GEPHY0_SYS_CLK 88
|
||||
+#define NSS_CC_GEPHY1_SYS_CLK 89
|
||||
+#define NSS_CC_GEPHY2_SYS_CLK 90
|
||||
+#define NSS_CC_GEPHY3_SYS_CLK 91
|
||||
+#endif
|
||||
diff --git a/include/dt-bindings/reset/qcom,qca8k-nsscc.h b/include/dt-bindings/reset/qcom,qca8k-nsscc.h
|
||||
new file mode 100644
|
||||
index 000000000000..c71167a3bd41
|
||||
--- /dev/null
|
||||
+++ b/include/dt-bindings/reset/qcom,qca8k-nsscc.h
|
||||
@@ -0,0 +1,76 @@
|
||||
+/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
|
||||
+/*
|
||||
+ * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
+ */
|
||||
+
|
||||
+#ifndef _DT_BINDINGS_RESET_QCOM_QCA8K_NSS_CC_H
|
||||
+#define _DT_BINDINGS_RESET_QCOM_QCA8K_NSS_CC_H
|
||||
+
|
||||
+#define NSS_CC_SWITCH_CORE_ARES 1
|
||||
+#define NSS_CC_APB_BRIDGE_ARES 2
|
||||
+#define NSS_CC_MAC0_TX_ARES 3
|
||||
+#define NSS_CC_MAC0_TX_SRDS1_ARES 4
|
||||
+#define NSS_CC_MAC0_RX_ARES 5
|
||||
+#define NSS_CC_MAC0_RX_SRDS1_ARES 6
|
||||
+#define NSS_CC_MAC1_SRDS1_CH0_RX_ARES 7
|
||||
+#define NSS_CC_MAC1_TX_ARES 8
|
||||
+#define NSS_CC_MAC1_GEPHY0_TX_ARES 9
|
||||
+#define NSS_CC_MAC1_SRDS1_CH0_XGMII_RX_ARES 10
|
||||
+#define NSS_CC_MAC1_SRDS1_CH0_TX_ARES 11
|
||||
+#define NSS_CC_MAC1_RX_ARES 12
|
||||
+#define NSS_CC_MAC1_GEPHY0_RX_ARES 13
|
||||
+#define NSS_CC_MAC1_SRDS1_CH0_XGMII_TX_ARES 14
|
||||
+#define NSS_CC_MAC2_SRDS1_CH1_RX_ARES 15
|
||||
+#define NSS_CC_MAC2_TX_ARES 16
|
||||
+#define NSS_CC_MAC2_GEPHY1_TX_ARES 17
|
||||
+#define NSS_CC_MAC2_SRDS1_CH1_XGMII_RX_ARES 18
|
||||
+#define NSS_CC_MAC2_SRDS1_CH1_TX_ARES 19
|
||||
+#define NSS_CC_MAC2_RX_ARES 20
|
||||
+#define NSS_CC_MAC2_GEPHY1_RX_ARES 21
|
||||
+#define NSS_CC_MAC2_SRDS1_CH1_XGMII_TX_ARES 22
|
||||
+#define NSS_CC_MAC3_SRDS1_CH2_RX_ARES 23
|
||||
+#define NSS_CC_MAC3_TX_ARES 24
|
||||
+#define NSS_CC_MAC3_GEPHY2_TX_ARES 25
|
||||
+#define NSS_CC_MAC3_SRDS1_CH2_XGMII_RX_ARES 26
|
||||
+#define NSS_CC_MAC3_SRDS1_CH2_TX_ARES 27
|
||||
+#define NSS_CC_MAC3_RX_ARES 28
|
||||
+#define NSS_CC_MAC3_GEPHY2_RX_ARES 29
|
||||
+#define NSS_CC_MAC3_SRDS1_CH2_XGMII_TX_ARES 30
|
||||
+#define NSS_CC_MAC4_SRDS1_CH3_RX_ARES 31
|
||||
+#define NSS_CC_MAC4_TX_ARES 32
|
||||
+#define NSS_CC_MAC4_GEPHY3_TX_ARES 33
|
||||
+#define NSS_CC_MAC4_SRDS1_CH3_XGMII_RX_ARES 34
|
||||
+#define NSS_CC_MAC4_SRDS1_CH3_TX_ARES 35
|
||||
+#define NSS_CC_MAC4_RX_ARES 36
|
||||
+#define NSS_CC_MAC4_GEPHY3_RX_ARES 37
|
||||
+#define NSS_CC_MAC4_SRDS1_CH3_XGMII_TX_ARES 38
|
||||
+#define NSS_CC_MAC5_TX_ARES 39
|
||||
+#define NSS_CC_MAC5_TX_SRDS0_ARES 40
|
||||
+#define NSS_CC_MAC5_RX_ARES 41
|
||||
+#define NSS_CC_MAC5_RX_SRDS0_ARES 42
|
||||
+#define NSS_CC_AHB_ARES 43
|
||||
+#define NSS_CC_SEC_CTRL_AHB_ARES 44
|
||||
+#define NSS_CC_TLMM_ARES 45
|
||||
+#define NSS_CC_TLMM_AHB_ARES 46
|
||||
+#define NSS_CC_CNOC_AHB_ARES 47
|
||||
+#define NSS_CC_MDIO_AHB_ARES 48
|
||||
+#define NSS_CC_MDIO_MASTER_AHB_ARES 49
|
||||
+#define NSS_CC_SRDS0_SYS_ARES 50
|
||||
+#define NSS_CC_SRDS1_SYS_ARES 51
|
||||
+#define NSS_CC_GEPHY0_SYS_ARES 52
|
||||
+#define NSS_CC_GEPHY1_SYS_ARES 53
|
||||
+#define NSS_CC_GEPHY2_SYS_ARES 54
|
||||
+#define NSS_CC_GEPHY3_SYS_ARES 55
|
||||
+#define NSS_CC_SEC_CTRL_ARES 56
|
||||
+#define NSS_CC_SEC_CTRL_SENSE_ARES 57
|
||||
+#define NSS_CC_SLEEP_ARES 58
|
||||
+#define NSS_CC_DEBUG_ARES 59
|
||||
+#define NSS_CC_GEPHY0_ARES 60
|
||||
+#define NSS_CC_GEPHY1_ARES 61
|
||||
+#define NSS_CC_GEPHY2_ARES 62
|
||||
+#define NSS_CC_GEPHY3_ARES 63
|
||||
+#define NSS_CC_DSP_ARES 64
|
||||
+#define NSS_CC_GEPHY_FULL_ARES 65
|
||||
+#define NSS_CC_GLOBAL_ARES 66
|
||||
+#define NSS_CC_XPCS_ARES 67
|
||||
+#endif
|
||||
--
|
||||
2.45.2
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,39 @@
|
||||
From e60ac570137b42ef61a01a6b26133a8e2d7e8d4b Mon Sep 17 00:00:00 2001
|
||||
From: Alexandru Gagniuc <mr.nuke.me@gmail.com>
|
||||
Date: Mon, 6 May 2024 21:47:58 -0500
|
||||
Subject: [PATCH] arm64: dts: qcom: ipq9574: add MDIO bus
|
||||
|
||||
The IPQ95xx uses an IPQ4019 compatible MDIO controller that is already
|
||||
supported. Add a DT node to expose it.
|
||||
|
||||
Signed-off-by: Alexandru Gagniuc <mr.nuke.me@gmail.com>
|
||||
Link: https://lore.kernel.org/r/20240507024758.2810514-2-mr.nuke.me@gmail.com
|
||||
Signed-off-by: Bjorn Andersson <andersson@kernel.org>
|
||||
---
|
||||
arch/arm64/boot/dts/qcom/ipq9574.dtsi | 10 ++++++++++
|
||||
1 file changed, 10 insertions(+)
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/qcom/ipq9574.dtsi b/arch/arm64/boot/dts/qcom/ipq9574.dtsi
|
||||
index 7f2e5cbf3bbb..ded02bc39275 100644
|
||||
--- a/arch/arm64/boot/dts/qcom/ipq9574.dtsi
|
||||
+++ b/arch/arm64/boot/dts/qcom/ipq9574.dtsi
|
||||
@@ -232,6 +232,16 @@ rng: rng@e3000 {
|
||||
clock-names = "core";
|
||||
};
|
||||
|
||||
+ mdio: mdio@90000 {
|
||||
+ compatible = "qcom,ipq9574-mdio", "qcom,ipq4019-mdio";
|
||||
+ reg = <0x00090000 0x64>;
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+ clocks = <&gcc GCC_MDIO_AHB_CLK>;
|
||||
+ clock-names = "gcc_mdio_ahb_clk";
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
+
|
||||
qfprom: efuse@a4000 {
|
||||
compatible = "qcom,ipq9574-qfprom", "qcom,qfprom";
|
||||
reg = <0x000a4000 0x5a1>;
|
||||
--
|
||||
2.45.2
|
||||
|
@ -0,0 +1,88 @@
|
||||
From d06b1043644a1831ab141bbee2669002bba15b0f Mon Sep 17 00:00:00 2001
|
||||
From: Christian Marangi <ansuelsmth@gmail.com>
|
||||
Date: Wed, 20 Dec 2023 23:17:22 +0100
|
||||
Subject: [PATCH 1/2] clk: qcom: clk-rcg: introduce support for multiple conf
|
||||
for same freq
|
||||
|
||||
Some RCG frequency can be reached by multiple configuration.
|
||||
|
||||
We currently declare multiple configuration for the same frequency but
|
||||
that is not supported and always the first configuration will be taken.
|
||||
|
||||
These multiple configuration are needed as based on the current parent
|
||||
configuration, it may be needed to use a different configuration to
|
||||
reach the same frequency.
|
||||
|
||||
To handle this introduce 3 new macro, C, FM and FMS:
|
||||
|
||||
- C is used to declare a freq_conf where src, pre_div, m and n are
|
||||
provided.
|
||||
|
||||
- FM is used to declare a freq_multi_tbl with the frequency and an
|
||||
array of confs to insert all the config for the provided frequency.
|
||||
|
||||
- FMS is used to declare a freq_multi_tbl with the frequency and an
|
||||
array of a single conf with the provided src, pre_div, m and n.
|
||||
|
||||
Struct clk_rcg2 is changed to add a union type to reference a simple
|
||||
freq_tbl or a complex freq_multi_tbl.
|
||||
|
||||
Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
||||
Acked-by: Stephen Boyd <sboyd@kernel.org>
|
||||
Link: https://lore.kernel.org/r/20231220221724.3822-2-ansuelsmth@gmail.com
|
||||
Signed-off-by: Bjorn Andersson <andersson@kernel.org>
|
||||
---
|
||||
drivers/clk/qcom/clk-rcg.h | 23 ++++++++++++++++++++++-
|
||||
1 file changed, 22 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/clk/qcom/clk-rcg.h b/drivers/clk/qcom/clk-rcg.h
|
||||
index e6d84c8c7989..c50e6616d02c 100644
|
||||
--- a/drivers/clk/qcom/clk-rcg.h
|
||||
+++ b/drivers/clk/qcom/clk-rcg.h
|
||||
@@ -17,6 +17,23 @@ struct freq_tbl {
|
||||
u16 n;
|
||||
};
|
||||
|
||||
+#define C(s, h, m, n) { (s), (2 * (h) - 1), (m), (n) }
|
||||
+#define FM(f, confs) { (f), ARRAY_SIZE(confs), (confs) }
|
||||
+#define FMS(f, s, h, m, n) { (f), 1, (const struct freq_conf []){ C(s, h, m, n) } }
|
||||
+
|
||||
+struct freq_conf {
|
||||
+ u8 src;
|
||||
+ u8 pre_div;
|
||||
+ u16 m;
|
||||
+ u16 n;
|
||||
+};
|
||||
+
|
||||
+struct freq_multi_tbl {
|
||||
+ unsigned long freq;
|
||||
+ size_t num_confs;
|
||||
+ const struct freq_conf *confs;
|
||||
+};
|
||||
+
|
||||
/**
|
||||
* struct mn - M/N:D counter
|
||||
* @mnctr_en_bit: bit to enable mn counter
|
||||
@@ -138,6 +155,7 @@ extern const struct clk_ops clk_dyn_rcg_ops;
|
||||
* @safe_src_index: safe src index value
|
||||
* @parent_map: map from software's parent index to hardware's src_sel field
|
||||
* @freq_tbl: frequency table
|
||||
+ * @freq_multi_tbl: frequency table for clocks reachable with multiple RCGs conf
|
||||
* @clkr: regmap clock handle
|
||||
* @cfg_off: defines the cfg register offset from the CMD_RCGR + CFG_REG
|
||||
* @parked_cfg: cached value of the CFG register for parked RCGs
|
||||
@@ -149,7 +167,10 @@ struct clk_rcg2 {
|
||||
u8 hid_width;
|
||||
u8 safe_src_index;
|
||||
const struct parent_map *parent_map;
|
||||
- const struct freq_tbl *freq_tbl;
|
||||
+ union {
|
||||
+ const struct freq_tbl *freq_tbl;
|
||||
+ const struct freq_multi_tbl *freq_multi_tbl;
|
||||
+ };
|
||||
struct clk_regmap clkr;
|
||||
u8 cfg_off;
|
||||
u32 parked_cfg;
|
||||
--
|
||||
2.45.2
|
||||
|
@ -0,0 +1,307 @@
|
||||
From 89da22456af0762477d8c1345fdd17961b3ada80 Mon Sep 17 00:00:00 2001
|
||||
From: Christian Marangi <ansuelsmth@gmail.com>
|
||||
Date: Wed, 20 Dec 2023 23:17:23 +0100
|
||||
Subject: [PATCH 2/2] clk: qcom: clk-rcg2: add support for rcg2 freq multi ops
|
||||
|
||||
Some RCG frequency can be reached by multiple configuration.
|
||||
|
||||
Add clk_rcg2_fm_ops ops to support these special RCG configurations.
|
||||
|
||||
These alternative ops will select the frequency using a CEIL policy.
|
||||
|
||||
When the correct frequency is found, the correct config is selected by
|
||||
calculating the final rate (by checking the defined parent and values
|
||||
in the config that is being checked) and deciding based on the one that
|
||||
is less different than the requested one.
|
||||
|
||||
These check are skipped if there is just one config for the requested
|
||||
freq.
|
||||
|
||||
qcom_find_freq_multi is added to search the freq with the new struct
|
||||
freq_multi_tbl.
|
||||
__clk_rcg2_select_conf is used to select the correct conf by simulating
|
||||
the final clock.
|
||||
If a conf can't be found due to parent not reachable, a WARN is printed
|
||||
and -EINVAL is returned.
|
||||
|
||||
Tested-by: Wei Lei <quic_leiwei@quicinc.com>
|
||||
Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
||||
Acked-by: Stephen Boyd <sboyd@kernel.org>
|
||||
Link: https://lore.kernel.org/r/20231220221724.3822-3-ansuelsmth@gmail.com
|
||||
Signed-off-by: Bjorn Andersson <andersson@kernel.org>
|
||||
---
|
||||
drivers/clk/qcom/clk-rcg.h | 1 +
|
||||
drivers/clk/qcom/clk-rcg2.c | 166 ++++++++++++++++++++++++++++++++++++
|
||||
drivers/clk/qcom/common.c | 18 ++++
|
||||
drivers/clk/qcom/common.h | 2 +
|
||||
4 files changed, 187 insertions(+)
|
||||
|
||||
diff --git a/drivers/clk/qcom/clk-rcg.h b/drivers/clk/qcom/clk-rcg.h
|
||||
index c50e6616d02c..d7414361e432 100644
|
||||
--- a/drivers/clk/qcom/clk-rcg.h
|
||||
+++ b/drivers/clk/qcom/clk-rcg.h
|
||||
@@ -190,6 +190,7 @@ struct clk_rcg2_gfx3d {
|
||||
|
||||
extern const struct clk_ops clk_rcg2_ops;
|
||||
extern const struct clk_ops clk_rcg2_floor_ops;
|
||||
+extern const struct clk_ops clk_rcg2_fm_ops;
|
||||
extern const struct clk_ops clk_rcg2_mux_closest_ops;
|
||||
extern const struct clk_ops clk_edp_pixel_ops;
|
||||
extern const struct clk_ops clk_byte_ops;
|
||||
diff --git a/drivers/clk/qcom/clk-rcg2.c b/drivers/clk/qcom/clk-rcg2.c
|
||||
index 5183c74b074f..9b3aaa7f20ac 100644
|
||||
--- a/drivers/clk/qcom/clk-rcg2.c
|
||||
+++ b/drivers/clk/qcom/clk-rcg2.c
|
||||
@@ -260,6 +260,115 @@ static int _freq_tbl_determine_rate(struct clk_hw *hw, const struct freq_tbl *f,
|
||||
return 0;
|
||||
}
|
||||
|
||||
+static const struct freq_conf *
|
||||
+__clk_rcg2_select_conf(struct clk_hw *hw, const struct freq_multi_tbl *f,
|
||||
+ unsigned long req_rate)
|
||||
+{
|
||||
+ unsigned long rate_diff, best_rate_diff = ULONG_MAX;
|
||||
+ const struct freq_conf *conf, *best_conf = NULL;
|
||||
+ struct clk_rcg2 *rcg = to_clk_rcg2(hw);
|
||||
+ const char *name = clk_hw_get_name(hw);
|
||||
+ unsigned long parent_rate, rate;
|
||||
+ struct clk_hw *p;
|
||||
+ int index, i;
|
||||
+
|
||||
+ /* Exit early if only one config is defined */
|
||||
+ if (f->num_confs == 1) {
|
||||
+ best_conf = f->confs;
|
||||
+ goto exit;
|
||||
+ }
|
||||
+
|
||||
+ /* Search in each provided config the one that is near the wanted rate */
|
||||
+ for (i = 0, conf = f->confs; i < f->num_confs; i++, conf++) {
|
||||
+ index = qcom_find_src_index(hw, rcg->parent_map, conf->src);
|
||||
+ if (index < 0)
|
||||
+ continue;
|
||||
+
|
||||
+ p = clk_hw_get_parent_by_index(hw, index);
|
||||
+ if (!p)
|
||||
+ continue;
|
||||
+
|
||||
+ parent_rate = clk_hw_get_rate(p);
|
||||
+ rate = calc_rate(parent_rate, conf->n, conf->m, conf->n, conf->pre_div);
|
||||
+
|
||||
+ if (rate == req_rate) {
|
||||
+ best_conf = conf;
|
||||
+ goto exit;
|
||||
+ }
|
||||
+
|
||||
+ rate_diff = abs_diff(req_rate, rate);
|
||||
+ if (rate_diff < best_rate_diff) {
|
||||
+ best_rate_diff = rate_diff;
|
||||
+ best_conf = conf;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ /*
|
||||
+ * Very unlikely. Warn if we couldn't find a correct config
|
||||
+ * due to parent not found in every config.
|
||||
+ */
|
||||
+ if (unlikely(!best_conf)) {
|
||||
+ WARN(1, "%s: can't find a configuration for rate %lu\n",
|
||||
+ name, req_rate);
|
||||
+ return ERR_PTR(-EINVAL);
|
||||
+ }
|
||||
+
|
||||
+exit:
|
||||
+ return best_conf;
|
||||
+}
|
||||
+
|
||||
+static int _freq_tbl_fm_determine_rate(struct clk_hw *hw, const struct freq_multi_tbl *f,
|
||||
+ struct clk_rate_request *req)
|
||||
+{
|
||||
+ unsigned long clk_flags, rate = req->rate;
|
||||
+ struct clk_rcg2 *rcg = to_clk_rcg2(hw);
|
||||
+ const struct freq_conf *conf;
|
||||
+ struct clk_hw *p;
|
||||
+ int index;
|
||||
+
|
||||
+ f = qcom_find_freq_multi(f, rate);
|
||||
+ if (!f || !f->confs)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ conf = __clk_rcg2_select_conf(hw, f, rate);
|
||||
+ if (IS_ERR(conf))
|
||||
+ return PTR_ERR(conf);
|
||||
+ index = qcom_find_src_index(hw, rcg->parent_map, conf->src);
|
||||
+ if (index < 0)
|
||||
+ return index;
|
||||
+
|
||||
+ clk_flags = clk_hw_get_flags(hw);
|
||||
+ p = clk_hw_get_parent_by_index(hw, index);
|
||||
+ if (!p)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ if (clk_flags & CLK_SET_RATE_PARENT) {
|
||||
+ rate = f->freq;
|
||||
+ if (conf->pre_div) {
|
||||
+ if (!rate)
|
||||
+ rate = req->rate;
|
||||
+ rate /= 2;
|
||||
+ rate *= conf->pre_div + 1;
|
||||
+ }
|
||||
+
|
||||
+ if (conf->n) {
|
||||
+ u64 tmp = rate;
|
||||
+
|
||||
+ tmp = tmp * conf->n;
|
||||
+ do_div(tmp, conf->m);
|
||||
+ rate = tmp;
|
||||
+ }
|
||||
+ } else {
|
||||
+ rate = clk_hw_get_rate(p);
|
||||
+ }
|
||||
+
|
||||
+ req->best_parent_hw = p;
|
||||
+ req->best_parent_rate = rate;
|
||||
+ req->rate = f->freq;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
static int clk_rcg2_determine_rate(struct clk_hw *hw,
|
||||
struct clk_rate_request *req)
|
||||
{
|
||||
@@ -276,6 +385,14 @@ static int clk_rcg2_determine_floor_rate(struct clk_hw *hw,
|
||||
return _freq_tbl_determine_rate(hw, rcg->freq_tbl, req, FLOOR);
|
||||
}
|
||||
|
||||
+static int clk_rcg2_fm_determine_rate(struct clk_hw *hw,
|
||||
+ struct clk_rate_request *req)
|
||||
+{
|
||||
+ struct clk_rcg2 *rcg = to_clk_rcg2(hw);
|
||||
+
|
||||
+ return _freq_tbl_fm_determine_rate(hw, rcg->freq_multi_tbl, req);
|
||||
+}
|
||||
+
|
||||
static int __clk_rcg2_configure(struct clk_rcg2 *rcg, const struct freq_tbl *f,
|
||||
u32 *_cfg)
|
||||
{
|
||||
@@ -371,6 +488,30 @@ static int __clk_rcg2_set_rate(struct clk_hw *hw, unsigned long rate,
|
||||
return clk_rcg2_configure(rcg, f);
|
||||
}
|
||||
|
||||
+static int __clk_rcg2_fm_set_rate(struct clk_hw *hw, unsigned long rate)
|
||||
+{
|
||||
+ struct clk_rcg2 *rcg = to_clk_rcg2(hw);
|
||||
+ const struct freq_multi_tbl *f;
|
||||
+ const struct freq_conf *conf;
|
||||
+ struct freq_tbl f_tbl = {};
|
||||
+
|
||||
+ f = qcom_find_freq_multi(rcg->freq_multi_tbl, rate);
|
||||
+ if (!f || !f->confs)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ conf = __clk_rcg2_select_conf(hw, f, rate);
|
||||
+ if (IS_ERR(conf))
|
||||
+ return PTR_ERR(conf);
|
||||
+
|
||||
+ f_tbl.freq = f->freq;
|
||||
+ f_tbl.src = conf->src;
|
||||
+ f_tbl.pre_div = conf->pre_div;
|
||||
+ f_tbl.m = conf->m;
|
||||
+ f_tbl.n = conf->n;
|
||||
+
|
||||
+ return clk_rcg2_configure(rcg, &f_tbl);
|
||||
+}
|
||||
+
|
||||
static int clk_rcg2_set_rate(struct clk_hw *hw, unsigned long rate,
|
||||
unsigned long parent_rate)
|
||||
{
|
||||
@@ -383,6 +524,12 @@ static int clk_rcg2_set_floor_rate(struct clk_hw *hw, unsigned long rate,
|
||||
return __clk_rcg2_set_rate(hw, rate, FLOOR);
|
||||
}
|
||||
|
||||
+static int clk_rcg2_fm_set_rate(struct clk_hw *hw, unsigned long rate,
|
||||
+ unsigned long parent_rate)
|
||||
+{
|
||||
+ return __clk_rcg2_fm_set_rate(hw, rate);
|
||||
+}
|
||||
+
|
||||
static int clk_rcg2_set_rate_and_parent(struct clk_hw *hw,
|
||||
unsigned long rate, unsigned long parent_rate, u8 index)
|
||||
{
|
||||
@@ -395,6 +542,12 @@ static int clk_rcg2_set_floor_rate_and_parent(struct clk_hw *hw,
|
||||
return __clk_rcg2_set_rate(hw, rate, FLOOR);
|
||||
}
|
||||
|
||||
+static int clk_rcg2_fm_set_rate_and_parent(struct clk_hw *hw,
|
||||
+ unsigned long rate, unsigned long parent_rate, u8 index)
|
||||
+{
|
||||
+ return __clk_rcg2_fm_set_rate(hw, rate);
|
||||
+}
|
||||
+
|
||||
static int clk_rcg2_get_duty_cycle(struct clk_hw *hw, struct clk_duty *duty)
|
||||
{
|
||||
struct clk_rcg2 *rcg = to_clk_rcg2(hw);
|
||||
@@ -505,6 +658,19 @@ const struct clk_ops clk_rcg2_floor_ops = {
|
||||
};
|
||||
EXPORT_SYMBOL_GPL(clk_rcg2_floor_ops);
|
||||
|
||||
+const struct clk_ops clk_rcg2_fm_ops = {
|
||||
+ .is_enabled = clk_rcg2_is_enabled,
|
||||
+ .get_parent = clk_rcg2_get_parent,
|
||||
+ .set_parent = clk_rcg2_set_parent,
|
||||
+ .recalc_rate = clk_rcg2_recalc_rate,
|
||||
+ .determine_rate = clk_rcg2_fm_determine_rate,
|
||||
+ .set_rate = clk_rcg2_fm_set_rate,
|
||||
+ .set_rate_and_parent = clk_rcg2_fm_set_rate_and_parent,
|
||||
+ .get_duty_cycle = clk_rcg2_get_duty_cycle,
|
||||
+ .set_duty_cycle = clk_rcg2_set_duty_cycle,
|
||||
+};
|
||||
+EXPORT_SYMBOL_GPL(clk_rcg2_fm_ops);
|
||||
+
|
||||
const struct clk_ops clk_rcg2_mux_closest_ops = {
|
||||
.determine_rate = __clk_mux_determine_rate_closest,
|
||||
.get_parent = clk_rcg2_get_parent,
|
||||
diff --git a/drivers/clk/qcom/common.c b/drivers/clk/qcom/common.c
|
||||
index 75f09e6e057e..48f81e3a5e80 100644
|
||||
--- a/drivers/clk/qcom/common.c
|
||||
+++ b/drivers/clk/qcom/common.c
|
||||
@@ -41,6 +41,24 @@ struct freq_tbl *qcom_find_freq(const struct freq_tbl *f, unsigned long rate)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(qcom_find_freq);
|
||||
|
||||
+const struct freq_multi_tbl *qcom_find_freq_multi(const struct freq_multi_tbl *f,
|
||||
+ unsigned long rate)
|
||||
+{
|
||||
+ if (!f)
|
||||
+ return NULL;
|
||||
+
|
||||
+ if (!f->freq)
|
||||
+ return f;
|
||||
+
|
||||
+ for (; f->freq; f++)
|
||||
+ if (rate <= f->freq)
|
||||
+ return f;
|
||||
+
|
||||
+ /* Default to our fastest rate */
|
||||
+ return f - 1;
|
||||
+}
|
||||
+EXPORT_SYMBOL_GPL(qcom_find_freq_multi);
|
||||
+
|
||||
const struct freq_tbl *qcom_find_freq_floor(const struct freq_tbl *f,
|
||||
unsigned long rate)
|
||||
{
|
||||
diff --git a/drivers/clk/qcom/common.h b/drivers/clk/qcom/common.h
|
||||
index 9c8f7b798d9f..2d4a8a837e6c 100644
|
||||
--- a/drivers/clk/qcom/common.h
|
||||
+++ b/drivers/clk/qcom/common.h
|
||||
@@ -45,6 +45,8 @@ extern const struct freq_tbl *qcom_find_freq(const struct freq_tbl *f,
|
||||
unsigned long rate);
|
||||
extern const struct freq_tbl *qcom_find_freq_floor(const struct freq_tbl *f,
|
||||
unsigned long rate);
|
||||
+extern const struct freq_multi_tbl *qcom_find_freq_multi(const struct freq_multi_tbl *f,
|
||||
+ unsigned long rate);
|
||||
extern void
|
||||
qcom_pll_set_fsm_mode(struct regmap *m, u32 reg, u8 bias_count, u8 lock_count);
|
||||
extern int qcom_find_src_index(struct clk_hw *hw, const struct parent_map *map,
|
||||
--
|
||||
2.45.2
|
||||
|
@ -0,0 +1,52 @@
|
||||
From 7311bbfff31c4961c57d94c165fa843f155f8236 Mon Sep 17 00:00:00 2001
|
||||
From: Luo Jie <quic_luoj@quicinc.com>
|
||||
Date: Wed, 5 Jun 2024 20:45:38 +0800
|
||||
Subject: [PATCH] clk: qcom: branch: Add clk_branch2_prepare_ops
|
||||
|
||||
Add the clk_branch2_prepare_ops for supporting clock controller
|
||||
where the hardware register is accessed by MDIO bus, and the
|
||||
spin lock can't be used because of sleep during the MDIO
|
||||
operation.
|
||||
|
||||
The clock is enabled by the .prepare instead of .enable when
|
||||
the clk_branch2_prepare_ops is used.
|
||||
|
||||
Acked-by: Stephen Boyd <sboyd@kernel.org>
|
||||
Signed-off-by: Luo Jie <quic_luoj@quicinc.com>
|
||||
Link: https://lore.kernel.org/r/20240605124541.2711467-2-quic_luoj@quicinc.com
|
||||
Signed-off-by: Bjorn Andersson <andersson@kernel.org>
|
||||
---
|
||||
drivers/clk/qcom/clk-branch.c | 7 +++++++
|
||||
drivers/clk/qcom/clk-branch.h | 1 +
|
||||
2 files changed, 8 insertions(+)
|
||||
|
||||
diff --git a/drivers/clk/qcom/clk-branch.c b/drivers/clk/qcom/clk-branch.c
|
||||
index c1dba33ac31a..229480c5b075 100644
|
||||
--- a/drivers/clk/qcom/clk-branch.c
|
||||
+++ b/drivers/clk/qcom/clk-branch.c
|
||||
@@ -191,3 +191,10 @@ const struct clk_ops clk_branch_simple_ops = {
|
||||
.is_enabled = clk_is_enabled_regmap,
|
||||
};
|
||||
EXPORT_SYMBOL_GPL(clk_branch_simple_ops);
|
||||
+
|
||||
+const struct clk_ops clk_branch2_prepare_ops = {
|
||||
+ .prepare = clk_branch2_enable,
|
||||
+ .unprepare = clk_branch2_disable,
|
||||
+ .is_prepared = clk_is_enabled_regmap,
|
||||
+};
|
||||
+EXPORT_SYMBOL_GPL(clk_branch2_prepare_ops);
|
||||
diff --git a/drivers/clk/qcom/clk-branch.h b/drivers/clk/qcom/clk-branch.h
|
||||
index f1b3b635ff32..292756435f53 100644
|
||||
--- a/drivers/clk/qcom/clk-branch.h
|
||||
+++ b/drivers/clk/qcom/clk-branch.h
|
||||
@@ -109,6 +109,7 @@ extern const struct clk_ops clk_branch2_ops;
|
||||
extern const struct clk_ops clk_branch_simple_ops;
|
||||
extern const struct clk_ops clk_branch2_aon_ops;
|
||||
+extern const struct clk_ops clk_branch2_prepare_ops;
|
||||
|
||||
#define to_clk_branch(_hw) \
|
||||
container_of(to_clk_regmap(_hw), struct clk_branch, clkr)
|
||||
|
||||
--
|
||||
2.45.2
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,141 @@
|
||||
From 777b8afb8179155353ec14b1d8153122410aba29 Mon Sep 17 00:00:00 2001
|
||||
From: Vladimir Oltean <vladimir.oltean@nxp.com>
|
||||
Date: Sat, 15 Jun 2024 20:00:27 +0800
|
||||
Subject: [PATCH] net: phy: introduce core support for phy-mode = "10g-qxgmii"
|
||||
|
||||
10G-QXGMII is a MAC-to-PHY interface defined by the USXGMII multiport
|
||||
specification. It uses the same signaling as USXGMII, but it multiplexes
|
||||
4 ports over the link, resulting in a maximum speed of 2.5G per port.
|
||||
|
||||
Some in-tree SoCs like the NXP LS1028A use "usxgmii" when they mean
|
||||
either the single-port USXGMII or the quad-port 10G-QXGMII variant, and
|
||||
they could get away just fine with that thus far. But there is a need to
|
||||
distinguish between the 2 as far as SerDes drivers are concerned.
|
||||
|
||||
Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
|
||||
Signed-off-by: Luo Jie <quic_luoj@quicinc.com>
|
||||
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
|
||||
Reviewed-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
|
||||
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
|
||||
---
|
||||
Documentation/networking/phy.rst | 6 ++++++
|
||||
drivers/net/phy/phy-core.c | 1 +
|
||||
drivers/net/phy/phylink.c | 9 ++++++++-
|
||||
include/linux/phy.h | 4 ++++
|
||||
include/linux/phylink.h | 1 +
|
||||
5 files changed, 20 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/Documentation/networking/phy.rst b/Documentation/networking/phy.rst
|
||||
index 1283240d7620..f64641417c54 100644
|
||||
--- a/Documentation/networking/phy.rst
|
||||
+++ b/Documentation/networking/phy.rst
|
||||
@@ -327,6 +327,12 @@ Some of the interface modes are described below:
|
||||
This is the Penta SGMII mode, it is similar to QSGMII but it combines 5
|
||||
SGMII lines into a single link compared to 4 on QSGMII.
|
||||
|
||||
+``PHY_INTERFACE_MODE_10G_QXGMII``
|
||||
+ Represents the 10G-QXGMII PHY-MAC interface as defined by the Cisco USXGMII
|
||||
+ Multiport Copper Interface document. It supports 4 ports over a 10.3125 GHz
|
||||
+ SerDes lane, each port having speeds of 2.5G / 1G / 100M / 10M achieved
|
||||
+ through symbol replication. The PCS expects the standard USXGMII code word.
|
||||
+
|
||||
Pause frames / flow control
|
||||
===========================
|
||||
|
||||
diff --git a/drivers/net/phy/phy-core.c b/drivers/net/phy/phy-core.c
|
||||
index 15f349e5995a..a235ea2264a7 100644
|
||||
--- a/drivers/net/phy/phy-core.c
|
||||
+++ b/drivers/net/phy/phy-core.c
|
||||
@@ -141,6 +141,7 @@ int phy_interface_num_ports(phy_interface_t interface)
|
||||
return 1;
|
||||
case PHY_INTERFACE_MODE_QSGMII:
|
||||
case PHY_INTERFACE_MODE_QUSGMII:
|
||||
+ case PHY_INTERFACE_MODE_10G_QXGMII:
|
||||
return 4;
|
||||
case PHY_INTERFACE_MODE_PSGMII:
|
||||
return 5;
|
||||
diff --git a/drivers/net/phy/phylink.c b/drivers/net/phy/phylink.c
|
||||
index 02427378acfd..6c24c48dcf0f 100644
|
||||
--- a/drivers/net/phy/phylink.c
|
||||
+++ b/drivers/net/phy/phylink.c
|
||||
@@ -231,6 +231,7 @@ static int phylink_interface_max_speed(phy_interface_t interface)
|
||||
return SPEED_1000;
|
||||
|
||||
case PHY_INTERFACE_MODE_2500BASEX:
|
||||
+ case PHY_INTERFACE_MODE_10G_QXGMII:
|
||||
return SPEED_2500;
|
||||
|
||||
case PHY_INTERFACE_MODE_5GBASER:
|
||||
@@ -500,7 +501,11 @@ static unsigned long phylink_get_capabilities(phy_interface_t interface,
|
||||
|
||||
switch (interface) {
|
||||
case PHY_INTERFACE_MODE_USXGMII:
|
||||
- caps |= MAC_10000FD | MAC_5000FD | MAC_2500FD;
|
||||
+ caps |= MAC_10000FD | MAC_5000FD;
|
||||
+ fallthrough;
|
||||
+
|
||||
+ case PHY_INTERFACE_MODE_10G_QXGMII:
|
||||
+ caps |= MAC_2500FD;
|
||||
fallthrough;
|
||||
|
||||
case PHY_INTERFACE_MODE_RGMII_TXID:
|
||||
@@ -926,6 +931,7 @@ static int phylink_parse_mode(struct phylink *pl,
|
||||
case PHY_INTERFACE_MODE_5GBASER:
|
||||
case PHY_INTERFACE_MODE_25GBASER:
|
||||
case PHY_INTERFACE_MODE_USXGMII:
|
||||
+ case PHY_INTERFACE_MODE_10G_QXGMII:
|
||||
case PHY_INTERFACE_MODE_10GKR:
|
||||
case PHY_INTERFACE_MODE_10GBASER:
|
||||
case PHY_INTERFACE_MODE_XLGMII:
|
||||
diff --git a/include/linux/phy.h b/include/linux/phy.h
|
||||
index e6e83304558e..205fccfc0f60 100644
|
||||
--- a/include/linux/phy.h
|
||||
+++ b/include/linux/phy.h
|
||||
@@ -128,6 +128,7 @@ extern const int phy_10gbit_features_array[1];
|
||||
* @PHY_INTERFACE_MODE_10GKR: 10GBASE-KR - with Clause 73 AN
|
||||
* @PHY_INTERFACE_MODE_QUSGMII: Quad Universal SGMII
|
||||
* @PHY_INTERFACE_MODE_1000BASEKX: 1000Base-KX - with Clause 73 AN
|
||||
+ * @PHY_INTERFACE_MODE_10G_QXGMII: 10G-QXGMII - 4 ports over 10G USXGMII
|
||||
* @PHY_INTERFACE_MODE_MAX: Book keeping
|
||||
*
|
||||
* Describes the interface between the MAC and PHY.
|
||||
@@ -168,6 +169,7 @@ typedef enum {
|
||||
PHY_INTERFACE_MODE_10GKR,
|
||||
PHY_INTERFACE_MODE_QUSGMII,
|
||||
PHY_INTERFACE_MODE_1000BASEKX,
|
||||
+ PHY_INTERFACE_MODE_10G_QXGMII,
|
||||
PHY_INTERFACE_MODE_MAX,
|
||||
} phy_interface_t;
|
||||
|
||||
@@ -289,6 +291,8 @@ static inline const char *phy_modes(phy_interface_t interface)
|
||||
return "100base-x";
|
||||
case PHY_INTERFACE_MODE_QUSGMII:
|
||||
return "qusgmii";
|
||||
+ case PHY_INTERFACE_MODE_10G_QXGMII:
|
||||
+ return "10g-qxgmii";
|
||||
default:
|
||||
return "unknown";
|
||||
}
|
||||
diff --git a/include/linux/phylink.h b/include/linux/phylink.h
|
||||
index a30a692acc32..2381e07429a2 100644
|
||||
--- a/include/linux/phylink.h
|
||||
+++ b/include/linux/phylink.h
|
||||
@@ -124,6 +130,7 @@ static unsigned int phylink_pcs_neg_mode(unsigned int mode,
|
||||
case PHY_INTERFACE_MODE_QSGMII:
|
||||
case PHY_INTERFACE_MODE_QUSGMII:
|
||||
case PHY_INTERFACE_MODE_USXGMII:
|
||||
+ case PHY_INTERFACE_MODE_10G_QXGMII:
|
||||
/* These protocols are designed for use with a PHY which
|
||||
* communicates its negotiation result back to the MAC via
|
||||
* inband communication. Note: there exist PHYs that run
|
||||
@@ -654,6 +654,7 @@ static inline int phylink_get_link_timer_ns(phy_interface_t interface)
|
||||
case PHY_INTERFACE_MODE_SGMII:
|
||||
case PHY_INTERFACE_MODE_QSGMII:
|
||||
case PHY_INTERFACE_MODE_USXGMII:
|
||||
+ case PHY_INTERFACE_MODE_10G_QXGMII:
|
||||
return 1600000;
|
||||
|
||||
case PHY_INTERFACE_MODE_1000BASEX:
|
||||
--
|
||||
2.45.2
|
||||
|
@ -0,0 +1,114 @@
|
||||
From 265b07df758a998f60cf5b5aec6bd72ca676655e Mon Sep 17 00:00:00 2001
|
||||
From: Shradha Todi <shradha.t@samsung.com>
|
||||
Date: Tue, 20 Feb 2024 14:10:45 +0530
|
||||
Subject: [PATCH] clk: Provide managed helper to get and enable bulk clocks
|
||||
|
||||
Provide a managed devm_clk_bulk* wrapper to get and enable all
|
||||
bulk clocks in order to simplify drivers that keeps all clocks
|
||||
enabled for the time of driver operation.
|
||||
|
||||
Suggested-by: Marek Szyprowski <m.szyprowski@samsung.com>
|
||||
Reviewed-by: Alim Akhtar <alim.akhtar@samsung.com>
|
||||
Reviewed-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
|
||||
Signed-off-by: Shradha Todi <shradha.t@samsung.com>
|
||||
Link: https://lore.kernel.org/r/20240220084046.23786-2-shradha.t@samsung.com
|
||||
Signed-off-by: Stephen Boyd <sboyd@kernel.org>
|
||||
---
|
||||
drivers/clk/clk-devres.c | 40 ++++++++++++++++++++++++++++++++++++++++
|
||||
include/linux/clk.h | 22 ++++++++++++++++++++++
|
||||
2 files changed, 62 insertions(+)
|
||||
|
||||
diff --git a/drivers/clk/clk-devres.c b/drivers/clk/clk-devres.c
|
||||
index 737aa70e2cb3..90e6078fb6e1 100644
|
||||
--- a/drivers/clk/clk-devres.c
|
||||
+++ b/drivers/clk/clk-devres.c
|
||||
@@ -182,6 +182,46 @@ int __must_check devm_clk_bulk_get_all(struct device *dev,
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(devm_clk_bulk_get_all);
|
||||
|
||||
+static void devm_clk_bulk_release_all_enable(struct device *dev, void *res)
|
||||
+{
|
||||
+ struct clk_bulk_devres *devres = res;
|
||||
+
|
||||
+ clk_bulk_disable_unprepare(devres->num_clks, devres->clks);
|
||||
+ clk_bulk_put_all(devres->num_clks, devres->clks);
|
||||
+}
|
||||
+
|
||||
+int __must_check devm_clk_bulk_get_all_enable(struct device *dev,
|
||||
+ struct clk_bulk_data **clks)
|
||||
+{
|
||||
+ struct clk_bulk_devres *devres;
|
||||
+ int ret;
|
||||
+
|
||||
+ devres = devres_alloc(devm_clk_bulk_release_all_enable,
|
||||
+ sizeof(*devres), GFP_KERNEL);
|
||||
+ if (!devres)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ ret = clk_bulk_get_all(dev, &devres->clks);
|
||||
+ if (ret > 0) {
|
||||
+ *clks = devres->clks;
|
||||
+ devres->num_clks = ret;
|
||||
+ } else {
|
||||
+ devres_free(devres);
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ ret = clk_bulk_prepare_enable(devres->num_clks, *clks);
|
||||
+ if (!ret) {
|
||||
+ devres_add(dev, devres);
|
||||
+ } else {
|
||||
+ clk_bulk_put_all(devres->num_clks, devres->clks);
|
||||
+ devres_free(devres);
|
||||
+ }
|
||||
+
|
||||
+ return ret;
|
||||
+}
|
||||
+EXPORT_SYMBOL_GPL(devm_clk_bulk_get_all_enable);
|
||||
+
|
||||
static int devm_clk_match(struct device *dev, void *res, void *data)
|
||||
{
|
||||
struct clk **c = res;
|
||||
diff --git a/include/linux/clk.h b/include/linux/clk.h
|
||||
index 06f1b292f8a0..0f44d3863de2 100644
|
||||
--- a/include/linux/clk.h
|
||||
+++ b/include/linux/clk.h
|
||||
@@ -478,6 +478,22 @@ int __must_check devm_clk_bulk_get_optional(struct device *dev, int num_clks,
|
||||
int __must_check devm_clk_bulk_get_all(struct device *dev,
|
||||
struct clk_bulk_data **clks);
|
||||
|
||||
+/**
|
||||
+ * devm_clk_bulk_get_all_enable - Get and enable all clocks of the consumer (managed)
|
||||
+ * @dev: device for clock "consumer"
|
||||
+ * @clks: pointer to the clk_bulk_data table of consumer
|
||||
+ *
|
||||
+ * Returns success (0) or negative errno.
|
||||
+ *
|
||||
+ * This helper function allows drivers to get all clocks of the
|
||||
+ * consumer and enables them in one operation with management.
|
||||
+ * The clks will automatically be disabled and freed when the device
|
||||
+ * is unbound.
|
||||
+ */
|
||||
+
|
||||
+int __must_check devm_clk_bulk_get_all_enable(struct device *dev,
|
||||
+ struct clk_bulk_data **clks);
|
||||
+
|
||||
/**
|
||||
* devm_clk_get - lookup and obtain a managed reference to a clock producer.
|
||||
* @dev: device for clock "consumer"
|
||||
@@ -968,6 +984,12 @@ static inline int __must_check devm_clk_bulk_get_all(struct device *dev,
|
||||
return 0;
|
||||
}
|
||||
|
||||
+static inline int __must_check devm_clk_bulk_get_all_enable(struct device *dev,
|
||||
+ struct clk_bulk_data **clks)
|
||||
+{
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
static inline struct clk *devm_get_clk_from_child(struct device *dev,
|
||||
struct device_node *np, const char *con_id)
|
||||
{
|
||||
--
|
||||
2.45.2
|
||||
|
@ -0,0 +1,125 @@
|
||||
From 51e32e897539663957f7a0950f66b48f8896efee Mon Sep 17 00:00:00 2001
|
||||
From: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
|
||||
Date: Sat, 19 Oct 2024 14:16:00 +0300
|
||||
Subject: [PATCH] clk: Provide devm_clk_bulk_get_all_enabled() helper
|
||||
|
||||
Commit 265b07df758a ("clk: Provide managed helper to get and enable bulk
|
||||
clocks") added devm_clk_bulk_get_all_enable() function, but missed to
|
||||
return the number of clocks stored in the clk_bulk_data table referenced
|
||||
by the clks argument. Without knowing the number, it's not possible to
|
||||
iterate these clocks when needed, hence the argument is useless and
|
||||
could have been simply removed.
|
||||
|
||||
Introduce devm_clk_bulk_get_all_enabled() variant, which is consistent
|
||||
with devm_clk_bulk_get_all() in terms of the returned value:
|
||||
|
||||
> 0 if one or more clocks have been stored
|
||||
= 0 if there are no clocks
|
||||
< 0 if an error occurred
|
||||
|
||||
Moreover, the naming is consistent with devm_clk_get_enabled(), i.e. use
|
||||
the past form of 'enable'.
|
||||
|
||||
To reduce code duplication and improve patch readability, make
|
||||
devm_clk_bulk_get_all_enable() use the new helper, as suggested by
|
||||
Stephen Boyd.
|
||||
|
||||
Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
|
||||
Reviewed-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
|
||||
Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
|
||||
Link: https://lore.kernel.org/r/20241019-clk_bulk_ena_fix-v4-1-57f108f64e70@collabora.com
|
||||
Signed-off-by: Stephen Boyd <sboyd@kernel.org>
|
||||
---
|
||||
drivers/clk/clk-devres.c | 9 +++++----
|
||||
include/linux/clk.h | 21 ++++++++++++++++-----
|
||||
2 files changed, 21 insertions(+), 9 deletions(-)
|
||||
|
||||
diff --git a/drivers/clk/clk-devres.c b/drivers/clk/clk-devres.c
|
||||
index 82ae1f26e634..5368d92d9b39 100644
|
||||
--- a/drivers/clk/clk-devres.c
|
||||
+++ b/drivers/clk/clk-devres.c
|
||||
@@ -218,8 +218,8 @@ static void devm_clk_bulk_release_all_enable(struct device *dev, void *res)
|
||||
clk_bulk_put_all(devres->num_clks, devres->clks);
|
||||
}
|
||||
|
||||
-int __must_check devm_clk_bulk_get_all_enable(struct device *dev,
|
||||
- struct clk_bulk_data **clks)
|
||||
+int __must_check devm_clk_bulk_get_all_enabled(struct device *dev,
|
||||
+ struct clk_bulk_data **clks)
|
||||
{
|
||||
struct clk_bulk_devres *devres;
|
||||
int ret;
|
||||
@@ -244,11 +244,12 @@ int __must_check devm_clk_bulk_get_all_enable(struct device *dev,
|
||||
} else {
|
||||
clk_bulk_put_all(devres->num_clks, devres->clks);
|
||||
devres_free(devres);
|
||||
+ return ret;
|
||||
}
|
||||
|
||||
- return ret;
|
||||
+ return devres->num_clks;
|
||||
}
|
||||
-EXPORT_SYMBOL_GPL(devm_clk_bulk_get_all_enable);
|
||||
+EXPORT_SYMBOL_GPL(devm_clk_bulk_get_all_enabled);
|
||||
|
||||
static int devm_clk_match(struct device *dev, void *res, void *data)
|
||||
{
|
||||
diff --git a/include/linux/clk.h b/include/linux/clk.h
|
||||
index 851a0f2cf42c..1dcee6d701e4 100644
|
||||
--- a/include/linux/clk.h
|
||||
+++ b/include/linux/clk.h
|
||||
@@ -496,11 +496,13 @@ int __must_check devm_clk_bulk_get_all(struct device *dev,
|
||||
struct clk_bulk_data **clks);
|
||||
|
||||
/**
|
||||
- * devm_clk_bulk_get_all_enable - Get and enable all clocks of the consumer (managed)
|
||||
+ * devm_clk_bulk_get_all_enabled - Get and enable all clocks of the consumer (managed)
|
||||
* @dev: device for clock "consumer"
|
||||
* @clks: pointer to the clk_bulk_data table of consumer
|
||||
*
|
||||
- * Returns success (0) or negative errno.
|
||||
+ * Returns a positive value for the number of clocks obtained while the
|
||||
+ * clock references are stored in the clk_bulk_data table in @clks field.
|
||||
+ * Returns 0 if there're none and a negative value if something failed.
|
||||
*
|
||||
* This helper function allows drivers to get all clocks of the
|
||||
* consumer and enables them in one operation with management.
|
||||
@@ -508,8 +510,8 @@ int __must_check devm_clk_bulk_get_all(struct device *dev,
|
||||
* is unbound.
|
||||
*/
|
||||
|
||||
-int __must_check devm_clk_bulk_get_all_enable(struct device *dev,
|
||||
- struct clk_bulk_data **clks);
|
||||
+int __must_check devm_clk_bulk_get_all_enabled(struct device *dev,
|
||||
+ struct clk_bulk_data **clks);
|
||||
|
||||
/**
|
||||
* devm_clk_get - lookup and obtain a managed reference to a clock producer.
|
||||
@@ -1034,7 +1036,7 @@ static inline int __must_check devm_clk_bulk_get_all(struct device *dev,
|
||||
return 0;
|
||||
}
|
||||
|
||||
-static inline int __must_check devm_clk_bulk_get_all_enable(struct device *dev,
|
||||
+static inline int __must_check devm_clk_bulk_get_all_enabled(struct device *dev,
|
||||
struct clk_bulk_data **clks)
|
||||
{
|
||||
return 0;
|
||||
@@ -1136,6 +1138,15 @@ static inline void clk_restore_context(void) {}
|
||||
|
||||
#endif
|
||||
|
||||
+/* Deprecated. Use devm_clk_bulk_get_all_enabled() */
|
||||
+static inline int __must_check
|
||||
+devm_clk_bulk_get_all_enable(struct device *dev, struct clk_bulk_data **clks)
|
||||
+{
|
||||
+ int ret = devm_clk_bulk_get_all_enabled(dev, clks);
|
||||
+
|
||||
+ return ret > 0 ? 0 : ret;
|
||||
+}
|
||||
+
|
||||
/* clk_prepare_enable helps cases using clk_enable in non-atomic context. */
|
||||
static inline int clk_prepare_enable(struct clk *clk)
|
||||
{
|
||||
--
|
||||
2.45.2
|
||||
|
@ -0,0 +1,31 @@
|
||||
From 475beea0b9f631656b5cc39429a39696876af613 Mon Sep 17 00:00:00 2001
|
||||
From: Alexandru Gagniuc <mr.nuke.me@gmail.com>
|
||||
Date: Tue, 30 Apr 2024 23:07:43 -0500
|
||||
Subject: [PATCH] dt-bindings: clock: Add PCIe pipe related clocks for IPQ9574
|
||||
|
||||
Add defines for the missing PCIe PIPE clocks.
|
||||
|
||||
Signed-off-by: Alexandru Gagniuc <mr.nuke.me@gmail.com>
|
||||
Acked-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
|
||||
Link: https://lore.kernel.org/r/20240501040800.1542805-2-mr.nuke.me@gmail.com
|
||||
Signed-off-by: Bjorn Andersson <andersson@kernel.org>
|
||||
---
|
||||
include/dt-bindings/clock/qcom,ipq9574-gcc.h | 4 ++++
|
||||
1 file changed, 4 insertions(+)
|
||||
|
||||
diff --git a/include/dt-bindings/clock/qcom,ipq9574-gcc.h b/include/dt-bindings/clock/qcom,ipq9574-gcc.h
|
||||
index 08fd3a37acaa..52123c5a09fa 100644
|
||||
--- a/include/dt-bindings/clock/qcom,ipq9574-gcc.h
|
||||
+++ b/include/dt-bindings/clock/qcom,ipq9574-gcc.h
|
||||
@@ -216,4 +216,8 @@
|
||||
#define GCC_CRYPTO_AHB_CLK 207
|
||||
#define GCC_USB0_PIPE_CLK 208
|
||||
#define GCC_USB0_SLEEP_CLK 209
|
||||
+#define GCC_PCIE0_PIPE_CLK 210
|
||||
+#define GCC_PCIE1_PIPE_CLK 211
|
||||
+#define GCC_PCIE2_PIPE_CLK 212
|
||||
+#define GCC_PCIE3_PIPE_CLK 213
|
||||
#endif
|
||||
--
|
||||
2.45.2
|
||||
|
@ -0,0 +1,134 @@
|
||||
From a8fe85d40ffe5ec0fd2f557932ffee902be35b38 Mon Sep 17 00:00:00 2001
|
||||
From: Alexandru Gagniuc <mr.nuke.me@gmail.com>
|
||||
Date: Tue, 30 Apr 2024 23:07:44 -0500
|
||||
Subject: [PATCH] clk: qcom: gcc-ipq9574: Add PCIe pipe clocks
|
||||
|
||||
The IPQ9574 has four PCIe "pipe" clocks. These clocks are required by
|
||||
PCIe PHYs. Port the pipe clocks from the downstream 5.4 kernel.
|
||||
|
||||
Signed-off-by: Alexandru Gagniuc <mr.nuke.me@gmail.com>
|
||||
Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
|
||||
Link: https://lore.kernel.org/r/20240501040800.1542805-3-mr.nuke.me@gmail.com
|
||||
Signed-off-by: Bjorn Andersson <andersson@kernel.org>
|
||||
---
|
||||
drivers/clk/qcom/gcc-ipq9574.c | 76 ++++++++++++++++++++++++++++++++++
|
||||
1 file changed, 76 insertions(+)
|
||||
|
||||
diff --git a/drivers/clk/qcom/gcc-ipq9574.c b/drivers/clk/qcom/gcc-ipq9574.c
|
||||
index 0a3f846695b8..bc3e17f34295 100644
|
||||
--- a/drivers/clk/qcom/gcc-ipq9574.c
|
||||
+++ b/drivers/clk/qcom/gcc-ipq9574.c
|
||||
@@ -1569,6 +1569,24 @@ static struct clk_regmap_phy_mux pcie0_pipe_clk_src = {
|
||||
},
|
||||
};
|
||||
|
||||
+static struct clk_branch gcc_pcie0_pipe_clk = {
|
||||
+ .halt_reg = 0x28044,
|
||||
+ .halt_check = BRANCH_HALT_DELAY,
|
||||
+ .clkr = {
|
||||
+ .enable_reg = 0x28044,
|
||||
+ .enable_mask = BIT(0),
|
||||
+ .hw.init = &(const struct clk_init_data) {
|
||||
+ .name = "gcc_pcie0_pipe_clk",
|
||||
+ .parent_hws = (const struct clk_hw *[]) {
|
||||
+ &pcie0_pipe_clk_src.clkr.hw
|
||||
+ },
|
||||
+ .num_parents = 1,
|
||||
+ .flags = CLK_SET_RATE_PARENT,
|
||||
+ .ops = &clk_branch2_ops,
|
||||
+ },
|
||||
+ },
|
||||
+};
|
||||
+
|
||||
static struct clk_regmap_phy_mux pcie1_pipe_clk_src = {
|
||||
.reg = 0x29064,
|
||||
.clkr = {
|
||||
@@ -1583,6 +1601,24 @@ static struct clk_regmap_phy_mux pcie1_pipe_clk_src = {
|
||||
},
|
||||
};
|
||||
|
||||
+static struct clk_branch gcc_pcie1_pipe_clk = {
|
||||
+ .halt_reg = 0x29044,
|
||||
+ .halt_check = BRANCH_HALT_DELAY,
|
||||
+ .clkr = {
|
||||
+ .enable_reg = 0x29044,
|
||||
+ .enable_mask = BIT(0),
|
||||
+ .hw.init = &(const struct clk_init_data) {
|
||||
+ .name = "gcc_pcie1_pipe_clk",
|
||||
+ .parent_hws = (const struct clk_hw *[]) {
|
||||
+ &pcie1_pipe_clk_src.clkr.hw
|
||||
+ },
|
||||
+ .num_parents = 1,
|
||||
+ .flags = CLK_SET_RATE_PARENT,
|
||||
+ .ops = &clk_branch2_ops,
|
||||
+ },
|
||||
+ },
|
||||
+};
|
||||
+
|
||||
static struct clk_regmap_phy_mux pcie2_pipe_clk_src = {
|
||||
.reg = 0x2a064,
|
||||
.clkr = {
|
||||
@@ -1597,6 +1633,24 @@ static struct clk_regmap_phy_mux pcie2_pipe_clk_src = {
|
||||
},
|
||||
};
|
||||
|
||||
+static struct clk_branch gcc_pcie2_pipe_clk = {
|
||||
+ .halt_reg = 0x2a044,
|
||||
+ .halt_check = BRANCH_HALT_DELAY,
|
||||
+ .clkr = {
|
||||
+ .enable_reg = 0x2a044,
|
||||
+ .enable_mask = BIT(0),
|
||||
+ .hw.init = &(const struct clk_init_data) {
|
||||
+ .name = "gcc_pcie2_pipe_clk",
|
||||
+ .parent_hws = (const struct clk_hw *[]) {
|
||||
+ &pcie2_pipe_clk_src.clkr.hw
|
||||
+ },
|
||||
+ .num_parents = 1,
|
||||
+ .flags = CLK_SET_RATE_PARENT,
|
||||
+ .ops = &clk_branch2_ops,
|
||||
+ },
|
||||
+ },
|
||||
+};
|
||||
+
|
||||
static struct clk_regmap_phy_mux pcie3_pipe_clk_src = {
|
||||
.reg = 0x2b064,
|
||||
.clkr = {
|
||||
@@ -1611,6 +1665,24 @@ static struct clk_regmap_phy_mux pcie3_pipe_clk_src = {
|
||||
},
|
||||
};
|
||||
|
||||
+static struct clk_branch gcc_pcie3_pipe_clk = {
|
||||
+ .halt_reg = 0x2b044,
|
||||
+ .halt_check = BRANCH_HALT_DELAY,
|
||||
+ .clkr = {
|
||||
+ .enable_reg = 0x2b044,
|
||||
+ .enable_mask = BIT(0),
|
||||
+ .hw.init = &(const struct clk_init_data) {
|
||||
+ .name = "gcc_pcie3_pipe_clk",
|
||||
+ .parent_hws = (const struct clk_hw *[]) {
|
||||
+ &pcie3_pipe_clk_src.clkr.hw
|
||||
+ },
|
||||
+ .num_parents = 1,
|
||||
+ .flags = CLK_SET_RATE_PARENT,
|
||||
+ .ops = &clk_branch2_ops,
|
||||
+ },
|
||||
+ },
|
||||
+};
|
||||
+
|
||||
static const struct freq_tbl ftbl_pcie_rchng_clk_src[] = {
|
||||
F(24000000, P_XO, 1, 0, 0),
|
||||
F(100000000, P_GPLL0, 8, 0, 0),
|
||||
@@ -4141,6 +4213,10 @@ static struct clk_regmap *gcc_ipq9574_clks[] = {
|
||||
[GCC_SNOC_PCIE1_1LANE_S_CLK] = &gcc_snoc_pcie1_1lane_s_clk.clkr,
|
||||
[GCC_SNOC_PCIE2_2LANE_S_CLK] = &gcc_snoc_pcie2_2lane_s_clk.clkr,
|
||||
[GCC_SNOC_PCIE3_2LANE_S_CLK] = &gcc_snoc_pcie3_2lane_s_clk.clkr,
|
||||
+ [GCC_PCIE0_PIPE_CLK] = &gcc_pcie0_pipe_clk.clkr,
|
||||
+ [GCC_PCIE1_PIPE_CLK] = &gcc_pcie1_pipe_clk.clkr,
|
||||
+ [GCC_PCIE2_PIPE_CLK] = &gcc_pcie2_pipe_clk.clkr,
|
||||
+ [GCC_PCIE3_PIPE_CLK] = &gcc_pcie3_pipe_clk.clkr,
|
||||
};
|
||||
|
||||
static const struct qcom_reset_map gcc_ipq9574_resets[] = {
|
||||
--
|
||||
2.45.2
|
||||
|
@ -0,0 +1,32 @@
|
||||
From ef3308cf52553522d619a858a72a68f82432865b Mon Sep 17 00:00:00 2001
|
||||
From: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
|
||||
Date: Wed, 29 May 2024 17:47:10 +0300
|
||||
Subject: [PATCH] arm64: dts: qcom: ipq9574: drop #power-domain-cells property
|
||||
of GCC
|
||||
|
||||
On IPQ9574 the Global Clock Controller (GCC) doesn't provide power
|
||||
domains. Drop the #power-domain-cells property from the controller
|
||||
device node.
|
||||
|
||||
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
|
||||
Link: https://lore.kernel.org/r/20240529-qcom-gdscs-v2-12-69c63d0ae1e7@linaro.org
|
||||
Signed-off-by: Bjorn Andersson <andersson@kernel.org>
|
||||
---
|
||||
arch/arm64/boot/dts/qcom/ipq9574.dtsi | 1 -
|
||||
1 file changed, 1 deletion(-)
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/qcom/ipq9574.dtsi b/arch/arm64/boot/dts/qcom/ipq9574.dtsi
|
||||
index ded02bc39275..d21937b09b4b 100644
|
||||
--- a/arch/arm64/boot/dts/qcom/ipq9574.dtsi
|
||||
+++ b/arch/arm64/boot/dts/qcom/ipq9574.dtsi
|
||||
@@ -315,7 +315,6 @@ gcc: clock-controller@1800000 {
|
||||
<0>;
|
||||
#clock-cells = <1>;
|
||||
#reset-cells = <1>;
|
||||
- #power-domain-cells = <1>;
|
||||
};
|
||||
|
||||
tcsr_mutex: hwlock@1905000 {
|
||||
--
|
||||
2.45.2
|
||||
|
@ -0,0 +1,85 @@
|
||||
From f45b94ffc5f1204b35b5c695ed265b1385951616 Mon Sep 17 00:00:00 2001
|
||||
From: Varadarajan Narayanan <quic_varada@quicinc.com>
|
||||
Date: Tue, 30 Apr 2024 12:12:09 +0530
|
||||
Subject: [PATCH] interconnect: icc-clk: Specify master/slave ids
|
||||
|
||||
Presently, icc-clk driver autogenerates the master and slave ids.
|
||||
However, devices with multiple nodes on the interconnect could
|
||||
have other constraints and may not match with the auto generated
|
||||
node ids.
|
||||
|
||||
Hence, modify the driver to use the master/slave ids provided by
|
||||
the caller instead of auto generating.
|
||||
|
||||
Also, update clk-cbf-8996 accordingly.
|
||||
|
||||
Acked-by: Georgi Djakov <djakov@kernel.org>
|
||||
Signed-off-by: Varadarajan Narayanan <quic_varada@quicinc.com>
|
||||
Link: https://lore.kernel.org/r/20240430064214.2030013-2-quic_varada@quicinc.com
|
||||
Signed-off-by: Bjorn Andersson <andersson@kernel.org>
|
||||
---
|
||||
drivers/clk/qcom/clk-cbf-8996.c | 7 ++++++-
|
||||
drivers/interconnect/icc-clk.c | 6 +++---
|
||||
include/linux/interconnect-clk.h | 2 ++
|
||||
3 files changed, 11 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/drivers/clk/qcom/clk-cbf-8996.c b/drivers/clk/qcom/clk-cbf-8996.c
|
||||
index 76bf523431b8..f5fd1ff9c6c9 100644
|
||||
--- a/drivers/clk/qcom/clk-cbf-8996.c
|
||||
+++ b/drivers/clk/qcom/clk-cbf-8996.c
|
||||
@@ -226,7 +226,12 @@ static int qcom_msm8996_cbf_icc_register(struct platform_device *pdev, struct cl
|
||||
struct device *dev = &pdev->dev;
|
||||
struct clk *clk = devm_clk_hw_get_clk(dev, cbf_hw, "cbf");
|
||||
const struct icc_clk_data data[] = {
|
||||
- { .clk = clk, .name = "cbf", },
|
||||
+ {
|
||||
+ .clk = clk,
|
||||
+ .name = "cbf",
|
||||
+ .master_id = MASTER_CBF_M4M,
|
||||
+ .slave_id = SLAVE_CBF_M4M,
|
||||
+ },
|
||||
};
|
||||
struct icc_provider *provider;
|
||||
|
||||
diff --git a/drivers/interconnect/icc-clk.c b/drivers/interconnect/icc-clk.c
|
||||
index d787f2ea36d9..2be193fd7d8f 100644
|
||||
--- a/drivers/interconnect/icc-clk.c
|
||||
+++ b/drivers/interconnect/icc-clk.c
|
||||
@@ -108,7 +108,7 @@ struct icc_provider *icc_clk_register(struct device *dev,
|
||||
for (i = 0, j = 0; i < num_clocks; i++) {
|
||||
qp->clocks[i].clk = data[i].clk;
|
||||
|
||||
- node = icc_node_create(first_id + j);
|
||||
+ node = icc_node_create(first_id + data[i].master_id);
|
||||
if (IS_ERR(node)) {
|
||||
ret = PTR_ERR(node);
|
||||
goto err;
|
||||
@@ -118,10 +118,10 @@ struct icc_provider *icc_clk_register(struct device *dev,
|
||||
node->data = &qp->clocks[i];
|
||||
icc_node_add(node, provider);
|
||||
/* link to the next node, slave */
|
||||
- icc_link_create(node, first_id + j + 1);
|
||||
+ icc_link_create(node, first_id + data[i].slave_id);
|
||||
onecell->nodes[j++] = node;
|
||||
|
||||
- node = icc_node_create(first_id + j);
|
||||
+ node = icc_node_create(first_id + data[i].slave_id);
|
||||
if (IS_ERR(node)) {
|
||||
ret = PTR_ERR(node);
|
||||
goto err;
|
||||
diff --git a/include/linux/interconnect-clk.h b/include/linux/interconnect-clk.h
|
||||
index 0cd80112bea5..170898faaacb 100644
|
||||
--- a/include/linux/interconnect-clk.h
|
||||
+++ b/include/linux/interconnect-clk.h
|
||||
@@ -11,6 +11,8 @@ struct device;
|
||||
struct icc_clk_data {
|
||||
struct clk *clk;
|
||||
const char *name;
|
||||
+ unsigned int master_id;
|
||||
+ unsigned int slave_id;
|
||||
};
|
||||
|
||||
struct icc_provider *icc_clk_register(struct device *dev,
|
||||
--
|
||||
2.45.2
|
||||
|
@ -0,0 +1,106 @@
|
||||
From d1f1570f3d6db5d35642092a671812e62bfba79d Mon Sep 17 00:00:00 2001
|
||||
From: Varadarajan Narayanan <quic_varada@quicinc.com>
|
||||
Date: Tue, 30 Apr 2024 12:12:10 +0530
|
||||
Subject: [PATCH] dt-bindings: interconnect: Add Qualcomm IPQ9574 support
|
||||
|
||||
Add interconnect-cells to clock provider so that it can be
|
||||
used as icc provider.
|
||||
|
||||
Add master/slave ids for Qualcomm IPQ9574 Network-On-Chip
|
||||
interfaces. This will be used by the gcc-ipq9574 driver
|
||||
that will for providing interconnect services using the
|
||||
icc-clk framework.
|
||||
|
||||
Acked-by: Georgi Djakov <djakov@kernel.org>
|
||||
Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
|
||||
Signed-off-by: Varadarajan Narayanan <quic_varada@quicinc.com>
|
||||
Link: https://lore.kernel.org/r/20240430064214.2030013-3-quic_varada@quicinc.com
|
||||
Signed-off-by: Bjorn Andersson <andersson@kernel.org>
|
||||
---
|
||||
.../bindings/clock/qcom,ipq9574-gcc.yaml | 3 +
|
||||
.../dt-bindings/interconnect/qcom,ipq9574.h | 59 +++++++++++++++++++
|
||||
2 files changed, 62 insertions(+)
|
||||
create mode 100644 include/dt-bindings/interconnect/qcom,ipq9574.h
|
||||
|
||||
diff --git a/Documentation/devicetree/bindings/clock/qcom,ipq9574-gcc.yaml b/Documentation/devicetree/bindings/clock/qcom,ipq9574-gcc.yaml
|
||||
index 944a0ea79cd6..824781cbdf34 100644
|
||||
--- a/Documentation/devicetree/bindings/clock/qcom,ipq9574-gcc.yaml
|
||||
+++ b/Documentation/devicetree/bindings/clock/qcom,ipq9574-gcc.yaml
|
||||
@@ -33,6 +33,9 @@ properties:
|
||||
- description: PCIE30 PHY3 pipe clock source
|
||||
- description: USB3 PHY pipe clock source
|
||||
|
||||
+ '#interconnect-cells':
|
||||
+ const: 1
|
||||
+
|
||||
required:
|
||||
- compatible
|
||||
- clocks
|
||||
diff --git a/include/dt-bindings/interconnect/qcom,ipq9574.h b/include/dt-bindings/interconnect/qcom,ipq9574.h
|
||||
new file mode 100644
|
||||
index 000000000000..42019335c7dd
|
||||
--- /dev/null
|
||||
+++ b/include/dt-bindings/interconnect/qcom,ipq9574.h
|
||||
@@ -0,0 +1,59 @@
|
||||
+/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
|
||||
+#ifndef INTERCONNECT_QCOM_IPQ9574_H
|
||||
+#define INTERCONNECT_QCOM_IPQ9574_H
|
||||
+
|
||||
+#define MASTER_ANOC_PCIE0 0
|
||||
+#define SLAVE_ANOC_PCIE0 1
|
||||
+#define MASTER_SNOC_PCIE0 2
|
||||
+#define SLAVE_SNOC_PCIE0 3
|
||||
+#define MASTER_ANOC_PCIE1 4
|
||||
+#define SLAVE_ANOC_PCIE1 5
|
||||
+#define MASTER_SNOC_PCIE1 6
|
||||
+#define SLAVE_SNOC_PCIE1 7
|
||||
+#define MASTER_ANOC_PCIE2 8
|
||||
+#define SLAVE_ANOC_PCIE2 9
|
||||
+#define MASTER_SNOC_PCIE2 10
|
||||
+#define SLAVE_SNOC_PCIE2 11
|
||||
+#define MASTER_ANOC_PCIE3 12
|
||||
+#define SLAVE_ANOC_PCIE3 13
|
||||
+#define MASTER_SNOC_PCIE3 14
|
||||
+#define SLAVE_SNOC_PCIE3 15
|
||||
+#define MASTER_USB 16
|
||||
+#define SLAVE_USB 17
|
||||
+#define MASTER_USB_AXI 18
|
||||
+#define SLAVE_USB_AXI 19
|
||||
+#define MASTER_NSSNOC_NSSCC 20
|
||||
+#define SLAVE_NSSNOC_NSSCC 21
|
||||
+#define MASTER_NSSNOC_SNOC_0 22
|
||||
+#define SLAVE_NSSNOC_SNOC_0 23
|
||||
+#define MASTER_NSSNOC_SNOC_1 24
|
||||
+#define SLAVE_NSSNOC_SNOC_1 25
|
||||
+#define MASTER_NSSNOC_PCNOC_1 26
|
||||
+#define SLAVE_NSSNOC_PCNOC_1 27
|
||||
+#define MASTER_NSSNOC_QOSGEN_REF 28
|
||||
+#define SLAVE_NSSNOC_QOSGEN_REF 29
|
||||
+#define MASTER_NSSNOC_TIMEOUT_REF 30
|
||||
+#define SLAVE_NSSNOC_TIMEOUT_REF 31
|
||||
+#define MASTER_NSSNOC_XO_DCD 32
|
||||
+#define SLAVE_NSSNOC_XO_DCD 33
|
||||
+#define MASTER_NSSNOC_ATB 34
|
||||
+#define SLAVE_NSSNOC_ATB 35
|
||||
+#define MASTER_MEM_NOC_NSSNOC 36
|
||||
+#define SLAVE_MEM_NOC_NSSNOC 37
|
||||
+#define MASTER_NSSNOC_MEMNOC 38
|
||||
+#define SLAVE_NSSNOC_MEMNOC 39
|
||||
+#define MASTER_NSSNOC_MEM_NOC_1 40
|
||||
+#define SLAVE_NSSNOC_MEM_NOC_1 41
|
||||
+
|
||||
+#define MASTER_NSSNOC_PPE 0
|
||||
+#define SLAVE_NSSNOC_PPE 1
|
||||
+#define MASTER_NSSNOC_PPE_CFG 2
|
||||
+#define SLAVE_NSSNOC_PPE_CFG 3
|
||||
+#define MASTER_NSSNOC_NSS_CSR 4
|
||||
+#define SLAVE_NSSNOC_NSS_CSR 5
|
||||
+#define MASTER_NSSNOC_IMEM_QSB 6
|
||||
+#define SLAVE_NSSNOC_IMEM_QSB 7
|
||||
+#define MASTER_NSSNOC_IMEM_AHB 8
|
||||
+#define SLAVE_NSSNOC_IMEM_AHB 9
|
||||
+
|
||||
+#endif /* INTERCONNECT_QCOM_IPQ9574_H */
|
||||
--
|
||||
2.45.2
|
||||
|
@ -0,0 +1,63 @@
|
||||
From d3153113619216e87038a20bebf82582f9be10e7 Mon Sep 17 00:00:00 2001
|
||||
From: Varadarajan Narayanan <quic_varada@quicinc.com>
|
||||
Date: Tue, 30 Apr 2024 12:12:11 +0530
|
||||
Subject: [PATCH] interconnect: icc-clk: Add devm_icc_clk_register
|
||||
|
||||
Wrap icc_clk_register to create devm_icc_clk_register to be
|
||||
able to release the resources properly.
|
||||
|
||||
Acked-by: Georgi Djakov <djakov@kernel.org>
|
||||
Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
|
||||
Signed-off-by: Varadarajan Narayanan <quic_varada@quicinc.com>
|
||||
Link: https://lore.kernel.org/r/20240430064214.2030013-4-quic_varada@quicinc.com
|
||||
Signed-off-by: Bjorn Andersson <andersson@kernel.org>
|
||||
---
|
||||
drivers/interconnect/icc-clk.c | 18 ++++++++++++++++++
|
||||
include/linux/interconnect-clk.h | 2 ++
|
||||
2 files changed, 20 insertions(+)
|
||||
|
||||
diff --git a/drivers/interconnect/icc-clk.c b/drivers/interconnect/icc-clk.c
|
||||
index 2be193fd7d8f..f788db15cd76 100644
|
||||
--- a/drivers/interconnect/icc-clk.c
|
||||
+++ b/drivers/interconnect/icc-clk.c
|
||||
@@ -148,6 +148,24 @@ struct icc_provider *icc_clk_register(struct device *dev,
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(icc_clk_register);
|
||||
|
||||
+static void devm_icc_release(void *res)
|
||||
+{
|
||||
+ icc_clk_unregister(res);
|
||||
+}
|
||||
+
|
||||
+int devm_icc_clk_register(struct device *dev, unsigned int first_id,
|
||||
+ unsigned int num_clocks, const struct icc_clk_data *data)
|
||||
+{
|
||||
+ struct icc_provider *prov;
|
||||
+
|
||||
+ prov = icc_clk_register(dev, first_id, num_clocks, data);
|
||||
+ if (IS_ERR(prov))
|
||||
+ return PTR_ERR(prov);
|
||||
+
|
||||
+ return devm_add_action_or_reset(dev, devm_icc_release, prov);
|
||||
+}
|
||||
+EXPORT_SYMBOL_GPL(devm_icc_clk_register);
|
||||
+
|
||||
/**
|
||||
* icc_clk_unregister() - unregister a previously registered clk interconnect provider
|
||||
* @provider: provider returned by icc_clk_register()
|
||||
diff --git a/include/linux/interconnect-clk.h b/include/linux/interconnect-clk.h
|
||||
index 170898faaacb..9bcee3e9c56c 100644
|
||||
--- a/include/linux/interconnect-clk.h
|
||||
+++ b/include/linux/interconnect-clk.h
|
||||
@@ -19,6 +19,8 @@ struct icc_provider *icc_clk_register(struct device *dev,
|
||||
unsigned int first_id,
|
||||
unsigned int num_clocks,
|
||||
const struct icc_clk_data *data);
|
||||
+int devm_icc_clk_register(struct device *dev, unsigned int first_id,
|
||||
+ unsigned int num_clocks, const struct icc_clk_data *data);
|
||||
void icc_clk_unregister(struct icc_provider *provider);
|
||||
|
||||
#endif
|
||||
--
|
||||
2.45.2
|
||||
|
@ -0,0 +1,115 @@
|
||||
From 8737ec830ee32162858af7c1504169b05b313ab1 Mon Sep 17 00:00:00 2001
|
||||
From: Varadarajan Narayanan <quic_varada@quicinc.com>
|
||||
Date: Tue, 30 Apr 2024 12:12:12 +0530
|
||||
Subject: [PATCH] clk: qcom: common: Add interconnect clocks support
|
||||
|
||||
Unlike MSM platforms that manage NoC related clocks and scaling
|
||||
from RPM, IPQ SoCs dont involve RPM in managing NoC related
|
||||
clocks and there is no NoC scaling.
|
||||
|
||||
However, there is a requirement to enable some NoC interface
|
||||
clocks for accessing the peripheral controllers present on
|
||||
these NoCs. Though exposing these as normal clocks would work,
|
||||
having a minimalistic interconnect driver to handle these clocks
|
||||
would make it consistent with other Qualcomm platforms resulting
|
||||
in common code paths. This is similar to msm8996-cbf's usage of
|
||||
icc-clk framework.
|
||||
|
||||
Signed-off-by: Varadarajan Narayanan <quic_varada@quicinc.com>
|
||||
Link: https://lore.kernel.org/r/20240430064214.2030013-5-quic_varada@quicinc.com
|
||||
Signed-off-by: Bjorn Andersson <andersson@kernel.org>
|
||||
---
|
||||
drivers/clk/qcom/common.c | 35 ++++++++++++++++++++++++++++++++++-
|
||||
drivers/clk/qcom/common.h | 9 +++++++++
|
||||
2 files changed, 43 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/clk/qcom/common.c b/drivers/clk/qcom/common.c
|
||||
index c92e10c60322..ea3788ba46f7 100644
|
||||
--- a/drivers/clk/qcom/common.c
|
||||
+++ b/drivers/clk/qcom/common.c
|
||||
@@ -8,6 +8,7 @@
|
||||
#include <linux/regmap.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/clk-provider.h>
|
||||
+#include <linux/interconnect-clk.h>
|
||||
#include <linux/reset-controller.h>
|
||||
#include <linux/of.h>
|
||||
|
||||
@@ -252,6 +253,38 @@ static struct clk_hw *qcom_cc_clk_hw_get(struct of_phandle_args *clkspec,
|
||||
return cc->rclks[idx] ? &cc->rclks[idx]->hw : NULL;
|
||||
}
|
||||
|
||||
+static int qcom_cc_icc_register(struct device *dev,
|
||||
+ const struct qcom_cc_desc *desc)
|
||||
+{
|
||||
+ struct icc_clk_data *icd;
|
||||
+ struct clk_hw *hws;
|
||||
+ int i;
|
||||
+
|
||||
+ if (!IS_ENABLED(CONFIG_INTERCONNECT_CLK))
|
||||
+ return 0;
|
||||
+
|
||||
+ if (!desc->icc_hws)
|
||||
+ return 0;
|
||||
+
|
||||
+ icd = devm_kcalloc(dev, desc->num_icc_hws, sizeof(*icd), GFP_KERNEL);
|
||||
+ if (!icd)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ for (i = 0; i < desc->num_icc_hws; i++) {
|
||||
+ icd[i].master_id = desc->icc_hws[i].master_id;
|
||||
+ icd[i].slave_id = desc->icc_hws[i].slave_id;
|
||||
+ hws = &desc->clks[desc->icc_hws[i].clk_id]->hw;
|
||||
+ icd[i].clk = devm_clk_hw_get_clk(dev, hws, "icc");
|
||||
+ if (!icd[i].clk)
|
||||
+ return dev_err_probe(dev, -ENOENT,
|
||||
+ "(%d) clock entry is null\n", i);
|
||||
+ icd[i].name = clk_hw_get_name(hws);
|
||||
+ }
|
||||
+
|
||||
+ return devm_icc_clk_register(dev, desc->icc_first_node_id,
|
||||
+ desc->num_icc_hws, icd);
|
||||
+}
|
||||
+
|
||||
int qcom_cc_really_probe(struct device *dev,
|
||||
const struct qcom_cc_desc *desc, struct regmap *regmap)
|
||||
{
|
||||
@@ -320,7 +353,7 @@ int qcom_cc_really_probe(struct device *dev,
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
- return 0;
|
||||
+ return qcom_cc_icc_register(dev, desc);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(qcom_cc_really_probe);
|
||||
|
||||
diff --git a/drivers/clk/qcom/common.h b/drivers/clk/qcom/common.h
|
||||
index d048bdeeba10..7e57f8fe8ea6 100644
|
||||
--- a/drivers/clk/qcom/common.h
|
||||
+++ b/drivers/clk/qcom/common.h
|
||||
@@ -19,6 +19,12 @@ struct clk_hw;
|
||||
#define PLL_VOTE_FSM_ENA BIT(20)
|
||||
#define PLL_VOTE_FSM_RESET BIT(21)
|
||||
|
||||
+struct qcom_icc_hws_data {
|
||||
+ int master_id;
|
||||
+ int slave_id;
|
||||
+ int clk_id;
|
||||
+};
|
||||
+
|
||||
struct qcom_cc_desc {
|
||||
const struct regmap_config *config;
|
||||
struct clk_regmap **clks;
|
||||
@@ -29,6 +35,9 @@ struct qcom_cc_desc {
|
||||
size_t num_gdscs;
|
||||
struct clk_hw **clk_hws;
|
||||
size_t num_clk_hws;
|
||||
+ struct qcom_icc_hws_data *icc_hws;
|
||||
+ size_t num_icc_hws;
|
||||
+ unsigned int icc_first_node_id;
|
||||
};
|
||||
|
||||
/**
|
||||
--
|
||||
2.45.2
|
||||
|
@ -0,0 +1,106 @@
|
||||
From 23711cabe122ef55bcb2e5c3e3835b5a2a688fc0 Mon Sep 17 00:00:00 2001
|
||||
From: Varadarajan Narayanan <quic_varada@quicinc.com>
|
||||
Date: Tue, 30 Apr 2024 12:12:13 +0530
|
||||
Subject: [PATCH] clk: qcom: ipq9574: Use icc-clk for enabling NoC related
|
||||
clocks
|
||||
|
||||
Use the icc-clk framework to enable few clocks to be able to
|
||||
create paths and use the peripherals connected on those NoCs.
|
||||
|
||||
Signed-off-by: Varadarajan Narayanan <quic_varada@quicinc.com>
|
||||
Reviewed-by: Konrad Dybcio <konrad.dybcio@linaro.org>
|
||||
Link: https://lore.kernel.org/r/20240430064214.2030013-6-quic_varada@quicinc.com
|
||||
Signed-off-by: Bjorn Andersson <andersson@kernel.org>
|
||||
---
|
||||
drivers/clk/qcom/Kconfig | 2 ++
|
||||
drivers/clk/qcom/gcc-ipq9574.c | 33 +++++++++++++++++++++++++++++++++
|
||||
2 files changed, 35 insertions(+)
|
||||
|
||||
diff --git a/drivers/clk/qcom/Kconfig b/drivers/clk/qcom/Kconfig
|
||||
index 1231eae51556..11ae28430dad 100644
|
||||
--- a/drivers/clk/qcom/Kconfig
|
||||
+++ b/drivers/clk/qcom/Kconfig
|
||||
@@ -14,6 +14,8 @@ menuconfig COMMON_CLK_QCOM
|
||||
select RATIONAL
|
||||
select REGMAP_MMIO
|
||||
select RESET_CONTROLLER
|
||||
+ select INTERCONNECT
|
||||
+ select INTERCONNECT_CLK
|
||||
|
||||
if COMMON_CLK_QCOM
|
||||
|
||||
diff --git a/drivers/clk/qcom/gcc-ipq9574.c b/drivers/clk/qcom/gcc-ipq9574.c
|
||||
index bc3e17f34295..f08a447370bd 100644
|
||||
--- a/drivers/clk/qcom/gcc-ipq9574.c
|
||||
+++ b/drivers/clk/qcom/gcc-ipq9574.c
|
||||
@@ -4,6 +4,8 @@
|
||||
*/
|
||||
|
||||
#include <linux/clk-provider.h>
|
||||
+#include <linux/interconnect-clk.h>
|
||||
+#include <linux/interconnect-provider.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/of.h>
|
||||
@@ -12,6 +14,7 @@
|
||||
|
||||
#include <dt-bindings/clock/qcom,ipq9574-gcc.h>
|
||||
#include <dt-bindings/reset/qcom,ipq9574-gcc.h>
|
||||
+#include <dt-bindings/interconnect/qcom,ipq9574.h>
|
||||
|
||||
#include "clk-alpha-pll.h"
|
||||
#include "clk-branch.h"
|
||||
@@ -4377,6 +4380,32 @@ static const struct qcom_reset_map gcc_ipq9574_resets[] = {
|
||||
[GCC_WCSS_Q6_TBU_BCR] = { 0x12054, 0 },
|
||||
};
|
||||
|
||||
+#define IPQ_APPS_ID 9574 /* some unique value */
|
||||
+
|
||||
+static struct qcom_icc_hws_data icc_ipq9574_hws[] = {
|
||||
+ { MASTER_ANOC_PCIE0, SLAVE_ANOC_PCIE0, GCC_ANOC_PCIE0_1LANE_M_CLK },
|
||||
+ { MASTER_SNOC_PCIE0, SLAVE_SNOC_PCIE0, GCC_SNOC_PCIE0_1LANE_S_CLK },
|
||||
+ { MASTER_ANOC_PCIE1, SLAVE_ANOC_PCIE1, GCC_ANOC_PCIE1_1LANE_M_CLK },
|
||||
+ { MASTER_SNOC_PCIE1, SLAVE_SNOC_PCIE1, GCC_SNOC_PCIE1_1LANE_S_CLK },
|
||||
+ { MASTER_ANOC_PCIE2, SLAVE_ANOC_PCIE2, GCC_ANOC_PCIE2_2LANE_M_CLK },
|
||||
+ { MASTER_SNOC_PCIE2, SLAVE_SNOC_PCIE2, GCC_SNOC_PCIE2_2LANE_S_CLK },
|
||||
+ { MASTER_ANOC_PCIE3, SLAVE_ANOC_PCIE3, GCC_ANOC_PCIE3_2LANE_M_CLK },
|
||||
+ { MASTER_SNOC_PCIE3, SLAVE_SNOC_PCIE3, GCC_SNOC_PCIE3_2LANE_S_CLK },
|
||||
+ { MASTER_USB, SLAVE_USB, GCC_SNOC_USB_CLK },
|
||||
+ { MASTER_USB_AXI, SLAVE_USB_AXI, GCC_ANOC_USB_AXI_CLK },
|
||||
+ { MASTER_NSSNOC_NSSCC, SLAVE_NSSNOC_NSSCC, GCC_NSSNOC_NSSCC_CLK },
|
||||
+ { MASTER_NSSNOC_SNOC_0, SLAVE_NSSNOC_SNOC_0, GCC_NSSNOC_SNOC_CLK },
|
||||
+ { MASTER_NSSNOC_SNOC_1, SLAVE_NSSNOC_SNOC_1, GCC_NSSNOC_SNOC_1_CLK },
|
||||
+ { MASTER_NSSNOC_PCNOC_1, SLAVE_NSSNOC_PCNOC_1, GCC_NSSNOC_PCNOC_1_CLK },
|
||||
+ { MASTER_NSSNOC_QOSGEN_REF, SLAVE_NSSNOC_QOSGEN_REF, GCC_NSSNOC_QOSGEN_REF_CLK },
|
||||
+ { MASTER_NSSNOC_TIMEOUT_REF, SLAVE_NSSNOC_TIMEOUT_REF, GCC_NSSNOC_TIMEOUT_REF_CLK },
|
||||
+ { MASTER_NSSNOC_XO_DCD, SLAVE_NSSNOC_XO_DCD, GCC_NSSNOC_XO_DCD_CLK },
|
||||
+ { MASTER_NSSNOC_ATB, SLAVE_NSSNOC_ATB, GCC_NSSNOC_ATB_CLK },
|
||||
+ { MASTER_MEM_NOC_NSSNOC, SLAVE_MEM_NOC_NSSNOC, GCC_MEM_NOC_NSSNOC_CLK },
|
||||
+ { MASTER_NSSNOC_MEMNOC, SLAVE_NSSNOC_MEMNOC, GCC_NSSNOC_MEMNOC_CLK },
|
||||
+ { MASTER_NSSNOC_MEM_NOC_1, SLAVE_NSSNOC_MEM_NOC_1, GCC_NSSNOC_MEM_NOC_1_CLK },
|
||||
+};
|
||||
+
|
||||
static const struct of_device_id gcc_ipq9574_match_table[] = {
|
||||
{ .compatible = "qcom,ipq9574-gcc" },
|
||||
{ }
|
||||
@@ -4399,6 +4428,9 @@ static const struct qcom_cc_desc gcc_ipq9574_desc = {
|
||||
.num_resets = ARRAY_SIZE(gcc_ipq9574_resets),
|
||||
.clk_hws = gcc_ipq9574_hws,
|
||||
.num_clk_hws = ARRAY_SIZE(gcc_ipq9574_hws),
|
||||
+ .icc_hws = icc_ipq9574_hws,
|
||||
+ .num_icc_hws = ARRAY_SIZE(icc_ipq9574_hws),
|
||||
+ .icc_first_node_id = IPQ_APPS_ID,
|
||||
};
|
||||
|
||||
static int gcc_ipq9574_probe(struct platform_device *pdev)
|
||||
@@ -4411,6 +4443,7 @@ static struct platform_driver gcc_ipq9574_driver = {
|
||||
.driver = {
|
||||
.name = "qcom,gcc-ipq9574",
|
||||
.of_match_table = gcc_ipq9574_match_table,
|
||||
+ .sync_state = icc_sync_state,
|
||||
},
|
||||
};
|
||||
|
||||
--
|
||||
2.45.2
|
||||
|
@ -0,0 +1,46 @@
|
||||
From 5d0ab61a700214366dfcca5893b87655261e8c94 Mon Sep 17 00:00:00 2001
|
||||
From: Varadarajan Narayanan <quic_varada@quicinc.com>
|
||||
Date: Tue, 30 Apr 2024 12:12:14 +0530
|
||||
Subject: [PATCH] arm64: dts: qcom: ipq9574: Add icc provider ability to gcc
|
||||
|
||||
IPQ SoCs dont involve RPM in managing NoC related clocks and
|
||||
there is no NoC scaling. Linux itself handles these clocks.
|
||||
However, these should not be exposed as just clocks and align
|
||||
with other Qualcomm SoCs that handle these clocks from a
|
||||
interconnect provider.
|
||||
|
||||
Hence include icc provider capability to the gcc node so that
|
||||
peripherals can use the interconnect facility to enable these
|
||||
clocks.
|
||||
|
||||
Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
|
||||
Signed-off-by: Varadarajan Narayanan <quic_varada@quicinc.com>
|
||||
Link: https://lore.kernel.org/r/20240430064214.2030013-7-quic_varada@quicinc.com
|
||||
Signed-off-by: Bjorn Andersson <andersson@kernel.org>
|
||||
---
|
||||
arch/arm64/boot/dts/qcom/ipq9574.dtsi | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/qcom/ipq9574.dtsi b/arch/arm64/boot/dts/qcom/ipq9574.dtsi
|
||||
index 04ba09a9156c..48dfafea46a7 100644
|
||||
--- a/arch/arm64/boot/dts/qcom/ipq9574.dtsi
|
||||
+++ b/arch/arm64/boot/dts/qcom/ipq9574.dtsi
|
||||
@@ -8,6 +8,7 @@
|
||||
|
||||
#include <dt-bindings/clock/qcom,apss-ipq.h>
|
||||
#include <dt-bindings/clock/qcom,ipq9574-gcc.h>
|
||||
+#include <dt-bindings/interconnect/qcom,ipq9574.h>
|
||||
#include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||
#include <dt-bindings/reset/qcom,ipq9574-gcc.h>
|
||||
#include <dt-bindings/thermal/thermal.h>
|
||||
@@ -315,6 +316,7 @@ gcc: clock-controller@1800000 {
|
||||
<0>;
|
||||
#clock-cells = <1>;
|
||||
#reset-cells = <1>;
|
||||
+ #interconnect-cells = <1>;
|
||||
};
|
||||
|
||||
tcsr_mutex: hwlock@1905000 {
|
||||
--
|
||||
2.45.2
|
||||
|
@ -0,0 +1,68 @@
|
||||
From ba5a61a08d83b18b99c461b4ddb9009947a4aa0e Mon Sep 17 00:00:00 2001
|
||||
From: Varadarajan Narayanan <quic_varada@quicinc.com>
|
||||
Date: Tue, 31 Oct 2023 12:41:38 +0530
|
||||
Subject: [PATCH 1/2] cpufreq: qcom-nvmem: Enable cpufreq for ipq53xx
|
||||
|
||||
IPQ53xx have different OPPs available for the CPU based on
|
||||
SoC variant. This can be determined through use of an eFuse
|
||||
register present in the silicon.
|
||||
|
||||
Added support for ipq53xx on nvmem driver which helps to
|
||||
determine OPPs at runtime based on the eFuse register which
|
||||
has the CPU frequency limits. opp-supported-hw dt binding
|
||||
can be used to indicate the available OPPs for each limit.
|
||||
|
||||
nvmem driver also creates the "cpufreq-dt" platform_device after
|
||||
passing the version matching data to the OPP framework so that the
|
||||
cpufreq-dt handles the actual cpufreq implementation.
|
||||
|
||||
Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
|
||||
Reviewed-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
|
||||
Signed-off-by: Kathiravan T <quic_kathirav@quicinc.com>
|
||||
Signed-off-by: Varadarajan Narayanan <quic_varada@quicinc.com>
|
||||
[ Viresh: Fixed subject ]
|
||||
Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>
|
||||
---
|
||||
drivers/cpufreq/cpufreq-dt-platdev.c | 1 +
|
||||
drivers/cpufreq/qcom-cpufreq-nvmem.c | 6 ++++++
|
||||
2 files changed, 7 insertions(+)
|
||||
|
||||
diff --git a/drivers/cpufreq/cpufreq-dt-platdev.c b/drivers/cpufreq/cpufreq-dt-platdev.c
|
||||
index 07181913448f..53da25589e5f 100644
|
||||
--- a/drivers/cpufreq/cpufreq-dt-platdev.c
|
||||
+++ b/drivers/cpufreq/cpufreq-dt-platdev.c
|
||||
@@ -180,6 +180,7 @@ static const struct of_device_id blocklist[] __initconst = {
|
||||
{ .compatible = "ti,am62a7", },
|
||||
{ .compatible = "ti,am62p5", },
|
||||
|
||||
+ { .compatible = "qcom,ipq5332", },
|
||||
{ .compatible = "qcom,ipq8064", },
|
||||
{ .compatible = "qcom,apq8064", },
|
||||
{ .compatible = "qcom,msm8974", },
|
||||
diff --git a/drivers/cpufreq/qcom-cpufreq-nvmem.c b/drivers/cpufreq/qcom-cpufreq-nvmem.c
|
||||
index 158c0e139185..4f7af70169e0 100644
|
||||
--- a/drivers/cpufreq/qcom-cpufreq-nvmem.c
|
||||
+++ b/drivers/cpufreq/qcom-cpufreq-nvmem.c
|
||||
@@ -183,6 +183,11 @@ static int qcom_cpufreq_kryo_name_version(struct device *cpu_dev,
|
||||
switch (msm_id) {
|
||||
case QCOM_ID_MSM8996:
|
||||
case QCOM_ID_APQ8096:
|
||||
+ case QCOM_ID_IPQ5332:
|
||||
+ case QCOM_ID_IPQ5322:
|
||||
+ case QCOM_ID_IPQ5312:
|
||||
+ case QCOM_ID_IPQ5302:
|
||||
+ case QCOM_ID_IPQ5300:
|
||||
drv->versions = 1 << (unsigned int)(*speedbin);
|
||||
break;
|
||||
case QCOM_ID_MSM8996SG:
|
||||
@@ -541,6 +546,7 @@ static const struct of_device_id qcom_cpufreq_match_list[] __initconst = {
|
||||
{ .compatible = "qcom,apq8096", .data = &match_data_kryo },
|
||||
{ .compatible = "qcom,msm8996", .data = &match_data_kryo },
|
||||
{ .compatible = "qcom,qcs404", .data = &match_data_qcs404 },
|
||||
+ { .compatible = "qcom,ipq5332", .data = &match_data_kryo },
|
||||
{ .compatible = "qcom,ipq8064", .data = &match_data_krait },
|
||||
{ .compatible = "qcom,apq8064", .data = &match_data_krait },
|
||||
{ .compatible = "qcom,msm8974", .data = &match_data_krait },
|
||||
--
|
||||
2.45.2
|
||||
|
@ -1,7 +1,7 @@
|
||||
From 80838ab7ebd416cbac38c1cd30a76d61641f7ee1 Mon Sep 17 00:00:00 2001
|
||||
From 5b5b5806f22390808b8e8fa180fe35b003a4a74d Mon Sep 17 00:00:00 2001
|
||||
From: Varadarajan Narayanan <quic_varada@quicinc.com>
|
||||
Date: Tue, 31 Oct 2023 12:41:39 +0530
|
||||
Subject: [PATCH 37/41] cpufreq: qcom-nvmem: Introduce cpufreq for ipq95xx
|
||||
Subject: [PATCH 2/2] cpufreq: qcom-nvmem: Introduce cpufreq for ipq95xx
|
||||
|
||||
IPQ95xx SoCs have different OPPs available for the CPU based on
|
||||
the SoC variant. This can be determined from an eFuse register
|
||||
@ -20,26 +20,29 @@ Signed-off-by: Varadarajan Narayanan <quic_varada@quicinc.com>
|
||||
Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>
|
||||
---
|
||||
drivers/cpufreq/cpufreq-dt-platdev.c | 1 +
|
||||
drivers/cpufreq/qcom-cpufreq-nvmem.c | 5 +++++
|
||||
include/dt-bindings/arm/qcom,ids.h | 6 ++++++
|
||||
3 files changed, 12 insertions(+)
|
||||
drivers/cpufreq/qcom-cpufreq-nvmem.c | 6 ++++++
|
||||
2 files changed, 7 insertions(+)
|
||||
|
||||
diff --git a/drivers/cpufreq/cpufreq-dt-platdev.c b/drivers/cpufreq/cpufreq-dt-platdev.c
|
||||
index 53da25589e5f..bd1e1357cef8 100644
|
||||
--- a/drivers/cpufreq/cpufreq-dt-platdev.c
|
||||
+++ b/drivers/cpufreq/cpufreq-dt-platdev.c
|
||||
@@ -164,6 +164,7 @@ static const struct of_device_id blockli
|
||||
{ .compatible = "ti,omap3", },
|
||||
@@ -184,6 +184,7 @@ static const struct of_device_id blocklist[] __initconst = {
|
||||
|
||||
{ .compatible = "qcom,ipq5332", },
|
||||
{ .compatible = "qcom,ipq8064", },
|
||||
+ { .compatible = "qcom,ipq9574", },
|
||||
{ .compatible = "qcom,apq8064", },
|
||||
{ .compatible = "qcom,msm8974", },
|
||||
{ .compatible = "qcom,msm8960", },
|
||||
diff --git a/drivers/cpufreq/qcom-cpufreq-nvmem.c b/drivers/cpufreq/qcom-cpufreq-nvmem.c
|
||||
index 4f7af70169e0..6355a39418c5 100644
|
||||
--- a/drivers/cpufreq/qcom-cpufreq-nvmem.c
|
||||
+++ b/drivers/cpufreq/qcom-cpufreq-nvmem.c
|
||||
@@ -152,6 +152,11 @@ static int qcom_cpufreq_kryo_name_versio
|
||||
switch (msm_id) {
|
||||
case QCOM_ID_MSM8996:
|
||||
case QCOM_ID_APQ8096:
|
||||
@@ -188,6 +188,11 @@ static int qcom_cpufreq_kryo_name_version(struct device *cpu_dev,
|
||||
case QCOM_ID_IPQ5312:
|
||||
case QCOM_ID_IPQ5302:
|
||||
case QCOM_ID_IPQ5300:
|
||||
+ case QCOM_ID_IPQ9514:
|
||||
+ case QCOM_ID_IPQ9550:
|
||||
+ case QCOM_ID_IPQ9554:
|
||||
@ -48,18 +51,14 @@ Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>
|
||||
drv->versions = 1 << (unsigned int)(*speedbin);
|
||||
break;
|
||||
case QCOM_ID_MSM8996SG:
|
||||
--- a/include/dt-bindings/arm/qcom,ids.h
|
||||
+++ b/include/dt-bindings/arm/qcom,ids.h
|
||||
@@ -140,6 +140,12 @@
|
||||
#define QCOM_ID_SC7280 487
|
||||
#define QCOM_ID_SC7180P 495
|
||||
#define QCOM_ID_SM6375 507
|
||||
+#define QCOM_ID_IPQ9514 510
|
||||
+#define QCOM_ID_IPQ9550 511
|
||||
+#define QCOM_ID_IPQ9554 512
|
||||
+#define QCOM_ID_IPQ9570 513
|
||||
+#define QCOM_ID_IPQ9574 514
|
||||
+#define QCOM_ID_IPQ9510 521
|
||||
|
||||
/*
|
||||
* The board type and revision information, used by Qualcomm bootloaders and
|
||||
@@ -551,6 +556,7 @@ static const struct of_device_id qcom_cpufreq_match_list[] __initconst = {
|
||||
{ .compatible = "qcom,ipq5332", .data = &match_data_kryo },
|
||||
{ .compatible = "qcom,ipq8064", .data = &match_data_krait },
|
||||
{ .compatible = "qcom,apq8064", .data = &match_data_krait },
|
||||
+ { .compatible = "qcom,ipq9574", .data = &match_data_kryo },
|
||||
{ .compatible = "qcom,msm8974", .data = &match_data_krait },
|
||||
{ .compatible = "qcom,msm8960", .data = &match_data_krait },
|
||||
{},
|
||||
--
|
||||
2.45.2
|
||||
|
@ -1,8 +1,8 @@
|
||||
From f1001470268206073905a37fdba06355eb43d32c Mon Sep 17 00:00:00 2001
|
||||
From b36074357baf2794c825ea1c145de1d22b15380b Mon Sep 17 00:00:00 2001
|
||||
From: Varadarajan Narayanan <quic_varada@quicinc.com>
|
||||
Date: Fri, 20 Oct 2023 11:49:39 +0530
|
||||
Subject: [PATCH 35/41] arm64: dts: qcom: ipq9574: populate the opp table based
|
||||
on the eFuse
|
||||
Subject: [PATCH] arm64: dts: qcom: ipq9574: populate the opp table based on
|
||||
the eFuse
|
||||
|
||||
IPQ95xx SoCs have different OPPs available for the CPU based on
|
||||
SoC variant. This can be determined from an eFuse register
|
||||
@ -31,9 +31,11 @@ Signed-off-by: Bjorn Andersson <andersson@kernel.org>
|
||||
arch/arm64/boot/dts/qcom/ipq9574.dtsi | 21 ++++++++++++++++++++-
|
||||
1 file changed, 20 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/qcom/ipq9574.dtsi b/arch/arm64/boot/dts/qcom/ipq9574.dtsi
|
||||
index 8a72ad4afd03..d4b7e215fc92 100644
|
||||
--- a/arch/arm64/boot/dts/qcom/ipq9574.dtsi
|
||||
+++ b/arch/arm64/boot/dts/qcom/ipq9574.dtsi
|
||||
@@ -93,42 +93,56 @@
|
||||
@@ -106,42 +106,56 @@ memory@40000000 {
|
||||
};
|
||||
|
||||
cpu_opp_table: opp-table-cpu {
|
||||
@ -91,7 +93,7 @@ Signed-off-by: Bjorn Andersson <andersson@kernel.org>
|
||||
clock-latency-ns = <200000>;
|
||||
};
|
||||
};
|
||||
@@ -206,6 +220,11 @@
|
||||
@@ -223,6 +237,11 @@ qfprom: efuse@a4000 {
|
||||
reg = <0x000a4000 0x5a1>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
@ -102,4 +104,7 @@ Signed-off-by: Bjorn Andersson <andersson@kernel.org>
|
||||
+ };
|
||||
};
|
||||
|
||||
tlmm: pinctrl@1000000 {
|
||||
cryptobam: dma-controller@704000 {
|
||||
--
|
||||
2.45.2
|
||||
|
@ -0,0 +1,31 @@
|
||||
From ad663ce6780477177e301756ade6cf236f36ae4c Mon Sep 17 00:00:00 2001
|
||||
From: Varadarajan Narayanan <quic_varada@quicinc.com>
|
||||
Date: Thu, 14 Dec 2023 16:10:52 +0530
|
||||
Subject: [PATCH] regulator: qcom_smd: Add LDO5 MP5496 regulator
|
||||
|
||||
Add support for LDO5 regulator. This is used by IPQ9574 USB.
|
||||
|
||||
Signed-off-by: Varadarajan Narayanan <quic_varada@quicinc.com>
|
||||
Rule: <add>
|
||||
Link: https://lore.kernel.org/stable/20231214104052.3267039-1-quic_varada%40quicinc.com
|
||||
Link: https://msgid.link/r/20231214104052.3267039-1-quic_varada@quicinc.com
|
||||
Signed-off-by: Mark Brown <broonie@kernel.org>
|
||||
---
|
||||
drivers/regulator/qcom_smd-regulator.c | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/drivers/regulator/qcom_smd-regulator.c b/drivers/regulator/qcom_smd-regulator.c
|
||||
index 09c471a0ba2e..d1be9568025e 100644
|
||||
--- a/drivers/regulator/qcom_smd-regulator.c
|
||||
+++ b/drivers/regulator/qcom_smd-regulator.c
|
||||
@@ -796,6 +796,7 @@ static const struct rpm_regulator_data rpm_mp5496_regulators[] = {
|
||||
{ "s1", QCOM_SMD_RPM_SMPA, 1, &mp5496_smps, "s1" },
|
||||
{ "s2", QCOM_SMD_RPM_SMPA, 2, &mp5496_smps, "s2" },
|
||||
{ "l2", QCOM_SMD_RPM_LDOA, 2, &mp5496_ldoa2, "l2" },
|
||||
+ { "l5", QCOM_SMD_RPM_LDOA, 5, &mp5496_ldoa2, "l5" },
|
||||
{}
|
||||
};
|
||||
|
||||
--
|
||||
2.45.2
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,885 @@
|
||||
From 1d479f5b345e0c3650fec4dddeef9fc6fab30c8b Mon Sep 17 00:00:00 2001
|
||||
From: Md Sadre Alam <quic_mdalam@quicinc.com>
|
||||
Date: Wed, 20 Nov 2024 14:45:01 +0530
|
||||
Subject: [PATCH 2/4] mtd: rawnand: qcom: Add qcom prefix to common api
|
||||
|
||||
Add qcom prefix to all the api which will be commonly
|
||||
used by spi nand driver and raw nand driver.
|
||||
|
||||
Reviewed-by: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com>
|
||||
Signed-off-by: Md Sadre Alam <quic_mdalam@quicinc.com>
|
||||
Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
|
||||
---
|
||||
drivers/mtd/nand/raw/qcom_nandc.c | 320 +++++++++++++++---------------
|
||||
1 file changed, 160 insertions(+), 160 deletions(-)
|
||||
|
||||
diff --git a/drivers/mtd/nand/raw/qcom_nandc.c b/drivers/mtd/nand/raw/qcom_nandc.c
|
||||
index 9ae8c9f2ab55..6da5d23d2c8b 100644
|
||||
--- a/drivers/mtd/nand/raw/qcom_nandc.c
|
||||
+++ b/drivers/mtd/nand/raw/qcom_nandc.c
|
||||
@@ -53,7 +53,7 @@
|
||||
#define NAND_READ_LOCATION_LAST_CW_2 0xf48
|
||||
#define NAND_READ_LOCATION_LAST_CW_3 0xf4c
|
||||
|
||||
-/* dummy register offsets, used by write_reg_dma */
|
||||
+/* dummy register offsets, used by qcom_write_reg_dma */
|
||||
#define NAND_DEV_CMD1_RESTORE 0xdead
|
||||
#define NAND_DEV_CMD_VLD_RESTORE 0xbeef
|
||||
|
||||
@@ -211,7 +211,7 @@
|
||||
|
||||
/*
|
||||
* Flags used in DMA descriptor preparation helper functions
|
||||
- * (i.e. read_reg_dma/write_reg_dma/read_data_dma/write_data_dma)
|
||||
+ * (i.e. qcom_read_reg_dma/qcom_write_reg_dma/qcom_read_data_dma/qcom_write_data_dma)
|
||||
*/
|
||||
/* Don't set the EOT in current tx BAM sgl */
|
||||
#define NAND_BAM_NO_EOT BIT(0)
|
||||
@@ -550,7 +550,7 @@ struct qcom_nandc_props {
|
||||
};
|
||||
|
||||
/* Frees the BAM transaction memory */
|
||||
-static void free_bam_transaction(struct qcom_nand_controller *nandc)
|
||||
+static void qcom_free_bam_transaction(struct qcom_nand_controller *nandc)
|
||||
{
|
||||
struct bam_transaction *bam_txn = nandc->bam_txn;
|
||||
|
||||
@@ -559,7 +559,7 @@ static void free_bam_transaction(struct qcom_nand_controller *nandc)
|
||||
|
||||
/* Allocates and Initializes the BAM transaction */
|
||||
static struct bam_transaction *
|
||||
-alloc_bam_transaction(struct qcom_nand_controller *nandc)
|
||||
+qcom_alloc_bam_transaction(struct qcom_nand_controller *nandc)
|
||||
{
|
||||
struct bam_transaction *bam_txn;
|
||||
size_t bam_txn_size;
|
||||
@@ -595,7 +595,7 @@ alloc_bam_transaction(struct qcom_nand_controller *nandc)
|
||||
}
|
||||
|
||||
/* Clears the BAM transaction indexes */
|
||||
-static void clear_bam_transaction(struct qcom_nand_controller *nandc)
|
||||
+static void qcom_clear_bam_transaction(struct qcom_nand_controller *nandc)
|
||||
{
|
||||
struct bam_transaction *bam_txn = nandc->bam_txn;
|
||||
|
||||
@@ -614,7 +614,7 @@ static void clear_bam_transaction(struct qcom_nand_controller *nandc)
|
||||
}
|
||||
|
||||
/* Callback for DMA descriptor completion */
|
||||
-static void qpic_bam_dma_done(void *data)
|
||||
+static void qcom_qpic_bam_dma_done(void *data)
|
||||
{
|
||||
struct bam_transaction *bam_txn = data;
|
||||
|
||||
@@ -644,7 +644,7 @@ static void nandc_write(struct qcom_nand_controller *nandc, int offset,
|
||||
iowrite32(val, nandc->base + offset);
|
||||
}
|
||||
|
||||
-static void nandc_dev_to_mem(struct qcom_nand_controller *nandc, bool is_cpu)
|
||||
+static void qcom_nandc_dev_to_mem(struct qcom_nand_controller *nandc, bool is_cpu)
|
||||
{
|
||||
if (!nandc->props->supports_bam)
|
||||
return;
|
||||
@@ -824,9 +824,9 @@ static void update_rw_regs(struct qcom_nand_host *host, int num_cw, bool read, i
|
||||
* for BAM. This descriptor will be added in the NAND DMA descriptor queue
|
||||
* which will be submitted to DMA engine.
|
||||
*/
|
||||
-static int prepare_bam_async_desc(struct qcom_nand_controller *nandc,
|
||||
- struct dma_chan *chan,
|
||||
- unsigned long flags)
|
||||
+static int qcom_prepare_bam_async_desc(struct qcom_nand_controller *nandc,
|
||||
+ struct dma_chan *chan,
|
||||
+ unsigned long flags)
|
||||
{
|
||||
struct desc_info *desc;
|
||||
struct scatterlist *sgl;
|
||||
@@ -903,9 +903,9 @@ static int prepare_bam_async_desc(struct qcom_nand_controller *nandc,
|
||||
* NAND_BAM_NEXT_SGL will be used for starting the separate SGL
|
||||
* after the current command element.
|
||||
*/
|
||||
-static int prep_bam_dma_desc_cmd(struct qcom_nand_controller *nandc, bool read,
|
||||
- int reg_off, const void *vaddr,
|
||||
- int size, unsigned int flags)
|
||||
+static int qcom_prep_bam_dma_desc_cmd(struct qcom_nand_controller *nandc, bool read,
|
||||
+ int reg_off, const void *vaddr,
|
||||
+ int size, unsigned int flags)
|
||||
{
|
||||
int bam_ce_size;
|
||||
int i, ret;
|
||||
@@ -943,9 +943,9 @@ static int prep_bam_dma_desc_cmd(struct qcom_nand_controller *nandc, bool read,
|
||||
bam_txn->bam_ce_start = bam_txn->bam_ce_pos;
|
||||
|
||||
if (flags & NAND_BAM_NWD) {
|
||||
- ret = prepare_bam_async_desc(nandc, nandc->cmd_chan,
|
||||
- DMA_PREP_FENCE |
|
||||
- DMA_PREP_CMD);
|
||||
+ ret = qcom_prepare_bam_async_desc(nandc, nandc->cmd_chan,
|
||||
+ DMA_PREP_FENCE |
|
||||
+ DMA_PREP_CMD);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
@@ -958,9 +958,8 @@ static int prep_bam_dma_desc_cmd(struct qcom_nand_controller *nandc, bool read,
|
||||
* Prepares the data descriptor for BAM DMA which will be used for NAND
|
||||
* data reads and writes.
|
||||
*/
|
||||
-static int prep_bam_dma_desc_data(struct qcom_nand_controller *nandc, bool read,
|
||||
- const void *vaddr,
|
||||
- int size, unsigned int flags)
|
||||
+static int qcom_prep_bam_dma_desc_data(struct qcom_nand_controller *nandc, bool read,
|
||||
+ const void *vaddr, int size, unsigned int flags)
|
||||
{
|
||||
int ret;
|
||||
struct bam_transaction *bam_txn = nandc->bam_txn;
|
||||
@@ -979,8 +978,8 @@ static int prep_bam_dma_desc_data(struct qcom_nand_controller *nandc, bool read,
|
||||
* is not set, form the DMA descriptor
|
||||
*/
|
||||
if (!(flags & NAND_BAM_NO_EOT)) {
|
||||
- ret = prepare_bam_async_desc(nandc, nandc->tx_chan,
|
||||
- DMA_PREP_INTERRUPT);
|
||||
+ ret = qcom_prepare_bam_async_desc(nandc, nandc->tx_chan,
|
||||
+ DMA_PREP_INTERRUPT);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
@@ -989,9 +988,9 @@ static int prep_bam_dma_desc_data(struct qcom_nand_controller *nandc, bool read,
|
||||
return 0;
|
||||
}
|
||||
|
||||
-static int prep_adm_dma_desc(struct qcom_nand_controller *nandc, bool read,
|
||||
- int reg_off, const void *vaddr, int size,
|
||||
- bool flow_control)
|
||||
+static int qcom_prep_adm_dma_desc(struct qcom_nand_controller *nandc, bool read,
|
||||
+ int reg_off, const void *vaddr, int size,
|
||||
+ bool flow_control)
|
||||
{
|
||||
struct desc_info *desc;
|
||||
struct dma_async_tx_descriptor *dma_desc;
|
||||
@@ -1069,15 +1068,15 @@ static int prep_adm_dma_desc(struct qcom_nand_controller *nandc, bool read,
|
||||
}
|
||||
|
||||
/*
|
||||
- * read_reg_dma: prepares a descriptor to read a given number of
|
||||
+ * qcom_read_reg_dma: prepares a descriptor to read a given number of
|
||||
* contiguous registers to the reg_read_buf pointer
|
||||
*
|
||||
* @first: offset of the first register in the contiguous block
|
||||
* @num_regs: number of registers to read
|
||||
* @flags: flags to control DMA descriptor preparation
|
||||
*/
|
||||
-static int read_reg_dma(struct qcom_nand_controller *nandc, int first,
|
||||
- int num_regs, unsigned int flags)
|
||||
+static int qcom_read_reg_dma(struct qcom_nand_controller *nandc, int first,
|
||||
+ int num_regs, unsigned int flags)
|
||||
{
|
||||
bool flow_control = false;
|
||||
void *vaddr;
|
||||
@@ -1089,18 +1088,18 @@ static int read_reg_dma(struct qcom_nand_controller *nandc, int first,
|
||||
first = dev_cmd_reg_addr(nandc, first);
|
||||
|
||||
if (nandc->props->supports_bam)
|
||||
- return prep_bam_dma_desc_cmd(nandc, true, first, vaddr,
|
||||
+ return qcom_prep_bam_dma_desc_cmd(nandc, true, first, vaddr,
|
||||
num_regs, flags);
|
||||
|
||||
if (first == NAND_READ_ID || first == NAND_FLASH_STATUS)
|
||||
flow_control = true;
|
||||
|
||||
- return prep_adm_dma_desc(nandc, true, first, vaddr,
|
||||
+ return qcom_prep_adm_dma_desc(nandc, true, first, vaddr,
|
||||
num_regs * sizeof(u32), flow_control);
|
||||
}
|
||||
|
||||
/*
|
||||
- * write_reg_dma: prepares a descriptor to write a given number of
|
||||
+ * qcom_write_reg_dma: prepares a descriptor to write a given number of
|
||||
* contiguous registers
|
||||
*
|
||||
* @vaddr: contiguous memory from where register value will
|
||||
@@ -1109,8 +1108,8 @@ static int read_reg_dma(struct qcom_nand_controller *nandc, int first,
|
||||
* @num_regs: number of registers to write
|
||||
* @flags: flags to control DMA descriptor preparation
|
||||
*/
|
||||
-static int write_reg_dma(struct qcom_nand_controller *nandc, __le32 *vaddr,
|
||||
- int first, int num_regs, unsigned int flags)
|
||||
+static int qcom_write_reg_dma(struct qcom_nand_controller *nandc, __le32 *vaddr,
|
||||
+ int first, int num_regs, unsigned int flags)
|
||||
{
|
||||
bool flow_control = false;
|
||||
|
||||
@@ -1124,18 +1123,18 @@ static int write_reg_dma(struct qcom_nand_controller *nandc, __le32 *vaddr,
|
||||
first = dev_cmd_reg_addr(nandc, NAND_DEV_CMD_VLD);
|
||||
|
||||
if (nandc->props->supports_bam)
|
||||
- return prep_bam_dma_desc_cmd(nandc, false, first, vaddr,
|
||||
+ return qcom_prep_bam_dma_desc_cmd(nandc, false, first, vaddr,
|
||||
num_regs, flags);
|
||||
|
||||
if (first == NAND_FLASH_CMD)
|
||||
flow_control = true;
|
||||
|
||||
- return prep_adm_dma_desc(nandc, false, first, vaddr,
|
||||
+ return qcom_prep_adm_dma_desc(nandc, false, first, vaddr,
|
||||
num_regs * sizeof(u32), flow_control);
|
||||
}
|
||||
|
||||
/*
|
||||
- * read_data_dma: prepares a DMA descriptor to transfer data from the
|
||||
+ * qcom_read_data_dma: prepares a DMA descriptor to transfer data from the
|
||||
* controller's internal buffer to the buffer 'vaddr'
|
||||
*
|
||||
* @reg_off: offset within the controller's data buffer
|
||||
@@ -1143,17 +1142,17 @@ static int write_reg_dma(struct qcom_nand_controller *nandc, __le32 *vaddr,
|
||||
* @size: DMA transaction size in bytes
|
||||
* @flags: flags to control DMA descriptor preparation
|
||||
*/
|
||||
-static int read_data_dma(struct qcom_nand_controller *nandc, int reg_off,
|
||||
- const u8 *vaddr, int size, unsigned int flags)
|
||||
+static int qcom_read_data_dma(struct qcom_nand_controller *nandc, int reg_off,
|
||||
+ const u8 *vaddr, int size, unsigned int flags)
|
||||
{
|
||||
if (nandc->props->supports_bam)
|
||||
- return prep_bam_dma_desc_data(nandc, true, vaddr, size, flags);
|
||||
+ return qcom_prep_bam_dma_desc_data(nandc, true, vaddr, size, flags);
|
||||
|
||||
- return prep_adm_dma_desc(nandc, true, reg_off, vaddr, size, false);
|
||||
+ return qcom_prep_adm_dma_desc(nandc, true, reg_off, vaddr, size, false);
|
||||
}
|
||||
|
||||
/*
|
||||
- * write_data_dma: prepares a DMA descriptor to transfer data from
|
||||
+ * qcom_write_data_dma: prepares a DMA descriptor to transfer data from
|
||||
* 'vaddr' to the controller's internal buffer
|
||||
*
|
||||
* @reg_off: offset within the controller's data buffer
|
||||
@@ -1161,13 +1160,13 @@ static int read_data_dma(struct qcom_nand_controller *nandc, int reg_off,
|
||||
* @size: DMA transaction size in bytes
|
||||
* @flags: flags to control DMA descriptor preparation
|
||||
*/
|
||||
-static int write_data_dma(struct qcom_nand_controller *nandc, int reg_off,
|
||||
- const u8 *vaddr, int size, unsigned int flags)
|
||||
+static int qcom_write_data_dma(struct qcom_nand_controller *nandc, int reg_off,
|
||||
+ const u8 *vaddr, int size, unsigned int flags)
|
||||
{
|
||||
if (nandc->props->supports_bam)
|
||||
- return prep_bam_dma_desc_data(nandc, false, vaddr, size, flags);
|
||||
+ return qcom_prep_bam_dma_desc_data(nandc, false, vaddr, size, flags);
|
||||
|
||||
- return prep_adm_dma_desc(nandc, false, reg_off, vaddr, size, false);
|
||||
+ return qcom_prep_adm_dma_desc(nandc, false, reg_off, vaddr, size, false);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1178,14 +1177,14 @@ static void config_nand_page_read(struct nand_chip *chip)
|
||||
{
|
||||
struct qcom_nand_controller *nandc = get_qcom_nand_controller(chip);
|
||||
|
||||
- write_reg_dma(nandc, &nandc->regs->addr0, NAND_ADDR0, 2, 0);
|
||||
- write_reg_dma(nandc, &nandc->regs->cfg0, NAND_DEV0_CFG0, 3, 0);
|
||||
+ qcom_write_reg_dma(nandc, &nandc->regs->addr0, NAND_ADDR0, 2, 0);
|
||||
+ qcom_write_reg_dma(nandc, &nandc->regs->cfg0, NAND_DEV0_CFG0, 3, 0);
|
||||
if (!nandc->props->qpic_version2)
|
||||
- write_reg_dma(nandc, &nandc->regs->ecc_buf_cfg, NAND_EBI2_ECC_BUF_CFG, 1, 0);
|
||||
- write_reg_dma(nandc, &nandc->regs->erased_cw_detect_cfg_clr,
|
||||
- NAND_ERASED_CW_DETECT_CFG, 1, 0);
|
||||
- write_reg_dma(nandc, &nandc->regs->erased_cw_detect_cfg_set,
|
||||
- NAND_ERASED_CW_DETECT_CFG, 1, NAND_ERASED_CW_SET | NAND_BAM_NEXT_SGL);
|
||||
+ qcom_write_reg_dma(nandc, &nandc->regs->ecc_buf_cfg, NAND_EBI2_ECC_BUF_CFG, 1, 0);
|
||||
+ qcom_write_reg_dma(nandc, &nandc->regs->erased_cw_detect_cfg_clr,
|
||||
+ NAND_ERASED_CW_DETECT_CFG, 1, 0);
|
||||
+ qcom_write_reg_dma(nandc, &nandc->regs->erased_cw_detect_cfg_set,
|
||||
+ NAND_ERASED_CW_DETECT_CFG, 1, NAND_ERASED_CW_SET | NAND_BAM_NEXT_SGL);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1204,17 +1203,17 @@ config_nand_cw_read(struct nand_chip *chip, bool use_ecc, int cw)
|
||||
reg = &nandc->regs->read_location_last0;
|
||||
|
||||
if (nandc->props->supports_bam)
|
||||
- write_reg_dma(nandc, reg, NAND_READ_LOCATION_0, 4, NAND_BAM_NEXT_SGL);
|
||||
+ qcom_write_reg_dma(nandc, reg, NAND_READ_LOCATION_0, 4, NAND_BAM_NEXT_SGL);
|
||||
|
||||
- write_reg_dma(nandc, &nandc->regs->cmd, NAND_FLASH_CMD, 1, NAND_BAM_NEXT_SGL);
|
||||
- write_reg_dma(nandc, &nandc->regs->exec, NAND_EXEC_CMD, 1, NAND_BAM_NEXT_SGL);
|
||||
+ qcom_write_reg_dma(nandc, &nandc->regs->cmd, NAND_FLASH_CMD, 1, NAND_BAM_NEXT_SGL);
|
||||
+ qcom_write_reg_dma(nandc, &nandc->regs->exec, NAND_EXEC_CMD, 1, NAND_BAM_NEXT_SGL);
|
||||
|
||||
if (use_ecc) {
|
||||
- read_reg_dma(nandc, NAND_FLASH_STATUS, 2, 0);
|
||||
- read_reg_dma(nandc, NAND_ERASED_CW_DETECT_STATUS, 1,
|
||||
- NAND_BAM_NEXT_SGL);
|
||||
+ qcom_read_reg_dma(nandc, NAND_FLASH_STATUS, 2, 0);
|
||||
+ qcom_read_reg_dma(nandc, NAND_ERASED_CW_DETECT_STATUS, 1,
|
||||
+ NAND_BAM_NEXT_SGL);
|
||||
} else {
|
||||
- read_reg_dma(nandc, NAND_FLASH_STATUS, 1, NAND_BAM_NEXT_SGL);
|
||||
+ qcom_read_reg_dma(nandc, NAND_FLASH_STATUS, 1, NAND_BAM_NEXT_SGL);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1238,11 +1237,11 @@ static void config_nand_page_write(struct nand_chip *chip)
|
||||
{
|
||||
struct qcom_nand_controller *nandc = get_qcom_nand_controller(chip);
|
||||
|
||||
- write_reg_dma(nandc, &nandc->regs->addr0, NAND_ADDR0, 2, 0);
|
||||
- write_reg_dma(nandc, &nandc->regs->cfg0, NAND_DEV0_CFG0, 3, 0);
|
||||
+ qcom_write_reg_dma(nandc, &nandc->regs->addr0, NAND_ADDR0, 2, 0);
|
||||
+ qcom_write_reg_dma(nandc, &nandc->regs->cfg0, NAND_DEV0_CFG0, 3, 0);
|
||||
if (!nandc->props->qpic_version2)
|
||||
- write_reg_dma(nandc, &nandc->regs->ecc_buf_cfg, NAND_EBI2_ECC_BUF_CFG, 1,
|
||||
- NAND_BAM_NEXT_SGL);
|
||||
+ qcom_write_reg_dma(nandc, &nandc->regs->ecc_buf_cfg, NAND_EBI2_ECC_BUF_CFG, 1,
|
||||
+ NAND_BAM_NEXT_SGL);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1253,17 +1252,18 @@ static void config_nand_cw_write(struct nand_chip *chip)
|
||||
{
|
||||
struct qcom_nand_controller *nandc = get_qcom_nand_controller(chip);
|
||||
|
||||
- write_reg_dma(nandc, &nandc->regs->cmd, NAND_FLASH_CMD, 1, NAND_BAM_NEXT_SGL);
|
||||
- write_reg_dma(nandc, &nandc->regs->exec, NAND_EXEC_CMD, 1, NAND_BAM_NEXT_SGL);
|
||||
+ qcom_write_reg_dma(nandc, &nandc->regs->cmd, NAND_FLASH_CMD, 1, NAND_BAM_NEXT_SGL);
|
||||
+ qcom_write_reg_dma(nandc, &nandc->regs->exec, NAND_EXEC_CMD, 1, NAND_BAM_NEXT_SGL);
|
||||
|
||||
- read_reg_dma(nandc, NAND_FLASH_STATUS, 1, NAND_BAM_NEXT_SGL);
|
||||
+ qcom_read_reg_dma(nandc, NAND_FLASH_STATUS, 1, NAND_BAM_NEXT_SGL);
|
||||
|
||||
- write_reg_dma(nandc, &nandc->regs->clrflashstatus, NAND_FLASH_STATUS, 1, 0);
|
||||
- write_reg_dma(nandc, &nandc->regs->clrreadstatus, NAND_READ_STATUS, 1, NAND_BAM_NEXT_SGL);
|
||||
+ qcom_write_reg_dma(nandc, &nandc->regs->clrflashstatus, NAND_FLASH_STATUS, 1, 0);
|
||||
+ qcom_write_reg_dma(nandc, &nandc->regs->clrreadstatus, NAND_READ_STATUS, 1,
|
||||
+ NAND_BAM_NEXT_SGL);
|
||||
}
|
||||
|
||||
/* helpers to submit/free our list of dma descriptors */
|
||||
-static int submit_descs(struct qcom_nand_controller *nandc)
|
||||
+static int qcom_submit_descs(struct qcom_nand_controller *nandc)
|
||||
{
|
||||
struct desc_info *desc, *n;
|
||||
dma_cookie_t cookie = 0;
|
||||
@@ -1272,21 +1272,21 @@ static int submit_descs(struct qcom_nand_controller *nandc)
|
||||
|
||||
if (nandc->props->supports_bam) {
|
||||
if (bam_txn->rx_sgl_pos > bam_txn->rx_sgl_start) {
|
||||
- ret = prepare_bam_async_desc(nandc, nandc->rx_chan, 0);
|
||||
+ ret = qcom_prepare_bam_async_desc(nandc, nandc->rx_chan, 0);
|
||||
if (ret)
|
||||
goto err_unmap_free_desc;
|
||||
}
|
||||
|
||||
if (bam_txn->tx_sgl_pos > bam_txn->tx_sgl_start) {
|
||||
- ret = prepare_bam_async_desc(nandc, nandc->tx_chan,
|
||||
- DMA_PREP_INTERRUPT);
|
||||
+ ret = qcom_prepare_bam_async_desc(nandc, nandc->tx_chan,
|
||||
+ DMA_PREP_INTERRUPT);
|
||||
if (ret)
|
||||
goto err_unmap_free_desc;
|
||||
}
|
||||
|
||||
if (bam_txn->cmd_sgl_pos > bam_txn->cmd_sgl_start) {
|
||||
- ret = prepare_bam_async_desc(nandc, nandc->cmd_chan,
|
||||
- DMA_PREP_CMD);
|
||||
+ ret = qcom_prepare_bam_async_desc(nandc, nandc->cmd_chan,
|
||||
+ DMA_PREP_CMD);
|
||||
if (ret)
|
||||
goto err_unmap_free_desc;
|
||||
}
|
||||
@@ -1296,7 +1296,7 @@ static int submit_descs(struct qcom_nand_controller *nandc)
|
||||
cookie = dmaengine_submit(desc->dma_desc);
|
||||
|
||||
if (nandc->props->supports_bam) {
|
||||
- bam_txn->last_cmd_desc->callback = qpic_bam_dma_done;
|
||||
+ bam_txn->last_cmd_desc->callback = qcom_qpic_bam_dma_done;
|
||||
bam_txn->last_cmd_desc->callback_param = bam_txn;
|
||||
|
||||
dma_async_issue_pending(nandc->tx_chan);
|
||||
@@ -1314,7 +1314,7 @@ static int submit_descs(struct qcom_nand_controller *nandc)
|
||||
err_unmap_free_desc:
|
||||
/*
|
||||
* Unmap the dma sg_list and free the desc allocated by both
|
||||
- * prepare_bam_async_desc() and prep_adm_dma_desc() functions.
|
||||
+ * qcom_prepare_bam_async_desc() and qcom_prep_adm_dma_desc() functions.
|
||||
*/
|
||||
list_for_each_entry_safe(desc, n, &nandc->desc_list, node) {
|
||||
list_del(&desc->node);
|
||||
@@ -1333,10 +1333,10 @@ static int submit_descs(struct qcom_nand_controller *nandc)
|
||||
}
|
||||
|
||||
/* reset the register read buffer for next NAND operation */
|
||||
-static void clear_read_regs(struct qcom_nand_controller *nandc)
|
||||
+static void qcom_clear_read_regs(struct qcom_nand_controller *nandc)
|
||||
{
|
||||
nandc->reg_read_pos = 0;
|
||||
- nandc_dev_to_mem(nandc, false);
|
||||
+ qcom_nandc_dev_to_mem(nandc, false);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1400,7 +1400,7 @@ static int check_flash_errors(struct qcom_nand_host *host, int cw_cnt)
|
||||
struct qcom_nand_controller *nandc = get_qcom_nand_controller(chip);
|
||||
int i;
|
||||
|
||||
- nandc_dev_to_mem(nandc, true);
|
||||
+ qcom_nandc_dev_to_mem(nandc, true);
|
||||
|
||||
for (i = 0; i < cw_cnt; i++) {
|
||||
u32 flash = le32_to_cpu(nandc->reg_read_buf[i]);
|
||||
@@ -1427,13 +1427,13 @@ qcom_nandc_read_cw_raw(struct mtd_info *mtd, struct nand_chip *chip,
|
||||
nand_read_page_op(chip, page, 0, NULL, 0);
|
||||
nandc->buf_count = 0;
|
||||
nandc->buf_start = 0;
|
||||
- clear_read_regs(nandc);
|
||||
+ qcom_clear_read_regs(nandc);
|
||||
host->use_ecc = false;
|
||||
|
||||
if (nandc->props->qpic_version2)
|
||||
raw_cw = ecc->steps - 1;
|
||||
|
||||
- clear_bam_transaction(nandc);
|
||||
+ qcom_clear_bam_transaction(nandc);
|
||||
set_address(host, host->cw_size * cw, page);
|
||||
update_rw_regs(host, 1, true, raw_cw);
|
||||
config_nand_page_read(chip);
|
||||
@@ -1466,18 +1466,18 @@ qcom_nandc_read_cw_raw(struct mtd_info *mtd, struct nand_chip *chip,
|
||||
|
||||
config_nand_cw_read(chip, false, raw_cw);
|
||||
|
||||
- read_data_dma(nandc, reg_off, data_buf, data_size1, 0);
|
||||
+ qcom_read_data_dma(nandc, reg_off, data_buf, data_size1, 0);
|
||||
reg_off += data_size1;
|
||||
|
||||
- read_data_dma(nandc, reg_off, oob_buf, oob_size1, 0);
|
||||
+ qcom_read_data_dma(nandc, reg_off, oob_buf, oob_size1, 0);
|
||||
reg_off += oob_size1;
|
||||
|
||||
- read_data_dma(nandc, reg_off, data_buf + data_size1, data_size2, 0);
|
||||
+ qcom_read_data_dma(nandc, reg_off, data_buf + data_size1, data_size2, 0);
|
||||
reg_off += data_size2;
|
||||
|
||||
- read_data_dma(nandc, reg_off, oob_buf + oob_size1, oob_size2, 0);
|
||||
+ qcom_read_data_dma(nandc, reg_off, oob_buf + oob_size1, oob_size2, 0);
|
||||
|
||||
- ret = submit_descs(nandc);
|
||||
+ ret = qcom_submit_descs(nandc);
|
||||
if (ret) {
|
||||
dev_err(nandc->dev, "failure to read raw cw %d\n", cw);
|
||||
return ret;
|
||||
@@ -1575,7 +1575,7 @@ static int parse_read_errors(struct qcom_nand_host *host, u8 *data_buf,
|
||||
u8 *data_buf_start = data_buf, *oob_buf_start = oob_buf;
|
||||
|
||||
buf = (struct read_stats *)nandc->reg_read_buf;
|
||||
- nandc_dev_to_mem(nandc, true);
|
||||
+ qcom_nandc_dev_to_mem(nandc, true);
|
||||
|
||||
for (i = 0; i < ecc->steps; i++, buf++) {
|
||||
u32 flash, buffer, erased_cw;
|
||||
@@ -1704,8 +1704,8 @@ static int read_page_ecc(struct qcom_nand_host *host, u8 *data_buf,
|
||||
config_nand_cw_read(chip, true, i);
|
||||
|
||||
if (data_buf)
|
||||
- read_data_dma(nandc, FLASH_BUF_ACC, data_buf,
|
||||
- data_size, 0);
|
||||
+ qcom_read_data_dma(nandc, FLASH_BUF_ACC, data_buf,
|
||||
+ data_size, 0);
|
||||
|
||||
/*
|
||||
* when ecc is enabled, the controller doesn't read the real
|
||||
@@ -1720,8 +1720,8 @@ static int read_page_ecc(struct qcom_nand_host *host, u8 *data_buf,
|
||||
for (j = 0; j < host->bbm_size; j++)
|
||||
*oob_buf++ = 0xff;
|
||||
|
||||
- read_data_dma(nandc, FLASH_BUF_ACC + data_size,
|
||||
- oob_buf, oob_size, 0);
|
||||
+ qcom_read_data_dma(nandc, FLASH_BUF_ACC + data_size,
|
||||
+ oob_buf, oob_size, 0);
|
||||
}
|
||||
|
||||
if (data_buf)
|
||||
@@ -1730,7 +1730,7 @@ static int read_page_ecc(struct qcom_nand_host *host, u8 *data_buf,
|
||||
oob_buf += oob_size;
|
||||
}
|
||||
|
||||
- ret = submit_descs(nandc);
|
||||
+ ret = qcom_submit_descs(nandc);
|
||||
if (ret) {
|
||||
dev_err(nandc->dev, "failure to read page/oob\n");
|
||||
return ret;
|
||||
@@ -1751,7 +1751,7 @@ static int copy_last_cw(struct qcom_nand_host *host, int page)
|
||||
int size;
|
||||
int ret;
|
||||
|
||||
- clear_read_regs(nandc);
|
||||
+ qcom_clear_read_regs(nandc);
|
||||
|
||||
size = host->use_ecc ? host->cw_data : host->cw_size;
|
||||
|
||||
@@ -1763,9 +1763,9 @@ static int copy_last_cw(struct qcom_nand_host *host, int page)
|
||||
|
||||
config_nand_single_cw_page_read(chip, host->use_ecc, ecc->steps - 1);
|
||||
|
||||
- read_data_dma(nandc, FLASH_BUF_ACC, nandc->data_buffer, size, 0);
|
||||
+ qcom_read_data_dma(nandc, FLASH_BUF_ACC, nandc->data_buffer, size, 0);
|
||||
|
||||
- ret = submit_descs(nandc);
|
||||
+ ret = qcom_submit_descs(nandc);
|
||||
if (ret)
|
||||
dev_err(nandc->dev, "failed to copy last codeword\n");
|
||||
|
||||
@@ -1851,14 +1851,14 @@ static int qcom_nandc_read_page(struct nand_chip *chip, u8 *buf,
|
||||
nandc->buf_count = 0;
|
||||
nandc->buf_start = 0;
|
||||
host->use_ecc = true;
|
||||
- clear_read_regs(nandc);
|
||||
+ qcom_clear_read_regs(nandc);
|
||||
set_address(host, 0, page);
|
||||
update_rw_regs(host, ecc->steps, true, 0);
|
||||
|
||||
data_buf = buf;
|
||||
oob_buf = oob_required ? chip->oob_poi : NULL;
|
||||
|
||||
- clear_bam_transaction(nandc);
|
||||
+ qcom_clear_bam_transaction(nandc);
|
||||
|
||||
return read_page_ecc(host, data_buf, oob_buf, page);
|
||||
}
|
||||
@@ -1899,8 +1899,8 @@ static int qcom_nandc_read_oob(struct nand_chip *chip, int page)
|
||||
if (host->nr_boot_partitions)
|
||||
qcom_nandc_codeword_fixup(host, page);
|
||||
|
||||
- clear_read_regs(nandc);
|
||||
- clear_bam_transaction(nandc);
|
||||
+ qcom_clear_read_regs(nandc);
|
||||
+ qcom_clear_bam_transaction(nandc);
|
||||
|
||||
host->use_ecc = true;
|
||||
set_address(host, 0, page);
|
||||
@@ -1927,8 +1927,8 @@ static int qcom_nandc_write_page(struct nand_chip *chip, const u8 *buf,
|
||||
set_address(host, 0, page);
|
||||
nandc->buf_count = 0;
|
||||
nandc->buf_start = 0;
|
||||
- clear_read_regs(nandc);
|
||||
- clear_bam_transaction(nandc);
|
||||
+ qcom_clear_read_regs(nandc);
|
||||
+ qcom_clear_bam_transaction(nandc);
|
||||
|
||||
data_buf = (u8 *)buf;
|
||||
oob_buf = chip->oob_poi;
|
||||
@@ -1949,8 +1949,8 @@ static int qcom_nandc_write_page(struct nand_chip *chip, const u8 *buf,
|
||||
oob_size = ecc->bytes;
|
||||
}
|
||||
|
||||
- write_data_dma(nandc, FLASH_BUF_ACC, data_buf, data_size,
|
||||
- i == (ecc->steps - 1) ? NAND_BAM_NO_EOT : 0);
|
||||
+ qcom_write_data_dma(nandc, FLASH_BUF_ACC, data_buf, data_size,
|
||||
+ i == (ecc->steps - 1) ? NAND_BAM_NO_EOT : 0);
|
||||
|
||||
/*
|
||||
* when ECC is enabled, we don't really need to write anything
|
||||
@@ -1962,8 +1962,8 @@ static int qcom_nandc_write_page(struct nand_chip *chip, const u8 *buf,
|
||||
if (qcom_nandc_is_last_cw(ecc, i)) {
|
||||
oob_buf += host->bbm_size;
|
||||
|
||||
- write_data_dma(nandc, FLASH_BUF_ACC + data_size,
|
||||
- oob_buf, oob_size, 0);
|
||||
+ qcom_write_data_dma(nandc, FLASH_BUF_ACC + data_size,
|
||||
+ oob_buf, oob_size, 0);
|
||||
}
|
||||
|
||||
config_nand_cw_write(chip);
|
||||
@@ -1972,7 +1972,7 @@ static int qcom_nandc_write_page(struct nand_chip *chip, const u8 *buf,
|
||||
oob_buf += oob_size;
|
||||
}
|
||||
|
||||
- ret = submit_descs(nandc);
|
||||
+ ret = qcom_submit_descs(nandc);
|
||||
if (ret) {
|
||||
dev_err(nandc->dev, "failure to write page\n");
|
||||
return ret;
|
||||
@@ -1997,8 +1997,8 @@ static int qcom_nandc_write_page_raw(struct nand_chip *chip,
|
||||
qcom_nandc_codeword_fixup(host, page);
|
||||
|
||||
nand_prog_page_begin_op(chip, page, 0, NULL, 0);
|
||||
- clear_read_regs(nandc);
|
||||
- clear_bam_transaction(nandc);
|
||||
+ qcom_clear_read_regs(nandc);
|
||||
+ qcom_clear_bam_transaction(nandc);
|
||||
|
||||
data_buf = (u8 *)buf;
|
||||
oob_buf = chip->oob_poi;
|
||||
@@ -2024,28 +2024,28 @@ static int qcom_nandc_write_page_raw(struct nand_chip *chip,
|
||||
oob_size2 = host->ecc_bytes_hw + host->spare_bytes;
|
||||
}
|
||||
|
||||
- write_data_dma(nandc, reg_off, data_buf, data_size1,
|
||||
- NAND_BAM_NO_EOT);
|
||||
+ qcom_write_data_dma(nandc, reg_off, data_buf, data_size1,
|
||||
+ NAND_BAM_NO_EOT);
|
||||
reg_off += data_size1;
|
||||
data_buf += data_size1;
|
||||
|
||||
- write_data_dma(nandc, reg_off, oob_buf, oob_size1,
|
||||
- NAND_BAM_NO_EOT);
|
||||
+ qcom_write_data_dma(nandc, reg_off, oob_buf, oob_size1,
|
||||
+ NAND_BAM_NO_EOT);
|
||||
reg_off += oob_size1;
|
||||
oob_buf += oob_size1;
|
||||
|
||||
- write_data_dma(nandc, reg_off, data_buf, data_size2,
|
||||
- NAND_BAM_NO_EOT);
|
||||
+ qcom_write_data_dma(nandc, reg_off, data_buf, data_size2,
|
||||
+ NAND_BAM_NO_EOT);
|
||||
reg_off += data_size2;
|
||||
data_buf += data_size2;
|
||||
|
||||
- write_data_dma(nandc, reg_off, oob_buf, oob_size2, 0);
|
||||
+ qcom_write_data_dma(nandc, reg_off, oob_buf, oob_size2, 0);
|
||||
oob_buf += oob_size2;
|
||||
|
||||
config_nand_cw_write(chip);
|
||||
}
|
||||
|
||||
- ret = submit_descs(nandc);
|
||||
+ ret = qcom_submit_descs(nandc);
|
||||
if (ret) {
|
||||
dev_err(nandc->dev, "failure to write raw page\n");
|
||||
return ret;
|
||||
@@ -2075,7 +2075,7 @@ static int qcom_nandc_write_oob(struct nand_chip *chip, int page)
|
||||
qcom_nandc_codeword_fixup(host, page);
|
||||
|
||||
host->use_ecc = true;
|
||||
- clear_bam_transaction(nandc);
|
||||
+ qcom_clear_bam_transaction(nandc);
|
||||
|
||||
/* calculate the data and oob size for the last codeword/step */
|
||||
data_size = ecc->size - ((ecc->steps - 1) << 2);
|
||||
@@ -2090,11 +2090,11 @@ static int qcom_nandc_write_oob(struct nand_chip *chip, int page)
|
||||
update_rw_regs(host, 1, false, 0);
|
||||
|
||||
config_nand_page_write(chip);
|
||||
- write_data_dma(nandc, FLASH_BUF_ACC,
|
||||
- nandc->data_buffer, data_size + oob_size, 0);
|
||||
+ qcom_write_data_dma(nandc, FLASH_BUF_ACC,
|
||||
+ nandc->data_buffer, data_size + oob_size, 0);
|
||||
config_nand_cw_write(chip);
|
||||
|
||||
- ret = submit_descs(nandc);
|
||||
+ ret = qcom_submit_descs(nandc);
|
||||
if (ret) {
|
||||
dev_err(nandc->dev, "failure to write oob\n");
|
||||
return ret;
|
||||
@@ -2121,7 +2121,7 @@ static int qcom_nandc_block_bad(struct nand_chip *chip, loff_t ofs)
|
||||
*/
|
||||
host->use_ecc = false;
|
||||
|
||||
- clear_bam_transaction(nandc);
|
||||
+ qcom_clear_bam_transaction(nandc);
|
||||
ret = copy_last_cw(host, page);
|
||||
if (ret)
|
||||
goto err;
|
||||
@@ -2148,8 +2148,8 @@ static int qcom_nandc_block_markbad(struct nand_chip *chip, loff_t ofs)
|
||||
struct nand_ecc_ctrl *ecc = &chip->ecc;
|
||||
int page, ret;
|
||||
|
||||
- clear_read_regs(nandc);
|
||||
- clear_bam_transaction(nandc);
|
||||
+ qcom_clear_read_regs(nandc);
|
||||
+ qcom_clear_bam_transaction(nandc);
|
||||
|
||||
/*
|
||||
* to mark the BBM as bad, we flash the entire last codeword with 0s.
|
||||
@@ -2166,11 +2166,11 @@ static int qcom_nandc_block_markbad(struct nand_chip *chip, loff_t ofs)
|
||||
update_rw_regs(host, 1, false, ecc->steps - 1);
|
||||
|
||||
config_nand_page_write(chip);
|
||||
- write_data_dma(nandc, FLASH_BUF_ACC,
|
||||
- nandc->data_buffer, host->cw_size, 0);
|
||||
+ qcom_write_data_dma(nandc, FLASH_BUF_ACC,
|
||||
+ nandc->data_buffer, host->cw_size, 0);
|
||||
config_nand_cw_write(chip);
|
||||
|
||||
- ret = submit_descs(nandc);
|
||||
+ ret = qcom_submit_descs(nandc);
|
||||
if (ret) {
|
||||
dev_err(nandc->dev, "failure to update BBM\n");
|
||||
return ret;
|
||||
@@ -2410,14 +2410,14 @@ static int qcom_nand_attach_chip(struct nand_chip *chip)
|
||||
mtd_set_ooblayout(mtd, &qcom_nand_ooblayout_ops);
|
||||
/* Free the initially allocated BAM transaction for reading the ONFI params */
|
||||
if (nandc->props->supports_bam)
|
||||
- free_bam_transaction(nandc);
|
||||
+ qcom_free_bam_transaction(nandc);
|
||||
|
||||
nandc->max_cwperpage = max_t(unsigned int, nandc->max_cwperpage,
|
||||
cwperpage);
|
||||
|
||||
/* Now allocate the BAM transaction based on updated max_cwperpage */
|
||||
if (nandc->props->supports_bam) {
|
||||
- nandc->bam_txn = alloc_bam_transaction(nandc);
|
||||
+ nandc->bam_txn = qcom_alloc_bam_transaction(nandc);
|
||||
if (!nandc->bam_txn) {
|
||||
dev_err(nandc->dev,
|
||||
"failed to allocate bam transaction\n");
|
||||
@@ -2617,7 +2617,7 @@ static int qcom_wait_rdy_poll(struct nand_chip *chip, unsigned int time_ms)
|
||||
unsigned long start = jiffies + msecs_to_jiffies(time_ms);
|
||||
u32 flash;
|
||||
|
||||
- nandc_dev_to_mem(nandc, true);
|
||||
+ qcom_nandc_dev_to_mem(nandc, true);
|
||||
|
||||
do {
|
||||
flash = le32_to_cpu(nandc->reg_read_buf[0]);
|
||||
@@ -2657,23 +2657,23 @@ static int qcom_read_status_exec(struct nand_chip *chip,
|
||||
nandc->buf_start = 0;
|
||||
host->use_ecc = false;
|
||||
|
||||
- clear_read_regs(nandc);
|
||||
- clear_bam_transaction(nandc);
|
||||
+ qcom_clear_read_regs(nandc);
|
||||
+ qcom_clear_bam_transaction(nandc);
|
||||
|
||||
nandc->regs->cmd = q_op.cmd_reg;
|
||||
nandc->regs->exec = cpu_to_le32(1);
|
||||
|
||||
- write_reg_dma(nandc, &nandc->regs->cmd, NAND_FLASH_CMD, 1, NAND_BAM_NEXT_SGL);
|
||||
- write_reg_dma(nandc, &nandc->regs->exec, NAND_EXEC_CMD, 1, NAND_BAM_NEXT_SGL);
|
||||
- read_reg_dma(nandc, NAND_FLASH_STATUS, 1, NAND_BAM_NEXT_SGL);
|
||||
+ qcom_write_reg_dma(nandc, &nandc->regs->cmd, NAND_FLASH_CMD, 1, NAND_BAM_NEXT_SGL);
|
||||
+ qcom_write_reg_dma(nandc, &nandc->regs->exec, NAND_EXEC_CMD, 1, NAND_BAM_NEXT_SGL);
|
||||
+ qcom_read_reg_dma(nandc, NAND_FLASH_STATUS, 1, NAND_BAM_NEXT_SGL);
|
||||
|
||||
- ret = submit_descs(nandc);
|
||||
+ ret = qcom_submit_descs(nandc);
|
||||
if (ret) {
|
||||
dev_err(nandc->dev, "failure in submitting status descriptor\n");
|
||||
goto err_out;
|
||||
}
|
||||
|
||||
- nandc_dev_to_mem(nandc, true);
|
||||
+ qcom_nandc_dev_to_mem(nandc, true);
|
||||
|
||||
for (i = 0; i < num_cw; i++) {
|
||||
flash_status = le32_to_cpu(nandc->reg_read_buf[i]);
|
||||
@@ -2714,8 +2714,8 @@ static int qcom_read_id_type_exec(struct nand_chip *chip, const struct nand_subo
|
||||
nandc->buf_start = 0;
|
||||
host->use_ecc = false;
|
||||
|
||||
- clear_read_regs(nandc);
|
||||
- clear_bam_transaction(nandc);
|
||||
+ qcom_clear_read_regs(nandc);
|
||||
+ qcom_clear_bam_transaction(nandc);
|
||||
|
||||
nandc->regs->cmd = q_op.cmd_reg;
|
||||
nandc->regs->addr0 = q_op.addr1_reg;
|
||||
@@ -2723,12 +2723,12 @@ static int qcom_read_id_type_exec(struct nand_chip *chip, const struct nand_subo
|
||||
nandc->regs->chip_sel = cpu_to_le32(nandc->props->supports_bam ? 0 : DM_EN);
|
||||
nandc->regs->exec = cpu_to_le32(1);
|
||||
|
||||
- write_reg_dma(nandc, &nandc->regs->cmd, NAND_FLASH_CMD, 4, NAND_BAM_NEXT_SGL);
|
||||
- write_reg_dma(nandc, &nandc->regs->exec, NAND_EXEC_CMD, 1, NAND_BAM_NEXT_SGL);
|
||||
+ qcom_write_reg_dma(nandc, &nandc->regs->cmd, NAND_FLASH_CMD, 4, NAND_BAM_NEXT_SGL);
|
||||
+ qcom_write_reg_dma(nandc, &nandc->regs->exec, NAND_EXEC_CMD, 1, NAND_BAM_NEXT_SGL);
|
||||
|
||||
- read_reg_dma(nandc, NAND_READ_ID, 1, NAND_BAM_NEXT_SGL);
|
||||
+ qcom_read_reg_dma(nandc, NAND_READ_ID, 1, NAND_BAM_NEXT_SGL);
|
||||
|
||||
- ret = submit_descs(nandc);
|
||||
+ ret = qcom_submit_descs(nandc);
|
||||
if (ret) {
|
||||
dev_err(nandc->dev, "failure in submitting read id descriptor\n");
|
||||
goto err_out;
|
||||
@@ -2738,7 +2738,7 @@ static int qcom_read_id_type_exec(struct nand_chip *chip, const struct nand_subo
|
||||
op_id = q_op.data_instr_idx;
|
||||
len = nand_subop_get_data_len(subop, op_id);
|
||||
|
||||
- nandc_dev_to_mem(nandc, true);
|
||||
+ qcom_nandc_dev_to_mem(nandc, true);
|
||||
memcpy(instr->ctx.data.buf.in, nandc->reg_read_buf, len);
|
||||
|
||||
err_out:
|
||||
@@ -2774,20 +2774,20 @@ static int qcom_misc_cmd_type_exec(struct nand_chip *chip, const struct nand_sub
|
||||
nandc->buf_start = 0;
|
||||
host->use_ecc = false;
|
||||
|
||||
- clear_read_regs(nandc);
|
||||
- clear_bam_transaction(nandc);
|
||||
+ qcom_clear_read_regs(nandc);
|
||||
+ qcom_clear_bam_transaction(nandc);
|
||||
|
||||
nandc->regs->cmd = q_op.cmd_reg;
|
||||
nandc->regs->exec = cpu_to_le32(1);
|
||||
|
||||
- write_reg_dma(nandc, &nandc->regs->cmd, NAND_FLASH_CMD, instrs, NAND_BAM_NEXT_SGL);
|
||||
+ qcom_write_reg_dma(nandc, &nandc->regs->cmd, NAND_FLASH_CMD, instrs, NAND_BAM_NEXT_SGL);
|
||||
if (q_op.cmd_reg == cpu_to_le32(OP_BLOCK_ERASE))
|
||||
- write_reg_dma(nandc, &nandc->regs->cfg0, NAND_DEV0_CFG0, 2, NAND_BAM_NEXT_SGL);
|
||||
+ qcom_write_reg_dma(nandc, &nandc->regs->cfg0, NAND_DEV0_CFG0, 2, NAND_BAM_NEXT_SGL);
|
||||
|
||||
- write_reg_dma(nandc, &nandc->regs->exec, NAND_EXEC_CMD, 1, NAND_BAM_NEXT_SGL);
|
||||
- read_reg_dma(nandc, NAND_FLASH_STATUS, 1, NAND_BAM_NEXT_SGL);
|
||||
+ qcom_write_reg_dma(nandc, &nandc->regs->exec, NAND_EXEC_CMD, 1, NAND_BAM_NEXT_SGL);
|
||||
+ qcom_read_reg_dma(nandc, NAND_FLASH_STATUS, 1, NAND_BAM_NEXT_SGL);
|
||||
|
||||
- ret = submit_descs(nandc);
|
||||
+ ret = qcom_submit_descs(nandc);
|
||||
if (ret) {
|
||||
dev_err(nandc->dev, "failure in submitting misc descriptor\n");
|
||||
goto err_out;
|
||||
@@ -2820,8 +2820,8 @@ static int qcom_param_page_type_exec(struct nand_chip *chip, const struct nand_
|
||||
nandc->buf_count = 0;
|
||||
nandc->buf_start = 0;
|
||||
host->use_ecc = false;
|
||||
- clear_read_regs(nandc);
|
||||
- clear_bam_transaction(nandc);
|
||||
+ qcom_clear_read_regs(nandc);
|
||||
+ qcom_clear_bam_transaction(nandc);
|
||||
|
||||
nandc->regs->cmd = q_op.cmd_reg;
|
||||
nandc->regs->addr0 = 0;
|
||||
@@ -2864,8 +2864,8 @@ static int qcom_param_page_type_exec(struct nand_chip *chip, const struct nand_
|
||||
nandc_set_read_loc(chip, 0, 0, 0, len, 1);
|
||||
|
||||
if (!nandc->props->qpic_version2) {
|
||||
- write_reg_dma(nandc, &nandc->regs->vld, NAND_DEV_CMD_VLD, 1, 0);
|
||||
- write_reg_dma(nandc, &nandc->regs->cmd1, NAND_DEV_CMD1, 1, NAND_BAM_NEXT_SGL);
|
||||
+ qcom_write_reg_dma(nandc, &nandc->regs->vld, NAND_DEV_CMD_VLD, 1, 0);
|
||||
+ qcom_write_reg_dma(nandc, &nandc->regs->cmd1, NAND_DEV_CMD1, 1, NAND_BAM_NEXT_SGL);
|
||||
}
|
||||
|
||||
nandc->buf_count = len;
|
||||
@@ -2873,17 +2873,17 @@ static int qcom_param_page_type_exec(struct nand_chip *chip, const struct nand_
|
||||
|
||||
config_nand_single_cw_page_read(chip, false, 0);
|
||||
|
||||
- read_data_dma(nandc, FLASH_BUF_ACC, nandc->data_buffer,
|
||||
- nandc->buf_count, 0);
|
||||
+ qcom_read_data_dma(nandc, FLASH_BUF_ACC, nandc->data_buffer,
|
||||
+ nandc->buf_count, 0);
|
||||
|
||||
/* restore CMD1 and VLD regs */
|
||||
if (!nandc->props->qpic_version2) {
|
||||
- write_reg_dma(nandc, &nandc->regs->orig_cmd1, NAND_DEV_CMD1_RESTORE, 1, 0);
|
||||
- write_reg_dma(nandc, &nandc->regs->orig_vld, NAND_DEV_CMD_VLD_RESTORE, 1,
|
||||
- NAND_BAM_NEXT_SGL);
|
||||
+ qcom_write_reg_dma(nandc, &nandc->regs->orig_cmd1, NAND_DEV_CMD1_RESTORE, 1, 0);
|
||||
+ qcom_write_reg_dma(nandc, &nandc->regs->orig_vld, NAND_DEV_CMD_VLD_RESTORE, 1,
|
||||
+ NAND_BAM_NEXT_SGL);
|
||||
}
|
||||
|
||||
- ret = submit_descs(nandc);
|
||||
+ ret = qcom_submit_descs(nandc);
|
||||
if (ret) {
|
||||
dev_err(nandc->dev, "failure in submitting param page descriptor\n");
|
||||
goto err_out;
|
||||
@@ -3067,7 +3067,7 @@ static int qcom_nandc_alloc(struct qcom_nand_controller *nandc)
|
||||
* maximum codeword size
|
||||
*/
|
||||
nandc->max_cwperpage = 1;
|
||||
- nandc->bam_txn = alloc_bam_transaction(nandc);
|
||||
+ nandc->bam_txn = qcom_alloc_bam_transaction(nandc);
|
||||
if (!nandc->bam_txn) {
|
||||
dev_err(nandc->dev,
|
||||
"failed to allocate bam transaction\n");
|
||||
--
|
||||
2.47.1
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,204 @@
|
||||
From 0c08080fd71cd5dd59643104b39d3c89d793ab3c Mon Sep 17 00:00:00 2001
|
||||
From: Md Sadre Alam <quic_mdalam@quicinc.com>
|
||||
Date: Wed, 20 Nov 2024 14:45:03 +0530
|
||||
Subject: [PATCH 4/4] mtd: rawnand: qcom: use FIELD_PREP and GENMASK
|
||||
|
||||
Use the bitfield macro FIELD_PREP, and GENMASK to
|
||||
do the shift and mask in one go. This makes the code
|
||||
more readable.
|
||||
|
||||
Reviewed-by: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com>
|
||||
Signed-off-by: Md Sadre Alam <quic_mdalam@quicinc.com>
|
||||
Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
|
||||
---
|
||||
drivers/mtd/nand/raw/qcom_nandc.c | 97 ++++++++++++++--------------
|
||||
include/linux/mtd/nand-qpic-common.h | 31 +++++----
|
||||
2 files changed, 67 insertions(+), 61 deletions(-)
|
||||
|
||||
diff --git a/drivers/mtd/nand/raw/qcom_nandc.c b/drivers/mtd/nand/raw/qcom_nandc.c
|
||||
index dcb62fd19dd7..d2d2aeee42a7 100644
|
||||
--- a/drivers/mtd/nand/raw/qcom_nandc.c
|
||||
+++ b/drivers/mtd/nand/raw/qcom_nandc.c
|
||||
@@ -281,7 +281,7 @@ static void update_rw_regs(struct qcom_nand_host *host, int num_cw, bool read, i
|
||||
(num_cw - 1) << CW_PER_PAGE);
|
||||
|
||||
cfg1 = cpu_to_le32(host->cfg1_raw);
|
||||
- ecc_bch_cfg = cpu_to_le32(1 << ECC_CFG_ECC_DISABLE);
|
||||
+ ecc_bch_cfg = cpu_to_le32(ECC_CFG_ECC_DISABLE);
|
||||
}
|
||||
|
||||
nandc->regs->cmd = cmd;
|
||||
@@ -1494,42 +1494,41 @@ static int qcom_nand_attach_chip(struct nand_chip *chip)
|
||||
host->cw_size = host->cw_data + ecc->bytes;
|
||||
bad_block_byte = mtd->writesize - host->cw_size * (cwperpage - 1) + 1;
|
||||
|
||||
- host->cfg0 = (cwperpage - 1) << CW_PER_PAGE
|
||||
- | host->cw_data << UD_SIZE_BYTES
|
||||
- | 0 << DISABLE_STATUS_AFTER_WRITE
|
||||
- | 5 << NUM_ADDR_CYCLES
|
||||
- | host->ecc_bytes_hw << ECC_PARITY_SIZE_BYTES_RS
|
||||
- | 0 << STATUS_BFR_READ
|
||||
- | 1 << SET_RD_MODE_AFTER_STATUS
|
||||
- | host->spare_bytes << SPARE_SIZE_BYTES;
|
||||
-
|
||||
- host->cfg1 = 7 << NAND_RECOVERY_CYCLES
|
||||
- | 0 << CS_ACTIVE_BSY
|
||||
- | bad_block_byte << BAD_BLOCK_BYTE_NUM
|
||||
- | 0 << BAD_BLOCK_IN_SPARE_AREA
|
||||
- | 2 << WR_RD_BSY_GAP
|
||||
- | wide_bus << WIDE_FLASH
|
||||
- | host->bch_enabled << ENABLE_BCH_ECC;
|
||||
-
|
||||
- host->cfg0_raw = (cwperpage - 1) << CW_PER_PAGE
|
||||
- | host->cw_size << UD_SIZE_BYTES
|
||||
- | 5 << NUM_ADDR_CYCLES
|
||||
- | 0 << SPARE_SIZE_BYTES;
|
||||
-
|
||||
- host->cfg1_raw = 7 << NAND_RECOVERY_CYCLES
|
||||
- | 0 << CS_ACTIVE_BSY
|
||||
- | 17 << BAD_BLOCK_BYTE_NUM
|
||||
- | 1 << BAD_BLOCK_IN_SPARE_AREA
|
||||
- | 2 << WR_RD_BSY_GAP
|
||||
- | wide_bus << WIDE_FLASH
|
||||
- | 1 << DEV0_CFG1_ECC_DISABLE;
|
||||
-
|
||||
- host->ecc_bch_cfg = !host->bch_enabled << ECC_CFG_ECC_DISABLE
|
||||
- | 0 << ECC_SW_RESET
|
||||
- | host->cw_data << ECC_NUM_DATA_BYTES
|
||||
- | 1 << ECC_FORCE_CLK_OPEN
|
||||
- | ecc_mode << ECC_MODE
|
||||
- | host->ecc_bytes_hw << ECC_PARITY_SIZE_BYTES_BCH;
|
||||
+ host->cfg0 = FIELD_PREP(CW_PER_PAGE_MASK, (cwperpage - 1)) |
|
||||
+ FIELD_PREP(UD_SIZE_BYTES_MASK, host->cw_data) |
|
||||
+ FIELD_PREP(DISABLE_STATUS_AFTER_WRITE, 0) |
|
||||
+ FIELD_PREP(NUM_ADDR_CYCLES_MASK, 5) |
|
||||
+ FIELD_PREP(ECC_PARITY_SIZE_BYTES_RS, host->ecc_bytes_hw) |
|
||||
+ FIELD_PREP(STATUS_BFR_READ, 0) |
|
||||
+ FIELD_PREP(SET_RD_MODE_AFTER_STATUS, 1) |
|
||||
+ FIELD_PREP(SPARE_SIZE_BYTES_MASK, host->spare_bytes);
|
||||
+
|
||||
+ host->cfg1 = FIELD_PREP(NAND_RECOVERY_CYCLES_MASK, 7) |
|
||||
+ FIELD_PREP(BAD_BLOCK_BYTE_NUM_MASK, bad_block_byte) |
|
||||
+ FIELD_PREP(BAD_BLOCK_IN_SPARE_AREA, 0) |
|
||||
+ FIELD_PREP(WR_RD_BSY_GAP_MASK, 2) |
|
||||
+ FIELD_PREP(WIDE_FLASH, wide_bus) |
|
||||
+ FIELD_PREP(ENABLE_BCH_ECC, host->bch_enabled);
|
||||
+
|
||||
+ host->cfg0_raw = FIELD_PREP(CW_PER_PAGE_MASK, (cwperpage - 1)) |
|
||||
+ FIELD_PREP(UD_SIZE_BYTES_MASK, host->cw_size) |
|
||||
+ FIELD_PREP(NUM_ADDR_CYCLES_MASK, 5) |
|
||||
+ FIELD_PREP(SPARE_SIZE_BYTES_MASK, 0);
|
||||
+
|
||||
+ host->cfg1_raw = FIELD_PREP(NAND_RECOVERY_CYCLES_MASK, 7) |
|
||||
+ FIELD_PREP(CS_ACTIVE_BSY, 0) |
|
||||
+ FIELD_PREP(BAD_BLOCK_BYTE_NUM_MASK, 17) |
|
||||
+ FIELD_PREP(BAD_BLOCK_IN_SPARE_AREA, 1) |
|
||||
+ FIELD_PREP(WR_RD_BSY_GAP_MASK, 2) |
|
||||
+ FIELD_PREP(WIDE_FLASH, wide_bus) |
|
||||
+ FIELD_PREP(DEV0_CFG1_ECC_DISABLE, 1);
|
||||
+
|
||||
+ host->ecc_bch_cfg = FIELD_PREP(ECC_CFG_ECC_DISABLE, !host->bch_enabled) |
|
||||
+ FIELD_PREP(ECC_SW_RESET, 0) |
|
||||
+ FIELD_PREP(ECC_NUM_DATA_BYTES_MASK, host->cw_data) |
|
||||
+ FIELD_PREP(ECC_FORCE_CLK_OPEN, 1) |
|
||||
+ FIELD_PREP(ECC_MODE_MASK, ecc_mode) |
|
||||
+ FIELD_PREP(ECC_PARITY_SIZE_BYTES_BCH_MASK, host->ecc_bytes_hw);
|
||||
|
||||
if (!nandc->props->qpic_version2)
|
||||
host->ecc_buf_cfg = 0x203 << NUM_STEPS;
|
||||
@@ -1882,21 +1881,21 @@ static int qcom_param_page_type_exec(struct nand_chip *chip, const struct nand_
|
||||
nandc->regs->addr0 = 0;
|
||||
nandc->regs->addr1 = 0;
|
||||
|
||||
- nandc->regs->cfg0 = cpu_to_le32(0 << CW_PER_PAGE |
|
||||
- 512 << UD_SIZE_BYTES |
|
||||
- 5 << NUM_ADDR_CYCLES |
|
||||
- 0 << SPARE_SIZE_BYTES);
|
||||
+ host->cfg0 = FIELD_PREP(CW_PER_PAGE_MASK, 0) |
|
||||
+ FIELD_PREP(UD_SIZE_BYTES_MASK, 512) |
|
||||
+ FIELD_PREP(NUM_ADDR_CYCLES_MASK, 5) |
|
||||
+ FIELD_PREP(SPARE_SIZE_BYTES_MASK, 0);
|
||||
|
||||
- nandc->regs->cfg1 = cpu_to_le32(7 << NAND_RECOVERY_CYCLES |
|
||||
- 0 << CS_ACTIVE_BSY |
|
||||
- 17 << BAD_BLOCK_BYTE_NUM |
|
||||
- 1 << BAD_BLOCK_IN_SPARE_AREA |
|
||||
- 2 << WR_RD_BSY_GAP |
|
||||
- 0 << WIDE_FLASH |
|
||||
- 1 << DEV0_CFG1_ECC_DISABLE);
|
||||
+ host->cfg1 = FIELD_PREP(NAND_RECOVERY_CYCLES_MASK, 7) |
|
||||
+ FIELD_PREP(BAD_BLOCK_BYTE_NUM_MASK, 17) |
|
||||
+ FIELD_PREP(CS_ACTIVE_BSY, 0) |
|
||||
+ FIELD_PREP(BAD_BLOCK_IN_SPARE_AREA, 1) |
|
||||
+ FIELD_PREP(WR_RD_BSY_GAP_MASK, 2) |
|
||||
+ FIELD_PREP(WIDE_FLASH, 0) |
|
||||
+ FIELD_PREP(DEV0_CFG1_ECC_DISABLE, 1);
|
||||
|
||||
if (!nandc->props->qpic_version2)
|
||||
- nandc->regs->ecc_buf_cfg = cpu_to_le32(1 << ECC_CFG_ECC_DISABLE);
|
||||
+ nandc->regs->ecc_buf_cfg = cpu_to_le32(ECC_CFG_ECC_DISABLE);
|
||||
|
||||
/* configure CMD1 and VLD for ONFI param probing in QPIC v1 */
|
||||
if (!nandc->props->qpic_version2) {
|
||||
diff --git a/include/linux/mtd/nand-qpic-common.h b/include/linux/mtd/nand-qpic-common.h
|
||||
index 425994429387..e79c79775eb8 100644
|
||||
--- a/include/linux/mtd/nand-qpic-common.h
|
||||
+++ b/include/linux/mtd/nand-qpic-common.h
|
||||
@@ -70,35 +70,42 @@
|
||||
#define BS_CORRECTABLE_ERR_MSK 0x1f
|
||||
|
||||
/* NAND_DEVn_CFG0 bits */
|
||||
-#define DISABLE_STATUS_AFTER_WRITE 4
|
||||
+#define DISABLE_STATUS_AFTER_WRITE BIT(4)
|
||||
#define CW_PER_PAGE 6
|
||||
+#define CW_PER_PAGE_MASK GENMASK(8, 6)
|
||||
#define UD_SIZE_BYTES 9
|
||||
#define UD_SIZE_BYTES_MASK GENMASK(18, 9)
|
||||
-#define ECC_PARITY_SIZE_BYTES_RS 19
|
||||
+#define ECC_PARITY_SIZE_BYTES_RS GENMASK(22, 19)
|
||||
#define SPARE_SIZE_BYTES 23
|
||||
#define SPARE_SIZE_BYTES_MASK GENMASK(26, 23)
|
||||
#define NUM_ADDR_CYCLES 27
|
||||
-#define STATUS_BFR_READ 30
|
||||
-#define SET_RD_MODE_AFTER_STATUS 31
|
||||
+#define NUM_ADDR_CYCLES_MASK GENMASK(29, 27)
|
||||
+#define STATUS_BFR_READ BIT(30)
|
||||
+#define SET_RD_MODE_AFTER_STATUS BIT(31)
|
||||
|
||||
/* NAND_DEVn_CFG0 bits */
|
||||
-#define DEV0_CFG1_ECC_DISABLE 0
|
||||
-#define WIDE_FLASH 1
|
||||
+#define DEV0_CFG1_ECC_DISABLE BIT(0)
|
||||
+#define WIDE_FLASH BIT(1)
|
||||
#define NAND_RECOVERY_CYCLES 2
|
||||
-#define CS_ACTIVE_BSY 5
|
||||
+#define NAND_RECOVERY_CYCLES_MASK GENMASK(4, 2)
|
||||
+#define CS_ACTIVE_BSY BIT(5)
|
||||
#define BAD_BLOCK_BYTE_NUM 6
|
||||
-#define BAD_BLOCK_IN_SPARE_AREA 16
|
||||
+#define BAD_BLOCK_BYTE_NUM_MASK GENMASK(15, 6)
|
||||
+#define BAD_BLOCK_IN_SPARE_AREA BIT(16)
|
||||
#define WR_RD_BSY_GAP 17
|
||||
-#define ENABLE_BCH_ECC 27
|
||||
+#define WR_RD_BSY_GAP_MASK GENMASK(22, 17)
|
||||
+#define ENABLE_BCH_ECC BIT(27)
|
||||
|
||||
/* NAND_DEV0_ECC_CFG bits */
|
||||
-#define ECC_CFG_ECC_DISABLE 0
|
||||
-#define ECC_SW_RESET 1
|
||||
+#define ECC_CFG_ECC_DISABLE BIT(0)
|
||||
+#define ECC_SW_RESET BIT(1)
|
||||
#define ECC_MODE 4
|
||||
+#define ECC_MODE_MASK GENMASK(5, 4)
|
||||
#define ECC_PARITY_SIZE_BYTES_BCH 8
|
||||
+#define ECC_PARITY_SIZE_BYTES_BCH_MASK GENMASK(12, 8)
|
||||
#define ECC_NUM_DATA_BYTES 16
|
||||
#define ECC_NUM_DATA_BYTES_MASK GENMASK(25, 16)
|
||||
-#define ECC_FORCE_CLK_OPEN 30
|
||||
+#define ECC_FORCE_CLK_OPEN BIT(30)
|
||||
|
||||
/* NAND_DEV_CMD1 bits */
|
||||
#define READ_ADDR 0
|
||||
--
|
||||
2.47.1
|
||||
|
@ -0,0 +1,84 @@
|
||||
From b9371866799d67a80be0ea9e01bd41987db22f26 Mon Sep 17 00:00:00 2001
|
||||
From: Md Sadre Alam <quic_mdalam@quicinc.com>
|
||||
Date: Mon, 6 Jan 2025 18:45:58 +0530
|
||||
Subject: [PATCH] mtd: rawnand: qcom: Fix build issue on x86 architecture
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Fix a buffer overflow issue in qcom_clear_bam_transaction by using
|
||||
struct_group to group related fields and avoid FORTIFY_SOURCE warnings.
|
||||
|
||||
On x86 architecture, the following error occurs due to warnings being
|
||||
treated as errors:
|
||||
|
||||
In function ‘fortify_memset_chk’,
|
||||
inlined from ‘qcom_clear_bam_transaction’ at
|
||||
drivers/mtd/nand/qpic_common.c:88:2:
|
||||
./include/linux/fortify-string.h:480:25: error: call to ‘__write_overflow_field’
|
||||
declared with attribute warning: detected write beyond size of field
|
||||
(1st parameter); maybe use struct_group()? [-Werror=attribute-warning]
|
||||
480 | __write_overflow_field(p_size_field, size);
|
||||
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
LD [M] drivers/mtd/nand/nandcore.o
|
||||
CC [M] drivers/w1/masters/mxc_w1.o
|
||||
cc1: all warnings being treated as errors
|
||||
|
||||
This patch addresses the issue by grouping the related fields in
|
||||
struct bam_transaction using struct_group and updating the memset call
|
||||
accordingly.
|
||||
|
||||
Fixes: 8c52932da5e6 ("mtd: rawnand: qcom: cleanup qcom_nandc driver")
|
||||
Signed-off-by: Md Sadre Alam <quic_mdalam@quicinc.com>
|
||||
Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
|
||||
---
|
||||
drivers/mtd/nand/qpic_common.c | 2 +-
|
||||
include/linux/mtd/nand-qpic-common.h | 19 +++++++++++--------
|
||||
2 files changed, 12 insertions(+), 9 deletions(-)
|
||||
|
||||
diff --git a/drivers/mtd/nand/qpic_common.c b/drivers/mtd/nand/qpic_common.c
|
||||
index 8abbb960a7ce..e0ed25b5afea 100644
|
||||
--- a/drivers/mtd/nand/qpic_common.c
|
||||
+++ b/drivers/mtd/nand/qpic_common.c
|
||||
@@ -85,7 +85,7 @@ void qcom_clear_bam_transaction(struct qcom_nand_controller *nandc)
|
||||
if (!nandc->props->supports_bam)
|
||||
return;
|
||||
|
||||
- memset(&bam_txn->bam_ce_pos, 0, sizeof(u32) * 8);
|
||||
+ memset(&bam_txn->bam_positions, 0, sizeof(bam_txn->bam_positions));
|
||||
bam_txn->last_data_desc = NULL;
|
||||
|
||||
sg_init_table(bam_txn->cmd_sgl, nandc->max_cwperpage *
|
||||
diff --git a/include/linux/mtd/nand-qpic-common.h b/include/linux/mtd/nand-qpic-common.h
|
||||
index e79c79775eb8..4d9b736ff8b7 100644
|
||||
--- a/include/linux/mtd/nand-qpic-common.h
|
||||
+++ b/include/linux/mtd/nand-qpic-common.h
|
||||
@@ -254,14 +254,17 @@ struct bam_transaction {
|
||||
struct dma_async_tx_descriptor *last_data_desc;
|
||||
struct dma_async_tx_descriptor *last_cmd_desc;
|
||||
struct completion txn_done;
|
||||
- u32 bam_ce_pos;
|
||||
- u32 bam_ce_start;
|
||||
- u32 cmd_sgl_pos;
|
||||
- u32 cmd_sgl_start;
|
||||
- u32 tx_sgl_pos;
|
||||
- u32 tx_sgl_start;
|
||||
- u32 rx_sgl_pos;
|
||||
- u32 rx_sgl_start;
|
||||
+ struct_group(bam_positions,
|
||||
+ u32 bam_ce_pos;
|
||||
+ u32 bam_ce_start;
|
||||
+ u32 cmd_sgl_pos;
|
||||
+ u32 cmd_sgl_start;
|
||||
+ u32 tx_sgl_pos;
|
||||
+ u32 tx_sgl_start;
|
||||
+ u32 rx_sgl_pos;
|
||||
+ u32 rx_sgl_start;
|
||||
+
|
||||
+ );
|
||||
};
|
||||
|
||||
/*
|
||||
--
|
||||
2.47.1
|
||||
|
@ -0,0 +1,510 @@
|
||||
From f81715a4c87c3b75ca2640bb61b6c66506061a64 Mon Sep 17 00:00:00 2001
|
||||
From: Luo Jie <quic_luoj@quicinc.com>
|
||||
Date: Fri, 3 Jan 2025 15:31:35 +0800
|
||||
Subject: [PATCH] clk: qcom: Add CMN PLL clock controller driver for IPQ SoC
|
||||
|
||||
The CMN PLL clock controller supplies clocks to the hardware
|
||||
blocks that together make up the Ethernet function on Qualcomm
|
||||
IPQ SoCs and to GCC. The driver is initially supported for
|
||||
IPQ9574 SoC.
|
||||
|
||||
The CMN PLL clock controller expects a reference input clock
|
||||
from the on-board Wi-Fi block acting as clock source. The input
|
||||
reference clock needs to be configured to one of the supported
|
||||
clock rates.
|
||||
|
||||
The controller supplies a number of fixed-rate output clocks.
|
||||
For the IPQ9574, there is one output clock of 353 MHZ to PPE
|
||||
(Packet Process Engine) hardware block, three 50 MHZ output
|
||||
clocks and an additional 25 MHZ output clock supplied to the
|
||||
connected Ethernet devices. The PLL also supplies a 24 MHZ
|
||||
clock as XO and a 32 KHZ sleep clock to GCC, and one 31.25
|
||||
MHZ clock to PCS.
|
||||
|
||||
Signed-off-by: Luo Jie <quic_luoj@quicinc.com>
|
||||
Acked-by: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com>
|
||||
Link: https://lore.kernel.org/r/20250103-qcom_ipq_cmnpll-v8-2-c89fb4d4849d@quicinc.com
|
||||
Signed-off-by: Bjorn Andersson <andersson@kernel.org>
|
||||
---
|
||||
drivers/clk/qcom/Kconfig | 9 +
|
||||
drivers/clk/qcom/Makefile | 1 +
|
||||
drivers/clk/qcom/ipq-cmn-pll.c | 435 +++++++++++++++++++++++++++++++++
|
||||
3 files changed, 445 insertions(+)
|
||||
create mode 100644 drivers/clk/qcom/ipq-cmn-pll.c
|
||||
|
||||
diff --git a/drivers/clk/qcom/Kconfig b/drivers/clk/qcom/Kconfig
|
||||
index 42c257e4c433..2daff198aeb3 100644
|
||||
--- a/drivers/clk/qcom/Kconfig
|
||||
+++ b/drivers/clk/qcom/Kconfig
|
||||
@@ -199,6 +199,15 @@ config IPQ_APSS_6018
|
||||
Say Y if you want to support CPU frequency scaling on
|
||||
ipq based devices.
|
||||
|
||||
+config IPQ_CMN_PLL
|
||||
+ tristate "IPQ CMN PLL Clock Controller"
|
||||
+ help
|
||||
+ Support for CMN PLL clock controller on IPQ platform. The
|
||||
+ CMN PLL consumes the AHB/SYS clocks from GCC and supplies
|
||||
+ the output clocks to the networking hardware and GCC blocks.
|
||||
+ Say Y or M if you want to support CMN PLL clock on the IPQ
|
||||
+ based devices.
|
||||
+
|
||||
config IPQ_GCC_4019
|
||||
tristate "IPQ4019 Global Clock Controller"
|
||||
help
|
||||
diff --git a/drivers/clk/qcom/Makefile b/drivers/clk/qcom/Makefile
|
||||
index 1b749da9c13a..6665049cb8c8 100644
|
||||
--- a/drivers/clk/qcom/Makefile
|
||||
+++ b/drivers/clk/qcom/Makefile
|
||||
@@ -30,6 +30,7 @@ obj-$(CONFIG_CLK_X1P42100_GPUCC) += gpucc-x1p42100.o
|
||||
obj-$(CONFIG_CLK_QCM2290_GPUCC) += gpucc-qcm2290.o
|
||||
obj-$(CONFIG_IPQ_APSS_PLL) += apss-ipq-pll.o
|
||||
obj-$(CONFIG_IPQ_APSS_6018) += apss-ipq6018.o
|
||||
+obj-$(CONFIG_IPQ_CMN_PLL) += ipq-cmn-pll.o
|
||||
obj-$(CONFIG_IPQ_GCC_4019) += gcc-ipq4019.o
|
||||
obj-$(CONFIG_IPQ_GCC_5018) += gcc-ipq5018.o
|
||||
obj-$(CONFIG_IPQ_GCC_5332) += gcc-ipq5332.o
|
||||
diff --git a/drivers/clk/qcom/ipq-cmn-pll.c b/drivers/clk/qcom/ipq-cmn-pll.c
|
||||
new file mode 100644
|
||||
index 000000000000..432d4c4b7aa6
|
||||
--- /dev/null
|
||||
+++ b/drivers/clk/qcom/ipq-cmn-pll.c
|
||||
@@ -0,0 +1,435 @@
|
||||
+// SPDX-License-Identifier: GPL-2.0-only
|
||||
+/*
|
||||
+ * Copyright (c) 2024 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
+ */
|
||||
+
|
||||
+/*
|
||||
+ * CMN PLL block expects the reference clock from on-board Wi-Fi block,
|
||||
+ * and supplies fixed rate clocks as output to the networking hardware
|
||||
+ * blocks and to GCC. The networking related blocks include PPE (packet
|
||||
+ * process engine), the externally connected PHY or switch devices, and
|
||||
+ * the PCS.
|
||||
+ *
|
||||
+ * On the IPQ9574 SoC, there are three clocks with 50 MHZ and one clock
|
||||
+ * with 25 MHZ which are output from the CMN PLL to Ethernet PHY (or switch),
|
||||
+ * and one clock with 353 MHZ to PPE. The other fixed rate output clocks
|
||||
+ * are supplied to GCC (24 MHZ as XO and 32 KHZ as sleep clock), and to PCS
|
||||
+ * with 31.25 MHZ.
|
||||
+ *
|
||||
+ * +---------+
|
||||
+ * | GCC |
|
||||
+ * +--+---+--+
|
||||
+ * AHB CLK| |SYS CLK
|
||||
+ * V V
|
||||
+ * +-------+---+------+
|
||||
+ * | +-------------> eth0-50mhz
|
||||
+ * REF CLK | IPQ9574 |
|
||||
+ * -------->+ +-------------> eth1-50mhz
|
||||
+ * | CMN PLL block |
|
||||
+ * | +-------------> eth2-50mhz
|
||||
+ * | |
|
||||
+ * +----+----+----+---+-------------> eth-25mhz
|
||||
+ * | | |
|
||||
+ * V V V
|
||||
+ * GCC PCS NSS/PPE
|
||||
+ */
|
||||
+
|
||||
+#include <linux/bitfield.h>
|
||||
+#include <linux/clk-provider.h>
|
||||
+#include <linux/delay.h>
|
||||
+#include <linux/err.h>
|
||||
+#include <linux/mod_devicetable.h>
|
||||
+#include <linux/module.h>
|
||||
+#include <linux/platform_device.h>
|
||||
+#include <linux/pm_clock.h>
|
||||
+#include <linux/pm_runtime.h>
|
||||
+#include <linux/regmap.h>
|
||||
+
|
||||
+#include <dt-bindings/clock/qcom,ipq-cmn-pll.h>
|
||||
+
|
||||
+#define CMN_PLL_REFCLK_SRC_SELECTION 0x28
|
||||
+#define CMN_PLL_REFCLK_SRC_DIV GENMASK(9, 8)
|
||||
+
|
||||
+#define CMN_PLL_LOCKED 0x64
|
||||
+#define CMN_PLL_CLKS_LOCKED BIT(8)
|
||||
+
|
||||
+#define CMN_PLL_POWER_ON_AND_RESET 0x780
|
||||
+#define CMN_ANA_EN_SW_RSTN BIT(6)
|
||||
+
|
||||
+#define CMN_PLL_REFCLK_CONFIG 0x784
|
||||
+#define CMN_PLL_REFCLK_EXTERNAL BIT(9)
|
||||
+#define CMN_PLL_REFCLK_DIV GENMASK(8, 4)
|
||||
+#define CMN_PLL_REFCLK_INDEX GENMASK(3, 0)
|
||||
+
|
||||
+#define CMN_PLL_CTRL 0x78c
|
||||
+#define CMN_PLL_CTRL_LOCK_DETECT_EN BIT(15)
|
||||
+
|
||||
+#define CMN_PLL_DIVIDER_CTRL 0x794
|
||||
+#define CMN_PLL_DIVIDER_CTRL_FACTOR GENMASK(9, 0)
|
||||
+
|
||||
+/**
|
||||
+ * struct cmn_pll_fixed_output_clk - CMN PLL output clocks information
|
||||
+ * @id: Clock specifier to be supplied
|
||||
+ * @name: Clock name to be registered
|
||||
+ * @rate: Clock rate
|
||||
+ */
|
||||
+struct cmn_pll_fixed_output_clk {
|
||||
+ unsigned int id;
|
||||
+ const char *name;
|
||||
+ unsigned long rate;
|
||||
+};
|
||||
+
|
||||
+/**
|
||||
+ * struct clk_cmn_pll - CMN PLL hardware specific data
|
||||
+ * @regmap: hardware regmap.
|
||||
+ * @hw: handle between common and hardware-specific interfaces
|
||||
+ */
|
||||
+struct clk_cmn_pll {
|
||||
+ struct regmap *regmap;
|
||||
+ struct clk_hw hw;
|
||||
+};
|
||||
+
|
||||
+#define CLK_PLL_OUTPUT(_id, _name, _rate) { \
|
||||
+ .id = _id, \
|
||||
+ .name = _name, \
|
||||
+ .rate = _rate, \
|
||||
+}
|
||||
+
|
||||
+#define to_clk_cmn_pll(_hw) container_of(_hw, struct clk_cmn_pll, hw)
|
||||
+
|
||||
+static const struct regmap_config ipq_cmn_pll_regmap_config = {
|
||||
+ .reg_bits = 32,
|
||||
+ .reg_stride = 4,
|
||||
+ .val_bits = 32,
|
||||
+ .max_register = 0x7fc,
|
||||
+ .fast_io = true,
|
||||
+};
|
||||
+
|
||||
+static const struct cmn_pll_fixed_output_clk ipq9574_output_clks[] = {
|
||||
+ CLK_PLL_OUTPUT(XO_24MHZ_CLK, "xo-24mhz", 24000000UL),
|
||||
+ CLK_PLL_OUTPUT(SLEEP_32KHZ_CLK, "sleep-32khz", 32000UL),
|
||||
+ CLK_PLL_OUTPUT(PCS_31P25MHZ_CLK, "pcs-31p25mhz", 31250000UL),
|
||||
+ CLK_PLL_OUTPUT(NSS_1200MHZ_CLK, "nss-1200mhz", 1200000000UL),
|
||||
+ CLK_PLL_OUTPUT(PPE_353MHZ_CLK, "ppe-353mhz", 353000000UL),
|
||||
+ CLK_PLL_OUTPUT(ETH0_50MHZ_CLK, "eth0-50mhz", 50000000UL),
|
||||
+ CLK_PLL_OUTPUT(ETH1_50MHZ_CLK, "eth1-50mhz", 50000000UL),
|
||||
+ CLK_PLL_OUTPUT(ETH2_50MHZ_CLK, "eth2-50mhz", 50000000UL),
|
||||
+ CLK_PLL_OUTPUT(ETH_25MHZ_CLK, "eth-25mhz", 25000000UL),
|
||||
+};
|
||||
+
|
||||
+/*
|
||||
+ * CMN PLL has the single parent clock, which supports the several
|
||||
+ * possible parent clock rates, each parent clock rate is reflected
|
||||
+ * by the specific reference index value in the hardware.
|
||||
+ */
|
||||
+static int ipq_cmn_pll_find_freq_index(unsigned long parent_rate)
|
||||
+{
|
||||
+ int index = -EINVAL;
|
||||
+
|
||||
+ switch (parent_rate) {
|
||||
+ case 25000000:
|
||||
+ index = 3;
|
||||
+ break;
|
||||
+ case 31250000:
|
||||
+ index = 4;
|
||||
+ break;
|
||||
+ case 40000000:
|
||||
+ index = 6;
|
||||
+ break;
|
||||
+ case 48000000:
|
||||
+ case 96000000:
|
||||
+ /*
|
||||
+ * Parent clock rate 48 MHZ and 96 MHZ take the same value
|
||||
+ * of reference clock index. 96 MHZ needs the source clock
|
||||
+ * divider to be programmed as 2.
|
||||
+ */
|
||||
+ index = 7;
|
||||
+ break;
|
||||
+ case 50000000:
|
||||
+ index = 8;
|
||||
+ break;
|
||||
+ default:
|
||||
+ break;
|
||||
+ }
|
||||
+
|
||||
+ return index;
|
||||
+}
|
||||
+
|
||||
+static unsigned long clk_cmn_pll_recalc_rate(struct clk_hw *hw,
|
||||
+ unsigned long parent_rate)
|
||||
+{
|
||||
+ struct clk_cmn_pll *cmn_pll = to_clk_cmn_pll(hw);
|
||||
+ u32 val, factor;
|
||||
+
|
||||
+ /*
|
||||
+ * The value of CMN_PLL_DIVIDER_CTRL_FACTOR is automatically adjusted
|
||||
+ * by HW according to the parent clock rate.
|
||||
+ */
|
||||
+ regmap_read(cmn_pll->regmap, CMN_PLL_DIVIDER_CTRL, &val);
|
||||
+ factor = FIELD_GET(CMN_PLL_DIVIDER_CTRL_FACTOR, val);
|
||||
+
|
||||
+ return parent_rate * 2 * factor;
|
||||
+}
|
||||
+
|
||||
+static int clk_cmn_pll_determine_rate(struct clk_hw *hw,
|
||||
+ struct clk_rate_request *req)
|
||||
+{
|
||||
+ int ret;
|
||||
+
|
||||
+ /* Validate the rate of the single parent clock. */
|
||||
+ ret = ipq_cmn_pll_find_freq_index(req->best_parent_rate);
|
||||
+
|
||||
+ return ret < 0 ? ret : 0;
|
||||
+}
|
||||
+
|
||||
+/*
|
||||
+ * This function is used to initialize the CMN PLL to enable the fixed
|
||||
+ * rate output clocks. It is expected to be configured once.
|
||||
+ */
|
||||
+static int clk_cmn_pll_set_rate(struct clk_hw *hw, unsigned long rate,
|
||||
+ unsigned long parent_rate)
|
||||
+{
|
||||
+ struct clk_cmn_pll *cmn_pll = to_clk_cmn_pll(hw);
|
||||
+ int ret, index;
|
||||
+ u32 val;
|
||||
+
|
||||
+ /*
|
||||
+ * Configure the reference input clock selection as per the given
|
||||
+ * parent clock. The output clock rates are always of fixed value.
|
||||
+ */
|
||||
+ index = ipq_cmn_pll_find_freq_index(parent_rate);
|
||||
+ if (index < 0)
|
||||
+ return index;
|
||||
+
|
||||
+ ret = regmap_update_bits(cmn_pll->regmap, CMN_PLL_REFCLK_CONFIG,
|
||||
+ CMN_PLL_REFCLK_INDEX,
|
||||
+ FIELD_PREP(CMN_PLL_REFCLK_INDEX, index));
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ /*
|
||||
+ * Update the source clock rate selection and source clock
|
||||
+ * divider as 2 when the parent clock rate is 96 MHZ.
|
||||
+ */
|
||||
+ if (parent_rate == 96000000) {
|
||||
+ ret = regmap_update_bits(cmn_pll->regmap, CMN_PLL_REFCLK_CONFIG,
|
||||
+ CMN_PLL_REFCLK_DIV,
|
||||
+ FIELD_PREP(CMN_PLL_REFCLK_DIV, 2));
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ ret = regmap_update_bits(cmn_pll->regmap, CMN_PLL_REFCLK_SRC_SELECTION,
|
||||
+ CMN_PLL_REFCLK_SRC_DIV,
|
||||
+ FIELD_PREP(CMN_PLL_REFCLK_SRC_DIV, 0));
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ /* Enable PLL locked detect. */
|
||||
+ ret = regmap_set_bits(cmn_pll->regmap, CMN_PLL_CTRL,
|
||||
+ CMN_PLL_CTRL_LOCK_DETECT_EN);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ /*
|
||||
+ * Reset the CMN PLL block to ensure the updated configurations
|
||||
+ * take effect.
|
||||
+ */
|
||||
+ ret = regmap_clear_bits(cmn_pll->regmap, CMN_PLL_POWER_ON_AND_RESET,
|
||||
+ CMN_ANA_EN_SW_RSTN);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ usleep_range(1000, 1200);
|
||||
+ ret = regmap_set_bits(cmn_pll->regmap, CMN_PLL_POWER_ON_AND_RESET,
|
||||
+ CMN_ANA_EN_SW_RSTN);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ /* Stability check of CMN PLL output clocks. */
|
||||
+ return regmap_read_poll_timeout(cmn_pll->regmap, CMN_PLL_LOCKED, val,
|
||||
+ (val & CMN_PLL_CLKS_LOCKED),
|
||||
+ 100, 100 * USEC_PER_MSEC);
|
||||
+}
|
||||
+
|
||||
+static const struct clk_ops clk_cmn_pll_ops = {
|
||||
+ .recalc_rate = clk_cmn_pll_recalc_rate,
|
||||
+ .determine_rate = clk_cmn_pll_determine_rate,
|
||||
+ .set_rate = clk_cmn_pll_set_rate,
|
||||
+};
|
||||
+
|
||||
+static struct clk_hw *ipq_cmn_pll_clk_hw_register(struct platform_device *pdev)
|
||||
+{
|
||||
+ struct clk_parent_data pdata = { .index = 0 };
|
||||
+ struct device *dev = &pdev->dev;
|
||||
+ struct clk_init_data init = {};
|
||||
+ struct clk_cmn_pll *cmn_pll;
|
||||
+ struct regmap *regmap;
|
||||
+ void __iomem *base;
|
||||
+ int ret;
|
||||
+
|
||||
+ base = devm_platform_ioremap_resource(pdev, 0);
|
||||
+ if (IS_ERR(base))
|
||||
+ return ERR_CAST(base);
|
||||
+
|
||||
+ regmap = devm_regmap_init_mmio(dev, base, &ipq_cmn_pll_regmap_config);
|
||||
+ if (IS_ERR(regmap))
|
||||
+ return ERR_CAST(regmap);
|
||||
+
|
||||
+ cmn_pll = devm_kzalloc(dev, sizeof(*cmn_pll), GFP_KERNEL);
|
||||
+ if (!cmn_pll)
|
||||
+ return ERR_PTR(-ENOMEM);
|
||||
+
|
||||
+ init.name = "cmn_pll";
|
||||
+ init.parent_data = &pdata;
|
||||
+ init.num_parents = 1;
|
||||
+ init.ops = &clk_cmn_pll_ops;
|
||||
+
|
||||
+ cmn_pll->hw.init = &init;
|
||||
+ cmn_pll->regmap = regmap;
|
||||
+
|
||||
+ ret = devm_clk_hw_register(dev, &cmn_pll->hw);
|
||||
+ if (ret)
|
||||
+ return ERR_PTR(ret);
|
||||
+
|
||||
+ return &cmn_pll->hw;
|
||||
+}
|
||||
+
|
||||
+static int ipq_cmn_pll_register_clks(struct platform_device *pdev)
|
||||
+{
|
||||
+ const struct cmn_pll_fixed_output_clk *fixed_clk;
|
||||
+ struct clk_hw_onecell_data *hw_data;
|
||||
+ struct device *dev = &pdev->dev;
|
||||
+ struct clk_hw *cmn_pll_hw;
|
||||
+ unsigned int num_clks;
|
||||
+ struct clk_hw *hw;
|
||||
+ int ret, i;
|
||||
+
|
||||
+ fixed_clk = ipq9574_output_clks;
|
||||
+ num_clks = ARRAY_SIZE(ipq9574_output_clks);
|
||||
+
|
||||
+ hw_data = devm_kzalloc(dev, struct_size(hw_data, hws, num_clks + 1),
|
||||
+ GFP_KERNEL);
|
||||
+ if (!hw_data)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ /*
|
||||
+ * Register the CMN PLL clock, which is the parent clock of
|
||||
+ * the fixed rate output clocks.
|
||||
+ */
|
||||
+ cmn_pll_hw = ipq_cmn_pll_clk_hw_register(pdev);
|
||||
+ if (IS_ERR(cmn_pll_hw))
|
||||
+ return PTR_ERR(cmn_pll_hw);
|
||||
+
|
||||
+ /* Register the fixed rate output clocks. */
|
||||
+ for (i = 0; i < num_clks; i++) {
|
||||
+ hw = clk_hw_register_fixed_rate_parent_hw(dev, fixed_clk[i].name,
|
||||
+ cmn_pll_hw, 0,
|
||||
+ fixed_clk[i].rate);
|
||||
+ if (IS_ERR(hw)) {
|
||||
+ ret = PTR_ERR(hw);
|
||||
+ goto unregister_fixed_clk;
|
||||
+ }
|
||||
+
|
||||
+ hw_data->hws[fixed_clk[i].id] = hw;
|
||||
+ }
|
||||
+
|
||||
+ /*
|
||||
+ * Provide the CMN PLL clock. The clock rate of CMN PLL
|
||||
+ * is configured to 12 GHZ by DT property assigned-clock-rates-u64.
|
||||
+ */
|
||||
+ hw_data->hws[CMN_PLL_CLK] = cmn_pll_hw;
|
||||
+ hw_data->num = num_clks + 1;
|
||||
+
|
||||
+ ret = devm_of_clk_add_hw_provider(dev, of_clk_hw_onecell_get, hw_data);
|
||||
+ if (ret)
|
||||
+ goto unregister_fixed_clk;
|
||||
+
|
||||
+ platform_set_drvdata(pdev, hw_data);
|
||||
+
|
||||
+ return 0;
|
||||
+
|
||||
+unregister_fixed_clk:
|
||||
+ while (i > 0)
|
||||
+ clk_hw_unregister(hw_data->hws[fixed_clk[--i].id]);
|
||||
+
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+static int ipq_cmn_pll_clk_probe(struct platform_device *pdev)
|
||||
+{
|
||||
+ struct device *dev = &pdev->dev;
|
||||
+ int ret;
|
||||
+
|
||||
+ ret = devm_pm_runtime_enable(dev);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ ret = devm_pm_clk_create(dev);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ /*
|
||||
+ * To access the CMN PLL registers, the GCC AHB & SYS clocks
|
||||
+ * of CMN PLL block need to be enabled.
|
||||
+ */
|
||||
+ ret = pm_clk_add(dev, "ahb");
|
||||
+ if (ret)
|
||||
+ return dev_err_probe(dev, ret, "Fail to add AHB clock\n");
|
||||
+
|
||||
+ ret = pm_clk_add(dev, "sys");
|
||||
+ if (ret)
|
||||
+ return dev_err_probe(dev, ret, "Fail to add SYS clock\n");
|
||||
+
|
||||
+ ret = pm_runtime_resume_and_get(dev);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ /* Register CMN PLL clock and fixed rate output clocks. */
|
||||
+ ret = ipq_cmn_pll_register_clks(pdev);
|
||||
+ pm_runtime_put(dev);
|
||||
+ if (ret)
|
||||
+ return dev_err_probe(dev, ret,
|
||||
+ "Fail to register CMN PLL clocks\n");
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static void ipq_cmn_pll_clk_remove(struct platform_device *pdev)
|
||||
+{
|
||||
+ struct clk_hw_onecell_data *hw_data = platform_get_drvdata(pdev);
|
||||
+ int i;
|
||||
+
|
||||
+ /*
|
||||
+ * The clock with index CMN_PLL_CLK is unregistered by
|
||||
+ * device management.
|
||||
+ */
|
||||
+ for (i = 0; i < hw_data->num; i++) {
|
||||
+ if (i != CMN_PLL_CLK)
|
||||
+ clk_hw_unregister(hw_data->hws[i]);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+static const struct dev_pm_ops ipq_cmn_pll_pm_ops = {
|
||||
+ SET_RUNTIME_PM_OPS(pm_clk_suspend, pm_clk_resume, NULL)
|
||||
+};
|
||||
+
|
||||
+static const struct of_device_id ipq_cmn_pll_clk_ids[] = {
|
||||
+ { .compatible = "qcom,ipq9574-cmn-pll", },
|
||||
+ { }
|
||||
+};
|
||||
+MODULE_DEVICE_TABLE(of, ipq_cmn_pll_clk_ids);
|
||||
+
|
||||
+static struct platform_driver ipq_cmn_pll_clk_driver = {
|
||||
+ .probe = ipq_cmn_pll_clk_probe,
|
||||
+ .remove_new = ipq_cmn_pll_clk_remove,
|
||||
+ .driver = {
|
||||
+ .name = "ipq_cmn_pll",
|
||||
+ .of_match_table = ipq_cmn_pll_clk_ids,
|
||||
+ .pm = &ipq_cmn_pll_pm_ops,
|
||||
+ },
|
||||
+};
|
||||
+module_platform_driver(ipq_cmn_pll_clk_driver);
|
||||
+
|
||||
+MODULE_DESCRIPTION("Qualcomm Technologies, Inc. IPQ CMN PLL Driver");
|
||||
+MODULE_LICENSE("GPL");
|
||||
--
|
||||
2.47.1
|
||||
|
@ -0,0 +1,141 @@
|
||||
From c0f1cbf795095c21b92a46fa1dc47a7b787ce538 Mon Sep 17 00:00:00 2001
|
||||
From: Luo Jie <quic_luoj@quicinc.com>
|
||||
Date: Fri, 3 Jan 2025 15:31:34 +0800
|
||||
Subject: [PATCH 1/3] dt-bindings: clock: qcom: Add CMN PLL clock controller
|
||||
for IPQ SoC
|
||||
|
||||
The CMN PLL controller provides clocks to networking hardware blocks
|
||||
and to GCC on Qualcomm IPQ9574 SoC. It receives input clock from the
|
||||
on-chip Wi-Fi, and produces output clocks at fixed rates. These output
|
||||
rates are predetermined, and are unrelated to the input clock rate.
|
||||
The primary purpose of CMN PLL is to supply clocks to the networking
|
||||
hardware such as PPE (packet process engine), PCS and the externally
|
||||
connected switch or PHY device. The CMN PLL block also outputs fixed
|
||||
rate clocks to GCC, such as 24 MHZ as XO clock and 32 KHZ as sleep
|
||||
clock supplied to GCC.
|
||||
|
||||
Signed-off-by: Luo Jie <quic_luoj@quicinc.com>
|
||||
Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
|
||||
Link: https://lore.kernel.org/r/20250103-qcom_ipq_cmnpll-v8-1-c89fb4d4849d@quicinc.com
|
||||
Signed-off-by: Bjorn Andersson <andersson@kernel.org>
|
||||
---
|
||||
.../bindings/clock/qcom,ipq9574-cmn-pll.yaml | 77 +++++++++++++++++++
|
||||
include/dt-bindings/clock/qcom,ipq-cmn-pll.h | 22 ++++++
|
||||
2 files changed, 99 insertions(+)
|
||||
create mode 100644 Documentation/devicetree/bindings/clock/qcom,ipq9574-cmn-pll.yaml
|
||||
create mode 100644 include/dt-bindings/clock/qcom,ipq-cmn-pll.h
|
||||
|
||||
diff --git a/Documentation/devicetree/bindings/clock/qcom,ipq9574-cmn-pll.yaml b/Documentation/devicetree/bindings/clock/qcom,ipq9574-cmn-pll.yaml
|
||||
new file mode 100644
|
||||
index 000000000000..f869b3739be8
|
||||
--- /dev/null
|
||||
+++ b/Documentation/devicetree/bindings/clock/qcom,ipq9574-cmn-pll.yaml
|
||||
@@ -0,0 +1,77 @@
|
||||
+# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
|
||||
+%YAML 1.2
|
||||
+---
|
||||
+$id: http://devicetree.org/schemas/clock/qcom,ipq9574-cmn-pll.yaml#
|
||||
+$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
+
|
||||
+title: Qualcomm CMN PLL Clock Controller on IPQ SoC
|
||||
+
|
||||
+maintainers:
|
||||
+ - Bjorn Andersson <andersson@kernel.org>
|
||||
+ - Luo Jie <quic_luoj@quicinc.com>
|
||||
+
|
||||
+description:
|
||||
+ The CMN (or common) PLL clock controller expects a reference
|
||||
+ input clock. This reference clock is from the on-board Wi-Fi.
|
||||
+ The CMN PLL supplies a number of fixed rate output clocks to
|
||||
+ the devices providing networking functions and to GCC. These
|
||||
+ networking hardware include PPE (packet process engine), PCS
|
||||
+ and the externally connected switch or PHY devices. The CMN
|
||||
+ PLL block also outputs fixed rate clocks to GCC. The PLL's
|
||||
+ primary function is to enable fixed rate output clocks for
|
||||
+ networking hardware functions used with the IPQ SoC.
|
||||
+
|
||||
+properties:
|
||||
+ compatible:
|
||||
+ enum:
|
||||
+ - qcom,ipq9574-cmn-pll
|
||||
+
|
||||
+ reg:
|
||||
+ maxItems: 1
|
||||
+
|
||||
+ clocks:
|
||||
+ items:
|
||||
+ - description: The reference clock. The supported clock rates include
|
||||
+ 25000000, 31250000, 40000000, 48000000, 50000000 and 96000000 HZ.
|
||||
+ - description: The AHB clock
|
||||
+ - description: The SYS clock
|
||||
+ description:
|
||||
+ The reference clock is the source clock of CMN PLL, which is from the
|
||||
+ Wi-Fi. The AHB and SYS clocks must be enabled to access CMN PLL
|
||||
+ clock registers.
|
||||
+
|
||||
+ clock-names:
|
||||
+ items:
|
||||
+ - const: ref
|
||||
+ - const: ahb
|
||||
+ - const: sys
|
||||
+
|
||||
+ "#clock-cells":
|
||||
+ const: 1
|
||||
+
|
||||
+required:
|
||||
+ - compatible
|
||||
+ - reg
|
||||
+ - clocks
|
||||
+ - clock-names
|
||||
+ - "#clock-cells"
|
||||
+
|
||||
+additionalProperties: false
|
||||
+
|
||||
+examples:
|
||||
+ - |
|
||||
+ #include <dt-bindings/clock/qcom,ipq-cmn-pll.h>
|
||||
+ #include <dt-bindings/clock/qcom,ipq9574-gcc.h>
|
||||
+
|
||||
+ cmn_pll: clock-controller@9b000 {
|
||||
+ compatible = "qcom,ipq9574-cmn-pll";
|
||||
+ reg = <0x0009b000 0x800>;
|
||||
+ clocks = <&cmn_pll_ref_clk>,
|
||||
+ <&gcc GCC_CMN_12GPLL_AHB_CLK>,
|
||||
+ <&gcc GCC_CMN_12GPLL_SYS_CLK>;
|
||||
+ clock-names = "ref", "ahb", "sys";
|
||||
+ #clock-cells = <1>;
|
||||
+ assigned-clocks = <&cmn_pll CMN_PLL_CLK>;
|
||||
+ assigned-clock-rates-u64 = /bits/ 64 <12000000000>;
|
||||
+ };
|
||||
+...
|
||||
diff --git a/include/dt-bindings/clock/qcom,ipq-cmn-pll.h b/include/dt-bindings/clock/qcom,ipq-cmn-pll.h
|
||||
new file mode 100644
|
||||
index 000000000000..936e92b3b62c
|
||||
--- /dev/null
|
||||
+++ b/include/dt-bindings/clock/qcom,ipq-cmn-pll.h
|
||||
@@ -0,0 +1,22 @@
|
||||
+/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
|
||||
+/*
|
||||
+ * Copyright (c) 2024 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
+ */
|
||||
+
|
||||
+#ifndef _DT_BINDINGS_CLK_QCOM_IPQ_CMN_PLL_H
|
||||
+#define _DT_BINDINGS_CLK_QCOM_IPQ_CMN_PLL_H
|
||||
+
|
||||
+/* CMN PLL core clock. */
|
||||
+#define CMN_PLL_CLK 0
|
||||
+
|
||||
+/* The output clocks from CMN PLL of IPQ9574. */
|
||||
+#define XO_24MHZ_CLK 1
|
||||
+#define SLEEP_32KHZ_CLK 2
|
||||
+#define PCS_31P25MHZ_CLK 3
|
||||
+#define NSS_1200MHZ_CLK 4
|
||||
+#define PPE_353MHZ_CLK 5
|
||||
+#define ETH0_50MHZ_CLK 6
|
||||
+#define ETH1_50MHZ_CLK 7
|
||||
+#define ETH2_50MHZ_CLK 8
|
||||
+#define ETH_25MHZ_CLK 9
|
||||
+#endif
|
||||
--
|
||||
2.47.1
|
||||
|
@ -0,0 +1,129 @@
|
||||
From 758aa2d7e3c0acfe9c952a1cbe6416ec6130c2a1 Mon Sep 17 00:00:00 2001
|
||||
From: Luo Jie <quic_luoj@quicinc.com>
|
||||
Date: Fri, 3 Jan 2025 15:31:37 +0800
|
||||
Subject: [PATCH 2/3] arm64: dts: qcom: ipq9574: Add CMN PLL node
|
||||
|
||||
The CMN PLL clock controller allows selection of an input clock rate
|
||||
from a defined set of input clock rates. It in-turn supplies fixed
|
||||
rate output clocks to the hardware blocks that provide the ethernet
|
||||
functions such as PPE (Packet Process Engine) and connected switch or
|
||||
PHY, and to GCC.
|
||||
|
||||
The reference clock of CMN PLL is routed from XO to the CMN PLL through
|
||||
the internal WiFi block.
|
||||
.XO (48 MHZ or 96 MHZ)-->WiFi (multiplier/divider)-->48 MHZ to CMN PLL.
|
||||
|
||||
The reference input clock from WiFi to CMN PLL is fully controlled by
|
||||
the bootstrap pins which select the XO frequency (48 MHZ or 96 MHZ).
|
||||
Based on this frequency, the divider in the internal Wi-Fi block is
|
||||
automatically configured by hardware (1 for 48 MHZ, 2 for 96 MHZ), to
|
||||
ensure output clock to CMN PLL is 48 MHZ.
|
||||
|
||||
Signed-off-by: Luo Jie <quic_luoj@quicinc.com>
|
||||
Reviewed-by: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com>
|
||||
Link: https://lore.kernel.org/r/20250103-qcom_ipq_cmnpll-v8-4-c89fb4d4849d@quicinc.com
|
||||
Signed-off-by: Bjorn Andersson <andersson@kernel.org>
|
||||
---
|
||||
.../boot/dts/qcom/ipq9574-rdp-common.dtsi | 17 +++++++++++-
|
||||
arch/arm64/boot/dts/qcom/ipq9574.dtsi | 26 ++++++++++++++++++-
|
||||
2 files changed, 41 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/qcom/ipq9574-rdp-common.dtsi b/arch/arm64/boot/dts/qcom/ipq9574-rdp-common.dtsi
|
||||
index 91e104b0f865..bb1ff79360d3 100644
|
||||
--- a/arch/arm64/boot/dts/qcom/ipq9574-rdp-common.dtsi
|
||||
+++ b/arch/arm64/boot/dts/qcom/ipq9574-rdp-common.dtsi
|
||||
@@ -3,7 +3,7 @@
|
||||
* IPQ9574 RDP board common device tree source
|
||||
*
|
||||
* Copyright (c) 2020-2021 The Linux Foundation. All rights reserved.
|
||||
- * Copyright (c) 2023, Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
+ * Copyright (c) 2023-2024, Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
*/
|
||||
|
||||
/dts-v1/;
|
||||
@@ -164,6 +164,21 @@ &usb3 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
+/*
|
||||
+ * The bootstrap pins for the board select the XO clock frequency
|
||||
+ * (48 MHZ or 96 MHZ used for different RDP type board). This setting
|
||||
+ * automatically enables the right dividers, to ensure the reference
|
||||
+ * clock output from WiFi to the CMN PLL is 48 MHZ.
|
||||
+ */
|
||||
+&ref_48mhz_clk {
|
||||
+ clock-div = <1>;
|
||||
+ clock-mult = <1>;
|
||||
+};
|
||||
+
|
||||
&xo_board_clk {
|
||||
clock-frequency = <24000000>;
|
||||
};
|
||||
+
|
||||
+&xo_clk {
|
||||
+ clock-frequency = <48000000>;
|
||||
+};
|
||||
diff --git a/arch/arm64/boot/dts/qcom/ipq9574.dtsi b/arch/arm64/boot/dts/qcom/ipq9574.dtsi
|
||||
index 00ee3290c181..c543c3492e93 100644
|
||||
--- a/arch/arm64/boot/dts/qcom/ipq9574.dtsi
|
||||
+++ b/arch/arm64/boot/dts/qcom/ipq9574.dtsi
|
||||
@@ -3,10 +3,11 @@
|
||||
* IPQ9574 SoC device tree source
|
||||
*
|
||||
* Copyright (c) 2020-2021 The Linux Foundation. All rights reserved.
|
||||
- * Copyright (c) 2023, Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
+ * Copyright (c) 2023-2024, Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
*/
|
||||
|
||||
#include <dt-bindings/clock/qcom,apss-ipq.h>
|
||||
+#include <dt-bindings/clock/qcom,ipq-cmn-pll.h>
|
||||
#include <dt-bindings/clock/qcom,ipq9574-gcc.h>
|
||||
#include <dt-bindings/interconnect/qcom,ipq9574.h>
|
||||
#include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||
@@ -19,6 +20,12 @@ / {
|
||||
#size-cells = <2>;
|
||||
|
||||
clocks {
|
||||
+ ref_48mhz_clk: ref-48mhz-clk {
|
||||
+ compatible = "fixed-factor-clock";
|
||||
+ clocks = <&xo_clk>;
|
||||
+ #clock-cells = <0>;
|
||||
+ };
|
||||
+
|
||||
sleep_clk: sleep-clk {
|
||||
compatible = "fixed-clock";
|
||||
#clock-cells = <0>;
|
||||
@@ -28,6 +35,11 @@ xo_board_clk: xo-board-clk {
|
||||
compatible = "fixed-clock";
|
||||
#clock-cells = <0>;
|
||||
};
|
||||
+
|
||||
+ xo_clk: xo-clk {
|
||||
+ compatible = "fixed-clock";
|
||||
+ #clock-cells = <0>;
|
||||
+ };
|
||||
};
|
||||
|
||||
cpus {
|
||||
@@ -335,6 +347,18 @@ pcie1_phy: phy@fc000 {
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
+ cmn_pll: clock-controller@9b000 {
|
||||
+ compatible = "qcom,ipq9574-cmn-pll";
|
||||
+ reg = <0x0009b000 0x800>;
|
||||
+ clocks = <&ref_48mhz_clk>,
|
||||
+ <&gcc GCC_CMN_12GPLL_AHB_CLK>,
|
||||
+ <&gcc GCC_CMN_12GPLL_SYS_CLK>;
|
||||
+ clock-names = "ref", "ahb", "sys";
|
||||
+ #clock-cells = <1>;
|
||||
+ assigned-clocks = <&cmn_pll CMN_PLL_CLK>;
|
||||
+ assigned-clock-rates-u64 = /bits/ 64 <12000000000>;
|
||||
+ };
|
||||
+
|
||||
qfprom: efuse@a4000 {
|
||||
compatible = "qcom,ipq9574-qfprom", "qcom,qfprom";
|
||||
reg = <0x000a4000 0x5a1>;
|
||||
--
|
||||
2.47.1
|
||||
|
@ -0,0 +1,55 @@
|
||||
From 050b312654523aac9495eae3cf7bfa868fd981ce Mon Sep 17 00:00:00 2001
|
||||
From: Luo Jie <quic_luoj@quicinc.com>
|
||||
Date: Fri, 3 Jan 2025 15:31:38 +0800
|
||||
Subject: [PATCH 3/3] arm64: dts: qcom: ipq9574: Update xo_board_clk to use
|
||||
fixed factor clock
|
||||
|
||||
xo_board_clk is fixed to 24 MHZ, which is routed from WiFi output clock
|
||||
48 MHZ (also being the reference clock of CMN PLL) divided 2 by analog
|
||||
block routing channel.
|
||||
|
||||
Reviewed-by: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com>
|
||||
Signed-off-by: Luo Jie <quic_luoj@quicinc.com>
|
||||
Link: https://lore.kernel.org/r/20250103-qcom_ipq_cmnpll-v8-5-c89fb4d4849d@quicinc.com
|
||||
Signed-off-by: Bjorn Andersson <andersson@kernel.org>
|
||||
---
|
||||
arch/arm64/boot/dts/qcom/ipq9574-rdp-common.dtsi | 7 ++++++-
|
||||
arch/arm64/boot/dts/qcom/ipq9574.dtsi | 3 ++-
|
||||
2 files changed, 8 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/qcom/ipq9574-rdp-common.dtsi b/arch/arm64/boot/dts/qcom/ipq9574-rdp-common.dtsi
|
||||
index bb1ff79360d3..ae12f069f26f 100644
|
||||
--- a/arch/arm64/boot/dts/qcom/ipq9574-rdp-common.dtsi
|
||||
+++ b/arch/arm64/boot/dts/qcom/ipq9574-rdp-common.dtsi
|
||||
@@ -175,8 +175,13 @@ &ref_48mhz_clk {
|
||||
clock-mult = <1>;
|
||||
};
|
||||
|
||||
+/*
|
||||
+ * The frequency of xo_board_clk is fixed to 24 MHZ, which is routed
|
||||
+ * from WiFi output clock 48 MHZ divided by 2.
|
||||
+ */
|
||||
&xo_board_clk {
|
||||
- clock-frequency = <24000000>;
|
||||
+ clock-div = <2>;
|
||||
+ clock-mult = <1>;
|
||||
};
|
||||
|
||||
&xo_clk {
|
||||
diff --git a/arch/arm64/boot/dts/qcom/ipq9574.dtsi b/arch/arm64/boot/dts/qcom/ipq9574.dtsi
|
||||
index c543c3492e93..3e93484e7e32 100644
|
||||
--- a/arch/arm64/boot/dts/qcom/ipq9574.dtsi
|
||||
+++ b/arch/arm64/boot/dts/qcom/ipq9574.dtsi
|
||||
@@ -32,7 +32,8 @@ sleep_clk: sleep-clk {
|
||||
};
|
||||
|
||||
xo_board_clk: xo-board-clk {
|
||||
- compatible = "fixed-clock";
|
||||
+ compatible = "fixed-factor-clock";
|
||||
+ clocks = <&ref_48mhz_clk>;
|
||||
#clock-cells = <0>;
|
||||
};
|
||||
|
||||
--
|
||||
2.47.1
|
||||
|
@ -0,0 +1,393 @@
|
||||
From 652935ba05860eadaa19ac9efe7aea61fb7a3aef Mon Sep 17 00:00:00 2001
|
||||
From: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
|
||||
Date: Wed, 17 Apr 2024 12:32:53 +0530
|
||||
Subject: [PATCH] PCI: qcom: Use devm_clk_bulk_get_all() API
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
There is no need for the device drivers to validate the clocks defined in
|
||||
Devicetree. The validation should be performed by the DT schema and the
|
||||
drivers should just get all the clocks from DT. Right now the driver
|
||||
hardcodes the clock info and validates them against DT which is redundant.
|
||||
|
||||
So use devm_clk_bulk_get_all() that just gets all the clocks defined in DT
|
||||
and get rid of all static clocks info from the driver. This simplifies the
|
||||
driver.
|
||||
|
||||
Link: https://lore.kernel.org/linux-pci/20240417-pci-qcom-clk-bulk-v1-1-52ca19b3d6b2@linaro.org
|
||||
Signed-off-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
|
||||
Signed-off-by: Krzysztof Wilczyński <kwilczynski@kernel.org>
|
||||
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
|
||||
---
|
||||
drivers/pci/controller/dwc/pcie-qcom.c | 177 ++++++++-----------------
|
||||
1 file changed, 58 insertions(+), 119 deletions(-)
|
||||
|
||||
diff --git a/drivers/pci/controller/dwc/pcie-qcom.c b/drivers/pci/controller/dwc/pcie-qcom.c
|
||||
index 14772edcf0d3..3d2eeff9a876 100644
|
||||
--- a/drivers/pci/controller/dwc/pcie-qcom.c
|
||||
+++ b/drivers/pci/controller/dwc/pcie-qcom.c
|
||||
@@ -154,58 +154,56 @@
|
||||
#define QCOM_PCIE_LINK_SPEED_TO_BW(speed) \
|
||||
Mbps_to_icc(PCIE_SPEED2MBS_ENC(pcie_link_speed[speed]))
|
||||
|
||||
-#define QCOM_PCIE_1_0_0_MAX_CLOCKS 4
|
||||
struct qcom_pcie_resources_1_0_0 {
|
||||
- struct clk_bulk_data clks[QCOM_PCIE_1_0_0_MAX_CLOCKS];
|
||||
+ struct clk_bulk_data *clks;
|
||||
+ int num_clks;
|
||||
struct reset_control *core;
|
||||
struct regulator *vdda;
|
||||
};
|
||||
|
||||
-#define QCOM_PCIE_2_1_0_MAX_CLOCKS 5
|
||||
#define QCOM_PCIE_2_1_0_MAX_RESETS 6
|
||||
#define QCOM_PCIE_2_1_0_MAX_SUPPLY 3
|
||||
struct qcom_pcie_resources_2_1_0 {
|
||||
- struct clk_bulk_data clks[QCOM_PCIE_2_1_0_MAX_CLOCKS];
|
||||
+ struct clk_bulk_data *clks;
|
||||
+ int num_clks;
|
||||
struct reset_control_bulk_data resets[QCOM_PCIE_2_1_0_MAX_RESETS];
|
||||
int num_resets;
|
||||
struct regulator_bulk_data supplies[QCOM_PCIE_2_1_0_MAX_SUPPLY];
|
||||
};
|
||||
|
||||
-#define QCOM_PCIE_2_3_2_MAX_CLOCKS 4
|
||||
#define QCOM_PCIE_2_3_2_MAX_SUPPLY 2
|
||||
struct qcom_pcie_resources_2_3_2 {
|
||||
- struct clk_bulk_data clks[QCOM_PCIE_2_3_2_MAX_CLOCKS];
|
||||
+ struct clk_bulk_data *clks;
|
||||
+ int num_clks;
|
||||
struct regulator_bulk_data supplies[QCOM_PCIE_2_3_2_MAX_SUPPLY];
|
||||
};
|
||||
|
||||
-#define QCOM_PCIE_2_3_3_MAX_CLOCKS 5
|
||||
#define QCOM_PCIE_2_3_3_MAX_RESETS 7
|
||||
struct qcom_pcie_resources_2_3_3 {
|
||||
- struct clk_bulk_data clks[QCOM_PCIE_2_3_3_MAX_CLOCKS];
|
||||
+ struct clk_bulk_data *clks;
|
||||
+ int num_clks;
|
||||
struct reset_control_bulk_data rst[QCOM_PCIE_2_3_3_MAX_RESETS];
|
||||
};
|
||||
|
||||
-#define QCOM_PCIE_2_4_0_MAX_CLOCKS 4
|
||||
#define QCOM_PCIE_2_4_0_MAX_RESETS 12
|
||||
struct qcom_pcie_resources_2_4_0 {
|
||||
- struct clk_bulk_data clks[QCOM_PCIE_2_4_0_MAX_CLOCKS];
|
||||
+ struct clk_bulk_data *clks;
|
||||
int num_clks;
|
||||
struct reset_control_bulk_data resets[QCOM_PCIE_2_4_0_MAX_RESETS];
|
||||
int num_resets;
|
||||
};
|
||||
|
||||
-#define QCOM_PCIE_2_7_0_MAX_CLOCKS 15
|
||||
#define QCOM_PCIE_2_7_0_MAX_SUPPLIES 2
|
||||
struct qcom_pcie_resources_2_7_0 {
|
||||
- struct clk_bulk_data clks[QCOM_PCIE_2_7_0_MAX_CLOCKS];
|
||||
+ struct clk_bulk_data *clks;
|
||||
int num_clks;
|
||||
struct regulator_bulk_data supplies[QCOM_PCIE_2_7_0_MAX_SUPPLIES];
|
||||
struct reset_control *rst;
|
||||
};
|
||||
|
||||
-#define QCOM_PCIE_2_9_0_MAX_CLOCKS 5
|
||||
struct qcom_pcie_resources_2_9_0 {
|
||||
- struct clk_bulk_data clks[QCOM_PCIE_2_9_0_MAX_CLOCKS];
|
||||
+ struct clk_bulk_data *clks;
|
||||
+ int num_clks;
|
||||
struct reset_control *rst;
|
||||
};
|
||||
|
||||
@@ -337,21 +335,11 @@ static int qcom_pcie_get_resources_2_1_0(struct qcom_pcie *pcie)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
- res->clks[0].id = "iface";
|
||||
- res->clks[1].id = "core";
|
||||
- res->clks[2].id = "phy";
|
||||
- res->clks[3].id = "aux";
|
||||
- res->clks[4].id = "ref";
|
||||
-
|
||||
- /* iface, core, phy are required */
|
||||
- ret = devm_clk_bulk_get(dev, 3, res->clks);
|
||||
- if (ret < 0)
|
||||
- return ret;
|
||||
-
|
||||
- /* aux, ref are optional */
|
||||
- ret = devm_clk_bulk_get_optional(dev, 2, res->clks + 3);
|
||||
- if (ret < 0)
|
||||
- return ret;
|
||||
+ res->num_clks = devm_clk_bulk_get_all(dev, &res->clks);
|
||||
+ if (res->num_clks < 0) {
|
||||
+ dev_err(dev, "Failed to get clocks\n");
|
||||
+ return res->num_clks;
|
||||
+ }
|
||||
|
||||
res->resets[0].id = "pci";
|
||||
res->resets[1].id = "axi";
|
||||
@@ -373,7 +361,7 @@ static void qcom_pcie_deinit_2_1_0(struct qcom_pcie *pcie)
|
||||
{
|
||||
struct qcom_pcie_resources_2_1_0 *res = &pcie->res.v2_1_0;
|
||||
|
||||
- clk_bulk_disable_unprepare(ARRAY_SIZE(res->clks), res->clks);
|
||||
+ clk_bulk_disable_unprepare(res->num_clks, res->clks);
|
||||
reset_control_bulk_assert(res->num_resets, res->resets);
|
||||
|
||||
writel(1, pcie->parf + PARF_PHY_CTRL);
|
||||
@@ -425,7 +413,7 @@ static int qcom_pcie_post_init_2_1_0(struct qcom_pcie *pcie)
|
||||
val &= ~PHY_TEST_PWR_DOWN;
|
||||
writel(val, pcie->parf + PARF_PHY_CTRL);
|
||||
|
||||
- ret = clk_bulk_prepare_enable(ARRAY_SIZE(res->clks), res->clks);
|
||||
+ ret = clk_bulk_prepare_enable(res->num_clks, res->clks);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
@@ -476,20 +464,16 @@ static int qcom_pcie_get_resources_1_0_0(struct qcom_pcie *pcie)
|
||||
struct qcom_pcie_resources_1_0_0 *res = &pcie->res.v1_0_0;
|
||||
struct dw_pcie *pci = pcie->pci;
|
||||
struct device *dev = pci->dev;
|
||||
- int ret;
|
||||
|
||||
res->vdda = devm_regulator_get(dev, "vdda");
|
||||
if (IS_ERR(res->vdda))
|
||||
return PTR_ERR(res->vdda);
|
||||
|
||||
- res->clks[0].id = "iface";
|
||||
- res->clks[1].id = "aux";
|
||||
- res->clks[2].id = "master_bus";
|
||||
- res->clks[3].id = "slave_bus";
|
||||
-
|
||||
- ret = devm_clk_bulk_get(dev, ARRAY_SIZE(res->clks), res->clks);
|
||||
- if (ret < 0)
|
||||
- return ret;
|
||||
+ res->num_clks = devm_clk_bulk_get_all(dev, &res->clks);
|
||||
+ if (res->num_clks < 0) {
|
||||
+ dev_err(dev, "Failed to get clocks\n");
|
||||
+ return res->num_clks;
|
||||
+ }
|
||||
|
||||
res->core = devm_reset_control_get_exclusive(dev, "core");
|
||||
return PTR_ERR_OR_ZERO(res->core);
|
||||
@@ -500,7 +484,7 @@ static void qcom_pcie_deinit_1_0_0(struct qcom_pcie *pcie)
|
||||
struct qcom_pcie_resources_1_0_0 *res = &pcie->res.v1_0_0;
|
||||
|
||||
reset_control_assert(res->core);
|
||||
- clk_bulk_disable_unprepare(ARRAY_SIZE(res->clks), res->clks);
|
||||
+ clk_bulk_disable_unprepare(res->num_clks, res->clks);
|
||||
regulator_disable(res->vdda);
|
||||
}
|
||||
|
||||
@@ -517,7 +501,7 @@ static int qcom_pcie_init_1_0_0(struct qcom_pcie *pcie)
|
||||
return ret;
|
||||
}
|
||||
|
||||
- ret = clk_bulk_prepare_enable(ARRAY_SIZE(res->clks), res->clks);
|
||||
+ ret = clk_bulk_prepare_enable(res->num_clks, res->clks);
|
||||
if (ret) {
|
||||
dev_err(dev, "cannot prepare/enable clocks\n");
|
||||
goto err_assert_reset;
|
||||
@@ -532,7 +516,7 @@ static int qcom_pcie_init_1_0_0(struct qcom_pcie *pcie)
|
||||
return 0;
|
||||
|
||||
err_disable_clks:
|
||||
- clk_bulk_disable_unprepare(ARRAY_SIZE(res->clks), res->clks);
|
||||
+ clk_bulk_disable_unprepare(res->num_clks, res->clks);
|
||||
err_assert_reset:
|
||||
reset_control_assert(res->core);
|
||||
|
||||
@@ -580,14 +564,11 @@ static int qcom_pcie_get_resources_2_3_2(struct qcom_pcie *pcie)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
- res->clks[0].id = "aux";
|
||||
- res->clks[1].id = "cfg";
|
||||
- res->clks[2].id = "bus_master";
|
||||
- res->clks[3].id = "bus_slave";
|
||||
-
|
||||
- ret = devm_clk_bulk_get(dev, ARRAY_SIZE(res->clks), res->clks);
|
||||
- if (ret < 0)
|
||||
- return ret;
|
||||
+ res->num_clks = devm_clk_bulk_get_all(dev, &res->clks);
|
||||
+ if (res->num_clks < 0) {
|
||||
+ dev_err(dev, "Failed to get clocks\n");
|
||||
+ return res->num_clks;
|
||||
+ }
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -596,7 +577,7 @@ static void qcom_pcie_deinit_2_3_2(struct qcom_pcie *pcie)
|
||||
{
|
||||
struct qcom_pcie_resources_2_3_2 *res = &pcie->res.v2_3_2;
|
||||
|
||||
- clk_bulk_disable_unprepare(ARRAY_SIZE(res->clks), res->clks);
|
||||
+ clk_bulk_disable_unprepare(res->num_clks, res->clks);
|
||||
regulator_bulk_disable(ARRAY_SIZE(res->supplies), res->supplies);
|
||||
}
|
||||
|
||||
@@ -613,7 +594,7 @@ static int qcom_pcie_init_2_3_2(struct qcom_pcie *pcie)
|
||||
return ret;
|
||||
}
|
||||
|
||||
- ret = clk_bulk_prepare_enable(ARRAY_SIZE(res->clks), res->clks);
|
||||
+ ret = clk_bulk_prepare_enable(res->num_clks, res->clks);
|
||||
if (ret) {
|
||||
dev_err(dev, "cannot prepare/enable clocks\n");
|
||||
regulator_bulk_disable(ARRAY_SIZE(res->supplies), res->supplies);
|
||||
@@ -661,17 +642,11 @@ static int qcom_pcie_get_resources_2_4_0(struct qcom_pcie *pcie)
|
||||
bool is_ipq = of_device_is_compatible(dev->of_node, "qcom,pcie-ipq4019");
|
||||
int ret;
|
||||
|
||||
- res->clks[0].id = "aux";
|
||||
- res->clks[1].id = "master_bus";
|
||||
- res->clks[2].id = "slave_bus";
|
||||
- res->clks[3].id = "iface";
|
||||
-
|
||||
- /* qcom,pcie-ipq4019 is defined without "iface" */
|
||||
- res->num_clks = is_ipq ? 3 : 4;
|
||||
-
|
||||
- ret = devm_clk_bulk_get(dev, res->num_clks, res->clks);
|
||||
- if (ret < 0)
|
||||
- return ret;
|
||||
+ res->num_clks = devm_clk_bulk_get_all(dev, &res->clks);
|
||||
+ if (res->num_clks < 0) {
|
||||
+ dev_err(dev, "Failed to get clocks\n");
|
||||
+ return res->num_clks;
|
||||
+ }
|
||||
|
||||
res->resets[0].id = "axi_m";
|
||||
res->resets[1].id = "axi_s";
|
||||
@@ -742,15 +717,11 @@ static int qcom_pcie_get_resources_2_3_3(struct qcom_pcie *pcie)
|
||||
struct device *dev = pci->dev;
|
||||
int ret;
|
||||
|
||||
- res->clks[0].id = "iface";
|
||||
- res->clks[1].id = "axi_m";
|
||||
- res->clks[2].id = "axi_s";
|
||||
- res->clks[3].id = "ahb";
|
||||
- res->clks[4].id = "aux";
|
||||
-
|
||||
- ret = devm_clk_bulk_get(dev, ARRAY_SIZE(res->clks), res->clks);
|
||||
- if (ret < 0)
|
||||
- return ret;
|
||||
+ res->num_clks = devm_clk_bulk_get_all(dev, &res->clks);
|
||||
+ if (res->num_clks < 0) {
|
||||
+ dev_err(dev, "Failed to get clocks\n");
|
||||
+ return res->num_clks;
|
||||
+ }
|
||||
|
||||
res->rst[0].id = "axi_m";
|
||||
res->rst[1].id = "axi_s";
|
||||
@@ -771,7 +742,7 @@ static void qcom_pcie_deinit_2_3_3(struct qcom_pcie *pcie)
|
||||
{
|
||||
struct qcom_pcie_resources_2_3_3 *res = &pcie->res.v2_3_3;
|
||||
|
||||
- clk_bulk_disable_unprepare(ARRAY_SIZE(res->clks), res->clks);
|
||||
+ clk_bulk_disable_unprepare(res->num_clks, res->clks);
|
||||
}
|
||||
|
||||
static int qcom_pcie_init_2_3_3(struct qcom_pcie *pcie)
|
||||
@@ -801,7 +772,7 @@ static int qcom_pcie_init_2_3_3(struct qcom_pcie *pcie)
|
||||
*/
|
||||
usleep_range(2000, 2500);
|
||||
|
||||
- ret = clk_bulk_prepare_enable(ARRAY_SIZE(res->clks), res->clks);
|
||||
+ ret = clk_bulk_prepare_enable(res->num_clks, res->clks);
|
||||
if (ret) {
|
||||
dev_err(dev, "cannot prepare/enable clocks\n");
|
||||
goto err_assert_resets;
|
||||
@@ -862,8 +833,6 @@ static int qcom_pcie_get_resources_2_7_0(struct qcom_pcie *pcie)
|
||||
struct qcom_pcie_resources_2_7_0 *res = &pcie->res.v2_7_0;
|
||||
struct dw_pcie *pci = pcie->pci;
|
||||
struct device *dev = pci->dev;
|
||||
- unsigned int num_clks, num_opt_clks;
|
||||
- unsigned int idx;
|
||||
int ret;
|
||||
|
||||
res->rst = devm_reset_control_array_get_exclusive(dev);
|
||||
@@ -877,36 +846,11 @@ static int qcom_pcie_get_resources_2_7_0(struct qcom_pcie *pcie)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
- idx = 0;
|
||||
- res->clks[idx++].id = "aux";
|
||||
- res->clks[idx++].id = "cfg";
|
||||
- res->clks[idx++].id = "bus_master";
|
||||
- res->clks[idx++].id = "bus_slave";
|
||||
- res->clks[idx++].id = "slave_q2a";
|
||||
-
|
||||
- num_clks = idx;
|
||||
-
|
||||
- ret = devm_clk_bulk_get(dev, num_clks, res->clks);
|
||||
- if (ret < 0)
|
||||
- return ret;
|
||||
-
|
||||
- res->clks[idx++].id = "tbu";
|
||||
- res->clks[idx++].id = "ddrss_sf_tbu";
|
||||
- res->clks[idx++].id = "aggre0";
|
||||
- res->clks[idx++].id = "aggre1";
|
||||
- res->clks[idx++].id = "noc_aggr";
|
||||
- res->clks[idx++].id = "noc_aggr_4";
|
||||
- res->clks[idx++].id = "noc_aggr_south_sf";
|
||||
- res->clks[idx++].id = "cnoc_qx";
|
||||
- res->clks[idx++].id = "sleep";
|
||||
- res->clks[idx++].id = "cnoc_sf_axi";
|
||||
-
|
||||
- num_opt_clks = idx - num_clks;
|
||||
- res->num_clks = idx;
|
||||
-
|
||||
- ret = devm_clk_bulk_get_optional(dev, num_opt_clks, res->clks + num_clks);
|
||||
- if (ret < 0)
|
||||
- return ret;
|
||||
+ res->num_clks = devm_clk_bulk_get_all(dev, &res->clks);
|
||||
+ if (res->num_clks < 0) {
|
||||
+ dev_err(dev, "Failed to get clocks\n");
|
||||
+ return res->num_clks;
|
||||
+ }
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -1101,17 +1045,12 @@ static int qcom_pcie_get_resources_2_9_0(struct qcom_pcie *pcie)
|
||||
struct qcom_pcie_resources_2_9_0 *res = &pcie->res.v2_9_0;
|
||||
struct dw_pcie *pci = pcie->pci;
|
||||
struct device *dev = pci->dev;
|
||||
- int ret;
|
||||
-
|
||||
- res->clks[0].id = "iface";
|
||||
- res->clks[1].id = "axi_m";
|
||||
- res->clks[2].id = "axi_s";
|
||||
- res->clks[3].id = "axi_bridge";
|
||||
- res->clks[4].id = "rchng";
|
||||
|
||||
- ret = devm_clk_bulk_get(dev, ARRAY_SIZE(res->clks), res->clks);
|
||||
- if (ret < 0)
|
||||
- return ret;
|
||||
+ res->num_clks = devm_clk_bulk_get_all(dev, &res->clks);
|
||||
+ if (res->num_clks < 0) {
|
||||
+ dev_err(dev, "Failed to get clocks\n");
|
||||
+ return res->num_clks;
|
||||
+ }
|
||||
|
||||
res->rst = devm_reset_control_array_get_exclusive(dev);
|
||||
if (IS_ERR(res->rst))
|
||||
@@ -1124,7 +1063,7 @@ static void qcom_pcie_deinit_2_9_0(struct qcom_pcie *pcie)
|
||||
{
|
||||
struct qcom_pcie_resources_2_9_0 *res = &pcie->res.v2_9_0;
|
||||
|
||||
- clk_bulk_disable_unprepare(ARRAY_SIZE(res->clks), res->clks);
|
||||
+ clk_bulk_disable_unprepare(res->num_clks, res->clks);
|
||||
}
|
||||
|
||||
static int qcom_pcie_init_2_9_0(struct qcom_pcie *pcie)
|
||||
@@ -1153,7 +1092,7 @@ static int qcom_pcie_init_2_9_0(struct qcom_pcie *pcie)
|
||||
|
||||
usleep_range(2000, 2500);
|
||||
|
||||
- return clk_bulk_prepare_enable(ARRAY_SIZE(res->clks), res->clks);
|
||||
+ return clk_bulk_prepare_enable(res->num_clks, res->clks);
|
||||
}
|
||||
|
||||
static int qcom_pcie_post_init_2_9_0(struct qcom_pcie *pcie)
|
||||
--
|
||||
2.47.1
|
||||
|
@ -0,0 +1,286 @@
|
||||
From 10ba0854c5e6165b58e17bda5fb671e729fecf9e Mon Sep 17 00:00:00 2001
|
||||
From: Prudhvi Yarlagadda <quic_pyarlaga@quicinc.com>
|
||||
Date: Wed, 14 Aug 2024 15:03:38 -0700
|
||||
Subject: [PATCH] PCI: qcom: Disable mirroring of DBI and iATU register space
|
||||
in BAR region
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
PARF hardware block which is a wrapper on top of DWC PCIe controller
|
||||
mirrors the DBI and ATU register space. It uses PARF_SLV_ADDR_SPACE_SIZE
|
||||
register to get the size of the memory block to be mirrored and uses
|
||||
PARF_DBI_BASE_ADDR, PARF_ATU_BASE_ADDR registers to determine the base
|
||||
address of DBI and ATU space inside the memory block that is being
|
||||
mirrored.
|
||||
|
||||
When a memory region which is located above the SLV_ADDR_SPACE_SIZE
|
||||
boundary is used for BAR region then there could be an overlap of DBI and
|
||||
ATU address space that is getting mirrored and the BAR region. This
|
||||
results in DBI and ATU address space contents getting updated when a PCIe
|
||||
function driver tries updating the BAR/MMIO memory region. Reference
|
||||
memory map of the PCIe memory region with DBI and ATU address space
|
||||
overlapping BAR region is as below.
|
||||
|
||||
|---------------|
|
||||
| |
|
||||
| |
|
||||
------- --------|---------------|
|
||||
| | |---------------|
|
||||
| | | DBI |
|
||||
| | |---------------|---->DBI_BASE_ADDR
|
||||
| | | |
|
||||
| | | |
|
||||
| PCIe | |---->2*SLV_ADDR_SPACE_SIZE
|
||||
| BAR/MMIO|---------------|
|
||||
| Region | ATU |
|
||||
| | |---------------|---->ATU_BASE_ADDR
|
||||
| | | |
|
||||
PCIe | |---------------|
|
||||
Memory | | DBI |
|
||||
Region | |---------------|---->DBI_BASE_ADDR
|
||||
| | | |
|
||||
| --------| |
|
||||
| | |---->SLV_ADDR_SPACE_SIZE
|
||||
| |---------------|
|
||||
| | ATU |
|
||||
| |---------------|---->ATU_BASE_ADDR
|
||||
| | |
|
||||
| |---------------|
|
||||
| | DBI |
|
||||
| |---------------|---->DBI_BASE_ADDR
|
||||
| | |
|
||||
| | |
|
||||
----------------|---------------|
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
|---------------|
|
||||
|
||||
Currently memory region beyond the SLV_ADDR_SPACE_SIZE boundary is not
|
||||
used for BAR region which is why the above mentioned issue is not
|
||||
encountered. This issue is discovered as part of internal testing when we
|
||||
tried moving the BAR region beyond the SLV_ADDR_SPACE_SIZE boundary. Hence
|
||||
we are trying to fix this.
|
||||
|
||||
As PARF hardware block mirrors DBI and ATU register space after every
|
||||
PARF_SLV_ADDR_SPACE_SIZE (default 0x1000000) boundary multiple, program
|
||||
maximum possible size to this register by writing 0x80000000 to it(it
|
||||
considers only powers of 2 as values) to avoid mirroring DBI and ATU to
|
||||
BAR/MMIO region. Write the physical base address of DBI and ATU register
|
||||
blocks to PARF_DBI_BASE_ADDR (default 0x0) and PARF_ATU_BASE_ADDR (default
|
||||
0x1000) respectively to make sure DBI and ATU blocks are at expected
|
||||
memory locations.
|
||||
|
||||
The register offsets PARF_DBI_BASE_ADDR_V2, PARF_SLV_ADDR_SPACE_SIZE_V2
|
||||
and PARF_ATU_BASE_ADDR are applicable for platforms that use Qcom IP
|
||||
rev 1.9.0, 2.7.0 and 2.9.0. PARF_DBI_BASE_ADDR_V2 and
|
||||
PARF_SLV_ADDR_SPACE_SIZE_V2 are applicable for Qcom IP rev 2.3.3.
|
||||
PARF_DBI_BASE_ADDR and PARF_SLV_ADDR_SPACE_SIZE are applicable for Qcom
|
||||
IP rev 1.0.0, 2.3.2 and 2.4.0. Update init()/post_init() functions of the
|
||||
respective Qcom IP versions to program applicable PARF_DBI_BASE_ADDR,
|
||||
PARF_SLV_ADDR_SPACE_SIZE and PARF_ATU_BASE_ADDR register offsets. Update
|
||||
the SLV_ADDR_SPACE_SZ macro to 0x80000000 to set highest bit in
|
||||
PARF_SLV_ADDR_SPACE_SIZE register.
|
||||
|
||||
Cache DBI and iATU physical addresses in 'struct dw_pcie' so that
|
||||
pcie_qcom.c driver can program these addresses in the PARF_DBI_BASE_ADDR
|
||||
and PARF_ATU_BASE_ADDR registers.
|
||||
|
||||
Suggested-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
|
||||
Link: https://lore.kernel.org/linux-pci/20240814220338.1969668-1-quic_pyarlaga@quicinc.com
|
||||
Signed-off-by: Prudhvi Yarlagadda <quic_pyarlaga@quicinc.com>
|
||||
Signed-off-by: Krzysztof Wilczyński <kwilczynski@kernel.org>
|
||||
Reviewed-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
|
||||
Reviewed-by: Mayank Rana <quic_mrana@quicinc.com>
|
||||
---
|
||||
drivers/pci/controller/dwc/pcie-designware.c | 2 +
|
||||
drivers/pci/controller/dwc/pcie-designware.h | 2 +
|
||||
drivers/pci/controller/dwc/pcie-qcom.c | 72 ++++++++++++++++----
|
||||
3 files changed, 61 insertions(+), 15 deletions(-)
|
||||
|
||||
diff --git a/drivers/pci/controller/dwc/pcie-designware.c b/drivers/pci/controller/dwc/pcie-designware.c
|
||||
index 1b5aba1f0c92..bc3a5d6b0177 100644
|
||||
--- a/drivers/pci/controller/dwc/pcie-designware.c
|
||||
+++ b/drivers/pci/controller/dwc/pcie-designware.c
|
||||
@@ -112,6 +112,7 @@ int dw_pcie_get_resources(struct dw_pcie *pci)
|
||||
pci->dbi_base = devm_pci_remap_cfg_resource(pci->dev, res);
|
||||
if (IS_ERR(pci->dbi_base))
|
||||
return PTR_ERR(pci->dbi_base);
|
||||
+ pci->dbi_phys_addr = res->start;
|
||||
}
|
||||
|
||||
/* DBI2 is mainly useful for the endpoint controller */
|
||||
@@ -134,6 +135,7 @@ int dw_pcie_get_resources(struct dw_pcie *pci)
|
||||
pci->atu_base = devm_ioremap_resource(pci->dev, res);
|
||||
if (IS_ERR(pci->atu_base))
|
||||
return PTR_ERR(pci->atu_base);
|
||||
+ pci->atu_phys_addr = res->start;
|
||||
} else {
|
||||
pci->atu_base = pci->dbi_base + DEFAULT_DBI_ATU_OFFSET;
|
||||
}
|
||||
diff --git a/drivers/pci/controller/dwc/pcie-designware.h b/drivers/pci/controller/dwc/pcie-designware.h
|
||||
index 53c4c8f399c8..e518f81ea80c 100644
|
||||
--- a/drivers/pci/controller/dwc/pcie-designware.h
|
||||
+++ b/drivers/pci/controller/dwc/pcie-designware.h
|
||||
@@ -407,8 +407,10 @@ struct dw_pcie_ops {
|
||||
struct dw_pcie {
|
||||
struct device *dev;
|
||||
void __iomem *dbi_base;
|
||||
+ resource_size_t dbi_phys_addr;
|
||||
void __iomem *dbi_base2;
|
||||
void __iomem *atu_base;
|
||||
+ resource_size_t atu_phys_addr;
|
||||
size_t atu_size;
|
||||
u32 num_ib_windows;
|
||||
u32 num_ob_windows;
|
||||
diff --git a/drivers/pci/controller/dwc/pcie-qcom.c b/drivers/pci/controller/dwc/pcie-qcom.c
|
||||
index a1d678fe7fa5..1923266acea8 100644
|
||||
--- a/drivers/pci/controller/dwc/pcie-qcom.c
|
||||
+++ b/drivers/pci/controller/dwc/pcie-qcom.c
|
||||
@@ -45,6 +45,7 @@
|
||||
#define PARF_PHY_REFCLK 0x4c
|
||||
#define PARF_CONFIG_BITS 0x50
|
||||
#define PARF_DBI_BASE_ADDR 0x168
|
||||
+#define PARF_SLV_ADDR_SPACE_SIZE 0x16c
|
||||
#define PARF_MHI_CLOCK_RESET_CTRL 0x174
|
||||
#define PARF_AXI_MSTR_WR_ADDR_HALT 0x178
|
||||
#define PARF_AXI_MSTR_WR_ADDR_HALT_V2 0x1a8
|
||||
@@ -55,7 +56,12 @@
|
||||
#define PARF_LTSSM 0x1b0
|
||||
#define PARF_SID_OFFSET 0x234
|
||||
#define PARF_BDF_TRANSLATE_CFG 0x24c
|
||||
-#define PARF_SLV_ADDR_SPACE_SIZE 0x358
|
||||
+#define PARF_DBI_BASE_ADDR_V2 0x350
|
||||
+#define PARF_DBI_BASE_ADDR_V2_HI 0x354
|
||||
+#define PARF_SLV_ADDR_SPACE_SIZE_V2 0x358
|
||||
+#define PARF_SLV_ADDR_SPACE_SIZE_V2_HI 0x35c
|
||||
+#define PARF_ATU_BASE_ADDR 0x634
|
||||
+#define PARF_ATU_BASE_ADDR_HI 0x638
|
||||
#define PARF_DEVICE_TYPE 0x1000
|
||||
#define PARF_BDF_TO_SID_TABLE_N 0x2000
|
||||
#define PARF_BDF_TO_SID_CFG 0x2c00
|
||||
@@ -111,7 +117,7 @@
|
||||
#define PHY_RX0_EQ(x) FIELD_PREP(GENMASK(26, 24), x)
|
||||
|
||||
/* PARF_SLV_ADDR_SPACE_SIZE register value */
|
||||
-#define SLV_ADDR_SPACE_SZ 0x10000000
|
||||
+#define SLV_ADDR_SPACE_SZ 0x80000000
|
||||
|
||||
/* PARF_MHI_CLOCK_RESET_CTRL register fields */
|
||||
#define AHB_CLK_EN BIT(0)
|
||||
@@ -330,6 +336,50 @@ static void qcom_pcie_clear_hpc(struct dw_pcie *pci)
|
||||
dw_pcie_dbi_ro_wr_dis(pci);
|
||||
}
|
||||
|
||||
+static void qcom_pcie_configure_dbi_base(struct qcom_pcie *pcie)
|
||||
+{
|
||||
+ struct dw_pcie *pci = pcie->pci;
|
||||
+
|
||||
+ if (pci->dbi_phys_addr) {
|
||||
+ /*
|
||||
+ * PARF_DBI_BASE_ADDR register is in CPU domain and require to
|
||||
+ * be programmed with CPU physical address.
|
||||
+ */
|
||||
+ writel(lower_32_bits(pci->dbi_phys_addr), pcie->parf +
|
||||
+ PARF_DBI_BASE_ADDR);
|
||||
+ writel(SLV_ADDR_SPACE_SZ, pcie->parf +
|
||||
+ PARF_SLV_ADDR_SPACE_SIZE);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+static void qcom_pcie_configure_dbi_atu_base(struct qcom_pcie *pcie)
|
||||
+{
|
||||
+ struct dw_pcie *pci = pcie->pci;
|
||||
+
|
||||
+ if (pci->dbi_phys_addr) {
|
||||
+ /*
|
||||
+ * PARF_DBI_BASE_ADDR_V2 and PARF_ATU_BASE_ADDR registers are
|
||||
+ * in CPU domain and require to be programmed with CPU
|
||||
+ * physical addresses.
|
||||
+ */
|
||||
+ writel(lower_32_bits(pci->dbi_phys_addr), pcie->parf +
|
||||
+ PARF_DBI_BASE_ADDR_V2);
|
||||
+ writel(upper_32_bits(pci->dbi_phys_addr), pcie->parf +
|
||||
+ PARF_DBI_BASE_ADDR_V2_HI);
|
||||
+
|
||||
+ if (pci->atu_phys_addr) {
|
||||
+ writel(lower_32_bits(pci->atu_phys_addr), pcie->parf +
|
||||
+ PARF_ATU_BASE_ADDR);
|
||||
+ writel(upper_32_bits(pci->atu_phys_addr), pcie->parf +
|
||||
+ PARF_ATU_BASE_ADDR_HI);
|
||||
+ }
|
||||
+
|
||||
+ writel(0x0, pcie->parf + PARF_SLV_ADDR_SPACE_SIZE_V2);
|
||||
+ writel(SLV_ADDR_SPACE_SZ, pcie->parf +
|
||||
+ PARF_SLV_ADDR_SPACE_SIZE_V2_HI);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
static void qcom_pcie_2_1_0_ltssm_enable(struct qcom_pcie *pcie)
|
||||
{
|
||||
u32 val;
|
||||
@@ -546,8 +596,7 @@ static int qcom_pcie_init_1_0_0(struct qcom_pcie *pcie)
|
||||
|
||||
static int qcom_pcie_post_init_1_0_0(struct qcom_pcie *pcie)
|
||||
{
|
||||
- /* change DBI base address */
|
||||
- writel(0, pcie->parf + PARF_DBI_BASE_ADDR);
|
||||
+ qcom_pcie_configure_dbi_base(pcie);
|
||||
|
||||
if (IS_ENABLED(CONFIG_PCI_MSI)) {
|
||||
u32 val = readl(pcie->parf + PARF_AXI_MSTR_WR_ADDR_HALT);
|
||||
@@ -634,8 +683,7 @@ static int qcom_pcie_post_init_2_3_2(struct qcom_pcie *pcie)
|
||||
val &= ~PHY_TEST_PWR_DOWN;
|
||||
writel(val, pcie->parf + PARF_PHY_CTRL);
|
||||
|
||||
- /* change DBI base address */
|
||||
- writel(0, pcie->parf + PARF_DBI_BASE_ADDR);
|
||||
+ qcom_pcie_configure_dbi_base(pcie);
|
||||
|
||||
/* MAC PHY_POWERDOWN MUX DISABLE */
|
||||
val = readl(pcie->parf + PARF_SYS_CTRL);
|
||||
@@ -817,13 +865,11 @@ static int qcom_pcie_post_init_2_3_3(struct qcom_pcie *pcie)
|
||||
u16 offset = dw_pcie_find_capability(pci, PCI_CAP_ID_EXP);
|
||||
u32 val;
|
||||
|
||||
- writel(SLV_ADDR_SPACE_SZ, pcie->parf + PARF_SLV_ADDR_SPACE_SIZE);
|
||||
-
|
||||
val = readl(pcie->parf + PARF_PHY_CTRL);
|
||||
val &= ~PHY_TEST_PWR_DOWN;
|
||||
writel(val, pcie->parf + PARF_PHY_CTRL);
|
||||
|
||||
- writel(0, pcie->parf + PARF_DBI_BASE_ADDR);
|
||||
+ qcom_pcie_configure_dbi_atu_base(pcie);
|
||||
|
||||
writel(MST_WAKEUP_EN | SLV_WAKEUP_EN | MSTR_ACLK_CGC_DIS
|
||||
| SLV_ACLK_CGC_DIS | CORE_CLK_CGC_DIS |
|
||||
@@ -919,8 +965,7 @@ static int qcom_pcie_init_2_7_0(struct qcom_pcie *pcie)
|
||||
val &= ~PHY_TEST_PWR_DOWN;
|
||||
writel(val, pcie->parf + PARF_PHY_CTRL);
|
||||
|
||||
- /* change DBI base address */
|
||||
- writel(0, pcie->parf + PARF_DBI_BASE_ADDR);
|
||||
+ qcom_pcie_configure_dbi_atu_base(pcie);
|
||||
|
||||
/* MAC PHY_POWERDOWN MUX DISABLE */
|
||||
val = readl(pcie->parf + PARF_SYS_CTRL);
|
||||
@@ -1129,14 +1174,11 @@ static int qcom_pcie_post_init_2_9_0(struct qcom_pcie *pcie)
|
||||
u32 val;
|
||||
int i;
|
||||
|
||||
- writel(SLV_ADDR_SPACE_SZ,
|
||||
- pcie->parf + PARF_SLV_ADDR_SPACE_SIZE);
|
||||
-
|
||||
val = readl(pcie->parf + PARF_PHY_CTRL);
|
||||
val &= ~PHY_TEST_PWR_DOWN;
|
||||
writel(val, pcie->parf + PARF_PHY_CTRL);
|
||||
|
||||
- writel(0, pcie->parf + PARF_DBI_BASE_ADDR);
|
||||
+ qcom_pcie_configure_dbi_atu_base(pcie);
|
||||
|
||||
writel(DEVICE_TYPE_RC, pcie->parf + PARF_DEVICE_TYPE);
|
||||
writel(BYPASS | MSTR_AXI_CLK_EN | AHB_CLK_EN,
|
||||
--
|
||||
2.47.1
|
||||
|
@ -0,0 +1,33 @@
|
||||
From f1aaa788b997ba8a7810da0696e89fd3f79ecce3 Mon Sep 17 00:00:00 2001
|
||||
From: devi priya <quic_devipriy@quicinc.com>
|
||||
Date: Thu, 16 May 2024 08:54:34 +0530
|
||||
Subject: [PATCH 1/3] phy: qcom-qmp: Add missing offsets for Qserdes PLL
|
||||
registers.
|
||||
|
||||
Add missing register offsets for Qserdes PLL.
|
||||
|
||||
Reviewed-by: Abel Vesa <abel.vesa@linaro.org>
|
||||
Signed-off-by: devi priya <quic_devipriy@quicinc.com>
|
||||
Link: https://lore.kernel.org/r/20240516032436.2681828-3-quic_devipriy@quicinc.com
|
||||
Signed-off-by: Vinod Koul <vkoul@kernel.org>
|
||||
---
|
||||
drivers/phy/qualcomm/phy-qcom-qmp-qserdes-pll.h | 3 +++
|
||||
1 file changed, 3 insertions(+)
|
||||
|
||||
diff --git a/drivers/phy/qualcomm/phy-qcom-qmp-qserdes-pll.h b/drivers/phy/qualcomm/phy-qcom-qmp-qserdes-pll.h
|
||||
index ad326e301a3a..231e59364e31 100644
|
||||
--- a/drivers/phy/qualcomm/phy-qcom-qmp-qserdes-pll.h
|
||||
+++ b/drivers/phy/qualcomm/phy-qcom-qmp-qserdes-pll.h
|
||||
@@ -8,6 +8,9 @@
|
||||
|
||||
/* QMP V2 PHY for PCIE gen3 ports - QSERDES PLL registers */
|
||||
#define QSERDES_PLL_BG_TIMER 0x00c
|
||||
+#define QSERDES_PLL_SSC_EN_CENTER 0x010
|
||||
+#define QSERDES_PLL_SSC_ADJ_PER1 0x014
|
||||
+#define QSERDES_PLL_SSC_ADJ_PER2 0x018
|
||||
#define QSERDES_PLL_SSC_PER1 0x01c
|
||||
#define QSERDES_PLL_SSC_PER2 0x020
|
||||
#define QSERDES_PLL_SSC_STEP_SIZE1_MODE0 0x024
|
||||
--
|
||||
2.47.1
|
||||
|
@ -0,0 +1,46 @@
|
||||
From 71ae2acf1d7542ecd21c6933cae8fe65d550074b Mon Sep 17 00:00:00 2001
|
||||
From: devi priya <quic_devipriy@quicinc.com>
|
||||
Date: Thu, 16 May 2024 08:54:35 +0530
|
||||
Subject: [PATCH 2/3] phy: qcom-qmp: Add missing register definitions for PCS
|
||||
V5
|
||||
|
||||
Add missing register offsets for PCS V5 registers.
|
||||
|
||||
Reviewed-by: Abel Vesa <abel.vesa@linaro.org>
|
||||
Signed-off-by: devi priya <quic_devipriy@quicinc.com>
|
||||
Link: https://lore.kernel.org/r/20240516032436.2681828-4-quic_devipriy@quicinc.com
|
||||
Signed-off-by: Vinod Koul <vkoul@kernel.org>
|
||||
---
|
||||
drivers/phy/qualcomm/phy-qcom-qmp-pcs-pcie-v5.h | 14 ++++++++++++++
|
||||
1 file changed, 14 insertions(+)
|
||||
|
||||
diff --git a/drivers/phy/qualcomm/phy-qcom-qmp-pcs-pcie-v5.h b/drivers/phy/qualcomm/phy-qcom-qmp-pcs-pcie-v5.h
|
||||
index a469ae2a10a1..fa15a03055de 100644
|
||||
--- a/drivers/phy/qualcomm/phy-qcom-qmp-pcs-pcie-v5.h
|
||||
+++ b/drivers/phy/qualcomm/phy-qcom-qmp-pcs-pcie-v5.h
|
||||
@@ -11,8 +11,22 @@
|
||||
#define QPHY_V5_PCS_PCIE_POWER_STATE_CONFIG2 0x0c
|
||||
#define QPHY_V5_PCS_PCIE_POWER_STATE_CONFIG4 0x14
|
||||
#define QPHY_V5_PCS_PCIE_ENDPOINT_REFCLK_DRIVE 0x20
|
||||
+#define QPHY_V5_PCS_PCIE_L1P1_WAKEUP_DLY_TIME_AUXCLK_L 0x44
|
||||
+#define QPHY_V5_PCS_PCIE_L1P1_WAKEUP_DLY_TIME_AUXCLK_H 0x48
|
||||
+#define QPHY_V5_PCS_PCIE_L1P2_WAKEUP_DLY_TIME_AUXCLK_L 0x4c
|
||||
+#define QPHY_V5_PCS_PCIE_L1P2_WAKEUP_DLY_TIME_AUXCLK_H 0x50
|
||||
#define QPHY_V5_PCS_PCIE_INT_AUX_CLK_CONFIG1 0x54
|
||||
+#define QPHY_V5_PCS_PCIE_OSC_DTCT_CONFIG1 0x5c
|
||||
+#define QPHY_V5_PCS_PCIE_OSC_DTCT_CONFIG2 0x60
|
||||
+#define QPHY_V5_PCS_PCIE_OSC_DTCT_CONFIG4 0x68
|
||||
+#define QPHY_V5_PCS_PCIE_OSC_DTCT_MODE2_CONFIG2 0x7c
|
||||
+#define QPHY_V5_PCS_PCIE_OSC_DTCT_MODE2_CONFIG4 0x84
|
||||
+#define QPHY_V5_PCS_PCIE_OSC_DTCT_MODE2_CONFIG5 0x88
|
||||
+#define QPHY_V5_PCS_PCIE_OSC_DTCT_MODE2_CONFIG6 0x8c
|
||||
#define QPHY_V5_PCS_PCIE_OSC_DTCT_ACTIONS 0x94
|
||||
+#define QPHY_V5_PCS_PCIE_EQ_CONFIG1 0xa4
|
||||
#define QPHY_V5_PCS_PCIE_EQ_CONFIG2 0xa8
|
||||
+#define QPHY_V5_PCS_PCIE_PRESET_P10_PRE 0xc0
|
||||
+#define QPHY_V5_PCS_PCIE_PRESET_P10_POST 0xe4
|
||||
|
||||
#endif
|
||||
--
|
||||
2.47.1
|
||||
|
@ -0,0 +1,363 @@
|
||||
From 2f2f5c13cc5ea87f1dd2debfd06fe5f624e5c0fd Mon Sep 17 00:00:00 2001
|
||||
From: devi priya <quic_devipriy@quicinc.com>
|
||||
Date: Thu, 16 May 2024 08:54:36 +0530
|
||||
Subject: [PATCH 3/3] phy: qcom-qmp-pcie: Add support for IPQ9574 g3x1 and g3x2
|
||||
PCIEs
|
||||
|
||||
Add support for a single-lane and two-lane PCIe PHYs
|
||||
found on Qualcomm IPQ9574 platform.
|
||||
|
||||
Reviewed-by: Abel Vesa <abel.vesa@linaro.org>
|
||||
Co-developed-by: Anusha Rao <quic_anusha@quicinc.com>
|
||||
Signed-off-by: Anusha Rao <quic_anusha@quicinc.com>
|
||||
Signed-off-by: devi priya <quic_devipriy@quicinc.com>
|
||||
Link: https://lore.kernel.org/r/20240516032436.2681828-5-quic_devipriy@quicinc.com
|
||||
Signed-off-by: Vinod Koul <vkoul@kernel.org>
|
||||
---
|
||||
drivers/phy/qualcomm/phy-qcom-qmp-pcie.c | 309 +++++++++++++++++++++++
|
||||
1 file changed, 309 insertions(+)
|
||||
|
||||
diff --git a/drivers/phy/qualcomm/phy-qcom-qmp-pcie.c b/drivers/phy/qualcomm/phy-qcom-qmp-pcie.c
|
||||
index 6c796723c8f5..8cb91b9114d6 100644
|
||||
--- a/drivers/phy/qualcomm/phy-qcom-qmp-pcie.c
|
||||
+++ b/drivers/phy/qualcomm/phy-qcom-qmp-pcie.c
|
||||
@@ -489,6 +489,243 @@ static const struct qmp_phy_init_tbl ipq8074_pcie_gen3_pcs_misc_tbl[] = {
|
||||
QMP_PHY_INIT_CFG(QPHY_V4_PCS_PCIE_ENDPOINT_REFCLK_DRIVE, 0xc1),
|
||||
};
|
||||
|
||||
+static const struct qmp_phy_init_tbl ipq9574_gen3x1_pcie_serdes_tbl[] = {
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_BIAS_EN_CLKBUFLR_EN, 0x18),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_BIAS_EN_CTRL_BY_PSM, 0x01),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_CLK_SELECT, 0x31),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_PLL_IVCO, 0x0f),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_BG_TRIM, 0x0f),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_CMN_CONFIG, 0x06),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_LOCK_CMP_EN, 0x42),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_RESETSM_CNTRL, 0x20),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_SVS_MODE_CLK_SEL, 0x01),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_VCO_TUNE_MAP, 0x04),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_SVS_MODE_CLK_SEL, 0x05),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_VCO_TUNE_TIMER1, 0xff),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_VCO_TUNE_TIMER2, 0x3f),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_CORE_CLK_EN, 0x30),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_HSCLK_SEL, 0x21),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_DEC_START_MODE0, 0x68),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_DIV_FRAC_START3_MODE0, 0x02),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_DIV_FRAC_START2_MODE0, 0xaa),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_DIV_FRAC_START1_MODE0, 0xab),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_LOCK_CMP2_MODE0, 0x14),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_LOCK_CMP1_MODE0, 0xd4),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_CP_CTRL_MODE0, 0x09),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_PLL_RCTRL_MODE0, 0x16),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_PLL_CCTRL_MODE0, 0x28),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_INTEGLOOP_GAIN1_MODE0, 0x00),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_INTEGLOOP_GAIN0_MODE0, 0xa0),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_VCO_TUNE2_MODE0, 0x02),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_VCO_TUNE1_MODE0, 0x24),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_SVS_MODE_CLK_SEL, 0x05),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_CORE_CLK_EN, 0x20),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_CORECLK_DIV, 0x0a),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_CLK_SELECT, 0x32),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_SYS_CLK_CTRL, 0x02),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_SYSCLK_BUF_ENABLE, 0x07),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_SYSCLK_EN_SEL, 0x08),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_BG_TIMER, 0x0a),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_HSCLK_SEL, 0x01),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_DEC_START_MODE1, 0x53),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_DIV_FRAC_START3_MODE1, 0x05),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_DIV_FRAC_START2_MODE1, 0x55),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_DIV_FRAC_START1_MODE1, 0x55),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_LOCK_CMP2_MODE1, 0x29),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_LOCK_CMP1_MODE1, 0xaa),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_CP_CTRL_MODE1, 0x09),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_PLL_RCTRL_MODE1, 0x16),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_PLL_CCTRL_MODE1, 0x28),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_INTEGLOOP_GAIN1_MODE1, 0x00),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_INTEGLOOP_GAIN0_MODE1, 0xa0),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_VCO_TUNE2_MODE1, 0x03),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_VCO_TUNE1_MODE1, 0xb4),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_SVS_MODE_CLK_SEL, 0x05),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_CORE_CLK_EN, 0x00),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_CORECLK_DIV_MODE1, 0x08),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_SSC_EN_CENTER, 0x01),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_SSC_PER1, 0x7d),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_SSC_PER2, 0x01),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_SSC_ADJ_PER1, 0x00),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_SSC_ADJ_PER2, 0x00),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_SSC_STEP_SIZE1_MODE0, 0x0a),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_SSC_STEP_SIZE2_MODE0, 0x05),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_SSC_STEP_SIZE1_MODE1, 0x08),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_SSC_STEP_SIZE2_MODE1, 0x04),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_CLK_EP_DIV_MODE0, 0x19),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_CLK_EP_DIV_MODE1, 0x28),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_CLK_ENABLE1, 0x90),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_HSCLK_SEL, 0x89),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_CLK_ENABLE1, 0x10),
|
||||
+};
|
||||
+
|
||||
+static const struct qmp_phy_init_tbl ipq9574_gen3x2_pcie_serdes_tbl[] = {
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_BIAS_EN_CLKBUFLR_EN, 0x18),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_BIAS_EN_CTRL_BY_PSM, 0x01),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_CLK_SELECT, 0x31),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_PLL_IVCO, 0x0f),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_BG_TRIM, 0x0f),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_CMN_CONFIG, 0x06),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_LOCK_CMP_EN, 0x42),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_RESETSM_CNTRL, 0x20),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_SVS_MODE_CLK_SEL, 0x01),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_VCO_TUNE_MAP, 0x04),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_SVS_MODE_CLK_SEL, 0x05),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_VCO_TUNE_TIMER1, 0xff),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_VCO_TUNE_TIMER2, 0x3f),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_CORE_CLK_EN, 0x30),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_HSCLK_SEL, 0x21),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_DEC_START_MODE0, 0x68),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_DIV_FRAC_START3_MODE0, 0x02),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_DIV_FRAC_START2_MODE0, 0xaa),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_DIV_FRAC_START1_MODE0, 0xab),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_LOCK_CMP2_MODE0, 0x14),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_LOCK_CMP1_MODE0, 0xd4),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_CP_CTRL_MODE0, 0x09),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_PLL_RCTRL_MODE0, 0x16),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_PLL_CCTRL_MODE0, 0x28),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_INTEGLOOP_GAIN1_MODE0, 0x00),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_INTEGLOOP_GAIN0_MODE0, 0xa0),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_VCO_TUNE2_MODE0, 0x02),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_VCO_TUNE1_MODE0, 0x24),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_SVS_MODE_CLK_SEL, 0x05),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_CORE_CLK_EN, 0x00),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_CORECLK_DIV, 0x0a),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_CLK_SELECT, 0x32),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_SYS_CLK_CTRL, 0x02),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_SYSCLK_BUF_ENABLE, 0x07),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_SYSCLK_EN_SEL, 0x08),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_BG_TIMER, 0x0a),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_HSCLK_SEL, 0x01),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_DEC_START_MODE1, 0x53),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_DIV_FRAC_START3_MODE1, 0x05),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_DIV_FRAC_START2_MODE1, 0x55),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_DIV_FRAC_START1_MODE1, 0x55),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_LOCK_CMP2_MODE1, 0x29),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_LOCK_CMP1_MODE1, 0xaa),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_CP_CTRL_MODE1, 0x09),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_PLL_RCTRL_MODE1, 0x16),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_PLL_CCTRL_MODE1, 0x28),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_INTEGLOOP_GAIN1_MODE1, 0x00),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_INTEGLOOP_GAIN0_MODE1, 0xa0),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_VCO_TUNE2_MODE1, 0x03),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_VCO_TUNE1_MODE1, 0xb4),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_SVS_MODE_CLK_SEL, 0x05),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_CORE_CLK_EN, 0x00),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_CORECLK_DIV_MODE1, 0x08),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_SSC_EN_CENTER, 0x01),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_SSC_PER1, 0x7d),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_SSC_PER2, 0x01),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_SSC_ADJ_PER1, 0x00),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_SSC_ADJ_PER2, 0x00),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_SSC_STEP_SIZE1_MODE0, 0x0a),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_SSC_STEP_SIZE2_MODE0, 0x05),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_SSC_STEP_SIZE1_MODE1, 0x08),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_SSC_STEP_SIZE2_MODE1, 0x04),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_CLK_EP_DIV_MODE0, 0x19),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_CLK_EP_DIV_MODE1, 0x28),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_CLK_ENABLE1, 0x90),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_HSCLK_SEL, 0x89),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_PLL_CLK_ENABLE1, 0x10),
|
||||
+};
|
||||
+
|
||||
+static const struct qmp_phy_init_tbl ipq9574_pcie_rx_tbl[] = {
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_V4_RX_SIGDET_CNTRL, 0x03),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_V4_RX_SIGDET_ENABLES, 0x1c),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_V4_RX_SIGDET_DEGLITCH_CNTRL, 0x14),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL2, 0x61),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL3, 0x04),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL4, 0x1e),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_V4_RX_DFE_EN_TIMER, 0x04),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FO_GAIN, 0x0c),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SO_GAIN, 0x02),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SO_SATURATION_AND_ENABLE, 0x7f),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_PI_CONTROLS, 0x70),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL1, 0x73),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL2, 0x80),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_10_LOW, 0x00),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_10_HIGH, 0x02),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_10_HIGH2, 0xc8),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_10_HIGH3, 0x09),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_10_HIGH4, 0xb1),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_LOW, 0x00),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH, 0x02),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH2, 0xc8),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH3, 0x09),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH4, 0xb1),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_LOW, 0xf0),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH, 0x02),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH2, 0x2f),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH3, 0xd3),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH4, 0x40),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_IDAC_TSETTLE_HIGH, 0x00),
|
||||
+ QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_IDAC_TSETTLE_LOW, 0xc0),
|
||||
+};
|
||||
+
|
||||
+static const struct qmp_phy_init_tbl ipq9574_gen3x1_pcie_pcs_tbl[] = {
|
||||
+ QMP_PHY_INIT_CFG(QPHY_V4_PCS_P2U3_WAKEUP_DLY_TIME_AUXCLK_H, 0x00),
|
||||
+ QMP_PHY_INIT_CFG(QPHY_V4_PCS_P2U3_WAKEUP_DLY_TIME_AUXCLK_L, 0x01),
|
||||
+ QMP_PHY_INIT_CFG(QPHY_V4_PCS_RX_DCC_CAL_CONFIG, 0x01),
|
||||
+ QMP_PHY_INIT_CFG(QPHY_V4_PCS_RX_SIGDET_LVL, 0xaa),
|
||||
+ QMP_PHY_INIT_CFG(QPHY_V4_PCS_REFGEN_REQ_CONFIG1, 0x0d),
|
||||
+ QMP_PHY_INIT_CFG(QPHY_V4_PCS_G12S1_TXDEEMPH_M3P5DB, 0x10),
|
||||
+};
|
||||
+
|
||||
+static const struct qmp_phy_init_tbl ipq9574_gen3x1_pcie_pcs_misc_tbl[] = {
|
||||
+ QMP_PHY_INIT_CFG(QPHY_V4_PCS_PCIE_OSC_DTCT_ACTIONS, 0x00),
|
||||
+ QMP_PHY_INIT_CFG(QPHY_V4_PCS_PCIE_POWER_STATE_CONFIG2, 0x0d),
|
||||
+ QMP_PHY_INIT_CFG(QPHY_V4_PCS_PCIE_L1P1_WAKEUP_DLY_TIME_AUXCLK_H, 0x00),
|
||||
+ QMP_PHY_INIT_CFG(QPHY_V4_PCS_PCIE_L1P1_WAKEUP_DLY_TIME_AUXCLK_L, 0x01),
|
||||
+ QMP_PHY_INIT_CFG(QPHY_V4_PCS_PCIE_L1P2_WAKEUP_DLY_TIME_AUXCLK_H, 0x00),
|
||||
+ QMP_PHY_INIT_CFG(QPHY_V4_PCS_PCIE_L1P2_WAKEUP_DLY_TIME_AUXCLK_L, 0x01),
|
||||
+ QMP_PHY_INIT_CFG(QPHY_V4_PCS_PCIE_EQ_CONFIG1, 0x14),
|
||||
+ QMP_PHY_INIT_CFG(QPHY_V4_PCS_PCIE_EQ_CONFIG1, 0x10),
|
||||
+ QMP_PHY_INIT_CFG(QPHY_V4_PCS_PCIE_EQ_CONFIG2, 0x0b),
|
||||
+ QMP_PHY_INIT_CFG(QPHY_V4_PCS_PCIE_PRESET_P10_PRE, 0x00),
|
||||
+ QMP_PHY_INIT_CFG(QPHY_V4_PCS_PCIE_PRESET_P10_POST, 0x58),
|
||||
+ QMP_PHY_INIT_CFG(QPHY_V4_PCS_PCIE_POWER_STATE_CONFIG4, 0x07),
|
||||
+ QMP_PHY_INIT_CFG(QPHY_V4_PCS_PCIE_OSC_DTCT_CONFIG2, 0x52),
|
||||
+ QMP_PHY_INIT_CFG(QPHY_V4_PCS_PCIE_INT_AUX_CLK_CONFIG1, 0x00),
|
||||
+ QMP_PHY_INIT_CFG(QPHY_V4_PCS_PCIE_OSC_DTCT_MODE2_CONFIG2, 0x50),
|
||||
+ QMP_PHY_INIT_CFG(QPHY_V4_PCS_PCIE_OSC_DTCT_MODE2_CONFIG4, 0x1a),
|
||||
+ QMP_PHY_INIT_CFG(QPHY_V4_PCS_PCIE_OSC_DTCT_MODE2_CONFIG5, 0x06),
|
||||
+ QMP_PHY_INIT_CFG(QPHY_V4_PCS_PCIE_OSC_DTCT_MODE2_CONFIG6, 0x03),
|
||||
+ QMP_PHY_INIT_CFG(QPHY_V4_PCS_PCIE_ENDPOINT_REFCLK_DRIVE, 0xc1),
|
||||
+};
|
||||
+
|
||||
+static const struct qmp_phy_init_tbl ipq9574_gen3x2_pcie_pcs_tbl[] = {
|
||||
+ QMP_PHY_INIT_CFG(QPHY_V4_PCS_REFGEN_REQ_CONFIG1, 0x0d),
|
||||
+ QMP_PHY_INIT_CFG(QPHY_V4_PCS_G12S1_TXDEEMPH_M3P5DB, 0x10),
|
||||
+ QMP_PHY_INIT_CFG(QPHY_V4_PCS_P2U3_WAKEUP_DLY_TIME_AUXCLK_H, 0x00),
|
||||
+ QMP_PHY_INIT_CFG(QPHY_V4_PCS_P2U3_WAKEUP_DLY_TIME_AUXCLK_L, 0x01),
|
||||
+ QMP_PHY_INIT_CFG(QPHY_V4_PCS_RX_DCC_CAL_CONFIG, 0x01),
|
||||
+ QMP_PHY_INIT_CFG(QPHY_V4_PCS_RX_SIGDET_LVL, 0xaa),
|
||||
+};
|
||||
+
|
||||
+static const struct qmp_phy_init_tbl ipq9574_gen3x2_pcie_pcs_misc_tbl[] = {
|
||||
+ QMP_PHY_INIT_CFG(QPHY_V5_PCS_PCIE_OSC_DTCT_ACTIONS, 0x00),
|
||||
+ QMP_PHY_INIT_CFG(QPHY_V5_PCS_PCIE_POWER_STATE_CONFIG2, 0x1d),
|
||||
+ QMP_PHY_INIT_CFG(QPHY_V5_PCS_PCIE_L1P1_WAKEUP_DLY_TIME_AUXCLK_H, 0x00),
|
||||
+ QMP_PHY_INIT_CFG(QPHY_V5_PCS_PCIE_L1P1_WAKEUP_DLY_TIME_AUXCLK_L, 0x01),
|
||||
+ QMP_PHY_INIT_CFG(QPHY_V5_PCS_PCIE_L1P2_WAKEUP_DLY_TIME_AUXCLK_H, 0x00),
|
||||
+ QMP_PHY_INIT_CFG(QPHY_V5_PCS_PCIE_L1P2_WAKEUP_DLY_TIME_AUXCLK_L, 0x01),
|
||||
+ QMP_PHY_INIT_CFG(QPHY_V5_PCS_PCIE_EQ_CONFIG1, 0x14),
|
||||
+ QMP_PHY_INIT_CFG(QPHY_V5_PCS_PCIE_EQ_CONFIG1, 0x10),
|
||||
+ QMP_PHY_INIT_CFG(QPHY_V5_PCS_PCIE_EQ_CONFIG2, 0x0b),
|
||||
+ QMP_PHY_INIT_CFG(QPHY_V5_PCS_PCIE_PRESET_P10_PRE, 0x00),
|
||||
+ QMP_PHY_INIT_CFG(QPHY_V5_PCS_PCIE_PRESET_P10_POST, 0x58),
|
||||
+ QMP_PHY_INIT_CFG(QPHY_V5_PCS_PCIE_POWER_STATE_CONFIG4, 0x07),
|
||||
+ QMP_PHY_INIT_CFG(QPHY_V5_PCS_PCIE_OSC_DTCT_CONFIG1, 0x00),
|
||||
+ QMP_PHY_INIT_CFG(QPHY_V5_PCS_PCIE_OSC_DTCT_CONFIG2, 0x52),
|
||||
+ QMP_PHY_INIT_CFG(QPHY_V5_PCS_PCIE_OSC_DTCT_CONFIG4, 0x19),
|
||||
+ QMP_PHY_INIT_CFG(QPHY_V5_PCS_PCIE_INT_AUX_CLK_CONFIG1, 0x00),
|
||||
+ QMP_PHY_INIT_CFG(QPHY_V5_PCS_PCIE_OSC_DTCT_MODE2_CONFIG2, 0x49),
|
||||
+ QMP_PHY_INIT_CFG(QPHY_V5_PCS_PCIE_OSC_DTCT_MODE2_CONFIG4, 0x2a),
|
||||
+ QMP_PHY_INIT_CFG(QPHY_V5_PCS_PCIE_OSC_DTCT_MODE2_CONFIG5, 0x02),
|
||||
+ QMP_PHY_INIT_CFG(QPHY_V5_PCS_PCIE_OSC_DTCT_MODE2_CONFIG6, 0x03),
|
||||
+ QMP_PHY_INIT_CFG(QPHY_V5_PCS_PCIE_ENDPOINT_REFCLK_DRIVE, 0xc1),
|
||||
+};
|
||||
+
|
||||
static const struct qmp_phy_init_tbl sdm845_qmp_pcie_serdes_tbl[] = {
|
||||
QMP_PHY_INIT_CFG(QSERDES_V3_COM_BIAS_EN_CLKBUFLR_EN, 0x14),
|
||||
QMP_PHY_INIT_CFG(QSERDES_V3_COM_CLK_SELECT, 0x30),
|
||||
@@ -2535,6 +2772,16 @@ static const struct qmp_pcie_offsets qmp_pcie_offsets_v5 = {
|
||||
.rx2 = 0x1800,
|
||||
};
|
||||
|
||||
+static const struct qmp_pcie_offsets qmp_pcie_offsets_ipq9574 = {
|
||||
+ .serdes = 0,
|
||||
+ .pcs = 0x1000,
|
||||
+ .pcs_misc = 0x1400,
|
||||
+ .tx = 0x0200,
|
||||
+ .rx = 0x0400,
|
||||
+ .tx2 = 0x0600,
|
||||
+ .rx2 = 0x0800,
|
||||
+};
|
||||
+
|
||||
static const struct qmp_pcie_offsets qmp_pcie_offsets_v5_20 = {
|
||||
.serdes = 0x1000,
|
||||
.pcs = 0x1200,
|
||||
@@ -2647,6 +2894,62 @@ static const struct qmp_phy_cfg ipq6018_pciephy_cfg = {
|
||||
.phy_status = PHYSTATUS,
|
||||
};
|
||||
|
||||
+static const struct qmp_phy_cfg ipq9574_gen3x1_pciephy_cfg = {
|
||||
+ .lanes = 1,
|
||||
+
|
||||
+ .offsets = &qmp_pcie_offsets_v4x1,
|
||||
+
|
||||
+ .tbls = {
|
||||
+ .serdes = ipq9574_gen3x1_pcie_serdes_tbl,
|
||||
+ .serdes_num = ARRAY_SIZE(ipq9574_gen3x1_pcie_serdes_tbl),
|
||||
+ .tx = ipq8074_pcie_gen3_tx_tbl,
|
||||
+ .tx_num = ARRAY_SIZE(ipq8074_pcie_gen3_tx_tbl),
|
||||
+ .rx = ipq9574_pcie_rx_tbl,
|
||||
+ .rx_num = ARRAY_SIZE(ipq9574_pcie_rx_tbl),
|
||||
+ .pcs = ipq9574_gen3x1_pcie_pcs_tbl,
|
||||
+ .pcs_num = ARRAY_SIZE(ipq9574_gen3x1_pcie_pcs_tbl),
|
||||
+ .pcs_misc = ipq9574_gen3x1_pcie_pcs_misc_tbl,
|
||||
+ .pcs_misc_num = ARRAY_SIZE(ipq9574_gen3x1_pcie_pcs_misc_tbl),
|
||||
+ },
|
||||
+ .reset_list = ipq8074_pciephy_reset_l,
|
||||
+ .num_resets = ARRAY_SIZE(ipq8074_pciephy_reset_l),
|
||||
+ .vreg_list = NULL,
|
||||
+ .num_vregs = 0,
|
||||
+ .regs = pciephy_v4_regs_layout,
|
||||
+
|
||||
+ .pwrdn_ctrl = SW_PWRDN | REFCLK_DRV_DSBL,
|
||||
+ .phy_status = PHYSTATUS,
|
||||
+ .pipe_clock_rate = 250000000,
|
||||
+};
|
||||
+
|
||||
+static const struct qmp_phy_cfg ipq9574_gen3x2_pciephy_cfg = {
|
||||
+ .lanes = 2,
|
||||
+
|
||||
+ .offsets = &qmp_pcie_offsets_ipq9574,
|
||||
+
|
||||
+ .tbls = {
|
||||
+ .serdes = ipq9574_gen3x2_pcie_serdes_tbl,
|
||||
+ .serdes_num = ARRAY_SIZE(ipq9574_gen3x2_pcie_serdes_tbl),
|
||||
+ .tx = ipq8074_pcie_gen3_tx_tbl,
|
||||
+ .tx_num = ARRAY_SIZE(ipq8074_pcie_gen3_tx_tbl),
|
||||
+ .rx = ipq9574_pcie_rx_tbl,
|
||||
+ .rx_num = ARRAY_SIZE(ipq9574_pcie_rx_tbl),
|
||||
+ .pcs = ipq9574_gen3x2_pcie_pcs_tbl,
|
||||
+ .pcs_num = ARRAY_SIZE(ipq9574_gen3x2_pcie_pcs_tbl),
|
||||
+ .pcs_misc = ipq9574_gen3x2_pcie_pcs_misc_tbl,
|
||||
+ .pcs_misc_num = ARRAY_SIZE(ipq9574_gen3x2_pcie_pcs_misc_tbl),
|
||||
+ },
|
||||
+ .reset_list = ipq8074_pciephy_reset_l,
|
||||
+ .num_resets = ARRAY_SIZE(ipq8074_pciephy_reset_l),
|
||||
+ .vreg_list = NULL,
|
||||
+ .num_vregs = 0,
|
||||
+ .regs = pciephy_v5_regs_layout,
|
||||
+
|
||||
+ .pwrdn_ctrl = SW_PWRDN | REFCLK_DRV_DSBL,
|
||||
+ .phy_status = PHYSTATUS,
|
||||
+ .pipe_clock_rate = 250000000,
|
||||
+};
|
||||
+
|
||||
static const struct qmp_phy_cfg sdm845_qmp_pciephy_cfg = {
|
||||
.lanes = 1,
|
||||
|
||||
@@ -4030,6 +4333,12 @@ static const struct of_device_id qmp_pcie_of_match_table[] = {
|
||||
}, {
|
||||
.compatible = "qcom,ipq8074-qmp-pcie-phy",
|
||||
.data = &ipq8074_pciephy_cfg,
|
||||
+ }, {
|
||||
+ .compatible = "qcom,ipq9574-qmp-gen3x1-pcie-phy",
|
||||
+ .data = &ipq9574_gen3x1_pciephy_cfg,
|
||||
+ }, {
|
||||
+ .compatible = "qcom,ipq9574-qmp-gen3x2-pcie-phy",
|
||||
+ .data = &ipq9574_gen3x2_pciephy_cfg,
|
||||
}, {
|
||||
.compatible = "qcom,msm8998-qmp-pcie-phy",
|
||||
.data = &msm8998_pciephy_cfg,
|
||||
--
|
||||
2.47.1
|
||||
|
@ -0,0 +1,473 @@
|
||||
From d80c7fbfa908e3d893a1ea7fe178dfa82ed66bf1 Mon Sep 17 00:00:00 2001
|
||||
From: devi priya <quic_devipriy@quicinc.com>
|
||||
Date: Thu, 1 Aug 2024 11:18:01 +0530
|
||||
Subject: [PATCH 1/2] arm64: dts: qcom: ipq9574: Add PCIe PHYs and controller
|
||||
nodes
|
||||
|
||||
Add PCIe0, PCIe1, PCIe2, PCIe3 (and corresponding PHY) devices
|
||||
found on IPQ9574 platform. The PCIe0 & PCIe1 are 1-lane Gen3
|
||||
host whereas PCIe2 & PCIe3 are 2-lane Gen3 host.
|
||||
|
||||
Signed-off-by: devi priya <quic_devipriy@quicinc.com>
|
||||
Signed-off-by: Sricharan Ramabadhran <quic_srichara@quicinc.com>
|
||||
Link: https://lore.kernel.org/r/20240801054803.3015572-3-quic_srichara@quicinc.com
|
||||
Signed-off-by: Bjorn Andersson <andersson@kernel.org>
|
||||
---
|
||||
arch/arm64/boot/dts/qcom/ipq9574.dtsi | 420 +++++++++++++++++++++++++-
|
||||
1 file changed, 416 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/qcom/ipq9574.dtsi b/arch/arm64/boot/dts/qcom/ipq9574.dtsi
|
||||
index d1fd35ebc4a2..00ee3290c181 100644
|
||||
--- a/arch/arm64/boot/dts/qcom/ipq9574.dtsi
|
||||
+++ b/arch/arm64/boot/dts/qcom/ipq9574.dtsi
|
||||
@@ -226,6 +226,52 @@ rpm_msg_ram: sram@60000 {
|
||||
reg = <0x00060000 0x6000>;
|
||||
};
|
||||
|
||||
+ pcie0_phy: phy@84000 {
|
||||
+ compatible = "qcom,ipq9574-qmp-gen3x1-pcie-phy";
|
||||
+ reg = <0x00084000 0x1000>;
|
||||
+
|
||||
+ clocks = <&gcc GCC_PCIE0_AUX_CLK>,
|
||||
+ <&gcc GCC_PCIE0_AHB_CLK>,
|
||||
+ <&gcc GCC_PCIE0_PIPE_CLK>;
|
||||
+ clock-names = "aux", "cfg_ahb", "pipe";
|
||||
+
|
||||
+ assigned-clocks = <&gcc GCC_PCIE0_AUX_CLK>;
|
||||
+ assigned-clock-rates = <20000000>;
|
||||
+
|
||||
+ resets = <&gcc GCC_PCIE0_PHY_BCR>,
|
||||
+ <&gcc GCC_PCIE0PHY_PHY_BCR>;
|
||||
+ reset-names = "phy", "common";
|
||||
+
|
||||
+ #clock-cells = <0>;
|
||||
+ clock-output-names = "gcc_pcie0_pipe_clk_src";
|
||||
+
|
||||
+ #phy-cells = <0>;
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
+
|
||||
+ pcie2_phy: phy@8c000 {
|
||||
+ compatible = "qcom,ipq9574-qmp-gen3x2-pcie-phy";
|
||||
+ reg = <0x0008c000 0x2000>;
|
||||
+
|
||||
+ clocks = <&gcc GCC_PCIE2_AUX_CLK>,
|
||||
+ <&gcc GCC_PCIE2_AHB_CLK>,
|
||||
+ <&gcc GCC_PCIE2_PIPE_CLK>;
|
||||
+ clock-names = "aux", "cfg_ahb", "pipe";
|
||||
+
|
||||
+ assigned-clocks = <&gcc GCC_PCIE2_AUX_CLK>;
|
||||
+ assigned-clock-rates = <20000000>;
|
||||
+
|
||||
+ resets = <&gcc GCC_PCIE2_PHY_BCR>,
|
||||
+ <&gcc GCC_PCIE2PHY_PHY_BCR>;
|
||||
+ reset-names = "phy", "common";
|
||||
+
|
||||
+ #clock-cells = <0>;
|
||||
+ clock-output-names = "gcc_pcie2_pipe_clk_src";
|
||||
+
|
||||
+ #phy-cells = <0>;
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
+
|
||||
rng: rng@e3000 {
|
||||
compatible = "qcom,prng-ee";
|
||||
reg = <0x000e3000 0x1000>;
|
||||
@@ -243,6 +289,52 @@ mdio: mdio@90000 {
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
+ pcie3_phy: phy@f4000 {
|
||||
+ compatible = "qcom,ipq9574-qmp-gen3x2-pcie-phy";
|
||||
+ reg = <0x000f4000 0x2000>;
|
||||
+
|
||||
+ clocks = <&gcc GCC_PCIE3_AUX_CLK>,
|
||||
+ <&gcc GCC_PCIE3_AHB_CLK>,
|
||||
+ <&gcc GCC_PCIE3_PIPE_CLK>;
|
||||
+ clock-names = "aux", "cfg_ahb", "pipe";
|
||||
+
|
||||
+ assigned-clocks = <&gcc GCC_PCIE3_AUX_CLK>;
|
||||
+ assigned-clock-rates = <20000000>;
|
||||
+
|
||||
+ resets = <&gcc GCC_PCIE3_PHY_BCR>,
|
||||
+ <&gcc GCC_PCIE3PHY_PHY_BCR>;
|
||||
+ reset-names = "phy", "common";
|
||||
+
|
||||
+ #clock-cells = <0>;
|
||||
+ clock-output-names = "gcc_pcie3_pipe_clk_src";
|
||||
+
|
||||
+ #phy-cells = <0>;
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
+
|
||||
+ pcie1_phy: phy@fc000 {
|
||||
+ compatible = "qcom,ipq9574-qmp-gen3x1-pcie-phy";
|
||||
+ reg = <0x000fc000 0x1000>;
|
||||
+
|
||||
+ clocks = <&gcc GCC_PCIE1_AUX_CLK>,
|
||||
+ <&gcc GCC_PCIE1_AHB_CLK>,
|
||||
+ <&gcc GCC_PCIE1_PIPE_CLK>;
|
||||
+ clock-names = "aux", "cfg_ahb", "pipe";
|
||||
+
|
||||
+ assigned-clocks = <&gcc GCC_PCIE1_AUX_CLK>;
|
||||
+ assigned-clock-rates = <20000000>;
|
||||
+
|
||||
+ resets = <&gcc GCC_PCIE1_PHY_BCR>,
|
||||
+ <&gcc GCC_PCIE1PHY_PHY_BCR>;
|
||||
+ reset-names = "phy", "common";
|
||||
+
|
||||
+ #clock-cells = <0>;
|
||||
+ clock-output-names = "gcc_pcie1_pipe_clk_src";
|
||||
+
|
||||
+ #phy-cells = <0>;
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
+
|
||||
qfprom: efuse@a4000 {
|
||||
compatible = "qcom,ipq9574-qfprom", "qcom,qfprom";
|
||||
reg = <0x000a4000 0x5a1>;
|
||||
@@ -309,10 +401,10 @@ gcc: clock-controller@1800000 {
|
||||
clocks = <&xo_board_clk>,
|
||||
<&sleep_clk>,
|
||||
<0>,
|
||||
- <0>,
|
||||
- <0>,
|
||||
- <0>,
|
||||
- <0>,
|
||||
+ <&pcie0_phy>,
|
||||
+ <&pcie1_phy>,
|
||||
+ <&pcie2_phy>,
|
||||
+ <&pcie3_phy>,
|
||||
<0>;
|
||||
#clock-cells = <1>;
|
||||
#reset-cells = <1>;
|
||||
@@ -756,6 +848,326 @@ frame@b128000 {
|
||||
status = "disabled";
|
||||
};
|
||||
};
|
||||
+
|
||||
+ pcie1: pcie@10000000 {
|
||||
+ compatible = "qcom,pcie-ipq9574";
|
||||
+ reg = <0x10000000 0xf1d>,
|
||||
+ <0x10000f20 0xa8>,
|
||||
+ <0x10001000 0x1000>,
|
||||
+ <0x000f8000 0x4000>,
|
||||
+ <0x10100000 0x1000>;
|
||||
+ reg-names = "dbi", "elbi", "atu", "parf", "config";
|
||||
+ device_type = "pci";
|
||||
+ linux,pci-domain = <1>;
|
||||
+ bus-range = <0x00 0xff>;
|
||||
+ num-lanes = <1>;
|
||||
+ #address-cells = <3>;
|
||||
+ #size-cells = <2>;
|
||||
+
|
||||
+ ranges = <0x01000000 0x0 0x00000000 0x10200000 0x0 0x100000>,
|
||||
+ <0x02000000 0x0 0x10300000 0x10300000 0x0 0x7d00000>;
|
||||
+
|
||||
+ interrupts = <GIC_SPI 26 IRQ_TYPE_LEVEL_HIGH>,
|
||||
+ <GIC_SPI 27 IRQ_TYPE_LEVEL_HIGH>,
|
||||
+ <GIC_SPI 28 IRQ_TYPE_LEVEL_HIGH>,
|
||||
+ <GIC_SPI 29 IRQ_TYPE_LEVEL_HIGH>,
|
||||
+ <GIC_SPI 30 IRQ_TYPE_LEVEL_HIGH>,
|
||||
+ <GIC_SPI 31 IRQ_TYPE_LEVEL_HIGH>,
|
||||
+ <GIC_SPI 32 IRQ_TYPE_LEVEL_HIGH>,
|
||||
+ <GIC_SPI 33 IRQ_TYPE_LEVEL_HIGH>;
|
||||
+ interrupt-names = "msi0",
|
||||
+ "msi1",
|
||||
+ "msi2",
|
||||
+ "msi3",
|
||||
+ "msi4",
|
||||
+ "msi5",
|
||||
+ "msi6",
|
||||
+ "msi7";
|
||||
+
|
||||
+ #interrupt-cells = <1>;
|
||||
+ interrupt-map-mask = <0 0 0 0x7>;
|
||||
+ interrupt-map = <0 0 0 1 &intc 0 0 35 IRQ_TYPE_LEVEL_HIGH>,
|
||||
+ <0 0 0 2 &intc 0 0 49 IRQ_TYPE_LEVEL_HIGH>,
|
||||
+ <0 0 0 3 &intc 0 0 84 IRQ_TYPE_LEVEL_HIGH>,
|
||||
+ <0 0 0 4 &intc 0 0 85 IRQ_TYPE_LEVEL_HIGH>;
|
||||
+
|
||||
+ clocks = <&gcc GCC_PCIE1_AXI_M_CLK>,
|
||||
+ <&gcc GCC_PCIE1_AXI_S_CLK>,
|
||||
+ <&gcc GCC_PCIE1_AXI_S_BRIDGE_CLK>,
|
||||
+ <&gcc GCC_PCIE1_RCHNG_CLK>,
|
||||
+ <&gcc GCC_PCIE1_AHB_CLK>,
|
||||
+ <&gcc GCC_PCIE1_AUX_CLK>;
|
||||
+ clock-names = "axi_m",
|
||||
+ "axi_s",
|
||||
+ "axi_bridge",
|
||||
+ "rchng",
|
||||
+ "ahb",
|
||||
+ "aux";
|
||||
+
|
||||
+ resets = <&gcc GCC_PCIE1_PIPE_ARES>,
|
||||
+ <&gcc GCC_PCIE1_CORE_STICKY_ARES>,
|
||||
+ <&gcc GCC_PCIE1_AXI_S_STICKY_ARES>,
|
||||
+ <&gcc GCC_PCIE1_AXI_S_ARES>,
|
||||
+ <&gcc GCC_PCIE1_AXI_M_STICKY_ARES>,
|
||||
+ <&gcc GCC_PCIE1_AXI_M_ARES>,
|
||||
+ <&gcc GCC_PCIE1_AUX_ARES>,
|
||||
+ <&gcc GCC_PCIE1_AHB_ARES>;
|
||||
+ reset-names = "pipe",
|
||||
+ "sticky",
|
||||
+ "axi_s_sticky",
|
||||
+ "axi_s",
|
||||
+ "axi_m_sticky",
|
||||
+ "axi_m",
|
||||
+ "aux",
|
||||
+ "ahb";
|
||||
+
|
||||
+ phys = <&pcie1_phy>;
|
||||
+ phy-names = "pciephy";
|
||||
+ interconnects = <&gcc MASTER_ANOC_PCIE1 &gcc SLAVE_ANOC_PCIE1>,
|
||||
+ <&gcc MASTER_SNOC_PCIE1 &gcc SLAVE_SNOC_PCIE1>;
|
||||
+ interconnect-names = "pcie-mem", "cpu-pcie";
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
+
|
||||
+ pcie3: pcie@18000000 {
|
||||
+ compatible = "qcom,pcie-ipq9574";
|
||||
+ reg = <0x18000000 0xf1d>,
|
||||
+ <0x18000f20 0xa8>,
|
||||
+ <0x18001000 0x1000>,
|
||||
+ <0x000f0000 0x4000>,
|
||||
+ <0x18100000 0x1000>;
|
||||
+ reg-names = "dbi", "elbi", "atu", "parf", "config";
|
||||
+ device_type = "pci";
|
||||
+ linux,pci-domain = <3>;
|
||||
+ bus-range = <0x00 0xff>;
|
||||
+ num-lanes = <2>;
|
||||
+ #address-cells = <3>;
|
||||
+ #size-cells = <2>;
|
||||
+
|
||||
+ ranges = <0x01000000 0x0 0x00000000 0x18200000 0x0 0x100000>,
|
||||
+ <0x02000000 0x0 0x18300000 0x18300000 0x0 0x7d00000>;
|
||||
+
|
||||
+ interrupts = <GIC_SPI 126 IRQ_TYPE_LEVEL_HIGH>,
|
||||
+ <GIC_SPI 128 IRQ_TYPE_LEVEL_HIGH>,
|
||||
+ <GIC_SPI 129 IRQ_TYPE_LEVEL_HIGH>,
|
||||
+ <GIC_SPI 130 IRQ_TYPE_LEVEL_HIGH>,
|
||||
+ <GIC_SPI 137 IRQ_TYPE_LEVEL_HIGH>,
|
||||
+ <GIC_SPI 141 IRQ_TYPE_LEVEL_HIGH>,
|
||||
+ <GIC_SPI 142 IRQ_TYPE_LEVEL_HIGH>,
|
||||
+ <GIC_SPI 143 IRQ_TYPE_LEVEL_HIGH>;
|
||||
+ interrupt-names = "msi0",
|
||||
+ "msi1",
|
||||
+ "msi2",
|
||||
+ "msi3",
|
||||
+ "msi4",
|
||||
+ "msi5",
|
||||
+ "msi6",
|
||||
+ "msi7";
|
||||
+
|
||||
+ #interrupt-cells = <1>;
|
||||
+ interrupt-map-mask = <0 0 0 0x7>;
|
||||
+ interrupt-map = <0 0 0 1 &intc 0 0 189 IRQ_TYPE_LEVEL_HIGH>,
|
||||
+ <0 0 0 2 &intc 0 0 190 IRQ_TYPE_LEVEL_HIGH>,
|
||||
+ <0 0 0 3 &intc 0 0 191 IRQ_TYPE_LEVEL_HIGH>,
|
||||
+ <0 0 0 4 &intc 0 0 192 IRQ_TYPE_LEVEL_HIGH>;
|
||||
+
|
||||
+ clocks = <&gcc GCC_PCIE3_AXI_M_CLK>,
|
||||
+ <&gcc GCC_PCIE3_AXI_S_CLK>,
|
||||
+ <&gcc GCC_PCIE3_AXI_S_BRIDGE_CLK>,
|
||||
+ <&gcc GCC_PCIE3_RCHNG_CLK>,
|
||||
+ <&gcc GCC_PCIE3_AHB_CLK>,
|
||||
+ <&gcc GCC_PCIE3_AUX_CLK>;
|
||||
+ clock-names = "axi_m",
|
||||
+ "axi_s",
|
||||
+ "axi_bridge",
|
||||
+ "rchng",
|
||||
+ "ahb",
|
||||
+ "aux";
|
||||
+
|
||||
+ resets = <&gcc GCC_PCIE3_PIPE_ARES>,
|
||||
+ <&gcc GCC_PCIE3_CORE_STICKY_ARES>,
|
||||
+ <&gcc GCC_PCIE3_AXI_S_STICKY_ARES>,
|
||||
+ <&gcc GCC_PCIE3_AXI_S_ARES>,
|
||||
+ <&gcc GCC_PCIE3_AXI_M_STICKY_ARES>,
|
||||
+ <&gcc GCC_PCIE3_AXI_M_ARES>,
|
||||
+ <&gcc GCC_PCIE3_AUX_ARES>,
|
||||
+ <&gcc GCC_PCIE3_AHB_ARES>;
|
||||
+ reset-names = "pipe",
|
||||
+ "sticky",
|
||||
+ "axi_s_sticky",
|
||||
+ "axi_s",
|
||||
+ "axi_m_sticky",
|
||||
+ "axi_m",
|
||||
+ "aux",
|
||||
+ "ahb";
|
||||
+
|
||||
+ phys = <&pcie3_phy>;
|
||||
+ phy-names = "pciephy";
|
||||
+ interconnects = <&gcc MASTER_ANOC_PCIE3 &gcc SLAVE_ANOC_PCIE3>,
|
||||
+ <&gcc MASTER_SNOC_PCIE3 &gcc SLAVE_SNOC_PCIE3>;
|
||||
+ interconnect-names = "pcie-mem", "cpu-pcie";
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
+
|
||||
+ pcie2: pcie@20000000 {
|
||||
+ compatible = "qcom,pcie-ipq9574";
|
||||
+ reg = <0x20000000 0xf1d>,
|
||||
+ <0x20000f20 0xa8>,
|
||||
+ <0x20001000 0x1000>,
|
||||
+ <0x00088000 0x4000>,
|
||||
+ <0x20100000 0x1000>;
|
||||
+ reg-names = "dbi", "elbi", "atu", "parf", "config";
|
||||
+ device_type = "pci";
|
||||
+ linux,pci-domain = <2>;
|
||||
+ bus-range = <0x00 0xff>;
|
||||
+ num-lanes = <2>;
|
||||
+ #address-cells = <3>;
|
||||
+ #size-cells = <2>;
|
||||
+
|
||||
+ ranges = <0x01000000 0x0 0x00000000 0x20200000 0x0 0x100000>,
|
||||
+ <0x02000000 0x0 0x20300000 0x20300000 0x0 0x7d00000>;
|
||||
+
|
||||
+ interrupts = <GIC_SPI 126 IRQ_TYPE_LEVEL_HIGH>,
|
||||
+ <GIC_SPI 128 IRQ_TYPE_LEVEL_HIGH>,
|
||||
+ <GIC_SPI 129 IRQ_TYPE_LEVEL_HIGH>,
|
||||
+ <GIC_SPI 130 IRQ_TYPE_LEVEL_HIGH>,
|
||||
+ <GIC_SPI 137 IRQ_TYPE_LEVEL_HIGH>,
|
||||
+ <GIC_SPI 141 IRQ_TYPE_LEVEL_HIGH>,
|
||||
+ <GIC_SPI 142 IRQ_TYPE_LEVEL_HIGH>,
|
||||
+ <GIC_SPI 143 IRQ_TYPE_LEVEL_HIGH>;
|
||||
+ interrupt-names = "msi0",
|
||||
+ "msi1",
|
||||
+ "msi2",
|
||||
+ "msi3",
|
||||
+ "msi4",
|
||||
+ "msi5",
|
||||
+ "msi6",
|
||||
+ "msi7";
|
||||
+
|
||||
+ #interrupt-cells = <1>;
|
||||
+ interrupt-map-mask = <0 0 0 0x7>;
|
||||
+ interrupt-map = <0 0 0 1 &intc 0 0 164 IRQ_TYPE_LEVEL_HIGH>,
|
||||
+ <0 0 0 2 &intc 0 0 165 IRQ_TYPE_LEVEL_HIGH>,
|
||||
+ <0 0 0 3 &intc 0 0 186 IRQ_TYPE_LEVEL_HIGH>,
|
||||
+ <0 0 0 4 &intc 0 0 187 IRQ_TYPE_LEVEL_HIGH>;
|
||||
+
|
||||
+ clocks = <&gcc GCC_PCIE2_AXI_M_CLK>,
|
||||
+ <&gcc GCC_PCIE2_AXI_S_CLK>,
|
||||
+ <&gcc GCC_PCIE2_AXI_S_BRIDGE_CLK>,
|
||||
+ <&gcc GCC_PCIE2_RCHNG_CLK>,
|
||||
+ <&gcc GCC_PCIE2_AHB_CLK>,
|
||||
+ <&gcc GCC_PCIE2_AUX_CLK>;
|
||||
+ clock-names = "axi_m",
|
||||
+ "axi_s",
|
||||
+ "axi_bridge",
|
||||
+ "rchng",
|
||||
+ "ahb",
|
||||
+ "aux";
|
||||
+
|
||||
+ resets = <&gcc GCC_PCIE2_PIPE_ARES>,
|
||||
+ <&gcc GCC_PCIE2_CORE_STICKY_ARES>,
|
||||
+ <&gcc GCC_PCIE2_AXI_S_STICKY_ARES>,
|
||||
+ <&gcc GCC_PCIE2_AXI_S_ARES>,
|
||||
+ <&gcc GCC_PCIE2_AXI_M_STICKY_ARES>,
|
||||
+ <&gcc GCC_PCIE2_AXI_M_ARES>,
|
||||
+ <&gcc GCC_PCIE2_AUX_ARES>,
|
||||
+ <&gcc GCC_PCIE2_AHB_ARES>;
|
||||
+ reset-names = "pipe",
|
||||
+ "sticky",
|
||||
+ "axi_s_sticky",
|
||||
+ "axi_s",
|
||||
+ "axi_m_sticky",
|
||||
+ "axi_m",
|
||||
+ "aux",
|
||||
+ "ahb";
|
||||
+
|
||||
+ phys = <&pcie2_phy>;
|
||||
+ phy-names = "pciephy";
|
||||
+ interconnects = <&gcc MASTER_ANOC_PCIE2 &gcc SLAVE_ANOC_PCIE2>,
|
||||
+ <&gcc MASTER_SNOC_PCIE2 &gcc SLAVE_SNOC_PCIE2>;
|
||||
+ interconnect-names = "pcie-mem", "cpu-pcie";
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
+
|
||||
+ pcie0: pci@28000000 {
|
||||
+ compatible = "qcom,pcie-ipq9574";
|
||||
+ reg = <0x28000000 0xf1d>,
|
||||
+ <0x28000f20 0xa8>,
|
||||
+ <0x28001000 0x1000>,
|
||||
+ <0x00080000 0x4000>,
|
||||
+ <0x28100000 0x1000>;
|
||||
+ reg-names = "dbi", "elbi", "atu", "parf", "config";
|
||||
+ device_type = "pci";
|
||||
+ linux,pci-domain = <0>;
|
||||
+ bus-range = <0x00 0xff>;
|
||||
+ num-lanes = <1>;
|
||||
+ #address-cells = <3>;
|
||||
+ #size-cells = <2>;
|
||||
+
|
||||
+ ranges = <0x01000000 0x0 0x00000000 0x28200000 0x0 0x100000>,
|
||||
+ <0x02000000 0x0 0x28300000 0x28300000 0x0 0x7d00000>;
|
||||
+ interrupts = <GIC_SPI 52 IRQ_TYPE_LEVEL_HIGH>,
|
||||
+ <GIC_SPI 55 IRQ_TYPE_LEVEL_HIGH>,
|
||||
+ <GIC_SPI 56 IRQ_TYPE_LEVEL_HIGH>,
|
||||
+ <GIC_SPI 57 IRQ_TYPE_LEVEL_HIGH>,
|
||||
+ <GIC_SPI 59 IRQ_TYPE_LEVEL_HIGH>,
|
||||
+ <GIC_SPI 63 IRQ_TYPE_LEVEL_HIGH>,
|
||||
+ <GIC_SPI 68 IRQ_TYPE_LEVEL_HIGH>,
|
||||
+ <GIC_SPI 72 IRQ_TYPE_LEVEL_HIGH>;
|
||||
+ interrupt-names = "msi0",
|
||||
+ "msi1",
|
||||
+ "msi2",
|
||||
+ "msi3",
|
||||
+ "msi4",
|
||||
+ "msi5",
|
||||
+ "msi6",
|
||||
+ "msi7";
|
||||
+
|
||||
+ #interrupt-cells = <1>;
|
||||
+ interrupt-map-mask = <0 0 0 0x7>;
|
||||
+ interrupt-map = <0 0 0 1 &intc 0 0 75 IRQ_TYPE_LEVEL_HIGH>,
|
||||
+ <0 0 0 2 &intc 0 0 78 IRQ_TYPE_LEVEL_HIGH>,
|
||||
+ <0 0 0 3 &intc 0 0 79 IRQ_TYPE_LEVEL_HIGH>,
|
||||
+ <0 0 0 4 &intc 0 0 83 IRQ_TYPE_LEVEL_HIGH>;
|
||||
+
|
||||
+ clocks = <&gcc GCC_PCIE0_AXI_M_CLK>,
|
||||
+ <&gcc GCC_PCIE0_AXI_S_CLK>,
|
||||
+ <&gcc GCC_PCIE0_AXI_S_BRIDGE_CLK>,
|
||||
+ <&gcc GCC_PCIE0_RCHNG_CLK>,
|
||||
+ <&gcc GCC_PCIE0_AHB_CLK>,
|
||||
+ <&gcc GCC_PCIE0_AUX_CLK>;
|
||||
+ clock-names = "axi_m",
|
||||
+ "axi_s",
|
||||
+ "axi_bridge",
|
||||
+ "rchng",
|
||||
+ "ahb",
|
||||
+ "aux";
|
||||
+
|
||||
+ resets = <&gcc GCC_PCIE0_PIPE_ARES>,
|
||||
+ <&gcc GCC_PCIE0_CORE_STICKY_ARES>,
|
||||
+ <&gcc GCC_PCIE0_AXI_S_STICKY_ARES>,
|
||||
+ <&gcc GCC_PCIE0_AXI_S_ARES>,
|
||||
+ <&gcc GCC_PCIE0_AXI_M_STICKY_ARES>,
|
||||
+ <&gcc GCC_PCIE0_AXI_M_ARES>,
|
||||
+ <&gcc GCC_PCIE0_AUX_ARES>,
|
||||
+ <&gcc GCC_PCIE0_AHB_ARES>;
|
||||
+ reset-names = "pipe",
|
||||
+ "sticky",
|
||||
+ "axi_s_sticky",
|
||||
+ "axi_s",
|
||||
+ "axi_m_sticky",
|
||||
+ "axi_m",
|
||||
+ "aux",
|
||||
+ "ahb";
|
||||
+
|
||||
+ phys = <&pcie0_phy>;
|
||||
+ phy-names = "pciephy";
|
||||
+ interconnects = <&gcc MASTER_ANOC_PCIE0 &gcc SLAVE_ANOC_PCIE0>,
|
||||
+ <&gcc MASTER_SNOC_PCIE0 &gcc SLAVE_SNOC_PCIE0>;
|
||||
+ interconnect-names = "pcie-mem", "cpu-pcie";
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
+
|
||||
};
|
||||
|
||||
thermal-zones {
|
||||
--
|
||||
2.47.1
|
||||
|
@ -0,0 +1,157 @@
|
||||
From 438d05fb9be6bcd565e713c7e8d9ffb97e5f8d1e Mon Sep 17 00:00:00 2001
|
||||
From: devi priya <quic_devipriy@quicinc.com>
|
||||
Date: Thu, 1 Aug 2024 11:18:02 +0530
|
||||
Subject: [PATCH 2/2] arm64: dts: qcom: ipq9574: Enable PCIe PHYs and
|
||||
controllers
|
||||
|
||||
Enable the PCIe controller and PHY nodes corresponding to RDP 433.
|
||||
|
||||
Signed-off-by: devi priya <quic_devipriy@quicinc.com>
|
||||
Signed-off-by: Sricharan Ramabadhran <quic_srichara@quicinc.com>
|
||||
Link: https://lore.kernel.org/r/20240801054803.3015572-4-quic_srichara@quicinc.com
|
||||
Signed-off-by: Bjorn Andersson <andersson@kernel.org>
|
||||
---
|
||||
arch/arm64/boot/dts/qcom/ipq9574-rdp433.dts | 113 ++++++++++++++++++++
|
||||
1 file changed, 113 insertions(+)
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/qcom/ipq9574-rdp433.dts b/arch/arm64/boot/dts/qcom/ipq9574-rdp433.dts
|
||||
index 1bb8d96c9a82..165ebbb59511 100644
|
||||
--- a/arch/arm64/boot/dts/qcom/ipq9574-rdp433.dts
|
||||
+++ b/arch/arm64/boot/dts/qcom/ipq9574-rdp433.dts
|
||||
@@ -8,6 +8,7 @@
|
||||
|
||||
/dts-v1/;
|
||||
|
||||
+#include <dt-bindings/gpio/gpio.h>
|
||||
#include "ipq9574-rdp-common.dtsi"
|
||||
|
||||
/ {
|
||||
@@ -15,6 +16,45 @@ / {
|
||||
compatible = "qcom,ipq9574-ap-al02-c7", "qcom,ipq9574";
|
||||
};
|
||||
|
||||
+&pcie1_phy {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&pcie1 {
|
||||
+ pinctrl-0 = <&pcie1_default>;
|
||||
+ pinctrl-names = "default";
|
||||
+
|
||||
+ perst-gpios = <&tlmm 26 GPIO_ACTIVE_LOW>;
|
||||
+ wake-gpios = <&tlmm 27 GPIO_ACTIVE_LOW>;
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&pcie2_phy {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&pcie2 {
|
||||
+ pinctrl-0 = <&pcie2_default>;
|
||||
+ pinctrl-names = "default";
|
||||
+
|
||||
+ perst-gpios = <&tlmm 29 GPIO_ACTIVE_LOW>;
|
||||
+ wake-gpios = <&tlmm 30 GPIO_ACTIVE_LOW>;
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&pcie3_phy {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&pcie3 {
|
||||
+ pinctrl-0 = <&pcie3_default>;
|
||||
+ pinctrl-names = "default";
|
||||
+
|
||||
+ perst-gpios = <&tlmm 32 GPIO_ACTIVE_LOW>;
|
||||
+ wake-gpios = <&tlmm 33 GPIO_ACTIVE_LOW>;
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
&sdhc_1 {
|
||||
pinctrl-0 = <&sdc_default_state>;
|
||||
pinctrl-names = "default";
|
||||
@@ -28,6 +68,79 @@ &sdhc_1 {
|
||||
};
|
||||
|
||||
&tlmm {
|
||||
+
|
||||
+ pcie1_default: pcie1-default-state {
|
||||
+ clkreq-n-pins {
|
||||
+ pins = "gpio25";
|
||||
+ function = "pcie1_clk";
|
||||
+ drive-strength = <6>;
|
||||
+ bias-pull-up;
|
||||
+ };
|
||||
+
|
||||
+ perst-n-pins {
|
||||
+ pins = "gpio26";
|
||||
+ function = "gpio";
|
||||
+ drive-strength = <8>;
|
||||
+ bias-pull-down;
|
||||
+ output-low;
|
||||
+ };
|
||||
+
|
||||
+ wake-n-pins {
|
||||
+ pins = "gpio27";
|
||||
+ function = "pcie1_wake";
|
||||
+ drive-strength = <6>;
|
||||
+ bias-pull-up;
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ pcie2_default: pcie2-default-state {
|
||||
+ clkreq-n-pins {
|
||||
+ pins = "gpio28";
|
||||
+ function = "pcie2_clk";
|
||||
+ drive-strength = <6>;
|
||||
+ bias-pull-up;
|
||||
+ };
|
||||
+
|
||||
+ perst-n-pins {
|
||||
+ pins = "gpio29";
|
||||
+ function = "gpio";
|
||||
+ drive-strength = <8>;
|
||||
+ bias-pull-down;
|
||||
+ output-low;
|
||||
+ };
|
||||
+
|
||||
+ wake-n-pins {
|
||||
+ pins = "gpio30";
|
||||
+ function = "pcie2_wake";
|
||||
+ drive-strength = <6>;
|
||||
+ bias-pull-up;
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ pcie3_default: pcie3-default-state {
|
||||
+ clkreq-n-pins {
|
||||
+ pins = "gpio31";
|
||||
+ function = "pcie3_clk";
|
||||
+ drive-strength = <6>;
|
||||
+ bias-pull-up;
|
||||
+ };
|
||||
+
|
||||
+ perst-n-pins {
|
||||
+ pins = "gpio32";
|
||||
+ function = "gpio";
|
||||
+ drive-strength = <8>;
|
||||
+ bias-pull-up;
|
||||
+ output-low;
|
||||
+ };
|
||||
+
|
||||
+ wake-n-pins {
|
||||
+ pins = "gpio33";
|
||||
+ function = "pcie3_wake";
|
||||
+ drive-strength = <6>;
|
||||
+ bias-pull-up;
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
sdc_default_state: sdc-default-state {
|
||||
clk-pins {
|
||||
pins = "gpio5";
|
||||
--
|
||||
2.47.1
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,178 @@
|
||||
From: Md Sadre Alam <quic_mdalam@quicinc.com>
|
||||
To: <broonie@kernel.org>, <robh@kernel.org>, <krzk+dt@kernel.org>,
|
||||
<conor+dt@kernel.org>, <andersson@kernel.org>,
|
||||
<konradybcio@kernel.org>, <miquel.raynal@bootlin.com>,
|
||||
<richard@nod.at>, <vigneshr@ti.com>,
|
||||
<manivannan.sadhasivam@linaro.org>,
|
||||
<linux-arm-msm@vger.kernel.org>, <linux-spi@vger.kernel.org>,
|
||||
<devicetree@vger.kernel.org>, <linux-kernel@vger.kernel.org>,
|
||||
<linux-mtd@lists.infradead.org>
|
||||
Cc: <quic_srichara@quicinc.com>, <quic_varada@quicinc.com>,
|
||||
<quic_mdalam@quicinc.com>
|
||||
Subject: [PATCH v14 7/8] arm64: dts: qcom: ipq9574: Add SPI nand support
|
||||
Date: Wed, 20 Nov 2024 14:45:05 +0530 [thread overview]
|
||||
Message-ID: <20241120091507.1404368-8-quic_mdalam@quicinc.com> (raw)
|
||||
In-Reply-To: <20241120091507.1404368-1-quic_mdalam@quicinc.com>
|
||||
|
||||
Add SPI NAND support for ipq9574 SoC.
|
||||
|
||||
Signed-off-by: Md Sadre Alam <quic_mdalam@quicinc.com>
|
||||
---
|
||||
|
||||
Change in [v14]
|
||||
|
||||
* No change
|
||||
|
||||
Change in [v13]
|
||||
|
||||
* No change
|
||||
|
||||
Change in [v12]
|
||||
|
||||
* No change
|
||||
|
||||
Change in [v11]
|
||||
|
||||
* No change
|
||||
|
||||
Change in [v10]
|
||||
|
||||
* No change
|
||||
|
||||
Change in [v9]
|
||||
|
||||
* No change
|
||||
|
||||
Change in [v8]
|
||||
|
||||
* No change
|
||||
|
||||
Change in [v7]
|
||||
|
||||
* No change
|
||||
|
||||
Change in [v6]
|
||||
|
||||
* No change
|
||||
|
||||
Change in [v5]
|
||||
|
||||
* No change
|
||||
|
||||
Change in [v4]
|
||||
|
||||
* No change
|
||||
|
||||
Change in [v3]
|
||||
|
||||
* Updated gpio number as per pin control driver
|
||||
|
||||
* Fixed alignment issue
|
||||
|
||||
Change in [v2]
|
||||
|
||||
* Added initial enablement for spi-nand
|
||||
|
||||
Change in [v1]
|
||||
|
||||
* Posted as RFC patch for design review
|
||||
|
||||
.../boot/dts/qcom/ipq9574-rdp-common.dtsi | 43 +++++++++++++++++++
|
||||
arch/arm64/boot/dts/qcom/ipq9574.dtsi | 27 ++++++++++++
|
||||
2 files changed, 70 insertions(+)
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/qcom/ipq9574-rdp-common.dtsi b/arch/arm64/boot/dts/qcom/ipq9574-rdp-common.dtsi
|
||||
index 91e104b0f865..6429a6b3b903 100644
|
||||
--- a/arch/arm64/boot/dts/qcom/ipq9574-rdp-common.dtsi
|
||||
+++ b/arch/arm64/boot/dts/qcom/ipq9574-rdp-common.dtsi
|
||||
@@ -139,6 +139,49 @@ gpio_leds_default: gpio-leds-default-state {
|
||||
drive-strength = <8>;
|
||||
bias-pull-up;
|
||||
};
|
||||
+
|
||||
+ qpic_snand_default_state: qpic-snand-default-state {
|
||||
+ clock-pins {
|
||||
+ pins = "gpio5";
|
||||
+ function = "qspi_clk";
|
||||
+ drive-strength = <8>;
|
||||
+ bias-disable;
|
||||
+ };
|
||||
+
|
||||
+ cs-pins {
|
||||
+ pins = "gpio4";
|
||||
+ function = "qspi_cs";
|
||||
+ drive-strength = <8>;
|
||||
+ bias-disable;
|
||||
+ };
|
||||
+
|
||||
+ data-pins {
|
||||
+ pins = "gpio0", "gpio1", "gpio2", "gpio3";
|
||||
+ function = "qspi_data";
|
||||
+ drive-strength = <8>;
|
||||
+ bias-disable;
|
||||
+ };
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&qpic_bam {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&qpic_nand {
|
||||
+ pinctrl-0 = <&qpic_snand_default_state>;
|
||||
+ pinctrl-names = "default";
|
||||
+ status = "okay";
|
||||
+
|
||||
+ flash@0 {
|
||||
+ compatible = "spi-nand";
|
||||
+ reg = <0>;
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <1>;
|
||||
+ nand-ecc-engine = <&qpic_nand>;
|
||||
+ nand-ecc-strength = <4>;
|
||||
+ nand-ecc-step-size = <512>;
|
||||
+ };
|
||||
};
|
||||
|
||||
&usb_0_dwc3 {
|
||||
diff --git a/arch/arm64/boot/dts/qcom/ipq9574.dtsi b/arch/arm64/boot/dts/qcom/ipq9574.dtsi
|
||||
index d1fd35ebc4a2..45fb26bc9480 100644
|
||||
--- a/arch/arm64/boot/dts/qcom/ipq9574.dtsi
|
||||
+++ b/arch/arm64/boot/dts/qcom/ipq9574.dtsi
|
||||
@@ -330,6 +330,33 @@ tcsr: syscon@1937000 {
|
||||
reg = <0x01937000 0x21000>;
|
||||
};
|
||||
|
||||
+ qpic_bam: dma-controller@7984000 {
|
||||
+ compatible = "qcom,bam-v1.7.0";
|
||||
+ reg = <0x7984000 0x1c000>;
|
||||
+ interrupts = <GIC_SPI 146 IRQ_TYPE_LEVEL_HIGH>;
|
||||
+ clocks = <&gcc GCC_QPIC_AHB_CLK>;
|
||||
+ clock-names = "bam_clk";
|
||||
+ #dma-cells = <1>;
|
||||
+ qcom,ee = <0>;
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
+
|
||||
+ qpic_nand: spi@79b0000 {
|
||||
+ compatible = "qcom,ipq9574-snand";
|
||||
+ reg = <0x79b0000 0x10000>;
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+ clocks = <&gcc GCC_QPIC_CLK>,
|
||||
+ <&gcc GCC_QPIC_AHB_CLK>,
|
||||
+ <&gcc GCC_QPIC_IO_MACRO_CLK>;
|
||||
+ clock-names = "core", "aon", "iom";
|
||||
+ dmas = <&qpic_bam 0>,
|
||||
+ <&qpic_bam 1>,
|
||||
+ <&qpic_bam 2>;
|
||||
+ dma-names = "tx", "rx", "cmd";
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
+
|
||||
sdhc_1: mmc@7804000 {
|
||||
compatible = "qcom,ipq9574-sdhci", "qcom,sdhci-msm-v5";
|
||||
reg = <0x07804000 0x1000>,
|
||||
--
|
||||
2.34.1
|
||||
|
@ -0,0 +1,65 @@
|
||||
From a28a71e2a4728ec4f1f4a6b28595b664a1a49e4b Mon Sep 17 00:00:00 2001
|
||||
From: Md Sadre Alam <quic_mdalam@quicinc.com>
|
||||
Date: Wed, 7 Feb 2024 16:05:27 +0530
|
||||
Subject: [PATCH v10 8/8] arm64: dts: qcom: ipq9574: Disable eMMC node
|
||||
|
||||
Disable eMMC node for rdp433, since rdp433
|
||||
default boot mode is norplusnand
|
||||
|
||||
Signed-off-by: Md Sadre Alam <quic_mdalam@quicinc.com>
|
||||
---
|
||||
|
||||
Change in [v10]
|
||||
|
||||
* No change
|
||||
|
||||
Change in [v9]
|
||||
|
||||
* No change
|
||||
|
||||
Change in [v8]
|
||||
|
||||
* No change
|
||||
|
||||
Change in [v7]
|
||||
|
||||
* No Change
|
||||
|
||||
Change in [v6]
|
||||
|
||||
* Updated commit message
|
||||
|
||||
Change in [v5]
|
||||
|
||||
* No Change
|
||||
|
||||
Change in [v4]
|
||||
|
||||
* No change
|
||||
|
||||
Change in [v3]
|
||||
|
||||
* Removed co-developed by
|
||||
|
||||
Change in [v2]
|
||||
|
||||
* Posted as initial eMMC disable patch
|
||||
|
||||
Change in [v1]
|
||||
|
||||
* This patch was not included in v1
|
||||
|
||||
arch/arm64/boot/dts/qcom/ipq9574-rdp433.dts | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/arch/arm64/boot/dts/qcom/ipq9574-rdp433.dts
|
||||
+++ b/arch/arm64/boot/dts/qcom/ipq9574-rdp433.dts
|
||||
@@ -82,7 +82,7 @@
|
||||
mmc-hs400-enhanced-strobe;
|
||||
max-frequency = <384000000>;
|
||||
bus-width = <8>;
|
||||
- status = "okay";
|
||||
+ status = "disabled";
|
||||
};
|
||||
|
||||
&sleep_clk {
|
@ -0,0 +1,253 @@
|
||||
From 9e76817056937645205f23ee91e762d5cff5e848 Mon Sep 17 00:00:00 2001
|
||||
From: Luo Jie <quic_luoj@quicinc.com>
|
||||
Date: Mon, 29 Jan 2024 17:57:20 +0800
|
||||
Subject: [PATCH 01/50] dt-bindings: net: Document Qualcomm QCA8084 PHY package
|
||||
|
||||
QCA8084 is quad PHY chip, which integrates 4 PHYs, 2 PCS
|
||||
interfaces (PCS0 and PCS1) and clock controller, which can
|
||||
also be integrated to the switch chip named as QCA8386.
|
||||
|
||||
1. MDIO address of 4 PHYs, 2 PCS and 1 XPCS (PCS1 includes
|
||||
PCS and XPCS, PCS0 includes PCS) can be configured.
|
||||
2. The package mode of PHY is optionally configured for the
|
||||
interface mode of two PCSes working correctly.
|
||||
3. The package level clock and reset need to be initialized.
|
||||
4. The clock and reset per PHY device need to be initialized
|
||||
so that the PHY register can be accessed.
|
||||
|
||||
Change-Id: Idb2338d2673152cbd3c57e95968faa59e9d4a80f
|
||||
Signed-off-by: Luo Jie <quic_luoj@quicinc.com>
|
||||
---
|
||||
.../devicetree/bindings/net/qcom,qca8084.yaml | 198 ++++++++++++++++++
|
||||
include/dt-bindings/net/qcom,qca808x.h | 14 ++
|
||||
2 files changed, 212 insertions(+)
|
||||
create mode 100644 Documentation/devicetree/bindings/net/qcom,qca8084.yaml
|
||||
create mode 100644 include/dt-bindings/net/qcom,qca808x.h
|
||||
|
||||
diff --git a/Documentation/devicetree/bindings/net/qcom,qca8084.yaml b/Documentation/devicetree/bindings/net/qcom,qca8084.yaml
|
||||
new file mode 100644
|
||||
index 000000000000..efa1fa4ebfdc
|
||||
--- /dev/null
|
||||
+++ b/Documentation/devicetree/bindings/net/qcom,qca8084.yaml
|
||||
@@ -0,0 +1,198 @@
|
||||
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
+%YAML 1.2
|
||||
+---
|
||||
+$id: http://devicetree.org/schemas/net/qcom,qca8084.yaml#
|
||||
+$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
+
|
||||
+title: Qualcomm QCA8084 Ethernet Quad PHY
|
||||
+
|
||||
+maintainers:
|
||||
+ - Luo Jie <quic_luoj@quicinc.com>
|
||||
+
|
||||
+description:
|
||||
+ Qualcomm QCA8084 is a four-port Ethernet transceiver, the
|
||||
+ Ethernet port supports link speed 10/100/1000/2500 Mbps.
|
||||
+ There are two PCSes (PCS0 and PCS1) integrated in the PHY
|
||||
+ package, PCS1 includes XPCS and PCS to support the interface
|
||||
+ mode 10G-QXGMII and SGMII, PCS0 includes a PCS to support the
|
||||
+ interface mode SGMII only. There is also a clock controller
|
||||
+ integrated in the PHY package. This four-port Ethernet
|
||||
+ transceiver can also be integrated to the switch chip named
|
||||
+ as QCA8386. The PHY package mode needs to be configured as the
|
||||
+ correct value to apply the interface mode of two PCSes as
|
||||
+ mentioned below.
|
||||
+
|
||||
+ QCA8084 expects an input reference clock 50 MHZ as the clock
|
||||
+ source of the integrated clock controller, the integrated
|
||||
+ clock controller supplies the clocks and resets to the
|
||||
+ integrated PHY, PCS and PHY package.
|
||||
+
|
||||
+ - |
|
||||
+ +--| |--+-------------------+--| |--+
|
||||
+ | PCS1 |<------------+---->| PCS0 |
|
||||
+ +-------+ | +-------+
|
||||
+ | | |
|
||||
+ Ref 50M clk +--------+ | |
|
||||
+ ------------>| | clk & rst | |
|
||||
+ GPIO Reset |QCA8K_CC+------------+ |
|
||||
+ ------------>| | | |
|
||||
+ +--------+ | |
|
||||
+ | V |
|
||||
+ +--------+--------+--------+--------+
|
||||
+ | PHY0 | PHY1 | PHY2 | PHY3 |
|
||||
+ +--------+--------+--------+--------+
|
||||
+
|
||||
+$ref: ethernet-phy-package.yaml#
|
||||
+
|
||||
+properties:
|
||||
+ compatible:
|
||||
+ const: qcom,qca8084-package
|
||||
+
|
||||
+ clocks:
|
||||
+ description: PHY package level initial common clocks, which are
|
||||
+ needed to be enabled after GPIO reset on the PHY package, these
|
||||
+ clocks are supplied from the PHY integrated clock controller
|
||||
+ (QCA8K-CC).
|
||||
+ items:
|
||||
+ - description: APB bridge clock
|
||||
+ - description: AHB clock
|
||||
+ - description: Security control clock
|
||||
+ - description: TLMM clock
|
||||
+ - description: TLMM AHB clock
|
||||
+ - description: CNOC AHB clock
|
||||
+ - description: MDIO AHB clock
|
||||
+
|
||||
+ clock-names:
|
||||
+ items:
|
||||
+ - const: apb_bridge
|
||||
+ - const: ahb
|
||||
+ - const: sec_ctrl_ahb
|
||||
+ - const: tlmm
|
||||
+ - const: tlmm_ahb
|
||||
+ - const: cnoc_ahb
|
||||
+ - const: mdio_ahb
|
||||
+
|
||||
+ resets:
|
||||
+ description: PHY package level initial common reset, which are
|
||||
+ needed to be deasserted after GPIO reset on the PHY package,
|
||||
+ this reset is provided by the PHY integrated clock controller
|
||||
+ to do PHY DSP reset.
|
||||
+ maxItems: 1
|
||||
+
|
||||
+ qcom,package-mode:
|
||||
+ description: |
|
||||
+ The package mode of PHY supports to be configured as 3 modes
|
||||
+ to apply the combinations of interface mode of two PCSes
|
||||
+ correctly. This value should use one of the values defined in
|
||||
+ dt-bindings/net/qcom,qca808x.h. The package mode 10G-QXGMII of
|
||||
+ Quad PHY is used by default.
|
||||
+
|
||||
+ package mode PCS1 PCS0
|
||||
+ phy mode (0) 10G-QXGMII for not used
|
||||
+ PHY0-PHY3
|
||||
+
|
||||
+ switch mode (1) SGMII for SGMII for
|
||||
+ switch MAC0 switch MAC5 (optional)
|
||||
+
|
||||
+ switch bypass MAC5 (2) SGMII for SGMII for
|
||||
+ switch MAC0 PHY3
|
||||
+ $ref: /schemas/types.yaml#/definitions/uint32
|
||||
+ enum: [0, 1, 2]
|
||||
+ default: 0
|
||||
+
|
||||
+ qcom,phy-addr-fixup:
|
||||
+ description: MDIO address for PHY0-PHY3, PCS0 and PCS1 including
|
||||
+ PCS and XPCS, which can be optionally customized by programming
|
||||
+ the security control register of PHY package. The hardware default
|
||||
+ MDIO address of PHY0-PHY3, PCS0 and PCS1 including PCS and XPCS is
|
||||
+ 0-6.
|
||||
+ $ref: /schemas/types.yaml#/definitions/uint32-array
|
||||
+ minItems: 7
|
||||
+ maxItems: 7
|
||||
+
|
||||
+patternProperties:
|
||||
+ ^ethernet-phy(@[a-f0-9]+)?$:
|
||||
+ $ref: ethernet-phy.yaml#
|
||||
+
|
||||
+ properties:
|
||||
+ compatible:
|
||||
+ const: ethernet-phy-id004d.d180
|
||||
+
|
||||
+ required:
|
||||
+ - compatible
|
||||
+ - reg
|
||||
+ - clocks
|
||||
+ - resets
|
||||
+
|
||||
+ unevaluatedProperties: false
|
||||
+
|
||||
+required:
|
||||
+ - compatible
|
||||
+ - clocks
|
||||
+ - clock-names
|
||||
+ - resets
|
||||
+
|
||||
+unevaluatedProperties: false
|
||||
+
|
||||
+examples:
|
||||
+ - |
|
||||
+ #include <dt-bindings/clock/qcom,qca8k-nsscc.h>
|
||||
+ #include <dt-bindings/net/qcom,qca808x.h>
|
||||
+ #include <dt-bindings/reset/qcom,qca8k-nsscc.h>
|
||||
+
|
||||
+ mdio {
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+
|
||||
+ ethernet-phy-package@1 {
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+ compatible = "qcom,qca8084-package";
|
||||
+ reg = <1>;
|
||||
+ clocks = <&qca8k_nsscc NSS_CC_APB_BRIDGE_CLK>,
|
||||
+ <&qca8k_nsscc NSS_CC_AHB_CLK>,
|
||||
+ <&qca8k_nsscc NSS_CC_SEC_CTRL_AHB_CLK>,
|
||||
+ <&qca8k_nsscc NSS_CC_TLMM_CLK>,
|
||||
+ <&qca8k_nsscc NSS_CC_TLMM_AHB_CLK>,
|
||||
+ <&qca8k_nsscc NSS_CC_CNOC_AHB_CLK>,
|
||||
+ <&qca8k_nsscc NSS_CC_MDIO_AHB_CLK>;
|
||||
+ clock-names = "apb_bridge",
|
||||
+ "ahb",
|
||||
+ "sec_ctrl_ahb",
|
||||
+ "tlmm",
|
||||
+ "tlmm_ahb",
|
||||
+ "cnoc_ahb",
|
||||
+ "mdio_ahb";
|
||||
+ resets = <&qca8k_nsscc NSS_CC_GEPHY_FULL_ARES>;
|
||||
+ qcom,package-mode = <QCA808X_PCS1_SGMII_MAC_PCS0_SGMII_MAC>;
|
||||
+ qcom,phy-addr-fixup = <1 2 3 4 5 6 7>;
|
||||
+
|
||||
+ ethernet-phy@1 {
|
||||
+ compatible = "ethernet-phy-id004d.d180";
|
||||
+ reg = <1>;
|
||||
+ clocks = <&qca8k_nsscc NSS_CC_GEPHY0_SYS_CLK>;
|
||||
+ resets = <&qca8k_nsscc NSS_CC_GEPHY0_SYS_ARES>;
|
||||
+ };
|
||||
+
|
||||
+ ethernet-phy@2 {
|
||||
+ compatible = "ethernet-phy-id004d.d180";
|
||||
+ reg = <2>;
|
||||
+ clocks = <&qca8k_nsscc NSS_CC_GEPHY1_SYS_CLK>;
|
||||
+ resets = <&qca8k_nsscc NSS_CC_GEPHY1_SYS_ARES>;
|
||||
+ };
|
||||
+
|
||||
+ ethernet-phy@3 {
|
||||
+ compatible = "ethernet-phy-id004d.d180";
|
||||
+ reg = <3>;
|
||||
+ clocks = <&qca8k_nsscc NSS_CC_GEPHY2_SYS_CLK>;
|
||||
+ resets = <&qca8k_nsscc NSS_CC_GEPHY2_SYS_ARES>;
|
||||
+ };
|
||||
+
|
||||
+ ethernet-phy@4 {
|
||||
+ compatible = "ethernet-phy-id004d.d180";
|
||||
+ reg = <4>;
|
||||
+ clocks = <&qca8k_nsscc NSS_CC_GEPHY3_SYS_CLK>;
|
||||
+ resets = <&qca8k_nsscc NSS_CC_GEPHY3_SYS_ARES>;
|
||||
+ };
|
||||
+ };
|
||||
+ };
|
||||
diff --git a/include/dt-bindings/net/qcom,qca808x.h b/include/dt-bindings/net/qcom,qca808x.h
|
||||
new file mode 100644
|
||||
index 000000000000..c3a2830445ea
|
||||
--- /dev/null
|
||||
+++ b/include/dt-bindings/net/qcom,qca808x.h
|
||||
@@ -0,0 +1,14 @@
|
||||
+/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
|
||||
+/*
|
||||
+ * Device Tree constants for the Qualcomm QCA808X PHYs
|
||||
+ */
|
||||
+
|
||||
+#ifndef _DT_BINDINGS_QCOM_QCA808X_H
|
||||
+#define _DT_BINDINGS_QCOM_QCA808X_H
|
||||
+
|
||||
+/* PHY package modes of QCA8084 to apply the interface modes of two PCSes. */
|
||||
+#define QCA808X_PCS1_10G_QXGMII_PCS0_UNUNSED 0
|
||||
+#define QCA808X_PCS1_SGMII_MAC_PCS0_SGMII_MAC 1
|
||||
+#define QCA808X_PCS1_SGMII_MAC_PCS0_SGMII_PHY 2
|
||||
+
|
||||
+#endif
|
||||
--
|
||||
2.45.2
|
||||
|
@ -0,0 +1,138 @@
|
||||
From 9dec04efa81322029e210281b1753a2eb5279e27 Mon Sep 17 00:00:00 2001
|
||||
From: Luo Jie <quic_luoj@quicinc.com>
|
||||
Date: Thu, 6 Apr 2023 18:09:07 +0800
|
||||
Subject: [PATCH 02/50] net: phy: qca808x: Add QCA8084 ethernet phy support
|
||||
|
||||
Add QCA8084 Quad-PHY support, which is a four-port PHY with
|
||||
maximum link capability of 2.5 Gbps. The features of each port
|
||||
are almost same as QCA8081. The slave seed and fast retrain
|
||||
configs are not needed for QCA8084. It includes two PCSes.
|
||||
|
||||
PCS0 of QCA8084 supports the interface modes:
|
||||
PHY_INTERFACE_MODE_2500BASEX and PHY_INTERFACE_MODE_SGMII.
|
||||
|
||||
PCS1 of QCA8084 supports the interface modes:
|
||||
PHY_INTERFACE_MODE_10G_QXGMII, PHY_INTERFACE_MODE_2500BASEX and
|
||||
PHY_INTERFACE_MODE_SGMII.
|
||||
|
||||
The additional CDT configurations needed for QCA8084 compared
|
||||
with QCA8081.
|
||||
|
||||
Change-Id: I12555fa70662682474ab4432204405b5e752fef6
|
||||
Signed-off-by: Luo Jie <quic_luoj@quicinc.com>
|
||||
---
|
||||
drivers/net/phy/qcom/qca808x.c | 62 ++++++++++++++++++++++++++++++++--
|
||||
1 file changed, 60 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/phy/qcom/qca808x.c b/drivers/net/phy/qcom/qca808x.c
|
||||
index 5048304ccc9e..be46d16ca09f 100644
|
||||
--- a/drivers/net/phy/qcom/qca808x.c
|
||||
+++ b/drivers/net/phy/qcom/qca808x.c
|
||||
@@ -86,9 +86,16 @@
|
||||
#define QCA8081_PHY_FIFO_RSTN BIT(11)
|
||||
|
||||
#define QCA8081_PHY_ID 0x004dd101
|
||||
+#define QCA8084_PHY_ID 0x004dd180
|
||||
+
|
||||
+#define QCA8084_MMD3_CDT_PULSE_CTRL 0x8075
|
||||
+#define QCA8084_CDT_PULSE_THRESH_VAL 0xa060
|
||||
+
|
||||
+#define QCA8084_MMD3_CDT_NEAR_CTRL 0x807f
|
||||
+#define QCA8084_CDT_NEAR_BYPASS BIT(15)
|
||||
|
||||
MODULE_DESCRIPTION("Qualcomm Atheros QCA808X PHY driver");
|
||||
-MODULE_AUTHOR("Matus Ujhelyi");
|
||||
+MODULE_AUTHOR("Matus Ujhelyi, Luo Jie");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
struct qca808x_priv {
|
||||
@@ -153,7 +160,9 @@ static bool qca808x_is_prefer_master(struct phy_device *phydev)
|
||||
|
||||
static bool qca808x_has_fast_retrain_or_slave_seed(struct phy_device *phydev)
|
||||
{
|
||||
- return linkmode_test_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT, phydev->supported);
|
||||
+ return phydev_id_compare(phydev, QCA8081_PHY_ID) &&
|
||||
+ linkmode_test_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT,
|
||||
+ phydev->supported);
|
||||
}
|
||||
|
||||
static bool qca808x_is_1g_only(struct phy_device *phydev)
|
||||
@@ -273,6 +282,23 @@ static int qca808x_read_status(struct phy_device *phydev)
|
||||
return ret;
|
||||
|
||||
if (phydev->link) {
|
||||
+ /* There are two PCSes available for QCA8084, which support
|
||||
+ * the following interface modes.
|
||||
+ *
|
||||
+ * 1. PHY_INTERFACE_MODE_10G_QXGMII utilizes PCS1 for all
|
||||
+ * available 4 ports, which is for all link speeds.
|
||||
+ *
|
||||
+ * 2. PHY_INTERFACE_MODE_2500BASEX utilizes PCS0 for the
|
||||
+ * fourth port, which is only for the link speed 2500M same
|
||||
+ * as QCA8081.
|
||||
+ *
|
||||
+ * 3. PHY_INTERFACE_MODE_SGMII utilizes PCS0 for the fourth
|
||||
+ * port, which is for the link speed 10M, 100M and 1000M same
|
||||
+ * as QCA8081.
|
||||
+ */
|
||||
+ if (phydev->interface == PHY_INTERFACE_MODE_10G_QXGMII)
|
||||
+ return 0;
|
||||
+
|
||||
if (phydev->speed == SPEED_2500)
|
||||
phydev->interface = PHY_INTERFACE_MODE_2500BASEX;
|
||||
else
|
||||
@@ -352,6 +378,18 @@ static int qca808x_cable_test_start(struct phy_device *phydev)
|
||||
phy_write_mmd(phydev, MDIO_MMD_PCS, 0x807a, 0xc060);
|
||||
phy_write_mmd(phydev, MDIO_MMD_PCS, 0x807e, 0xb060);
|
||||
|
||||
+ if (phydev_id_compare(phydev, QCA8084_PHY_ID)) {
|
||||
+ /* Adjust the positive and negative pulse thereshold of CDT. */
|
||||
+ phy_write_mmd(phydev, MDIO_MMD_PCS,
|
||||
+ QCA8084_MMD3_CDT_PULSE_CTRL,
|
||||
+ QCA8084_CDT_PULSE_THRESH_VAL);
|
||||
+
|
||||
+ /* Disable the near bypass of CDT. */
|
||||
+ phy_modify_mmd(phydev, MDIO_MMD_PCS,
|
||||
+ QCA8084_MMD3_CDT_NEAR_CTRL,
|
||||
+ QCA8084_CDT_NEAR_BYPASS, 0);
|
||||
+ }
|
||||
+
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -651,12 +689,32 @@ static struct phy_driver qca808x_driver[] = {
|
||||
.led_hw_control_set = qca808x_led_hw_control_set,
|
||||
.led_hw_control_get = qca808x_led_hw_control_get,
|
||||
.led_polarity_set = qca808x_led_polarity_set,
|
||||
+}, {
|
||||
+ /* Qualcomm QCA8084 */
|
||||
+ PHY_ID_MATCH_MODEL(QCA8084_PHY_ID),
|
||||
+ .name = "Qualcomm QCA8084",
|
||||
+ .flags = PHY_POLL_CABLE_TEST,
|
||||
+ .config_intr = at803x_config_intr,
|
||||
+ .handle_interrupt = at803x_handle_interrupt,
|
||||
+ .get_tunable = at803x_get_tunable,
|
||||
+ .set_tunable = at803x_set_tunable,
|
||||
+ .set_wol = at803x_set_wol,
|
||||
+ .get_wol = at803x_get_wol,
|
||||
+ .get_features = qca808x_get_features,
|
||||
+ .config_aneg = qca808x_config_aneg,
|
||||
+ .suspend = genphy_suspend,
|
||||
+ .resume = genphy_resume,
|
||||
+ .read_status = qca808x_read_status,
|
||||
+ .soft_reset = qca808x_soft_reset,
|
||||
+ .cable_test_start = qca808x_cable_test_start,
|
||||
+ .cable_test_get_status = qca808x_cable_test_get_status,
|
||||
}, };
|
||||
|
||||
module_phy_driver(qca808x_driver);
|
||||
|
||||
static struct mdio_device_id __maybe_unused qca808x_tbl[] = {
|
||||
{ PHY_ID_MATCH_EXACT(QCA8081_PHY_ID) },
|
||||
+ { PHY_ID_MATCH_MODEL(QCA8084_PHY_ID) },
|
||||
{ }
|
||||
};
|
||||
|
||||
--
|
||||
2.45.2
|
||||
|
@ -0,0 +1,90 @@
|
||||
From fd5ec7c0a9f7167baf377a4bbae72eda391df996 Mon Sep 17 00:00:00 2001
|
||||
From: Luo Jie <quic_luoj@quicinc.com>
|
||||
Date: Wed, 8 Nov 2023 16:18:02 +0800
|
||||
Subject: [PATCH 03/50] net: phy: qca808x: Add config_init function for QCA8084
|
||||
|
||||
1. The ADC of QCA8084 PHY must be configured as edge inverted
|
||||
and falling whenever it is initialized or reset. In addition,
|
||||
the default MSE (Mean square error) threshold value is adjusted,
|
||||
which comes into play during link partner detection to detect
|
||||
the valid link signal.
|
||||
|
||||
2. Add the possible interface modes.
|
||||
When QCA8084 works on the interface mode SGMII or 2500BASE-X, the
|
||||
interface mode can be switched according to the PHY link speed.
|
||||
|
||||
When QCA8084 works on the 10G-QXGMII mode, which will be the only
|
||||
possible interface mode.
|
||||
|
||||
Change-Id: I832c0d0b069e95cc411a8a7b680a5f60e1d6041a
|
||||
Signed-off-by: Luo Jie <quic_luoj@quicinc.com>
|
||||
---
|
||||
drivers/net/phy/qcom/qca808x.c | 38 ++++++++++++++++++++++++++++++++++
|
||||
1 file changed, 38 insertions(+)
|
||||
|
||||
diff --git a/drivers/net/phy/qcom/qca808x.c b/drivers/net/phy/qcom/qca808x.c
|
||||
index be46d16ca09f..c88fa59d4029 100644
|
||||
--- a/drivers/net/phy/qcom/qca808x.c
|
||||
+++ b/drivers/net/phy/qcom/qca808x.c
|
||||
@@ -94,6 +94,15 @@
|
||||
#define QCA8084_MMD3_CDT_NEAR_CTRL 0x807f
|
||||
#define QCA8084_CDT_NEAR_BYPASS BIT(15)
|
||||
|
||||
+/* QCA8084 ADC clock edge */
|
||||
+#define QCA8084_ADC_CLK_SEL 0x8b80
|
||||
+#define QCA8084_ADC_CLK_SEL_ACLK GENMASK(7, 4)
|
||||
+#define QCA8084_ADC_CLK_SEL_ACLK_FALL 0xf
|
||||
+#define QCA8084_ADC_CLK_SEL_ACLK_RISE 0x0
|
||||
+
|
||||
+#define QCA8084_MSE_THRESHOLD 0x800a
|
||||
+#define QCA8084_MSE_THRESHOLD_2P5G_VAL 0x51c6
|
||||
+
|
||||
MODULE_DESCRIPTION("Qualcomm Atheros QCA808X PHY driver");
|
||||
MODULE_AUTHOR("Matus Ujhelyi, Luo Jie");
|
||||
MODULE_LICENSE("GPL");
|
||||
@@ -660,6 +669,34 @@ static int qca808x_led_polarity_set(struct phy_device *phydev, int index,
|
||||
active_low ? 0 : QCA808X_LED_ACTIVE_HIGH);
|
||||
}
|
||||
|
||||
+static int qca8084_config_init(struct phy_device *phydev)
|
||||
+{
|
||||
+ int ret;
|
||||
+
|
||||
+ if (phydev->interface == PHY_INTERFACE_MODE_10G_QXGMII)
|
||||
+ __set_bit(PHY_INTERFACE_MODE_10G_QXGMII,
|
||||
+ phydev->possible_interfaces);
|
||||
+ else
|
||||
+ qca808x_fill_possible_interfaces(phydev);
|
||||
+
|
||||
+ /* Configure the ADC to convert the signal using falling edge
|
||||
+ * instead of the default rising edge.
|
||||
+ */
|
||||
+ ret = at803x_debug_reg_mask(phydev, QCA8084_ADC_CLK_SEL,
|
||||
+ QCA8084_ADC_CLK_SEL_ACLK,
|
||||
+ FIELD_PREP(QCA8084_ADC_CLK_SEL_ACLK,
|
||||
+ QCA8084_ADC_CLK_SEL_ACLK_FALL));
|
||||
+ if (ret < 0)
|
||||
+ return ret;
|
||||
+
|
||||
+ /* Adjust MSE threshold value to avoid link issue with
|
||||
+ * some link partner.
|
||||
+ */
|
||||
+ return phy_write_mmd(phydev, MDIO_MMD_PMAPMD,
|
||||
+ QCA8084_MSE_THRESHOLD,
|
||||
+ QCA8084_MSE_THRESHOLD_2P5G_VAL);
|
||||
+}
|
||||
+
|
||||
static struct phy_driver qca808x_driver[] = {
|
||||
{
|
||||
/* Qualcomm QCA8081 */
|
||||
@@ -708,6 +745,7 @@ static struct phy_driver qca808x_driver[] = {
|
||||
.soft_reset = qca808x_soft_reset,
|
||||
.cable_test_start = qca808x_cable_test_start,
|
||||
.cable_test_get_status = qca808x_cable_test_get_status,
|
||||
+ .config_init = qca8084_config_init,
|
||||
}, };
|
||||
|
||||
module_phy_driver(qca808x_driver);
|
||||
--
|
||||
2.45.2
|
||||
|
@ -0,0 +1,95 @@
|
||||
From d9b391e7b695b7de04c4363b5ec9ffaaed387353 Mon Sep 17 00:00:00 2001
|
||||
From: Luo Jie <quic_luoj@quicinc.com>
|
||||
Date: Wed, 8 Nov 2023 18:01:14 +0800
|
||||
Subject: [PATCH 04/50] net: phy: qca808x: Add link_change_notify function for
|
||||
QCA8084
|
||||
|
||||
When the link is changed, QCA8084 needs to do the fifo reset and
|
||||
adjust the IPG level for the 10G-QXGMII link on the speed 1000M.
|
||||
|
||||
Change-Id: I21de802c78496fb95f1c5119fe3894c9fdebbd65
|
||||
Signed-off-by: Luo Jie <quic_luoj@quicinc.com>
|
||||
---
|
||||
drivers/net/phy/qcom/qca808x.c | 52 ++++++++++++++++++++++++++++++++++
|
||||
1 file changed, 52 insertions(+)
|
||||
|
||||
diff --git a/drivers/net/phy/qcom/qca808x.c b/drivers/net/phy/qcom/qca808x.c
|
||||
index c88fa59d4029..029d5f9de6b8 100644
|
||||
--- a/drivers/net/phy/qcom/qca808x.c
|
||||
+++ b/drivers/net/phy/qcom/qca808x.c
|
||||
@@ -103,6 +103,14 @@
|
||||
#define QCA8084_MSE_THRESHOLD 0x800a
|
||||
#define QCA8084_MSE_THRESHOLD_2P5G_VAL 0x51c6
|
||||
|
||||
+/* QCA8084 FIFO reset control */
|
||||
+#define QCA8084_FIFO_CONTROL 0x19
|
||||
+#define QCA8084_FIFO_MAC_2_PHY BIT(1)
|
||||
+#define QCA8084_FIFO_PHY_2_MAC BIT(0)
|
||||
+
|
||||
+#define QCA8084_MMD7_IPG_OP 0x901d
|
||||
+#define QCA8084_IPG_10_TO_11_EN BIT(0)
|
||||
+
|
||||
MODULE_DESCRIPTION("Qualcomm Atheros QCA808X PHY driver");
|
||||
MODULE_AUTHOR("Matus Ujhelyi, Luo Jie");
|
||||
MODULE_LICENSE("GPL");
|
||||
@@ -697,6 +705,49 @@ static int qca8084_config_init(struct phy_device *phydev)
|
||||
QCA8084_MSE_THRESHOLD_2P5G_VAL);
|
||||
}
|
||||
|
||||
+static void qca8084_link_change_notify(struct phy_device *phydev)
|
||||
+{
|
||||
+ int ret;
|
||||
+
|
||||
+ /* Assert the FIFO between PHY and MAC. */
|
||||
+ ret = phy_modify(phydev, QCA8084_FIFO_CONTROL,
|
||||
+ QCA8084_FIFO_MAC_2_PHY | QCA8084_FIFO_PHY_2_MAC,
|
||||
+ 0);
|
||||
+ if (ret) {
|
||||
+ phydev_err(phydev, "Asserting PHY FIFO failed\n");
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ /* If the PHY is in 10G_QXGMII mode, the FIFO needs to be kept in
|
||||
+ * reset state when link is down, otherwise the FIFO needs to be
|
||||
+ * de-asserted after waiting 50 ms to make the assert completed.
|
||||
+ */
|
||||
+ if (phydev->interface != PHY_INTERFACE_MODE_10G_QXGMII ||
|
||||
+ phydev->link) {
|
||||
+ msleep(50);
|
||||
+
|
||||
+ /* Deassert the FIFO between PHY and MAC. */
|
||||
+ ret = phy_modify(phydev, QCA8084_FIFO_CONTROL,
|
||||
+ QCA8084_FIFO_MAC_2_PHY |
|
||||
+ QCA8084_FIFO_PHY_2_MAC,
|
||||
+ QCA8084_FIFO_MAC_2_PHY |
|
||||
+ QCA8084_FIFO_PHY_2_MAC);
|
||||
+ if (ret) {
|
||||
+ phydev_err(phydev, "De-asserting PHY FIFO failed\n");
|
||||
+ return;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ /* Enable IPG level 10 to 11 tuning for link speed 1000M in the
|
||||
+ * 10G_QXGMII mode.
|
||||
+ */
|
||||
+ if (phydev->interface == PHY_INTERFACE_MODE_10G_QXGMII)
|
||||
+ phy_modify_mmd(phydev, MDIO_MMD_AN, QCA8084_MMD7_IPG_OP,
|
||||
+ QCA8084_IPG_10_TO_11_EN,
|
||||
+ phydev->speed == SPEED_1000 ?
|
||||
+ QCA8084_IPG_10_TO_11_EN : 0);
|
||||
+}
|
||||
+
|
||||
static struct phy_driver qca808x_driver[] = {
|
||||
{
|
||||
/* Qualcomm QCA8081 */
|
||||
@@ -746,6 +797,7 @@ static struct phy_driver qca808x_driver[] = {
|
||||
.cable_test_start = qca808x_cable_test_start,
|
||||
.cable_test_get_status = qca808x_cable_test_get_status,
|
||||
.config_init = qca8084_config_init,
|
||||
+ .link_change_notify = qca8084_link_change_notify,
|
||||
}, };
|
||||
|
||||
module_phy_driver(qca808x_driver);
|
||||
--
|
||||
2.45.2
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user