Received: by 2002:a05:6a10:f347:0:0:0:0 with SMTP id d7csp5465292pxu; Tue, 22 Dec 2020 18:57:47 -0800 (PST) X-Google-Smtp-Source: ABdhPJywLDygEtl8oAcmab0AV0yU7I7vHt/2s6CLgMIY5EMqceUrKUjGGfXYovx3mOcDQmyjoft7 X-Received: by 2002:aa7:cdc3:: with SMTP id h3mr22729673edw.52.1608692267120; Tue, 22 Dec 2020 18:57:47 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1608692267; cv=none; d=google.com; s=arc-20160816; b=SJhML1RiQbEn6uPQKVdPjNxEX+arQY8Qx5oAn5QUbzncuJOkBt85bKaBpnxyI+4JGO mmr3z6ZauF+0mvEg7BZjVPA231yHHPicVPotzUWpdjWK7IQEVmnFBCn3Sw206zSrwXTB ovT2yk+ahODBrjSf1dJLCACX5HYGaFs391INLC4pSXSa1pbt4s4Gw2WwD2jkzOzxR43t 95ANr5CA9hyWHngtDax2mSbCzzHzXhn86S3n49SIWrZGs3IMGBYgbAMb1rR75AnX7pKT o/0SRXnWs6WylydloJq4P1xD29b8SemEGWcDoCQFIeRvfLpxRZVDx+BwCfmeDLVMlqkE UArA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=SMoRlgrr7aYUFSk1v9CgwqvU8IHc41cgqTHRQBuuync=; b=EwTDVLJr/0vQE2oVF7emzvADFxh5IC8VxfMZfhuanBhBmJ2MTkS/jbH9qWBwQg8pxX oMpqrjpB+GRVM2uFVaAOGDByP8//8BYDt0PnWV/IQ5KnWyHViwYflpQpwCUfHxXuBU6S V6RBAlKRuWZyRU060C4W9nyQidS3pDNKNLifWtSq8LcGWwdX/5Fnk4b0fwFZC+wawuAG 4EgftfROIsxFnzXo0sJf3uiKBA6mH74PpSgrRRmiSaJ2jSNj1SoDZ4kh4wbLtEvJ1JZw TJ8jblCZ/W/XHqY+ldtUn/X3EpZ2s7jYy9dLP3bPcIceI0JuZsKU8BRM92obb9bcGSLU zgOQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=Gl1NKBar; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id v14si13066642edr.397.2020.12.22.18.57.25; Tue, 22 Dec 2020 18:57:47 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=Gl1NKBar; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729165AbgLWCVA (ORCPT + 99 others); Tue, 22 Dec 2020 21:21:00 -0500 Received: from mail.kernel.org ([198.145.29.99]:45492 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728937AbgLWCUU (ORCPT ); Tue, 22 Dec 2020 21:20:20 -0500 Received: by mail.kernel.org (Postfix) with ESMTPSA id 721C222285; Wed, 23 Dec 2020 02:20:04 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1608690005; bh=9qIZ7qEwWZrzmjNnKLhTBmkGweEftqFRXHnyrccTVI0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Gl1NKBarhbL+sbCDiyplJQUNi5h+FpufPC5PvSQLm5Bd6cyitXvNC1zinWtBLQspS H7RKdxUZeRqh4qhsRHAdrMswFwpcD5F4lyPsrf/+MnZpvFjDqw5Wqc8GIFMGsaJs3J Wxb6IsuueY1uBlsB/0kRoKGOI93Ofd3LsAXY8xdGtip8rEVG2pDd5D9TqUE4w9DF8W mEBU1ylXRCQ9EdzkDlamFWNWTMRcgYyx5Z+4RUz3rD6uKouzXtAlz/QgoHlt+s6e/Q o7cUa7SX5/1pzfVMrVmpFR4XYpCkLnbfmUN5TZY9cv4RqTHAkhxklCWt78DmclNoT/ 1zfLgiWn4q0BQ== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Dinh Nguyen , Daniel Lezcano , Sasha Levin Subject: [PATCH AUTOSEL 5.4 086/130] clocksource/drivers/dw_apb_timer_of: Add error handling if no clock available Date: Tue, 22 Dec 2020 21:17:29 -0500 Message-Id: <20201223021813.2791612-86-sashal@kernel.org> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20201223021813.2791612-1-sashal@kernel.org> References: <20201223021813.2791612-1-sashal@kernel.org> MIME-Version: 1.0 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Dinh Nguyen [ Upstream commit 5d9814df0aec56a638bbf20795abb4cfaf3cd331 ] commit ("b0fc70ce1f02 arm64: berlin: Select DW_APB_TIMER_OF") added the support for the dw_apb_timer into the arm64 defconfig. However, for some platforms like the Intel Stratix10 and Agilex, the clock manager doesn't get loaded until after the timer driver get loaded. Thus, the driver hits the panic "No clock nor clock-frequency property for" because it cannot properly get the clock. This patch adds the error handling needed for the timer driver so that the kernel can continue booting instead of just hitting the panic. Signed-off-by: Dinh Nguyen Signed-off-by: Daniel Lezcano Link: https://lore.kernel.org/r/20201205105223.208604-1-dinguyen@kernel.org Signed-off-by: Sasha Levin --- drivers/clocksource/dw_apb_timer_of.c | 57 ++++++++++++++++++--------- 1 file changed, 39 insertions(+), 18 deletions(-) diff --git a/drivers/clocksource/dw_apb_timer_of.c b/drivers/clocksource/dw_apb_timer_of.c index 6921b91b61ef3..3e8ad6818ff3d 100644 --- a/drivers/clocksource/dw_apb_timer_of.c +++ b/drivers/clocksource/dw_apb_timer_of.c @@ -14,12 +14,13 @@ #include #include -static void __init timer_get_base_and_rate(struct device_node *np, +static int __init timer_get_base_and_rate(struct device_node *np, void __iomem **base, u32 *rate) { struct clk *timer_clk; struct clk *pclk; struct reset_control *rstc; + int ret; *base = of_iomap(np, 0); @@ -46,55 +47,67 @@ static void __init timer_get_base_and_rate(struct device_node *np, pr_warn("pclk for %pOFn is present, but could not be activated\n", np); + if (!of_property_read_u32(np, "clock-freq", rate) && + !of_property_read_u32(np, "clock-frequency", rate)) + return 0; + timer_clk = of_clk_get_by_name(np, "timer"); if (IS_ERR(timer_clk)) - goto try_clock_freq; + return PTR_ERR(timer_clk); - if (!clk_prepare_enable(timer_clk)) { - *rate = clk_get_rate(timer_clk); - return; - } + ret = clk_prepare_enable(timer_clk); + if (ret) + return ret; + + *rate = clk_get_rate(timer_clk); + if (!(*rate)) + return -EINVAL; -try_clock_freq: - if (of_property_read_u32(np, "clock-freq", rate) && - of_property_read_u32(np, "clock-frequency", rate)) - panic("No clock nor clock-frequency property for %pOFn", np); + return 0; } -static void __init add_clockevent(struct device_node *event_timer) +static int __init add_clockevent(struct device_node *event_timer) { void __iomem *iobase; struct dw_apb_clock_event_device *ced; u32 irq, rate; + int ret = 0; irq = irq_of_parse_and_map(event_timer, 0); if (irq == 0) panic("No IRQ for clock event timer"); - timer_get_base_and_rate(event_timer, &iobase, &rate); + ret = timer_get_base_and_rate(event_timer, &iobase, &rate); + if (ret) + return ret; ced = dw_apb_clockevent_init(0, event_timer->name, 300, iobase, irq, rate); if (!ced) - panic("Unable to initialise clockevent device"); + return -EINVAL; dw_apb_clockevent_register(ced); + + return 0; } static void __iomem *sched_io_base; static u32 sched_rate; -static void __init add_clocksource(struct device_node *source_timer) +static int __init add_clocksource(struct device_node *source_timer) { void __iomem *iobase; struct dw_apb_clocksource *cs; u32 rate; + int ret; - timer_get_base_and_rate(source_timer, &iobase, &rate); + ret = timer_get_base_and_rate(source_timer, &iobase, &rate); + if (ret) + return ret; cs = dw_apb_clocksource_init(300, source_timer->name, iobase, rate); if (!cs) - panic("Unable to initialise clocksource device"); + return -EINVAL; dw_apb_clocksource_start(cs); dw_apb_clocksource_register(cs); @@ -106,6 +119,8 @@ static void __init add_clocksource(struct device_node *source_timer) */ sched_io_base = iobase + 0x04; sched_rate = rate; + + return 0; } static u64 notrace read_sched_clock(void) @@ -146,10 +161,14 @@ static struct delay_timer dw_apb_delay_timer = { static int num_called; static int __init dw_apb_timer_init(struct device_node *timer) { + int ret = 0; + switch (num_called) { case 1: pr_debug("%s: found clocksource timer\n", __func__); - add_clocksource(timer); + ret = add_clocksource(timer); + if (ret) + return ret; init_sched_clock(); #ifdef CONFIG_ARM dw_apb_delay_timer.freq = sched_rate; @@ -158,7 +177,9 @@ static int __init dw_apb_timer_init(struct device_node *timer) break; default: pr_debug("%s: found clockevent timer\n", __func__); - add_clockevent(timer); + ret = add_clockevent(timer); + if (ret) + return ret; break; } -- 2.27.0