Commit 10f67d1f authored by Christophe JAILLET's avatar Christophe JAILLET Committed by Wim Van Sebroeck
Browse files

watchdog: dw_wdt: Simplify clk management

parent 7f539075
Loading
Loading
Loading
Loading
+11 −33
Original line number Diff line number Diff line
@@ -566,22 +566,16 @@ static int dw_wdt_drv_probe(struct platform_device *pdev)
	 * to the common timer/bus clocks configuration, in which the very
	 * first found clock supply both timer and APB signals.
	 */
	dw_wdt->clk = devm_clk_get(dev, "tclk");
	dw_wdt->clk = devm_clk_get_enabled(dev, "tclk");
	if (IS_ERR(dw_wdt->clk)) {
		dw_wdt->clk = devm_clk_get(dev, NULL);
		dw_wdt->clk = devm_clk_get_enabled(dev, NULL);
		if (IS_ERR(dw_wdt->clk))
			return PTR_ERR(dw_wdt->clk);
	}

	ret = clk_prepare_enable(dw_wdt->clk);
	if (ret)
		return ret;

	dw_wdt->rate = clk_get_rate(dw_wdt->clk);
	if (dw_wdt->rate == 0) {
		ret = -EINVAL;
		goto out_disable_clk;
	}
	if (dw_wdt->rate == 0)
		return -EINVAL;

	/*
	 * Request APB clock if device is configured with async clocks mode.
@@ -590,21 +584,13 @@ static int dw_wdt_drv_probe(struct platform_device *pdev)
	 * so the pclk phandle reference is left optional. If it couldn't be
	 * found we consider the device configured in synchronous clocks mode.
	 */
	dw_wdt->pclk = devm_clk_get_optional(dev, "pclk");
	if (IS_ERR(dw_wdt->pclk)) {
		ret = PTR_ERR(dw_wdt->pclk);
		goto out_disable_clk;
	}

	ret = clk_prepare_enable(dw_wdt->pclk);
	if (ret)
		goto out_disable_clk;
	dw_wdt->pclk = devm_clk_get_optional_enabled(dev, "pclk");
	if (IS_ERR(dw_wdt->pclk))
		return PTR_ERR(dw_wdt->pclk);

	dw_wdt->rst = devm_reset_control_get_optional_shared(&pdev->dev, NULL);
	if (IS_ERR(dw_wdt->rst)) {
		ret = PTR_ERR(dw_wdt->rst);
		goto out_disable_pclk;
	}
	if (IS_ERR(dw_wdt->rst))
		return PTR_ERR(dw_wdt->rst);

	/* Enable normal reset without pre-timeout by default. */
	dw_wdt_update_mode(dw_wdt, DW_WDT_RMOD_RESET);
@@ -621,12 +607,12 @@ static int dw_wdt_drv_probe(struct platform_device *pdev)
				       IRQF_SHARED | IRQF_TRIGGER_RISING,
				       pdev->name, dw_wdt);
		if (ret)
			goto out_disable_pclk;
			return ret;

		dw_wdt->wdd.info = &dw_wdt_pt_ident;
	} else {
		if (ret == -EPROBE_DEFER)
			goto out_disable_pclk;
			return ret;

		dw_wdt->wdd.info = &dw_wdt_ident;
	}
@@ -675,12 +661,6 @@ static int dw_wdt_drv_probe(struct platform_device *pdev)

out_assert_rst:
	reset_control_assert(dw_wdt->rst);

out_disable_pclk:
	clk_disable_unprepare(dw_wdt->pclk);

out_disable_clk:
	clk_disable_unprepare(dw_wdt->clk);
	return ret;
}

@@ -692,8 +672,6 @@ static void dw_wdt_drv_remove(struct platform_device *pdev)

	watchdog_unregister_device(&dw_wdt->wdd);
	reset_control_assert(dw_wdt->rst);
	clk_disable_unprepare(dw_wdt->pclk);
	clk_disable_unprepare(dw_wdt->clk);
}

#ifdef CONFIG_OF