firmware: sysfb: Fix reference count of sysfb parent device
Retrieving the system framebuffer's parent device in sysfb_init() increments the parent device's reference count. Hence release the reference before leaving the init function. Adding the sysfb platform device acquires and additional reference for the parent. This keeps the parent device around while the system framebuffer is in use. Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de> Fixes: 9eac534db001 ("firmware/sysfb: Set firmware-framebuffer parent device") Cc: Thomas Zimmermann <tzimmermann@suse.de> Cc: Javier Martinez Canillas <javierm@redhat.com> Cc: Helge Deller <deller@gmx.de> Cc: Jani Nikula <jani.nikula@intel.com> Cc: Dan Carpenter <dan.carpenter@linaro.org> Cc: Arnd Bergmann <arnd@arndb.de> Cc: Sui Jingfeng <suijingfeng@loongson.cn> Cc: <stable@vger.kernel.org> # v6.9+ Reviewed-by: Javier Martinez Canillas <javierm@redhat.com> Link: https://patchwork.freedesktop.org/patch/msgid/20240625081818.15696-1-tzimmermann@suse.de
This commit is contained in:
parent
66edf3fb33
commit
3285d8f0a2
@ -101,8 +101,10 @@ static __init struct device *sysfb_parent_dev(const struct screen_info *si)
|
|||||||
if (IS_ERR(pdev)) {
|
if (IS_ERR(pdev)) {
|
||||||
return ERR_CAST(pdev);
|
return ERR_CAST(pdev);
|
||||||
} else if (pdev) {
|
} else if (pdev) {
|
||||||
if (!sysfb_pci_dev_is_enabled(pdev))
|
if (!sysfb_pci_dev_is_enabled(pdev)) {
|
||||||
|
pci_dev_put(pdev);
|
||||||
return ERR_PTR(-ENODEV);
|
return ERR_PTR(-ENODEV);
|
||||||
|
}
|
||||||
return &pdev->dev;
|
return &pdev->dev;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -137,7 +139,7 @@ static __init int sysfb_init(void)
|
|||||||
if (compatible) {
|
if (compatible) {
|
||||||
pd = sysfb_create_simplefb(si, &mode, parent);
|
pd = sysfb_create_simplefb(si, &mode, parent);
|
||||||
if (!IS_ERR(pd))
|
if (!IS_ERR(pd))
|
||||||
goto unlock_mutex;
|
goto put_device;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* if the FB is incompatible, create a legacy framebuffer device */
|
/* if the FB is incompatible, create a legacy framebuffer device */
|
||||||
@ -155,7 +157,7 @@ static __init int sysfb_init(void)
|
|||||||
pd = platform_device_alloc(name, 0);
|
pd = platform_device_alloc(name, 0);
|
||||||
if (!pd) {
|
if (!pd) {
|
||||||
ret = -ENOMEM;
|
ret = -ENOMEM;
|
||||||
goto unlock_mutex;
|
goto put_device;
|
||||||
}
|
}
|
||||||
|
|
||||||
pd->dev.parent = parent;
|
pd->dev.parent = parent;
|
||||||
@ -170,9 +172,11 @@ static __init int sysfb_init(void)
|
|||||||
if (ret)
|
if (ret)
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
goto unlock_mutex;
|
goto put_device;
|
||||||
err:
|
err:
|
||||||
platform_device_put(pd);
|
platform_device_put(pd);
|
||||||
|
put_device:
|
||||||
|
put_device(parent);
|
||||||
unlock_mutex:
|
unlock_mutex:
|
||||||
mutex_unlock(&disable_lock);
|
mutex_unlock(&disable_lock);
|
||||||
return ret;
|
return ret;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user