static int rkclk_set_pll(struct rk3036_cru *cru, enum rk_clk_id clk_id, const struct pll_div *div) { int pll_id = rk_pll_id(clk_id); struct rk3036_pll *pll = &cru->pll[pll_id]; /* All PLLs have same VCO and output frequency range restrictions. */ uint vco_hz = OSC_HZ / 1000 * div->fbdiv / div->refdiv * 1000; uint output_hz = vco_hz / div->postdiv1 / div->postdiv2; debug("PLL at %p: fbdiv=%d, refdiv=%d, postdiv1=%d, postdiv2=%d,\ vco=%u Hz, output=%u Hz\n", pll, div->fbdiv, div->refdiv, div->postdiv1, div->postdiv2, vco_hz, output_hz); assert(vco_hz >= VCO_MIN_HZ && vco_hz <= VCO_MAX_HZ && output_hz >= OUTPUT_MIN_HZ && output_hz <= OUTPUT_MAX_HZ); /* use integer mode */ rk_setreg(&pll->con1, 1 << PLL_DSMPD_SHIFT); rk_clrsetreg(&pll->con0, PLL_POSTDIV1_MASK | PLL_FBDIV_MASK, (div->postdiv1 << PLL_POSTDIV1_SHIFT) | div->fbdiv); rk_clrsetreg(&pll->con1, PLL_POSTDIV2_MASK | PLL_REFDIV_MASK, (div->postdiv2 << PLL_POSTDIV2_SHIFT | div->refdiv << PLL_REFDIV_SHIFT)); /* waiting for pll lock */ while (readl(&pll->con1) & (1 << PLL_LOCK_STATUS_SHIFT)) udelay(1); return 0; }
void board_debug_uart_init(void) { #define GRF_BASE 0x11000000 static struct rk322x_grf * const grf = (void *)GRF_BASE; enum { GPIO1B2_SHIFT = 4, GPIO1B2_MASK = 3 << GPIO1B2_SHIFT, GPIO1B2_GPIO = 0, GPIO1B2_UART1_SIN, GPIO1B2_UART21_SIN, GPIO1B1_SHIFT = 2, GPIO1B1_MASK = 3 << GPIO1B1_SHIFT, GPIO1B1_GPIO = 0, GPIO1B1_UART1_SOUT, GPIO1B1_UART21_SOUT, }; enum { CON_IOMUX_UART2SEL_SHIFT = 8, CON_IOMUX_UART2SEL_MASK = 1 << CON_IOMUX_UART2SEL_SHIFT, CON_IOMUX_UART2SEL_2 = 0, CON_IOMUX_UART2SEL_21, }; /* Enable early UART2 channel 1 on the RK322x */ rk_clrsetreg(&grf->gpio1b_iomux, GPIO1B1_MASK | GPIO1B2_MASK, GPIO1B2_UART21_SIN << GPIO1B2_SHIFT | GPIO1B1_UART21_SOUT << GPIO1B1_SHIFT); /* Set channel C as UART2 input */ rk_clrsetreg(&grf->con_iomux, CON_IOMUX_UART2SEL_MASK, CON_IOMUX_UART2SEL_21 << CON_IOMUX_UART2SEL_SHIFT); }
static void pinctrl_rk3036_sdmmc_config(struct rk3036_grf *grf, int mmc_id) { switch (mmc_id) { case PERIPH_ID_EMMC: rk_clrsetreg(&grf->gpio1d_iomux, 0xffff, GPIO1D7_EMMC_D7 << GPIO1D7_SHIFT | GPIO1D6_EMMC_D6 << GPIO1D6_SHIFT | GPIO1D5_EMMC_D5 << GPIO1D5_SHIFT | GPIO1D4_EMMC_D4 << GPIO1D4_SHIFT | GPIO1D3_EMMC_D3 << GPIO1D3_SHIFT | GPIO1D2_EMMC_D2 << GPIO1D2_SHIFT | GPIO1D1_EMMC_D1 << GPIO1D1_SHIFT | GPIO1D0_EMMC_D0 << GPIO1D0_SHIFT); rk_clrsetreg(&grf->gpio2a_iomux, GPIO2A4_MASK << GPIO2A4_SHIFT | GPIO2A1_MASK << GPIO2A1_SHIFT, GPIO2A4_EMMC_CMD << GPIO2A4_SHIFT | GPIO2A1_EMMC_CLKOUT << GPIO2A1_SHIFT); break; case PERIPH_ID_SDCARD: rk_clrsetreg(&grf->gpio1c_iomux, 0xffff, GPIO1C5_MMC0_D3 << GPIO1C5_SHIFT | GPIO1C4_MMC0_D2 << GPIO1C4_SHIFT | GPIO1C3_MMC0_D1 << GPIO1C3_SHIFT | GPIO1C2_MMC0_D0 << GPIO1C2_SHIFT | GPIO1C1_MMC0_DETN << GPIO1C1_SHIFT | GPIO1C0_MMC0_CLKOUT << GPIO1C0_SHIFT); break; } }
static int rkclk_set_pll(struct rk3288_cru *cru, enum rk_clk_id clk_id, const struct pll_div *div) { int pll_id = rk_pll_id(clk_id); struct rk3288_pll *pll = &cru->pll[pll_id]; /* All PLLs have same VCO and output frequency range restrictions. */ uint vco_hz = OSC_HZ / 1000 * div->nf / div->nr * 1000; uint output_hz = vco_hz / div->no; debug("PLL at %x: nf=%d, nr=%d, no=%d, vco=%u Hz, output=%u Hz\n", (uint)pll, div->nf, div->nr, div->no, vco_hz, output_hz); assert(vco_hz >= VCO_MIN_HZ && vco_hz <= VCO_MAX_HZ && output_hz >= OUTPUT_MIN_HZ && output_hz <= OUTPUT_MAX_HZ && (div->no == 1 || !(div->no % 2))); /* enter reset */ rk_setreg(&pll->con3, 1 << PLL_RESET_SHIFT); rk_clrsetreg(&pll->con0, CLKR_MASK << CLKR_SHIFT | PLL_OD_MASK, ((div->nr - 1) << CLKR_SHIFT) | (div->no - 1)); rk_clrsetreg(&pll->con1, CLKF_MASK, div->nf - 1); rk_clrsetreg(&pll->con2, PLL_BWADJ_MASK, (div->nf >> 1) - 1); udelay(10); /* return from reset */ rk_clrreg(&pll->con3, 1 << PLL_RESET_SHIFT); return 0; }
static void pinctrl_rk3036_i2c_config(struct rk3036_grf *grf, int i2c_id) { switch (i2c_id) { case PERIPH_ID_I2C0: rk_clrsetreg(&grf->gpio0a_iomux, GPIO0A1_MASK << GPIO0A1_SHIFT | GPIO0A0_MASK << GPIO0A0_SHIFT, GPIO0A1_I2C0_SDA << GPIO0A1_SHIFT | GPIO0A0_I2C0_SCL << GPIO0A0_SHIFT); break; case PERIPH_ID_I2C1: rk_clrsetreg(&grf->gpio0a_iomux, GPIO0A3_MASK << GPIO0A3_SHIFT | GPIO0A2_MASK << GPIO0A2_SHIFT, GPIO0A3_I2C1_SDA << GPIO0A3_SHIFT | GPIO0A2_I2C1_SCL << GPIO0A2_SHIFT); break; case PERIPH_ID_I2C2: rk_clrsetreg(&grf->gpio2c_iomux, GPIO2C5_MASK << GPIO2C5_SHIFT | GPIO2C4_MASK << GPIO2C4_SHIFT, GPIO2C5_I2C2_SCL << GPIO2C5_SHIFT | GPIO2C4_I2C2_SDA << GPIO2C4_SHIFT); break; } }
void board_debug_uart_init(void) { #define GRF_BASE 0xff770000 struct rk3399_grf_regs * const grf = (void *)GRF_BASE; #if defined(CONFIG_DEBUG_UART_BASE) && (CONFIG_DEBUG_UART_BASE == 0xff180000) /* Enable early UART0 on the RK3399 */ rk_clrsetreg(&grf->gpio2c_iomux, GRF_GPIO2C0_SEL_MASK, GRF_UART0BT_SIN << GRF_GPIO2C0_SEL_SHIFT); rk_clrsetreg(&grf->gpio2c_iomux, GRF_GPIO2C1_SEL_MASK, GRF_UART0BT_SOUT << GRF_GPIO2C1_SEL_SHIFT); #else /* Enable early UART2 channel C on the RK3399 */ rk_clrsetreg(&grf->gpio4c_iomux, GRF_GPIO4C3_SEL_MASK, GRF_UART2DGBC_SIN << GRF_GPIO4C3_SEL_SHIFT); rk_clrsetreg(&grf->gpio4c_iomux, GRF_GPIO4C4_SEL_MASK, GRF_UART2DBGC_SOUT << GRF_GPIO4C4_SEL_SHIFT); /* Set channel C as UART2 input */ rk_clrsetreg(&grf->soc_con7, GRF_UART_DBG_SEL_MASK, GRF_UART_DBG_SEL_C << GRF_UART_DBG_SEL_SHIFT); #endif }
static void pinctrl_rk3188_sdmmc_config(struct rk3188_grf *grf, int mmc_id) { switch (mmc_id) { case PERIPH_ID_EMMC: rk_clrsetreg(&grf->soc_con0, 1 << EMMC_FLASH_SEL_SHIFT, 1 << EMMC_FLASH_SEL_SHIFT); rk_clrsetreg(&grf->gpio0d_iomux, GPIO0D2_MASK << GPIO0D2_SHIFT | GPIO0D0_MASK << GPIO0D0_SHIFT, GPIO0D2_EMMC_CMD << GPIO0D2_SHIFT | GPIO0D0_EMMC_CLKOUT << GPIO0D0_SHIFT); break; case PERIPH_ID_SDCARD: rk_clrsetreg(&grf->gpio3b_iomux, GPIO3B0_MASK << GPIO3B0_SHIFT, GPIO3B0_SDMMC_DETECT_N << GPIO3B0_SHIFT); rk_clrsetreg(&grf->gpio3a_iomux, GPIO3A7_MASK << GPIO3A7_SHIFT | GPIO3A6_MASK << GPIO3A6_SHIFT | GPIO3A5_MASK << GPIO3A5_SHIFT | GPIO3A4_MASK << GPIO3A4_SHIFT | GPIO3A3_MASK << GPIO3A3_SHIFT | GPIO3A3_MASK << GPIO3A2_SHIFT, GPIO3A7_SDMMC0_DATA3 << GPIO3A7_SHIFT | GPIO3A6_SDMMC0_DATA2 << GPIO3A6_SHIFT | GPIO3A5_SDMMC0_DATA1 << GPIO3A5_SHIFT | GPIO3A4_SDMMC0_DATA0 << GPIO3A4_SHIFT | GPIO3A3_SDMMC0_CMD << GPIO3A3_SHIFT | GPIO3A2_SDMMC0_CLKOUT << GPIO3A2_SHIFT); break; default: debug("mmc id = %d iomux error!\n", mmc_id); break; } }
static void pinctrl_rv1108_uart_config(struct rv1108_grf *grf, int uart_id) { switch (uart_id) { case PERIPH_ID_UART0: rk_clrsetreg(&grf->gpio3a_iomux, GPIO3A6_MASK | GPIO3A5_MASK, GPIO3A6_UART1_SOUT << GPIO3A6_SHIFT | GPIO3A5_UART1_SIN << GPIO3A5_SHIFT); break; case PERIPH_ID_UART1: rk_clrsetreg(&grf->gpio1d_iomux, GPIO1D3_MASK | GPIO1D2_MASK | GPIO1D1_MASK | GPIO1D0_MASK, GPIO1D3_UART0_SOUT << GPIO1D3_SHIFT | GPIO1D2_UART0_SIN << GPIO1D2_SHIFT | GPIO1D1_UART0_RTSN << GPIO1D1_SHIFT | GPIO1D0_UART0_CTSN << GPIO1D0_SHIFT); break; case PERIPH_ID_UART2: rk_clrsetreg(&grf->gpio2d_iomux, GPIO2D2_MASK | GPIO2D1_MASK, GPIO2D2_UART2_SOUT_M0 << GPIO2D2_SHIFT | GPIO2D1_UART2_SIN_M0 << GPIO2D1_SHIFT); break; } }
static void pinctrl_rk322x_uart_config(struct rk322x_grf *grf, int uart_id) { u32 mux_con = readl(&grf->con_iomux); switch (uart_id) { case PERIPH_ID_UART1: if (!(mux_con & CON_IOMUX_UART1SEL_MASK)) rk_clrsetreg(&grf->gpio1b_iomux, GPIO1B1_MASK | GPIO1B2_MASK, GPIO1B1_UART1_SOUT << GPIO1B1_SHIFT | GPIO1B2_UART1_SIN << GPIO1B2_SHIFT); break; case PERIPH_ID_UART2: if (mux_con & CON_IOMUX_UART2SEL_MASK) rk_clrsetreg(&grf->gpio1b_iomux, GPIO1B1_MASK | GPIO1B2_MASK, GPIO1B1_UART21_SOUT << GPIO1B1_SHIFT | GPIO1B2_UART21_SIN << GPIO1B2_SHIFT); else rk_clrsetreg(&grf->gpio1c_iomux, GPIO1C3_MASK | GPIO1C2_MASK, GPIO1C3_UART2_SIN << GPIO1C3_SHIFT | GPIO1C2_UART2_SOUT << GPIO1C2_SHIFT); break; } }
static void pinctrl_rk3036_uart_config(struct rk3036_grf *grf, int uart_id) { switch (uart_id) { case PERIPH_ID_UART0: rk_clrsetreg(&grf->gpio0c_iomux, GPIO0C3_MASK << GPIO0C3_SHIFT | GPIO0C2_MASK << GPIO0C2_SHIFT | GPIO0C1_MASK << GPIO0C1_SHIFT | GPIO0C0_MASK << GPIO0C0_SHIFT, GPIO0C3_UART0_CTSN << GPIO0C3_SHIFT | GPIO0C2_UART0_RTSN << GPIO0C2_SHIFT | GPIO0C1_UART0_SIN << GPIO0C1_SHIFT | GPIO0C0_UART0_SOUT << GPIO0C0_SHIFT); break; case PERIPH_ID_UART1: rk_clrsetreg(&grf->gpio2c_iomux, GPIO2C7_MASK << GPIO2C7_SHIFT | GPIO2C6_MASK << GPIO2C6_SHIFT, GPIO2C7_UART1_SOUT << GPIO2C7_SHIFT | GPIO2C6_UART1_SIN << GPIO2C6_SHIFT); break; case PERIPH_ID_UART2: rk_clrsetreg(&grf->gpio1c_iomux, GPIO1C3_MASK << GPIO1C3_SHIFT | GPIO1C2_MASK << GPIO1C2_SHIFT, GPIO1C3_UART2_SOUT << GPIO1C3_SHIFT | GPIO1C2_UART2_SIN << GPIO1C2_SHIFT); break; } }
static void pinctrl_rk3188_i2c_config(struct rk3188_grf *grf, struct rk3188_pmu *pmu, int i2c_id) { switch (i2c_id) { case PERIPH_ID_I2C0: rk_clrsetreg(&grf->gpio1d_iomux, GPIO1D1_MASK << GPIO1D1_SHIFT | GPIO1D0_MASK << GPIO1D0_SHIFT, GPIO1D1_I2C0_SCL << GPIO1D1_SHIFT | GPIO1D0_I2C0_SDA << GPIO1D0_SHIFT); /* enable new i2c controller */ rk_clrsetreg(&grf->soc_con1, 1 << RKI2C0_SEL_SHIFT, 1 << RKI2C0_SEL_SHIFT); break; case PERIPH_ID_I2C1: rk_clrsetreg(&grf->gpio1d_iomux, GPIO1D3_MASK << GPIO1D3_SHIFT | GPIO1D2_MASK << GPIO1D2_SHIFT, GPIO1D3_I2C1_SCL << GPIO1D2_SHIFT | GPIO1D2_I2C1_SDA << GPIO1D2_SHIFT); rk_clrsetreg(&grf->soc_con1, 1 << RKI2C1_SEL_SHIFT, 1 << RKI2C1_SEL_SHIFT); break; case PERIPH_ID_I2C2: rk_clrsetreg(&grf->gpio1d_iomux, GPIO1D5_MASK << GPIO1D5_SHIFT | GPIO1D4_MASK << GPIO1D4_SHIFT, GPIO1D5_I2C2_SCL << GPIO1D5_SHIFT | GPIO1D4_I2C2_SDA << GPIO1D4_SHIFT); rk_clrsetreg(&grf->soc_con1, 1 << RKI2C2_SEL_SHIFT, 1 << RKI2C2_SEL_SHIFT); break; case PERIPH_ID_I2C3: rk_clrsetreg(&grf->gpio3b_iomux, GPIO3B7_MASK << GPIO3B7_SHIFT | GPIO3B6_MASK << GPIO3B6_SHIFT, GPIO3B7_I2C3_SCL << GPIO3B7_SHIFT | GPIO3B6_I2C3_SDA << GPIO3B6_SHIFT); rk_clrsetreg(&grf->soc_con1, 1 << RKI2C3_SEL_SHIFT, 1 << RKI2C3_SEL_SHIFT); break; case PERIPH_ID_I2C4: rk_clrsetreg(&grf->gpio1d_iomux, GPIO1D7_MASK << GPIO1D7_SHIFT | GPIO1D6_MASK << GPIO1D6_SHIFT, GPIO1D7_I2C4_SCL << GPIO1D7_SHIFT | GPIO1D6_I2C4_SDA << GPIO1D6_SHIFT); rk_clrsetreg(&grf->soc_con1, 1 << RKI2C4_SEL_SHIFT, 1 << RKI2C4_SEL_SHIFT); break; default: debug("i2c id = %d iomux error!\n", i2c_id); break; } }
static void pinctrl_rv1108_sfc_config(struct rv1108_grf *grf) { rk_clrsetreg(&grf->gpio2a_iomux, GPIO2A3_MASK | GPIO2A2_MASK | GPIO2A1_MASK | GPIO2A0_MASK, GPIO2A3_SFC_HOLD_IO3 << GPIO2A3_SHIFT | GPIO2A2_SFC_WP_IO2 << GPIO2A2_SHIFT | GPIO2A1_SFC_SO_IO1 << GPIO2A1_SHIFT | GPIO2A0_SFC_SI_IO0 << GPIO2A0_SHIFT); rk_clrsetreg(&grf->gpio2b_iomux, GPIO2B7_MASK | GPIO2B4_MASK, GPIO2B7_SFC_CLK << GPIO2B7_SHIFT | GPIO2B4_SFC_CSN0 << GPIO2B4_SHIFT); }
static void pinctrl_rk3288_hdmi_config(struct rk3288_grf *grf, int hdmi_id) { switch (hdmi_id) { case PERIPH_ID_HDMI: rk_clrsetreg(&grf->gpio7cl_iomux, GPIO7C3_MASK << GPIO7C3_SHIFT, GPIO7C3_EDPHDMII2C_SDA << GPIO7C3_SHIFT); rk_clrsetreg(&grf->gpio7ch_iomux, GPIO7C4_MASK << GPIO7C4_SHIFT, GPIO7C4_EDPHDMII2C_SCL << GPIO7C4_SHIFT); break; default: debug("hdmi id = %d iomux error!\n", hdmi_id); break; } }
static int rk3188_pinctrl_set_pins(struct udevice *dev, int banknum, int index, int muxval, int flags) { struct rk3188_pinctrl_priv *priv = dev_get_priv(dev); uint shift, ind = index; uint mask; u32 *addr; int ret; debug("%s: %x %x %x %x\n", __func__, banknum, index, muxval, flags); ret = rk3188_pinctrl_get_pin_info(priv, banknum, index, &addr, &shift, &mask); if (ret) return ret; rk_clrsetreg(addr, mask << shift, muxval << shift); /* Handle pullup/pulldown */ if (flags) { uint val = 0; if (flags & (1 << PIN_CONFIG_BIAS_PULL_UP)) val = 1; else if (flags & (1 << PIN_CONFIG_BIAS_PULL_DOWN)) val = 2; ind = index >> 3; if (banknum == 0 && index < 12) { addr = &priv->pmu->gpio0_p[ind]; shift = (index & 7) * 2; } else if (banknum == 0 && index >= 12) { addr = &priv->grf->gpio0_p[ind - 1]; /* * The bits in the grf-registers have an inverse * ordering with the lowest pin being in bits 15:14 * and the highest pin in bits 1:0 . */ shift = (7 - (index & 7)) * 2; } else { addr = &priv->grf->gpio1_p[banknum - 1][ind]; shift = (7 - (index & 7)) * 2; } debug("%s: addr=%p, val=%x, shift=%x\n", __func__, addr, val, shift); rk_clrsetreg(addr, 3 << shift, val << shift); } return 0; }
static void pinctrl_rk3188_uart_config(struct rk3188_grf *grf, int uart_id) { switch (uart_id) { case PERIPH_ID_UART0: rk_clrsetreg(&grf->gpio1a_iomux, GPIO1A3_MASK << GPIO1A3_SHIFT | GPIO1A2_MASK << GPIO1A2_SHIFT | GPIO1A1_MASK << GPIO1A1_SHIFT | GPIO1A0_MASK << GPIO1A0_SHIFT, GPIO1A3_UART0_RTS_N << GPIO1A3_SHIFT | GPIO1A2_UART0_CTS_N << GPIO1A2_SHIFT | GPIO1A1_UART0_SOUT << GPIO1A1_SHIFT | GPIO1A0_UART0_SIN << GPIO1A0_SHIFT); break; case PERIPH_ID_UART1: rk_clrsetreg(&grf->gpio1a_iomux, GPIO1A7_MASK << GPIO1A7_SHIFT | GPIO1A6_MASK << GPIO1A6_SHIFT | GPIO1A5_MASK << GPIO1A5_SHIFT | GPIO1A4_MASK << GPIO1A4_SHIFT, GPIO1A7_UART1_RTS_N << GPIO1A7_SHIFT | GPIO1A6_UART1_CTS_N << GPIO1A6_SHIFT | GPIO1A5_UART1_SOUT << GPIO1A5_SHIFT | GPIO1A4_UART1_SIN << GPIO1A4_SHIFT); break; case PERIPH_ID_UART2: rk_clrsetreg(&grf->gpio1b_iomux, GPIO1B1_MASK << GPIO1B1_SHIFT | GPIO1B0_MASK << GPIO1B0_SHIFT, GPIO1B1_UART2_SOUT << GPIO1B1_SHIFT | GPIO1B0_UART2_SIN << GPIO1B0_SHIFT); break; case PERIPH_ID_UART3: rk_clrsetreg(&grf->gpio1b_iomux, GPIO1B5_MASK << GPIO1B5_SHIFT | GPIO1B4_MASK << GPIO1B4_SHIFT | GPIO1B3_MASK << GPIO1B3_SHIFT | GPIO1B2_MASK << GPIO1B2_SHIFT, GPIO1B5_UART3_RTS_N << GPIO1B5_SHIFT | GPIO1B4_UART3_CTS_N << GPIO1B4_SHIFT | GPIO1B3_UART3_SOUT << GPIO1B3_SHIFT | GPIO1B2_UART3_SIN << GPIO1B2_SHIFT); break; default: debug("uart id = %d iomux error!\n", uart_id); break; } }
void board_init_f(ulong dummy) { struct udevice *pinctrl; struct udevice *dev; struct rk3399_pmusgrf_regs *sgrf; struct rk3399_grf_regs *grf; int ret; #define EARLY_UART #ifdef EARLY_UART /* * Debug UART can be used from here if required: * * debug_uart_init(); * printch('a'); * printhex8(0x1234); * printascii("string"); */ debug_uart_init(); printascii("U-Boot SPL board init"); #endif ret = spl_early_init(); if (ret) { debug("spl_early_init() failed: %d\n", ret); hang(); } /* * Disable DDR and SRAM security regions. * * As we are entered from the BootROM, the region from * 0x0 through 0xfffff (i.e. the first MB of memory) will * be protected. This will cause issues with the DW_MMC * driver, which tries to DMA from/to the stack (likely) * located in this range. */ sgrf = syscon_get_first_range(ROCKCHIP_SYSCON_PMUSGRF); rk_clrsetreg(&sgrf->ddr_rgn_con[16], 0x1ff, 0); rk_clrreg(&sgrf->slv_secure_con4, 0x2000); /* eMMC clock generator: disable the clock multipilier */ grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); rk_clrreg(&grf->emmccore_con[11], 0x0ff); secure_timer_init(); ret = uclass_get_device(UCLASS_PINCTRL, 0, &pinctrl); if (ret) { debug("Pinctrl init failed: %d\n", ret); return; } ret = uclass_get_device(UCLASS_RAM, 0, &dev); if (ret) { debug("DRAM init failed: %d\n", ret); return; } }
static void pinctrl_rk322x_spi_config(struct rk322x_grf *grf, int cs) { switch (cs) { case 0: rk_clrsetreg(&grf->gpio0b_iomux, GPIO0B6_MASK, GPIO0B6_SPI_CSN0 << GPIO0B6_SHIFT); break; case 1: rk_clrsetreg(&grf->gpio1b_iomux, GPIO1B4_MASK, GPIO1B4_SPI_CSN1 << GPIO1B4_SHIFT); break; } rk_clrsetreg(&grf->gpio0b_iomux, GPIO0B1_MASK | GPIO0B3_MASK | GPIO0B5_MASK, GPIO0B5_SPI_RXD << GPIO0B5_SHIFT | GPIO0B3_SPI_TXD << GPIO0B3_SHIFT | GPIO0B1_SPI_CLK << GPIO0B1_SHIFT); }
static void pinctrl_rv1108_gmac_config(struct rv1108_grf *grf, int func) { rk_clrsetreg(&grf->gpio1b_iomux, GPIO1B7_MASK | GPIO1B6_MASK | GPIO1B5_MASK | GPIO1B4_MASK | GPIO1B3_MASK | GPIO1B2_MASK, GPIO1B7_GMAC_RXDV << GPIO1B7_SHIFT | GPIO1B6_GMAC_RXD1 << GPIO1B6_SHIFT | GPIO1B5_GMAC_RXD0 << GPIO1B5_SHIFT | GPIO1B4_GMAC_TXEN << GPIO1B4_SHIFT | GPIO1B3_GMAC_TXD1 << GPIO1B3_SHIFT | GPIO1B2_GMAC_TXD0 << GPIO1B2_SHIFT); rk_clrsetreg(&grf->gpio1c_iomux, GPIO1C5_MASK | GPIO1C4_MASK | GPIO1C3_MASK | GPIO1C2_MASK, GPIO1C5_GMAC_CLK << GPIO1C5_SHIFT | GPIO1C4_GMAC_MDC << GPIO1C4_SHIFT | GPIO1C3_GMAC_MDIO << GPIO1C3_SHIFT | GPIO1C2_GMAC_RXER << GPIO1C2_SHIFT); writel(0xffff57f5, &grf->gpio1b_drv); }
static ulong rockchip_mmc_set_clk(struct rk3036_cru *cru, uint clk_general_rate, int periph, uint freq) { int src_clk_div; int mux; debug("%s: clk_general_rate=%u\n", __func__, clk_general_rate); /* mmc clock auto divide 2 in internal */ src_clk_div = DIV_ROUND_UP(clk_general_rate / 2, freq); if (src_clk_div > 128) { src_clk_div = DIV_ROUND_UP(OSC_HZ / 2, freq); assert(src_clk_div - 1 < 128); mux = EMMC_SEL_24M; } else { mux = EMMC_SEL_GPLL; } switch (periph) { case HCLK_EMMC: case SCLK_EMMC: rk_clrsetreg(&cru->cru_clksel_con[12], EMMC_PLL_MASK | EMMC_DIV_MASK, mux << EMMC_PLL_SHIFT | (src_clk_div - 1) << EMMC_DIV_SHIFT); break; case HCLK_SDIO: case SCLK_SDIO: rk_clrsetreg(&cru->cru_clksel_con[11], MMC0_PLL_MASK | MMC0_DIV_MASK, mux << MMC0_PLL_SHIFT | (src_clk_div - 1) << MMC0_DIV_SHIFT); break; default: return -EINVAL; } return rockchip_mmc_get_clk(cru, clk_general_rate, periph); }
void board_init_f(ulong dummy) { /* Example code showing how to enable the debug UART on RK3188 */ #ifdef EARLY_UART #include <asm/arch/grf_rk3188.h> /* Enable early UART on the RK3188 */ #define GRF_BASE 0x20008000 struct rk3188_grf * const grf = (void *)GRF_BASE; rk_clrsetreg(&grf->gpio1b_iomux, GPIO1B1_MASK << GPIO1B1_SHIFT | GPIO1B0_MASK << GPIO1B0_SHIFT, GPIO1B1_UART2_SOUT << GPIO1B1_SHIFT | GPIO1B0_UART2_SIN << GPIO1B0_SHIFT); /* * Debug UART can be used from here if required: * * debug_uart_init(); * printch('a'); * printhex8(0x1234); * printascii("string"); */ debug_uart_init(); printch('t'); printch('p'); printch('l'); printch('-'); printch(rk3188_num_entries + 1 + '0'); printch('\n'); #endif rk3188_num_entries++; if (rk3188_num_entries == 1) { /* * The original loader did some very basic integrity * checking at this point, but the remaining few bytes * could be used for any improvement making sense * really early on. */ back_to_bootrom(); } else { /* * TPL part of the loader should now wait for us * at offset 0xC00 in the sram. Should never return * from there. */ jump_to_spl(); } }
static int pinctrl_rk3188_spi_config(struct rk3188_grf *grf, enum periph_id spi_id, int cs) { switch (spi_id) { case PERIPH_ID_SPI0: switch (cs) { case 0: rk_clrsetreg(&grf->gpio1a_iomux, GPIO1A7_MASK << GPIO1A7_SHIFT, GPIO1A7_SPI0_CSN0 << GPIO1A7_SHIFT); break; case 1: rk_clrsetreg(&grf->gpio1b_iomux, GPIO1B7_MASK << GPIO1B7_SHIFT, GPIO1B7_SPI0_CSN1 << GPIO1B7_SHIFT); break; default: goto err; } rk_clrsetreg(&grf->gpio1a_iomux, GPIO1A4_MASK << GPIO1A4_SHIFT | GPIO1A5_MASK << GPIO1A5_SHIFT | GPIO1A6_MASK << GPIO1A6_SHIFT, GPIO1A4_SPI0_RXD << GPIO1A4_SHIFT | GPIO1A5_SPI0_TXD << GPIO1A5_SHIFT | GPIO1A6_SPI0_CLK << GPIO1A6_SHIFT); break; case PERIPH_ID_SPI1: switch (cs) { case 0: rk_clrsetreg(&grf->gpio0d_iomux, GPIO0D7_MASK << GPIO0D7_SHIFT, GPIO0D7_SPI1_CSN0 << GPIO0D7_SHIFT); break; case 1: rk_clrsetreg(&grf->gpio1b_iomux, GPIO1B6_MASK << GPIO1B6_SHIFT, GPIO1B6_SPI1_CSN1 << GPIO1B6_SHIFT); break; default: goto err; } rk_clrsetreg(&grf->gpio0d_iomux, GPIO0D4_MASK << GPIO0D4_SHIFT | GPIO0D5_MASK << GPIO0D5_SHIFT | GPIO0D6_MASK << GPIO0D6_SHIFT, GPIO0D4_SPI0_RXD << GPIO0D4_SHIFT | GPIO0D5_SPI1_TXD << GPIO0D5_SHIFT | GPIO0D6_SPI1_CLK << GPIO0D6_SHIFT); break; default: goto err; } return 0; err: debug("rkspi: periph%d cs=%d not supported", spi_id, cs); return -ENOENT; }
static void pinctrl_rk322x_sdmmc_config(struct rk322x_grf *grf, int mmc_id) { switch (mmc_id) { case PERIPH_ID_EMMC: rk_clrsetreg(&grf->gpio1d_iomux, 0xffff, GPIO1D7_EMMC_D7 << GPIO1D7_SHIFT | GPIO1D6_EMMC_D6 << GPIO1D6_SHIFT | GPIO1D5_EMMC_D5 << GPIO1D5_SHIFT | GPIO1D4_EMMC_D4 << GPIO1D4_SHIFT | GPIO1D3_EMMC_D3 << GPIO1D3_SHIFT | GPIO1D2_EMMC_D2 << GPIO1D2_SHIFT | GPIO1D1_EMMC_D1 << GPIO1D1_SHIFT | GPIO1D0_EMMC_D0 << GPIO1D0_SHIFT); rk_clrsetreg(&grf->gpio2a_iomux, GPIO2A5_MASK | GPIO2A7_MASK, GPIO2A5_EMMC_PWREN << GPIO2A5_SHIFT | GPIO2A7_EMMC_CLKOUT << GPIO2A7_SHIFT); rk_clrsetreg(&grf->gpio1c_iomux, GPIO1C6_MASK | GPIO1C7_MASK, GPIO1C6_EMMC_CMD << GPIO1C6_SHIFT | GPIO1C7_EMMC_RSTNOUT << GPIO1C6_SHIFT); break; case PERIPH_ID_SDCARD: rk_clrsetreg(&grf->gpio1b_iomux, GPIO1B6_MASK | GPIO1B7_MASK, GPIO1B6_SDMMC_PWREN << GPIO1B6_SHIFT | GPIO1B7_SDMMC_CMD << GPIO1B7_SHIFT); rk_clrsetreg(&grf->gpio1c_iomux, 0xfff, GPIO1C5_SDMMC_D3 << GPIO1C5_SHIFT | GPIO1C4_SDMMC_D2 << GPIO1C4_SHIFT | GPIO1C3_SDMMC_D1 << GPIO1C3_SHIFT | GPIO1C2_SDMMC_D0 << GPIO1C2_SHIFT | GPIO1C1_SDMMC_DETN << GPIO1C1_SHIFT | GPIO1C0_SDMMC_CLKOUT << GPIO1C0_SHIFT); break; } }
static void pinctrl_rk3288_sdmmc_config(struct rk3288_grf *grf, int mmc_id) { switch (mmc_id) { case PERIPH_ID_EMMC: rk_clrsetreg(&grf->gpio3a_iomux, 0xffff, GPIO3A7_EMMC_DATA7 << GPIO3A7_SHIFT | GPIO3A6_EMMC_DATA6 << GPIO3A6_SHIFT | GPIO3A5_EMMC_DATA5 << GPIO3A5_SHIFT | GPIO3A4_EMMC_DATA4 << GPIO3A4_SHIFT | GPIO3A3_EMMC_DATA3 << GPIO3A3_SHIFT | GPIO3A2_EMMC_DATA2 << GPIO3A2_SHIFT | GPIO3A1_EMMC_DATA1 << GPIO3A1_SHIFT | GPIO3A0_EMMC_DATA0 << GPIO3A0_SHIFT); rk_clrsetreg(&grf->gpio3b_iomux, GPIO3B1_MASK << GPIO3B1_SHIFT, GPIO3B1_EMMC_PWREN << GPIO3B1_SHIFT); rk_clrsetreg(&grf->gpio3c_iomux, GPIO3C0_MASK << GPIO3C0_SHIFT, GPIO3C0_EMMC_CMD << GPIO3C0_SHIFT); break; case PERIPH_ID_SDCARD: rk_clrsetreg(&grf->gpio6c_iomux, 0xffff, GPIO6C6_SDMMC0_DECTN << GPIO6C6_SHIFT | GPIO6C5_SDMMC0_CMD << GPIO6C5_SHIFT | GPIO6C4_SDMMC0_CLKOUT << GPIO6C4_SHIFT | GPIO6C3_SDMMC0_DATA3 << GPIO6C3_SHIFT | GPIO6C2_SDMMC0_DATA2 << GPIO6C2_SHIFT | GPIO6C1_SDMMC0_DATA1 << GPIO6C1_SHIFT | GPIO6C0_SDMMC0_DATA0 << GPIO6C0_SHIFT); /* use sdmmc0 io, disable JTAG function */ rk_clrsetreg(&grf->soc_con0, 1 << GRF_FORCE_JTAG_SHIFT, 0); break; default: debug("mmc id = %d iomux error!\n", mmc_id); break; } }
static int rk3288_pinctrl_set_pins(struct udevice *dev, int banknum, int index, int muxval, int flags) { struct rk3288_pinctrl_priv *priv = dev_get_priv(dev); uint shift, ind = index; uint mask; u32 *addr; int ret; debug("%s: %x %x %x %x\n", __func__, banknum, index, muxval, flags); ret = rk3288_pinctrl_get_pin_info(priv, banknum, index, &addr, &shift, &mask); if (ret) return ret; rk_clrsetreg(addr, mask << shift, muxval << shift); /* Handle pullup/pulldown */ if (flags) { uint val = 0; if (flags & (1 << PIN_CONFIG_BIAS_PULL_UP)) val = 1; else if (flags & (1 << PIN_CONFIG_BIAS_PULL_DOWN)) val = 2; shift = (index & 7) * 2; ind = index >> 3; if (banknum == 0) addr = &priv->pmu->gpio0pull[ind]; else addr = &priv->grf->gpio1_p[banknum - 1][ind]; debug("%s: addr=%p, val=%x, shift=%x\n", __func__, addr, val, shift); rk_clrsetreg(addr, 3 << shift, val << shift); } return 0; }
static void pinctrl_rk3188_pwm_config(struct rk3188_grf *grf, int pwm_id) { switch (pwm_id) { case PERIPH_ID_PWM0: rk_clrsetreg(&grf->gpio3d_iomux, GPIO3D3_MASK << GPIO3D3_SHIFT, GPIO3D3_PWM_0 << GPIO3D3_SHIFT); break; case PERIPH_ID_PWM1: rk_clrsetreg(&grf->gpio3d_iomux, GPIO3D4_MASK << GPIO3D4_SHIFT, GPIO3D4_PWM_1 << GPIO3D4_SHIFT); break; case PERIPH_ID_PWM2: rk_clrsetreg(&grf->gpio3d_iomux, GPIO3D5_MASK << GPIO3D5_SHIFT, GPIO3D5_PWM_2 << GPIO3D5_SHIFT); break; case PERIPH_ID_PWM3: rk_clrsetreg(&grf->gpio3d_iomux, GPIO3D6_MASK << GPIO3D6_SHIFT, GPIO3D6_PWM_3 << GPIO3D6_SHIFT); break; default: debug("pwm id = %d iomux error!\n", pwm_id); break; } }
static void pinctrl_rk3288_pwm_config(struct rk3288_grf *grf, int pwm_id) { switch (pwm_id) { case PERIPH_ID_PWM0: rk_clrsetreg(&grf->gpio7a_iomux, GPIO7A0_MASK << GPIO7A0_SHIFT, GPIO7A0_PWM_0 << GPIO7A0_SHIFT); break; case PERIPH_ID_PWM1: rk_clrsetreg(&grf->gpio7a_iomux, GPIO7A1_MASK << GPIO7A1_SHIFT, GPIO7A1_PWM_1 << GPIO7A1_SHIFT); break; case PERIPH_ID_PWM2: rk_clrsetreg(&grf->gpio7a_iomux, GPIO7C6_MASK << GPIO7C6_SHIFT, GPIO7C6_PWM_2 << GPIO7C6_SHIFT); break; case PERIPH_ID_PWM3: rk_clrsetreg(&grf->gpio7a_iomux, GPIO7C7_MASK << GPIO7C6_SHIFT, GPIO7C7_PWM_3 << GPIO7C7_SHIFT); break; default: debug("pwm id = %d iomux error!\n", pwm_id); break; } }
static void pinctrl_rk3036_spi_config(struct rk3036_grf *grf, int cs) { switch (cs) { case 0: rk_clrsetreg(&grf->gpio1d_iomux, GPIO1D6_MASK << GPIO1D6_SHIFT, GPIO1D6_SPI_CSN0 << GPIO1D6_SHIFT); break; case 1: rk_clrsetreg(&grf->gpio1d_iomux, GPIO1D7_MASK << GPIO1D7_SHIFT, GPIO1D7_SPI_CSN1 << GPIO1D7_SHIFT); break; } rk_clrsetreg(&grf->gpio1d_iomux, GPIO1D5_MASK << GPIO1D5_SHIFT | GPIO1D4_MASK << GPIO1D4_SHIFT, GPIO1D5_SPI_TXD << GPIO1D5_SHIFT | GPIO1D4_SPI_RXD << GPIO1D4_SHIFT); rk_clrsetreg(&grf->gpio2a_iomux, GPIO2A0_MASK << GPIO2A0_SHIFT, GPIO2A0_SPI_CLK << GPIO2A0_SHIFT); }
static void pinctrl_rk3036_pwm_config(struct rk3036_grf *grf, int pwm_id) { switch (pwm_id) { case PERIPH_ID_PWM0: rk_clrsetreg(&grf->gpio0d_iomux, GPIO0D2_MASK << GPIO0D2_SHIFT, GPIO0D2_PWM0 << GPIO0D2_SHIFT); break; case PERIPH_ID_PWM1: rk_clrsetreg(&grf->gpio0a_iomux, GPIO0A0_MASK << GPIO0A0_SHIFT, GPIO0A0_PWM1 << GPIO0A0_SHIFT); break; case PERIPH_ID_PWM2: rk_clrsetreg(&grf->gpio0a_iomux, GPIO0A1_MASK << GPIO0A1_SHIFT, GPIO0A1_PWM2 << GPIO0A1_SHIFT); break; case PERIPH_ID_PWM3: rk_clrsetreg(&grf->gpio0a_iomux, GPIO0D3_MASK << GPIO0D3_SHIFT, GPIO0D3_PWM3 << GPIO0D3_SHIFT); break; default: debug("pwm id = %d iomux error!\n", pwm_id); break; } }
int board_late_init(void) { struct rk3188_grf *grf; grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); if (IS_ERR(grf)) { pr_err("grf syscon returned %ld\n", PTR_ERR(grf)); } else { /* enable noc remap to mimic legacy loaders */ rk_clrsetreg(&grf->soc_con0, NOC_REMAP_MASK << NOC_REMAP_SHIFT, NOC_REMAP_MASK << NOC_REMAP_SHIFT); } return 0; }
static void pinctrl_rk3288_i2c_config(struct rk3288_grf *grf, struct rk3288_pmu *pmu, int i2c_id) { switch (i2c_id) { case PERIPH_ID_I2C0: clrsetbits_le32(&pmu->gpio0_iomux[PMU_GPIO0_B], GPIO0_B7_MASK << GPIO0_B7_SHIFT, GPIO0_B7_I2C0PMU_SDA << GPIO0_B7_SHIFT); clrsetbits_le32(&pmu->gpio0_iomux[PMU_GPIO0_C], GPIO0_C0_MASK << GPIO0_C0_SHIFT, GPIO0_C0_I2C0PMU_SCL << GPIO0_C0_SHIFT); break; #ifndef CONFIG_SPL_BUILD case PERIPH_ID_I2C1: rk_clrsetreg(&grf->gpio8a_iomux, GPIO8A4_MASK << GPIO8A4_SHIFT | GPIO8A5_MASK << GPIO8A5_SHIFT, GPIO8A4_I2C2SENSOR_SDA << GPIO8A4_SHIFT | GPIO8A5_I2C2SENSOR_SCL << GPIO8A5_SHIFT); break; case PERIPH_ID_I2C2: rk_clrsetreg(&grf->gpio6b_iomux, GPIO6B1_MASK << GPIO6B1_SHIFT | GPIO6B2_MASK << GPIO6B2_SHIFT, GPIO6B1_I2C1AUDIO_SDA << GPIO6B1_SHIFT | GPIO6B2_I2C1AUDIO_SCL << GPIO6B2_SHIFT); break; case PERIPH_ID_I2C3: rk_clrsetreg(&grf->gpio2c_iomux, GPIO2C1_MASK << GPIO2C1_SHIFT | GPIO2C0_MASK << GPIO2C0_SHIFT, GPIO2C1_I2C3CAM_SDA << GPIO2C1_SHIFT | GPIO2C0_I2C3CAM_SCL << GPIO2C0_SHIFT); break; case PERIPH_ID_I2C4: rk_clrsetreg(&grf->gpio7cl_iomux, GPIO7C1_MASK << GPIO7C1_SHIFT | GPIO7C2_MASK << GPIO7C2_SHIFT, GPIO7C1_I2C4TP_SDA << GPIO7C1_SHIFT | GPIO7C2_I2C4TP_SCL << GPIO7C2_SHIFT); break; case PERIPH_ID_I2C5: rk_clrsetreg(&grf->gpio7cl_iomux, GPIO7C3_MASK << GPIO7C3_SHIFT, GPIO7C3_I2C5HDMI_SDA << GPIO7C3_SHIFT); rk_clrsetreg(&grf->gpio7ch_iomux, GPIO7C4_MASK << GPIO7C4_SHIFT, GPIO7C4_I2C5HDMI_SCL << GPIO7C4_SHIFT); break; #endif default: debug("i2c id = %d iomux error!\n", i2c_id); break; } }