On Wed, Apr 06, 2022 at 11:39:16PM +0200, Javier Martinez Canillas wrote:
These can be used by subsystems to unregister a platform device registered by sysfb and also to disable future platform device registration in sysfb.
Suggested-by: Daniel Vetter daniel.vetter@ffwll.ch Signed-off-by: Javier Martinez Canillas javierm@redhat.com
drivers/firmware/sysfb.c | 47 +++++++++++++++++++++++++++++++++++----- include/linux/sysfb.h | 19 ++++++++++++++++ 2 files changed, 60 insertions(+), 6 deletions(-)
diff --git a/drivers/firmware/sysfb.c b/drivers/firmware/sysfb.c index b032f40a92de..08ae78c083f1 100644 --- a/drivers/firmware/sysfb.c +++ b/drivers/firmware/sysfb.c @@ -34,21 +34,52 @@ #include <linux/screen_info.h> #include <linux/sysfb.h>
+static struct platform_device *pd; +static DEFINE_MUTEX(load_lock); +static bool disabled;
+void sysfb_disable(void) +{
- mutex_lock(&load_lock);
- disabled = true;
- mutex_unlock(&load_lock);
+} +EXPORT_SYMBOL_GPL(sysfb_disable);
+bool sysfb_try_unregister(struct device *dev) +{
- bool ret = true;
- mutex_lock(&load_lock);
- if (!pd || pd != to_platform_device(dev))
return false;
- platform_device_unregister(to_platform_device(dev));
- pd = NULL;
- mutex_unlock(&load_lock);
- return ret;
+} +EXPORT_SYMBOL_GPL(sysfb_try_unregister);
Kerneldoc for these plus adding that to Documentation/firmware/other_interfaces.rst would be really neat.
With that added Reviewed-by: Daniel Vetter daniel.vetter@ffwll.ch
static __init int sysfb_init(void) { struct screen_info *si = &screen_info; struct simplefb_platform_data mode;
- struct platform_device *pd; const char *name; bool compatible;
- int ret;
int ret = 0;
mutex_lock(&load_lock);
if (disabled)
goto unlock_mutex;
/* try to create a simple-framebuffer device */ compatible = sysfb_parse_mode(si, &mode); if (compatible) { pd = sysfb_create_simplefb(si, &mode); if (!IS_ERR(pd))
return 0;
goto unlock_mutex;
}
/* if the FB is incompatible, create a legacy framebuffer device */
@@ -60,8 +91,10 @@ static __init int sysfb_init(void) name = "platform-framebuffer";
pd = platform_device_alloc(name, 0);
- if (!pd)
return -ENOMEM;
if (!pd) {
ret = -ENOMEM;
goto unlock_mutex;
}
sysfb_apply_efi_quirks(pd);
@@ -73,9 +106,11 @@ static __init int sysfb_init(void) if (ret) goto err;
- return 0;
- goto unlock_mutex;
err: platform_device_put(pd); +unlock_mutex:
- mutex_unlock(&load_lock); return ret;
}
diff --git a/include/linux/sysfb.h b/include/linux/sysfb.h index 708152e9037b..e8c0313fac8f 100644 --- a/include/linux/sysfb.h +++ b/include/linux/sysfb.h @@ -55,6 +55,25 @@ struct efifb_dmi_info { int flags; };
+#ifdef CONFIG_SYSFB
+void sysfb_disable(void); +bool sysfb_try_unregister(struct device *dev);
+#else /* CONFIG_SYSFB */
+static inline void sysfb_disable(void) +{
+}
+static inline bool sysfb_try_unregister(struct device *dev) +{
- return false;
+}
+#endif /* CONFIG_SYSFB */
#ifdef CONFIG_EFI
extern struct efifb_dmi_info efifb_dmi_list[];
2.35.1