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