From: ladis@linux-mips.org (Ladislav Michl)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 4/5] clocksource: timer-dm: Add event capture
Date: Mon, 8 Jan 2018 16:42:17 +0100 [thread overview]
Message-ID: <20180108154217.GD4077@lenoch> (raw)
In-Reply-To: <20180108153926.GA3916@lenoch>
Implement event capture functions.
Signed-off-by: Ladislav Michl <ladis@linux-mips.org>
diff --git a/drivers/clocksource/timer-dm.c b/drivers/clocksource/timer-dm.c
index bde1014308f9..dbf2b1f6a941 100644
--- a/drivers/clocksource/timer-dm.c
+++ b/drivers/clocksource/timer-dm.c
@@ -633,6 +633,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)
{
@@ -791,6 +815,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[];
/**
@@ -939,11 +979,14 @@ 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 a3e17945a0e9..ad247d45bc08 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.15.1
next prev parent reply other threads:[~2018-01-08 15:42 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-01-08 15:39 [PATCH 0/5] Add capture functionality to OMAP pwm driver Ladislav Michl
2018-01-08 15:40 ` [PATCH 1/5] clocksource: timer-dm: Make unexported functions static Ladislav Michl
2018-01-08 15:41 ` [PATCH 2/5] clocksource: timer-dm: Check prescaler value Ladislav Michl
2018-01-08 15:41 ` [PATCH 3/5] pwm: pwm-omap-dmtimer: Fix frequency when using prescaler Ladislav Michl
2018-01-08 15:42 ` Ladislav Michl [this message]
2018-01-08 21:51 ` [PATCH 0/5] Add capture functionality to OMAP pwm driver Tony Lindgren
2018-01-08 21:57 ` Ladislav Michl
[not found] ` <20180108154336.GE4077@lenoch>
2018-01-08 21:59 ` [RFC 5/5] pwm: pwm-omap-dmtimer: Add capture functionality Tony Lindgren
2018-01-08 22:06 ` Ladislav Michl
2018-01-08 22:13 ` Tony Lindgren
2018-01-08 22:26 ` 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=20180108154217.GD4077@lenoch \
--to=ladis@linux-mips.org \
--cc=linux-arm-kernel@lists.infradead.org \
/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: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).