|
@@ -327,9 +327,6 @@ static void safe_udelay(unsigned long usecs)
|
|
* time
|
|
* time
|
|
*/
|
|
*/
|
|
|
|
|
|
-/* So send_pulse can quickly convert microseconds to clocks */
|
|
|
|
-static unsigned long conv_us_to_clocks;
|
|
|
|
-
|
|
|
|
static int init_timing_params(unsigned int new_duty_cycle,
|
|
static int init_timing_params(unsigned int new_duty_cycle,
|
|
unsigned int new_freq)
|
|
unsigned int new_freq)
|
|
{
|
|
{
|
|
@@ -344,7 +341,6 @@ static int init_timing_params(unsigned int new_duty_cycle,
|
|
/* How many clocks in a microsecond?, avoiding long long divide */
|
|
/* How many clocks in a microsecond?, avoiding long long divide */
|
|
work = loops_per_sec;
|
|
work = loops_per_sec;
|
|
work *= 4295; /* 4295 = 2^32 / 1e6 */
|
|
work *= 4295; /* 4295 = 2^32 / 1e6 */
|
|
- conv_us_to_clocks = work >> 32;
|
|
|
|
|
|
|
|
/*
|
|
/*
|
|
* Carrier period in clocks, approach good up to 32GHz clock,
|
|
* Carrier period in clocks, approach good up to 32GHz clock,
|
|
@@ -357,10 +353,9 @@ static int init_timing_params(unsigned int new_duty_cycle,
|
|
pulse_width = period * duty_cycle / 100;
|
|
pulse_width = period * duty_cycle / 100;
|
|
space_width = period - pulse_width;
|
|
space_width = period - pulse_width;
|
|
dprintk("in init_timing_params, freq=%d, duty_cycle=%d, "
|
|
dprintk("in init_timing_params, freq=%d, duty_cycle=%d, "
|
|
- "clk/jiffy=%ld, pulse=%ld, space=%ld, "
|
|
|
|
- "conv_us_to_clocks=%ld\n",
|
|
|
|
|
|
+ "clk/jiffy=%ld, pulse=%ld, space=%ld\n",
|
|
freq, duty_cycle, __this_cpu_read(cpu_info.loops_per_jiffy),
|
|
freq, duty_cycle, __this_cpu_read(cpu_info.loops_per_jiffy),
|
|
- pulse_width, space_width, conv_us_to_clocks);
|
|
|
|
|
|
+ pulse_width, space_width);
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
#else /* ! USE_RDTSC */
|
|
#else /* ! USE_RDTSC */
|
|
@@ -431,63 +426,14 @@ static long send_pulse_irdeo(unsigned long length)
|
|
return ret;
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
|
|
-#ifdef USE_RDTSC
|
|
|
|
-/* Version that uses Pentium rdtsc instruction to measure clocks */
|
|
|
|
-
|
|
|
|
-/*
|
|
|
|
- * This version does sub-microsecond timing using rdtsc instruction,
|
|
|
|
- * and does away with the fudged LIRC_SERIAL_TRANSMITTER_LATENCY
|
|
|
|
- * Implicitly i586 architecture... - Steve
|
|
|
|
- */
|
|
|
|
-
|
|
|
|
-static long send_pulse_homebrew_softcarrier(unsigned long length)
|
|
|
|
-{
|
|
|
|
- int flag;
|
|
|
|
- unsigned long target, start, now;
|
|
|
|
-
|
|
|
|
- /* Get going quick as we can */
|
|
|
|
- rdtscl(start);
|
|
|
|
- on();
|
|
|
|
- /* Convert length from microseconds to clocks */
|
|
|
|
- length *= conv_us_to_clocks;
|
|
|
|
- /* And loop till time is up - flipping at right intervals */
|
|
|
|
- now = start;
|
|
|
|
- target = pulse_width;
|
|
|
|
- flag = 1;
|
|
|
|
- /*
|
|
|
|
- * FIXME: This looks like a hard busy wait, without even an occasional,
|
|
|
|
- * polite, cpu_relax() call. There's got to be a better way?
|
|
|
|
- *
|
|
|
|
- * The i2c code has the result of a lot of bit-banging work, I wonder if
|
|
|
|
- * there's something there which could be helpful here.
|
|
|
|
- */
|
|
|
|
- while ((now - start) < length) {
|
|
|
|
- /* Delay till flip time */
|
|
|
|
- do {
|
|
|
|
- rdtscl(now);
|
|
|
|
- } while ((now - start) < target);
|
|
|
|
-
|
|
|
|
- /* flip */
|
|
|
|
- if (flag) {
|
|
|
|
- rdtscl(now);
|
|
|
|
- off();
|
|
|
|
- target += space_width;
|
|
|
|
- } else {
|
|
|
|
- rdtscl(now); on();
|
|
|
|
- target += pulse_width;
|
|
|
|
- }
|
|
|
|
- flag = !flag;
|
|
|
|
- }
|
|
|
|
- rdtscl(now);
|
|
|
|
- return ((now - start) - length) / conv_us_to_clocks;
|
|
|
|
-}
|
|
|
|
-#else /* ! USE_RDTSC */
|
|
|
|
/* Version using udelay() */
|
|
/* Version using udelay() */
|
|
|
|
|
|
/*
|
|
/*
|
|
* here we use fixed point arithmetic, with 8
|
|
* here we use fixed point arithmetic, with 8
|
|
* fractional bits. that gets us within 0.1% or so of the right average
|
|
* fractional bits. that gets us within 0.1% or so of the right average
|
|
* frequency, albeit with some jitter in pulse length - Steve
|
|
* frequency, albeit with some jitter in pulse length - Steve
|
|
|
|
+ *
|
|
|
|
+ * This should use ndelay instead.
|
|
*/
|
|
*/
|
|
|
|
|
|
/* To match 8 fractional bits used for pulse/space length */
|
|
/* To match 8 fractional bits used for pulse/space length */
|
|
@@ -520,7 +466,6 @@ static long send_pulse_homebrew_softcarrier(unsigned long length)
|
|
}
|
|
}
|
|
return (actual-length) >> 8;
|
|
return (actual-length) >> 8;
|
|
}
|
|
}
|
|
-#endif /* USE_RDTSC */
|
|
|
|
|
|
|
|
static long send_pulse_homebrew(unsigned long length)
|
|
static long send_pulse_homebrew(unsigned long length)
|
|
{
|
|
{
|