drm: Move client code to clients/ subdirectory
authorThomas Zimmermann <tzimmermann@suse.de>
Fri, 8 Nov 2024 15:42:37 +0000 (16:42 +0100)
committerThomas Zimmermann <tzimmermann@suse.de>
Fri, 15 Nov 2024 08:42:11 +0000 (09:42 +0100)
Just move some files around to keep source code well organized. Plus
fix a type in the help text of CONFIG_DRM_FBDEV_LEAK_PHYS_SMEM. No
functional changes.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: Jocelyn Falempe <jfalempe@redhat.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20241108154600.126162-2-tzimmermann@suse.de
drivers/gpu/drm/Kconfig
drivers/gpu/drm/Makefile
drivers/gpu/drm/clients/Kconfig [new file with mode: 0644]
drivers/gpu/drm/clients/Makefile [new file with mode: 0644]
drivers/gpu/drm/clients/drm_client_setup.c [new file with mode: 0644]
drivers/gpu/drm/clients/drm_fbdev_client.c [new file with mode: 0644]
drivers/gpu/drm/drm_client_setup.c [deleted file]
drivers/gpu/drm/drm_fbdev_client.c [deleted file]

index 5504721..fd294cc 100644 (file)
@@ -217,77 +217,7 @@ config DRM_CLIENT
          option. Drivers that support the default clients should
          select DRM_CLIENT_SELECTION instead.
 
-config DRM_CLIENT_LIB
-       tristate
-       depends on DRM
-       select DRM_KMS_HELPER if DRM_FBDEV_EMULATION
-       select FB_CORE if DRM_FBDEV_EMULATION
-       help
-         This option enables the DRM client library and selects all
-         modules and components according to the enabled clients.
-
-config DRM_CLIENT_SELECTION
-       tristate
-       depends on DRM
-       select DRM_CLIENT_LIB if DRM_FBDEV_EMULATION
-       help
-         Drivers that support in-kernel DRM clients have to select this
-         option.
-
-config DRM_CLIENT_SETUP
-       bool
-       depends on DRM_CLIENT_SELECTION
-       help
-         Enables the DRM client selection. DRM drivers that support the
-         default clients should select DRM_CLIENT_SELECTION instead.
-
-menu "Supported DRM clients"
-       depends on DRM_CLIENT_SELECTION
-
-config DRM_FBDEV_EMULATION
-       bool "Enable legacy fbdev support for your modesetting driver"
-       depends on DRM_CLIENT_SELECTION
-       select DRM_CLIENT
-       select DRM_CLIENT_SETUP
-       select FRAMEBUFFER_CONSOLE_DETECT_PRIMARY if FRAMEBUFFER_CONSOLE
-       default FB
-       help
-         Choose this option if you have a need for the legacy fbdev
-         support. Note that this support also provides the linux console
-         support on top of your modesetting driver.
-
-         If in doubt, say "Y".
-
-config DRM_FBDEV_OVERALLOC
-       int "Overallocation of the fbdev buffer"
-       depends on DRM_FBDEV_EMULATION
-       default 100
-       help
-         Defines the fbdev buffer overallocation in percent. Default
-         is 100. Typical values for double buffering will be 200,
-         triple buffering 300.
-
-config DRM_FBDEV_LEAK_PHYS_SMEM
-       bool "Shamelessly allow leaking of fbdev physical address (DANGEROUS)"
-       depends on DRM_FBDEV_EMULATION && EXPERT
-       default n
-       help
-         In order to keep user-space compatibility, we want in certain
-         use-cases to keep leaking the fbdev physical address to the
-         user-space program handling the fbdev buffer.
-         This affects, not only, Amlogic, Allwinner or Rockchip devices
-         with ARM Mali GPUs using an userspace Blob.
-         This option is not supported by upstream developers and should be
-         removed as soon as possible and be considered as a broken and
-         legacy behaviour from a modern fbdev device driver.
-
-         Please send any bug reports when using this to your proprietary
-         software vendor that requires this.
-
-         If in doubt, say "N" or spread the word to your closed source
-         library vendor.
-
-endmenu
+source "drivers/gpu/drm/clients/Kconfig"
 
 config DRM_LOAD_EDID_FIRMWARE
        bool "Allow to specify an EDID data set instead of probing for it"
index 463afad..4f6585b 100644 (file)
@@ -148,14 +148,6 @@ drm_kms_helper-$(CONFIG_DRM_PANEL_BRIDGE) += bridge/panel.o
 drm_kms_helper-$(CONFIG_DRM_FBDEV_EMULATION) += drm_fb_helper.o
 obj-$(CONFIG_DRM_KMS_HELPER) += drm_kms_helper.o
 
-#
-# DRM clients
-#
-
-drm_client_lib-y := drm_client_setup.o
-drm_client_lib-$(CONFIG_DRM_FBDEV_EMULATION) += drm_fbdev_client.o
-obj-$(CONFIG_DRM_CLIENT_LIB) += drm_client_lib.o
-
 #
 # Drivers and the rest
 #
@@ -165,6 +157,7 @@ obj-y                       += tests/
 obj-$(CONFIG_DRM_MIPI_DBI) += drm_mipi_dbi.o
 obj-$(CONFIG_DRM_MIPI_DSI) += drm_mipi_dsi.o
 obj-y                  += arm/
+obj-y                  += clients/
 obj-y                  += display/
 obj-$(CONFIG_DRM_TTM)  += ttm/
 obj-$(CONFIG_DRM_SCHED)        += scheduler/
diff --git a/drivers/gpu/drm/clients/Kconfig b/drivers/gpu/drm/clients/Kconfig
new file mode 100644 (file)
index 0000000..01ad3b0
--- /dev/null
@@ -0,0 +1,73 @@
+# SPDX-License-Identifier: GPL-2.0-only
+
+config DRM_CLIENT_LIB
+       tristate
+       depends on DRM
+       select DRM_KMS_HELPER if DRM_FBDEV_EMULATION
+       select FB_CORE if DRM_FBDEV_EMULATION
+       help
+         This option enables the DRM client library and selects all
+         modules and components according to the enabled clients.
+
+config DRM_CLIENT_SELECTION
+       tristate
+       depends on DRM
+       select DRM_CLIENT_LIB if DRM_FBDEV_EMULATION
+       help
+         Drivers that support in-kernel DRM clients have to select this
+         option.
+
+config DRM_CLIENT_SETUP
+       bool
+       depends on DRM_CLIENT_SELECTION
+       help
+         Enables the DRM client selection. DRM drivers that support the
+         default clients should select DRM_CLIENT_SELECTION instead.
+
+menu "Supported DRM clients"
+       depends on DRM_CLIENT_SELECTION
+
+config DRM_FBDEV_EMULATION
+       bool "Enable legacy fbdev support for your modesetting driver"
+       depends on DRM_CLIENT_SELECTION
+       select DRM_CLIENT
+       select DRM_CLIENT_SETUP
+       select FRAMEBUFFER_CONSOLE_DETECT_PRIMARY if FRAMEBUFFER_CONSOLE
+       default FB
+       help
+         Choose this option if you have a need for the legacy fbdev
+         support. Note that this support also provides the linux console
+         support on top of your modesetting driver.
+
+         If in doubt, say "Y".
+
+config DRM_FBDEV_OVERALLOC
+       int "Overallocation of the fbdev buffer"
+       depends on DRM_FBDEV_EMULATION
+       default 100
+       help
+         Defines the fbdev buffer overallocation in percent. Default
+         is 100. Typical values for double buffering will be 200,
+         triple buffering 300.
+
+config DRM_FBDEV_LEAK_PHYS_SMEM
+       bool "Shamelessly allow leaking of fbdev physical address (DANGEROUS)"
+       depends on DRM_FBDEV_EMULATION && EXPERT
+       default n
+       help
+         In order to keep user-space compatibility, we want in certain
+         use-cases to keep leaking the fbdev physical address to the
+         user-space program handling the fbdev buffer.
+         This affects, not only, Amlogic, Allwinner or Rockchip devices
+         with ARM Mali GPUs using a userspace Blob.
+         This option is not supported by upstream developers and should be
+         removed as soon as possible and be considered as a broken and
+         legacy behaviour from a modern fbdev device driver.
+
+         Please send any bug reports when using this to your proprietary
+         software vendor that requires this.
+
+         If in doubt, say "N" or spread the word to your closed source
+         library vendor.
+
+endmenu
diff --git a/drivers/gpu/drm/clients/Makefile b/drivers/gpu/drm/clients/Makefile
new file mode 100644 (file)
index 0000000..1d004ec
--- /dev/null
@@ -0,0 +1,5 @@
+# SPDX-License-Identifier: GPL-2.0
+
+drm_client_lib-y := drm_client_setup.o
+drm_client_lib-$(CONFIG_DRM_FBDEV_EMULATION) += drm_fbdev_client.o
+obj-$(CONFIG_DRM_CLIENT_LIB) += drm_client_lib.o
diff --git a/drivers/gpu/drm/clients/drm_client_setup.c b/drivers/gpu/drm/clients/drm_client_setup.c
new file mode 100644 (file)
index 0000000..c14221c
--- /dev/null
@@ -0,0 +1,69 @@
+// SPDX-License-Identifier: MIT
+
+#include <drm/drm_client_setup.h>
+#include <drm/drm_device.h>
+#include <drm/drm_fbdev_client.h>
+#include <drm/drm_fourcc.h>
+#include <drm/drm_print.h>
+
+/**
+ * drm_client_setup() - Setup in-kernel DRM clients
+ * @dev: DRM device
+ * @format: Preferred pixel format for the device. Use NULL, unless
+ *          there is clearly a driver-preferred format.
+ *
+ * This function sets up the in-kernel DRM clients. Restore, hotplug
+ * events and teardown are all taken care of.
+ *
+ * Drivers should call drm_client_setup() after registering the new
+ * DRM device with drm_dev_register(). This function is safe to call
+ * even when there are no connectors present. Setup will be retried
+ * on the next hotplug event.
+ *
+ * The clients are destroyed by drm_dev_unregister().
+ */
+void drm_client_setup(struct drm_device *dev, const struct drm_format_info *format)
+{
+       int ret;
+
+       ret = drm_fbdev_client_setup(dev, format);
+       if (ret)
+               drm_warn(dev, "Failed to set up DRM client; error %d\n", ret);
+}
+EXPORT_SYMBOL(drm_client_setup);
+
+/**
+ * drm_client_setup_with_fourcc() - Setup in-kernel DRM clients for color mode
+ * @dev: DRM device
+ * @fourcc: Preferred pixel format as 4CC code for the device
+ *
+ * This function sets up the in-kernel DRM clients. It is equivalent
+ * to drm_client_setup(), but expects a 4CC code as second argument.
+ */
+void drm_client_setup_with_fourcc(struct drm_device *dev, u32 fourcc)
+{
+       drm_client_setup(dev, drm_format_info(fourcc));
+}
+EXPORT_SYMBOL(drm_client_setup_with_fourcc);
+
+/**
+ * drm_client_setup_with_color_mode() - Setup in-kernel DRM clients for color mode
+ * @dev: DRM device
+ * @color_mode: Preferred color mode for the device
+ *
+ * This function sets up the in-kernel DRM clients. It is equivalent
+ * to drm_client_setup(), but expects a color mode as second argument.
+ *
+ * Do not use this function in new drivers. Prefer drm_client_setup() with a
+ * format of NULL.
+ */
+void drm_client_setup_with_color_mode(struct drm_device *dev, unsigned int color_mode)
+{
+       u32 fourcc = drm_driver_color_mode_format(dev, color_mode);
+
+       drm_client_setup_with_fourcc(dev, fourcc);
+}
+EXPORT_SYMBOL(drm_client_setup_with_color_mode);
+
+MODULE_DESCRIPTION("In-kernel DRM clients");
+MODULE_LICENSE("GPL and additional rights");
diff --git a/drivers/gpu/drm/clients/drm_fbdev_client.c b/drivers/gpu/drm/clients/drm_fbdev_client.c
new file mode 100644 (file)
index 0000000..246fb63
--- /dev/null
@@ -0,0 +1,167 @@
+// SPDX-License-Identifier: MIT
+
+#include <drm/drm_client.h>
+#include <drm/drm_crtc_helper.h>
+#include <drm/drm_drv.h>
+#include <drm/drm_fbdev_client.h>
+#include <drm/drm_fb_helper.h>
+#include <drm/drm_fourcc.h>
+#include <drm/drm_print.h>
+
+/*
+ * struct drm_client_funcs
+ */
+
+static void drm_fbdev_client_unregister(struct drm_client_dev *client)
+{
+       struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client);
+
+       if (fb_helper->info) {
+               drm_fb_helper_unregister_info(fb_helper);
+       } else {
+               drm_client_release(&fb_helper->client);
+               drm_fb_helper_unprepare(fb_helper);
+               kfree(fb_helper);
+       }
+}
+
+static int drm_fbdev_client_restore(struct drm_client_dev *client)
+{
+       drm_fb_helper_lastclose(client->dev);
+
+       return 0;
+}
+
+static int drm_fbdev_client_hotplug(struct drm_client_dev *client)
+{
+       struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client);
+       struct drm_device *dev = client->dev;
+       int ret;
+
+       if (dev->fb_helper)
+               return drm_fb_helper_hotplug_event(dev->fb_helper);
+
+       ret = drm_fb_helper_init(dev, fb_helper);
+       if (ret)
+               goto err_drm_err;
+
+       if (!drm_drv_uses_atomic_modeset(dev))
+               drm_helper_disable_unused_functions(dev);
+
+       ret = drm_fb_helper_initial_config(fb_helper);
+       if (ret)
+               goto err_drm_fb_helper_fini;
+
+       return 0;
+
+err_drm_fb_helper_fini:
+       drm_fb_helper_fini(fb_helper);
+err_drm_err:
+       drm_err(dev, "fbdev: Failed to setup emulation (ret=%d)\n", ret);
+       return ret;
+}
+
+static int drm_fbdev_client_suspend(struct drm_client_dev *client, bool holds_console_lock)
+{
+       struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client);
+
+       if (holds_console_lock)
+               drm_fb_helper_set_suspend(fb_helper, true);
+       else
+               drm_fb_helper_set_suspend_unlocked(fb_helper, true);
+
+       return 0;
+}
+
+static int drm_fbdev_client_resume(struct drm_client_dev *client, bool holds_console_lock)
+{
+       struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client);
+
+       if (holds_console_lock)
+               drm_fb_helper_set_suspend(fb_helper, false);
+       else
+               drm_fb_helper_set_suspend_unlocked(fb_helper, false);
+
+       return 0;
+}
+
+static const struct drm_client_funcs drm_fbdev_client_funcs = {
+       .owner          = THIS_MODULE,
+       .unregister     = drm_fbdev_client_unregister,
+       .restore        = drm_fbdev_client_restore,
+       .hotplug        = drm_fbdev_client_hotplug,
+       .suspend        = drm_fbdev_client_suspend,
+       .resume         = drm_fbdev_client_resume,
+};
+
+/**
+ * drm_fbdev_client_setup() - Setup fbdev emulation
+ * @dev: DRM device
+ * @format: Preferred color format for the device. DRM_FORMAT_XRGB8888
+ *          is used if this is zero.
+ *
+ * This function sets up fbdev emulation. Restore, hotplug events and
+ * teardown are all taken care of. Drivers that do suspend/resume need
+ * to call drm_client_dev_suspend() and drm_client_dev_resume() by
+ * themselves. Simple drivers might use drm_mode_config_helper_suspend().
+ *
+ * This function is safe to call even when there are no connectors present.
+ * Setup will be retried on the next hotplug event.
+ *
+ * The fbdev client is destroyed by drm_dev_unregister().
+ *
+ * Returns:
+ * 0 on success, or a negative errno code otherwise.
+ */
+int drm_fbdev_client_setup(struct drm_device *dev, const struct drm_format_info *format)
+{
+       struct drm_fb_helper *fb_helper;
+       unsigned int color_mode;
+       int ret;
+
+       /* TODO: Use format info throughout DRM */
+       if (format) {
+               unsigned int bpp = drm_format_info_bpp(format, 0);
+
+               switch (bpp) {
+               case 16:
+                       color_mode = format->depth; // could also be 15
+                       break;
+               default:
+                       color_mode = bpp;
+               }
+       } else {
+               switch (dev->mode_config.preferred_depth) {
+               case 0:
+               case 24:
+                       color_mode = 32;
+                       break;
+               default:
+                       color_mode = dev->mode_config.preferred_depth;
+               }
+       }
+
+       drm_WARN(dev, !dev->registered, "Device has not been registered.\n");
+       drm_WARN(dev, dev->fb_helper, "fb_helper is already set!\n");
+
+       fb_helper = kzalloc(sizeof(*fb_helper), GFP_KERNEL);
+       if (!fb_helper)
+               return -ENOMEM;
+       drm_fb_helper_prepare(dev, fb_helper, color_mode, NULL);
+
+       ret = drm_client_init(dev, &fb_helper->client, "fbdev", &drm_fbdev_client_funcs);
+       if (ret) {
+               drm_err(dev, "Failed to register client: %d\n", ret);
+               goto err_drm_client_init;
+       }
+
+       drm_client_register(&fb_helper->client);
+
+       return 0;
+
+err_drm_client_init:
+       drm_fb_helper_unprepare(fb_helper);
+       kfree(fb_helper);
+       return ret;
+}
+EXPORT_SYMBOL(drm_fbdev_client_setup);
diff --git a/drivers/gpu/drm/drm_client_setup.c b/drivers/gpu/drm/drm_client_setup.c
deleted file mode 100644 (file)
index c14221c..0000000
+++ /dev/null
@@ -1,69 +0,0 @@
-// SPDX-License-Identifier: MIT
-
-#include <drm/drm_client_setup.h>
-#include <drm/drm_device.h>
-#include <drm/drm_fbdev_client.h>
-#include <drm/drm_fourcc.h>
-#include <drm/drm_print.h>
-
-/**
- * drm_client_setup() - Setup in-kernel DRM clients
- * @dev: DRM device
- * @format: Preferred pixel format for the device. Use NULL, unless
- *          there is clearly a driver-preferred format.
- *
- * This function sets up the in-kernel DRM clients. Restore, hotplug
- * events and teardown are all taken care of.
- *
- * Drivers should call drm_client_setup() after registering the new
- * DRM device with drm_dev_register(). This function is safe to call
- * even when there are no connectors present. Setup will be retried
- * on the next hotplug event.
- *
- * The clients are destroyed by drm_dev_unregister().
- */
-void drm_client_setup(struct drm_device *dev, const struct drm_format_info *format)
-{
-       int ret;
-
-       ret = drm_fbdev_client_setup(dev, format);
-       if (ret)
-               drm_warn(dev, "Failed to set up DRM client; error %d\n", ret);
-}
-EXPORT_SYMBOL(drm_client_setup);
-
-/**
- * drm_client_setup_with_fourcc() - Setup in-kernel DRM clients for color mode
- * @dev: DRM device
- * @fourcc: Preferred pixel format as 4CC code for the device
- *
- * This function sets up the in-kernel DRM clients. It is equivalent
- * to drm_client_setup(), but expects a 4CC code as second argument.
- */
-void drm_client_setup_with_fourcc(struct drm_device *dev, u32 fourcc)
-{
-       drm_client_setup(dev, drm_format_info(fourcc));
-}
-EXPORT_SYMBOL(drm_client_setup_with_fourcc);
-
-/**
- * drm_client_setup_with_color_mode() - Setup in-kernel DRM clients for color mode
- * @dev: DRM device
- * @color_mode: Preferred color mode for the device
- *
- * This function sets up the in-kernel DRM clients. It is equivalent
- * to drm_client_setup(), but expects a color mode as second argument.
- *
- * Do not use this function in new drivers. Prefer drm_client_setup() with a
- * format of NULL.
- */
-void drm_client_setup_with_color_mode(struct drm_device *dev, unsigned int color_mode)
-{
-       u32 fourcc = drm_driver_color_mode_format(dev, color_mode);
-
-       drm_client_setup_with_fourcc(dev, fourcc);
-}
-EXPORT_SYMBOL(drm_client_setup_with_color_mode);
-
-MODULE_DESCRIPTION("In-kernel DRM clients");
-MODULE_LICENSE("GPL and additional rights");
diff --git a/drivers/gpu/drm/drm_fbdev_client.c b/drivers/gpu/drm/drm_fbdev_client.c
deleted file mode 100644 (file)
index 246fb63..0000000
+++ /dev/null
@@ -1,167 +0,0 @@
-// SPDX-License-Identifier: MIT
-
-#include <drm/drm_client.h>
-#include <drm/drm_crtc_helper.h>
-#include <drm/drm_drv.h>
-#include <drm/drm_fbdev_client.h>
-#include <drm/drm_fb_helper.h>
-#include <drm/drm_fourcc.h>
-#include <drm/drm_print.h>
-
-/*
- * struct drm_client_funcs
- */
-
-static void drm_fbdev_client_unregister(struct drm_client_dev *client)
-{
-       struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client);
-
-       if (fb_helper->info) {
-               drm_fb_helper_unregister_info(fb_helper);
-       } else {
-               drm_client_release(&fb_helper->client);
-               drm_fb_helper_unprepare(fb_helper);
-               kfree(fb_helper);
-       }
-}
-
-static int drm_fbdev_client_restore(struct drm_client_dev *client)
-{
-       drm_fb_helper_lastclose(client->dev);
-
-       return 0;
-}
-
-static int drm_fbdev_client_hotplug(struct drm_client_dev *client)
-{
-       struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client);
-       struct drm_device *dev = client->dev;
-       int ret;
-
-       if (dev->fb_helper)
-               return drm_fb_helper_hotplug_event(dev->fb_helper);
-
-       ret = drm_fb_helper_init(dev, fb_helper);
-       if (ret)
-               goto err_drm_err;
-
-       if (!drm_drv_uses_atomic_modeset(dev))
-               drm_helper_disable_unused_functions(dev);
-
-       ret = drm_fb_helper_initial_config(fb_helper);
-       if (ret)
-               goto err_drm_fb_helper_fini;
-
-       return 0;
-
-err_drm_fb_helper_fini:
-       drm_fb_helper_fini(fb_helper);
-err_drm_err:
-       drm_err(dev, "fbdev: Failed to setup emulation (ret=%d)\n", ret);
-       return ret;
-}
-
-static int drm_fbdev_client_suspend(struct drm_client_dev *client, bool holds_console_lock)
-{
-       struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client);
-
-       if (holds_console_lock)
-               drm_fb_helper_set_suspend(fb_helper, true);
-       else
-               drm_fb_helper_set_suspend_unlocked(fb_helper, true);
-
-       return 0;
-}
-
-static int drm_fbdev_client_resume(struct drm_client_dev *client, bool holds_console_lock)
-{
-       struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client);
-
-       if (holds_console_lock)
-               drm_fb_helper_set_suspend(fb_helper, false);
-       else
-               drm_fb_helper_set_suspend_unlocked(fb_helper, false);
-
-       return 0;
-}
-
-static const struct drm_client_funcs drm_fbdev_client_funcs = {
-       .owner          = THIS_MODULE,
-       .unregister     = drm_fbdev_client_unregister,
-       .restore        = drm_fbdev_client_restore,
-       .hotplug        = drm_fbdev_client_hotplug,
-       .suspend        = drm_fbdev_client_suspend,
-       .resume         = drm_fbdev_client_resume,
-};
-
-/**
- * drm_fbdev_client_setup() - Setup fbdev emulation
- * @dev: DRM device
- * @format: Preferred color format for the device. DRM_FORMAT_XRGB8888
- *          is used if this is zero.
- *
- * This function sets up fbdev emulation. Restore, hotplug events and
- * teardown are all taken care of. Drivers that do suspend/resume need
- * to call drm_client_dev_suspend() and drm_client_dev_resume() by
- * themselves. Simple drivers might use drm_mode_config_helper_suspend().
- *
- * This function is safe to call even when there are no connectors present.
- * Setup will be retried on the next hotplug event.
- *
- * The fbdev client is destroyed by drm_dev_unregister().
- *
- * Returns:
- * 0 on success, or a negative errno code otherwise.
- */
-int drm_fbdev_client_setup(struct drm_device *dev, const struct drm_format_info *format)
-{
-       struct drm_fb_helper *fb_helper;
-       unsigned int color_mode;
-       int ret;
-
-       /* TODO: Use format info throughout DRM */
-       if (format) {
-               unsigned int bpp = drm_format_info_bpp(format, 0);
-
-               switch (bpp) {
-               case 16:
-                       color_mode = format->depth; // could also be 15
-                       break;
-               default:
-                       color_mode = bpp;
-               }
-       } else {
-               switch (dev->mode_config.preferred_depth) {
-               case 0:
-               case 24:
-                       color_mode = 32;
-                       break;
-               default:
-                       color_mode = dev->mode_config.preferred_depth;
-               }
-       }
-
-       drm_WARN(dev, !dev->registered, "Device has not been registered.\n");
-       drm_WARN(dev, dev->fb_helper, "fb_helper is already set!\n");
-
-       fb_helper = kzalloc(sizeof(*fb_helper), GFP_KERNEL);
-       if (!fb_helper)
-               return -ENOMEM;
-       drm_fb_helper_prepare(dev, fb_helper, color_mode, NULL);
-
-       ret = drm_client_init(dev, &fb_helper->client, "fbdev", &drm_fbdev_client_funcs);
-       if (ret) {
-               drm_err(dev, "Failed to register client: %d\n", ret);
-               goto err_drm_client_init;
-       }
-
-       drm_client_register(&fb_helper->client);
-
-       return 0;
-
-err_drm_client_init:
-       drm_fb_helper_unprepare(fb_helper);
-       kfree(fb_helper);
-       return ret;
-}
-EXPORT_SYMBOL(drm_fbdev_client_setup);