198 lines
5.7 KiB
Diff
198 lines
5.7 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Paolo Sabatino <[email protected]>
|
|
Date: Thu, 11 Jan 2024 20:42:48 +0100
|
|
Subject: add rk3228/rk3328 to rockchip dfi driver
|
|
|
|
---
|
|
arch/arm/boot/dts/rockchip/rk322x.dtsi | 7 +
|
|
drivers/devfreq/event/rockchip-dfi.c | 77 +++++++++-
|
|
include/soc/rockchip/rk3228_grf.h | 14 ++
|
|
include/soc/rockchip/rk3328_grf.h | 14 ++
|
|
4 files changed, 105 insertions(+), 7 deletions(-)
|
|
|
|
diff --git a/arch/arm/boot/dts/rockchip/rk322x.dtsi b/arch/arm/boot/dts/rockchip/rk322x.dtsi
|
|
index 111111111111..222222222222 100644
|
|
--- a/arch/arm/boot/dts/rockchip/rk322x.dtsi
|
|
+++ b/arch/arm/boot/dts/rockchip/rk322x.dtsi
|
|
@@ -132,6 +132,13 @@ xin24m: oscillator {
|
|
#clock-cells = <0>;
|
|
};
|
|
|
|
+ dfi: dfi@11210000 {
|
|
+ reg = <0x11210000 0x400>;
|
|
+ compatible = "rockchip,rk3228-dfi";
|
|
+ rockchip,grf = <&grf>;
|
|
+ status = "okay";
|
|
+ };
|
|
+
|
|
display_subsystem: display-subsystem {
|
|
compatible = "rockchip,display-subsystem";
|
|
ports = <&vop_out>;
|
|
diff --git a/drivers/devfreq/event/rockchip-dfi.c b/drivers/devfreq/event/rockchip-dfi.c
|
|
index 111111111111..222222222222 100644
|
|
--- a/drivers/devfreq/event/rockchip-dfi.c
|
|
+++ b/drivers/devfreq/event/rockchip-dfi.c
|
|
@@ -24,6 +24,8 @@
|
|
#include <linux/perf_event.h>
|
|
|
|
#include <soc/rockchip/rockchip_grf.h>
|
|
+#include <soc/rockchip/rk3228_grf.h>
|
|
+#include <soc/rockchip/rk3328_grf.h>
|
|
#include <soc/rockchip/rk3399_grf.h>
|
|
#include <soc/rockchip/rk3568_grf.h>
|
|
#include <soc/rockchip/rk3588_grf.h>
|
|
@@ -99,6 +101,7 @@ struct rockchip_dfi {
|
|
|
|
struct device *dev;
|
|
void __iomem *regs;
|
|
+ struct regmap *regmap_grf;
|
|
struct regmap *regmap_pmu;
|
|
struct clk *clk;
|
|
int usecount;
|
|
@@ -673,6 +676,46 @@ static int rockchip_ddr_perf_init(struct rockchip_dfi *dfi)
|
|
}
|
|
#endif
|
|
|
|
+static int rk3228_dfi_init(struct rockchip_dfi *dfi)
|
|
+{
|
|
+ u32 val;
|
|
+
|
|
+ regmap_read(dfi->regmap_grf, RK3228_GRF_OS_REG2, &val);
|
|
+ dfi->ddr_type = FIELD_GET(RK3228_GRF_OS_REG2_DDRTYPE, val);
|
|
+
|
|
+ dfi->channel_mask = GENMASK(0, 0);
|
|
+ dfi->max_channels = 1;
|
|
+
|
|
+ dfi->buswidth[0] = 2; // 16 bit bus width
|
|
+
|
|
+ dfi->ddrmon_stride = 0x0; // single channel controller
|
|
+ dfi->ddrmon_ctrl_single = true;
|
|
+
|
|
+ dfi->clk = NULL;
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+static int rk3328_dfi_init(struct rockchip_dfi *dfi)
|
|
+{
|
|
+ u32 val;
|
|
+
|
|
+ regmap_read(dfi->regmap_grf, RK3328_GRF_OS_REG2, &val);
|
|
+ dfi->ddr_type = FIELD_GET(RK3328_GRF_OS_REG2_DDRTYPE, val);
|
|
+
|
|
+ dfi->channel_mask = GENMASK(0, 0);
|
|
+ dfi->max_channels = 1;
|
|
+
|
|
+ dfi->buswidth[0] = 2; // 16 bit bus width
|
|
+
|
|
+ dfi->ddrmon_stride = 0x0; // single channel controller
|
|
+ dfi->ddrmon_ctrl_single = true;
|
|
+
|
|
+ dfi->clk = NULL;
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
static int rk3399_dfi_init(struct rockchip_dfi *dfi)
|
|
{
|
|
struct regmap *regmap_pmu = dfi->regmap_pmu;
|
|
@@ -762,6 +805,8 @@ static int rk3588_dfi_init(struct rockchip_dfi *dfi)
|
|
};
|
|
|
|
static const struct of_device_id rockchip_dfi_id_match[] = {
|
|
+ { .compatible = "rockchip,rk3228-dfi", .data = rk3228_dfi_init },
|
|
+ { .compatible = "rockchip,rk3328-dfi", .data = rk3328_dfi_init },
|
|
{ .compatible = "rockchip,rk3399-dfi", .data = rk3399_dfi_init },
|
|
{ .compatible = "rockchip,rk3568-dfi", .data = rk3568_dfi_init },
|
|
{ .compatible = "rockchip,rk3588-dfi", .data = rk3588_dfi_init },
|
|
@@ -791,14 +836,30 @@ static int rockchip_dfi_probe(struct platform_device *pdev)
|
|
if (IS_ERR(dfi->regs))
|
|
return PTR_ERR(dfi->regs);
|
|
|
|
- node = of_parse_phandle(np, "rockchip,pmu", 0);
|
|
- if (!node)
|
|
- return dev_err_probe(&pdev->dev, -ENODEV, "Can't find pmu_grf registers\n");
|
|
+ if (soc_init == rk3228_dfi_init ||
|
|
+ soc_init == rk3328_dfi_init) {
|
|
+ node = of_parse_phandle(np, "rockchip,grf", 0);
|
|
+ if (!node)
|
|
+ return dev_err_probe(&pdev->dev, -ENODEV, "Can't find grf registers");
|
|
|
|
- dfi->regmap_pmu = syscon_node_to_regmap(node);
|
|
- of_node_put(node);
|
|
- if (IS_ERR(dfi->regmap_pmu))
|
|
- return PTR_ERR(dfi->regmap_pmu);
|
|
+ dfi->regmap_grf = syscon_node_to_regmap(node);
|
|
+ of_node_put(node);
|
|
+ if (IS_ERR(dfi->regmap_grf))
|
|
+ return PTR_ERR(dfi->regmap_grf);
|
|
+ }
|
|
+
|
|
+ if (soc_init == rk3399_dfi_init ||
|
|
+ soc_init == rk3568_dfi_init ||
|
|
+ soc_init == rk3588_dfi_init) {
|
|
+ node = of_parse_phandle(np, "rockchip,pmu", 0);
|
|
+ if (!node)
|
|
+ return dev_err_probe(&pdev->dev, -ENODEV, "Can't find pmu_grf registers\n");
|
|
+
|
|
+ dfi->regmap_pmu = syscon_node_to_regmap(node);
|
|
+ of_node_put(node);
|
|
+ if (IS_ERR(dfi->regmap_pmu))
|
|
+ return PTR_ERR(dfi->regmap_pmu);
|
|
+ }
|
|
|
|
dfi->dev = dev;
|
|
mutex_init(&dfi->mutex);
|
|
@@ -823,6 +884,8 @@ static int rockchip_dfi_probe(struct platform_device *pdev)
|
|
if (ret)
|
|
return ret;
|
|
|
|
+ dev_notice(dfi->dev, "dfi initialized, dram type: 0x%x, channels: %d\n", dfi->ddr_type, dfi->max_channels);
|
|
+
|
|
platform_set_drvdata(pdev, dfi);
|
|
|
|
return 0;
|
|
diff --git a/include/soc/rockchip/rk3228_grf.h b/include/soc/rockchip/rk3228_grf.h
|
|
new file mode 100644
|
|
index 000000000000..111111111111
|
|
--- /dev/null
|
|
+++ b/include/soc/rockchip/rk3228_grf.h
|
|
@@ -0,0 +1,14 @@
|
|
+/* SPDX-License-Identifier: GPL-2.0+ */
|
|
+/*
|
|
+ * Rockchip General Register Files definitions for RK3228
|
|
+ *
|
|
+ * Author: Paolo Sabatino <[email protected]>
|
|
+ */
|
|
+
|
|
+#ifndef __SOC_RK3228_GRF_H
|
|
+#define __SOC_RK3228_GRF_H
|
|
+
|
|
+#define RK3228_GRF_OS_REG2 0x5d0
|
|
+#define RK3228_GRF_OS_REG2_DDRTYPE GENMASK(15, 13)
|
|
+
|
|
+#endif
|
|
diff --git a/include/soc/rockchip/rk3328_grf.h b/include/soc/rockchip/rk3328_grf.h
|
|
new file mode 100644
|
|
index 000000000000..111111111111
|
|
--- /dev/null
|
|
+++ b/include/soc/rockchip/rk3328_grf.h
|
|
@@ -0,0 +1,14 @@
|
|
+/* SPDX-License-Identifier: GPL-2.0+ */
|
|
+/*
|
|
+ * Rockchip General Register Files definitions for RK3328
|
|
+ *
|
|
+ * Author: Paolo Sabatino <[email protected]>
|
|
+ */
|
|
+
|
|
+#ifndef __SOC_RK3328_GRF_H
|
|
+#define __SOC_RK3328_GRF_H
|
|
+
|
|
+#define RK3328_GRF_OS_REG2 0x5d0
|
|
+#define RK3328_GRF_OS_REG2_DDRTYPE GENMASK(15, 13)
|
|
+
|
|
+#endif
|
|
--
|
|
Armbian
|
|
|