"Das U-Boot" Source Tree
at master 84 lines 1.8 kB view raw
1// SPDX-License-Identifier: GPL-2.0+ 2/* 3 * Copyright 2014 Google Inc. 4 */ 5 6#define LOG_CATEGORY UCLASS_DISPLAY 7 8#include <dm.h> 9#include <display.h> 10#include <edid.h> 11#include <errno.h> 12 13int display_read_edid(struct udevice *dev, u8 *buf, int buf_size) 14{ 15 struct dm_display_ops *ops = display_get_ops(dev); 16 17 if (!ops || !ops->read_edid) 18 return -ENOSYS; 19 return ops->read_edid(dev, buf, buf_size); 20} 21 22int display_enable(struct udevice *dev, int panel_bpp, 23 const struct display_timing *timing) 24{ 25 struct dm_display_ops *ops = display_get_ops(dev); 26 struct display_plat *disp_uc_plat; 27 int ret; 28 29 if (!ops || !ops->enable) 30 return -ENOSYS; 31 ret = ops->enable(dev, panel_bpp, timing); 32 if (ret) 33 return ret; 34 35 disp_uc_plat = dev_get_uclass_plat(dev); 36 disp_uc_plat->in_use = true; 37 38 return 0; 39} 40 41static bool display_mode_valid(void *priv, const struct display_timing *timing) 42{ 43 struct udevice *dev = priv; 44 struct dm_display_ops *ops = display_get_ops(dev); 45 46 if (ops && ops->mode_valid) 47 return ops->mode_valid(dev, timing); 48 49 return true; 50} 51 52int display_read_timing(struct udevice *dev, struct display_timing *timing) 53{ 54 struct dm_display_ops *ops = display_get_ops(dev); 55 int panel_bits_per_colour; 56 u8 buf[EDID_EXT_SIZE]; 57 int ret; 58 59 if (ops && ops->read_timing) 60 return ops->read_timing(dev, timing); 61 62 if (!ops || !ops->read_edid) 63 return -ENOSYS; 64 ret = ops->read_edid(dev, buf, sizeof(buf)); 65 if (ret < 0) 66 return ret; 67 68 return edid_get_timing_validate(buf, ret, timing, 69 &panel_bits_per_colour, 70 display_mode_valid, dev); 71} 72 73bool display_in_use(struct udevice *dev) 74{ 75 struct display_plat *disp_uc_plat = dev_get_uclass_plat(dev); 76 77 return disp_uc_plat->in_use; 78} 79 80UCLASS_DRIVER(display) = { 81 .id = UCLASS_DISPLAY, 82 .name = "display", 83 .per_device_plat_auto = sizeof(struct display_plat), 84};