141364f0fSVadim Bendebury /* 241364f0fSVadim Bendebury * Copyright (c) 2012 The Chromium OS Authors. All rights reserved. 341364f0fSVadim Bendebury * Use of this source code is governed by a BSD-style license that can be 441364f0fSVadim Bendebury * found in the LICENSE file. 541364f0fSVadim Bendebury * 641364f0fSVadim Bendebury * Alternatively, this software may be distributed under the terms of the 741364f0fSVadim Bendebury * GNU General Public License ("GPL") version 2 as published by the Free 841364f0fSVadim Bendebury * Software Foundation. 941364f0fSVadim Bendebury */ 1041364f0fSVadim Bendebury 1141364f0fSVadim Bendebury #include <common.h> 1241364f0fSVadim Bendebury #include <cros_ec.h> 13*84d6cbd3SSimon Glass #include <dm.h> 14*84d6cbd3SSimon Glass #include <errno.h> 15*84d6cbd3SSimon Glass 1641364f0fSVadim Bendebury DECLARE_GLOBAL_DATA_PTR; 1741364f0fSVadim Bendebury 18*84d6cbd3SSimon Glass #ifndef CONFIG_DM_CROS_EC 1941364f0fSVadim Bendebury struct local_info { 2041364f0fSVadim Bendebury struct cros_ec_dev *cros_ec_dev; /* Pointer to cros_ec device */ 2141364f0fSVadim Bendebury int cros_ec_err; /* Error for cros_ec, 0 if ok */ 2241364f0fSVadim Bendebury }; 2341364f0fSVadim Bendebury 2441364f0fSVadim Bendebury static struct local_info local; 25*84d6cbd3SSimon Glass #endif 2641364f0fSVadim Bendebury 2741364f0fSVadim Bendebury struct cros_ec_dev *board_get_cros_ec_dev(void) 2841364f0fSVadim Bendebury { 29*84d6cbd3SSimon Glass #ifdef CONFIG_DM_CROS_EC 30*84d6cbd3SSimon Glass struct udevice *dev; 31*84d6cbd3SSimon Glass int ret; 32*84d6cbd3SSimon Glass 33*84d6cbd3SSimon Glass ret = uclass_get_device(UCLASS_CROS_EC, 0, &dev); 34*84d6cbd3SSimon Glass if (ret) { 35*84d6cbd3SSimon Glass debug("%s: Error %d\n", __func__, ret); 36*84d6cbd3SSimon Glass return NULL; 37*84d6cbd3SSimon Glass } 38*84d6cbd3SSimon Glass return dev->uclass_priv; 39*84d6cbd3SSimon Glass #else 4041364f0fSVadim Bendebury return local.cros_ec_dev; 41*84d6cbd3SSimon Glass #endif 4241364f0fSVadim Bendebury } 4341364f0fSVadim Bendebury 4441364f0fSVadim Bendebury static int board_init_cros_ec_devices(const void *blob) 4541364f0fSVadim Bendebury { 46*84d6cbd3SSimon Glass #ifndef CONFIG_DM_CROS_EC 4741364f0fSVadim Bendebury local.cros_ec_err = cros_ec_init(blob, &local.cros_ec_dev); 4841364f0fSVadim Bendebury if (local.cros_ec_err) 4941364f0fSVadim Bendebury return -1; /* Will report in board_late_init() */ 50*84d6cbd3SSimon Glass #endif 5141364f0fSVadim Bendebury 5241364f0fSVadim Bendebury return 0; 5341364f0fSVadim Bendebury } 5441364f0fSVadim Bendebury 5541364f0fSVadim Bendebury int cros_ec_board_init(void) 5641364f0fSVadim Bendebury { 5741364f0fSVadim Bendebury return board_init_cros_ec_devices(gd->fdt_blob); 5841364f0fSVadim Bendebury } 5941364f0fSVadim Bendebury 6041364f0fSVadim Bendebury int cros_ec_get_error(void) 6141364f0fSVadim Bendebury { 62*84d6cbd3SSimon Glass #ifdef CONFIG_DM_CROS_EC 63*84d6cbd3SSimon Glass struct udevice *dev; 64*84d6cbd3SSimon Glass int ret; 65*84d6cbd3SSimon Glass 66*84d6cbd3SSimon Glass ret = uclass_get_device(UCLASS_CROS_EC, 0, &dev); 67*84d6cbd3SSimon Glass if (ret && ret != -ENODEV) 68*84d6cbd3SSimon Glass return ret; 69*84d6cbd3SSimon Glass 70*84d6cbd3SSimon Glass return 0; 71*84d6cbd3SSimon Glass #else 7241364f0fSVadim Bendebury return local.cros_ec_err; 73*84d6cbd3SSimon Glass #endif 7441364f0fSVadim Bendebury } 75