aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEvgeniy Polyakov <johnpol@2ka.mipt.ru>2006-04-03 04:04:27 -0400
committerGreg Kroah-Hartman <gregkh@suse.de>2006-06-22 14:22:50 -0400
commitabd52a13206e02537ca1dc08fc5438c7d27bdbf1 (patch)
treeefe0ff89898aad10600d392ac727dcea9e7af322
parent46e07f6e5eb0e465e086b8f485f4238bd453e3e9 (diff)
[PATCH] w1: Use mutexes instead of semaphores.
Use mutexes instead of semaphores. Patch tested on x86_64 and i386 with test bus master driver. Signed-off-by: Evgeniy Polyakov <johnpol@2ka.mipt.ru> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-rw-r--r--drivers/w1/masters/ds2482.c24
-rw-r--r--drivers/w1/masters/ds2490.c10
-rw-r--r--drivers/w1/slaves/w1_ds2433.c20
-rw-r--r--drivers/w1/slaves/w1_therm.c12
-rw-r--r--drivers/w1/w1.c114
-rw-r--r--drivers/w1/w1.h5
-rw-r--r--drivers/w1/w1_int.c8
-rw-r--r--drivers/w1/w1_netlink.c4
8 files changed, 70 insertions, 127 deletions
diff --git a/drivers/w1/masters/ds2482.c b/drivers/w1/masters/ds2482.c
index d1cacd23576b..af492cc48db2 100644
--- a/drivers/w1/masters/ds2482.c
+++ b/drivers/w1/masters/ds2482.c
@@ -125,7 +125,7 @@ struct ds2482_w1_chan {
125 125
126struct ds2482_data { 126struct ds2482_data {
127 struct i2c_client client; 127 struct i2c_client client;
128 struct semaphore access_lock; 128 struct mutex access_lock;
129 129
130 /* 1-wire interface(s) */ 130 /* 1-wire interface(s) */
131 int w1_count; /* 1 or 8 */ 131 int w1_count; /* 1 or 8 */
@@ -265,7 +265,7 @@ static u8 ds2482_w1_touch_bit(void *data, u8 bit)
265 struct ds2482_data *pdev = pchan->pdev; 265 struct ds2482_data *pdev = pchan->pdev;
266 int status = -1; 266 int status = -1;
267 267
268 down(&pdev->access_lock); 268 mutex_lock(&pdev->access_lock);
269 269
270 /* Select the channel */ 270 /* Select the channel */
271 ds2482_wait_1wire_idle(pdev); 271 ds2482_wait_1wire_idle(pdev);
@@ -277,7 +277,7 @@ static u8 ds2482_w1_touch_bit(void *data, u8 bit)
277 bit ? 0xFF : 0)) 277 bit ? 0xFF : 0))
278 status = ds2482_wait_1wire_idle(pdev); 278 status = ds2482_wait_1wire_idle(pdev);
279 279
280 up(&pdev->access_lock); 280 mutex_unlock(&pdev->access_lock);
281 281
282 return (status & DS2482_REG_STS_SBR) ? 1 : 0; 282 return (status & DS2482_REG_STS_SBR) ? 1 : 0;
283} 283}
@@ -297,7 +297,7 @@ static u8 ds2482_w1_triplet(void *data, u8 dbit)
297 struct ds2482_data *pdev = pchan->pdev; 297 struct ds2482_data *pdev = pchan->pdev;
298 int status = (3 << 5); 298 int status = (3 << 5);
299 299
300 down(&pdev->access_lock); 300 mutex_lock(&pdev->access_lock);
301 301
302 /* Select the channel */ 302 /* Select the channel */
303 ds2482_wait_1wire_idle(pdev); 303 ds2482_wait_1wire_idle(pdev);
@@ -309,7 +309,7 @@ static u8 ds2482_w1_triplet(void *data, u8 dbit)
309 dbit ? 0xFF : 0)) 309 dbit ? 0xFF : 0))
310 status = ds2482_wait_1wire_idle(pdev); 310 status = ds2482_wait_1wire_idle(pdev);
311 311
312 up(&pdev->access_lock); 312 mutex_unlock(&pdev->access_lock);
313 313
314 /* Decode the status */ 314 /* Decode the status */
315 return (status >> 5); 315 return (status >> 5);
@@ -326,7 +326,7 @@ static void ds2482_w1_write_byte(void *data, u8 byte)
326 struct ds2482_w1_chan *pchan = data; 326 struct ds2482_w1_chan *pchan = data;
327 struct ds2482_data *pdev = pchan->pdev; 327 struct ds2482_data *pdev = pchan->pdev;
328 328
329 down(&pdev->access_lock); 329 mutex_lock(&pdev->access_lock);
330 330
331 /* Select the channel */ 331 /* Select the channel */
332 ds2482_wait_1wire_idle(pdev); 332 ds2482_wait_1wire_idle(pdev);
@@ -336,7 +336,7 @@ static void ds2482_w1_write_byte(void *data, u8 byte)
336 /* Send the write byte command */ 336 /* Send the write byte command */
337 ds2482_send_cmd_data(pdev, DS2482_CMD_1WIRE_WRITE_BYTE, byte); 337 ds2482_send_cmd_data(pdev, DS2482_CMD_1WIRE_WRITE_BYTE, byte);
338 338
339 up(&pdev->access_lock); 339 mutex_unlock(&pdev->access_lock);
340} 340}
341 341
342/** 342/**
@@ -351,7 +351,7 @@ static u8 ds2482_w1_read_byte(void *data)
351 struct ds2482_data *pdev = pchan->pdev; 351 struct ds2482_data *pdev = pchan->pdev;
352 int result; 352 int result;
353 353
354 down(&pdev->access_lock); 354 mutex_lock(&pdev->access_lock);
355 355
356 /* Select the channel */ 356 /* Select the channel */
357 ds2482_wait_1wire_idle(pdev); 357 ds2482_wait_1wire_idle(pdev);
@@ -370,7 +370,7 @@ static u8 ds2482_w1_read_byte(void *data)
370 /* Read the data byte */ 370 /* Read the data byte */
371 result = i2c_smbus_read_byte(&pdev->client); 371 result = i2c_smbus_read_byte(&pdev->client);
372 372
373 up(&pdev->access_lock); 373 mutex_unlock(&pdev->access_lock);
374 374
375 return result; 375 return result;
376} 376}
@@ -389,7 +389,7 @@ static u8 ds2482_w1_reset_bus(void *data)
389 int err; 389 int err;
390 u8 retval = 1; 390 u8 retval = 1;
391 391
392 down(&pdev->access_lock); 392 mutex_lock(&pdev->access_lock);
393 393
394 /* Select the channel */ 394 /* Select the channel */
395 ds2482_wait_1wire_idle(pdev); 395 ds2482_wait_1wire_idle(pdev);
@@ -409,7 +409,7 @@ static u8 ds2482_w1_reset_bus(void *data)
409 0xF0); 409 0xF0);
410 } 410 }
411 411
412 up(&pdev->access_lock); 412 mutex_unlock(&pdev->access_lock);
413 413
414 return retval; 414 return retval;
415} 415}
@@ -482,7 +482,7 @@ static int ds2482_detect(struct i2c_adapter *adapter, int address, int kind)
482 snprintf(new_client->name, sizeof(new_client->name), "ds2482-%d00", 482 snprintf(new_client->name, sizeof(new_client->name), "ds2482-%d00",
483 data->w1_count); 483 data->w1_count);
484 484
485 init_MUTEX(&data->access_lock); 485 mutex_init(&data->access_lock);
486 486
487 /* Tell the I2C layer a new client has arrived */ 487 /* Tell the I2C layer a new client has arrived */
488 if ((err = i2c_attach_client(new_client))) 488 if ((err = i2c_attach_client(new_client)))
diff --git a/drivers/w1/masters/ds2490.c b/drivers/w1/masters/ds2490.c
index 637677833da5..299e274d241a 100644
--- a/drivers/w1/masters/ds2490.c
+++ b/drivers/w1/masters/ds2490.c
@@ -169,7 +169,7 @@ static int ds_send_control(struct ds_device *, u16, u16);
169static int ds_send_control_cmd(struct ds_device *, u16, u16); 169static int ds_send_control_cmd(struct ds_device *, u16, u16);
170 170
171static LIST_HEAD(ds_devices); 171static LIST_HEAD(ds_devices);
172static DECLARE_MUTEX(ds_mutex); 172static DEFINE_MUTEX(ds_mutex);
173 173
174static struct usb_driver ds_driver = { 174static struct usb_driver ds_driver = {
175 .name = "DS9490R", 175 .name = "DS9490R",
@@ -887,9 +887,9 @@ static int ds_probe(struct usb_interface *intf,
887 if (err) 887 if (err)
888 goto err_out_clear; 888 goto err_out_clear;
889 889
890 down(&ds_mutex); 890 mutex_lock(&ds_mutex);
891 list_add_tail(&dev->ds_entry, &ds_devices); 891 list_add_tail(&dev->ds_entry, &ds_devices);
892 up(&ds_mutex); 892 mutex_unlock(&ds_mutex);
893 893
894 return 0; 894 return 0;
895 895
@@ -909,9 +909,9 @@ static void ds_disconnect(struct usb_interface *intf)
909 if (!dev) 909 if (!dev)
910 return; 910 return;
911 911
912 down(&ds_mutex); 912 mutex_lock(&ds_mutex);
913 list_del(&dev->ds_entry); 913 list_del(&dev->ds_entry);
914 up(&ds_mutex); 914 mutex_unlock(&ds_mutex);
915 915
916 ds_w1_fini(dev); 916 ds_w1_fini(dev);
917 917
diff --git a/drivers/w1/slaves/w1_ds2433.c b/drivers/w1/slaves/w1_ds2433.c
index ddd01e6fc2c9..2ac238f1480e 100644
--- a/drivers/w1/slaves/w1_ds2433.c
+++ b/drivers/w1/slaves/w1_ds2433.c
@@ -105,11 +105,7 @@ static ssize_t w1_f23_read_bin(struct kobject *kobj, char *buf, loff_t off,
105 if ((count = w1_f23_fix_count(off, count, W1_EEPROM_SIZE)) == 0) 105 if ((count = w1_f23_fix_count(off, count, W1_EEPROM_SIZE)) == 0)
106 return 0; 106 return 0;
107 107
108 atomic_inc(&sl->refcnt); 108 mutex_lock(&sl->master->mutex);
109 if (down_interruptible(&sl->master->mutex)) {
110 count = 0;
111 goto out_dec;
112 }
113 109
114#ifdef CONFIG_W1_F23_CRC 110#ifdef CONFIG_W1_F23_CRC
115 111
@@ -140,9 +136,7 @@ static ssize_t w1_f23_read_bin(struct kobject *kobj, char *buf, loff_t off,
140#endif /* CONFIG_W1_F23_CRC */ 136#endif /* CONFIG_W1_F23_CRC */
141 137
142out_up: 138out_up:
143 up(&sl->master->mutex); 139 mutex_unlock(&sl->master->mutex);
144out_dec:
145 atomic_dec(&sl->refcnt);
146 140
147 return count; 141 return count;
148} 142}
@@ -231,11 +225,7 @@ static ssize_t w1_f23_write_bin(struct kobject *kobj, char *buf, loff_t off,
231 } 225 }
232#endif /* CONFIG_W1_F23_CRC */ 226#endif /* CONFIG_W1_F23_CRC */
233 227
234 atomic_inc(&sl->refcnt); 228 mutex_lock(&sl->master->mutex);
235 if (down_interruptible(&sl->master->mutex)) {
236 count = 0;
237 goto out_dec;
238 }
239 229
240 /* Can only write data to one page at a time */ 230 /* Can only write data to one page at a time */
241 idx = 0; 231 idx = 0;
@@ -253,9 +243,7 @@ static ssize_t w1_f23_write_bin(struct kobject *kobj, char *buf, loff_t off,
253 } 243 }
254 244
255out_up: 245out_up:
256 up(&sl->master->mutex); 246 mutex_unlock(&sl->master->mutex);
257out_dec:
258 atomic_dec(&sl->refcnt);
259 247
260 return count; 248 return count;
261} 249}
diff --git a/drivers/w1/slaves/w1_therm.c b/drivers/w1/slaves/w1_therm.c
index 44afdffe3c8b..5372cfcbd054 100644
--- a/drivers/w1/slaves/w1_therm.c
+++ b/drivers/w1/slaves/w1_therm.c
@@ -165,12 +165,7 @@ static ssize_t w1_therm_read_bin(struct kobject *kobj, char *buf, loff_t off, si
165 u8 rom[9], crc, verdict; 165 u8 rom[9], crc, verdict;
166 int i, max_trying = 10; 166 int i, max_trying = 10;
167 167
168 atomic_inc(&sl->refcnt); 168 mutex_lock(&sl->master->mutex);
169 smp_mb__after_atomic_inc();
170 if (down_interruptible(&sl->master->mutex)) {
171 count = 0;
172 goto out_dec;
173 }
174 169
175 if (off > W1_SLAVE_DATA_SIZE) { 170 if (off > W1_SLAVE_DATA_SIZE) {
176 count = 0; 171 count = 0;
@@ -233,10 +228,7 @@ static ssize_t w1_therm_read_bin(struct kobject *kobj, char *buf, loff_t off, si
233 228
234 count += sprintf(buf + count, "t=%d\n", w1_convert_temp(rom, sl->family->fid)); 229 count += sprintf(buf + count, "t=%d\n", w1_convert_temp(rom, sl->family->fid));
235out: 230out:
236 up(&dev->mutex); 231 mutex_unlock(&dev->mutex);
237out_dec:
238 smp_mb__before_atomic_inc();
239 atomic_dec(&sl->refcnt);
240 232
241 return count; 233 return count;
242} 234}
diff --git a/drivers/w1/w1.c b/drivers/w1/w1.c
index 32d8de881f11..420be14c2f8e 100644
--- a/drivers/w1/w1.c
+++ b/drivers/w1/w1.c
@@ -54,7 +54,7 @@ module_param_named(control_timeout, w1_control_timeout, int, 0);
54module_param_named(max_slave_count, w1_max_slave_count, int, 0); 54module_param_named(max_slave_count, w1_max_slave_count, int, 0);
55module_param_named(slave_ttl, w1_max_slave_ttl, int, 0); 55module_param_named(slave_ttl, w1_max_slave_ttl, int, 0);
56 56
57DECLARE_MUTEX(w1_mlock); 57DEFINE_MUTEX(w1_mlock);
58LIST_HEAD(w1_masters); 58LIST_HEAD(w1_masters);
59 59
60static struct task_struct *w1_control_thread; 60static struct task_struct *w1_control_thread;
@@ -139,11 +139,7 @@ static ssize_t w1_default_write(struct kobject *kobj, char *buf, loff_t off, siz
139{ 139{
140 struct w1_slave *sl = kobj_to_w1_slave(kobj); 140 struct w1_slave *sl = kobj_to_w1_slave(kobj);
141 141
142 if (down_interruptible(&sl->master->mutex)) { 142 mutex_lock(&sl->master->mutex);
143 count = 0;
144 goto out;
145 }
146
147 if (w1_reset_select_slave(sl)) { 143 if (w1_reset_select_slave(sl)) {
148 count = 0; 144 count = 0;
149 goto out_up; 145 goto out_up;
@@ -152,8 +148,7 @@ static ssize_t w1_default_write(struct kobject *kobj, char *buf, loff_t off, siz
152 w1_write_block(sl->master, buf, count); 148 w1_write_block(sl->master, buf, count);
153 149
154out_up: 150out_up:
155 up(&sl->master->mutex); 151 mutex_unlock(&sl->master->mutex);
156out:
157 return count; 152 return count;
158} 153}
159 154
@@ -161,15 +156,9 @@ static ssize_t w1_default_read(struct kobject *kobj, char *buf, loff_t off, size
161{ 156{
162 struct w1_slave *sl = kobj_to_w1_slave(kobj); 157 struct w1_slave *sl = kobj_to_w1_slave(kobj);
163 158
164 if (down_interruptible(&sl->master->mutex)) { 159 mutex_lock(&sl->master->mutex);
165 count = 0;
166 goto out;
167 }
168
169 w1_read_block(sl->master, buf, count); 160 w1_read_block(sl->master, buf, count);
170 161 mutex_unlock(&sl->master->mutex);
171 up(&sl->master->mutex);
172out:
173 return count; 162 return count;
174} 163}
175 164
@@ -243,12 +232,9 @@ static ssize_t w1_master_attribute_show_name(struct device *dev, struct device_a
243 struct w1_master *md = dev_to_w1_master(dev); 232 struct w1_master *md = dev_to_w1_master(dev);
244 ssize_t count; 233 ssize_t count;
245 234
246 if (down_interruptible (&md->mutex)) 235 mutex_lock(&md->mutex);
247 return -EBUSY;
248
249 count = sprintf(buf, "%s\n", md->name); 236 count = sprintf(buf, "%s\n", md->name);
250 237 mutex_unlock(&md->mutex);
251 up(&md->mutex);
252 238
253 return count; 239 return count;
254} 240}
@@ -259,12 +245,9 @@ static ssize_t w1_master_attribute_store_search(struct device * dev,
259{ 245{
260 struct w1_master *md = dev_to_w1_master(dev); 246 struct w1_master *md = dev_to_w1_master(dev);
261 247
262 if (down_interruptible (&md->mutex)) 248 mutex_lock(&md->mutex);
263 return -EBUSY;
264
265 md->search_count = simple_strtol(buf, NULL, 0); 249 md->search_count = simple_strtol(buf, NULL, 0);
266 250 mutex_unlock(&md->mutex);
267 up(&md->mutex);
268 251
269 return count; 252 return count;
270} 253}
@@ -276,12 +259,9 @@ static ssize_t w1_master_attribute_show_search(struct device *dev,
276 struct w1_master *md = dev_to_w1_master(dev); 259 struct w1_master *md = dev_to_w1_master(dev);
277 ssize_t count; 260 ssize_t count;
278 261
279 if (down_interruptible (&md->mutex)) 262 mutex_lock(&md->mutex);
280 return -EBUSY;
281
282 count = sprintf(buf, "%d\n", md->search_count); 263 count = sprintf(buf, "%d\n", md->search_count);
283 264 mutex_unlock(&md->mutex);
284 up(&md->mutex);
285 265
286 return count; 266 return count;
287} 267}
@@ -291,12 +271,9 @@ static ssize_t w1_master_attribute_show_pointer(struct device *dev, struct devic
291 struct w1_master *md = dev_to_w1_master(dev); 271 struct w1_master *md = dev_to_w1_master(dev);
292 ssize_t count; 272 ssize_t count;
293 273
294 if (down_interruptible(&md->mutex)) 274 mutex_lock(&md->mutex);
295 return -EBUSY;
296
297 count = sprintf(buf, "0x%p\n", md->bus_master); 275 count = sprintf(buf, "0x%p\n", md->bus_master);
298 276 mutex_unlock(&md->mutex);
299 up(&md->mutex);
300 return count; 277 return count;
301} 278}
302 279
@@ -312,12 +289,9 @@ static ssize_t w1_master_attribute_show_max_slave_count(struct device *dev, stru
312 struct w1_master *md = dev_to_w1_master(dev); 289 struct w1_master *md = dev_to_w1_master(dev);
313 ssize_t count; 290 ssize_t count;
314 291
315 if (down_interruptible(&md->mutex)) 292 mutex_lock(&md->mutex);
316 return -EBUSY;
317
318 count = sprintf(buf, "%d\n", md->max_slave_count); 293 count = sprintf(buf, "%d\n", md->max_slave_count);
319 294 mutex_unlock(&md->mutex);
320 up(&md->mutex);
321 return count; 295 return count;
322} 296}
323 297
@@ -326,12 +300,9 @@ static ssize_t w1_master_attribute_show_attempts(struct device *dev, struct devi
326 struct w1_master *md = dev_to_w1_master(dev); 300 struct w1_master *md = dev_to_w1_master(dev);
327 ssize_t count; 301 ssize_t count;
328 302
329 if (down_interruptible(&md->mutex)) 303 mutex_lock(&md->mutex);
330 return -EBUSY;
331
332 count = sprintf(buf, "%lu\n", md->attempts); 304 count = sprintf(buf, "%lu\n", md->attempts);
333 305 mutex_unlock(&md->mutex);
334 up(&md->mutex);
335 return count; 306 return count;
336} 307}
337 308
@@ -340,12 +311,9 @@ static ssize_t w1_master_attribute_show_slave_count(struct device *dev, struct d
340 struct w1_master *md = dev_to_w1_master(dev); 311 struct w1_master *md = dev_to_w1_master(dev);
341 ssize_t count; 312 ssize_t count;
342 313
343 if (down_interruptible(&md->mutex)) 314 mutex_lock(&md->mutex);
344 return -EBUSY;
345
346 count = sprintf(buf, "%d\n", md->slave_count); 315 count = sprintf(buf, "%d\n", md->slave_count);
347 316 mutex_unlock(&md->mutex);
348 up(&md->mutex);
349 return count; 317 return count;
350} 318}
351 319
@@ -354,8 +322,7 @@ static ssize_t w1_master_attribute_show_slaves(struct device *dev, struct device
354 struct w1_master *md = dev_to_w1_master(dev); 322 struct w1_master *md = dev_to_w1_master(dev);
355 int c = PAGE_SIZE; 323 int c = PAGE_SIZE;
356 324
357 if (down_interruptible(&md->mutex)) 325 mutex_lock(&md->mutex);
358 return -EBUSY;
359 326
360 if (md->slave_count == 0) 327 if (md->slave_count == 0)
361 c -= snprintf(buf + PAGE_SIZE - c, c, "not found.\n"); 328 c -= snprintf(buf + PAGE_SIZE - c, c, "not found.\n");
@@ -370,7 +337,7 @@ static ssize_t w1_master_attribute_show_slaves(struct device *dev, struct device
370 } 337 }
371 } 338 }
372 339
373 up(&md->mutex); 340 mutex_unlock(&md->mutex);
374 341
375 return PAGE_SIZE - c; 342 return PAGE_SIZE - c;
376} 343}
@@ -620,7 +587,7 @@ static struct w1_master *w1_search_master(void *data)
620 struct w1_master *dev; 587 struct w1_master *dev;
621 int found = 0; 588 int found = 0;
622 589
623 down(&w1_mlock); 590 mutex_lock(&w1_mlock);
624 list_for_each_entry(dev, &w1_masters, w1_master_entry) { 591 list_for_each_entry(dev, &w1_masters, w1_master_entry) {
625 if (dev->bus_master->data == data) { 592 if (dev->bus_master->data == data) {
626 found = 1; 593 found = 1;
@@ -628,7 +595,7 @@ static struct w1_master *w1_search_master(void *data)
628 break; 595 break;
629 } 596 }
630 } 597 }
631 up(&w1_mlock); 598 mutex_unlock(&w1_mlock);
632 599
633 return (found)?dev:NULL; 600 return (found)?dev:NULL;
634} 601}
@@ -638,7 +605,7 @@ struct w1_master *w1_search_master_id(u32 id)
638 struct w1_master *dev; 605 struct w1_master *dev;
639 int found = 0; 606 int found = 0;
640 607
641 down(&w1_mlock); 608 mutex_lock(&w1_mlock);
642 list_for_each_entry(dev, &w1_masters, w1_master_entry) { 609 list_for_each_entry(dev, &w1_masters, w1_master_entry) {
643 if (dev->id == id) { 610 if (dev->id == id) {
644 found = 1; 611 found = 1;
@@ -646,7 +613,7 @@ struct w1_master *w1_search_master_id(u32 id)
646 break; 613 break;
647 } 614 }
648 } 615 }
649 up(&w1_mlock); 616 mutex_unlock(&w1_mlock);
650 617
651 return (found)?dev:NULL; 618 return (found)?dev:NULL;
652} 619}
@@ -657,9 +624,9 @@ struct w1_slave *w1_search_slave(struct w1_reg_num *id)
657 struct w1_slave *sl = NULL; 624 struct w1_slave *sl = NULL;
658 int found = 0; 625 int found = 0;
659 626
660 down(&w1_mlock); 627 mutex_lock(&w1_mlock);
661 list_for_each_entry(dev, &w1_masters, w1_master_entry) { 628 list_for_each_entry(dev, &w1_masters, w1_master_entry) {
662 down(&dev->mutex); 629 mutex_lock(&dev->mutex);
663 list_for_each_entry(sl, &dev->slist, w1_slave_entry) { 630 list_for_each_entry(sl, &dev->slist, w1_slave_entry) {
664 if (sl->reg_num.family == id->family && 631 if (sl->reg_num.family == id->family &&
665 sl->reg_num.id == id->id && 632 sl->reg_num.id == id->id &&
@@ -670,12 +637,12 @@ struct w1_slave *w1_search_slave(struct w1_reg_num *id)
670 break; 637 break;
671 } 638 }
672 } 639 }
673 up(&dev->mutex); 640 mutex_unlock(&dev->mutex);
674 641
675 if (found) 642 if (found)
676 break; 643 break;
677 } 644 }
678 up(&w1_mlock); 645 mutex_unlock(&w1_mlock);
679 646
680 return (found)?sl:NULL; 647 return (found)?sl:NULL;
681} 648}
@@ -684,13 +651,13 @@ void w1_reconnect_slaves(struct w1_family *f)
684{ 651{
685 struct w1_master *dev; 652 struct w1_master *dev;
686 653
687 down(&w1_mlock); 654 mutex_lock(&w1_mlock);
688 list_for_each_entry(dev, &w1_masters, w1_master_entry) { 655 list_for_each_entry(dev, &w1_masters, w1_master_entry) {
689 dev_dbg(&dev->dev, "Reconnecting slaves in %s into new family %02x.\n", 656 dev_dbg(&dev->dev, "Reconnecting slaves in %s into new family %02x.\n",
690 dev->name, f->fid); 657 dev->name, f->fid);
691 set_bit(W1_MASTER_NEED_RECONNECT, &dev->flags); 658 set_bit(W1_MASTER_NEED_RECONNECT, &dev->flags);
692 } 659 }
693 up(&w1_mlock); 660 mutex_unlock(&w1_mlock);
694} 661}
695 662
696static void w1_slave_found(void *data, u64 rn) 663static void w1_slave_found(void *data, u64 rn)
@@ -845,23 +812,23 @@ static int w1_control(void *data)
845 if (kthread_should_stop() || test_bit(W1_MASTER_NEED_EXIT, &dev->flags)) { 812 if (kthread_should_stop() || test_bit(W1_MASTER_NEED_EXIT, &dev->flags)) {
846 set_bit(W1_MASTER_NEED_EXIT, &dev->flags); 813 set_bit(W1_MASTER_NEED_EXIT, &dev->flags);
847 814
848 down(&w1_mlock); 815 mutex_lock(&w1_mlock);
849 list_del(&dev->w1_master_entry); 816 list_del(&dev->w1_master_entry);
850 up(&w1_mlock); 817 mutex_unlock(&w1_mlock);
851 818
852 down(&dev->mutex); 819 mutex_lock(&dev->mutex);
853 list_for_each_entry_safe(sl, sln, &dev->slist, w1_slave_entry) { 820 list_for_each_entry_safe(sl, sln, &dev->slist, w1_slave_entry) {
854 w1_slave_detach(sl); 821 w1_slave_detach(sl);
855 } 822 }
856 w1_destroy_master_attributes(dev); 823 w1_destroy_master_attributes(dev);
857 up(&dev->mutex); 824 mutex_unlock(&dev->mutex);
858 atomic_dec(&dev->refcnt); 825 atomic_dec(&dev->refcnt);
859 continue; 826 continue;
860 } 827 }
861 828
862 if (test_bit(W1_MASTER_NEED_RECONNECT, &dev->flags)) { 829 if (test_bit(W1_MASTER_NEED_RECONNECT, &dev->flags)) {
863 dev_dbg(&dev->dev, "Reconnecting slaves in device %s.\n", dev->name); 830 dev_dbg(&dev->dev, "Reconnecting slaves in device %s.\n", dev->name);
864 down(&dev->mutex); 831 mutex_lock(&dev->mutex);
865 list_for_each_entry_safe(sl, sln, &dev->slist, w1_slave_entry) { 832 list_for_each_entry_safe(sl, sln, &dev->slist, w1_slave_entry) {
866 if (sl->family->fid == W1_FAMILY_DEFAULT) { 833 if (sl->family->fid == W1_FAMILY_DEFAULT) {
867 struct w1_reg_num rn; 834 struct w1_reg_num rn;
@@ -874,7 +841,7 @@ static int w1_control(void *data)
874 } 841 }
875 dev_dbg(&dev->dev, "Reconnecting slaves in device %s has been finished.\n", dev->name); 842 dev_dbg(&dev->dev, "Reconnecting slaves in device %s has been finished.\n", dev->name);
876 clear_bit(W1_MASTER_NEED_RECONNECT, &dev->flags); 843 clear_bit(W1_MASTER_NEED_RECONNECT, &dev->flags);
877 up(&dev->mutex); 844 mutex_unlock(&dev->mutex);
878 } 845 }
879 } 846 }
880 } 847 }
@@ -921,12 +888,9 @@ int w1_process(void *data)
921 if (dev->search_count == 0) 888 if (dev->search_count == 0)
922 continue; 889 continue;
923 890
924 if (down_interruptible(&dev->mutex)) 891 mutex_lock(&dev->mutex);
925 continue;
926
927 w1_search_process(dev, W1_SEARCH); 892 w1_search_process(dev, W1_SEARCH);
928 893 mutex_unlock(&dev->mutex);
929 up(&dev->mutex);
930 } 894 }
931 895
932 atomic_dec(&dev->refcnt); 896 atomic_dec(&dev->refcnt);
diff --git a/drivers/w1/w1.h b/drivers/w1/w1.h
index e8c96e6e7418..6caccfc97cdf 100644
--- a/drivers/w1/w1.h
+++ b/drivers/w1/w1.h
@@ -41,8 +41,7 @@ struct w1_reg_num
41 41
42#include <linux/completion.h> 42#include <linux/completion.h>
43#include <linux/device.h> 43#include <linux/device.h>
44 44#include <linux/mutex.h>
45#include <asm/semaphore.h>
46 45
47#include "w1_family.h" 46#include "w1_family.h"
48 47
@@ -171,7 +170,7 @@ struct w1_master
171 long flags; 170 long flags;
172 171
173 struct task_struct *thread; 172 struct task_struct *thread;
174 struct semaphore mutex; 173 struct mutex mutex;
175 174
176 struct device_driver *driver; 175 struct device_driver *driver;
177 struct device dev; 176 struct device dev;
diff --git a/drivers/w1/w1_int.c b/drivers/w1/w1_int.c
index ae78473d11f9..24e7c102fa75 100644
--- a/drivers/w1/w1_int.c
+++ b/drivers/w1/w1_int.c
@@ -36,7 +36,7 @@ extern struct device w1_master_device;
36extern int w1_max_slave_count; 36extern int w1_max_slave_count;
37extern int w1_max_slave_ttl; 37extern int w1_max_slave_ttl;
38extern struct list_head w1_masters; 38extern struct list_head w1_masters;
39extern struct semaphore w1_mlock; 39extern struct mutex w1_mlock;
40 40
41extern int w1_process(void *); 41extern int w1_process(void *);
42 42
@@ -74,7 +74,7 @@ static struct w1_master * w1_alloc_dev(u32 id, int slave_count, int slave_ttl,
74 atomic_set(&dev->refcnt, 2); 74 atomic_set(&dev->refcnt, 2);
75 75
76 INIT_LIST_HEAD(&dev->slist); 76 INIT_LIST_HEAD(&dev->slist);
77 init_MUTEX(&dev->mutex); 77 mutex_init(&dev->mutex);
78 78
79 memcpy(&dev->dev, device, sizeof(struct device)); 79 memcpy(&dev->dev, device, sizeof(struct device));
80 snprintf(dev->dev.bus_id, sizeof(dev->dev.bus_id), 80 snprintf(dev->dev.bus_id, sizeof(dev->dev.bus_id),
@@ -135,9 +135,9 @@ int w1_add_master_device(struct w1_bus_master *master)
135 135
136 dev->initialized = 1; 136 dev->initialized = 1;
137 137
138 down(&w1_mlock); 138 mutex_lock(&w1_mlock);
139 list_add(&dev->w1_master_entry, &w1_masters); 139 list_add(&dev->w1_master_entry, &w1_masters);
140 up(&w1_mlock); 140 mutex_unlock(&w1_mlock);
141 141
142 memset(&msg, 0, sizeof(msg)); 142 memset(&msg, 0, sizeof(msg));
143 msg.id.mst.id = dev->id; 143 msg.id.mst.id = dev->id;
diff --git a/drivers/w1/w1_netlink.c b/drivers/w1/w1_netlink.c
index d539e09aad37..65c5ebd0787e 100644
--- a/drivers/w1/w1_netlink.c
+++ b/drivers/w1/w1_netlink.c
@@ -171,7 +171,7 @@ static void w1_cn_callback(void *data)
171 goto out_cont; 171 goto out_cont;
172 } 172 }
173 173
174 down(&dev->mutex); 174 mutex_lock(&dev->mutex);
175 175
176 if (sl && w1_reset_select_slave(sl)) { 176 if (sl && w1_reset_select_slave(sl)) {
177 err = -ENODEV; 177 err = -ENODEV;
@@ -198,7 +198,7 @@ out_up:
198 atomic_dec(&dev->refcnt); 198 atomic_dec(&dev->refcnt);
199 if (sl) 199 if (sl)
200 atomic_dec(&sl->refcnt); 200 atomic_dec(&sl->refcnt);
201 up(&dev->mutex); 201 mutex_unlock(&dev->mutex);
202out_cont: 202out_cont:
203 msg->len -= sizeof(struct w1_netlink_msg) + m->len; 203 msg->len -= sizeof(struct w1_netlink_msg) + m->len;
204 m = (struct w1_netlink_msg *)(((u8 *)m) + sizeof(struct w1_netlink_msg) + m->len); 204 m = (struct w1_netlink_msg *)(((u8 *)m) + sizeof(struct w1_netlink_msg) + m->len);