You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
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: Andy Yan <andy.yan@rock-chips.com> Tested-by: Russell King <rmk+kernel@arm.linux.org.uk> Acked-by: Russell King <rmk+kernel@arm.linux.org.uk> Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
This commit is contained in:
@@ -3,3 +3,8 @@ config DRM_PTN3460
|
||||
depends on DRM
|
||||
select DRM_KMS_HELPER
|
||||
---help---
|
||||
|
||||
config DRM_DW_HDMI
|
||||
tristate
|
||||
depends on DRM
|
||||
select DRM_KMS_HELPER
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
ccflags-y := -Iinclude/drm
|
||||
|
||||
obj-$(CONFIG_DRM_PTN3460) += ptn3460.o
|
||||
obj-$(CONFIG_DRM_DW_HDMI) += dw_hdmi.o
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1030,47 +1030,4 @@ enum {
|
||||
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__ */
|
||||
@@ -49,6 +49,7 @@ config DRM_IMX_IPUV3
|
||||
|
||||
config DRM_IMX_HDMI
|
||||
tristate "Freescale i.MX DRM HDMI"
|
||||
select DRM_DW_HDMI
|
||||
depends on DRM_IMX
|
||||
help
|
||||
Choose this if you want to use HDMI on i.MX6.
|
||||
|
||||
@@ -9,4 +9,4 @@ obj-$(CONFIG_DRM_IMX_LDB) += imx-ldb.o
|
||||
|
||||
imx-ipuv3-crtc-objs := ipuv3-crtc.o ipuv3-plane.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
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/* 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
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
@@ -11,6 +11,7 @@
|
||||
#include <linux/component.h>
|
||||
#include <linux/mfd/syscon.h>
|
||||
#include <linux/mfd/syscon/imx6q-iomuxc-gpr.h>
|
||||
#include <drm/bridge/dw_hdmi.h>
|
||||
#include <video/imx-ipu-v3.h>
|
||||
#include <linux/regmap.h>
|
||||
#include <drm/drm_of.h>
|
||||
@@ -20,15 +21,14 @@
|
||||
#include <drm/drm_encoder_slave.h>
|
||||
|
||||
#include "imx-drm.h"
|
||||
#include "imx-hdmi.h"
|
||||
|
||||
struct imx_hdmi_priv {
|
||||
struct imx_hdmi {
|
||||
struct device *dev;
|
||||
struct drm_encoder encoder;
|
||||
struct regmap *regmap;
|
||||
};
|
||||
|
||||
static const struct mpll_config imx_mpll_cfg[] = {
|
||||
static const struct dw_hdmi_mpll_config imx_mpll_cfg[] = {
|
||||
{
|
||||
45250000, {
|
||||
{ 0x01e0, 0x0000 },
|
||||
@@ -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 */
|
||||
{
|
||||
54000000, { 0x091c, 0x091c, 0x06dc },
|
||||
@@ -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*/
|
||||
{ 148500000, 0x800d, 0x0005 },
|
||||
{ ~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;
|
||||
|
||||
@@ -92,28 +92,26 @@ static int imx_hdmi_parse_dt(struct imx_hdmi_priv *hdmi)
|
||||
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,
|
||||
const struct drm_display_mode *mode,
|
||||
struct drm_display_mode *adj_mode)
|
||||
static bool dw_hdmi_imx_encoder_mode_fixup(struct drm_encoder *encoder,
|
||||
const struct drm_display_mode *mode,
|
||||
struct drm_display_mode *adj_mode)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
static void imx_hdmi_encoder_mode_set(struct drm_encoder *encoder,
|
||||
struct drm_display_mode *mode,
|
||||
struct drm_display_mode *adj_mode)
|
||||
static void dw_hdmi_imx_encoder_mode_set(struct drm_encoder *encoder,
|
||||
struct drm_display_mode *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_priv,
|
||||
encoder);
|
||||
struct imx_hdmi *hdmi = container_of(encoder, struct imx_hdmi, encoder);
|
||||
int mux = imx_drm_encoder_get_mux_id(hdmi->dev->of_node, encoder);
|
||||
|
||||
regmap_update_bits(hdmi->regmap, IOMUXC_GPR3,
|
||||
@@ -121,38 +119,38 @@ static void imx_hdmi_encoder_commit(struct drm_encoder *encoder)
|
||||
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);
|
||||
}
|
||||
|
||||
static struct drm_encoder_helper_funcs imx_hdmi_encoder_helper_funcs = {
|
||||
.mode_fixup = imx_hdmi_encoder_mode_fixup,
|
||||
.mode_set = imx_hdmi_encoder_mode_set,
|
||||
.prepare = imx_hdmi_encoder_prepare,
|
||||
.commit = imx_hdmi_encoder_commit,
|
||||
.disable = imx_hdmi_encoder_disable,
|
||||
static struct drm_encoder_helper_funcs dw_hdmi_imx_encoder_helper_funcs = {
|
||||
.mode_fixup = dw_hdmi_imx_encoder_mode_fixup,
|
||||
.mode_set = dw_hdmi_imx_encoder_mode_set,
|
||||
.prepare = dw_hdmi_imx_encoder_prepare,
|
||||
.commit = dw_hdmi_imx_encoder_commit,
|
||||
.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,
|
||||
};
|
||||
|
||||
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,
|
||||
.cur_ctr = imx_cur_ctr,
|
||||
.sym_term = imx_sym_term,
|
||||
.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,
|
||||
.cur_ctr = imx_cur_ctr,
|
||||
.sym_term = imx_sym_term,
|
||||
.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",
|
||||
.data = &imx6q_hdmi_drv_data
|
||||
}, {
|
||||
@@ -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,
|
||||
void *data)
|
||||
static int dw_hdmi_imx_bind(struct device *dev, struct device *master,
|
||||
void *data)
|
||||
{
|
||||
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;
|
||||
struct drm_device *drm = data;
|
||||
struct drm_encoder *encoder;
|
||||
struct imx_hdmi_priv *hdmi;
|
||||
struct imx_hdmi *hdmi;
|
||||
struct resource *iores;
|
||||
int irq;
|
||||
int ret;
|
||||
@@ -183,7 +181,7 @@ static int imx_hdmi_pltfm_bind(struct device *dev, struct device *master,
|
||||
if (!hdmi)
|
||||
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;
|
||||
hdmi->dev = &pdev->dev;
|
||||
encoder = &hdmi->encoder;
|
||||
@@ -208,53 +206,53 @@ static int imx_hdmi_pltfm_bind(struct device *dev, struct device *master,
|
||||
if (encoder->possible_crtcs == 0)
|
||||
return -EPROBE_DEFER;
|
||||
|
||||
ret = imx_hdmi_parse_dt(hdmi);
|
||||
ret = dw_hdmi_imx_parse_dt(hdmi);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
drm_encoder_helper_add(encoder, &imx_hdmi_encoder_helper_funcs);
|
||||
drm_encoder_init(drm, encoder, &imx_hdmi_encoder_funcs,
|
||||
drm_encoder_helper_add(encoder, &dw_hdmi_imx_encoder_helper_funcs);
|
||||
drm_encoder_init(drm, encoder, &dw_hdmi_imx_encoder_funcs,
|
||||
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,
|
||||
void *data)
|
||||
static void dw_hdmi_imx_unbind(struct device *dev, struct device *master,
|
||||
void *data)
|
||||
{
|
||||
return imx_hdmi_unbind(dev, master, data);
|
||||
return dw_hdmi_unbind(dev, master, data);
|
||||
}
|
||||
|
||||
static const struct component_ops imx_hdmi_ops = {
|
||||
.bind = imx_hdmi_pltfm_bind,
|
||||
.unbind = imx_hdmi_pltfm_unbind,
|
||||
static const struct component_ops dw_hdmi_imx_ops = {
|
||||
.bind = dw_hdmi_imx_bind,
|
||||
.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;
|
||||
}
|
||||
|
||||
static struct platform_driver imx_hdmi_pltfm_driver = {
|
||||
.probe = imx_hdmi_probe,
|
||||
.remove = imx_hdmi_remove,
|
||||
static struct platform_driver dw_hdmi_imx_platform_driver = {
|
||||
.probe = dw_hdmi_imx_probe,
|
||||
.remove = dw_hdmi_imx_remove,
|
||||
.driver = {
|
||||
.name = "hdmi-imx",
|
||||
.of_match_table = imx_hdmi_dt_ids,
|
||||
.name = "dwhdmi-imx",
|
||||
.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("Yakir Yang <ykk@rock-chips.com>");
|
||||
MODULE_DESCRIPTION("IMX6 Specific DW-HDMI Driver Extension");
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_ALIAS("platform:hdmi-imx");
|
||||
MODULE_ALIAS("platform:dwhdmi-imx");
|
||||
@@ -0,0 +1,60 @@
|
||||
/*
|
||||
* 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__ */
|
||||
Reference in New Issue
Block a user