]>
Commit | Line | Data |
---|---|---|
982da5a1 HL |
1 | /* |
2 | * Stuff used by all variants of the driver | |
3 | * | |
70440cf2 | 4 | * Copyright (c) 2001 by Stefan Eilers, |
982da5a1 HL |
5 | * Hansjoerg Lipp <hjlipp@web.de>, |
6 | * Tilman Schmidt <tilman@imap.cc>. | |
7 | * | |
8 | * ===================================================================== | |
9 | * This program is free software; you can redistribute it and/or | |
10 | * modify it under the terms of the GNU General Public License as | |
11 | * published by the Free Software Foundation; either version 2 of | |
12 | * the License, or (at your option) any later version. | |
13 | * ===================================================================== | |
982da5a1 HL |
14 | */ |
15 | ||
16 | #include "gigaset.h" | |
17 | #include <linux/ctype.h> | |
18 | ||
01107d34 GKH |
19 | static ssize_t show_cidmode(struct device *dev, |
20 | struct device_attribute *attr, char *buf) | |
982da5a1 | 21 | { |
69049cc8 TS |
22 | int ret; |
23 | unsigned long flags; | |
01107d34 | 24 | struct cardstate *cs = dev_get_drvdata(dev); |
69049cc8 TS |
25 | |
26 | spin_lock_irqsave(&cs->lock, flags); | |
27 | ret = sprintf(buf, "%u\n", cs->cidmode); | |
28 | spin_unlock_irqrestore(&cs->lock, flags); | |
29 | ||
30 | return ret; | |
982da5a1 HL |
31 | } |
32 | ||
01107d34 | 33 | static ssize_t set_cidmode(struct device *dev, struct device_attribute *attr, |
917f5085 | 34 | const char *buf, size_t count) |
982da5a1 | 35 | { |
01107d34 | 36 | struct cardstate *cs = dev_get_drvdata(dev); |
982da5a1 HL |
37 | long int value; |
38 | char *end; | |
39 | ||
40 | value = simple_strtol(buf, &end, 0); | |
41 | while (*end) | |
42 | if (!isspace(*end++)) | |
43 | return -EINVAL; | |
44 | if (value < 0 || value > 1) | |
45 | return -EINVAL; | |
46 | ||
abfd1dc7 | 47 | if (mutex_lock_interruptible(&cs->mutex)) |
982da5a1 HL |
48 | return -ERESTARTSYS; // FIXME -EINTR? |
49 | ||
50 | cs->waiting = 1; | |
51 | if (!gigaset_add_event(cs, &cs->at_state, EV_PROC_CIDMODE, | |
784d5858 | 52 | NULL, value, NULL)) { |
982da5a1 | 53 | cs->waiting = 0; |
abfd1dc7 | 54 | mutex_unlock(&cs->mutex); |
982da5a1 HL |
55 | return -ENOMEM; |
56 | } | |
57 | ||
784d5858 | 58 | gig_dbg(DEBUG_CMD, "scheduling PROC_CIDMODE"); |
982da5a1 HL |
59 | gigaset_schedule_event(cs); |
60 | ||
61 | wait_event(cs->waitqueue, !cs->waiting); | |
62 | ||
abfd1dc7 | 63 | mutex_unlock(&cs->mutex); |
982da5a1 HL |
64 | |
65 | return count; | |
66 | } | |
67 | ||
01107d34 | 68 | static DEVICE_ATTR(cidmode, S_IRUGO|S_IWUSR, show_cidmode, set_cidmode); |
982da5a1 HL |
69 | |
70 | /* free sysfs for device */ | |
b1d47464 | 71 | void gigaset_free_dev_sysfs(struct cardstate *cs) |
982da5a1 | 72 | { |
01107d34 | 73 | if (!cs->tty_dev) |
3dda4e37 HL |
74 | return; |
75 | ||
784d5858 | 76 | gig_dbg(DEBUG_INIT, "removing sysfs entries"); |
01107d34 | 77 | device_remove_file(cs->tty_dev, &dev_attr_cidmode); |
982da5a1 | 78 | } |
982da5a1 HL |
79 | |
80 | /* initialize sysfs for device */ | |
b1d47464 | 81 | void gigaset_init_dev_sysfs(struct cardstate *cs) |
982da5a1 | 82 | { |
01107d34 | 83 | if (!cs->tty_dev) |
3dda4e37 HL |
84 | return; |
85 | ||
784d5858 | 86 | gig_dbg(DEBUG_INIT, "setting up sysfs"); |
01107d34 | 87 | if (device_create_file(cs->tty_dev, &dev_attr_cidmode)) |
fd0fbcc2 | 88 | dev_err(cs->dev, "could not create sysfs attribute\n"); |
982da5a1 | 89 | } |