Lines Matching +full:big +full:- +full:endian +full:- +full:regs
1 // SPDX-License-Identifier: GPL-2.0
6 * Copyright 2011-2012 Hauke Mehrtens <hauke@hauke-m.de>
9 * Derived from the OCHI-SSB driver
10 * Derived from the OHCI-PCI driver
12 * Copyright 2000-2002 David Brownell
18 #include <linux/dma-mapping.h>
36 #define hcd_to_ohci_priv(h) ((struct ohci_platform_priv *)hcd_to_ohci(h)->priv)
43 static const char hcd_name[] = "ohci-platform";
51 for (clk = 0; clk < OHCI_MAX_CLKS && priv->clks[clk]; clk++) { in ohci_platform_power_on()
52 ret = clk_prepare_enable(priv->clks[clk]); in ohci_platform_power_on()
60 while (--clk >= 0) in ohci_platform_power_on()
61 clk_disable_unprepare(priv->clks[clk]); in ohci_platform_power_on()
72 for (clk = OHCI_MAX_CLKS - 1; clk >= 0; clk--) in ohci_platform_power_off()
73 if (priv->clks[clk]) in ohci_platform_power_off()
74 clk_disable_unprepare(priv->clks[clk]); in ohci_platform_power_off()
94 struct usb_ohci_pdata *pdata = dev_get_platdata(&dev->dev); in ohci_platform_probe()
100 return -ENODEV; in ohci_platform_probe()
109 err = dma_coerce_mask_and_coherent(&dev->dev, DMA_BIT_MASK(32)); in ohci_platform_probe()
117 hcd = usb_create_hcd(&ohci_platform_hc_driver, &dev->dev, in ohci_platform_probe()
118 dev_name(&dev->dev)); in ohci_platform_probe()
120 return -ENOMEM; in ohci_platform_probe()
123 dev->dev.platform_data = pdata; in ohci_platform_probe()
127 if (pdata == &ohci_platform_defaults && dev->dev.of_node) { in ohci_platform_probe()
128 if (of_property_read_bool(dev->dev.of_node, "big-endian-regs")) in ohci_platform_probe()
129 ohci->flags |= OHCI_QUIRK_BE_MMIO; in ohci_platform_probe()
131 if (of_property_read_bool(dev->dev.of_node, "big-endian-desc")) in ohci_platform_probe()
132 ohci->flags |= OHCI_QUIRK_BE_DESC; in ohci_platform_probe()
134 if (of_property_read_bool(dev->dev.of_node, "big-endian")) in ohci_platform_probe()
135 ohci->flags |= OHCI_QUIRK_BE_MMIO | OHCI_QUIRK_BE_DESC; in ohci_platform_probe()
137 if (of_property_read_bool(dev->dev.of_node, "no-big-frame-no")) in ohci_platform_probe()
138 ohci->flags |= OHCI_QUIRK_FRAME_NO; in ohci_platform_probe()
140 if (of_property_read_bool(dev->dev.of_node, in ohci_platform_probe()
141 "remote-wakeup-connected")) in ohci_platform_probe()
142 ohci->hc_control = OHCI_CTRL_RWC; in ohci_platform_probe()
144 of_property_read_u32(dev->dev.of_node, "num-ports", in ohci_platform_probe()
145 &ohci->num_ports); in ohci_platform_probe()
148 priv->clks[clk] = of_clk_get(dev->dev.of_node, clk); in ohci_platform_probe()
149 if (IS_ERR(priv->clks[clk])) { in ohci_platform_probe()
150 err = PTR_ERR(priv->clks[clk]); in ohci_platform_probe()
151 if (err == -EPROBE_DEFER) in ohci_platform_probe()
153 priv->clks[clk] = NULL; in ohci_platform_probe()
158 priv->resets = devm_reset_control_array_get_optional_shared( in ohci_platform_probe()
159 &dev->dev); in ohci_platform_probe()
160 if (IS_ERR(priv->resets)) { in ohci_platform_probe()
161 err = PTR_ERR(priv->resets); in ohci_platform_probe()
165 err = reset_control_deassert(priv->resets); in ohci_platform_probe()
170 if (pdata->big_endian_desc) in ohci_platform_probe()
171 ohci->flags |= OHCI_QUIRK_BE_DESC; in ohci_platform_probe()
172 if (pdata->big_endian_mmio) in ohci_platform_probe()
173 ohci->flags |= OHCI_QUIRK_BE_MMIO; in ohci_platform_probe()
174 if (pdata->no_big_frame_no) in ohci_platform_probe()
175 ohci->flags |= OHCI_QUIRK_FRAME_NO; in ohci_platform_probe()
176 if (pdata->num_ports) in ohci_platform_probe()
177 ohci->num_ports = pdata->num_ports; in ohci_platform_probe()
180 if (ohci->flags & OHCI_QUIRK_BE_MMIO) { in ohci_platform_probe()
181 dev_err(&dev->dev, in ohci_platform_probe()
183 err = -EINVAL; in ohci_platform_probe()
188 if (ohci->flags & OHCI_QUIRK_BE_DESC) { in ohci_platform_probe()
189 dev_err(&dev->dev, in ohci_platform_probe()
191 err = -EINVAL; in ohci_platform_probe()
196 pm_runtime_set_active(&dev->dev); in ohci_platform_probe()
197 pm_runtime_enable(&dev->dev); in ohci_platform_probe()
198 if (pdata->power_on) { in ohci_platform_probe()
199 err = pdata->power_on(dev); in ohci_platform_probe()
205 hcd->regs = devm_ioremap_resource(&dev->dev, res_mem); in ohci_platform_probe()
206 if (IS_ERR(hcd->regs)) { in ohci_platform_probe()
207 err = PTR_ERR(hcd->regs); in ohci_platform_probe()
210 hcd->rsrc_start = res_mem->start; in ohci_platform_probe()
211 hcd->rsrc_len = resource_size(res_mem); in ohci_platform_probe()
217 device_wakeup_enable(hcd->self.controller); in ohci_platform_probe()
224 if (pdata->power_off) in ohci_platform_probe()
225 pdata->power_off(dev); in ohci_platform_probe()
227 pm_runtime_disable(&dev->dev); in ohci_platform_probe()
228 reset_control_assert(priv->resets); in ohci_platform_probe()
230 while (--clk >= 0) in ohci_platform_probe()
231 clk_put(priv->clks[clk]); in ohci_platform_probe()
234 dev->dev.platform_data = NULL; in ohci_platform_probe()
244 struct usb_ohci_pdata *pdata = dev_get_platdata(&dev->dev); in ohci_platform_remove()
248 pm_runtime_get_sync(&dev->dev); in ohci_platform_remove()
251 if (pdata->power_off) in ohci_platform_remove()
252 pdata->power_off(dev); in ohci_platform_remove()
254 reset_control_assert(priv->resets); in ohci_platform_remove()
256 for (clk = 0; clk < OHCI_MAX_CLKS && priv->clks[clk]; clk++) in ohci_platform_remove()
257 clk_put(priv->clks[clk]); in ohci_platform_remove()
261 pm_runtime_put_sync(&dev->dev); in ohci_platform_remove()
262 pm_runtime_disable(&dev->dev); in ohci_platform_remove()
265 dev->dev.platform_data = NULL; in ohci_platform_remove()
274 struct usb_ohci_pdata *pdata = dev->platform_data; in ohci_platform_suspend()
283 if (pdata->power_suspend) in ohci_platform_suspend()
284 pdata->power_suspend(pdev); in ohci_platform_suspend()
295 if (pdata->power_on) { in ohci_platform_resume()
296 int err = pdata->power_on(pdev); in ohci_platform_resume()
312 { .compatible = "generic-ohci", },
313 { .compatible = "cavium,octeon-6335-ohci", },
314 { .compatible = "ti,ohci-omap3", },
320 { "ohci-platform", 0 },
334 .name = "ohci-platform",
343 return -ENODEV; in ohci_platform_init()