This function is going to be used for the incoming MIPI-DSI support, so let's make it reusable.
Signed-off-by: Ahmad Fatoum <a.fat...@barebox.org> --- drivers/video/Makefile | 1 + drivers/video/drm/Makefile | 2 + drivers/video/drm/drm_modes.c | 67 ++++++++++++++++++++++ drivers/video/rockchip/rockchip_drm_vop2.c | 13 ----- include/video/drm/drm_modes.h | 2 + 5 files changed, 72 insertions(+), 13 deletions(-) create mode 100644 drivers/video/drm/Makefile create mode 100644 drivers/video/drm/drm_modes.c diff --git a/drivers/video/Makefile b/drivers/video/Makefile index f851837ebcdb..dde1da1bb98b 100644 --- a/drivers/video/Makefile +++ b/drivers/video/Makefile @@ -1,5 +1,6 @@ # SPDX-License-Identifier: GPL-2.0-only obj-$(CONFIG_VIDEO) += fb.o mode-helpers.o +obj-$(CONFIG_VIDEO) += drm/ obj-$(CONFIG_DRIVER_VIDEO_EDID) += edid.o obj-$(CONFIG_OFDEVICE) += of_display_timing.o obj-$(CONFIG_DRIVER_VIDEO_BACKLIGHT) += backlight.o diff --git a/drivers/video/drm/Makefile b/drivers/video/drm/Makefile new file mode 100644 index 000000000000..06d586eb2184 --- /dev/null +++ b/drivers/video/drm/Makefile @@ -0,0 +1,2 @@ +# SPDX-License-Identifier: GPL-2.0-only +obj-$(CONFIG_VIDEO) += drm_modes.o diff --git a/drivers/video/drm/drm_modes.c b/drivers/video/drm/drm_modes.c new file mode 100644 index 000000000000..00fcfb9070ae --- /dev/null +++ b/drivers/video/drm/drm_modes.c @@ -0,0 +1,67 @@ +/* + * Copyright © 1997-2003 by The XFree86 Project, Inc. + * Copyright © 2007 Dave Airlie + * Copyright © 2007-2008 Intel Corporation + * Jesse Barnes <jesse.bar...@intel.com> + * Copyright 2005-2006 Luc Verhaegen + * Copyright (c) 2001, Andy Ritger arit...@nvidia.com + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + * + * Except as contained in this notice, the name of the copyright holder(s) + * and author(s) shall not be used in advertising or otherwise to promote + * the sale, use or other dealings in this Software without prior written + * authorization from the copyright holder(s) and author(s). + */ + +#include <linux/ctype.h> +#include <linux/export.h> +#include <linux/list.h> +#include <of.h> + +#include <video/drm/drm_modes.h> + +/** + * drm_mode_vrefresh - get the vrefresh of a mode + * @mode: mode + * + * Returns: + * @modes's vrefresh rate in Hz, rounded to the nearest integer. Calculates the + * value first if it is not yet set. + */ +int drm_mode_vrefresh(const struct drm_display_mode *mode) +{ + unsigned int num, den; + + if (mode->htotal == 0 || mode->vtotal == 0) + return 0; + + num = mode->clock; + den = mode->htotal * mode->vtotal; + + if (mode->flags & DRM_MODE_FLAG_INTERLACE) + num *= 2; + if (mode->flags & DRM_MODE_FLAG_DBLSCAN) + den *= 2; + if (mode->vscan > 1) + den *= mode->vscan; + + return DIV_ROUND_CLOSEST_ULL(mul_u32_u32(num, 1000), den); +} +EXPORT_SYMBOL(drm_mode_vrefresh); diff --git a/drivers/video/rockchip/rockchip_drm_vop2.c b/drivers/video/rockchip/rockchip_drm_vop2.c index b49053c6e915..d81e0357528b 100644 --- a/drivers/video/rockchip/rockchip_drm_vop2.c +++ b/drivers/video/rockchip/rockchip_drm_vop2.c @@ -975,19 +975,6 @@ static int us_to_vertical_line(struct drm_display_mode *mode, int us) return us * mode->clock / mode->htotal / 1000; } -static int drm_mode_vrefresh(const struct drm_display_mode *mode) -{ - unsigned int num, den; - - if (mode->htotal == 0 || mode->vtotal == 0) - return 0; - - num = mode->clock; - den = mode->htotal * mode->vtotal; - - return DIV_ROUND_CLOSEST_ULL(mul_u32_u32(num, 1000), den); -} - static void vop2_crtc_atomic_enable(struct vop2_video_port *vp, struct drm_display_mode *mode, struct rockchip_crtc_state *vcstate) diff --git a/include/video/drm/drm_modes.h b/include/video/drm/drm_modes.h index afce8a25a9c4..003c76cab6e0 100644 --- a/include/video/drm/drm_modes.h +++ b/include/video/drm/drm_modes.h @@ -406,4 +406,6 @@ struct drm_display_mode { enum drm_mode_status status; }; +int drm_mode_vrefresh(const struct drm_display_mode *mode); + #endif /* __DRM_MODES_H__ */ -- 2.39.5