diff options
Diffstat (limited to 'drivers/media/video/omap1_camera.c')
| -rw-r--r-- | drivers/media/video/omap1_camera.c | 62 |
1 files changed, 38 insertions, 24 deletions
diff --git a/drivers/media/video/omap1_camera.c b/drivers/media/video/omap1_camera.c index 8a947e603aca..e87ae2f634b2 100644 --- a/drivers/media/video/omap1_camera.c +++ b/drivers/media/video/omap1_camera.c | |||
| @@ -102,10 +102,10 @@ | |||
| 102 | /* end of OMAP1 Camera Interface registers */ | 102 | /* end of OMAP1 Camera Interface registers */ |
| 103 | 103 | ||
| 104 | 104 | ||
| 105 | #define SOCAM_BUS_FLAGS (SOCAM_MASTER | \ | 105 | #define SOCAM_BUS_FLAGS (V4L2_MBUS_MASTER | \ |
| 106 | SOCAM_HSYNC_ACTIVE_HIGH | SOCAM_VSYNC_ACTIVE_HIGH | \ | 106 | V4L2_MBUS_HSYNC_ACTIVE_HIGH | V4L2_MBUS_VSYNC_ACTIVE_HIGH | \ |
| 107 | SOCAM_PCLK_SAMPLE_RISING | SOCAM_PCLK_SAMPLE_FALLING | \ | 107 | V4L2_MBUS_PCLK_SAMPLE_RISING | V4L2_MBUS_PCLK_SAMPLE_FALLING | \ |
| 108 | SOCAM_DATA_ACTIVE_HIGH | SOCAM_DATAWIDTH_8) | 108 | V4L2_MBUS_DATA_ACTIVE_HIGH) |
| 109 | 109 | ||
| 110 | 110 | ||
| 111 | #define FIFO_SIZE ((THRESHOLD_MASK >> THRESHOLD_SHIFT) + 1) | 111 | #define FIFO_SIZE ((THRESHOLD_MASK >> THRESHOLD_SHIFT) + 1) |
| @@ -1438,41 +1438,55 @@ static int omap1_cam_querycap(struct soc_camera_host *ici, | |||
| 1438 | static int omap1_cam_set_bus_param(struct soc_camera_device *icd, | 1438 | static int omap1_cam_set_bus_param(struct soc_camera_device *icd, |
| 1439 | __u32 pixfmt) | 1439 | __u32 pixfmt) |
| 1440 | { | 1440 | { |
| 1441 | struct v4l2_subdev *sd = soc_camera_to_subdev(icd); | ||
| 1441 | struct device *dev = icd->parent; | 1442 | struct device *dev = icd->parent; |
| 1442 | struct soc_camera_host *ici = to_soc_camera_host(dev); | 1443 | struct soc_camera_host *ici = to_soc_camera_host(dev); |
| 1443 | struct omap1_cam_dev *pcdev = ici->priv; | 1444 | struct omap1_cam_dev *pcdev = ici->priv; |
| 1444 | const struct soc_camera_format_xlate *xlate; | 1445 | const struct soc_camera_format_xlate *xlate; |
| 1445 | const struct soc_mbus_pixelfmt *fmt; | 1446 | const struct soc_mbus_pixelfmt *fmt; |
| 1446 | unsigned long camera_flags, common_flags; | 1447 | struct v4l2_mbus_config cfg = {.type = V4L2_MBUS_PARALLEL,}; |
| 1448 | unsigned long common_flags; | ||
| 1447 | u32 ctrlclock, mode; | 1449 | u32 ctrlclock, mode; |
| 1448 | int ret; | 1450 | int ret; |
| 1449 | 1451 | ||
| 1450 | camera_flags = icd->ops->query_bus_param(icd); | 1452 | ret = v4l2_subdev_call(sd, video, g_mbus_config, &cfg); |
| 1451 | 1453 | if (!ret) { | |
| 1452 | common_flags = soc_camera_bus_param_compatible(camera_flags, | 1454 | common_flags = soc_mbus_config_compatible(&cfg, SOCAM_BUS_FLAGS); |
| 1453 | SOCAM_BUS_FLAGS); | 1455 | if (!common_flags) { |
| 1454 | if (!common_flags) | 1456 | dev_warn(dev, |
| 1455 | return -EINVAL; | 1457 | "Flags incompatible: camera 0x%x, host 0x%x\n", |
| 1458 | cfg.flags, SOCAM_BUS_FLAGS); | ||
| 1459 | return -EINVAL; | ||
| 1460 | } | ||
| 1461 | } else if (ret != -ENOIOCTLCMD) { | ||
| 1462 | return ret; | ||
| 1463 | } else { | ||
| 1464 | common_flags = SOCAM_BUS_FLAGS; | ||
| 1465 | } | ||
| 1456 | 1466 | ||
| 1457 | /* Make choices, possibly based on platform configuration */ | 1467 | /* Make choices, possibly based on platform configuration */ |
| 1458 | if ((common_flags & SOCAM_PCLK_SAMPLE_RISING) && | 1468 | if ((common_flags & V4L2_MBUS_PCLK_SAMPLE_RISING) && |
| 1459 | (common_flags & SOCAM_PCLK_SAMPLE_FALLING)) { | 1469 | (common_flags & V4L2_MBUS_PCLK_SAMPLE_FALLING)) { |
| 1460 | if (!pcdev->pdata || | 1470 | if (!pcdev->pdata || |
| 1461 | pcdev->pdata->flags & OMAP1_CAMERA_LCLK_RISING) | 1471 | pcdev->pdata->flags & OMAP1_CAMERA_LCLK_RISING) |
| 1462 | common_flags &= ~SOCAM_PCLK_SAMPLE_FALLING; | 1472 | common_flags &= ~V4L2_MBUS_PCLK_SAMPLE_FALLING; |
| 1463 | else | 1473 | else |
| 1464 | common_flags &= ~SOCAM_PCLK_SAMPLE_RISING; | 1474 | common_flags &= ~V4L2_MBUS_PCLK_SAMPLE_RISING; |
| 1465 | } | 1475 | } |
| 1466 | 1476 | ||
| 1467 | ret = icd->ops->set_bus_param(icd, common_flags); | 1477 | cfg.flags = common_flags; |
| 1468 | if (ret < 0) | 1478 | ret = v4l2_subdev_call(sd, video, s_mbus_config, &cfg); |
| 1479 | if (ret < 0 && ret != -ENOIOCTLCMD) { | ||
| 1480 | dev_dbg(dev, "camera s_mbus_config(0x%lx) returned %d\n", | ||
| 1481 | common_flags, ret); | ||
| 1469 | return ret; | 1482 | return ret; |
| 1483 | } | ||
| 1470 | 1484 | ||
| 1471 | ctrlclock = CAM_READ_CACHE(pcdev, CTRLCLOCK); | 1485 | ctrlclock = CAM_READ_CACHE(pcdev, CTRLCLOCK); |
| 1472 | if (ctrlclock & LCLK_EN) | 1486 | if (ctrlclock & LCLK_EN) |
| 1473 | CAM_WRITE(pcdev, CTRLCLOCK, ctrlclock & ~LCLK_EN); | 1487 | CAM_WRITE(pcdev, CTRLCLOCK, ctrlclock & ~LCLK_EN); |
| 1474 | 1488 | ||
| 1475 | if (common_flags & SOCAM_PCLK_SAMPLE_RISING) { | 1489 | if (common_flags & V4L2_MBUS_PCLK_SAMPLE_RISING) { |
| 1476 | dev_dbg(dev, "CTRLCLOCK_REG |= POLCLK\n"); | 1490 | dev_dbg(dev, "CTRLCLOCK_REG |= POLCLK\n"); |
| 1477 | ctrlclock |= POLCLK; | 1491 | ctrlclock |= POLCLK; |
| 1478 | } else { | 1492 | } else { |
| @@ -1565,10 +1579,10 @@ static int __init omap1_cam_probe(struct platform_device *pdev) | |||
| 1565 | pcdev->clk = clk; | 1579 | pcdev->clk = clk; |
| 1566 | 1580 | ||
| 1567 | pcdev->pdata = pdev->dev.platform_data; | 1581 | pcdev->pdata = pdev->dev.platform_data; |
| 1568 | pcdev->pflags = pcdev->pdata->flags; | 1582 | if (pcdev->pdata) { |
| 1569 | 1583 | pcdev->pflags = pcdev->pdata->flags; | |
| 1570 | if (pcdev->pdata) | ||
| 1571 | pcdev->camexclk = pcdev->pdata->camexclk_khz * 1000; | 1584 | pcdev->camexclk = pcdev->pdata->camexclk_khz * 1000; |
| 1585 | } | ||
| 1572 | 1586 | ||
| 1573 | switch (pcdev->camexclk) { | 1587 | switch (pcdev->camexclk) { |
| 1574 | case 6000000: | 1588 | case 6000000: |
| @@ -1578,6 +1592,7 @@ static int __init omap1_cam_probe(struct platform_device *pdev) | |||
| 1578 | case 24000000: | 1592 | case 24000000: |
| 1579 | break; | 1593 | break; |
| 1580 | default: | 1594 | default: |
| 1595 | /* pcdev->camexclk != 0 => pcdev->pdata != NULL */ | ||
| 1581 | dev_warn(&pdev->dev, | 1596 | dev_warn(&pdev->dev, |
| 1582 | "Incorrect sensor clock frequency %ld kHz, " | 1597 | "Incorrect sensor clock frequency %ld kHz, " |
| 1583 | "should be one of 0, 6, 8, 9.6, 12 or 24 MHz, " | 1598 | "should be one of 0, 6, 8, 9.6, 12 or 24 MHz, " |
| @@ -1585,8 +1600,7 @@ static int __init omap1_cam_probe(struct platform_device *pdev) | |||
| 1585 | pcdev->pdata->camexclk_khz); | 1600 | pcdev->pdata->camexclk_khz); |
| 1586 | pcdev->camexclk = 0; | 1601 | pcdev->camexclk = 0; |
| 1587 | case 0: | 1602 | case 0: |
| 1588 | dev_info(&pdev->dev, | 1603 | dev_info(&pdev->dev, "Not providing sensor clock\n"); |
| 1589 | "Not providing sensor clock\n"); | ||
| 1590 | } | 1604 | } |
| 1591 | 1605 | ||
| 1592 | INIT_LIST_HEAD(&pcdev->capture); | 1606 | INIT_LIST_HEAD(&pcdev->capture); |
| @@ -1716,5 +1730,5 @@ MODULE_PARM_DESC(sg_mode, "videobuf mode, 0: dma-contig (default), 1: dma-sg"); | |||
| 1716 | MODULE_DESCRIPTION("OMAP1 Camera Interface driver"); | 1730 | MODULE_DESCRIPTION("OMAP1 Camera Interface driver"); |
| 1717 | MODULE_AUTHOR("Janusz Krzysztofik <jkrzyszt@tis.icnet.pl>"); | 1731 | MODULE_AUTHOR("Janusz Krzysztofik <jkrzyszt@tis.icnet.pl>"); |
| 1718 | MODULE_LICENSE("GPL v2"); | 1732 | MODULE_LICENSE("GPL v2"); |
| 1719 | MODULE_LICENSE(DRIVER_VERSION); | 1733 | MODULE_VERSION(DRIVER_VERSION); |
| 1720 | MODULE_ALIAS("platform:" DRIVER_NAME); | 1734 | MODULE_ALIAS("platform:" DRIVER_NAME); |
