From: Thomas Zimmermann <tzimmermann@suse.de>
To: airlied@redhat.com, jfalempe@redhat.com,
maarten.lankhorst@linux.intel.com, mripard@kernel.org,
airlied@gmail.com, daniel@ffwll.ch
Cc: dri-devel@lists.freedesktop.org,
Thomas Zimmermann <tzimmermann@suse.de>,
Patrik Jakobsson <patrik.r.jakobsson@gmail.com>
Subject: [PATCH v4 02/12] drm/ast: Fail probing if DDC channel could not be initialized
Date: Tue, 19 Mar 2024 09:00:22 +0100 [thread overview]
Message-ID: <20240319081430.10165-3-tzimmermann@suse.de> (raw)
In-Reply-To: <20240319081430.10165-1-tzimmermann@suse.de>
Expect the hardware to provide a DDC channel. Fail probing if its
initialization fails. Failing to initialize the DDC indicates a
larger problem, so there's no point in continuing.
v4:
* give a rational in the commit message
Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: Patrik Jakobsson <patrik.r.jakobsson@gmail.com>
---
drivers/gpu/drm/ast/ast_drv.h | 2 --
drivers/gpu/drm/ast/ast_i2c.c | 7 +++--
drivers/gpu/drm/ast/ast_mode.c | 52 +++++++++++++---------------------
3 files changed, 24 insertions(+), 37 deletions(-)
diff --git a/drivers/gpu/drm/ast/ast_drv.h b/drivers/gpu/drm/ast/ast_drv.h
index 3be5ccf1f5f4d..cb0e4f332be80 100644
--- a/drivers/gpu/drm/ast/ast_drv.h
+++ b/drivers/gpu/drm/ast/ast_drv.h
@@ -160,7 +160,6 @@ struct ast_i2c_chan {
struct ast_vga_connector {
struct drm_connector base;
- struct ast_i2c_chan *i2c;
};
static inline struct ast_vga_connector *
@@ -171,7 +170,6 @@ to_ast_vga_connector(struct drm_connector *connector)
struct ast_sil164_connector {
struct drm_connector base;
- struct ast_i2c_chan *i2c;
};
static inline struct ast_sil164_connector *
diff --git a/drivers/gpu/drm/ast/ast_i2c.c b/drivers/gpu/drm/ast/ast_i2c.c
index e5d3f7121de42..c3046223a4919 100644
--- a/drivers/gpu/drm/ast/ast_i2c.c
+++ b/drivers/gpu/drm/ast/ast_i2c.c
@@ -117,7 +117,7 @@ struct ast_i2c_chan *ast_i2c_create(struct drm_device *dev)
i2c = kzalloc(sizeof(struct ast_i2c_chan), GFP_KERNEL);
if (!i2c)
- return NULL;
+ return ERR_PTR(-ENOMEM);
i2c->adapter.owner = THIS_MODULE;
i2c->adapter.dev.parent = dev->dev;
@@ -142,10 +142,11 @@ struct ast_i2c_chan *ast_i2c_create(struct drm_device *dev)
ret = drmm_add_action_or_reset(dev, ast_i2c_release, i2c);
if (ret)
- return NULL;
+ return ERR_PTR(ret);
+
return i2c;
out_kfree:
kfree(i2c);
- return NULL;
+ return ERR_PTR(ret);
}
diff --git a/drivers/gpu/drm/ast/ast_mode.c b/drivers/gpu/drm/ast/ast_mode.c
index a718646a66b8f..38c31a7283a69 100644
--- a/drivers/gpu/drm/ast/ast_mode.c
+++ b/drivers/gpu/drm/ast/ast_mode.c
@@ -1345,22 +1345,18 @@ static int ast_crtc_init(struct drm_device *dev)
static int ast_vga_connector_helper_get_modes(struct drm_connector *connector)
{
- struct ast_vga_connector *ast_vga_connector = to_ast_vga_connector(connector);
struct drm_device *dev = connector->dev;
struct ast_device *ast = to_ast_device(dev);
struct edid *edid;
int count;
- if (!ast_vga_connector->i2c)
- goto err_drm_connector_update_edid_property;
-
/*
* Protect access to I/O registers from concurrent modesetting
* by acquiring the I/O-register lock.
*/
mutex_lock(&ast->modeset_lock);
- edid = drm_get_edid(connector, &ast_vga_connector->i2c->adapter);
+ edid = drm_get_edid(connector, connector->ddc);
if (!edid)
goto err_mutex_unlock;
@@ -1373,7 +1369,6 @@ static int ast_vga_connector_helper_get_modes(struct drm_connector *connector)
err_mutex_unlock:
mutex_unlock(&ast->modeset_lock);
-err_drm_connector_update_edid_property:
drm_connector_update_edid_property(connector, NULL);
return 0;
}
@@ -1394,19 +1389,18 @@ static int ast_vga_connector_init(struct drm_device *dev,
struct ast_vga_connector *ast_vga_connector)
{
struct drm_connector *connector = &ast_vga_connector->base;
+ struct ast_i2c_chan *i2c;
int ret;
- ast_vga_connector->i2c = ast_i2c_create(dev);
- if (!ast_vga_connector->i2c)
- drm_err(dev, "failed to add ddc bus for connector\n");
+ i2c = ast_i2c_create(dev);
+ if (IS_ERR(i2c)) {
+ ret = PTR_ERR(i2c);
+ drm_err(dev, "failed to add ddc bus for connector; ret=%d\n", ret);
+ return ret;
+ }
- if (ast_vga_connector->i2c)
- ret = drm_connector_init_with_ddc(dev, connector, &ast_vga_connector_funcs,
- DRM_MODE_CONNECTOR_VGA,
- &ast_vga_connector->i2c->adapter);
- else
- ret = drm_connector_init(dev, connector, &ast_vga_connector_funcs,
- DRM_MODE_CONNECTOR_VGA);
+ ret = drm_connector_init_with_ddc(dev, connector, &ast_vga_connector_funcs,
+ DRM_MODE_CONNECTOR_VGA, &i2c->adapter);
if (ret)
return ret;
@@ -1451,22 +1445,18 @@ static int ast_vga_output_init(struct ast_device *ast)
static int ast_sil164_connector_helper_get_modes(struct drm_connector *connector)
{
- struct ast_sil164_connector *ast_sil164_connector = to_ast_sil164_connector(connector);
struct drm_device *dev = connector->dev;
struct ast_device *ast = to_ast_device(dev);
struct edid *edid;
int count;
- if (!ast_sil164_connector->i2c)
- goto err_drm_connector_update_edid_property;
-
/*
* Protect access to I/O registers from concurrent modesetting
* by acquiring the I/O-register lock.
*/
mutex_lock(&ast->modeset_lock);
- edid = drm_get_edid(connector, &ast_sil164_connector->i2c->adapter);
+ edid = drm_get_edid(connector, connector->ddc);
if (!edid)
goto err_mutex_unlock;
@@ -1479,7 +1469,6 @@ static int ast_sil164_connector_helper_get_modes(struct drm_connector *connector
err_mutex_unlock:
mutex_unlock(&ast->modeset_lock);
-err_drm_connector_update_edid_property:
drm_connector_update_edid_property(connector, NULL);
return 0;
}
@@ -1500,19 +1489,18 @@ static int ast_sil164_connector_init(struct drm_device *dev,
struct ast_sil164_connector *ast_sil164_connector)
{
struct drm_connector *connector = &ast_sil164_connector->base;
+ struct ast_i2c_chan *i2c;
int ret;
- ast_sil164_connector->i2c = ast_i2c_create(dev);
- if (!ast_sil164_connector->i2c)
- drm_err(dev, "failed to add ddc bus for connector\n");
+ i2c = ast_i2c_create(dev);
+ if (IS_ERR(i2c)) {
+ ret = PTR_ERR(i2c);
+ drm_err(dev, "failed to add ddc bus for connector; ret=%d\n", ret);
+ return ret;
+ }
- if (ast_sil164_connector->i2c)
- ret = drm_connector_init_with_ddc(dev, connector, &ast_sil164_connector_funcs,
- DRM_MODE_CONNECTOR_DVII,
- &ast_sil164_connector->i2c->adapter);
- else
- ret = drm_connector_init(dev, connector, &ast_sil164_connector_funcs,
- DRM_MODE_CONNECTOR_DVII);
+ ret = drm_connector_init_with_ddc(dev, connector, &ast_sil164_connector_funcs,
+ DRM_MODE_CONNECTOR_DVII, &i2c->adapter);
if (ret)
return ret;
--
2.44.0
next prev parent reply other threads:[~2024-03-19 8:14 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-03-19 8:00 [PATCH v4 00/12] drm/ast: Detect connector status for VGA and SIL164 Thomas Zimmermann
2024-03-19 8:00 ` [PATCH v4 01/12] drm/ast: Include <linux/of.h> where necessary Thomas Zimmermann
2024-03-19 8:00 ` Thomas Zimmermann [this message]
2024-03-19 8:00 ` [PATCH v4 03/12] drm/ast: Remove struct ast_{vga,sil165}_connector Thomas Zimmermann
2024-03-19 8:00 ` [PATCH v4 04/12] drm/ast: Allocate instance of struct ast_i2c_chan with managed helpers Thomas Zimmermann
2024-03-19 8:00 ` [PATCH v4 05/12] drm/ast: Move DDC code to ast_ddc.{c,h} Thomas Zimmermann
2024-03-19 8:00 ` [PATCH v4 06/12] drm/ast: Rename struct ast_i2c_chan to struct ast_ddc Thomas Zimmermann
2024-03-19 8:00 ` [PATCH v4 07/12] drm/ast: Pass AST device to ast_ddc_create() Thomas Zimmermann
2024-03-19 8:00 ` [PATCH v4 08/12] drm/ast: Store AST device in struct ast_ddc Thomas Zimmermann
2024-03-19 8:00 ` [PATCH v4 09/12] drm/ast: Rename struct i2c_algo_bit_data callbacks and their parameters Thomas Zimmermann
2024-03-19 8:00 ` [PATCH v4 10/12] drm/ast: Acquire I/O-register lock in DDC code Thomas Zimmermann
2024-03-19 8:00 ` [PATCH v4 11/12] drm/ast: Use drm_connector_helper_get_modes() Thomas Zimmermann
2024-03-19 8:00 ` [PATCH v4 12/12] drm/ast: Implement polling for VGA and SIL164 connectors Thomas Zimmermann
2024-03-19 9:37 ` Maxime Ripard
2024-03-19 9:51 ` Thomas Zimmermann
2024-03-19 10:08 ` Jani Nikula
2024-03-19 10:13 ` Jani Nikula
2024-03-19 11:27 ` Thomas Zimmermann
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20240319081430.10165-3-tzimmermann@suse.de \
--to=tzimmermann@suse.de \
--cc=airlied@gmail.com \
--cc=airlied@redhat.com \
--cc=daniel@ffwll.ch \
--cc=dri-devel@lists.freedesktop.org \
--cc=jfalempe@redhat.com \
--cc=maarten.lankhorst@linux.intel.com \
--cc=mripard@kernel.org \
--cc=patrik.r.jakobsson@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.