[PATCH v2 3/7] drm/i2c: tda998x: fix error cleanup paths
Hans Verkuil
hverkuil at xs4all.nl
Wed Dec 6 13:55:08 UTC 2017
On 12/06/17 13:35, Russell King wrote:
> If tda998x_get_audio_ports() fails, and we requested the interrupt, we
> fail to free the interrupt before returning failure. Rework the failure
> cleanup code and exit paths so that we always clean up properly after an
> error, and always propagate the error code.
>
> Signed-off-by: Russell King <rmk+kernel at armlinux.org.uk>
Acked-by: Hans Verkuil <hans.verkuil at cisco.com>
Regards,
Hans
> ---
> drivers/gpu/drm/i2c/tda998x_drv.c | 31 ++++++++++++++++++-------------
> 1 file changed, 18 insertions(+), 13 deletions(-)
>
> diff --git a/drivers/gpu/drm/i2c/tda998x_drv.c b/drivers/gpu/drm/i2c/tda998x_drv.c
> index 4aeac2127974..661cb8915f2f 100644
> --- a/drivers/gpu/drm/i2c/tda998x_drv.c
> +++ b/drivers/gpu/drm/i2c/tda998x_drv.c
> @@ -1499,10 +1499,15 @@ static int tda998x_create(struct i2c_client *client, struct tda998x_priv *priv)
>
> /* read version: */
> rev_lo = reg_read(priv, REG_VERSION_LSB);
> + if (rev_lo < 0) {
> + dev_err(&client->dev, "failed to read version: %d\n", rev_lo);
> + return rev_lo;
> + }
> +
> rev_hi = reg_read(priv, REG_VERSION_MSB);
> - if (rev_lo < 0 || rev_hi < 0) {
> - ret = rev_lo < 0 ? rev_lo : rev_hi;
> - goto fail;
> + if (rev_hi < 0) {
> + dev_err(&client->dev, "failed to read version: %d\n", rev_hi);
> + return rev_hi;
> }
>
> priv->rev = rev_lo | rev_hi << 8;
> @@ -1526,7 +1531,7 @@ static int tda998x_create(struct i2c_client *client, struct tda998x_priv *priv)
> default:
> dev_err(&client->dev, "found unsupported device: %04x\n",
> priv->rev);
> - goto fail;
> + return -ENXIO;
> }
>
> /* after reset, enable DDC: */
> @@ -1568,7 +1573,7 @@ static int tda998x_create(struct i2c_client *client, struct tda998x_priv *priv)
> dev_err(&client->dev,
> "failed to request IRQ#%u: %d\n",
> client->irq, ret);
> - goto fail;
> + goto err_irq;
> }
>
> /* enable HPD irq */
> @@ -1591,19 +1596,19 @@ static int tda998x_create(struct i2c_client *client, struct tda998x_priv *priv)
>
> ret = tda998x_get_audio_ports(priv, np);
> if (ret)
> - goto fail;
> + goto err_audio;
>
> if (priv->audio_port[0].format != AFMT_UNUSED)
> tda998x_audio_codec_init(priv, &client->dev);
>
> return 0;
> -fail:
> - /* if encoder_init fails, the encoder slave is never registered,
> - * so cleanup here:
> - */
> - if (priv->cec)
> - i2c_unregister_device(priv->cec);
> - return -ENXIO;
> +
> +err_audio:
> + if (client->irq)
> + free_irq(client->irq, priv);
> +err_irq:
> + i2c_unregister_device(priv->cec);
> + return ret;
> }
>
> static void tda998x_encoder_prepare(struct drm_encoder *encoder)
>
More information about the dri-devel
mailing list