ALSA: ASoC: Fix cs4270 error path

The error path in cs4270_probe/cs4270_remove is pretty broken:
* If cs4270_probe fails, codec is leaked.
* If snd_soc_register_card fails, cs4270_i2c_driver stays registered.
* If I2C support is enabled but no I2C device is found, i2c_del_driver
is never called (neither in cs4270_probe nor in cs4270_remove.

Fix all 3 problems by implementing a clean error path in cs4270_probe
and jumping to its labels as needed.

Signed-off-by: Jean Delvare <khali@linux-fr.org>
Acked-by: Timur Tabi <timur@freescale.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>

authored by Jean Delvare and committed by Takashi Iwai e3145dfb 9778e9a0

+18 -7
+18 -7
sound/soc/codecs/cs4270.c
··· 681 681 ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1); 682 682 if (ret < 0) { 683 683 printk(KERN_ERR "cs4270: failed to create PCMs\n"); 684 - return ret; 684 + goto error_free_codec; 685 685 } 686 686 687 687 #ifdef USE_I2C ··· 690 690 ret = i2c_add_driver(&cs4270_i2c_driver); 691 691 if (ret) { 692 692 printk(KERN_ERR "cs4270: failed to attach driver"); 693 - snd_soc_free_pcms(socdev); 694 - return ret; 693 + goto error_free_pcms; 695 694 } 696 695 697 696 /* Did we find a CS4270 on the I2C bus? */ ··· 712 713 ret = snd_soc_register_card(socdev); 713 714 if (ret < 0) { 714 715 printk(KERN_ERR "cs4270: failed to register card\n"); 715 - snd_soc_free_pcms(socdev); 716 - return ret; 716 + goto error_del_driver; 717 717 } 718 + 719 + return 0; 720 + 721 + error_del_driver: 722 + #ifdef USE_I2C 723 + i2c_del_driver(&cs4270_i2c_driver); 724 + 725 + error_free_pcms: 726 + #endif 727 + snd_soc_free_pcms(socdev); 728 + 729 + error_free_codec: 730 + kfree(socdev->codec); 731 + socdev->codec = NULL; 718 732 719 733 return ret; 720 734 } ··· 739 727 snd_soc_free_pcms(socdev); 740 728 741 729 #ifdef USE_I2C 742 - if (socdev->codec->control_data) 743 - i2c_del_driver(&cs4270_i2c_driver); 730 + i2c_del_driver(&cs4270_i2c_driver); 744 731 #endif 745 732 746 733 kfree(socdev->codec);