Unverified Commit 10ba3753 authored by Pin-yen Lin's avatar Pin-yen Lin Committed by Robert Foss
Browse files

drm/bridge: it6505: Disable IRQ when powered off



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: default avatarPin-yen Lin <treapking@chromium.org>
Reviewed-by: default avatarRobert Foss <rfoss@kernel.org>
Signed-off-by: default avatarRobert Foss <rfoss@kernel.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20240719110623.1850021-1-treapking@chromium.org
parent 7214da0e
Loading
Loading
Loading
Loading
+12 −5
Original line number Diff line number Diff line
@@ -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);