Loading drivers/video/msm/mdss/Makefile +4 −0 Original line number Diff line number Diff line Loading @@ -42,6 +42,8 @@ mdss-dsi-objs += mdss_dsi_phy.o mdss-dsi-objs += mdss_dsi_clk.o obj-$(CONFIG_FB_MSM_MDSS) += mdss-dsi.o obj-$(CONFIG_FB_MSM_MDSS) += mdss_panel.o ifneq ($(CONFIG_FB_MSM_MDSS_MDP3), y) obj-$(CONFIG_FB_MSM_MDSS) += mdss_hdmi_util.o obj-$(CONFIG_FB_MSM_MDSS) += mdss_hdmi_edid.o obj-$(CONFIG_FB_MSM_MDSS) += mdss_cec_core.o Loading @@ -56,6 +58,8 @@ obj-$(CONFIG_FB_MSM_MDSS_HDMI_PANEL) += mdss_hdmi_hdcp2p2.o obj-$(CONFIG_FB_MSM_MDSS_HDMI_PANEL) += mdss_hdmi_cec.o obj-$(CONFIG_FB_MSM_MDSS_HDMI_PANEL) += mdss_hdmi_audio.o obj-$(CONFIG_FB_MSM_MDSS_HDMI_MHL_SII8334) += mhl_sii8334.o mhl_msc.o ccflags-y += -DTARGET_HW_MDSS_HDMI endif obj-$(CONFIG_FB_MSM_MDSS_WRITEBACK) += mdss_wb.o Loading drivers/video/msm/mdss/mdss_dsi.c +30 −11 Original line number Diff line number Diff line /* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. /* Copyright (c) 2012-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and Loading Loading @@ -2312,6 +2312,7 @@ static int mdss_dsi_set_stream_size(struct mdss_panel_data *pdata) return 0; } #ifdef TARGET_HW_MDSS_HDMI static void mdss_dsi_dba_work(struct work_struct *work) { struct mdss_dsi_ctrl_pdata *ctrl_pdata = NULL; Loading Loading @@ -2357,7 +2358,12 @@ static void mdss_dsi_dba_work(struct work_struct *work) &ctrl_pdata->dba_work, HZ); } } #else static void mdss_dsi_dba_work(struct work_struct *work) { (void)(*work); } #endif static int mdss_dsi_reset_write_ptr(struct mdss_panel_data *pdata) { Loading Loading @@ -3250,6 +3256,27 @@ static int mdss_dsi_parse_dt_params(struct platform_device *pdev, return 0; } #ifdef TARGET_HW_MDSS_HDMI static void mdss_dsi_res_deinit_hdmi(struct platform_device *pdev, int val) { struct mdss_dsi_data *dsi_res = platform_get_drvdata(pdev); if (dsi_res->ctrl_pdata[val]->ds_registered) { struct mdss_panel_info *pinfo = &dsi_res->ctrl_pdata[val]-> panel_data.panel_info; if (pinfo) mdss_dba_utils_deinit(pinfo->dba_data); } } #else static void mdss_dsi_res_deinit_hdmi(struct platform_device *pdev, int val) { (void)(*pdev); (void)(val); } #endif static void mdss_dsi_res_deinit(struct platform_device *pdev) { int i; Loading @@ -3263,15 +3290,7 @@ static void mdss_dsi_res_deinit(struct platform_device *pdev) for (i = 0; i < DSI_CTRL_MAX; i++) { if (dsi_res->ctrl_pdata[i]) { if (dsi_res->ctrl_pdata[i]->ds_registered) { struct mdss_panel_info *pinfo = &dsi_res->ctrl_pdata[i]-> panel_data.panel_info; if (pinfo) mdss_dba_utils_deinit(pinfo->dba_data); } mdss_dsi_res_deinit_hdmi(pdev, i); devm_kfree(&pdev->dev, dsi_res->ctrl_pdata[i]); } } Loading drivers/video/msm/mdss/mdss_dsi_panel.c +97 −32 Original line number Diff line number Diff line /* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. /* Copyright (c) 2012-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and Loading @@ -24,8 +24,9 @@ #include <linux/string.h> #include "mdss_dsi.h" #ifdef TARGET_HW_MDSS_HDMI #include "mdss_dba_utils.h" #endif #define DT_CMD_HDR 6 #define MIN_REFRESH_RATE 48 #define DEFAULT_MDP_TRANSFER_TIME 14000 Loading Loading @@ -702,6 +703,22 @@ static void mdss_dsi_panel_bl_ctrl(struct mdss_panel_data *pdata, } } #ifdef TARGET_HW_MDSS_HDMI static void mdss_dsi_panel_on_hdmi(struct mdss_dsi_ctrl_pdata *ctrl, struct mdss_panel_info *pinfo) { if (ctrl->ds_registered) mdss_dba_utils_video_on(pinfo->dba_data, pinfo); } #else static void mdss_dsi_panel_on_hdmi(struct mdss_dsi_ctrl_pdata *ctrl, struct mdss_panel_info *pinfo) { (void)(*ctrl); (void)(*pinfo); } #endif static int mdss_dsi_panel_on(struct mdss_panel_data *pdata) { struct mdss_dsi_ctrl_pdata *ctrl = NULL; Loading Loading @@ -740,19 +757,37 @@ static int mdss_dsi_panel_on(struct mdss_panel_data *pdata) if (pinfo->compression_mode == COMPRESSION_DSC) mdss_dsi_panel_dsc_pps_send(ctrl, pinfo); if (ctrl->ds_registered) mdss_dba_utils_video_on(pinfo->dba_data, pinfo); mdss_dsi_panel_on_hdmi(ctrl, pinfo); end: pr_debug("%s:-\n", __func__); return ret; } #ifdef TARGET_HW_MDSS_HDMI static void mdss_dsi_post_panel_on_hdmi(struct mdss_panel_info *pinfo) { u32 vsync_period = 0; if (pinfo->is_dba_panel && pinfo->is_pluggable) { /* ensure at least 1 frame transfers to down stream device */ vsync_period = (MSEC_PER_SEC / pinfo->mipi.frame_rate) + 1; msleep(vsync_period); mdss_dba_utils_hdcp_enable(pinfo->dba_data, true); } } #else static void mdss_dsi_post_panel_on_hdmi(struct mdss_panel_info *pinfo) { (void)(*pinfo); } #endif static int mdss_dsi_post_panel_on(struct mdss_panel_data *pdata) { struct mdss_dsi_ctrl_pdata *ctrl = NULL; struct mdss_panel_info *pinfo; struct dsi_panel_cmds *cmds; u32 vsync_period = 0; if (pdata == NULL) { pr_err("%s: Invalid input data\n", __func__); Loading @@ -774,18 +809,31 @@ static int mdss_dsi_post_panel_on(struct mdss_panel_data *pdata) mdss_dsi_panel_cmds_send(ctrl, cmds, CMD_REQ_COMMIT); } if (pinfo->is_dba_panel && pinfo->is_pluggable) { /* ensure at least 1 frame transfers to down stream device */ vsync_period = (MSEC_PER_SEC / pinfo->mipi.frame_rate) + 1; msleep(vsync_period); mdss_dba_utils_hdcp_enable(pinfo->dba_data, true); } mdss_dsi_post_panel_on_hdmi(pinfo); end: pr_debug("%s:-\n", __func__); return 0; } #ifdef TARGET_HW_MDSS_HDMI static void mdss_dsi_panel_off_hdmi(struct mdss_dsi_ctrl_pdata *ctrl, struct mdss_panel_info *pinfo) { if (ctrl->ds_registered && pinfo->is_pluggable) { mdss_dba_utils_video_off(pinfo->dba_data); mdss_dba_utils_hdcp_enable(pinfo->dba_data, false); } } #else static void mdss_dsi_panel_off_hdmi(struct mdss_dsi_ctrl_pdata *ctrl, struct mdss_panel_info *pinfo) { (void)(*ctrl); (void)(*pinfo); } #endif static int mdss_dsi_panel_off(struct mdss_panel_data *pdata) { struct mdss_dsi_ctrl_pdata *ctrl = NULL; Loading @@ -810,10 +858,7 @@ static int mdss_dsi_panel_off(struct mdss_panel_data *pdata) if (ctrl->off_cmds.cmd_cnt) mdss_dsi_panel_cmds_send(ctrl, &ctrl->off_cmds, CMD_REQ_COMMIT); if (ctrl->ds_registered && pinfo->is_pluggable) { mdss_dba_utils_video_off(pinfo->dba_data); mdss_dba_utils_hdcp_enable(pinfo->dba_data, false); } mdss_dsi_panel_off_hdmi(ctrl, pinfo); end: pr_debug("%s:-\n", __func__); Loading Loading @@ -2360,14 +2405,46 @@ exit: return rc; } #ifdef TARGET_HW_MDSS_HDMI static int mdss_panel_parse_dt_hdmi(struct device_node *np, struct mdss_dsi_ctrl_pdata *ctrl_pdata) { int len = 0; const char *bridge_chip_name; struct mdss_panel_info *pinfo = &(ctrl_pdata->panel_data.panel_info); pinfo->is_dba_panel = of_property_read_bool(np, "qcom,dba-panel"); if (pinfo->is_dba_panel) { bridge_chip_name = of_get_property(np, "qcom,bridge-name", &len); if (!bridge_chip_name || len <= 0) { pr_err("%s:%d Unable to read qcom,bridge_name, data=%pK,len=%d\n", __func__, __LINE__, bridge_chip_name, len); return -EINVAL; } strlcpy(ctrl_pdata->bridge_name, bridge_chip_name, MSM_DBA_CHIP_NAME_MAX_LEN); } return 0; } #else static int mdss_panel_parse_dt_hdmi(struct device_node *np, struct mdss_dsi_ctrl_pdata *ctrl_pdata) { (void)(*np); (void)(*ctrl_pdata); return 0; } #endif static int mdss_panel_parse_dt(struct device_node *np, struct mdss_dsi_ctrl_pdata *ctrl_pdata) { u32 tmp; int rc, len = 0; int rc = 0; const char *data; static const char *pdest; const char *bridge_chip_name; struct mdss_panel_info *pinfo = &(ctrl_pdata->panel_data.panel_info); if (mdss_dsi_is_hw_config_split(ctrl_pdata->shared_data)) Loading Loading @@ -2575,21 +2652,9 @@ static int mdss_panel_parse_dt(struct device_node *np, mdss_dsi_parse_dfps_config(np, ctrl_pdata); pinfo->is_dba_panel = of_property_read_bool(np, "qcom,dba-panel"); if (pinfo->is_dba_panel) { bridge_chip_name = of_get_property(np, "qcom,bridge-name", &len); if (!bridge_chip_name || len <= 0) { pr_err("%s:%d Unable to read qcom,bridge_name, data=%pK,len=%d\n", __func__, __LINE__, bridge_chip_name, len); rc = -EINVAL; rc = mdss_panel_parse_dt_hdmi(np, ctrl_pdata); if (rc) goto error; } strlcpy(ctrl_pdata->bridge_name, bridge_chip_name, MSM_DBA_CHIP_NAME_MAX_LEN); } return 0; Loading Loading
drivers/video/msm/mdss/Makefile +4 −0 Original line number Diff line number Diff line Loading @@ -42,6 +42,8 @@ mdss-dsi-objs += mdss_dsi_phy.o mdss-dsi-objs += mdss_dsi_clk.o obj-$(CONFIG_FB_MSM_MDSS) += mdss-dsi.o obj-$(CONFIG_FB_MSM_MDSS) += mdss_panel.o ifneq ($(CONFIG_FB_MSM_MDSS_MDP3), y) obj-$(CONFIG_FB_MSM_MDSS) += mdss_hdmi_util.o obj-$(CONFIG_FB_MSM_MDSS) += mdss_hdmi_edid.o obj-$(CONFIG_FB_MSM_MDSS) += mdss_cec_core.o Loading @@ -56,6 +58,8 @@ obj-$(CONFIG_FB_MSM_MDSS_HDMI_PANEL) += mdss_hdmi_hdcp2p2.o obj-$(CONFIG_FB_MSM_MDSS_HDMI_PANEL) += mdss_hdmi_cec.o obj-$(CONFIG_FB_MSM_MDSS_HDMI_PANEL) += mdss_hdmi_audio.o obj-$(CONFIG_FB_MSM_MDSS_HDMI_MHL_SII8334) += mhl_sii8334.o mhl_msc.o ccflags-y += -DTARGET_HW_MDSS_HDMI endif obj-$(CONFIG_FB_MSM_MDSS_WRITEBACK) += mdss_wb.o Loading
drivers/video/msm/mdss/mdss_dsi.c +30 −11 Original line number Diff line number Diff line /* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. /* Copyright (c) 2012-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and Loading Loading @@ -2312,6 +2312,7 @@ static int mdss_dsi_set_stream_size(struct mdss_panel_data *pdata) return 0; } #ifdef TARGET_HW_MDSS_HDMI static void mdss_dsi_dba_work(struct work_struct *work) { struct mdss_dsi_ctrl_pdata *ctrl_pdata = NULL; Loading Loading @@ -2357,7 +2358,12 @@ static void mdss_dsi_dba_work(struct work_struct *work) &ctrl_pdata->dba_work, HZ); } } #else static void mdss_dsi_dba_work(struct work_struct *work) { (void)(*work); } #endif static int mdss_dsi_reset_write_ptr(struct mdss_panel_data *pdata) { Loading Loading @@ -3250,6 +3256,27 @@ static int mdss_dsi_parse_dt_params(struct platform_device *pdev, return 0; } #ifdef TARGET_HW_MDSS_HDMI static void mdss_dsi_res_deinit_hdmi(struct platform_device *pdev, int val) { struct mdss_dsi_data *dsi_res = platform_get_drvdata(pdev); if (dsi_res->ctrl_pdata[val]->ds_registered) { struct mdss_panel_info *pinfo = &dsi_res->ctrl_pdata[val]-> panel_data.panel_info; if (pinfo) mdss_dba_utils_deinit(pinfo->dba_data); } } #else static void mdss_dsi_res_deinit_hdmi(struct platform_device *pdev, int val) { (void)(*pdev); (void)(val); } #endif static void mdss_dsi_res_deinit(struct platform_device *pdev) { int i; Loading @@ -3263,15 +3290,7 @@ static void mdss_dsi_res_deinit(struct platform_device *pdev) for (i = 0; i < DSI_CTRL_MAX; i++) { if (dsi_res->ctrl_pdata[i]) { if (dsi_res->ctrl_pdata[i]->ds_registered) { struct mdss_panel_info *pinfo = &dsi_res->ctrl_pdata[i]-> panel_data.panel_info; if (pinfo) mdss_dba_utils_deinit(pinfo->dba_data); } mdss_dsi_res_deinit_hdmi(pdev, i); devm_kfree(&pdev->dev, dsi_res->ctrl_pdata[i]); } } Loading
drivers/video/msm/mdss/mdss_dsi_panel.c +97 −32 Original line number Diff line number Diff line /* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. /* Copyright (c) 2012-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and Loading @@ -24,8 +24,9 @@ #include <linux/string.h> #include "mdss_dsi.h" #ifdef TARGET_HW_MDSS_HDMI #include "mdss_dba_utils.h" #endif #define DT_CMD_HDR 6 #define MIN_REFRESH_RATE 48 #define DEFAULT_MDP_TRANSFER_TIME 14000 Loading Loading @@ -702,6 +703,22 @@ static void mdss_dsi_panel_bl_ctrl(struct mdss_panel_data *pdata, } } #ifdef TARGET_HW_MDSS_HDMI static void mdss_dsi_panel_on_hdmi(struct mdss_dsi_ctrl_pdata *ctrl, struct mdss_panel_info *pinfo) { if (ctrl->ds_registered) mdss_dba_utils_video_on(pinfo->dba_data, pinfo); } #else static void mdss_dsi_panel_on_hdmi(struct mdss_dsi_ctrl_pdata *ctrl, struct mdss_panel_info *pinfo) { (void)(*ctrl); (void)(*pinfo); } #endif static int mdss_dsi_panel_on(struct mdss_panel_data *pdata) { struct mdss_dsi_ctrl_pdata *ctrl = NULL; Loading Loading @@ -740,19 +757,37 @@ static int mdss_dsi_panel_on(struct mdss_panel_data *pdata) if (pinfo->compression_mode == COMPRESSION_DSC) mdss_dsi_panel_dsc_pps_send(ctrl, pinfo); if (ctrl->ds_registered) mdss_dba_utils_video_on(pinfo->dba_data, pinfo); mdss_dsi_panel_on_hdmi(ctrl, pinfo); end: pr_debug("%s:-\n", __func__); return ret; } #ifdef TARGET_HW_MDSS_HDMI static void mdss_dsi_post_panel_on_hdmi(struct mdss_panel_info *pinfo) { u32 vsync_period = 0; if (pinfo->is_dba_panel && pinfo->is_pluggable) { /* ensure at least 1 frame transfers to down stream device */ vsync_period = (MSEC_PER_SEC / pinfo->mipi.frame_rate) + 1; msleep(vsync_period); mdss_dba_utils_hdcp_enable(pinfo->dba_data, true); } } #else static void mdss_dsi_post_panel_on_hdmi(struct mdss_panel_info *pinfo) { (void)(*pinfo); } #endif static int mdss_dsi_post_panel_on(struct mdss_panel_data *pdata) { struct mdss_dsi_ctrl_pdata *ctrl = NULL; struct mdss_panel_info *pinfo; struct dsi_panel_cmds *cmds; u32 vsync_period = 0; if (pdata == NULL) { pr_err("%s: Invalid input data\n", __func__); Loading @@ -774,18 +809,31 @@ static int mdss_dsi_post_panel_on(struct mdss_panel_data *pdata) mdss_dsi_panel_cmds_send(ctrl, cmds, CMD_REQ_COMMIT); } if (pinfo->is_dba_panel && pinfo->is_pluggable) { /* ensure at least 1 frame transfers to down stream device */ vsync_period = (MSEC_PER_SEC / pinfo->mipi.frame_rate) + 1; msleep(vsync_period); mdss_dba_utils_hdcp_enable(pinfo->dba_data, true); } mdss_dsi_post_panel_on_hdmi(pinfo); end: pr_debug("%s:-\n", __func__); return 0; } #ifdef TARGET_HW_MDSS_HDMI static void mdss_dsi_panel_off_hdmi(struct mdss_dsi_ctrl_pdata *ctrl, struct mdss_panel_info *pinfo) { if (ctrl->ds_registered && pinfo->is_pluggable) { mdss_dba_utils_video_off(pinfo->dba_data); mdss_dba_utils_hdcp_enable(pinfo->dba_data, false); } } #else static void mdss_dsi_panel_off_hdmi(struct mdss_dsi_ctrl_pdata *ctrl, struct mdss_panel_info *pinfo) { (void)(*ctrl); (void)(*pinfo); } #endif static int mdss_dsi_panel_off(struct mdss_panel_data *pdata) { struct mdss_dsi_ctrl_pdata *ctrl = NULL; Loading @@ -810,10 +858,7 @@ static int mdss_dsi_panel_off(struct mdss_panel_data *pdata) if (ctrl->off_cmds.cmd_cnt) mdss_dsi_panel_cmds_send(ctrl, &ctrl->off_cmds, CMD_REQ_COMMIT); if (ctrl->ds_registered && pinfo->is_pluggable) { mdss_dba_utils_video_off(pinfo->dba_data); mdss_dba_utils_hdcp_enable(pinfo->dba_data, false); } mdss_dsi_panel_off_hdmi(ctrl, pinfo); end: pr_debug("%s:-\n", __func__); Loading Loading @@ -2360,14 +2405,46 @@ exit: return rc; } #ifdef TARGET_HW_MDSS_HDMI static int mdss_panel_parse_dt_hdmi(struct device_node *np, struct mdss_dsi_ctrl_pdata *ctrl_pdata) { int len = 0; const char *bridge_chip_name; struct mdss_panel_info *pinfo = &(ctrl_pdata->panel_data.panel_info); pinfo->is_dba_panel = of_property_read_bool(np, "qcom,dba-panel"); if (pinfo->is_dba_panel) { bridge_chip_name = of_get_property(np, "qcom,bridge-name", &len); if (!bridge_chip_name || len <= 0) { pr_err("%s:%d Unable to read qcom,bridge_name, data=%pK,len=%d\n", __func__, __LINE__, bridge_chip_name, len); return -EINVAL; } strlcpy(ctrl_pdata->bridge_name, bridge_chip_name, MSM_DBA_CHIP_NAME_MAX_LEN); } return 0; } #else static int mdss_panel_parse_dt_hdmi(struct device_node *np, struct mdss_dsi_ctrl_pdata *ctrl_pdata) { (void)(*np); (void)(*ctrl_pdata); return 0; } #endif static int mdss_panel_parse_dt(struct device_node *np, struct mdss_dsi_ctrl_pdata *ctrl_pdata) { u32 tmp; int rc, len = 0; int rc = 0; const char *data; static const char *pdest; const char *bridge_chip_name; struct mdss_panel_info *pinfo = &(ctrl_pdata->panel_data.panel_info); if (mdss_dsi_is_hw_config_split(ctrl_pdata->shared_data)) Loading Loading @@ -2575,21 +2652,9 @@ static int mdss_panel_parse_dt(struct device_node *np, mdss_dsi_parse_dfps_config(np, ctrl_pdata); pinfo->is_dba_panel = of_property_read_bool(np, "qcom,dba-panel"); if (pinfo->is_dba_panel) { bridge_chip_name = of_get_property(np, "qcom,bridge-name", &len); if (!bridge_chip_name || len <= 0) { pr_err("%s:%d Unable to read qcom,bridge_name, data=%pK,len=%d\n", __func__, __LINE__, bridge_chip_name, len); rc = -EINVAL; rc = mdss_panel_parse_dt_hdmi(np, ctrl_pdata); if (rc) goto error; } strlcpy(ctrl_pdata->bridge_name, bridge_chip_name, MSM_DBA_CHIP_NAME_MAX_LEN); } return 0; Loading