int lpc_early_init(const void *blob, int node, pci_dev_t dev) { struct reg_info { u32 base; u32 size; } values[4], *ptr; int count; int i; count = fdtdec_get_int_array_count(blob, node, "intel,gen-dec", (u32 *)values, sizeof(values) / sizeof(u32)); if (count < 0) return -EINVAL; /* Set COM1/COM2 decode range */ pci_write_config16(dev, LPC_IO_DEC, 0x0010); /* Enable PS/2 Keyboard/Mouse, EC areas and COM1 */ pci_write_config16(dev, LPC_EN, KBC_LPC_EN | MC_LPC_EN | GAMEL_LPC_EN | COMA_LPC_EN); /* Write all registers but use 0 if we run out of data */ count = count * sizeof(u32) / sizeof(values[0]); for (i = 0, ptr = values; i < ARRAY_SIZE(values); i++, ptr++) { u32 reg = 0; if (i < count) reg = ptr->base | PCI_COMMAND_IO | (ptr->size << 16); pci_write_config32(dev, LPC_GENX_DEC(i), reg); } return 0; }
static int rk3288_pinctrl_set_state(struct udevice *dev, struct udevice *config) { const void *blob = gd->fdt_blob; int pcfg_node, ret, flags, count, i; u32 cell[60], *ptr; debug("%s: %s %s\n", __func__, dev->name, config->name); ret = fdtdec_get_int_array_count(blob, config->of_offset, "rockchip,pins", cell, ARRAY_SIZE(cell)); if (ret < 0) { debug("%s: bad array %d\n", __func__, ret); return -EINVAL; } count = ret; for (i = 0, ptr = cell; i < count; i += 4, ptr += 4) { pcfg_node = fdt_node_offset_by_phandle(blob, ptr[3]); if (pcfg_node < 0) return -EINVAL; flags = pinctrl_decode_pin_config(blob, pcfg_node); if (flags < 0) return flags; ret = rk3288_pinctrl_set_pins(dev, ptr[0], ptr[1], ptr[2], flags); if (ret) return ret; } return 0; }
static int atmel_pinctrl_set_state(struct udevice *dev, struct udevice *config) { struct atmel_pio4_port *bank_base; const void *blob = gd->fdt_blob; int node = config->of_offset; u32 offset, func, bank, line; u32 cells[MAX_PINMUX_ENTRIES]; u32 i, conf; int count; conf = atmel_pinctrl_get_pinconf(blob, node); count = fdtdec_get_int_array_count(blob, node, "pinmux", cells, ARRAY_SIZE(cells)); if (count < 0) { printf("%s: bad pinmux array %d\n", __func__, count); return -EINVAL; } if (count > MAX_PINMUX_ENTRIES) { printf("%s: unsupported pinmux array count %d\n", __func__, count); return -EINVAL; } for (i = 0 ; i < count; i++) { offset = ATMEL_GET_PIN_NO(cells[i]); func = ATMEL_GET_PIN_FUNC(cells[i]); bank = ATMEL_PIO_BANK(offset); line = ATMEL_PIO_LINE(offset); bank_base = atmel_pio4_bank_base(dev, bank); writel(BIT(line), &bank_base->mskr); conf &= (~ATMEL_PIO_CFGR_FUNC_MASK); conf |= (func & ATMEL_PIO_CFGR_FUNC_MASK); writel(conf, &bank_base->cfgr); } return 0; }
/** * lpc_early_init() - set up LPC serial ports and other early things * * @dev: LPC device * @return 0 if OK, -ve on error */ static int lpc_early_init(struct udevice *dev) { struct reg_info { u32 base; u32 size; } values[4], *ptr; int count; int i; count = fdtdec_get_int_array_count(gd->fdt_blob, dev->of_offset, "intel,gen-dec", (u32 *)values, sizeof(values) / sizeof(u32)); if (count < 0) return -EINVAL; /* Set COM1/COM2 decode range */ dm_pci_write_config16(dev->parent, LPC_IO_DEC, 0x0010); /* Enable PS/2 Keyboard/Mouse, EC areas and COM1 */ dm_pci_write_config16(dev->parent, LPC_EN, KBC_LPC_EN | MC_LPC_EN | GAMEL_LPC_EN | COMA_LPC_EN); /* Write all registers but use 0 if we run out of data */ count = count * sizeof(u32) / sizeof(values[0]); for (i = 0, ptr = values; i < ARRAY_SIZE(values); i++, ptr++) { u32 reg = 0; if (i < count) reg = ptr->base | PCI_COMMAND_IO | (ptr->size << 16); dm_pci_write_config32(dev->parent, LPC_GENX_DEC(i), reg); } enable_spi_prefetch(dev->parent); /* This is already done in start.S, but let's do it in C */ enable_port80_on_lpc(dev->parent); set_spi_speed(); return 0; }