On 25 June 2012 12:05, Tomi Valkeinen <[email protected]> wrote:
> On Sat, 2012-06-23 at 13:36 +0530, [email protected] wrote:
>> From: Jassi Brar <[email protected]>
>>
>> We can easily keep track of latest EDID from the display and hence avoid
>> expensive EDID re-reads over I2C.
>> This could also help some cheapo displays that provide EDID reliably only
>> immediately after asserting HPD and not later.
>> Even with good displays, there is something in OMAPDSS that apparantly
>> messes up DDC occasionally while EDID is being read, giving the
>> "operation stopped when reading edid" error.
>>
>> Signed-off-by: Jassi Brar <[email protected]>
>> ---
>> drivers/video/omap2/dss/hdmi.c | 1 +
>> drivers/video/omap2/dss/ti_hdmi.h | 2 ++
>> drivers/video/omap2/dss/ti_hdmi_4xxx_ip.c | 23 ++++++++++++++++++++---
>> 3 files changed, 23 insertions(+), 3 deletions(-)
>>
>> diff --git a/drivers/video/omap2/dss/hdmi.c b/drivers/video/omap2/dss/hdmi.c
>> index 900e621..0a8c825 100644
>> --- a/drivers/video/omap2/dss/hdmi.c
>> +++ b/drivers/video/omap2/dss/hdmi.c
>> @@ -764,6 +764,7 @@ static int __init omapdss_hdmihw_probe(struct
>> platform_device *pdev)
>> hdmi.ip_data.core_av_offset = HDMI_CORE_AV;
>> hdmi.ip_data.pll_offset = HDMI_PLLCTRL;
>> hdmi.ip_data.phy_offset = HDMI_PHY;
>> + hdmi.ip_data.edid_len = 0; /* Invalidate EDID Cache */
>> mutex_init(&hdmi.ip_data.lock);
>
> Your HDMI patches seem to depend on each other. Please post them as a
> proper patch series, instead of each one separately.
>
They don't depend functionality wise. Any fix can be accepted
regardless of others.
I deliberately avoided a series, because revision of just one could
require resending 3, otherwise
perfectly OK, patches. I just wanted to limit the noise.
I understand, 'git am' might complain but I think that should be trivial to fix.
I am perfectly OK to resend as a patch series, if you want.
>> hdmi_panel_init();
>> diff --git a/drivers/video/omap2/dss/ti_hdmi.h
>> b/drivers/video/omap2/dss/ti_hdmi.h
>> index cc292b8..4735860 100644
>> --- a/drivers/video/omap2/dss/ti_hdmi.h
>> +++ b/drivers/video/omap2/dss/ti_hdmi.h
>> @@ -178,6 +178,8 @@ struct hdmi_ip_data {
>> /* ti_hdmi_4xxx_ip private data. These should be in a separate struct
>> */
>> int hpd_gpio;
>> struct mutex lock;
>> + u8 edid_cached[256];
>> + unsigned edid_len;
>> };
>> int ti_hdmi_4xxx_phy_enable(struct hdmi_ip_data *ip_data);
>> void ti_hdmi_4xxx_phy_disable(struct hdmi_ip_data *ip_data);
>> diff --git a/drivers/video/omap2/dss/ti_hdmi_4xxx_ip.c
>> b/drivers/video/omap2/dss/ti_hdmi_4xxx_ip.c
>> index 04acca9..2633ade 100644
>> --- a/drivers/video/omap2/dss/ti_hdmi_4xxx_ip.c
>> +++ b/drivers/video/omap2/dss/ti_hdmi_4xxx_ip.c
>> @@ -243,10 +243,13 @@ static int hdmi_check_hpd_state(struct hdmi_ip_data
>> *ip_data)
>>
>> hpd = gpio_get_value(ip_data->hpd_gpio);
>>
>> - if (hpd)
>> + if (hpd) {
>> r = hdmi_set_phy_pwr(ip_data, HDMI_PHYPWRCMD_TXON);
>> - else
>> + } else {
>> + /* Invalidate EDID Cache */
>> + ip_data->edid_len = 0;
>> r = hdmi_set_phy_pwr(ip_data, HDMI_PHYPWRCMD_LDOON);
>> + }
>>
>> if (r) {
>> DSSERR("Failed to %s PHY TX power\n",
>> @@ -454,6 +457,11 @@ int ti_hdmi_4xxx_read_edid(struct hdmi_ip_data *ip_data,
>> {
>> int r, l;
>>
>> + if (ip_data->edid_len) {
>> + memcpy(edid, ip_data->edid_cached, ip_data->edid_len);
>> + return ip_data->edid_len;
>> + }
>> +
>> if (len < 128)
>> return -EINVAL;
>>
>> @@ -474,12 +482,21 @@ int ti_hdmi_4xxx_read_edid(struct hdmi_ip_data
>> *ip_data,
>> l += 128;
>> }
>>
>> + ip_data->edid_len = l;
>> + memcpy(ip_data->edid_cached, edid, l);
>> +
>> return l;
>> }
>>
>> bool ti_hdmi_4xxx_detect(struct hdmi_ip_data *ip_data)
>> {
>> - return gpio_get_value(ip_data->hpd_gpio);
>> + if (gpio_get_value(ip_data->hpd_gpio))
>> + return true;
>> +
>> + /* Invalidate EDID Cache */
>> + ip_data->edid_len = 0;
>> +
>> + return false;
>
> Why is this needed? The HPD interrupt should handle this already. And if
> the HPD interrupt doesn't work for some reason, this won't work either,
> as the user can plug and unplug his HDMI monitors a thousand times
> between two detect calls.
>
I thought it is almost impossible to unplug->plug cycle the HDMI cable
even twice a second, let alone 1000 times against the 10Hz .detect()
poll :) Or you mean some relay controlled HDMI switching
mechanism?
Anyways, that is not the point of this patch. This patch only aims to
avoid un-ncessary EDID reads while doing its best to make sure we
invalidate EDID 'as soon as possible'.
Thanks.
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html