@@ -117,7 +117,8 @@ enum stu300_error {
117
117
STU300_ERROR_NONE = 0 ,
118
118
STU300_ERROR_ACKNOWLEDGE_FAILURE ,
119
119
STU300_ERROR_BUS_ERROR ,
120
- STU300_ERROR_ARBITRATION_LOST
120
+ STU300_ERROR_ARBITRATION_LOST ,
121
+ STU300_ERROR_UNKNOWN
121
122
};
122
123
123
124
/* timeout waiting for the controller to respond */
@@ -127,7 +128,7 @@ enum stu300_error {
127
128
* The number of address send athemps tried before giving up.
128
129
* If the first one failes it seems like 5 to 8 attempts are required.
129
130
*/
130
- #define NUM_ADDR_RESEND_ATTEMPTS 10
131
+ #define NUM_ADDR_RESEND_ATTEMPTS 12
131
132
132
133
/* I2C clock speed, in Hz 0-400kHz*/
133
134
static unsigned int scl_frequency = 100000 ;
@@ -149,6 +150,7 @@ module_param(scl_frequency, uint, 0644);
149
150
* @msg_index: index of current message
150
151
* @msg_len: length of current message
151
152
*/
153
+
152
154
struct stu300_dev {
153
155
struct platform_device * pdev ;
154
156
struct i2c_adapter adapter ;
@@ -188,6 +190,27 @@ static inline u32 stu300_r8(void __iomem *address)
188
190
return readl (address ) & 0x000000FFU ;
189
191
}
190
192
193
+ static void stu300_irq_enable (struct stu300_dev * dev )
194
+ {
195
+ u32 val ;
196
+ val = stu300_r8 (dev -> virtbase + I2C_CR );
197
+ val |= I2C_CR_INTERRUPT_ENABLE ;
198
+ /* Twice paranoia (possible HW glitch) */
199
+ stu300_wr8 (val , dev -> virtbase + I2C_CR );
200
+ stu300_wr8 (val , dev -> virtbase + I2C_CR );
201
+ }
202
+
203
+ static void stu300_irq_disable (struct stu300_dev * dev )
204
+ {
205
+ u32 val ;
206
+ val = stu300_r8 (dev -> virtbase + I2C_CR );
207
+ val &= ~I2C_CR_INTERRUPT_ENABLE ;
208
+ /* Twice paranoia (possible HW glitch) */
209
+ stu300_wr8 (val , dev -> virtbase + I2C_CR );
210
+ stu300_wr8 (val , dev -> virtbase + I2C_CR );
211
+ }
212
+
213
+
191
214
/*
192
215
* Tells whether a certain event or events occurred in
193
216
* response to a command. The events represent states in
@@ -196,21 +219,39 @@ static inline u32 stu300_r8(void __iomem *address)
196
219
* documentation and can only be treated as abstract state
197
220
* machine states.
198
221
*
199
- * @ret 0 = event has not occurred, any other value means
200
- * the event occurred.
222
+ * @ret 0 = event has not occurred or unknown error, any
223
+ * other value means the correct event occurred or an error .
201
224
*/
225
+
202
226
static int stu300_event_occurred (struct stu300_dev * dev ,
203
227
enum stu300_event mr_event ) {
204
228
u32 status1 ;
205
229
u32 status2 ;
206
230
207
231
/* What event happened? */
208
232
status1 = stu300_r8 (dev -> virtbase + I2C_SR1 );
233
+
209
234
if (!(status1 & I2C_SR1_EVF_IND ))
210
235
/* No event at all */
211
236
return 0 ;
237
+
212
238
status2 = stu300_r8 (dev -> virtbase + I2C_SR2 );
213
239
240
+ /* Block any multiple interrupts */
241
+ stu300_irq_disable (dev );
242
+
243
+ /* Check for errors first */
244
+ if (status2 & I2C_SR2_AF_IND ) {
245
+ dev -> cmd_err = STU300_ERROR_ACKNOWLEDGE_FAILURE ;
246
+ return 1 ;
247
+ } else if (status2 & I2C_SR2_BERR_IND ) {
248
+ dev -> cmd_err = STU300_ERROR_BUS_ERROR ;
249
+ return 1 ;
250
+ } else if (status2 & I2C_SR2_ARLO_IND ) {
251
+ dev -> cmd_err = STU300_ERROR_ARBITRATION_LOST ;
252
+ return 1 ;
253
+ }
254
+
214
255
switch (mr_event ) {
215
256
case STU300_EVENT_1 :
216
257
if (status1 & I2C_SR1_ADSL_IND )
@@ -221,10 +262,6 @@ static int stu300_event_occurred(struct stu300_dev *dev,
221
262
case STU300_EVENT_7 :
222
263
case STU300_EVENT_8 :
223
264
if (status1 & I2C_SR1_BTF_IND ) {
224
- if (status2 & I2C_SR2_AF_IND )
225
- dev -> cmd_err = STU300_ERROR_ACKNOWLEDGE_FAILURE ;
226
- else if (status2 & I2C_SR2_BERR_IND )
227
- dev -> cmd_err = STU300_ERROR_BUS_ERROR ;
228
265
return 1 ;
229
266
}
230
267
break ;
@@ -240,8 +277,6 @@ static int stu300_event_occurred(struct stu300_dev *dev,
240
277
case STU300_EVENT_6 :
241
278
if (status2 & I2C_SR2_ENDAD_IND ) {
242
279
/* First check for any errors */
243
- if (status2 & I2C_SR2_AF_IND )
244
- dev -> cmd_err = STU300_ERROR_ACKNOWLEDGE_FAILURE ;
245
280
return 1 ;
246
281
}
247
282
break ;
@@ -252,8 +287,15 @@ static int stu300_event_occurred(struct stu300_dev *dev,
252
287
default :
253
288
break ;
254
289
}
255
- if (status2 & I2C_SR2_ARLO_IND )
256
- dev -> cmd_err = STU300_ERROR_ARBITRATION_LOST ;
290
+ /* If we get here, we're on thin ice.
291
+ * Here we are in a status where we have
292
+ * gotten a response that does not match
293
+ * what we requested.
294
+ */
295
+ dev -> cmd_err = STU300_ERROR_UNKNOWN ;
296
+ dev_err (& dev -> pdev -> dev ,
297
+ "Unhandled interrupt! %d sr1: 0x%x sr2: 0x%x\n" ,
298
+ mr_event , status1 , status2 );
257
299
return 0 ;
258
300
}
259
301
@@ -262,21 +304,20 @@ static irqreturn_t stu300_irh(int irq, void *data)
262
304
struct stu300_dev * dev = data ;
263
305
int res ;
264
306
307
+ /* Just make sure that the block is clocked */
308
+ clk_enable (dev -> clk );
309
+
265
310
/* See if this was what we were waiting for */
266
311
spin_lock (& dev -> cmd_issue_lock );
267
- if (dev -> cmd_event != STU300_EVENT_NONE ) {
268
- res = stu300_event_occurred (dev , dev -> cmd_event );
269
- if (res || dev -> cmd_err != STU300_ERROR_NONE ) {
270
- u32 val ;
271
-
272
- complete (& dev -> cmd_complete );
273
- /* Block any multiple interrupts */
274
- val = stu300_r8 (dev -> virtbase + I2C_CR );
275
- val &= ~I2C_CR_INTERRUPT_ENABLE ;
276
- stu300_wr8 (val , dev -> virtbase + I2C_CR );
277
- }
278
- }
312
+
313
+ res = stu300_event_occurred (dev , dev -> cmd_event );
314
+ if (res || dev -> cmd_err != STU300_ERROR_NONE )
315
+ complete (& dev -> cmd_complete );
316
+
279
317
spin_unlock (& dev -> cmd_issue_lock );
318
+
319
+ clk_disable (dev -> clk );
320
+
280
321
return IRQ_HANDLED ;
281
322
}
282
323
@@ -308,7 +349,6 @@ static int stu300_start_and_await_event(struct stu300_dev *dev,
308
349
stu300_wr8 (cr_value , dev -> virtbase + I2C_CR );
309
350
ret = wait_for_completion_interruptible_timeout (& dev -> cmd_complete ,
310
351
STU300_TIMEOUT );
311
-
312
352
if (ret < 0 ) {
313
353
dev_err (& dev -> pdev -> dev ,
314
354
"wait_for_completion_interruptible_timeout() "
@@ -342,7 +382,6 @@ static int stu300_await_event(struct stu300_dev *dev,
342
382
enum stu300_event mr_event )
343
383
{
344
384
int ret ;
345
- u32 val ;
346
385
347
386
if (unlikely (irqs_disabled ())) {
348
387
/* TODO: implement polling for this case if need be. */
@@ -354,36 +393,18 @@ static int stu300_await_event(struct stu300_dev *dev,
354
393
/* Is it already here? */
355
394
spin_lock_irq (& dev -> cmd_issue_lock );
356
395
dev -> cmd_err = STU300_ERROR_NONE ;
357
- if (stu300_event_occurred (dev , mr_event )) {
358
- spin_unlock_irq (& dev -> cmd_issue_lock );
359
- goto exit_await_check_err ;
360
- }
361
- init_completion (& dev -> cmd_complete );
362
- dev -> cmd_err = STU300_ERROR_NONE ;
363
396
dev -> cmd_event = mr_event ;
364
397
365
- /* Turn on the I2C interrupt for current operation */
366
- val = stu300_r8 (dev -> virtbase + I2C_CR );
367
- val |= I2C_CR_INTERRUPT_ENABLE ;
368
- stu300_wr8 (val , dev -> virtbase + I2C_CR );
369
-
370
- /* Twice paranoia (possible HW glitch) */
371
- stu300_wr8 (val , dev -> virtbase + I2C_CR );
398
+ init_completion (& dev -> cmd_complete );
372
399
373
- /* Check again: is it already here? */
374
- if (unlikely (stu300_event_occurred (dev , mr_event ))) {
375
- /* Disable IRQ again. */
376
- val &= ~I2C_CR_INTERRUPT_ENABLE ;
377
- stu300_wr8 (val , dev -> virtbase + I2C_CR );
378
- spin_unlock_irq (& dev -> cmd_issue_lock );
379
- goto exit_await_check_err ;
380
- }
400
+ /* Turn on the I2C interrupt for current operation */
401
+ stu300_irq_enable (dev );
381
402
382
403
/* Unlock the command block and wait for the event to occur */
383
404
spin_unlock_irq (& dev -> cmd_issue_lock );
405
+
384
406
ret = wait_for_completion_interruptible_timeout (& dev -> cmd_complete ,
385
407
STU300_TIMEOUT );
386
-
387
408
if (ret < 0 ) {
388
409
dev_err (& dev -> pdev -> dev ,
389
410
"wait_for_completion_interruptible_timeout()"
@@ -401,7 +422,6 @@ static int stu300_await_event(struct stu300_dev *dev,
401
422
return - ETIMEDOUT ;
402
423
}
403
424
404
- exit_await_check_err :
405
425
if (dev -> cmd_err != STU300_ERROR_NONE ) {
406
426
if (mr_event != STU300_EVENT_6 ) {
407
427
dev_err (& dev -> pdev -> dev , "controller "
@@ -457,18 +477,19 @@ struct stu300_clkset {
457
477
};
458
478
459
479
static const struct stu300_clkset stu300_clktable [] = {
460
- { 0 , 0xFFU },
461
- { 2500000 , I2C_OAR2_FR_25_10MHZ },
462
- { 10000000 , I2C_OAR2_FR_10_1667MHZ },
463
- { 16670000 , I2C_OAR2_FR_1667_2667MHZ },
464
- { 26670000 , I2C_OAR2_FR_2667_40MHZ },
465
- { 40000000 , I2C_OAR2_FR_40_5333MHZ },
466
- { 53330000 , I2C_OAR2_FR_5333_66MHZ },
467
- { 66000000 , I2C_OAR2_FR_66_80MHZ },
468
- { 80000000 , I2C_OAR2_FR_80_100MHZ },
480
+ { 0 , 0xFFU },
481
+ { 2500000 , I2C_OAR2_FR_25_10MHZ },
482
+ { 10000000 , I2C_OAR2_FR_10_1667MHZ },
483
+ { 16670000 , I2C_OAR2_FR_1667_2667MHZ },
484
+ { 26670000 , I2C_OAR2_FR_2667_40MHZ },
485
+ { 40000000 , I2C_OAR2_FR_40_5333MHZ },
486
+ { 53330000 , I2C_OAR2_FR_5333_66MHZ },
487
+ { 66000000 , I2C_OAR2_FR_66_80MHZ },
488
+ { 80000000 , I2C_OAR2_FR_80_100MHZ },
469
489
{ 100000000 , 0xFFU },
470
490
};
471
491
492
+
472
493
static int stu300_set_clk (struct stu300_dev * dev , unsigned long clkrate )
473
494
{
474
495
@@ -494,10 +515,10 @@ static int stu300_set_clk(struct stu300_dev *dev, unsigned long clkrate)
494
515
495
516
if (dev -> speed > 100000 )
496
517
/* Fast Mode I2C */
497
- val = ((clkrate /dev -> speed )- 9 )/3 ;
518
+ val = ((clkrate /dev -> speed ) - 9 )/3 + 1 ;
498
519
else
499
520
/* Standard Mode I2C */
500
- val = ((clkrate /dev -> speed )- 7 )/2 ;
521
+ val = ((clkrate /dev -> speed ) - 7 )/2 + 1 ;
501
522
502
523
/* According to spec the divider must be > 2 */
503
524
if (val < 0x002 ) {
@@ -557,6 +578,7 @@ static int stu300_init_hw(struct stu300_dev *dev)
557
578
*/
558
579
clkrate = clk_get_rate (dev -> clk );
559
580
ret = stu300_set_clk (dev , clkrate );
581
+
560
582
if (ret )
561
583
return ret ;
562
584
/*
@@ -641,7 +663,6 @@ static int stu300_xfer_msg(struct i2c_adapter *adap,
641
663
int attempts = 0 ;
642
664
struct stu300_dev * dev = i2c_get_adapdata (adap );
643
665
644
-
645
666
clk_enable (dev -> clk );
646
667
647
668
/* Remove this if (0) to trace each and every message. */
@@ -715,14 +736,15 @@ static int stu300_xfer_msg(struct i2c_adapter *adap,
715
736
716
737
if (attempts < NUM_ADDR_RESEND_ATTEMPTS && attempts > 0 ) {
717
738
dev_dbg (& dev -> pdev -> dev , "managed to get address "
718
- "through after %d attempts\n" , attempts );
739
+ "through after %d attempts\n" , attempts );
719
740
} else if (attempts == NUM_ADDR_RESEND_ATTEMPTS ) {
720
741
dev_dbg (& dev -> pdev -> dev , "I give up, tried %d times "
721
- "to resend address.\n" ,
722
- NUM_ADDR_RESEND_ATTEMPTS );
742
+ "to resend address.\n" ,
743
+ NUM_ADDR_RESEND_ATTEMPTS );
723
744
goto exit_disable ;
724
745
}
725
746
747
+
726
748
if (msg -> flags & I2C_M_RD ) {
727
749
/* READ: we read the actual bytes one at a time */
728
750
for (i = 0 ; i < msg -> len ; i ++ ) {
@@ -804,8 +826,10 @@ static int stu300_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs,
804
826
{
805
827
int ret = -1 ;
806
828
int i ;
829
+
807
830
struct stu300_dev * dev = i2c_get_adapdata (adap );
808
831
dev -> msg_len = num ;
832
+
809
833
for (i = 0 ; i < num ; i ++ ) {
810
834
/*
811
835
* Another driver appears to send stop for each message,
@@ -817,6 +841,7 @@ static int stu300_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs,
817
841
dev -> msg_index = i ;
818
842
819
843
ret = stu300_xfer_msg (adap , & msgs [i ], (i == (num - 1 )));
844
+
820
845
if (ret != 0 ) {
821
846
num = ret ;
822
847
break ;
@@ -845,6 +870,7 @@ stu300_probe(struct platform_device *pdev)
845
870
struct resource * res ;
846
871
int bus_nr ;
847
872
int ret = 0 ;
873
+ char clk_name [] = "I2C0" ;
848
874
849
875
dev = kzalloc (sizeof (struct stu300_dev ), GFP_KERNEL );
850
876
if (!dev ) {
@@ -854,7 +880,8 @@ stu300_probe(struct platform_device *pdev)
854
880
}
855
881
856
882
bus_nr = pdev -> id ;
857
- dev -> clk = clk_get (& pdev -> dev , NULL );
883
+ clk_name [3 ] += (char )bus_nr ;
884
+ dev -> clk = clk_get (& pdev -> dev , clk_name );
858
885
if (IS_ERR (dev -> clk )) {
859
886
ret = PTR_ERR (dev -> clk );
860
887
dev_err (& pdev -> dev , "could not retrieve i2c bus clock\n" );
0 commit comments