[PATCH] [RFC] video: exynos dp: Making Exynos DP Compliant with CDF

Sean Paul seanpaul at chromium.org
Fri Jan 11 12:00:18 PST 2013


On Fri, Jan 11, 2013 at 5:35 AM, Leela Krishna Amudala
<l.krishna at samsung.com> wrote:
> The Exynos DP transmitter is treated as an end entity in the display pipeline
> and made this RFC patch compliant with CDF.
>
> Any suggestions are welcome.
>

A few comments below. It's hard to get too much of an appreciation for
what you're trying to do since a bunch of the interesting parts are
stubbed out.

> Signed-off-by: Leela Krishna Amudala <l.krishna at samsung.com>
> ---
>  drivers/video/display/display-core.c  |  2 +-
>  drivers/video/exynos/exynos_dp_core.c | 88 +++++++++++++++++++++++++++++++++++
>  drivers/video/exynos/exynos_dp_core.h |  6 +++
>  3 files changed, 95 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/video/display/display-core.c b/drivers/video/display/display-core.c
> index 5f8be30..dbad7e9 100644
> --- a/drivers/video/display/display-core.c
> +++ b/drivers/video/display/display-core.c
> @@ -15,7 +15,7 @@
>  #include <linux/list.h>
>  #include <linux/module.h>
>  #include <linux/mutex.h>
> -#include <linux/videomode.h>
> +#include <video/videomode.h>
>
>  #include <video/display.h>
>
> diff --git a/drivers/video/exynos/exynos_dp_core.c b/drivers/video/exynos/exynos_dp_core.c
> index 4ef18e2..0f8de27b 100644
> --- a/drivers/video/exynos/exynos_dp_core.c
> +++ b/drivers/video/exynos/exynos_dp_core.c
> @@ -23,6 +23,9 @@
>  #include <video/exynos_dp.h>
>
>  #include "exynos_dp_core.h"
> +#include <video/videomode.h>
> +#include <video/display.h>
> +#define to_panel(p) container_of(p, struct exynos_dp_device, entity)
>
>  static int exynos_dp_init_dp(struct exynos_dp_device *dp)
>  {
> @@ -1033,6 +1036,81 @@ static void exynos_dp_phy_exit(struct exynos_dp_device *dp)
>  }
>  #endif /* CONFIG_OF */
>
> +static int exynos_dp_power_on(struct exynos_dp_device *dp)
> +{
> +       struct platform_device *pdev = to_platform_device(dp->dev);
> +       struct exynos_dp_platdata *pdata = pdev->dev.platform_data;
> +
> +       if (dp->dev->of_node) {
> +               if (dp->phy_addr)
> +                       exynos_dp_phy_init(dp);
> +       } else {
> +               if (pdata->phy_init)
> +                       pdata->phy_init();
> +       }
> +
> +       clk_prepare_enable(dp->clock);
> +       exynos_dp_init_dp(dp);
> +       enable_irq(dp->irq);
> +
> +       return 0;
> +}
> +
> +static int dp_set_state(struct display_entity *entity,
> +                       enum display_entity_state state)
> +{
> +       struct exynos_dp_device *dp = to_panel(entity);
> +       struct platform_device *pdev = to_platform_device(dp->dev);
> +       int ret = 0;
> +
> +       switch (state) {
> +       case DISPLAY_ENTITY_STATE_OFF:
> +       case DISPLAY_ENTITY_STATE_STANDBY:
> +               ret = exynos_dp_remove(pdev);

This is incorrect, that is the module remove function. It seems like
it works right now since there's nothing permanent happening (like
platform data being freed), but there's no guarantee that this will
remain like that in the future.

IMO, you should factor out the common bits from remove and suspend
into a new function which is called from all three.

> +               break;
> +       case DISPLAY_ENTITY_STATE_ON:
> +               ret = exynos_dp_power_on(dp);
> +               break;
> +       }
> +       return ret;
> +}
> +
> +static int dp_get_modes(struct display_entity *entity,
> +                       const struct videomode **modes)
> +{
> +       /* Rework has to be done here*/
> +       return 1;

Returning 1 here is pretty risky since you didn't actually allocate or
populate a mode. I'm surprised this isn't causing some weird
side-effects for you.

> +}
> +
> +static int dp_get_size(struct display_entity *entity,
> +                       unsigned int *width, unsigned int *height)
> +{
> +       struct exynos_dp_device *dp = to_panel(entity);
> +       struct platform_device *pdev = to_platform_device(dp->dev);
> +       /*getting pdata in older way, rework has to be done  here to
> +         parse it from dt node */
> +       struct exynos_dp_platdata *pdata = pdev->dev.platform_data;
> +
> +       /*Rework has to be done here */
> +       *width = 1280;
> +       *height = 800;
> +       return 0;
> +}
> +
> +static int dp_update(struct display_entity *entity,
> +               void (*callback)(int, void *), void *data)
> +{
> +       /*Rework has to be done here*/
> +       return 0;
> +}
> +
> +static const struct display_entity_control_ops dp_control_ops = {
> +       .set_state = dp_set_state,
> +       .get_modes = dp_get_modes,
> +       .get_size = dp_get_size,
> +       .update = dp_update,
> +};
> +
>  static int exynos_dp_probe(struct platform_device *pdev)
>  {
>         struct resource *res;
> @@ -1111,6 +1189,16 @@ static int exynos_dp_probe(struct platform_device *pdev)
>
>         platform_set_drvdata(pdev, dp);
>
> +       /* setup panel entity */
> +       dp->entity.dev = &pdev->dev;
> +       dp->entity.release = exynos_dp_remove;
> +       dp->entity.ops = &dp_control_ops;
> +
> +       ret = display_entity_register(&dp->entity);
> +       if (ret < 0) {
> +               pr_err("failed to register display entity\n");
> +               return ret;
> +       }
>         return 0;
>  }
>
> diff --git a/drivers/video/exynos/exynos_dp_core.h b/drivers/video/exynos/exynos_dp_core.h
> index 6c567bb..eb18c10 100644
> --- a/drivers/video/exynos/exynos_dp_core.h
> +++ b/drivers/video/exynos/exynos_dp_core.h
> @@ -13,6 +13,8 @@
>  #ifndef _EXYNOS_DP_CORE_H
>  #define _EXYNOS_DP_CORE_H
>
> +#include <video/display.h>
> +
>  enum dp_irq_type {
>         DP_IRQ_TYPE_HP_CABLE_IN,
>         DP_IRQ_TYPE_HP_CABLE_OUT,
> @@ -42,6 +44,7 @@ struct exynos_dp_device {
>         struct video_info       *video_info;
>         struct link_train       link_train;
>         struct work_struct      hotplug_work;
> +       struct display_entity   entity;
>  };
>
>  /* exynos_dp_reg.c */
> @@ -133,6 +136,9 @@ void exynos_dp_config_video_slave_mode(struct exynos_dp_device *dp);
>  void exynos_dp_enable_scrambling(struct exynos_dp_device *dp);
>  void exynos_dp_disable_scrambling(struct exynos_dp_device *dp);
>
> +static int exynos_dp_power_on(struct exynos_dp_device *dp);
> +static int exynos_dp_remove(struct platform_device *pdev);
> +

You can just move the functions around the file as needed and avoid
the forward declaration.

>  /* I2C EDID Chip ID, Slave Address */
>  #define I2C_EDID_DEVICE_ADDR                   0x50
>  #define I2C_E_EDID_DEVICE_ADDR                 0x30
> --
> 1.8.0
>
> _______________________________________________
> dri-devel mailing list
> dri-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/dri-devel


More information about the dri-devel mailing list