git://git.onelab.eu
/
linux-2.6.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git]
/
drivers
/
i2c
/
chips
/
ds1374.c
diff --git
a/drivers/i2c/chips/ds1374.c
b/drivers/i2c/chips/ds1374.c
index
0710b9d
..
15edf40
100644
(file)
--- a/
drivers/i2c/chips/ds1374.c
+++ b/
drivers/i2c/chips/ds1374.c
@@
-26,6
+26,8
@@
#include <linux/i2c.h>
#include <linux/rtc.h>
#include <linux/bcd.h>
#include <linux/i2c.h>
#include <linux/rtc.h>
#include <linux/bcd.h>
+#include <linux/mutex.h>
+#include <linux/workqueue.h>
#define DS1374_REG_TOD0 0x00
#define DS1374_REG_TOD1 0x01
#define DS1374_REG_TOD0 0x00
#define DS1374_REG_TOD1 0x01
@@
-41,7
+43,7
@@
#define DS1374_DRV_NAME "ds1374"
#define DS1374_DRV_NAME "ds1374"
-static DE
CLAR
E_MUTEX(ds1374_mutex);
+static DE
FIN
E_MUTEX(ds1374_mutex);
static struct i2c_driver ds1374_driver;
static struct i2c_client *save_client;
static struct i2c_driver ds1374_driver;
static struct i2c_client *save_client;
@@
-114,7
+116,7
@@
ulong ds1374_get_rtc_time(void)
ulong t1, t2;
int limit = 10; /* arbitrary retry limit */
ulong t1, t2;
int limit = 10; /* arbitrary retry limit */
-
down
(&ds1374_mutex);
+
mutex_lock
(&ds1374_mutex);
/*
* Since the reads are being performed one byte at a time using
/*
* Since the reads are being performed one byte at a time using
@@
-127,7
+129,7
@@
ulong ds1374_get_rtc_time(void)
t2 = ds1374_read_rtc();
} while (t1 != t2 && limit--);
t2 = ds1374_read_rtc();
} while (t1 != t2 && limit--);
-
up
(&ds1374_mutex);
+
mutex_unlock
(&ds1374_mutex);
if (t1 != t2) {
dev_warn(&save_client->dev,
if (t1 != t2) {
dev_warn(&save_client->dev,
@@
-138,14
+140,16
@@
ulong ds1374_get_rtc_time(void)
return t1;
}
return t1;
}
-static void ds1374_set_tlet(ulong arg)
+static ulong new_time;
+
+static void ds1374_set_work(struct work_struct *work)
{
ulong t1, t2;
int limit = 10; /* arbitrary retry limit */
{
ulong t1, t2;
int limit = 10; /* arbitrary retry limit */
- t1 =
*(ulong *) arg
;
+ t1 =
new_time
;
-
down
(&ds1374_mutex);
+
mutex_lock
(&ds1374_mutex);
/*
* Since the writes are being performed one byte at a time using
/*
* Since the writes are being performed one byte at a time using
@@
-158,26
+162,25
@@
static void ds1374_set_tlet(ulong arg)
t2 = ds1374_read_rtc();
} while (t1 != t2 && limit--);
t2 = ds1374_read_rtc();
} while (t1 != t2 && limit--);
-
up
(&ds1374_mutex);
+
mutex_unlock
(&ds1374_mutex);
if (t1 != t2)
dev_warn(&save_client->dev,
"can't confirm time set from rtc chip\n");
}
if (t1 != t2)
dev_warn(&save_client->dev,
"can't confirm time set from rtc chip\n");
}
-static
ulong new_tim
e;
+static
struct workqueue_struct *ds1374_workqueu
e;
-static DECLARE_TASKLET_DISABLED(ds1374_tasklet, ds1374_set_tlet,
- (ulong) & new_time);
+static DECLARE_WORK(ds1374_work, ds1374_set_work);
int ds1374_set_rtc_time(ulong nowtime)
{
new_time = nowtime;
if (in_interrupt())
int ds1374_set_rtc_time(ulong nowtime)
{
new_time = nowtime;
if (in_interrupt())
-
tasklet_schedule(&ds1374_tasklet
);
+
queue_work(ds1374_workqueue, &ds1374_work
);
else
else
- ds1374_set_
tlet((ulong) & new_time
);
+ ds1374_set_
work(NULL
);
return 0;
}
return 0;
}
@@
-203,6
+206,8
@@
static int ds1374_probe(struct i2c_adapter *adap, int addr, int kind)
client->adapter = adap;
client->driver = &ds1374_driver;
client->adapter = adap;
client->driver = &ds1374_driver;
+ ds1374_workqueue = create_singlethread_workqueue("ds1374");
+
if ((rc = i2c_attach_client(client)) != 0) {
kfree(client);
return rc;
if ((rc = i2c_attach_client(client)) != 0) {
kfree(client);
return rc;
@@
-226,7
+231,7
@@
static int ds1374_detach(struct i2c_client *client)
if ((rc = i2c_detach_client(client)) == 0) {
kfree(i2c_get_clientdata(client));
if ((rc = i2c_detach_client(client)) == 0) {
kfree(i2c_get_clientdata(client));
-
tasklet_kill(&ds1374_tasklet
);
+
destroy_workqueue(ds1374_workqueue
);
}
return rc;
}
}
return rc;
}