On 1/13/24 18:12, Jonathan Cameron wrote:
On Wed, 10 Jan 2024 12:12:55 +0200
Matti Vaittinen <mazziesaccount@xxxxxxxxx> wrote:
Some light sensors can adjust both the HW-gain and integration time.
There are cases where adjusting the integration time has similar impact
to the scale of the reported values as gain setting has.
IIO users do typically expect to handle scale by a single writable 'scale'
entry. Driver should then adjust the gain/time accordingly.
It however is difficult for a driver to know whether it should change
gain or integration time to meet the requested scale. Usually it is
preferred to have longer integration time which usually improves
accuracy, but there may be use-cases where long measurement times can be
an issue. Thus it can be preferable to allow also changing the
integration time - but mitigate the scale impact by also changing the gain
underneath. Eg, if integration time change doubles the measured values,
the driver can reduce the HW-gain to half.
The theory of the computations of gain-time-scale is simple. However,
some people (undersigned) got that implemented wrong for more than once.
Hence some gain-time-scale helpers were introduced.
Add some simple tests to verify the most hairy functions.
Signed-off-by: Matti Vaittinen <mazziesaccount@xxxxxxxxx>
...
+static void test_iio_gts_chk_scales_all(struct kunit *test, struct iio_gts *gts,
+ const int *vals, int len)
+{
+ static const int gains[] = {1, 2, 4, 8, 16, 32, 64, 128, 256, 512,
+ 1024, 2048, 4096, 4096 * 2, 4096 * 4,
+ 4096 * 8};
+
+ int expected[ARRAY_SIZE(gains) * 2];
+ int i, ret;
+ int exp_len = ARRAY_SIZE(gains) * 2;
Use this for expected[*] just above?
Doing:
const int exp_len = ARRAY_SIZE(gains) * 2;
int expected[exp_len];
gives me:
warning: ISO C90 forbids variable length array ‘expected’ [-Wvla]
I could drop the whole exp_len variable, but I prefer test code which is
as obvious as it gets if any of the checks fails. For me the check:
+ KUNIT_EXPECT_EQ(test, exp_len, len);
+ if (len != exp_len)
+ return;
is (very slightly) more obvious than:
KUNIT_EXPECT_EQ(test, ARRAY_SIZE(gains) * 2, len);
if (len != ARRAY_SIZE(gains) * 2)
return;
I guess I'll leave this one as it is. Just kick me in v2 if I
misunderstood you :)
Yours,
-- Matti
--
Matti Vaittinen
Linux kernel developer at ROHM Semiconductors
Oulu Finland
~~ When things go utterly wrong vim users can always type :help! ~~