|
@@ -402,6 +402,13 @@ static bool adv7511_hpd(struct adv7511 *adv7511)
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
+static void adv7511_hpd_work(struct work_struct *work)
|
|
|
+{
|
|
|
+ struct adv7511 *adv7511 = container_of(work, struct adv7511, hpd_work);
|
|
|
+
|
|
|
+ drm_helper_hpd_irq_event(adv7511->connector.dev);
|
|
|
+}
|
|
|
+
|
|
|
static int adv7511_irq_process(struct adv7511 *adv7511, bool process_hpd)
|
|
|
{
|
|
|
unsigned int irq0, irq1;
|
|
@@ -419,7 +426,7 @@ static int adv7511_irq_process(struct adv7511 *adv7511, bool process_hpd)
|
|
|
regmap_write(adv7511->regmap, ADV7511_REG_INT(1), irq1);
|
|
|
|
|
|
if (process_hpd && irq0 & ADV7511_INT0_HPD && adv7511->bridge.encoder)
|
|
|
- drm_helper_hpd_irq_event(adv7511->connector.dev);
|
|
|
+ schedule_work(&adv7511->hpd_work);
|
|
|
|
|
|
if (irq0 & ADV7511_INT0_EDID_READY || irq1 & ADV7511_INT1_DDC_ERROR) {
|
|
|
adv7511->edid_read = true;
|
|
@@ -1070,6 +1077,8 @@ static int adv7511_probe(struct i2c_client *i2c, const struct i2c_device_id *id)
|
|
|
goto err_i2c_unregister_edid;
|
|
|
}
|
|
|
|
|
|
+ INIT_WORK(&adv7511->hpd_work, adv7511_hpd_work);
|
|
|
+
|
|
|
if (i2c->irq) {
|
|
|
init_waitqueue_head(&adv7511->wq);
|
|
|
|