On Sun, 2009-07-19 at 14:47 +0200, Jean Delvare wrote:
> Hi Andy,
> 
> On Fri, 17 Jul 2009 16:35:37 -0400, Andy Walls wrote:
> > This patch augments the init data passed by bridge drivers to ir-kbd-i2c
> > so that the ir_type can be set explicitly and so ir-kbd-i2c internal
> > get_key functions can be reused without requiring symbols from
> > ir-kbd-i2c in the bridge driver.
> > 
> > 
> > Regards,
> > Andy
> 
> Looks good. Minor suggestion below:

Jean,

Thanks for the reply.  My responses are inline.

> > 
> > diff -r d754a2d5a376 linux/drivers/media/video/ir-kbd-i2c.c
> > --- a/linux/drivers/media/video/ir-kbd-i2c.c        Wed Jul 15 07:28:02 
> > 2009 -0300
> > +++ b/linux/drivers/media/video/ir-kbd-i2c.c        Fri Jul 17 16:05:28 
> > 2009 -0400
> > @@ -478,7 +480,34 @@
> >  
> >             ir_codes = init_data->ir_codes;
> >             name = init_data->name;
> > +           if (init_data->type)
> > +                   ir_type = init_data->type;
> >             ir->get_key = init_data->get_key;
> > +           switch (init_data->internal_get_key_func) {
> > +           case IR_KBD_GET_KEY_PIXELVIEW:
> > +                   ir->get_key = get_key_pixelview;
> > +                   break;
> > +           case IR_KBD_GET_KEY_PV951:
> > +                   ir->get_key = get_key_pv951;
> > +                   break;
> > +           case IR_KBD_GET_KEY_HAUP:
> > +                   ir->get_key = get_key_haup;
> > +                   break;
> > +           case IR_KBD_GET_KEY_KNC1:
> > +                   ir->get_key = get_key_knc1;
> > +                   break;
> > +           case IR_KBD_GET_KEY_FUSIONHDTV:
> > +                   ir->get_key = get_key_fusionhdtv;
> > +                   break;
> > +           case IR_KBD_GET_KEY_HAUP_XVR:
> > +                   ir->get_key = get_key_haup_xvr;
> > +                   break;
> > +           case IR_KBD_GET_KEY_AVERMEDIA_CARDBUS:
> > +                   ir->get_key = get_key_avermedia_cardbus;
> > +                   break;
> > +           default:
> > +                   break;
> > +           }
> >     }
> >  
> >     /* Make sure we are all setup before going on */
> > diff -r d754a2d5a376 linux/include/media/ir-kbd-i2c.h
> > --- a/linux/include/media/ir-kbd-i2c.h      Wed Jul 15 07:28:02 2009 -0300
> > +++ b/linux/include/media/ir-kbd-i2c.h      Fri Jul 17 16:05:28 2009 -0400
> > @@ -24,10 +24,27 @@
> >     int                    (*get_key)(struct IR_i2c*, u32*, u32*);
> >  };
> >  
> > +enum ir_kbd_get_key_fn {
> > +   IR_KBD_GET_KEY_NONE = 0,
> 
> As you never use IR_KBD_GET_KEY_NONE, you might as well not define it
> and start with IR_KBD_GET_KEY_PIXELVIEW = 1. This would have the added
> advantage that you could get rid of the "default" statement in the
> above switch, letting gcc warn you (or any other developer) if you ever
> add a new enum value and forget to handle it in ir_probe().

>From gcc-4.0.1 docs:

-Wswitch
        Warn whenever a switch statement has an index of enumerated type
        and lacks a case for one or more of the named codes of that
        enumeration. (The presence of a default label prevents this
        warning.) case labels outside the enumeration range also provoke
        warnings when this option is used. This warning is enabled by
        -Wall. 
        
Since a calling driver may provide a value of 0 via a memset, I'd choose
keeping the enum label of IR_KBD_GET_KEY_NONE, add a case for it in the
switch(), and remove the "default:" case.  It just seems wrong to let
drivers pass in 0 value for "internal_get_key_func" and the switch()
neither have an explicit nor a "default:" case for it.  (Maybe it's just
the years of Ada programming that beat things like this into me...)

My idea was that a driver would

a. for a driver provided function, specify a pointer to the driver's
function in "get_key" and set the "internal_get_key_func" field set to 0
(IR_KBD_GET_KEY_NONE) likely via memset().

b. for a ir-kbd-i2c provided function, specify a NULL pointer in
"get_key", and use an enumerated value in "internal_get_key_func".

If both are specified, the switch() will set to use the ir-kbd-i2c
internal function, unless an invalid enum value was used.

Regards,
Andy

> > +   IR_KBD_GET_KEY_PIXELVIEW,
> > +   IR_KBD_GET_KEY_PV951,
> > +   IR_KBD_GET_KEY_HAUP,
> > +   IR_KBD_GET_KEY_KNC1,
> > +   IR_KBD_GET_KEY_FUSIONHDTV,
> > +   IR_KBD_GET_KEY_HAUP_XVR,
> > +   IR_KBD_GET_KEY_AVERMEDIA_CARDBUS,
> > +};
> > +
> >  /* Can be passed when instantiating an ir_video i2c device */
> >  struct IR_i2c_init_data {
> >     IR_KEYTAB_TYPE         *ir_codes;
> >     const char             *name;
> > +   int                    type; /* IR_TYPE_RC5, IR_TYPE_PD, etc */
> > +   /*
> > +    * Specify either a function pointer or a value indicating one of
> > +    * ir_kbd_i2c's internal get_key functions
> > +    */
> >     int                    (*get_key)(struct IR_i2c*, u32*, u32*);
> > +   enum ir_kbd_get_key_fn internal_get_key_func;
> >  };
> >  #endif
> 
> 

--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to