@@ -50,8 +50,22 @@ static void pca_reset(struct i2c_algo_pca_data *adap)
50
50
pca_outw (adap , I2C_PCA_INDPTR , I2C_PCA_IPRESET );
51
51
pca_outw (adap , I2C_PCA_IND , 0xA5 );
52
52
pca_outw (adap , I2C_PCA_IND , 0x5A );
53
+
54
+ /*
55
+ * After a reset we need to re-apply any configuration
56
+ * (calculated in pca_init) to get the bus in a working state.
57
+ */
58
+ pca_outw (adap , I2C_PCA_INDPTR , I2C_PCA_IMODE );
59
+ pca_outw (adap , I2C_PCA_IND , adap -> bus_settings .mode );
60
+ pca_outw (adap , I2C_PCA_INDPTR , I2C_PCA_ISCLL );
61
+ pca_outw (adap , I2C_PCA_IND , adap -> bus_settings .tlow );
62
+ pca_outw (adap , I2C_PCA_INDPTR , I2C_PCA_ISCLH );
63
+ pca_outw (adap , I2C_PCA_IND , adap -> bus_settings .thi );
64
+
65
+ pca_set_con (adap , I2C_PCA_CON_ENSIO );
53
66
} else {
54
67
adap -> reset_chip (adap -> data );
68
+ pca_set_con (adap , I2C_PCA_CON_ENSIO | adap -> bus_settings .clock_freq );
55
69
}
56
70
}
57
71
@@ -435,13 +449,14 @@ static int pca_init(struct i2c_adapter *adap)
435
449
" Use the nominal frequency.\n" , adap -> name );
436
450
}
437
451
438
- pca_reset (pca_data );
439
-
440
452
clock = pca_clock (pca_data );
441
453
printk (KERN_INFO "%s: Clock frequency is %dkHz\n" ,
442
454
adap -> name , freqs [clock ]);
443
455
444
- pca_set_con (pca_data , I2C_PCA_CON_ENSIO | clock );
456
+ /* Store settings as these will be needed when the PCA chip is reset */
457
+ pca_data -> bus_settings .clock_freq = clock ;
458
+
459
+ pca_reset (pca_data );
445
460
} else {
446
461
int clock ;
447
462
int mode ;
@@ -508,19 +523,15 @@ static int pca_init(struct i2c_adapter *adap)
508
523
thi = tlow * min_thi / min_tlow ;
509
524
}
510
525
526
+ /* Store settings as these will be needed when the PCA chip is reset */
527
+ pca_data -> bus_settings .mode = mode ;
528
+ pca_data -> bus_settings .tlow = tlow ;
529
+ pca_data -> bus_settings .thi = thi ;
530
+
511
531
pca_reset (pca_data );
512
532
513
533
printk (KERN_INFO
514
534
"%s: Clock frequency is %dHz\n" , adap -> name , clock * 100 );
515
-
516
- pca_outw (pca_data , I2C_PCA_INDPTR , I2C_PCA_IMODE );
517
- pca_outw (pca_data , I2C_PCA_IND , mode );
518
- pca_outw (pca_data , I2C_PCA_INDPTR , I2C_PCA_ISCLL );
519
- pca_outw (pca_data , I2C_PCA_IND , tlow );
520
- pca_outw (pca_data , I2C_PCA_INDPTR , I2C_PCA_ISCLH );
521
- pca_outw (pca_data , I2C_PCA_IND , thi );
522
-
523
- pca_set_con (pca_data , I2C_PCA_CON_ENSIO );
524
535
}
525
536
udelay (500 ); /* 500 us for oscillator to stabilise */
526
537
0 commit comments