static int mtk_pinctrl_process_entry(device_t dev, struct mtk_pin_group *table, const char *group, char *func) { uint32_t val; int found = 0, i, j; for (i = 0; table[i].name != NULL; i++) { if (strcmp(table[i].name, group) == 0) { found = 1; break; } } if (!found) return (ENOENT); for (j = 0; j < table[i].funcnum; j++) { if (strcmp(table[i].functions[j].name, func) == 0) { val = mtk_sysctl_get(table[i].sysc_reg); val &= ~(table[i].mask << table[i].offset); val |= (table[i].functions[j].value << table[i].offset); mtk_sysctl_set(table[i].sysc_reg, val); return (0); } } return (ENOENT); }
static int mtk_pinctrl_attach(device_t dev) { if (device_get_unit(dev) != 0) { device_printf(dev, "Only one pin control allowed\n"); return (ENXIO); } if (bootverbose) device_printf(dev, "GPIO mode start: 0x%08x\n", mtk_sysctl_get(SYSCTL_GPIOMODE)); fdt_pinctrl_register(dev, NULL); fdt_pinctrl_configure_tree(dev); if (bootverbose) device_printf(dev, "GPIO mode end : 0x%08x\n", mtk_sysctl_get(SYSCTL_GPIOMODE)); return (0); }
static int mtk_usb_phy_attach(device_t dev) { struct mtk_usb_phy_softc * sc = device_get_softc(dev); phandle_t node; uint32_t val; int rid; sc->dev = dev; /* Get our FDT node and SoC id */ node = ofw_bus_get_node(dev); /* Now let's see about setting USB to host or device mode */ /* XXX: is it the same for all SoCs? */ val = mtk_sysctl_get(SYSCTL_SYSCFG1); if (OF_hasprop(node, "mtk,usb-device")) val &= ~SYSCFG1_USB_HOST_MODE; else val |= SYSCFG1_USB_HOST_MODE; mtk_sysctl_set(SYSCTL_SYSCFG1, val); /* If we have clocks defined - enable them */ if (OF_hasprop(node, "clocks")) fdt_clock_enable_all(dev); /* If we have resets defined - perform a reset sequence */ if (OF_hasprop(node, "resets")) { fdt_reset_assert_all(dev); DELAY(RESET_ASSERT_DELAY); fdt_reset_deassert_all(dev); DELAY(RESET_DEASSERT_DELAY); } /* Careful, some devices actually require resources */ if (OF_hasprop(node, "reg")) { rid = 0; sc->res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid, RF_ACTIVE); if (sc->res == NULL) { device_printf(dev, "could not map memory\n"); return (ENXIO); } } else { sc->res = NULL; } /* Some SoCs require specific USB PHY init... handle these */ switch (sc->socid) { case MTK_SOC_MT7628: /* Fallthrough */ case MTK_SOC_MT7688: if (sc->res == NULL) return (ENXIO); sc->fm_base = MT7628_FM_FEG_BASE; sc->u2_base = MT7628_U2_BASE; sc->sr_coef = MT7628_SR_COEF; mtk_usb_phy_mt7628_init(dev); break; case MTK_SOC_MT7621: if (sc->res == NULL) return (ENXIO); sc->fm_base = MT7621_FM_FEG_BASE; sc->u2_base = MT7621_U2_BASE; sc->sr_coef = MT7621_SR_COEF; mtk_usb_phy_mt7621_init(dev); break; } /* We no longer need the resources, release them */ if (sc->res != NULL) bus_release_resource(dev, SYS_RES_MEMORY, 0, sc->res); return (0); }