drm/bridge/sii8620: split EDID read and write code
authorAndrzej Hajda <a.hajda@samsung.com>
Tue, 6 Dec 2016 12:34:03 +0000 (13:34 +0100)
committerSeung-Woo Kim <sw0312.kim@samsung.com>
Wed, 14 Dec 2016 04:54:28 +0000 (13:54 +0900)
MHL3 requires that after reading EDID from the sink source should ask
peer for features. To make both protocols happy the patch splits code
accordingly.

Change-Id: I367a05e4c4aac0b0de31692027da117ec56ff039
Signed-off-by: Andrzej Hajda <a.hajda@samsung.com>
drivers/gpu/drm/bridge/sil-sii8620.c

index 3ba69756816d69abb811a4eace06ea6ab4f81005..60b3c22b6e1ae7393472dc2e68676a61e3874884 100644 (file)
@@ -479,6 +479,10 @@ static void sii8620_sink_detected(struct sii8620 *ctx, int ret)
                ctx->sink_type = SINK_DVI;
 
        dev_info(dev, "detected sink(type: %s)\n", sink_str[ctx->sink_type]);
+}
+
+static void sii8620_edid_read(struct sii8620 *ctx, int ret)
+{
        sii8620_set_upstream_edid(ctx);
        sii8620_enable_hpd(ctx);
 }
@@ -784,12 +788,12 @@ static void sii8620_fetch_edid(struct sii8620 *ctx)
                                edid = new_edid;
                        }
                }
-
-               if (fetched + FETCH_SIZE == edid_len)
-                       sii8620_write(ctx, REG_INTR3, int3);
        }
 
-       sii8620_write(ctx, REG_LM_DDC, lm_ddc);
+       sii8620_write_seq(ctx,
+               REG_INTR3_MASK, BIT_DDC_CMD_DONE,
+               REG_LM_DDC, lm_ddc
+       );
 
 end:
        kfree(ctx->edid);
@@ -1699,6 +1703,21 @@ static void sii8620_irq_block(struct sii8620 *ctx)
        sii8620_write(ctx, REG_EMSCINTR, stat);
 }
 
+static void sii8620_irq_ddc(struct sii8620 *ctx)
+{
+       u8 stat = sii8620_readb(ctx, REG_INTR3);
+
+       if (stat & BIT_DDC_CMD_DONE) {
+               sii8620_write(ctx, REG_INTR3_MASK, 0);
+               if (ctx->mode > CM_MHL1)
+                       sii8620_mt_set_int(ctx, MHL_INT_REG(RCHANGE),
+                                          MHL_INT_RC_FEAT_REQ);
+               else
+                       sii8620_edid_read(ctx, 0);
+       }
+       sii8620_write(ctx, REG_INTR3, stat);
+}
+
 /* endian agnostic, non-volatile version of test_bit */
 static bool sii8620_test_bit(unsigned int nr, const u8 *addr)
 {
@@ -1719,6 +1738,7 @@ static irqreturn_t sii8620_irq_thread(int irq, void *data)
                { BIT_FAST_INTR_STAT_MERR, sii8620_irq_merr },
                { BIT_FAST_INTR_STAT_BLOCK, sii8620_irq_block },
                { BIT_FAST_INTR_STAT_EDID, sii8620_irq_edid },
+               { BIT_FAST_INTR_STAT_DDC, sii8620_irq_ddc },
                { BIT_FAST_INTR_STAT_SCDT, sii8620_irq_scdt },
                { BIT_FAST_INTR_STAT_INFR, sii8620_irq_infr },
        };