Re: [PATCH] [media] cx231xx: Initial support Evromedia USB Full Hybrid Full HD

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

 



On Wed, Jan 11, 2017 at 9:00 AM, Oleh Kravchenko <oleg@xxxxxxxxxx> wrote:
> On 11.01.17 15:53, Steven Toth wrote:
>>> diff --git a/drivers/media/usb/cx231xx/cx231xx-i2c.c b/drivers/media/usb/cx231xx/cx231xx-i2c.c
>>> index 35e9acf..60412ec 100644
>>> --- a/drivers/media/usb/cx231xx/cx231xx-i2c.c
>>> +++ b/drivers/media/usb/cx231xx/cx231xx-i2c.c
>>> @@ -171,6 +171,43 @@ static int cx231xx_i2c_send_bytes(struct i2c_adapter *i2c_adap,
>>>                 bus->i2c_nostop = 0;
>>>                 bus->i2c_reserve = 0;
>>>
>>> +       } else if (dev->model == CX231XX_BOARD_EVROMEDIA_FULL_HYBRID_FULLHD
>>> +               && msg->addr == dev->tuner_addr
>>> +               && msg->len > 4) {
>>> +               /* special case for Evromedia USB Full Hybrid Full HD tuner chip */
>>> +               size = msg->len;
>>> +               saddr_len = 1;
>>> +
>>> +               /* adjust the length to correct length */
>>> +               size -= saddr_len;
>>> +
>>> +               buf_ptr = (u8*)(msg->buf + 1);
>>> +
>>> +               do {
>>> +                       /* prepare xfer_data struct */
>>> +                       req_data.dev_addr = msg->addr;
>>> +                       req_data.direction = msg->flags;
>>> +                       req_data.saddr_len = saddr_len;
>>> +                       req_data.saddr_dat = msg->buf[0];
>>> +                       req_data.buf_size = size > 4 ? 4 : size;
>>> +                       req_data.p_buffer = (u8*)(buf_ptr + loop * 4);
>>> +
>>> +                       bus->i2c_nostop = (size > 4) ? 1 : 0;
>>> +                       bus->i2c_reserve = (loop == 0) ? 0 : 1;
>>> +
>>> +                       /* usb send command */
>>> +                       status = dev->cx231xx_send_usb_command(bus, &req_data);
>>> +                       loop++;
>>> +
>>> +                       if (size >= 4) {
>>> +                               size -= 4;
>>> +                       } else {
>>> +                               size = 0;
>>> +                       }
>>> +               } while (size > 0);
>>> +
>>> +               bus->i2c_nostop = 0;
>>> +               bus->i2c_reserve = 0;
>>>         } else {                /* regular case */
>>>
>>>                 /* prepare xfer_data struct */
>> If the i2c functionality is broken in some way, I suggest its fixed
>> first, along with a correct patch description, as a separate piece of
>> work. Lets not group this in with a board profile.
>>
>> Almost certainly we should never see a "if board == X" in any i2c
>> implementation without proper discussion.
>>
> I'm interested in accepting this patch :) What I should do?

Lets start the conversion with what's wrong with the current
implementation that prevents it from working with the new design.
Lets discuss the I2C needs of the parts you need to communicate with,
and why the current design is broken.

Then, lets think about a better solution.

A BOARD == X is the wrong solution to the problem.


-- 
Steven Toth - Kernel Labs
http://www.kernellabs.com
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]
  Powered by Linux