Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
6d588f51
Commit
6d588f51
authored
Aug 15, 2003
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Plain Diff
Merge
bk://kernel.bkbits.net/gregkh/linux/i2c-2.5
into home.osdl.org:/home/torvalds/v2.5/linux
parents
e9c14cd9
68079c55
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
71 additions
and
40 deletions
+71
-40
drivers/i2c/busses/i2c-nforce2.c
drivers/i2c/busses/i2c-nforce2.c
+5
-24
drivers/i2c/busses/i2c-piix4.c
drivers/i2c/busses/i2c-piix4.c
+9
-0
drivers/i2c/chips/Makefile
drivers/i2c/chips/Makefile
+3
-1
drivers/i2c/i2c-core.c
drivers/i2c/i2c-core.c
+28
-0
drivers/i2c/i2c-dev.c
drivers/i2c/i2c-dev.c
+26
-15
No files found.
drivers/i2c/busses/i2c-nforce2.c
View file @
6d588f51
...
@@ -51,10 +51,6 @@ MODULE_DESCRIPTION("nForce2 SMBus driver");
...
@@ -51,10 +51,6 @@ MODULE_DESCRIPTION("nForce2 SMBus driver");
#ifndef PCI_DEVICE_ID_NVIDIA_NFORCE2_SMBUS
#ifndef PCI_DEVICE_ID_NVIDIA_NFORCE2_SMBUS
#define PCI_DEVICE_ID_NVIDIA_NFORCE2_SMBUS 0x0064
#define PCI_DEVICE_ID_NVIDIA_NFORCE2_SMBUS 0x0064
#endif
#endif
/* TODO: sync with lm-sensors */
#ifndef I2C_HW_SMBUS_NFORCE2
#define I2C_HW_SMBUS_NFORCE2 0x0c
#endif
struct
nforce2_smbus
{
struct
nforce2_smbus
{
...
@@ -128,20 +124,10 @@ static struct i2c_adapter nforce2_adapter = {
...
@@ -128,20 +124,10 @@ static struct i2c_adapter nforce2_adapter = {
.
name
=
"unset"
,
.
name
=
"unset"
,
};
};
#if 0
/* Internally used pause function */
static void nforce2_do_pause(unsigned int amount)
{
current->state = TASK_INTERRUPTIBLE;
schedule_timeout(amount);
}
#endif
/* Return -1 on error. See smbus.h for more information */
/* Return -1 on error. See smbus.h for more information */
static
s32
nforce2_access
(
struct
i2c_adapter
*
adap
,
u16
addr
,
unsigned
short
flags
,
static
s32
nforce2_access
(
struct
i2c_adapter
*
adap
,
u16
addr
,
char
read_write
,
u8
command
,
int
siz
e
,
unsigned
short
flags
,
char
read_writ
e
,
union
i2c_smbus_data
*
data
)
u
8
command
,
int
size
,
u
nion
i2c_smbus_data
*
data
)
{
{
struct
nforce2_smbus
*
smbus
=
adap
->
algo_data
;
struct
nforce2_smbus
*
smbus
=
adap
->
algo_data
;
unsigned
char
protocol
,
pec
,
temp
;
unsigned
char
protocol
,
pec
,
temp
;
...
@@ -249,7 +235,7 @@ static s32 nforce2_access(struct i2c_adapter * adap, u16 addr, unsigned short fl
...
@@ -249,7 +235,7 @@ static s32 nforce2_access(struct i2c_adapter * adap, u16 addr, unsigned short fl
#if 0
#if 0
do {
do {
nforce2
_do_pause(1);
i2c
_do_pause(1);
temp = inb_p(NVIDIA_SMB_STS);
temp = inb_p(NVIDIA_SMB_STS);
} while (((temp & NVIDIA_SMB_STS_DONE) == 0) && (timeout++ < MAX_TIMEOUT));
} while (((temp & NVIDIA_SMB_STS_DONE) == 0) && (timeout++ < MAX_TIMEOUT));
#endif
#endif
...
@@ -332,13 +318,8 @@ static int __devinit nforce2_probe_smb (struct pci_dev *dev, int reg,
...
@@ -332,13 +318,8 @@ static int __devinit nforce2_probe_smb (struct pci_dev *dev, int reg,
smbus
->
base
,
smbus
->
base
+
smbus
->
size
-
1
,
name
);
smbus
->
base
,
smbus
->
base
+
smbus
->
size
-
1
,
name
);
return
-
1
;
return
-
1
;
}
}
/*
smbus->adapter.owner = THIS_MODULE;
smbus->adapter.id = I2C_ALGO_SMBUS | I2C_HW_SMBUS_NFORCE2;
smbus->adapter.algo = &smbus_algorithm;
smbus->adapter.algo_data = smbus;
*/
smbus
->
adapter
=
nforce2_adapter
;
smbus
->
adapter
=
nforce2_adapter
;
smbus
->
adapter
.
algo_data
=
smbus
;
smbus
->
adapter
.
dev
.
parent
=
&
dev
->
dev
;
smbus
->
adapter
.
dev
.
parent
=
&
dev
->
dev
;
snprintf
(
smbus
->
adapter
.
name
,
DEVICE_NAME_SIZE
,
snprintf
(
smbus
->
adapter
.
name
,
DEVICE_NAME_SIZE
,
"SMBus nForce2 adapter at %04x"
,
smbus
->
base
);
"SMBus nForce2 adapter at %04x"
,
smbus
->
base
);
...
...
drivers/i2c/busses/i2c-piix4.c
View file @
6d588f51
...
@@ -160,6 +160,15 @@ static int piix4_setup(struct pci_dev *PIIX4_dev, const struct pci_device_id *id
...
@@ -160,6 +160,15 @@ static int piix4_setup(struct pci_dev *PIIX4_dev, const struct pci_device_id *id
}
}
pci_read_config_byte
(
PIIX4_dev
,
SMBHSTCFG
,
&
temp
);
pci_read_config_byte
(
PIIX4_dev
,
SMBHSTCFG
,
&
temp
);
/* Some BIOS will set up the chipset incorrectly and leave a register
in an undefined state (causing I2C to act very strangely). */
if
(
temp
&
0x02
)
{
dev_info
(
&
PIIX4_dev
->
dev
,
"Worked around buggy BIOS (I2C)
\n
"
);
temp
=
temp
&
0xfd
;
pci_write_config_byte
(
PIIX4_dev
,
SMBHSTCFG
,
temp
);
}
/* If force_addr is set, we program the new address here. Just to make
/* If force_addr is set, we program the new address here. Just to make
sure, we disable the PIIX4 first. */
sure, we disable the PIIX4 first. */
if
(
force_addr
)
{
if
(
force_addr
)
{
...
...
drivers/i2c/chips/Makefile
View file @
6d588f51
...
@@ -2,10 +2,12 @@
...
@@ -2,10 +2,12 @@
# Makefile for the kernel hardware sensors chip drivers.
# Makefile for the kernel hardware sensors chip drivers.
#
#
# w83781d goes first, as it can override other driver's addresses.
obj-$(CONFIG_SENSORS_W83781D)
+=
w83781d.o
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_LM78)
+=
lm78.o
obj-$(CONFIG_SENSORS_LM78)
+=
lm78.o
obj-$(CONFIG_SENSORS_LM85)
+=
lm85.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
drivers/i2c/i2c-core.c
View file @
6d588f51
...
@@ -79,12 +79,36 @@ static struct class i2c_adapter_class = {
...
@@ -79,12 +79,36 @@ static struct class i2c_adapter_class = {
.
release
=
&
i2c_adapter_class_dev_release
,
.
release
=
&
i2c_adapter_class_dev_release
,
};
};
static
ssize_t
show_adapter_name
(
struct
device
*
dev
,
char
*
buf
)
{
struct
i2c_adapter
*
adap
=
dev_to_i2c_adapter
(
dev
);
return
sprintf
(
buf
,
"%s
\n
"
,
adap
->
name
);
}
static
DEVICE_ATTR
(
name
,
S_IRUGO
,
show_adapter_name
,
NULL
);
static
void
i2c_client_release
(
struct
device
*
dev
)
static
void
i2c_client_release
(
struct
device
*
dev
)
{
{
struct
i2c_client
*
client
=
to_i2c_client
(
dev
);
struct
i2c_client
*
client
=
to_i2c_client
(
dev
);
complete
(
&
client
->
released
);
complete
(
&
client
->
released
);
}
}
static
ssize_t
show_client_name
(
struct
device
*
dev
,
char
*
buf
)
{
struct
i2c_client
*
client
=
to_i2c_client
(
dev
);
return
sprintf
(
buf
,
"%s
\n
"
,
client
->
name
);
}
/*
* We can't use the DEVICE_ATTR() macro here as we want the same filename for a
* different type of a device. So beware if the DEVICE_ATTR() macro ever
* changes, this definition will also have to change.
*/
static
struct
device_attribute
dev_attr_client_name
=
{
.
attr
=
{.
name
=
"name"
,
.
mode
=
S_IRUGO
,
.
owner
=
THIS_MODULE
},
.
show
=
&
show_client_name
,
};
/* ---------------------------------------------------
/* ---------------------------------------------------
* registering functions
* registering functions
...
@@ -120,6 +144,7 @@ int i2c_add_adapter(struct i2c_adapter *adap)
...
@@ -120,6 +144,7 @@ int i2c_add_adapter(struct i2c_adapter *adap)
adap
->
dev
.
driver
=
&
i2c_adapter_driver
;
adap
->
dev
.
driver
=
&
i2c_adapter_driver
;
adap
->
dev
.
release
=
&
i2c_adapter_dev_release
;
adap
->
dev
.
release
=
&
i2c_adapter_dev_release
;
device_register
(
&
adap
->
dev
);
device_register
(
&
adap
->
dev
);
device_create_file
(
&
adap
->
dev
,
&
dev_attr_name
);
/* Add this adapter to the i2c_adapter class */
/* Add this adapter to the i2c_adapter class */
memset
(
&
adap
->
class_dev
,
0x00
,
sizeof
(
struct
class_device
));
memset
(
&
adap
->
class_dev
,
0x00
,
sizeof
(
struct
class_device
));
...
@@ -184,6 +209,7 @@ int i2c_del_adapter(struct i2c_adapter *adap)
...
@@ -184,6 +209,7 @@ int i2c_del_adapter(struct i2c_adapter *adap)
init_completion
(
&
adap
->
dev_released
);
init_completion
(
&
adap
->
dev_released
);
init_completion
(
&
adap
->
class_dev_released
);
init_completion
(
&
adap
->
class_dev_released
);
class_device_unregister
(
&
adap
->
class_dev
);
class_device_unregister
(
&
adap
->
class_dev
);
device_remove_file
(
&
adap
->
dev
,
&
dev_attr_name
);
device_unregister
(
&
adap
->
dev
);
device_unregister
(
&
adap
->
dev
);
list_del
(
&
adap
->
list
);
list_del
(
&
adap
->
list
);
...
@@ -361,6 +387,7 @@ int i2c_attach_client(struct i2c_client *client)
...
@@ -361,6 +387,7 @@ int i2c_attach_client(struct i2c_client *client)
"%d-%04x"
,
i2c_adapter_id
(
adapter
),
client
->
addr
);
"%d-%04x"
,
i2c_adapter_id
(
adapter
),
client
->
addr
);
printk
(
"registering %s
\n
"
,
client
->
dev
.
bus_id
);
printk
(
"registering %s
\n
"
,
client
->
dev
.
bus_id
);
device_register
(
&
client
->
dev
);
device_register
(
&
client
->
dev
);
device_create_file
(
&
client
->
dev
,
&
dev_attr_client_name
);
return
0
;
return
0
;
}
}
...
@@ -387,6 +414,7 @@ int i2c_detach_client(struct i2c_client *client)
...
@@ -387,6 +414,7 @@ int i2c_detach_client(struct i2c_client *client)
down
(
&
adapter
->
clist_lock
);
down
(
&
adapter
->
clist_lock
);
list_del
(
&
client
->
list
);
list_del
(
&
client
->
list
);
init_completion
(
&
client
->
released
);
init_completion
(
&
client
->
released
);
device_remove_file
(
&
client
->
dev
,
&
dev_attr_client_name
);
device_unregister
(
&
client
->
dev
);
device_unregister
(
&
client
->
dev
);
up
(
&
adapter
->
clist_lock
);
up
(
&
adapter
->
clist_lock
);
wait_for_completion
(
&
client
->
released
);
wait_for_completion
(
&
client
->
released
);
...
...
drivers/i2c/i2c-dev.c
View file @
6d588f51
...
@@ -181,6 +181,7 @@ int i2cdev_ioctl (struct inode *inode, struct file *file, unsigned int cmd,
...
@@ -181,6 +181,7 @@ int i2cdev_ioctl (struct inode *inode, struct file *file, unsigned int cmd,
struct
i2c_smbus_ioctl_data
data_arg
;
struct
i2c_smbus_ioctl_data
data_arg
;
union
i2c_smbus_data
temp
;
union
i2c_smbus_data
temp
;
struct
i2c_msg
*
rdwr_pa
;
struct
i2c_msg
*
rdwr_pa
;
u8
**
data_ptrs
;
int
i
,
datasize
,
res
;
int
i
,
datasize
,
res
;
unsigned
long
funcs
;
unsigned
long
funcs
;
...
@@ -214,7 +215,7 @@ int i2cdev_ioctl (struct inode *inode, struct file *file, unsigned int cmd,
...
@@ -214,7 +215,7 @@ int i2cdev_ioctl (struct inode *inode, struct file *file, unsigned int cmd,
return
(
copy_to_user
((
unsigned
long
__user
*
)
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
__user
*
)
arg
,
(
struct
i2c_rdwr_ioctl_data
__user
*
)
arg
,
sizeof
(
rdwr_arg
)))
sizeof
(
rdwr_arg
)))
...
@@ -231,28 +232,37 @@ int i2cdev_ioctl (struct inode *inode, struct file *file, unsigned int cmd,
...
@@ -231,28 +232,37 @@ int i2cdev_ioctl (struct inode *inode, struct file *file, unsigned int cmd,
if
(
rdwr_pa
==
NULL
)
return
-
ENOMEM
;
if
(
rdwr_pa
==
NULL
)
return
-
ENOMEM
;
if
(
copy_from_user
(
rdwr_pa
,
rdwr_arg
.
msgs
,
rdwr_arg
.
nmsgs
*
sizeof
(
struct
i2c_msg
)))
{
kfree
(
rdwr_pa
);
return
-
EFAULT
;
}
data_ptrs
=
(
u8
**
)
kmalloc
(
rdwr_arg
.
nmsgs
*
sizeof
(
u8
*
),
GFP_KERNEL
);
if
(
data_ptrs
==
NULL
)
{
kfree
(
rdwr_pa
);
return
-
ENOMEM
;
}
res
=
0
;
res
=
0
;
for
(
i
=
0
;
i
<
rdwr_arg
.
nmsgs
;
i
++
)
{
for
(
i
=
0
;
i
<
rdwr_arg
.
nmsgs
;
i
++
)
{
if
(
copy_from_user
(
&
(
rdwr_pa
[
i
]),
&
(
rdwr_arg
.
msgs
[
i
]),
sizeof
(
rdwr_pa
[
i
])))
{
res
=
-
EFAULT
;
break
;
}
/* Limit the size of the message to a sane amount */
/* Limit the size of the message to a sane amount */
if
(
rdwr_pa
[
i
].
len
>
8192
)
{
if
(
rdwr_pa
[
i
].
len
>
8192
)
{
res
=
-
EINVAL
;
res
=
-
EINVAL
;
break
;
break
;
}
}
data_ptrs
[
i
]
=
rdwr_pa
[
i
].
buf
;
rdwr_pa
[
i
].
buf
=
kmalloc
(
rdwr_pa
[
i
].
len
,
GFP_KERNEL
);
rdwr_pa
[
i
].
buf
=
kmalloc
(
rdwr_pa
[
i
].
len
,
GFP_KERNEL
);
if
(
rdwr_pa
[
i
].
buf
==
NULL
)
{
if
(
rdwr_pa
[
i
].
buf
==
NULL
)
{
res
=
-
ENOMEM
;
res
=
-
ENOMEM
;
break
;
break
;
}
}
if
(
copy_from_user
(
rdwr_pa
[
i
].
buf
,
if
(
copy_from_user
(
rdwr_pa
[
i
].
buf
,
rdwr_arg
.
msgs
[
i
].
buf
,
data_ptrs
[
i
]
,
rdwr_pa
[
i
].
len
))
{
rdwr_pa
[
i
].
len
))
{
res
=
-
EFAULT
;
++
i
;
/* Needs to be kfreed too */
res
=
-
EFAULT
;
break
;
break
;
}
}
}
}
...
@@ -260,18 +270,18 @@ int i2cdev_ioctl (struct inode *inode, struct file *file, unsigned int cmd,
...
@@ -260,18 +270,18 @@ int i2cdev_ioctl (struct inode *inode, struct file *file, unsigned int cmd,
int
j
;
int
j
;
for
(
j
=
0
;
j
<
i
;
++
j
)
for
(
j
=
0
;
j
<
i
;
++
j
)
kfree
(
rdwr_pa
[
j
].
buf
);
kfree
(
rdwr_pa
[
j
].
buf
);
kfree
(
data_ptrs
);
kfree
(
rdwr_pa
);
kfree
(
rdwr_pa
);
return
res
;
return
res
;
}
}
if
(
!
res
)
{
res
=
i2c_transfer
(
client
->
adapter
,
res
=
i2c_transfer
(
client
->
adapter
,
rdwr_pa
,
rdwr_pa
,
rdwr_arg
.
nmsgs
);
rdwr_arg
.
nmsgs
);
}
while
(
i
--
>
0
)
{
while
(
i
--
>
0
)
{
if
(
res
>=
0
&&
(
rdwr_pa
[
i
].
flags
&
I2C_M_RD
))
{
if
(
res
>=
0
&&
(
rdwr_pa
[
i
].
flags
&
I2C_M_RD
))
{
if
(
copy_to_user
(
if
(
copy_to_user
(
rdwr_arg
.
msgs
[
i
].
buf
,
data_ptrs
[
i
]
,
rdwr_pa
[
i
].
buf
,
rdwr_pa
[
i
].
buf
,
rdwr_pa
[
i
].
len
))
{
rdwr_pa
[
i
].
len
))
{
res
=
-
EFAULT
;
res
=
-
EFAULT
;
...
@@ -279,6 +289,7 @@ int i2cdev_ioctl (struct inode *inode, struct file *file, unsigned int cmd,
...
@@ -279,6 +289,7 @@ int i2cdev_ioctl (struct inode *inode, struct file *file, unsigned int cmd,
}
}
kfree
(
rdwr_pa
[
i
].
buf
);
kfree
(
rdwr_pa
[
i
].
buf
);
}
}
kfree
(
data_ptrs
);
kfree
(
rdwr_pa
);
kfree
(
rdwr_pa
);
return
res
;
return
res
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment