@@ -183,8 +183,9 @@ static void ni_tio_reset_count_and_disarm(struct ni_gpct *counter)
183
183
ni_tio_write (counter , GI_RESET (cidx ), NITIO_RESET_REG (cidx ));
184
184
}
185
185
186
- static u64 ni_tio_clock_period_ps (const struct ni_gpct * counter ,
187
- unsigned int generic_clock_source )
186
+ static int ni_tio_clock_period_ps (const struct ni_gpct * counter ,
187
+ unsigned int generic_clock_source ,
188
+ u64 * period_ps )
188
189
{
189
190
u64 clock_period_ps ;
190
191
@@ -219,10 +220,10 @@ static u64 ni_tio_clock_period_ps(const struct ni_gpct *counter,
219
220
clock_period_ps *= 8 ;
220
221
break ;
221
222
default :
222
- BUG ();
223
- break ;
223
+ return - EINVAL ;
224
224
}
225
- return clock_period_ps ;
225
+ * period_ps = clock_period_ps ;
226
+ return 0 ;
226
227
}
227
228
228
229
static void ni_tio_set_bits_transient (struct ni_gpct * counter ,
@@ -304,7 +305,8 @@ static unsigned int ni_tio_clock_src_modifiers(const struct ni_gpct *counter)
304
305
return bits ;
305
306
}
306
307
307
- static unsigned int ni_m_series_clock_src_select (const struct ni_gpct * counter )
308
+ static int ni_m_series_clock_src_select (const struct ni_gpct * counter ,
309
+ unsigned int * clk_src )
308
310
{
309
311
struct ni_gpct_device * counter_dev = counter -> counter_dev ;
310
312
unsigned int cidx = counter -> counter_index ;
@@ -362,14 +364,15 @@ static unsigned int ni_m_series_clock_src_select(const struct ni_gpct *counter)
362
364
}
363
365
if (i <= NI_M_MAX_PFI_CHAN )
364
366
break ;
365
- BUG ();
366
- break ;
367
+ return - EINVAL ;
367
368
}
368
369
clock_source |= ni_tio_clock_src_modifiers (counter );
369
- return clock_source ;
370
+ * clk_src = clock_source ;
371
+ return 0 ;
370
372
}
371
373
372
- static unsigned int ni_660x_clock_src_select (const struct ni_gpct * counter )
374
+ static int ni_660x_clock_src_select (const struct ni_gpct * counter ,
375
+ unsigned int * clk_src )
373
376
{
374
377
unsigned int clock_source = 0 ;
375
378
unsigned int cidx = counter -> counter_index ;
@@ -419,23 +422,23 @@ static unsigned int ni_660x_clock_src_select(const struct ni_gpct *counter)
419
422
}
420
423
if (i <= NI_660X_MAX_SRC_PIN )
421
424
break ;
422
- BUG ();
423
- break ;
425
+ return - EINVAL ;
424
426
}
425
427
clock_source |= ni_tio_clock_src_modifiers (counter );
426
- return clock_source ;
428
+ * clk_src = clock_source ;
429
+ return 0 ;
427
430
}
428
431
429
- static unsigned int
430
- ni_tio_generic_clock_src_select ( const struct ni_gpct * counter )
432
+ static int ni_tio_generic_clock_src_select ( const struct ni_gpct * counter ,
433
+ unsigned int * clk_src )
431
434
{
432
435
switch (counter -> counter_dev -> variant ) {
433
436
case ni_gpct_variant_e_series :
434
437
case ni_gpct_variant_m_series :
435
438
default :
436
- return ni_m_series_clock_src_select (counter );
439
+ return ni_m_series_clock_src_select (counter , clk_src );
437
440
case ni_gpct_variant_660x :
438
- return ni_660x_clock_src_select (counter );
441
+ return ni_660x_clock_src_select (counter , clk_src );
439
442
}
440
443
}
441
444
@@ -448,6 +451,7 @@ static void ni_tio_set_sync_mode(struct ni_gpct *counter)
448
451
unsigned int bits = 0 ;
449
452
unsigned int reg ;
450
453
unsigned int mode ;
454
+ unsigned int clk_src ;
451
455
u64 ps ;
452
456
bool force_alt_sync ;
453
457
@@ -478,8 +482,8 @@ static void ni_tio_set_sync_mode(struct ni_gpct *counter)
478
482
break ;
479
483
}
480
484
481
- ps = ni_tio_clock_period_ps (counter ,
482
- ni_tio_generic_clock_src_select (counter ) );
485
+ ni_tio_generic_clock_src_select (counter , & clk_src );
486
+ ni_tio_clock_period_ps (counter , clk_src , & ps );
483
487
484
488
/*
485
489
* It's not clear what we should do if clock_period is unknown, so we
@@ -800,16 +804,22 @@ static int ni_tio_set_clock_src(struct ni_gpct *counter,
800
804
return 0 ;
801
805
}
802
806
803
- static void ni_tio_get_clock_src (struct ni_gpct * counter ,
804
- unsigned int * clock_source ,
805
- unsigned int * period_ns )
807
+ static int ni_tio_get_clock_src (struct ni_gpct * counter ,
808
+ unsigned int * clock_source ,
809
+ unsigned int * period_ns )
806
810
{
807
811
u64 temp64 ;
812
+ int ret ;
808
813
809
- * clock_source = ni_tio_generic_clock_src_select (counter );
810
- temp64 = ni_tio_clock_period_ps (counter , * clock_source );
814
+ ret = ni_tio_generic_clock_src_select (counter , clock_source );
815
+ if (ret )
816
+ return ret ;
817
+ ret = ni_tio_clock_period_ps (counter , * clock_source , & temp64 );
818
+ if (ret )
819
+ return ret ;
811
820
do_div (temp64 , 1000 ); /* ps to ns */
812
821
* period_ns = temp64 ;
822
+ return 0 ;
813
823
}
814
824
815
825
static int ni_660x_set_gate (struct ni_gpct * counter , unsigned int gate_source )
@@ -1320,7 +1330,7 @@ int ni_tio_insn_config(struct comedi_device *dev,
1320
1330
ret = ni_tio_set_clock_src (counter , data [1 ], data [2 ]);
1321
1331
break ;
1322
1332
case INSN_CONFIG_GET_CLOCK_SRC :
1323
- ni_tio_get_clock_src (counter , & data [1 ], & data [2 ]);
1333
+ ret = ni_tio_get_clock_src (counter , & data [1 ], & data [2 ]);
1324
1334
break ;
1325
1335
case INSN_CONFIG_SET_GATE_SRC :
1326
1336
ret = ni_tio_set_gate_src (counter , data [1 ], data [2 ]);
0 commit comments