* [RFC] Periodic Output, Timestamped Input
@ 2017-11-16 9:29 Felipe Balbi
2017-11-29 13:31 ` Linus Walleij
0 siblings, 1 reply; 8+ messages in thread
From: Felipe Balbi @ 2017-11-16 9:29 UTC (permalink / raw)
To: Linus Walleij; +Cc: linux-gpio
[-- Attachment #1: Type: text/plain, Size: 2237 bytes --]
Hi Linus,
Before I put a lot of code down, I wanted to get a feeling from you as
to how you'd like two new features to be implemented.
In a future platform we may have two new features in our GPIO
controller which allows for periodic assertion of GPIO Output
(controlled by HW, we just program the interval) and Timestamping of
GPIO Input events.
I was thinking that we could use pin config for that. Something along
the lines of:
@@ -700,6 +700,12 @@ static int intel_config_set_debounce(struct intel_pinctrl *pctrl, unsigned pin,
return ret;
}
+static int intel_config_set_output_periodic(struct intel_pinctrl *pctrl,
+ unsigned pin, unsigned period_ms)
+{
+ return 0;
+}
+
static int intel_config_set(struct pinctrl_dev *pctldev, unsigned pin,
unsigned long *configs, unsigned nconfigs)
{
@@ -726,6 +732,13 @@ static int intel_config_set(struct pinctrl_dev *pctldev, unsigned pin,
return ret;
break;
+ case PIN_CONFIG_OUTPUT_PERIODIC:
+ ret = intel_config_set_output_periodic(pctrl, pin,
+ pinconf_to_config_argument(configs[i]));
+ if (ret)
+ return ret;
+ break;
+
default:
return -ENOTSUPP;
}
modified include/linux/pinctrl/pinconf-generic.h
@@ -90,6 +90,9 @@
* @PIN_CONFIG_SLEW_RATE: if the pin can select slew rate, the argument to
* this parameter (on a custom format) tells the driver which alternative
* slew rate to use.
+ * @PIN_CONFIG_OUTPUT_PERIODIC: this will configure the pin as an
+ * output periodic toggle. The argument is period in
+ * microseconds.
* @PIN_CONFIG_END: this is the last enumerator for pin configurations, if
* you need to pass in custom configurations to the pin controller, use
* PIN_CONFIG_END+1 as the base offset.
@@ -117,6 +120,7 @@ enum pin_config_param {
PIN_CONFIG_POWER_SOURCE,
PIN_CONFIG_SLEEP_HARDWARE_STATE,
PIN_CONFIG_SLEW_RATE,
+ PIN_CONFIG_OUTPUT_PERIODIC,
PIN_CONFIG_END = 0x7F,
PIN_CONFIG_MAX = 0xFF,
};
As for timestamp of input, we would likely request the input as an IRQ
and use the IRQ to read whatever register, wherever it may be.
Do you have any comments about this? Should I go ahead with current
assumptions?
cheers
--
balbi
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 832 bytes --]
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [RFC] Periodic Output, Timestamped Input
2017-11-16 9:29 [RFC] Periodic Output, Timestamped Input Felipe Balbi
@ 2017-11-29 13:31 ` Linus Walleij
2017-11-29 13:56 ` Felipe Balbi
0 siblings, 1 reply; 8+ messages in thread
From: Linus Walleij @ 2017-11-29 13:31 UTC (permalink / raw)
To: Felipe Balbi, linux-iio, Jonathan Cameron,
thierry.reding@gmail.com, linux-pwm, Lars-Peter Clausen
Cc: linux-gpio
Hi Felipe,
this is nice and interesting technology!
I am quoting the whole mail over to linux-pwm and Thierry
as well as linux-iio and Jon Cameron for consideration. My comments
at the end.
On Thu, Nov 16, 2017 at 10:29 AM, Felipe Balbi
<felipe.balbi@linux.intel.com> wrote:
>
> Hi Linus,
>
> Before I put a lot of code down, I wanted to get a feeling from you as
> to how you'd like two new features to be implemented.
>
> In a future platform we may have two new features in our GPIO
> controller which allows for periodic assertion of GPIO Output
> (controlled by HW, we just program the interval) and Timestamping of
> GPIO Input events.
>
> I was thinking that we could use pin config for that. Something along
> the lines of:
>
> @@ -700,6 +700,12 @@ static int intel_config_set_debounce(struct intel_pinctrl *pctrl, unsigned pin,
> return ret;
> }
>
> +static int intel_config_set_output_periodic(struct intel_pinctrl *pctrl,
> + unsigned pin, unsigned period_ms)
> +{
> + return 0;
> +}
> +
> static int intel_config_set(struct pinctrl_dev *pctldev, unsigned pin,
> unsigned long *configs, unsigned nconfigs)
> {
> @@ -726,6 +732,13 @@ static int intel_config_set(struct pinctrl_dev *pctldev, unsigned pin,
> return ret;
> break;
>
> + case PIN_CONFIG_OUTPUT_PERIODIC:
> + ret = intel_config_set_output_periodic(pctrl, pin,
> + pinconf_to_config_argument(configs[i]));
> + if (ret)
> + return ret;
> + break;
> +
> default:
> return -ENOTSUPP;
> }
> modified include/linux/pinctrl/pinconf-generic.h
> @@ -90,6 +90,9 @@
> * @PIN_CONFIG_SLEW_RATE: if the pin can select slew rate, the argument to
> * this parameter (on a custom format) tells the driver which alternative
> * slew rate to use.
> + * @PIN_CONFIG_OUTPUT_PERIODIC: this will configure the pin as an
> + * output periodic toggle. The argument is period in
> + * microseconds.
> * @PIN_CONFIG_END: this is the last enumerator for pin configurations, if
> * you need to pass in custom configurations to the pin controller, use
> * PIN_CONFIG_END+1 as the base offset.
> @@ -117,6 +120,7 @@ enum pin_config_param {
> PIN_CONFIG_POWER_SOURCE,
> PIN_CONFIG_SLEEP_HARDWARE_STATE,
> PIN_CONFIG_SLEW_RATE,
> + PIN_CONFIG_OUTPUT_PERIODIC,
> PIN_CONFIG_END = 0x7F,
> PIN_CONFIG_MAX = 0xFF,
> };
>
> As for timestamp of input, we would likely request the input as an IRQ
> and use the IRQ to read whatever register, wherever it may be.
>
> Do you have any comments about this? Should I go ahead with current
> assumptions?
So the first thing: periodic assetion of a GPIO, sounds awfully lot
like PWM does it not? I guess the output is a square wave?
While it is possible to model things like this as pin config, have you
considered just adding a PWM interface and present it to the kernel
as a PWM (possibly with a separate resource, in DT we use &phandle
but in ACPI I guess you Intel people have something else for PWM)?
If need be we can ask the ACPI people.
For the other thing: timestamping of GPIO events, we already
support timestamps for userspace GPIOs, but all it does is use
the kernel time, see gpiolib.c:
static irqreturn_t lineevent_irq_thread(int irq, void *p)
{
struct lineevent_state *le = p;
struct gpioevent_data ge;
int ret, level;
ge.timestamp = ktime_get_real_ns();
level = gpiod_get_value_cansleep(le->desc);
if (le->eflags & GPIOEVENT_REQUEST_RISING_EDGE
&& le->eflags & GPIOEVENT_REQUEST_FALLING_EDGE) {
if (level)
/* Emit low-to-high event */
ge.id = GPIOEVENT_EVENT_RISING_EDGE;
else
/* Emit high-to-low event */
ge.id = GPIOEVENT_EVENT_FALLING_EDGE;
} else if (le->eflags & GPIOEVENT_REQUEST_RISING_EDGE && level) {
/* Emit low-to-high event */
ge.id = GPIOEVENT_EVENT_RISING_EDGE;
} else if (le->eflags & GPIOEVENT_REQUEST_FALLING_EDGE && !level) {
/* Emit high-to-low event */
ge.id = GPIOEVENT_EVENT_FALLING_EDGE;
} else {
return IRQ_NONE;
}
ret = kfifo_put(&le->events, ge);
if (ret != 0)
wake_up_poll(&le->wait, POLLIN);
return IRQ_HANDLED;
}
IIO already has a variety of timestamps to use, see
drivers/iio/industrialio-event.c.
What is on my TODO is to unify GPIO event timestamping with that
of IIO.
If there is further a *hardware* timestamp, that would be yet another
alternative timestamp, so we should first extend to use the different
timestamps supported by IIO and then add "hardware-native"
timestamping to the mix IMO. Unless there are other ideas.
Lars-Peter Clausen may have a better idea of what to do here, he
has run a few complex use cases like GNUradio (IIRC) using
timestamping. Also I think sensorfusion-type scenarios use these
timestamps quite a lot.
Yours,
Linus Walleij
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [RFC] Periodic Output, Timestamped Input
2017-11-29 13:31 ` Linus Walleij
@ 2017-11-29 13:56 ` Felipe Balbi
2017-11-29 22:54 ` Linus Walleij
0 siblings, 1 reply; 8+ messages in thread
From: Felipe Balbi @ 2017-11-29 13:56 UTC (permalink / raw)
To: Linus Walleij, linux-iio, Jonathan Cameron,
thierry.reding@gmail.com, linux-pwm, Lars-Peter Clausen
Cc: linux-gpio
[-- Attachment #1: Type: text/plain, Size: 6680 bytes --]
Hi,
Linus Walleij <linus.walleij@linaro.org> writes:
> Hi Felipe,
>
> this is nice and interesting technology!
>
> I am quoting the whole mail over to linux-pwm and Thierry
> as well as linux-iio and Jon Cameron for consideration. My comments
> at the end.
>
> On Thu, Nov 16, 2017 at 10:29 AM, Felipe Balbi
> <felipe.balbi@linux.intel.com> wrote:
>>
>> Hi Linus,
>>
>> Before I put a lot of code down, I wanted to get a feeling from you as
>> to how you'd like two new features to be implemented.
>>
>> In a future platform we may have two new features in our GPIO
>> controller which allows for periodic assertion of GPIO Output
>> (controlled by HW, we just program the interval) and Timestamping of
>> GPIO Input events.
>>
>> I was thinking that we could use pin config for that. Something along
>> the lines of:
>>
>> @@ -700,6 +700,12 @@ static int intel_config_set_debounce(struct intel_pinctrl *pctrl, unsigned pin,
>> return ret;
>> }
>>
>> +static int intel_config_set_output_periodic(struct intel_pinctrl *pctrl,
>> + unsigned pin, unsigned period_ms)
>> +{
>> + return 0;
>> +}
>> +
>> static int intel_config_set(struct pinctrl_dev *pctldev, unsigned pin,
>> unsigned long *configs, unsigned nconfigs)
>> {
>> @@ -726,6 +732,13 @@ static int intel_config_set(struct pinctrl_dev *pctldev, unsigned pin,
>> return ret;
>> break;
>>
>> + case PIN_CONFIG_OUTPUT_PERIODIC:
>> + ret = intel_config_set_output_periodic(pctrl, pin,
>> + pinconf_to_config_argument(configs[i]));
>> + if (ret)
>> + return ret;
>> + break;
>> +
>> default:
>> return -ENOTSUPP;
>> }
>> modified include/linux/pinctrl/pinconf-generic.h
>> @@ -90,6 +90,9 @@
>> * @PIN_CONFIG_SLEW_RATE: if the pin can select slew rate, the argument to
>> * this parameter (on a custom format) tells the driver which alternative
>> * slew rate to use.
>> + * @PIN_CONFIG_OUTPUT_PERIODIC: this will configure the pin as an
>> + * output periodic toggle. The argument is period in
>> + * microseconds.
>> * @PIN_CONFIG_END: this is the last enumerator for pin configurations, if
>> * you need to pass in custom configurations to the pin controller, use
>> * PIN_CONFIG_END+1 as the base offset.
>> @@ -117,6 +120,7 @@ enum pin_config_param {
>> PIN_CONFIG_POWER_SOURCE,
>> PIN_CONFIG_SLEEP_HARDWARE_STATE,
>> PIN_CONFIG_SLEW_RATE,
>> + PIN_CONFIG_OUTPUT_PERIODIC,
>> PIN_CONFIG_END = 0x7F,
>> PIN_CONFIG_MAX = 0xFF,
>> };
>>
>> As for timestamp of input, we would likely request the input as an IRQ
>> and use the IRQ to read whatever register, wherever it may be.
>>
>> Do you have any comments about this? Should I go ahead with current
>> assumptions?
>
> So the first thing: periodic assetion of a GPIO, sounds awfully lot
> like PWM does it not? I guess the output is a square wave?
Well, possibly. But that's not the idea of the feature. The idea is to
synchronize time. Say you program GPIO to fire at every 1 ms, a remote
processor/accelerator/etc can synchronize its own time to this 1 ms
tick.
That's at least my understanding.
> While it is possible to model things like this as pin config, have you
> considered just adding a PWM interface and present it to the kernel
> as a PWM (possibly with a separate resource, in DT we use &phandle
> but in ACPI I guess you Intel people have something else for PWM)?
> If need be we can ask the ACPI people.
Sure, however the same feature is also used for timestampped input :-)
Say another processor is the one asserting a GPIO every 1 ms. I can
sample it as quickly as possible, but we're bound to face SW
overhead. When the timestamp is latched, then the overhead can be
accounted for.
> For the other thing: timestamping of GPIO events, we already
> support timestamps for userspace GPIOs, but all it does is use
> the kernel time, see gpiolib.c:
>
> static irqreturn_t lineevent_irq_thread(int irq, void *p)
> {
> struct lineevent_state *le = p;
> struct gpioevent_data ge;
> int ret, level;
>
> ge.timestamp = ktime_get_real_ns();
> level = gpiod_get_value_cansleep(le->desc);
this is running as a thread with interrupts enabled, AFAICT. This means
this thread can be preempted at least on PREEMPT_RT kernels, so your
timestamp can be wrong, right?
> if (le->eflags & GPIOEVENT_REQUEST_RISING_EDGE
> && le->eflags & GPIOEVENT_REQUEST_FALLING_EDGE) {
> if (level)
> /* Emit low-to-high event */
> ge.id = GPIOEVENT_EVENT_RISING_EDGE;
> else
> /* Emit high-to-low event */
> ge.id = GPIOEVENT_EVENT_FALLING_EDGE;
> } else if (le->eflags & GPIOEVENT_REQUEST_RISING_EDGE && level) {
> /* Emit low-to-high event */
> ge.id = GPIOEVENT_EVENT_RISING_EDGE;
> } else if (le->eflags & GPIOEVENT_REQUEST_FALLING_EDGE && !level) {
> /* Emit high-to-low event */
> ge.id = GPIOEVENT_EVENT_FALLING_EDGE;
> } else {
> return IRQ_NONE;
> }
>
> ret = kfifo_put(&le->events, ge);
> if (ret != 0)
> wake_up_poll(&le->wait, POLLIN);
>
> return IRQ_HANDLED;
> }
>
> IIO already has a variety of timestamps to use, see
> drivers/iio/industrialio-event.c.
>
> What is on my TODO is to unify GPIO event timestamping with that
> of IIO.
>
> If there is further a *hardware* timestamp, that would be yet another
yes, it's done by a high resolution timer
> alternative timestamp, so we should first extend to use the different
> timestamps supported by IIO and then add "hardware-native"
> timestamping to the mix IMO. Unless there are other ideas.
>
> Lars-Peter Clausen may have a better idea of what to do here, he
> has run a few complex use cases like GNUradio (IIRC) using
> timestamping. Also I think sensorfusion-type scenarios use these
> timestamps quite a lot.
I see... I wonder if the SW timestamping is suffcient here. Has anybody
done any sort of jitter analysis with heavy loaded CPU for this feature?
cheers
--
balbi
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 832 bytes --]
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [RFC] Periodic Output, Timestamped Input
2017-11-29 13:56 ` Felipe Balbi
@ 2017-11-29 22:54 ` Linus Walleij
2017-12-02 13:34 ` Jonathan Cameron
2017-12-05 9:20 ` Felipe Balbi
0 siblings, 2 replies; 8+ messages in thread
From: Linus Walleij @ 2017-11-29 22:54 UTC (permalink / raw)
To: Felipe Balbi, Bartosz Gołaszewski
Cc: linux-iio, Jonathan Cameron, thierry.reding@gmail.com, linux-pwm,
Lars-Peter Clausen, linux-gpio
On Wed, Nov 29, 2017 at 2:56 PM, Felipe Balbi
<felipe.balbi@linux.intel.com> wrote:
> Me:
>> For the other thing: timestamping of GPIO events, we already
>> support timestamps for userspace GPIOs, but all it does is use
>> the kernel time, see gpiolib.c:
>>
>> static irqreturn_t lineevent_irq_thread(int irq, void *p)
>> {
>> struct lineevent_state *le = p;
>> struct gpioevent_data ge;
>> int ret, level;
>>
>> ge.timestamp = ktime_get_real_ns();
>> level = gpiod_get_value_cansleep(le->desc);
>
> this is running as a thread with interrupts enabled, AFAICT. This means
> this thread can be preempted at least on PREEMPT_RT kernels, so your
> timestamp can be wrong, right?
Yes, it can be off. What we should do to get i better is
something like what I did in:
drivers/iio/gyro/mpu3050-core.c
Here I have both a hard and a soft IRQ handler (fast/slow if
you like) and take the timestamp in the hard IRQ, then use
it in the thread.
This should be done identically in gpiolib to increase precision
in the general case.
I was thinking about it already when implementing it but it fell
out of my mind. I'm putting in on my TODO. (CC to bartosz
who might be interested, he's using these ABIs quite a bit.)
Yours,
Linus Walleij
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [RFC] Periodic Output, Timestamped Input
2017-11-29 22:54 ` Linus Walleij
@ 2017-12-02 13:34 ` Jonathan Cameron
2017-12-05 9:20 ` Felipe Balbi
1 sibling, 0 replies; 8+ messages in thread
From: Jonathan Cameron @ 2017-12-02 13:34 UTC (permalink / raw)
To: Linus Walleij
Cc: Felipe Balbi, Bartosz Gołaszewski, linux-iio,
thierry.reding@gmail.com, linux-pwm, Lars-Peter Clausen,
linux-gpio, Gregor Boirie
On Wed, 29 Nov 2017 23:54:32 +0100
Linus Walleij <linus.walleij@linaro.org> wrote:
> On Wed, Nov 29, 2017 at 2:56 PM, Felipe Balbi
> <felipe.balbi@linux.intel.com> wrote:
> > Me:
> >> For the other thing: timestamping of GPIO events, we already
> >> support timestamps for userspace GPIOs, but all it does is use
> >> the kernel time, see gpiolib.c:
> >>
> >> static irqreturn_t lineevent_irq_thread(int irq, void *p)
> >> {
> >> struct lineevent_state *le = p;
> >> struct gpioevent_data ge;
> >> int ret, level;
> >>
> >> ge.timestamp = ktime_get_real_ns();
> >> level = gpiod_get_value_cansleep(le->desc);
> >
> > this is running as a thread with interrupts enabled, AFAICT. This means
> > this thread can be preempted at least on PREEMPT_RT kernels, so your
> > timestamp can be wrong, right?
>
> Yes, it can be off. What we should do to get i better is
> something like what I did in:
> drivers/iio/gyro/mpu3050-core.c
>
> Here I have both a hard and a soft IRQ handler (fast/slow if
> you like) and take the timestamp in the hard IRQ, then use
> it in the thread.
I did timing tests for both a long time back but I doubt things have
changed much. To do fusion you ideally smooth the result on the basis
you are fairly sure the internal clock is better than even then jitter
we get in an interrupt.
No idea where the absolute numbers went though I'm afraid.
Perhaps Gregor can provide more info?
Not sure who else is doing sensor fusion currently...
>
> This should be done identically in gpiolib to increase precision
> in the general case.
>
> I was thinking about it already when implementing it but it fell
> out of my mind. I'm putting in on my TODO. (CC to bartosz
> who might be interested, he's using these ABIs quite a bit.)
>
> Yours,
> Linus Walleij
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [RFC] Periodic Output, Timestamped Input
2017-11-29 22:54 ` Linus Walleij
2017-12-02 13:34 ` Jonathan Cameron
@ 2017-12-05 9:20 ` Felipe Balbi
2017-12-05 11:01 ` Linus Walleij
1 sibling, 1 reply; 8+ messages in thread
From: Felipe Balbi @ 2017-12-05 9:20 UTC (permalink / raw)
To: Linus Walleij, Bartosz Gołaszewski
Cc: linux-iio, Jonathan Cameron, thierry.reding@gmail.com, linux-pwm,
Lars-Peter Clausen, linux-gpio
[-- Attachment #1: Type: text/plain, Size: 3704 bytes --]
Hi,
Linus Walleij <linus.walleij@linaro.org> writes:
> On Wed, Nov 29, 2017 at 2:56 PM, Felipe Balbi
> <felipe.balbi@linux.intel.com> wrote:
>> Me:
>>> For the other thing: timestamping of GPIO events, we already
>>> support timestamps for userspace GPIOs, but all it does is use
>>> the kernel time, see gpiolib.c:
>>>
>>> static irqreturn_t lineevent_irq_thread(int irq, void *p)
>>> {
>>> struct lineevent_state *le = p;
>>> struct gpioevent_data ge;
>>> int ret, level;
>>>
>>> ge.timestamp = ktime_get_real_ns();
>>> level = gpiod_get_value_cansleep(le->desc);
>>
>> this is running as a thread with interrupts enabled, AFAICT. This means
>> this thread can be preempted at least on PREEMPT_RT kernels, so your
>> timestamp can be wrong, right?
>
> Yes, it can be off. What we should do to get i better is
> something like what I did in:
> drivers/iio/gyro/mpu3050-core.c
>
> Here I have both a hard and a soft IRQ handler (fast/slow if
> you like) and take the timestamp in the hard IRQ, then use
> it in the thread.
>
> This should be done identically in gpiolib to increase precision
> in the general case.
>
> I was thinking about it already when implementing it but it fell
> out of my mind. I'm putting in on my TODO. (CC to bartosz
> who might be interested, he's using these ABIs quite a bit.)
fair enough. In that case, it'll probably be easier to implement
HW-based timestamping with something like below:
modified drivers/gpio/gpiolib.c
@@ -731,7 +731,11 @@ static irqreturn_t lineevent_irq_thread(int irq, void *p)
struct gpioevent_data ge;
int ret, level;
- ge.timestamp = ktime_get_real_ns();
+ if (le->desc->flags & FLAG_HAS_HW_TIMESTAMP)
+ ge.timestamp = gpio_get_hw_timestamp(le->desc);
+ else
+ ge.timestamp = ktime_get_real_ns();
+
level = gpiod_get_value_cansleep(le->desc);
if (le->eflags & GPIOEVENT_REQUEST_RISING_EDGE
modified drivers/gpio/gpiolib.h
@@ -206,6 +206,7 @@ struct gpio_desc {
#define FLAG_USED_AS_IRQ 9 /* GPIO is connected to an IRQ */
#define FLAG_IS_HOGGED 11 /* GPIO is hogged */
#define FLAG_SLEEP_MAY_LOSE_VALUE 12 /* GPIO may lose value in sleep */
+#define FLAG_HAS_HW_TIMESTAMP 13 /* GPIO has HW-based timestamping */
/* Connection label */
const char *label;
We may even extract ktime_get_real_ns() to gpio_get_timestamp() and do
the branching in that function, like:
modified drivers/gpio/gpiolib.c
@@ -731,7 +731,7 @@ static irqreturn_t lineevent_irq_thread(int irq, void *p)
struct gpioevent_data ge;
int ret, level;
- ge.timestamp = ktime_get_real_ns();
+ ge.timestamp = gpiod_get_timestamp(le->desc);
level = gpiod_get_value_cansleep(le->desc);
if (le->eflags & GPIOEVENT_REQUEST_RISING_EDGE
@@ -3155,6 +3155,14 @@ int gpiod_get_value_cansleep(const struct gpio_desc *desc)
}
EXPORT_SYMBOL_GPL(gpiod_get_value_cansleep);
+u64 gpiod_get_timestamp(const struct gpio_desc *desc)
+{
+ if (desc->flags & FLAG_HAS_HW_TIMESTAMP)
+ return gpiod_get_raw_timestamp(desc);
+ else
+ return ktime_get_real_ns();
+}
+
/**
* gpiod_get_raw_array_value_cansleep() - read raw values from an array of GPIOs
* @array_size: number of elements in the descriptor / value arrays
modified drivers/gpio/gpiolib.h
@@ -206,6 +206,7 @@ struct gpio_desc {
#define FLAG_USED_AS_IRQ 9 /* GPIO is connected to an IRQ */
#define FLAG_IS_HOGGED 11 /* GPIO is hogged */
#define FLAG_SLEEP_MAY_LOSE_VALUE 12 /* GPIO may lose value in sleep */
+#define FLAG_HAS_HW_TIMESTAMP 13 /* GPIO has HW-based timestamping */
/* Connection label */
const char *label;
--
balbi
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 832 bytes --]
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [RFC] Periodic Output, Timestamped Input
2017-12-05 9:20 ` Felipe Balbi
@ 2017-12-05 11:01 ` Linus Walleij
2017-12-05 11:23 ` Felipe Balbi
0 siblings, 1 reply; 8+ messages in thread
From: Linus Walleij @ 2017-12-05 11:01 UTC (permalink / raw)
To: Felipe Balbi, Gregor Boirie
Cc: Bartosz Gołaszewski, linux-iio, Jonathan Cameron,
thierry.reding@gmail.com, linux-pwm, Lars-Peter Clausen,
linux-gpio
On Tue, Dec 5, 2017 at 10:20 AM, Felipe Balbi
<felipe.balbi@linux.intel.com> wrote:
> [Me]:
>> I was thinking about it already when implementing it but it fell
>> out of my mind. I'm putting in on my TODO. (CC to bartosz
>> who might be interested, he's using these ABIs quite a bit.)
>
> fair enough. In that case, it'll probably be easier to implement
> HW-based timestamping with something like below:
Indeed.
IIO has a per-device sysfs file for setting up
the POSIX timestamping named current_timestamp_clock.
This was added by Gregor Boire in commit
bc2b7dab629a
The supported timestamps are:
realtime
monotonic
monotonic_raw
realtime_coarse
monotonic_coarse
boottime
tai
I could really need some help here... :/
It feels like "monotonic" could very well be what you're
looking for but I don't know the POSIX definition of these.
Maybe we need to add one more for "device specific"?
What I want to do is factor most of that commit out into
lib/ and reuse for timestamping in GPIO so we can
have coherent timestamps across GPIO and IIO.
OK OK O need to get to it and stop talking...
I guess it should be set per-gpiochip rather than
per-gpio-desc though, but that makes most sense anyways.
Yours,
Linus Walleij
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [RFC] Periodic Output, Timestamped Input
2017-12-05 11:01 ` Linus Walleij
@ 2017-12-05 11:23 ` Felipe Balbi
0 siblings, 0 replies; 8+ messages in thread
From: Felipe Balbi @ 2017-12-05 11:23 UTC (permalink / raw)
To: Linus Walleij, Gregor Boirie
Cc: Bartosz Gołaszewski, linux-iio, Jonathan Cameron,
thierry.reding@gmail.com, linux-pwm, Lars-Peter Clausen,
linux-gpio
[-- Attachment #1: Type: text/plain, Size: 1544 bytes --]
Hi,
Linus Walleij <linus.walleij@linaro.org> writes:
> On Tue, Dec 5, 2017 at 10:20 AM, Felipe Balbi
> <felipe.balbi@linux.intel.com> wrote:
>> [Me]:
>
>>> I was thinking about it already when implementing it but it fell
>>> out of my mind. I'm putting in on my TODO. (CC to bartosz
>>> who might be interested, he's using these ABIs quite a bit.)
>>
>> fair enough. In that case, it'll probably be easier to implement
>> HW-based timestamping with something like below:
>
> Indeed.
>
> IIO has a per-device sysfs file for setting up
> the POSIX timestamping named current_timestamp_clock.
> This was added by Gregor Boire in commit
> bc2b7dab629a
>
> The supported timestamps are:
> realtime
> monotonic
> monotonic_raw
> realtime_coarse
> monotonic_coarse
> boottime
> tai
>
> I could really need some help here... :/
>
> It feels like "monotonic" could very well be what you're
> looking for but I don't know the POSIX definition of these.
> Maybe we need to add one more for "device specific"?
>
> What I want to do is factor most of that commit out into
> lib/ and reuse for timestamping in GPIO so we can
> have coherent timestamps across GPIO and IIO.
>
> OK OK O need to get to it and stop talking...
>
> I guess it should be set per-gpiochip rather than
> per-gpio-desc though, but that makes most sense anyways.
Well, it may be that not every pin on a gpiochip supports HW-backed
timestamping. Just speculating here, that's why I made it per-gpio_desc
on the example.
--
balbi
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 832 bytes --]
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2017-12-05 11:23 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-11-16 9:29 [RFC] Periodic Output, Timestamped Input Felipe Balbi
2017-11-29 13:31 ` Linus Walleij
2017-11-29 13:56 ` Felipe Balbi
2017-11-29 22:54 ` Linus Walleij
2017-12-02 13:34 ` Jonathan Cameron
2017-12-05 9:20 ` Felipe Balbi
2017-12-05 11:01 ` Linus Walleij
2017-12-05 11:23 ` Felipe Balbi
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).