/* XXX 5422 not handled since its unknown how it handles this XXX*/ static void exynos_usb2_set_isolation(bool on) { uint32_t en_mask, regval; bus_addr_t reg; /* enable PHY */ reg = EXYNOS_PMU_USB_PHY_CTRL; if (IS_EXYNOS5_P() || IS_EXYNOS4410_P()) { /* set usbhost mode */ regval = on ? 0 : USB20_PHY_HOST_LINK_EN; bus_space_write_4(&armv7_generic_bs_tag, exynos_sysreg_bsh, EXYNOS5_SYSREG_USB20_PHY_TYPE, regval); reg = EXYNOS_PMU_USBHOST_PHY_CTRL; } /* do enable PHY */ en_mask = PMU_PHY_ENABLE; regval = bus_space_read_4(&armv7_generic_bs_tag, exynos_pmu_bsh, reg); regval = on ? regval & ~en_mask : regval | en_mask; bus_space_write_4(&armv7_generic_bs_tag, exynos_pmu_bsh, reg, regval); if (IS_EXYNOS4X12_P()) { bus_space_write_4(&armv7_generic_bs_tag, exynos_pmu_bsh, EXYNOS_PMU_USB_HSIC_1_PHY_CTRL, regval); bus_space_write_4(&armv7_generic_bs_tag, exynos_pmu_bsh, EXYNOS_PMU_USB_HSIC_2_PHY_CTRL, regval); } }
static void exyo_attach(device_t parent, device_t self, void *aux) { const struct exyo_locators *l = NULL; struct exyo_softc * const sc = &exyo_sc; prop_dictionary_t dict = device_properties(self); size_t nl = 0; sc->sc_dev = self; sc->sc_bst = &exynos_bs_tag; sc->sc_a4x_bst = &exynos_a4x_bs_tag; sc->sc_bsh = exynos_core_bsh; sc->sc_dmat = &exynos_bus_dma_tag; sc->sc_coherent_dmat = &exynos_coherent_bus_dma_tag; const uint16_t product_id = EXYNOS_PRODUCT_ID(exynos_soc_id); aprint_naive(": Exynos %x\n", product_id); aprint_normal(": Exynos %x\n", product_id); /* add sysctl nodes */ exynos_sysctl_cpufreq_init(); /* add all children */ #if defined(EXYNOS4) if (IS_EXYNOS4_P()) { l = exynos4_locinfo.locators; nl = exynos4_locinfo.nlocators; } #endif #if defined(EXYNOS5) if (IS_EXYNOS5_P()) { l = exynos5_locinfo.locators; nl = exynos5_locinfo.nlocators; } #endif KASSERT(l != NULL); KASSERT(nl > 0); for (const struct exyo_locators *loc = l; loc < l + nl; loc++) { char prop_name[31]; bool skip; if (loc->loc_port == EXYOCF_PORT_DEFAULT) { snprintf(prop_name, sizeof(prop_name), "no-%s", loc->loc_name); } else { snprintf(prop_name, sizeof(prop_name), "no-%s-%d", loc->loc_name, loc->loc_port); } if (prop_dictionary_get_bool(dict, prop_name, &skip) && skip) continue; struct exyo_attach_args exyo = { .exyo_loc = *loc, .exyo_core_bst = sc->sc_bst, .exyo_core_a4x_bst = sc->sc_a4x_bst, .exyo_core_bsh = sc->sc_bsh, .exyo_dmat = sc->sc_dmat, .exyo_coherent_dmat = sc->sc_coherent_dmat, }; cfdata_t cf = config_search_ia(exyo_find, sc->sc_dev, "exyo", &exyo); if (cf == NULL) { #ifdef EXYO_REQUIRED if (loc->loc_flags & EXYO_REQUIRED) panic("%s: failed to find %s!", __func__, loc->loc_name); #endif if (loc->loc_port == EXYOCF_PORT_DEFAULT) { aprint_verbose_dev(self, "%s not found\n", loc->loc_name); } else { aprint_verbose_dev(self, "%s%d not found\n", loc->loc_name, loc->loc_port); } continue; } config_attach(sc->sc_dev, cf, &exyo, exyo_print); } }