The current DisplayPort uclass is too specific. The operations it provides are shared with other types of output devices, such as HDMI and LVDS LCD displays. Generalise the uclass so that it can be used with these devices as well. Adjust the uclass to handle the EDID reading and conversion to display_timing internally. Also update nyan-big which is affected by this. Signed-off-by: Simon Glass <sjg@chromium.org>master
parent
cd9c2070ea
commit
2dcf143398
@ -0,0 +1,52 @@ |
||||
/*
|
||||
* Copyright 2014 Google Inc. |
||||
* |
||||
* SPDX-License-Identifier: GPL-2.0+ |
||||
*/ |
||||
|
||||
#include <common.h> |
||||
#include <dm.h> |
||||
#include <display.h> |
||||
#include <edid.h> |
||||
#include <errno.h> |
||||
|
||||
int display_read_edid(struct udevice *dev, u8 *buf, int buf_size) |
||||
{ |
||||
struct dm_display_ops *ops = display_get_ops(dev); |
||||
|
||||
if (!ops || !ops->read_edid) |
||||
return -ENOSYS; |
||||
return ops->read_edid(dev, buf, buf_size); |
||||
} |
||||
|
||||
int display_enable(struct udevice *dev, int panel_bpp, |
||||
const struct display_timing *timing) |
||||
{ |
||||
struct dm_display_ops *ops = display_get_ops(dev); |
||||
|
||||
if (!ops || !ops->enable) |
||||
return -ENOSYS; |
||||
return ops->enable(dev, panel_bpp, timing); |
||||
} |
||||
|
||||
int display_read_timing(struct udevice *dev, struct display_timing *timing) |
||||
{ |
||||
struct dm_display_ops *ops = display_get_ops(dev); |
||||
int panel_bits_per_colour; |
||||
u8 buf[EDID_EXT_SIZE]; |
||||
int ret; |
||||
|
||||
if (!ops || !ops->read_edid) |
||||
return -ENOSYS; |
||||
ret = ops->read_edid(dev, buf, sizeof(buf)); |
||||
if (ret < 0) |
||||
return ret; |
||||
|
||||
return edid_get_timing(buf, ret, timing, &panel_bits_per_colour); |
||||
} |
||||
|
||||
UCLASS_DRIVER(display) = { |
||||
.id = UCLASS_DISPLAY, |
||||
.name = "display", |
||||
.per_device_platdata_auto_alloc_size = sizeof(struct display_plat), |
||||
}; |
@ -1,34 +0,0 @@ |
||||
/*
|
||||
* Copyright 2014 Google Inc. |
||||
* |
||||
* SPDX-License-Identifier: GPL-2.0+ |
||||
*/ |
||||
|
||||
#include <common.h> |
||||
#include <dm.h> |
||||
#include <displayport.h> |
||||
#include <errno.h> |
||||
|
||||
int display_port_read_edid(struct udevice *dev, u8 *buf, int buf_size) |
||||
{ |
||||
struct dm_display_port_ops *ops = display_port_get_ops(dev); |
||||
|
||||
if (!ops || !ops->read_edid) |
||||
return -ENOSYS; |
||||
return ops->read_edid(dev, buf, buf_size); |
||||
} |
||||
|
||||
int display_port_enable(struct udevice *dev, int panel_bpp, |
||||
const struct display_timing *timing) |
||||
{ |
||||
struct dm_display_port_ops *ops = display_port_get_ops(dev); |
||||
|
||||
if (!ops || !ops->enable) |
||||
return -ENOSYS; |
||||
return ops->enable(dev, panel_bpp, timing); |
||||
} |
||||
|
||||
UCLASS_DRIVER(display_port) = { |
||||
.id = UCLASS_DISPLAY_PORT, |
||||
.name = "display_port", |
||||
}; |
Loading…
Reference in new issue