]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
drm/bridge: it6505: Disable IRQ when powered off
authorPin-yen Lin <treapking@chromium.org>
Fri, 19 Jul 2024 11:05:36 +0000 (19:05 +0800)
committerRobert Foss <rfoss@kernel.org>
Thu, 25 Jul 2024 10:13:22 +0000 (12:13 +0200)
When the bridge is powered off, disable the IRQ until the next power on
to workaround an interrupt storm on some badly-designed hardware.

Signed-off-by: Pin-yen Lin <treapking@chromium.org>
Reviewed-by: Robert Foss <rfoss@kernel.org>
Signed-off-by: Robert Foss <rfoss@kernel.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20240719110623.1850021-1-treapking@chromium.org
drivers/gpu/drm/bridge/ite-it6505.c

index 1e1c06fdf206457a71c24deb03d12678649f6aad..87b8545fccc0af9637eb53ade55b4c4936ded2ed 100644 (file)
@@ -460,6 +460,8 @@ struct it6505 {
        bool enable_drv_hold;
 
        const struct drm_edid *cached_edid;
+
+       int irq;
 };
 
 struct it6505_step_train_para {
@@ -2624,6 +2626,8 @@ static int it6505_poweron(struct it6505 *it6505)
        it6505_init(it6505);
        it6505_lane_off(it6505);
 
+       enable_irq(it6505->irq);
+
        return 0;
 }
 
@@ -2640,6 +2644,8 @@ static int it6505_poweroff(struct it6505 *it6505)
                return 0;
        }
 
+       disable_irq_nosync(it6505->irq);
+
        if (pdata->gpiod_reset)
                gpiod_set_value_cansleep(pdata->gpiod_reset, 0);
 
@@ -3389,7 +3395,7 @@ static int it6505_i2c_probe(struct i2c_client *client)
        struct it6505 *it6505;
        struct device *dev = &client->dev;
        struct extcon_dev *extcon;
-       int err, intp_irq;
+       int err;
 
        it6505 = devm_kzalloc(&client->dev, sizeof(*it6505), GFP_KERNEL);
        if (!it6505)
@@ -3430,17 +3436,18 @@ static int it6505_i2c_probe(struct i2c_client *client)
 
        it6505_parse_dt(it6505);
 
-       intp_irq = client->irq;
+       it6505->irq = client->irq;
 
-       if (!intp_irq) {
+       if (!it6505->irq) {
                dev_err(dev, "Failed to get INTP IRQ");
                err = -ENODEV;
                return err;
        }
 
-       err = devm_request_threaded_irq(&client->dev, intp_irq, NULL,
+       err = devm_request_threaded_irq(&client->dev, it6505->irq, NULL,
                                        it6505_int_threaded_handler,
-                                       IRQF_TRIGGER_LOW | IRQF_ONESHOT,
+                                       IRQF_TRIGGER_LOW | IRQF_ONESHOT |
+                                       IRQF_NO_AUTOEN,
                                        "it6505-intp", it6505);
        if (err) {
                dev_err(dev, "Failed to request INTP threaded IRQ: %d", err);