111f4dc15SSimon Glass /* 211f4dc15SSimon Glass * Copyright (C) 2015 Google, Inc 311f4dc15SSimon Glass * Written by Simon Glass <sjg@chromium.org> 411f4dc15SSimon Glass * 511f4dc15SSimon Glass * SPDX-License-Identifier: GPL-2.0+ 611f4dc15SSimon Glass */ 711f4dc15SSimon Glass 811f4dc15SSimon Glass #include <common.h> 911f4dc15SSimon Glass #include <cpu.h> 1011f4dc15SSimon Glass #include <dm.h> 11166c3984SBin Meng #include <errno.h> 1211f4dc15SSimon Glass #include <dm/lists.h> 1311f4dc15SSimon Glass #include <dm/root.h> 1411f4dc15SSimon Glass 1511f4dc15SSimon Glass int cpu_get_desc(struct udevice *dev, char *buf, int size) 1611f4dc15SSimon Glass { 1711f4dc15SSimon Glass struct cpu_ops *ops = cpu_get_ops(dev); 1811f4dc15SSimon Glass 1911f4dc15SSimon Glass if (!ops->get_desc) 2011f4dc15SSimon Glass return -ENOSYS; 2111f4dc15SSimon Glass 2211f4dc15SSimon Glass return ops->get_desc(dev, buf, size); 2311f4dc15SSimon Glass } 2411f4dc15SSimon Glass 2511f4dc15SSimon Glass int cpu_get_info(struct udevice *dev, struct cpu_info *info) 2611f4dc15SSimon Glass { 2711f4dc15SSimon Glass struct cpu_ops *ops = cpu_get_ops(dev); 2811f4dc15SSimon Glass 29*cb5cbfd5SBin Meng if (!ops->get_info) 3011f4dc15SSimon Glass return -ENOSYS; 3111f4dc15SSimon Glass 3211f4dc15SSimon Glass return ops->get_info(dev, info); 3311f4dc15SSimon Glass } 3411f4dc15SSimon Glass 3511f4dc15SSimon Glass U_BOOT_DRIVER(cpu_bus) = { 3611f4dc15SSimon Glass .name = "cpu_bus", 3711f4dc15SSimon Glass .id = UCLASS_SIMPLE_BUS, 3811f4dc15SSimon Glass .per_child_platdata_auto_alloc_size = sizeof(struct cpu_platdata), 3911f4dc15SSimon Glass }; 4011f4dc15SSimon Glass 4111f4dc15SSimon Glass static int uclass_cpu_init(struct uclass *uc) 4211f4dc15SSimon Glass { 4311f4dc15SSimon Glass struct udevice *dev; 4411f4dc15SSimon Glass int node; 4511f4dc15SSimon Glass int ret; 4611f4dc15SSimon Glass 4711f4dc15SSimon Glass node = fdt_path_offset(gd->fdt_blob, "/cpus"); 4811f4dc15SSimon Glass if (node < 0) 4911f4dc15SSimon Glass return 0; 5011f4dc15SSimon Glass 5111f4dc15SSimon Glass ret = device_bind_driver_to_node(dm_root(), "cpu_bus", "cpus", node, 5211f4dc15SSimon Glass &dev); 5311f4dc15SSimon Glass 5411f4dc15SSimon Glass return ret; 5511f4dc15SSimon Glass } 5611f4dc15SSimon Glass 5711f4dc15SSimon Glass UCLASS_DRIVER(cpu) = { 5811f4dc15SSimon Glass .id = UCLASS_CPU, 5911f4dc15SSimon Glass .name = "cpu", 6011f4dc15SSimon Glass .flags = DM_UC_FLAG_SEQ_ALIAS, 6111f4dc15SSimon Glass .init = uclass_cpu_init, 6211f4dc15SSimon Glass }; 63