Skip to content

Commit c3c6dd7

Browse files
Alphixmchehab
authored andcommitted
[media] media: lirc_dev: remove support for manually specifying minor number
All users of lirc_register_driver() uses dynamic minor allocation, therefore we can remove the ability to explicitly request a given number. This changes the function prototype of lirc_unregister_driver() to also take a struct lirc_driver pointer as the sole argument. Signed-off-by: David Härdeman <[email protected]> Signed-off-by: Sean Young <[email protected]> Signed-off-by: Mauro Carvalho Chehab <[email protected]>
1 parent de226ec commit c3c6dd7

File tree

4 files changed

+34
-77
lines changed

4 files changed

+34
-77
lines changed

drivers/media/rc/ir-lirc-codec.c

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -382,7 +382,6 @@ static int ir_lirc_register(struct rc_dev *dev)
382382

383383
snprintf(drv->name, sizeof(drv->name), "ir-lirc-codec (%s)",
384384
dev->driver_name);
385-
drv->minor = -1;
386385
drv->features = features;
387386
drv->data = &dev->raw->lirc;
388387
drv->rbuf = NULL;
@@ -394,11 +393,9 @@ static int ir_lirc_register(struct rc_dev *dev)
394393
drv->rdev = dev;
395394
drv->owner = THIS_MODULE;
396395

397-
drv->minor = lirc_register_driver(drv);
398-
if (drv->minor < 0) {
399-
rc = -ENODEV;
396+
rc = lirc_register_driver(drv);
397+
if (rc < 0)
400398
goto out;
401-
}
402399

403400
dev->raw->lirc.drv = drv;
404401
dev->raw->lirc.dev = dev;
@@ -413,7 +410,7 @@ static int ir_lirc_unregister(struct rc_dev *dev)
413410
{
414411
struct lirc_codec *lirc = &dev->raw->lirc;
415412

416-
lirc_unregister_driver(lirc->drv->minor);
413+
lirc_unregister_driver(lirc->drv);
417414
kfree(lirc->drv);
418415
lirc->drv = NULL;
419416

drivers/media/rc/lirc_dev.c

Lines changed: 17 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@
2929
#include <media/lirc.h>
3030
#include <media/lirc_dev.h>
3131

32-
#define NOPLUG -1
3332
#define LOGHEAD "lirc_dev (%s[%d]): "
3433

3534
static dev_t lirc_base_dev;
@@ -114,7 +113,7 @@ static int lirc_allocate_buffer(struct irctl *ir)
114113
int lirc_register_driver(struct lirc_driver *d)
115114
{
116115
struct irctl *ir;
117-
int minor;
116+
unsigned int minor;
118117
int err;
119118

120119
if (!d) {
@@ -132,12 +131,6 @@ int lirc_register_driver(struct lirc_driver *d)
132131
return -EINVAL;
133132
}
134133

135-
if (d->minor >= MAX_IRCTL_DEVICES) {
136-
dev_err(d->dev, "minor must be between 0 and %d!\n",
137-
MAX_IRCTL_DEVICES - 1);
138-
return -EBADRQC;
139-
}
140-
141134
if (d->code_length < 1 || d->code_length > (BUFLEN * 8)) {
142135
dev_err(d->dev, "code length must be less than %d bits\n",
143136
BUFLEN * 8);
@@ -152,21 +145,14 @@ int lirc_register_driver(struct lirc_driver *d)
152145

153146
mutex_lock(&lirc_dev_lock);
154147

155-
minor = d->minor;
148+
/* find first free slot for driver */
149+
for (minor = 0; minor < MAX_IRCTL_DEVICES; minor++)
150+
if (!irctls[minor])
151+
break;
156152

157-
if (minor < 0) {
158-
/* find first free slot for driver */
159-
for (minor = 0; minor < MAX_IRCTL_DEVICES; minor++)
160-
if (!irctls[minor])
161-
break;
162-
if (minor == MAX_IRCTL_DEVICES) {
163-
dev_err(d->dev, "no free slots for drivers!\n");
164-
err = -ENOMEM;
165-
goto out_lock;
166-
}
167-
} else if (irctls[minor]) {
168-
dev_err(d->dev, "minor (%d) just registered!\n", minor);
169-
err = -EBUSY;
153+
if (minor == MAX_IRCTL_DEVICES) {
154+
dev_err(d->dev, "no free slots for drivers!\n");
155+
err = -ENOMEM;
170156
goto out_lock;
171157
}
172158

@@ -178,6 +164,7 @@ int lirc_register_driver(struct lirc_driver *d)
178164

179165
mutex_init(&ir->irctl_lock);
180166
irctls[minor] = ir;
167+
d->irctl = ir;
181168
d->minor = minor;
182169

183170
/* some safety check 8-) */
@@ -225,7 +212,7 @@ int lirc_register_driver(struct lirc_driver *d)
225212
dev_info(ir->d.dev, "lirc_dev: driver %s registered at minor = %d\n",
226213
ir->d.name, ir->d.minor);
227214

228-
return minor;
215+
return 0;
229216

230217
out_cdev:
231218
cdev_del(&ir->cdev);
@@ -238,38 +225,24 @@ int lirc_register_driver(struct lirc_driver *d)
238225
}
239226
EXPORT_SYMBOL(lirc_register_driver);
240227

241-
int lirc_unregister_driver(int minor)
228+
void lirc_unregister_driver(struct lirc_driver *d)
242229
{
243230
struct irctl *ir;
244231

245-
if (minor < 0 || minor >= MAX_IRCTL_DEVICES) {
246-
pr_err("minor (%d) must be between 0 and %d!\n",
247-
minor, MAX_IRCTL_DEVICES - 1);
248-
return -EBADRQC;
249-
}
232+
if (!d || !d->irctl)
233+
return;
250234

251-
ir = irctls[minor];
252-
if (!ir) {
253-
pr_err("failed to get irctl\n");
254-
return -ENOENT;
255-
}
235+
ir = d->irctl;
256236

257237
mutex_lock(&lirc_dev_lock);
258238

259-
if (ir->d.minor != minor) {
260-
dev_err(ir->d.dev, "lirc_dev: minor %d device not registered\n",
261-
minor);
262-
mutex_unlock(&lirc_dev_lock);
263-
return -ENOENT;
264-
}
265-
266239
dev_dbg(ir->d.dev, "lirc_dev: driver %s unregistered from minor = %d\n",
267-
ir->d.name, ir->d.minor);
240+
d->name, d->minor);
268241

269242
ir->attached = 0;
270243
if (ir->open) {
271244
dev_dbg(ir->d.dev, LOGHEAD "releasing opened driver\n",
272-
ir->d.name, ir->d.minor);
245+
d->name, d->minor);
273246
wake_up_interruptible(&ir->buf->wait_poll);
274247
}
275248

@@ -278,8 +251,6 @@ int lirc_unregister_driver(int minor)
278251
device_del(&ir->dev);
279252
cdev_del(&ir->cdev);
280253
put_device(&ir->dev);
281-
282-
return 0;
283254
}
284255
EXPORT_SYMBOL(lirc_unregister_driver);
285256

@@ -306,11 +277,6 @@ int lirc_dev_fop_open(struct inode *inode, struct file *file)
306277

307278
dev_dbg(ir->d.dev, LOGHEAD "open called\n", ir->d.name, ir->d.minor);
308279

309-
if (ir->d.minor == NOPLUG) {
310-
retval = -ENODEV;
311-
goto error;
312-
}
313-
314280
if (ir->open) {
315281
retval = -EBUSY;
316282
goto error;
@@ -403,7 +369,7 @@ long lirc_dev_fop_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
403369
dev_dbg(ir->d.dev, LOGHEAD "ioctl called (0x%x)\n",
404370
ir->d.name, ir->d.minor, cmd);
405371

406-
if (ir->d.minor == NOPLUG || !ir->attached) {
372+
if (!ir->attached) {
407373
dev_err(ir->d.dev, LOGHEAD "ioctl result = -ENODEV\n",
408374
ir->d.name, ir->d.minor);
409375
return -ENODEV;

drivers/staging/media/lirc/lirc_zilog.c

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -183,10 +183,7 @@ static void release_ir_device(struct kref *ref)
183183
* ir->open_count == 0 - happens on final close()
184184
* ir_lock, tx_ref_lock, rx_ref_lock, all released
185185
*/
186-
if (ir->l.minor >= 0) {
187-
lirc_unregister_driver(ir->l.minor);
188-
ir->l.minor = -1;
189-
}
186+
lirc_unregister_driver(&ir->l);
190187

191188
if (kfifo_initialized(&ir->rbuf.fifo))
192189
lirc_buffer_free(&ir->rbuf);
@@ -1385,7 +1382,6 @@ static const struct file_operations lirc_fops = {
13851382

13861383
static struct lirc_driver lirc_template = {
13871384
.name = "lirc_zilog",
1388-
.minor = -1,
13891385
.code_length = 13,
13901386
.buffer_size = BUFLEN / 2,
13911387
.chunk_size = 2,
@@ -1599,14 +1595,14 @@ static int ir_probe(struct i2c_client *client, const struct i2c_device_id *id)
15991595
}
16001596

16011597
/* register with lirc */
1602-
ir->l.minor = lirc_register_driver(&ir->l);
1603-
if (ir->l.minor < 0) {
1598+
ret = lirc_register_driver(&ir->l);
1599+
if (ret < 0) {
16041600
dev_err(tx->ir->l.dev,
16051601
"%s: lirc_register_driver() failed: %i\n",
1606-
__func__, ir->l.minor);
1607-
ret = -EBADRQC;
1602+
__func__, ret);
16081603
goto out_put_xx;
16091604
}
1605+
16101606
dev_info(ir->l.dev,
16111607
"IR unit on %s (i2c-%d) registered as lirc%d and ready\n",
16121608
adap->name, adap->nr, ir->l.minor);

include/media/lirc_dev.h

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -116,10 +116,8 @@ static inline unsigned int lirc_buffer_write(struct lirc_buffer *buf,
116116
*
117117
* @name: this string will be used for logs
118118
*
119-
* @minor: indicates minor device (/dev/lirc) number for
120-
* registered driver if caller fills it with negative
121-
* value, then the first free minor number will be used
122-
* (if available).
119+
* @minor: the minor device (/dev/lircX) number for a registered
120+
* driver.
123121
*
124122
* @code_length: length of the remote control key code expressed in bits.
125123
*
@@ -157,10 +155,12 @@ static inline unsigned int lirc_buffer_write(struct lirc_buffer *buf,
157155
* device.
158156
*
159157
* @owner: the module owning this struct
158+
*
159+
* @irctl: the struct irctl for this LIRC device.
160160
*/
161161
struct lirc_driver {
162162
char name[40];
163-
int minor;
163+
unsigned int minor;
164164
__u32 code_length;
165165
unsigned int buffer_size; /* in chunks holding one code each */
166166
__u32 features;
@@ -175,19 +175,17 @@ struct lirc_driver {
175175
const struct file_operations *fops;
176176
struct device *dev;
177177
struct module *owner;
178+
struct irctl *irctl;
178179
};
179180

180181
/* following functions can be called ONLY from user context
181182
*
182-
* returns negative value on error or minor number
183-
* of the registered device if success
183+
* returns negative value on error or zero
184184
* contents of the structure pointed by p is copied
185185
*/
186-
extern int lirc_register_driver(struct lirc_driver *d);
186+
int lirc_register_driver(struct lirc_driver *d);
187187

188-
/* returns negative value on error or 0 if success
189-
*/
190-
extern int lirc_unregister_driver(int minor);
188+
void lirc_unregister_driver(struct lirc_driver *d);
191189

192190
/* Returns the private data stored in the lirc_driver
193191
* associated with the given device file pointer.

0 commit comments

Comments
 (0)