diff options
Diffstat (limited to 'drivers/pwm/pwm-mtk-disp.c')
| -rw-r--r-- | drivers/pwm/pwm-mtk-disp.c | 40 | 
1 files changed, 25 insertions, 15 deletions
diff --git a/drivers/pwm/pwm-mtk-disp.c b/drivers/pwm/pwm-mtk-disp.c index 692a06121b28..79e321e96f56 100644 --- a/drivers/pwm/pwm-mtk-disp.c +++ b/drivers/pwm/pwm-mtk-disp.c @@ -138,6 +138,19 @@ static int mtk_disp_pwm_apply(struct pwm_chip *chip, struct pwm_device *pwm,  	high_width = mul_u64_u64_div_u64(state->duty_cycle, rate, div);  	value = period | (high_width << PWM_HIGH_WIDTH_SHIFT); +	if (mdp->data->bls_debug && !mdp->data->has_commit) { +		/* +		 * For MT2701, disable double buffer before writing register +		 * and select manual mode and use PWM_PERIOD/PWM_HIGH_WIDTH. +		 */ +		mtk_disp_pwm_update_bits(mdp, mdp->data->bls_debug, +					 mdp->data->bls_debug_mask, +					 mdp->data->bls_debug_mask); +		mtk_disp_pwm_update_bits(mdp, mdp->data->con0, +					 mdp->data->con0_sel, +					 mdp->data->con0_sel); +	} +  	mtk_disp_pwm_update_bits(mdp, mdp->data->con0,  				 PWM_CLKDIV_MASK,  				 clk_div << PWM_CLKDIV_SHIFT); @@ -152,17 +165,6 @@ static int mtk_disp_pwm_apply(struct pwm_chip *chip, struct pwm_device *pwm,  		mtk_disp_pwm_update_bits(mdp, mdp->data->commit,  					 mdp->data->commit_mask,  					 0x0); -	} else { -		/* -		 * For MT2701, disable double buffer before writing register -		 * and select manual mode and use PWM_PERIOD/PWM_HIGH_WIDTH. -		 */ -		mtk_disp_pwm_update_bits(mdp, mdp->data->bls_debug, -					 mdp->data->bls_debug_mask, -					 mdp->data->bls_debug_mask); -		mtk_disp_pwm_update_bits(mdp, mdp->data->con0, -					 mdp->data->con0_sel, -					 mdp->data->con0_sel);  	}  	mtk_disp_pwm_update_bits(mdp, DISP_PWM_EN, mdp->data->enable_mask, @@ -194,6 +196,16 @@ static int mtk_disp_pwm_get_state(struct pwm_chip *chip,  		return err;  	} +	/* +	 * Apply DISP_PWM_DEBUG settings to choose whether to enable or disable +	 * registers double buffer and manual commit to working register before +	 * performing any read/write operation +	 */ +	if (mdp->data->bls_debug) +		mtk_disp_pwm_update_bits(mdp, mdp->data->bls_debug, +					 mdp->data->bls_debug_mask, +					 mdp->data->bls_debug_mask); +  	rate = clk_get_rate(mdp->clk_main);  	con0 = readl(mdp->base + mdp->data->con0);  	con1 = readl(mdp->base + mdp->data->con1); @@ -260,13 +272,11 @@ static int mtk_disp_pwm_probe(struct platform_device *pdev)  	return 0;  } -static int mtk_disp_pwm_remove(struct platform_device *pdev) +static void mtk_disp_pwm_remove(struct platform_device *pdev)  {  	struct mtk_disp_pwm *mdp = platform_get_drvdata(pdev);  	pwmchip_remove(&mdp->chip); - -	return 0;  }  static const struct mtk_pwm_data mt2701_pwm_data = { @@ -314,7 +324,7 @@ static struct platform_driver mtk_disp_pwm_driver = {  		.of_match_table = mtk_disp_pwm_of_match,  	},  	.probe = mtk_disp_pwm_probe, -	.remove = mtk_disp_pwm_remove, +	.remove_new = mtk_disp_pwm_remove,  };  module_platform_driver(mtk_disp_pwm_driver);  |