Lines Matching +full:rcar +full:- +full:gen3 +full:- +full:usb2 +full:- +full:clock +full:- +full:sel

1 // SPDX-License-Identifier: GPL-2.0
3 * Renesas R-Car USB2.0 clock selector
7 * Based on renesas-cpg-mssr.c
13 #include <linux/clk-provider.h>
31 { .id = "hs-usb-if", },
46 u16 val = readw(priv->base + USB20_CLKSET0); in usb2_clock_sel_enable_extal_only()
49 priv->extal, priv->xtal, val); in usb2_clock_sel_enable_extal_only()
51 if (priv->extal && !priv->xtal && val != CLKSET0_EXTAL_ONLY) in usb2_clock_sel_enable_extal_only()
52 writew(CLKSET0_EXTAL_ONLY, priv->base + USB20_CLKSET0); in usb2_clock_sel_enable_extal_only()
57 if (priv->extal && !priv->xtal) in usb2_clock_sel_disable_extal_only()
58 writew(CLKSET0_PRIVATE, priv->base + USB20_CLKSET0); in usb2_clock_sel_disable_extal_only()
66 ret = reset_control_deassert(priv->rsts); in usb2_clock_sel_enable()
70 ret = clk_bulk_prepare_enable(ARRAY_SIZE(priv->clks), priv->clks); in usb2_clock_sel_enable()
72 reset_control_assert(priv->rsts); in usb2_clock_sel_enable()
87 clk_bulk_disable_unprepare(ARRAY_SIZE(priv->clks), priv->clks); in usb2_clock_sel_disable()
88 reset_control_assert(priv->rsts); in usb2_clock_sel_disable()
94 * If this driver acts as a gate, ehci/ohci-platform drivers don't need
103 { .compatible = "renesas,rcar-gen3-usb2-clock-sel" },
129 struct device *dev = &pdev->dev; in rcar_usb2_clock_sel_remove()
131 of_clk_del_provider(dev->of_node); in rcar_usb2_clock_sel_remove()
138 struct device *dev = &pdev->dev; in rcar_usb2_clock_sel_probe()
139 struct device_node *np = dev->of_node; in rcar_usb2_clock_sel_probe()
147 return -ENOMEM; in rcar_usb2_clock_sel_probe()
149 priv->base = devm_platform_ioremap_resource(pdev, 0); in rcar_usb2_clock_sel_probe()
150 if (IS_ERR(priv->base)) in rcar_usb2_clock_sel_probe()
151 return PTR_ERR(priv->base); in rcar_usb2_clock_sel_probe()
153 memcpy(priv->clks, rcar_usb2_clocks, sizeof(priv->clks)); in rcar_usb2_clock_sel_probe()
154 ret = devm_clk_bulk_get(dev, ARRAY_SIZE(priv->clks), priv->clks); in rcar_usb2_clock_sel_probe()
158 priv->rsts = devm_reset_control_array_get_shared(dev); in rcar_usb2_clock_sel_probe()
159 if (IS_ERR(priv->rsts)) in rcar_usb2_clock_sel_probe()
160 return PTR_ERR(priv->rsts); in rcar_usb2_clock_sel_probe()
164 priv->extal = !!clk_get_rate(clk); in rcar_usb2_clock_sel_probe()
169 priv->xtal = !!clk_get_rate(clk); in rcar_usb2_clock_sel_probe()
173 if (!priv->extal && !priv->xtal) { in rcar_usb2_clock_sel_probe()
175 return -ENOENT; in rcar_usb2_clock_sel_probe()
185 priv->hw.init = &init; in rcar_usb2_clock_sel_probe()
187 ret = devm_clk_hw_register(dev, &priv->hw); in rcar_usb2_clock_sel_probe()
191 ret = of_clk_add_hw_provider(np, of_clk_hw_simple_get, &priv->hw); in rcar_usb2_clock_sel_probe()
210 .name = "rcar-usb2-clock-sel",
219 MODULE_DESCRIPTION("Renesas R-Car USB2 clock selector Driver");