linux-media.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [GIT PULL FOR v4.14] ktime_t accessor functions
@ 2017-08-26  8:42 Sean Young
  2017-08-31  7:15 ` Jasmin J.
  0 siblings, 1 reply; 2+ messages in thread
From: Sean Young @ 2017-08-26  8:42 UTC (permalink / raw)
  To: linux-media

Hi Mauro,

Without the ktime_t accessor functions, the pre-v4.10 media_build broken.
Also there is a fix for the serial_ir on 32-bit builds.

Please merge where you see fit. 

Thanks

Sean

The following changes since commit 0779b8855c746c90b85bfe6e16d5dfa2a6a46655:

  media: ddbridge: fix semicolon.cocci warnings (2017-08-20 10:25:22 -0400)

are available in the git repository at:

  git://linuxtv.org/syoung/media_tree.git for-v4.14c

for you to fetch changes up to e4ea3e4bd643d133a5a3e7b708a7c7cf0f93586e:

  media: serial_ir: fix tx timing calculation on 32-bit (2017-08-26 09:26:29 +0100)

----------------------------------------------------------------
Jasmin Jessich (1):
      media: rc: use ktime accessor functions

Sean Young (2):
      media: rc: gpio-ir-tx: use ktime accessor functions
      media: serial_ir: fix tx timing calculation on 32-bit

 drivers/media/rc/gpio-ir-tx.c | 12 +++++++-----
 drivers/media/rc/rc-ir-raw.c  | 11 ++++++-----
 drivers/media/rc/serial_ir.c  | 34 ++++++++++++++--------------------
 3 files changed, 27 insertions(+), 30 deletions(-)

diff --git a/drivers/media/rc/gpio-ir-tx.c b/drivers/media/rc/gpio-ir-tx.c
index 0b83408a2e18..cd476cab9782 100644
--- a/drivers/media/rc/gpio-ir-tx.c
+++ b/drivers/media/rc/gpio-ir-tx.c
@@ -98,15 +98,17 @@ static int gpio_ir_tx(struct rc_dev *dev, unsigned int *txbuf,
 			// pulse
 			ktime_t last = ktime_add_us(edge, txbuf[i]);
 
-			while (ktime_get() < last) {
+			while (ktime_before(ktime_get(), last)) {
 				gpiod_set_value(gpio_ir->gpio, 1);
-				edge += pulse;
-				delta = edge - ktime_get();
+				edge = ktime_add_ns(edge, pulse);
+				delta = ktime_to_ns(ktime_sub(edge,
+							      ktime_get()));
 				if (delta > 0)
 					ndelay(delta);
 				gpiod_set_value(gpio_ir->gpio, 0);
-				edge += space;
-				delta = edge - ktime_get();
+				edge = ktime_add_ns(edge, space);
+				delta = ktime_to_ns(ktime_sub(edge,
+							      ktime_get()));
 				if (delta > 0)
 					ndelay(delta);
 			}
diff --git a/drivers/media/rc/rc-ir-raw.c b/drivers/media/rc/rc-ir-raw.c
index f495709e28fb..503bc425a187 100644
--- a/drivers/media/rc/rc-ir-raw.c
+++ b/drivers/media/rc/rc-ir-raw.c
@@ -106,7 +106,7 @@ int ir_raw_event_store_edge(struct rc_dev *dev, bool pulse)
 		return -EINVAL;
 
 	now = ktime_get();
-	ev.duration = ktime_sub(now, dev->raw->last_event);
+	ev.duration = ktime_to_ns(ktime_sub(now, dev->raw->last_event));
 	ev.pulse = !pulse;
 
 	rc = ir_raw_event_store(dev, &ev);
@@ -474,18 +474,19 @@ EXPORT_SYMBOL(ir_raw_encode_scancode);
 static void edge_handle(unsigned long arg)
 {
 	struct rc_dev *dev = (struct rc_dev *)arg;
-	ktime_t interval = ktime_get() - dev->raw->last_event;
+	ktime_t interval = ktime_sub(ktime_get(), dev->raw->last_event);
 
-	if (interval >= dev->timeout) {
+	if (ktime_to_ns(interval) >= dev->timeout) {
 		DEFINE_IR_RAW_EVENT(ev);
 
 		ev.timeout = true;
-		ev.duration = interval;
+		ev.duration = ktime_to_ns(interval);
 
 		ir_raw_event_store(dev, &ev);
 	} else {
 		mod_timer(&dev->raw->edge_handle,
-			  jiffies + nsecs_to_jiffies(dev->timeout - interval));
+			  jiffies + nsecs_to_jiffies(dev->timeout -
+						     ktime_to_ns(interval)));
 	}
 
 	ir_raw_event_handle(dev);
diff --git a/drivers/media/rc/serial_ir.c b/drivers/media/rc/serial_ir.c
index 4b8d5f38baf6..8b66926bc16a 100644
--- a/drivers/media/rc/serial_ir.c
+++ b/drivers/media/rc/serial_ir.c
@@ -139,10 +139,8 @@ struct serial_ir {
 	struct platform_device *pdev;
 	struct timer_list timeout_timer;
 
-	unsigned int freq;
+	unsigned int carrier;
 	unsigned int duty_cycle;
-
-	unsigned int pulse_width, space_width;
 };
 
 static struct serial_ir serial_ir;
@@ -183,18 +181,6 @@ static void off(void)
 		soutp(UART_MCR, hardware[type].off);
 }
 
-static void init_timing_params(unsigned int new_duty_cycle,
-			       unsigned int new_freq)
-{
-	serial_ir.duty_cycle = new_duty_cycle;
-	serial_ir.freq = new_freq;
-
-	serial_ir.pulse_width = DIV_ROUND_CLOSEST(
-		new_duty_cycle * NSEC_PER_SEC, new_freq * 100l);
-	serial_ir.space_width = DIV_ROUND_CLOSEST(
-		(100l - new_duty_cycle) * NSEC_PER_SEC, new_freq * 100l);
-}
-
 static void send_pulse_irdeo(unsigned int length, ktime_t target)
 {
 	long rawbits;
@@ -241,13 +227,20 @@ static void send_pulse_homebrew_softcarrier(unsigned int length, ktime_t edge)
 	 * ndelay(s64) does not compile; so use s32 rather than s64.
 	 */
 	s32 delta;
+	unsigned int pulse, space;
+
+	/* Ensure the dividend fits into 32 bit */
+	pulse = DIV_ROUND_CLOSEST(serial_ir.duty_cycle * (NSEC_PER_SEC / 100),
+				  serial_ir.carrier);
+	space = DIV_ROUND_CLOSEST((100 - serial_ir.duty_cycle) *
+				  (NSEC_PER_SEC / 100), serial_ir.carrier);
 
 	for (;;) {
 		now = ktime_get();
 		if (ktime_compare(now, target) >= 0)
 			break;
 		on();
-		edge = ktime_add_ns(edge, serial_ir.pulse_width);
+		edge = ktime_add_ns(edge, pulse);
 		delta = ktime_to_ns(ktime_sub(edge, now));
 		if (delta > 0)
 			ndelay(delta);
@@ -255,7 +248,7 @@ static void send_pulse_homebrew_softcarrier(unsigned int length, ktime_t edge)
 		off();
 		if (ktime_compare(now, target) >= 0)
 			break;
-		edge = ktime_add_ns(edge, serial_ir.space_width);
+		edge = ktime_add_ns(edge, space);
 		delta = ktime_to_ns(ktime_sub(edge, now));
 		if (delta > 0)
 			ndelay(delta);
@@ -580,7 +573,8 @@ static int serial_ir_probe(struct platform_device *dev)
 		return result;
 
 	/* Initialize pulse/space widths */
-	init_timing_params(50, 38000);
+	serial_ir.duty_cycle = 50;
+	serial_ir.carrier = 38000;
 
 	/* If pin is high, then this must be an active low receiver. */
 	if (sense == -1) {
@@ -684,7 +678,7 @@ static int serial_ir_tx(struct rc_dev *dev, unsigned int *txbuf,
 
 static int serial_ir_tx_duty_cycle(struct rc_dev *dev, u32 cycle)
 {
-	init_timing_params(cycle, serial_ir.freq);
+	serial_ir.duty_cycle = cycle;
 	return 0;
 }
 
@@ -693,7 +687,7 @@ static int serial_ir_tx_carrier(struct rc_dev *dev, u32 carrier)
 	if (carrier > 500000 || carrier < 20000)
 		return -EINVAL;
 
-	init_timing_params(serial_ir.duty_cycle, carrier);
+	serial_ir.carrier = carrier;
 	return 0;
 }
 

^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [GIT PULL FOR v4.14] ktime_t accessor functions
  2017-08-26  8:42 [GIT PULL FOR v4.14] ktime_t accessor functions Sean Young
@ 2017-08-31  7:15 ` Jasmin J.
  0 siblings, 0 replies; 2+ messages in thread
From: Jasmin J. @ 2017-08-31  7:15 UTC (permalink / raw)
  To: linux-media, Mauro Carvalho Chehab; +Cc: Sean Young

Hi!

Without this series media-build is broken for Kernels older that 4.10.
When you will apply them?

Links to the individual patches:
  https://patchwork.linuxtv.org/patch/43481/
  https://patchwork.linuxtv.org/patch/43483/
  https://patchwork.linuxtv.org/patch/43482/

BR,
   Jasmin

********************************************************************

On 08/26/2017 10:42 AM, Sean Young wrote:
> Hi Mauro,
> 
> Without the ktime_t accessor functions, the pre-v4.10 media_build broken.
> Also there is a fix for the serial_ir on 32-bit builds.
> 
> Please merge where you see fit. 
> 
> Thanks
> 
> Sean
> 
> The following changes since commit 0779b8855c746c90b85bfe6e16d5dfa2a6a46655:
> 
>   media: ddbridge: fix semicolon.cocci warnings (2017-08-20 10:25:22 -0400)
> 
> are available in the git repository at:
> 
>   git://linuxtv.org/syoung/media_tree.git for-v4.14c
> 
> for you to fetch changes up to e4ea3e4bd643d133a5a3e7b708a7c7cf0f93586e:
> 
>   media: serial_ir: fix tx timing calculation on 32-bit (2017-08-26 09:26:29 +0100)
> 
> ----------------------------------------------------------------
> Jasmin Jessich (1):
>       media: rc: use ktime accessor functions
> 
> Sean Young (2):
>       media: rc: gpio-ir-tx: use ktime accessor functions
>       media: serial_ir: fix tx timing calculation on 32-bit
> 
>  drivers/media/rc/gpio-ir-tx.c | 12 +++++++-----
>  drivers/media/rc/rc-ir-raw.c  | 11 ++++++-----
>  drivers/media/rc/serial_ir.c  | 34 ++++++++++++++--------------------
>  3 files changed, 27 insertions(+), 30 deletions(-)
> 
> diff --git a/drivers/media/rc/gpio-ir-tx.c b/drivers/media/rc/gpio-ir-tx.c
> index 0b83408a2e18..cd476cab9782 100644
> --- a/drivers/media/rc/gpio-ir-tx.c
> +++ b/drivers/media/rc/gpio-ir-tx.c
> @@ -98,15 +98,17 @@ static int gpio_ir_tx(struct rc_dev *dev, unsigned int *txbuf,
>  			// pulse
>  			ktime_t last = ktime_add_us(edge, txbuf[i]);
>  
> -			while (ktime_get() < last) {
> +			while (ktime_before(ktime_get(), last)) {
>  				gpiod_set_value(gpio_ir->gpio, 1);
> -				edge += pulse;
> -				delta = edge - ktime_get();
> +				edge = ktime_add_ns(edge, pulse);
> +				delta = ktime_to_ns(ktime_sub(edge,
> +							      ktime_get()));
>  				if (delta > 0)
>  					ndelay(delta);
>  				gpiod_set_value(gpio_ir->gpio, 0);
> -				edge += space;
> -				delta = edge - ktime_get();
> +				edge = ktime_add_ns(edge, space);
> +				delta = ktime_to_ns(ktime_sub(edge,
> +							      ktime_get()));
>  				if (delta > 0)
>  					ndelay(delta);
>  			}
> diff --git a/drivers/media/rc/rc-ir-raw.c b/drivers/media/rc/rc-ir-raw.c
> index f495709e28fb..503bc425a187 100644
> --- a/drivers/media/rc/rc-ir-raw.c
> +++ b/drivers/media/rc/rc-ir-raw.c
> @@ -106,7 +106,7 @@ int ir_raw_event_store_edge(struct rc_dev *dev, bool pulse)
>  		return -EINVAL;
>  
>  	now = ktime_get();
> -	ev.duration = ktime_sub(now, dev->raw->last_event);
> +	ev.duration = ktime_to_ns(ktime_sub(now, dev->raw->last_event));
>  	ev.pulse = !pulse;
>  
>  	rc = ir_raw_event_store(dev, &ev);
> @@ -474,18 +474,19 @@ EXPORT_SYMBOL(ir_raw_encode_scancode);
>  static void edge_handle(unsigned long arg)
>  {
>  	struct rc_dev *dev = (struct rc_dev *)arg;
> -	ktime_t interval = ktime_get() - dev->raw->last_event;
> +	ktime_t interval = ktime_sub(ktime_get(), dev->raw->last_event);
>  
> -	if (interval >= dev->timeout) {
> +	if (ktime_to_ns(interval) >= dev->timeout) {
>  		DEFINE_IR_RAW_EVENT(ev);
>  
>  		ev.timeout = true;
> -		ev.duration = interval;
> +		ev.duration = ktime_to_ns(interval);
>  
>  		ir_raw_event_store(dev, &ev);
>  	} else {
>  		mod_timer(&dev->raw->edge_handle,
> -			  jiffies + nsecs_to_jiffies(dev->timeout - interval));
> +			  jiffies + nsecs_to_jiffies(dev->timeout -
> +						     ktime_to_ns(interval)));
>  	}
>  
>  	ir_raw_event_handle(dev);
> diff --git a/drivers/media/rc/serial_ir.c b/drivers/media/rc/serial_ir.c
> index 4b8d5f38baf6..8b66926bc16a 100644
> --- a/drivers/media/rc/serial_ir.c
> +++ b/drivers/media/rc/serial_ir.c
> @@ -139,10 +139,8 @@ struct serial_ir {
>  	struct platform_device *pdev;
>  	struct timer_list timeout_timer;
>  
> -	unsigned int freq;
> +	unsigned int carrier;
>  	unsigned int duty_cycle;
> -
> -	unsigned int pulse_width, space_width;
>  };
>  
>  static struct serial_ir serial_ir;
> @@ -183,18 +181,6 @@ static void off(void)
>  		soutp(UART_MCR, hardware[type].off);
>  }
>  
> -static void init_timing_params(unsigned int new_duty_cycle,
> -			       unsigned int new_freq)
> -{
> -	serial_ir.duty_cycle = new_duty_cycle;
> -	serial_ir.freq = new_freq;
> -
> -	serial_ir.pulse_width = DIV_ROUND_CLOSEST(
> -		new_duty_cycle * NSEC_PER_SEC, new_freq * 100l);
> -	serial_ir.space_width = DIV_ROUND_CLOSEST(
> -		(100l - new_duty_cycle) * NSEC_PER_SEC, new_freq * 100l);
> -}
> -
>  static void send_pulse_irdeo(unsigned int length, ktime_t target)
>  {
>  	long rawbits;
> @@ -241,13 +227,20 @@ static void send_pulse_homebrew_softcarrier(unsigned int length, ktime_t edge)
>  	 * ndelay(s64) does not compile; so use s32 rather than s64.
>  	 */
>  	s32 delta;
> +	unsigned int pulse, space;
> +
> +	/* Ensure the dividend fits into 32 bit */
> +	pulse = DIV_ROUND_CLOSEST(serial_ir.duty_cycle * (NSEC_PER_SEC / 100),
> +				  serial_ir.carrier);
> +	space = DIV_ROUND_CLOSEST((100 - serial_ir.duty_cycle) *
> +				  (NSEC_PER_SEC / 100), serial_ir.carrier);
>  
>  	for (;;) {
>  		now = ktime_get();
>  		if (ktime_compare(now, target) >= 0)
>  			break;
>  		on();
> -		edge = ktime_add_ns(edge, serial_ir.pulse_width);
> +		edge = ktime_add_ns(edge, pulse);
>  		delta = ktime_to_ns(ktime_sub(edge, now));
>  		if (delta > 0)
>  			ndelay(delta);
> @@ -255,7 +248,7 @@ static void send_pulse_homebrew_softcarrier(unsigned int length, ktime_t edge)
>  		off();
>  		if (ktime_compare(now, target) >= 0)
>  			break;
> -		edge = ktime_add_ns(edge, serial_ir.space_width);
> +		edge = ktime_add_ns(edge, space);
>  		delta = ktime_to_ns(ktime_sub(edge, now));
>  		if (delta > 0)
>  			ndelay(delta);
> @@ -580,7 +573,8 @@ static int serial_ir_probe(struct platform_device *dev)
>  		return result;
>  
>  	/* Initialize pulse/space widths */
> -	init_timing_params(50, 38000);
> +	serial_ir.duty_cycle = 50;
> +	serial_ir.carrier = 38000;
>  
>  	/* If pin is high, then this must be an active low receiver. */
>  	if (sense == -1) {
> @@ -684,7 +678,7 @@ static int serial_ir_tx(struct rc_dev *dev, unsigned int *txbuf,
>  
>  static int serial_ir_tx_duty_cycle(struct rc_dev *dev, u32 cycle)
>  {
> -	init_timing_params(cycle, serial_ir.freq);
> +	serial_ir.duty_cycle = cycle;
>  	return 0;
>  }
>  
> @@ -693,7 +687,7 @@ static int serial_ir_tx_carrier(struct rc_dev *dev, u32 carrier)
>  	if (carrier > 500000 || carrier < 20000)
>  		return -EINVAL;
>  
> -	init_timing_params(serial_ir.duty_cycle, carrier);
> +	serial_ir.carrier = carrier;
>  	return 0;
>  }
>  
> 

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2017-08-31  7:15 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-08-26  8:42 [GIT PULL FOR v4.14] ktime_t accessor functions Sean Young
2017-08-31  7:15 ` Jasmin J.

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).