diff options
author | Aaro Koskinen <aaro.koskinen@iki.fi> | 2011-02-17 16:29:11 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2011-02-18 15:38:17 -0500 |
commit | bb29223453061b9b738e3659f7810c1f61165df2 (patch) | |
tree | e0b7a23023383a604cdb290913f8b763bfce3c99 /drivers/staging/xgifb/XGI_main_26.c | |
parent | decebabf24ca179749dcac8a3fb87f7186bdf898 (diff) |
staging: xgifb: xgifb_probe() error paths missing framebuffer_release()
framebuffer_release() is missing from error paths.
Signed-off-by: Aaro Koskinen <aaro.koskinen@iki.fi>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/staging/xgifb/XGI_main_26.c')
-rw-r--r-- | drivers/staging/xgifb/XGI_main_26.c | 39 |
1 files changed, 28 insertions, 11 deletions
diff --git a/drivers/staging/xgifb/XGI_main_26.c b/drivers/staging/xgifb/XGI_main_26.c index ee008e5a0cb..c245de4fafc 100644 --- a/drivers/staging/xgifb/XGI_main_26.c +++ b/drivers/staging/xgifb/XGI_main_26.c | |||
@@ -2935,6 +2935,8 @@ static int __devinit xgifb_probe(struct pci_dev *pdev, | |||
2935 | u16 reg16; | 2935 | u16 reg16; |
2936 | u8 reg, reg1; | 2936 | u8 reg, reg1; |
2937 | u8 CR48, CR38; | 2937 | u8 CR48, CR38; |
2938 | int ret; | ||
2939 | |||
2938 | if (XGIfb_off) | 2940 | if (XGIfb_off) |
2939 | return -ENXIO; | 2941 | return -ENXIO; |
2940 | 2942 | ||
@@ -2966,8 +2968,10 @@ static int __devinit xgifb_probe(struct pci_dev *pdev, | |||
2966 | printk("XGIfb: Relocate IO address: %lx [%08lx]\n", | 2968 | printk("XGIfb: Relocate IO address: %lx [%08lx]\n", |
2967 | (unsigned long)pci_resource_start(pdev, 2), XGI_Pr.RelIO); | 2969 | (unsigned long)pci_resource_start(pdev, 2), XGI_Pr.RelIO); |
2968 | 2970 | ||
2969 | if (pci_enable_device(pdev)) | 2971 | if (pci_enable_device(pdev)) { |
2970 | return -EIO; | 2972 | ret = -EIO; |
2973 | goto error; | ||
2974 | } | ||
2971 | 2975 | ||
2972 | XGIRegInit(&XGI_Pr, (unsigned long)XGIhw_ext.pjIOAddress); | 2976 | XGIRegInit(&XGI_Pr, (unsigned long)XGIhw_ext.pjIOAddress); |
2973 | 2977 | ||
@@ -2976,7 +2980,8 @@ static int __devinit xgifb_probe(struct pci_dev *pdev, | |||
2976 | 2980 | ||
2977 | if (reg1 != 0xa1) { /*I/O error */ | 2981 | if (reg1 != 0xa1) { /*I/O error */ |
2978 | printk("\nXGIfb: I/O error!!!"); | 2982 | printk("\nXGIfb: I/O error!!!"); |
2979 | return -EIO; | 2983 | ret = -EIO; |
2984 | goto error; | ||
2980 | } | 2985 | } |
2981 | 2986 | ||
2982 | switch (xgi_video_info.chip_id) { | 2987 | switch (xgi_video_info.chip_id) { |
@@ -3011,7 +3016,8 @@ static int __devinit xgifb_probe(struct pci_dev *pdev, | |||
3011 | XGIfb_CRT2_write_enable = IND_XGI_CRT2_WRITE_ENABLE_315; | 3016 | XGIfb_CRT2_write_enable = IND_XGI_CRT2_WRITE_ENABLE_315; |
3012 | break; | 3017 | break; |
3013 | default: | 3018 | default: |
3014 | return -ENODEV; | 3019 | ret = -ENODEV; |
3020 | goto error; | ||
3015 | } | 3021 | } |
3016 | 3022 | ||
3017 | printk("XGIfb:chipid = %x\n", xgi_video_info.chip); | 3023 | printk("XGIfb:chipid = %x\n", xgi_video_info.chip); |
@@ -3052,7 +3058,8 @@ static int __devinit xgifb_probe(struct pci_dev *pdev, | |||
3052 | XGIhw_ext.pSR = vmalloc(sizeof(struct XGI_DSReg) * SR_BUFFER_SIZE); | 3058 | XGIhw_ext.pSR = vmalloc(sizeof(struct XGI_DSReg) * SR_BUFFER_SIZE); |
3053 | if (XGIhw_ext.pSR == NULL) { | 3059 | if (XGIhw_ext.pSR == NULL) { |
3054 | printk(KERN_ERR "XGIfb: Fatal error: Allocating SRReg space failed.\n"); | 3060 | printk(KERN_ERR "XGIfb: Fatal error: Allocating SRReg space failed.\n"); |
3055 | return -ENODEV; | 3061 | ret = -ENODEV; |
3062 | goto error; | ||
3056 | } | 3063 | } |
3057 | XGIhw_ext.pSR[0].jIdx = XGIhw_ext.pSR[0].jVal = 0xFF; | 3064 | XGIhw_ext.pSR[0].jIdx = XGIhw_ext.pSR[0].jVal = 0xFF; |
3058 | 3065 | ||
@@ -3060,7 +3067,8 @@ static int __devinit xgifb_probe(struct pci_dev *pdev, | |||
3060 | if (XGIhw_ext.pCR == NULL) { | 3067 | if (XGIhw_ext.pCR == NULL) { |
3061 | vfree(XGIhw_ext.pSR); | 3068 | vfree(XGIhw_ext.pSR); |
3062 | printk(KERN_ERR "XGIfb: Fatal error: Allocating CRReg space failed.\n"); | 3069 | printk(KERN_ERR "XGIfb: Fatal error: Allocating CRReg space failed.\n"); |
3063 | return -ENODEV; | 3070 | ret = -ENODEV; |
3071 | goto error; | ||
3064 | } | 3072 | } |
3065 | XGIhw_ext.pCR[0].jIdx = XGIhw_ext.pCR[0].jVal = 0xFF; | 3073 | XGIhw_ext.pCR[0].jIdx = XGIhw_ext.pCR[0].jVal = 0xFF; |
3066 | 3074 | ||
@@ -3100,7 +3108,8 @@ static int __devinit xgifb_probe(struct pci_dev *pdev, | |||
3100 | vfree(XGIhw_ext.pSR); | 3108 | vfree(XGIhw_ext.pSR); |
3101 | vfree(XGIhw_ext.pCR); | 3109 | vfree(XGIhw_ext.pCR); |
3102 | printk(KERN_INFO "XGIfb: Fatal error: Unable to determine RAM size.\n"); | 3110 | printk(KERN_INFO "XGIfb: Fatal error: Unable to determine RAM size.\n"); |
3103 | return -ENODEV; | 3111 | ret = -ENODEV; |
3112 | goto error; | ||
3104 | } | 3113 | } |
3105 | 3114 | ||
3106 | if ((xgifb_mode_idx < 0) || ((XGIbios_mode[xgifb_mode_idx].mode_no) != 0xFF)) { | 3115 | if ((xgifb_mode_idx < 0) || ((XGIbios_mode[xgifb_mode_idx].mode_no) != 0xFF)) { |
@@ -3118,7 +3127,8 @@ static int __devinit xgifb_probe(struct pci_dev *pdev, | |||
3118 | printk(KERN_ERR "XGIfb: Is there another framebuffer driver active?\n"); | 3127 | printk(KERN_ERR "XGIfb: Is there another framebuffer driver active?\n"); |
3119 | vfree(XGIhw_ext.pSR); | 3128 | vfree(XGIhw_ext.pSR); |
3120 | vfree(XGIhw_ext.pCR); | 3129 | vfree(XGIhw_ext.pCR); |
3121 | return -ENODEV; | 3130 | ret = -ENODEV; |
3131 | goto error; | ||
3122 | } | 3132 | } |
3123 | 3133 | ||
3124 | if (!request_mem_region(xgi_video_info.mmio_base, XGIfb_mmio_size, "XGIfb MMIO")) { | 3134 | if (!request_mem_region(xgi_video_info.mmio_base, XGIfb_mmio_size, "XGIfb MMIO")) { |
@@ -3126,7 +3136,8 @@ static int __devinit xgifb_probe(struct pci_dev *pdev, | |||
3126 | release_mem_region(xgi_video_info.video_base, xgi_video_info.video_size); | 3136 | release_mem_region(xgi_video_info.video_base, xgi_video_info.video_size); |
3127 | vfree(XGIhw_ext.pSR); | 3137 | vfree(XGIhw_ext.pSR); |
3128 | vfree(XGIhw_ext.pCR); | 3138 | vfree(XGIhw_ext.pCR); |
3129 | return -ENODEV; | 3139 | ret = -ENODEV; |
3140 | goto error; | ||
3130 | } | 3141 | } |
3131 | 3142 | ||
3132 | xgi_video_info.video_vbase = XGIhw_ext.pjVideoMemoryAddress = | 3143 | xgi_video_info.video_vbase = XGIhw_ext.pjVideoMemoryAddress = |
@@ -3413,8 +3424,10 @@ static int __devinit xgifb_probe(struct pci_dev *pdev, | |||
3413 | printk(KERN_INFO "XGIfb: Added MTRRs\n"); | 3424 | printk(KERN_INFO "XGIfb: Added MTRRs\n"); |
3414 | #endif | 3425 | #endif |
3415 | 3426 | ||
3416 | if (register_framebuffer(fb_info) < 0) | 3427 | if (register_framebuffer(fb_info) < 0) { |
3417 | return -EINVAL; | 3428 | ret = -EINVAL; |
3429 | goto error; | ||
3430 | } | ||
3418 | 3431 | ||
3419 | XGIfb_registered = 1; | 3432 | XGIfb_registered = 1; |
3420 | 3433 | ||
@@ -3426,6 +3439,10 @@ static int __devinit xgifb_probe(struct pci_dev *pdev, | |||
3426 | dumpVGAReg(); | 3439 | dumpVGAReg(); |
3427 | 3440 | ||
3428 | return 0; | 3441 | return 0; |
3442 | |||
3443 | error: | ||
3444 | framebuffer_release(fb_info); | ||
3445 | return ret; | ||
3429 | } | 3446 | } |
3430 | 3447 | ||
3431 | /*****************************************************/ | 3448 | /*****************************************************/ |