From ee2bc27dc58611e83ec7670163fb8a69aa1adb03 Mon Sep 17 00:00:00 2001 From: Alexandru Gagniuc Date: Tue, 21 May 2013 12:35:08 -0500 Subject: early_smbus: Add early SMBus implementation for VIA chipsets Add a common implementation of SMBus functionality for early chipsets. Note however, that existing via chipsets are not ported to this code. Porting will require hardware testing to make sure everything is fine. This code is used in the VIA VX900 branch. Change-Id: If5ad8cd0942ac02d358a0139967e7d85d395660f Signed-off-by: Alexandru Gagniuc Reviewed-on: http://review.coreboot.org/144 Tested-by: build bot (Jenkins) Reviewed-by: Ronald G. Minnich --- .../via/common/early_smbus_wait_until_ready.c | 43 ++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 src/southbridge/via/common/early_smbus_wait_until_ready.c (limited to 'src/southbridge/via/common/early_smbus_wait_until_ready.c') diff --git a/src/southbridge/via/common/early_smbus_wait_until_ready.c b/src/southbridge/via/common/early_smbus_wait_until_ready.c new file mode 100644 index 0000000000..dba37ff0cd --- /dev/null +++ b/src/southbridge/via/common/early_smbus_wait_until_ready.c @@ -0,0 +1,43 @@ +/* + * This file is part of the coreboot project. + * + * Copyright (C) 2013 Alexandru Gagniuc + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "via_early_smbus.h" +#include + +/** + * \brief Wait for the SMBus to become ready to process a new transaction. + * + * @param smbus_dev The base SMBus IO port + */ +int smbus_wait_until_ready(u32 smbus_dev) +{ + int loops; + + printsmbus("Waiting until SMBus ready\n"); + + /* Loop up to SMBUS_TIMEOUT times, waiting for bit 0 of the + * SMBus Host Status register to go to 0, indicating the operation + * was completed successfully. I don't remember why I did it this way, + * but I think it was because ROMCC was running low on registers */ + loops = 0; + while (smbus_is_busy(smbus_dev) && loops < SMBUS_TIMEOUT) + ++loops; + + return smbus_print_error(smbus_dev, inb(SMBHSTSTAT(smbus_dev)), loops); +} -- cgit v1.2.3