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 29cb5cbfd5SBin Meng if (!ops->get_info) 3011f4dc15SSimon Glass return -ENOSYS; 3111f4dc15SSimon Glass 3211f4dc15SSimon Glass return ops->get_info(dev, info); 3311f4dc15SSimon Glass } 3411f4dc15SSimon Glass 35*780bfdd3SBin Meng int cpu_get_count(struct udevice *dev) 36*780bfdd3SBin Meng { 37*780bfdd3SBin Meng struct cpu_ops *ops = cpu_get_ops(dev); 38*780bfdd3SBin Meng 39*780bfdd3SBin Meng if (!ops->get_count) 40*780bfdd3SBin Meng return -ENOSYS; 41*780bfdd3SBin Meng 42*780bfdd3SBin Meng return ops->get_count(dev); 43*780bfdd3SBin Meng } 44*780bfdd3SBin Meng 4511f4dc15SSimon Glass U_BOOT_DRIVER(cpu_bus) = { 4611f4dc15SSimon Glass .name = "cpu_bus", 4711f4dc15SSimon Glass .id = UCLASS_SIMPLE_BUS, 4811f4dc15SSimon Glass .per_child_platdata_auto_alloc_size = sizeof(struct cpu_platdata), 4911f4dc15SSimon Glass }; 5011f4dc15SSimon Glass 5111f4dc15SSimon Glass static int uclass_cpu_init(struct uclass *uc) 5211f4dc15SSimon Glass { 5311f4dc15SSimon Glass struct udevice *dev; 5411f4dc15SSimon Glass int node; 5511f4dc15SSimon Glass int ret; 5611f4dc15SSimon Glass 5711f4dc15SSimon Glass node = fdt_path_offset(gd->fdt_blob, "/cpus"); 5811f4dc15SSimon Glass if (node < 0) 5911f4dc15SSimon Glass return 0; 6011f4dc15SSimon Glass 6111f4dc15SSimon Glass ret = device_bind_driver_to_node(dm_root(), "cpu_bus", "cpus", node, 6211f4dc15SSimon Glass &dev); 6311f4dc15SSimon Glass 6411f4dc15SSimon Glass return ret; 6511f4dc15SSimon Glass } 6611f4dc15SSimon Glass 6711f4dc15SSimon Glass UCLASS_DRIVER(cpu) = { 6811f4dc15SSimon Glass .id = UCLASS_CPU, 6911f4dc15SSimon Glass .name = "cpu", 7011f4dc15SSimon Glass .flags = DM_UC_FLAG_SEQ_ALIAS, 7111f4dc15SSimon Glass .init = uclass_cpu_init, 7211f4dc15SSimon Glass }; 73