aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/bcm27xx/patches-5.4/950-0798-media-pxa_camera-Use-the-new-set_mbus_config-op.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/bcm27xx/patches-5.4/950-0798-media-pxa_camera-Use-the-new-set_mbus_config-op.patch')
-rw-r--r--target/linux/bcm27xx/patches-5.4/950-0798-media-pxa_camera-Use-the-new-set_mbus_config-op.patch285
1 files changed, 0 insertions, 285 deletions
diff --git a/target/linux/bcm27xx/patches-5.4/950-0798-media-pxa_camera-Use-the-new-set_mbus_config-op.patch b/target/linux/bcm27xx/patches-5.4/950-0798-media-pxa_camera-Use-the-new-set_mbus_config-op.patch
deleted file mode 100644
index 4e5c349072..0000000000
--- a/target/linux/bcm27xx/patches-5.4/950-0798-media-pxa_camera-Use-the-new-set_mbus_config-op.patch
+++ /dev/null
@@ -1,285 +0,0 @@
-From 63f4970ce038e60455a6225b317d0b259e046c94 Mon Sep 17 00:00:00 2001
-From: Jacopo Mondi <jacopo+renesas@jmondi.org>
-Date: Tue, 16 Jun 2020 16:12:39 +0200
-Subject: [PATCH] media: pxa_camera: Use the new set_mbus_config op
-
-Upstream https://patchwork.linuxtv.org/patch/64671/
-
-Move the PXA camera driver to use the new set_mbus_config pad operation.
-For this platform the change is not only cosmetic, as the pxa driver is
-currently the only driver in mainline to make use of the g_mbus_config
-and s_mbus_config video operations.
-
-The existing driver semantic is the following:
-- Collect all supported mbus config flags from the remote end
-- Match them with the supported PXA mbus configuration flags
-- If the remote subdevice allows multiple options for for VSYNC, HSYNC
- and PCLK polarity, use platform data requested settings
-
-The semantic of the new get_mbus_config and set_mbus_config differs from
-the corresponding video ops, particularly in the fact get_mbus_config
-reports the current mbus configuration and not the set of supported
-configuration options, with set_mbus_config always reporting the actual
-mbus configuration applied to the remote subdevice.
-
-Adapt the driver to perform the following
-- Set the remote subdevice mbus configuration according to the PXA
- platform data preferences.
-- If the applied configuration differs from the requested one (i.e. the
- remote subdevice does not allow changing one setting) make sure that
- - The remote end does not claim for DATA_ACTIVE_LOW, which seems not
- supported by the platform
- - The bus mastering roles match
-
-While at there remove a few checks performed on the media bus
-configuration at get_format() time as they do not belong there.
-
-Compile-tested only.
-
-Signed-off-by: Jacopo Mondi <jacopo+renesas@jmondi.org>
----
- drivers/media/platform/pxa_camera.c | 189 ++++++++--------------------
- 1 file changed, 51 insertions(+), 138 deletions(-)
-
---- a/drivers/media/platform/pxa_camera.c
-+++ b/drivers/media/platform/pxa_camera.c
-@@ -605,42 +605,6 @@ static const struct pxa_mbus_pixelfmt *p
- return pxa_mbus_find_fmtdesc(code, mbus_fmt, ARRAY_SIZE(mbus_fmt));
- }
-
--static unsigned int pxa_mbus_config_compatible(const struct v4l2_mbus_config *cfg,
-- unsigned int flags)
--{
-- unsigned long common_flags;
-- bool hsync = true, vsync = true, pclk, data, mode;
-- bool mipi_lanes, mipi_clock;
--
-- common_flags = cfg->flags & flags;
--
-- switch (cfg->type) {
-- case V4L2_MBUS_PARALLEL:
-- hsync = common_flags & (V4L2_MBUS_HSYNC_ACTIVE_HIGH |
-- V4L2_MBUS_HSYNC_ACTIVE_LOW);
-- vsync = common_flags & (V4L2_MBUS_VSYNC_ACTIVE_HIGH |
-- V4L2_MBUS_VSYNC_ACTIVE_LOW);
-- /* fall through */
-- case V4L2_MBUS_BT656:
-- pclk = common_flags & (V4L2_MBUS_PCLK_SAMPLE_RISING |
-- V4L2_MBUS_PCLK_SAMPLE_FALLING);
-- data = common_flags & (V4L2_MBUS_DATA_ACTIVE_HIGH |
-- V4L2_MBUS_DATA_ACTIVE_LOW);
-- mode = common_flags & (V4L2_MBUS_MASTER | V4L2_MBUS_SLAVE);
-- return (!hsync || !vsync || !pclk || !data || !mode) ?
-- 0 : common_flags;
-- case V4L2_MBUS_CSI2_DPHY:
-- mipi_lanes = common_flags & V4L2_MBUS_CSI2_LANES;
-- mipi_clock = common_flags & (V4L2_MBUS_CSI2_NONCONTINUOUS_CLOCK |
-- V4L2_MBUS_CSI2_CONTINUOUS_CLOCK);
-- return (!mipi_lanes || !mipi_clock) ? 0 : common_flags;
-- default:
-- WARN_ON(1);
-- return -EINVAL;
-- }
-- return 0;
--}
--
- /**
- * struct pxa_camera_format_xlate - match between host and sensor formats
- * @code: code of a sensor provided format
-@@ -1231,31 +1195,6 @@ static irqreturn_t pxa_camera_irq(int ir
- return IRQ_HANDLED;
- }
-
--static int test_platform_param(struct pxa_camera_dev *pcdev,
-- unsigned char buswidth, unsigned long *flags)
--{
-- /*
-- * Platform specified synchronization and pixel clock polarities are
-- * only a recommendation and are only used during probing. The PXA270
-- * quick capture interface supports both.
-- */
-- *flags = (pcdev->platform_flags & PXA_CAMERA_MASTER ?
-- V4L2_MBUS_MASTER : V4L2_MBUS_SLAVE) |
-- V4L2_MBUS_HSYNC_ACTIVE_HIGH |
-- V4L2_MBUS_HSYNC_ACTIVE_LOW |
-- V4L2_MBUS_VSYNC_ACTIVE_HIGH |
-- V4L2_MBUS_VSYNC_ACTIVE_LOW |
-- V4L2_MBUS_DATA_ACTIVE_HIGH |
-- V4L2_MBUS_PCLK_SAMPLE_RISING |
-- V4L2_MBUS_PCLK_SAMPLE_FALLING;
--
-- /* If requested data width is supported by the platform, use it */
-- if ((1 << (buswidth - 1)) & pcdev->width_flags)
-- return 0;
--
-- return -EINVAL;
--}
--
- static void pxa_camera_setup_cicr(struct pxa_camera_dev *pcdev,
- unsigned long flags, __u32 pixfmt)
- {
-@@ -1601,99 +1540,78 @@ static int pxa_camera_init_videobuf2(str
- */
- static int pxa_camera_set_bus_param(struct pxa_camera_dev *pcdev)
- {
-+ unsigned int bus_width = pcdev->current_fmt->host_fmt->bits_per_sample;
- struct v4l2_mbus_config cfg = {.type = V4L2_MBUS_PARALLEL,};
- u32 pixfmt = pcdev->current_fmt->host_fmt->fourcc;
-- unsigned long bus_flags, common_flags;
-+ int mbus_config;
- int ret;
-
-- ret = test_platform_param(pcdev,
-- pcdev->current_fmt->host_fmt->bits_per_sample,
-- &bus_flags);
-- if (ret < 0)
-- return ret;
--
-- ret = sensor_call(pcdev, video, g_mbus_config, &cfg);
-- if (!ret) {
-- common_flags = pxa_mbus_config_compatible(&cfg,
-- bus_flags);
-- if (!common_flags) {
-- dev_warn(pcdev_to_dev(pcdev),
-- "Flags incompatible: camera 0x%x, host 0x%lx\n",
-- cfg.flags, bus_flags);
-- return -EINVAL;
-- }
-- } else if (ret != -ENOIOCTLCMD) {
-- return ret;
-- } else {
-- common_flags = bus_flags;
-+ if (!((1 << (bus_width - 1)) & pcdev->width_flags)) {
-+ dev_err(pcdev_to_dev(pcdev), "Unsupported bus width %u",
-+ bus_width);
-+ return -EINVAL;
- }
-
- pcdev->channels = 1;
-
- /* Make choices, based on platform preferences */
-- if ((common_flags & V4L2_MBUS_HSYNC_ACTIVE_HIGH) &&
-- (common_flags & V4L2_MBUS_HSYNC_ACTIVE_LOW)) {
-- if (pcdev->platform_flags & PXA_CAMERA_HSP)
-- common_flags &= ~V4L2_MBUS_HSYNC_ACTIVE_HIGH;
-- else
-- common_flags &= ~V4L2_MBUS_HSYNC_ACTIVE_LOW;
-- }
--
-- if ((common_flags & V4L2_MBUS_VSYNC_ACTIVE_HIGH) &&
-- (common_flags & V4L2_MBUS_VSYNC_ACTIVE_LOW)) {
-- if (pcdev->platform_flags & PXA_CAMERA_VSP)
-- common_flags &= ~V4L2_MBUS_VSYNC_ACTIVE_HIGH;
-- else
-- common_flags &= ~V4L2_MBUS_VSYNC_ACTIVE_LOW;
-- }
--
-- if ((common_flags & V4L2_MBUS_PCLK_SAMPLE_RISING) &&
-- (common_flags & V4L2_MBUS_PCLK_SAMPLE_FALLING)) {
-- if (pcdev->platform_flags & PXA_CAMERA_PCP)
-- common_flags &= ~V4L2_MBUS_PCLK_SAMPLE_RISING;
-- else
-- common_flags &= ~V4L2_MBUS_PCLK_SAMPLE_FALLING;
-- }
--
-- cfg.flags = common_flags;
-- ret = sensor_call(pcdev, video, s_mbus_config, &cfg);
-- if (ret < 0 && ret != -ENOIOCTLCMD) {
-- dev_dbg(pcdev_to_dev(pcdev),
-- "camera s_mbus_config(0x%lx) returned %d\n",
-- common_flags, ret);
-- return ret;
-- }
-+ mbus_config = 0;
-+ if (pcdev->platform_flags & PXA_CAMERA_MASTER)
-+ mbus_config |= V4L2_MBUS_MASTER;
-+ else
-+ mbus_config |= V4L2_MBUS_SLAVE;
-
-- pxa_camera_setup_cicr(pcdev, common_flags, pixfmt);
-+ if (pcdev->platform_flags & PXA_CAMERA_HSP)
-+ mbus_config |= V4L2_MBUS_HSYNC_ACTIVE_HIGH;
-+ else
-+ mbus_config |= V4L2_MBUS_HSYNC_ACTIVE_LOW;
-
-- return 0;
--}
-+ if (pcdev->platform_flags & PXA_CAMERA_VSP)
-+ mbus_config |= V4L2_MBUS_VSYNC_ACTIVE_HIGH;
-+ else
-+ mbus_config |= V4L2_MBUS_VSYNC_ACTIVE_LOW;
-
--static int pxa_camera_try_bus_param(struct pxa_camera_dev *pcdev,
-- unsigned char buswidth)
--{
-- struct v4l2_mbus_config cfg = {.type = V4L2_MBUS_PARALLEL,};
-- unsigned long bus_flags, common_flags;
-- int ret = test_platform_param(pcdev, buswidth, &bus_flags);
-+ if (pcdev->platform_flags & PXA_CAMERA_PCP)
-+ mbus_config |= V4L2_MBUS_PCLK_SAMPLE_RISING;
-+ else
-+ mbus_config |= V4L2_MBUS_PCLK_SAMPLE_FALLING;
-+ mbus_config |= V4L2_MBUS_DATA_ACTIVE_HIGH;
-
-- if (ret < 0)
-+ cfg.flags = mbus_config;
-+ ret = sensor_call(pcdev, pad, set_mbus_config, 0, &cfg);
-+ if (ret < 0 && ret != -ENOIOCTLCMD) {
-+ dev_err(pcdev_to_dev(pcdev),
-+ "Failed to call set_mbus_config: %d\n", ret);
- return ret;
-+ }
-+
-+ /*
-+ * If the requested media bus configuration has not been fully applied
-+ * make sure it is supported by the platform.
-+ *
-+ * PXA does not support V4L2_MBUS_DATA_ACTIVE_LOW and the bus mastering
-+ * roles should match.
-+ */
-+ if (cfg.flags != mbus_config) {
-+ unsigned int pxa_mbus_role = mbus_config & (V4L2_MBUS_MASTER |
-+ V4L2_MBUS_SLAVE);
-+ if (pxa_mbus_role != (cfg.flags & (V4L2_MBUS_MASTER |
-+ V4L2_MBUS_SLAVE))) {
-+ dev_err(pcdev_to_dev(pcdev),
-+ "Unsupported mbus configuration: bus mastering\n");
-+ return -EINVAL;
-+ }
-
-- ret = sensor_call(pcdev, video, g_mbus_config, &cfg);
-- if (!ret) {
-- common_flags = pxa_mbus_config_compatible(&cfg,
-- bus_flags);
-- if (!common_flags) {
-- dev_warn(pcdev_to_dev(pcdev),
-- "Flags incompatible: camera 0x%x, host 0x%lx\n",
-- cfg.flags, bus_flags);
-+ if (cfg.flags & V4L2_MBUS_DATA_ACTIVE_LOW) {
-+ dev_err(pcdev_to_dev(pcdev),
-+ "Unsupported mbus configuration: DATA_ACTIVE_LOW\n");
- return -EINVAL;
- }
-- } else if (ret == -ENOIOCTLCMD) {
-- ret = 0;
- }
-
-- return ret;
-+ pxa_camera_setup_cicr(pcdev, cfg.flags, pixfmt);
-+
-+ return 0;
- }
-
- static const struct pxa_mbus_pixelfmt pxa_camera_formats[] = {
-@@ -1741,11 +1659,6 @@ static int pxa_camera_get_formats(struct
- return 0;
- }
-
-- /* This also checks support for the requested bits-per-sample */
-- ret = pxa_camera_try_bus_param(pcdev, fmt->bits_per_sample);
-- if (ret < 0)
-- return 0;
--
- switch (code.code) {
- case MEDIA_BUS_FMT_UYVY8_2X8:
- formats++;