aw_pwm: add a check and some comments related to long periods

The hardware supports periods as long as 196 seconds[*] when using the
maximal prescaling of 72000 and maximum cycle count of 2^16.

But the code becomes incorrect when the period length approaches 1 second.
That's because of things like NS_PER_SEC / period.

[*] At the same time I must note that the KPI provides for maximum
period of about 4 seconds (2^32 nanoseconds).

MFC after:	2 weeks
This commit is contained in:
Andriy Gapon 2020-09-25 07:41:51 +00:00
parent 6957a14075
commit e08dc44162
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=366142

View File

@ -259,6 +259,20 @@ aw_pwm_channel_config(device_t dev, u_int channel, u_int period, u_int duty)
period_freq = NS_PER_SEC / period;
if (period_freq > AW_PWM_MAX_FREQ)
return (EINVAL);
/*
* FIXME. The hardware is capable of sub-Hz frequencies, that is,
* periods longer than a second. But the current code cannot deal
* with those properly.
*/
if (period_freq == 0)
return (EINVAL);
/*
* FIXME. There is a great loss of precision when the period and the
* duty are near 1 second. In some cases period_freq and duty_freq can
* be equal even if the period and the duty are significantly different.
*/
duty_freq = NS_PER_SEC / duty;
if (duty_freq < period_freq) {
device_printf(sc->dev, "duty < period\n");