Hi Laurent,

On 20-12-2016 01:33, Laurent Pinchart wrote:
> The DWC HDMI TX can be recognized by the two product identification
> registers. If the registers don't read as expect the IP will be very
> different than what the driver has been designed for, or will be
> misconfigured in a way that makes it non-operational (invalid memory
> address, incorrect clocks, ...). We should reject this situation with an
> error.
>
> While this isn't critical for proper operation with supported IPs at the
> moment, the driver will soon gain automatic device-specific handling
> based on runtime device identification. This change makes it easier to
> implement that without having to default to a random guess in case the
> device can't be identified.
>
> While at it print a readable version number in the device identification
> message instead of raw register values.
>
> Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas at ideasonboard.com>

Reviewed-by: Jose Abreu <joabreu at synopsys.com>

> ---
>  drivers/gpu/drm/bridge/dw-hdmi.c | 25 +++++++++++++++++++------
>  drivers/gpu/drm/bridge/dw-hdmi.h |  8 ++++++++
>  2 files changed, 27 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/gpu/drm/bridge/dw-hdmi.c 
> b/drivers/gpu/drm/bridge/dw-hdmi.c
> index 06c252f560ad..1809247745b8 100644
> --- a/drivers/gpu/drm/bridge/dw-hdmi.c
> +++ b/drivers/gpu/drm/bridge/dw-hdmi.c
> @@ -1832,6 +1832,9 @@ __dw_hdmi_probe(struct platform_device *pdev,
>       int irq;
>       int ret;
>       u32 val = 1;
> +     u16 version;
> +     u8 prod_id0;
> +     u8 prod_id1;
>       u8 config0;
>       u8 config1;
>  
> @@ -1914,12 +1917,22 @@ __dw_hdmi_probe(struct platform_device *pdev,
>       }
>  
>       /* Product and revision IDs */
> -     dev_info(dev,
> -              "Detected HDMI controller 0x%x:0x%x:0x%x:0x%x\n",
> -              hdmi_readb(hdmi, HDMI_DESIGN_ID),
> -              hdmi_readb(hdmi, HDMI_REVISION_ID),
> -              hdmi_readb(hdmi, HDMI_PRODUCT_ID0),
> -              hdmi_readb(hdmi, HDMI_PRODUCT_ID1));
> +     version = (hdmi_readb(hdmi, HDMI_DESIGN_ID) << 8)
> +             | (hdmi_readb(hdmi, HDMI_REVISION_ID) << 0);
> +     prod_id0 = hdmi_readb(hdmi, HDMI_PRODUCT_ID0);
> +     prod_id1 = hdmi_readb(hdmi, HDMI_PRODUCT_ID1);
> +
> +     if (prod_id0 != HDMI_PRODUCT_ID0_HDMI_TX ||
> +         (prod_id1 & ~HDMI_PRODUCT_ID1_HDCP) != HDMI_PRODUCT_ID1_HDMI_TX) {
> +             dev_err(dev, "Unsupported HDMI controller (%04x:%02x:%02x)\n",
> +                     version, prod_id0, prod_id1);
> +             ret = -ENODEV;
> +             goto err_iahb;
> +     }
> +
> +     dev_info(dev, "Detected HDMI TX controller v%x.%03x %s HDCP\n",
> +              version >> 12, version & 0xfff,
> +              prod_id1 & HDMI_PRODUCT_ID1_HDCP ? "with" : "without");
>  
>       initialize_hdmi_ih_mutes(hdmi);
>  
> diff --git a/drivers/gpu/drm/bridge/dw-hdmi.h 
> b/drivers/gpu/drm/bridge/dw-hdmi.h
> index 08235aef2fa3..91d7fabbd6e5 100644
> --- a/drivers/gpu/drm/bridge/dw-hdmi.h
> +++ b/drivers/gpu/drm/bridge/dw-hdmi.h
> @@ -545,6 +545,14 @@
>  #define HDMI_I2CM_FS_SCL_LCNT_0_ADDR            0x7E12
>  
>  enum {
> +/* PRODUCT_ID0 field values */
> +     HDMI_PRODUCT_ID0_HDMI_TX = 0xa0,
> +
> +/* PRODUCT_ID1 field values */
> +     HDMI_PRODUCT_ID1_HDCP = 0xc0,
> +     HDMI_PRODUCT_ID1_HDMI_RX = 0x02,
> +     HDMI_PRODUCT_ID1_HDMI_TX = 0x01,
> +
>  /* CONFIG0_ID field values */
>       HDMI_CONFIG0_I2S = 0x10,
>  

Reply via email to