Commit 1ab4f439 authored by Yoshihiro Shimoda's avatar Yoshihiro Shimoda Committed by Geert Uytterhoeven
Browse files

clk: renesas: rcar-usb2-clock-sel: Add reset_control



This hardware needs to deassert resets of both host and peripheral.
So, this patch adds reset control.

Signed-off-by: default avatarYoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
Link: https://lore.kernel.org/r/1583304137-28482-5-git-send-email-yoshihiro.shimoda.uh@renesas.com


Signed-off-by: default avatarGeert Uytterhoeven <geert+renesas@glider.be>
parent 80cf67dd
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -161,6 +161,7 @@ config CLK_RCAR_GEN3_CPG
config CLK_RCAR_USB2_CLOCK_SEL
	bool "Renesas R-Car USB2 clock selector support"
	depends on ARCH_RENESAS || COMPILE_TEST
	select RESET_CONTROLLER
	help
	  This is a driver for R-Car USB2 clock selector

+14 −1
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@
#include <linux/platform_device.h>
#include <linux/pm.h>
#include <linux/pm_runtime.h>
#include <linux/reset.h>
#include <linux/slab.h>

#define USB20_CLKSET0		0x00
@@ -35,6 +36,7 @@ struct usb2_clock_sel_priv {
	void __iomem *base;
	struct clk_hw hw;
	struct clk_bulk_data clks[ARRAY_SIZE(rcar_usb2_clocks)];
	struct reset_control *rsts;
	bool extal;
	bool xtal;
};
@@ -62,10 +64,16 @@ static int usb2_clock_sel_enable(struct clk_hw *hw)
	struct usb2_clock_sel_priv *priv = to_priv(hw);
	int ret;

	ret = clk_bulk_prepare_enable(ARRAY_SIZE(priv->clks), priv->clks);
	ret = reset_control_deassert(priv->rsts);
	if (ret)
		return ret;

	ret = clk_bulk_prepare_enable(ARRAY_SIZE(priv->clks), priv->clks);
	if (ret) {
		reset_control_assert(priv->rsts);
		return ret;
	}

	usb2_clock_sel_enable_extal_only(priv);

	return 0;
@@ -78,6 +86,7 @@ static void usb2_clock_sel_disable(struct clk_hw *hw)
	usb2_clock_sel_disable_extal_only(priv);

	clk_bulk_disable_unprepare(ARRAY_SIZE(priv->clks), priv->clks);
	reset_control_assert(priv->rsts);
}

/*
@@ -151,6 +160,10 @@ static int rcar_usb2_clock_sel_probe(struct platform_device *pdev)
	if (ret < 0)
		return ret;

	priv->rsts = devm_reset_control_array_get(dev, true, false);
	if (IS_ERR(priv->rsts))
		return PTR_ERR(priv->rsts);

	pm_runtime_enable(dev);
	pm_runtime_get_sync(dev);