|
@@ -300,18 +300,21 @@ static int adv7511_cec_parse_dt(struct device *dev, struct adv7511 *adv7511)
|
|
return 0;
|
|
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);
|
|
int ret = adv7511_cec_parse_dt(dev, adv7511);
|
|
|
|
|
|
if (ret)
|
|
if (ret)
|
|
- return ret;
|
|
|
|
|
|
+ goto err_cec_parse_dt;
|
|
|
|
|
|
adv7511->cec_adap = cec_allocate_adapter(&adv7511_cec_adap_ops,
|
|
adv7511->cec_adap = cec_allocate_adapter(&adv7511_cec_adap_ops,
|
|
adv7511, dev_name(dev), CEC_CAP_DEFAULTS, ADV7511_MAX_ADDRS);
|
|
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);
|
|
regmap_write(adv7511->regmap, ADV7511_REG_CEC_CTRL + offset, 0);
|
|
/* cec soft reset */
|
|
/* cec soft reset */
|
|
@@ -329,9 +332,18 @@ int adv7511_cec_init(struct device *dev, struct adv7511 *adv7511,
|
|
((adv7511->cec_clk_freq / 750000) - 1) << 2);
|
|
((adv7511->cec_clk_freq / 750000) - 1) << 2);
|
|
|
|
|
|
ret = cec_register_adapter(adv7511->cec_adap, dev);
|
|
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;
|
|
}
|
|
}
|