Lines Matching +full:sun4i +full:- +full:a10 +full:- +full:musb

1 // SPDX-License-Identifier: GPL-2.0
9 * Copyright 2007-2012 (C) Allwinner Technology Co., Ltd.
13 * Copyright (c) 2008-2009 MontaVista Software, Inc. <source@mvista.com>
14 * Copyright (C) 2005-2006 by Texas Instruments
21 #include <generic-phy.h>
22 #include <phy-sun4i-usb.h>
27 #include <asm-generic/gpio.h>
30 #include <linux/usb/musb.h>
31 #include "linux-compat.h"
195 * MUSB Glue code
200 struct musb *musb = __hci; in sunxi_musb_interrupt() local
204 musb->int_usb = musb_readb(musb->mregs, MUSB_INTRUSB); in sunxi_musb_interrupt()
205 last_int_usb = musb->int_usb; in sunxi_musb_interrupt()
206 if (musb->int_usb) in sunxi_musb_interrupt()
207 musb_writeb(musb->mregs, MUSB_INTRUSB, musb->int_usb); in sunxi_musb_interrupt()
208 musb->int_tx = musb_readw(musb->mregs, MUSB_INTRTX); in sunxi_musb_interrupt()
209 if (musb->int_tx) in sunxi_musb_interrupt()
210 musb_writew(musb->mregs, MUSB_INTRTX, musb->int_tx); in sunxi_musb_interrupt()
211 musb->int_rx = musb_readw(musb->mregs, MUSB_INTRRX); in sunxi_musb_interrupt()
212 if (musb->int_rx) in sunxi_musb_interrupt()
213 musb_writew(musb->mregs, MUSB_INTRRX, musb->int_rx); in sunxi_musb_interrupt()
215 if (musb->int_usb || musb->int_tx || musb->int_rx) in sunxi_musb_interrupt()
216 retval |= musb_interrupt(musb); in sunxi_musb_interrupt()
224 static int sunxi_musb_enable(struct musb *musb) in sunxi_musb_enable() argument
226 struct sunxi_glue *glue = to_sunxi_glue(musb->controller); in sunxi_musb_enable()
231 musb_ep_select(musb->mregs, 0); in sunxi_musb_enable()
232 musb_writeb(musb->mregs, MUSB_FADDR, 0); in sunxi_musb_enable()
238 musb_writeb(musb->mregs, USBC_REG_o_VEND0, 0); in sunxi_musb_enable()
240 if (is_host_enabled(musb)) { in sunxi_musb_enable()
241 ret = sun4i_usb_phy_vbus_detect(&glue->phy); in sunxi_musb_enable()
244 return -ENODEV; in sunxi_musb_enable()
247 ret = sun4i_usb_phy_id_detect(&glue->phy); in sunxi_musb_enable()
250 return -ENODEV; in sunxi_musb_enable()
253 ret = generic_phy_power_on(&glue->phy); in sunxi_musb_enable()
260 USBC_ForceVbusValidToHigh(musb->mregs); in sunxi_musb_enable()
266 static void sunxi_musb_disable(struct musb *musb) in sunxi_musb_disable() argument
268 struct sunxi_glue *glue = to_sunxi_glue(musb->controller); in sunxi_musb_disable()
276 if (is_host_enabled(musb)) { in sunxi_musb_disable()
277 ret = generic_phy_power_off(&glue->phy); in sunxi_musb_disable()
284 USBC_ForceVbusValidToLow(musb->mregs); in sunxi_musb_disable()
290 static int sunxi_musb_init(struct musb *musb) in sunxi_musb_init() argument
292 struct sunxi_glue *glue = to_sunxi_glue(musb->controller); in sunxi_musb_init()
297 ret = clk_enable(&glue->clk); in sunxi_musb_init()
303 if (reset_valid(&glue->rst)) { in sunxi_musb_init()
304 ret = reset_deassert(&glue->rst); in sunxi_musb_init()
311 ret = generic_phy_init(&glue->phy); in sunxi_musb_init()
317 musb->isr = sunxi_musb_interrupt; in sunxi_musb_init()
320 USBC_EnableDpDmPullUp(musb->mregs); in sunxi_musb_init()
321 USBC_EnableIdPullUp(musb->mregs); in sunxi_musb_init()
323 if (is_host_enabled(musb)) { in sunxi_musb_init()
325 USBC_ForceIdToLow(musb->mregs); in sunxi_musb_init()
328 USBC_ForceIdToHigh(musb->mregs); in sunxi_musb_init()
330 USBC_ForceVbusValidToHigh(musb->mregs); in sunxi_musb_init()
335 if (reset_valid(&glue->rst)) in sunxi_musb_init()
336 reset_assert(&glue->rst); in sunxi_musb_init()
338 clk_disable(&glue->clk); in sunxi_musb_init()
342 static int sunxi_musb_exit(struct musb *musb) in sunxi_musb_exit() argument
344 struct sunxi_glue *glue = to_sunxi_glue(musb->controller); in sunxi_musb_exit()
347 if (generic_phy_valid(&glue->phy)) { in sunxi_musb_exit()
348 ret = generic_phy_exit(&glue->phy); in sunxi_musb_exit()
355 if (reset_valid(&glue->rst)) in sunxi_musb_exit()
356 reset_assert(&glue->rst); in sunxi_musb_exit()
357 clk_disable(&glue->clk); in sunxi_musb_exit()
362 static void sunxi_musb_pre_root_reset_end(struct musb *musb) in sunxi_musb_pre_root_reset_end() argument
364 struct sunxi_glue *glue = to_sunxi_glue(musb->controller); in sunxi_musb_pre_root_reset_end()
366 sun4i_usb_phy_set_squelch_detect(&glue->phy, false); in sunxi_musb_pre_root_reset_end()
369 static void sunxi_musb_post_root_reset_end(struct musb *musb) in sunxi_musb_post_root_reset_end() argument
371 struct sunxi_glue *glue = to_sunxi_glue(musb->controller); in sunxi_musb_post_root_reset_end()
373 sun4i_usb_phy_set_squelch_detect(&glue->phy, true); in sunxi_musb_post_root_reset_end()
438 struct musb_host_data *host = &glue->mdata; in musb_usb_probe()
448 return -EINVAL; in musb_usb_probe()
450 glue->cfg = (struct sunxi_musb_config *)dev_get_driver_data(dev); in musb_usb_probe()
451 if (!glue->cfg) in musb_usb_probe()
452 return -EINVAL; in musb_usb_probe()
454 ret = clk_get_by_index(dev, 0, &glue->clk); in musb_usb_probe()
460 ret = reset_get_by_index(dev, 0, &glue->rst); in musb_usb_probe()
461 if (ret && ret != -ENOENT) { in musb_usb_probe()
466 ret = generic_phy_get_by_name(dev, "usb", &glue->phy); in musb_usb_probe()
475 pdata.config = glue->cfg->config; in musb_usb_probe()
478 priv->desc_before_addr = true; in musb_usb_probe()
481 host->host = musb_init_controller(&pdata, &glue->dev, base); in musb_usb_probe()
482 if (!host->host) in musb_usb_probe()
483 return -EIO; in musb_usb_probe()
487 printf("Allwinner mUSB OTG (Host)\n"); in musb_usb_probe()
490 host->host = musb_register(&pdata, &glue->dev, base); in musb_usb_probe()
491 if (!host->host) in musb_usb_probe()
492 return -EIO; in musb_usb_probe()
494 printf("Allwinner mUSB OTG (Peripheral)\n"); in musb_usb_probe()
503 struct musb_host_data *host = &glue->mdata; in musb_usb_remove()
505 musb_stop(host->host); in musb_usb_remove()
506 free(host->host); in musb_usb_remove()
507 host->host = NULL; in musb_usb_remove()
525 { .compatible = "allwinner,sun4i-a10-musb",
527 { .compatible = "allwinner,sun6i-a31-musb",
529 { .compatible = "allwinner,sun8i-a33-musb",
531 { .compatible = "allwinner,sun8i-h3-musb",
537 .name = "sunxi-musb",