Skip to content

Commit

Permalink
pwm: mxs: Don't modify HW state in .probe() after the PWM chip was re…
Browse files Browse the repository at this point in the history
…gistered

commit 020162d upstream.

This fixes a race condition: After pwmchip_add() is called there might
already be a consumer and then modifying the hardware behind the
consumer's back is bad. So reset before calling pwmchip_add().

Note that reseting the hardware isn't the right thing to do if the PWM
is already running as it might e.g. disable (or even enable) a backlight
that is supposed to be on (or off).

Fixes: 4dce82c ("pwm: add pwm-mxs support")
Cc: Sascha Hauer <s.hauer@pengutronix.de>
Cc: Shawn Guo <shawnguo@kernel.org>
Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
Signed-off-by: Thierry Reding <thierry.reding@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  • Loading branch information
ukleinek authored and gregkh committed Sep 26, 2021
1 parent 1c90a35 commit 81680e8
Showing 1 changed file with 5 additions and 8 deletions.
13 changes: 5 additions & 8 deletions drivers/pwm/pwm-mxs.c
Expand Up @@ -145,6 +145,11 @@ static int mxs_pwm_probe(struct platform_device *pdev)
return ret;
}

/* FIXME: Only do this if the PWM isn't already running */
ret = stmp_reset_block(mxs->base);
if (ret)
return dev_err_probe(&pdev->dev, ret, "failed to reset PWM\n");

ret = pwmchip_add(&mxs->chip);
if (ret < 0) {
dev_err(&pdev->dev, "failed to add pwm chip %d\n", ret);
Expand All @@ -153,15 +158,7 @@ static int mxs_pwm_probe(struct platform_device *pdev)

platform_set_drvdata(pdev, mxs);

ret = stmp_reset_block(mxs->base);
if (ret)
goto pwm_remove;

return 0;

pwm_remove:
pwmchip_remove(&mxs->chip);
return ret;
}

static int mxs_pwm_remove(struct platform_device *pdev)
Expand Down

0 comments on commit 81680e8

Please sign in to comment.