@@ -27,6 +27,7 @@
#include "exynos_drm_fbdev.h"
#include "exynos_drm_crtc.h"
#include "exynos_drm_iommu.h"
+#include "exynos_drm_mie.h"
/*
* FIMD is stand for Fully Interactive Mobile Display and
@@ -107,9 +108,59 @@ struct fimd_context {
static const struct of_device_id fimd_dt_match[];
-static inline struct fimd_driver_data *drm_fimd_get_driver_data(
- struct platform_device *pdev)
+static struct mie_plugin *mie;
+
+/* This function provides the fecility to add the mie plugin with fimd */
+void fimd_add_mie_plugin(struct mie_plugin *mie_plugin_data)
+{
+ mie = mie_plugin_data;
+}
+
+static int fimd_set_dithering_mode(struct fimd_context *ctx,
+ enum en_dither_mode dither_mode)
{
+ struct fb_videomode *timing = &ctx->panel->timing;
+ struct mie_settings settings;
+ int ret = -1;
+
+ DRM_DEBUG_KMS(" %s Called\n", __func__);
+
+ if (!mie) {
+ DRM_DEBUG_KMS("invalid mie plugin.\n");
+ return -EINVAL;
+ }
+
+ if ((!mie->ops.fn_configure_dither) || (!mie->ops.fn_dither_enable)) {
+ DRM_DEBUG_KMS("Invalid MIE function pointers\n");
+ return -EINVAL;
+ }
+
+ settings.xres = timing->xres;
+ settings.yres = timing->yres;
+ settings.left_margin = timing->left_margin;
+ settings.right_margin = timing->right_margin;
+ settings.upper_margin = timing->upper_margin;
+ settings.lower_margin = timing->lower_margin;
+ settings.hsync_len = timing->hsync_len;
+ settings.vsync_len = timing->vsync_len;
+
+ if (dither_mode < INVALID_DITHER_MODE)
+ settings.dither_mode = dither_mode;
+ else {
+ DRM_DEBUG_KMS("Invalid dithering mode[%d]\n", dither_mode);
+ return -EINVAL;
+ }
+
+ ret = mie->ops.fn_configure_dither(mie->dev, &settings);
+
+ if (!ret)
+ ret = mie->ops.fn_dither_enable(mie->dev, MIE_DITHER_EN);
+
+ return ret;
+}
+
+static inline struct fimd_driver_data *drm_fimd_get_driver_data(
+ struct platform_device *pdev) {
#ifdef CONFIG_OF
if (pdev->dev.of_node) {
const struct of_device_id *match;
@@ -558,6 +609,9 @@ static void fimd_win_commit(struct device *dev, int zpos)
val |= WINCONx_ENWIN;
writel(val, ctx->regs + WINCON(win));
+ /* enable 6bit dithering based on pannel type TBD*/
+ fimd_set_dithering_mode(ctx, DITHER_6BIT);
+
/* Enable DMA channel and unprotect windows */
val = readl(ctx->regs + SHADOWCON);
val |= SHADOWCON_CHx_ENABLE(win);
new file mode 100644
@@ -0,0 +1,20 @@
+/* exynos_drm_fimd_common.h
+ *
+ * Copyright (C) 2012 Samsung Electronics Co.Ltd
+ * Authors:
+ * R. Chandrasekar <rcsekar@samsung.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 __EXYNOS_DRM_FIMD_COMMON_H
+#define __EXYNOS_DRM_FIMD_COMMON_H
+
+
+void fimd_add_mie_plugin(struct mie_plugin *mie_plugin_data);
+
+#endif /*__EXYNOS_DRM_FIMD_COMMON_H */