summaryrefslogtreecommitdiff
path: root/drivers/media/platform/imx8
diff options
context:
space:
mode:
authorGuoniu.Zhou <guoniu.zhou@nxp.com>2018-04-17 14:48:13 +0800
committerJason Liu <jason.hui.liu@nxp.com>2019-02-12 10:31:27 +0800
commit9c9e28fdfd30b18cdf52b7d9295d8f64f140e995 (patch)
tree6b0f2ef8645ddbac99f1b1a9f10f067213b4277b /drivers/media/platform/imx8
parentb67ad61f5c12fd69151bb84cfbb689cdb1297110 (diff)
MLK-18053: camera: Refine VIDIOC_DBG_G_CHIP_IDENT ioctl
Driver only return camera name for max9286 before, but the driver is now supporting ov5640. So refine this ioctl implement and remove max9286 camera driver private data Reviewed-by: Sandor.yu <sandor.yu@nxp.com> Signed-off-by: Guoniu.Zhou <guoniu.zhou@nxp.com>
Diffstat (limited to 'drivers/media/platform/imx8')
-rw-r--r--drivers/media/platform/imx8/max9286.c79
-rw-r--r--drivers/media/platform/imx8/max9286.h89
-rw-r--r--drivers/media/platform/imx8/mxc-isi-cap.c57
-rw-r--r--drivers/media/platform/imx8/mxc-mipi-csi2.c2
-rw-r--r--drivers/media/platform/imx8/mxc-parallel-csi.c2
5 files changed, 114 insertions, 115 deletions
diff --git a/drivers/media/platform/imx8/max9286.c b/drivers/media/platform/imx8/max9286.c
index 4c929cd6f6f2..3f9baa4d7483 100644
--- a/drivers/media/platform/imx8/max9286.c
+++ b/drivers/media/platform/imx8/max9286.c
@@ -24,7 +24,6 @@
#include <linux/regulator/consumer.h>
#include <media/v4l2-subdev.h>
-#include "max9286.h"
#define MAX9271_MAX_SENSOR_NUM 4
#define CAMERA_USES_15HZ
@@ -32,9 +31,87 @@
#define ADDR_MAX9286 0x6A
#define ADDR_MAX9271 0x40
#define ADDR_MAX9271_ALL (ADDR_MAX9271 + 5) /* Broadcast address */
+
+#define MIPI_CSI2_SENS_VC0_PAD_SOURCE 0
+#define MIPI_CSI2_SENS_VC1_PAD_SOURCE 1
+#define MIPI_CSI2_SENS_VC2_PAD_SOURCE 2
+#define MIPI_CSI2_SENS_VC3_PAD_SOURCE 3
+#define MIPI_CSI2_SENS_VCX_PADS_NUM 4
+
+#define MAX_FPS 30
+#define MIN_FPS 30
+#define DEFAULT_FPS 30
+
#define ADDR_OV_SENSOR 0x30
#define ADDR_AP_SENSOR 0x5D
+/*!
+ * Maintains the information on the current state of the sesor.
+ */
+struct imxdpu_videomode {
+ char name[64]; /* may not be needed */
+
+ uint32_t pixelclock; /* Hz */
+
+ /* htotal (pixels) = hlen + hfp + hsync + hbp */
+ uint32_t hlen;
+ uint32_t hfp;
+ uint32_t hbp;
+ uint32_t hsync;
+
+ /* field0 - vtotal (lines) = vlen + vfp + vsync + vbp */
+ uint32_t vlen;
+ uint32_t vfp;
+ uint32_t vbp;
+ uint32_t vsync;
+
+ /* field1 */
+ uint32_t vlen1;
+ uint32_t vfp1;
+ uint32_t vbp1;
+ uint32_t vsync1;
+
+ uint32_t flags;
+
+ uint32_t format;
+ uint32_t dest_format; /*buffer format for capture*/
+
+ int16_t clip_top;
+ int16_t clip_left;
+ uint16_t clip_width;
+ uint16_t clip_height;
+};
+
+struct sensor_data {
+ struct v4l2_subdev subdev;
+ struct media_pad pads[MIPI_CSI2_SENS_VCX_PADS_NUM];
+ struct i2c_client *i2c_client;
+ struct v4l2_mbus_framefmt format;
+ struct v4l2_captureparm streamcap;
+ char running;
+
+ /* control settings */
+ int brightness;
+ int hue;
+ int contrast;
+ int saturation;
+ int red;
+ int green;
+ int blue;
+ int ae_mode;
+
+ u32 mclk;
+ u8 mclk_source;
+ struct clk *sensor_clk;
+ int v_channel;
+ bool is_mipi;
+ struct imxdpu_videomode cap_mode;
+
+ unsigned int sensor_num; /* sensor num connect max9271 */
+ unsigned char sensor_is_there; /* Bit 0~3 for 4 cameras, 0b1= is there; 0b0 = is not there */
+ int pwn_gpio;
+};
+
static unsigned int g_max9286_width = 1280;
static unsigned int g_max9286_height = 800;
diff --git a/drivers/media/platform/imx8/max9286.h b/drivers/media/platform/imx8/max9286.h
deleted file mode 100644
index 6acfee73ce41..000000000000
--- a/drivers/media/platform/imx8/max9286.h
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Copyright 2017 NXP
- */
-/*
- * The code contained herein is licensed under the GNU General Public
- * License. You may obtain a copy of the GNU General Public License
- * Version 2 or later.
- */
-
-#ifndef __MAX9286_H__
-#define __MAX9286_H__
-
-#define MIPI_CSI2_SENS_VC0_PAD_SOURCE 0
-#define MIPI_CSI2_SENS_VC1_PAD_SOURCE 1
-#define MIPI_CSI2_SENS_VC2_PAD_SOURCE 2
-#define MIPI_CSI2_SENS_VC3_PAD_SOURCE 3
-#define MIPI_CSI2_SENS_VCX_PADS_NUM 4
-
-#define MAX_FPS 30
-#define MIN_FPS 30
-#define DEFAULT_FPS 30
-
-/*!
- * Maintains the information on the current state of the sesor.
- */
-struct imxdpu_videomode {
- char name[64]; /* may not be needed */
-
- uint32_t pixelclock; /* Hz */
-
- /* htotal (pixels) = hlen + hfp + hsync + hbp */
- uint32_t hlen;
- uint32_t hfp;
- uint32_t hbp;
- uint32_t hsync;
-
- /* field0 - vtotal (lines) = vlen + vfp + vsync + vbp */
- uint32_t vlen;
- uint32_t vfp;
- uint32_t vbp;
- uint32_t vsync;
-
- /* field1 */
- uint32_t vlen1;
- uint32_t vfp1;
- uint32_t vbp1;
- uint32_t vsync1;
-
- uint32_t flags;
-
- uint32_t format;
- uint32_t dest_format; /*buffer format for capture*/
-
- int16_t clip_top;
- int16_t clip_left;
- uint16_t clip_width;
- uint16_t clip_height;
-
-};
-struct sensor_data {
- struct v4l2_subdev subdev;
- struct media_pad pads[MIPI_CSI2_SENS_VCX_PADS_NUM];
- struct i2c_client *i2c_client;
- struct v4l2_mbus_framefmt format;
- struct v4l2_captureparm streamcap;
- char running;
-
- /* control settings */
- int brightness;
- int hue;
- int contrast;
- int saturation;
- int red;
- int green;
- int blue;
- int ae_mode;
-
- u32 mclk;
- u8 mclk_source;
- struct clk *sensor_clk;
- int v_channel;
- bool is_mipi;
- struct imxdpu_videomode cap_mode;
-
- unsigned int sensor_num; /* sensor num connect max9271 */
- unsigned char sensor_is_there; /* Bit 0~3 for 4 cameras, 0b1= is there; 0b0 = is not there */
- int pwn_gpio;
-};
-#endif
diff --git a/drivers/media/platform/imx8/mxc-isi-cap.c b/drivers/media/platform/imx8/mxc-isi-cap.c
index bf1d81e7ed4d..e8a2b2b001af 100644
--- a/drivers/media/platform/imx8/mxc-isi-cap.c
+++ b/drivers/media/platform/imx8/mxc-isi-cap.c
@@ -19,6 +19,7 @@
#include <linux/pm_runtime.h>
#include <linux/list.h>
#include <linux/slab.h>
+#include <linux/of_graph.h>
#include <linux/videodev2.h>
#include <media/v4l2-device.h>
@@ -31,7 +32,6 @@
#include "mxc-isi-core.h"
#include "mxc-isi-hw.h"
#include "mxc-media-dev.h"
-#include "max9286.h"
struct mxc_isi_fmt mxc_isi_out_formats[] = {
{
@@ -968,42 +968,49 @@ static int mxc_isi_cap_s_selection(struct file *file, void *fh,
return 0;
}
-static struct v4l2_subdev *mxc_isi_get_subdev_by_name(struct v4l2_device *v4l2,
- const char *name)
-{
- struct v4l2_subdev *sd;
- bool found = false;
-
- list_for_each_entry(sd, &v4l2->subdevs, list) {
- if (strstr(sd->name, name) != NULL) {
- found = true;
- break;
- }
- }
-
- return (found) ? sd : NULL;
-}
-
static int mxc_isi_cap_g_chip_ident(struct file *file, void *fb,
struct v4l2_dbg_chip_ident *chip)
{
+ struct device_node *local, *remote, *endpoint;
struct mxc_isi_dev *mxc_isi = video_drvdata(file);
- struct v4l2_device *v4l2_dev = mxc_isi->isi_cap.sd.v4l2_dev;
struct video_device *vdev = video_devdata(file);
- struct sensor_data *max9286;
struct v4l2_subdev *sd;
+ struct media_pad *source_pad;
+
+ source_pad = mxc_isi_get_remote_source_pad(mxc_isi);
+ if (source_pad == NULL) {
+ v4l2_err(mxc_isi->v4l2_dev, "%s, No remote pad found!\n", __func__);
+ return -EINVAL;
+ }
- sd = mxc_isi_get_subdev_by_name(v4l2_dev, "max9286_mipi");
+ /* Get remote source pad subdev */
+ sd = media_entity_to_v4l2_subdev(source_pad->entity);
if (sd == NULL) {
- v4l2_err(&mxc_isi->isi_cap.sd, "Can't find sub device\n");
+ v4l2_err(mxc_isi->v4l2_dev, "%s, No remote subdev found!\n", __func__);
+ return -EINVAL;
+ }
+
+ local = dev_of_node(sd->dev);
+ if (!local) {
+ v4l2_err(mxc_isi->v4l2_dev, "%s, Get device node fail\n", __func__);
return -ENODEV;
}
- max9286 = container_of(sd, struct sensor_data, subdev);
- if (max9286->sensor_is_there & (0x1 << vdev->num))
- sprintf(chip->match.name, "max9286_mipi%d\n", vdev->num);
- else
+ endpoint = of_graph_get_endpoint_by_regs(local, -1, -1);
+ if (!endpoint) {
+ v4l2_err(mxc_isi->v4l2_dev, "%s, No %s endpoint\n",
+ __func__, local->name);
return -ENODEV;
+ }
+
+ remote = of_graph_get_remote_port_parent(endpoint);
+ if (!remote) {
+ v4l2_err(mxc_isi->v4l2_dev, "%s No remote port for %s\n",
+ __func__, endpoint->name);
+ return -ENODEV;
+ }
+
+ sprintf(chip->match.name, "imx8_%s_%d", remote->name, vdev->num);
return 0;
}
diff --git a/drivers/media/platform/imx8/mxc-mipi-csi2.c b/drivers/media/platform/imx8/mxc-mipi-csi2.c
index ed73985d566f..a5c420d8a51c 100644
--- a/drivers/media/platform/imx8/mxc-mipi-csi2.c
+++ b/drivers/media/platform/imx8/mxc-mipi-csi2.c
@@ -706,6 +706,8 @@ static int mipi_csi2_probe(struct platform_device *pdev)
csi2dev->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
csi2dev->sd.entity.function = MEDIA_ENT_F_IO_V4L;
+ csi2dev->sd.dev = dev;
+
csi2dev->pads[MXC_MIPI_CSI2_VC0_PAD_SINK].flags = MEDIA_PAD_FL_SINK;
csi2dev->pads[MXC_MIPI_CSI2_VC1_PAD_SINK].flags = MEDIA_PAD_FL_SINK;
csi2dev->pads[MXC_MIPI_CSI2_VC2_PAD_SINK].flags = MEDIA_PAD_FL_SINK;
diff --git a/drivers/media/platform/imx8/mxc-parallel-csi.c b/drivers/media/platform/imx8/mxc-parallel-csi.c
index 4f909c93bedd..f06a6b326f79 100644
--- a/drivers/media/platform/imx8/mxc-parallel-csi.c
+++ b/drivers/media/platform/imx8/mxc-parallel-csi.c
@@ -548,6 +548,8 @@ static int mxc_parallel_csi_probe(struct platform_device *pdev)
pcsidev->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
pcsidev->sd.entity.function = MEDIA_ENT_F_IO_V4L;
+ pcsidev->sd.dev = dev;
+
pcsidev->pads[MXC_PARALLEL_CSI_PAD_SINK].flags = MEDIA_PAD_FL_SINK;
pcsidev->pads[MXC_PARALLEL_CSI_PAD_SOURCE].flags = MEDIA_PAD_FL_SOURCE;