From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753747AbcEWKxi (ORCPT ); Mon, 23 May 2016 06:53:38 -0400 Received: from mx2.suse.de ([195.135.220.15]:46299 "EHLO mx2.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752738AbcEWKxh (ORCPT ); Mon, 23 May 2016 06:53:37 -0400 From: "'Max Staudt" To: dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org Cc: mstaudt@suse.de, eich@suse.de, tiwai@suse.de, thellstrom@vmware.com, tomi.valkeinen@ti.com Subject: [PATCH 2/3] Define fb_open_adj_file() Date: Mon, 23 May 2016 12:48:52 +0200 Message-Id: <1464000533-13140-3-git-send-email-mstaudt@suse.de> X-Mailer: git-send-email 2.6.6 In-Reply-To: <1464000533-13140-1-git-send-email-mstaudt@suse.de> References: <1464000533-13140-1-git-send-email-mstaudt@suse.de> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Max Staudt This callback from fb_open() allows a fbdev driver to adjust things such as file->f_mapping to better represent the internal structures. This is needed to allow TTM drivers using ttm_fbdev_mmap() to properly set file->f_mapping to TTM's address_space from bo->bdev->dev_mapping, as is done form /dev/drm/card* in drm_open(). Currently, bochsdrmfb is the only driver requiring this, and this patch is a prerequisite to implement this in bochsdrmfb. Signed-off-by: Max Staudt --- drivers/video/fbdev/core/fbmem.c | 13 +++++++++++++ include/linux/fb.h | 7 +++++++ 2 files changed, 20 insertions(+) diff --git a/drivers/video/fbdev/core/fbmem.c b/drivers/video/fbdev/core/fbmem.c index 913c496..ff5000e 100644 --- a/drivers/video/fbdev/core/fbmem.c +++ b/drivers/video/fbdev/core/fbmem.c @@ -1471,6 +1471,19 @@ __releases(&info->lock) if (info->fbdefio) fb_deferred_io_open(info, inode, file); #endif + if (info->fbops->fb_open_adj_file) { + res = info->fbops->fb_open_adj_file(info, file); + if (res) { + /* If we got here, we also want to undo anything + * that fbops->fb_open() may have done. + */ + if (info->fbops->fb_release) + info->fbops->fb_release(info,1); + + module_put(info->fbops->owner); + goto out; + } + } out: mutex_unlock(&info->lock); if (res) diff --git a/include/linux/fb.h b/include/linux/fb.h index dfe8835..4131496 100644 --- a/include/linux/fb.h +++ b/include/linux/fb.h @@ -320,6 +320,13 @@ struct fb_ops { /* called at KDB enter and leave time to prepare the console */ int (*fb_debug_enter)(struct fb_info *info); int (*fb_debug_leave)(struct fb_info *info); + + /* Called after fb_open() to adjust mappings when using + * complex backends such as TTM. + * For example, the bochsdrmfb driver needs to adjust + * file->f_mapping so it can use ttm_fbdev_mmap(). + */ + int (*fb_open_adj_file)(struct fb_info *info, struct file *file); }; #ifdef CONFIG_FB_TILEBLITTING -- 2.6.6