drm/rcar-du: Merge LVDS and VGA encoder code
authorLaurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Sat, 15 Jun 2013 13:02:12 +0000 (15:02 +0200)
committerLaurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Fri, 9 Aug 2013 21:17:43 +0000 (23:17 +0200)
Create a single rcar_du_encoder structure that implements a KMS encoder.
The current implementation is straightforward and only configures CRTC
output routing.

Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
drivers/gpu/drm/rcar-du/Makefile
drivers/gpu/drm/rcar-du/rcar_du_crtc.c
drivers/gpu/drm/rcar-du/rcar_du_encoder.c [moved from drivers/gpu/drm/rcar-du/rcar_du_lvds.c with 53% similarity]
drivers/gpu/drm/rcar-du/rcar_du_encoder.h [new file with mode: 0644]
drivers/gpu/drm/rcar-du/rcar_du_kms.c
drivers/gpu/drm/rcar-du/rcar_du_kms.h
drivers/gpu/drm/rcar-du/rcar_du_lvds.h [deleted file]
drivers/gpu/drm/rcar-du/rcar_du_lvdscon.c
drivers/gpu/drm/rcar-du/rcar_du_vga.c [deleted file]
drivers/gpu/drm/rcar-du/rcar_du_vga.h [deleted file]
drivers/gpu/drm/rcar-du/rcar_du_vgacon.c

index 45a8479..57b0fe1 100644 (file)
@@ -1,10 +1,9 @@
 rcar-du-drm-y := rcar_du_crtc.o \
                 rcar_du_drv.o \
+                rcar_du_encoder.o \
                 rcar_du_kms.o \
-                rcar_du_lvds.o \
                 rcar_du_lvdscon.o \
                 rcar_du_plane.o \
-                rcar_du_vga.o \
                 rcar_du_vgacon.o
 
 obj-$(CONFIG_DRM_RCAR_DU)      += rcar-du-drm.o
index aefc8a0..03dd701 100644 (file)
 #include "rcar_du_crtc.h"
 #include "rcar_du_drv.h"
 #include "rcar_du_kms.h"
-#include "rcar_du_lvds.h"
 #include "rcar_du_plane.h"
 #include "rcar_du_regs.h"
-#include "rcar_du_vga.h"
 
 #define to_rcar_crtc(c)        container_of(c, struct rcar_du_crtc, crtc)
 
similarity index 53%
rename from drivers/gpu/drm/rcar-du/rcar_du_lvds.c
rename to drivers/gpu/drm/rcar-du/rcar_du_encoder.c
index 82e5157..15a5643 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * rcar_du_lvds.c  --  R-Car Display Unit LVDS Encoder
+ * rcar_du_encoder.c  --  R-Car Display Unit Encoder
  *
  * Copyright (C) 2013 Renesas Corporation
  *
 #include <drm/drm_crtc_helper.h>
 
 #include "rcar_du_drv.h"
+#include "rcar_du_encoder.h"
 #include "rcar_du_kms.h"
-#include "rcar_du_lvds.h"
 #include "rcar_du_lvdscon.h"
+#include "rcar_du_vgacon.h"
 
-static void rcar_du_lvds_encoder_dpms(struct drm_encoder *encoder, int mode)
+/* -----------------------------------------------------------------------------
+ * Common connector functions
+ */
+
+struct drm_encoder *
+rcar_du_connector_best_encoder(struct drm_connector *connector)
 {
+       struct rcar_du_connector *rcon = to_rcar_connector(connector);
+
+       return &rcon->encoder->encoder;
 }
 
-static bool rcar_du_lvds_encoder_mode_fixup(struct drm_encoder *encoder,
-                                          const struct drm_display_mode *mode,
-                                          struct drm_display_mode *adjusted_mode)
+/* -----------------------------------------------------------------------------
+ * Encoder
+ */
+
+static void rcar_du_encoder_dpms(struct drm_encoder *encoder, int mode)
+{
+}
+
+static bool rcar_du_encoder_mode_fixup(struct drm_encoder *encoder,
+                                      const struct drm_display_mode *mode,
+                                      struct drm_display_mode *adjusted_mode)
 {
        const struct drm_display_mode *panel_mode;
        struct drm_device *dev = encoder->dev;
        struct drm_connector *connector;
        bool found = false;
 
+       /* DAC encoders have currently no restriction on the mode. */
+       if (encoder->encoder_type == DRM_MODE_ENCODER_DAC)
+               return true;
+
        list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
                if (connector->encoder == encoder) {
                        found = true;
@@ -64,9 +85,26 @@ static bool rcar_du_lvds_encoder_mode_fixup(struct drm_encoder *encoder,
        return true;
 }
 
+static void rcar_du_encoder_mode_prepare(struct drm_encoder *encoder)
+{
+}
+
+static void rcar_du_encoder_mode_commit(struct drm_encoder *encoder)
+{
+}
+
+static void rcar_du_encoder_mode_set(struct drm_encoder *encoder,
+                                    struct drm_display_mode *mode,
+                                    struct drm_display_mode *adjusted_mode)
+{
+       struct rcar_du_encoder *renc = to_rcar_encoder(encoder);
+
+       rcar_du_crtc_route_output(encoder->crtc, renc->output);
+}
+
 static const struct drm_encoder_helper_funcs encoder_helper_funcs = {
-       .dpms = rcar_du_lvds_encoder_dpms,
-       .mode_fixup = rcar_du_lvds_encoder_mode_fixup,
+       .dpms = rcar_du_encoder_dpms,
+       .mode_fixup = rcar_du_encoder_mode_fixup,
        .prepare = rcar_du_encoder_mode_prepare,
        .commit = rcar_du_encoder_mode_commit,
        .mode_set = rcar_du_encoder_mode_set,
@@ -76,9 +114,9 @@ static const struct drm_encoder_funcs encoder_funcs = {
        .destroy = drm_encoder_cleanup,
 };
 
-int rcar_du_lvds_init(struct rcar_du_device *rcdu,
-                     const struct rcar_du_encoder_lvds_data *data,
-                     unsigned int output)
+int rcar_du_encoder_init(struct rcar_du_device *rcdu,
+                        enum rcar_du_encoder_type type, unsigned int output,
+                        const struct rcar_du_encoder_data *data)
 {
        struct rcar_du_encoder *renc;
        int ret;
@@ -90,11 +128,21 @@ int rcar_du_lvds_init(struct rcar_du_device *rcdu,
        renc->output = output;
 
        ret = drm_encoder_init(rcdu->ddev, &renc->encoder, &encoder_funcs,
-                              DRM_MODE_ENCODER_LVDS);
+                              type);
        if (ret < 0)
                return ret;
 
        drm_encoder_helper_add(&renc->encoder, &encoder_helper_funcs);
 
-       return rcar_du_lvds_connector_init(rcdu, renc, &data->panel);
+       switch (type) {
+       case RCAR_DU_ENCODER_LVDS:
+               return rcar_du_lvds_connector_init(rcdu, renc,
+                                                  &data->u.lvds.panel);
+
+       case RCAR_DU_ENCODER_VGA:
+               return rcar_du_vga_connector_init(rcdu, renc);
+
+       default:
+               return -EINVAL;
+       }
 }
diff --git a/drivers/gpu/drm/rcar-du/rcar_du_encoder.h b/drivers/gpu/drm/rcar-du/rcar_du_encoder.h
new file mode 100644 (file)
index 0000000..4f76e16
--- /dev/null
@@ -0,0 +1,45 @@
+/*
+ * rcar_du_encoder.h  --  R-Car Display Unit Encoder
+ *
+ * Copyright (C) 2013 Renesas Corporation
+ *
+ * Contact: Laurent Pinchart (laurent.pinchart@ideasonboard.com)
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ */
+
+#ifndef __RCAR_DU_ENCODER_H__
+#define __RCAR_DU_ENCODER_H__
+
+#include <drm/drm_crtc.h>
+
+struct rcar_du_device;
+struct rcar_du_encoder_data;
+
+struct rcar_du_encoder {
+       struct drm_encoder encoder;
+       unsigned int output;
+};
+
+#define to_rcar_encoder(e) \
+       container_of(e, struct rcar_du_encoder, encoder)
+
+struct rcar_du_connector {
+       struct drm_connector connector;
+       struct rcar_du_encoder *encoder;
+};
+
+#define to_rcar_connector(c) \
+       container_of(c, struct rcar_du_connector, connector)
+
+struct drm_encoder *
+rcar_du_connector_best_encoder(struct drm_connector *connector);
+
+int rcar_du_encoder_init(struct rcar_du_device *rcdu,
+                        enum rcar_du_encoder_type type, unsigned int output,
+                        const struct rcar_du_encoder_data *data);
+
+#endif /* __RCAR_DU_ENCODER_H__ */
index d30c2e2..3f8483c 100644 (file)
 
 #include "rcar_du_crtc.h"
 #include "rcar_du_drv.h"
+#include "rcar_du_encoder.h"
 #include "rcar_du_kms.h"
-#include "rcar_du_lvds.h"
 #include "rcar_du_regs.h"
-#include "rcar_du_vga.h"
 
 /* -----------------------------------------------------------------------------
  * Format helpers
@@ -106,35 +105,6 @@ const struct rcar_du_format_info *rcar_du_format_info(u32 fourcc)
 }
 
 /* -----------------------------------------------------------------------------
- * Common connector and encoder functions
- */
-
-struct drm_encoder *
-rcar_du_connector_best_encoder(struct drm_connector *connector)
-{
-       struct rcar_du_connector *rcon = to_rcar_connector(connector);
-
-       return &rcon->encoder->encoder;
-}
-
-void rcar_du_encoder_mode_prepare(struct drm_encoder *encoder)
-{
-}
-
-void rcar_du_encoder_mode_set(struct drm_encoder *encoder,
-                             struct drm_display_mode *mode,
-                             struct drm_display_mode *adjusted_mode)
-{
-       struct rcar_du_encoder *renc = to_rcar_encoder(encoder);
-
-       rcar_du_crtc_route_output(encoder->crtc, renc->output);
-}
-
-void rcar_du_encoder_mode_commit(struct drm_encoder *encoder)
-{
-}
-
-/* -----------------------------------------------------------------------------
  * Frame buffer
  */
 
@@ -221,6 +191,9 @@ int rcar_du_modeset_init(struct rcar_du_device *rcdu)
                const struct rcar_du_encoder_data *pdata =
                        &rcdu->pdata->encoders[i];
 
+               if (pdata->encoder == RCAR_DU_ENCODER_UNUSED)
+                       continue;
+
                if (pdata->output >= ARRAY_SIZE(rcdu->crtcs)) {
                        dev_warn(rcdu->dev,
                                 "encoder %u references unexisting output %u, skipping\n",
@@ -228,18 +201,8 @@ int rcar_du_modeset_init(struct rcar_du_device *rcdu)
                        continue;
                }
 
-               switch (pdata->encoder) {
-               case RCAR_DU_ENCODER_VGA:
-                       rcar_du_vga_init(rcdu, &pdata->u.vga, pdata->output);
-                       break;
-
-               case RCAR_DU_ENCODER_LVDS:
-                       rcar_du_lvds_init(rcdu, &pdata->u.lvds, pdata->output);
-                       break;
-
-               default:
-                       break;
-               }
+               rcar_du_encoder_init(rcdu, pdata->encoder, pdata->output,
+                                    pdata);
        }
 
        /* Set the possible CRTCs and possible clones. All encoders can be
index dba4722..5750e6a 100644 (file)
@@ -16,8 +16,9 @@
 
 #include <linux/types.h>
 
-#include <drm/drm_crtc.h>
-
+struct drm_file;
+struct drm_device;
+struct drm_mode_create_dumb;
 struct rcar_du_device;
 
 struct rcar_du_format_info {
@@ -28,32 +29,8 @@ struct rcar_du_format_info {
        unsigned int edf;
 };
 
-struct rcar_du_encoder {
-       struct drm_encoder encoder;
-       unsigned int output;
-};
-
-#define to_rcar_encoder(e) \
-       container_of(e, struct rcar_du_encoder, encoder)
-
-struct rcar_du_connector {
-       struct drm_connector connector;
-       struct rcar_du_encoder *encoder;
-};
-
-#define to_rcar_connector(c) \
-       container_of(c, struct rcar_du_connector, connector)
-
 const struct rcar_du_format_info *rcar_du_format_info(u32 fourcc);
 
-struct drm_encoder *
-rcar_du_connector_best_encoder(struct drm_connector *connector);
-void rcar_du_encoder_mode_prepare(struct drm_encoder *encoder);
-void rcar_du_encoder_mode_set(struct drm_encoder *encoder,
-                             struct drm_display_mode *mode,
-                             struct drm_display_mode *adjusted_mode);
-void rcar_du_encoder_mode_commit(struct drm_encoder *encoder);
-
 int rcar_du_modeset_init(struct rcar_du_device *rcdu);
 
 int rcar_du_dumb_create(struct drm_file *file, struct drm_device *dev,
diff --git a/drivers/gpu/drm/rcar-du/rcar_du_lvds.h b/drivers/gpu/drm/rcar-du/rcar_du_lvds.h
deleted file mode 100644 (file)
index b47f832..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * rcar_du_lvds.h  --  R-Car Display Unit LVDS Encoder and Connector
- *
- * Copyright (C) 2013 Renesas Corporation
- *
- * Contact: Laurent Pinchart (laurent.pinchart@ideasonboard.com)
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- */
-
-#ifndef __RCAR_DU_LVDS_H__
-#define __RCAR_DU_LVDS_H__
-
-struct rcar_du_device;
-struct rcar_du_encoder_lvds_data;
-
-int rcar_du_lvds_init(struct rcar_du_device *rcdu,
-                     const struct rcar_du_encoder_lvds_data *data,
-                     unsigned int output);
-
-#endif /* __RCAR_DU_LVDS_H__ */
index 6cfcc94..4f3ba93 100644 (file)
@@ -16,6 +16,7 @@
 #include <drm/drm_crtc_helper.h>
 
 #include "rcar_du_drv.h"
+#include "rcar_du_encoder.h"
 #include "rcar_du_kms.h"
 #include "rcar_du_lvdscon.h"
 
diff --git a/drivers/gpu/drm/rcar-du/rcar_du_vga.c b/drivers/gpu/drm/rcar-du/rcar_du_vga.c
deleted file mode 100644 (file)
index 369ab32..0000000
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * rcar_du_vga.c  --  R-Car Display Unit VGA DAC
- *
- * Copyright (C) 2013 Renesas Corporation
- *
- * Contact: Laurent Pinchart (laurent.pinchart@ideasonboard.com)
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- */
-
-#include <drm/drmP.h>
-#include <drm/drm_crtc.h>
-#include <drm/drm_crtc_helper.h>
-
-#include "rcar_du_drv.h"
-#include "rcar_du_kms.h"
-#include "rcar_du_vga.h"
-#include "rcar_du_vgacon.h"
-
-static void rcar_du_vga_encoder_dpms(struct drm_encoder *encoder, int mode)
-{
-}
-
-static bool rcar_du_vga_encoder_mode_fixup(struct drm_encoder *encoder,
-                                          const struct drm_display_mode *mode,
-                                          struct drm_display_mode *adjusted_mode)
-{
-       return true;
-}
-
-static const struct drm_encoder_helper_funcs encoder_helper_funcs = {
-       .dpms = rcar_du_vga_encoder_dpms,
-       .mode_fixup = rcar_du_vga_encoder_mode_fixup,
-       .prepare = rcar_du_encoder_mode_prepare,
-       .commit = rcar_du_encoder_mode_commit,
-       .mode_set = rcar_du_encoder_mode_set,
-};
-
-static const struct drm_encoder_funcs encoder_funcs = {
-       .destroy = drm_encoder_cleanup,
-};
-
-int rcar_du_vga_init(struct rcar_du_device *rcdu,
-                    const struct rcar_du_encoder_vga_data *data,
-                    unsigned int output)
-{
-       struct rcar_du_encoder *renc;
-       int ret;
-
-       renc = devm_kzalloc(rcdu->dev, sizeof(*renc), GFP_KERNEL);
-       if (renc == NULL)
-               return -ENOMEM;
-
-       renc->output = output;
-
-       ret = drm_encoder_init(rcdu->ddev, &renc->encoder, &encoder_funcs,
-                              DRM_MODE_ENCODER_DAC);
-       if (ret < 0)
-               return ret;
-
-       drm_encoder_helper_add(&renc->encoder, &encoder_helper_funcs);
-
-       return rcar_du_vga_connector_init(rcdu, renc);
-}
diff --git a/drivers/gpu/drm/rcar-du/rcar_du_vga.h b/drivers/gpu/drm/rcar-du/rcar_du_vga.h
deleted file mode 100644 (file)
index b969b20..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * rcar_du_vga.h  --  R-Car Display Unit VGA DAC
- *
- * Copyright (C) 2013 Renesas Corporation
- *
- * Contact: Laurent Pinchart (laurent.pinchart@ideasonboard.com)
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- */
-
-#ifndef __RCAR_DU_VGA_H__
-#define __RCAR_DU_VGA_H__
-
-struct rcar_du_device;
-struct rcar_du_encoder_vga_data;
-
-int rcar_du_vga_init(struct rcar_du_device *rcdu,
-                    const struct rcar_du_encoder_vga_data *data,
-                    unsigned int output);
-
-#endif /* __RCAR_DU_VGA_H__ */
index 2ee3203..36105db 100644 (file)
@@ -16,6 +16,7 @@
 #include <drm/drm_crtc_helper.h>
 
 #include "rcar_du_drv.h"
+#include "rcar_du_encoder.h"
 #include "rcar_du_kms.h"
 #include "rcar_du_vgacon.h"