From 61301c3b7b99d9295fd91a7c80be0d04cced1bcd Mon Sep 17 00:00:00 2001 From: Wyon Bi Date: Wed, 29 Mar 2023 11:53:38 +0000 Subject: [PATCH] drm/bridge: maxim-max96745: Use the parent's extcon Signed-off-by: Wyon Bi Change-Id: I002987713d316f9ac5f59794f501016e29db2de7 --- drivers/gpu/drm/bridge/maxim-max96745.c | 46 ++++++------------------- 1 file changed, 10 insertions(+), 36 deletions(-) diff --git a/drivers/gpu/drm/bridge/maxim-max96745.c b/drivers/gpu/drm/bridge/maxim-max96745.c index 765308a2d867..9755f129f519 100644 --- a/drivers/gpu/drm/bridge/maxim-max96745.c +++ b/drivers/gpu/drm/bridge/maxim-max96745.c @@ -30,22 +30,17 @@ struct max96745_bridge { enum drm_connector_status status; struct device *dev; + struct max96745 *parent; struct regmap *regmap; struct { struct gpio_desc *gpio; int irq; atomic_t triggered; } lock; - struct extcon_dev *extcon; }; #define to_max96745_bridge(x) container_of(x, struct max96745_bridge, x) -static const unsigned int max96745_bridge_cable[] = { - EXTCON_JACK_VIDEO_OUT, - EXTCON_NONE, -}; - static bool max96745_bridge_link_locked(struct max96745_bridge *ser) { u32 val; @@ -62,19 +57,6 @@ static bool max96745_bridge_link_locked(struct max96745_bridge *ser) return true; } -static bool max96745_bridge_vid_tx_active(struct max96745_bridge *ser) -{ - u32 val; - - if (regmap_read(ser->regmap, 0x0107, &val)) - return false; - - if (!FIELD_GET(VID_TX_ACTIVE_A | VID_TX_ACTIVE_B, val)) - return false; - - return true; -} - static int max96745_bridge_attach(struct drm_bridge *bridge, enum drm_bridge_attach_flags flags) { @@ -91,9 +73,6 @@ static int max96745_bridge_attach(struct drm_bridge *bridge, else ser->status = connector_status_disconnected; - extcon_set_state(ser->extcon, EXTCON_JACK_VIDEO_OUT, - max96745_bridge_vid_tx_active(ser)); - return 0; } @@ -108,18 +87,20 @@ static void max96745_bridge_pre_enable(struct drm_bridge *bridge) static void max96745_bridge_enable(struct drm_bridge *bridge) { struct max96745_bridge *ser = to_max96745_bridge(bridge); + struct max96745 *max96745 = ser->parent; if (ser->panel) drm_panel_enable(ser->panel); - extcon_set_state_sync(ser->extcon, EXTCON_JACK_VIDEO_OUT, true); + extcon_set_state_sync(max96745->extcon, EXTCON_JACK_VIDEO_OUT, true); } static void max96745_bridge_disable(struct drm_bridge *bridge) { struct max96745_bridge *ser = to_max96745_bridge(bridge); + struct max96745 *max96745 = ser->parent; - extcon_set_state_sync(ser->extcon, EXTCON_JACK_VIDEO_OUT, false); + extcon_set_state_sync(max96745->extcon, EXTCON_JACK_VIDEO_OUT, false); if (ser->panel) drm_panel_disable(ser->panel); @@ -137,6 +118,7 @@ static enum drm_connector_status max96745_bridge_detect(struct drm_bridge *bridge) { struct max96745_bridge *ser = to_max96745_bridge(bridge); + struct max96745 *max96745 = ser->parent; enum drm_connector_status status = connector_status_connected; if (!drm_kms_helper_is_poll_worker()) @@ -147,7 +129,7 @@ max96745_bridge_detect(struct drm_bridge *bridge) goto out; } - if (extcon_get_state(ser->extcon, EXTCON_JACK_VIDEO_OUT)) { + if (extcon_get_state(max96745->extcon, EXTCON_JACK_VIDEO_OUT)) { u32 dprx_trn_status2; if (atomic_cmpxchg(&ser->lock.triggered, 1, 0)) { @@ -203,8 +185,9 @@ static const struct drm_bridge_funcs max96745_bridge_funcs = { static irqreturn_t max96745_bridge_lock_irq_handler(int irq, void *arg) { struct max96745_bridge *ser = arg; + struct max96745 *max96745 = ser->parent; - if (extcon_get_state(ser->extcon, EXTCON_JACK_VIDEO_OUT)) + if (extcon_get_state(max96745->extcon, EXTCON_JACK_VIDEO_OUT)) atomic_set(&ser->lock.triggered, 1); return IRQ_HANDLED; @@ -221,6 +204,7 @@ static int max96745_bridge_probe(struct platform_device *pdev) return -ENOMEM; ser->dev = dev; + ser->parent = dev_get_drvdata(dev->parent); platform_set_drvdata(pdev, ser); ser->regmap = dev_get_regmap(dev->parent, NULL); @@ -232,16 +216,6 @@ static int max96745_bridge_probe(struct platform_device *pdev) return dev_err_probe(dev, PTR_ERR(ser->lock.gpio), "failed to get lock GPIO\n"); - ser->extcon = devm_extcon_dev_allocate(dev, max96745_bridge_cable); - if (IS_ERR(ser->extcon)) - return dev_err_probe(dev, PTR_ERR(ser->extcon), - "failed to allocate extcon device\n"); - - ret = devm_extcon_dev_register(dev, ser->extcon); - if (ret) - return dev_err_probe(dev, ret, - "failed to register extcon device\n"); - if (ser->lock.gpio) { ser->lock.irq = gpiod_to_irq(ser->lock.gpio); if (ser->lock.irq < 0)