CC: [email protected]
CC: [email protected]
TO: Mauro Carvalho Chehab <[email protected]>
CC: [email protected]

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 <[email protected]>
Reported-by: Dan Carpenter <[email protected]>

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 <[email protected]>
:::::: CC: Mauro Carvalho Chehab <[email protected]>

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/[email protected]

Attachment: .config.gz
Description: application/gzip

_______________________________________________
kbuild mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to