18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * generic videomode helper 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Copyright (c) 2012 Steffen Trumtrar <s.trumtrar@pengutronix.de>, Pengutronix 68c2ecf20Sopenharmony_ci */ 78c2ecf20Sopenharmony_ci#include <linux/errno.h> 88c2ecf20Sopenharmony_ci#include <linux/export.h> 98c2ecf20Sopenharmony_ci#include <linux/of.h> 108c2ecf20Sopenharmony_ci#include <video/display_timing.h> 118c2ecf20Sopenharmony_ci#include <video/of_display_timing.h> 128c2ecf20Sopenharmony_ci#include <video/of_videomode.h> 138c2ecf20Sopenharmony_ci#include <video/videomode.h> 148c2ecf20Sopenharmony_ci 158c2ecf20Sopenharmony_ci/** 168c2ecf20Sopenharmony_ci * of_get_videomode - get the videomode #<index> from devicetree 178c2ecf20Sopenharmony_ci * @np - devicenode with the display_timings 188c2ecf20Sopenharmony_ci * @vm - set to return value 198c2ecf20Sopenharmony_ci * @index - index into list of display_timings 208c2ecf20Sopenharmony_ci * (Set this to OF_USE_NATIVE_MODE to use whatever mode is 218c2ecf20Sopenharmony_ci * specified as native mode in the DT.) 228c2ecf20Sopenharmony_ci * 238c2ecf20Sopenharmony_ci * DESCRIPTION: 248c2ecf20Sopenharmony_ci * Get a list of all display timings and put the one 258c2ecf20Sopenharmony_ci * specified by index into *vm. This function should only be used, if 268c2ecf20Sopenharmony_ci * only one videomode is to be retrieved. A driver that needs to work 278c2ecf20Sopenharmony_ci * with multiple/all videomodes should work with 288c2ecf20Sopenharmony_ci * of_get_display_timings instead. 298c2ecf20Sopenharmony_ci **/ 308c2ecf20Sopenharmony_ciint of_get_videomode(struct device_node *np, struct videomode *vm, 318c2ecf20Sopenharmony_ci int index) 328c2ecf20Sopenharmony_ci{ 338c2ecf20Sopenharmony_ci struct display_timings *disp; 348c2ecf20Sopenharmony_ci int ret; 358c2ecf20Sopenharmony_ci 368c2ecf20Sopenharmony_ci disp = of_get_display_timings(np); 378c2ecf20Sopenharmony_ci if (!disp) { 388c2ecf20Sopenharmony_ci pr_err("%pOF: no timings specified\n", np); 398c2ecf20Sopenharmony_ci return -EINVAL; 408c2ecf20Sopenharmony_ci } 418c2ecf20Sopenharmony_ci 428c2ecf20Sopenharmony_ci if (index == OF_USE_NATIVE_MODE) 438c2ecf20Sopenharmony_ci index = disp->native_mode; 448c2ecf20Sopenharmony_ci 458c2ecf20Sopenharmony_ci ret = videomode_from_timings(disp, vm, index); 468c2ecf20Sopenharmony_ci 478c2ecf20Sopenharmony_ci display_timings_release(disp); 488c2ecf20Sopenharmony_ci 498c2ecf20Sopenharmony_ci return ret; 508c2ecf20Sopenharmony_ci} 518c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(of_get_videomode); 52