Lines Matching +full:ddr +full:- +full:pmu
1 // SPDX-License-Identifier: GPL-2.0-only
4 * Author: Lin Huang <hl@rock-chips.com>
8 #include <linux/devfreq-event.h>
46 * The dfi controller can monitor DDR load. It has an upper and lower threshold
48 * generated to indicate the DDR frequency should be changed.
63 void __iomem *dfi_regs = info->regs; in rockchip_dfi_start_hardware_counter()
67 /* get ddr type */ in rockchip_dfi_start_hardware_counter()
68 regmap_read(info->regmap_pmu, RK3399_PMUGRF_OS_REG2, &val); in rockchip_dfi_start_hardware_counter()
75 /* set ddr type to dfi */ in rockchip_dfi_start_hardware_counter()
88 void __iomem *dfi_regs = info->regs; in rockchip_dfi_stop_hardware_counter()
98 void __iomem *dfi_regs = info->regs; in rockchip_dfi_get_busier_ch()
104 info->ch_usage[i].access = readl_relaxed(dfi_regs + in rockchip_dfi_get_busier_ch()
106 info->ch_usage[i].total = readl_relaxed(dfi_regs + in rockchip_dfi_get_busier_ch()
108 tmp = info->ch_usage[i].access; in rockchip_dfi_get_busier_ch()
124 clk_disable_unprepare(info->clk); in rockchip_dfi_disable()
134 ret = clk_prepare_enable(info->clk); in rockchip_dfi_enable()
136 dev_err(&edev->dev, "failed to enable dfi clk: %d\n", ret); in rockchip_dfi_enable()
157 edata->load_count = info->ch_usage[busier_ch].access; in rockchip_dfi_get_event()
158 edata->total_count = info->ch_usage[busier_ch].total; in rockchip_dfi_get_event()
171 { .compatible = "rockchip,rk3399-dfi" },
178 struct device *dev = &pdev->dev; in rockchip_dfi_probe()
181 struct device_node *np = pdev->dev.of_node, *node; in rockchip_dfi_probe()
185 return -ENOMEM; in rockchip_dfi_probe()
187 data->regs = devm_platform_ioremap_resource(pdev, 0); in rockchip_dfi_probe()
188 if (IS_ERR(data->regs)) in rockchip_dfi_probe()
189 return PTR_ERR(data->regs); in rockchip_dfi_probe()
191 data->clk = devm_clk_get(dev, "pclk_ddr_mon"); in rockchip_dfi_probe()
192 if (IS_ERR(data->clk)) in rockchip_dfi_probe()
193 return dev_err_probe(dev, PTR_ERR(data->clk), in rockchip_dfi_probe()
196 /* try to find the optional reference to the pmu syscon */ in rockchip_dfi_probe()
197 node = of_parse_phandle(np, "rockchip,pmu", 0); in rockchip_dfi_probe()
199 data->regmap_pmu = syscon_node_to_regmap(node); in rockchip_dfi_probe()
201 if (IS_ERR(data->regmap_pmu)) in rockchip_dfi_probe()
202 return PTR_ERR(data->regmap_pmu); in rockchip_dfi_probe()
204 data->dev = dev; in rockchip_dfi_probe()
208 return -ENOMEM; in rockchip_dfi_probe()
210 desc->ops = &rockchip_dfi_ops; in rockchip_dfi_probe()
211 desc->driver_data = data; in rockchip_dfi_probe()
212 desc->name = np->name; in rockchip_dfi_probe()
213 data->desc = desc; in rockchip_dfi_probe()
215 data->edev = devm_devfreq_event_add_edev(&pdev->dev, desc); in rockchip_dfi_probe()
216 if (IS_ERR(data->edev)) { in rockchip_dfi_probe()
217 dev_err(&pdev->dev, in rockchip_dfi_probe()
218 "failed to add devfreq-event device\n"); in rockchip_dfi_probe()
219 return PTR_ERR(data->edev); in rockchip_dfi_probe()
230 .name = "rockchip-dfi",
237 MODULE_AUTHOR("Lin Huang <hl@rock-chips.com>");