diff options
| -rw-r--r-- | arch/cris/arch-v32/drivers/i2c.c | 61 |
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 | ||
| 728 | int __init | 696 | static int __init i2c_init(void) |
| 729 | i2c_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 | ||
| 753 | int __init | 720 | static int __init i2c_register(void) |
| 754 | i2c_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 | |||
| 779 | module_init(i2c_register); | 742 | module_init(i2c_register); |
| 780 | 743 | ||
| 781 | /****************** END OF FILE i2c.c ********************************/ | 744 | /****************** END OF FILE i2c.c ********************************/ |
