* drivers/media/platform/marvell-ccic/cafe-driver.c:208 cafe_smbus_write_data() error: double unlocked 'mcam->dev_lock' (orig line 188)
@ 2020-08-04 18:25 kernel test robot
0 siblings, 0 replies; 2+ messages in thread
From: kernel test robot @ 2020-08-04 18:25 UTC (permalink / raw)
To: kbuild
[-- Attachment #1: Type: text/plain, Size: 35426 bytes --]
CC: kbuild-all(a)lists.01.org
CC: linux-kernel(a)vger.kernel.org
TO: Mauro Carvalho Chehab <mchehab@kernel.org>
CC: linux-media(a)vger.kernel.org
tree: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master
head: c0842fbc1b18c7a044e6ff3e8fa78bfa822c7d1a
commit: a19f228b8dd9a67e8de4ebd4eac8a4c94ec39d1a media: Kconfig: not all V4L2 platform drivers are for camera
date: 4 months ago
:::::: branch date: 12 hours ago
:::::: commit date: 4 months ago
config: x86_64-randconfig-m001-20200805 (attached as .config)
compiler: gcc-9 (Debian 9.3.0-15) 9.3.0
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
New smatch warnings:
drivers/media/platform/marvell-ccic/cafe-driver.c:208 cafe_smbus_write_data() error: double unlocked 'mcam->dev_lock' (orig line 188)
drivers/media/platform/marvell-ccic/cafe-driver.c:208 cafe_smbus_write_data() error: double unlocked 'mcam->dev_lock' (orig line 188)
drivers/media/platform/marvell-ccic/cafe-driver.c:269 cafe_smbus_read_data() error: double unlocked 'mcam->dev_lock' (orig line 267)
drivers/media/platform/marvell-ccic/cafe-driver.c:404 cafe_ctlr_init() error: double unlocked 'mcam->dev_lock' (orig line 394)
Old smatch warnings:
drivers/media/platform/marvell-ccic/cafe-driver.c:208 cafe_smbus_write_data() error: double unlocked 'mcam->dev_lock' (orig line 208)
drivers/media/platform/marvell-ccic/cafe-driver.c:208 cafe_smbus_write_data() error: double unlocked 'mcam->dev_lock' (orig line 208)
drivers/media/platform/marvell-ccic/cafe-driver.c:208 cafe_smbus_write_data() error: double unlocked 'mcam->dev_lock' (orig line 208)
drivers/media/platform/marvell-ccic/cafe-driver.c:208 cafe_smbus_write_data() error: double unlocked 'mcam->dev_lock' (orig line 208)
drivers/media/platform/marvell-ccic/cafe-driver.c:208 cafe_smbus_write_data() error: double unlocked 'mcam->dev_lock' (orig line 208)
drivers/media/platform/marvell-ccic/cafe-driver.c:208 cafe_smbus_write_data() error: double unlocked 'mcam->dev_lock' (orig line 208)
drivers/media/platform/marvell-ccic/cafe-driver.c:213 cafe_smbus_write_data() error: double unlocked 'mcam->dev_lock' (orig line 208)
drivers/media/platform/marvell-ccic/cafe-driver.c:269 cafe_smbus_read_data() error: double unlocked 'mcam->dev_lock' (orig line 269)
drivers/media/platform/marvell-ccic/cafe-driver.c:269 cafe_smbus_read_data() error: double unlocked 'mcam->dev_lock' (orig line 269)
drivers/media/platform/marvell-ccic/cafe-driver.c:269 cafe_smbus_read_data() error: double unlocked 'mcam->dev_lock' (orig line 269)
drivers/media/platform/marvell-ccic/cafe-driver.c:273 cafe_smbus_read_data() error: double unlocked 'mcam->dev_lock' (orig line 269)
# https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=a19f228b8dd9a67e8de4ebd4eac8a4c94ec39d1a
git remote add linus https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
git remote update linus
git checkout a19f228b8dd9a67e8de4ebd4eac8a4c94ec39d1a
vim +208 drivers/media/platform/marvell-ccic/cafe-driver.c
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 169
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 170 static int cafe_smbus_write_data(struct cafe_camera *cam,
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 171 u16 addr, u8 command, u8 value)
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 172 {
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 173 unsigned int rval;
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 174 unsigned long flags;
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 175 struct mcam_camera *mcam = &cam->mcam;
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 176
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 177 spin_lock_irqsave(&mcam->dev_lock, flags);
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 178 rval = TWSIC0_EN | ((addr << TWSIC0_SID_SHIFT) & TWSIC0_SID);
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 179 rval |= TWSIC0_OVMAGIC; /* Make OV sensors work */
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 180 /*
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 181 * Marvell sez set clkdiv to all 1's for now.
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 182 */
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 183 rval |= TWSIC0_CLKDIV;
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 184 mcam_reg_write(mcam, REG_TWSIC0, rval);
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 185 (void) mcam_reg_read(mcam, REG_TWSIC1); /* force write */
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 186 rval = value | ((command << TWSIC1_ADDR_SHIFT) & TWSIC1_ADDR);
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 187 mcam_reg_write(mcam, REG_TWSIC1, rval);
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 @188 spin_unlock_irqrestore(&mcam->dev_lock, flags);
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 189
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 190 /* Unfortunately, reading TWSIC1 too soon after sending a command
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 191 * causes the device to die.
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 192 * Use a busy-wait because we often send a large quantity of small
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 193 * commands at-once; using msleep() would cause a lot of context
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 194 * switches which take longer than 2ms, resulting in a noticeable
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 195 * boot-time and capture-start delays.
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 196 */
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 197 mdelay(2);
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 198
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 199 /*
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 200 * Another sad fact is that sometimes, commands silently complete but
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 201 * cafe_smbus_write_done() never becomes aware of this.
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 202 * This happens at random and appears to possible occur with any
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 203 * command.
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 204 * We don't understand why this is. We work around this issue
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 205 * with the timeout in the wait below, assuming that all commands
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 206 * complete within the timeout.
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 207 */
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 @208 wait_event_timeout(cam->smbus_wait, cafe_smbus_write_done(mcam),
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 209 CAFE_SMBUS_TIMEOUT);
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 210
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 211 spin_lock_irqsave(&mcam->dev_lock, flags);
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 212 rval = mcam_reg_read(mcam, REG_TWSIC1);
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 213 spin_unlock_irqrestore(&mcam->dev_lock, flags);
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 214
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 215 if (rval & TWSIC1_WSTAT) {
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 216 cam_err(cam, "SMBUS write (%02x/%02x/%02x) timed out\n", addr,
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 217 command, value);
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 218 return -EIO;
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 219 }
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 220 if (rval & TWSIC1_ERROR) {
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 221 cam_err(cam, "SMBUS write (%02x/%02x/%02x) error\n", addr,
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 222 command, value);
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 223 return -EIO;
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 224 }
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 225 return 0;
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 226 }
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 227
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 228
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 229
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 230 static int cafe_smbus_read_done(struct mcam_camera *mcam)
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 231 {
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 232 unsigned long flags;
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 233 int c1;
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 234
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 235 /*
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 236 * We must delay after the interrupt, or the controller gets confused
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 237 * and never does give us good status. Fortunately, we don't do this
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 238 * often.
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 239 */
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 240 udelay(20);
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 241 spin_lock_irqsave(&mcam->dev_lock, flags);
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 242 c1 = mcam_reg_read(mcam, REG_TWSIC1);
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 243 spin_unlock_irqrestore(&mcam->dev_lock, flags);
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 244 return c1 & (TWSIC1_RVALID|TWSIC1_ERROR);
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 245 }
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 246
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 247
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 248
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 249 static int cafe_smbus_read_data(struct cafe_camera *cam,
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 250 u16 addr, u8 command, u8 *value)
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 251 {
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 252 unsigned int rval;
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 253 unsigned long flags;
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 254 struct mcam_camera *mcam = &cam->mcam;
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 255
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 256 spin_lock_irqsave(&mcam->dev_lock, flags);
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 257 rval = TWSIC0_EN | ((addr << TWSIC0_SID_SHIFT) & TWSIC0_SID);
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 258 rval |= TWSIC0_OVMAGIC; /* Make OV sensors work */
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 259 /*
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 260 * Marvel sez set clkdiv to all 1's for now.
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 261 */
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 262 rval |= TWSIC0_CLKDIV;
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 263 mcam_reg_write(mcam, REG_TWSIC0, rval);
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 264 (void) mcam_reg_read(mcam, REG_TWSIC1); /* force write */
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 265 rval = TWSIC1_READ | ((command << TWSIC1_ADDR_SHIFT) & TWSIC1_ADDR);
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 266 mcam_reg_write(mcam, REG_TWSIC1, rval);
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 @267 spin_unlock_irqrestore(&mcam->dev_lock, flags);
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 268
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 @269 wait_event_timeout(cam->smbus_wait,
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 270 cafe_smbus_read_done(mcam), CAFE_SMBUS_TIMEOUT);
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 271 spin_lock_irqsave(&mcam->dev_lock, flags);
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 272 rval = mcam_reg_read(mcam, REG_TWSIC1);
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 273 spin_unlock_irqrestore(&mcam->dev_lock, flags);
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 274
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 275 if (rval & TWSIC1_ERROR) {
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 276 cam_err(cam, "SMBUS read (%02x/%02x) error\n", addr, command);
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 277 return -EIO;
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 278 }
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 279 if (!(rval & TWSIC1_RVALID)) {
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 280 cam_err(cam, "SMBUS read (%02x/%02x) timed out\n", addr,
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 281 command);
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 282 return -EIO;
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 283 }
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 284 *value = rval & 0xff;
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 285 return 0;
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 286 }
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 287
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 288 /*
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 289 * Perform a transfer over SMBUS. This thing is called under
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 290 * the i2c bus lock, so we shouldn't race with ourselves...
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 291 */
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 292 static int cafe_smbus_xfer(struct i2c_adapter *adapter, u16 addr,
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 293 unsigned short flags, char rw, u8 command,
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 294 int size, union i2c_smbus_data *data)
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 295 {
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 296 struct cafe_camera *cam = i2c_get_adapdata(adapter);
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 297 int ret = -EINVAL;
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 298
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 299 /*
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 300 * This interface would appear to only do byte data ops. OK
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 301 * it can do word too, but the cam chip has no use for that.
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 302 */
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 303 if (size != I2C_SMBUS_BYTE_DATA) {
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 304 cam_err(cam, "funky xfer size %d\n", size);
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 305 return -EINVAL;
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 306 }
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 307
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 308 if (rw == I2C_SMBUS_WRITE)
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 309 ret = cafe_smbus_write_data(cam, addr, command, data->byte);
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 310 else if (rw == I2C_SMBUS_READ)
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 311 ret = cafe_smbus_read_data(cam, addr, command, &data->byte);
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 312 return ret;
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 313 }
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 314
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 315
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 316 static void cafe_smbus_enable_irq(struct cafe_camera *cam)
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 317 {
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 318 unsigned long flags;
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 319
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 320 spin_lock_irqsave(&cam->mcam.dev_lock, flags);
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 321 mcam_reg_set_bit(&cam->mcam, REG_IRQMASK, TWSIIRQS);
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 322 spin_unlock_irqrestore(&cam->mcam.dev_lock, flags);
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 323 }
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 324
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 325 static u32 cafe_smbus_func(struct i2c_adapter *adapter)
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 326 {
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 327 return I2C_FUNC_SMBUS_READ_BYTE_DATA |
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 328 I2C_FUNC_SMBUS_WRITE_BYTE_DATA;
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 329 }
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 330
8e10fd851cb3e97 drivers/media/platform/marvell-ccic/cafe-driver.c Gustavo A. R. Silva 2017-07-09 331 static const struct i2c_algorithm cafe_smbus_algo = {
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 332 .smbus_xfer = cafe_smbus_xfer,
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 333 .functionality = cafe_smbus_func
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 334 };
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 335
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 336 static int cafe_smbus_setup(struct cafe_camera *cam)
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 337 {
595a93a47a3b7dc drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 338 struct i2c_adapter *adap;
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 339 int ret;
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 340
595a93a47a3b7dc drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 341 adap = kzalloc(sizeof(*adap), GFP_KERNEL);
595a93a47a3b7dc drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 342 if (adap == NULL)
595a93a47a3b7dc drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 343 return -ENOMEM;
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 344 adap->owner = THIS_MODULE;
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 345 adap->algo = &cafe_smbus_algo;
cc1e6315e83db0e drivers/media/platform/marvell-ccic/cafe-driver.c Mauro Carvalho Chehab 2018-09-10 346 strscpy(adap->name, "cafe_ccic", sizeof(adap->name));
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 347 adap->dev.parent = &cam->pdev->dev;
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 348 i2c_set_adapdata(adap, cam);
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 349 ret = i2c_add_adapter(adap);
90ca75fd1945d9e drivers/media/platform/marvell-ccic/cafe-driver.c Alexey Khoroshilov 2015-04-03 350 if (ret) {
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 351 printk(KERN_ERR "Unable to register cafe i2c adapter\n");
90ca75fd1945d9e drivers/media/platform/marvell-ccic/cafe-driver.c Alexey Khoroshilov 2015-04-03 352 kfree(adap);
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 353 return ret;
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 354 }
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 355
3eefe36cc00c539 drivers/media/platform/marvell-ccic/cafe-driver.c Lubomir Rintel 2019-05-28 356 cam->i2c_adapter = adap;
90ca75fd1945d9e drivers/media/platform/marvell-ccic/cafe-driver.c Alexey Khoroshilov 2015-04-03 357 cafe_smbus_enable_irq(cam);
90ca75fd1945d9e drivers/media/platform/marvell-ccic/cafe-driver.c Alexey Khoroshilov 2015-04-03 358 return 0;
90ca75fd1945d9e drivers/media/platform/marvell-ccic/cafe-driver.c Alexey Khoroshilov 2015-04-03 359 }
90ca75fd1945d9e drivers/media/platform/marvell-ccic/cafe-driver.c Alexey Khoroshilov 2015-04-03 360
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 361 static void cafe_smbus_shutdown(struct cafe_camera *cam)
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 362 {
3eefe36cc00c539 drivers/media/platform/marvell-ccic/cafe-driver.c Lubomir Rintel 2019-05-28 363 i2c_del_adapter(cam->i2c_adapter);
3eefe36cc00c539 drivers/media/platform/marvell-ccic/cafe-driver.c Lubomir Rintel 2019-05-28 364 kfree(cam->i2c_adapter);
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 365 }
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 366
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 367
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 368 /*
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 369 * Controller-level stuff
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 370 */
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 371
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 372 static void cafe_ctlr_init(struct mcam_camera *mcam)
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 373 {
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 374 unsigned long flags;
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 375
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 376 spin_lock_irqsave(&mcam->dev_lock, flags);
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 377 /*
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 378 * Added magic to bring up the hardware on the B-Test board
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 379 */
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 380 mcam_reg_write(mcam, 0x3038, 0x8);
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 381 mcam_reg_write(mcam, 0x315c, 0x80008);
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 382 /*
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 383 * Go through the dance needed to wake the device up.
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 384 * Note that these registers are global and shared
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 385 * with the NAND and SD devices. Interaction between the
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 386 * three still needs to be examined.
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 387 */
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 388 mcam_reg_write(mcam, REG_GL_CSR, GCSR_SRS|GCSR_MRS); /* Needed? */
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 389 mcam_reg_write(mcam, REG_GL_CSR, GCSR_SRC|GCSR_MRC);
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 390 mcam_reg_write(mcam, REG_GL_CSR, GCSR_SRC|GCSR_MRS);
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 391 /*
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 392 * Here we must wait a bit for the controller to come around.
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 393 */
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 @394 spin_unlock_irqrestore(&mcam->dev_lock, flags);
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 395 msleep(5);
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 396 spin_lock_irqsave(&mcam->dev_lock, flags);
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 397
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 398 mcam_reg_write(mcam, REG_GL_CSR, GCSR_CCIC_EN|GCSR_SRC|GCSR_MRC);
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 399 mcam_reg_set_bit(mcam, REG_GL_IMASK, GIMSK_CCIC_EN);
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 400 /*
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 401 * Mask all interrupts.
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 402 */
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 403 mcam_reg_write(mcam, REG_IRQMASK, 0);
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 @404 spin_unlock_irqrestore(&mcam->dev_lock, flags);
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 405 }
abfa3df36c01a32 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 406
:::::: The code at line 208 was first introduced by commit
:::::: abfa3df36c01a32b081fb448750181af76eb9d55 [media] marvell-cam: Separate out the Marvell camera core
:::::: TO: Jonathan Corbet <corbet@lwn.net>
:::::: CC: Mauro Carvalho Chehab <mchehab@redhat.com>
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org
[-- Attachment #2: config.gz --]
[-- Type: application/gzip, Size: 30947 bytes --]
^ permalink raw reply [flat|nested] 2+ messages in thread
* drivers/media/platform/marvell-ccic/cafe-driver.c:208 cafe_smbus_write_data() error: double unlocked 'mcam->dev_lock' (orig line 188)
@ 2020-08-26 12:53 kernel test robot
0 siblings, 0 replies; 2+ messages in thread
From: kernel test robot @ 2020-08-26 12:53 UTC (permalink / raw)
To: kbuild
[-- Attachment #1: Type: text/plain, Size: 35252 bytes --]
CC: kbuild-all(a)lists.01.org
CC: linux-kernel(a)vger.kernel.org
TO: Mauro Carvalho Chehab <mchehab@kernel.org>
CC: linux-media(a)vger.kernel.org
Hi Mauro,
First bad commit (maybe != root cause):
tree: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master
head: 2ac69819ba9e3d8d550bb5d2d2df74848e556812
commit: a19f228b8dd9a67e8de4ebd4eac8a4c94ec39d1a media: Kconfig: not all V4L2 platform drivers are for camera
date: 4 months ago
:::::: branch date: 12 hours ago
:::::: commit date: 4 months ago
config: riscv-randconfig-m031-20200826 (attached as .config)
compiler: riscv64-linux-gcc (GCC) 9.3.0
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
New smatch warnings:
drivers/media/platform/marvell-ccic/cafe-driver.c:208 cafe_smbus_write_data() error: double unlocked 'mcam->dev_lock' (orig line 188)
drivers/media/platform/marvell-ccic/cafe-driver.c:208 cafe_smbus_write_data() error: double unlocked 'mcam->dev_lock' (orig line 188)
drivers/media/platform/marvell-ccic/cafe-driver.c:269 cafe_smbus_read_data() error: double unlocked 'mcam->dev_lock' (orig line 267)
drivers/media/platform/marvell-ccic/cafe-driver.c:404 cafe_ctlr_init() error: double unlocked 'mcam->dev_lock' (orig line 394)
Old smatch warnings:
drivers/media/platform/marvell-ccic/cafe-driver.c:208 cafe_smbus_write_data() error: double unlocked 'mcam->dev_lock' (orig line 208)
drivers/media/platform/marvell-ccic/cafe-driver.c:208 cafe_smbus_write_data() error: double unlocked 'mcam->dev_lock' (orig line 208)
drivers/media/platform/marvell-ccic/cafe-driver.c:208 cafe_smbus_write_data() error: double unlocked 'mcam->dev_lock' (orig line 208)
drivers/media/platform/marvell-ccic/cafe-driver.c:208 cafe_smbus_write_data() error: double unlocked 'mcam->dev_lock' (orig line 208)
drivers/media/platform/marvell-ccic/cafe-driver.c:208 cafe_smbus_write_data() error: double unlocked 'mcam->dev_lock' (orig line 208)
drivers/media/platform/marvell-ccic/cafe-driver.c:208 cafe_smbus_write_data() error: double unlocked 'mcam->dev_lock' (orig line 208)
drivers/media/platform/marvell-ccic/cafe-driver.c:213 cafe_smbus_write_data() error: double unlocked 'mcam->dev_lock' (orig line 208)
drivers/media/platform/marvell-ccic/cafe-driver.c:269 cafe_smbus_read_data() error: double unlocked 'mcam->dev_lock' (orig line 269)
drivers/media/platform/marvell-ccic/cafe-driver.c:269 cafe_smbus_read_data() error: double unlocked 'mcam->dev_lock' (orig line 269)
drivers/media/platform/marvell-ccic/cafe-driver.c:269 cafe_smbus_read_data() error: double unlocked 'mcam->dev_lock' (orig line 269)
drivers/media/platform/marvell-ccic/cafe-driver.c:273 cafe_smbus_read_data() error: double unlocked 'mcam->dev_lock' (orig line 269)
# https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=a19f228b8dd9a67e8de4ebd4eac8a4c94ec39d1a
git remote add linus https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
git fetch --no-tags linus master
git checkout a19f228b8dd9a67e8de4ebd4eac8a4c94ec39d1a
vim +208 drivers/media/platform/marvell-ccic/cafe-driver.c
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 169
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 170 static int cafe_smbus_write_data(struct cafe_camera *cam,
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 171 u16 addr, u8 command, u8 value)
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 172 {
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 173 unsigned int rval;
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 174 unsigned long flags;
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 175 struct mcam_camera *mcam = &cam->mcam;
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 176
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 177 spin_lock_irqsave(&mcam->dev_lock, flags);
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 178 rval = TWSIC0_EN | ((addr << TWSIC0_SID_SHIFT) & TWSIC0_SID);
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 179 rval |= TWSIC0_OVMAGIC; /* Make OV sensors work */
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 180 /*
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 181 * Marvell sez set clkdiv to all 1's for now.
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 182 */
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 183 rval |= TWSIC0_CLKDIV;
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 184 mcam_reg_write(mcam, REG_TWSIC0, rval);
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 185 (void) mcam_reg_read(mcam, REG_TWSIC1); /* force write */
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 186 rval = value | ((command << TWSIC1_ADDR_SHIFT) & TWSIC1_ADDR);
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 187 mcam_reg_write(mcam, REG_TWSIC1, rval);
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 @188 spin_unlock_irqrestore(&mcam->dev_lock, flags);
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 189
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 190 /* Unfortunately, reading TWSIC1 too soon after sending a command
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 191 * causes the device to die.
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 192 * Use a busy-wait because we often send a large quantity of small
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 193 * commands at-once; using msleep() would cause a lot of context
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 194 * switches which take longer than 2ms, resulting in a noticeable
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 195 * boot-time and capture-start delays.
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 196 */
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 197 mdelay(2);
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 198
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 199 /*
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 200 * Another sad fact is that sometimes, commands silently complete but
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 201 * cafe_smbus_write_done() never becomes aware of this.
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 202 * This happens at random and appears to possible occur with any
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 203 * command.
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 204 * We don't understand why this is. We work around this issue
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 205 * with the timeout in the wait below, assuming that all commands
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 206 * complete within the timeout.
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 207 */
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 @208 wait_event_timeout(cam->smbus_wait, cafe_smbus_write_done(mcam),
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 209 CAFE_SMBUS_TIMEOUT);
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 210
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 211 spin_lock_irqsave(&mcam->dev_lock, flags);
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 212 rval = mcam_reg_read(mcam, REG_TWSIC1);
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 213 spin_unlock_irqrestore(&mcam->dev_lock, flags);
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 214
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 215 if (rval & TWSIC1_WSTAT) {
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 216 cam_err(cam, "SMBUS write (%02x/%02x/%02x) timed out\n", addr,
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 217 command, value);
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 218 return -EIO;
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 219 }
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 220 if (rval & TWSIC1_ERROR) {
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 221 cam_err(cam, "SMBUS write (%02x/%02x/%02x) error\n", addr,
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 222 command, value);
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 223 return -EIO;
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 224 }
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 225 return 0;
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 226 }
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 227
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 228
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 229
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 230 static int cafe_smbus_read_done(struct mcam_camera *mcam)
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 231 {
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 232 unsigned long flags;
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 233 int c1;
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 234
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 235 /*
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 236 * We must delay after the interrupt, or the controller gets confused
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 237 * and never does give us good status. Fortunately, we don't do this
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 238 * often.
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 239 */
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 240 udelay(20);
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 241 spin_lock_irqsave(&mcam->dev_lock, flags);
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 242 c1 = mcam_reg_read(mcam, REG_TWSIC1);
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 243 spin_unlock_irqrestore(&mcam->dev_lock, flags);
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 244 return c1 & (TWSIC1_RVALID|TWSIC1_ERROR);
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 245 }
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 246
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 247
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 248
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 249 static int cafe_smbus_read_data(struct cafe_camera *cam,
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 250 u16 addr, u8 command, u8 *value)
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 251 {
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 252 unsigned int rval;
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 253 unsigned long flags;
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 254 struct mcam_camera *mcam = &cam->mcam;
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 255
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 256 spin_lock_irqsave(&mcam->dev_lock, flags);
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 257 rval = TWSIC0_EN | ((addr << TWSIC0_SID_SHIFT) & TWSIC0_SID);
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 258 rval |= TWSIC0_OVMAGIC; /* Make OV sensors work */
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 259 /*
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 260 * Marvel sez set clkdiv to all 1's for now.
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 261 */
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 262 rval |= TWSIC0_CLKDIV;
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 263 mcam_reg_write(mcam, REG_TWSIC0, rval);
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 264 (void) mcam_reg_read(mcam, REG_TWSIC1); /* force write */
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 265 rval = TWSIC1_READ | ((command << TWSIC1_ADDR_SHIFT) & TWSIC1_ADDR);
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 266 mcam_reg_write(mcam, REG_TWSIC1, rval);
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 @267 spin_unlock_irqrestore(&mcam->dev_lock, flags);
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 268
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 @269 wait_event_timeout(cam->smbus_wait,
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 270 cafe_smbus_read_done(mcam), CAFE_SMBUS_TIMEOUT);
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 271 spin_lock_irqsave(&mcam->dev_lock, flags);
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 272 rval = mcam_reg_read(mcam, REG_TWSIC1);
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 273 spin_unlock_irqrestore(&mcam->dev_lock, flags);
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 274
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 275 if (rval & TWSIC1_ERROR) {
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 276 cam_err(cam, "SMBUS read (%02x/%02x) error\n", addr, command);
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 277 return -EIO;
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 278 }
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 279 if (!(rval & TWSIC1_RVALID)) {
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 280 cam_err(cam, "SMBUS read (%02x/%02x) timed out\n", addr,
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 281 command);
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 282 return -EIO;
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 283 }
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 284 *value = rval & 0xff;
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 285 return 0;
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 286 }
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 287
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 288 /*
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 289 * Perform a transfer over SMBUS. This thing is called under
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 290 * the i2c bus lock, so we shouldn't race with ourselves...
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 291 */
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 292 static int cafe_smbus_xfer(struct i2c_adapter *adapter, u16 addr,
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 293 unsigned short flags, char rw, u8 command,
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 294 int size, union i2c_smbus_data *data)
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 295 {
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 296 struct cafe_camera *cam = i2c_get_adapdata(adapter);
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 297 int ret = -EINVAL;
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 298
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 299 /*
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 300 * This interface would appear to only do byte data ops. OK
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 301 * it can do word too, but the cam chip has no use for that.
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 302 */
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 303 if (size != I2C_SMBUS_BYTE_DATA) {
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 304 cam_err(cam, "funky xfer size %d\n", size);
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 305 return -EINVAL;
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 306 }
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 307
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 308 if (rw == I2C_SMBUS_WRITE)
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 309 ret = cafe_smbus_write_data(cam, addr, command, data->byte);
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 310 else if (rw == I2C_SMBUS_READ)
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 311 ret = cafe_smbus_read_data(cam, addr, command, &data->byte);
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 312 return ret;
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 313 }
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 314
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 315
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 316 static void cafe_smbus_enable_irq(struct cafe_camera *cam)
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 317 {
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 318 unsigned long flags;
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 319
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 320 spin_lock_irqsave(&cam->mcam.dev_lock, flags);
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 321 mcam_reg_set_bit(&cam->mcam, REG_IRQMASK, TWSIIRQS);
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 322 spin_unlock_irqrestore(&cam->mcam.dev_lock, flags);
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 323 }
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 324
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 325 static u32 cafe_smbus_func(struct i2c_adapter *adapter)
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 326 {
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 327 return I2C_FUNC_SMBUS_READ_BYTE_DATA |
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 328 I2C_FUNC_SMBUS_WRITE_BYTE_DATA;
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 329 }
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 330
8e10fd851cb3e9 drivers/media/platform/marvell-ccic/cafe-driver.c Gustavo A. R. Silva 2017-07-09 331 static const struct i2c_algorithm cafe_smbus_algo = {
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 332 .smbus_xfer = cafe_smbus_xfer,
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 333 .functionality = cafe_smbus_func
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 334 };
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 335
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 336 static int cafe_smbus_setup(struct cafe_camera *cam)
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 337 {
595a93a47a3b7d drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 338 struct i2c_adapter *adap;
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 339 int ret;
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 340
595a93a47a3b7d drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 341 adap = kzalloc(sizeof(*adap), GFP_KERNEL);
595a93a47a3b7d drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 342 if (adap == NULL)
595a93a47a3b7d drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 343 return -ENOMEM;
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 344 adap->owner = THIS_MODULE;
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 345 adap->algo = &cafe_smbus_algo;
cc1e6315e83db0 drivers/media/platform/marvell-ccic/cafe-driver.c Mauro Carvalho Chehab 2018-09-10 346 strscpy(adap->name, "cafe_ccic", sizeof(adap->name));
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 347 adap->dev.parent = &cam->pdev->dev;
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 348 i2c_set_adapdata(adap, cam);
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 349 ret = i2c_add_adapter(adap);
90ca75fd1945d9 drivers/media/platform/marvell-ccic/cafe-driver.c Alexey Khoroshilov 2015-04-03 350 if (ret) {
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 351 printk(KERN_ERR "Unable to register cafe i2c adapter\n");
90ca75fd1945d9 drivers/media/platform/marvell-ccic/cafe-driver.c Alexey Khoroshilov 2015-04-03 352 kfree(adap);
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 353 return ret;
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 354 }
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 355
3eefe36cc00c53 drivers/media/platform/marvell-ccic/cafe-driver.c Lubomir Rintel 2019-05-28 356 cam->i2c_adapter = adap;
90ca75fd1945d9 drivers/media/platform/marvell-ccic/cafe-driver.c Alexey Khoroshilov 2015-04-03 357 cafe_smbus_enable_irq(cam);
90ca75fd1945d9 drivers/media/platform/marvell-ccic/cafe-driver.c Alexey Khoroshilov 2015-04-03 358 return 0;
90ca75fd1945d9 drivers/media/platform/marvell-ccic/cafe-driver.c Alexey Khoroshilov 2015-04-03 359 }
90ca75fd1945d9 drivers/media/platform/marvell-ccic/cafe-driver.c Alexey Khoroshilov 2015-04-03 360
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 361 static void cafe_smbus_shutdown(struct cafe_camera *cam)
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 362 {
3eefe36cc00c53 drivers/media/platform/marvell-ccic/cafe-driver.c Lubomir Rintel 2019-05-28 363 i2c_del_adapter(cam->i2c_adapter);
3eefe36cc00c53 drivers/media/platform/marvell-ccic/cafe-driver.c Lubomir Rintel 2019-05-28 364 kfree(cam->i2c_adapter);
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 365 }
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 366
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 367
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 368 /*
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 369 * Controller-level stuff
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 370 */
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 371
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 372 static void cafe_ctlr_init(struct mcam_camera *mcam)
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 373 {
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 374 unsigned long flags;
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 375
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 376 spin_lock_irqsave(&mcam->dev_lock, flags);
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 377 /*
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 378 * Added magic to bring up the hardware on the B-Test board
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 379 */
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 380 mcam_reg_write(mcam, 0x3038, 0x8);
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 381 mcam_reg_write(mcam, 0x315c, 0x80008);
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 382 /*
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 383 * Go through the dance needed to wake the device up.
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 384 * Note that these registers are global and shared
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 385 * with the NAND and SD devices. Interaction between the
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 386 * three still needs to be examined.
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 387 */
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 388 mcam_reg_write(mcam, REG_GL_CSR, GCSR_SRS|GCSR_MRS); /* Needed? */
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 389 mcam_reg_write(mcam, REG_GL_CSR, GCSR_SRC|GCSR_MRC);
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 390 mcam_reg_write(mcam, REG_GL_CSR, GCSR_SRC|GCSR_MRS);
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 391 /*
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 392 * Here we must wait a bit for the controller to come around.
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 393 */
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 @394 spin_unlock_irqrestore(&mcam->dev_lock, flags);
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 395 msleep(5);
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 396 spin_lock_irqsave(&mcam->dev_lock, flags);
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 397
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 398 mcam_reg_write(mcam, REG_GL_CSR, GCSR_CCIC_EN|GCSR_SRC|GCSR_MRC);
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 399 mcam_reg_set_bit(mcam, REG_GL_IMASK, GIMSK_CCIC_EN);
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 400 /*
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 401 * Mask all interrupts.
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 402 */
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 403 mcam_reg_write(mcam, REG_IRQMASK, 0);
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 @404 spin_unlock_irqrestore(&mcam->dev_lock, flags);
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 405 }
abfa3df36c01a3 drivers/media/video/marvell-ccic/cafe-driver.c Jonathan Corbet 2011-06-11 406
:::::: The code at line 208 was first introduced by commit
:::::: abfa3df36c01a32b081fb448750181af76eb9d55 [media] marvell-cam: Separate out the Marvell camera core
:::::: TO: Jonathan Corbet <corbet@lwn.net>
:::::: CC: Mauro Carvalho Chehab <mchehab@redhat.com>
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org
[-- Attachment #2: config.gz --]
[-- Type: application/gzip, Size: 29216 bytes --]
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2020-08-26 12:53 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-08-04 18:25 drivers/media/platform/marvell-ccic/cafe-driver.c:208 cafe_smbus_write_data() error: double unlocked 'mcam->dev_lock' (orig line 188) kernel test robot
2020-08-26 12:53 kernel test robot
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.