Received: by 2002:a25:f815:0:0:0:0:0 with SMTP id u21csp2817049ybd; Thu, 27 Jun 2019 20:41:56 -0700 (PDT) X-Google-Smtp-Source: APXvYqy6b8lh2Go5254pYp5x1SJmW6XeVT9Pq7FAwJnwkxhBE+hM6Ccof3C2AAbjrsPPsXqg6HAW X-Received: by 2002:a17:902:b70f:: with SMTP id d15mr8424850pls.318.1561693316842; Thu, 27 Jun 2019 20:41:56 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1561693316; cv=none; d=google.com; s=arc-20160816; b=pbNICmrz0XcZBR5LLDZCUeNnnwX1Puu0dc7IhTb4x6NiTyuAiLW/w+6MdVST2kbf3V uNygYhWVo0adbMsM0zYI5iz546+kAT1M96wL4KHY7kmcbpXL2u4KBG+g6Gui96jE67Yr AUuxovKbmGxupY1Lz8c/EXz5LtQ7k+Ed/HuCyIGwshiHg6huMD6/nami6pX5YUFEUIUD BAjc+lNWHqHCHcwD1gypmcBMh8DAsaJf5nKRhSrIPsB/0svPlhsoeGnCEx++gH86dDk9 2DxhFvwmbsMv2hztYFnkmaFv8kVR98AE0nCeZYnwefLPNe2+Uvex1PwanUlGdJmhVlo2 7U4Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:message-id:date:subject:cc:to:from; bh=iG/6B7FdoglH8mZQygNu2zzc0NsIG9KaQwVbQY/sJJc=; b=B1OlSQaYxXG5rh+fvNqRpgPA31gwp3B0JKv9HRWU18RM731ZLEjUNmP6glC3dyApws 355dlMsgkWWp0xPNLTEDu2hIU75xXmypNMRfAxxiB5ClKdt9evPzS3C+uXS8fdLjUPmt mwzHT0dZTT7eOxhNeHqHTXc4RFpDuyXhpBo6GbhVkID+wNV4VXW5ECGPGT7udmh59Q/X 4iEAVYdLLKqhl8JCLdgD4j10wYqcQ3pmu4NeDbmfX9hgGREzhAnuY1fyS/Z7XIY5E05S V4BymzNP2WqwaWHObeznpWrAVqIdQ5mT7g22u+MQYW50PBBXkL7Qz2yPT47GlCqain4I hPxg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=nxp.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id m9si973350pgq.373.2019.06.27.20.41.41; Thu, 27 Jun 2019 20:41:56 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=nxp.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727082AbfF1Dj5 (ORCPT + 99 others); Thu, 27 Jun 2019 23:39:57 -0400 Received: from inva021.nxp.com ([92.121.34.21]:58604 "EHLO inva021.nxp.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726759AbfF1Dj4 (ORCPT ); Thu, 27 Jun 2019 23:39:56 -0400 Received: from inva021.nxp.com (localhost [127.0.0.1]) by inva021.eu-rdc02.nxp.com (Postfix) with ESMTP id DEF1E200307; Fri, 28 Jun 2019 05:39:53 +0200 (CEST) Received: from invc005.ap-rdc01.nxp.com (invc005.ap-rdc01.nxp.com [165.114.16.14]) by inva021.eu-rdc02.nxp.com (Postfix) with ESMTP id E19A2200304; Fri, 28 Jun 2019 05:39:42 +0200 (CEST) Received: from titan.ap.freescale.net (TITAN.ap.freescale.net [10.192.208.233]) by invc005.ap-rdc01.nxp.com (Postfix) with ESMTP id DE51D402F6; Fri, 28 Jun 2019 11:39:29 +0800 (SGT) From: Anson.Huang@nxp.com To: daniel.lezcano@linaro.org, tglx@linutronix.de, robh+dt@kernel.org, mark.rutland@arm.com, shawnguo@kernel.org, s.hauer@pengutronix.de, kernel@pengutronix.de, festevam@gmail.com, leonard.crestez@nxp.com, viresh.kumar@linaro.org, daniel.baluta@nxp.com, ping.bai@nxp.com, l.stach@pengutronix.de, abel.vesa@nxp.com, andrew.smirnov@gmail.com, ccaione@baylibre.com, angus@akkea.ca, agx@sigxcpu.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org Cc: Linux-imx@nxp.com Subject: [PATCH V3 1/5] clocksource: timer-of: Support getting clock frequency from DT Date: Fri, 28 Jun 2019 11:30:37 +0800 Message-Id: <20190628033041.8513-1-Anson.Huang@nxp.com> X-Mailer: git-send-email 2.14.1 X-Virus-Scanned: ClamAV using ClamSMTP Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Anson Huang More and more platforms use platform driver model for clock driver, so the clock driver is NOT ready during timer initialization phase, it will cause timer initialization failed. To support those platforms with upper scenario, introducing a new flag TIMER_OF_CLOCK_FREQUENCY which is mutually exclusive with TIMER_OF_CLOCK flag to support getting timer clock frequency from DT, then of_clk operations can be skipped. User needs to select either TIMER_OF_CLOCK_FREQUENCY or TIMER_OF_CLOCK flag if want to use timer-of driver to initialize the clock rate, and the corresponding clock name or property name needs to be specified. Signed-off-by: Anson Huang --- New patch: - Add new flag of TIMER_OF_CLOCK_FREQUENCY, mutually exclusive with TIMER_OF_CLOCK, to support getting clock frequency from DT directly; - Add prop_name to of_timer_clk structure, if using TIMER_OF_CLOCK_FREQUENCY flag, user needs to pass the property name for timer-of driver to get clock frequency from DT, this is to avoid the couple of timer-of driver and DT, so timer-of driver does NOT use a fixed property name. --- drivers/clocksource/timer-of.c | 23 +++++++++++++++++++++++ drivers/clocksource/timer-of.h | 8 +++++--- 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/drivers/clocksource/timer-of.c b/drivers/clocksource/timer-of.c index 8054228..c91a8b6 100644 --- a/drivers/clocksource/timer-of.c +++ b/drivers/clocksource/timer-of.c @@ -161,6 +161,21 @@ static __init int timer_of_base_init(struct device_node *np, return 0; } +static __init int timer_of_clk_frequency_init(struct device_node *np, + struct of_timer_clk *of_clk) +{ + int ret; + u32 rate; + + ret = of_property_read_u32(np, of_clk->prop_name, &rate); + if (!ret) { + of_clk->rate = rate; + of_clk->period = DIV_ROUND_UP(rate, HZ); + } + + return ret; +} + int __init timer_of_init(struct device_node *np, struct timer_of *to) { int ret = -EINVAL; @@ -178,6 +193,11 @@ int __init timer_of_init(struct device_node *np, struct timer_of *to) if (ret) goto out_fail; flags |= TIMER_OF_CLOCK; + } else if (to->flags & TIMER_OF_CLOCK_FREQUENCY) { + ret = timer_of_clk_frequency_init(np, &to->of_clk); + if (ret) + goto out_fail; + flags |= TIMER_OF_CLOCK_FREQUENCY; } if (to->flags & TIMER_OF_IRQ) { @@ -201,6 +221,9 @@ int __init timer_of_init(struct device_node *np, struct timer_of *to) if (flags & TIMER_OF_CLOCK) timer_of_clk_exit(&to->of_clk); + if (flags & TIMER_OF_CLOCK_FREQUENCY) + to->of_clk.rate = 0; + if (flags & TIMER_OF_BASE) timer_of_base_exit(&to->of_base); return ret; diff --git a/drivers/clocksource/timer-of.h b/drivers/clocksource/timer-of.h index a5478f3..f1a083e 100644 --- a/drivers/clocksource/timer-of.h +++ b/drivers/clocksource/timer-of.h @@ -4,9 +4,10 @@ #include -#define TIMER_OF_BASE 0x1 -#define TIMER_OF_CLOCK 0x2 -#define TIMER_OF_IRQ 0x4 +#define TIMER_OF_BASE 0x1 +#define TIMER_OF_CLOCK 0x2 +#define TIMER_OF_IRQ 0x4 +#define TIMER_OF_CLOCK_FREQUENCY 0x8 struct of_timer_irq { int irq; @@ -26,6 +27,7 @@ struct of_timer_base { struct of_timer_clk { struct clk *clk; const char *name; + const char *prop_name; int index; unsigned long rate; unsigned long period; -- 2.7.4