CPU Governor vs. I2C conflic

I spent hours finding a bug in my GPIO kernel driver (blocking the system) until I found the reason:

While the system has to process a lot of data (interrupts), i.e. streaming of music, video, or handling signals from a GPIO.
the kernel hangs showing an I2C controller timeout in the journal.

This always happens when the CPU frequency is atomatically switched by the cpu governor.

I am using this commands to disable frequency switching:

cpufreq-set -c 0 -g performance
cpufreq-set -d 1GHz
cpufreq-set -u 1GHz

to check if it worked: cpufreq-info

this must print the line:
current policy: frequency should be within 1000 MHz and 1000 MHz.

If somebody knows a better way to disable thew cpu governor, please tell us.

Is there any plan to solve the conflict between the cpu governor and the I2C causing I2C contoller timeouts ?


If you know beforehand that the system needs to start operating at 1GHz you
could switch over to the userspace governor and then set the frequency.
Using the userspace governor ensures that the frequency doesn't change
automatically. This could in theory impact the average power consumption but
can be used as a stopgap solution till you find out why the timeouts
are happening
in the first place.


The default Angstrom build has a service that starts 10 minutes after boot and switches the governor to on-demand.

I disabled it on my system and have been happy with the results.I recommend digging into the files to understand what is happening, but I used this command:

systemctl disable cpu-ondemand.timer