hc
2023-11-06 e3e12f52b214121840b44c91de5b3e5af5d3eb84
kernel/drivers/devfreq/event/rockchip-dfi.c
....@@ -56,6 +56,10 @@
5656 #define RK3368_DFI_EN (0x30003 << 5)
5757 #define RK3368_DFI_DIS (0x30000 << 5)
5858
59
+#define RK3528_PMUGRF_OFFSET 0x70000
60
+#define RK3528_PMUGRF_OS_REG18 0x248
61
+#define RK3528_PMUGRF_OS_REG19 0x24c
62
+
5963 #define MAX_DMC_NUM_CH 2
6064 #define READ_DRAMTYPE_INFO(n) (((n) >> 13) & 0x7)
6165 #define READ_CH_INFO(n) (((n) >> 28) & 0x3)
....@@ -111,6 +115,7 @@
111115 struct regmap *regmap_pmugrf;
112116 struct clk *clk;
113117 u32 dram_type;
118
+ u32 count_rate;
114119 /*
115120 * available mask, 1: available, 0: not available
116121 * each bit represent a channel
....@@ -377,8 +382,12 @@
377382 u32 tmp, max = 0;
378383 u32 i, busier_ch = 0;
379384 void __iomem *dfi_regs = info->regs;
385
+ u32 count_rate = 1;
380386
381387 rockchip_dfi_stop_hardware_counter(edev);
388
+
389
+ if (info->count_rate)
390
+ count_rate = info->count_rate;
382391
383392 /* Find out which channel is busier */
384393 for (i = 0; i < MAX_DMC_NUM_CH; i++) {
....@@ -386,7 +395,7 @@
386395 continue;
387396
388397 info->ch_usage[i].total = readl_relaxed(dfi_regs +
389
- DDRMON_CH0_COUNT_NUM + i * 20);
398
+ DDRMON_CH0_COUNT_NUM + i * 20) * count_rate;
390399
391400 /* LPDDR4 and LPDDR4X BL = 16,other DDR type BL = 8 */
392401 tmp = readl_relaxed(dfi_regs +
....@@ -639,6 +648,41 @@
639648 return 0;
640649 }
641650
651
+static __maybe_unused __init int rk3528_dfi_init(struct platform_device *pdev,
652
+ struct rockchip_dfi *data,
653
+ struct devfreq_event_desc *desc)
654
+{
655
+ struct device_node *np = pdev->dev.of_node, *node;
656
+ struct resource *res;
657
+ u32 val_18, val_19;
658
+
659
+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
660
+ data->regs = devm_ioremap_resource(&pdev->dev, res);
661
+ if (IS_ERR(data->regs))
662
+ return PTR_ERR(data->regs);
663
+
664
+ node = of_parse_phandle(np, "rockchip,grf", 0);
665
+ if (node) {
666
+ data->regmap_grf = syscon_node_to_regmap(node);
667
+ if (IS_ERR(data->regmap_grf))
668
+ return PTR_ERR(data->regmap_grf);
669
+ }
670
+
671
+ regmap_read(data->regmap_grf, RK3528_PMUGRF_OFFSET + RK3528_PMUGRF_OS_REG18, &val_18);
672
+ regmap_read(data->regmap_grf, RK3528_PMUGRF_OFFSET + RK3528_PMUGRF_OS_REG19, &val_19);
673
+ if (READ_SYSREG_VERSION(val_19) >= 0x3)
674
+ data->dram_type = READ_DRAMTYPE_INFO_V3(val_18, val_19);
675
+ else
676
+ data->dram_type = READ_DRAMTYPE_INFO(val_18);
677
+ data->count_rate = 2;
678
+ data->ch_msk = 1;
679
+ data->clk = NULL;
680
+
681
+ desc->ops = &rockchip_dfi_ops;
682
+
683
+ return 0;
684
+}
685
+
642686 static const struct of_device_id rockchip_dfi_id_match[] = {
643687 #ifdef CONFIG_CPU_PX30
644688 { .compatible = "rockchip,px30-dfi", .data = px30_dfi_init },
....@@ -661,6 +705,9 @@
661705 #ifdef CONFIG_CPU_RK3399
662706 { .compatible = "rockchip,rk3399-dfi", .data = rockchip_dfi_init },
663707 #endif
708
+#ifdef CONFIG_CPU_RK3528
709
+ { .compatible = "rockchip,rk3528-dfi", .data = rk3528_dfi_init },
710
+#endif
664711 #ifdef CONFIG_CPU_RK3568
665712 { .compatible = "rockchip,rk3568-dfi", .data = px30_dfi_init },
666713 #endif