12dcf1433SSimon Glass /* 22dcf1433SSimon Glass * Copyright 2014 Google Inc. 32dcf1433SSimon Glass * 42dcf1433SSimon Glass * SPDX-License-Identifier: GPL-2.0+ 52dcf1433SSimon Glass */ 62dcf1433SSimon Glass 72dcf1433SSimon Glass #include <common.h> 82dcf1433SSimon Glass #include <dm.h> 92dcf1433SSimon Glass #include <display.h> 102dcf1433SSimon Glass #include <edid.h> 112dcf1433SSimon Glass #include <errno.h> 122dcf1433SSimon Glass 132dcf1433SSimon Glass int display_read_edid(struct udevice *dev, u8 *buf, int buf_size) 142dcf1433SSimon Glass { 152dcf1433SSimon Glass struct dm_display_ops *ops = display_get_ops(dev); 162dcf1433SSimon Glass 172dcf1433SSimon Glass if (!ops || !ops->read_edid) 182dcf1433SSimon Glass return -ENOSYS; 192dcf1433SSimon Glass return ops->read_edid(dev, buf, buf_size); 202dcf1433SSimon Glass } 212dcf1433SSimon Glass 222dcf1433SSimon Glass int display_enable(struct udevice *dev, int panel_bpp, 232dcf1433SSimon Glass const struct display_timing *timing) 242dcf1433SSimon Glass { 252dcf1433SSimon Glass struct dm_display_ops *ops = display_get_ops(dev); 26*1b68283bSSimon Glass struct display_plat *disp_uc_plat; 27*1b68283bSSimon Glass int ret; 282dcf1433SSimon Glass 292dcf1433SSimon Glass if (!ops || !ops->enable) 302dcf1433SSimon Glass return -ENOSYS; 31*1b68283bSSimon Glass ret = ops->enable(dev, panel_bpp, timing); 32*1b68283bSSimon Glass if (ret) 33*1b68283bSSimon Glass return ret; 34*1b68283bSSimon Glass 35*1b68283bSSimon Glass disp_uc_plat = dev_get_uclass_platdata(dev); 36*1b68283bSSimon Glass disp_uc_plat->in_use = true; 37*1b68283bSSimon Glass 38*1b68283bSSimon Glass return 0; 392dcf1433SSimon Glass } 402dcf1433SSimon Glass 412dcf1433SSimon Glass int display_read_timing(struct udevice *dev, struct display_timing *timing) 422dcf1433SSimon Glass { 432dcf1433SSimon Glass struct dm_display_ops *ops = display_get_ops(dev); 442dcf1433SSimon Glass int panel_bits_per_colour; 452dcf1433SSimon Glass u8 buf[EDID_EXT_SIZE]; 462dcf1433SSimon Glass int ret; 472dcf1433SSimon Glass 48eab314f5SJacob Chen if (ops && ops->read_timing) 49eab314f5SJacob Chen return ops->read_timing(dev, timing); 50eab314f5SJacob Chen 512dcf1433SSimon Glass if (!ops || !ops->read_edid) 522dcf1433SSimon Glass return -ENOSYS; 532dcf1433SSimon Glass ret = ops->read_edid(dev, buf, sizeof(buf)); 542dcf1433SSimon Glass if (ret < 0) 552dcf1433SSimon Glass return ret; 562dcf1433SSimon Glass 572dcf1433SSimon Glass return edid_get_timing(buf, ret, timing, &panel_bits_per_colour); 582dcf1433SSimon Glass } 592dcf1433SSimon Glass 60*1b68283bSSimon Glass bool display_in_use(struct udevice *dev) 61*1b68283bSSimon Glass { 62*1b68283bSSimon Glass struct display_plat *disp_uc_plat = dev_get_uclass_platdata(dev); 63*1b68283bSSimon Glass 64*1b68283bSSimon Glass return disp_uc_plat->in_use; 65*1b68283bSSimon Glass } 66*1b68283bSSimon Glass 672dcf1433SSimon Glass UCLASS_DRIVER(display) = { 682dcf1433SSimon Glass .id = UCLASS_DISPLAY, 692dcf1433SSimon Glass .name = "display", 702dcf1433SSimon Glass .per_device_platdata_auto_alloc_size = sizeof(struct display_plat), 712dcf1433SSimon Glass }; 72