[media] dvb_usb_v2: register device even no remote keymap defined
authorAntti Palosaari <crope@iki.fi>
Thu, 5 Jul 2012 22:57:07 +0000 (19:57 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Sat, 4 Aug 2012 10:56:39 +0000 (07:56 -0300)
It failed to register device when remote keymap was not set.
Fix it to register device even keymap is NULL. In that case
just skip remote registration.

Driver should set RC_MAP_EMPTY to enable remote in case of
there is remote receiver but default keymap is unknown.

Reported-by: pierigno <pierigno@gmail.com>
Signed-off-by: Antti Palosaari <crope@iki.fi>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/dvb/dvb-usb/af9015.c
drivers/media/dvb/dvb-usb/af9035.c
drivers/media/dvb/dvb-usb/dvb_usb.h
drivers/media/dvb/dvb-usb/dvb_usb_core.c

index e48cb586f4cf82737e036f57bca91ddfc53dbe9c..bbe1d33821950d8a83986eef06e763255e073074 100644 (file)
@@ -1276,6 +1276,10 @@ static int af9015_get_rc_config(struct dvb_usb_device *d, struct dvb_usb_rc *rc)
                }
        }
 
+       /* load empty to enable rc */
+       if (!rc->map_name)
+               rc->map_name = RC_MAP_EMPTY;
+
        rc->allowed_protos = RC_TYPE_NEC;
        rc->query = af9015_rc_query;
        rc->interval = 500;
index 82b1ac716c2f616c487353ebb3f8c0ce9d1d7cf2..79197f46aa95031198a0ecfbc1f90d150b33fff2 100644 (file)
@@ -966,6 +966,10 @@ static int af9035_get_rc_config(struct dvb_usb_device *d, struct dvb_usb_rc *rc)
 
                rc->query = af9035_rc_query;
                rc->interval = 500;
+
+               /* load empty to enable rc */
+               if (!rc->map_name)
+                       rc->map_name = RC_MAP_EMPTY;
        }
 
        return 0;
index 6fcab07ecadac60db6a3c2dec1478d2627a23493..773817b5fe0669946e8324374669c29904cb6064 100644 (file)
@@ -124,7 +124,7 @@ struct dvb_usb_driver_info {
  * @bulk_mode: device supports bulk mode for rc (disable polling mode)
  */
 struct dvb_usb_rc {
-       char *map_name;
+       const char *map_name;
        u64 allowed_protos;
        int (*change_protocol)(struct rc_dev *dev, u64 rc_type);
        int (*query) (struct dvb_usb_device *d);
index aed7463167bceb7a54e869e8ece0e60471012c1e..3224621e1f323c2f23457385a77e3eeef86e7fc2 100644 (file)
@@ -135,10 +135,15 @@ static int dvb_usbv2_remote_init(struct dvb_usb_device *d)
        if (dvb_usbv2_disable_rc_polling || !d->props->get_rc_config)
                return 0;
 
+       d->rc.map_name = d->rc_map;
        ret = d->props->get_rc_config(d, &d->rc);
        if (ret < 0)
                goto err;
 
+       /* disable rc when there is no keymap defined */
+       if (!d->rc.map_name)
+               return 0;
+
        dev = rc_allocate_device();
        if (!dev) {
                ret = -ENOMEM;
@@ -153,14 +158,11 @@ static int dvb_usbv2_remote_init(struct dvb_usb_device *d)
        usb_to_input_id(d->udev, &dev->input_id);
        /* TODO: likely RC-core should took const char * */
        dev->driver_name = (char *) d->props->driver_name;
+       dev->map_name = d->rc.map_name;
        dev->driver_type = d->rc.driver_type;
        dev->allowed_protos = d->rc.allowed_protos;
        dev->change_protocol = d->rc.change_protocol;
        dev->priv = d;
-       if (d->rc.map_name)
-               dev->map_name = d->rc.map_name;
-       else
-               dev->map_name = d->rc_map;
 
        ret = rc_register_device(dev);
        if (ret < 0) {