Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 53ae91e0 authored by Stefan Potyra's avatar Stefan Potyra Committed by Greg Kroah-Hartman
Browse files

w1: mxc_w1: Enable clock before calling clk_get_rate() on it



commit 955bc61328dc0a297fb3baccd84e9d3aee501ed8 upstream.

According to the API, you may only call clk_get_rate() after actually
enabling it.

Found by Linux Driver Verification project (linuxtesting.org).

Fixes: a5fd9139 ("w1: add 1-wire master driver for i.MX27 / i.MX31")
Signed-off-by: default avatarStefan Potyra <Stefan.Potyra@elektrobit.com>
Acked-by: default avatarEvgeniy Polyakov <zbr@ioremap.net>
Cc: stable <stable@vger.kernel.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent ffed4eb1
Loading
Loading
Loading
Loading
+13 −7
Original line number Original line Diff line number Diff line
@@ -113,6 +113,10 @@ static int mxc_w1_probe(struct platform_device *pdev)
	if (IS_ERR(mdev->clk))
	if (IS_ERR(mdev->clk))
		return PTR_ERR(mdev->clk);
		return PTR_ERR(mdev->clk);


	err = clk_prepare_enable(mdev->clk);
	if (err)
		return err;

	clkrate = clk_get_rate(mdev->clk);
	clkrate = clk_get_rate(mdev->clk);
	if (clkrate < 10000000)
	if (clkrate < 10000000)
		dev_warn(&pdev->dev,
		dev_warn(&pdev->dev,
@@ -126,12 +130,10 @@ static int mxc_w1_probe(struct platform_device *pdev)


	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
	mdev->regs = devm_ioremap_resource(&pdev->dev, res);
	mdev->regs = devm_ioremap_resource(&pdev->dev, res);
	if (IS_ERR(mdev->regs))
	if (IS_ERR(mdev->regs)) {
		return PTR_ERR(mdev->regs);
		err = PTR_ERR(mdev->regs);

		goto out_disable_clk;
	err = clk_prepare_enable(mdev->clk);
	}
	if (err)
		return err;


	/* Software reset 1-Wire module */
	/* Software reset 1-Wire module */
	writeb(MXC_W1_RESET_RST, mdev->regs + MXC_W1_RESET);
	writeb(MXC_W1_RESET_RST, mdev->regs + MXC_W1_RESET);
@@ -147,8 +149,12 @@ static int mxc_w1_probe(struct platform_device *pdev)


	err = w1_add_master_device(&mdev->bus_master);
	err = w1_add_master_device(&mdev->bus_master);
	if (err)
	if (err)
		clk_disable_unprepare(mdev->clk);
		goto out_disable_clk;


	return 0;

out_disable_clk:
	clk_disable_unprepare(mdev->clk);
	return err;
	return err;
}
}