RE: [PATCH v2 16/17] staging: comedi: core: only update outputs with comedi_dio_update_state()

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Friday, August 30, 2013 5:26 AM, Ian Abbott wrote:
> On 2013-08-30 02:00, H Hartley Sweeten wrote:
>> Make sure that only the state of the channels configured as outputs are
>> updated.
>>
>> Signed-off-by: H Hartley Sweeten <hsweeten@xxxxxxxxxxxxxxxxxxx>
>> Cc: Ian Abbott <abbotti@xxxxxxxxx>
>> Cc: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx>
>> ---
>>   drivers/staging/comedi/drivers.c | 2 +-
>>   1 file changed, 1 insertion(+), 1 deletion(-)
>>
>> diff --git a/drivers/staging/comedi/drivers.c b/drivers/staging/comedi/drivers.c
>> index 75d877b..777be6d 100644
>> --- a/drivers/staging/comedi/drivers.c
>> +++ b/drivers/staging/comedi/drivers.c
>> @@ -198,7 +198,7 @@ EXPORT_SYMBOL_GPL(comedi_dio_insn_config);
>>   unsigned int comedi_dio_update_state(struct comedi_subdevice *s,
>>   				     unsigned int *data)
>>   {
>> -	unsigned int mask = data[0];
>> +	unsigned int mask = data[0] & s->io_bits;	/* outputs only */
>>   	unsigned int bits = data[1];
>>
>>   	if (mask) {
>>
>
> I have had second thoughts about that as some application code could be 
> trying to set the state on an input channel in advance of reconfiguring 
> it as an output.  That wouldn't work on all hardware but would work on 
> some hardware (e.g. hardware that has a "data output" register plus a 
> "data direction" register).
>
> But filtering the mask in this way seems like a wholesale change for the 
> sake of a handful of drivers, and for some of those handful of drivers 
> it probably doesn't matter anyway.
>
> Callers of comedi_dio_update_state() that want to limit register writes 
> to outputs only can AND the return value with s->io_bits.  The s->state 
> bits would still be updated for the input channels, but they wouldn't 
> get written to the hardware (unless they fall in the same register as 
> the output channels).
>
> For the drivers in patch 17:

[snip]

> It's probably a good idea to limit the mask to channels that actually 
> exist though, something like:
>
>	unsigned int chanmask = s->n_chans < 32 ?
>				(1U << s->n_chans) - 1 : 0xffffffff;
>	unsigned int mask = data[0] & chanmask;
>	unsigned int bits = data[1];

Hmm.. Maybe the 'chanmask' should be added to struct comedi_subdevice.
I need to look through the drivers but it seems like it would be generically
useful. It could be initialized during the postconfig.

For now I'll just modify comedi_dio_update_state() as you suggested.

Regards,
Hartley

_______________________________________________
devel mailing list
devel@xxxxxxxxxxxxxxxxxxxxxx
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel




[Index of Archives]     [Linux Driver Backports]     [DMA Engine]     [Linux GPIO]     [Linux SPI]     [Video for Linux]     [Linux USB Devel]     [Linux Coverity]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]
  Powered by Linux