x86: ivybridge: Use the I2C driver to perform SMbus init

Move the init code into the I2C driver.

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Heiko Schocher <hs@denx.de>
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
This commit is contained in:
Simon Glass 2016-01-17 16:11:45 -07:00 committed by Bin Meng
parent abb0b01e7a
commit 0c7645bde0
4 changed files with 35 additions and 36 deletions

View File

@ -120,41 +120,6 @@ int arch_cpu_init_dm(void)
return 0; return 0;
} }
static int enable_smbus(void)
{
pci_dev_t dev;
uint16_t value;
/* Set the SMBus device statically. */
dev = PCI_BDF(0x0, 0x1f, 0x3);
/* Check to make sure we've got the right device. */
value = x86_pci_read_config16(dev, 0x0);
if (value != 0x8086) {
printf("SMBus controller not found\n");
return -ENOSYS;
}
/* Set SMBus I/O base. */
x86_pci_write_config32(dev, SMB_BASE,
SMBUS_IO_BASE | PCI_BASE_ADDRESS_SPACE_IO);
/* Set SMBus enable. */
x86_pci_write_config8(dev, HOSTC, HST_EN);
/* Set SMBus I/O space enable. */
x86_pci_write_config16(dev, PCI_COMMAND, PCI_COMMAND_IO);
/* Disable interrupt generation. */
outb(0, SMBUS_IO_BASE + SMBHSTCTL);
/* Clear any lingering errors, so transactions can run. */
outb(inb(SMBUS_IO_BASE + SMBHSTSTAT), SMBUS_IO_BASE + SMBHSTSTAT);
debug("SMBus controller enabled\n");
return 0;
}
#define PCH_EHCI0_TEMP_BAR0 0xe8000000 #define PCH_EHCI0_TEMP_BAR0 0xe8000000
#define PCH_EHCI1_TEMP_BAR0 0xe8000400 #define PCH_EHCI1_TEMP_BAR0 0xe8000400
#define PCH_XHCI_TEMP_BAR0 0xe8001000 #define PCH_XHCI_TEMP_BAR0 0xe8001000
@ -271,9 +236,11 @@ int print_cpuinfo(void)
post_code(POST_EARLY_INIT); post_code(POST_EARLY_INIT);
/* Enable SPD ROMs and DDR-III DRAM */ /* Enable SPD ROMs and DDR-III DRAM */
ret = enable_smbus(); ret = uclass_first_device(UCLASS_I2C, &dev);
if (ret) if (ret)
return ret; return ret;
if (!dev)
return -ENODEV;
/* Prepare USB controller early in S3 resume */ /* Prepare USB controller early in S3 resume */
if (boot_mode == PEI_BOOT_RESUME) if (boot_mode == PEI_BOOT_RESUME)

View File

@ -283,6 +283,12 @@
intel,sata-port-map = <1>; intel,sata-port-map = <1>;
intel,sata-port0-gen3-tx = <0x00880a7f>; intel,sata-port0-gen3-tx = <0x00880a7f>;
}; };
smbus: smbus@1f,3 {
compatible = "intel,ich-i2c";
reg = <0x0000fb00 0 0 0 0>;
u-boot,dm-pre-reloc;
};
}; };
tpm { tpm {

View File

@ -1,5 +1,6 @@
CONFIG_X86=y CONFIG_X86=y
CONFIG_SYS_MALLOC_F_LEN=0x1800 CONFIG_SYS_MALLOC_F_LEN=0x1800
CONFIG_DM_I2C=y
CONFIG_VENDOR_GOOGLE=y CONFIG_VENDOR_GOOGLE=y
CONFIG_DEFAULT_DEVICE_TREE="chromebook_link" CONFIG_DEFAULT_DEVICE_TREE="chromebook_link"
CONFIG_TARGET_CHROMEBOOK_LINK=y CONFIG_TARGET_CHROMEBOOK_LINK=y
@ -20,6 +21,7 @@ CONFIG_CMD_TPM=y
CONFIG_CMD_TPM_TEST=y CONFIG_CMD_TPM_TEST=y
CONFIG_OF_CONTROL=y CONFIG_OF_CONTROL=y
CONFIG_CPU=y CONFIG_CPU=y
CONFIG_SYS_I2C_INTEL=y
CONFIG_CMD_CROS_EC=y CONFIG_CMD_CROS_EC=y
CONFIG_CROS_EC=y CONFIG_CROS_EC=y
CONFIG_CROS_EC_LPC=y CONFIG_CROS_EC_LPC=y

View File

@ -9,6 +9,7 @@
#include <dm.h> #include <dm.h>
#include <i2c.h> #include <i2c.h>
#include <asm/io.h> #include <asm/io.h>
#include <asm/arch/pch.h>
int intel_i2c_xfer(struct udevice *bus, struct i2c_msg *msg, int nmsgs) int intel_i2c_xfer(struct udevice *bus, struct i2c_msg *msg, int nmsgs)
{ {
@ -27,6 +28,29 @@ int intel_i2c_set_bus_speed(struct udevice *bus, unsigned int speed)
static int intel_i2c_probe(struct udevice *dev) static int intel_i2c_probe(struct udevice *dev)
{ {
/*
* So far this is just setup code for ivybridge SMbus. When we have
* a full I2C driver this may need to be moved, generalised or made
* dependant on a particular compatible string.
*
* Set SMBus I/O base
*/
dm_pci_write_config32(dev, SMB_BASE,
SMBUS_IO_BASE | PCI_BASE_ADDRESS_SPACE_IO);
/* Set SMBus enable. */
dm_pci_write_config8(dev, HOSTC, HST_EN);
/* Set SMBus I/O space enable. */
dm_pci_write_config16(dev, PCI_COMMAND, PCI_COMMAND_IO);
/* Disable interrupt generation. */
outb(0, SMBUS_IO_BASE + SMBHSTCTL);
/* Clear any lingering errors, so transactions can run. */
outb(inb(SMBUS_IO_BASE + SMBHSTSTAT), SMBUS_IO_BASE + SMBHSTSTAT);
debug("SMBus controller enabled\n");
return 0; return 0;
} }