• Furquan Shaikh's avatar
    Input: raydium_i2c_ts - use single i2c_transfer transaction when using RM_CMD_BANK_SWITCH · f492ffe4
    Furquan Shaikh authored
    On an AMD chromebook, where the same I2C bus is shared by both Raydium
    touchscreen and a trackpad device, it is observed that interleaving of
    I2C messages when `raydium_i2c_read_message()` is called leads to the
    Raydium touch IC reporting incorrect information. This is the sequence
    that was observed to result in the above issue:
    
    * I2C write to Raydium device for RM_CMD_BANK_SWITCH
    * I2C write to trackpad device
    * I2C read from trackpad device
    * I2C write to Raydium device for setting address
    * I2C read from Raydium device >>>> This provides incorrect
      information
    
    This change adds a new helper function `raydium_i2c_xfer()` that
    performs I2C transactions to the Raydium device. It uses the register
    address to decide if RM_CMD_BANK_SWITCH header needs to be sent to the
    device (i.e. if register address is greater than 255, then bank switch
    header is sent before the rest of the transaction). Additionally, it
    ensures that all the I2C operations performed as part of
    `raydium_i2c_xfer()` are done as a single i2c_transfer. This
    guarantees that no other transactions are initiated to any other
    device on the same bus in between. Additionally,
    `raydium_i2c_{send|read}*` functions are refactored to use this new
    helper function.
    
    Verified with the patch across multiple reboots (>100) that the
    information reported by the Raydium  touchscreen device during probe
    is correct.
    Signed-off-by: default avatarFurquan Shaikh <furquan@google.com>
    Link: https://lore.kernel.org/r/20200821024006.3399663-1-furquan@google.comSigned-off-by: default avatarDmitry Torokhov <dmitry.torokhov@gmail.com>
    f492ffe4
raydium_i2c_ts.c 27.6 KB