From 89d7b6ef3d4c6b4de54c4bc27e472ff6e71cb980 Mon Sep 17 00:00:00 2001 From: Minghao Zhang Date: Mon, 10 May 2021 21:50:57 +0800 Subject: [PATCH] soc: qcom: ddr_stats: update driver to get reg in probe This change optimizes to get reg during probe. With this change no need to ioremap_nocache() reg for every ddr_stats_show() call. Change-Id: Ieb38280d1f03e1d613e638a7532b7b014525fbf1 Signed-off-by: Tushar Nimkar Signed-off-by: Minghao Zhang --- drivers/soc/qcom/ddr_stats.c | 50 +++++++++++++++++++----------------- 1 file changed, 26 insertions(+), 24 deletions(-) diff --git a/drivers/soc/qcom/ddr_stats.c b/drivers/soc/qcom/ddr_stats.c index a2f6e35fb8d0..f620dfc9b6d3 100644 --- a/drivers/soc/qcom/ddr_stats.c +++ b/drivers/soc/qcom/ddr_stats.c @@ -1,7 +1,7 @@ // SPDX-License-Identifier: GPL-2.0-only /* - * Copyright (c) 2019-2020, The Linux Foundation. All rights reserved. + * Copyright (c) 2019-2021, The Linux Foundation. All rights reserved. */ #define pr_fmt(fmt) "%s: " fmt, __func__ @@ -37,8 +37,7 @@ #endif struct ddr_stats_platform_data { - phys_addr_t phys_addr_base; - u32 phys_size; + void __iomem *reg; }; struct stats_entry { @@ -59,6 +58,8 @@ struct ddr_stats_kobj_attr { struct ddr_stats_platform_data *pd; }; +static struct ddr_stats_platform_data *ddr_pdata; + static inline u64 get_time_in_msec(u64 counter) { do_div(counter, MSM_ARCH_TIMER_FREQ); @@ -147,22 +148,10 @@ static ssize_t ddr_stats_show(struct kobject *kobj, struct ddr_stats_platform_data *pdata = NULL; void __iomem *reg; ssize_t length; - u32 key, entry_count; + u32 entry_count; pdata = GET_PDATA_OF_ATTR(attr); - - reg = ioremap_nocache(pdata->phys_addr_base, pdata->phys_size); - if (!reg) { - pr_err("ERROR could not ioremap start=%pa, len=%u\n", - &pdata->phys_addr_base, pdata->phys_size); - return 0; - } - - key = readl_relaxed(reg + offsetof(struct ddr_stats_data, key)); - if (key != MAGIC_KEY1) { - pr_err("Invalid key\n"); - return 0; - } + reg = pdata->reg; entry_count = readl_relaxed(reg + offsetof(struct ddr_stats_data, entry_count)); @@ -172,7 +161,6 @@ static ssize_t ddr_stats_show(struct kobject *kobj, } length = ddr_stats_copy_stats(buf, PAGE_SIZE, reg, entry_count); - iounmap(reg); return length; } @@ -212,13 +200,14 @@ static int ddr_stats_create_sysfs(struct platform_device *pdev, static int ddr_stats_probe(struct platform_device *pdev) { - struct ddr_stats_platform_data *pdata; struct resource *res = NULL, *offset = NULL; u32 offset_addr = 0; void __iomem *phys_ptr = NULL; + phys_addr_t phys_addr_base; + u32 phys_size, key; - pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL); - if (!pdata) + ddr_pdata = devm_kzalloc(&pdev->dev, sizeof(*ddr_pdata), GFP_KERNEL); + if (!ddr_pdata) return -ENOMEM; res = platform_get_resource_byname(pdev, IORESOURCE_MEM, @@ -242,10 +231,23 @@ static int ddr_stats_probe(struct platform_device *pdev) if (!offset_addr) return -ENODEV; - pdata->phys_addr_base = res->start + offset_addr; - pdata->phys_size = resource_size(res); + phys_addr_base = res->start + offset_addr; + phys_size = resource_size(res); - return ddr_stats_create_sysfs(pdev, pdata); + ddr_pdata->reg = devm_ioremap(&pdev->dev, phys_addr_base, phys_size); + if (!ddr_pdata->reg) { + pr_err("ERROR could not ioremap start=%pa, len=%u\n", + phys_addr_base, phys_size); + return -ENODEV; + } + + key = readl_relaxed(ddr_pdata->reg + offsetof(struct ddr_stats_data, key)); + if (key != MAGIC_KEY1) { + pr_err("Invalid key\n"); + return -EINVAL; + } + + return ddr_stats_create_sysfs(pdev, ddr_pdata); } static int ddr_stats_remove(struct platform_device *pdev)