int fuse_override(u32 bank, u32 word, u32 val) { struct udevice *dev; int ret; switch (bank) { case STM32MP_OTP_BANK: ret = uclass_get_device_by_driver(UCLASS_MISC, DM_GET_DRIVER(stm32mp_bsec), &dev); if (ret) return ret; ret = misc_write(dev, word * 4 + STM32_BSEC_SHADOW_OFFSET, &val, 4); break; default: printf("stm32mp %s: wrong value for bank %i\n", __func__, bank); ret = -EINVAL; break; } return ret; }
void board_nand_init(void) { struct udevice *dev; int ret; ret = uclass_get_device_by_driver(UCLASS_MISC, DM_GET_DRIVER(denali_nand_dt), &dev); if (ret && ret != -ENODEV) pr_err("Failed to initialize Denali NAND controller. (error %d)\n", ret); }
static void setup_serial(void) { #if CONFIG_IS_ENABLED(ROCKCHIP_EFUSE) const u32 cpuid_offset = 0x7; const u32 cpuid_length = 0x10; struct udevice *dev; int ret, i; u8 cpuid[cpuid_length]; u8 low[cpuid_length/2], high[cpuid_length/2]; char cpuid_str[cpuid_length * 2 + 1]; u64 serialno; char serialno_str[17]; /* retrieve the device */ ret = uclass_get_device_by_driver(UCLASS_MISC, DM_GET_DRIVER(rockchip_efuse), &dev); if (ret) { debug("%s: could not find efuse device\n", __func__); return; } /* read the cpu_id range from the efuses */ ret = misc_read(dev, cpuid_offset, &cpuid, sizeof(cpuid)); if (ret) { debug("%s: reading cpuid from the efuses failed\n", __func__); return; } memset(cpuid_str, 0, sizeof(cpuid_str)); for (i = 0; i < 16; i++) sprintf(&cpuid_str[i * 2], "%02x", cpuid[i]); debug("cpuid: %s\n", cpuid_str); /* * Mix the cpuid bytes using the same rules as in * ${linux}/drivers/soc/rockchip/rockchip-cpuinfo.c */ for (i = 0; i < 8; i++) { low[i] = cpuid[1 + (i << 1)]; high[i] = cpuid[i << 1]; } serialno = crc32_no_comp(0, low, 8); serialno |= (u64)crc32_no_comp(serialno, high, 8) << 32; snprintf(serialno_str, sizeof(serialno_str), "%016llx", serialno); env_set("cpuid#", cpuid_str); env_set("serial#", serialno_str); #endif }
int timer_init(void) { const u32 emask = SCUTIMER_CONTROL_AUTO_RELOAD_MASK | (TIMER_PRESCALE << SCUTIMER_CONTROL_PRESCALER_SHIFT) | SCUTIMER_CONTROL_ENABLE_MASK; struct udevice *dev; struct clk clk; int ret; ret = uclass_get_device_by_driver(UCLASS_CLK, DM_GET_DRIVER(zynq_clk), &dev); if (ret) return ret; clk.id = cpu_6or4x_clk; ret = clk_request(dev, &clk); if (ret < 0) return ret; gd->cpu_clk = clk_get_rate(&clk); clk_free(&clk); gd->arch.timer_rate_hz = (gd->cpu_clk / 2) / (TIMER_PRESCALE + 1); /* Load the timer counter register */ writel(0xFFFFFFFF, &timer_base->load); /* * Start the A9Timer device * Enable Auto reload mode, Clear prescaler control bits * Set prescaler value, Enable the decrementer */ clrsetbits_le32(&timer_base->control, SCUTIMER_CONTROL_PRESCALER_MASK, emask); /* Reset time */ gd->arch.lastinc = readl(&timer_base->counter) / (gd->arch.timer_rate_hz / CONFIG_SYS_HZ); gd->arch.tbl = 0; return 0; }
static int do_cpld(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { struct udevice *dev; u32 addr, val; int ret; ret = uclass_get_device_by_driver(UCLASS_SYSRESET, DM_GET_DRIVER(sysreset_renesas_ulcb), &dev); if (ret) return ret; if (argc == 2 && strcmp(argv[1], "info") == 0) { printf("CPLD version:\t\t\t0x%08x\n", cpld_read(dev, CPLD_ADDR_VERSION)); printf("H3 Mode setting (MD0..28):\t0x%08x\n", cpld_read(dev, CPLD_ADDR_MODE)); printf("Multiplexer settings:\t\t0x%08x\n", cpld_read(dev, CPLD_ADDR_MUX)); printf("DIPSW (SW6):\t\t\t0x%08x\n", cpld_read(dev, CPLD_ADDR_DIPSW6)); return 0; } if (argc < 3) return CMD_RET_USAGE; addr = simple_strtoul(argv[2], NULL, 16); if (!(addr == CPLD_ADDR_VERSION || addr == CPLD_ADDR_MODE || addr == CPLD_ADDR_MUX || addr == CPLD_ADDR_DIPSW6 || addr == CPLD_ADDR_RESET)) { printf("Invalid CPLD register address\n"); return CMD_RET_USAGE; } if (argc == 3 && strcmp(argv[1], "read") == 0) { printf("0x%x\n", cpld_read(dev, addr)); } else if (argc == 4 && strcmp(argv[1], "write") == 0) { val = simple_strtoul(argv[3], NULL, 16); cpld_write(dev, addr, val); } return 0; }
int rockchip_get_clk(struct udevice **devp) { return uclass_get_device_by_driver(UCLASS_CLK, DM_GET_DRIVER(rockchip_rk3188_cru), devp); }
int ast_get_clk(struct udevice **devp) { return uclass_get_device_by_driver(UCLASS_CLK, DM_GET_DRIVER(aspeed_ast2500_scu), devp); }
int rockchip_get_clk(struct udevice **devp) { return uclass_get_device_by_driver(UCLASS_CLK, DM_GET_DRIVER(clk_rv1108), devp); }
static int rockchip_get_pmucruclk(struct udevice **devp) { return uclass_get_device_by_driver(UCLASS_CLK, DM_GET_DRIVER(rockchip_rk3399_pmuclk), devp); }