diff options
Diffstat (limited to 'drivers/gpu/drm/bridge/adv7511/adv7511_cec.c')
| -rw-r--r-- | drivers/gpu/drm/bridge/adv7511/adv7511_cec.c | 32 | 
1 files changed, 22 insertions, 10 deletions
| diff --git a/drivers/gpu/drm/bridge/adv7511/adv7511_cec.c b/drivers/gpu/drm/bridge/adv7511/adv7511_cec.c index b33d730e4d73..a20a45c0b353 100644 --- a/drivers/gpu/drm/bridge/adv7511/adv7511_cec.c +++ b/drivers/gpu/drm/bridge/adv7511/adv7511_cec.c @@ -300,18 +300,21 @@ static int adv7511_cec_parse_dt(struct device *dev, struct adv7511 *adv7511)  	return 0;  } -int adv7511_cec_init(struct device *dev, struct adv7511 *adv7511, -		     unsigned int offset) +int adv7511_cec_init(struct device *dev, struct adv7511 *adv7511)  { +	unsigned int offset = adv7511->type == ADV7533 ? +						ADV7533_REG_CEC_OFFSET : 0;  	int ret = adv7511_cec_parse_dt(dev, adv7511);  	if (ret) -		return ret; +		goto err_cec_parse_dt;  	adv7511->cec_adap = cec_allocate_adapter(&adv7511_cec_adap_ops,  		adv7511, dev_name(dev), CEC_CAP_DEFAULTS, ADV7511_MAX_ADDRS); -	if (IS_ERR(adv7511->cec_adap)) -		return PTR_ERR(adv7511->cec_adap); +	if (IS_ERR(adv7511->cec_adap)) { +		ret = PTR_ERR(adv7511->cec_adap); +		goto err_cec_alloc; +	}  	regmap_write(adv7511->regmap, ADV7511_REG_CEC_CTRL + offset, 0);  	/* cec soft reset */ @@ -329,9 +332,18 @@ int adv7511_cec_init(struct device *dev, struct adv7511 *adv7511,  		     ((adv7511->cec_clk_freq / 750000) - 1) << 2);  	ret = cec_register_adapter(adv7511->cec_adap, dev); -	if (ret) { -		cec_delete_adapter(adv7511->cec_adap); -		adv7511->cec_adap = NULL; -	} -	return ret; +	if (ret) +		goto err_cec_register; +	return 0; + +err_cec_register: +	cec_delete_adapter(adv7511->cec_adap); +	adv7511->cec_adap = NULL; +err_cec_alloc: +	dev_info(dev, "Initializing CEC failed with error %d, disabling CEC\n", +		 ret); +err_cec_parse_dt: +	regmap_write(adv7511->regmap, ADV7511_REG_CEC_CTRL + offset, +		     ADV7511_CEC_CTRL_POWER_DOWN); +	return ret == -EPROBE_DEFER ? ret : 0;  } |