diff options
author | Vinod Koul <vkoul@kernel.org> | 2020-04-07 22:43:23 +0530 |
---|---|---|
committer | Vinod Koul <vkoul@kernel.org> | 2020-04-13 12:31:13 +0530 |
commit | 38b20f9513f16b2360c3342dd70f39ddddca653d (patch) | |
tree | 6dcc9372887a071c4088257301237ae31258d4e7 | |
parent | 26d53a2444d62e8373bc4889b395c394ac83bbec (diff) |
drm/bridge: lt9611: invoke reset after sleep
Once we invoke the sleep, the device needs to be reset first before we
do anything. After that first write should be to 0x80ee.
So invoke lt9611_reset() from lt9611_bridge_pre_enable() and enable the
lt9611_sleep_setup() function (masked earlier)
Also, lt9611_bridge_pre_enable in invoked after modeset, so invoke
lt9611_bridge_pre_enable() from modeset as we should reset first when
coming back from sleep.
Signed-off-by: Vinod Koul <vkoul@kernel.org>
-rw-r--r-- | drivers/gpu/drm/bridge/lt9611.c | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/drivers/gpu/drm/bridge/lt9611.c b/drivers/gpu/drm/bridge/lt9611.c index eb5c6cc29839..de785973765d 100644 --- a/drivers/gpu/drm/bridge/lt9611.c +++ b/drivers/gpu/drm/bridge/lt9611.c @@ -60,6 +60,7 @@ struct lt9611 { struct gpio_desc *enable_gpio; bool power_on; + bool sleep; struct regulator_bulk_data supplies[2]; @@ -473,6 +474,7 @@ static void lt9611_sleep_setup(struct lt9611 *lt9611) dev_err(lt9611->dev, "sleep\n"); regmap_multi_reg_write(lt9611->regmap, sleep_setup, ARRAY_SIZE(sleep_setup)); + lt9611->sleep = true; } static int lt9611_power_on(struct lt9611 *lt9611) @@ -890,7 +892,13 @@ static void lt9611_bridge_pre_enable(struct drm_bridge *bridge) dev_dbg(lt9611->dev, "bridge pre_enable\n"); + if (!lt9611->sleep) + return 0; + + lt9611_reset(lt9611); regmap_write(lt9611->regmap, 0x80ee, 0x01); + + lt9611->sleep = false; } static void lt9611_bridge_post_disable(struct drm_bridge *bridge) @@ -899,7 +907,7 @@ static void lt9611_bridge_post_disable(struct drm_bridge *bridge) dev_dbg(lt9611->dev, "bridge post_disable\n"); - //lt9611_sleep_setup(lt9611); + lt9611_sleep_setup(lt9611); } static void lt9611_bridge_mode_set(struct drm_bridge *bridge, @@ -914,6 +922,8 @@ static void lt9611_bridge_mode_set(struct drm_bridge *bridge, adj_mode->hdisplay, adj_mode->vdisplay, adj_mode->vrefresh, adj_mode->clock); + lt9611_bridge_pre_enable(bridge); + lt9611_mipi_input_digital(lt9611, mode); lt9611_pll_setup(lt9611, mode); lt9611_mipi_video_setup(lt9611, mode); @@ -930,7 +940,7 @@ static const struct drm_bridge_funcs lt9611_bridge_funcs = { .attach = lt9611_bridge_attach, .detach = lt9611_bridge_detach, .mode_valid = lt9611_bridge_mode_valid, - .pre_enable = lt9611_bridge_pre_enable, +// .pre_enable = lt9611_bridge_pre_enable, .enable = lt9611_bridge_enable, .disable = lt9611_bridge_disable, .post_disable = lt9611_bridge_post_disable, @@ -1092,6 +1102,7 @@ static int lt9611_probe(struct i2c_client *client, lt9611->dev = &client->dev; lt9611->client = client; + lt9611->sleep = false; lt9611->regmap = devm_regmap_init_i2c(client, <9611_regmap_config); if (IS_ERR(lt9611->regmap)) { |