From patchwork Fri Jul 6 14:00:59 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Thierry Reding X-Patchwork-Id: 1166131 Return-Path: X-Original-To: patchwork-dri-devel@patchwork.kernel.org Delivered-To: patchwork-process-083081@patchwork1.kernel.org Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) by patchwork1.kernel.org (Postfix) with ESMTP id 6A2C93FE80 for ; Fri, 6 Jul 2012 14:05:09 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 3B5209E737 for ; Fri, 6 Jul 2012 07:05:09 -0700 (PDT) X-Original-To: dri-devel@lists.freedesktop.org Delivered-To: dri-devel@lists.freedesktop.org Received: from moutng.kundenserver.de (moutng.kundenserver.de [212.227.126.171]) by gabe.freedesktop.org (Postfix) with ESMTP id B29F49EEEA for ; Fri, 6 Jul 2012 07:01:10 -0700 (PDT) Received: from mailbox.adnet.avionic-design.de (mailbox.avionic-design.de [109.75.18.3]) by mrelayeu.kundenserver.de (node=mrbap4) with ESMTP (Nemesis) id 0MXXx0-1SGbbf19p0-00WZ3w; Fri, 06 Jul 2012 16:01:09 +0200 Received: from localhost (localhost [127.0.0.1]) by mailbox.adnet.avionic-design.de (Postfix) with ESMTP id C9B042A28089; Fri, 6 Jul 2012 16:01:08 +0200 (CEST) X-Virus-Scanned: amavisd-new at avionic-design.de Received: from mailbox.adnet.avionic-design.de ([127.0.0.1]) by localhost (add-virt-zarafa.adnet.avionic-design.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id e+ph5VguGApI; Fri, 6 Jul 2012 16:01:01 +0200 (CEST) Received: from localhost (avionic-0098.adnet.avionic-design.de [172.20.31.233]) (Authenticated sender: thierry.reding) by mailbox.adnet.avionic-design.de (Postfix) with ESMTPA id 8D9BC2A282DF; Fri, 6 Jul 2012 16:01:01 +0200 (CEST) From: Thierry Reding To: dri-devel@lists.freedesktop.org Subject: [RFC 1/2] drm: Add SoC framework Date: Fri, 6 Jul 2012 16:00:59 +0200 Message-Id: <1341583260-26459-2-git-send-email-thierry.reding@avionic-design.de> X-Mailer: git-send-email 1.7.11.1 In-Reply-To: <1341583260-26459-1-git-send-email-thierry.reding@avionic-design.de> References: <1341583260-26459-1-git-send-email-thierry.reding@avionic-design.de> X-Provags-ID: V02:K0:mLQ1MTruXis3WH7XYUPyjl69nmzAqIlogqf3ks66oiK hwTEpEogH4V0Up8uS0cj5Eekcf/OwotOZML2x4Vx0QCsBw82m0 exrJHFEHU4hEB57lOMjsGqjCLaU45i7ophHEj1D+kjHY2MabtW oOnpnPQijxYph+lsLAWf6PpFoNC7254K0tpX/hV4BbyecsETgp RULs1KbC5/vcacchAjdVb7rzDNR9upgMDYuGEb2HapttPOjfOB HkDTt0S42AAvR5NLJFSwrgANCljbEAYr/0V45e96BnWVFIQ8PE DGAVU25YLycTiBGgLLGMUNfTfvf45NKKY4KjqyU5Myd4VJt2Tg uVUi4zcw2Aqyufxlrla3uU3Z5q1r/9ceQhLg4Dfg/mqewp61QJ ah45+6fyAPNOBsy7hT/BDm7ssTG7SW4pIjGTGpXxjfNJBQnlz5 MzOKC Cc: Rob Clark X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: dri-devel-bounces+patchwork-dri-devel=patchwork.kernel.org@lists.freedesktop.org Errors-To: dri-devel-bounces+patchwork-dri-devel=patchwork.kernel.org@lists.freedesktop.org This commit adds an initial framework that can be used to plug SoC graphics devices into the DRM/KMS subsystem. SoCs often don't have a dedicated device to which a DRM driver can bind, but instead the graphics complex typically consists of several platform- type devices that work together. The DRM SoC support code therefore adds a dummy device that is associated with the DRM driver, which typically provides some kind of API for other drivers to register with. Signed-off-by: Thierry Reding --- drivers/gpu/drm/Kconfig | 4 ++ drivers/gpu/drm/Makefile | 2 + drivers/gpu/drm/drm_soc.c | 151 ++++++++++++++++++++++++++++++++++++++++++++++ include/drm/drmP.h | 5 ++ 4 files changed, 162 insertions(+) create mode 100644 drivers/gpu/drm/drm_soc.c diff --git a/drivers/gpu/drm/Kconfig b/drivers/gpu/drm/Kconfig index 23120c0..529dede 100644 --- a/drivers/gpu/drm/Kconfig +++ b/drivers/gpu/drm/Kconfig @@ -24,6 +24,10 @@ config DRM_USB depends on DRM select USB +config DRM_SOC + tristate + depends on DRM + config DRM_KMS_HELPER tristate depends on DRM diff --git a/drivers/gpu/drm/Makefile b/drivers/gpu/drm/Makefile index f65f65e..4731cbc 100644 --- a/drivers/gpu/drm/Makefile +++ b/drivers/gpu/drm/Makefile @@ -17,6 +17,7 @@ drm-y := drm_auth.o drm_buffer.o drm_bufs.o drm_cache.o \ drm-$(CONFIG_COMPAT) += drm_ioc32.o drm-usb-y := drm_usb.o +drm-soc-y := drm_soc.o drm_kms_helper-y := drm_fb_helper.o drm_crtc_helper.o drm_dp_i2c_helper.o drm_kms_helper-$(CONFIG_DRM_LOAD_EDID_FIRMWARE) += drm_edid_load.o @@ -27,6 +28,7 @@ CFLAGS_drm_trace_points.o := -I$(src) obj-$(CONFIG_DRM) += drm.o obj-$(CONFIG_DRM_USB) += drm_usb.o +obj-$(CONFIG_DRM_SOC) += drm-soc.o obj-$(CONFIG_DRM_TTM) += ttm/ obj-$(CONFIG_DRM_TDFX) += tdfx/ obj-$(CONFIG_DRM_R128) += r128/ diff --git a/drivers/gpu/drm/drm_soc.c b/drivers/gpu/drm/drm_soc.c new file mode 100644 index 0000000..bc120ae --- /dev/null +++ b/drivers/gpu/drm/drm_soc.c @@ -0,0 +1,151 @@ +/* + * Copyright (C) 2012 Avionic Design GmbH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include +#include +#include + +static const char *drm_soc_get_name(struct drm_device *dev) +{ + DRM_DEBUG("\n"); + return dev_name(dev->dev); +} + +static int drm_soc_set_busid(struct drm_device *dev, struct drm_master *master) +{ + DRM_DEBUG("\n"); + return -ENOSYS; +} + +static int drm_soc_set_unique(struct drm_device *dev, struct drm_master *master, + struct drm_unique *unique) +{ + DRM_DEBUG("\n"); + return -ENOSYS; +} + +static struct drm_bus drm_soc_bus = { + .bus_type = DRIVER_BUS_SOC, + .get_name = drm_soc_get_name, + .set_busid = drm_soc_set_busid, + .set_unique = drm_soc_set_unique, +}; + +static struct device_type drm_soc_device_type = { + .name = "soc", +}; + +static void drm_soc_device_release(struct device *dev) +{ + kfree(dev); +} + +static struct device *drm_create_soc_device(const char *name) +{ + struct device *dev; + int err; + + dev = kzalloc(sizeof(*dev), GFP_KERNEL); + if (!dev) + return NULL; + + dev->release = drm_soc_device_release; + dev->type = &drm_soc_device_type; + dev_set_name(dev, name); + + err = drm_class_device_register(dev); + if (err < 0) + goto put; + + return dev; + +put: + put_device(dev); + return NULL; +} + +int drm_soc_init(struct drm_driver *driver, const char *name) +{ + struct drm_device *dev; + int ret; + + INIT_LIST_HEAD(&driver->device_list); + driver->bus = &drm_soc_bus; + + dev = kzalloc(sizeof(*dev), GFP_KERNEL); + if (!dev) + return -ENOMEM; + + dev->dev = drm_create_soc_device(name); + if (!dev->dev) { + ret = -ENOMEM; + goto free; + } + + ret = drm_fill_in_dev(dev, NULL, driver); + if (ret < 0) + goto unregister; + + if (drm_core_check_feature(dev, DRIVER_MODESET)) { + ret = drm_get_minor(dev, &dev->control, DRM_MINOR_CONTROL); + if (ret < 0) + goto unregister; + } + + ret = drm_get_minor(dev, &dev->primary, DRM_MINOR_LEGACY); + if (ret < 0) + goto put_control; + + if (dev->driver->load) { + ret = dev->driver->load(dev, 0); + if (ret < 0) + goto put_legacy; + } + + if (drm_core_check_feature(dev, DRIVER_MODESET)) { + ret = drm_mode_group_init_legacy_group(dev, &dev->primary->mode_group); + if (ret < 0) + goto put_legacy; + } + + list_add_tail(&dev->driver_item, &driver->device_list); + + DRM_INFO("Initialized %s %d.%d.%d %s on minor %d\n", driver->name, + driver->major, driver->minor, driver->patchlevel, + driver->date, dev->primary->index); + + return 0; + +put_legacy: + drm_put_minor(&dev->primary); +put_control: + if (drm_core_check_feature(dev, DRIVER_MODESET)) + drm_put_minor(&dev->control); +unregister: + drm_class_device_unregister(dev->dev); +free: + kfree(dev); + return ret; +} +EXPORT_SYMBOL_GPL(drm_soc_init); + +void drm_soc_exit(struct drm_driver *driver) +{ + struct drm_device *drm, *tmp; + + list_for_each_entry_safe(drm, tmp, &driver->device_list, driver_item) { + struct device *dev = drm->dev; + drm_put_dev(drm); + drm_class_device_unregister(dev); + } +} +EXPORT_SYMBOL_GPL(drm_soc_exit); + +MODULE_AUTHOR("Thierry Reding "); +MODULE_DESCRIPTION("SoC DRM support"); +MODULE_LICENSE("GPL"); diff --git a/include/drm/drmP.h b/include/drm/drmP.h index 31ad880..bc1edd1 100644 --- a/include/drm/drmP.h +++ b/include/drm/drmP.h @@ -156,6 +156,7 @@ int drm_err(const char *func, const char *format, ...); #define DRIVER_BUS_PCI 0x1 #define DRIVER_BUS_PLATFORM 0x2 #define DRIVER_BUS_USB 0x3 +#define DRIVER_BUS_SOC 0x4 /***********************************************************************/ /** \name Begin the DRM... */ @@ -1769,6 +1770,10 @@ extern void drm_platform_exit(struct drm_driver *driver, struct platform_device extern int drm_get_platform_dev(struct platform_device *pdev, struct drm_driver *driver); +/* SoC section */ +extern int drm_soc_init(struct drm_driver *driver, const char *name); +extern void drm_soc_exit(struct drm_driver *driver); + /* returns true if currently okay to sleep */ static __inline__ bool drm_can_sleep(void) {