VIA C3 Longhaul Driver version 1.3

Updated 19 April 2004

The VIA C3 processor includes a powersaving feature whereby the CPU clock multiplier may be changed while the CPU is operating. VIA calls this feature "longhaul"(tm).

The longhaul driver included with the 2.4 kernel does not work on the most recent VIA C3 CPUs. So I wrote my own. You can download it here.

The tarball includes a README file. Read the README file carefully. I will not be held responsible for damage which you may inflict upon your CPU.

There is a known conflict between longhaul and the lirc application. Here is some info on the conflict copied from the viaarena thread.

 Just a note to stop others going through the same pain I just have, but longhaul
 doesn't play fair with lirc_serial.o. The result is that you can see the codes with "mode2"
 and can even train for a new remote control with "irrecord". However, if the cpu speed
 changes between the irrecord and the use of the remote control, or worse during the use of
 irrecord, then the result is that the key presses aren't correctly decoded. As for using the
 pre-recorded remote control definitions, FORGET IT...
 
 Now my temporary solution has been to do

 % rmmod longhaul_governer
 % echo "8" > /proc/longhaul

 and then use one of the pre-recorded remote control definitions. I suspect the issue is that
 some timing of the serial ports are defined during the boot of the machine and if longhaul slows
 the machine up afterwards, then these are no longer valid. If anyone can suggest a better
 solution, I'm interested since I'd like to use the governer if possible,
      
 Regards

and more details in a subsequent message ...

... The COM2 to which the homebrew IR adapter is
connected has its uart disabled, so its normal that setserial has
now effect. Reading the lirc_serial.c code, the timing is initialized
at load time by the code

static inline int init_timing_params(unsigned int new_duty_cycle,
unsigned int new_freq)
{
unsigned long long loops_per_sec,work;

duty_cycle=new_duty_cycle;
freq=new_freq;

loops_per_sec=current_cpu_data.loops_per_jiffy;
loops_per_sec*=HZ;

/* How many clocks in a microsecond?, avoiding long long divide */
work=loops_per_sec;
work*=4295; /* 4295 = 2^32 / 1e6 */
conv_us_to_clocks=(work>>32);

/* Carrier period in clocks, approach good up to 32GHz clock,
gets carrier frequency within 8Hz */
period=loops_per_sec>>3;
period/=(freq>>3);

pulse_width = period*duty_cycle/100;
space_width = period - pulse_width;


So as you see the timing of the pulse and space widths are

1) Calculated from HZ and other data initialized at boottime (This might be different in 2.6)
2) Fixed once when lirc_serial is loaded.

So it is also normal that reloading lirc_serial doesn't help

This is a real pain, as I can't use the Haupagge remote directly with my PVR250 as it
uses the same RC5 commands as my television.....