Re: [PATCH 43/47] adv7604: Control hot-plug detect through a GPIO

2014-02-13 Thread Hans Verkuil
On 02/11/14 13:03, Laurent Pinchart wrote:
 Hi Hans,
 
 On Tuesday 11 February 2014 11:09:31 Hans Verkuil wrote:
 On 02/05/14 17:42, Laurent Pinchart wrote:
 Replace the ADV7604-specific hotplug notifier with a GPIO to control the
 HPD pin directly instead of going through the bridge driver.

 Hmm, that's not going to work for me. I don't have a GPIO pin here, instead
 it is a bit in a register that I have to set.
 
 But that bit controls a GPIO, doesn't it ? In that case it should be exposed 
 as a GPIO controller.

I feel unhappy about losing this notifier for two reasons: first adding a GPIO
controller just to toggle a bit adds 40 lines to my driver, and that doesn't
sit well with me. It's basically completely unnecessary overhead.

The second reason is that in some cases you want to do something in addition
to just toggling the hotplug pin. In particular for CEC support this could be
quite useful.

In fact, if the adv7604 supports the ARC feature (Audio Return Channel), then
this is really needed because in that case the hotplug toggling would have
to be done via CEC CDC commands. However, while this webpage claims that the
ARC is supported, I can't find any other information about that.

http://www.analog.com/en/audiovideo-products/analoghdmidvi-interfaces/adv7604/products/product.html

Lars-Peter, do you know anything about ARC support in the adv7604?

Regards,

Hans
--
To unsubscribe from this list: send the line unsubscribe linux-media in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 43/47] adv7604: Control hot-plug detect through a GPIO

2014-02-13 Thread Lars-Peter Clausen

On 02/13/2014 10:47 AM, Hans Verkuil wrote:

On 02/11/14 13:03, Laurent Pinchart wrote:

Hi Hans,

On Tuesday 11 February 2014 11:09:31 Hans Verkuil wrote:

On 02/05/14 17:42, Laurent Pinchart wrote:

Replace the ADV7604-specific hotplug notifier with a GPIO to control the
HPD pin directly instead of going through the bridge driver.


Hmm, that's not going to work for me. I don't have a GPIO pin here, instead
it is a bit in a register that I have to set.


But that bit controls a GPIO, doesn't it ? In that case it should be exposed
as a GPIO controller.


I feel unhappy about losing this notifier for two reasons: first adding a GPIO
controller just to toggle a bit adds 40 lines to my driver, and that doesn't
sit well with me. It's basically completely unnecessary overhead.



I don't think it's a problem to just keep the hotplug event for now. It is 
not a block for other features, so we can just leave it in.



The second reason is that in some cases you want to do something in addition
to just toggling the hotplug pin. In particular for CEC support this could be
quite useful.

In fact, if the adv7604 supports the ARC feature (Audio Return Channel), then
this is really needed because in that case the hotplug toggling would have
to be done via CEC CDC commands. However, while this webpage claims that the
ARC is supported, I can't find any other information about that.

http://www.analog.com/en/audiovideo-products/analoghdmidvi-interfaces/adv7604/products/product.html

Lars-Peter, do you know anything about ARC support in the adv7604?


No, I think that might be a mistake on the website, but I'll check with 
somebody who knows more about this than me.


- Lars

--
To unsubscribe from this list: send the line unsubscribe linux-media in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 43/47] adv7604: Control hot-plug detect through a GPIO

2014-02-13 Thread Laurent Pinchart
Hi Hans,

On Thursday 13 February 2014 10:47:44 Hans Verkuil wrote:
 On 02/11/14 13:03, Laurent Pinchart wrote:
  On Tuesday 11 February 2014 11:09:31 Hans Verkuil wrote:
  On 02/05/14 17:42, Laurent Pinchart wrote:
  Replace the ADV7604-specific hotplug notifier with a GPIO to control the
  HPD pin directly instead of going through the bridge driver.
  
  Hmm, that's not going to work for me. I don't have a GPIO pin here,
  instead it is a bit in a register that I have to set.
  
  But that bit controls a GPIO, doesn't it ? In that case it should be
  exposed as a GPIO controller.
 
 I feel unhappy about losing this notifier for two reasons: first adding a
 GPIO controller just to toggle a bit adds 40 lines to my driver, and that
 doesn't sit well with me. It's basically completely unnecessary overhead.
 
 The second reason is that in some cases you want to do something in addition
 to just toggling the hotplug pin. In particular for CEC support this could
 be quite useful.

As discuss over IRC, I'll keep the HPD notification and add optional GPIO 
support in v2.

 In fact, if the adv7604 supports the ARC feature (Audio Return Channel),
 then this is really needed because in that case the hotplug toggling would
 have to be done via CEC CDC commands. However, while this webpage claims
 that the ARC is supported, I can't find any other information about that.
 
 http://www.analog.com/en/audiovideo-products/analoghdmidvi-interfaces/adv760
 4/products/product.html
 
 Lars-Peter, do you know anything about ARC support in the adv7604?

-- 
Regards,

Laurent Pinchart

--
To unsubscribe from this list: send the line unsubscribe linux-media in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 43/47] adv7604: Control hot-plug detect through a GPIO

2014-02-11 Thread Hans Verkuil
On 02/05/14 17:42, Laurent Pinchart wrote:
 Replace the ADV7604-specific hotplug notifier with a GPIO to control the
 HPD pin directly instead of going through the bridge driver.

Hmm, that's not going to work for me. I don't have a GPIO pin here, instead
it is a bit in a register that I have to set.

 
 Signed-off-by: Laurent Pinchart laurent.pinch...@ideasonboard.com
 ---
  drivers/media/i2c/adv7604.c | 47 
 +
  include/media/adv7604.h |  5 -
  2 files changed, 47 insertions(+), 5 deletions(-)
 
 diff --git a/drivers/media/i2c/adv7604.c b/drivers/media/i2c/adv7604.c
 index 369cb1e..2f38071 100644
 --- a/drivers/media/i2c/adv7604.c
 +++ b/drivers/media/i2c/adv7604.c
 @@ -28,6 +28,7 @@
   */
  
  #include linux/delay.h
 +#include linux/gpio.h
  #include linux/i2c.h
  #include linux/kernel.h
  #include linux/module.h
 @@ -608,6 +609,23 @@ static inline int edid_write_block(struct v4l2_subdev 
 *sd,
   return err;
  }
  
 +static void adv7604_set_hpd(struct adv7604_state *state, unsigned int hpd)
 +{
 + unsigned int i;
 +
 + for (i = 0; i  state-info-num_dv_ports; ++i) {
 + unsigned int enable = hpd  BIT(i);
 +
 + if (IS_ERR_VALUE(state-pdata.hpd_gpio[i]))

IS_ERR_VALUE: that's normally used for pointers, not integers. I would
much prefer something simple like 'bool hpd_use_gpio[4]'.

Regards,

Hans

 + continue;
 +
 + if (state-pdata.hpd_gpio_low[i])
 + enable = !enable;
 +
 + gpio_set_value_cansleep(state-pdata.hpd_gpio[i], enable);
 + }
 +}
 +
  static void adv7604_delayed_work_enable_hotplug(struct work_struct *work)
  {
   struct delayed_work *dwork = to_delayed_work(work);
 @@ -617,7 +635,7 @@ static void adv7604_delayed_work_enable_hotplug(struct 
 work_struct *work)
  
   v4l2_dbg(2, debug, sd, %s: enable hotplug\n, __func__);
  
 - v4l2_subdev_notify(sd, ADV7604_HOTPLUG, (void *)state-edid.present);
 + adv7604_set_hpd(state, state-edid.present);
  }
  
  static inline int hdmi_read(struct v4l2_subdev *sd, u8 reg)
 @@ -2022,7 +2040,6 @@ static int adv7604_set_edid(struct v4l2_subdev *sd, 
 struct v4l2_subdev_edid *edi
   struct adv7604_state *state = to_state(sd);
   const struct adv7604_chip_info *info = state-info;
   int spa_loc;
 - int tmp = 0;
   int err;
   int i;
  
 @@ -2033,7 +2050,7 @@ static int adv7604_set_edid(struct v4l2_subdev *sd, 
 struct v4l2_subdev_edid *edi
   if (edid-blocks == 0) {
   /* Disable hotplug and I2C access to EDID RAM from DDC port */
   state-edid.present = ~(1  edid-pad);
 - v4l2_subdev_notify(sd, ADV7604_HOTPLUG, (void 
 *)state-edid.present);
 + adv7604_set_hpd(state, state-edid.present);
   rep_write_clr_set(sd, info-edid_enable_reg, 0x0f, 
 state-edid.present);
  
   /* Fall back to a 16:9 aspect ratio */
 @@ -2059,7 +2076,7 @@ static int adv7604_set_edid(struct v4l2_subdev *sd, 
 struct v4l2_subdev_edid *edi
  
   /* Disable hotplug and I2C access to EDID RAM from DDC port */
   cancel_delayed_work_sync(state-delayed_work_enable_hotplug);
 - v4l2_subdev_notify(sd, ADV7604_HOTPLUG, (void *)tmp);
 + adv7604_set_hpd(state, 0);
   rep_write_clr_set(sd, info-edid_enable_reg, 0x0f, 0x00);
  
   spa_loc = get_edid_spa_location(edid-edid);
 @@ -2655,6 +2672,28 @@ static int adv7604_probe(struct i2c_client *client,
   return -ENODEV;
   }
   state-pdata = *pdata;
 +
 + /* Request GPIOs. */
 + for (i = 0; i  state-info-num_dv_ports; ++i) {
 + char name[5];
 +
 + if (IS_ERR_VALUE(state-pdata.hpd_gpio[i]))
 + continue;
 +
 + sprintf(name, hpd%u, i);
 + err = devm_gpio_request_one(client-dev,
 + state-pdata.hpd_gpio[i],
 + state-pdata.hpd_gpio_low[i] ?
 + GPIOF_OUT_INIT_HIGH :
 + GPIOF_OUT_INIT_LOW,
 + name);
 + if (err  0) {
 + v4l_err(client, Failed to request HPD %u GPIO (%u)\n,
 + i, state-pdata.hpd_gpio[i]);
 + return err;
 + }
 + }
 +
   state-timings = cea640x480;
   state-format = adv7604_format_info(state, V4L2_MBUS_FMT_YUYV8_2X8);
  
 diff --git a/include/media/adv7604.h b/include/media/adv7604.h
 index 4da678c..dddb0cb 100644
 --- a/include/media/adv7604.h
 +++ b/include/media/adv7604.h
 @@ -90,6 +90,10 @@ struct adv7604_platform_data {
   /* DIS_CABLE_DET_RST: 1 if the 5V pins are unused and unconnected */
   unsigned disable_cable_det_rst:1;
  
 + /* Hot-Plug Detect control GPIOs */
 + int hpd_gpio[4];
 + bool hpd_gpio_low[4];
 +
   /* Analog 

Re: [PATCH 43/47] adv7604: Control hot-plug detect through a GPIO

2014-02-11 Thread Laurent Pinchart
Hi Hans,

On Tuesday 11 February 2014 11:09:31 Hans Verkuil wrote:
 On 02/05/14 17:42, Laurent Pinchart wrote:
  Replace the ADV7604-specific hotplug notifier with a GPIO to control the
  HPD pin directly instead of going through the bridge driver.
 
 Hmm, that's not going to work for me. I don't have a GPIO pin here, instead
 it is a bit in a register that I have to set.

But that bit controls a GPIO, doesn't it ? In that case it should be exposed 
as a GPIO controller.

  Signed-off-by: Laurent Pinchart laurent.pinch...@ideasonboard.com
  ---
  
   drivers/media/i2c/adv7604.c | 47 
   include/media/adv7604.h |  5 -
   2 files changed, 47 insertions(+), 5 deletions(-)
  
  diff --git a/drivers/media/i2c/adv7604.c b/drivers/media/i2c/adv7604.c
  index 369cb1e..2f38071 100644
  --- a/drivers/media/i2c/adv7604.c
  +++ b/drivers/media/i2c/adv7604.c
  @@ -28,6 +28,7 @@
*/
   
   #include linux/delay.h
  +#include linux/gpio.h
   #include linux/i2c.h
   #include linux/kernel.h
   #include linux/module.h
  @@ -608,6 +609,23 @@ static inline int edid_write_block(struct v4l2_subdev
  *sd,
  return err;
   }
  
  +static void adv7604_set_hpd(struct adv7604_state *state, unsigned int
  hpd)
  +{
  +   unsigned int i;
  +
  +   for (i = 0; i  state-info-num_dv_ports; ++i) {
  +   unsigned int enable = hpd  BIT(i);
  +
  +   if (IS_ERR_VALUE(state-pdata.hpd_gpio[i]))
 
 IS_ERR_VALUE: that's normally used for pointers, not integers. I would
 much prefer something simple like 'bool hpd_use_gpio[4]'.

I've reworked this to use the gpiod_* API, I'll post v2 when the whole set 
will be reviewed.

  +   continue;
  +
  +   if (state-pdata.hpd_gpio_low[i])
  +   enable = !enable;
  +
  +   gpio_set_value_cansleep(state-pdata.hpd_gpio[i], enable);
  +   }
  +}
  +
  
   static void adv7604_delayed_work_enable_hotplug(struct work_struct *work)
   {
  struct delayed_work *dwork = to_delayed_work(work);
  @@ -617,7 +635,7 @@ static void adv7604_delayed_work_enable_hotplug(struct
  work_struct *work) 
  v4l2_dbg(2, debug, sd, %s: enable hotplug\n, __func__);
  
  -   v4l2_subdev_notify(sd, ADV7604_HOTPLUG, (void *)state-
edid.present);
  +   adv7604_set_hpd(state, state-edid.present);
   }
   
   static inline int hdmi_read(struct v4l2_subdev *sd, u8 reg)
  @@ -2022,7 +2040,6 @@ static int adv7604_set_edid(struct v4l2_subdev *sd,
  struct v4l2_subdev_edid *edi 
  struct adv7604_state *state = to_state(sd);
  const struct adv7604_chip_info *info = state-info;
  int spa_loc;
  -   int tmp = 0;
  int err;
  int i;
  
  @@ -2033,7 +2050,7 @@ static int adv7604_set_edid(struct v4l2_subdev *sd,
  struct v4l2_subdev_edid *edi 
  if (edid-blocks == 0) {
  /* Disable hotplug and I2C access to EDID RAM from DDC port */
  state-edid.present = ~(1  edid-pad);
  -   v4l2_subdev_notify(sd, ADV7604_HOTPLUG, (void *)state-
edid.present);
  +   adv7604_set_hpd(state, state-edid.present);
  rep_write_clr_set(sd, info-edid_enable_reg, 0x0f,
  state-edid.present);
  /* Fall back to a 16:9 aspect ratio */
  @@ -2059,7 +2076,7 @@ static int adv7604_set_edid(struct v4l2_subdev *sd,
  struct v4l2_subdev_edid *edi
  /* Disable hotplug and I2C access to EDID RAM from DDC port */
  cancel_delayed_work_sync(state-delayed_work_enable_hotplug);
  
  -   v4l2_subdev_notify(sd, ADV7604_HOTPLUG, (void *)tmp);
  +   adv7604_set_hpd(state, 0);
  
  rep_write_clr_set(sd, info-edid_enable_reg, 0x0f, 0x00);
  
  spa_loc = get_edid_spa_location(edid-edid);
  @@ -2655,6 +2672,28 @@ static int adv7604_probe(struct i2c_client *client,
  return -ENODEV;
  }
  state-pdata = *pdata;
  +
  +   /* Request GPIOs. */
  +   for (i = 0; i  state-info-num_dv_ports; ++i) {
  +   char name[5];
  +
  +   if (IS_ERR_VALUE(state-pdata.hpd_gpio[i]))
  +   continue;
  +
  +   sprintf(name, hpd%u, i);
  +   err = devm_gpio_request_one(client-dev,
  +   state-pdata.hpd_gpio[i],
  +   state-pdata.hpd_gpio_low[i] ?
  +   GPIOF_OUT_INIT_HIGH :
  +   GPIOF_OUT_INIT_LOW,
  +   name);
  +   if (err  0) {
  +   v4l_err(client, Failed to request HPD %u GPIO (%u)\n,
  +   i, state-pdata.hpd_gpio[i]);
  +   return err;
  +   }
  +   }
  +
  
  state-timings = cea640x480;
  state-format = adv7604_format_info(state, V4L2_MBUS_FMT_YUYV8_2X8);
  diff --git a/include/media/adv7604.h b/include/media/adv7604.h
  index 4da678c..dddb0cb 100644
  --- a/include/media/adv7604.h
  +++ b/include/media/adv7604.h
  @@ -90,6 +90,10 @@ struct 

Re: [PATCH 43/47] adv7604: Control hot-plug detect through a GPIO

2014-02-10 Thread Laurent Pinchart
Hi Lars,

On Thursday 06 February 2014 14:10:05 Lars-Peter Clausen wrote:
 On 02/05/2014 05:42 PM, Laurent Pinchart wrote:
  Replace the ADV7604-specific hotplug notifier with a GPIO to control the
  HPD pin directly instead of going through the bridge driver.
  
  Signed-off-by: Laurent Pinchart laurent.pinch...@ideasonboard.com
 
 This should probably use the new GPIO descriptor API[1]. It will make things
 a bit simpler as it allows to move the active low handling to the gpio
 subsystem. The other thing is that it makes integration with devicetree
 nicer.

Agreed. I'll fix that for the next version.

-- 
Regards,

Laurent Pinchart

--
To unsubscribe from this list: send the line unsubscribe linux-media in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 43/47] adv7604: Control hot-plug detect through a GPIO

2014-02-06 Thread Lars-Peter Clausen

On 02/05/2014 05:42 PM, Laurent Pinchart wrote:

Replace the ADV7604-specific hotplug notifier with a GPIO to control the
HPD pin directly instead of going through the bridge driver.

Signed-off-by: Laurent Pinchart laurent.pinch...@ideasonboard.com


This should probably use the new GPIO descriptor API[1]. It will make things 
a bit simpler as it allows to move the active low handling to the gpio 
subsystem. The other thing is that it makes integration with devicetree nicer.


- Lars

[1] 
http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/include/linux/gpio/consumer.h



--
To unsubscribe from this list: send the line unsubscribe linux-media in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html