c527e70bd410c29d3b0ea09d53c760aacdcb9619
[kernel-power] / kernel-power-2.6.28 / debian / patches / radio-si4713.diff
1 --- kernel-power-2.6.28/drivers/media/radio/radio-si4713.c      2012-02-17 20:44:03.508286080 +0100
2 +++ kernel-power-2.6.28/drivers/media/radio/radio-si4713.c      2012-02-17 20:45:13.976284020 +0100
3 @@ -55,23 +55,10 @@
4  static int radio_nr = -1;      /* radio device minor (-1 ==> auto assign) */
5  
6  /* properties lock for write operations */
7 -static int config_locked;
8 +static int config_locked = 1;
9  
10 -/* saved power levels */
11 -static unsigned int max_pl;
12 -static unsigned int min_pl;
13 -
14 -/* structure for pid registration */
15 -struct pid_list {
16 -       pid_t pid;
17 -       struct list_head plist;
18 -};
19 -
20 -#define APP_MAX_NUM    2
21 -
22 -static int pid_count;
23 -static LIST_HEAD(pid_list_head);
24 -static struct si4713_device *si4713_dev;
25 +/* module param for initial power level */
26 +static int init_power_level = 120;
27  
28  /*
29   * Sysfs properties
30 @@ -193,17 +180,7 @@ static ssize_t si4713_lock_write(struct
31                                 const char *buf,
32                                 size_t count)
33  {
34 -       int l;
35 -
36 -       if (config_locked)
37 -               return -EPERM;
38 -
39 -       sscanf(buf, "%d", &l);
40 -
41 -       if (l != 0)
42 -               config_locked = 1;
43 -
44 -       return count;
45 +       return sscanf(buf, "%d", &config_locked);
46  }
47  
48  static ssize_t si4713_lock_read(struct device *dev,
49 @@ -219,7 +196,7 @@ static DEVICE_ATTR(lock, S_IRUGO | S_IWU
50  /*
51   * Power level property
52   */
53 -/* power_level (rw) 88 - 115 or 0 */
54 +/* power_level (rw) 88 - 120 or 0 */
55  static ssize_t si4713_power_level_write(struct device *dev,
56                                         struct device_attribute *attr,
57                                         const char *buf,
58 @@ -230,7 +207,7 @@ static ssize_t si4713_power_level_write(
59         int rval, pl;
60  
61         if (config_locked)
62 -               return -EPERM;
63 +               return count;
64  
65         if (!sdev) {
66                 rval = -ENODEV;
67 @@ -420,109 +397,13 @@ static irqreturn_t si4713_handler(int ir
68         return IRQ_HANDLED;
69  }
70  
71 -static int register_pid(pid_t pid)
72 -{
73 -       struct pid_list *pitem;
74 -
75 -       list_for_each_entry(pitem, &pid_list_head, plist) {
76 -               if (pitem->pid == pid)
77 -                       return -EINVAL;
78 -       }
79 -
80 -       pitem = kmalloc(sizeof(struct pid_list), GFP_KERNEL);
81 -
82 -       if (!pitem)
83 -               return -ENOMEM;
84 -
85 -       pitem->pid = pid;
86 -
87 -       list_add(&(pitem->plist), &pid_list_head);
88 -       pid_count++;
89 -
90 -       return 0;
91 -}
92 -
93 -static int unregister_pid(pid_t pid)
94 -{
95 -       struct pid_list *pitem, *n;
96 -
97 -       list_for_each_entry_safe(pitem, n, &pid_list_head, plist) {
98 -               if (pitem->pid == pid) {
99 -                       list_del(&(pitem->plist));
100 -                       pid_count--;
101 -
102 -                       kfree(pitem);
103 -
104 -                       return 0;
105 -               }
106 -       }
107 -       return -EINVAL;
108 -}
109 -
110  static int si4713_priv_ioctl(struct inode *inode, struct file *file,
111                 unsigned int cmd, unsigned long arg)
112  {
113 -       unsigned int pow;
114 -       int pl, rval;
115 -
116         if (cmd != LOCK_LOW_POWER && cmd != RELEASE_LOW_POWER)
117                 return video_ioctl2(inode, file, cmd, arg);
118 -
119 -       pl = si4713_get_power_level(si4713_dev);
120 -
121 -       if (pl < 0) {
122 -               rval = pl;
123 -               goto exit;
124 -       }
125 -
126 -       if (copy_from_user(&pow, (void __user *)arg, sizeof(pow))) {
127 -               rval = -EFAULT;
128 -               goto exit;
129 -       }
130 -
131 -       if (cmd == LOCK_LOW_POWER) {
132 -
133 -               if (pid_count == APP_MAX_NUM) {
134 -                       rval = -EPERM;
135 -                       goto exit;
136 -               }
137 -
138 -               if (pid_count == 0) {
139 -                       if (pow > pl) {
140 -                               rval = -EINVAL;
141 -                               goto exit;
142 -                       } else {
143 -                               /* Set max possible power level */
144 -                               max_pl = pl;
145 -                               min_pl = pow;
146 -                       }
147 -               }
148 -
149 -               rval = register_pid(current->pid);
150 -
151 -               if (rval)
152 -                       goto exit;
153 -
154 -               /* Lower min power level if asked */
155 -               if (pow < min_pl)
156 -                       min_pl = pow;
157 -               else
158 -                       pow = min_pl;
159 -
160 -       } else { /* RELEASE_LOW_POWER */
161 -               rval = unregister_pid(current->pid);
162 -
163 -               if (rval)
164 -                       goto exit;
165 -
166 -               if (pid_count == 0) {
167 -                       if (pow > max_pl)
168 -                               pow = max_pl;
169 -               }
170 -       }
171 -       rval = si4713_set_power_level(si4713_dev, pow);
172 -exit:
173 -       return rval;
174 +       else
175 +               return 0;
176  }
177  
178  /*
179 @@ -906,8 +787,11 @@ static int si4713_i2c_driver_probe(struc
180                 goto free_sysfs;
181         }
182  
183 -       /* save to global pointer for it to be accesible from ioctl() call */
184 -       si4713_dev = sdev;
185 +       rval = si4713_set_power_level(sdev, init_power_level);
186 +       if (rval < 0) {
187 +               dev_dbg(&client->dev, "Failed to set initial power level.\n");
188 +               goto free_sysfs;
189 +       }
190  
191         return 0;
192  
193 @@ -1013,6 +897,12 @@ module_param(radio_nr, int, 0);
194  MODULE_PARM_DESC(radio_nr,
195                  "Minor number for radio device (-1 ==> auto assign)");
196  
197 +module_param(init_power_level, int, 120);
198 +MODULE_PARM_DESC(init_power_level, "Initial value of power level (default 120)");
199 +
200 +module_param(config_locked, int, 1);
201 +MODULE_PARM_DESC(config_locked, "Lock power level configuration on init (default 1 - locked)");
202 +
203  MODULE_LICENSE("GPL");
204  MODULE_AUTHOR(DRIVER_AUTHOR);
205  MODULE_DESCRIPTION(DRIVER_DESC);