| From be7bb753304b3f853db18f823d97ba4dbf671dcc Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Fri, 10 Sep 2021 12:11:58 +0200 |
| Subject: drm/mipi-dsi: Create devm device attachment |
| |
| From: Maxime Ripard <maxime@cerno.tech> |
| |
| [ Upstream commit db6568498b35a4d5d5a99420df27ed25fae31406 ] |
| |
| MIPI-DSI devices need to call mipi_dsi_attach() when their probe is done |
| to attach against their host. |
| |
| However, at removal or when an error occurs, that attachment needs to be |
| undone through a call to mipi_dsi_detach(). |
| |
| Let's create a device-managed variant of the attachment function that |
| will automatically detach the device at unbind. |
| |
| Reviewed-by: Andrzej Hajda <a.hajda@samsung.com> |
| Signed-off-by: Maxime Ripard <maxime@cerno.tech> |
| Link: https://patchwork.freedesktop.org/patch/msgid/20210910101218.1632297-5-maxime@cerno.tech |
| Stable-dep-of: 81adbd3ff21c ("drm: adv7511: Fix use-after-free in adv7533_attach_dsi()") |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/gpu/drm/drm_mipi_dsi.c | 35 ++++++++++++++++++++++++++++++++++ |
| include/drm/drm_mipi_dsi.h | 1 + |
| 2 files changed, 36 insertions(+) |
| |
| diff --git a/drivers/gpu/drm/drm_mipi_dsi.c b/drivers/gpu/drm/drm_mipi_dsi.c |
| index e53a5b14b47b..468a3a7cb6a5 100644 |
| --- a/drivers/gpu/drm/drm_mipi_dsi.c |
| +++ b/drivers/gpu/drm/drm_mipi_dsi.c |
| @@ -405,6 +405,41 @@ int mipi_dsi_detach(struct mipi_dsi_device *dsi) |
| } |
| EXPORT_SYMBOL(mipi_dsi_detach); |
| |
| +static void devm_mipi_dsi_detach(void *arg) |
| +{ |
| + struct mipi_dsi_device *dsi = arg; |
| + |
| + mipi_dsi_detach(dsi); |
| +} |
| + |
| +/** |
| + * devm_mipi_dsi_attach - Attach a MIPI-DSI device to its DSI Host |
| + * @dev: device to tie the MIPI-DSI device attachment lifetime to |
| + * @dsi: DSI peripheral |
| + * |
| + * This is the managed version of mipi_dsi_attach() which automatically |
| + * calls mipi_dsi_detach() when @dev is unbound. |
| + * |
| + * Returns: |
| + * 0 on success, a negative error code on failure. |
| + */ |
| +int devm_mipi_dsi_attach(struct device *dev, |
| + struct mipi_dsi_device *dsi) |
| +{ |
| + int ret; |
| + |
| + ret = mipi_dsi_attach(dsi); |
| + if (ret) |
| + return ret; |
| + |
| + ret = devm_add_action_or_reset(dev, devm_mipi_dsi_detach, dsi); |
| + if (ret) |
| + return ret; |
| + |
| + return 0; |
| +} |
| +EXPORT_SYMBOL_GPL(devm_mipi_dsi_attach); |
| + |
| static ssize_t mipi_dsi_device_transfer(struct mipi_dsi_device *dsi, |
| struct mipi_dsi_msg *msg) |
| { |
| diff --git a/include/drm/drm_mipi_dsi.h b/include/drm/drm_mipi_dsi.h |
| index af8ed48749eb..75995f3f2099 100644 |
| --- a/include/drm/drm_mipi_dsi.h |
| +++ b/include/drm/drm_mipi_dsi.h |
| @@ -230,6 +230,7 @@ devm_mipi_dsi_device_register_full(struct device *dev, struct mipi_dsi_host *hos |
| struct mipi_dsi_device *of_find_mipi_dsi_device_by_node(struct device_node *np); |
| int mipi_dsi_attach(struct mipi_dsi_device *dsi); |
| int mipi_dsi_detach(struct mipi_dsi_device *dsi); |
| +int devm_mipi_dsi_attach(struct device *dev, struct mipi_dsi_device *dsi); |
| int mipi_dsi_shutdown_peripheral(struct mipi_dsi_device *dsi); |
| int mipi_dsi_turn_on_peripheral(struct mipi_dsi_device *dsi); |
| int mipi_dsi_set_maximum_return_packet_size(struct mipi_dsi_device *dsi, |
| -- |
| 2.39.5 |
| |