OSDN Git Service

Merge branch 'exynos-drm-next' of git://git.kernel.org/pub/scm/linux/kernel/git/daein...
authorDave Airlie <airlied@redhat.com>
Fri, 13 Feb 2015 03:02:49 +0000 (13:02 +1000)
committerDave Airlie <airlied@redhat.com>
Fri, 13 Feb 2015 03:02:49 +0000 (13:02 +1000)
Summary:
- Add code cleanups and bug fixups.
- Add a new display controller dirver, DECON which is a new display
  controller of Exynos7 SoC. This device is much different from
  FIMD of Exynos4 and Exynos4 SoC series.

* 'exynos-drm-next' of git://git.kernel.org/pub/scm/linux/kernel/git/daeinki/drm-exynos:
  drm/exynos: Add DECON driver
  drm/exynos: fix NULL pointer reference
  drm/exynos: remove exynos_plane_dpms
  drm/exynos: remove mode property of exynos crtc
  drm/exynos: Remove exynos_plane_dpms() call with no effect
  drm/exynos: fix DMA_ATTR_NO_KERNEL_MAPPING usage
  drm/exynos: hdmi: replace fb size with mode size from win commit
  drm/exynos: fix no hdmi output
  drm/exynos: use driver internal struct
  drm/exynos: fix wrong pipe calculation for crtc
  drm/exynos: remove to use unnecessary MODULE_xxx macro
  drm/exynos: remove DRM_EXYNOS_DMABUF config
  drm/exynos: IOMMU support should not be selectable by user
  drm/exynos: add support for 'hdmi' clock

1  2 
drivers/gpu/drm/exynos/exynos_drm_plane.c
drivers/gpu/drm/exynos/exynos_mixer.c

@@@ -23,6 -23,7 +23,6 @@@ static const uint32_t formats[] = 
        DRM_FORMAT_XRGB8888,
        DRM_FORMAT_ARGB8888,
        DRM_FORMAT_NV12,
 -      DRM_FORMAT_NV12MT,
  };
  
  /*
@@@ -144,32 -145,6 +144,6 @@@ void exynos_plane_mode_set(struct drm_p
                exynos_crtc->ops->win_mode_set(exynos_crtc, exynos_plane);
  }
  
- void exynos_plane_dpms(struct drm_plane *plane, int mode)
- {
-       struct exynos_drm_plane *exynos_plane = to_exynos_plane(plane);
-       struct exynos_drm_crtc *exynos_crtc = to_exynos_crtc(plane->crtc);
-       if (mode == DRM_MODE_DPMS_ON) {
-               if (exynos_plane->enabled)
-                       return;
-               if (exynos_crtc->ops->win_enable)
-                       exynos_crtc->ops->win_enable(exynos_crtc,
-                                                    exynos_plane->zpos);
-               exynos_plane->enabled = true;
-       } else {
-               if (!exynos_plane->enabled)
-                       return;
-               if (exynos_crtc->ops->win_disable)
-                       exynos_crtc->ops->win_disable(exynos_crtc,
-                                                     exynos_plane->zpos);
-               exynos_plane->enabled = false;
-       }
- }
  int
  exynos_update_plane(struct drm_plane *plane, struct drm_crtc *crtc,
                     struct drm_framebuffer *fb, int crtc_x, int crtc_y,
  
  static int exynos_disable_plane(struct drm_plane *plane)
  {
-       exynos_plane_dpms(plane, DRM_MODE_DPMS_OFF);
+       struct exynos_drm_plane *exynos_plane = to_exynos_plane(plane);
+       struct exynos_drm_crtc *exynos_crtc = to_exynos_crtc(plane->crtc);
+       if (exynos_crtc->ops->win_disable)
+               exynos_crtc->ops->win_disable(exynos_crtc,
+                                             exynos_plane->zpos);
  
        return 0;
  }
@@@ -72,6 -72,7 +72,7 @@@ struct mixer_resources 
        spinlock_t              reg_slock;
        struct clk              *mixer;
        struct clk              *vp;
+       struct clk              *hdmi;
        struct clk              *sclk_mixer;
        struct clk              *sclk_hdmi;
        struct clk              *mout_mixer;
@@@ -412,6 -413,8 +413,6 @@@ static void vp_video_buffer(struct mixe
        win_data = &ctx->win_data[win];
  
        switch (win_data->pixel_format) {
 -      case DRM_FORMAT_NV12MT:
 -              tiled_mode = true;
        case DRM_FORMAT_NV12:
                crcb_mode = false;
                buf_num = 2;
@@@ -580,8 -583,8 +581,8 @@@ static void mixer_graph_buffer(struct m
        /* setup display size */
        if (ctx->mxr_ver == MXR_VER_128_0_0_184 &&
                win == MIXER_DEFAULT_WIN) {
-               val  = MXR_MXR_RES_HEIGHT(win_data->fb_height);
-               val |= MXR_MXR_RES_WIDTH(win_data->fb_width);
+               val  = MXR_MXR_RES_HEIGHT(win_data->mode_height);
+               val |= MXR_MXR_RES_WIDTH(win_data->mode_width);
                mixer_reg_write(res, MXR_RESOLUTION, val);
        }
  
@@@ -767,6 -770,12 +768,12 @@@ static int mixer_resources_init(struct 
                return -ENODEV;
        }
  
+       mixer_res->hdmi = devm_clk_get(dev, "hdmi");
+       if (IS_ERR(mixer_res->hdmi)) {
+               dev_err(dev, "failed to get clock 'hdmi'\n");
+               return PTR_ERR(mixer_res->hdmi);
+       }
        mixer_res->sclk_hdmi = devm_clk_get(dev, "sclk_hdmi");
        if (IS_ERR(mixer_res->sclk_hdmi)) {
                dev_err(dev, "failed to get clock 'sclk_hdmi'\n");
@@@ -1045,23 -1054,21 +1052,21 @@@ static void mixer_wait_for_vblank(struc
        drm_vblank_put(mixer_ctx->drm_dev, mixer_ctx->pipe);
  }
  
- static void mixer_window_suspend(struct exynos_drm_crtc *crtc)
+ static void mixer_window_suspend(struct mixer_context *ctx)
  {
-       struct mixer_context *ctx = crtc->ctx;
        struct hdmi_win_data *win_data;
        int i;
  
        for (i = 0; i < MIXER_WIN_NR; i++) {
                win_data = &ctx->win_data[i];
                win_data->resume = win_data->enabled;
-               mixer_win_disable(crtc, i);
+               mixer_win_disable(ctx->crtc, i);
        }
-       mixer_wait_for_vblank(crtc);
+       mixer_wait_for_vblank(ctx->crtc);
  }
  
- static void mixer_window_resume(struct exynos_drm_crtc *crtc)
+ static void mixer_window_resume(struct mixer_context *ctx)
  {
-       struct mixer_context *ctx = crtc->ctx;
        struct hdmi_win_data *win_data;
        int i;
  
                win_data->enabled = win_data->resume;
                win_data->resume = false;
                if (win_data->enabled)
-                       mixer_win_commit(crtc, i);
+                       mixer_win_commit(ctx->crtc, i);
        }
  }
  
- static void mixer_poweron(struct exynos_drm_crtc *crtc)
+ static void mixer_poweron(struct mixer_context *ctx)
  {
-       struct mixer_context *ctx = crtc->ctx;
        struct mixer_resources *res = &ctx->mixer_res;
  
        mutex_lock(&ctx->mixer_mutex);
        pm_runtime_get_sync(ctx->dev);
  
        clk_prepare_enable(res->mixer);
+       clk_prepare_enable(res->hdmi);
        if (ctx->vp_enabled) {
                clk_prepare_enable(res->vp);
                if (ctx->has_sclk)
        mixer_reg_write(res, MXR_INT_EN, ctx->int_en);
        mixer_win_reset(ctx);
  
-       mixer_window_resume(crtc);
+       mixer_window_resume(ctx);
  }
  
- static void mixer_poweroff(struct exynos_drm_crtc *crtc)
+ static void mixer_poweroff(struct mixer_context *ctx)
  {
-       struct mixer_context *ctx = crtc->ctx;
        struct mixer_resources *res = &ctx->mixer_res;
  
        mutex_lock(&ctx->mixer_mutex);
        mutex_unlock(&ctx->mixer_mutex);
  
        mixer_stop(ctx);
-       mixer_window_suspend(crtc);
+       mixer_window_suspend(ctx);
  
        ctx->int_en = mixer_reg_read(res, MXR_INT_EN);
  
        ctx->powered = false;
        mutex_unlock(&ctx->mixer_mutex);
  
+       clk_disable_unprepare(res->hdmi);
        clk_disable_unprepare(res->mixer);
        if (ctx->vp_enabled) {
                clk_disable_unprepare(res->vp);
@@@ -1143,12 -1150,12 +1148,12 @@@ static void mixer_dpms(struct exynos_dr
  {
        switch (mode) {
        case DRM_MODE_DPMS_ON:
-               mixer_poweron(crtc);
+               mixer_poweron(crtc->ctx);
                break;
        case DRM_MODE_DPMS_STANDBY:
        case DRM_MODE_DPMS_SUSPEND:
        case DRM_MODE_DPMS_OFF:
-               mixer_poweroff(crtc);
+               mixer_poweroff(crtc->ctx);
                break;
        default:
                DRM_DEBUG_KMS("unknown dpms mode: %d\n", mode);
@@@ -1247,18 -1254,19 +1252,19 @@@ static int mixer_bind(struct device *de
        struct drm_device *drm_dev = data;
        int ret;
  
+       ret = mixer_initialize(ctx, drm_dev);
+       if (ret)
+               return ret;
        ctx->crtc = exynos_drm_crtc_create(drm_dev, ctx->pipe,
                                     EXYNOS_DISPLAY_TYPE_HDMI,
                                     &mixer_crtc_ops, ctx);
        if (IS_ERR(ctx->crtc)) {
+               mixer_ctx_remove(ctx);
                ret = PTR_ERR(ctx->crtc);
                goto free_ctx;
        }
  
-       ret = mixer_initialize(ctx, drm_dev);
-       if (ret)
-               goto free_ctx;
        return 0;
  
  free_ctx: