Received: by 2002:a05:6a10:8c0a:0:0:0:0 with SMTP id go10csp653219pxb; Wed, 20 Jan 2021 17:23:50 -0800 (PST) X-Google-Smtp-Source: ABdhPJwZF4BDlhU2AFoq76zRbNf6+u87py61rMNzZv0W1CjYyUwgOZdrqbee5wEd5UbBTdApfBAO X-Received: by 2002:aa7:c813:: with SMTP id a19mr6755028edt.136.1611192230103; Wed, 20 Jan 2021 17:23:50 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1611192230; cv=none; d=google.com; s=arc-20160816; b=ogT9eqVM4M4UIqe8qSU4NaKlEhSxnO4FL060k30ma+6AdoJPCwpsRZFQgBg47m6o1q lOoS6uIX1qZuwkKcgvsY+q94v6CHQKaUf2emFQIu+2GQmkXG1w5dVppvWduDWL6wqLA8 4vC+bAn7PeRppdnQxaTNVjETfUqKu8ZPyqVji9YvWCbhcNGYt18/ySk2Gp9qzy3pt/Rw LwgTjG9oPE1EWZ005ITtyGXMLbpQwRY/Jz48qtKuB0NqL8iIhbk1K2e2YEn69DSaBCEq 8ywJOOuAeW56S7btFjTIpRirzOS6pS1tIS+VwdniR3xnwUTMxFiPtOXGh9L32QmgfGaW xrjg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:cc:to:subject :message-id:date:from:in-reply-to:references:mime-version; bh=9x8MQhdILbvaSkeK+60lk1IioDcVimtgGgPpf2C9OTw=; b=DKXA8yivBVI1HAuILKbCPlLT+q8LufJ1c01c9YzUiHZKCvDaJphUODh4Nx5VMPJGgh 1sIjtHmj89hAcd4uVofKTt9gj44hEvUYnmdJRJoVFvt3iaxYYHcH5/GeN2vjeReISPtw gbBYx3M5n06PQPuLCN6dDFnbRU1FIfnq5103isLwb8/JLJZJk1R2e9xWyd3yHSdM0hVU d0txW1uxT58CL2ozoNEhK8nT+EClXItGWVVFl6gPDSjEyBJxWfQJB9ARyVZ0GZnYmTuY s7Ku40IJu7uHm/YTSQ0gjl53LvgB6HJxuaAukFZ+mz9tWmx+pM0rtz6y/wssNmXWxsj4 hPuQ== ARC-Authentication-Results: i=1; mx.google.com; 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 y5si808393eds.374.2021.01.20.17.23.26; Wed, 20 Jan 2021 17:23:50 -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; 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 S2387933AbhATVs4 convert rfc822-to-8bit (ORCPT + 99 others); Wed, 20 Jan 2021 16:48:56 -0500 Received: from mail-ed1-f44.google.com ([209.85.208.44]:42476 "EHLO mail-ed1-f44.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727312AbhATVWY (ORCPT ); Wed, 20 Jan 2021 16:22:24 -0500 Received: by mail-ed1-f44.google.com with SMTP id g24so2400edw.9 for ; Wed, 20 Jan 2021 13:22:06 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc:content-transfer-encoding; bh=EglzCdeO5va93bD5hs96FOmFTZfsGQAMi5Enips4xgs=; b=X250bqSTVNPTjI83u5S8ieN8s8CQPu/Yp7p8BkkBFRYImsvMTkSqFQSGT8tx8tMQYF 23JK7oyez/MihpAcJf2DXMpFx5G4/PSjDc4nrff3sAWH2zWVlAsfp2OfgZoqTDU68CfY D80dXt53Gi0By0V1iWEl5fp5OP8qBkMgMj65Kr3BbBi+UEaAQXB8DNkAciiHD/iyz3LM cRwZ2uEcjotysMKgdCRDTJW8O57Ol5m1MxAHFOHCvdWMZY+IrHPZQtB7crd3eGyPkvuK 6qzdjO12B+JsRxOJ/I0Box+wuHHnx3ayI8uGyg033LSjL9kTegMn7tBPB4vKdd7WTDq8 kmXA== X-Gm-Message-State: AOAM530EKySEe3TnSx6soGlXub2UjiilAKctDzIpyuOMqjBI3Qdt+QUK WunW/DLJfImXQlRKSifSEvBybH46WGg2ZWEUUEU= X-Received: by 2002:a05:6402:4310:: with SMTP id m16mr8886243edc.207.1611177701159; Wed, 20 Jan 2021 13:21:41 -0800 (PST) MIME-Version: 1.0 References: <20210120131559.1971359-1-arnd@kernel.org> <20210120131559.1971359-4-arnd@kernel.org> In-Reply-To: <20210120131559.1971359-4-arnd@kernel.org> From: Barry Song Date: Thu, 21 Jan 2021 10:21:30 +1300 Message-ID: Subject: Re: [PATCH 3/4] timer: remove sirf atlas driver To: Arnd Bergmann Cc: linux-arm-kernel@lists.infradead.org, LKML , Daniel Lezcano , Thomas Gleixner , Arnd Bergmann Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: 8BIT Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Arnd Bergmann 于2021年1月21日周四 上午2:16写道: > > From: Arnd Bergmann > > The CSR SiRF prima2/atlas platforms are getting removed, so this driver > is no longer needed. > > Cc: Barry Song > Signed-off-by: Arnd Bergmann Acked-by: Barry Song > --- > drivers/clocksource/Kconfig | 6 - > drivers/clocksource/Makefile | 1 - > drivers/clocksource/timer-atlas7.c | 281 ----------------------------- > 3 files changed, 288 deletions(-) > delete mode 100644 drivers/clocksource/timer-atlas7.c > > diff --git a/drivers/clocksource/Kconfig b/drivers/clocksource/Kconfig > index 1feadd067677..ac6de462591a 100644 > --- a/drivers/clocksource/Kconfig > +++ b/drivers/clocksource/Kconfig > @@ -197,12 +197,6 @@ config CLPS711X_TIMER > help > Enables support for the Cirrus Logic PS711 timer. > > -config ATLAS7_TIMER > - bool "Atlas7 timer driver" if COMPILE_TEST > - select CLKSRC_MMIO > - help > - Enables support for the Atlas7 timer. > - > config MXS_TIMER > bool "MXS timer driver" if COMPILE_TEST > select CLKSRC_MMIO > diff --git a/drivers/clocksource/Makefile b/drivers/clocksource/Makefile > index 1089f2ed8560..49496637700f 100644 > --- a/drivers/clocksource/Makefile > +++ b/drivers/clocksource/Makefile > @@ -30,7 +30,6 @@ obj-$(CONFIG_ARMADA_370_XP_TIMER) += timer-armada-370-xp.o > obj-$(CONFIG_ORION_TIMER) += timer-orion.o > obj-$(CONFIG_BCM2835_TIMER) += bcm2835_timer.o > obj-$(CONFIG_CLPS711X_TIMER) += clps711x-timer.o > -obj-$(CONFIG_ATLAS7_TIMER) += timer-atlas7.o > obj-$(CONFIG_MXS_TIMER) += mxs_timer.o > obj-$(CONFIG_CLKSRC_PXA) += timer-pxa.o > obj-$(CONFIG_PRIMA2_TIMER) += timer-prima2.o > diff --git a/drivers/clocksource/timer-atlas7.c b/drivers/clocksource/timer-atlas7.c > deleted file mode 100644 > index c21c91c2bc56..000000000000 > --- a/drivers/clocksource/timer-atlas7.c > +++ /dev/null > @@ -1,281 +0,0 @@ > -// SPDX-License-Identifier: GPL-2.0-or-later > -/* > - * System timer for CSR SiRFprimaII > - * > - * Copyright (c) 2011 Cambridge Silicon Radio Limited, a CSR plc group company. > - */ > - > -#include > -#include > -#include > -#include > -#include > -#include > -#include > -#include > -#include > -#include > -#include > -#include > -#include > - > -#define SIRFSOC_TIMER_32COUNTER_0_CTRL 0x0000 > -#define SIRFSOC_TIMER_32COUNTER_1_CTRL 0x0004 > -#define SIRFSOC_TIMER_MATCH_0 0x0018 > -#define SIRFSOC_TIMER_MATCH_1 0x001c > -#define SIRFSOC_TIMER_COUNTER_0 0x0048 > -#define SIRFSOC_TIMER_COUNTER_1 0x004c > -#define SIRFSOC_TIMER_INTR_STATUS 0x0060 > -#define SIRFSOC_TIMER_WATCHDOG_EN 0x0064 > -#define SIRFSOC_TIMER_64COUNTER_CTRL 0x0068 > -#define SIRFSOC_TIMER_64COUNTER_LO 0x006c > -#define SIRFSOC_TIMER_64COUNTER_HI 0x0070 > -#define SIRFSOC_TIMER_64COUNTER_LOAD_LO 0x0074 > -#define SIRFSOC_TIMER_64COUNTER_LOAD_HI 0x0078 > -#define SIRFSOC_TIMER_64COUNTER_RLATCHED_LO 0x007c > -#define SIRFSOC_TIMER_64COUNTER_RLATCHED_HI 0x0080 > - > -#define SIRFSOC_TIMER_REG_CNT 6 > - > -static unsigned long atlas7_timer_rate; > - > -static const u32 sirfsoc_timer_reg_list[SIRFSOC_TIMER_REG_CNT] = { > - SIRFSOC_TIMER_WATCHDOG_EN, > - SIRFSOC_TIMER_32COUNTER_0_CTRL, > - SIRFSOC_TIMER_32COUNTER_1_CTRL, > - SIRFSOC_TIMER_64COUNTER_CTRL, > - SIRFSOC_TIMER_64COUNTER_RLATCHED_LO, > - SIRFSOC_TIMER_64COUNTER_RLATCHED_HI, > -}; > - > -static u32 sirfsoc_timer_reg_val[SIRFSOC_TIMER_REG_CNT]; > - > -static void __iomem *sirfsoc_timer_base; > - > -/* disable count and interrupt */ > -static inline void sirfsoc_timer_count_disable(int idx) > -{ > - writel_relaxed(readl_relaxed(sirfsoc_timer_base + SIRFSOC_TIMER_32COUNTER_0_CTRL + 4 * idx) & ~0x7, > - sirfsoc_timer_base + SIRFSOC_TIMER_32COUNTER_0_CTRL + 4 * idx); > -} > - > -/* enable count and interrupt */ > -static inline void sirfsoc_timer_count_enable(int idx) > -{ > - writel_relaxed(readl_relaxed(sirfsoc_timer_base + SIRFSOC_TIMER_32COUNTER_0_CTRL + 4 * idx) | 0x3, > - sirfsoc_timer_base + SIRFSOC_TIMER_32COUNTER_0_CTRL + 4 * idx); > -} > - > -/* timer interrupt handler */ > -static irqreturn_t sirfsoc_timer_interrupt(int irq, void *dev_id) > -{ > - struct clock_event_device *ce = dev_id; > - int cpu = smp_processor_id(); > - > - /* clear timer interrupt */ > - writel_relaxed(BIT(cpu), sirfsoc_timer_base + SIRFSOC_TIMER_INTR_STATUS); > - > - if (clockevent_state_oneshot(ce)) > - sirfsoc_timer_count_disable(cpu); > - > - ce->event_handler(ce); > - > - return IRQ_HANDLED; > -} > - > -/* read 64-bit timer counter */ > -static u64 sirfsoc_timer_read(struct clocksource *cs) > -{ > - u64 cycles; > - > - writel_relaxed((readl_relaxed(sirfsoc_timer_base + SIRFSOC_TIMER_64COUNTER_CTRL) | > - BIT(0)) & ~BIT(1), sirfsoc_timer_base + SIRFSOC_TIMER_64COUNTER_CTRL); > - > - cycles = readl_relaxed(sirfsoc_timer_base + SIRFSOC_TIMER_64COUNTER_RLATCHED_HI); > - cycles = (cycles << 32) | readl_relaxed(sirfsoc_timer_base + SIRFSOC_TIMER_64COUNTER_RLATCHED_LO); > - > - return cycles; > -} > - > -static int sirfsoc_timer_set_next_event(unsigned long delta, > - struct clock_event_device *ce) > -{ > - int cpu = smp_processor_id(); > - > - /* disable timer first, then modify the related registers */ > - sirfsoc_timer_count_disable(cpu); > - > - writel_relaxed(0, sirfsoc_timer_base + SIRFSOC_TIMER_COUNTER_0 + > - 4 * cpu); > - writel_relaxed(delta, sirfsoc_timer_base + SIRFSOC_TIMER_MATCH_0 + > - 4 * cpu); > - > - /* enable the tick */ > - sirfsoc_timer_count_enable(cpu); > - > - return 0; > -} > - > -/* Oneshot is enabled in set_next_event */ > -static int sirfsoc_timer_shutdown(struct clock_event_device *evt) > -{ > - sirfsoc_timer_count_disable(smp_processor_id()); > - return 0; > -} > - > -static void sirfsoc_clocksource_suspend(struct clocksource *cs) > -{ > - int i; > - > - for (i = 0; i < SIRFSOC_TIMER_REG_CNT; i++) > - sirfsoc_timer_reg_val[i] = readl_relaxed(sirfsoc_timer_base + sirfsoc_timer_reg_list[i]); > -} > - > -static void sirfsoc_clocksource_resume(struct clocksource *cs) > -{ > - int i; > - > - for (i = 0; i < SIRFSOC_TIMER_REG_CNT - 2; i++) > - writel_relaxed(sirfsoc_timer_reg_val[i], sirfsoc_timer_base + sirfsoc_timer_reg_list[i]); > - > - writel_relaxed(sirfsoc_timer_reg_val[SIRFSOC_TIMER_REG_CNT - 2], > - sirfsoc_timer_base + SIRFSOC_TIMER_64COUNTER_LOAD_LO); > - writel_relaxed(sirfsoc_timer_reg_val[SIRFSOC_TIMER_REG_CNT - 1], > - sirfsoc_timer_base + SIRFSOC_TIMER_64COUNTER_LOAD_HI); > - > - writel_relaxed(readl_relaxed(sirfsoc_timer_base + SIRFSOC_TIMER_64COUNTER_CTRL) | > - BIT(1) | BIT(0), sirfsoc_timer_base + SIRFSOC_TIMER_64COUNTER_CTRL); > -} > - > -static struct clock_event_device __percpu *sirfsoc_clockevent; > - > -static struct clocksource sirfsoc_clocksource = { > - .name = "sirfsoc_clocksource", > - .rating = 200, > - .mask = CLOCKSOURCE_MASK(64), > - .flags = CLOCK_SOURCE_IS_CONTINUOUS, > - .read = sirfsoc_timer_read, > - .suspend = sirfsoc_clocksource_suspend, > - .resume = sirfsoc_clocksource_resume, > -}; > - > -static unsigned int sirfsoc_timer_irq, sirfsoc_timer1_irq; > - > -static int sirfsoc_local_timer_starting_cpu(unsigned int cpu) > -{ > - struct clock_event_device *ce = per_cpu_ptr(sirfsoc_clockevent, cpu); > - unsigned int irq; > - const char *name; > - > - if (cpu == 0) { > - irq = sirfsoc_timer_irq; > - name = "sirfsoc_timer0"; > - } else { > - irq = sirfsoc_timer1_irq; > - name = "sirfsoc_timer1"; > - } > - > - ce->irq = irq; > - ce->name = "local_timer"; > - ce->features = CLOCK_EVT_FEAT_ONESHOT; > - ce->rating = 200; > - ce->set_state_shutdown = sirfsoc_timer_shutdown; > - ce->set_state_oneshot = sirfsoc_timer_shutdown; > - ce->tick_resume = sirfsoc_timer_shutdown; > - ce->set_next_event = sirfsoc_timer_set_next_event; > - clockevents_calc_mult_shift(ce, atlas7_timer_rate, 60); > - ce->max_delta_ns = clockevent_delta2ns(-2, ce); > - ce->max_delta_ticks = (unsigned long)-2; > - ce->min_delta_ns = clockevent_delta2ns(2, ce); > - ce->min_delta_ticks = 2; > - ce->cpumask = cpumask_of(cpu); > - > - BUG_ON(request_irq(ce->irq, sirfsoc_timer_interrupt, > - IRQF_TIMER | IRQF_NOBALANCING, name, ce)); > - irq_force_affinity(ce->irq, cpumask_of(cpu)); > - > - clockevents_register_device(ce); > - return 0; > -} > - > -static int sirfsoc_local_timer_dying_cpu(unsigned int cpu) > -{ > - struct clock_event_device *ce = per_cpu_ptr(sirfsoc_clockevent, cpu); > - > - sirfsoc_timer_count_disable(1); > - > - if (cpu == 0) > - free_irq(sirfsoc_timer_irq, ce); > - else > - free_irq(sirfsoc_timer1_irq, ce); > - return 0; > -} > - > -static int __init sirfsoc_clockevent_init(void) > -{ > - sirfsoc_clockevent = alloc_percpu(struct clock_event_device); > - BUG_ON(!sirfsoc_clockevent); > - > - /* Install and invoke hotplug callbacks */ > - return cpuhp_setup_state(CPUHP_AP_MARCO_TIMER_STARTING, > - "clockevents/marco:starting", > - sirfsoc_local_timer_starting_cpu, > - sirfsoc_local_timer_dying_cpu); > -} > - > -/* initialize the kernel jiffy timer source */ > -static int __init sirfsoc_atlas7_timer_init(struct device_node *np) > -{ > - struct clk *clk; > - > - clk = of_clk_get(np, 0); > - BUG_ON(IS_ERR(clk)); > - > - BUG_ON(clk_prepare_enable(clk)); > - > - atlas7_timer_rate = clk_get_rate(clk); > - > - /* timer dividers: 0, not divided */ > - writel_relaxed(0, sirfsoc_timer_base + SIRFSOC_TIMER_64COUNTER_CTRL); > - writel_relaxed(0, sirfsoc_timer_base + SIRFSOC_TIMER_32COUNTER_0_CTRL); > - writel_relaxed(0, sirfsoc_timer_base + SIRFSOC_TIMER_32COUNTER_1_CTRL); > - > - /* Initialize timer counters to 0 */ > - writel_relaxed(0, sirfsoc_timer_base + SIRFSOC_TIMER_64COUNTER_LOAD_LO); > - writel_relaxed(0, sirfsoc_timer_base + SIRFSOC_TIMER_64COUNTER_LOAD_HI); > - writel_relaxed(readl_relaxed(sirfsoc_timer_base + SIRFSOC_TIMER_64COUNTER_CTRL) | > - BIT(1) | BIT(0), sirfsoc_timer_base + SIRFSOC_TIMER_64COUNTER_CTRL); > - writel_relaxed(0, sirfsoc_timer_base + SIRFSOC_TIMER_COUNTER_0); > - writel_relaxed(0, sirfsoc_timer_base + SIRFSOC_TIMER_COUNTER_1); > - > - /* Clear all interrupts */ > - writel_relaxed(0xFFFF, sirfsoc_timer_base + SIRFSOC_TIMER_INTR_STATUS); > - > - BUG_ON(clocksource_register_hz(&sirfsoc_clocksource, atlas7_timer_rate)); > - > - return sirfsoc_clockevent_init(); > -} > - > -static int __init sirfsoc_of_timer_init(struct device_node *np) > -{ > - sirfsoc_timer_base = of_iomap(np, 0); > - if (!sirfsoc_timer_base) { > - pr_err("unable to map timer cpu registers\n"); > - return -ENXIO; > - } > - > - sirfsoc_timer_irq = irq_of_parse_and_map(np, 0); > - if (!sirfsoc_timer_irq) { > - pr_err("No irq passed for timer0 via DT\n"); > - return -EINVAL; > - } > - > - sirfsoc_timer1_irq = irq_of_parse_and_map(np, 1); > - if (!sirfsoc_timer1_irq) { > - pr_err("No irq passed for timer1 via DT\n"); > - return -EINVAL; > - } > - > - return sirfsoc_atlas7_timer_init(np); > -} > -TIMER_OF_DECLARE(sirfsoc_atlas7_timer, "sirf,atlas7-tick", sirfsoc_of_timer_init); > -- > 2.29.2 >