Commit 14b9dc66 authored by Uwe Kleine-König's avatar Uwe Kleine-König Committed by Uwe Kleine-König
Browse files

pwm: xilinx: Simplify using devm_ functions



There are devm variants for clk_prepare_enable() and pwmchip_add(); and
clk_prepare_enable() can be done together with devm_clk_get(). This
allows to simplify the error paths in .probe() and drop .remove()
completely.

With the remove callback gone, the last user of platform_get_drvdata()
is gone and so the call to platform_set_drvdata() can be dropped, too.

Signed-off-by: default avatarUwe Kleine-König <u.kleine-koenig@baylibre.com>
Reviewed-by: default avatarSean Anderson <sean.anderson@seco.com>
Link: https://lore.kernel.org/r/20240628063524.92907-2-u.kleine-koenig@baylibre.com


Signed-off-by: default avatarUwe Kleine-König <ukleinek@kernel.org>
parent 0007fa12
Loading
Loading
Loading
Loading
+6 −21
Original line number Diff line number Diff line
@@ -224,7 +224,6 @@ static int xilinx_pwm_probe(struct platform_device *pdev)
	if (IS_ERR(chip))
		return PTR_ERR(chip);
	priv = xilinx_pwm_chip_to_priv(chip);
	platform_set_drvdata(pdev, chip);

	regs = devm_platform_ioremap_resource(pdev, 0);
	if (IS_ERR(regs))
@@ -263,37 +262,24 @@ static int xilinx_pwm_probe(struct platform_device *pdev)
	 * alas, such properties are not allowed to be used.
	 */

	priv->clk = devm_clk_get(dev, "s_axi_aclk");
	priv->clk = devm_clk_get_enabled(dev, "s_axi_aclk");
	if (IS_ERR(priv->clk))
		return dev_err_probe(dev, PTR_ERR(priv->clk),
				     "Could not get clock\n");

	ret = clk_prepare_enable(priv->clk);
	ret = devm_clk_rate_exclusive_get(dev, priv->clk);
	if (ret)
		return dev_err_probe(dev, ret, "Clock enable failed\n");
	clk_rate_exclusive_get(priv->clk);
		return dev_err_probe(dev, ret,
				     "Failed to lock clock rate\n");

	chip->ops = &xilinx_pwm_ops;
	ret = pwmchip_add(chip);
	if (ret) {
		clk_rate_exclusive_put(priv->clk);
		clk_disable_unprepare(priv->clk);
	ret = devm_pwmchip_add(dev, chip);
	if (ret)
		return dev_err_probe(dev, ret, "Could not register PWM chip\n");
	}

	return 0;
}

static void xilinx_pwm_remove(struct platform_device *pdev)
{
	struct pwm_chip *chip = platform_get_drvdata(pdev);
	struct xilinx_timer_priv *priv = xilinx_pwm_chip_to_priv(chip);

	pwmchip_remove(chip);
	clk_rate_exclusive_put(priv->clk);
	clk_disable_unprepare(priv->clk);
}

static const struct of_device_id xilinx_pwm_of_match[] = {
	{ .compatible = "xlnx,xps-timer-1.00.a", },
	{},
@@ -302,7 +288,6 @@ MODULE_DEVICE_TABLE(of, xilinx_pwm_of_match);

static struct platform_driver xilinx_pwm_driver = {
	.probe = xilinx_pwm_probe,
	.remove_new = xilinx_pwm_remove,
	.driver = {
		.name = "xilinx-pwm",
		.of_match_table = of_match_ptr(xilinx_pwm_of_match),