@@ -300,6 +300,14 @@ static int r82xx_write_reg(struct r82xx_priv *priv, uint8_t reg, uint8_t val)
300
300
{
301
301
if (priv -> reg_cache && r82xx_read_cache_reg (priv , reg ) == val )
302
302
return 0 ;
303
+ if (priv -> reg_batch ) {
304
+ shadow_store (priv , reg , & val , 1 );
305
+ if (reg < priv -> reg_low )
306
+ priv -> reg_low = reg ;
307
+ if (reg > priv -> reg_high )
308
+ priv -> reg_high = reg ;
309
+ return 0 ;
310
+ }
303
311
return r82xx_write (priv , reg , & val , 1 );
304
312
}
305
313
@@ -313,9 +321,34 @@ static int r82xx_write_reg_mask(struct r82xx_priv *priv, uint8_t reg, uint8_t va
313
321
314
322
val = (rc & ~bit_mask ) | (val & bit_mask );
315
323
316
- if (priv -> reg_cache && r82xx_read_cache_reg (priv , reg ) == val )
317
- return 0 ;
318
- return r82xx_write (priv , reg , & val , 1 );
324
+ return r82xx_write_reg (priv , reg , val );
325
+ }
326
+
327
+ static int r82xx_write_batch_init (struct r82xx_priv * priv )
328
+ {
329
+ priv -> reg_batch = 0 ;
330
+ if (priv -> reg_cache ) {
331
+ priv -> reg_batch = 1 ;
332
+ priv -> reg_low = NUM_REGS ;
333
+ priv -> reg_high = 0 ;
334
+ }
335
+ return 0 ;
336
+ }
337
+
338
+ static int r82xx_write_batch_sync (struct r82xx_priv * priv )
339
+ {
340
+ int rc , offset , len ;
341
+ if (!priv -> reg_cache )
342
+ return -1 ;
343
+ if (!priv -> reg_batch )
344
+ return -1 ;
345
+ priv -> reg_batch = 0 ;
346
+ if (priv -> reg_low > priv -> reg_high )
347
+ return -1 ;
348
+ offset = priv -> reg_low - REG_SHADOW_START ;
349
+ len = priv -> reg_high - priv -> reg_low + 1 ;
350
+ rc = r82xx_write (priv , priv -> reg_low , priv -> regs + offset , len );
351
+ return rc ;
319
352
}
320
353
321
354
static uint8_t r82xx_bitrev (uint8_t byte )
@@ -437,6 +470,8 @@ static int r82xx_set_pll(struct r82xx_priv *priv, uint32_t freq)
437
470
uint8_t ni , si , nint , vco_fine_tune , val ;
438
471
uint8_t data [5 ];
439
472
473
+ r82xx_write_batch_init (priv );
474
+
440
475
/* Frequency in kHz */
441
476
freq_khz = (freq + 500 ) / 1000 ;
442
477
pll_ref = priv -> cfg -> xtal ;
@@ -535,6 +570,14 @@ static int r82xx_set_pll(struct r82xx_priv *priv, uint32_t freq)
535
570
if (rc < 0 )
536
571
return rc ;
537
572
573
+ if (priv -> reg_batch ) {
574
+ rc = r82xx_write_batch_sync (priv );
575
+ if (rc < 0 ) {
576
+ fprintf (stderr , "[R82XX] Batch error in PLL for %u Hz!\n" , freq );
577
+ return rc ;
578
+ }
579
+ }
580
+
538
581
for (i = 0 ; i < 2 ; i ++ ) {
539
582
// usleep_range(sleep_time, sleep_time + 1000);
540
583
@@ -1026,6 +1069,8 @@ int r82xx_set_freq(struct r82xx_priv *priv, uint32_t freq)
1026
1069
uint32_t lo_freq = freq + priv -> int_freq ;
1027
1070
uint8_t air_cable1_in ;
1028
1071
1072
+ r82xx_write_batch_init (priv );
1073
+
1029
1074
rc = r82xx_set_mux (priv , lo_freq );
1030
1075
if (rc < 0 )
1031
1076
goto err ;
@@ -1046,6 +1091,9 @@ int r82xx_set_freq(struct r82xx_priv *priv, uint32_t freq)
1046
1091
rc = r82xx_write_reg_mask (priv , 0x05 , air_cable1_in , 0x60 );
1047
1092
}
1048
1093
1094
+ if (priv -> reg_batch ) {
1095
+ rc = r82xx_write_batch_sync (priv );
1096
+ }
1049
1097
err :
1050
1098
if (rc < 0 )
1051
1099
fprintf (stderr , "%s: failed=%d\n" , __FUNCTION__ , rc );
0 commit comments