.. | .. |
---|
56 | 56 | #define RK3368_DFI_EN (0x30003 << 5) |
---|
57 | 57 | #define RK3368_DFI_DIS (0x30000 << 5) |
---|
58 | 58 | |
---|
| 59 | +#define RK3528_PMUGRF_OFFSET 0x70000 |
---|
| 60 | +#define RK3528_PMUGRF_OS_REG18 0x248 |
---|
| 61 | +#define RK3528_PMUGRF_OS_REG19 0x24c |
---|
| 62 | + |
---|
59 | 63 | #define MAX_DMC_NUM_CH 2 |
---|
60 | 64 | #define READ_DRAMTYPE_INFO(n) (((n) >> 13) & 0x7) |
---|
61 | 65 | #define READ_CH_INFO(n) (((n) >> 28) & 0x3) |
---|
.. | .. |
---|
111 | 115 | struct regmap *regmap_pmugrf; |
---|
112 | 116 | struct clk *clk; |
---|
113 | 117 | u32 dram_type; |
---|
| 118 | + u32 count_rate; |
---|
114 | 119 | /* |
---|
115 | 120 | * available mask, 1: available, 0: not available |
---|
116 | 121 | * each bit represent a channel |
---|
.. | .. |
---|
377 | 382 | u32 tmp, max = 0; |
---|
378 | 383 | u32 i, busier_ch = 0; |
---|
379 | 384 | void __iomem *dfi_regs = info->regs; |
---|
| 385 | + u32 count_rate = 1; |
---|
380 | 386 | |
---|
381 | 387 | rockchip_dfi_stop_hardware_counter(edev); |
---|
| 388 | + |
---|
| 389 | + if (info->count_rate) |
---|
| 390 | + count_rate = info->count_rate; |
---|
382 | 391 | |
---|
383 | 392 | /* Find out which channel is busier */ |
---|
384 | 393 | for (i = 0; i < MAX_DMC_NUM_CH; i++) { |
---|
.. | .. |
---|
386 | 395 | continue; |
---|
387 | 396 | |
---|
388 | 397 | 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; |
---|
390 | 399 | |
---|
391 | 400 | /* LPDDR4 and LPDDR4X BL = 16,other DDR type BL = 8 */ |
---|
392 | 401 | tmp = readl_relaxed(dfi_regs + |
---|
.. | .. |
---|
639 | 648 | return 0; |
---|
640 | 649 | } |
---|
641 | 650 | |
---|
| 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 | + |
---|
642 | 686 | static const struct of_device_id rockchip_dfi_id_match[] = { |
---|
643 | 687 | #ifdef CONFIG_CPU_PX30 |
---|
644 | 688 | { .compatible = "rockchip,px30-dfi", .data = px30_dfi_init }, |
---|
.. | .. |
---|
661 | 705 | #ifdef CONFIG_CPU_RK3399 |
---|
662 | 706 | { .compatible = "rockchip,rk3399-dfi", .data = rockchip_dfi_init }, |
---|
663 | 707 | #endif |
---|
| 708 | +#ifdef CONFIG_CPU_RK3528 |
---|
| 709 | + { .compatible = "rockchip,rk3528-dfi", .data = rk3528_dfi_init }, |
---|
| 710 | +#endif |
---|
664 | 711 | #ifdef CONFIG_CPU_RK3568 |
---|
665 | 712 | { .compatible = "rockchip,rk3568-dfi", .data = px30_dfi_init }, |
---|
666 | 713 | #endif |
---|