Lines Matching +full:t +full:- +full:phy
1 /*-
7 * Cambridge Computer Laboratory under DARPA/AFRL contract FA8750-10-C-0237
33 * Allwinner USB Dual-Role Device (DRD) controller
63 #include <dev/phy/phy.h>
64 #include <dev/phy/phy_usb.h>
78 #define bs_parent_space(bs) ((bs)->bs_parent)
88 { "allwinner,sun4i-a10-musb", AWUSB_OKAY },
89 { "allwinner,sun6i-a31-musb", AWUSB_OKAY },
90 { "allwinner,sun8i-a33-musb", AWUSB_OKAY | AWUSB_NO_CONFDATA },
91 { "allwinner,sun8i-h3-musb", AWUSB_OKAY | AWUSB_NO_CONFDATA },
92 { "allwinner,sun20i-d1-musb", AWUSB_OKAY | AWUSB_NO_CONFDATA },
103 .ep_end = -1,
114 .ep_end = -1,
123 phy_t phy; member
131 { -1, 0 }
243 awusbdrd_bs_r_1(awusb_bs_tag t, bus_space_handle_t h, bus_size_t o) in awusbdrd_bs_r_1() argument
245 struct bus_space *bs = t; in awusbdrd_bs_r_1()
256 awusbdrd_bs_r_1_noconf(awusb_bs_tag t, bus_space_handle_t h, bus_size_t o) in awusbdrd_bs_r_1_noconf() argument
266 return (awusbdrd_bs_r_1(t, h, o)); in awusbdrd_bs_r_1_noconf()
271 awusbdrd_bs_r_2(awusb_bs_tag t, bus_space_handle_t h, bus_size_t o) in awusbdrd_bs_r_2() argument
273 struct bus_space *bs = t; in awusbdrd_bs_r_2()
281 awusbdrd_bs_w_1(awusb_bs_tag t, bus_space_handle_t h, bus_size_t o, in awusbdrd_bs_w_1() argument
284 struct bus_space *bs = t; in awusbdrd_bs_w_1()
293 awusbdrd_bs_w_2(awusb_bs_tag t, bus_space_handle_t h, bus_size_t o, in awusbdrd_bs_w_2() argument
296 struct bus_space *bs = t; in awusbdrd_bs_w_2()
305 awusbdrd_bs_rm_1(awusb_bs_tag t, bus_space_handle_t h, bus_size_t o, in awusbdrd_bs_rm_1() argument
308 struct bus_space *bs = t; in awusbdrd_bs_rm_1()
314 awusbdrd_bs_rm_4(awusb_bs_tag t, bus_space_handle_t h, bus_size_t o, in awusbdrd_bs_rm_4() argument
317 struct bus_space *bs = t; in awusbdrd_bs_rm_4()
323 awusbdrd_bs_wm_1(awusb_bs_tag t, bus_space_handle_t h, bus_size_t o, in awusbdrd_bs_wm_1() argument
326 struct bus_space *bs = t; in awusbdrd_bs_wm_1()
335 awusbdrd_bs_wm_4(awusb_bs_tag t, bus_space_handle_t h, bus_size_t o, in awusbdrd_bs_wm_4() argument
338 struct bus_space *bs = t; in awusbdrd_bs_wm_4()
353 intusb = MUSB2_READ_1(&sc->sc, MUSB2_REG_INTUSB); in awusbdrd_intr()
354 inttx = MUSB2_READ_2(&sc->sc, MUSB2_REG_INTTX); in awusbdrd_intr()
355 intrx = MUSB2_READ_2(&sc->sc, MUSB2_REG_INTRX); in awusbdrd_intr()
360 MUSB2_WRITE_1(&sc->sc, MUSB2_REG_INTUSB, intusb); in awusbdrd_intr()
362 MUSB2_WRITE_2(&sc->sc, MUSB2_REG_INTTX, inttx); in awusbdrd_intr()
364 MUSB2_WRITE_2(&sc->sc, MUSB2_REG_INTRX, intrx); in awusbdrd_intr()
375 if (ofw_bus_search_compatible(dev, compat_data)->ocd_data == 0) in awusbdrd_probe()
392 sc->flags = ofw_bus_search_compatible(dev, compat_data)->ocd_data; in awusbdrd_attach()
394 error = bus_alloc_resources(dev, awusbdrd_spec, sc->res); in awusbdrd_attach()
402 usb_mode[sizeof(usb_mode) - 1] = 0; in awusbdrd_attach()
411 * XXX phy has PHY_USB_MODE_OTG, but MUSB does not have in awusbdrd_attach()
413 * from phy layer (that detects them) to MUSB. in awusbdrd_attach()
424 error = clk_get_by_ofw_index(dev, 0, 0, &sc->clk); in awusbdrd_attach()
429 (void)hwreset_get_by_ofw_idx(dev, 0, 0, &sc->reset); in awusbdrd_attach()
432 error = clk_enable(sc->clk); in awusbdrd_attach()
437 if (sc->reset != NULL) { in awusbdrd_attach()
438 error = hwreset_deassert(sc->reset); in awusbdrd_attach()
440 device_printf(dev, "failed to de-assert reset: %d\n", in awusbdrd_attach()
447 (void)phy_get_by_ofw_name(dev, 0, "usb", &sc->phy); in awusbdrd_attach()
448 if (sc->phy != NULL) { in awusbdrd_attach()
449 device_printf(dev, "setting phy mode %d\n", phy_mode); in awusbdrd_attach()
451 error = phy_enable(sc->phy); in awusbdrd_attach()
453 device_printf(dev, "Could not enable phy\n"); in awusbdrd_attach()
457 error = phy_usb_set_mode(sc->phy, phy_mode); in awusbdrd_attach()
459 device_printf(dev, "Could not set phy mode\n"); in awusbdrd_attach()
464 sc->sc.sc_bus.parent = dev; in awusbdrd_attach()
465 sc->sc.sc_bus.devices = sc->sc.sc_devices; in awusbdrd_attach()
466 sc->sc.sc_bus.devices_max = MUSB2_MAX_DEVICES; in awusbdrd_attach()
467 sc->sc.sc_bus.dma_bits = 32; in awusbdrd_attach()
469 error = usb_bus_mem_alloc_all(&sc->sc.sc_bus, USB_GET_DMA_TAG(dev), in awusbdrd_attach()
477 sc->bs.bs_parent = rman_get_bustag(sc->res[0]); in awusbdrd_attach()
479 sc->bs.bs_cookie = rman_get_bustag(sc->res[0]); in awusbdrd_attach()
482 if ((sc->flags & AWUSB_NO_CONFDATA) == AWUSB_NO_CONFDATA) in awusbdrd_attach()
483 sc->bs.bs_r_1 = awusbdrd_bs_r_1_noconf; in awusbdrd_attach()
485 sc->bs.bs_r_1 = awusbdrd_bs_r_1; in awusbdrd_attach()
486 sc->bs.bs_r_2 = awusbdrd_bs_r_2; in awusbdrd_attach()
487 sc->bs.bs_w_1 = awusbdrd_bs_w_1; in awusbdrd_attach()
488 sc->bs.bs_w_2 = awusbdrd_bs_w_2; in awusbdrd_attach()
489 sc->bs.bs_rm_1 = awusbdrd_bs_rm_1; in awusbdrd_attach()
490 sc->bs.bs_rm_4 = awusbdrd_bs_rm_4; in awusbdrd_attach()
491 sc->bs.bs_wm_1 = awusbdrd_bs_wm_1; in awusbdrd_attach()
492 sc->bs.bs_wm_4 = awusbdrd_bs_wm_4; in awusbdrd_attach()
494 sc->sc.sc_io_tag = &sc->bs; in awusbdrd_attach()
495 sc->sc.sc_io_hdl = rman_get_bushandle(sc->res[0]); in awusbdrd_attach()
496 sc->sc.sc_io_size = rman_get_size(sc->res[0]); in awusbdrd_attach()
498 sc->sc.sc_bus.bdev = device_add_child(dev, "usbus", DEVICE_UNIT_ANY); in awusbdrd_attach()
499 if (sc->sc.sc_bus.bdev == NULL) { in awusbdrd_attach()
503 device_set_ivars(sc->sc.sc_bus.bdev, &sc->sc.sc_bus); in awusbdrd_attach()
504 sc->sc.sc_id = 0; in awusbdrd_attach()
505 sc->sc.sc_platform_data = sc; in awusbdrd_attach()
506 sc->sc.sc_mode = musb_mode; in awusbdrd_attach()
507 if (ofw_bus_is_compatible(dev, "allwinner,sun8i-h3-musb")) { in awusbdrd_attach()
508 sc->sc.sc_ep_cfg = musbotg_ep_allwinner_h3; in awusbdrd_attach()
509 sc->sc.sc_ep_max = DRD_EP_MAX_H3; in awusbdrd_attach()
511 sc->sc.sc_ep_cfg = musbotg_ep_allwinner; in awusbdrd_attach()
512 sc->sc.sc_ep_max = DRD_EP_MAX; in awusbdrd_attach()
515 error = bus_setup_intr(dev, sc->res[1], INTR_MPSAFE | INTR_TYPE_BIO, in awusbdrd_attach()
516 NULL, awusbdrd_intr, sc, &sc->sc.sc_intr_hdl); in awusbdrd_attach()
521 bus_write_1(sc->res[0], MUSB2_REG_AWIN_VEND0, VEND0_PIO_MODE); in awusbdrd_attach()
533 error = musbotg_init(&sc->sc); in awusbdrd_attach()
537 error = device_probe_and_attach(sc->sc.sc_bus.bdev); in awusbdrd_attach()
541 musbotg_vbus_interrupt(&sc->sc, 1); /* XXX VBUS */ in awusbdrd_attach()
546 if (sc->phy != NULL) { in awusbdrd_attach()
548 (void)phy_disable(sc->phy); in awusbdrd_attach()
549 phy_release(sc->phy); in awusbdrd_attach()
551 if (sc->reset != NULL) { in awusbdrd_attach()
552 hwreset_assert(sc->reset); in awusbdrd_attach()
553 hwreset_release(sc->reset); in awusbdrd_attach()
555 if (sc->clk != NULL) in awusbdrd_attach()
556 clk_release(sc->clk); in awusbdrd_attach()
557 bus_release_resources(dev, awusbdrd_spec, sc->res); in awusbdrd_attach()
573 musbotg_uninit(&sc->sc); in awusbdrd_detach()
574 error = bus_teardown_intr(dev, sc->res[1], sc->sc.sc_intr_hdl); in awusbdrd_detach()
578 usb_bus_mem_free_all(&sc->sc.sc_bus, NULL); in awusbdrd_detach()
580 if (sc->phy != NULL) { in awusbdrd_detach()
581 if (sc->sc.sc_mode == MUSB2_HOST_MODE) in awusbdrd_detach()
582 phy_disable(sc->phy); in awusbdrd_detach()
583 phy_release(sc->phy); in awusbdrd_detach()
585 if (sc->reset != NULL) { in awusbdrd_detach()
586 if (hwreset_assert(sc->reset) != 0) in awusbdrd_detach()
588 hwreset_release(sc->reset); in awusbdrd_detach()
590 if (sc->clk != NULL) in awusbdrd_detach()
591 clk_release(sc->clk); in awusbdrd_detach()
593 bus_release_resources(dev, awusbdrd_spec, sc->res); in awusbdrd_detach()