Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

PM / devfreq: rockchip-dfi: Add SoC specific init function

Move the RK3399 specifics to a SoC specific init function to make
the way free for supporting other SoCs later.

Link: https://lore.kernel.org/lkml/20230704093242.583575-5-s.hauer@pengutronix.de/
Reviewed-by: Sebastian Reichel <sebastian.reichel@collabora.com>
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Signed-off-by: Chanwoo Choi <cw00.choi@samsung.com>

authored by

Sascha Hauer and committed by
Chanwoo Choi
559dc287 9325b3ec

+33 -15
+33 -15
drivers/devfreq/event/rockchip-dfi.c
··· 17 17 #include <linux/slab.h> 18 18 #include <linux/list.h> 19 19 #include <linux/of.h> 20 + #include <linux/of_device.h> 20 21 21 22 #include <soc/rockchip/rk3399_grf.h> 22 23 ··· 56 55 void __iomem *regs; 57 56 struct regmap *regmap_pmu; 58 57 struct clk *clk; 58 + u32 ddr_type; 59 59 }; 60 60 61 61 static void rockchip_dfi_start_hardware_counter(struct devfreq_event_dev *edev) 62 62 { 63 63 struct rockchip_dfi *dfi = devfreq_event_get_drvdata(edev); 64 64 void __iomem *dfi_regs = dfi->regs; 65 - u32 val; 66 - u32 ddr_type; 67 - 68 - /* get ddr type */ 69 - regmap_read(dfi->regmap_pmu, RK3399_PMUGRF_OS_REG2, &val); 70 - ddr_type = (val >> RK3399_PMUGRF_DDRTYPE_SHIFT) & 71 - RK3399_PMUGRF_DDRTYPE_MASK; 72 65 73 66 /* clear DDRMON_CTRL setting */ 74 67 writel_relaxed(CLR_DDRMON_CTRL, dfi_regs + DDRMON_CTRL); 75 68 76 69 /* set ddr type to dfi */ 77 - if (ddr_type == RK3399_PMUGRF_DDRTYPE_LPDDR3) 70 + if (dfi->ddr_type == RK3399_PMUGRF_DDRTYPE_LPDDR3) 78 71 writel_relaxed(LPDDR3_EN, dfi_regs + DDRMON_CTRL); 79 - else if (ddr_type == RK3399_PMUGRF_DDRTYPE_LPDDR4) 72 + else if (dfi->ddr_type == RK3399_PMUGRF_DDRTYPE_LPDDR4) 80 73 writel_relaxed(LPDDR4_EN, dfi_regs + DDRMON_CTRL); 81 74 82 75 /* enable count, use software mode */ ··· 162 167 .set_event = rockchip_dfi_set_event, 163 168 }; 164 169 170 + static int rk3399_dfi_init(struct rockchip_dfi *dfi) 171 + { 172 + struct regmap *regmap_pmu = dfi->regmap_pmu; 173 + u32 val; 174 + 175 + dfi->clk = devm_clk_get(dfi->dev, "pclk_ddr_mon"); 176 + if (IS_ERR(dfi->clk)) 177 + return dev_err_probe(dfi->dev, PTR_ERR(dfi->clk), 178 + "Cannot get the clk pclk_ddr_mon\n"); 179 + 180 + /* get ddr type */ 181 + regmap_read(regmap_pmu, RK3399_PMUGRF_OS_REG2, &val); 182 + dfi->ddr_type = (val >> RK3399_PMUGRF_DDRTYPE_SHIFT) & 183 + RK3399_PMUGRF_DDRTYPE_MASK; 184 + 185 + return 0; 186 + }; 187 + 165 188 static const struct of_device_id rockchip_dfi_id_match[] = { 166 - { .compatible = "rockchip,rk3399-dfi" }, 189 + { .compatible = "rockchip,rk3399-dfi", .data = rk3399_dfi_init }, 167 190 { }, 168 191 }; 169 192 MODULE_DEVICE_TABLE(of, rockchip_dfi_id_match); ··· 192 179 struct rockchip_dfi *dfi; 193 180 struct devfreq_event_desc *desc; 194 181 struct device_node *np = pdev->dev.of_node, *node; 182 + int (*soc_init)(struct rockchip_dfi *dfi); 183 + int ret; 184 + 185 + soc_init = of_device_get_match_data(&pdev->dev); 186 + if (!soc_init) 187 + return -EINVAL; 195 188 196 189 dfi = devm_kzalloc(dev, sizeof(*dfi), GFP_KERNEL); 197 190 if (!dfi) ··· 206 187 dfi->regs = devm_platform_ioremap_resource(pdev, 0); 207 188 if (IS_ERR(dfi->regs)) 208 189 return PTR_ERR(dfi->regs); 209 - 210 - dfi->clk = devm_clk_get(dev, "pclk_ddr_mon"); 211 - if (IS_ERR(dfi->clk)) 212 - return dev_err_probe(dev, PTR_ERR(dfi->clk), 213 - "Cannot get the clk pclk_ddr_mon\n"); 214 190 215 191 node = of_parse_phandle(np, "rockchip,pmu", 0); 216 192 if (!node) ··· 222 208 desc->ops = &rockchip_dfi_ops; 223 209 desc->driver_data = dfi; 224 210 desc->name = np->name; 211 + 212 + ret = soc_init(dfi); 213 + if (ret) 214 + return ret; 225 215 226 216 dfi->edev = devm_devfreq_event_add_edev(&pdev->dev, desc); 227 217 if (IS_ERR(dfi->edev)) {