Commit ad80d2d1 authored by Linus Torvalds's avatar Linus Torvalds

Merge bk://kernel.bkbits.net/gregkh/linux/i2c-2.5

into home.transmeta.com:/home/torvalds/v2.5/linux
parents ed651f72 7d130b1b
...@@ -193,6 +193,10 @@ config I2C_IBM_OCP_ADAP ...@@ -193,6 +193,10 @@ config I2C_IBM_OCP_ADAP
tristate "IBM on-chip I2C Adapter" tristate "IBM on-chip I2C Adapter"
depends on I2C_IBM_OCP_ALGO depends on I2C_IBM_OCP_ALGO
config I2C_IOP3XX
tristate "Intel XScale IOP3xx on-chip I2C interface"
depends on ARCH_IOP3XX && I2C
config I2C_CHARDEV config I2C_CHARDEV
tristate "I2C device interface" tristate "I2C device interface"
depends on I2C depends on I2C
......
...@@ -16,4 +16,5 @@ obj-$(CONFIG_ITE_I2C_ADAP) += i2c-adap-ite.o ...@@ -16,4 +16,5 @@ obj-$(CONFIG_ITE_I2C_ADAP) += i2c-adap-ite.o
obj-$(CONFIG_SCx200_I2C) += scx200_i2c.o obj-$(CONFIG_SCx200_I2C) += scx200_i2c.o
obj-$(CONFIG_SCx200_ACB) += scx200_acb.o obj-$(CONFIG_SCx200_ACB) += scx200_acb.o
obj-$(CONFIG_I2C_SENSOR) += i2c-sensor.o obj-$(CONFIG_I2C_SENSOR) += i2c-sensor.o
obj-$(CONFIG_I2C_IOP3XX) += i2c-iop3xx.o
obj-y += busses/ chips/ obj-y += busses/ chips/
...@@ -47,6 +47,21 @@ config SENSORS_LM75 ...@@ -47,6 +47,21 @@ config SENSORS_LM75
in the lm_sensors package, which you can download at in the lm_sensors package, which you can download at
http://www.lm-sensors.nu http://www.lm-sensors.nu
config SENSORS_LM85
tristate " National Semiconductors LM85 and compatibles"
depends on I2C && EXPERIMENTAL
help
If you say yes here you get support for National Semiconductor LM85
sensor chips and clones: ADT7463 and ADM1027.
This can also be built as a module which can be inserted and
removed while the kernel is running.
The module will be called lm85.
You will also need the latest user-space utilties: you can find them
in the lm_sensors package, which you can download at
http://www.lm-sensors.nu
config SENSORS_VIA686A config SENSORS_VIA686A
tristate " VIA686A" tristate " VIA686A"
depends on I2C && EXPERIMENTAL depends on I2C && EXPERIMENTAL
...@@ -76,8 +91,8 @@ config SENSORS_W83781D ...@@ -76,8 +91,8 @@ config SENSORS_W83781D
config I2C_SENSOR config I2C_SENSOR
tristate tristate
default y if SENSORS_ADM1021=y || SENSORS_IT87=y || SENSORS_LM75=y || SENSORS_VIA686A=y || SENSORS_W83781D=y default y if SENSORS_ADM1021=y || SENSORS_IT87=y || SENSORS_LM75=y || SENSORS_VIA686A=y || SENSORS_W83781D=y || SENSORS_LM85=y
default m if SENSORS_ADM1021=m || SENSORS_IT87=m || SENSORS_LM75=m || SENSORS_VIA686A=m || SENSORS_W83781D=m default m if SENSORS_ADM1021=m || SENSORS_IT87=m || SENSORS_LM75=m || SENSORS_VIA686A=m || SENSORS_W83781D=m || SENSORS_LM85=m
default n default n
endmenu endmenu
...@@ -5,5 +5,6 @@ ...@@ -5,5 +5,6 @@
obj-$(CONFIG_SENSORS_ADM1021) += adm1021.o obj-$(CONFIG_SENSORS_ADM1021) += adm1021.o
obj-$(CONFIG_SENSORS_IT87) += it87.o obj-$(CONFIG_SENSORS_IT87) += it87.o
obj-$(CONFIG_SENSORS_LM75) += lm75.o obj-$(CONFIG_SENSORS_LM75) += lm75.o
obj-$(CONFIG_SENSORS_LM85) += lm85.o
obj-$(CONFIG_SENSORS_VIA686A) += via686a.o obj-$(CONFIG_SENSORS_VIA686A) += via686a.o
obj-$(CONFIG_SENSORS_W83781D) += w83781d.o obj-$(CONFIG_SENSORS_W83781D) += w83781d.o
This diff is collapsed.
...@@ -510,7 +510,7 @@ int i2c_master_send(struct i2c_client *client,const char *buf ,int count) ...@@ -510,7 +510,7 @@ int i2c_master_send(struct i2c_client *client,const char *buf ,int count)
msg.addr = client->addr; msg.addr = client->addr;
msg.flags = client->flags & I2C_M_TEN; msg.flags = client->flags & I2C_M_TEN;
msg.len = count; msg.len = count;
(const char *)msg.buf = buf; msg.buf = (char *)buf;
DEB2(dev_dbg(&client->adapter->dev, "master_send: writing %d bytes.\n", DEB2(dev_dbg(&client->adapter->dev, "master_send: writing %d bytes.\n",
count)); count));
...@@ -861,13 +861,13 @@ int i2c_smbus_check_pec(u16 addr, u8 command, int size, u8 partial, ...@@ -861,13 +861,13 @@ int i2c_smbus_check_pec(u16 addr, u8 command, int size, u8 partial,
return 0; return 0;
} }
extern s32 i2c_smbus_write_quick(struct i2c_client * client, u8 value) s32 i2c_smbus_write_quick(struct i2c_client *client, u8 value)
{ {
return i2c_smbus_xfer(client->adapter,client->addr,client->flags, return i2c_smbus_xfer(client->adapter,client->addr,client->flags,
value,0,I2C_SMBUS_QUICK,NULL); value,0,I2C_SMBUS_QUICK,NULL);
} }
extern s32 i2c_smbus_read_byte(struct i2c_client * client) s32 i2c_smbus_read_byte(struct i2c_client *client)
{ {
union i2c_smbus_data data; union i2c_smbus_data data;
if (i2c_smbus_xfer(client->adapter,client->addr,client->flags, if (i2c_smbus_xfer(client->adapter,client->addr,client->flags,
...@@ -877,14 +877,14 @@ extern s32 i2c_smbus_read_byte(struct i2c_client * client) ...@@ -877,14 +877,14 @@ extern s32 i2c_smbus_read_byte(struct i2c_client * client)
return 0x0FF & data.byte; return 0x0FF & data.byte;
} }
extern s32 i2c_smbus_write_byte(struct i2c_client * client, u8 value) s32 i2c_smbus_write_byte(struct i2c_client *client, u8 value)
{ {
union i2c_smbus_data data; /* only for PEC */ union i2c_smbus_data data; /* only for PEC */
return i2c_smbus_xfer(client->adapter,client->addr,client->flags, return i2c_smbus_xfer(client->adapter,client->addr,client->flags,
I2C_SMBUS_WRITE,value, I2C_SMBUS_BYTE,&data); I2C_SMBUS_WRITE,value, I2C_SMBUS_BYTE,&data);
} }
extern s32 i2c_smbus_read_byte_data(struct i2c_client * client, u8 command) s32 i2c_smbus_read_byte_data(struct i2c_client *client, u8 command)
{ {
union i2c_smbus_data data; union i2c_smbus_data data;
if (i2c_smbus_xfer(client->adapter,client->addr,client->flags, if (i2c_smbus_xfer(client->adapter,client->addr,client->flags,
...@@ -894,8 +894,7 @@ extern s32 i2c_smbus_read_byte_data(struct i2c_client * client, u8 command) ...@@ -894,8 +894,7 @@ extern s32 i2c_smbus_read_byte_data(struct i2c_client * client, u8 command)
return 0x0FF & data.byte; return 0x0FF & data.byte;
} }
extern s32 i2c_smbus_write_byte_data(struct i2c_client * client, u8 command, s32 i2c_smbus_write_byte_data(struct i2c_client *client, u8 command, u8 value)
u8 value)
{ {
union i2c_smbus_data data; union i2c_smbus_data data;
data.byte = value; data.byte = value;
...@@ -904,7 +903,7 @@ extern s32 i2c_smbus_write_byte_data(struct i2c_client * client, u8 command, ...@@ -904,7 +903,7 @@ extern s32 i2c_smbus_write_byte_data(struct i2c_client * client, u8 command,
I2C_SMBUS_BYTE_DATA,&data); I2C_SMBUS_BYTE_DATA,&data);
} }
extern s32 i2c_smbus_read_word_data(struct i2c_client * client, u8 command) s32 i2c_smbus_read_word_data(struct i2c_client *client, u8 command)
{ {
union i2c_smbus_data data; union i2c_smbus_data data;
if (i2c_smbus_xfer(client->adapter,client->addr,client->flags, if (i2c_smbus_xfer(client->adapter,client->addr,client->flags,
...@@ -914,8 +913,7 @@ extern s32 i2c_smbus_read_word_data(struct i2c_client * client, u8 command) ...@@ -914,8 +913,7 @@ extern s32 i2c_smbus_read_word_data(struct i2c_client * client, u8 command)
return 0x0FFFF & data.word; return 0x0FFFF & data.word;
} }
extern s32 i2c_smbus_write_word_data(struct i2c_client * client, s32 i2c_smbus_write_word_data(struct i2c_client *client, u8 command, u16 value)
u8 command, u16 value)
{ {
union i2c_smbus_data data; union i2c_smbus_data data;
data.word = value; data.word = value;
...@@ -924,8 +922,7 @@ extern s32 i2c_smbus_write_word_data(struct i2c_client * client, ...@@ -924,8 +922,7 @@ extern s32 i2c_smbus_write_word_data(struct i2c_client * client,
I2C_SMBUS_WORD_DATA,&data); I2C_SMBUS_WORD_DATA,&data);
} }
extern s32 i2c_smbus_process_call(struct i2c_client * client, s32 i2c_smbus_process_call(struct i2c_client *client, u8 command, u16 value)
u8 command, u16 value)
{ {
union i2c_smbus_data data; union i2c_smbus_data data;
data.word = value; data.word = value;
...@@ -938,8 +935,7 @@ extern s32 i2c_smbus_process_call(struct i2c_client * client, ...@@ -938,8 +935,7 @@ extern s32 i2c_smbus_process_call(struct i2c_client * client,
} }
/* Returns the number of read bytes */ /* Returns the number of read bytes */
extern s32 i2c_smbus_read_block_data(struct i2c_client * client, s32 i2c_smbus_read_block_data(struct i2c_client *client, u8 command, u8 *values)
u8 command, u8 *values)
{ {
union i2c_smbus_data data; union i2c_smbus_data data;
int i; int i;
...@@ -954,8 +950,7 @@ extern s32 i2c_smbus_read_block_data(struct i2c_client * client, ...@@ -954,8 +950,7 @@ extern s32 i2c_smbus_read_block_data(struct i2c_client * client,
} }
} }
extern s32 i2c_smbus_write_block_data(struct i2c_client * client, s32 i2c_smbus_write_block_data(struct i2c_client *client, u8 command, u8 length, u8 *values)
u8 command, u8 length, u8 *values)
{ {
union i2c_smbus_data data; union i2c_smbus_data data;
int i; int i;
...@@ -970,8 +965,7 @@ extern s32 i2c_smbus_write_block_data(struct i2c_client * client, ...@@ -970,8 +965,7 @@ extern s32 i2c_smbus_write_block_data(struct i2c_client * client,
} }
/* Returns the number of read bytes */ /* Returns the number of read bytes */
extern s32 i2c_smbus_block_process_call(struct i2c_client * client, s32 i2c_smbus_block_process_call(struct i2c_client *client, u8 command, u8 length, u8 *values)
u8 command, u8 length, u8 *values)
{ {
union i2c_smbus_data data; union i2c_smbus_data data;
int i; int i;
...@@ -990,8 +984,7 @@ extern s32 i2c_smbus_block_process_call(struct i2c_client * client, ...@@ -990,8 +984,7 @@ extern s32 i2c_smbus_block_process_call(struct i2c_client * client,
} }
/* Returns the number of read bytes */ /* Returns the number of read bytes */
extern s32 i2c_smbus_read_i2c_block_data(struct i2c_client * client, s32 i2c_smbus_read_i2c_block_data(struct i2c_client *client, u8 command, u8 *values)
u8 command, u8 *values)
{ {
union i2c_smbus_data data; union i2c_smbus_data data;
int i; int i;
...@@ -1006,8 +999,7 @@ extern s32 i2c_smbus_read_i2c_block_data(struct i2c_client * client, ...@@ -1006,8 +999,7 @@ extern s32 i2c_smbus_read_i2c_block_data(struct i2c_client * client,
} }
} }
extern s32 i2c_smbus_write_i2c_block_data(struct i2c_client * client, s32 i2c_smbus_write_i2c_block_data(struct i2c_client *client, u8 command, u8 length, u8 *values)
u8 command, u8 length, u8 *values)
{ {
union i2c_smbus_data data; union i2c_smbus_data data;
int i; int i;
......
...@@ -122,7 +122,7 @@ static ssize_t show_dev(struct class_device *class_dev, char *buf) ...@@ -122,7 +122,7 @@ static ssize_t show_dev(struct class_device *class_dev, char *buf)
} }
static CLASS_DEVICE_ATTR(dev, S_IRUGO, show_dev, NULL); static CLASS_DEVICE_ATTR(dev, S_IRUGO, show_dev, NULL);
static ssize_t i2cdev_read (struct file *file, char *buf, size_t count, static ssize_t i2cdev_read (struct file *file, char __user *buf, size_t count,
loff_t *offset) loff_t *offset)
{ {
char *tmp; char *tmp;
...@@ -147,7 +147,7 @@ static ssize_t i2cdev_read (struct file *file, char *buf, size_t count, ...@@ -147,7 +147,7 @@ static ssize_t i2cdev_read (struct file *file, char *buf, size_t count,
return ret; return ret;
} }
static ssize_t i2cdev_write (struct file *file, const char *buf, size_t count, static ssize_t i2cdev_write (struct file *file, const char __user *buf, size_t count,
loff_t *offset) loff_t *offset)
{ {
int ret; int ret;
...@@ -211,12 +211,12 @@ int i2cdev_ioctl (struct inode *inode, struct file *file, unsigned int cmd, ...@@ -211,12 +211,12 @@ int i2cdev_ioctl (struct inode *inode, struct file *file, unsigned int cmd,
return 0; return 0;
case I2C_FUNCS: case I2C_FUNCS:
funcs = i2c_get_functionality(client->adapter); funcs = i2c_get_functionality(client->adapter);
return (copy_to_user((unsigned long *)arg,&funcs, return (copy_to_user((unsigned long __user *)arg, &funcs,
sizeof(unsigned long)))?-EFAULT:0; sizeof(unsigned long)))?-EFAULT:0;
case I2C_RDWR: case I2C_RDWR:
if (copy_from_user(&rdwr_arg, if (copy_from_user(&rdwr_arg,
(struct i2c_rdwr_ioctl_data *)arg, (struct i2c_rdwr_ioctl_data __user *)arg,
sizeof(rdwr_arg))) sizeof(rdwr_arg)))
return -EFAULT; return -EFAULT;
...@@ -284,7 +284,7 @@ int i2cdev_ioctl (struct inode *inode, struct file *file, unsigned int cmd, ...@@ -284,7 +284,7 @@ int i2cdev_ioctl (struct inode *inode, struct file *file, unsigned int cmd,
case I2C_SMBUS: case I2C_SMBUS:
if (copy_from_user(&data_arg, if (copy_from_user(&data_arg,
(struct i2c_smbus_ioctl_data *) arg, (struct i2c_smbus_ioctl_data __user *) arg,
sizeof(struct i2c_smbus_ioctl_data))) sizeof(struct i2c_smbus_ioctl_data)))
return -EFAULT; return -EFAULT;
if ((data_arg.size != I2C_SMBUS_BYTE) && if ((data_arg.size != I2C_SMBUS_BYTE) &&
......
This diff is collapsed.
/* ------------------------------------------------------------------------- */
/* i2c-iop3xx.h algorithm driver definitions private to i2c-iop3xx.c */
/* ------------------------------------------------------------------------- */
/* Copyright (C) 2003 Peter Milne, D-TACQ Solutions Ltd
* <Peter dot Milne at D hyphen TACQ dot com>
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, version 2.
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, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
/* ------------------------------------------------------------------------- */
#ifndef I2C_IOP3XX_H
#define I2C_IOP3XX_H 1
/*
* iop321 hardware bit definitions
*/
#define IOP321_ICR_FAST_MODE 0x8000 /* 1=400kBps, 0=100kBps */
#define IOP321_ICR_UNIT_RESET 0x4000 /* 1=RESET */
#define IOP321_ICR_SADIE 0x2000 /* 1=Slave Detect Interrupt Enable */
#define IOP321_ICR_ALDIE 0x1000 /* 1=Arb Loss Detect Interrupt Enable */
#define IOP321_ICR_SSDIE 0x0800 /* 1=Slave STOP Detect Interrupt Enable */
#define IOP321_ICR_BERRIE 0x0400 /* 1=Bus Error Interrupt Enable */
#define IOP321_ICR_RXFULLIE 0x0200 /* 1=Receive Full Interrupt Enable */
#define IOP321_ICR_TXEMPTYIE 0x0100 /* 1=Transmit Empty Interrupt Enable */
#define IOP321_ICR_GCD 0x0080 /* 1=General Call Disable */
/*
* IOP321_ICR_GCD: 1 disables response as slave. "This bit must be set
* when sending a master mode general call message from the I2C unit"
*/
#define IOP321_ICR_UE 0x0040 /* 1=Unit Enable */
/*
* "NOTE: To avoid I2C bus integrity problems,
* the user needs to ensure that the GPIO Output Data Register -
* GPOD bits associated with an I2C port are cleared prior to setting
* the enable bit for that I2C serial port.
* The user prepares to enable I2C port 0 and
* I2C port 1 by clearing GPOD bits 7:6 and GPOD bits 5:4, respectively.
*/
#define IOP321_ICR_SCLEN 0x0020 /* 1=SCL enable for master mode */
#define IOP321_ICR_MABORT 0x0010 /* 1=Send a STOP with no data
* NB TBYTE must be clear */
#define IOP321_ICR_TBYTE 0x0008 /* 1=Send/Receive a byte. i2c clears */
#define IOP321_ICR_NACK 0x0004 /* 1=reply with NACK */
#define IOP321_ICR_MSTOP 0x0002 /* 1=send a STOP after next data byte */
#define IOP321_ICR_MSTART 0x0001 /* 1=initiate a START */
#define IOP321_ISR_BERRD 0x0400 /* 1=BUS ERROR Detected */
#define IOP321_ISR_SAD 0x0200 /* 1=Slave ADdress Detected */
#define IOP321_ISR_GCAD 0x0100 /* 1=General Call Address Detected */
#define IOP321_ISR_RXFULL 0x0080 /* 1=Receive Full */
#define IOP321_ISR_TXEMPTY 0x0040 /* 1=Transmit Empty */
#define IOP321_ISR_ALD 0x0020 /* 1=Arbitration Loss Detected */
#define IOP321_ISR_SSD 0x0010 /* 1=Slave STOP Detected */
#define IOP321_ISR_BBUSY 0x0008 /* 1=Bus BUSY */
#define IOP321_ISR_UNITBUSY 0x0004 /* 1=Unit Busy */
#define IOP321_ISR_NACK 0x0002 /* 1=Unit Rx or Tx a NACK */
#define IOP321_ISR_RXREAD 0x0001 /* 1=READ 0=WRITE (R/W bit of slave addr */
#define IOP321_ISR_CLEARBITS 0x07f0
#define IOP321_ISAR_SAMASK 0x007f
#define IOP321_IDBR_MASK 0x00ff
#define IOP321_IBMR_SCL 0x0002
#define IOP321_IBMR_SDA 0x0001
#define IOP321_GPOD_I2C0 0x00c0 /* clear these bits to enable ch0 */
#define IOP321_GPOD_I2C1 0x0030 /* clear these bits to enable ch1 */
#define MYSAR 0x02 /* SWAG a suitable slave address */
#define I2C_ERR 321
#define I2C_ERR_BERR (I2C_ERR+0)
#define I2C_ERR_ALD (I2C_ERR+1)
struct iop3xx_biu { /* Bus Interface Unit - the hardware */
/* physical hardware defs - regs*/
u32 *CR;
u32 *SR;
u32 *SAR;
u32 *DBR;
u32 *BMR;
/* irq bit vector */
u32 irq;
/* stored flags */
u32 SR_enabled, SR_received;
};
struct i2c_algo_iop3xx_data {
int channel;
wait_queue_head_t waitq;
spinlock_t lock;
int timeout;
struct iop3xx_biu* biu;
};
#define REGION_START(adap) ((u32)((adap)->biu->CR))
#define REGION_END(adap) ((u32)((adap)->biu->BMR+1))
#define REGION_LENGTH(adap) (REGION_END(adap)-REGION_START(adap))
#define IRQ_STATUS_MASK(adap) (1<<adap->biu->irq)
#endif /* I2C_IOP3XX_H */
...@@ -34,13 +34,13 @@ struct i2c_smbus_ioctl_data { ...@@ -34,13 +34,13 @@ struct i2c_smbus_ioctl_data {
__u8 read_write; __u8 read_write;
__u8 command; __u8 command;
__u32 size; __u32 size;
union i2c_smbus_data *data; union i2c_smbus_data __user *data;
}; };
/* This is the structure as used in the I2C_RDWR ioctl call */ /* This is the structure as used in the I2C_RDWR ioctl call */
struct i2c_rdwr_ioctl_data { struct i2c_rdwr_ioctl_data {
struct i2c_msg *msgs; /* pointers to i2c_msgs */ struct i2c_msg __user *msgs; /* pointers to i2c_msgs */
__u32 nmsgs; /* number of i2c_msgs */ __u32 nmsgs; /* number of i2c_msgs */
}; };
#endif /* _LINUX_I2C_DEV_H */ #endif /* _LINUX_I2C_DEV_H */
...@@ -176,7 +176,7 @@ static inline void *i2c_get_clientdata (struct i2c_client *dev) ...@@ -176,7 +176,7 @@ static inline void *i2c_get_clientdata (struct i2c_client *dev)
static inline void i2c_set_clientdata (struct i2c_client *dev, void *data) static inline void i2c_set_clientdata (struct i2c_client *dev, void *data)
{ {
return dev_set_drvdata (&dev->dev, data); dev_set_drvdata (&dev->dev, data);
} }
#define I2C_DEVNAME(str) .dev = { .name = str } #define I2C_DEVNAME(str) .dev = { .name = str }
...@@ -261,7 +261,7 @@ static inline void *i2c_get_adapdata (struct i2c_adapter *dev) ...@@ -261,7 +261,7 @@ static inline void *i2c_get_adapdata (struct i2c_adapter *dev)
static inline void i2c_set_adapdata (struct i2c_adapter *dev, void *data) static inline void i2c_set_adapdata (struct i2c_adapter *dev, void *data)
{ {
return dev_set_drvdata (&dev->dev, data); dev_set_drvdata (&dev->dev, data);
} }
/*flags for the driver struct: */ /*flags for the driver struct: */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment