From: Ladislav Michl <ladis@linux-mips.org> To: linux-omap@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-pwm@vger.kernel.org Cc: t-kristo@ti.com, grygorii.strashko@ti.com, aaro.koskinen@iki.fi, tony@atomide.com, Keerthy <j-keerthy@ti.com>, daniel.lezcano@linaro.org, robh+dt@kernel.org, narmstrong@baylibre.com, thierry.reding@gmail.com, Brecht Neyrinck <brechtneyrinck@gmail.com>, sebastian.reichel@collabora.co.uk, Thomas Gleixner <tglx@linutronix.de>, Claudiu.Beznea@microchip.com Subject: [PATCH 5/6] clocksource: timer-ti-dm: Add event capture Date: Fri, 23 Feb 2018 11:16:29 +0100 [thread overview] Message-ID: <20180223101629.GF5746@lenoch> (raw) In-Reply-To: <20180223101254.GA5746@lenoch> Implement event capture functions. Signed-off-by: Ladislav Michl <ladis@linux-mips.org> --- 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); -- 2.16.1
WARNING: multiple messages have this Message-ID (diff)
From: ladis@linux-mips.org (Ladislav Michl) To: linux-arm-kernel@lists.infradead.org Subject: [PATCH 5/6] clocksource: timer-ti-dm: Add event capture Date: Fri, 23 Feb 2018 11:16:29 +0100 [thread overview] Message-ID: <20180223101629.GF5746@lenoch> (raw) In-Reply-To: <20180223101254.GA5746@lenoch> Implement event capture functions. Signed-off-by: Ladislav Michl <ladis@linux-mips.org> --- 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); -- 2.16.1
next prev parent reply other threads:[~2018-02-23 10:16 UTC|newest] Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top 2018-02-23 10:12 [PATCH 0/6] Implement event capture for OMAP (draft) Ladislav Michl 2018-02-23 10:12 ` Ladislav Michl 2018-02-23 10:13 ` [PATCH 1/6] clocksource: timer-ti-dm: Make unexported functions static Ladislav Michl 2018-02-23 10:13 ` Ladislav Michl 2018-02-27 18:06 ` Tony Lindgren 2018-02-27 18:06 ` Tony Lindgren 2018-02-27 19:07 ` Ladislav Michl 2018-02-27 19:07 ` Ladislav Michl 2018-02-27 19:23 ` Tony Lindgren 2018-02-27 19:23 ` Tony Lindgren 2018-02-28 22:11 ` Tony Lindgren 2018-02-28 22:11 ` Tony Lindgren 2018-02-23 10:14 ` [PATCH 2/6] clocksource: timer-ti-dm: Consolidate set source Ladislav Michl 2018-02-23 10:14 ` Ladislav Michl 2018-02-23 10:15 ` [PATCH 3/6] clocksource: timer-ti-dm: Check prescaler value Ladislav Michl 2018-02-23 10:15 ` Ladislav Michl 2018-02-23 10:15 ` [PATCH 4/6] pwm: pwm-omap-dmtimer: Fix frequency when using prescaler Ladislav Michl 2018-02-23 10:15 ` Ladislav Michl 2018-03-27 21:53 ` Thierry Reding 2018-03-27 21:53 ` Thierry Reding 2018-03-27 22:14 ` Thierry Reding 2018-03-27 22:14 ` Thierry Reding 2018-03-27 22:23 ` Tony Lindgren 2018-03-27 22:23 ` Tony Lindgren 2018-03-28 0:34 ` Ladislav Michl 2018-03-28 0:34 ` Ladislav Michl 2018-02-23 10:16 ` Ladislav Michl [this message] 2018-02-23 10:16 ` [PATCH 5/6] clocksource: timer-ti-dm: Add event capture Ladislav Michl 2018-02-23 10:17 ` [PATCH 6/6] pwm: pwm-omap-dmtimer: Add capture functionality Ladislav Michl 2018-02-23 10:17 ` Ladislav Michl
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20180223101629.GF5746@lenoch \ --to=ladis@linux-mips.org \ --cc=Claudiu.Beznea@microchip.com \ --cc=aaro.koskinen@iki.fi \ --cc=brechtneyrinck@gmail.com \ --cc=daniel.lezcano@linaro.org \ --cc=grygorii.strashko@ti.com \ --cc=j-keerthy@ti.com \ --cc=linux-arm-kernel@lists.infradead.org \ --cc=linux-omap@vger.kernel.org \ --cc=linux-pwm@vger.kernel.org \ --cc=narmstrong@baylibre.com \ --cc=robh+dt@kernel.org \ --cc=sebastian.reichel@collabora.co.uk \ --cc=t-kristo@ti.com \ --cc=tglx@linutronix.de \ --cc=thierry.reding@gmail.com \ --cc=tony@atomide.com \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.