^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) * Rockchip MIPI RX Synopsys/Innosilicon DPHY driver
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * Copyright (C) 2017 Fuzhou Rockchip Electronics Co., Ltd.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * This software is available to you under a choice of one of two
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) * licenses. You may choose to be licensed under the terms of the GNU
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) * General Public License (GPL) Version 2, available from the file
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) * COPYING in the main directory of this source tree, or the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) * OpenIB.org BSD license below:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) * Redistribution and use in source and binary forms, with or
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) * without modification, are permitted provided that the following
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) * conditions are met:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) * - Redistributions of source code must retain the above
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) * copyright notice, this list of conditions and the following
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) * disclaimer.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) * - Redistributions in binary form must reproduce the above
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) * copyright notice, this list of conditions and the following
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) * disclaimer in the documentation and/or other materials
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) * provided with the distribution.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) * SOFTWARE.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) #include <linux/clk.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) #include <linux/delay.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) #include <linux/io.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) #include <linux/of.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) #include <linux/of_graph.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) #include <linux/of_platform.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) #include <linux/platform_device.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) #include <linux/pm_runtime.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) #include <linux/regmap.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) #include <linux/mfd/syscon.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) #include <media/media-entity.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) #include <media/v4l2-ctrls.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) #include <media/v4l2-fwnode.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) #include <media/v4l2-subdev.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) #include <media/v4l2-device.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) #include <linux/rockchip/cpu.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) /* GRF */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) #define RK1808_GRF_PD_VI_CON_OFFSET 0x0430
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) #define RK3288_GRF_SOC_CON6 0x025c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) #define RK3288_GRF_SOC_CON8 0x0264
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) #define RK3288_GRF_SOC_CON9 0x0268
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) #define RK3288_GRF_SOC_CON10 0x026c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) #define RK3288_GRF_SOC_CON14 0x027c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) #define RK3288_GRF_SOC_STATUS21 0x02d4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) #define RK3288_GRF_IO_VSEL 0x0380
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) #define RK3288_GRF_SOC_CON15 0x03a4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) #define RK3326_GRF_IO_VSEL_OFFSET 0x0180
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) #define RK3326_GRF_PD_VI_CON_OFFSET 0x0430
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) #define RK3368_GRF_SOC_CON6_OFFSET 0x0418
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) #define RK3368_GRF_IO_VSEL_OFFSET 0x0900
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) #define RK3399_GRF_SOC_CON9 0x6224
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) #define RK3399_GRF_SOC_CON21 0x6254
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) #define RK3399_GRF_SOC_CON22 0x6258
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) #define RK3399_GRF_SOC_CON23 0x625c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) #define RK3399_GRF_SOC_CON24 0x6260
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) #define RK3399_GRF_SOC_CON25 0x6264
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) #define RK3399_GRF_SOC_STATUS1 0xe2a4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) #define RK3399_GRF_IO_VSEL 0x0900
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) #define RV1126_GRF_CSIPHY0_CON 0x10200
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) #define RV1126_GRF_CSIPHY1_CON 0x10210
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) #define RV1126_GRF_IOFUNC_CON3 0x1026c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) #define RV1126_GRF_PHY1_SEL_CIFLITE BIT(2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) #define RV1126_GRF_PHY1_SEL_ISP BIT(1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) #define RV1126_GRF_PHY1_SEL_CIF BIT(0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) /* PHY */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) #define RK3288_PHY_TEST_CTRL0 0x30
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) #define RK3288_PHY_TEST_CTRL1 0x34
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) #define RK3288_PHY_SHUTDOWNZ 0x08
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) #define RK3288_PHY_RSTZ 0x0c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) #define RK3399_PHY_TEST_CTRL0 0xb4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) #define RK3399_PHY_TEST_CTRL1 0xb8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) #define RK3399_PHY_SHUTDOWNZ 0xa0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) #define RK3399_PHY_RSTZ 0xa0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) #define CLOCK_LANE_HS_RX_CONTROL 0x34
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) #define LANE0_HS_RX_CONTROL 0x44
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) #define LANE1_HS_RX_CONTROL 0x54
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) #define LANE2_HS_RX_CONTROL 0x84
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) #define LANE3_HS_RX_CONTROL 0x94
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) #define HS_RX_DATA_LANES_THS_SETTLE_CONTROL 0x75
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) /* LOW POWER MODE SET */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) #define MIPI_CSI_DPHY_CTRL_INVALID_OFFSET 0xFFFF
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) #define RK1808_CSI_DPHY_CTRL_LANE_ENABLE 0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) #define RK1808_CSI_DPHY_CTRL_PWRCTL \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) MIPI_CSI_DPHY_CTRL_INVALID_OFFSET
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) #define RK1808_CSI_DPHY_CTRL_DIG_RST 0x80
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) #define RK3326_CSI_DPHY_CTRL_LANE_ENABLE 0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) #define RK3326_CSI_DPHY_CTRL_PWRCTL 0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) #define RK3326_CSI_DPHY_CTRL_DIG_RST 0x80
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) #define RK3368_CSI_DPHY_CTRL_LANE_ENABLE 0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) #define RK3368_CSI_DPHY_CTRL_PWRCTL 0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) #define RK3368_CSI_DPHY_CTRL_DIG_RST 0x80
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) #define RV1126_CSI_DPHY_CTRL_LANE_ENABLE 0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) #define RV1126_CSI_DPHY_CTRL_PWRCTL \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) MIPI_CSI_DPHY_CTRL_INVALID_OFFSET
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) #define RV1126_CSI_DPHY_CTRL_DIG_RST 0x80
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) #define MIPI_CSI_DPHY_CTRL_DATALANE_ENABLE_OFFSET_BIT 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) #define MIPI_CSI_DPHY_CTRL_CLKLANE_ENABLE_OFFSET_BIT 6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) /* Configure the count time of the THS-SETTLE by protocol. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) #define RK1808_CSI_DPHY_CLK_WR_THS_SETTLE 0x160
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) #define RK1808_CSI_DPHY_LANE0_WR_THS_SETTLE \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) (RK1808_CSI_DPHY_CLK_WR_THS_SETTLE + 0x80)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) #define RK1808_CSI_DPHY_LANE1_WR_THS_SETTLE \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) (RK1808_CSI_DPHY_LANE0_WR_THS_SETTLE + 0x80)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) #define RK1808_CSI_DPHY_LANE2_WR_THS_SETTLE \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) (RK1808_CSI_DPHY_LANE1_WR_THS_SETTLE + 0x80)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) #define RK1808_CSI_DPHY_LANE3_WR_THS_SETTLE \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) (RK1808_CSI_DPHY_LANE2_WR_THS_SETTLE + 0x80)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) #define RK3326_CSI_DPHY_CLK_WR_THS_SETTLE 0x100
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) #define RK3326_CSI_DPHY_LANE0_WR_THS_SETTLE \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) (RK3326_CSI_DPHY_CLK_WR_THS_SETTLE + 0x80)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) #define RK3326_CSI_DPHY_LANE1_WR_THS_SETTLE \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) (RK3326_CSI_DPHY_LANE0_WR_THS_SETTLE + 0x80)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) #define RK3326_CSI_DPHY_LANE2_WR_THS_SETTLE \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) (RK3326_CSI_DPHY_LANE1_WR_THS_SETTLE + 0x80)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) #define RK3326_CSI_DPHY_LANE3_WR_THS_SETTLE \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) (RK3326_CSI_DPHY_LANE2_WR_THS_SETTLE + 0x80)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) #define RK3326S_CSI_DPHY_CLK_WR_THS_SETTLE 0x160
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) #define RK3326S_CSI_DPHY_LANE0_WR_THS_SETTLE \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) (RK3326S_CSI_DPHY_CLK_WR_THS_SETTLE + 0x80)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) #define RK3326S_CSI_DPHY_LANE1_WR_THS_SETTLE \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) (RK3326S_CSI_DPHY_LANE0_WR_THS_SETTLE + 0x80)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) #define RK3326S_CSI_DPHY_LANE2_WR_THS_SETTLE \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) (RK3326S_CSI_DPHY_LANE1_WR_THS_SETTLE + 0x80)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) #define RK3326S_CSI_DPHY_LANE3_WR_THS_SETTLE \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) (RK3326S_CSI_DPHY_LANE2_WR_THS_SETTLE + 0x80)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) #define RK3326S_CSI_DPHY_CLK_MODE 0x128
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) #define RK3368_CSI_DPHY_CLK_WR_THS_SETTLE 0x100
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) #define RK3368_CSI_DPHY_LANE0_WR_THS_SETTLE \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) (RK3368_CSI_DPHY_CLK_WR_THS_SETTLE + 0x80)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) #define RK3368_CSI_DPHY_LANE1_WR_THS_SETTLE \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) (RK3368_CSI_DPHY_LANE0_WR_THS_SETTLE + 0x80)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) #define RK3368_CSI_DPHY_LANE2_WR_THS_SETTLE \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) (RK3368_CSI_DPHY_LANE1_WR_THS_SETTLE + 0x80)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) #define RK3368_CSI_DPHY_LANE3_WR_THS_SETTLE \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) (RK3368_CSI_DPHY_LANE2_WR_THS_SETTLE + 0x80)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) #define RV1126_CSI_DPHY_CLK_WR_THS_SETTLE 0x160
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) #define RV1126_CSI_DPHY_LANE0_WR_THS_SETTLE 0x1e0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) #define RV1126_CSI_DPHY_LANE1_WR_THS_SETTLE 0x260
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) #define RV1126_CSI_DPHY_LANE2_WR_THS_SETTLE 0x2e0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) #define RV1126_CSI_DPHY_LANE3_WR_THS_SETTLE 0x360
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) /* Calibration reception enable */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) #define RK1808_CSI_DPHY_CLK_CALIB_EN 0x168
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) #define RK1808_CSI_DPHY_LANE0_CALIB_EN 0x1e8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) #define RK1808_CSI_DPHY_LANE1_CALIB_EN 0x268
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) #define RK1808_CSI_DPHY_LANE2_CALIB_EN 0x2e8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) #define RK1808_CSI_DPHY_LANE3_CALIB_EN 0x368
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) #define RK3326_CSI_DPHY_CLK_CALIB_EN \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) MIPI_CSI_DPHY_CTRL_INVALID_OFFSET
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) #define RK3326_CSI_DPHY_LANE0_CALIB_EN \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) MIPI_CSI_DPHY_CTRL_INVALID_OFFSET
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) #define RK3326_CSI_DPHY_LANE1_CALIB_EN \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) MIPI_CSI_DPHY_CTRL_INVALID_OFFSET
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) #define RK3326_CSI_DPHY_LANE2_CALIB_EN \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) MIPI_CSI_DPHY_CTRL_INVALID_OFFSET
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) #define RK3326_CSI_DPHY_LANE3_CALIB_EN \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) MIPI_CSI_DPHY_CTRL_INVALID_OFFSET
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) #define RK3368_CSI_DPHY_CLK_CALIB_EN \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) MIPI_CSI_DPHY_CTRL_INVALID_OFFSET
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) #define RK3368_CSI_DPHY_LANE0_CALIB_EN \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) MIPI_CSI_DPHY_CTRL_INVALID_OFFSET
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) #define RK3368_CSI_DPHY_LANE1_CALIB_EN \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) MIPI_CSI_DPHY_CTRL_INVALID_OFFSET
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) #define RK3368_CSI_DPHY_LANE2_CALIB_EN \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) MIPI_CSI_DPHY_CTRL_INVALID_OFFSET
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) #define RK3368_CSI_DPHY_LANE3_CALIB_EN \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) MIPI_CSI_DPHY_CTRL_INVALID_OFFSET
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) #define RV1126_CSI_DPHY_CLK_CALIB_EN 0x168
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) #define RV1126_CSI_DPHY_LANE0_CALIB_EN 0x1e8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) #define RV1126_CSI_DPHY_LANE1_CALIB_EN 0x268
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) #define RV1126_CSI_DPHY_LANE2_CALIB_EN 0x2e8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) #define RV1126_CSI_DPHY_LANE3_CALIB_EN 0x368
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) #define RV1126_CSI_DPHY_MIPI_LVDS_MODEL 0x2cc
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) #define RV1126_CSI_DPHY_LVDS_MODE 0x300
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) * CSI HOST
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) #define PHY_TESTEN_ADDR (0x1 << 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) #define PHY_TESTEN_DATA (0x0 << 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) #define PHY_TESTCLK (0x1 << 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) #define PHY_TESTCLR (0x1 << 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) #define THS_SETTLE_COUNTER_THRESHOLD 0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) #define HIWORD_UPDATE(val, mask, shift) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) ((val) << (shift) | (mask) << ((shift) + 16))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) enum mipi_dphy_chip_id {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) CHIP_ID_RK1808 = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) CHIP_ID_RK3288,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) CHIP_ID_RK3326,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) CHIP_ID_RK3368,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) CHIP_ID_RK3399,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) CHIP_ID_RK1126,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) CHIP_ID_RK3326S,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) enum mipi_dphy_rx_pads {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) MIPI_DPHY_RX_PAD_SINK = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) MIPI_DPHY_RX_PAD_SOURCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) MIPI_DPHY_RX_PADS_NUM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) enum dphy_reg_id {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) GRF_DPHY_RX0_TURNDISABLE = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) GRF_DPHY_RX0_FORCERXMODE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) GRF_DPHY_RX0_FORCETXSTOPMODE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) GRF_DPHY_RX0_ENABLE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) GRF_DPHY_RX0_TESTCLR,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) GRF_DPHY_RX0_TESTCLK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) GRF_DPHY_RX0_TESTEN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) GRF_DPHY_RX0_TESTDIN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) GRF_DPHY_RX0_TURNREQUEST,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) GRF_DPHY_RX0_TESTDOUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) GRF_DPHY_TX0_TURNDISABLE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) GRF_DPHY_TX0_FORCERXMODE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) GRF_DPHY_TX0_FORCETXSTOPMODE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) GRF_DPHY_TX0_TURNREQUEST,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) GRF_DPHY_TX1RX1_TURNDISABLE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) GRF_DPHY_TX1RX1_FORCERXMODE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) GRF_DPHY_TX1RX1_FORCETXSTOPMODE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) GRF_DPHY_TX1RX1_ENABLE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) GRF_DPHY_TX1RX1_MASTERSLAVEZ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) GRF_DPHY_TX1RX1_BASEDIR,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) GRF_DPHY_TX1RX1_ENABLECLK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) GRF_DPHY_TX1RX1_TURNREQUEST,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) GRF_DPHY_RX1_SRC_SEL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) /* rk3288 only */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) GRF_CON_DISABLE_ISP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) GRF_CON_ISP_DPHY_SEL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) GRF_DSI_CSI_TESTBUS_SEL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) GRF_DVP_V18SEL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) /* rk1808 & rk3326 & rv1126 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) GRF_DPHY_CSIPHY_FORCERXMODE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) GRF_DPHY_CSIPHY_CLKLANE_EN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) GRF_DPHY_CSIPHY_DATALANE_EN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) /* rv1126 only */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) GRF_DPHY_CLK_INV_SEL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) GRF_DPHY_SEL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) /* rk3368 only */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) GRF_ISP_MIPI_CSI_HOST_SEL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) /* below is for rk3399 only */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) GRF_DPHY_RX0_CLK_INV_SEL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) GRF_DPHY_RX1_CLK_INV_SEL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) GRF_DPHY_TX1RX1_SRC_SEL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) enum csiphy_reg_id {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) CSIPHY_CTRL_LANE_ENABLE = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) CSIPHY_CTRL_PWRCTL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) CSIPHY_CTRL_DIG_RST,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) CSIPHY_CLK_THS_SETTLE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) CSIPHY_LANE0_THS_SETTLE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) CSIPHY_LANE1_THS_SETTLE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) CSIPHY_LANE2_THS_SETTLE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) CSIPHY_LANE3_THS_SETTLE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) CSIPHY_CLK_CALIB_ENABLE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) CSIPHY_LANE0_CALIB_ENABLE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) CSIPHY_LANE1_CALIB_ENABLE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) CSIPHY_LANE2_CALIB_ENABLE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) CSIPHY_LANE3_CALIB_ENABLE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) //rv1126 only
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) CSIPHY_MIPI_LVDS_MODEL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) CSIPHY_LVDS_MODE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) CSIPHY_CLK_MODE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) enum mipi_dphy_ctl_type {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) MIPI_DPHY_CTL_GRF_ONLY = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) MIPI_DPHY_CTL_CSI_HOST
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) enum mipi_dphy_lane {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) MIPI_DPHY_LANE_CLOCK = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) MIPI_DPHY_LANE_DATA0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) MIPI_DPHY_LANE_DATA1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) MIPI_DPHY_LANE_DATA2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) MIPI_DPHY_LANE_DATA3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) enum txrx_reg_id {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) TXRX_PHY_TEST_CTRL0 = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) TXRX_PHY_TEST_CTRL1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) TXRX_PHY_SHUTDOWNZ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) TXRX_PHY_RSTZ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) struct dphy_reg {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) u32 offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) u32 mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) u32 shift;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) struct txrx_reg {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) u32 offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) struct csiphy_reg {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) u32 offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) #define PHY_REG(_offset, _width, _shift) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) { .offset = _offset, .mask = BIT(_width) - 1, .shift = _shift, }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) #define TXRX_REG(_offset) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) { .offset = _offset, }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) #define CSIPHY_REG(_offset) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) { .offset = _offset, }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) static const struct dphy_reg rk1808_grf_dphy_regs[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) [GRF_DPHY_CSIPHY_FORCERXMODE] = PHY_REG(RK1808_GRF_PD_VI_CON_OFFSET, 4, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) [GRF_DPHY_CSIPHY_CLKLANE_EN] = PHY_REG(RK1808_GRF_PD_VI_CON_OFFSET, 1, 8),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) [GRF_DPHY_CSIPHY_DATALANE_EN] = PHY_REG(RK1808_GRF_PD_VI_CON_OFFSET, 4, 4),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) static const struct dphy_reg rk3288_grf_dphy_regs[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) [GRF_CON_DISABLE_ISP] = PHY_REG(RK3288_GRF_SOC_CON6, 1, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) [GRF_CON_ISP_DPHY_SEL] = PHY_REG(RK3288_GRF_SOC_CON6, 1, 1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) [GRF_DSI_CSI_TESTBUS_SEL] = PHY_REG(RK3288_GRF_SOC_CON6, 1, 14),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) [GRF_DPHY_TX0_TURNDISABLE] = PHY_REG(RK3288_GRF_SOC_CON8, 4, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) [GRF_DPHY_TX0_FORCERXMODE] = PHY_REG(RK3288_GRF_SOC_CON8, 4, 4),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) [GRF_DPHY_TX0_FORCETXSTOPMODE] = PHY_REG(RK3288_GRF_SOC_CON8, 4, 8),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) [GRF_DPHY_TX1RX1_TURNDISABLE] = PHY_REG(RK3288_GRF_SOC_CON9, 4, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) [GRF_DPHY_TX1RX1_FORCERXMODE] = PHY_REG(RK3288_GRF_SOC_CON9, 4, 4),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) [GRF_DPHY_TX1RX1_FORCETXSTOPMODE] = PHY_REG(RK3288_GRF_SOC_CON9, 4, 8),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) [GRF_DPHY_TX1RX1_ENABLE] = PHY_REG(RK3288_GRF_SOC_CON9, 4, 12),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) [GRF_DPHY_RX0_TURNDISABLE] = PHY_REG(RK3288_GRF_SOC_CON10, 4, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) [GRF_DPHY_RX0_FORCERXMODE] = PHY_REG(RK3288_GRF_SOC_CON10, 4, 4),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) [GRF_DPHY_RX0_FORCETXSTOPMODE] = PHY_REG(RK3288_GRF_SOC_CON10, 4, 8),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) [GRF_DPHY_RX0_ENABLE] = PHY_REG(RK3288_GRF_SOC_CON10, 4, 12),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) [GRF_DPHY_RX0_TESTCLR] = PHY_REG(RK3288_GRF_SOC_CON14, 1, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) [GRF_DPHY_RX0_TESTCLK] = PHY_REG(RK3288_GRF_SOC_CON14, 1, 1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) [GRF_DPHY_RX0_TESTEN] = PHY_REG(RK3288_GRF_SOC_CON14, 1, 2),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) [GRF_DPHY_RX0_TESTDIN] = PHY_REG(RK3288_GRF_SOC_CON14, 8, 3),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) [GRF_DPHY_TX1RX1_ENABLECLK] = PHY_REG(RK3288_GRF_SOC_CON14, 1, 12),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) [GRF_DPHY_RX1_SRC_SEL] = PHY_REG(RK3288_GRF_SOC_CON14, 1, 13),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) [GRF_DPHY_TX1RX1_MASTERSLAVEZ] = PHY_REG(RK3288_GRF_SOC_CON14, 1, 14),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) [GRF_DPHY_TX1RX1_BASEDIR] = PHY_REG(RK3288_GRF_SOC_CON14, 1, 15),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) [GRF_DPHY_RX0_TURNREQUEST] = PHY_REG(RK3288_GRF_SOC_CON15, 4, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) [GRF_DPHY_TX1RX1_TURNREQUEST] = PHY_REG(RK3288_GRF_SOC_CON15, 4, 4),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) [GRF_DPHY_TX0_TURNREQUEST] = PHY_REG(RK3288_GRF_SOC_CON15, 3, 8),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) [GRF_DVP_V18SEL] = PHY_REG(RK3288_GRF_IO_VSEL, 1, 1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) [GRF_DPHY_RX0_TESTDOUT] = PHY_REG(RK3288_GRF_SOC_STATUS21, 8, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) static const struct dphy_reg rk3326_grf_dphy_regs[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) [GRF_DVP_V18SEL] = PHY_REG(RK3326_GRF_IO_VSEL_OFFSET, 1, 4),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) [GRF_DPHY_CSIPHY_FORCERXMODE] = PHY_REG(RK3326_GRF_PD_VI_CON_OFFSET, 4, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) [GRF_DPHY_CSIPHY_CLKLANE_EN] = PHY_REG(RK3326_GRF_PD_VI_CON_OFFSET, 1, 8),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) [GRF_DPHY_CSIPHY_DATALANE_EN] = PHY_REG(RK3326_GRF_PD_VI_CON_OFFSET, 4, 4),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) static const struct dphy_reg rk3368_grf_dphy_regs[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) [GRF_DVP_V18SEL] = PHY_REG(RK3368_GRF_IO_VSEL_OFFSET, 1, 1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) [GRF_DPHY_CSIPHY_FORCERXMODE] = PHY_REG(RK3368_GRF_SOC_CON6_OFFSET, 4, 8),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) [GRF_ISP_MIPI_CSI_HOST_SEL] = PHY_REG(RK3368_GRF_SOC_CON6_OFFSET, 1, 1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) [GRF_CON_DISABLE_ISP] = PHY_REG(RK3368_GRF_SOC_CON6_OFFSET, 1, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) static const struct dphy_reg rk3399_grf_dphy_regs[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) [GRF_DPHY_RX0_TURNREQUEST] = PHY_REG(RK3399_GRF_SOC_CON9, 4, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) [GRF_DPHY_RX0_CLK_INV_SEL] = PHY_REG(RK3399_GRF_SOC_CON9, 1, 10),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) [GRF_DPHY_RX1_CLK_INV_SEL] = PHY_REG(RK3399_GRF_SOC_CON9, 1, 11),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) [GRF_DPHY_RX0_ENABLE] = PHY_REG(RK3399_GRF_SOC_CON21, 4, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) [GRF_DPHY_RX0_FORCERXMODE] = PHY_REG(RK3399_GRF_SOC_CON21, 4, 4),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) [GRF_DPHY_RX0_FORCETXSTOPMODE] = PHY_REG(RK3399_GRF_SOC_CON21, 4, 8),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) [GRF_DPHY_RX0_TURNDISABLE] = PHY_REG(RK3399_GRF_SOC_CON21, 4, 12),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) [GRF_DPHY_TX0_FORCERXMODE] = PHY_REG(RK3399_GRF_SOC_CON22, 4, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) [GRF_DPHY_TX0_FORCETXSTOPMODE] = PHY_REG(RK3399_GRF_SOC_CON22, 4, 4),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) [GRF_DPHY_TX0_TURNDISABLE] = PHY_REG(RK3399_GRF_SOC_CON22, 4, 8),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) [GRF_DPHY_TX0_TURNREQUEST] = PHY_REG(RK3399_GRF_SOC_CON22, 4, 12),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) [GRF_DPHY_TX1RX1_ENABLE] = PHY_REG(RK3399_GRF_SOC_CON23, 4, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) [GRF_DPHY_TX1RX1_FORCERXMODE] = PHY_REG(RK3399_GRF_SOC_CON23, 4, 4),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) [GRF_DPHY_TX1RX1_FORCETXSTOPMODE] = PHY_REG(RK3399_GRF_SOC_CON23, 4, 8),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) [GRF_DPHY_TX1RX1_TURNDISABLE] = PHY_REG(RK3399_GRF_SOC_CON23, 4, 12),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) [GRF_DPHY_TX1RX1_TURNREQUEST] = PHY_REG(RK3399_GRF_SOC_CON24, 4, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) [GRF_DPHY_TX1RX1_SRC_SEL] = PHY_REG(RK3399_GRF_SOC_CON24, 1, 4),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) [GRF_DPHY_TX1RX1_BASEDIR] = PHY_REG(RK3399_GRF_SOC_CON24, 1, 5),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) [GRF_DPHY_TX1RX1_ENABLECLK] = PHY_REG(RK3399_GRF_SOC_CON24, 1, 6),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) [GRF_DPHY_TX1RX1_MASTERSLAVEZ] = PHY_REG(RK3399_GRF_SOC_CON24, 1, 7),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) [GRF_DPHY_RX0_TESTDIN] = PHY_REG(RK3399_GRF_SOC_CON25, 8, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) [GRF_DPHY_RX0_TESTEN] = PHY_REG(RK3399_GRF_SOC_CON25, 1, 8),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) [GRF_DPHY_RX0_TESTCLK] = PHY_REG(RK3399_GRF_SOC_CON25, 1, 9),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) [GRF_DPHY_RX0_TESTCLR] = PHY_REG(RK3399_GRF_SOC_CON25, 1, 10),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) [GRF_DPHY_RX0_TESTDOUT] = PHY_REG(RK3399_GRF_SOC_STATUS1, 8, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) [GRF_DVP_V18SEL] = PHY_REG(RK3399_GRF_IO_VSEL, 1, 1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) static const struct dphy_reg rv1126_grf_dphy0_regs[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) [GRF_DPHY_CSIPHY_FORCERXMODE] = PHY_REG(RV1126_GRF_CSIPHY0_CON, 4, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) [GRF_DPHY_CSIPHY_DATALANE_EN] = PHY_REG(RV1126_GRF_CSIPHY0_CON, 4, 4),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) [GRF_DPHY_CSIPHY_CLKLANE_EN] = PHY_REG(RV1126_GRF_CSIPHY0_CON, 1, 8),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) [GRF_DPHY_CLK_INV_SEL] = PHY_REG(RV1126_GRF_CSIPHY0_CON, 1, 9),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) [GRF_DPHY_SEL] = PHY_REG(RV1126_GRF_IOFUNC_CON3, 3, 9),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) static const struct dphy_reg rv1126_grf_dphy1_regs[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) [GRF_DPHY_CSIPHY_FORCERXMODE] = PHY_REG(RV1126_GRF_CSIPHY1_CON, 4, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) [GRF_DPHY_CSIPHY_DATALANE_EN] = PHY_REG(RV1126_GRF_CSIPHY1_CON, 4, 4),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) [GRF_DPHY_CSIPHY_CLKLANE_EN] = PHY_REG(RV1126_GRF_CSIPHY1_CON, 1, 8),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) [GRF_DPHY_CLK_INV_SEL] = PHY_REG(RV1126_GRF_CSIPHY1_CON, 1, 9),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) [GRF_DPHY_SEL] = PHY_REG(RV1126_GRF_IOFUNC_CON3, 3, 9),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) static const struct txrx_reg rk3288_txrx_regs[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) [TXRX_PHY_TEST_CTRL0] = TXRX_REG(RK3288_PHY_TEST_CTRL0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) [TXRX_PHY_TEST_CTRL1] = TXRX_REG(RK3288_PHY_TEST_CTRL1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) [TXRX_PHY_SHUTDOWNZ] = TXRX_REG(RK3288_PHY_SHUTDOWNZ),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) [TXRX_PHY_RSTZ] = TXRX_REG(RK3288_PHY_RSTZ),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) static const struct txrx_reg rk3399_txrx_regs[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) [TXRX_PHY_TEST_CTRL0] = TXRX_REG(RK3399_PHY_TEST_CTRL0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) [TXRX_PHY_TEST_CTRL1] = TXRX_REG(RK3399_PHY_TEST_CTRL1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) [TXRX_PHY_SHUTDOWNZ] = TXRX_REG(RK3399_PHY_SHUTDOWNZ),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) [TXRX_PHY_RSTZ] = TXRX_REG(RK3399_PHY_RSTZ),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) static const struct csiphy_reg rk1808_csiphy_regs[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) [CSIPHY_CTRL_LANE_ENABLE] = CSIPHY_REG(RK1808_CSI_DPHY_CTRL_LANE_ENABLE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) [CSIPHY_CTRL_PWRCTL] = CSIPHY_REG(RK1808_CSI_DPHY_CTRL_PWRCTL),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) [CSIPHY_CTRL_DIG_RST] = CSIPHY_REG(RK1808_CSI_DPHY_CTRL_DIG_RST),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) [CSIPHY_CLK_THS_SETTLE] = CSIPHY_REG(RK1808_CSI_DPHY_CLK_WR_THS_SETTLE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) [CSIPHY_LANE0_THS_SETTLE] = CSIPHY_REG(RK1808_CSI_DPHY_LANE0_WR_THS_SETTLE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) [CSIPHY_LANE1_THS_SETTLE] = CSIPHY_REG(RK1808_CSI_DPHY_LANE1_WR_THS_SETTLE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) [CSIPHY_LANE2_THS_SETTLE] = CSIPHY_REG(RK1808_CSI_DPHY_LANE2_WR_THS_SETTLE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) [CSIPHY_LANE3_THS_SETTLE] = CSIPHY_REG(RK1808_CSI_DPHY_LANE3_WR_THS_SETTLE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) [CSIPHY_CLK_CALIB_ENABLE] = CSIPHY_REG(RK1808_CSI_DPHY_CLK_CALIB_EN),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) [CSIPHY_LANE0_CALIB_ENABLE] = CSIPHY_REG(RK1808_CSI_DPHY_LANE0_CALIB_EN),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) [CSIPHY_LANE1_CALIB_ENABLE] = CSIPHY_REG(RK1808_CSI_DPHY_LANE1_CALIB_EN),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) [CSIPHY_LANE2_CALIB_ENABLE] = CSIPHY_REG(RK1808_CSI_DPHY_LANE2_CALIB_EN),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) [CSIPHY_LANE3_CALIB_ENABLE] = CSIPHY_REG(RK1808_CSI_DPHY_LANE3_CALIB_EN),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) static const struct csiphy_reg rk3326_csiphy_regs[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) [CSIPHY_CTRL_LANE_ENABLE] = CSIPHY_REG(RK3326_CSI_DPHY_CTRL_LANE_ENABLE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) [CSIPHY_CTRL_PWRCTL] = CSIPHY_REG(RK3326_CSI_DPHY_CTRL_PWRCTL),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) [CSIPHY_CTRL_DIG_RST] = CSIPHY_REG(RK3326_CSI_DPHY_CTRL_DIG_RST),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) [CSIPHY_CLK_THS_SETTLE] = CSIPHY_REG(RK3326_CSI_DPHY_CLK_WR_THS_SETTLE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) [CSIPHY_LANE0_THS_SETTLE] = CSIPHY_REG(RK3326_CSI_DPHY_LANE0_WR_THS_SETTLE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) [CSIPHY_LANE1_THS_SETTLE] = CSIPHY_REG(RK3326_CSI_DPHY_LANE1_WR_THS_SETTLE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) [CSIPHY_LANE2_THS_SETTLE] = CSIPHY_REG(RK3326_CSI_DPHY_LANE2_WR_THS_SETTLE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) [CSIPHY_LANE3_THS_SETTLE] = CSIPHY_REG(RK3326_CSI_DPHY_LANE3_WR_THS_SETTLE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) [CSIPHY_CLK_CALIB_ENABLE] = CSIPHY_REG(RK3326_CSI_DPHY_CLK_CALIB_EN),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) [CSIPHY_LANE0_CALIB_ENABLE] = CSIPHY_REG(RK3326_CSI_DPHY_LANE0_CALIB_EN),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) [CSIPHY_LANE1_CALIB_ENABLE] = CSIPHY_REG(RK3326_CSI_DPHY_LANE1_CALIB_EN),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) [CSIPHY_LANE2_CALIB_ENABLE] = CSIPHY_REG(RK3326_CSI_DPHY_LANE2_CALIB_EN),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) [CSIPHY_LANE3_CALIB_ENABLE] = CSIPHY_REG(RK3326_CSI_DPHY_LANE3_CALIB_EN),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) static const struct csiphy_reg rk3326s_csiphy_regs[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) [CSIPHY_CTRL_LANE_ENABLE] = CSIPHY_REG(RK3326_CSI_DPHY_CTRL_LANE_ENABLE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) [CSIPHY_CTRL_PWRCTL] = CSIPHY_REG(RK3326_CSI_DPHY_CTRL_PWRCTL),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) [CSIPHY_CTRL_DIG_RST] = CSIPHY_REG(RK3326_CSI_DPHY_CTRL_DIG_RST),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) [CSIPHY_CLK_THS_SETTLE] = CSIPHY_REG(RK3326S_CSI_DPHY_CLK_WR_THS_SETTLE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) [CSIPHY_LANE0_THS_SETTLE] = CSIPHY_REG(RK3326S_CSI_DPHY_LANE0_WR_THS_SETTLE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) [CSIPHY_LANE1_THS_SETTLE] = CSIPHY_REG(RK3326S_CSI_DPHY_LANE1_WR_THS_SETTLE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) [CSIPHY_LANE2_THS_SETTLE] = CSIPHY_REG(RK3326S_CSI_DPHY_LANE2_WR_THS_SETTLE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) [CSIPHY_LANE3_THS_SETTLE] = CSIPHY_REG(RK3326S_CSI_DPHY_LANE3_WR_THS_SETTLE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) [CSIPHY_CLK_CALIB_ENABLE] = CSIPHY_REG(RK3326_CSI_DPHY_CLK_CALIB_EN),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) [CSIPHY_LANE0_CALIB_ENABLE] = CSIPHY_REG(RK3326_CSI_DPHY_LANE0_CALIB_EN),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) [CSIPHY_LANE1_CALIB_ENABLE] = CSIPHY_REG(RK3326_CSI_DPHY_LANE1_CALIB_EN),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) [CSIPHY_LANE2_CALIB_ENABLE] = CSIPHY_REG(RK3326_CSI_DPHY_LANE2_CALIB_EN),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) [CSIPHY_LANE3_CALIB_ENABLE] = CSIPHY_REG(RK3326_CSI_DPHY_LANE3_CALIB_EN),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) [CSIPHY_CLK_MODE] = CSIPHY_REG(RK3326S_CSI_DPHY_CLK_MODE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) static const struct csiphy_reg rk3368_csiphy_regs[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) [CSIPHY_CTRL_LANE_ENABLE] = CSIPHY_REG(RK3368_CSI_DPHY_CTRL_LANE_ENABLE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) [CSIPHY_CTRL_PWRCTL] = CSIPHY_REG(RK3368_CSI_DPHY_CTRL_PWRCTL),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) [CSIPHY_CTRL_DIG_RST] = CSIPHY_REG(RK3368_CSI_DPHY_CTRL_DIG_RST),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) [CSIPHY_CLK_THS_SETTLE] = CSIPHY_REG(RK3368_CSI_DPHY_CLK_WR_THS_SETTLE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) [CSIPHY_LANE0_THS_SETTLE] = CSIPHY_REG(RK3368_CSI_DPHY_LANE0_WR_THS_SETTLE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) [CSIPHY_LANE1_THS_SETTLE] = CSIPHY_REG(RK3368_CSI_DPHY_LANE1_WR_THS_SETTLE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) [CSIPHY_LANE2_THS_SETTLE] = CSIPHY_REG(RK3368_CSI_DPHY_LANE2_WR_THS_SETTLE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) [CSIPHY_LANE3_THS_SETTLE] = CSIPHY_REG(RK3368_CSI_DPHY_LANE3_WR_THS_SETTLE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) [CSIPHY_CLK_CALIB_ENABLE] = CSIPHY_REG(RK3368_CSI_DPHY_CLK_CALIB_EN),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) [CSIPHY_LANE0_CALIB_ENABLE] = CSIPHY_REG(RK3368_CSI_DPHY_LANE0_CALIB_EN),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) [CSIPHY_LANE1_CALIB_ENABLE] = CSIPHY_REG(RK3368_CSI_DPHY_LANE1_CALIB_EN),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) [CSIPHY_LANE2_CALIB_ENABLE] = CSIPHY_REG(RK3368_CSI_DPHY_LANE2_CALIB_EN),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) [CSIPHY_LANE3_CALIB_ENABLE] = CSIPHY_REG(RK3368_CSI_DPHY_LANE3_CALIB_EN),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) static const struct csiphy_reg rv1126_csiphy_regs[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) [CSIPHY_CTRL_LANE_ENABLE] = CSIPHY_REG(RV1126_CSI_DPHY_CTRL_LANE_ENABLE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) [CSIPHY_CTRL_PWRCTL] = CSIPHY_REG(RV1126_CSI_DPHY_CTRL_PWRCTL),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) [CSIPHY_CTRL_DIG_RST] = CSIPHY_REG(RV1126_CSI_DPHY_CTRL_DIG_RST),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) [CSIPHY_CLK_THS_SETTLE] = CSIPHY_REG(RV1126_CSI_DPHY_CLK_WR_THS_SETTLE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) [CSIPHY_LANE0_THS_SETTLE] = CSIPHY_REG(RV1126_CSI_DPHY_LANE0_WR_THS_SETTLE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) [CSIPHY_LANE1_THS_SETTLE] = CSIPHY_REG(RV1126_CSI_DPHY_LANE1_WR_THS_SETTLE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) [CSIPHY_LANE2_THS_SETTLE] = CSIPHY_REG(RV1126_CSI_DPHY_LANE2_WR_THS_SETTLE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) [CSIPHY_LANE3_THS_SETTLE] = CSIPHY_REG(RV1126_CSI_DPHY_LANE3_WR_THS_SETTLE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) [CSIPHY_CLK_CALIB_ENABLE] = CSIPHY_REG(RV1126_CSI_DPHY_CLK_CALIB_EN),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) [CSIPHY_LANE0_CALIB_ENABLE] = CSIPHY_REG(RV1126_CSI_DPHY_LANE0_CALIB_EN),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) [CSIPHY_LANE1_CALIB_ENABLE] = CSIPHY_REG(RV1126_CSI_DPHY_LANE1_CALIB_EN),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) [CSIPHY_LANE2_CALIB_ENABLE] = CSIPHY_REG(RV1126_CSI_DPHY_LANE2_CALIB_EN),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) [CSIPHY_LANE3_CALIB_ENABLE] = CSIPHY_REG(RV1126_CSI_DPHY_LANE3_CALIB_EN),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) [CSIPHY_MIPI_LVDS_MODEL] = CSIPHY_REG(RV1126_CSI_DPHY_MIPI_LVDS_MODEL),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) [CSIPHY_LVDS_MODE] = CSIPHY_REG(RV1126_CSI_DPHY_LVDS_MODE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) struct hsfreq_range {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) u32 range_h;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) u8 cfg_bit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) struct mipidphy_priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) struct dphy_drv_data {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) const char * const *clks;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) int num_clks;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) const struct hsfreq_range *hsfreq_ranges;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) int num_hsfreq_ranges;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) const struct dphy_reg *grf_regs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) const struct txrx_reg *txrx_regs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) const struct csiphy_reg *csiphy_regs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) enum mipi_dphy_ctl_type ctl_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) void (*individual_init)(struct mipidphy_priv *priv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) enum mipi_dphy_chip_id chip_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) struct sensor_async_subdev {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) struct v4l2_async_subdev asd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) struct v4l2_mbus_config mbus;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) int lanes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) #define MAX_DPHY_CLK 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) #define MAX_DPHY_SENSORS 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) struct mipidphy_sensor {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) struct v4l2_subdev *sd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) struct v4l2_mbus_config mbus;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) struct v4l2_mbus_framefmt format;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) int lanes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) struct mipidphy_priv {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) struct device *dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) struct regmap *regmap_grf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) const struct dphy_reg *grf_regs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) const struct txrx_reg *txrx_regs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) const struct csiphy_reg *csiphy_regs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) void __iomem *csihost_base_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) struct clk *clks[MAX_DPHY_CLK];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) const struct dphy_drv_data *drv_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) u64 data_rate_mbps;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) struct v4l2_async_notifier notifier;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) struct v4l2_subdev sd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) struct mutex mutex; /* lock for updating protection */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) struct media_pad pads[MIPI_DPHY_RX_PADS_NUM];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) struct mipidphy_sensor sensors[MAX_DPHY_SENSORS];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) int num_sensors;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) int phy_index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) bool is_streaming;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) void __iomem *txrx_base_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) int (*stream_on)(struct mipidphy_priv *priv, struct v4l2_subdev *sd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) int (*stream_off)(struct mipidphy_priv *priv, struct v4l2_subdev *sd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) static inline struct mipidphy_priv *to_dphy_priv(struct v4l2_subdev *subdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) return container_of(subdev, struct mipidphy_priv, sd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) static inline void write_grf_reg(struct mipidphy_priv *priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) int index, u8 value)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) const struct dphy_reg *reg = &priv->grf_regs[index];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) unsigned int val = HIWORD_UPDATE(value, reg->mask, reg->shift);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) if (reg->offset)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) regmap_write(priv->regmap_grf, reg->offset, val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) static inline u32 read_grf_reg(struct mipidphy_priv *priv, int index)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) const struct dphy_reg *reg = &priv->grf_regs[index];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) unsigned int val = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) if (reg->offset) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) regmap_read(priv->regmap_grf, reg->offset, &val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) val = (val >> reg->shift) & reg->mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) return val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) static inline void write_txrx_reg(struct mipidphy_priv *priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) int index, u32 value)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) const struct txrx_reg *reg = &priv->txrx_regs[index];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) if (reg->offset)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) writel(value, priv->txrx_base_addr + reg->offset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) static void mipidphy0_wr_reg(struct mipidphy_priv *priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) u8 test_code, u8 test_data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640) * With the falling edge on TESTCLK, the TESTDIN[7:0] signal content
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) * is latched internally as the current test code. Test data is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) * programmed internally by rising edge on TESTCLK.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) write_grf_reg(priv, GRF_DPHY_RX0_TESTCLK, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) write_grf_reg(priv, GRF_DPHY_RX0_TESTDIN, test_code);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) write_grf_reg(priv, GRF_DPHY_RX0_TESTEN, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647) write_grf_reg(priv, GRF_DPHY_RX0_TESTCLK, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) write_grf_reg(priv, GRF_DPHY_RX0_TESTEN, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) write_grf_reg(priv, GRF_DPHY_RX0_TESTDIN, test_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) write_grf_reg(priv, GRF_DPHY_RX0_TESTCLK, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) static void mipidphy1_wr_reg(struct mipidphy_priv *priv, unsigned char addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) unsigned char data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) * TESTEN =1,TESTDIN=addr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658) * TESTCLK=0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) * TESTEN =0,TESTDIN=data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) * TESTCLK=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662) write_txrx_reg(priv, TXRX_PHY_TEST_CTRL1, PHY_TESTEN_ADDR | addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) write_txrx_reg(priv, TXRX_PHY_TEST_CTRL0, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) write_txrx_reg(priv, TXRX_PHY_TEST_CTRL1, PHY_TESTEN_DATA | data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665) write_txrx_reg(priv, TXRX_PHY_TEST_CTRL0, 0x02);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) static inline void write_csiphy_reg(struct mipidphy_priv *priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) int index, u32 value)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671) const struct csiphy_reg *reg = &priv->csiphy_regs[index];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673) if (reg->offset != MIPI_CSI_DPHY_CTRL_INVALID_OFFSET)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) writel(value, priv->csihost_base_addr + reg->offset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) static inline void read_csiphy_reg(struct mipidphy_priv *priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678) int index, u32 *value)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) const struct csiphy_reg *reg = &priv->csiphy_regs[index];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682) if (reg->offset != MIPI_CSI_DPHY_CTRL_INVALID_OFFSET)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683) *value = readl(priv->csihost_base_addr + reg->offset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686) static void csi_mipidphy_wr_ths_settle(struct mipidphy_priv *priv, int hsfreq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687) enum mipi_dphy_lane lane)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689) unsigned int val = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690) unsigned int offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692) switch (lane) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693) case MIPI_DPHY_LANE_CLOCK:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694) offset = CSIPHY_CLK_THS_SETTLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696) case MIPI_DPHY_LANE_DATA0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) offset = CSIPHY_LANE0_THS_SETTLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699) case MIPI_DPHY_LANE_DATA1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700) offset = CSIPHY_LANE1_THS_SETTLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702) case MIPI_DPHY_LANE_DATA2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703) offset = CSIPHY_LANE2_THS_SETTLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) case MIPI_DPHY_LANE_DATA3:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706) offset = CSIPHY_LANE3_THS_SETTLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712) read_csiphy_reg(priv, offset, &val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713) val = (val & ~0x7f) | hsfreq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714) write_csiphy_reg(priv, offset, val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717) static struct v4l2_subdev *get_remote_sensor(struct v4l2_subdev *sd)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719) struct media_pad *local, *remote;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720) struct media_entity *sensor_me;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722) local = &sd->entity.pads[MIPI_DPHY_RX_PAD_SINK];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723) remote = media_entity_remote_pad(local);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724) if (!remote) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) v4l2_warn(sd, "No link between dphy and sensor\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729) sensor_me = media_entity_remote_pad(local)->entity;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730) return media_entity_to_v4l2_subdev(sensor_me);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733) static struct mipidphy_sensor *sd_to_sensor(struct mipidphy_priv *priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734) struct v4l2_subdev *sd)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738) for (i = 0; i < priv->num_sensors; ++i)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739) if (priv->sensors[i].sd == sd)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740) return &priv->sensors[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745) static int mipidphy_get_sensor_data_rate(struct v4l2_subdev *sd)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747) struct mipidphy_priv *priv = to_dphy_priv(sd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748) struct v4l2_subdev *sensor_sd = get_remote_sensor(sd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749) struct v4l2_ctrl *link_freq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750) struct v4l2_querymenu qm = { .id = V4L2_CID_LINK_FREQ, };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753) link_freq = v4l2_ctrl_find(sensor_sd->ctrl_handler, V4L2_CID_LINK_FREQ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754) if (!link_freq) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755) v4l2_warn(sd, "No pixel rate control in subdev\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756) return -EPIPE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759) qm.index = v4l2_ctrl_g_ctrl(link_freq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760) ret = v4l2_querymenu(sensor_sd->ctrl_handler, &qm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761) if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762) v4l2_err(sd, "Failed to get menu item\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766) if (!qm.value) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767) v4l2_err(sd, "Invalid link_freq\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770) priv->data_rate_mbps = qm.value * 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771) do_div(priv->data_rate_mbps, 1000 * 1000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772) v4l2_info(sd, "data_rate_mbps %lld\n", priv->data_rate_mbps);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776) static int mipidphy_update_sensor_mbus(struct v4l2_subdev *sd)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778) struct mipidphy_priv *priv = to_dphy_priv(sd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 779) struct v4l2_subdev *sensor_sd = get_remote_sensor(sd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 780) struct mipidphy_sensor *sensor = sd_to_sensor(priv, sensor_sd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 781) struct v4l2_mbus_config mbus;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784) ret = v4l2_subdev_call(sensor_sd, pad, get_mbus_config, 0, &mbus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788) sensor->mbus = mbus;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789) switch (mbus.flags & V4L2_MBUS_CSI2_LANES) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790) case V4L2_MBUS_CSI2_1_LANE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791) sensor->lanes = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 793) case V4L2_MBUS_CSI2_2_LANE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 794) sensor->lanes = 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 795) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 796) case V4L2_MBUS_CSI2_3_LANE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 797) sensor->lanes = 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 798) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 799) case V4L2_MBUS_CSI2_4_LANE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 800) sensor->lanes = 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 801) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 802) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 803) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 804) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 805)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 806) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 807) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 808)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 809) static void rk1126_mipidphy_dphy_sel(struct v4l2_subdev *sd)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 810) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 811) struct mipidphy_priv *priv = to_dphy_priv(sd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 812) char *model;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 813) u8 oldval, newval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 814)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 815) model = sd->v4l2_dev->mdev->model;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 816) oldval = read_grf_reg(priv, GRF_DPHY_SEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 817) newval = oldval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 818) if (!strncmp(model, "rkcif_lite_mipi_lvds", sizeof("rkcif_lite_mipi_lvds") - 1)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 819) if (priv->phy_index == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 820) newval &= ~RV1126_GRF_PHY1_SEL_CIFLITE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 821) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 822) newval |= RV1126_GRF_PHY1_SEL_CIFLITE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 823) } else if (!strncmp(model, "rkcif_mipi_lvds", sizeof("rkcif_mipi_lvds") - 1)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 824) if (priv->phy_index == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 825) newval &= ~RV1126_GRF_PHY1_SEL_CIF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 826) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 827) newval |= RV1126_GRF_PHY1_SEL_CIF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 828) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 829) if (priv->phy_index == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 830) newval &= ~RV1126_GRF_PHY1_SEL_ISP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 831) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 832) newval |= RV1126_GRF_PHY1_SEL_ISP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 833) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 834)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 835) if (newval != oldval)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 836) write_grf_reg(priv, GRF_DPHY_SEL, newval);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 837) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 838)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 839) static int mipidphy_s_stream_start(struct v4l2_subdev *sd)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 840) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 841) struct mipidphy_priv *priv = to_dphy_priv(sd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 842) int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 843)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 844) if (priv->is_streaming)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 845) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 846)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 847) ret = mipidphy_get_sensor_data_rate(sd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 848) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 849) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 850)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 851) if (priv->drv_data->chip_id == CHIP_ID_RK1126)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 852) rk1126_mipidphy_dphy_sel(sd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 853)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 854) mipidphy_update_sensor_mbus(sd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 855) priv->stream_on(priv, sd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 856)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 857) priv->is_streaming = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 858)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 859) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 860) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 861)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 862) static int mipidphy_s_stream_stop(struct v4l2_subdev *sd)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 863) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 864) struct mipidphy_priv *priv = to_dphy_priv(sd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 865)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 866) if (!priv->is_streaming)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 867) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 868)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 869) if (priv->stream_off)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 870) priv->stream_off(priv, sd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 871) priv->is_streaming = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 872)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 873) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 874) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 875)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 876) static int mipidphy_s_stream(struct v4l2_subdev *sd, int on)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 877) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 878) int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 879) struct mipidphy_priv *priv = to_dphy_priv(sd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 880)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 881) dev_info(priv->dev, "stream on:%d\n", on);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 882) mutex_lock(&priv->mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 883) if (on)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 884) ret = mipidphy_s_stream_start(sd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 885) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 886) ret = mipidphy_s_stream_stop(sd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 887) mutex_unlock(&priv->mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 888) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 889) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 890)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 891) static int mipidphy_g_frame_interval(struct v4l2_subdev *sd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 892) struct v4l2_subdev_frame_interval *fi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 893) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 894) struct v4l2_subdev *sensor = get_remote_sensor(sd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 895)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 896) if (sensor)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 897) return v4l2_subdev_call(sensor, video, g_frame_interval, fi);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 898)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 899) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 900) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 901)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 902) static int mipidphy_g_mbus_config(struct v4l2_subdev *sd, unsigned int pad_id,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 903) struct v4l2_mbus_config *config)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 904) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 905) struct mipidphy_priv *priv = to_dphy_priv(sd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 906) struct v4l2_subdev *sensor_sd = get_remote_sensor(sd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 907) struct mipidphy_sensor *sensor;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 908)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 909) if (!sensor_sd)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 910) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 911) sensor = sd_to_sensor(priv, sensor_sd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 912) mipidphy_update_sensor_mbus(sd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 913) *config = sensor->mbus;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 914)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 915) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 916) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 917)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 918) static int mipidphy_s_power(struct v4l2_subdev *sd, int on)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 919) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 920) struct mipidphy_priv *priv = to_dphy_priv(sd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 921)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 922) if (on)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 923) return pm_runtime_get_sync(priv->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 924) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 925) return pm_runtime_put(priv->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 926) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 927)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 928) static int mipidphy_runtime_suspend(struct device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 929) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 930) struct media_entity *me = dev_get_drvdata(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 931) struct v4l2_subdev *sd = media_entity_to_v4l2_subdev(me);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 932) struct mipidphy_priv *priv = to_dphy_priv(sd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 933) int i, num_clks;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 934)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 935) num_clks = priv->drv_data->num_clks;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 936) for (i = num_clks - 1; i >= 0; i--)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 937) if (!IS_ERR(priv->clks[i]))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 938) clk_disable_unprepare(priv->clks[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 939)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 940) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 941) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 942)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 943) static int mipidphy_runtime_resume(struct device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 944) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 945) struct media_entity *me = dev_get_drvdata(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 946) struct v4l2_subdev *sd = media_entity_to_v4l2_subdev(me);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 947) struct mipidphy_priv *priv = to_dphy_priv(sd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 948) int i, num_clks, ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 949)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 950) num_clks = priv->drv_data->num_clks;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 951) for (i = 0; i < num_clks; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 952) if (!IS_ERR(priv->clks[i])) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 953) ret = clk_prepare_enable(priv->clks[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 954) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 955) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 956) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 957) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 958)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 959) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 960) err:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 961) while (--i >= 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 962) clk_disable_unprepare(priv->clks[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 963) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 964) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 965)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 966) /* dphy accepts all fmt/size from sensor */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 967) static int mipidphy_get_set_fmt(struct v4l2_subdev *sd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 968) struct v4l2_subdev_pad_config *cfg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 969) struct v4l2_subdev_format *fmt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 970) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 971) struct mipidphy_priv *priv = to_dphy_priv(sd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 972) struct v4l2_subdev *sensor_sd = get_remote_sensor(sd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 973) struct mipidphy_sensor *sensor = sd_to_sensor(priv, sensor_sd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 974) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 975) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 976) * Do not allow format changes and just relay whatever
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 977) * set currently in the sensor.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 978) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 979) if (!sensor_sd)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 980) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 981) ret = v4l2_subdev_call(sensor_sd, pad, get_fmt, NULL, fmt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 982) if (!ret && fmt->pad == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 983) sensor->format = fmt->format;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 984) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 985) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 986)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 987) static int mipidphy_get_selection(struct v4l2_subdev *sd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 988) struct v4l2_subdev_pad_config *cfg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 989) struct v4l2_subdev_selection *sel)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 990) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 991) struct v4l2_subdev *sensor = get_remote_sensor(sd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 992)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 993) return v4l2_subdev_call(sensor, pad, get_selection, NULL, sel);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 994) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 995)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 996) static const struct v4l2_subdev_pad_ops mipidphy_subdev_pad_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 997) .set_fmt = mipidphy_get_set_fmt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 998) .get_fmt = mipidphy_get_set_fmt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 999) .get_selection = mipidphy_get_selection,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000) .get_mbus_config = mipidphy_g_mbus_config,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003) static const struct v4l2_subdev_core_ops mipidphy_core_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004) .s_power = mipidphy_s_power,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007) static const struct v4l2_subdev_video_ops mipidphy_video_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1008) .g_frame_interval = mipidphy_g_frame_interval,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1009) .s_stream = mipidphy_s_stream,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1010) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1011)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1012) static const struct v4l2_subdev_ops mipidphy_subdev_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1013) .core = &mipidphy_core_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1014) .video = &mipidphy_video_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1015) .pad = &mipidphy_subdev_pad_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1016) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1017)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1018) /* These tables must be sorted by .range_h ascending. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1019) static const struct hsfreq_range rk1808_rv1126_mipidphy_hsfreq_ranges[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1020) { 109, 0x02}, { 149, 0x03}, { 199, 0x06}, { 249, 0x06},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1021) { 299, 0x06}, { 399, 0x08}, { 499, 0x0b}, { 599, 0x0e},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1022) { 699, 0x10}, { 799, 0x12}, { 999, 0x16}, {1199, 0x1e},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1023) {1399, 0x23}, {1599, 0x2d}, {1799, 0x32}, {1999, 0x37},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1024) {2199, 0x3c}, {2399, 0x41}, {2499, 0x46}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1025) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1026)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1027) static const struct hsfreq_range rk3288_mipidphy_hsfreq_ranges[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1028) { 89, 0x00}, { 99, 0x10}, { 109, 0x20}, { 129, 0x01},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1029) { 139, 0x11}, { 149, 0x21}, { 169, 0x02}, { 179, 0x12},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1030) { 199, 0x22}, { 219, 0x03}, { 239, 0x13}, { 249, 0x23},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1031) { 269, 0x04}, { 299, 0x14}, { 329, 0x05}, { 359, 0x15},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1032) { 399, 0x25}, { 449, 0x06}, { 499, 0x16}, { 549, 0x07},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1033) { 599, 0x17}, { 649, 0x08}, { 699, 0x18}, { 749, 0x09},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1034) { 799, 0x19}, { 849, 0x29}, { 899, 0x39}, { 949, 0x0a},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1035) { 999, 0x1a}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1036) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1037)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1038) static const struct hsfreq_range rk3326_mipidphy_hsfreq_ranges[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1039) { 109, 0x00}, { 149, 0x01}, { 199, 0x02}, { 249, 0x03},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1040) { 299, 0x04}, { 399, 0x05}, { 499, 0x06}, { 599, 0x07},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1041) { 699, 0x08}, { 799, 0x09}, { 899, 0x0a}, {1099, 0x0b},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1042) {1249, 0x0c}, {1349, 0x0d}, {1500, 0x0e}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1043) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1044)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1045) static const struct hsfreq_range rk3326s_mipidphy_hsfreq_ranges[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1046) { 109, 0x02}, { 149, 0x03}, { 199, 0x06}, { 249, 0x06},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1047) { 299, 0x06}, { 399, 0x08}, { 499, 0x0b}, { 599, 0x0e},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1048) { 699, 0x10}, { 799, 0x12}, { 999, 0x16}, {1199, 0x1e},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1049) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1050)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1051) static const struct hsfreq_range rk3368_mipidphy_hsfreq_ranges[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1052) { 109, 0x00}, { 149, 0x01}, { 199, 0x02}, { 249, 0x03},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1053) { 299, 0x04}, { 399, 0x05}, { 499, 0x06}, { 599, 0x07},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1054) { 699, 0x08}, { 799, 0x09}, { 899, 0x0a}, {1099, 0x0b},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1055) {1249, 0x0c}, {1349, 0x0d}, {1500, 0x0e}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1056) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1057)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1058) static const struct hsfreq_range rk3399_mipidphy_hsfreq_ranges[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1059) { 89, 0x00}, { 99, 0x10}, { 109, 0x20}, { 129, 0x01},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1060) { 139, 0x11}, { 149, 0x21}, { 169, 0x02}, { 179, 0x12},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1061) { 199, 0x22}, { 219, 0x03}, { 239, 0x13}, { 249, 0x23},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1062) { 269, 0x04}, { 299, 0x14}, { 329, 0x05}, { 359, 0x15},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1063) { 399, 0x25}, { 449, 0x06}, { 499, 0x16}, { 549, 0x07},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1064) { 599, 0x17}, { 649, 0x08}, { 699, 0x18}, { 749, 0x09},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1065) { 799, 0x19}, { 849, 0x29}, { 899, 0x39}, { 949, 0x0a},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1066) { 999, 0x1a}, {1049, 0x2a}, {1099, 0x3a}, {1149, 0x0b},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1067) {1199, 0x1b}, {1249, 0x2b}, {1299, 0x3b}, {1349, 0x0c},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1068) {1399, 0x1c}, {1449, 0x2c}, {1500, 0x3c}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1069) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1070)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1071) static const char * const rk1808_mipidphy_clks[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1072) "pclk",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1073) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1074)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1075) static const char * const rk3288_mipidphy_clks[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1076) "dphy-ref",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1077) "pclk",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1078) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1079)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1080) static const char * const rk3326_mipidphy_clks[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1081) "dphy-ref",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1082) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1083)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1084) static const char * const rk3368_mipidphy_clks[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1085) "pclk_dphyrx",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1086) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1087)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1088) static const char * const rk3399_mipidphy_clks[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1089) "dphy-ref",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1090) "dphy-cfg",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1091) "grf",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1092) "pclk_mipi_dsi",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1093) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1094)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1095) static const char * const rv1126_mipidphy_clks[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1096) "pclk",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1097) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1098)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1099) static void default_mipidphy_individual_init(struct mipidphy_priv *priv)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1100) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1101) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1102)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1103) static void rk3368_mipidphy_individual_init(struct mipidphy_priv *priv)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1104) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1105) /* isp select */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1106) write_grf_reg(priv, GRF_ISP_MIPI_CSI_HOST_SEL, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1107) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1108)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1109) static void rk3399_mipidphy_individual_init(struct mipidphy_priv *priv)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1110) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1111) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1112) * According to the sequence of RK3399_TXRX_DPHY, the setting of isp0 mipi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1113) * will affect txrx dphy in default state of grf_soc_con24.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1114) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1115) write_grf_reg(priv, GRF_DPHY_TX1RX1_SRC_SEL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1116) write_grf_reg(priv, GRF_DPHY_TX1RX1_MASTERSLAVEZ, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1117) write_grf_reg(priv, GRF_DPHY_TX1RX1_BASEDIR, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1118)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1119) write_grf_reg(priv, GRF_DVP_V18SEL, 0x1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1120) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1121)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1122) static void rv1126_mipidphy_individual_init(struct mipidphy_priv *priv)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1123) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1124) struct device *dev = priv->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1125) struct device_node *parent = dev->of_node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1126) struct device_node *remote = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1127) u8 val, sel;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1128)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1129) priv->grf_regs = priv->phy_index ?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1130) rv1126_grf_dphy1_regs : rv1126_grf_dphy0_regs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1131) val = read_grf_reg(priv, GRF_DPHY_SEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1132) /* get port1 remote endpoint info */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1133) remote = of_graph_get_remote_node(parent, 1, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1134) if (remote) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1135) if (strstr(remote->name, "isp"))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1136) sel = !priv->phy_index ? 0 : RV1126_GRF_PHY1_SEL_ISP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1137) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1138) sel = !priv->phy_index ? 0 :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1139) RV1126_GRF_PHY1_SEL_CIF | RV1126_GRF_PHY1_SEL_CIFLITE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1140) of_node_put(remote);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1141) write_grf_reg(priv, GRF_DPHY_SEL, val | sel);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1142) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1143) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1144)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1145) static int mipidphy_rx_stream_on(struct mipidphy_priv *priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1146) struct v4l2_subdev *sd)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1147) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1148) struct v4l2_subdev *sensor_sd = get_remote_sensor(sd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1149) struct mipidphy_sensor *sensor = sd_to_sensor(priv, sensor_sd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1150) const struct dphy_drv_data *drv_data = priv->drv_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1151) const struct hsfreq_range *hsfreq_ranges = drv_data->hsfreq_ranges;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1152) int num_hsfreq_ranges = drv_data->num_hsfreq_ranges;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1153) int i, hsfreq = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1154)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1155) for (i = 0; i < num_hsfreq_ranges; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1156) if (hsfreq_ranges[i].range_h >= priv->data_rate_mbps) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1157) hsfreq = hsfreq_ranges[i].cfg_bit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1158) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1159) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1160) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1162) if (i == num_hsfreq_ranges) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1163) i = num_hsfreq_ranges - 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1164) dev_warn(priv->dev, "data rate: %lld mbps, max support %d mbps",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1165) priv->data_rate_mbps, hsfreq_ranges[i].range_h + 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1166) hsfreq = hsfreq_ranges[i].cfg_bit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1167) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1168)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1169) /* RK3288 isp connected to phy0-rx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1170) write_grf_reg(priv, GRF_CON_ISP_DPHY_SEL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1171)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1172) /* Belowed is the sequence of mipi configuration */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1173) /* Step1: set RSTZ = 1'b0, phy0 controlled by isp0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1174)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1175) /* Step2: set SHUTDOWNZ = 1'b0, controlled by isp0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1176)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1177) /* Step3: set TESTCLEAR = 1'b1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1178) write_grf_reg(priv, GRF_DPHY_RX0_TESTCLK, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1179) write_grf_reg(priv, GRF_DPHY_RX0_TESTCLR, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1180) usleep_range(100, 150);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1181)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1182) /* Step4: apply REFCLK signal with the appropriate frequency */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1183)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1184) /* Step5: apply CFG_CLK signal with the appropriate frequency */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1185)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1186) /* Step6: set MASTERSLAVEZ = 1'b0 (for SLAVE), phy0 default is slave */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1187)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1188) /* Step7: set BASEDIR_N = 1’b1 (for SLAVE), phy0 default is slave */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1189)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1190) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1191) * Step8: set all REQUEST inputs to zero, need to wait 15ns:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1192) * step8.1:set lan turndisab as 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1193) * step8.2:set lan turnrequest as 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1194) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1195) write_grf_reg(priv, GRF_DPHY_RX0_TURNDISABLE, 0xf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1196) write_grf_reg(priv, GRF_DPHY_RX0_FORCERXMODE, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1197) write_grf_reg(priv, GRF_DPHY_RX0_TURNREQUEST, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1198) usleep_range(100, 150);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1199)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1200) /* Step9: set TESTCLR to low, need to wait 15ns */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1201) write_grf_reg(priv, GRF_DPHY_RX0_TESTCLR, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1202) usleep_range(100, 150);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1203)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1204) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1205) * Step10: configure Test Code 0x44 hsfreqrange according to values
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1206) * step10.1:set clock lane
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1207) * step10.2:set hsfreqrange by lane0(test code 0x44)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1208) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1209) hsfreq <<= 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1210) mipidphy0_wr_reg(priv, CLOCK_LANE_HS_RX_CONTROL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1211) mipidphy0_wr_reg(priv, LANE0_HS_RX_CONTROL, hsfreq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1212) mipidphy0_wr_reg(priv, LANE1_HS_RX_CONTROL, hsfreq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1213) mipidphy0_wr_reg(priv, LANE2_HS_RX_CONTROL, hsfreq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1214) mipidphy0_wr_reg(priv, LANE3_HS_RX_CONTROL, hsfreq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1215)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1216) /* Step11: Configure analog references: of Test Code 0x22 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1217)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1218) /* Step12: Set ENABLE_N=1'b1, need to wait 5ns */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1219) /* set lane num */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1220) write_grf_reg(priv, GRF_DPHY_RX0_ENABLE, GENMASK(sensor->lanes - 1, 0));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1221)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1222) /* Step13: Set SHUTDOWNZ=1'b1, controlled by isp need to wait 5ns */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1223)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1224) /* Step14: Set RSTZ=1'b1, controlled by isp */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1225)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1226) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1227) * Step15: Wait until STOPSTATEDATA_N & STOPSTATECLK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1228) * outputs are asserted
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1229) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1230)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1231) usleep_range(100, 150);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1232)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1233) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1234) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1235)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1236) static int mipidphy_txrx_stream_on(struct mipidphy_priv *priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1237) struct v4l2_subdev *sd)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1238) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1239) struct v4l2_subdev *sensor_sd = get_remote_sensor(sd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1240) struct mipidphy_sensor *sensor = sd_to_sensor(priv, sensor_sd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1241) const struct dphy_drv_data *drv_data = priv->drv_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1242) const struct hsfreq_range *hsfreq_ranges = drv_data->hsfreq_ranges;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1243) int num_hsfreq_ranges = drv_data->num_hsfreq_ranges;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1244) int i, hsfreq = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1245)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1246) for (i = 0; i < num_hsfreq_ranges; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1247) if (hsfreq_ranges[i].range_h >= priv->data_rate_mbps) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1248) hsfreq = hsfreq_ranges[i].cfg_bit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1249) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1250) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1251) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1252)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1253) if (i == num_hsfreq_ranges) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1254) i = num_hsfreq_ranges - 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1255) dev_warn(priv->dev, "data rate: %lld mbps, max support %d mbps",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1256) priv->data_rate_mbps, hsfreq_ranges[i].range_h + 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1257) hsfreq = hsfreq_ranges[i].cfg_bit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1258) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1259)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1260) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1261) *Config rk3288:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1262) *step1:rk3288 isp connected to phy1-rx
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1263) *step2:rk3288 phy1-rx test bus connected to csi host
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1264) *step3:rk3288 phy1-rx source selected as: isp = 1'b1,csi-host = 1'b0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1265) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1266) write_grf_reg(priv, GRF_CON_ISP_DPHY_SEL, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1267) write_grf_reg(priv, GRF_DSI_CSI_TESTBUS_SEL, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1268) write_grf_reg(priv, GRF_DPHY_RX1_SRC_SEL, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1269)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1270) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1271) * Config rk3399:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1272) * step1:rk3399 phy1-rx source selected as:1'b0=isp1,1'b1=isp0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1273) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1274) write_grf_reg(priv, GRF_DPHY_TX1RX1_SRC_SEL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1275)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1276) /* Belowed is the sequence of mipi configuration */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1277) /* Step1: set RSTZ = 1'b0, phy1-rx controlled by isp */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1278)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1279) /* Step2: set SHUTDOWNZ = 1'b0, phy1-rx controlled by isp */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1280)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1281) /* Step3: set TESTCLR= 1'b1,TESTCLK=1'b1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1282) write_txrx_reg(priv, TXRX_PHY_TEST_CTRL0, PHY_TESTCLR | PHY_TESTCLK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1283) usleep_range(100, 150);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1284)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1285) /* Step4: apply REFCLK signal with the appropriate frequency */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1286)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1287) /* Step5: apply CFG_CLK signal with the appropriate frequency */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1288)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1289) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1290) * Step6: set MASTERSLAVEZ = 1'b0 (for SLAVE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1291) * phy1 is set as slave,controlled by isp
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1292) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1293) write_grf_reg(priv, GRF_DPHY_TX1RX1_MASTERSLAVEZ, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1294)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1295) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1296) * Step7: set BASEDIR_N = 1’b1 (for SLAVE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1297) * phy1 is set as slave,controlled by isp
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1298) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1299) write_grf_reg(priv, GRF_DPHY_TX1RX1_BASEDIR, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1300)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1301) /* Step8: set all REQUEST inputs to zero, need to wait 15ns */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1302) write_grf_reg(priv, GRF_DPHY_TX1RX1_FORCERXMODE, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1303) write_grf_reg(priv, GRF_DPHY_TX1RX1_FORCETXSTOPMODE, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1304) write_grf_reg(priv, GRF_DPHY_TX1RX1_TURNREQUEST, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1305) write_grf_reg(priv, GRF_DPHY_TX1RX1_TURNDISABLE, 0xf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1306) usleep_range(100, 150);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1307)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1308) /* Step9: set TESTCLR=1'b0,TESTCLK=1'b1 need to wait 15ns */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1309) write_txrx_reg(priv, TXRX_PHY_TEST_CTRL0, PHY_TESTCLK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1310) usleep_range(100, 150);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1311)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1312) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1313) * Step10: configure Test Code 0x44 hsfreqrange according to values
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1314) * step10.1:set clock lane
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1315) * step10.2:set hsfreqrange by lane0(test code 0x44)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1316) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1317) hsfreq <<= 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1318) mipidphy1_wr_reg(priv, CLOCK_LANE_HS_RX_CONTROL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1319) mipidphy1_wr_reg(priv, LANE0_HS_RX_CONTROL, hsfreq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1320) mipidphy1_wr_reg(priv, LANE1_HS_RX_CONTROL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1321) mipidphy1_wr_reg(priv, LANE2_HS_RX_CONTROL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1322) mipidphy1_wr_reg(priv, LANE3_HS_RX_CONTROL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1323)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1324) /* Step11: Configure analog references: of Test Code 0x22 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1325)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1326) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1327) * Step12: Set ENABLE_N=1'b1, need to wait 5ns
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1328) * Set lane num:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1329) * for 3288,controlled by isp,enable lanes actually
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1330) * is set by grf_soc_con9[12:15];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1331) * for 3399,controlled by isp1,enable lanes actually
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1332) * is set by isp1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1333) * if run 3399 here operates grf_soc_con23[0:3]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1334) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1335) write_grf_reg(priv, GRF_DPHY_TX1RX1_ENABLE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1336) GENMASK(sensor->lanes - 1, 0));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1337)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1338) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1339) * Step13:Set SHUTDOWNZ=1'b1, phy1-rx controlled by isp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1340) * need to wait 5ns
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1341) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1342)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1343) /* Step14:Set RSTZ=1'b1, phy1-rx controlled by isp*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1344)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1345) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1346) * Step15:Wait until STOPSTATEDATA_N & STOPSTATECLK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1347) * outputs are asserted
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1348) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1349)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1350) usleep_range(100, 150);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1351)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1352) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1353) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1354)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1355) static int csi_mipidphy_stream_on(struct mipidphy_priv *priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1356) struct v4l2_subdev *sd)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1357) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1358) struct v4l2_subdev *sensor_sd = get_remote_sensor(sd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1359) struct mipidphy_sensor *sensor = sd_to_sensor(priv, sensor_sd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1360) const struct dphy_drv_data *drv_data = priv->drv_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1361) const struct hsfreq_range *hsfreq_ranges = drv_data->hsfreq_ranges;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1362) int num_hsfreq_ranges = drv_data->num_hsfreq_ranges;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1363) int i, hsfreq = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1364) u32 val = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1365) u32 clk_mode = 0x03;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1366)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1367) write_grf_reg(priv, GRF_DVP_V18SEL, 0x1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1368)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1369) /* phy start */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1370) write_csiphy_reg(priv, CSIPHY_CTRL_PWRCTL, 0xe4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1371)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1372) /* set data lane num and enable clock lane */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1373) write_csiphy_reg(priv, CSIPHY_CTRL_LANE_ENABLE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1374) ((GENMASK(sensor->lanes - 1, 0) << MIPI_CSI_DPHY_CTRL_DATALANE_ENABLE_OFFSET_BIT) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1375) (0x1 << MIPI_CSI_DPHY_CTRL_CLKLANE_ENABLE_OFFSET_BIT) | 0x1));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1376)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1377) /* Reset dphy analog part */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1378) write_csiphy_reg(priv, CSIPHY_CTRL_PWRCTL, 0xe0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1379) usleep_range(500, 1000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1380)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1381) if (sensor->mbus.type == V4L2_MBUS_CSI2_DPHY) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1382) /* Reset dphy digital part */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1383) write_csiphy_reg(priv, CSIPHY_CTRL_DIG_RST, 0x1e);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1384) write_csiphy_reg(priv, CSIPHY_CTRL_DIG_RST, 0x1f);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1385) if (drv_data->chip_id == CHIP_ID_RK3326S) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1386) if (sensor->mbus.flags & V4L2_MBUS_CSI2_CONTINUOUS_CLOCK)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1387) clk_mode = 0x03;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1388) else if (sensor->mbus.flags & V4L2_MBUS_CSI2_NONCONTINUOUS_CLOCK)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1389) clk_mode = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1390) write_csiphy_reg(priv, CSIPHY_CLK_MODE, clk_mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1391) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1392) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1393) /* Disable MIPI internal logical and switch to LVDS bank */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1394) write_csiphy_reg(priv, CSIPHY_CTRL_DIG_RST, 0x3e);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1395) /* Enable LVDS mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1396) write_csiphy_reg(priv, CSIPHY_MIPI_LVDS_MODEL, 0x4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1397) switch (sensor->format.code) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1398) case MEDIA_BUS_FMT_Y12_1X12:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1399) case MEDIA_BUS_FMT_SRGGB12_1X12:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1400) case MEDIA_BUS_FMT_SBGGR12_1X12:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1401) case MEDIA_BUS_FMT_SGBRG12_1X12:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1402) case MEDIA_BUS_FMT_SGRBG12_1X12:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1403) val = 0x1f; //12bit
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1404) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1405) case MEDIA_BUS_FMT_Y10_1X10:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1406) case MEDIA_BUS_FMT_SBGGR10_1X10:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1407) case MEDIA_BUS_FMT_SRGGB10_1X10:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1408) case MEDIA_BUS_FMT_SGBRG10_1X10:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1409) case MEDIA_BUS_FMT_SGRBG10_1X10:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1410) val = 0xf; //10bit
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1411) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1412) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1413) val = 0x2f; //8bit
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1414) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1415) /* Enable LVDS internal logical and select bit mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1416) write_csiphy_reg(priv, CSIPHY_LVDS_MODE, val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1417) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1418)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1419) /* not into receive mode/wait stopstate */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1420) write_grf_reg(priv, GRF_DPHY_CSIPHY_FORCERXMODE, 0x0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1421)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1422) /* enable calibration */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1423) if (priv->data_rate_mbps > 1500) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1424) write_csiphy_reg(priv, CSIPHY_CLK_CALIB_ENABLE, 0x80);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1425) if (sensor->lanes > 0x00)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1426) write_csiphy_reg(priv, CSIPHY_LANE0_CALIB_ENABLE, 0x80);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1427) if (sensor->lanes > 0x01)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1428) write_csiphy_reg(priv, CSIPHY_LANE1_CALIB_ENABLE, 0x80);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1429) if (sensor->lanes > 0x02)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1430) write_csiphy_reg(priv, CSIPHY_LANE2_CALIB_ENABLE, 0x80);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1431) if (sensor->lanes > 0x03)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1432) write_csiphy_reg(priv, CSIPHY_LANE3_CALIB_ENABLE, 0x80);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1433) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1434)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1435) /* set clock lane and data lane */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1436) for (i = 0; i < num_hsfreq_ranges; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1437) if (hsfreq_ranges[i].range_h >= priv->data_rate_mbps) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1438) hsfreq = hsfreq_ranges[i].cfg_bit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1439) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1440) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1441) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1442)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1443) if (i == num_hsfreq_ranges) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1444) i = num_hsfreq_ranges - 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1445) dev_warn(priv->dev, "data rate: %lld mbps, max support %d mbps",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1446) priv->data_rate_mbps, hsfreq_ranges[i].range_h + 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1447) hsfreq = hsfreq_ranges[i].cfg_bit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1448) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1449)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1450) csi_mipidphy_wr_ths_settle(priv, hsfreq, MIPI_DPHY_LANE_CLOCK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1451) if (sensor->lanes > 0x00)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1452) csi_mipidphy_wr_ths_settle(priv, hsfreq, MIPI_DPHY_LANE_DATA0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1453) if (sensor->lanes > 0x01)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1454) csi_mipidphy_wr_ths_settle(priv, hsfreq, MIPI_DPHY_LANE_DATA1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1455) if (sensor->lanes > 0x02)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1456) csi_mipidphy_wr_ths_settle(priv, hsfreq, MIPI_DPHY_LANE_DATA2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1457) if (sensor->lanes > 0x03)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1458) csi_mipidphy_wr_ths_settle(priv, hsfreq, MIPI_DPHY_LANE_DATA3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1459)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1460) write_grf_reg(priv, GRF_DPHY_CLK_INV_SEL, 0x1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1461) write_grf_reg(priv, GRF_DPHY_CSIPHY_CLKLANE_EN, 0x1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1462) write_grf_reg(priv, GRF_DPHY_CSIPHY_DATALANE_EN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1463) GENMASK(sensor->lanes - 1, 0));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1464) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1465) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1466)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1467) static int csi_mipidphy_stream_off(struct mipidphy_priv *priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1468) struct v4l2_subdev *sd)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1469) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1470) /* disable all lanes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1471) write_csiphy_reg(priv, CSIPHY_CTRL_LANE_ENABLE, 0x01);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1472) /* disable pll and ldo */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1473) write_csiphy_reg(priv, CSIPHY_CTRL_PWRCTL, 0xe3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1474) usleep_range(500, 1000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1475)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1476) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1477) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1478)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1479) static const struct dphy_drv_data rk1808_mipidphy_drv_data = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1480) .clks = rk1808_mipidphy_clks,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1481) .num_clks = ARRAY_SIZE(rk1808_mipidphy_clks),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1482) .hsfreq_ranges = rk1808_rv1126_mipidphy_hsfreq_ranges,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1483) .num_hsfreq_ranges = ARRAY_SIZE(rk1808_rv1126_mipidphy_hsfreq_ranges),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1484) .grf_regs = rk1808_grf_dphy_regs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1485) .csiphy_regs = rk1808_csiphy_regs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1486) .ctl_type = MIPI_DPHY_CTL_CSI_HOST,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1487) .individual_init = default_mipidphy_individual_init,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1488) .chip_id = CHIP_ID_RK1808,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1489) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1490)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1491) static const struct dphy_drv_data rk3288_mipidphy_drv_data = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1492) .clks = rk3288_mipidphy_clks,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1493) .num_clks = ARRAY_SIZE(rk3288_mipidphy_clks),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1494) .hsfreq_ranges = rk3288_mipidphy_hsfreq_ranges,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1495) .num_hsfreq_ranges = ARRAY_SIZE(rk3288_mipidphy_hsfreq_ranges),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1496) .grf_regs = rk3288_grf_dphy_regs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1497) .txrx_regs = rk3288_txrx_regs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1498) .ctl_type = MIPI_DPHY_CTL_GRF_ONLY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1499) .individual_init = default_mipidphy_individual_init,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1500) .chip_id = CHIP_ID_RK3288,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1501) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1502)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1503) static const struct dphy_drv_data rk3326_mipidphy_drv_data = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1504) .clks = rk3326_mipidphy_clks,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1505) .num_clks = ARRAY_SIZE(rk3326_mipidphy_clks),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1506) .hsfreq_ranges = rk3326_mipidphy_hsfreq_ranges,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1507) .num_hsfreq_ranges = ARRAY_SIZE(rk3326_mipidphy_hsfreq_ranges),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1508) .grf_regs = rk3326_grf_dphy_regs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1509) .csiphy_regs = rk3326_csiphy_regs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1510) .ctl_type = MIPI_DPHY_CTL_CSI_HOST,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1511) .individual_init = default_mipidphy_individual_init,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1512) .chip_id = CHIP_ID_RK3326,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1513) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1514)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1515) static const struct dphy_drv_data rk3326s_mipidphy_drv_data = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1516) .clks = rk3326_mipidphy_clks,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1517) .num_clks = ARRAY_SIZE(rk3326_mipidphy_clks),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1518) .hsfreq_ranges = rk3326s_mipidphy_hsfreq_ranges,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1519) .num_hsfreq_ranges = ARRAY_SIZE(rk3326s_mipidphy_hsfreq_ranges),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1520) .grf_regs = rk3326_grf_dphy_regs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1521) .csiphy_regs = rk3326s_csiphy_regs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1522) .ctl_type = MIPI_DPHY_CTL_CSI_HOST,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1523) .individual_init = default_mipidphy_individual_init,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1524) .chip_id = CHIP_ID_RK3326S,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1525) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1526)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1527) static const struct dphy_drv_data rk3368_mipidphy_drv_data = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1528) .clks = rk3368_mipidphy_clks,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1529) .num_clks = ARRAY_SIZE(rk3368_mipidphy_clks),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1530) .hsfreq_ranges = rk3368_mipidphy_hsfreq_ranges,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1531) .num_hsfreq_ranges = ARRAY_SIZE(rk3368_mipidphy_hsfreq_ranges),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1532) .grf_regs = rk3368_grf_dphy_regs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1533) .csiphy_regs = rk3368_csiphy_regs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1534) .ctl_type = MIPI_DPHY_CTL_CSI_HOST,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1535) .individual_init = rk3368_mipidphy_individual_init,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1536) .chip_id = CHIP_ID_RK3368,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1537) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1538)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1539) static const struct dphy_drv_data rk3399_mipidphy_drv_data = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1540) .clks = rk3399_mipidphy_clks,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1541) .num_clks = ARRAY_SIZE(rk3399_mipidphy_clks),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1542) .hsfreq_ranges = rk3399_mipidphy_hsfreq_ranges,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1543) .num_hsfreq_ranges = ARRAY_SIZE(rk3399_mipidphy_hsfreq_ranges),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1544) .grf_regs = rk3399_grf_dphy_regs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1545) .txrx_regs = rk3399_txrx_regs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1546) .ctl_type = MIPI_DPHY_CTL_GRF_ONLY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1547) .individual_init = rk3399_mipidphy_individual_init,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1548) .chip_id = CHIP_ID_RK3399,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1549) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1550)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1551) static const struct dphy_drv_data rv1126_mipidphy_drv_data = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1552) .clks = rv1126_mipidphy_clks,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1553) .num_clks = ARRAY_SIZE(rv1126_mipidphy_clks),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1554) .hsfreq_ranges = rk1808_rv1126_mipidphy_hsfreq_ranges,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1555) .num_hsfreq_ranges = ARRAY_SIZE(rk1808_rv1126_mipidphy_hsfreq_ranges),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1556) .csiphy_regs = rv1126_csiphy_regs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1557) .ctl_type = MIPI_DPHY_CTL_CSI_HOST,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1558) .individual_init = rv1126_mipidphy_individual_init,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1559) .chip_id = CHIP_ID_RK1126,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1560) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1561)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1562) static const struct of_device_id rockchip_mipidphy_match_id[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1563) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1564) .compatible = "rockchip,rk1808-mipi-dphy-rx",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1565) .data = &rk1808_mipidphy_drv_data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1566) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1567) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1568) .compatible = "rockchip,rk3288-mipi-dphy",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1569) .data = &rk3288_mipidphy_drv_data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1570) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1571) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1572) .compatible = "rockchip,rk3326-mipi-dphy",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1573) .data = &rk3326_mipidphy_drv_data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1574) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1575) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1576) .compatible = "rockchip,rk3326s-mipi-dphy",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1577) .data = &rk3326s_mipidphy_drv_data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1578) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1579) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1580) .compatible = "rockchip,rk3368-mipi-dphy",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1581) .data = &rk3368_mipidphy_drv_data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1582) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1583) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1584) .compatible = "rockchip,rk3399-mipi-dphy",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1585) .data = &rk3399_mipidphy_drv_data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1586) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1587) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1588) .compatible = "rockchip,rv1126-csi-dphy",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1589) .data = &rv1126_mipidphy_drv_data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1590) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1591) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1592) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1593) MODULE_DEVICE_TABLE(of, rockchip_mipidphy_match_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1594)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1595) /* The .bound() notifier callback when a match is found */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1596) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1597) rockchip_mipidphy_notifier_bound(struct v4l2_async_notifier *notifier,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1598) struct v4l2_subdev *sd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1599) struct v4l2_async_subdev *asd)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1600) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1601) struct mipidphy_priv *priv = container_of(notifier,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1602) struct mipidphy_priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1603) notifier);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1604) struct sensor_async_subdev *s_asd = container_of(asd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1605) struct sensor_async_subdev, asd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1606) struct mipidphy_sensor *sensor;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1607) unsigned int pad, ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1608)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1609) if (priv->num_sensors == ARRAY_SIZE(priv->sensors))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1610) return -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1611)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1612) sensor = &priv->sensors[priv->num_sensors++];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1613) sensor->lanes = s_asd->lanes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1614) sensor->mbus = s_asd->mbus;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1615) sensor->sd = sd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1616) dev_info(priv->dev, "match %s:bus type %d\n", sd->name, s_asd->mbus.type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1617)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1618) for (pad = 0; pad < sensor->sd->entity.num_pads; pad++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1619) if (sensor->sd->entity.pads[pad].flags & MEDIA_PAD_FL_SOURCE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1620) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1621)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1622) if (pad == sensor->sd->entity.num_pads) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1623) dev_err(priv->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1624) "failed to find src pad for %s\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1625) sensor->sd->name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1626)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1627) return -ENXIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1628) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1629)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1630) ret = media_create_pad_link(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1631) &sensor->sd->entity, pad,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1632) &priv->sd.entity, MIPI_DPHY_RX_PAD_SINK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1633) priv->num_sensors != 1 ? 0 : MEDIA_LNK_FL_ENABLED);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1634) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1635) dev_err(priv->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1636) "failed to create link for %s\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1637) sensor->sd->name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1638) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1639) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1640)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1641) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1642) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1643)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1644) /* The .unbind callback */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1645) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1646) rockchip_mipidphy_notifier_unbind(struct v4l2_async_notifier *notifier,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1647) struct v4l2_subdev *sd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1648) struct v4l2_async_subdev *asd)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1649) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1650) struct mipidphy_priv *priv = container_of(notifier,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1651) struct mipidphy_priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1652) notifier);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1653) struct mipidphy_sensor *sensor = sd_to_sensor(priv, sd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1654)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1655) sensor->sd = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1656) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1657)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1658) static const struct
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1659) v4l2_async_notifier_operations rockchip_mipidphy_async_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1660) .bound = rockchip_mipidphy_notifier_bound,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1661) .unbind = rockchip_mipidphy_notifier_unbind,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1662) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1663)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1664) static int rockchip_mipidphy_fwnode_parse(struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1665) struct v4l2_fwnode_endpoint *vep,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1666) struct v4l2_async_subdev *asd)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1667) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1668) struct sensor_async_subdev *s_asd =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1669) container_of(asd, struct sensor_async_subdev, asd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1670) struct v4l2_mbus_config *config = &s_asd->mbus;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1671)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1672) if (vep->base.port != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1673) dev_err(dev, "The PHY has only port 0\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1674) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1675) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1676)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1677) if (vep->bus_type == V4L2_MBUS_CSI2_DPHY) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1678) config->type = V4L2_MBUS_CSI2_DPHY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1679) config->flags = vep->bus.mipi_csi2.flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1680) s_asd->lanes = vep->bus.mipi_csi2.num_data_lanes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1681) } else if (vep->bus_type == V4L2_MBUS_CCP2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1682) /* V4L2_MBUS_CCP2 for lvds */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1683) config->type = V4L2_MBUS_CCP2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1684) s_asd->lanes = vep->bus.mipi_csi1.data_lane;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1685) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1686) dev_err(dev, "Only CSI2 and CCP2 bus type is currently supported\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1687) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1688) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1689)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1690) switch (s_asd->lanes) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1691) case 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1692) config->flags |= V4L2_MBUS_CSI2_1_LANE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1693) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1694) case 2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1695) config->flags |= V4L2_MBUS_CSI2_2_LANE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1696) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1697) case 3:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1698) config->flags |= V4L2_MBUS_CSI2_3_LANE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1699) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1700) case 4:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1701) config->flags |= V4L2_MBUS_CSI2_4_LANE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1702) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1703) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1704) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1705) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1706)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1707) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1708) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1709)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1710) static int rockchip_mipidphy_media_init(struct mipidphy_priv *priv)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1711) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1712) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1713)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1714) priv->pads[MIPI_DPHY_RX_PAD_SOURCE].flags =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1715) MEDIA_PAD_FL_SOURCE | MEDIA_PAD_FL_MUST_CONNECT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1716) priv->pads[MIPI_DPHY_RX_PAD_SINK].flags =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1717) MEDIA_PAD_FL_SINK | MEDIA_PAD_FL_MUST_CONNECT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1718) priv->sd.entity.function = MEDIA_ENT_F_VID_IF_BRIDGE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1719) ret = media_entity_pads_init(&priv->sd.entity,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1720) MIPI_DPHY_RX_PADS_NUM, priv->pads);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1721) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1722) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1723)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1724) v4l2_async_notifier_init(&priv->notifier);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1725)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1726) ret = v4l2_async_notifier_parse_fwnode_endpoints_by_port(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1727) priv->dev, &priv->notifier,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1728) sizeof(struct sensor_async_subdev), 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1729) rockchip_mipidphy_fwnode_parse);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1730) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1731) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1732)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1733) priv->sd.subdev_notifier = &priv->notifier;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1734) priv->notifier.ops = &rockchip_mipidphy_async_ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1735) ret = v4l2_async_subdev_notifier_register(&priv->sd, &priv->notifier);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1736) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1737) dev_err(priv->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1738) "failed to register async notifier : %d\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1739) v4l2_async_notifier_cleanup(&priv->notifier);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1740) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1741) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1742)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1743) return v4l2_async_register_subdev(&priv->sd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1744) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1745)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1746) static int rockchip_mipidphy_probe(struct platform_device *pdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1747) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1748) struct device *dev = &pdev->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1749) struct v4l2_subdev *sd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1750) struct mipidphy_priv *priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1751) struct regmap *grf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1752) struct resource *res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1753) const struct of_device_id *of_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1754) const struct dphy_drv_data *drv_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1755) int i, ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1756)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1757) priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1758) if (!priv)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1759) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1760) priv->dev = dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1761)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1762) of_id = of_match_device(rockchip_mipidphy_match_id, dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1763) if (!of_id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1764) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1765)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1766) grf = syscon_node_to_regmap(dev->parent->of_node);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1767) if (IS_ERR(grf)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1768) grf = syscon_regmap_lookup_by_phandle(dev->of_node,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1769) "rockchip,grf");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1770) if (IS_ERR(grf)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1771) dev_err(dev, "Can't find GRF syscon\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1772) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1773) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1774) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1775) priv->regmap_grf = grf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1776)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1777) priv->phy_index = of_alias_get_id(dev->of_node, "dphy");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1778) if (priv->phy_index < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1779) priv->phy_index = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1780)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1781) drv_data = of_id->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1782) if (soc_is_px30s())
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1783) drv_data = &rk3326s_mipidphy_drv_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1784)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1785) for (i = 0; i < drv_data->num_clks; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1786) priv->clks[i] = devm_clk_get(dev, drv_data->clks[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1787)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1788) if (IS_ERR(priv->clks[i]))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1789) dev_dbg(dev, "Failed to get %s\n", drv_data->clks[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1790) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1791)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1792) priv->grf_regs = drv_data->grf_regs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1793) priv->txrx_regs = drv_data->txrx_regs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1794) priv->csiphy_regs = drv_data->csiphy_regs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1795) priv->drv_data = drv_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1796) if (drv_data->ctl_type == MIPI_DPHY_CTL_CSI_HOST) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1797) res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1798) priv->csihost_base_addr = devm_ioremap_resource(dev, res);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1799) priv->stream_on = csi_mipidphy_stream_on;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1800) priv->stream_off = csi_mipidphy_stream_off;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1801) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1802) priv->stream_on = mipidphy_txrx_stream_on;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1803) priv->txrx_base_addr = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1804) res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1805) priv->txrx_base_addr = devm_ioremap_resource(dev, res);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1806) if (IS_ERR(priv->txrx_base_addr))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1807) priv->stream_on = mipidphy_rx_stream_on;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1808) priv->stream_off = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1809) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1810)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1811) sd = &priv->sd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1812) mutex_init(&priv->mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1813) v4l2_subdev_init(sd, &mipidphy_subdev_ops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1814) sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1815) snprintf(sd->name, sizeof(sd->name), "rockchip-mipi-dphy-rx");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1816) sd->dev = dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1817)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1818) platform_set_drvdata(pdev, &sd->entity);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1819)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1820) ret = rockchip_mipidphy_media_init(priv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1821) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1822) goto destroy_mutex;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1823)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1824) pm_runtime_enable(&pdev->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1825) drv_data->individual_init(priv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1826) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1827)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1828) destroy_mutex:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1829) mutex_destroy(&priv->mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1830) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1831) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1832)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1833) static int rockchip_mipidphy_remove(struct platform_device *pdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1834) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1835) struct media_entity *me = platform_get_drvdata(pdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1836) struct v4l2_subdev *sd = media_entity_to_v4l2_subdev(me);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1837) struct mipidphy_priv *priv = platform_get_drvdata(pdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1838)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1839) media_entity_cleanup(&sd->entity);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1840)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1841) pm_runtime_disable(&pdev->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1842) mutex_destroy(&priv->mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1843) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1844) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1845)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1846) static const struct dev_pm_ops rockchip_mipidphy_pm_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1847) SET_RUNTIME_PM_OPS(mipidphy_runtime_suspend,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1848) mipidphy_runtime_resume, NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1849) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1850)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1851) static struct platform_driver rockchip_isp_mipidphy_driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1852) .probe = rockchip_mipidphy_probe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1853) .remove = rockchip_mipidphy_remove,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1854) .driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1855) .name = "rockchip-mipi-dphy-rx",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1856) .pm = &rockchip_mipidphy_pm_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1857) .of_match_table = rockchip_mipidphy_match_id,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1858) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1859) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1860)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1861) module_platform_driver(rockchip_isp_mipidphy_driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1862) MODULE_AUTHOR("Rockchip Camera/ISP team");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1863) MODULE_DESCRIPTION("Rockchip MIPI RX DPHY driver");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1864) MODULE_LICENSE("Dual BSD/GPL");