If you have smbus hub,
You may need to use
smbus_send_byte(hub_address, hub_channel);
or
smbus_write_byte(hub_address, hub_channel);
the code is same as CK804's, and the code is verified with Tyan S4881 and 4885.
For PCA9556/PCA9516
static inline void activate_spd_rom(const struct mem_controller *ctrl)
{
#define SMBUS_HUB 0x18
unsigned device=(ctrl->channel0[0])>>8;
smbus_write_byte(SMBUS_HUB, 0x01, device);
smbus_write_byte(SMBUS_HUB,0x03, 0);
}
YH
________________________________
From: linuxbios-bounces@linuxbios.org [mailto:linuxbios-bounces@linuxbios.org] On Behalf Of bxshi Sent: Monday, January 22, 2007 11:04 PM To: yinghailu@gmail.com Cc: linuxbios@linuxbios.org Subject: Re: [LinuxBIOS] MCP55 LinuxBIOS with USB debug
Dr. Lu,
In mcp55_smbus.h
static int do_smbus_send_byte(unsigned smbus_io_base, unsigned device, unsigned char val) {
.....
outb(0, smbus_io_base + SMBHSTCMD);
.....
}
I wonder why you write 0 to SMBHSTCMD ? if we are using a smbus_hub , I think we should write the channel number we want to enable to this register. for example , if my memory controller is on channel 2 , we should write outb(2,smbus_io_base+SMBHSTCMD).
So could that be changed to outb(val,smbus_io_base + SMBHSTCMD) ?
Thanks
bxshi
You may need to use
smbus_send_byte(hub_address, hub_channel);
or
smbus_write_byte(hub_address, hub_channel);
smbus_write_byte may need three parametres, smbus_write_byte(device ,address ,val). for PCA9545 to enable one channel need four steps ,
1. outb(hub_address, base_io+02) 2. outb(hub_channel, base_io +03) 3. outb(0x04, base_io + 00) 4. test inb(base_io+01)
it is a little different from PCA9556/PCA9557. as I look at the code , use smbus_write_byte may not make pca9545 work . use smbus_send_byte(device,val) , I get the output:
No memory for this cpu No memory
so I change below outb(val, smbus_io_base + SMBHSTCMD); then everything works fine. so I think smbus_send_byte(device,val) ,device should be the HUB_ADDRESS , and val is the HUB_CHANNEL. is it right?
bxshi