[PATCH V4 07/10] drm/bridge: ptn3460: Support bridge chaining

2014-06-20 Thread Ajay kumar
ping.

On Wed, Jun 11, 2014 at 11:57 PM, Ajay Kumar  
wrote:
> Modify the driver to invoke callbacks for the next bridge
> in the bridge chain.
> Also, remove the drm_connector implementation from ptn3460,
> since the same is implemented using panel_binder.
>
> Signed-off-by: Ajay Kumar 
> ---
>  drivers/gpu/drm/bridge/ptn3460.c|  136 
> +--
>  drivers/gpu/drm/exynos/exynos_dp_core.c |   16 ++--
>  include/drm/bridge/ptn3460.h|   15 ++--
>  3 files changed, 39 insertions(+), 128 deletions(-)
>
> diff --git a/drivers/gpu/drm/bridge/ptn3460.c 
> b/drivers/gpu/drm/bridge/ptn3460.c
> index 98fd17a..21e9db8 100644
> --- a/drivers/gpu/drm/bridge/ptn3460.c
> +++ b/drivers/gpu/drm/bridge/ptn3460.c
> @@ -34,37 +34,15 @@
>  #define PTN3460_EDID_SRAM_LOAD_ADDR0x85
>
>  struct ptn3460_bridge {
> -   struct drm_connector connector;
> struct i2c_client *client;
> struct drm_encoder *encoder;
> struct drm_bridge *bridge;
> -   struct edid *edid;
> int gpio_pd_n;
> int gpio_rst_n;
> u32 edid_emulation;
> bool enabled;
>  };
>
> -static int ptn3460_read_bytes(struct ptn3460_bridge *ptn_bridge, char addr,
> -   u8 *buf, int len)
> -{
> -   int ret;
> -
> -   ret = i2c_master_send(ptn_bridge->client, , 1);
> -   if (ret <= 0) {
> -   DRM_ERROR("Failed to send i2c command, ret=%d\n", ret);
> -   return ret;
> -   }
> -
> -   ret = i2c_master_recv(ptn_bridge->client, buf, len);
> -   if (ret <= 0) {
> -   DRM_ERROR("Failed to recv i2c data, ret=%d\n", ret);
> -   return ret;
> -   }
> -
> -   return 0;
> -}
> -
>  static int ptn3460_write_byte(struct ptn3460_bridge *ptn_bridge, char addr,
> char val)
>  {
> @@ -126,6 +104,8 @@ static void ptn3460_pre_enable(struct drm_bridge *bridge)
> gpio_set_value(ptn_bridge->gpio_rst_n, 1);
> }
>
> +   drm_next_bridge_pre_enable(bridge);
> +
> /*
>  * There's a bug in the PTN chip where it falsely asserts hotplug 
> before
>  * it is fully functional. We're forced to wait for the maximum start 
> up
> @@ -142,6 +122,7 @@ static void ptn3460_pre_enable(struct drm_bridge *bridge)
>
>  static void ptn3460_enable(struct drm_bridge *bridge)
>  {
> +   drm_next_bridge_enable(bridge);
>  }
>
>  static void ptn3460_disable(struct drm_bridge *bridge)
> @@ -153,6 +134,8 @@ static void ptn3460_disable(struct drm_bridge *bridge)
>
> ptn_bridge->enabled = false;
>
> +   drm_next_bridge_disable(bridge);
> +
> if (gpio_is_valid(ptn_bridge->gpio_rst_n))
> gpio_set_value(ptn_bridge->gpio_rst_n, 1);
>
> @@ -162,6 +145,7 @@ static void ptn3460_disable(struct drm_bridge *bridge)
>
>  static void ptn3460_post_disable(struct drm_bridge *bridge)
>  {
> +   drm_next_bridge_post_disable(bridge);
>  }
>
>  void ptn3460_bridge_destroy(struct drm_bridge *bridge)
> @@ -173,6 +157,9 @@ void ptn3460_bridge_destroy(struct drm_bridge *bridge)
> gpio_free(ptn_bridge->gpio_pd_n);
> if (gpio_is_valid(ptn_bridge->gpio_rst_n))
> gpio_free(ptn_bridge->gpio_rst_n);
> +
> +   drm_next_bridge_destroy(bridge);
> +
> /* Nothing else to free, we've got devm allocated memory */
>  }
>
> @@ -184,81 +171,10 @@ struct drm_bridge_funcs ptn3460_bridge_funcs = {
> .destroy = ptn3460_bridge_destroy,
>  };
>
> -int ptn3460_get_modes(struct drm_connector *connector)
> -{
> -   struct ptn3460_bridge *ptn_bridge;
> -   u8 *edid;
> -   int ret, num_modes;
> -   bool power_off;
> -
> -   ptn_bridge = container_of(connector, struct ptn3460_bridge, 
> connector);
> -
> -   if (ptn_bridge->edid)
> -   return drm_add_edid_modes(connector, ptn_bridge->edid);
> -
> -   power_off = !ptn_bridge->enabled;
> -   ptn3460_pre_enable(ptn_bridge->bridge);
> -
> -   edid = kmalloc(EDID_LENGTH, GFP_KERNEL);
> -   if (!edid) {
> -   DRM_ERROR("Failed to allocate edid\n");
> -   return 0;
> -   }
> -
> -   ret = ptn3460_read_bytes(ptn_bridge, PTN3460_EDID_ADDR, edid,
> -   EDID_LENGTH);
> -   if (ret) {
> -   kfree(edid);
> -   num_modes = 0;
> -   goto out;
> -   }
> -
> -   ptn_bridge->edid = (struct edid *)edid;
> -   drm_mode_connector_update_edid_property(connector, ptn_bridge->edid);
> -
> -   num_modes = drm_add_edid_modes(connector, ptn_bridge->edid);
> -
> -out:
> -   if (power_off)
> -   ptn3460_disable(ptn_bridge->bridge);
> -
> -   return num_modes;
> -}
> -
> -struct drm_encoder *ptn3460_best_encoder(struct drm_connector *connector)
> -{
> -   struct ptn3460_bridge *ptn_bridge;
> -
> -   ptn_bridge = container_of(connector, struct ptn3460_bridge, 
> connector);
> -
> -   return 

[PATCH V4 07/10] drm/bridge: ptn3460: Support bridge chaining

2014-06-12 Thread Ajay Kumar
Modify the driver to invoke callbacks for the next bridge
in the bridge chain.
Also, remove the drm_connector implementation from ptn3460,
since the same is implemented using panel_binder.

Signed-off-by: Ajay Kumar 
---
 drivers/gpu/drm/bridge/ptn3460.c|  136 +--
 drivers/gpu/drm/exynos/exynos_dp_core.c |   16 ++--
 include/drm/bridge/ptn3460.h|   15 ++--
 3 files changed, 39 insertions(+), 128 deletions(-)

diff --git a/drivers/gpu/drm/bridge/ptn3460.c b/drivers/gpu/drm/bridge/ptn3460.c
index 98fd17a..21e9db8 100644
--- a/drivers/gpu/drm/bridge/ptn3460.c
+++ b/drivers/gpu/drm/bridge/ptn3460.c
@@ -34,37 +34,15 @@
 #define PTN3460_EDID_SRAM_LOAD_ADDR0x85

 struct ptn3460_bridge {
-   struct drm_connector connector;
struct i2c_client *client;
struct drm_encoder *encoder;
struct drm_bridge *bridge;
-   struct edid *edid;
int gpio_pd_n;
int gpio_rst_n;
u32 edid_emulation;
bool enabled;
 };

-static int ptn3460_read_bytes(struct ptn3460_bridge *ptn_bridge, char addr,
-   u8 *buf, int len)
-{
-   int ret;
-
-   ret = i2c_master_send(ptn_bridge->client, , 1);
-   if (ret <= 0) {
-   DRM_ERROR("Failed to send i2c command, ret=%d\n", ret);
-   return ret;
-   }
-
-   ret = i2c_master_recv(ptn_bridge->client, buf, len);
-   if (ret <= 0) {
-   DRM_ERROR("Failed to recv i2c data, ret=%d\n", ret);
-   return ret;
-   }
-
-   return 0;
-}
-
 static int ptn3460_write_byte(struct ptn3460_bridge *ptn_bridge, char addr,
char val)
 {
@@ -126,6 +104,8 @@ static void ptn3460_pre_enable(struct drm_bridge *bridge)
gpio_set_value(ptn_bridge->gpio_rst_n, 1);
}

+   drm_next_bridge_pre_enable(bridge);
+
/*
 * There's a bug in the PTN chip where it falsely asserts hotplug before
 * it is fully functional. We're forced to wait for the maximum start up
@@ -142,6 +122,7 @@ static void ptn3460_pre_enable(struct drm_bridge *bridge)

 static void ptn3460_enable(struct drm_bridge *bridge)
 {
+   drm_next_bridge_enable(bridge);
 }

 static void ptn3460_disable(struct drm_bridge *bridge)
@@ -153,6 +134,8 @@ static void ptn3460_disable(struct drm_bridge *bridge)

ptn_bridge->enabled = false;

+   drm_next_bridge_disable(bridge);
+
if (gpio_is_valid(ptn_bridge->gpio_rst_n))
gpio_set_value(ptn_bridge->gpio_rst_n, 1);

@@ -162,6 +145,7 @@ static void ptn3460_disable(struct drm_bridge *bridge)

 static void ptn3460_post_disable(struct drm_bridge *bridge)
 {
+   drm_next_bridge_post_disable(bridge);
 }

 void ptn3460_bridge_destroy(struct drm_bridge *bridge)
@@ -173,6 +157,9 @@ void ptn3460_bridge_destroy(struct drm_bridge *bridge)
gpio_free(ptn_bridge->gpio_pd_n);
if (gpio_is_valid(ptn_bridge->gpio_rst_n))
gpio_free(ptn_bridge->gpio_rst_n);
+
+   drm_next_bridge_destroy(bridge);
+
/* Nothing else to free, we've got devm allocated memory */
 }

@@ -184,81 +171,10 @@ struct drm_bridge_funcs ptn3460_bridge_funcs = {
.destroy = ptn3460_bridge_destroy,
 };

-int ptn3460_get_modes(struct drm_connector *connector)
-{
-   struct ptn3460_bridge *ptn_bridge;
-   u8 *edid;
-   int ret, num_modes;
-   bool power_off;
-
-   ptn_bridge = container_of(connector, struct ptn3460_bridge, connector);
-
-   if (ptn_bridge->edid)
-   return drm_add_edid_modes(connector, ptn_bridge->edid);
-
-   power_off = !ptn_bridge->enabled;
-   ptn3460_pre_enable(ptn_bridge->bridge);
-
-   edid = kmalloc(EDID_LENGTH, GFP_KERNEL);
-   if (!edid) {
-   DRM_ERROR("Failed to allocate edid\n");
-   return 0;
-   }
-
-   ret = ptn3460_read_bytes(ptn_bridge, PTN3460_EDID_ADDR, edid,
-   EDID_LENGTH);
-   if (ret) {
-   kfree(edid);
-   num_modes = 0;
-   goto out;
-   }
-
-   ptn_bridge->edid = (struct edid *)edid;
-   drm_mode_connector_update_edid_property(connector, ptn_bridge->edid);
-
-   num_modes = drm_add_edid_modes(connector, ptn_bridge->edid);
-
-out:
-   if (power_off)
-   ptn3460_disable(ptn_bridge->bridge);
-
-   return num_modes;
-}
-
-struct drm_encoder *ptn3460_best_encoder(struct drm_connector *connector)
-{
-   struct ptn3460_bridge *ptn_bridge;
-
-   ptn_bridge = container_of(connector, struct ptn3460_bridge, connector);
-
-   return ptn_bridge->encoder;
-}
-
-struct drm_connector_helper_funcs ptn3460_connector_helper_funcs = {
-   .get_modes = ptn3460_get_modes,
-   .best_encoder = ptn3460_best_encoder,
-};
-
-enum drm_connector_status ptn3460_detect(struct drm_connector *connector,
-   bool force)
-{
-   return connector_status_connected;
-}
-
-void