| .. | .. |
|---|
| 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 |
|---|