diff options
author | Andrzej Hajda <a.hajda@samsung.com> | 2016-10-18 16:03:03 +0200 |
---|---|---|
committer | Seung-Woo Kim <sw0312.kim@samsung.com> | 2016-12-14 13:53:55 +0900 |
commit | c7fc98038a8136419bc9b72d47cef922c25359f5 (patch) | |
tree | bcf7296372331275bccdb70a1b444097c52c8cae | |
parent | 9550993c2325b4e508f9a158fb3aa8fbee7edc04 (diff) |
drm/bridge/sii8620: fix EDID fetch code
The patch adds handling errors during EDID fetch. Additionally it makes
code cleanup.
Change-Id: Icb94df6386d4b18ee5f7756991d0419b90763157
Signed-off-by: Andrzej Hajda <a.hajda@samsung.com>
-rw-r--r-- | drivers/gpu/drm/bridge/sii8620.c | 33 |
1 files changed, 18 insertions, 15 deletions
diff --git a/drivers/gpu/drm/bridge/sii8620.c b/drivers/gpu/drm/bridge/sii8620.c index 6a3d228cc9ee..03903796da27 100644 --- a/drivers/gpu/drm/bridge/sii8620.c +++ b/drivers/gpu/drm/bridge/sii8620.c @@ -454,14 +454,10 @@ static void sii8620_mt_read_devcap(struct sii8620 *ctx, bool xdevcap) static void sii8620_fetch_edid(struct sii8620 *ctx) { - u8 lm_ddc; - u8 ddc_cmd; - u8 int3; - u8 cbus; - int i; - u8 *edid; + u8 lm_ddc, ddc_cmd, int3, cbus; + int fetched, i; int edid_len = EDID_LENGTH; - int fetched; + u8 *edid; sii8620_readb(ctx, REG_CBUS_STATUS); lm_ddc = sii8620_readb(ctx, REG_LM_DDC); @@ -486,13 +482,13 @@ static void sii8620_fetch_edid(struct sii8620 *ctx) sii8620_write(ctx, REG_DDC_ADDR, 0x50 << 1); -#define FETCH_SIZE 16 edid = kmalloc(EDID_LENGTH, GFP_KERNEL); if (!edid) { ctx->error = -ENOMEM; return; } +#define FETCH_SIZE 16 for (fetched = 0; fetched < edid_len; fetched += FETCH_SIZE) { sii8620_readb(ctx, REG_DDC_STATUS); sii8620_write_seq(ctx, @@ -517,7 +513,8 @@ static void sii8620_fetch_edid(struct sii8620 *ctx) if (!(cbus & BIT_CBUS_STATUS_CBUS_CONNECTED)) { kfree(edid); - return; + edid = NULL; + goto end; } } while (1); @@ -530,21 +527,27 @@ static void sii8620_fetch_edid(struct sii8620 *ctx) u8 ext = ((struct edid *)edid)->extensions; if (ext) { + u8 *new_edid; + edid_len += ext * EDID_LENGTH; - edid = krealloc(edid, edid_len, GFP_KERNEL); + new_edid = krealloc(edid, edid_len, GFP_KERNEL); + if (!new_edid) { + kfree(edid); + ctx->error = -ENOMEM; + return; + } + edid = new_edid; } } if (fetched + FETCH_SIZE == edid_len) - - sii8620_write(ctx, REG_INTR3, int3); + sii8620_write(ctx, REG_INTR3, int3); } sii8620_write(ctx, REG_LM_DDC, lm_ddc); - if (ctx->edid) - kfree(ctx->edid); - +end: + kfree(ctx->edid); ctx->edid = (struct edid *)edid; } |