i2c-owl.c (ead5d1f4d877e92c051e1a1ade623d0d30e71619) | i2c-owl.c (06856269d43ab3ce6609c90a6e42bcd9564eaa02) |
---|---|
1// SPDX-License-Identifier: GPL-2.0-or-later 2/* 3 * Actions Semiconductor Owl SoC's I2C driver 4 * 5 * Copyright (c) 2014 Actions Semi Inc. 6 * Author: David Liu <liuwei@actions-semi.com> 7 * 8 * Copyright (c) 2018 Linaro Ltd. --- 151 unchanged lines hidden (view full) --- 160 /* Set clock divider factor */ 161 writel(OWL_I2C_DIV_FACTOR(val), i2c_dev->base + OWL_I2C_REG_CLKDIV); 162} 163 164static irqreturn_t owl_i2c_interrupt(int irq, void *_dev) 165{ 166 struct owl_i2c_dev *i2c_dev = _dev; 167 struct i2c_msg *msg = i2c_dev->msg; | 1// SPDX-License-Identifier: GPL-2.0-or-later 2/* 3 * Actions Semiconductor Owl SoC's I2C driver 4 * 5 * Copyright (c) 2014 Actions Semi Inc. 6 * Author: David Liu <liuwei@actions-semi.com> 7 * 8 * Copyright (c) 2018 Linaro Ltd. --- 151 unchanged lines hidden (view full) --- 160 /* Set clock divider factor */ 161 writel(OWL_I2C_DIV_FACTOR(val), i2c_dev->base + OWL_I2C_REG_CLKDIV); 162} 163 164static irqreturn_t owl_i2c_interrupt(int irq, void *_dev) 165{ 166 struct owl_i2c_dev *i2c_dev = _dev; 167 struct i2c_msg *msg = i2c_dev->msg; |
168 unsigned long flags; | |
169 unsigned int stat, fifostat; 170 | 168 unsigned int stat, fifostat; 169 |
171 spin_lock_irqsave(&i2c_dev->lock, flags); | 170 spin_lock(&i2c_dev->lock); |
172 173 i2c_dev->err = 0; 174 175 /* Handle NACK from slave */ 176 fifostat = readl(i2c_dev->base + OWL_I2C_REG_FIFOSTAT); 177 if (fifostat & OWL_I2C_FIFOSTAT_RNB) { 178 i2c_dev->err = -ENXIO; 179 goto stop; --- 23 unchanged lines hidden (view full) --- 203 } 204 205stop: 206 /* Clear pending interrupts */ 207 owl_i2c_update_reg(i2c_dev->base + OWL_I2C_REG_STAT, 208 OWL_I2C_STAT_IRQP, true); 209 210 complete_all(&i2c_dev->msg_complete); | 171 172 i2c_dev->err = 0; 173 174 /* Handle NACK from slave */ 175 fifostat = readl(i2c_dev->base + OWL_I2C_REG_FIFOSTAT); 176 if (fifostat & OWL_I2C_FIFOSTAT_RNB) { 177 i2c_dev->err = -ENXIO; 178 goto stop; --- 23 unchanged lines hidden (view full) --- 202 } 203 204stop: 205 /* Clear pending interrupts */ 206 owl_i2c_update_reg(i2c_dev->base + OWL_I2C_REG_STAT, 207 OWL_I2C_STAT_IRQP, true); 208 209 complete_all(&i2c_dev->msg_complete); |
211 spin_unlock_irqrestore(&i2c_dev->lock, flags); | 210 spin_unlock(&i2c_dev->lock); |
212 213 return IRQ_HANDLED; 214} 215 216static u32 owl_i2c_func(struct i2c_adapter *adap) 217{ 218 return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL; 219} --- 270 unchanged lines hidden --- | 211 212 return IRQ_HANDLED; 213} 214 215static u32 owl_i2c_func(struct i2c_adapter *adap) 216{ 217 return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL; 218} --- 270 unchanged lines hidden --- |