Lines Matching +full:shut +full:- +full:down +full:- +full:gpios

1 // SPDX-License-Identifier: GPL-2.0-only
10 * Copyright 2006-11 One Laptop Per Child Association, Inc.
11 * Copyright 2006-11 Jonathan Corbet <corbet@lwn.net>
28 #include <media/v4l2-device.h>
36 #include "mcam-core.h"
61 * Most of the camera controller registers are defined in mcam-core.h,
67 * "General purpose register" has a couple of GPIOs used for sensor
71 #define GPR_C1EN 0x00000020 /* Pad 1 (power down) enable */
86 #define TWSIC0_MODE 0x00000002 /* 1 = 16-bit, 0 = 8-bit */
134 dev_err(&(cam)->pdev->dev, fmt, ##arg);
136 dev_warn(&(cam)->pdev->dev, fmt, ##arg);
138 /* -------------------------------------------------------------------- */
164 spin_lock_irqsave(&mcam->dev_lock, flags); in cafe_smbus_write_done()
166 spin_unlock_irqrestore(&mcam->dev_lock, flags); in cafe_smbus_write_done()
175 struct mcam_camera *mcam = &cam->mcam; in cafe_smbus_write_data()
177 spin_lock_irqsave(&mcam->dev_lock, flags); in cafe_smbus_write_data()
188 spin_unlock_irqrestore(&mcam->dev_lock, flags); in cafe_smbus_write_data()
192 * Use a busy-wait because we often send a large quantity of small in cafe_smbus_write_data()
193 * commands at-once; using msleep() would cause a lot of context in cafe_smbus_write_data()
195 * boot-time and capture-start delays. in cafe_smbus_write_data()
208 wait_event_timeout(cam->smbus_wait, cafe_smbus_write_done(mcam), in cafe_smbus_write_data()
211 spin_lock_irqsave(&mcam->dev_lock, flags); in cafe_smbus_write_data()
213 spin_unlock_irqrestore(&mcam->dev_lock, flags); in cafe_smbus_write_data()
218 return -EIO; in cafe_smbus_write_data()
223 return -EIO; in cafe_smbus_write_data()
241 spin_lock_irqsave(&mcam->dev_lock, flags); in cafe_smbus_read_done()
243 spin_unlock_irqrestore(&mcam->dev_lock, flags); in cafe_smbus_read_done()
254 struct mcam_camera *mcam = &cam->mcam; in cafe_smbus_read_data()
256 spin_lock_irqsave(&mcam->dev_lock, flags); in cafe_smbus_read_data()
267 spin_unlock_irqrestore(&mcam->dev_lock, flags); in cafe_smbus_read_data()
269 wait_event_timeout(cam->smbus_wait, in cafe_smbus_read_data()
271 spin_lock_irqsave(&mcam->dev_lock, flags); in cafe_smbus_read_data()
273 spin_unlock_irqrestore(&mcam->dev_lock, flags); in cafe_smbus_read_data()
277 return -EIO; in cafe_smbus_read_data()
282 return -EIO; in cafe_smbus_read_data()
297 int ret = -EINVAL; in cafe_smbus_xfer()
305 return -EINVAL; in cafe_smbus_xfer()
309 ret = cafe_smbus_write_data(cam, addr, command, data->byte); in cafe_smbus_xfer()
311 ret = cafe_smbus_read_data(cam, addr, command, &data->byte); in cafe_smbus_xfer()
320 spin_lock_irqsave(&cam->mcam.dev_lock, flags); in cafe_smbus_enable_irq()
321 mcam_reg_set_bit(&cam->mcam, REG_IRQMASK, TWSIIRQS); in cafe_smbus_enable_irq()
322 spin_unlock_irqrestore(&cam->mcam.dev_lock, flags); in cafe_smbus_enable_irq()
343 return -ENOMEM; in cafe_smbus_setup()
344 adap->owner = THIS_MODULE; in cafe_smbus_setup()
345 adap->algo = &cafe_smbus_algo; in cafe_smbus_setup()
346 strscpy(adap->name, "cafe_ccic", sizeof(adap->name)); in cafe_smbus_setup()
347 adap->dev.parent = &cam->pdev->dev; in cafe_smbus_setup()
356 cam->i2c_adapter = adap; in cafe_smbus_setup()
363 i2c_del_adapter(cam->i2c_adapter); in cafe_smbus_shutdown()
364 kfree(cam->i2c_adapter); in cafe_smbus_shutdown()
369 * Controller-level stuff
376 spin_lock_irqsave(&mcam->dev_lock, flags); in cafe_ctlr_init()
378 * Added magic to bring up the hardware on the B-Test board in cafe_ctlr_init()
394 spin_unlock_irqrestore(&mcam->dev_lock, flags); in cafe_ctlr_init()
396 spin_lock_irqsave(&mcam->dev_lock, flags); in cafe_ctlr_init()
404 spin_unlock_irqrestore(&mcam->dev_lock, flags); in cafe_ctlr_init()
417 * Put the sensor into operational mode (assumes OLPC-style in cafe_ctlr_power_up()
418 * wiring). Control 0 is reset - set to 1 to operate. in cafe_ctlr_power_up()
419 * Control 1 is power down, set to 0 to operate. in cafe_ctlr_power_up()
442 struct mcam_camera *mcam = &cam->mcam; in cafe_irq()
445 spin_lock(&mcam->dev_lock); in cafe_irq()
447 handled = cam->registered && mccic_irq(mcam, irqs); in cafe_irq()
450 wake_up(&cam->smbus_wait); in cafe_irq()
453 spin_unlock(&mcam->dev_lock); in cafe_irq()
457 /* -------------------------------------------------------------------------- */
481 /* -------------------------------------------------------------------------- */
496 ret = -ENOMEM; in cafe_pci_probe()
501 cam->pdev = pdev; in cafe_pci_probe()
502 mcam = &cam->mcam; in cafe_pci_probe()
503 mcam->chip_id = MCAM_CAFE; in cafe_pci_probe()
504 spin_lock_init(&mcam->dev_lock); in cafe_pci_probe()
505 init_waitqueue_head(&cam->smbus_wait); in cafe_pci_probe()
506 mcam->plat_power_up = cafe_ctlr_power_up; in cafe_pci_probe()
507 mcam->plat_power_down = cafe_ctlr_power_down; in cafe_pci_probe()
508 mcam->dev = &pdev->dev; in cafe_pci_probe()
509 snprintf(mcam->bus_info, sizeof(mcam->bus_info), "PCI:%s", pci_name(pdev)); in cafe_pci_probe()
515 mcam->buffer_mode = B_vmalloc; in cafe_pci_probe()
524 ret = -EIO; in cafe_pci_probe()
525 mcam->regs = pci_iomap(pdev, 0, 0); in cafe_pci_probe()
526 if (!mcam->regs) { in cafe_pci_probe()
527 printk(KERN_ERR "Unable to ioremap cafe-ccic regs\n"); in cafe_pci_probe()
530 mcam->regs_size = pci_resource_len(pdev, 0); in cafe_pci_probe()
531 ret = request_irq(pdev->irq, cafe_irq, IRQF_SHARED, "cafe-ccic", cam); in cafe_pci_probe()
549 mcam->asd.match_type = V4L2_ASYNC_MATCH_I2C; in cafe_pci_probe()
550 mcam->asd.match.i2c.adapter_id = i2c_adapter_id(cam->i2c_adapter); in cafe_pci_probe()
551 mcam->asd.match.i2c.address = ov7670_info.addr; in cafe_pci_probe()
557 clkdev_create(mcam->mclk, "xclk", "%d-%04x", in cafe_pci_probe()
558 i2c_adapter_id(cam->i2c_adapter), ov7670_info.addr); in cafe_pci_probe()
560 if (!IS_ERR(i2c_new_client_device(cam->i2c_adapter, &ov7670_info))) { in cafe_pci_probe()
561 cam->registered = 1; in cafe_pci_probe()
570 free_irq(pdev->irq, cam); in cafe_pci_probe()
572 pci_iounmap(pdev, mcam->regs); in cafe_pci_probe()
583 * Shut down an initialized device
587 mccic_shutdown(&cam->mcam); in cafe_shutdown()
589 free_irq(cam->pdev->irq, cam); in cafe_shutdown()
590 pci_iounmap(cam->pdev, cam->mcam.regs); in cafe_shutdown()
614 mccic_suspend(&cam->mcam); in cafe_pci_suspend()
623 cafe_ctlr_init(&cam->mcam); in cafe_pci_resume()
624 return mccic_resume(&cam->mcam); in cafe_pci_resume()
638 .name = "cafe1000-ccic",