diff options
Diffstat (limited to 'drivers/gpu/drm/msm/dsi/dsi_host.c')
| -rw-r--r-- | drivers/gpu/drm/msm/dsi/dsi_host.c | 147 | 
1 files changed, 61 insertions, 86 deletions
| diff --git a/drivers/gpu/drm/msm/dsi/dsi_host.c b/drivers/gpu/drm/msm/dsi/dsi_host.c index e269df285136..f69a125f9559 100644 --- a/drivers/gpu/drm/msm/dsi/dsi_host.c +++ b/drivers/gpu/drm/msm/dsi/dsi_host.c @@ -106,7 +106,8 @@ struct msm_dsi_host {  	phys_addr_t ctrl_size;  	struct regulator_bulk_data supplies[DSI_DEV_REGULATOR_MAX]; -	struct clk *bus_clks[DSI_BUS_CLK_MAX]; +	int num_bus_clks; +	struct clk_bulk_data bus_clks[DSI_BUS_CLK_MAX];  	struct clk *byte_clk;  	struct clk *esc_clk; @@ -115,16 +116,16 @@ struct msm_dsi_host {  	struct clk *pixel_clk_src;  	struct clk *byte_intf_clk; -	u32 byte_clk_rate; -	u32 pixel_clk_rate; -	u32 esc_clk_rate; +	unsigned long byte_clk_rate; +	unsigned long pixel_clk_rate; +	unsigned long esc_clk_rate;  	/* DSI v2 specific clocks */  	struct clk *src_clk;  	struct clk *esc_clk_src;  	struct clk *dsi_clk_src; -	u32 src_clk_rate; +	unsigned long src_clk_rate;  	struct gpio_desc *disp_en_gpio;  	struct gpio_desc *te_gpio; @@ -374,15 +375,14 @@ static int dsi_clk_init(struct msm_dsi_host *msm_host)  	int i, ret = 0;  	/* get bus clocks */ -	for (i = 0; i < cfg->num_bus_clks; i++) { -		msm_host->bus_clks[i] = msm_clk_get(pdev, -						cfg->bus_clk_names[i]); -		if (IS_ERR(msm_host->bus_clks[i])) { -			ret = PTR_ERR(msm_host->bus_clks[i]); -			pr_err("%s: Unable to get %s clock, ret = %d\n", -				__func__, cfg->bus_clk_names[i], ret); -			goto exit; -		} +	for (i = 0; i < cfg->num_bus_clks; i++) +		msm_host->bus_clks[i].id = cfg->bus_clk_names[i]; +	msm_host->num_bus_clks = cfg->num_bus_clks; + +	ret = devm_clk_bulk_get(&pdev->dev, msm_host->num_bus_clks, msm_host->bus_clks); +	if (ret < 0) { +		dev_err(&pdev->dev, "Unable to get clocks, ret = %d\n", ret); +		goto exit;  	}  	/* get link and source clocks */ @@ -433,41 +433,6 @@ exit:  	return ret;  } -static int dsi_bus_clk_enable(struct msm_dsi_host *msm_host) -{ -	const struct msm_dsi_config *cfg = msm_host->cfg_hnd->cfg; -	int i, ret; - -	DBG("id=%d", msm_host->id); - -	for (i = 0; i < cfg->num_bus_clks; i++) { -		ret = clk_prepare_enable(msm_host->bus_clks[i]); -		if (ret) { -			pr_err("%s: failed to enable bus clock %d ret %d\n", -				__func__, i, ret); -			goto err; -		} -	} - -	return 0; -err: -	for (; i > 0; i--) -		clk_disable_unprepare(msm_host->bus_clks[i]); - -	return ret; -} - -static void dsi_bus_clk_disable(struct msm_dsi_host *msm_host) -{ -	const struct msm_dsi_config *cfg = msm_host->cfg_hnd->cfg; -	int i; - -	DBG(""); - -	for (i = cfg->num_bus_clks - 1; i >= 0; i--) -		clk_disable_unprepare(msm_host->bus_clks[i]); -} -  int msm_dsi_runtime_suspend(struct device *dev)  {  	struct platform_device *pdev = to_platform_device(dev); @@ -478,7 +443,7 @@ int msm_dsi_runtime_suspend(struct device *dev)  	if (!msm_host->cfg_hnd)  		return 0; -	dsi_bus_clk_disable(msm_host); +	clk_bulk_disable_unprepare(msm_host->num_bus_clks, msm_host->bus_clks);  	return 0;  } @@ -493,15 +458,15 @@ int msm_dsi_runtime_resume(struct device *dev)  	if (!msm_host->cfg_hnd)  		return 0; -	return dsi_bus_clk_enable(msm_host); +	return clk_bulk_prepare_enable(msm_host->num_bus_clks, msm_host->bus_clks);  }  int dsi_link_clk_set_rate_6g(struct msm_dsi_host *msm_host)  { -	u32 byte_intf_rate; +	unsigned long byte_intf_rate;  	int ret; -	DBG("Set clk rates: pclk=%d, byteclk=%d", +	DBG("Set clk rates: pclk=%d, byteclk=%lu",  		msm_host->mode->clock, msm_host->byte_clk_rate);  	ret = dev_pm_opp_set_rate(&msm_host->pdev->dev, @@ -558,13 +523,11 @@ int dsi_link_clk_enable_6g(struct msm_dsi_host *msm_host)  		goto pixel_clk_err;  	} -	if (msm_host->byte_intf_clk) { -		ret = clk_prepare_enable(msm_host->byte_intf_clk); -		if (ret) { -			pr_err("%s: Failed to enable byte intf clk\n", -			       __func__); -			goto byte_intf_clk_err; -		} +	ret = clk_prepare_enable(msm_host->byte_intf_clk); +	if (ret) { +		pr_err("%s: Failed to enable byte intf clk\n", +			   __func__); +		goto byte_intf_clk_err;  	}  	return 0; @@ -583,7 +546,7 @@ int dsi_link_clk_set_rate_v2(struct msm_dsi_host *msm_host)  {  	int ret; -	DBG("Set clk rates: pclk=%d, byteclk=%d, esc_clk=%d, dsi_src_clk=%d", +	DBG("Set clk rates: pclk=%d, byteclk=%lu, esc_clk=%lu, dsi_src_clk=%lu",  		msm_host->mode->clock, msm_host->byte_clk_rate,  		msm_host->esc_clk_rate, msm_host->src_clk_rate); @@ -660,8 +623,7 @@ void dsi_link_clk_disable_6g(struct msm_dsi_host *msm_host)  	dev_pm_opp_set_rate(&msm_host->pdev->dev, 0);  	clk_disable_unprepare(msm_host->esc_clk);  	clk_disable_unprepare(msm_host->pixel_clk); -	if (msm_host->byte_intf_clk) -		clk_disable_unprepare(msm_host->byte_intf_clk); +	clk_disable_unprepare(msm_host->byte_intf_clk);  	clk_disable_unprepare(msm_host->byte_clk);  } @@ -673,10 +635,10 @@ void dsi_link_clk_disable_v2(struct msm_dsi_host *msm_host)  	clk_disable_unprepare(msm_host->byte_clk);  } -static u32 dsi_get_pclk_rate(struct msm_dsi_host *msm_host, bool is_bonded_dsi) +static unsigned long dsi_get_pclk_rate(struct msm_dsi_host *msm_host, bool is_bonded_dsi)  {  	struct drm_display_mode *mode = msm_host->mode; -	u32 pclk_rate; +	unsigned long pclk_rate;  	pclk_rate = mode->clock * 1000; @@ -696,7 +658,7 @@ static void dsi_calc_pclk(struct msm_dsi_host *msm_host, bool is_bonded_dsi)  {  	u8 lanes = msm_host->lanes;  	u32 bpp = dsi_get_bpp(msm_host->format); -	u32 pclk_rate = dsi_get_pclk_rate(msm_host, is_bonded_dsi); +	unsigned long pclk_rate = dsi_get_pclk_rate(msm_host, is_bonded_dsi);  	u64 pclk_bpp = (u64)pclk_rate * bpp;  	if (lanes == 0) { @@ -713,7 +675,7 @@ static void dsi_calc_pclk(struct msm_dsi_host *msm_host, bool is_bonded_dsi)  	msm_host->pixel_clk_rate = pclk_rate;  	msm_host->byte_clk_rate = pclk_bpp; -	DBG("pclk=%d, bclk=%d", msm_host->pixel_clk_rate, +	DBG("pclk=%lu, bclk=%lu", msm_host->pixel_clk_rate,  				msm_host->byte_clk_rate);  } @@ -772,7 +734,7 @@ int dsi_calc_clk_rate_v2(struct msm_dsi_host *msm_host, bool is_bonded_dsi)  	msm_host->esc_clk_rate = msm_host->byte_clk_rate / esc_div; -	DBG("esc=%d, src=%d", msm_host->esc_clk_rate, +	DBG("esc=%lu, src=%lu", msm_host->esc_clk_rate,  		msm_host->src_clk_rate);  	return 0; @@ -1898,6 +1860,23 @@ int msm_dsi_host_init(struct msm_dsi *msm_dsi)  		return ret;  	} +	msm_host->irq = irq_of_parse_and_map(pdev->dev.of_node, 0); +	if (msm_host->irq < 0) { +		ret = msm_host->irq; +		dev_err(&pdev->dev, "failed to get irq: %d\n", ret); +		return ret; +	} + +	/* do not autoenable, will be enabled later */ +	ret = devm_request_irq(&pdev->dev, msm_host->irq, dsi_host_irq, +			IRQF_TRIGGER_HIGH | IRQF_ONESHOT | IRQF_NO_AUTOEN, +			"dsi_isr", msm_host); +	if (ret < 0) { +		dev_err(&pdev->dev, "failed to request IRQ%u: %d\n", +				msm_host->irq, ret); +		return ret; +	} +  	init_completion(&msm_host->dma_comp);  	init_completion(&msm_host->video_comp);  	mutex_init(&msm_host->dev_mutex); @@ -1925,7 +1904,6 @@ void msm_dsi_host_destroy(struct mipi_dsi_host *host)  	DBG("");  	dsi_tx_buf_free(msm_host);  	if (msm_host->workqueue) { -		flush_workqueue(msm_host->workqueue);  		destroy_workqueue(msm_host->workqueue);  		msm_host->workqueue = NULL;  	} @@ -1941,25 +1919,8 @@ int msm_dsi_host_modeset_init(struct mipi_dsi_host *host,  {  	struct msm_dsi_host *msm_host = to_msm_dsi_host(host);  	const struct msm_dsi_cfg_handler *cfg_hnd = msm_host->cfg_hnd; -	struct platform_device *pdev = msm_host->pdev;  	int ret; -	msm_host->irq = irq_of_parse_and_map(pdev->dev.of_node, 0); -	if (msm_host->irq < 0) { -		ret = msm_host->irq; -		DRM_DEV_ERROR(dev->dev, "failed to get irq: %d\n", ret); -		return ret; -	} - -	ret = devm_request_irq(&pdev->dev, msm_host->irq, -			dsi_host_irq, IRQF_TRIGGER_HIGH | IRQF_ONESHOT, -			"dsi_isr", msm_host); -	if (ret < 0) { -		DRM_DEV_ERROR(&pdev->dev, "failed to request IRQ%u: %d\n", -				msm_host->irq, ret); -		return ret; -	} -  	msm_host->dev = dev;  	ret = cfg_hnd->ops->tx_buf_alloc(msm_host, SZ_4K);  	if (ret) { @@ -2315,6 +2276,20 @@ void msm_dsi_host_get_phy_clk_req(struct mipi_dsi_host *host,  	clk_req->escclk_rate = msm_host->esc_clk_rate;  } +void msm_dsi_host_enable_irq(struct mipi_dsi_host *host) +{ +	struct msm_dsi_host *msm_host = to_msm_dsi_host(host); + +	enable_irq(msm_host->irq); +} + +void msm_dsi_host_disable_irq(struct mipi_dsi_host *host) +{ +	struct msm_dsi_host *msm_host = to_msm_dsi_host(host); + +	disable_irq(msm_host->irq); +} +  int msm_dsi_host_enable(struct mipi_dsi_host *host)  {  	struct msm_dsi_host *msm_host = to_msm_dsi_host(host); | 
