diff options
Diffstat (limited to 'drivers/gpu/drm/msm/dsi')
| -rw-r--r-- | drivers/gpu/drm/msm/dsi/dsi.h | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/msm/dsi/dsi_cfg.c | 28 | ||||
| -rw-r--r-- | drivers/gpu/drm/msm/dsi/dsi_cfg.h | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/msm/dsi/dsi_host.c | 3 | ||||
| -rw-r--r-- | drivers/gpu/drm/msm/dsi/phy/dsi_phy.c | 8 | ||||
| -rw-r--r-- | drivers/gpu/drm/msm/dsi/phy/dsi_phy.h | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/msm/dsi/phy/dsi_phy_28nm.c | 60 | 
7 files changed, 85 insertions, 17 deletions
diff --git a/drivers/gpu/drm/msm/dsi/dsi.h b/drivers/gpu/drm/msm/dsi/dsi.h index 0da8a4e428ad..eff1a4c61258 100644 --- a/drivers/gpu/drm/msm/dsi/dsi.h +++ b/drivers/gpu/drm/msm/dsi/dsi.h @@ -9,6 +9,7 @@  #include <linux/of_platform.h>  #include <linux/platform_device.h> +#include <drm/drm_bridge.h>  #include <drm/drm_crtc.h>  #include <drm/drm_mipi_dsi.h>  #include <drm/drm_panel.h> diff --git a/drivers/gpu/drm/msm/dsi/dsi_cfg.c b/drivers/gpu/drm/msm/dsi/dsi_cfg.c index b7b7c1a9164a..86ad3fdf207d 100644 --- a/drivers/gpu/drm/msm/dsi/dsi_cfg.c +++ b/drivers/gpu/drm/msm/dsi/dsi_cfg.c @@ -66,6 +66,26 @@ static const struct msm_dsi_config msm8916_dsi_cfg = {  	.num_dsi = 1,  }; +static const char * const dsi_8976_bus_clk_names[] = { +	"mdp_core", "iface", "bus", +}; + +static const struct msm_dsi_config msm8976_dsi_cfg = { +	.io_offset = DSI_6G_REG_SHIFT, +	.reg_cfg = { +		.num = 3, +		.regs = { +			{"gdsc", -1, -1}, +			{"vdda", 100000, 100},	/* 1.2 V */ +			{"vddio", 100000, 100},	/* 1.8 V */ +		}, +	}, +	.bus_clk_names = dsi_8976_bus_clk_names, +	.num_bus_clks = ARRAY_SIZE(dsi_8976_bus_clk_names), +	.io_start = { 0x1a94000, 0x1a96000 }, +	.num_dsi = 2, +}; +  static const struct msm_dsi_config msm8994_dsi_cfg = {  	.io_offset = DSI_6G_REG_SHIFT,  	.reg_cfg = { @@ -147,7 +167,7 @@ static const struct msm_dsi_config sdm845_dsi_cfg = {  	.num_dsi = 2,  }; -const static struct msm_dsi_host_cfg_ops msm_dsi_v2_host_ops = { +static const struct msm_dsi_host_cfg_ops msm_dsi_v2_host_ops = {  	.link_clk_enable = dsi_link_clk_enable_v2,  	.link_clk_disable = dsi_link_clk_disable_v2,  	.clk_init_ver = dsi_clk_init_v2, @@ -158,7 +178,7 @@ const static struct msm_dsi_host_cfg_ops msm_dsi_v2_host_ops = {  	.calc_clk_rate = dsi_calc_clk_rate_v2,  }; -const static struct msm_dsi_host_cfg_ops msm_dsi_6g_host_ops = { +static const struct msm_dsi_host_cfg_ops msm_dsi_6g_host_ops = {  	.link_clk_enable = dsi_link_clk_enable_6g,  	.link_clk_disable = dsi_link_clk_disable_6g,  	.clk_init_ver = NULL, @@ -169,7 +189,7 @@ const static struct msm_dsi_host_cfg_ops msm_dsi_6g_host_ops = {  	.calc_clk_rate = dsi_calc_clk_rate_6g,  }; -const static struct msm_dsi_host_cfg_ops msm_dsi_6g_v2_host_ops = { +static const struct msm_dsi_host_cfg_ops msm_dsi_6g_v2_host_ops = {  	.link_clk_enable = dsi_link_clk_enable_6g,  	.link_clk_disable = dsi_link_clk_disable_6g,  	.clk_init_ver = dsi_clk_init_6g_v2, @@ -197,6 +217,8 @@ static const struct msm_dsi_cfg_handler dsi_cfg_handlers[] = {  		&msm8916_dsi_cfg, &msm_dsi_6g_host_ops},  	{MSM_DSI_VER_MAJOR_6G, MSM_DSI_6G_VER_MINOR_V1_4_1,  		&msm8996_dsi_cfg, &msm_dsi_6g_host_ops}, +	{MSM_DSI_VER_MAJOR_6G, MSM_DSI_6G_VER_MINOR_V1_4_2, +		&msm8976_dsi_cfg, &msm_dsi_6g_host_ops},  	{MSM_DSI_VER_MAJOR_6G, MSM_DSI_6G_VER_MINOR_V2_2_0,  		&msm8998_dsi_cfg, &msm_dsi_6g_v2_host_ops},  	{MSM_DSI_VER_MAJOR_6G, MSM_DSI_6G_VER_MINOR_V2_2_1, diff --git a/drivers/gpu/drm/msm/dsi/dsi_cfg.h b/drivers/gpu/drm/msm/dsi/dsi_cfg.h index e2b7a7dfbe49..50a37ceb6a25 100644 --- a/drivers/gpu/drm/msm/dsi/dsi_cfg.h +++ b/drivers/gpu/drm/msm/dsi/dsi_cfg.h @@ -17,6 +17,7 @@  #define MSM_DSI_6G_VER_MINOR_V1_3	0x10030000  #define MSM_DSI_6G_VER_MINOR_V1_3_1	0x10030001  #define MSM_DSI_6G_VER_MINOR_V1_4_1	0x10040001 +#define MSM_DSI_6G_VER_MINOR_V1_4_2	0x10040002  #define MSM_DSI_6G_VER_MINOR_V2_2_0	0x20000000  #define MSM_DSI_6G_VER_MINOR_V2_2_1	0x20020001 diff --git a/drivers/gpu/drm/msm/dsi/dsi_host.c b/drivers/gpu/drm/msm/dsi/dsi_host.c index 1e7b1be25bb0..458cec82ae13 100644 --- a/drivers/gpu/drm/msm/dsi/dsi_host.c +++ b/drivers/gpu/drm/msm/dsi/dsi_host.c @@ -1293,14 +1293,13 @@ static int dsi_cmd_dma_tx(struct msm_dsi_host *msm_host, int len)  static int dsi_cmd_dma_rx(struct msm_dsi_host *msm_host,  			u8 *buf, int rx_byte, int pkt_size)  { -	u32 *lp, *temp, data; +	u32 *temp, data;  	int i, j = 0, cnt;  	u32 read_cnt;  	u8 reg[16];  	int repeated_bytes = 0;  	int buf_offset = buf - msm_host->rx_buf; -	lp = (u32 *)buf;  	temp = (u32 *)reg;  	cnt = (rx_byte + 3) >> 2;  	if (cnt > 4) diff --git a/drivers/gpu/drm/msm/dsi/phy/dsi_phy.c b/drivers/gpu/drm/msm/dsi/phy/dsi_phy.c index 3522863a4984..b0cfa67d2a57 100644 --- a/drivers/gpu/drm/msm/dsi/phy/dsi_phy.c +++ b/drivers/gpu/drm/msm/dsi/phy/dsi_phy.c @@ -145,7 +145,7 @@ int msm_dsi_dphy_timing_calc_v2(struct msm_dsi_dphy_timing *timing,  {  	const unsigned long bit_rate = clk_req->bitclk_rate;  	const unsigned long esc_rate = clk_req->escclk_rate; -	s32 ui, ui_x8, lpx; +	s32 ui, ui_x8;  	s32 tmax, tmin;  	s32 pcnt0 = 50;  	s32 pcnt1 = 50; @@ -175,7 +175,6 @@ int msm_dsi_dphy_timing_calc_v2(struct msm_dsi_dphy_timing *timing,  	ui = mult_frac(NSEC_PER_MSEC, coeff, bit_rate / 1000);  	ui_x8 = ui << 3; -	lpx = mult_frac(NSEC_PER_MSEC, coeff, esc_rate / 1000);  	temp = S_DIV_ROUND_UP(38 * coeff - val_ckln * ui, ui_x8);  	tmin = max_t(s32, temp, 0); @@ -262,7 +261,7 @@ int msm_dsi_dphy_timing_calc_v3(struct msm_dsi_dphy_timing *timing,  {  	const unsigned long bit_rate = clk_req->bitclk_rate;  	const unsigned long esc_rate = clk_req->escclk_rate; -	s32 ui, ui_x8, lpx; +	s32 ui, ui_x8;  	s32 tmax, tmin;  	s32 pcnt0 = 50;  	s32 pcnt1 = 50; @@ -284,7 +283,6 @@ int msm_dsi_dphy_timing_calc_v3(struct msm_dsi_dphy_timing *timing,  	ui = mult_frac(NSEC_PER_MSEC, coeff, bit_rate / 1000);  	ui_x8 = ui << 3; -	lpx = mult_frac(NSEC_PER_MSEC, coeff, esc_rate / 1000);  	temp = S_DIV_ROUND_UP(38 * coeff, ui_x8);  	tmin = max_t(s32, temp, 0); @@ -485,6 +483,8 @@ static const struct of_device_id dsi_phy_dt_match[] = {  #ifdef CONFIG_DRM_MSM_DSI_28NM_PHY  	{ .compatible = "qcom,dsi-phy-28nm-hpm",  	  .data = &dsi_phy_28nm_hpm_cfgs }, +	{ .compatible = "qcom,dsi-phy-28nm-hpm-fam-b", +	  .data = &dsi_phy_28nm_hpm_famb_cfgs },  	{ .compatible = "qcom,dsi-phy-28nm-lp",  	  .data = &dsi_phy_28nm_lp_cfgs },  #endif diff --git a/drivers/gpu/drm/msm/dsi/phy/dsi_phy.h b/drivers/gpu/drm/msm/dsi/phy/dsi_phy.h index c4069ce6afe6..24b294ed3059 100644 --- a/drivers/gpu/drm/msm/dsi/phy/dsi_phy.h +++ b/drivers/gpu/drm/msm/dsi/phy/dsi_phy.h @@ -40,6 +40,7 @@ struct msm_dsi_phy_cfg {  };  extern const struct msm_dsi_phy_cfg dsi_phy_28nm_hpm_cfgs; +extern const struct msm_dsi_phy_cfg dsi_phy_28nm_hpm_famb_cfgs;  extern const struct msm_dsi_phy_cfg dsi_phy_28nm_lp_cfgs;  extern const struct msm_dsi_phy_cfg dsi_phy_20nm_cfgs;  extern const struct msm_dsi_phy_cfg dsi_phy_28nm_8960_cfgs; diff --git a/drivers/gpu/drm/msm/dsi/phy/dsi_phy_28nm.c b/drivers/gpu/drm/msm/dsi/phy/dsi_phy_28nm.c index b3f678f6c2aa..c3c580cfd8b1 100644 --- a/drivers/gpu/drm/msm/dsi/phy/dsi_phy_28nm.c +++ b/drivers/gpu/drm/msm/dsi/phy/dsi_phy_28nm.c @@ -39,15 +39,10 @@ static void dsi_28nm_dphy_set_timing(struct msm_dsi_phy *phy,  		DSI_28nm_PHY_TIMING_CTRL_11_TRIG3_CMD(0));  } -static void dsi_28nm_phy_regulator_ctrl(struct msm_dsi_phy *phy, bool enable) +static void dsi_28nm_phy_regulator_enable_dcdc(struct msm_dsi_phy *phy)  {  	void __iomem *base = phy->reg_base; -	if (!enable) { -		dsi_phy_write(base + REG_DSI_28nm_PHY_REGULATOR_CAL_PWR_CFG, 0); -		return; -	} -  	dsi_phy_write(base + REG_DSI_28nm_PHY_REGULATOR_CTRL_0, 0x0);  	dsi_phy_write(base + REG_DSI_28nm_PHY_REGULATOR_CAL_PWR_CFG, 1);  	dsi_phy_write(base + REG_DSI_28nm_PHY_REGULATOR_CTRL_5, 0); @@ -56,6 +51,39 @@ static void dsi_28nm_phy_regulator_ctrl(struct msm_dsi_phy *phy, bool enable)  	dsi_phy_write(base + REG_DSI_28nm_PHY_REGULATOR_CTRL_1, 0x9);  	dsi_phy_write(base + REG_DSI_28nm_PHY_REGULATOR_CTRL_0, 0x7);  	dsi_phy_write(base + REG_DSI_28nm_PHY_REGULATOR_CTRL_4, 0x20); +	dsi_phy_write(phy->base + REG_DSI_28nm_PHY_LDO_CNTRL, 0x00); +} + +static void dsi_28nm_phy_regulator_enable_ldo(struct msm_dsi_phy *phy) +{ +	void __iomem *base = phy->reg_base; + +	dsi_phy_write(base + REG_DSI_28nm_PHY_REGULATOR_CTRL_0, 0x0); +	dsi_phy_write(base + REG_DSI_28nm_PHY_REGULATOR_CAL_PWR_CFG, 0); +	dsi_phy_write(base + REG_DSI_28nm_PHY_REGULATOR_CTRL_5, 0x7); +	dsi_phy_write(base + REG_DSI_28nm_PHY_REGULATOR_CTRL_3, 0); +	dsi_phy_write(base + REG_DSI_28nm_PHY_REGULATOR_CTRL_2, 0x1); +	dsi_phy_write(base + REG_DSI_28nm_PHY_REGULATOR_CTRL_1, 0x1); +	dsi_phy_write(base + REG_DSI_28nm_PHY_REGULATOR_CTRL_4, 0x20); + +	if (phy->cfg->type == MSM_DSI_PHY_28NM_LP) +		dsi_phy_write(phy->base + REG_DSI_28nm_PHY_LDO_CNTRL, 0x05); +	else +		dsi_phy_write(phy->base + REG_DSI_28nm_PHY_LDO_CNTRL, 0x0d); +} + +static void dsi_28nm_phy_regulator_ctrl(struct msm_dsi_phy *phy, bool enable) +{ +	if (!enable) { +		dsi_phy_write(phy->reg_base + +			      REG_DSI_28nm_PHY_REGULATOR_CAL_PWR_CFG, 0); +		return; +	} + +	if (phy->regulator_ldo_mode) +		dsi_28nm_phy_regulator_enable_ldo(phy); +	else +		dsi_28nm_phy_regulator_enable_dcdc(phy);  }  static int dsi_28nm_phy_enable(struct msm_dsi_phy *phy, int src_pll_id, @@ -77,8 +105,6 @@ static int dsi_28nm_phy_enable(struct msm_dsi_phy *phy, int src_pll_id,  	dsi_28nm_phy_regulator_ctrl(phy, true); -	dsi_phy_write(base + REG_DSI_28nm_PHY_LDO_CNTRL, 0x00); -  	dsi_28nm_dphy_set_timing(phy, timing);  	dsi_phy_write(base + REG_DSI_28nm_PHY_CTRL_1, 0x00); @@ -142,6 +168,24 @@ const struct msm_dsi_phy_cfg dsi_phy_28nm_hpm_cfgs = {  	.num_dsi_phy = 2,  }; +const struct msm_dsi_phy_cfg dsi_phy_28nm_hpm_famb_cfgs = { +	.type = MSM_DSI_PHY_28NM_HPM, +	.src_pll_truthtable = { {true, true}, {false, true} }, +	.reg_cfg = { +		.num = 1, +		.regs = { +			{"vddio", 100000, 100}, +		}, +	}, +	.ops = { +		.enable = dsi_28nm_phy_enable, +		.disable = dsi_28nm_phy_disable, +		.init = msm_dsi_phy_init_common, +	}, +	.io_start = { 0x1a94400, 0x1a96400 }, +	.num_dsi_phy = 2, +}; +  const struct msm_dsi_phy_cfg dsi_phy_28nm_lp_cfgs = {  	.type = MSM_DSI_PHY_28NM_LP,  	.src_pll_truthtable = { {true, true}, {true, true} },  |