Ignore:
Timestamp:
Apr 18, 2017, 8:47:31 AM (3 months ago)
Author:
brainslayer
Message:

update kernels

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/linux/universal/linux-4.9/drivers/i2c/busses/i2c-bcm2835.c

    r31574 r31884  
    6565        struct i2c_adapter adapter;
    6666        struct completion completion;
     67        struct i2c_msg *curr_msg;
    6768        u32 msg_err;
    6869        u8 *msg_buf;
     
    127128        }
    128129
    129         if (val & BCM2835_I2C_S_RXD) {
    130                 bcm2835_drain_rxfifo(i2c_dev);
    131                 if (!(val & BCM2835_I2C_S_DONE))
    132                         return IRQ_HANDLED;
    133         }
    134 
    135130        if (val & BCM2835_I2C_S_DONE) {
    136                 if (i2c_dev->msg_buf_remaining)
     131                if (i2c_dev->curr_msg->flags & I2C_M_RD) {
     132                        bcm2835_drain_rxfifo(i2c_dev);
     133                        val = bcm2835_i2c_readl(i2c_dev, BCM2835_I2C_S);
     134                }
     135
     136                if ((val & BCM2835_I2C_S_RXD) || i2c_dev->msg_buf_remaining)
    137137                        i2c_dev->msg_err = BCM2835_I2C_S_LEN;
    138138                else
     
    142142        }
    143143
    144         if (val & BCM2835_I2C_S_TXD) {
     144        if (val & BCM2835_I2C_S_TXW) {
    145145                bcm2835_fill_txfifo(i2c_dev);
    146146                return IRQ_HANDLED;
    147147        }
    148148
     149        if (val & BCM2835_I2C_S_RXR) {
     150                bcm2835_drain_rxfifo(i2c_dev);
     151                return IRQ_HANDLED;
     152        }
     153
    149154        return IRQ_NONE;
    150155}
     
    156161        unsigned long time_left;
    157162
     163        i2c_dev->curr_msg = msg;
    158164        i2c_dev->msg_buf = msg->buf;
    159165        i2c_dev->msg_buf_remaining = msg->len;
Note: See TracChangeset for help on using the changeset viewer.