Commit b21f4b65 authored by Andy Yan's avatar Andy Yan Committed by Philipp Zabel

drm: imx: imx-hdmi: move imx-hdmi to bridge/dw_hdmi

the original imx hdmi driver is under drm/imx/,
which depends on imx-drm, so move the imx hdmi
driver out to drm/bridge and rename it to dw_hdmi
Signed-off-by: default avatarAndy Yan <andy.yan@rock-chips.com>
Tested-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
Acked-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
Signed-off-by: default avatarPhilipp Zabel <p.zabel@pengutronix.de>
parent aaa757a0
...@@ -3,3 +3,8 @@ config DRM_PTN3460 ...@@ -3,3 +3,8 @@ config DRM_PTN3460
depends on DRM depends on DRM
select DRM_KMS_HELPER select DRM_KMS_HELPER
---help--- ---help---
config DRM_DW_HDMI
tristate
depends on DRM
select DRM_KMS_HELPER
ccflags-y := -Iinclude/drm ccflags-y := -Iinclude/drm
obj-$(CONFIG_DRM_PTN3460) += ptn3460.o obj-$(CONFIG_DRM_PTN3460) += ptn3460.o
obj-$(CONFIG_DRM_DW_HDMI) += dw_hdmi.o
...@@ -1030,47 +1030,4 @@ enum { ...@@ -1030,47 +1030,4 @@ enum {
HDMI_A_VIDPOLCFG_HSYNCPOL_ACTIVE_LOW = 0x0, HDMI_A_VIDPOLCFG_HSYNCPOL_ACTIVE_LOW = 0x0,
}; };
enum imx_hdmi_devtype {
IMX6Q_HDMI,
IMX6DL_HDMI,
};
struct imx_hdmi_plat_data {
enum imx_hdmi_devtype dev_type;
const struct mpll_config *mpll_cfg;
const struct curr_ctrl *cur_ctr;
const struct sym_term *sym_term;
};
enum {
RES_8,
RES_10,
RES_12,
RES_MAX,
};
struct mpll_config {
unsigned long mpixelclock;
struct {
u16 cpce;
u16 gmp;
} res[RES_MAX];
};
struct curr_ctrl {
unsigned long mpixelclock;
u16 curr[RES_MAX];
};
struct sym_term {
unsigned long mpixelclock;
u16 sym_ctr; /*clock symbol and transmitter control*/
u16 term; /*transmission termination value*/
};
int imx_hdmi_bind(struct device *dev, struct device *master,
void *data, struct drm_encoder *encoder,
struct resource *iores, int irq,
const struct imx_hdmi_plat_data *plat_data);
void imx_hdmi_unbind(struct device *dev, struct device *master, void *data);
#endif /* __IMX_HDMI_H__ */ #endif /* __IMX_HDMI_H__ */
...@@ -49,6 +49,7 @@ config DRM_IMX_IPUV3 ...@@ -49,6 +49,7 @@ config DRM_IMX_IPUV3
config DRM_IMX_HDMI config DRM_IMX_HDMI
tristate "Freescale i.MX DRM HDMI" tristate "Freescale i.MX DRM HDMI"
select DRM_DW_HDMI
depends on DRM_IMX depends on DRM_IMX
help help
Choose this if you want to use HDMI on i.MX6. Choose this if you want to use HDMI on i.MX6.
...@@ -9,4 +9,4 @@ obj-$(CONFIG_DRM_IMX_LDB) += imx-ldb.o ...@@ -9,4 +9,4 @@ obj-$(CONFIG_DRM_IMX_LDB) += imx-ldb.o
imx-ipuv3-crtc-objs := ipuv3-crtc.o ipuv3-plane.o imx-ipuv3-crtc-objs := ipuv3-crtc.o ipuv3-plane.o
obj-$(CONFIG_DRM_IMX_IPUV3) += imx-ipuv3-crtc.o obj-$(CONFIG_DRM_IMX_IPUV3) += imx-ipuv3-crtc.o
obj-$(CONFIG_DRM_IMX_HDMI) += imx-hdmi.o imx-hdmi_pltfm.o obj-$(CONFIG_DRM_IMX_HDMI) += dw_hdmi-imx.o
/* Copyright (C) 2011-2013 Freescale Semiconductor, Inc. /* Copyright (C) 2011-2013 Freescale Semiconductor, Inc.
* *
* derived from imx-hdmi.c * derived from imx-hdmi.c(renamed to bridge/dw_hdmi.c now)
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as * it under the terms of the GNU General Public License version 2 as
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include <linux/component.h> #include <linux/component.h>
#include <linux/mfd/syscon.h> #include <linux/mfd/syscon.h>
#include <linux/mfd/syscon/imx6q-iomuxc-gpr.h> #include <linux/mfd/syscon/imx6q-iomuxc-gpr.h>
#include <drm/bridge/dw_hdmi.h>
#include <video/imx-ipu-v3.h> #include <video/imx-ipu-v3.h>
#include <linux/regmap.h> #include <linux/regmap.h>
#include <drm/drm_of.h> #include <drm/drm_of.h>
...@@ -20,15 +21,14 @@ ...@@ -20,15 +21,14 @@
#include <drm/drm_encoder_slave.h> #include <drm/drm_encoder_slave.h>
#include "imx-drm.h" #include "imx-drm.h"
#include "imx-hdmi.h"
struct imx_hdmi_priv { struct imx_hdmi {
struct device *dev; struct device *dev;
struct drm_encoder encoder; struct drm_encoder encoder;
struct regmap *regmap; struct regmap *regmap;
}; };
static const struct mpll_config imx_mpll_cfg[] = { static const struct dw_hdmi_mpll_config imx_mpll_cfg[] = {
{ {
45250000, { 45250000, {
{ 0x01e0, 0x0000 }, { 0x01e0, 0x0000 },
...@@ -56,7 +56,7 @@ static const struct mpll_config imx_mpll_cfg[] = { ...@@ -56,7 +56,7 @@ static const struct mpll_config imx_mpll_cfg[] = {
} }
}; };
static const struct curr_ctrl imx_cur_ctr[] = { static const struct dw_hdmi_curr_ctrl imx_cur_ctr[] = {
/* pixelclk bpp8 bpp10 bpp12 */ /* pixelclk bpp8 bpp10 bpp12 */
{ {
54000000, { 0x091c, 0x091c, 0x06dc }, 54000000, { 0x091c, 0x091c, 0x06dc },
...@@ -73,13 +73,13 @@ static const struct curr_ctrl imx_cur_ctr[] = { ...@@ -73,13 +73,13 @@ static const struct curr_ctrl imx_cur_ctr[] = {
} }
}; };
static const struct sym_term imx_sym_term[] = { static const struct dw_hdmi_sym_term imx_sym_term[] = {
/*pixelclk symbol term*/ /*pixelclk symbol term*/
{ 148500000, 0x800d, 0x0005 }, { 148500000, 0x800d, 0x0005 },
{ ~0UL, 0x0000, 0x0000 } { ~0UL, 0x0000, 0x0000 }
}; };
static int imx_hdmi_parse_dt(struct imx_hdmi_priv *hdmi) static int dw_hdmi_imx_parse_dt(struct imx_hdmi *hdmi)
{ {
struct device_node *np = hdmi->dev->of_node; struct device_node *np = hdmi->dev->of_node;
...@@ -92,28 +92,26 @@ static int imx_hdmi_parse_dt(struct imx_hdmi_priv *hdmi) ...@@ -92,28 +92,26 @@ static int imx_hdmi_parse_dt(struct imx_hdmi_priv *hdmi)
return 0; return 0;
} }
static void imx_hdmi_encoder_disable(struct drm_encoder *encoder) static void dw_hdmi_imx_encoder_disable(struct drm_encoder *encoder)
{ {
} }
static bool imx_hdmi_encoder_mode_fixup(struct drm_encoder *encoder, static bool dw_hdmi_imx_encoder_mode_fixup(struct drm_encoder *encoder,
const struct drm_display_mode *mode, const struct drm_display_mode *mode,
struct drm_display_mode *adj_mode) struct drm_display_mode *adj_mode)
{ {
return true; return true;
} }
static void imx_hdmi_encoder_mode_set(struct drm_encoder *encoder, static void dw_hdmi_imx_encoder_mode_set(struct drm_encoder *encoder,
struct drm_display_mode *mode, struct drm_display_mode *mode,
struct drm_display_mode *adj_mode) struct drm_display_mode *adj_mode)
{ {
} }
static void imx_hdmi_encoder_commit(struct drm_encoder *encoder) static void dw_hdmi_imx_encoder_commit(struct drm_encoder *encoder)
{ {
struct imx_hdmi_priv *hdmi = container_of(encoder, struct imx_hdmi *hdmi = container_of(encoder, struct imx_hdmi, encoder);
struct imx_hdmi_priv,
encoder);
int mux = imx_drm_encoder_get_mux_id(hdmi->dev->of_node, encoder); int mux = imx_drm_encoder_get_mux_id(hdmi->dev->of_node, encoder);
regmap_update_bits(hdmi->regmap, IOMUXC_GPR3, regmap_update_bits(hdmi->regmap, IOMUXC_GPR3,
...@@ -121,38 +119,38 @@ static void imx_hdmi_encoder_commit(struct drm_encoder *encoder) ...@@ -121,38 +119,38 @@ static void imx_hdmi_encoder_commit(struct drm_encoder *encoder)
mux << IMX6Q_GPR3_HDMI_MUX_CTL_SHIFT); mux << IMX6Q_GPR3_HDMI_MUX_CTL_SHIFT);
} }
static void imx_hdmi_encoder_prepare(struct drm_encoder *encoder) static void dw_hdmi_imx_encoder_prepare(struct drm_encoder *encoder)
{ {
imx_drm_panel_format(encoder, V4L2_PIX_FMT_RGB24); imx_drm_panel_format(encoder, V4L2_PIX_FMT_RGB24);
} }
static struct drm_encoder_helper_funcs imx_hdmi_encoder_helper_funcs = { static struct drm_encoder_helper_funcs dw_hdmi_imx_encoder_helper_funcs = {
.mode_fixup = imx_hdmi_encoder_mode_fixup, .mode_fixup = dw_hdmi_imx_encoder_mode_fixup,
.mode_set = imx_hdmi_encoder_mode_set, .mode_set = dw_hdmi_imx_encoder_mode_set,
.prepare = imx_hdmi_encoder_prepare, .prepare = dw_hdmi_imx_encoder_prepare,
.commit = imx_hdmi_encoder_commit, .commit = dw_hdmi_imx_encoder_commit,
.disable = imx_hdmi_encoder_disable, .disable = dw_hdmi_imx_encoder_disable,
}; };
static struct drm_encoder_funcs imx_hdmi_encoder_funcs = { static struct drm_encoder_funcs dw_hdmi_imx_encoder_funcs = {
.destroy = drm_encoder_cleanup, .destroy = drm_encoder_cleanup,
}; };
static struct imx_hdmi_plat_data imx6q_hdmi_drv_data = { static struct dw_hdmi_plat_data imx6q_hdmi_drv_data = {
.mpll_cfg = imx_mpll_cfg, .mpll_cfg = imx_mpll_cfg,
.cur_ctr = imx_cur_ctr, .cur_ctr = imx_cur_ctr,
.sym_term = imx_sym_term, .sym_term = imx_sym_term,
.dev_type = IMX6Q_HDMI, .dev_type = IMX6Q_HDMI,
}; };
static struct imx_hdmi_plat_data imx6dl_hdmi_drv_data = { static struct dw_hdmi_plat_data imx6dl_hdmi_drv_data = {
.mpll_cfg = imx_mpll_cfg, .mpll_cfg = imx_mpll_cfg,
.cur_ctr = imx_cur_ctr, .cur_ctr = imx_cur_ctr,
.sym_term = imx_sym_term, .sym_term = imx_sym_term,
.dev_type = IMX6DL_HDMI, .dev_type = IMX6DL_HDMI,
}; };
static const struct of_device_id imx_hdmi_dt_ids[] = { static const struct of_device_id dw_hdmi_imx_dt_ids[] = {
{ .compatible = "fsl,imx6q-hdmi", { .compatible = "fsl,imx6q-hdmi",
.data = &imx6q_hdmi_drv_data .data = &imx6q_hdmi_drv_data
}, { }, {
...@@ -161,17 +159,17 @@ static const struct of_device_id imx_hdmi_dt_ids[] = { ...@@ -161,17 +159,17 @@ static const struct of_device_id imx_hdmi_dt_ids[] = {
}, },
{}, {},
}; };
MODULE_DEVICE_TABLE(of, imx_hdmi_dt_ids); MODULE_DEVICE_TABLE(of, dw_hdmi_imx_dt_ids);
static int imx_hdmi_pltfm_bind(struct device *dev, struct device *master, static int dw_hdmi_imx_bind(struct device *dev, struct device *master,
void *data) void *data)
{ {
struct platform_device *pdev = to_platform_device(dev); struct platform_device *pdev = to_platform_device(dev);
const struct imx_hdmi_plat_data *plat_data; const struct dw_hdmi_plat_data *plat_data;
const struct of_device_id *match; const struct of_device_id *match;
struct drm_device *drm = data; struct drm_device *drm = data;
struct drm_encoder *encoder; struct drm_encoder *encoder;
struct imx_hdmi_priv *hdmi; struct imx_hdmi *hdmi;
struct resource *iores; struct resource *iores;
int irq; int irq;
int ret; int ret;
...@@ -183,7 +181,7 @@ static int imx_hdmi_pltfm_bind(struct device *dev, struct device *master, ...@@ -183,7 +181,7 @@ static int imx_hdmi_pltfm_bind(struct device *dev, struct device *master,
if (!hdmi) if (!hdmi)
return -ENOMEM; return -ENOMEM;
match = of_match_node(imx_hdmi_dt_ids, pdev->dev.of_node); match = of_match_node(dw_hdmi_imx_dt_ids, pdev->dev.of_node);
plat_data = match->data; plat_data = match->data;
hdmi->dev = &pdev->dev; hdmi->dev = &pdev->dev;
encoder = &hdmi->encoder; encoder = &hdmi->encoder;
...@@ -208,53 +206,53 @@ static int imx_hdmi_pltfm_bind(struct device *dev, struct device *master, ...@@ -208,53 +206,53 @@ static int imx_hdmi_pltfm_bind(struct device *dev, struct device *master,
if (encoder->possible_crtcs == 0) if (encoder->possible_crtcs == 0)
return -EPROBE_DEFER; return -EPROBE_DEFER;
ret = imx_hdmi_parse_dt(hdmi); ret = dw_hdmi_imx_parse_dt(hdmi);
if (ret < 0) if (ret < 0)
return ret; return ret;
drm_encoder_helper_add(encoder, &imx_hdmi_encoder_helper_funcs); drm_encoder_helper_add(encoder, &dw_hdmi_imx_encoder_helper_funcs);
drm_encoder_init(drm, encoder, &imx_hdmi_encoder_funcs, drm_encoder_init(drm, encoder, &dw_hdmi_imx_encoder_funcs,
DRM_MODE_ENCODER_TMDS); DRM_MODE_ENCODER_TMDS);
return imx_hdmi_bind(dev, master, data, encoder, iores, irq, plat_data); return dw_hdmi_bind(dev, master, data, encoder, iores, irq, plat_data);
} }
static void imx_hdmi_pltfm_unbind(struct device *dev, struct device *master, static void dw_hdmi_imx_unbind(struct device *dev, struct device *master,
void *data) void *data)
{ {
return imx_hdmi_unbind(dev, master, data); return dw_hdmi_unbind(dev, master, data);
} }
static const struct component_ops imx_hdmi_ops = { static const struct component_ops dw_hdmi_imx_ops = {
.bind = imx_hdmi_pltfm_bind, .bind = dw_hdmi_imx_bind,
.unbind = imx_hdmi_pltfm_unbind, .unbind = dw_hdmi_imx_unbind,
}; };
static int imx_hdmi_probe(struct platform_device *pdev) static int dw_hdmi_imx_probe(struct platform_device *pdev)
{ {
return component_add(&pdev->dev, &imx_hdmi_ops); return component_add(&pdev->dev, &dw_hdmi_imx_ops);
} }
static int imx_hdmi_remove(struct platform_device *pdev) static int dw_hdmi_imx_remove(struct platform_device *pdev)
{ {
component_del(&pdev->dev, &imx_hdmi_ops); component_del(&pdev->dev, &dw_hdmi_imx_ops);
return 0; return 0;
} }
static struct platform_driver imx_hdmi_pltfm_driver = { static struct platform_driver dw_hdmi_imx_platform_driver = {
.probe = imx_hdmi_probe, .probe = dw_hdmi_imx_probe,
.remove = imx_hdmi_remove, .remove = dw_hdmi_imx_remove,
.driver = { .driver = {
.name = "hdmi-imx", .name = "dwhdmi-imx",
.of_match_table = imx_hdmi_dt_ids, .of_match_table = dw_hdmi_imx_dt_ids,
}, },
}; };
module_platform_driver(imx_hdmi_pltfm_driver); module_platform_driver(dw_hdmi_imx_platform_driver);
MODULE_AUTHOR("Andy Yan <andy.yan@rock-chips.com>"); MODULE_AUTHOR("Andy Yan <andy.yan@rock-chips.com>");
MODULE_AUTHOR("Yakir Yang <ykk@rock-chips.com>"); MODULE_AUTHOR("Yakir Yang <ykk@rock-chips.com>");
MODULE_DESCRIPTION("IMX6 Specific DW-HDMI Driver Extension"); MODULE_DESCRIPTION("IMX6 Specific DW-HDMI Driver Extension");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
MODULE_ALIAS("platform:hdmi-imx"); MODULE_ALIAS("platform:dwhdmi-imx");
/*
* Copyright (C) 2011 Freescale Semiconductor, Inc.
*
* 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 __DW_HDMI__
#define __DW_HDMI__
#include <drm/drmP.h>
enum {
DW_HDMI_RES_8,
DW_HDMI_RES_10,
DW_HDMI_RES_12,
DW_HDMI_RES_MAX,
};
enum dw_hdmi_devtype {
IMX6Q_HDMI,
IMX6DL_HDMI,
};
struct dw_hdmi_mpll_config {
unsigned long mpixelclock;
struct {
u16 cpce;
u16 gmp;
} res[DW_HDMI_RES_MAX];
};
struct dw_hdmi_curr_ctrl {
unsigned long mpixelclock;
u16 curr[DW_HDMI_RES_MAX];
};
struct dw_hdmi_sym_term {
unsigned long mpixelclock;
u16 sym_ctr; /*clock symbol and transmitter control*/
u16 term; /*transmission termination value*/
};
struct dw_hdmi_plat_data {
enum dw_hdmi_devtype dev_type;
const struct dw_hdmi_mpll_config *mpll_cfg;
const struct dw_hdmi_curr_ctrl *cur_ctr;
const struct dw_hdmi_sym_term *sym_term;
enum drm_mode_status (*mode_valid)(struct drm_connector *connector,
struct drm_display_mode *mode);
};
void dw_hdmi_unbind(struct device *dev, struct device *master, void *data);
int dw_hdmi_bind(struct device *dev, struct device *master,
void *data, struct drm_encoder *encoder,
struct resource *iores, int irq,
const struct dw_hdmi_plat_data *plat_data);
#endif /* __IMX_HDMI_H__ */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment