diff options
Diffstat (limited to 'target/linux/layerscape/patches-5.4/805-display-0010-drm-bridge-cadence-move-struct-imx_mhdp_device-to-dr.patch')
-rw-r--r-- | target/linux/layerscape/patches-5.4/805-display-0010-drm-bridge-cadence-move-struct-imx_mhdp_device-to-dr.patch | 1096 |
1 files changed, 0 insertions, 1096 deletions
diff --git a/target/linux/layerscape/patches-5.4/805-display-0010-drm-bridge-cadence-move-struct-imx_mhdp_device-to-dr.patch b/target/linux/layerscape/patches-5.4/805-display-0010-drm-bridge-cadence-move-struct-imx_mhdp_device-to-dr.patch deleted file mode 100644 index 74e5a58364..0000000000 --- a/target/linux/layerscape/patches-5.4/805-display-0010-drm-bridge-cadence-move-struct-imx_mhdp_device-to-dr.patch +++ /dev/null @@ -1,1096 +0,0 @@ -From fe1824851dd6f7d3ee6d5411edba4102dacea873 Mon Sep 17 00:00:00 2001 -From: Sandor Yu <Sandor.yu@nxp.com> -Date: Wed, 11 Sep 2019 17:16:47 +0800 -Subject: [PATCH] drm: bridge: cadence: move struct imx_mhdp_device to drm/imx - -move struct imx_mhdp_device to drm/imx folder. -change the base address name from regs to regs_base. -add mhdp bus access function. -uniform variable name. - -Signed-off-by: Sandor Yu <Sandor.yu@nxp.com> ---- - drivers/gpu/drm/bridge/cadence/cdns-dp-core.c | 188 ++++++++++----------- - drivers/gpu/drm/bridge/cadence/cdns-hdmi-core.c | 190 ++++++++++------------ - drivers/gpu/drm/bridge/cadence/cdns-mhdp-audio.c | 1 - - drivers/gpu/drm/bridge/cadence/cdns-mhdp-cec.c | 2 +- - drivers/gpu/drm/bridge/cadence/cdns-mhdp-common.c | 43 ++--- - drivers/gpu/drm/bridge/cadence/cdns-mhdp-hdmi.c | 1 - - include/drm/bridge/cdns-mhdp-common.h | 67 +++++++- - include/drm/bridge/cdns-mhdp-imx.h | 121 -------------- - 8 files changed, 258 insertions(+), 355 deletions(-) - delete mode 100644 include/drm/bridge/cdns-mhdp-imx.h - ---- a/drivers/gpu/drm/bridge/cadence/cdns-dp-core.c -+++ b/drivers/gpu/drm/bridge/cadence/cdns-dp-core.c -@@ -9,8 +9,7 @@ - * (at your option) any later version. - * - */ -- --#include <drm/bridge/cdns-mhdp-imx.h> -+#include <drm/bridge/cdns-mhdp-common.h> - #include <drm/drm_atomic_helper.h> - #include <drm/drm_crtc_helper.h> - #include <drm/drm_edid.h> -@@ -25,8 +24,6 @@ - #include <linux/mutex.h> - #include <linux/of_device.h> - --#define aux_to_hdp(x) container_of(x, struct imx_mhdp_device, aux) -- - /* - * This function only implements native DPDC reads and writes - */ -@@ -111,24 +108,24 @@ static void dp_pixel_clk_reset(struct cd - cdns_mhdp_reg_write(mhdp, SOURCE_HDTX_CAR, val); - } - --static void cdns_dp_mode_set(struct imx_mhdp_device *dp, -+static void cdns_dp_mode_set(struct cdns_mhdp_device *mhdp, - const struct drm_display_mode *mode) - { - struct drm_dp_link link; -- struct cdns_mhdp_device *mhdp = &dp->mhdp; - u32 lane_mapping = mhdp->lane_mapping; - int ret; - char linkid[6]; - - memcpy(&mhdp->mode, mode, sizeof(struct drm_display_mode)); - -- dp->dual_mode = video_is_dual_mode(mode); -+ //Sandor TODO -+// mhdp->dual_mode = video_is_dual_mode(mode); - - dp_pixel_clk_reset(mhdp); - -- hdp_plat_call(dp, pclock_change); -+ cdns_mhdp_plat_call(mhdp, pclk_rate); - -- hdp_plat_call(dp, phy_init); -+ cdns_mhdp_plat_call(mhdp, phy_set); - - ret = drm_dp_downstream_id(&mhdp->dp.aux, linkid); - if (ret < 0) { -@@ -168,7 +165,7 @@ static void cdns_dp_mode_set(struct imx_ - /* initialize phy if lanes or link rate differnt */ - if (mhdp->dp.link.num_lanes != mhdp->dp.num_lanes || - mhdp->dp.link.rate != mhdp->dp.link_rate) -- hdp_plat_call(dp, phy_init); -+ cdns_mhdp_plat_call(mhdp, phy_set); - - /* Video off */ - ret = cdns_mhdp_set_video_status(mhdp, CONTROL_VIDEO_IDLE); -@@ -215,11 +212,11 @@ static void cdns_dp_mode_set(struct imx_ - static enum drm_connector_status - cdns_dp_connector_detect(struct drm_connector *connector, bool force) - { -- struct imx_mhdp_device *dp = container_of(connector, -- struct imx_mhdp_device, mhdp.connector.base); -+ struct cdns_mhdp_device *mhdp = container_of(connector, -+ struct cdns_mhdp_device, connector.base); - u8 hpd = 0xf; - -- hpd = cdns_mhdp_read_hpd(&dp->mhdp); -+ hpd = cdns_mhdp_read_hpd(mhdp); - if (hpd == 1) - /* Cable Connected */ - return connector_status_connected; -@@ -235,15 +232,15 @@ cdns_dp_connector_detect(struct drm_conn - - static int cdns_dp_connector_get_modes(struct drm_connector *connector) - { -- struct imx_mhdp_device *dp = container_of(connector, -- struct imx_mhdp_device, mhdp.connector.base); -+ struct cdns_mhdp_device *mhdp = container_of(connector, -+ struct cdns_mhdp_device, connector.base); - int num_modes = 0; - struct edid *edid; - -- edid = drm_do_get_edid(&dp->mhdp.connector.base, -- cdns_mhdp_get_edid_block, &dp->mhdp); -+ edid = drm_do_get_edid(&mhdp->connector.base, -+ cdns_mhdp_get_edid_block, mhdp); - if (edid) { -- dev_info(dp->mhdp.dev, "%x,%x,%x,%x,%x,%x,%x,%x\n", -+ dev_info(mhdp->dev, "%x,%x,%x,%x,%x,%x,%x,%x\n", - edid->header[0], edid->header[1], - edid->header[2], edid->header[3], - edid->header[4], edid->header[5], -@@ -273,9 +270,9 @@ static const struct drm_connector_helper - - static int cdns_dp_bridge_attach(struct drm_bridge *bridge) - { -- struct imx_mhdp_device *dp = bridge->driver_private; -+ struct cdns_mhdp_device *mhdp = bridge->driver_private; - struct drm_encoder *encoder = bridge->encoder; -- struct drm_connector *connector = &dp->mhdp.connector.base; -+ struct drm_connector *connector = &mhdp->connector.base; - - connector->interlace_allowed = 1; - connector->polled = DRM_CONNECTOR_POLL_HPD; -@@ -319,9 +316,9 @@ static void cdns_dp_bridge_mode_set(stru - const struct drm_display_mode *orig_mode, - const struct drm_display_mode *mode) - { -- struct imx_mhdp_device *dp = bridge->driver_private; -- struct drm_display_info *display_info = &dp->mhdp.connector.base.display_info; -- struct video_info *video = &dp->mhdp.video_info; -+ struct cdns_mhdp_device *mhdp = bridge->driver_private; -+ struct drm_display_info *display_info = &mhdp->connector.base.display_info; -+ struct video_info *video = &mhdp->video_info; - - switch (display_info->bpc) { - case 10: -@@ -341,11 +338,11 @@ static void cdns_dp_bridge_mode_set(stru - - DRM_INFO("Mode: %dx%dp%d\n", mode->hdisplay, mode->vdisplay, mode->clock); - -- mutex_lock(&dp->lock); -+ mutex_lock(&mhdp->lock); - -- cdns_dp_mode_set(dp, mode); -+ cdns_dp_mode_set(mhdp, mode); - -- mutex_unlock(&dp->lock); -+ mutex_unlock(&mhdp->lock); - } - - static void cdn_hdp_bridge_enable(struct drm_bridge *bridge) -@@ -354,8 +351,7 @@ static void cdn_hdp_bridge_enable(struct - - static void cdn_hdp_bridge_disable(struct drm_bridge *bridge) - { -- struct imx_mhdp_device *dp = bridge->driver_private; -- struct cdns_mhdp_device *mhdp = &dp->mhdp; -+ struct cdns_mhdp_device *mhdp = bridge->driver_private; - - cdns_mhdp_set_video_status(mhdp, CONTROL_VIDEO_IDLE); - drm_dp_link_power_down(&mhdp->dp.aux, &mhdp->dp.link); -@@ -371,29 +367,29 @@ static const struct drm_bridge_funcs cdn - - static void hotplug_work_func(struct work_struct *work) - { -- struct imx_mhdp_device *dp = container_of(work, -- struct imx_mhdp_device, hotplug_work.work); -- struct drm_connector *connector = &dp->mhdp.connector.base; -+ struct cdns_mhdp_device *mhdp = container_of(work, -+ struct cdns_mhdp_device, hotplug_work.work); -+ struct drm_connector *connector = &mhdp->connector.base; - - drm_helper_hpd_irq_event(connector->dev); - - if (connector->status == connector_status_connected) { - DRM_INFO("HDMI/DP Cable Plug In\n"); -- enable_irq(dp->irq[IRQ_OUT]); -+ enable_irq(mhdp->irq[IRQ_OUT]); - } else if (connector->status == connector_status_disconnected) { - /* Cable Disconnedted */ - DRM_INFO("HDMI/DP Cable Plug Out\n"); -- enable_irq(dp->irq[IRQ_IN]); -+ enable_irq(mhdp->irq[IRQ_IN]); - } - } - - static irqreturn_t cdns_dp_irq_thread(int irq, void *data) - { -- struct imx_mhdp_device *dp = data; -+ struct cdns_mhdp_device *mhdp = data; - - disable_irq_nosync(irq); - -- mod_delayed_work(system_wq, &dp->hotplug_work, -+ mod_delayed_work(system_wq, &mhdp->hotplug_work, - msecs_to_jiffies(HOTPLUG_DEBOUNCE_MS)); - - return IRQ_HANDLED; -@@ -430,111 +426,92 @@ static void cdns_dp_parse_dt(struct cdns - mhdp->dp.link.rate= mhdp->dp.link_rate; - } - --static struct imx_mhdp_device * --__cdns_dp_probe(struct platform_device *pdev, -- const struct cdn_plat_data *plat_data) -+static int __cdns_dp_probe(struct platform_device *pdev, -+ struct cdns_mhdp_device *mhdp) - { - struct device *dev = &pdev->dev; -- struct imx_mhdp_device *dp; - struct resource *iores = NULL; - int ret; - -- dp = devm_kzalloc(dev, sizeof(*dp), GFP_KERNEL); -- if (!dp) -- return ERR_PTR(-ENOMEM); -- -- dp->plat_data = plat_data; -- dp->mhdp.dev = dev; -- -- mutex_init(&dp->lock); -- mutex_init(&dp->audio_mutex); -- spin_lock_init(&dp->audio_lock); -+ mutex_init(&mhdp->lock); - -- INIT_DELAYED_WORK(&dp->hotplug_work, hotplug_work_func); -+ INIT_DELAYED_WORK(&mhdp->hotplug_work, hotplug_work_func); - - iores = platform_get_resource(pdev, IORESOURCE_MEM, 0); -- dp->mhdp.regs = devm_ioremap(dev, iores->start, resource_size(iores)); -- if (IS_ERR(dp->mhdp.regs)) { -- ret = PTR_ERR(dp->mhdp.regs); -- goto err_out; -- } -+ mhdp->regs_base = devm_ioremap(dev, iores->start, resource_size(iores)); -+ if (IS_ERR(mhdp->regs_base)) -+ return -ENOMEM; - --#if 0 - iores = platform_get_resource(pdev, IORESOURCE_MEM, 1); -- dp->regs_ss = devm_ioremap(dev, iores->start, resource_size(iores)); -- if (IS_ERR(dp->regs_ss)) { -- ret = PTR_ERR(dp->regs_ss); -- goto err_out; -- } --#endif -+ mhdp->regs_sec = devm_ioremap(dev, iores->start, resource_size(iores)); -+ if (IS_ERR(mhdp->regs_sec)) -+ return -ENOMEM; - -- dp->irq[IRQ_IN] = platform_get_irq_byname(pdev, "plug_in"); -- if (dp->irq[IRQ_IN] < 0) -+ mhdp->irq[IRQ_IN] = platform_get_irq_byname(pdev, "plug_in"); -+ if (mhdp->irq[IRQ_IN] < 0) - dev_info(dev, "No plug_in irq number\n"); - -- dp->irq[IRQ_OUT] = platform_get_irq_byname(pdev, "plug_out"); -- if (dp->irq[IRQ_OUT] < 0) -+ mhdp->irq[IRQ_OUT] = platform_get_irq_byname(pdev, "plug_out"); -+ if (mhdp->irq[IRQ_OUT] < 0) - dev_info(dev, "No plug_out irq number\n"); - -- cdns_dp_parse_dt(&dp->mhdp); -+ cdns_dp_parse_dt(mhdp); - -- dp->dual_mode = false; -- hdp_plat_call(dp, fw_init); -+// mhdp->dual_mode = false; -+ cdns_mhdp_plat_call(mhdp, firmware_init); - - /* DP FW alive check */ -- ret = cdns_mhdp_check_alive(&dp->mhdp); -+ ret = cdns_mhdp_check_alive(mhdp); - if (ret == false) { - DRM_ERROR("NO dp FW running\n"); -- return ERR_PTR(-ENXIO); -+ return -ENXIO; - } - - /* DP PHY init before AUX init */ -- hdp_plat_call(dp, phy_init); -+ cdns_mhdp_plat_call(mhdp, phy_set); - - /* Enable Hotplug Detect IRQ thread */ -- irq_set_status_flags(dp->irq[IRQ_IN], IRQ_NOAUTOEN); -- ret = devm_request_threaded_irq(dev, dp->irq[IRQ_IN], -+ irq_set_status_flags(mhdp->irq[IRQ_IN], IRQ_NOAUTOEN); -+ ret = devm_request_threaded_irq(dev, mhdp->irq[IRQ_IN], - NULL, cdns_dp_irq_thread, - IRQF_ONESHOT, dev_name(dev), -- dp); -+ mhdp); - if (ret) { - dev_err(dev, "can't claim irq %d\n", -- dp->irq[IRQ_IN]); -- goto err_out; -+ mhdp->irq[IRQ_IN]); -+ return -EINVAL; - } - -- irq_set_status_flags(dp->irq[IRQ_OUT], IRQ_NOAUTOEN); -- ret = devm_request_threaded_irq(dev, dp->irq[IRQ_OUT], -+ irq_set_status_flags(mhdp->irq[IRQ_OUT], IRQ_NOAUTOEN); -+ ret = devm_request_threaded_irq(dev, mhdp->irq[IRQ_OUT], - NULL, cdns_dp_irq_thread, - IRQF_ONESHOT, dev_name(dev), -- dp); -+ mhdp); - if (ret) { - dev_err(dev, "can't claim irq %d\n", -- dp->irq[IRQ_OUT]); -- goto err_out; -+ mhdp->irq[IRQ_OUT]); -+ return -EINVAL; - } -- if (cdns_mhdp_read_hpd(&dp->mhdp)) -- enable_irq(dp->irq[IRQ_OUT]); -+ -+ if (cdns_mhdp_read_hpd(mhdp)) -+ enable_irq(mhdp->irq[IRQ_OUT]); - else -- enable_irq(dp->irq[IRQ_IN]); -+ enable_irq(mhdp->irq[IRQ_IN]); - -- dp->mhdp.bridge.base.driver_private = dp; -- dp->mhdp.bridge.base.funcs = &cdns_dp_bridge_funcs; -+ mhdp->bridge.base.driver_private = mhdp; -+ mhdp->bridge.base.funcs = &cdns_dp_bridge_funcs; - #ifdef CONFIG_OF -- dp->mhdp.bridge.base.of_node = dev->of_node; -+ mhdp->bridge.base.of_node = dev->of_node; - #endif - -- dev_set_drvdata(dev, &dp->mhdp); -+ dev_set_drvdata(dev, mhdp); - - /* register audio driver */ - cdns_mhdp_register_audio_driver(dev); - -- dp_aux_init(&dp->mhdp, dev); -- -- return dp; -+ dp_aux_init(mhdp, dev); - --err_out: -- return ERR_PTR(ret); -+ return 0; - } - - static void __cdns_dp_remove(struct cdns_mhdp_device *mhdp) -@@ -547,15 +524,15 @@ static void __cdns_dp_remove(struct cdns - * Probe/remove API, used from platforms based on the DRM bridge API. - */ - int cdns_dp_probe(struct platform_device *pdev, -- const struct cdn_plat_data *plat_data) -+ struct cdns_mhdp_device *mhdp) - { -- struct imx_mhdp_device *dp; -+ int ret; - -- dp = __cdns_dp_probe(pdev, plat_data); -- if (IS_ERR(dp)) -- return PTR_ERR(dp); -+ ret = __cdns_dp_probe(pdev, mhdp); -+ if (ret) -+ return ret; - -- drm_bridge_add(&dp->mhdp.bridge.base); -+ drm_bridge_add(&mhdp->bridge.base); - - return 0; - } -@@ -575,16 +552,15 @@ EXPORT_SYMBOL_GPL(cdns_dp_remove); - * Bind/unbind API, used from platforms based on the component framework. - */ - int cdns_dp_bind(struct platform_device *pdev, struct drm_encoder *encoder, -- const struct cdn_plat_data *plat_data) -+ struct cdns_mhdp_device *mhdp) - { -- struct imx_mhdp_device *dp; - int ret; - -- dp = __cdns_dp_probe(pdev, plat_data); -- if (IS_ERR(dp)) -- return PTR_ERR(dp); -+ ret = __cdns_dp_probe(pdev, mhdp); -+ if (ret < 0) -+ return ret; - -- ret = drm_bridge_attach(encoder, &dp->mhdp.bridge.base, NULL); -+ ret = drm_bridge_attach(encoder, &mhdp->bridge.base, NULL); - if (ret) { - cdns_dp_remove(pdev); - DRM_ERROR("Failed to initialize bridge with drm\n"); ---- a/drivers/gpu/drm/bridge/cadence/cdns-hdmi-core.c -+++ b/drivers/gpu/drm/bridge/cadence/cdns-hdmi-core.c -@@ -9,7 +9,7 @@ - * (at your option) any later version. - * - */ --#include <drm/bridge/cdns-mhdp-imx.h> -+#include <drm/bridge/cdns-mhdp-common.h> - #include <drm/drm_atomic_helper.h> - #include <drm/drm_crtc_helper.h> - #include <drm/drm_edid.h> -@@ -60,8 +60,6 @@ static int hdmi_sink_config(struct cdns_ - static void hdmi_lanes_config(struct cdns_mhdp_device *mhdp) - { - /* Line swaping */ -- /* For imx8qm lane_mapping = 0x93 -- * For imx8mq lane_mapping = 0xe4*/ - cdns_mhdp_reg_write(mhdp, LANES_CONFIG, 0x00400000 | mhdp->lane_mapping); - } - -@@ -216,12 +214,12 @@ void cdns_hdmi_mode_set(struct cdns_mhdp - static enum drm_connector_status - cdns_hdmi_connector_detect(struct drm_connector *connector, bool force) - { -- struct imx_mhdp_device *hdmi = -- container_of(connector, struct imx_mhdp_device, mhdp.connector.base); -+ struct cdns_mhdp_device *mhdp = -+ container_of(connector, struct cdns_mhdp_device, connector.base); - - u8 hpd = 0xf; - -- hpd = cdns_mhdp_read_hpd(&hdmi->mhdp); -+ hpd = cdns_mhdp_read_hpd(mhdp); - - if (hpd == 1) - /* Cable Connected */ -@@ -238,15 +236,15 @@ cdns_hdmi_connector_detect(struct drm_co - - static int cdns_hdmi_connector_get_modes(struct drm_connector *connector) - { -- struct imx_mhdp_device *hdmi = container_of(connector, struct imx_mhdp_device, -- mhdp.connector.base); -+ struct cdns_mhdp_device *mhdp = -+ container_of(connector, struct cdns_mhdp_device, connector.base); - int num_modes = 0; - struct edid *edid; - -- edid = drm_do_get_edid(&hdmi->mhdp.connector.base, -- cdns_hdmi_get_edid_block, &hdmi->mhdp); -+ edid = drm_do_get_edid(&mhdp->connector.base, -+ cdns_hdmi_get_edid_block, mhdp); - if (edid) { -- dev_info(hdmi->mhdp.dev, "%x,%x,%x,%x,%x,%x,%x,%x\n", -+ dev_info(mhdp->dev, "%x,%x,%x,%x,%x,%x,%x,%x\n", - edid->header[0], edid->header[1], - edid->header[2], edid->header[3], - edid->header[4], edid->header[5], -@@ -276,9 +274,9 @@ static const struct drm_connector_helper - - static int cdns_hdmi_bridge_attach(struct drm_bridge *bridge) - { -- struct imx_mhdp_device *hdmi = bridge->driver_private; -+ struct cdns_mhdp_device *mhdp = bridge->driver_private; - struct drm_encoder *encoder = bridge->encoder; -- struct drm_connector *connector = &hdmi->mhdp.connector.base; -+ struct drm_connector *connector = &mhdp->connector.base; - - connector->interlace_allowed = 1; - connector->polled = DRM_CONNECTOR_POLL_HPD; -@@ -319,9 +317,9 @@ static void cdns_hdmi_bridge_mode_set(st - const struct drm_display_mode *orig_mode, - const struct drm_display_mode *mode) - { -- struct imx_mhdp_device *hdmi = bridge->driver_private; -- struct drm_display_info *display_info = &hdmi->mhdp.connector.base.display_info; -- struct video_info *video = &hdmi->mhdp.video_info; -+ struct cdns_mhdp_device *mhdp = bridge->driver_private; -+ struct drm_display_info *display_info = &mhdp->connector.base.display_info; -+ struct video_info *video = &mhdp->video_info; - - switch (display_info->bpc) { - case 10: -@@ -339,23 +337,24 @@ static void cdns_hdmi_bridge_mode_set(st - video->v_sync_polarity = !!(mode->flags & DRM_MODE_FLAG_NVSYNC); - video->h_sync_polarity = !!(mode->flags & DRM_MODE_FLAG_NHSYNC); - -- mutex_lock(&hdmi->lock); -+ mutex_lock(&mhdp->lock); - - DRM_INFO("Mode: %dx%dp%d\n", mode->hdisplay, mode->vdisplay, mode->clock); - -- memcpy(&hdmi->mhdp.mode, mode, sizeof(struct drm_display_mode)); -+ memcpy(&mhdp->mode, mode, sizeof(struct drm_display_mode)); - -- hdmi->dual_mode = video_is_dual_mode(mode); -+ //Sandor TODO -+// hdmi->dual_mode = video_is_dual_mode(mode); - -- hdmi_lanes_config(&hdmi->mhdp); -+ hdmi_lanes_config(mhdp); - -- hdp_plat_call(hdmi, pclock_change); -+ cdns_mhdp_plat_call(mhdp, pclk_rate); - -- hdp_plat_call(hdmi, phy_init); -+ cdns_mhdp_plat_call(mhdp, phy_set); - -- cdns_hdmi_mode_set(&hdmi->mhdp); -+ cdns_hdmi_mode_set(mhdp); - -- mutex_unlock(&hdmi->lock); -+ mutex_unlock(&mhdp->lock); - } - - static const struct drm_bridge_funcs cdns_hdmi_bridge_funcs = { -@@ -366,30 +365,30 @@ static const struct drm_bridge_funcs cdn - - static void hotplug_work_func(struct work_struct *work) - { -- struct imx_mhdp_device *hdmi = container_of(work, -- struct imx_mhdp_device, hotplug_work.work); -- struct drm_connector *connector = &hdmi->mhdp.connector.base; -+ struct cdns_mhdp_device *mhdp = container_of(work, -+ struct cdns_mhdp_device, hotplug_work.work); -+ struct drm_connector *connector = &mhdp->connector.base; - - drm_helper_hpd_irq_event(connector->dev); - - if (connector->status == connector_status_connected) { - /* Cable Connected */ - DRM_INFO("HDMI Cable Plug In\n"); -- enable_irq(hdmi->irq[IRQ_OUT]); -+ enable_irq(mhdp->irq[IRQ_OUT]); - } else if (connector->status == connector_status_disconnected) { - /* Cable Disconnedted */ - DRM_INFO("HDMI Cable Plug Out\n"); -- enable_irq(hdmi->irq[IRQ_IN]); -+ enable_irq(mhdp->irq[IRQ_IN]); - } - } - - static irqreturn_t cdns_hdmi_irq_thread(int irq, void *data) - { -- struct imx_mhdp_device *hdmi = data; -+ struct cdns_mhdp_device *mhdp = data; - - disable_irq_nosync(irq); - -- mod_delayed_work(system_wq, &hdmi->hotplug_work, -+ mod_delayed_work(system_wq, &mhdp->hotplug_work, - msecs_to_jiffies(HOTPLUG_DEBOUNCE_MS)); - - return IRQ_HANDLED; -@@ -408,109 +407,99 @@ static void cdns_hdmi_parse_dt(struct cd - dev_info(mhdp->dev, "lane-mapping 0x%02x\n", mhdp->lane_mapping); - } - --static struct imx_mhdp_device * --__cdns_hdmi_probe(struct platform_device *pdev, -- const struct cdn_plat_data *plat_data) -+static int __cdns_hdmi_probe(struct platform_device *pdev, -+ struct cdns_mhdp_device *mhdp) - { - struct device *dev = &pdev->dev; -- struct device_node *np = dev->of_node; - struct platform_device_info pdevinfo; -- struct imx_mhdp_device *hdmi; - struct resource *iores = NULL; - int ret; - -- hdmi = devm_kzalloc(dev, sizeof(*hdmi), GFP_KERNEL); -- if (!hdmi) -- return ERR_PTR(-ENOMEM); -- -- hdmi->plat_data = plat_data; -- hdmi->mhdp.dev = dev; -- -- mutex_init(&hdmi->lock); -- mutex_init(&hdmi->audio_mutex); -- spin_lock_init(&hdmi->audio_lock); -+ mutex_init(&mhdp->lock); - -- INIT_DELAYED_WORK(&hdmi->hotplug_work, hotplug_work_func); -+ INIT_DELAYED_WORK(&mhdp->hotplug_work, hotplug_work_func); - - iores = platform_get_resource(pdev, IORESOURCE_MEM, 0); -- hdmi->mhdp.regs = devm_ioremap(dev, iores->start, resource_size(iores)); -- if (IS_ERR(hdmi->mhdp.regs)) { -- ret = PTR_ERR(hdmi->mhdp.regs); -- goto err_out; -+ mhdp->regs_base = devm_ioremap(dev, iores->start, resource_size(iores)); -+ if (IS_ERR(mhdp->regs_base)) { -+ dev_err(dev, "No regs_base memory\n"); -+ return -ENOMEM; -+ } -+ -+ /* sec register base */ -+ iores = platform_get_resource(pdev, IORESOURCE_MEM, 1); -+ mhdp->regs_sec = devm_ioremap(dev, iores->start, resource_size(iores)); -+ if (IS_ERR(mhdp->regs_sec)) { -+ dev_err(dev, "No regs_sec memory\n"); -+ return -ENOMEM; - } - -- /* csr register base */ -- hdmi->regmap_csr = syscon_regmap_lookup_by_phandle(np, "csr"); -- if (IS_ERR(hdmi->regmap_csr)) { -- dev_info(dev, "No csr regmap\n"); -- } -- -- hdmi->irq[IRQ_IN] = platform_get_irq_byname(pdev, "plug_in"); -- if (hdmi->irq[IRQ_IN] < 0) { -+ mhdp->irq[IRQ_IN] = platform_get_irq_byname(pdev, "plug_in"); -+ if (mhdp->irq[IRQ_IN] < 0) { - dev_info(dev, "No plug_in irq number\n"); -- return ERR_PTR(-EPROBE_DEFER); -+ return -EPROBE_DEFER; - } - -- hdmi->irq[IRQ_OUT] = platform_get_irq_byname(pdev, "plug_out"); -- if (hdmi->irq[IRQ_OUT] < 0) { -+ mhdp->irq[IRQ_OUT] = platform_get_irq_byname(pdev, "plug_out"); -+ if (mhdp->irq[IRQ_OUT] < 0) { - dev_info(dev, "No plug_out irq number\n"); -- return ERR_PTR(-EPROBE_DEFER); -+ return -EPROBE_DEFER; - } - - /* Initialize dual_mode to false */ -- hdmi->dual_mode = false; -+// hdmi->dual_mode = false; - - /* Initialize FW */ -- hdp_plat_call(hdmi, fw_init); -+ cdns_mhdp_plat_call(mhdp, firmware_init); - - /* HDMI FW alive check */ -- ret = cdns_mhdp_check_alive(&hdmi->mhdp); -+ ret = cdns_mhdp_check_alive(mhdp); - if (ret == false) { -- DRM_ERROR("NO HDMI FW running\n"); -- return ERR_PTR(-ENXIO); -+ dev_err(dev, "NO HDMI FW running\n"); -+ return -ENXIO; - } - - /* Enable Hotplug Detect thread */ -- irq_set_status_flags(hdmi->irq[IRQ_IN], IRQ_NOAUTOEN); -- ret = devm_request_threaded_irq(dev, hdmi->irq[IRQ_IN], -+ irq_set_status_flags(mhdp->irq[IRQ_IN], IRQ_NOAUTOEN); -+ ret = devm_request_threaded_irq(dev, mhdp->irq[IRQ_IN], - NULL, cdns_hdmi_irq_thread, - IRQF_ONESHOT, dev_name(dev), -- hdmi); -- if (ret) { -+ mhdp); -+ if (ret < 0) { - dev_err(dev, "can't claim irq %d\n", -- hdmi->irq[IRQ_IN]); -- goto err_out; -+ mhdp->irq[IRQ_IN]); -+ return -EINVAL; - } - -- irq_set_status_flags(hdmi->irq[IRQ_OUT], IRQ_NOAUTOEN); -- ret = devm_request_threaded_irq(dev, hdmi->irq[IRQ_OUT], -+ irq_set_status_flags(mhdp->irq[IRQ_OUT], IRQ_NOAUTOEN); -+ ret = devm_request_threaded_irq(dev, mhdp->irq[IRQ_OUT], - NULL, cdns_hdmi_irq_thread, - IRQF_ONESHOT, dev_name(dev), -- hdmi); -- if (ret) { -+ mhdp); -+ if (ret < 0) { - dev_err(dev, "can't claim irq %d\n", -- hdmi->irq[IRQ_OUT]); -- goto err_out; -+ mhdp->irq[IRQ_OUT]); -+ return -EINVAL; - } - -- cdns_hdmi_parse_dt(&hdmi->mhdp); -+ cdns_hdmi_parse_dt(mhdp); - -- if (cdns_mhdp_read_hpd(&hdmi->mhdp)) -- enable_irq(hdmi->irq[IRQ_OUT]); -+ if (cdns_mhdp_read_hpd(mhdp)) -+ enable_irq(mhdp->irq[IRQ_OUT]); - else -- enable_irq(hdmi->irq[IRQ_IN]); -+ enable_irq(mhdp->irq[IRQ_IN]); - -- hdmi->mhdp.bridge.base.driver_private = hdmi; -- hdmi->mhdp.bridge.base.funcs = &cdns_hdmi_bridge_funcs; -+ mhdp->bridge.base.driver_private = mhdp; -+ mhdp->bridge.base.funcs = &cdns_hdmi_bridge_funcs; - #ifdef CONFIG_OF -- hdmi->mhdp.bridge.base.of_node = dev->of_node; -+ mhdp->bridge.base.of_node = dev->of_node; - #endif - - memset(&pdevinfo, 0, sizeof(pdevinfo)); - pdevinfo.parent = dev; - pdevinfo.id = PLATFORM_DEVID_AUTO; - -- dev_set_drvdata(dev, &hdmi->mhdp); -+ dev_set_drvdata(dev, mhdp); - - /* register audio driver */ - cdns_mhdp_register_audio_driver(dev); -@@ -520,11 +509,7 @@ __cdns_hdmi_probe(struct platform_device - cdns_mhdp_register_cec_driver(dev); - #endif - -- return hdmi; -- --err_out: -- -- return ERR_PTR(ret); -+ return 0; - } - - static void __cdns_hdmi_remove(struct cdns_mhdp_device *mhdp) -@@ -540,15 +525,15 @@ static void __cdns_hdmi_remove(struct cd - * Probe/remove API, used from platforms based on the DRM bridge API. - */ - int cdns_hdmi_probe(struct platform_device *pdev, -- const struct cdn_plat_data *plat_data) -+ struct cdns_mhdp_device *mhdp) - { -- struct imx_mhdp_device *hdmi; -+ int ret; - -- hdmi = __cdns_hdmi_probe(pdev, plat_data); -- if (IS_ERR(hdmi)) -- return PTR_ERR(hdmi); -+ ret = __cdns_hdmi_probe(pdev, mhdp); -+ if (ret < 0) -+ return ret; - -- drm_bridge_add(&hdmi->mhdp.bridge.base); -+ drm_bridge_add(&mhdp->bridge.base); - - return 0; - } -@@ -568,16 +553,15 @@ EXPORT_SYMBOL_GPL(cdns_hdmi_remove); - * Bind/unbind API, used from platforms based on the component framework. - */ - int cdns_hdmi_bind(struct platform_device *pdev, struct drm_encoder *encoder, -- const struct cdn_plat_data *plat_data) -+ struct cdns_mhdp_device *mhdp) - { -- struct imx_mhdp_device *hdmi; - int ret; - -- hdmi = __cdns_hdmi_probe(pdev, plat_data); -- if (IS_ERR(hdmi)) -- return PTR_ERR(hdmi); -+ ret = __cdns_hdmi_probe(pdev, mhdp); -+ if (ret) -+ return ret; - -- ret = drm_bridge_attach(encoder, &hdmi->mhdp.bridge.base, NULL); -+ ret = drm_bridge_attach(encoder, &mhdp->bridge.base, NULL); - if (ret) { - cdns_hdmi_remove(pdev); - DRM_ERROR("Failed to initialize bridge with drm\n"); ---- a/drivers/gpu/drm/bridge/cadence/cdns-mhdp-audio.c -+++ b/drivers/gpu/drm/bridge/cadence/cdns-mhdp-audio.c -@@ -16,7 +16,6 @@ - #include <linux/reset.h> - #include <drm/bridge/cdns-mhdp-common.h> - #include <sound/hdmi-codec.h> --#include <drm/bridge/cdns-mhdp-imx.h> - #include <drm/drm_of.h> - #include <drm/drmP.h> - ---- a/drivers/gpu/drm/bridge/cadence/cdns-mhdp-cec.c -+++ b/drivers/gpu/drm/bridge/cadence/cdns-mhdp-cec.c -@@ -344,4 +344,4 @@ int cdns_mhdp_unregister_cec_driver(stru - - MODULE_AUTHOR("Sandor.Yu@NXP.com"); - MODULE_LICENSE("GPL"); --MODULE_DESCRIPTION("NXP CDNS MHDP CEC driver"); -+MODULE_DESCRIPTION("NXP CDNS MHDP HDMI CEC driver"); ---- a/drivers/gpu/drm/bridge/cadence/cdns-mhdp-common.c -+++ b/drivers/gpu/drm/bridge/cadence/cdns-mhdp-common.c -@@ -23,7 +23,6 @@ - #include <asm/unaligned.h> - - #include <drm/bridge/cdns-mhdp-common.h> --#include <drm/bridge/cdns-mhdp-imx.h> - #include <drm/drm_modes.h> - #include <drm/drm_print.h> - #include <linux/regmap.h> -@@ -74,18 +73,20 @@ static inline void put_unaligned_be24(u3 - - u32 cdns_mhdp_bus_read(struct cdns_mhdp_device *mhdp, u32 offset) - { -- struct imx_mhdp_device *hdmi = container_of(mhdp, struct imx_mhdp_device, mhdp); - u32 val; - -- /* TODO */ -- if (offset >= 0x1000 && hdmi->regmap_csr) { -+ if (mhdp->bus_type == BUS_TYPE_LOW4K_SAPB) { -+ /* Remap address to low 4K SAPB bus */ -+ writel(offset >> 12, mhdp->regs_sec + 0xc); -+ val = readl((offset & 0xfff) + mhdp->regs_base); -+ } else if (mhdp->bus_type == BUS_TYPE_LOW4K_APB) { - /* Remap address to low 4K memory */ -- regmap_write(hdmi->regmap_csr, hdmi->csr_ctrl0_reg, offset >> 12); -- val = readl((offset & 0xfff) + mhdp->regs); -- /* Restore address mapping */ -- regmap_write(hdmi->regmap_csr, hdmi->csr_ctrl0_reg, 0); -- } else -- val = readl(mhdp->regs + offset); -+ writel(offset >> 12, mhdp->regs_sec + 8); -+ val = readl((offset & 0xfff) + mhdp->regs_base); -+ } else if (mhdp->bus_type == BUS_TYPE_NORMAL_SAPB) -+ val = readl(mhdp->regs_sec + offset); -+ else -+ val = readl(mhdp->regs_base + offset); - - return val; - } -@@ -93,18 +94,18 @@ EXPORT_SYMBOL(cdns_mhdp_bus_read); - - void cdns_mhdp_bus_write(u32 val, struct cdns_mhdp_device *mhdp, u32 offset) - { -- struct imx_mhdp_device *hdmi = container_of(mhdp, struct imx_mhdp_device, mhdp); -- -- /* TODO */ -- if (offset >= 0x1000 && hdmi->regmap_csr) { -+ if (mhdp->bus_type == BUS_TYPE_LOW4K_SAPB) { -+ /* Remap address to low 4K SAPB bus */ -+ writel(offset >> 12, mhdp->regs_sec + 0xc); -+ writel(val, (offset & 0xfff) + mhdp->regs_base); -+ } else if (mhdp->bus_type == BUS_TYPE_LOW4K_APB) { - /* Remap address to low 4K memory */ -- regmap_write(hdmi->regmap_csr, hdmi->csr_ctrl0_reg, offset >> 12); -- writel(val, (offset & 0xfff) + mhdp->regs); -- /* Restore address mapping */ -- regmap_write(hdmi->regmap_csr, hdmi->csr_ctrl0_reg, 0); -- -- } else -- writel(val, mhdp->regs + offset); -+ writel(offset >> 12, mhdp->regs_sec + 8); -+ writel(val, (offset & 0xfff) + mhdp->regs_base); -+ } else if (mhdp->bus_type == BUS_TYPE_NORMAL_SAPB) -+ writel(val, mhdp->regs_sec + offset); -+ else -+ writel(val, mhdp->regs_base + offset); - } - EXPORT_SYMBOL(cdns_mhdp_bus_write); - ---- a/drivers/gpu/drm/bridge/cadence/cdns-mhdp-hdmi.c -+++ b/drivers/gpu/drm/bridge/cadence/cdns-mhdp-hdmi.c -@@ -10,7 +10,6 @@ - #include <drm/drmP.h> - #include <linux/io.h> - #include <drm/bridge/cdns-mhdp-common.h> --#include <drm/bridge/cdns-mhdp-imx.h> - #include <linux/regmap.h> - - void cdns_mhdp_infoframe_set(struct cdns_mhdp_device *mhdp, ---- a/include/drm/bridge/cdns-mhdp-common.h -+++ b/include/drm/bridge/cdns-mhdp-common.h -@@ -495,6 +495,22 @@ - - #define HOTPLUG_DEBOUNCE_MS 200 - -+#define IRQ_IN 0 -+#define IRQ_OUT 1 -+#define IRQ_NUM 2 -+ -+#define cdns_mhdp_plat_call(mhdp, operation) \ -+ (!(mhdp) ? -ENODEV : (((mhdp)->plat_data && (mhdp)->plat_data->operation) ? \ -+ (mhdp)->plat_data->operation(mhdp) : ENOIOCTLCMD)) -+ -+/* bus access type */ -+enum { -+ BUS_TYPE_NORMAL_APB = 0, -+ BUS_TYPE_NORMAL_SAPB = 1, -+ BUS_TYPE_LOW4K_APB = 2, -+ BUS_TYPE_LOW4K_SAPB = 3, -+}; -+ - enum voltage_swing_level { - VOLTAGE_LEVEL_0, - VOLTAGE_LEVEL_1, -@@ -616,8 +632,33 @@ struct cdns_mhdp_cec { - }; - #endif - -+struct cdns_plat_data { -+ /* Vendor PHY support */ -+ int (*bind)(struct platform_device *pdev, -+ struct drm_encoder *encoder, -+ struct cdns_mhdp_device *mhdp); -+ void (*unbind)(struct device *dev); -+ -+ void (*plat_init)(struct cdns_mhdp_device *mhdp); -+ void (*plat_deinit)(struct cdns_mhdp_device *mhdp); -+ -+ int (*phy_set)(struct cdns_mhdp_device *mhdp); -+ int (*firmware_init)(struct cdns_mhdp_device *mhdp); -+ void (*pclk_rate)(struct cdns_mhdp_device *mhdp); -+ -+ int (*power_on)(struct cdns_mhdp_device *mhdp); -+ int (*power_off)(struct cdns_mhdp_device *mhdp); -+ -+ int bus_type; -+ int video_format; -+ char is_dp; -+}; -+ - struct cdns_mhdp_device { -- void __iomem *regs; -+ void __iomem *regs_base; -+ void __iomem *regs_sec; -+ -+ int bus_type; - - struct device *dev; - -@@ -642,6 +683,9 @@ struct cdns_mhdp_device { - bool link_up; - bool power_up; - bool plugged; -+ struct mutex lock; -+ -+ int irq[IRQ_NUM]; - - union { - struct _dp_data { -@@ -663,6 +707,8 @@ struct cdns_mhdp_device { - u32 hdmi_type; - } hdmi; - }; -+ const struct cdns_plat_data *plat_data; -+ - }; - - u32 cdns_mhdp_bus_read(struct cdns_mhdp_device *mhdp, u32 offset); -@@ -727,6 +773,25 @@ int cdns_hdmi_disable_gcp(struct cdns_mh - int cdns_hdmi_enable_gcp(struct cdns_mhdp_device *mhdp); - - bool cdns_mhdp_check_alive(struct cdns_mhdp_device *mhdp); -+ -+/* HDMI */ -+int cdns_hdmi_probe(struct platform_device *pdev, -+ struct cdns_mhdp_device *mhdp); -+void cdns_hdmi_remove(struct platform_device *pdev); -+void cdns_hdmi_unbind(struct device *dev); -+int cdns_hdmi_bind(struct platform_device *pdev, -+ struct drm_encoder *encoder, struct cdns_mhdp_device *mhdp); -+void cdns_hdmi_set_sample_rate(struct cdns_mhdp_device *mhdp, unsigned int rate); -+void cdns_hdmi_audio_enable(struct cdns_mhdp_device *mhdp); -+void cdns_hdmi_audio_disable(struct cdns_mhdp_device *mhdp); -+/* DP */ -+int cdns_dp_probe(struct platform_device *pdev, -+ struct cdns_mhdp_device *mhdp); -+void cdns_dp_remove(struct platform_device *pdev); -+void cdns_dp_unbind(struct device *dev); -+int cdns_dp_bind(struct platform_device *pdev, -+ struct drm_encoder *encoder, struct cdns_mhdp_device *mhdp); -+ - /* CEC */ - #ifdef CONFIG_DRM_CDNS_HDMI_CEC - int cdns_mhdp_register_cec_driver(struct device *dev); ---- a/include/drm/bridge/cdns-mhdp-imx.h -+++ /dev/null -@@ -1,121 +0,0 @@ --/* -- * Cadence High-Definition Multimedia Interface (HDMI) driver -- * -- * Copyright (C) 2019 NXP 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 CDNS_MHDP_IMX_H_ --#define CDNS_MHDP_IMX_H_ -- --#include <drm/bridge/cdns-mhdp-common.h> -- --#define IRQ_IN 0 --#define IRQ_OUT 1 --#define IRQ_NUM 2 -- --#define hdp_plat_call(hdp, operation) \ -- (!(hdp) ? -ENODEV : (((hdp)->plat_data && (hdp)->plat_data->operation) ? \ -- (hdp)->plat_data->operation(hdp) : ENOIOCTLCMD)) -- --#define HDP_DUAL_MODE_MIN_PCLK_RATE 300000 /* KHz */ --#define HDP_SINGLE_MODE_MAX_WIDTH 1920 -- --static inline bool video_is_dual_mode(const struct drm_display_mode *mode) --{ -- return (mode->clock > HDP_DUAL_MODE_MIN_PCLK_RATE || -- mode->hdisplay > HDP_SINGLE_MODE_MAX_WIDTH) ? true : false; --} -- --struct imx_mhdp_device; -- --struct imx_hdp_clks { -- struct clk *av_pll; -- struct clk *dig_pll; -- struct clk *clk_ipg; -- struct clk *clk_core; -- struct clk *clk_pxl; -- struct clk *clk_pxl_mux; -- struct clk *clk_pxl_link; -- -- struct clk *lpcg_hdp; -- struct clk *lpcg_msi; -- struct clk *lpcg_pxl; -- struct clk *lpcg_vif; -- struct clk *lpcg_lis; -- struct clk *lpcg_apb; -- struct clk *lpcg_apb_csr; -- struct clk *lpcg_apb_ctrl; -- -- struct clk *lpcg_i2s; -- struct clk *clk_i2s_bypass; --}; -- --struct cdn_plat_data { -- /* Vendor PHY support */ -- int (*phy_init)(struct imx_mhdp_device *hdmi); -- int (*bind)(struct platform_device *pdev, -- struct drm_encoder *encoder, -- const struct cdn_plat_data *plat_data); -- void (*unbind)(struct device *dev); -- int (*fw_init)(struct imx_mhdp_device *hdp); -- void (*pclock_change)(struct imx_mhdp_device *hdp); -- char is_dp; --}; -- --struct imx_mhdp_device { -- struct cdns_mhdp_device mhdp; -- -- struct mutex lock; -- struct mutex audio_mutex; -- spinlock_t audio_lock; -- bool connected; -- bool active; -- bool suspended; -- struct imx_hdp_clks clks; -- -- const struct cdn_plat_data *plat_data; -- -- int irq[IRQ_NUM]; -- struct delayed_work hotplug_work; -- //void __iomem *regmap_csr; -- struct regmap *regmap_csr; -- u32 csr_pxl_mux_reg; -- u32 csr_ctrl0_reg; -- u32 csr_ctrl0_sec; -- -- struct audio_info audio_info; -- bool sink_has_audio; -- u32 dual_mode; -- -- struct device *pd_mhdp_dev; -- struct device *pd_pll0_dev; -- struct device *pd_pll1_dev; -- struct device_link *pd_mhdp_link; -- struct device_link *pd_pll0_link; -- struct device_link *pd_pll1_link; -- -- u32 phy_init; --}; -- --int cdns_hdmi_probe(struct platform_device *pdev, -- const struct cdn_plat_data *plat_data); --void cdns_hdmi_remove(struct platform_device *pdev); --void cdns_hdmi_unbind(struct device *dev); --int cdns_hdmi_bind(struct platform_device *pdev, struct drm_encoder *encoder, -- const struct cdn_plat_data *plat_data); --void cdns_hdmi_set_sample_rate(struct imx_mhdp_device *hdmi, unsigned int rate); --void cdns_hdmi_audio_enable(struct imx_mhdp_device *hdmi); --void cdns_hdmi_audio_disable(struct imx_mhdp_device *hdmi); --int cdns_dp_probe(struct platform_device *pdev, -- const struct cdn_plat_data *plat_data); --void cdns_dp_remove(struct platform_device *pdev); --void cdns_dp_unbind(struct device *dev); --int cdns_dp_bind(struct platform_device *pdev, struct drm_encoder *encoder, -- const struct cdn_plat_data *plat_data); -- --#endif /* CDNS_MHDP_IMX_H_ */ |