1*11f4dc15SSimon Glass /* 2*11f4dc15SSimon Glass * Copyright (C) 2015 Google, Inc 3*11f4dc15SSimon Glass * Written by Simon Glass <sjg@chromium.org> 4*11f4dc15SSimon Glass * 5*11f4dc15SSimon Glass * SPDX-License-Identifier: GPL-2.0+ 6*11f4dc15SSimon Glass */ 7*11f4dc15SSimon Glass 8*11f4dc15SSimon Glass #include <common.h> 9*11f4dc15SSimon Glass #include <cpu.h> 10*11f4dc15SSimon Glass #include <dm.h> 11*11f4dc15SSimon Glass #include <dm/lists.h> 12*11f4dc15SSimon Glass #include <dm/root.h> 13*11f4dc15SSimon Glass 14*11f4dc15SSimon Glass int cpu_get_desc(struct udevice *dev, char *buf, int size) 15*11f4dc15SSimon Glass { 16*11f4dc15SSimon Glass struct cpu_ops *ops = cpu_get_ops(dev); 17*11f4dc15SSimon Glass 18*11f4dc15SSimon Glass if (!ops->get_desc) 19*11f4dc15SSimon Glass return -ENOSYS; 20*11f4dc15SSimon Glass 21*11f4dc15SSimon Glass return ops->get_desc(dev, buf, size); 22*11f4dc15SSimon Glass } 23*11f4dc15SSimon Glass 24*11f4dc15SSimon Glass int cpu_get_info(struct udevice *dev, struct cpu_info *info) 25*11f4dc15SSimon Glass { 26*11f4dc15SSimon Glass struct cpu_ops *ops = cpu_get_ops(dev); 27*11f4dc15SSimon Glass 28*11f4dc15SSimon Glass if (!ops->get_desc) 29*11f4dc15SSimon Glass return -ENOSYS; 30*11f4dc15SSimon Glass 31*11f4dc15SSimon Glass return ops->get_info(dev, info); 32*11f4dc15SSimon Glass } 33*11f4dc15SSimon Glass 34*11f4dc15SSimon Glass U_BOOT_DRIVER(cpu_bus) = { 35*11f4dc15SSimon Glass .name = "cpu_bus", 36*11f4dc15SSimon Glass .id = UCLASS_SIMPLE_BUS, 37*11f4dc15SSimon Glass .per_child_platdata_auto_alloc_size = sizeof(struct cpu_platdata), 38*11f4dc15SSimon Glass }; 39*11f4dc15SSimon Glass 40*11f4dc15SSimon Glass static int uclass_cpu_init(struct uclass *uc) 41*11f4dc15SSimon Glass { 42*11f4dc15SSimon Glass struct udevice *dev; 43*11f4dc15SSimon Glass int node; 44*11f4dc15SSimon Glass int ret; 45*11f4dc15SSimon Glass 46*11f4dc15SSimon Glass node = fdt_path_offset(gd->fdt_blob, "/cpus"); 47*11f4dc15SSimon Glass if (node < 0) 48*11f4dc15SSimon Glass return 0; 49*11f4dc15SSimon Glass 50*11f4dc15SSimon Glass ret = device_bind_driver_to_node(dm_root(), "cpu_bus", "cpus", node, 51*11f4dc15SSimon Glass &dev); 52*11f4dc15SSimon Glass 53*11f4dc15SSimon Glass return ret; 54*11f4dc15SSimon Glass } 55*11f4dc15SSimon Glass 56*11f4dc15SSimon Glass UCLASS_DRIVER(cpu) = { 57*11f4dc15SSimon Glass .id = UCLASS_CPU, 58*11f4dc15SSimon Glass .name = "cpu", 59*11f4dc15SSimon Glass .flags = DM_UC_FLAG_SEQ_ALIAS, 60*11f4dc15SSimon Glass .init = uclass_cpu_init, 61*11f4dc15SSimon Glass }; 62