Hi,<br><br>DISP1BLK_CFG register is related to GScaler, HDCP and MIXER as well. So it's not good that this register is controlled in fimd module. And I think the function to control the register should be placed in SoC common file . In other words, other drivers should be able to control the register through common thing also.<br>
<br>Thanks,<br>Inki Dae<br><br><div class="gmail_quote">2012/12/26 Leela Krishna Amudala <span dir="ltr"><<a href="mailto:l.krishna@samsung.com" target="_blank">l.krishna@samsung.com</a>></span><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Bypasses the mie for fimd by parsing the register and bit offset values<br>
from "mie-bypass" node, if "mie-bypass" node is present in the dts file.<br>
<br>
Signed-off-by: Leela Krishna Amudala <<a href="mailto:l.krishna@samsung.com">l.krishna@samsung.com</a>><br>
---<br>
 drivers/gpu/drm/exynos/exynos_drm_fimd.c | 55 ++++++++++++++++++++++++++++++++<br>
 1 file changed, 55 insertions(+)<br>
<br>
diff --git a/drivers/gpu/drm/exynos/exynos_drm_fimd.c b/drivers/gpu/drm/exynos/exynos_drm_fimd.c<br>
index bf0d9ba..f8ad259 100644<br>
--- a/drivers/gpu/drm/exynos/exynos_drm_fimd.c<br>
+++ b/drivers/gpu/drm/exynos/exynos_drm_fimd.c<br>
@@ -118,6 +118,12 @@ static const struct of_device_id fimd_driver_dt_match[] = {<br>
 MODULE_DEVICE_TABLE(of, fimd_driver_dt_match);<br>
 #endif<br>
<br>
+struct mie_bypass {<br>
+       u32                             enable_bypass;<br>
+       void __iomem                    *bypass_reg;<br>
+       u32                             bypass_bit_offset;<br>
+};<br>
+<br>
 static inline struct fimd_driver_data *drm_fimd_get_driver_data(<br>
        struct platform_device *pdev)<br>
 {<br>
@@ -133,6 +139,41 @@ static inline struct fimd_driver_data *drm_fimd_get_driver_data(<br>
                platform_get_device_id(pdev)->driver_data;<br>
 }<br>
<br>
+static struct mie_bypass *parse_mie_bypass_for_fimd(struct device *dev,<br>
+                                       struct device_node *mie_bypass_node)<br>
+{<br>
+       struct mie_bypass *bypass_data;<br>
+       u32 phy_address;<br>
+<br>
+       bypass_data = devm_kzalloc(dev, sizeof(*bypass_data), GFP_KERNEL);<br>
+       if (!bypass_data) {<br>
+               dev_err(dev, "memory allocation for bypass data failed\n");<br>
+               return ERR_PTR(-ENOMEM);<br>
+       }<br>
+       of_property_read_u32(mie_bypass_node, "samsung,mie-bypass-enable",<br>
+                       &bypass_data->enable_bypass);<br>
+       of_property_read_u32(mie_bypass_node, "samsung,disp1blk-cfg-reg",<br>
+                       &phy_address);<br>
+       of_property_read_u32(mie_bypass_node, "samsung,bypass-bit-offset",<br>
+                       &bypass_data->bypass_bit_offset);<br>
+<br>
+       bypass_data->bypass_reg = ioremap(phy_address, SZ_4);<br></blockquote><div></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+       if (!bypass_data->bypass_reg) {<br>
+               dev_err(dev, "failed to ioremap phy_address\n");<br>
+               return ERR_PTR(-ENOMEM);<br>
+       }<br>
+       return bypass_data;<br>
+} <br></blockquote><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+<br>
+static void mie_bypass_for_fimd(struct mie_bypass *bypass_data)<br>
+{<br>
+       u32 reg;<br>
+<br>
+       reg = __raw_readl(bypass_data->bypass_reg);<br>
+       reg |= (1 << bypass_data->bypass_bit_offset);<br>
+       __raw_writel(reg, bypass_data->bypass_reg);<br>
+}<br>
+<br>
 static bool fimd_display_is_connected(struct device *dev)<br>
 {<br>
        DRM_DEBUG_KMS("%s\n", __FILE__);<br>
@@ -906,12 +947,26 @@ static int __devinit fimd_probe(struct platform_device *pdev)<br>
        struct exynos_drm_fimd_pdata *pdata;<br>
        struct exynos_drm_panel_info *panel;<br>
        struct resource *res;<br>
+       struct device_node *mie_bypass_node;<br>
+       struct mie_bypass *bypass_data = NULL;<br>
        int win;<br>
        int ret = -EINVAL;<br>
<br>
        DRM_DEBUG_KMS("%s\n", __FILE__);<br>
<br>
        pdata = pdev->dev.platform_data;<br>
+       if (pdev->dev.of_node) {<br>
+               mie_bypass_node = of_find_node_by_name(pdev->dev.of_node,<br>
+                                                       "mie-bypass");<br>
+               if (mie_bypass_node) {<br>
+                       bypass_data = parse_mie_bypass_for_fimd(&pdev->dev,<br>
+                                                       mie_bypass_node);<br></blockquote><div></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+                       if (IS_ERR(bypass_data))<br>
+                               return PTR_ERR(bypass_data);<br>
+                       if (bypass_data->enable_bypass)<br>
+                               mie_bypass_for_fimd(bypass_data);<br>
+               }<br>
+       }<br>
        if (!pdata) {<br>
                dev_err(dev, "no platform data specified\n");<br>
                return -EINVAL;<br>
<span class="HOEnZb"><font color="#888888">--<br>
1.8.0<br>
<br>
_______________________________________________<br>
dri-devel mailing list<br>
<a href="mailto:dri-devel@lists.freedesktop.org">dri-devel@lists.freedesktop.org</a><br>
<a href="http://lists.freedesktop.org/mailman/listinfo/dri-devel" target="_blank">http://lists.freedesktop.org/mailman/listinfo/dri-devel</a><br>
</font></span></blockquote></div><br>