]>
Commit | Line | Data |
---|---|---|
83d290c5 | 1 | // SPDX-License-Identifier: GPL-2.0+ |
2dcf1433 SG |
2 | /* |
3 | * Copyright 2014 Google Inc. | |
2dcf1433 SG |
4 | */ |
5 | ||
6 | #include <common.h> | |
7 | #include <dm.h> | |
8 | #include <display.h> | |
9 | #include <edid.h> | |
10 | #include <errno.h> | |
11 | ||
12 | int 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 | ||
21 | int 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); | |
1b68283b SG |
25 | struct display_plat *disp_uc_plat; |
26 | int ret; | |
2dcf1433 SG |
27 | |
28 | if (!ops || !ops->enable) | |
29 | return -ENOSYS; | |
1b68283b SG |
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; | |
2dcf1433 SG |
38 | } |
39 | ||
eb4ee4e4 NA |
40 | static 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 | ||
2dcf1433 SG |
51 | int 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 | ||
eab314f5 JC |
58 | if (ops && ops->read_timing) |
59 | return ops->read_timing(dev, timing); | |
60 | ||
2dcf1433 SG |
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 | ||
eb4ee4e4 NA |
67 | return edid_get_timing_validate(buf, ret, timing, |
68 | &panel_bits_per_colour, | |
69 | display_mode_valid, dev); | |
2dcf1433 SG |
70 | } |
71 | ||
1b68283b SG |
72 | bool 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 | ||
2dcf1433 SG |
79 | UCLASS_DRIVER(display) = { |
80 | .id = UCLASS_DISPLAY, | |
81 | .name = "display", | |
82 | .per_device_platdata_auto_alloc_size = sizeof(struct display_plat), | |
83 | }; |