aboutsummaryrefslogtreecommitdiffstats
path: root/arch/cris/arch-v32/drivers/i2c.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/cris/arch-v32/drivers/i2c.c')
-rw-r--r--arch/cris/arch-v32/drivers/i2c.c61
1 files changed, 12 insertions, 49 deletions
diff --git a/arch/cris/arch-v32/drivers/i2c.c b/arch/cris/arch-v32/drivers/i2c.c
index 4eda3236792a..c2fb7a5c1396 100644
--- a/arch/cris/arch-v32/drivers/i2c.c
+++ b/arch/cris/arch-v32/drivers/i2c.c
@@ -395,14 +395,10 @@ i2c_write(unsigned char theSlave, void *data, size_t nbytes)
395 unsigned char value; 395 unsigned char value;
396 unsigned long flags; 396 unsigned long flags;
397 397
398 spin_lock(&i2c_lock); 398 spin_lock_irqsave(&i2c_lock, flags);
399 399
400 do { 400 do {
401 error = 0; 401 error = 0;
402 /*
403 * we don't like to be interrupted
404 */
405 local_irq_save(flags);
406 402
407 i2c_start(); 403 i2c_start();
408 /* 404 /*
@@ -430,16 +426,12 @@ i2c_write(unsigned char theSlave, void *data, size_t nbytes)
430 * end byte stream 426 * end byte stream
431 */ 427 */
432 i2c_stop(); 428 i2c_stop();
433 /*
434 * enable interrupt again
435 */
436 local_irq_restore(flags);
437 429
438 } while (error && cntr--); 430 } while (error && cntr--);
439 431
440 i2c_delay(CLOCK_LOW_TIME); 432 i2c_delay(CLOCK_LOW_TIME);
441 433
442 spin_unlock(&i2c_lock); 434 spin_unlock_irqrestore(&i2c_lock, flags);
443 435
444 return -error; 436 return -error;
445} 437}
@@ -459,16 +451,12 @@ i2c_read(unsigned char theSlave, void *data, size_t nbytes)
459 int error, cntr = 3; 451 int error, cntr = 3;
460 unsigned long flags; 452 unsigned long flags;
461 453
462 spin_lock(&i2c_lock); 454 spin_lock_irqsave(&i2c_lock, flags);
463 455
464 do { 456 do {
465 error = 0; 457 error = 0;
466 memset(data, 0, nbytes); 458 memset(data, 0, nbytes);
467 /* 459 /*
468 * we don't like to be interrupted
469 */
470 local_irq_save(flags);
471 /*
472 * generate start condition 460 * generate start condition
473 */ 461 */
474 i2c_start(); 462 i2c_start();
@@ -500,13 +488,9 @@ i2c_read(unsigned char theSlave, void *data, size_t nbytes)
500 * end sequence 488 * end sequence
501 */ 489 */
502 i2c_stop(); 490 i2c_stop();
503 /*
504 * enable interrupt again
505 */
506 local_irq_restore(flags);
507 } while (error && cntr--); 491 } while (error && cntr--);
508 492
509 spin_unlock(&i2c_lock); 493 spin_unlock_irqrestore(&i2c_lock, flags);
510 494
511 return -error; 495 return -error;
512} 496}
@@ -525,14 +509,10 @@ i2c_writereg(unsigned char theSlave, unsigned char theReg,
525 int error, cntr = 3; 509 int error, cntr = 3;
526 unsigned long flags; 510 unsigned long flags;
527 511
528 spin_lock(&i2c_lock); 512 spin_lock_irqsave(&i2c_lock, flags);
529 513
530 do { 514 do {
531 error = 0; 515 error = 0;
532 /*
533 * we don't like to be interrupted
534 */
535 local_irq_save(flags);
536 516
537 i2c_start(); 517 i2c_start();
538 /* 518 /*
@@ -567,15 +547,11 @@ i2c_writereg(unsigned char theSlave, unsigned char theReg,
567 * end byte stream 547 * end byte stream
568 */ 548 */
569 i2c_stop(); 549 i2c_stop();
570 /*
571 * enable interrupt again
572 */
573 local_irq_restore(flags);
574 } while(error && cntr--); 550 } while(error && cntr--);
575 551
576 i2c_delay(CLOCK_LOW_TIME); 552 i2c_delay(CLOCK_LOW_TIME);
577 553
578 spin_unlock(&i2c_lock); 554 spin_unlock_irqrestore(&i2c_lock, flags);
579 555
580 return -error; 556 return -error;
581} 557}
@@ -594,15 +570,11 @@ i2c_readreg(unsigned char theSlave, unsigned char theReg)
594 int error, cntr = 3; 570 int error, cntr = 3;
595 unsigned long flags; 571 unsigned long flags;
596 572
597 spin_lock(&i2c_lock); 573 spin_lock_irqsave(&i2c_lock, flags);
598 574
599 do { 575 do {
600 error = 0; 576 error = 0;
601 /* 577 /*
602 * we don't like to be interrupted
603 */
604 local_irq_save(flags);
605 /*
606 * generate start condition 578 * generate start condition
607 */ 579 */
608 i2c_start(); 580 i2c_start();
@@ -653,14 +625,10 @@ i2c_readreg(unsigned char theSlave, unsigned char theReg)
653 * end sequence 625 * end sequence
654 */ 626 */
655 i2c_stop(); 627 i2c_stop();
656 /*
657 * enable interrupt again
658 */
659 local_irq_restore(flags);
660 628
661 } while(error && cntr--); 629 } while(error && cntr--);
662 630
663 spin_unlock(&i2c_lock); 631 spin_unlock_irqrestore(&i2c_lock, flags);
664 632
665 return b; 633 return b;
666} 634}
@@ -685,7 +653,7 @@ i2c_ioctl(struct inode *inode, struct file *file,
685 unsigned int cmd, unsigned long arg) 653 unsigned int cmd, unsigned long arg)
686{ 654{
687 if(_IOC_TYPE(cmd) != ETRAXI2C_IOCTYPE) { 655 if(_IOC_TYPE(cmd) != ETRAXI2C_IOCTYPE) {
688 return -EINVAL; 656 return -ENOTTY;
689 } 657 }
690 658
691 switch (_IOC_NR(cmd)) { 659 switch (_IOC_NR(cmd)) {
@@ -725,8 +693,7 @@ static const struct file_operations i2c_fops = {
725 .release = i2c_release, 693 .release = i2c_release,
726}; 694};
727 695
728int __init 696static int __init i2c_init(void)
729i2c_init(void)
730{ 697{
731 static int res; 698 static int res;
732 static int first = 1; 699 static int first = 1;
@@ -750,10 +717,8 @@ i2c_init(void)
750} 717}
751 718
752 719
753int __init 720static int __init i2c_register(void)
754i2c_register(void)
755{ 721{
756
757 int res; 722 int res;
758 723
759 res = i2c_init(); 724 res = i2c_init();
@@ -763,7 +728,7 @@ i2c_register(void)
763 /* register char device */ 728 /* register char device */
764 729
765 res = register_chrdev(I2C_MAJOR, i2c_name, &i2c_fops); 730 res = register_chrdev(I2C_MAJOR, i2c_name, &i2c_fops);
766 if(res < 0) { 731 if (res < 0) {
767 printk(KERN_ERR "i2c: couldn't get a major number.\n"); 732 printk(KERN_ERR "i2c: couldn't get a major number.\n");
768 return res; 733 return res;
769 } 734 }
@@ -773,9 +738,7 @@ i2c_register(void)
773 738
774 return 0; 739 return 0;
775} 740}
776
777/* this makes sure that i2c_init is called during boot */ 741/* this makes sure that i2c_init is called during boot */
778
779module_init(i2c_register); 742module_init(i2c_register);
780 743
781/****************** END OF FILE i2c.c ********************************/ 744/****************** END OF FILE i2c.c ********************************/