@@ -253,6 +253,7 @@ int cros_ec_sensors_core_init(struct platform_device *pdev,
253
253
struct cros_ec_dev * ec = sensor_hub -> ec ;
254
254
struct cros_ec_sensor_platform * sensor_platform = dev_get_platdata (dev );
255
255
u32 ver_mask ;
256
+ int frequencies [ARRAY_SIZE (state -> frequencies ) / 2 ] = { 0 };
256
257
int ret , i ;
257
258
258
259
platform_set_drvdata (pdev , indio_dev );
@@ -301,20 +302,22 @@ int cros_ec_sensors_core_init(struct platform_device *pdev,
301
302
state -> calib [i ].scale = MOTION_SENSE_DEFAULT_SCALE ;
302
303
303
304
/* 0 is a correct value used to stop the device */
304
- state -> frequencies [0 ] = 0 ;
305
305
if (state -> msg -> version < 3 ) {
306
306
get_default_min_max_freq (state -> resp -> info .type ,
307
- & state -> frequencies [1 ],
308
- & state -> frequencies [2 ],
307
+ & frequencies [1 ],
308
+ & frequencies [2 ],
309
309
& state -> fifo_max_event_count );
310
310
} else {
311
- state -> frequencies [1 ] =
312
- state -> resp -> info_3 .min_frequency ;
313
- state -> frequencies [2 ] =
314
- state -> resp -> info_3 .max_frequency ;
311
+ frequencies [1 ] = state -> resp -> info_3 .min_frequency ;
312
+ frequencies [2 ] = state -> resp -> info_3 .max_frequency ;
315
313
state -> fifo_max_event_count =
316
314
state -> resp -> info_3 .fifo_max_event_count ;
317
315
}
316
+ for (i = 0 ; i < ARRAY_SIZE (frequencies ); i ++ ) {
317
+ state -> frequencies [2 * i ] = frequencies [i ] / 1000 ;
318
+ state -> frequencies [2 * i + 1 ] =
319
+ (frequencies [i ] % 1000 ) * 1000 ;
320
+ }
318
321
319
322
if (cros_ec_check_features (ec , EC_FEATURE_MOTION_SENSE_FIFO )) {
320
323
/*
@@ -728,7 +731,7 @@ int cros_ec_sensors_core_read(struct cros_ec_sensors_core_state *st,
728
731
struct iio_chan_spec const * chan ,
729
732
int * val , int * val2 , long mask )
730
733
{
731
- int ret ;
734
+ int ret , frequency ;
732
735
733
736
switch (mask ) {
734
737
case IIO_CHAN_INFO_SAMP_FREQ :
@@ -740,8 +743,10 @@ int cros_ec_sensors_core_read(struct cros_ec_sensors_core_state *st,
740
743
if (ret )
741
744
break ;
742
745
743
- * val = st -> resp -> sensor_odr .ret ;
744
- ret = IIO_VAL_INT ;
746
+ frequency = st -> resp -> sensor_odr .ret ;
747
+ * val = frequency / 1000 ;
748
+ * val2 = (frequency % 1000 ) * 1000 ;
749
+ ret = IIO_VAL_INT_PLUS_MICRO ;
745
750
break ;
746
751
default :
747
752
ret = - EINVAL ;
@@ -776,7 +781,7 @@ int cros_ec_sensors_core_read_avail(struct iio_dev *indio_dev,
776
781
case IIO_CHAN_INFO_SAMP_FREQ :
777
782
* length = ARRAY_SIZE (state -> frequencies );
778
783
* vals = (const int * )& state -> frequencies ;
779
- * type = IIO_VAL_INT ;
784
+ * type = IIO_VAL_INT_PLUS_MICRO ;
780
785
return IIO_AVAIL_LIST ;
781
786
}
782
787
@@ -798,12 +803,13 @@ int cros_ec_sensors_core_write(struct cros_ec_sensors_core_state *st,
798
803
struct iio_chan_spec const * chan ,
799
804
int val , int val2 , long mask )
800
805
{
801
- int ret ;
806
+ int ret , frequency ;
802
807
803
808
switch (mask ) {
804
809
case IIO_CHAN_INFO_SAMP_FREQ :
810
+ frequency = val * 1000 + val2 / 1000 ;
805
811
st -> param .cmd = MOTIONSENSE_CMD_SENSOR_ODR ;
806
- st -> param .sensor_odr .data = val ;
812
+ st -> param .sensor_odr .data = frequency ;
807
813
808
814
/* Always roundup, so caller gets at least what it asks for. */
809
815
st -> param .sensor_odr .roundup = 1 ;
0 commit comments