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:
parent
abb0b01e7a
commit
0c7645bde0
@ -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)
|
||||||
|
@ -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 {
|
||||||
|
@ -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
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user