summaryrefslogtreecommitdiffstats
path: root/drivers/media/platform/rockchip/rkisp1/rkisp1-csi.c
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>2022-06-14 20:10:52 +0100
committerMauro Carvalho Chehab <mchehab@kernel.org>2022-07-17 12:09:39 +0100
commit039a73427bfaf320984ef08f31f6faf236c09aa5 (patch)
tree8db777b6e524ee22e6b1f0540476d8d337651620 /drivers/media/platform/rockchip/rkisp1/rkisp1-csi.c
parent4fd1e6a9abb3b6bb923df17da2afb710746f3963 (diff)
downloadlinux-stable-039a73427bfaf320984ef08f31f6faf236c09aa5.tar.gz
linux-stable-039a73427bfaf320984ef08f31f6faf236c09aa5.tar.bz2
linux-stable-039a73427bfaf320984ef08f31f6faf236c09aa5.zip
media: rkisp1: csi: Handle CSI-2 RX configuration fully in rkisp1-csi.c
The ISP layer now calls multiple functions of the CSI-2 RX layer to configure, start and stop it, with the steps for the last two operations. Move those calls to rkisp1_mipi_csi2_start() and rkisp1_mipi_csi2_stop() to simplify the ISP code and the API exposed by the CSI-2 receiver component. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Dafna Hirschfeld <dafna@fastmail.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org>
Diffstat (limited to 'drivers/media/platform/rockchip/rkisp1/rkisp1-csi.c')
-rw-r--r--drivers/media/platform/rockchip/rkisp1/rkisp1-csi.c59
1 files changed, 34 insertions, 25 deletions
diff --git a/drivers/media/platform/rockchip/rkisp1/rkisp1-csi.c b/drivers/media/platform/rockchip/rkisp1/rkisp1-csi.c
index b5732511459f..10126da485ed 100644
--- a/drivers/media/platform/rockchip/rkisp1/rkisp1-csi.c
+++ b/drivers/media/platform/rockchip/rkisp1/rkisp1-csi.c
@@ -18,7 +18,7 @@
#include "rkisp1-common.h"
#include "rkisp1-csi.h"
-int rkisp1_config_mipi(struct rkisp1_csi *csi)
+static int rkisp1_config_mipi(struct rkisp1_csi *csi)
{
struct rkisp1_device *rkisp1 = csi->rkisp1;
const struct rkisp1_mbus_info *sink_fmt = rkisp1->isp.sink_fmt;
@@ -69,6 +69,30 @@ int rkisp1_config_mipi(struct rkisp1_csi *csi)
return 0;
}
+static void rkisp1_mipi_start(struct rkisp1_csi *csi)
+{
+ struct rkisp1_device *rkisp1 = csi->rkisp1;
+ u32 val;
+
+ val = rkisp1_read(rkisp1, RKISP1_CIF_MIPI_CTRL);
+ rkisp1_write(rkisp1, RKISP1_CIF_MIPI_CTRL,
+ val | RKISP1_CIF_MIPI_CTRL_OUTPUT_ENA);
+}
+
+static void rkisp1_mipi_stop(struct rkisp1_csi *csi)
+{
+ struct rkisp1_device *rkisp1 = csi->rkisp1;
+ u32 val;
+
+ /* Mask and clear interrupts. */
+ rkisp1_write(rkisp1, RKISP1_CIF_MIPI_IMSC, 0);
+ rkisp1_write(rkisp1, RKISP1_CIF_MIPI_ICR, ~0);
+
+ val = rkisp1_read(rkisp1, RKISP1_CIF_MIPI_CTRL);
+ rkisp1_write(rkisp1, RKISP1_CIF_MIPI_CTRL,
+ val & (~RKISP1_CIF_MIPI_CTRL_OUTPUT_ENA));
+}
+
int rkisp1_mipi_csi2_start(struct rkisp1_csi *csi,
struct rkisp1_sensor_async *sensor)
{
@@ -76,6 +100,11 @@ int rkisp1_mipi_csi2_start(struct rkisp1_csi *csi,
union phy_configure_opts opts;
struct phy_configure_opts_mipi_dphy *cfg = &opts.mipi_dphy;
s64 pixel_clock;
+ int ret;
+
+ ret = rkisp1_config_mipi(csi);
+ if (ret)
+ return ret;
pixel_clock = v4l2_ctrl_g_ctrl_int64(sensor->pixel_rate_ctrl);
if (!pixel_clock) {
@@ -90,36 +119,16 @@ int rkisp1_mipi_csi2_start(struct rkisp1_csi *csi,
phy_configure(csi->dphy, &opts);
phy_power_on(csi->dphy);
+ rkisp1_mipi_start(csi);
+
return 0;
}
void rkisp1_mipi_csi2_stop(struct rkisp1_csi *csi)
{
- phy_power_off(csi->dphy);
-}
-
-void rkisp1_mipi_start(struct rkisp1_csi *csi)
-{
- struct rkisp1_device *rkisp1 = csi->rkisp1;
- u32 val;
+ rkisp1_mipi_stop(csi);
- val = rkisp1_read(rkisp1, RKISP1_CIF_MIPI_CTRL);
- rkisp1_write(rkisp1, RKISP1_CIF_MIPI_CTRL,
- val | RKISP1_CIF_MIPI_CTRL_OUTPUT_ENA);
-}
-
-void rkisp1_mipi_stop(struct rkisp1_csi *csi)
-{
- struct rkisp1_device *rkisp1 = csi->rkisp1;
- u32 val;
-
- /* Mask and clear interrupts. */
- rkisp1_write(rkisp1, RKISP1_CIF_MIPI_IMSC, 0);
- rkisp1_write(rkisp1, RKISP1_CIF_MIPI_ICR, ~0);
-
- val = rkisp1_read(rkisp1, RKISP1_CIF_MIPI_CTRL);
- rkisp1_write(rkisp1, RKISP1_CIF_MIPI_CTRL,
- val & (~RKISP1_CIF_MIPI_CTRL_OUTPUT_ENA));
+ phy_power_off(csi->dphy);
}
irqreturn_t rkisp1_mipi_isr(int irq, void *ctx)