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
nexedi
linux
Commits
adc5fc04
Commit
adc5fc04
authored
Jul 31, 2003
by
Greg Kroah-Hartman
Browse files
Options
Browse Files
Download
Plain Diff
Merge kroah.com:/home/greg/linux/BK/bleed-2.5
into kroah.com:/home/greg/linux/BK/i2c-2.6
parents
a72d939d
7225a3d7
Changes
15
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
15 changed files
with
487 additions
and
148 deletions
+487
-148
drivers/i2c/Kconfig
drivers/i2c/Kconfig
+1
-3
drivers/i2c/busses/Kconfig
drivers/i2c/busses/Kconfig
+17
-0
drivers/i2c/busses/Makefile
drivers/i2c/busses/Makefile
+1
-0
drivers/i2c/busses/i2c-ali1535.c
drivers/i2c/busses/i2c-ali1535.c
+2
-8
drivers/i2c/busses/i2c-ali15x3.c
drivers/i2c/busses/i2c-ali15x3.c
+2
-9
drivers/i2c/busses/i2c-amd756.c
drivers/i2c/busses/i2c-amd756.c
+3
-11
drivers/i2c/busses/i2c-amd8111.c
drivers/i2c/busses/i2c-amd8111.c
+1
-2
drivers/i2c/busses/i2c-i801.c
drivers/i2c/busses/i2c-i801.c
+3
-11
drivers/i2c/busses/i2c-nforce2.c
drivers/i2c/busses/i2c-nforce2.c
+426
-0
drivers/i2c/busses/i2c-piix4.c
drivers/i2c/busses/i2c-piix4.c
+1
-9
drivers/i2c/busses/i2c-sis96x.c
drivers/i2c/busses/i2c-sis96x.c
+1
-8
drivers/i2c/busses/i2c-viapro.c
drivers/i2c/busses/i2c-viapro.c
+1
-8
drivers/i2c/chips/via686a.c
drivers/i2c/chips/via686a.c
+5
-5
drivers/i2c/i2c-keywest.c
drivers/i2c/i2c-keywest.c
+16
-74
include/linux/i2c.h
include/linux/i2c.h
+7
-0
No files found.
drivers/i2c/Kconfig
View file @
adc5fc04
...
...
@@ -20,9 +20,7 @@ config I2C
interfaces", below.
If you want I2C support, you should say Y here and also to the
specific driver for your bus adapter(s) below. If you say Y to
"/proc file system" below, you will then get a /proc interface which
is documented in <file:Documentation/i2c/proc-interface>.
specific driver for your bus adapter(s) below.
This I2C support is also available as a module. If you want to
compile it as a module, say M here and read
...
...
drivers/i2c/busses/Kconfig
View file @
adc5fc04
...
...
@@ -108,6 +108,23 @@ config I2C_ISA
in the lm_sensors package, which you can download at
http://www.lm-sensors.nu
config I2C_NFORCE2
tristate " Nvidia Nforce2"
depends on I2C && PCI && EXPERIMENTAL
help
If you say yes to this option, support will be included for the Nvidia
Nforce2 family of mainboard I2C interfaces.
This can also be built as a module which can be inserted and removed
while the kernel is running. If you want to compile it as a module,
say M here and read <file:Documentation/modules.txt>.
The module will be called i2c-nforce2.
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 I2C_PIIX4
tristate " Intel PIIX4"
...
...
drivers/i2c/busses/Makefile
View file @
adc5fc04
...
...
@@ -8,6 +8,7 @@ obj-$(CONFIG_I2C_AMD756) += i2c-amd756.o
obj-$(CONFIG_I2C_AMD8111)
+=
i2c-amd8111.o
obj-$(CONFIG_I2C_I801)
+=
i2c-i801.o
obj-$(CONFIG_I2C_ISA)
+=
i2c-isa.o
obj-$(CONFIG_I2C_NFORCE2)
+=
i2c-nforce2.o
obj-$(CONFIG_I2C_PIIX4)
+=
i2c-piix4.o
obj-$(CONFIG_I2C_SIS96X)
+=
i2c-sis96x.o
obj-$(CONFIG_I2C_VIAPRO)
+=
i2c-viapro.o
drivers/i2c/busses/i2c-ali1535.c
View file @
adc5fc04
...
...
@@ -206,12 +206,6 @@ static int ali1535_setup(struct pci_dev *dev)
return
retval
;
}
static
void
ali1535_do_pause
(
unsigned
int
amount
)
{
current
->
state
=
TASK_INTERRUPTIBLE
;
schedule_timeout
(
amount
);
}
static
int
ali1535_transaction
(
struct
i2c_adapter
*
adap
)
{
int
temp
;
...
...
@@ -283,7 +277,7 @@ static int ali1535_transaction(struct i2c_adapter *adap)
/* We will always wait for a fraction of a second! */
timeout
=
0
;
do
{
ali1535_do_pause
(
1
);
i2c_delay
(
1
);
temp
=
inb_p
(
SMBHSTSTS
);
}
while
(((
temp
&
ALI1535_STS_BUSY
)
&&
!
(
temp
&
ALI1535_STS_IDLE
))
&&
(
timeout
++
<
MAX_TIMEOUT
));
...
...
@@ -357,7 +351,7 @@ static s32 ali1535_access(struct i2c_adapter *adap, u16 addr,
for
(
timeout
=
0
;
(
timeout
<
MAX_TIMEOUT
)
&&
!
(
temp
&
ALI1535_STS_IDLE
);
timeout
++
)
{
ali1535_do_pause
(
1
);
i2c_delay
(
1
);
temp
=
inb_p
(
SMBHSTSTS
);
}
if
(
timeout
>=
MAX_TIMEOUT
)
...
...
drivers/i2c/busses/i2c-ali15x3.c
View file @
adc5fc04
...
...
@@ -225,13 +225,6 @@ static int ali15x3_setup(struct pci_dev *ALI15X3_dev)
return
-
ENODEV
;
}
/* Internally used pause function */
static
void
ali15x3_do_pause
(
unsigned
int
amount
)
{
current
->
state
=
TASK_INTERRUPTIBLE
;
schedule_timeout
(
amount
);
}
/* Another internally used function */
static
int
ali15x3_transaction
(
struct
i2c_adapter
*
adap
)
{
...
...
@@ -304,7 +297,7 @@ static int ali15x3_transaction(struct i2c_adapter *adap)
/* We will always wait for a fraction of a second! */
timeout
=
0
;
do
{
ali15x3_do_pause
(
1
);
i2c_delay
(
1
);
temp
=
inb_p
(
SMBHSTSTS
);
}
while
((
!
(
temp
&
(
ALI15X3_STS_ERR
|
ALI15X3_STS_DONE
)))
&&
(
timeout
++
<
MAX_TIMEOUT
));
...
...
@@ -361,7 +354,7 @@ static s32 ali15x3_access(struct i2c_adapter * adap, u16 addr,
for
(
timeout
=
0
;
(
timeout
<
MAX_TIMEOUT
)
&&
!
(
temp
&
ALI15X3_STS_IDLE
);
timeout
++
)
{
ali15x3_do_pause
(
1
);
i2c_delay
(
1
);
temp
=
inb_p
(
SMBHSTSTS
);
}
if
(
timeout
>=
MAX_TIMEOUT
)
{
...
...
drivers/i2c/busses/i2c-amd756.c
View file @
adc5fc04
...
...
@@ -93,14 +93,6 @@ static unsigned short amd756_ioport = 0;
see E0 for the status bits and enabled in E2
*/
/* Internally used pause function */
static
void
amd756_do_pause
(
unsigned
int
amount
)
{
current
->
state
=
TASK_INTERRUPTIBLE
;
schedule_timeout
(
amount
);
}
#define GS_ABRT_STS (1 << 0)
#define GS_COL_STS (1 << 1)
#define GS_PRERR_STS (1 << 2)
...
...
@@ -132,7 +124,7 @@ static int amd756_transaction(struct i2c_adapter *adap)
if
((
temp
=
inw_p
(
SMB_GLOBAL_STATUS
))
&
(
GS_HST_STS
|
GS_SMB_STS
))
{
dev_dbg
(
&
adap
->
dev
,
": SMBus busy (%04x). Waiting...
\n
"
,
temp
);
do
{
amd756_do_pause
(
1
);
i2c_delay
(
1
);
temp
=
inw_p
(
SMB_GLOBAL_STATUS
);
}
while
((
temp
&
(
GS_HST_STS
|
GS_SMB_STS
))
&&
(
timeout
++
<
MAX_TIMEOUT
));
...
...
@@ -149,7 +141,7 @@ static int amd756_transaction(struct i2c_adapter *adap)
/* We will always wait for a fraction of a second! */
do
{
amd756_do_pause
(
1
);
i2c_delay
(
1
);
temp
=
inw_p
(
SMB_GLOBAL_STATUS
);
}
while
((
temp
&
GS_HST_STS
)
&&
(
timeout
++
<
MAX_TIMEOUT
));
...
...
@@ -196,7 +188,7 @@ static int amd756_transaction(struct i2c_adapter *adap)
abort:
dev_warn
(
&
adap
->
dev
,
": Sending abort.
\n
"
);
outw_p
(
inw
(
SMB_GLOBAL_ENABLE
)
|
GE_ABORT
,
SMB_GLOBAL_ENABLE
);
amd756_do_pause
(
100
);
i2c_delay
(
100
);
outw_p
(
GS_CLEAR_STS
,
SMB_GLOBAL_STATUS
);
return
-
1
;
}
...
...
drivers/i2c/busses/i2c-amd8111.c
View file @
adc5fc04
...
...
@@ -275,8 +275,7 @@ s32 amd8111_access(struct i2c_adapter * adap, u16 addr, unsigned short flags,
}
if
(
~
temp
[
0
]
&
AMD_SMB_STS_DONE
)
{
current
->
state
=
TASK_INTERRUPTIBLE
;
schedule_timeout
(
HZ
/
100
);
i2c_delay
(
HZ
/
100
);
amd_ec_read
(
smbus
,
AMD_SMB_STS
,
temp
+
0
);
}
...
...
drivers/i2c/busses/i2c-i801.c
View file @
adc5fc04
...
...
@@ -103,7 +103,6 @@ MODULE_PARM_DESC(force_addr,
"Forcibly enable the I801 at the given address. "
"EXTREMELY DANGEROUS!"
);
static
void
i801_do_pause
(
unsigned
int
amount
);
static
int
i801_transaction
(
void
);
static
int
i801_block_transaction
(
union
i2c_smbus_data
*
data
,
char
read_write
,
int
command
);
...
...
@@ -178,13 +177,6 @@ static int i801_setup(struct pci_dev *dev)
return
error_return
;
}
static
void
i801_do_pause
(
unsigned
int
amount
)
{
current
->
state
=
TASK_INTERRUPTIBLE
;
schedule_timeout
(
amount
);
}
static
int
i801_transaction
(
void
)
{
int
temp
;
...
...
@@ -214,7 +206,7 @@ static int i801_transaction(void)
/* We will always wait for a fraction of a second! */
do
{
i
801_do_pause
(
1
);
i
2c_delay
(
1
);
temp
=
inb_p
(
SMBHSTSTS
);
}
while
((
temp
&
0x01
)
&&
(
timeout
++
<
MAX_TIMEOUT
));
...
...
@@ -342,7 +334,7 @@ static int i801_block_transaction(union i2c_smbus_data *data, char read_write,
timeout
=
0
;
do
{
temp
=
inb_p
(
SMBHSTSTS
);
i
801_do_pause
(
1
);
i
2c_delay
(
1
);
}
while
((
!
(
temp
&
0x80
))
&&
(
timeout
++
<
MAX_TIMEOUT
));
...
...
@@ -402,7 +394,7 @@ static int i801_block_transaction(union i2c_smbus_data *data, char read_write,
timeout
=
0
;
do
{
temp
=
inb_p
(
SMBHSTSTS
);
i
801_do_pause
(
1
);
i
2c_delay
(
1
);
}
while
((
!
(
temp
&
0x02
))
&&
(
timeout
++
<
MAX_TIMEOUT
));
...
...
drivers/i2c/busses/i2c-nforce2.c
0 → 100644
View file @
adc5fc04
This diff is collapsed.
Click to expand it.
drivers/i2c/busses/i2c-piix4.c
View file @
adc5fc04
...
...
@@ -99,7 +99,6 @@ MODULE_PARM_DESC(force_addr,
"Forcibly enable the PIIX4 at the given address. "
"EXTREMELY DANGEROUS!"
);
static
void
piix4_do_pause
(
unsigned
int
amount
);
static
int
piix4_transaction
(
void
);
...
...
@@ -208,13 +207,6 @@ static int piix4_setup(struct pci_dev *PIIX4_dev, const struct pci_device_id *id
return
error_return
;
}
/* Internally used pause function */
static
void
piix4_do_pause
(
unsigned
int
amount
)
{
current
->
state
=
TASK_INTERRUPTIBLE
;
schedule_timeout
(
amount
);
}
/* Another internally used function */
static
int
piix4_transaction
(
void
)
{
...
...
@@ -245,7 +237,7 @@ static int piix4_transaction(void)
/* We will always wait for a fraction of a second! (See PIIX4 docs errata) */
do
{
piix4_do_pause
(
1
);
i2c_delay
(
1
);
temp
=
inb_p
(
SMBHSTSTS
);
}
while
((
temp
&
0x01
)
&&
(
timeout
++
<
MAX_TIMEOUT
));
...
...
drivers/i2c/busses/i2c-sis96x.c
View file @
adc5fc04
...
...
@@ -99,13 +99,6 @@ static inline void sis96x_write(u8 reg, u8 data)
outb
(
data
,
sis96x_smbus_base
+
reg
)
;
}
/* Internally used pause function */
static
void
sis96x_do_pause
(
unsigned
int
amount
)
{
current
->
state
=
TASK_INTERRUPTIBLE
;
schedule_timeout
(
amount
);
}
/* Execute a SMBus transaction.
int size is from SIS96x_QUICK to SIS96x_BLOCK_DATA
*/
...
...
@@ -147,7 +140,7 @@ static int sis96x_transaction(int size)
/* We will always wait for a fraction of a second! */
do
{
sis96x_do_pause
(
1
);
i2c_delay
(
1
);
temp
=
sis96x_read
(
SMB_STS
);
}
while
(
!
(
temp
&
0x0e
)
&&
(
timeout
++
<
MAX_TIMEOUT
));
...
...
drivers/i2c/busses/i2c-viapro.c
View file @
adc5fc04
...
...
@@ -103,13 +103,6 @@ MODULE_PARM_DESC(force_addr,
static
struct
i2c_adapter
vt596_adapter
;
/* Internally used pause function */
static
void
vt596_do_pause
(
unsigned
int
amount
)
{
current
->
state
=
TASK_INTERRUPTIBLE
;
schedule_timeout
(
amount
);
}
/* Another internally used function */
static
int
vt596_transaction
(
void
)
{
...
...
@@ -143,7 +136,7 @@ static int vt596_transaction(void)
/* We will always wait for a fraction of a second!
I don't know if VIA needs this, Intel did */
do
{
vt596_do_pause
(
1
);
i2c_delay
(
1
);
temp
=
inb_p
(
SMBHSTSTS
);
}
while
((
temp
&
0x01
)
&&
(
timeout
++
<
MAX_TIMEOUT
));
...
...
drivers/i2c/chips/via686a.c
View file @
adc5fc04
...
...
@@ -494,27 +494,27 @@ static ssize_t show_temp(struct device *dev, char *buf, int nr) {
struct
i2c_client
*
client
=
to_i2c_client
(
dev
);
struct
via686a_data
*
data
=
i2c_get_clientdata
(
client
);
via686a_update_client
(
client
);
return
sprintf
(
buf
,
"%ld
\n
"
,
TEMP_FROM_REG10
(
data
->
temp
[
nr
])
*
10
);
return
sprintf
(
buf
,
"%ld
\n
"
,
TEMP_FROM_REG10
(
data
->
temp
[
nr
])
*
10
0
);
}
/* more like overshoot temperature */
static
ssize_t
show_temp_max
(
struct
device
*
dev
,
char
*
buf
,
int
nr
)
{
struct
i2c_client
*
client
=
to_i2c_client
(
dev
);
struct
via686a_data
*
data
=
i2c_get_clientdata
(
client
);
via686a_update_client
(
client
);
return
sprintf
(
buf
,
"%ld
\n
"
,
TEMP_FROM_REG
(
data
->
temp_over
[
nr
])
*
10
);
return
sprintf
(
buf
,
"%ld
\n
"
,
TEMP_FROM_REG
(
data
->
temp_over
[
nr
])
*
10
0
);
}
/* more like hysteresis temperature */
static
ssize_t
show_temp_min
(
struct
device
*
dev
,
char
*
buf
,
int
nr
)
{
struct
i2c_client
*
client
=
to_i2c_client
(
dev
);
struct
via686a_data
*
data
=
i2c_get_clientdata
(
client
);
via686a_update_client
(
client
);
return
sprintf
(
buf
,
"%ld
\n
"
,
TEMP_FROM_REG
(
data
->
temp_hyst
[
nr
])
*
10
);
return
sprintf
(
buf
,
"%ld
\n
"
,
TEMP_FROM_REG
(
data
->
temp_hyst
[
nr
])
*
10
0
);
}
static
ssize_t
set_temp_max
(
struct
device
*
dev
,
const
char
*
buf
,
size_t
count
,
int
nr
)
{
struct
i2c_client
*
client
=
to_i2c_client
(
dev
);
struct
via686a_data
*
data
=
i2c_get_clientdata
(
client
);
int
val
=
simple_strtol
(
buf
,
NULL
,
10
)
/
10
;
int
val
=
simple_strtol
(
buf
,
NULL
,
10
)
/
10
0
;
data
->
temp_over
[
nr
]
=
TEMP_TO_REG
(
val
);
via686a_write_value
(
client
,
VIA686A_REG_TEMP_OVER
(
nr
),
data
->
temp_over
[
nr
]);
return
count
;
...
...
@@ -523,7 +523,7 @@ static ssize_t set_temp_min(struct device *dev, const char *buf,
size_t
count
,
int
nr
)
{
struct
i2c_client
*
client
=
to_i2c_client
(
dev
);
struct
via686a_data
*
data
=
i2c_get_clientdata
(
client
);
int
val
=
simple_strtol
(
buf
,
NULL
,
10
)
/
10
;
int
val
=
simple_strtol
(
buf
,
NULL
,
10
)
/
10
0
;
data
->
temp_hyst
[
nr
]
=
TEMP_TO_REG
(
val
);
via686a_write_value
(
client
,
VIA686A_REG_TEMP_HYST
(
nr
),
data
->
temp_hyst
[
nr
]);
return
count
;
...
...
drivers/i2c/i2c-keywest.c
View file @
adc5fc04
...
...
@@ -66,8 +66,6 @@
#include "i2c-keywest.h"
#undef POLLED_MODE
#define DBG(x...) do {\
if (debug > 0) \
printk(KERN_DEBUG "KW:" x); \
...
...
@@ -85,27 +83,6 @@ int debug = 0;
static
struct
keywest_iface
*
ifaces
=
NULL
;
#ifdef POLLED_MODE
/* This isn't fast, but will go once I implement interrupt with
* proper timeout
*/
static
u8
wait_interrupt
(
struct
keywest_iface
*
iface
)
{
int
i
;
u8
isr
;
for
(
i
=
0
;
i
<
POLL_TIMEOUT
;
i
++
)
{
isr
=
read_reg
(
reg_isr
)
&
KW_I2C_IRQ_MASK
;
if
(
isr
!=
0
)
return
isr
;
current
->
state
=
TASK_UNINTERRUPTIBLE
;
schedule_timeout
(
1
);
}
return
isr
;
}
#endif
/* POLLED_MODE */
static
void
do_stop
(
struct
keywest_iface
*
iface
,
int
result
)
...
...
@@ -116,16 +93,17 @@ do_stop(struct keywest_iface* iface, int result)
}
/* Main state machine for standard & standard sub mode */
static
void
static
int
handle_interrupt
(
struct
keywest_iface
*
iface
,
u8
isr
)
{
int
ack
;
int
rearm_timer
=
1
;
DBG
(
"handle_interrupt(), got: %x, status: %x, state: %d
\n
"
,
isr
,
read_reg
(
reg_status
),
iface
->
state
);
if
(
isr
==
0
&&
iface
->
state
!=
state_stop
)
{
do_stop
(
iface
,
-
1
);
return
;
return
rearm_timer
;
}
if
(
isr
&
KW_I2C_IRQ_STOP
&&
iface
->
state
!=
state_stop
)
{
iface
->
result
=
-
1
;
...
...
@@ -196,20 +174,19 @@ handle_interrupt(struct keywest_iface *iface, u8 isr)
if
(
!
(
isr
&
KW_I2C_IRQ_STOP
)
&&
(
++
iface
->
stopretry
)
<
10
)
do_stop
(
iface
,
-
1
);
else
{
rearm_timer
=
0
;
iface
->
state
=
state_idle
;
write_reg
(
reg_control
,
0x00
);
write_reg
(
reg_ier
,
0x00
);
#ifndef POLLED_MODE
complete
(
&
iface
->
complete
);
#endif
/* POLLED_MODE */
}
break
;
}
write_reg
(
reg_isr
,
isr
);
}
#ifndef POLLED_MODE
return
rearm_timer
;
}
/* Interrupt handler */
static
irqreturn_t
...
...
@@ -219,11 +196,8 @@ keywest_irq(int irq, void *dev_id, struct pt_regs *regs)
spin_lock
(
&
iface
->
lock
);
del_timer
(
&
iface
->
timeout_timer
);
handle_interrupt
(
iface
,
read_reg
(
reg_isr
));
if
(
iface
->
state
!=
state_idle
)
{
iface
->
timeout_timer
.
expires
=
jiffies
+
POLL_TIMEOUT
;
add_timer
(
&
iface
->
timeout_timer
);
}
if
(
handle_interrupt
(
iface
,
read_reg
(
reg_isr
)))
mod_timer
(
&
iface
->
timeout_timer
,
jiffies
+
POLL_TIMEOUT
);
spin_unlock
(
&
iface
->
lock
);
return
IRQ_HANDLED
;
}
...
...
@@ -235,16 +209,11 @@ keywest_timeout(unsigned long data)
DBG
(
"timeout !
\n
"
);
spin_lock_irq
(
&
iface
->
lock
);
handle_interrupt
(
iface
,
read_reg
(
reg_isr
));
if
(
iface
->
state
!=
state_idle
)
{
iface
->
timeout_timer
.
expires
=
jiffies
+
POLL_TIMEOUT
;
add_timer
(
&
iface
->
timeout_timer
);
}
if
(
handle_interrupt
(
iface
,
read_reg
(
reg_isr
)))
mod_timer
(
&
iface
->
timeout_timer
,
jiffies
+
POLL_TIMEOUT
);
spin_unlock
(
&
iface
->
lock
);
}
#endif
/* POLLED_MODE */
/*
* SMBUS-type transfer entrypoint
*/
...
...
@@ -331,24 +300,13 @@ keywest_smbus_xfer( struct i2c_adapter* adap,
write_reg
(
reg_subaddr
,
command
);
/* Arm timeout */
iface
->
timeout_timer
.
expires
=
jiffies
+
POLL_TIMEOUT
;
add_timer
(
&
iface
->
timeout_timer
);
mod_timer
(
&
iface
->
timeout_timer
,
jiffies
+
POLL_TIMEOUT
);
/* Start sending address & enable interrupt*/
write_reg
(
reg_control
,
read_reg
(
reg_control
)
|
KW_I2C_CTL_XADDR
);
write_reg
(
reg_ier
,
KW_I2C_IRQ_MASK
);
#ifdef POLLED_MODE
DBG
(
"using polled mode...
\n
"
);
/* State machine, to turn into an interrupt handler */
while
(
iface
->
state
!=
state_idle
)
{
u8
isr
=
wait_interrupt
(
iface
);
handle_interrupt
(
iface
,
isr
);
}
#else
/* POLLED_MODE */
DBG
(
"using interrupt mode...
\n
"
);
wait_for_completion
(
&
iface
->
complete
);
#endif
/* POLLED_MODE */
rc
=
iface
->
result
;
DBG
(
"transfer done, result: %d
\n
"
,
rc
);
...
...
@@ -421,24 +379,13 @@ keywest_xfer( struct i2c_adapter *adap,
((
iface
->
read_write
==
I2C_SMBUS_READ
)
?
0x01
:
0x00
));
/* Arm timeout */
iface
->
timeout_timer
.
expires
=
jiffies
+
POLL_TIMEOUT
;
add_timer
(
&
iface
->
timeout_timer
);
mod_timer
(
&
iface
->
timeout_timer
,
jiffies
+
POLL_TIMEOUT
);
/* Start sending address & enable interrupt*/
write_reg
(
reg_control
,
read_reg
(
reg_control
)
|
KW_I2C_CTL_XADDR
);
write_reg
(
reg_ier
,
KW_I2C_IRQ_MASK
);
#ifdef POLLED_MODE
DBG
(
"using polled mode...
\n
"
);
/* State machine, to turn into an interrupt handler */
while
(
iface
->
state
!=
state_idle
)
{
u8
isr
=
wait_interrupt
(
iface
);
handle_interrupt
(
iface
,
isr
);
}
#else
/* POLLED_MODE */
DBG
(
"using interrupt mode...
\n
"
);
wait_for_completion
(
&
iface
->
complete
);
#endif
/* POLLED_MODE */
rc
=
iface
->
result
;
if
(
rc
==
0
)
...
...
@@ -540,8 +487,8 @@ create_iface(struct device_node* np)
*
prate
);
}
/* Select standard
sub mode
*/
iface
->
cur_mode
|=
KW_I2C_MODE_STANDARD
SUB
;
/* Select standard
mode by default
*/
iface
->
cur_mode
|=
KW_I2C_MODE_STANDARD
;
/* Write mode */
write_reg
(
reg_mode
,
iface
->
cur_mode
);
...
...
@@ -550,7 +497,6 @@ create_iface(struct device_node* np)
write_reg
(
reg_ier
,
0x00
);
write_reg
(
reg_isr
,
KW_I2C_IRQ_MASK
);
#ifndef POLLED_MODE
/* Request chip interrupt */
rc
=
request_irq
(
iface
->
irq
,
keywest_irq
,
0
,
"keywest i2c"
,
iface
);
if
(
rc
)
{
...
...
@@ -559,7 +505,6 @@ create_iface(struct device_node* np)
kfree
(
iface
);
return
-
ENODEV
;
}
#endif
/* POLLED_MODE */
for
(
i
=
0
;
i
<
nchan
;
i
++
)
{
struct
keywest_chan
*
chan
=
&
iface
->
channels
[
i
];
...
...
@@ -609,19 +554,16 @@ dispose_iface(struct keywest_iface *iface)
/* Make sure we stop all activity */
down
(
&
iface
->
sem
);
#ifndef POLLED_MODE
spin_lock_irq
(
&
iface
->
lock
);
while
(
iface
->
state
!=
state_idle
)
{
spin_unlock_irq
(
&
iface
->
lock
);
schedule
();
set_task_state
(
current
,
TASK_UNINTERRUPTIBLE
);
schedule_timeout
(
HZ
/
10
);
spin_lock_irq
(
&
iface
->
lock
);
}
#endif
/* POLLED_MODE */
iface
->
state
=
state_dead
;
#ifndef POLLED_MODE
spin_unlock_irq
(
&
iface
->
lock
);
free_irq
(
iface
->
irq
,
iface
);
#endif
/* POLLED_MODE */
up
(
&
iface
->
sem
);
/* Release all channels */
...
...
include/linux/i2c.h
View file @
adc5fc04
...
...
@@ -594,4 +594,11 @@ union i2c_smbus_data {
#define i2c_is_isa_adapter(adapptr) \
((adapptr)->algo->id == I2C_ALGO_ISA)
/* Tiny delay function used by the i2c bus drivers */
static
inline
void
i2c_delay
(
signed
long
timeout
)
{
set_current_state
(
TASK_INTERRUPTIBLE
);
schedule_timeout
(
timeout
);
}
#endif
/* _LINUX_I2C_H */
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