diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/media/video/saa7127.c | 83 |
1 files changed, 13 insertions, 70 deletions
diff --git a/drivers/media/video/saa7127.c b/drivers/media/video/saa7127.c index e35ef321ec71..958ecc7168c3 100644 --- a/drivers/media/video/saa7127.c +++ b/drivers/media/video/saa7127.c | |||
@@ -55,6 +55,7 @@ | |||
55 | #include <linux/videodev2.h> | 55 | #include <linux/videodev2.h> |
56 | #include <media/v4l2-common.h> | 56 | #include <media/v4l2-common.h> |
57 | #include <media/v4l2-chip-ident.h> | 57 | #include <media/v4l2-chip-ident.h> |
58 | #include <media/v4l2-i2c-drv-legacy.h> | ||
58 | #include <media/saa7127.h> | 59 | #include <media/saa7127.h> |
59 | 60 | ||
60 | static int debug = 0; | 61 | static int debug = 0; |
@@ -662,31 +663,19 @@ static int saa7127_command(struct i2c_client *client, | |||
662 | 663 | ||
663 | /* ----------------------------------------------------------------------- */ | 664 | /* ----------------------------------------------------------------------- */ |
664 | 665 | ||
665 | static struct i2c_driver i2c_driver_saa7127; | 666 | static int saa7127_probe(struct i2c_client *client) |
666 | |||
667 | /* ----------------------------------------------------------------------- */ | ||
668 | |||
669 | static int saa7127_attach(struct i2c_adapter *adapter, int address, int kind) | ||
670 | { | 667 | { |
671 | struct i2c_client *client; | ||
672 | struct saa7127_state *state; | 668 | struct saa7127_state *state; |
673 | struct v4l2_sliced_vbi_data vbi = { 0, 0, 0, 0 }; /* set to disabled */ | 669 | struct v4l2_sliced_vbi_data vbi = { 0, 0, 0, 0 }; /* set to disabled */ |
674 | int read_result = 0; | 670 | int read_result = 0; |
675 | 671 | ||
676 | /* Check if the adapter supports the needed features */ | 672 | /* Check if the adapter supports the needed features */ |
677 | if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) | 673 | if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE_DATA)) |
678 | return 0; | 674 | return 0; |
679 | 675 | ||
680 | client = kzalloc(sizeof(struct i2c_client), GFP_KERNEL); | ||
681 | if (client == 0) | ||
682 | return -ENOMEM; | ||
683 | |||
684 | client->addr = address; | ||
685 | client->adapter = adapter; | ||
686 | client->driver = &i2c_driver_saa7127; | ||
687 | snprintf(client->name, sizeof(client->name) - 1, "saa7127"); | 676 | snprintf(client->name, sizeof(client->name) - 1, "saa7127"); |
688 | 677 | ||
689 | v4l_dbg(1, debug, client, "detecting saa7127 client on address 0x%x\n", address << 1); | 678 | v4l_dbg(1, debug, client, "detecting saa7127 client on address 0x%x\n", client->addr << 1); |
690 | 679 | ||
691 | /* First test register 0: Bits 5-7 are a version ID (should be 0), | 680 | /* First test register 0: Bits 5-7 are a version ID (should be 0), |
692 | and bit 2 should also be 0. | 681 | and bit 2 should also be 0. |
@@ -696,13 +685,11 @@ static int saa7127_attach(struct i2c_adapter *adapter, int address, int kind) | |||
696 | if ((saa7127_read(client, 0) & 0xe4) != 0 || | 685 | if ((saa7127_read(client, 0) & 0xe4) != 0 || |
697 | (saa7127_read(client, 0x29) & 0x3f) != 0x1d) { | 686 | (saa7127_read(client, 0x29) & 0x3f) != 0x1d) { |
698 | v4l_dbg(1, debug, client, "saa7127 not found\n"); | 687 | v4l_dbg(1, debug, client, "saa7127 not found\n"); |
699 | kfree(client); | ||
700 | return 0; | 688 | return 0; |
701 | } | 689 | } |
702 | state = kzalloc(sizeof(struct saa7127_state), GFP_KERNEL); | 690 | state = kzalloc(sizeof(struct saa7127_state), GFP_KERNEL); |
703 | 691 | ||
704 | if (state == NULL) { | 692 | if (state == NULL) { |
705 | kfree(client); | ||
706 | return (-ENOMEM); | 693 | return (-ENOMEM); |
707 | } | 694 | } |
708 | 695 | ||
@@ -731,78 +718,34 @@ static int saa7127_attach(struct i2c_adapter *adapter, int address, int kind) | |||
731 | read_result = saa7127_read(client, SAA7129_REG_FADE_KEY_COL2); | 718 | read_result = saa7127_read(client, SAA7129_REG_FADE_KEY_COL2); |
732 | saa7127_write(client, SAA7129_REG_FADE_KEY_COL2, 0xaa); | 719 | saa7127_write(client, SAA7129_REG_FADE_KEY_COL2, 0xaa); |
733 | if (saa7127_read(client, SAA7129_REG_FADE_KEY_COL2) == 0xaa) { | 720 | if (saa7127_read(client, SAA7129_REG_FADE_KEY_COL2) == 0xaa) { |
734 | v4l_info(client, "saa7129 found @ 0x%x (%s)\n", address << 1, adapter->name); | 721 | v4l_info(client, "saa7129 found @ 0x%x (%s)\n", client->addr << 1, client->adapter->name); |
735 | saa7127_write(client, SAA7129_REG_FADE_KEY_COL2, read_result); | 722 | saa7127_write(client, SAA7129_REG_FADE_KEY_COL2, read_result); |
736 | saa7127_write_inittab(client, saa7129_init_config_extra); | 723 | saa7127_write_inittab(client, saa7129_init_config_extra); |
737 | state->ident = V4L2_IDENT_SAA7129; | 724 | state->ident = V4L2_IDENT_SAA7129; |
738 | } else { | 725 | } else { |
739 | v4l_info(client, "saa7127 found @ 0x%x (%s)\n", address << 1, adapter->name); | 726 | v4l_info(client, "saa7127 found @ 0x%x (%s)\n", client->addr << 1, client->adapter->name); |
740 | state->ident = V4L2_IDENT_SAA7127; | 727 | state->ident = V4L2_IDENT_SAA7127; |
741 | } | 728 | } |
742 | |||
743 | i2c_attach_client(client); | ||
744 | |||
745 | return 0; | ||
746 | } | ||
747 | |||
748 | /* ----------------------------------------------------------------------- */ | ||
749 | |||
750 | static int saa7127_probe(struct i2c_adapter *adapter) | ||
751 | { | ||
752 | if (adapter->class & I2C_CLASS_TV_ANALOG) | ||
753 | return i2c_probe(adapter, &addr_data, saa7127_attach); | ||
754 | return 0; | 729 | return 0; |
755 | } | 730 | } |
756 | 731 | ||
757 | /* ----------------------------------------------------------------------- */ | 732 | /* ----------------------------------------------------------------------- */ |
758 | 733 | ||
759 | static int saa7127_detach(struct i2c_client *client) | 734 | static int saa7127_remove(struct i2c_client *client) |
760 | { | 735 | { |
761 | struct saa7127_state *state = i2c_get_clientdata(client); | ||
762 | int err; | ||
763 | |||
764 | /* Turn off TV output */ | 736 | /* Turn off TV output */ |
765 | saa7127_set_video_enable(client, 0); | 737 | saa7127_set_video_enable(client, 0); |
766 | 738 | kfree(i2c_get_clientdata(client)); | |
767 | err = i2c_detach_client(client); | ||
768 | |||
769 | if (err) { | ||
770 | return err; | ||
771 | } | ||
772 | |||
773 | kfree(state); | ||
774 | kfree(client); | ||
775 | return 0; | 739 | return 0; |
776 | } | 740 | } |
777 | 741 | ||
778 | /* ----------------------------------------------------------------------- */ | 742 | /* ----------------------------------------------------------------------- */ |
779 | 743 | ||
780 | static struct i2c_driver i2c_driver_saa7127 = { | 744 | static struct v4l2_i2c_driver_data v4l2_i2c_data = { |
781 | .driver = { | 745 | .name = "saa7127", |
782 | .name = "saa7127", | 746 | .driverid = I2C_DRIVERID_SAA7127, |
783 | }, | ||
784 | .id = I2C_DRIVERID_SAA7127, | ||
785 | .attach_adapter = saa7127_probe, | ||
786 | .detach_client = saa7127_detach, | ||
787 | .command = saa7127_command, | 747 | .command = saa7127_command, |
748 | .probe = saa7127_probe, | ||
749 | .remove = saa7127_remove, | ||
788 | }; | 750 | }; |
789 | 751 | ||
790 | |||
791 | /* ----------------------------------------------------------------------- */ | ||
792 | |||
793 | static int __init saa7127_init_module(void) | ||
794 | { | ||
795 | return i2c_add_driver(&i2c_driver_saa7127); | ||
796 | } | ||
797 | |||
798 | /* ----------------------------------------------------------------------- */ | ||
799 | |||
800 | static void __exit saa7127_cleanup_module(void) | ||
801 | { | ||
802 | i2c_del_driver(&i2c_driver_saa7127); | ||
803 | } | ||
804 | |||
805 | /* ----------------------------------------------------------------------- */ | ||
806 | |||
807 | module_init(saa7127_init_module); | ||
808 | module_exit(saa7127_cleanup_module); | ||