Skip to content

Commit b7df391

Browse files
Dmitry Torokhovgregkh
authored andcommitted
[PATCH] drivers/media: convert to dynamic input_dev allocation
Input: convert drivers/media to dynamic input_dev allocation This is required for input_dev sysfs integration Signed-off-by: Dmitry Torokhov <dtor@mail.ru> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
1 parent 76b7cdd commit b7df391

File tree

13 files changed

+268
-192
lines changed

13 files changed

+268
-192
lines changed

drivers/media/common/ir-common.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -252,7 +252,6 @@ void ir_input_init(struct input_dev *dev, struct ir_input_state *ir,
252252
if (ir_codes)
253253
memcpy(ir->ir_codes, ir_codes, sizeof(ir->ir_codes));
254254

255-
init_input_dev(dev);
256255
dev->keycode = ir->ir_codes;
257256
dev->keycodesize = sizeof(IR_KEYTAB_TYPE);
258257
dev->keycodemax = IR_KEYTAB_SIZE;

drivers/media/dvb/cinergyT2/cinergyT2.c

Lines changed: 70 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,8 @@ struct cinergyt2 {
137137
struct urb *stream_urb [STREAM_URB_COUNT];
138138

139139
#ifdef ENABLE_RC
140-
struct input_dev rc_input_dev;
140+
struct input_dev *rc_input_dev;
141+
char phys[64];
141142
struct work_struct rc_query_work;
142143
int rc_input_event;
143144
u32 rc_last_code;
@@ -683,6 +684,7 @@ static struct dvb_device cinergyt2_fe_template = {
683684
};
684685

685686
#ifdef ENABLE_RC
687+
686688
static void cinergyt2_query_rc (void *data)
687689
{
688690
struct cinergyt2 *cinergyt2 = data;
@@ -703,7 +705,7 @@ static void cinergyt2_query_rc (void *data)
703705
/* stop key repeat */
704706
if (cinergyt2->rc_input_event != KEY_MAX) {
705707
dprintk(1, "rc_input_event=%d Up\n", cinergyt2->rc_input_event);
706-
input_report_key(&cinergyt2->rc_input_dev,
708+
input_report_key(cinergyt2->rc_input_dev,
707709
cinergyt2->rc_input_event, 0);
708710
cinergyt2->rc_input_event = KEY_MAX;
709711
}
@@ -722,7 +724,7 @@ static void cinergyt2_query_rc (void *data)
722724
/* keyrepeat bit -> just repeat last rc_input_event */
723725
} else {
724726
cinergyt2->rc_input_event = KEY_MAX;
725-
for (i = 0; i < sizeof(rc_keys) / sizeof(rc_keys[0]); i += 3) {
727+
for (i = 0; i < ARRAY_SIZE(rc_keys); i += 3) {
726728
if (rc_keys[i + 0] == rc_events[n].type &&
727729
rc_keys[i + 1] == le32_to_cpu(rc_events[n].value)) {
728730
cinergyt2->rc_input_event = rc_keys[i + 2];
@@ -736,11 +738,11 @@ static void cinergyt2_query_rc (void *data)
736738
cinergyt2->rc_last_code != ~0) {
737739
/* emit a key-up so the double event is recognized */
738740
dprintk(1, "rc_input_event=%d UP\n", cinergyt2->rc_input_event);
739-
input_report_key(&cinergyt2->rc_input_dev,
741+
input_report_key(cinergyt2->rc_input_dev,
740742
cinergyt2->rc_input_event, 0);
741743
}
742744
dprintk(1, "rc_input_event=%d\n", cinergyt2->rc_input_event);
743-
input_report_key(&cinergyt2->rc_input_dev,
745+
input_report_key(cinergyt2->rc_input_dev,
744746
cinergyt2->rc_input_event, 1);
745747
cinergyt2->rc_last_code = rc_events[n].value;
746748
}
@@ -752,7 +754,59 @@ static void cinergyt2_query_rc (void *data)
752754

753755
up(&cinergyt2->sem);
754756
}
755-
#endif
757+
758+
static int cinergyt2_register_rc(struct cinergyt2 *cinergyt2)
759+
{
760+
struct input_dev *input_dev;
761+
int i;
762+
763+
cinergyt2->rc_input_dev = input_dev = input_allocate_device();
764+
if (!input_dev)
765+
return -ENOMEM;
766+
767+
usb_make_path(cinergyt2->udev, cinergyt2->phys, sizeof(cinergyt2->phys));
768+
strlcat(cinergyt2->phys, "/input0", sizeof(cinergyt2->phys));
769+
cinergyt2->rc_input_event = KEY_MAX;
770+
cinergyt2->rc_last_code = ~0;
771+
INIT_WORK(&cinergyt2->rc_query_work, cinergyt2_query_rc, cinergyt2);
772+
773+
input_dev->name = DRIVER_NAME " remote control";
774+
input_dev->phys = cinergyt2->phys;
775+
input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_REP);
776+
for (i = 0; ARRAY_SIZE(rc_keys); i += 3)
777+
set_bit(rc_keys[i + 2], input_dev->keybit);
778+
input_dev->keycodesize = 0;
779+
input_dev->keycodemax = 0;
780+
781+
input_register_device(cinergyt2->rc_input_dev);
782+
schedule_delayed_work(&cinergyt2->rc_query_work, HZ/2);
783+
}
784+
785+
static void cinergyt2_unregister_rc(struct cinergyt2 *cinergyt2)
786+
{
787+
cancel_delayed_work(&cinergyt2->rc_query_work);
788+
flush_scheduled_work();
789+
input_unregister_device(cinergyt2->rc_input_dev);
790+
}
791+
792+
static inline void cinergyt2_suspend_rc(struct cinergyt2 *cinergyt2)
793+
{
794+
cancel_delayed_work(&cinergyt2->rc_query_work);
795+
}
796+
797+
static inline void cinergyt2_resume_rc(struct cinergyt2 *cinergyt2)
798+
{
799+
schedule_delayed_work(&cinergyt2->rc_query_work, HZ/2);
800+
}
801+
802+
#else
803+
804+
static inline int cinergyt2_register_rc(struct cinergyt2 *cinergyt2) { return 0; }
805+
static inline void cinergyt2_unregister_rc(struct cinergyt2 *cinergyt2) { }
806+
static inline void cinergyt2_suspend_rc(struct cinergyt2 *cinergyt2) { }
807+
static inline void cinergyt2_resume_rc(struct cinergyt2 *cinergyt2) { }
808+
809+
#endif /* ENABLE_RC */
756810

757811
static void cinergyt2_query (void *data)
758812
{
@@ -789,9 +843,6 @@ static int cinergyt2_probe (struct usb_interface *intf,
789843
{
790844
struct cinergyt2 *cinergyt2;
791845
int err;
792-
#ifdef ENABLE_RC
793-
int i;
794-
#endif
795846

796847
if (!(cinergyt2 = kmalloc (sizeof(struct cinergyt2), GFP_KERNEL))) {
797848
dprintk(1, "out of memory?!?\n");
@@ -846,30 +897,17 @@ static int cinergyt2_probe (struct usb_interface *intf,
846897
&cinergyt2_fe_template, cinergyt2,
847898
DVB_DEVICE_FRONTEND);
848899

849-
#ifdef ENABLE_RC
850-
cinergyt2->rc_input_dev.evbit[0] = BIT(EV_KEY) | BIT(EV_REP);
851-
cinergyt2->rc_input_dev.keycodesize = 0;
852-
cinergyt2->rc_input_dev.keycodemax = 0;
853-
cinergyt2->rc_input_dev.name = DRIVER_NAME " remote control";
854-
855-
for (i = 0; i < sizeof(rc_keys) / sizeof(rc_keys[0]); i += 3)
856-
set_bit(rc_keys[i + 2], cinergyt2->rc_input_dev.keybit);
857-
858-
input_register_device(&cinergyt2->rc_input_dev);
859-
860-
cinergyt2->rc_input_event = KEY_MAX;
861-
cinergyt2->rc_last_code = ~0;
900+
err = cinergyt2_register_rc(cinergyt2);
901+
if (err)
902+
goto bailout;
862903

863-
INIT_WORK(&cinergyt2->rc_query_work, cinergyt2_query_rc, cinergyt2);
864-
schedule_delayed_work(&cinergyt2->rc_query_work, HZ/2);
865-
#endif
866904
return 0;
867905

868906
bailout:
869907
dvb_dmxdev_release(&cinergyt2->dmxdev);
870908
dvb_dmx_release(&cinergyt2->demux);
871-
dvb_unregister_adapter (&cinergyt2->adapter);
872-
cinergyt2_free_stream_urbs (cinergyt2);
909+
dvb_unregister_adapter(&cinergyt2->adapter);
910+
cinergyt2_free_stream_urbs(cinergyt2);
873911
kfree(cinergyt2);
874912
return -ENOMEM;
875913
}
@@ -881,11 +919,7 @@ static void cinergyt2_disconnect (struct usb_interface *intf)
881919
if (down_interruptible(&cinergyt2->sem))
882920
return;
883921

884-
#ifdef ENABLE_RC
885-
cancel_delayed_work(&cinergyt2->rc_query_work);
886-
flush_scheduled_work();
887-
input_unregister_device(&cinergyt2->rc_input_dev);
888-
#endif
922+
cinergyt2_unregister_rc(cinergyt2);
889923

890924
cinergyt2->demux.dmx.close(&cinergyt2->demux.dmx);
891925
dvb_net_release(&cinergyt2->dvbnet);
@@ -908,9 +942,8 @@ static int cinergyt2_suspend (struct usb_interface *intf, pm_message_t state)
908942

909943
if (state.event > PM_EVENT_ON) {
910944
struct cinergyt2 *cinergyt2 = usb_get_intfdata (intf);
911-
#ifdef ENABLE_RC
912-
cancel_delayed_work(&cinergyt2->rc_query_work);
913-
#endif
945+
946+
cinergyt2_suspend_rc(cinergyt2);
914947
cancel_delayed_work(&cinergyt2->query_work);
915948
if (cinergyt2->streaming)
916949
cinergyt2_stop_stream_xfer(cinergyt2);
@@ -938,9 +971,8 @@ static int cinergyt2_resume (struct usb_interface *intf)
938971
schedule_delayed_work(&cinergyt2->query_work, HZ/2);
939972
}
940973

941-
#ifdef ENABLE_RC
942-
schedule_delayed_work(&cinergyt2->rc_query_work, HZ/2);
943-
#endif
974+
cinergyt2_resume_rc(cinergyt2);
975+
944976
up(&cinergyt2->sem);
945977
return 0;
946978
}

drivers/media/dvb/dvb-usb/dvb-usb-remote.c

Lines changed: 28 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,9 @@ static void dvb_usb_read_remote_control(void *data)
3939
d->last_event = event;
4040
case REMOTE_KEY_REPEAT:
4141
deb_rc("key repeated\n");
42-
input_event(&d->rc_input_dev, EV_KEY, d->last_event, 1);
43-
input_event(&d->rc_input_dev, EV_KEY, d->last_event, 0);
44-
input_sync(&d->rc_input_dev);
42+
input_event(d->rc_input_dev, EV_KEY, event, 1);
43+
input_event(d->rc_input_dev, EV_KEY, d->last_event, 0);
44+
input_sync(d->rc_input_dev);
4545
break;
4646
default:
4747
break;
@@ -53,8 +53,8 @@ static void dvb_usb_read_remote_control(void *data)
5353
deb_rc("NO KEY PRESSED\n");
5454
if (d->last_state != REMOTE_NO_KEY_PRESSED) {
5555
deb_rc("releasing event %d\n",d->last_event);
56-
input_event(&d->rc_input_dev, EV_KEY, d->last_event, 0);
57-
input_sync(&d->rc_input_dev);
56+
input_event(d->rc_input_dev, EV_KEY, d->last_event, 0);
57+
input_sync(d->rc_input_dev);
5858
}
5959
d->last_state = REMOTE_NO_KEY_PRESSED;
6060
d->last_event = 0;
@@ -63,8 +63,8 @@ static void dvb_usb_read_remote_control(void *data)
6363
deb_rc("KEY PRESSED\n");
6464
deb_rc("pressing event %d\n",event);
6565
66-
input_event(&d->rc_input_dev, EV_KEY, event, 1);
67-
input_sync(&d->rc_input_dev);
66+
input_event(d->rc_input_dev, EV_KEY, event, 1);
67+
input_sync(d->rc_input_dev);
6868
6969
d->last_event = event;
7070
d->last_state = REMOTE_KEY_PRESSED;
@@ -73,8 +73,8 @@ static void dvb_usb_read_remote_control(void *data)
7373
deb_rc("KEY_REPEAT\n");
7474
if (d->last_state != REMOTE_NO_KEY_PRESSED) {
7575
deb_rc("repeating event %d\n",d->last_event);
76-
input_event(&d->rc_input_dev, EV_KEY, d->last_event, 2);
77-
input_sync(&d->rc_input_dev);
76+
input_event(d->rc_input_dev, EV_KEY, d->last_event, 2);
77+
input_sync(d->rc_input_dev);
7878
d->last_state = REMOTE_KEY_REPEAT;
7979
}
8080
default:
@@ -89,39 +89,45 @@ static void dvb_usb_read_remote_control(void *data)
8989
int dvb_usb_remote_init(struct dvb_usb_device *d)
9090
{
9191
int i;
92+
9293
if (d->props.rc_key_map == NULL ||
9394
d->props.rc_query == NULL ||
9495
dvb_usb_disable_rc_polling)
9596
return 0;
9697

97-
/* Initialise the remote-control structures.*/
98-
init_input_dev(&d->rc_input_dev);
98+
usb_make_path(d->udev, d->rc_phys, sizeof(d->rc_phys));
99+
strlcpy(d->rc_phys, "/ir0", sizeof(d->rc_phys));
100+
101+
d->rc_input_dev = input_allocate_device();
102+
if (!d->rc_input_dev)
103+
return -ENOMEM;
99104

100-
d->rc_input_dev.evbit[0] = BIT(EV_KEY);
101-
d->rc_input_dev.keycodesize = sizeof(unsigned char);
102-
d->rc_input_dev.keycodemax = KEY_MAX;
103-
d->rc_input_dev.name = "IR-receiver inside an USB DVB receiver";
105+
d->rc_input_dev->evbit[0] = BIT(EV_KEY);
106+
d->rc_input_dev->keycodesize = sizeof(unsigned char);
107+
d->rc_input_dev->keycodemax = KEY_MAX;
108+
d->rc_input_dev->name = "IR-receiver inside an USB DVB receiver";
109+
d->rc_input_dev->phys = d->rc_phys;
104110

105111
/* set the bits for the keys */
106-
deb_rc("key map size: %d\n",d->props.rc_key_map_size);
112+
deb_rc("key map size: %d\n", d->props.rc_key_map_size);
107113
for (i = 0; i < d->props.rc_key_map_size; i++) {
108114
deb_rc("setting bit for event %d item %d\n",d->props.rc_key_map[i].event, i);
109-
set_bit(d->props.rc_key_map[i].event, d->rc_input_dev.keybit);
115+
set_bit(d->props.rc_key_map[i].event, d->rc_input_dev->keybit);
110116
}
111117

112118
/* Start the remote-control polling. */
113119
if (d->props.rc_interval < 40)
114120
d->props.rc_interval = 100; /* default */
115121

116122
/* setting these two values to non-zero, we have to manage key repeats */
117-
d->rc_input_dev.rep[REP_PERIOD] = d->props.rc_interval;
118-
d->rc_input_dev.rep[REP_DELAY] = d->props.rc_interval + 150;
123+
d->rc_input_dev->rep[REP_PERIOD] = d->props.rc_interval;
124+
d->rc_input_dev->rep[REP_DELAY] = d->props.rc_interval + 150;
119125

120-
input_register_device(&d->rc_input_dev);
126+
input_register_device(d->rc_input_dev);
121127

122128
INIT_WORK(&d->rc_query_work, dvb_usb_read_remote_control, d);
123129

124-
info("schedule remote query interval to %d msecs.",d->props.rc_interval);
130+
info("schedule remote query interval to %d msecs.", d->props.rc_interval);
125131
schedule_delayed_work(&d->rc_query_work,msecs_to_jiffies(d->props.rc_interval));
126132

127133
d->state |= DVB_USB_STATE_REMOTE;
@@ -134,7 +140,7 @@ int dvb_usb_remote_exit(struct dvb_usb_device *d)
134140
if (d->state & DVB_USB_STATE_REMOTE) {
135141
cancel_delayed_work(&d->rc_query_work);
136142
flush_scheduled_work();
137-
input_unregister_device(&d->rc_input_dev);
143+
input_unregister_device(d->rc_input_dev);
138144
}
139145
d->state &= ~DVB_USB_STATE_REMOTE;
140146
return 0;

drivers/media/dvb/dvb-usb/dvb-usb.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -300,7 +300,8 @@ struct dvb_usb_device {
300300
int (*fe_init) (struct dvb_frontend *);
301301

302302
/* remote control */
303-
struct input_dev rc_input_dev;
303+
struct input_dev *rc_input_dev;
304+
char rc_phys[64];
304305
struct work_struct rc_query_work;
305306
u32 last_event;
306307
int last_state;

0 commit comments

Comments
 (0)