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
4b7adddb
Commit
4b7adddb
authored
Jul 18, 2003
by
Greg Kroah-Hartman
Browse files
Options
Browse Files
Download
Plain Diff
Merge gregkh@kernel.bkbits.net:linux/i2c-2.5
into kroah.com:/home/greg/linux/BK/i2c-2.5
parents
2c420d4a
9330a57b
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
22 additions
and
82 deletions
+22
-82
drivers/i2c/Kconfig
drivers/i2c/Kconfig
+1
-3
drivers/i2c/chips/via686a.c
drivers/i2c/chips/via686a.c
+5
-5
drivers/i2c/i2c-keywest.c
drivers/i2c/i2c-keywest.c
+16
-74
No files found.
drivers/i2c/Kconfig
View file @
4b7adddb
...
...
@@ -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/chips/via686a.c
View file @
4b7adddb
...
...
@@ -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 @
4b7adddb
...
...
@@ -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 */
...
...
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