> Why was this driver not submitted for inclusion into the kernel tree?
> Or was it? Are you sure there is no compatible driver already in the
> tree?
This driver wasn't submitted to the kernel tree. This was written
keeping in mind
to service a user space program which uses ioctl calls.
> You did not just enable them, you added some of your own, or you aren't
> using the original i2c-i801 driver from your kernel version.
True, I may not using the original i2c-i801 as the code is from MontaVista CGE6
and as i see the bus driver code is bit different to what i see on
kernel tree for
same version. That makes the debugging even more difficult for me :(
>> Is this driver issue or the bus problem on my Target board?
>
> It is impossible to tell without seeing the temperature sensor driver
> source code and the bus driver source code. It _looks_ like a bus
> driver issue, but if the same code worked in kernel 2.6.21 there's no
> reason why it would fail in kernel 2.6.32 (unless the hardware changed
> too.)
Below is my driver code.
PECI_ADDR = 0x29;
#define BYTE_CNT_1 0x01
#define PECI_STOP_POLLING 0x00
static struct i2c_device_id peci_idtable[] = {
{ "PECI", 0 },
{ }
};
MODULE_DEVICE_TABLE(i2c, peci_idtable);
struct i2c_driver peci_driver = {
.driver =
{
.owner = THIS_MODULE,
.name = "PECI",
},
.probe = peci_probe,
.remove = peci_remove,
.id_table = peci_idtable,
};
xxx_probe()
{
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,30)
struct i2c_client *pNewClient;
#else
struct device *dev = &pAdapter->dev;
struct i2c_adapter *adapter = pAdapter->adapter;
#endif
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,30)
if (!i2c_check_functionality(pAdapter,
I2C_FUNC_SMBUS_BYTE|I2C_FUNC_SMBUS_BYTE_DATA))
#else
if (!i2c_check_functionality(pAdapter->adapter,
I2C_FUNC_SMBUS_BYTE|I2C_FUNC_SMBUS_BYTE_DATA|I2C_FUNC_SMBUS_BLOCK_DATA))
#endif
{
printk(KERN_ERR "i2c_check_functionality() fail!\n");
return -1;
}
}
xxx_init_conf()
{
u8 aVal[I2C_SMBUS_BLOCK_MAX]={0,};
memset(aVal, 0, I2C_SMBUS_BLOCK_MAX);
bCnt = BYTE_CNT_1;
aVal[0] = bCnt;
aVal[1] = PECI_STOP_POLLING;
rslt = i2c_smbus_write_block_data(pClient,
PECI_CMD_STOP_POLLING , bCnt+1, aVal);
if(rslt)
return -EFAULT;
rslt = i2c_smbus_read_block_data(pClient, PECI_CMD_STOP_POLLING, NULL);
if(rslt < 0)
return -EFAULT;
}
xxx_init()
{
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,30)
static int bus_id = 0;
struct i2c_adapter *adapter;
struct i2c_board_info peci_device;
memset(&peci_device, 0, sizeof(struct i2c_board_info));
peci_device.addr = PECI_ADDR;
strlcpy(peci_device.type, "PECI", I2C_NAME_SIZE);
adapter = i2c_get_adapter(bus_id);
if (!adapter) {
return -ENODEV;
}
pClient = i2c_new_device(adapter, &peci_device);
i2c_put_adapter(adapter);
if (!pClient) {
peci_exit();
}
#endif
xxx_init_conf();
}
tree /sys/bus/i2c
/sys/bus/i2c
|-- devices
| |-- 0-0029 -> ../../../devices/pci0000:00/0000:00:1f.3/i2c-0/0-0029
| `-- i2c-0 -> ../../../devices/pci0000:00/0000:00:1f.3/i2c-0
|-- drivers
| |-- PECI
| | |-- 0-0029 -> ../../../../devices/pci0000:00/0000:00:1f.3/i2c-0/0-0029
| | |-- bind
| | |-- module -> ../../../../module/peci_ctrl
| | |-- uevent
| | `-- unbind
| |-- dev_driver
| | |-- bind
| | |-- uevent
| | `-- unbind
| `-- dummy
| |-- bind
| |-- uevent
| `-- unbind
|-- drivers_autoprobe
|-- drivers_probe
`-- uevent
> You can try the standalone i2c-i801 driver from:
> http://khali.linux-fr.org/devel/misc/i2c-i801/
> and see if it helps.
Sure Jean, will try this out and see if it helps me.
--- Bhanu Prakash
--
To unsubscribe from this list: send the line "unsubscribe linux-i2c" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html