From patchwork Fri Feb 23 10:16:29 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ladislav Michl X-Patchwork-Id: 10237237 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 33E85602A0 for ; Fri, 23 Feb 2018 10:18:27 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 12ED329086 for ; Fri, 23 Feb 2018 10:18:27 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 04D2D29093; Fri, 23 Feb 2018 10:18:27 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-1.9 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,UNPARSEABLE_RELAY autolearn=ham version=3.3.1 Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 7EB3829086 for ; Fri, 23 Feb 2018 10:18:26 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:References: Message-ID:Subject:To:From:Date:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=apDhUra2bT95bWTdnFWQXnvFoAuRHVPkncTwvGFGjC4=; b=sekkqE/ol4p325 YFXtIWZG2nRKiCnBOoK/EuZPsAkyvnP8MA8+u5qYUgaWMcUnMZSN450pBevfCaDmvY/egTJ8Jx14R bPQq3IAyBukDsxAmfHlZAiKCnnLX+LsFAOufaB/ZKGHre26h7xdbwuaVLt+EuIJmvh9YQ/1wt9wOr sNHryiRp+2+9nv92zWFSR4C7PYwlcFZ1gdSULV9mLOtt2VUYpjrSMNjQa1vGu/y7j4k10m6RGKIwL L7hCLLiiiLEJsjTRDpOGY18wTB8F/S+6eVAfdi/H2R/z7P7R0IcJZJsFcLj5WCXYh3tmRjQxwGKZI MnEWvZPaPxdY0QqZQAPA==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.89 #1 (Red Hat Linux)) id 1epAQf-0001cj-IY; Fri, 23 Feb 2018 10:18:13 +0000 Received: from eddie.linux-mips.org ([148.251.95.138] helo=cvs.linux-mips.org) by bombadil.infradead.org with esmtp (Exim 4.89 #1 (Red Hat Linux)) id 1epAPI-0000Lf-0s for linux-arm-kernel@lists.infradead.org; Fri, 23 Feb 2018 10:18:01 +0000 Received: (from localhost user: 'ladis' uid#1021 fake: STDIN (ladis@eddie.linux-mips.org)) by eddie.linux-mips.org id S23991248AbeBWKQabgMkl (ORCPT ); Fri, 23 Feb 2018 11:16:30 +0100 Date: Fri, 23 Feb 2018 11:16:29 +0100 From: Ladislav Michl To: linux-omap@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-pwm@vger.kernel.org Subject: [PATCH 5/6] clocksource: timer-ti-dm: Add event capture Message-ID: <20180223101629.GF5746@lenoch> References: <20180223101254.GA5746@lenoch> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20180223101254.GA5746@lenoch> User-Agent: Mutt/1.9.3 (2018-01-21) X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20180223_021648_322311_AF8F7BE0 X-CRM114-Status: GOOD ( 12.56 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: t-kristo@ti.com, grygorii.strashko@ti.com, aaro.koskinen@iki.fi, tony@atomide.com, Keerthy , daniel.lezcano@linaro.org, robh+dt@kernel.org, narmstrong@baylibre.com, thierry.reding@gmail.com, Brecht Neyrinck , sebastian.reichel@collabora.co.uk, Thomas Gleixner , Claudiu.Beznea@microchip.com Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org X-Virus-Scanned: ClamAV using ClamSMTP Implement event capture functions. Signed-off-by: Ladislav Michl --- drivers/clocksource/timer-ti-dm.c | 47 ++++++++++++++++++++++++++++-- include/linux/platform_data/dmtimer-omap.h | 8 +++++ 2 files changed, 53 insertions(+), 2 deletions(-) diff --git a/drivers/clocksource/timer-ti-dm.c b/drivers/clocksource/timer-ti-dm.c index b57e875b74ca..c227d62794a0 100644 --- a/drivers/clocksource/timer-ti-dm.c +++ b/drivers/clocksource/timer-ti-dm.c @@ -576,8 +576,8 @@ static int omap_dm_timer_set_load(struct omap_dm_timer *timer, int autoreload, } /* Optimized set_load which removes costly spin wait in timer_start */ -int omap_dm_timer_set_load_start(struct omap_dm_timer *timer, int autoreload, - unsigned int load) +static int omap_dm_timer_set_load_start(struct omap_dm_timer *timer, + int autoreload, unsigned int load) { u32 l; @@ -627,6 +627,30 @@ static int omap_dm_timer_set_match(struct omap_dm_timer *timer, int enable, return 0; } +static int omap_dm_timer_set_capture(struct omap_dm_timer *timer, + int captmode, int edges) +{ + u32 l; + + if (unlikely(!timer)) + return -EINVAL; + + omap_dm_timer_enable(timer); + l = omap_dm_timer_read_reg(timer, OMAP_TIMER_CTRL_REG); + l &= ~(OMAP_TIMER_CTRL_CAPTMODE | OMAP_TIMER_CTRL_SCPWM | + OMAP_TIMER_CTRL_PT | OMAP_TIMER_CTRL_TCM_BOTHEDGES); + l |= OMAP_TIMER_CTRL_GPOCFG; + if (captmode) + l |= OMAP_TIMER_CTRL_CAPTMODE; + l |= edges << 8; + omap_dm_timer_write_reg(timer, OMAP_TIMER_CTRL_REG, l); + + /* Save the context */ + timer->context.tclr = l; + omap_dm_timer_disable(timer); + return 0; +} + static int omap_dm_timer_set_pwm(struct omap_dm_timer *timer, int def_on, int toggle, int trigger) { @@ -785,6 +809,22 @@ int omap_dm_timers_active(void) return 0; } +static int omap_dm_timer_read_capture(struct omap_dm_timer *timer, + unsigned int *reg, + unsigned int *reg2) +{ + if (unlikely(!timer || pm_runtime_suspended(&timer->pdev->dev))) { + pr_err("%s: timer not available or enabled.\n", __func__); + return -EINVAL; + } + + *reg = omap_dm_timer_read_reg(timer, OMAP_TIMER_CAPTURE_REG); + if (reg2) + *reg2 = omap_dm_timer_read_reg(timer, OMAP_TIMER_CAPTURE2_REG); + + return 0; +} + static const struct of_device_id omap_timer_match[]; /** @@ -930,11 +970,14 @@ const static struct omap_dm_timer_ops dmtimer_ops = { .start = omap_dm_timer_start, .stop = omap_dm_timer_stop, .set_load = omap_dm_timer_set_load, + .set_load_start = omap_dm_timer_set_load_start, .set_match = omap_dm_timer_set_match, + .set_capture = omap_dm_timer_set_capture, .set_pwm = omap_dm_timer_set_pwm, .set_prescaler = omap_dm_timer_set_prescaler, .read_counter = omap_dm_timer_read_counter, .write_counter = omap_dm_timer_write_counter, + .read_capture = omap_dm_timer_read_capture, .read_status = omap_dm_timer_read_status, .write_status = omap_dm_timer_write_status, }; diff --git a/include/linux/platform_data/dmtimer-omap.h b/include/linux/platform_data/dmtimer-omap.h index 757a0f9e26f9..7502f130b213 100644 --- a/include/linux/platform_data/dmtimer-omap.h +++ b/include/linux/platform_data/dmtimer-omap.h @@ -43,8 +43,12 @@ struct omap_dm_timer_ops { int (*set_load)(struct omap_dm_timer *timer, int autoreload, unsigned int value); + int (*set_load_start)(struct omap_dm_timer *timer, int autoreload, + unsigned int value); int (*set_match)(struct omap_dm_timer *timer, int enable, unsigned int match); + int (*set_capture)(struct omap_dm_timer *timer, int captmode, + int edges); int (*set_pwm)(struct omap_dm_timer *timer, int def_on, int toggle, int trigger); int (*set_prescaler)(struct omap_dm_timer *timer, int prescaler); @@ -52,6 +56,10 @@ struct omap_dm_timer_ops { unsigned int (*read_counter)(struct omap_dm_timer *timer); int (*write_counter)(struct omap_dm_timer *timer, unsigned int value); + + int (*read_capture)(struct omap_dm_timer *timer, unsigned int *reg, + unsigned int *reg2); + unsigned int (*read_status)(struct omap_dm_timer *timer); int (*write_status)(struct omap_dm_timer *timer, unsigned int value);