mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-07 19:30:30 +09:00
Revert "phy: rockchip: mipi-rx: support rk3568 mipi dphy rx"
This reverts commit9cb5128ee0. Replaced by commit 118103 and 118606:e0e682453e("phy: rockchip: add rk3568 mipi dphy hw driver")a9e17370bb("phy: rockchip: csi2-dphy: add mipi dphy dual mode driver for rk3568") Signed-off-by: Allon Huang <allon.huang@rock-chips.com> Change-Id: I3a8f70860c859724199197b9aa10d75565cb6c5e
This commit is contained in:
@@ -83,12 +83,6 @@
|
||||
#define RV1126_GRF_PHY1_SEL_ISP BIT(1)
|
||||
#define RV1126_GRF_PHY1_SEL_CIF BIT(0)
|
||||
|
||||
#define RK3568_GRF_VI_CON0 0x0340
|
||||
#define RK3568_GRF_VI_CON1 0x0344
|
||||
#define RK3568_GRF_CSIPHY_LANE_SEL_SPLIT (0x1)
|
||||
#define RK3568_GRF_CSIPHY_SEL_SPLIT_0_1 (0x0)
|
||||
#define RK3568_GRF_CSIPHY_SEL_SPLIT_2_3 BIT(0)
|
||||
|
||||
/* PHY */
|
||||
#define RK3288_PHY_TEST_CTRL0 0x30
|
||||
#define RK3288_PHY_TEST_CTRL1 0x34
|
||||
@@ -105,7 +99,7 @@
|
||||
#define LANE1_HS_RX_CONTROL 0x54
|
||||
#define LANE2_HS_RX_CONTROL 0x84
|
||||
#define LANE3_HS_RX_CONTROL 0x94
|
||||
#define HS_RX_DATA_LANES_HS_SETTLE_CONTROL 0x75
|
||||
#define HS_RX_DATA_LANES_THS_SETTLE_CONTROL 0x75
|
||||
|
||||
/* LOW POWER MODE SET */
|
||||
#define MIPI_CSI_DPHY_CTRL_INVALID_OFFSET 0xFFFF
|
||||
@@ -127,48 +121,46 @@
|
||||
#define RV1126_CSI_DPHY_CTRL_PWRCTL \
|
||||
MIPI_CSI_DPHY_CTRL_INVALID_OFFSET
|
||||
#define RV1126_CSI_DPHY_CTRL_DIG_RST 0x80
|
||||
#define RK3568_CSI_DPHY_DUAL_CAL_EN 0x80
|
||||
|
||||
#define MIPI_CSI_DPHY_CTRL_DATALANE_ENABLE_OFFSET_BIT 2
|
||||
#define MIPI_CSI_DPHY_CTRL_CLKLANE_ENABLE_OFFSET_BIT 6
|
||||
|
||||
/* Configure the count time of the HS-SETTLE by protocol. */
|
||||
#define RK1808_CSI_DPHY_CLK_WR_HS_SETTLE 0x160
|
||||
#define RK1808_CSI_DPHY_LANE0_WR_HS_SETTLE \
|
||||
(RK1808_CSI_DPHY_CLK_WR_HS_SETTLE + 0x80)
|
||||
#define RK1808_CSI_DPHY_LANE1_WR_HS_SETTLE \
|
||||
(RK1808_CSI_DPHY_LANE0_WR_HS_SETTLE + 0x80)
|
||||
#define RK1808_CSI_DPHY_LANE2_WR_HS_SETTLE \
|
||||
(RK1808_CSI_DPHY_LANE1_WR_HS_SETTLE + 0x80)
|
||||
#define RK1808_CSI_DPHY_LANE3_WR_HS_SETTLE \
|
||||
(RK1808_CSI_DPHY_LANE2_WR_HS_SETTLE + 0x80)
|
||||
/* Configure the count time of the THS-SETTLE by protocol. */
|
||||
#define RK1808_CSI_DPHY_CLK_WR_THS_SETTLE 0x160
|
||||
#define RK1808_CSI_DPHY_LANE0_WR_THS_SETTLE \
|
||||
(RK1808_CSI_DPHY_CLK_WR_THS_SETTLE + 0x80)
|
||||
#define RK1808_CSI_DPHY_LANE1_WR_THS_SETTLE \
|
||||
(RK1808_CSI_DPHY_LANE0_WR_THS_SETTLE + 0x80)
|
||||
#define RK1808_CSI_DPHY_LANE2_WR_THS_SETTLE \
|
||||
(RK1808_CSI_DPHY_LANE1_WR_THS_SETTLE + 0x80)
|
||||
#define RK1808_CSI_DPHY_LANE3_WR_THS_SETTLE \
|
||||
(RK1808_CSI_DPHY_LANE2_WR_THS_SETTLE + 0x80)
|
||||
|
||||
#define RK3326_CSI_DPHY_CLK_WR_HS_SETTLE 0x100
|
||||
#define RK3326_CSI_DPHY_LANE0_WR_HS_SETTLE \
|
||||
(RK3326_CSI_DPHY_CLK_WR_HS_SETTLE + 0x80)
|
||||
#define RK3326_CSI_DPHY_LANE1_WR_HS_SETTLE \
|
||||
(RK3326_CSI_DPHY_LANE0_WR_HS_SETTLE + 0x80)
|
||||
#define RK3326_CSI_DPHY_LANE2_WR_HS_SETTLE \
|
||||
(RK3326_CSI_DPHY_LANE1_WR_HS_SETTLE + 0x80)
|
||||
#define RK3326_CSI_DPHY_LANE3_WR_HS_SETTLE \
|
||||
(RK3326_CSI_DPHY_LANE2_WR_HS_SETTLE + 0x80)
|
||||
#define RK3326_CSI_DPHY_CLK_WR_THS_SETTLE 0x100
|
||||
#define RK3326_CSI_DPHY_LANE0_WR_THS_SETTLE \
|
||||
(RK3326_CSI_DPHY_CLK_WR_THS_SETTLE + 0x80)
|
||||
#define RK3326_CSI_DPHY_LANE1_WR_THS_SETTLE \
|
||||
(RK3326_CSI_DPHY_LANE0_WR_THS_SETTLE + 0x80)
|
||||
#define RK3326_CSI_DPHY_LANE2_WR_THS_SETTLE \
|
||||
(RK3326_CSI_DPHY_LANE1_WR_THS_SETTLE + 0x80)
|
||||
#define RK3326_CSI_DPHY_LANE3_WR_THS_SETTLE \
|
||||
(RK3326_CSI_DPHY_LANE2_WR_THS_SETTLE + 0x80)
|
||||
|
||||
#define RK3368_CSI_DPHY_CLK_WR_HS_SETTLE 0x100
|
||||
#define RK3368_CSI_DPHY_LANE0_WR_HS_SETTLE \
|
||||
(RK3368_CSI_DPHY_CLK_WR_HS_SETTLE + 0x80)
|
||||
#define RK3368_CSI_DPHY_LANE1_WR_HS_SETTLE \
|
||||
(RK3368_CSI_DPHY_LANE0_WR_HS_SETTLE + 0x80)
|
||||
#define RK3368_CSI_DPHY_LANE2_WR_HS_SETTLE \
|
||||
(RK3368_CSI_DPHY_LANE1_WR_HS_SETTLE + 0x80)
|
||||
#define RK3368_CSI_DPHY_LANE3_WR_HS_SETTLE \
|
||||
(RK3368_CSI_DPHY_LANE2_WR_HS_SETTLE + 0x80)
|
||||
#define RK3368_CSI_DPHY_CLK_WR_THS_SETTLE 0x100
|
||||
#define RK3368_CSI_DPHY_LANE0_WR_THS_SETTLE \
|
||||
(RK3368_CSI_DPHY_CLK_WR_THS_SETTLE + 0x80)
|
||||
#define RK3368_CSI_DPHY_LANE1_WR_THS_SETTLE \
|
||||
(RK3368_CSI_DPHY_LANE0_WR_THS_SETTLE + 0x80)
|
||||
#define RK3368_CSI_DPHY_LANE2_WR_THS_SETTLE \
|
||||
(RK3368_CSI_DPHY_LANE1_WR_THS_SETTLE + 0x80)
|
||||
#define RK3368_CSI_DPHY_LANE3_WR_THS_SETTLE \
|
||||
(RK3368_CSI_DPHY_LANE2_WR_THS_SETTLE + 0x80)
|
||||
|
||||
#define RV1126_CSI_DPHY_CLK_WR_HS_SETTLE 0x160
|
||||
#define RV1126_CSI_DPHY_LANE0_WR_HS_SETTLE 0x1e0
|
||||
#define RV1126_CSI_DPHY_LANE1_WR_HS_SETTLE 0x260
|
||||
#define RV1126_CSI_DPHY_LANE2_WR_HS_SETTLE 0x2e0
|
||||
#define RV1126_CSI_DPHY_LANE3_WR_HS_SETTLE 0x360
|
||||
#define RK3568_CSI_DPHY_CLK1_WR_HS_SETTLE 0x3e0
|
||||
#define RV1126_CSI_DPHY_CLK_WR_THS_SETTLE 0x160
|
||||
#define RV1126_CSI_DPHY_LANE0_WR_THS_SETTLE 0x1e0
|
||||
#define RV1126_CSI_DPHY_LANE1_WR_THS_SETTLE 0x260
|
||||
#define RV1126_CSI_DPHY_LANE2_WR_THS_SETTLE 0x2e0
|
||||
#define RV1126_CSI_DPHY_LANE3_WR_THS_SETTLE 0x360
|
||||
|
||||
/* Calibration reception enable */
|
||||
#define RK1808_CSI_DPHY_CLK_CALIB_EN 0x168
|
||||
@@ -204,7 +196,6 @@
|
||||
#define RV1126_CSI_DPHY_LANE1_CALIB_EN 0x268
|
||||
#define RV1126_CSI_DPHY_LANE2_CALIB_EN 0x2e8
|
||||
#define RV1126_CSI_DPHY_LANE3_CALIB_EN 0x368
|
||||
#define RK3568_CSI_DPHY_CLK1_CALIB_EN 0x3e8
|
||||
|
||||
#define RV1126_CSI_DPHY_MIPI_LVDS_MODEL 0x2cc
|
||||
#define RV1126_CSI_DPHY_LVDS_MODE 0x300
|
||||
@@ -215,23 +206,11 @@
|
||||
#define PHY_TESTEN_DATA (0x0 << 16)
|
||||
#define PHY_TESTCLK (0x1 << 1)
|
||||
#define PHY_TESTCLR (0x1 << 0)
|
||||
#define HS_SETTLE_COUNTER_THRESHOLD 0x04
|
||||
#define THS_SETTLE_COUNTER_THRESHOLD 0x04
|
||||
|
||||
#define HIWORD_UPDATE(val, mask, shift) \
|
||||
((val) << (shift) | (mask) << ((shift) + 16))
|
||||
|
||||
#define OF_DPHY_LANE_MODE "rockchip,lane-mode"
|
||||
|
||||
#define RK3568_DPHY_LANE_MODE_FULL (0x4)
|
||||
#define RK3568_DPHY_LANE_MODE_SPLIT (0x2)
|
||||
#define RK3568_DPHY_LANE_SPLIT_TOP (0x1)
|
||||
#define RK3568_DPHY_LANE_SPLIT_BOT (0x2)
|
||||
#define RK3568_DPHY_LANE_SPLIT_LANE0_1 (0x3 << 2)
|
||||
#define RK3568_DPHY_LANE_SPLIT_LANE2_3 (0x3 << 4)
|
||||
#define RK3568_DPHY_LANE_DUAL_MODE_EN BIT(6)
|
||||
#define RK3568_DPHY_LANE_PARA_ARR_NUM (0x2)
|
||||
|
||||
/* add new chip id in tail by time order */
|
||||
enum mipi_dphy_chip_id {
|
||||
CHIP_ID_RK1808 = 0,
|
||||
CHIP_ID_RK3288,
|
||||
@@ -239,7 +218,6 @@ enum mipi_dphy_chip_id {
|
||||
CHIP_ID_RK3368,
|
||||
CHIP_ID_RK3399,
|
||||
CHIP_ID_RK1126,
|
||||
CHIP_ID_RK3568,
|
||||
};
|
||||
|
||||
enum mipi_dphy_rx_pads {
|
||||
@@ -290,23 +268,17 @@ enum dphy_reg_id {
|
||||
GRF_DPHY_RX0_CLK_INV_SEL,
|
||||
GRF_DPHY_RX1_CLK_INV_SEL,
|
||||
GRF_DPHY_TX1RX1_SRC_SEL,
|
||||
/* below is for rk3568 only */
|
||||
GRF_DPHY_CSIPHY_CLKLANE1_EN,
|
||||
GRF_DPHY_CLK1_INV_SEL,
|
||||
GRF_DPHY_ISP_CSIPHY_SEL,
|
||||
GRF_DPHY_CIF_CSIPHY_SEL,
|
||||
GRF_DPHY_CSIPHY_LANE_SEL,
|
||||
};
|
||||
|
||||
enum csiphy_reg_id {
|
||||
CSIPHY_CTRL_LANE_ENABLE = 0,
|
||||
CSIPHY_CTRL_PWRCTL,
|
||||
CSIPHY_CTRL_DIG_RST,
|
||||
CSIPHY_CLK_HS_SETTLE,
|
||||
CSIPHY_LANE0_HS_SETTLE,
|
||||
CSIPHY_LANE1_HS_SETTLE,
|
||||
CSIPHY_LANE2_HS_SETTLE,
|
||||
CSIPHY_LANE3_HS_SETTLE,
|
||||
CSIPHY_CLK_THS_SETTLE,
|
||||
CSIPHY_LANE0_THS_SETTLE,
|
||||
CSIPHY_LANE1_THS_SETTLE,
|
||||
CSIPHY_LANE2_THS_SETTLE,
|
||||
CSIPHY_LANE3_THS_SETTLE,
|
||||
CSIPHY_CLK_CALIB_ENABLE,
|
||||
CSIPHY_LANE0_CALIB_ENABLE,
|
||||
CSIPHY_LANE1_CALIB_ENABLE,
|
||||
@@ -315,10 +287,6 @@ enum csiphy_reg_id {
|
||||
//rv1126 only
|
||||
CSIPHY_MIPI_LVDS_MODEL,
|
||||
CSIPHY_LVDS_MODE,
|
||||
//rk3568 only
|
||||
CSIPHY_DUAL_CLK_EN,
|
||||
CSIPHY_CLK1_HS_SETTLE,
|
||||
CSIPHY_CLK1_CALIB_ENABLE
|
||||
};
|
||||
|
||||
enum mipi_dphy_ctl_type {
|
||||
@@ -328,7 +296,6 @@ enum mipi_dphy_ctl_type {
|
||||
|
||||
enum mipi_dphy_lane {
|
||||
MIPI_DPHY_LANE_CLOCK = 0,
|
||||
MIPI_DPHY_LANE_CLOCK1,
|
||||
MIPI_DPHY_LANE_DATA0,
|
||||
MIPI_DPHY_LANE_DATA1,
|
||||
MIPI_DPHY_LANE_DATA2,
|
||||
@@ -460,18 +427,6 @@ static const struct dphy_reg rv1126_grf_dphy1_regs[] = {
|
||||
[GRF_DPHY_SEL] = PHY_REG(RV1126_GRF_IOFUNC_CON3, 3, 9),
|
||||
};
|
||||
|
||||
static const struct dphy_reg rk3568_grf_dphy_regs[] = {
|
||||
[GRF_DPHY_CSIPHY_FORCERXMODE] = PHY_REG(RK3568_GRF_VI_CON0, 4, 0),
|
||||
[GRF_DPHY_CSIPHY_DATALANE_EN] = PHY_REG(RK3568_GRF_VI_CON0, 4, 4),
|
||||
[GRF_DPHY_CSIPHY_CLKLANE_EN] = PHY_REG(RK3568_GRF_VI_CON0, 1, 8),
|
||||
[GRF_DPHY_CLK_INV_SEL] = PHY_REG(RK3568_GRF_VI_CON0, 1, 9),
|
||||
[GRF_DPHY_CSIPHY_CLKLANE1_EN] = PHY_REG(RK3568_GRF_VI_CON0, 1, 10),
|
||||
[GRF_DPHY_CLK1_INV_SEL] = PHY_REG(RK3568_GRF_VI_CON0, 1, 11),
|
||||
[GRF_DPHY_ISP_CSIPHY_SEL] = PHY_REG(RK3568_GRF_VI_CON1, 1, 12),
|
||||
[GRF_DPHY_CIF_CSIPHY_SEL] = PHY_REG(RK3568_GRF_VI_CON1, 1, 11),
|
||||
[GRF_DPHY_CSIPHY_LANE_SEL] = PHY_REG(RK3568_GRF_VI_CON1, 1, 7),
|
||||
};
|
||||
|
||||
static const struct txrx_reg rk3288_txrx_regs[] = {
|
||||
[TXRX_PHY_TEST_CTRL0] = TXRX_REG(RK3288_PHY_TEST_CTRL0),
|
||||
[TXRX_PHY_TEST_CTRL1] = TXRX_REG(RK3288_PHY_TEST_CTRL1),
|
||||
@@ -490,11 +445,11 @@ static const struct csiphy_reg rk1808_csiphy_regs[] = {
|
||||
[CSIPHY_CTRL_LANE_ENABLE] = CSIPHY_REG(RK1808_CSI_DPHY_CTRL_LANE_ENABLE),
|
||||
[CSIPHY_CTRL_PWRCTL] = CSIPHY_REG(RK1808_CSI_DPHY_CTRL_PWRCTL),
|
||||
[CSIPHY_CTRL_DIG_RST] = CSIPHY_REG(RK1808_CSI_DPHY_CTRL_DIG_RST),
|
||||
[CSIPHY_CLK_HS_SETTLE] = CSIPHY_REG(RK1808_CSI_DPHY_CLK_WR_HS_SETTLE),
|
||||
[CSIPHY_LANE0_HS_SETTLE] = CSIPHY_REG(RK1808_CSI_DPHY_LANE0_WR_HS_SETTLE),
|
||||
[CSIPHY_LANE1_HS_SETTLE] = CSIPHY_REG(RK1808_CSI_DPHY_LANE1_WR_HS_SETTLE),
|
||||
[CSIPHY_LANE2_HS_SETTLE] = CSIPHY_REG(RK1808_CSI_DPHY_LANE2_WR_HS_SETTLE),
|
||||
[CSIPHY_LANE3_HS_SETTLE] = CSIPHY_REG(RK1808_CSI_DPHY_LANE3_WR_HS_SETTLE),
|
||||
[CSIPHY_CLK_THS_SETTLE] = CSIPHY_REG(RK1808_CSI_DPHY_CLK_WR_THS_SETTLE),
|
||||
[CSIPHY_LANE0_THS_SETTLE] = CSIPHY_REG(RK1808_CSI_DPHY_LANE0_WR_THS_SETTLE),
|
||||
[CSIPHY_LANE1_THS_SETTLE] = CSIPHY_REG(RK1808_CSI_DPHY_LANE1_WR_THS_SETTLE),
|
||||
[CSIPHY_LANE2_THS_SETTLE] = CSIPHY_REG(RK1808_CSI_DPHY_LANE2_WR_THS_SETTLE),
|
||||
[CSIPHY_LANE3_THS_SETTLE] = CSIPHY_REG(RK1808_CSI_DPHY_LANE3_WR_THS_SETTLE),
|
||||
[CSIPHY_CLK_CALIB_ENABLE] = CSIPHY_REG(RK1808_CSI_DPHY_CLK_CALIB_EN),
|
||||
[CSIPHY_LANE0_CALIB_ENABLE] = CSIPHY_REG(RK1808_CSI_DPHY_LANE0_CALIB_EN),
|
||||
[CSIPHY_LANE1_CALIB_ENABLE] = CSIPHY_REG(RK1808_CSI_DPHY_LANE1_CALIB_EN),
|
||||
@@ -506,11 +461,11 @@ static const struct csiphy_reg rk3326_csiphy_regs[] = {
|
||||
[CSIPHY_CTRL_LANE_ENABLE] = CSIPHY_REG(RK3326_CSI_DPHY_CTRL_LANE_ENABLE),
|
||||
[CSIPHY_CTRL_PWRCTL] = CSIPHY_REG(RK3326_CSI_DPHY_CTRL_PWRCTL),
|
||||
[CSIPHY_CTRL_DIG_RST] = CSIPHY_REG(RK3326_CSI_DPHY_CTRL_DIG_RST),
|
||||
[CSIPHY_CLK_HS_SETTLE] = CSIPHY_REG(RK3326_CSI_DPHY_CLK_WR_HS_SETTLE),
|
||||
[CSIPHY_LANE0_HS_SETTLE] = CSIPHY_REG(RK3326_CSI_DPHY_LANE0_WR_HS_SETTLE),
|
||||
[CSIPHY_LANE1_HS_SETTLE] = CSIPHY_REG(RK3326_CSI_DPHY_LANE1_WR_HS_SETTLE),
|
||||
[CSIPHY_LANE2_HS_SETTLE] = CSIPHY_REG(RK3326_CSI_DPHY_LANE2_WR_HS_SETTLE),
|
||||
[CSIPHY_LANE3_HS_SETTLE] = CSIPHY_REG(RK3326_CSI_DPHY_LANE3_WR_HS_SETTLE),
|
||||
[CSIPHY_CLK_THS_SETTLE] = CSIPHY_REG(RK3326_CSI_DPHY_CLK_WR_THS_SETTLE),
|
||||
[CSIPHY_LANE0_THS_SETTLE] = CSIPHY_REG(RK3326_CSI_DPHY_LANE0_WR_THS_SETTLE),
|
||||
[CSIPHY_LANE1_THS_SETTLE] = CSIPHY_REG(RK3326_CSI_DPHY_LANE1_WR_THS_SETTLE),
|
||||
[CSIPHY_LANE2_THS_SETTLE] = CSIPHY_REG(RK3326_CSI_DPHY_LANE2_WR_THS_SETTLE),
|
||||
[CSIPHY_LANE3_THS_SETTLE] = CSIPHY_REG(RK3326_CSI_DPHY_LANE3_WR_THS_SETTLE),
|
||||
[CSIPHY_CLK_CALIB_ENABLE] = CSIPHY_REG(RK3326_CSI_DPHY_CLK_CALIB_EN),
|
||||
[CSIPHY_LANE0_CALIB_ENABLE] = CSIPHY_REG(RK3326_CSI_DPHY_LANE0_CALIB_EN),
|
||||
[CSIPHY_LANE1_CALIB_ENABLE] = CSIPHY_REG(RK3326_CSI_DPHY_LANE1_CALIB_EN),
|
||||
@@ -522,11 +477,11 @@ static const struct csiphy_reg rk3368_csiphy_regs[] = {
|
||||
[CSIPHY_CTRL_LANE_ENABLE] = CSIPHY_REG(RK3368_CSI_DPHY_CTRL_LANE_ENABLE),
|
||||
[CSIPHY_CTRL_PWRCTL] = CSIPHY_REG(RK3368_CSI_DPHY_CTRL_PWRCTL),
|
||||
[CSIPHY_CTRL_DIG_RST] = CSIPHY_REG(RK3368_CSI_DPHY_CTRL_DIG_RST),
|
||||
[CSIPHY_CLK_HS_SETTLE] = CSIPHY_REG(RK3368_CSI_DPHY_CLK_WR_HS_SETTLE),
|
||||
[CSIPHY_LANE0_HS_SETTLE] = CSIPHY_REG(RK3368_CSI_DPHY_LANE0_WR_HS_SETTLE),
|
||||
[CSIPHY_LANE1_HS_SETTLE] = CSIPHY_REG(RK3368_CSI_DPHY_LANE1_WR_HS_SETTLE),
|
||||
[CSIPHY_LANE2_HS_SETTLE] = CSIPHY_REG(RK3368_CSI_DPHY_LANE2_WR_HS_SETTLE),
|
||||
[CSIPHY_LANE3_HS_SETTLE] = CSIPHY_REG(RK3368_CSI_DPHY_LANE3_WR_HS_SETTLE),
|
||||
[CSIPHY_CLK_THS_SETTLE] = CSIPHY_REG(RK3368_CSI_DPHY_CLK_WR_THS_SETTLE),
|
||||
[CSIPHY_LANE0_THS_SETTLE] = CSIPHY_REG(RK3368_CSI_DPHY_LANE0_WR_THS_SETTLE),
|
||||
[CSIPHY_LANE1_THS_SETTLE] = CSIPHY_REG(RK3368_CSI_DPHY_LANE1_WR_THS_SETTLE),
|
||||
[CSIPHY_LANE2_THS_SETTLE] = CSIPHY_REG(RK3368_CSI_DPHY_LANE2_WR_THS_SETTLE),
|
||||
[CSIPHY_LANE3_THS_SETTLE] = CSIPHY_REG(RK3368_CSI_DPHY_LANE3_WR_THS_SETTLE),
|
||||
[CSIPHY_CLK_CALIB_ENABLE] = CSIPHY_REG(RK3368_CSI_DPHY_CLK_CALIB_EN),
|
||||
[CSIPHY_LANE0_CALIB_ENABLE] = CSIPHY_REG(RK3368_CSI_DPHY_LANE0_CALIB_EN),
|
||||
[CSIPHY_LANE1_CALIB_ENABLE] = CSIPHY_REG(RK3368_CSI_DPHY_LANE1_CALIB_EN),
|
||||
@@ -538,11 +493,11 @@ static const struct csiphy_reg rv1126_csiphy_regs[] = {
|
||||
[CSIPHY_CTRL_LANE_ENABLE] = CSIPHY_REG(RV1126_CSI_DPHY_CTRL_LANE_ENABLE),
|
||||
[CSIPHY_CTRL_PWRCTL] = CSIPHY_REG(RV1126_CSI_DPHY_CTRL_PWRCTL),
|
||||
[CSIPHY_CTRL_DIG_RST] = CSIPHY_REG(RV1126_CSI_DPHY_CTRL_DIG_RST),
|
||||
[CSIPHY_CLK_HS_SETTLE] = CSIPHY_REG(RV1126_CSI_DPHY_CLK_WR_HS_SETTLE),
|
||||
[CSIPHY_LANE0_HS_SETTLE] = CSIPHY_REG(RV1126_CSI_DPHY_LANE0_WR_HS_SETTLE),
|
||||
[CSIPHY_LANE1_HS_SETTLE] = CSIPHY_REG(RV1126_CSI_DPHY_LANE1_WR_HS_SETTLE),
|
||||
[CSIPHY_LANE2_HS_SETTLE] = CSIPHY_REG(RV1126_CSI_DPHY_LANE2_WR_HS_SETTLE),
|
||||
[CSIPHY_LANE3_HS_SETTLE] = CSIPHY_REG(RV1126_CSI_DPHY_LANE3_WR_HS_SETTLE),
|
||||
[CSIPHY_CLK_THS_SETTLE] = CSIPHY_REG(RV1126_CSI_DPHY_CLK_WR_THS_SETTLE),
|
||||
[CSIPHY_LANE0_THS_SETTLE] = CSIPHY_REG(RV1126_CSI_DPHY_LANE0_WR_THS_SETTLE),
|
||||
[CSIPHY_LANE1_THS_SETTLE] = CSIPHY_REG(RV1126_CSI_DPHY_LANE1_WR_THS_SETTLE),
|
||||
[CSIPHY_LANE2_THS_SETTLE] = CSIPHY_REG(RV1126_CSI_DPHY_LANE2_WR_THS_SETTLE),
|
||||
[CSIPHY_LANE3_THS_SETTLE] = CSIPHY_REG(RV1126_CSI_DPHY_LANE3_WR_THS_SETTLE),
|
||||
[CSIPHY_CLK_CALIB_ENABLE] = CSIPHY_REG(RV1126_CSI_DPHY_CLK_CALIB_EN),
|
||||
[CSIPHY_LANE0_CALIB_ENABLE] = CSIPHY_REG(RV1126_CSI_DPHY_LANE0_CALIB_EN),
|
||||
[CSIPHY_LANE1_CALIB_ENABLE] = CSIPHY_REG(RV1126_CSI_DPHY_LANE1_CALIB_EN),
|
||||
@@ -552,25 +507,6 @@ static const struct csiphy_reg rv1126_csiphy_regs[] = {
|
||||
[CSIPHY_LVDS_MODE] = CSIPHY_REG(RV1126_CSI_DPHY_LVDS_MODE),
|
||||
};
|
||||
|
||||
static const struct csiphy_reg rk3568_csiphy_regs[] = {
|
||||
[CSIPHY_CTRL_LANE_ENABLE] = CSIPHY_REG(RV1126_CSI_DPHY_CTRL_LANE_ENABLE),
|
||||
[CSIPHY_CTRL_PWRCTL] = CSIPHY_REG(RV1126_CSI_DPHY_CTRL_PWRCTL),
|
||||
[CSIPHY_CTRL_DIG_RST] = CSIPHY_REG(RV1126_CSI_DPHY_CTRL_PWRCTL),
|
||||
[CSIPHY_DUAL_CLK_EN] = CSIPHY_REG(RK3568_CSI_DPHY_DUAL_CAL_EN),
|
||||
[CSIPHY_CLK_HS_SETTLE] = CSIPHY_REG(RV1126_CSI_DPHY_CLK_WR_HS_SETTLE),
|
||||
[CSIPHY_CLK_CALIB_ENABLE] = CSIPHY_REG(RV1126_CSI_DPHY_CLK_CALIB_EN),
|
||||
[CSIPHY_LANE0_HS_SETTLE] = CSIPHY_REG(RV1126_CSI_DPHY_LANE0_WR_HS_SETTLE),
|
||||
[CSIPHY_LANE0_CALIB_ENABLE] = CSIPHY_REG(RV1126_CSI_DPHY_LANE0_CALIB_EN),
|
||||
[CSIPHY_LANE1_HS_SETTLE] = CSIPHY_REG(RV1126_CSI_DPHY_LANE1_WR_HS_SETTLE),
|
||||
[CSIPHY_LANE1_CALIB_ENABLE] = CSIPHY_REG(RV1126_CSI_DPHY_LANE1_CALIB_EN),
|
||||
[CSIPHY_LANE2_HS_SETTLE] = CSIPHY_REG(RV1126_CSI_DPHY_LANE2_WR_HS_SETTLE),
|
||||
[CSIPHY_LANE2_CALIB_ENABLE] = CSIPHY_REG(RV1126_CSI_DPHY_LANE2_CALIB_EN),
|
||||
[CSIPHY_LANE3_HS_SETTLE] = CSIPHY_REG(RV1126_CSI_DPHY_LANE3_WR_HS_SETTLE),
|
||||
[CSIPHY_LANE3_CALIB_ENABLE] = CSIPHY_REG(RV1126_CSI_DPHY_LANE3_CALIB_EN),
|
||||
[CSIPHY_CLK1_HS_SETTLE] = CSIPHY_REG(RK3568_CSI_DPHY_CLK1_WR_HS_SETTLE),
|
||||
[CSIPHY_CLK1_CALIB_ENABLE] = CSIPHY_REG(RK3568_CSI_DPHY_CLK1_CALIB_EN),
|
||||
};
|
||||
|
||||
struct hsfreq_range {
|
||||
u32 range_h;
|
||||
u8 cfg_bit;
|
||||
@@ -587,7 +523,7 @@ struct dphy_drv_data {
|
||||
const struct txrx_reg *txrx_regs;
|
||||
const struct csiphy_reg *csiphy_regs;
|
||||
enum mipi_dphy_ctl_type ctl_type;
|
||||
int (*individual_init)(struct mipidphy_priv *priv);
|
||||
void (*individual_init)(struct mipidphy_priv *priv);
|
||||
enum mipi_dphy_chip_id chip_id;
|
||||
};
|
||||
|
||||
@@ -607,18 +543,6 @@ struct mipidphy_sensor {
|
||||
int lanes;
|
||||
};
|
||||
|
||||
enum mipidphy_lane_mode {
|
||||
LANE_MODE_UNDEF = 0x0,
|
||||
LANE_MODE_FULL = 0x1,
|
||||
LANE_MODE_SPLIT = 0x2,
|
||||
};
|
||||
|
||||
enum mipidphy_lane_sel {
|
||||
LANE_ALL = 0x0,
|
||||
LANE_TOP,
|
||||
LANE_BOT,
|
||||
};
|
||||
|
||||
struct mipidphy_priv {
|
||||
struct device *dev;
|
||||
struct regmap *regmap_grf;
|
||||
@@ -637,17 +561,11 @@ struct mipidphy_priv {
|
||||
int num_sensors;
|
||||
int phy_index;
|
||||
bool is_streaming;
|
||||
bool is_dual_clk;
|
||||
enum mipidphy_lane_mode lane_mode;
|
||||
enum mipidphy_lane_sel lane_sel;
|
||||
void __iomem *txrx_base_addr;
|
||||
int (*stream_on)(struct mipidphy_priv *priv, struct v4l2_subdev *sd);
|
||||
int (*stream_off)(struct mipidphy_priv *priv, struct v4l2_subdev *sd);
|
||||
};
|
||||
|
||||
static int mipi_stream_cnt;
|
||||
static enum mipidphy_lane_mode g_lane_mode = LANE_MODE_UNDEF;
|
||||
|
||||
static inline struct mipidphy_priv *to_dphy_priv(struct v4l2_subdev *subdev)
|
||||
{
|
||||
return container_of(subdev, struct mipidphy_priv, sd);
|
||||
@@ -742,22 +660,19 @@ static void csi_mipidphy_wr_ths_settle(struct mipidphy_priv *priv, int hsfreq,
|
||||
|
||||
switch (lane) {
|
||||
case MIPI_DPHY_LANE_CLOCK:
|
||||
offset = CSIPHY_CLK_HS_SETTLE;
|
||||
break;
|
||||
case MIPI_DPHY_LANE_CLOCK1:
|
||||
offset = CSIPHY_CLK1_HS_SETTLE;
|
||||
offset = CSIPHY_CLK_THS_SETTLE;
|
||||
break;
|
||||
case MIPI_DPHY_LANE_DATA0:
|
||||
offset = CSIPHY_LANE0_HS_SETTLE;
|
||||
offset = CSIPHY_LANE0_THS_SETTLE;
|
||||
break;
|
||||
case MIPI_DPHY_LANE_DATA1:
|
||||
offset = CSIPHY_LANE1_HS_SETTLE;
|
||||
offset = CSIPHY_LANE1_THS_SETTLE;
|
||||
break;
|
||||
case MIPI_DPHY_LANE_DATA2:
|
||||
offset = CSIPHY_LANE2_HS_SETTLE;
|
||||
offset = CSIPHY_LANE2_THS_SETTLE;
|
||||
break;
|
||||
case MIPI_DPHY_LANE_DATA3:
|
||||
offset = CSIPHY_LANE3_HS_SETTLE;
|
||||
offset = CSIPHY_LANE3_THS_SETTLE;
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
@@ -1144,20 +1059,17 @@ static const char * const rv1126_mipidphy_clks[] = {
|
||||
"pclk",
|
||||
};
|
||||
|
||||
static int default_mipidphy_individual_init(struct mipidphy_priv *priv)
|
||||
static void default_mipidphy_individual_init(struct mipidphy_priv *priv)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rk3368_mipidphy_individual_init(struct mipidphy_priv *priv)
|
||||
static void rk3368_mipidphy_individual_init(struct mipidphy_priv *priv)
|
||||
{
|
||||
/* isp select */
|
||||
write_grf_reg(priv, GRF_ISP_MIPI_CSI_HOST_SEL, 1);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rk3399_mipidphy_individual_init(struct mipidphy_priv *priv)
|
||||
static void rk3399_mipidphy_individual_init(struct mipidphy_priv *priv)
|
||||
{
|
||||
/*
|
||||
* According to the sequence of RK3399_TXRX_DPHY, the setting of isp0 mipi
|
||||
@@ -1168,11 +1080,9 @@ static int rk3399_mipidphy_individual_init(struct mipidphy_priv *priv)
|
||||
write_grf_reg(priv, GRF_DPHY_TX1RX1_BASEDIR, 0);
|
||||
|
||||
write_grf_reg(priv, GRF_DVP_V18SEL, 0x1);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rv1126_mipidphy_individual_init(struct mipidphy_priv *priv)
|
||||
static void rv1126_mipidphy_individual_init(struct mipidphy_priv *priv)
|
||||
{
|
||||
struct device *dev = priv->dev;
|
||||
struct device_node *parent = dev->of_node;
|
||||
@@ -1193,110 +1103,6 @@ static int rv1126_mipidphy_individual_init(struct mipidphy_priv *priv)
|
||||
of_node_put(remote);
|
||||
write_grf_reg(priv, GRF_DPHY_SEL, val | sel);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void mipidphy_config_dual_mode(struct mipidphy_priv *priv,
|
||||
struct mipidphy_sensor *sensor)
|
||||
{
|
||||
struct v4l2_subdev *sd = &priv->sd;
|
||||
bool is_cif = false;
|
||||
char *model;
|
||||
u32 val;
|
||||
|
||||
model = sd->v4l2_dev->mdev->model;
|
||||
if (!strncmp(model, "rkcif_mipi_lvds", sizeof("rkcif_mipi_lvds") - 1))
|
||||
is_cif = true;
|
||||
else
|
||||
is_cif = false;
|
||||
|
||||
if (priv->lane_mode == LANE_MODE_FULL) {
|
||||
val = ~RK3568_GRF_CSIPHY_LANE_SEL_SPLIT;
|
||||
write_grf_reg(priv, GRF_DPHY_CSIPHY_LANE_SEL, val);
|
||||
write_grf_reg(priv, GRF_DPHY_CSIPHY_DATALANE_EN,
|
||||
GENMASK(sensor->lanes - 1, 0));
|
||||
} else {
|
||||
val = RK3568_GRF_CSIPHY_LANE_SEL_SPLIT;
|
||||
write_grf_reg(priv, GRF_DPHY_CSIPHY_LANE_SEL, val);
|
||||
write_grf_reg(priv, GRF_DPHY_CSIPHY_DATALANE_EN,
|
||||
GENMASK(3, 0));
|
||||
if (priv->lane_sel == LANE_TOP) {
|
||||
write_grf_reg(priv, GRF_DPHY_CSIPHY_CLKLANE_EN, 0x1);
|
||||
if (is_cif)
|
||||
write_grf_reg(priv, GRF_DPHY_CIF_CSIPHY_SEL,
|
||||
RK3568_GRF_CSIPHY_SEL_SPLIT_0_1);
|
||||
else
|
||||
write_grf_reg(priv, GRF_DPHY_ISP_CSIPHY_SEL,
|
||||
RK3568_GRF_CSIPHY_SEL_SPLIT_0_1);
|
||||
}
|
||||
|
||||
if (priv->lane_sel == LANE_BOT) {
|
||||
write_grf_reg(priv, GRF_DPHY_CSIPHY_CLKLANE1_EN, 0x1);
|
||||
if (is_cif)
|
||||
write_grf_reg(priv, GRF_DPHY_CIF_CSIPHY_SEL,
|
||||
RK3568_GRF_CSIPHY_SEL_SPLIT_2_3);
|
||||
else
|
||||
write_grf_reg(priv, GRF_DPHY_ISP_CSIPHY_SEL,
|
||||
RK3568_GRF_CSIPHY_SEL_SPLIT_2_3);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static int rk3568_mipidphy_individual_init(struct mipidphy_priv *priv)
|
||||
{
|
||||
struct device_node *node = priv->dev->of_node;
|
||||
u32 mode = RK3568_DPHY_LANE_MODE_FULL;
|
||||
u32 arr[RK3568_DPHY_LANE_PARA_ARR_NUM];
|
||||
int i;
|
||||
|
||||
priv->grf_regs = rk3568_grf_dphy_regs;
|
||||
|
||||
if (!of_property_read_u32_array(node,
|
||||
OF_DPHY_LANE_MODE,
|
||||
arr,
|
||||
RK3568_DPHY_LANE_PARA_ARR_NUM)) {
|
||||
for (i = 0; i < RK3568_DPHY_LANE_PARA_ARR_NUM; i++) {
|
||||
if (i == 0) {
|
||||
if (arr[0] == RK3568_DPHY_LANE_MODE_SPLIT) {
|
||||
mode = RK3568_DPHY_LANE_MODE_SPLIT;
|
||||
priv->lane_mode = LANE_MODE_SPLIT;
|
||||
priv->is_dual_clk = true;
|
||||
} else {
|
||||
mode = RK3568_DPHY_LANE_MODE_FULL;
|
||||
priv->lane_mode = LANE_MODE_FULL;
|
||||
priv->is_dual_clk = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (i == 1) {
|
||||
if (arr[1] == RK3568_DPHY_LANE_SPLIT_BOT)
|
||||
priv->lane_sel = LANE_BOT;
|
||||
else
|
||||
priv->lane_sel = LANE_TOP;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
priv->is_dual_clk = false;
|
||||
priv->lane_mode = LANE_MODE_FULL;
|
||||
}
|
||||
|
||||
if (g_lane_mode == LANE_MODE_UNDEF) {
|
||||
g_lane_mode = priv->lane_mode;
|
||||
} else {
|
||||
if (g_lane_mode != priv->lane_mode) {
|
||||
v4l2_err(&priv->sd, "Err: dphy has been set as %s mode, set %s mode failed!\n",
|
||||
g_lane_mode == LANE_MODE_FULL ? "full" : "split",
|
||||
priv->lane_mode == LANE_MODE_FULL ? "full" : "split");
|
||||
return -ENODEV;
|
||||
}
|
||||
}
|
||||
|
||||
v4l2_info(&priv->sd, "%s mode:%s, lane_sel:%s\n", __func__,
|
||||
mode == RK3568_DPHY_LANE_MODE_FULL ? "full" : "split",
|
||||
priv->lane_sel == LANE_TOP ? "TOP" : "BOT");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int mipidphy_rx_stream_on(struct mipidphy_priv *priv,
|
||||
@@ -1518,7 +1324,7 @@ static int csi_mipidphy_stream_on(struct mipidphy_priv *priv,
|
||||
const struct hsfreq_range *hsfreq_ranges = drv_data->hsfreq_ranges;
|
||||
int num_hsfreq_ranges = drv_data->num_hsfreq_ranges;
|
||||
int i, hsfreq = 0;
|
||||
u32 val = 0, pre_val = 0;
|
||||
u32 val = 0;
|
||||
|
||||
write_grf_reg(priv, GRF_DVP_V18SEL, 0x1);
|
||||
|
||||
@@ -1526,19 +1332,9 @@ static int csi_mipidphy_stream_on(struct mipidphy_priv *priv,
|
||||
write_csiphy_reg(priv, CSIPHY_CTRL_PWRCTL, 0xe4);
|
||||
|
||||
/* set data lane num and enable clock lane */
|
||||
read_csiphy_reg(priv, CSIPHY_CTRL_LANE_ENABLE, &pre_val);
|
||||
val = (0x1 << MIPI_CSI_DPHY_CTRL_CLKLANE_ENABLE_OFFSET_BIT) | 0x1;
|
||||
if (priv->is_dual_clk) {
|
||||
if (priv->lane_sel == LANE_BOT)
|
||||
val |= RK3568_DPHY_LANE_SPLIT_LANE2_3;
|
||||
else
|
||||
val |= RK3568_DPHY_LANE_SPLIT_LANE0_1;
|
||||
} else {
|
||||
val |= (GENMASK(sensor->lanes - 1, 0) <<
|
||||
MIPI_CSI_DPHY_CTRL_DATALANE_ENABLE_OFFSET_BIT);
|
||||
}
|
||||
val |= pre_val;
|
||||
write_csiphy_reg(priv, CSIPHY_CTRL_LANE_ENABLE, val);
|
||||
write_csiphy_reg(priv, CSIPHY_CTRL_LANE_ENABLE,
|
||||
((GENMASK(sensor->lanes - 1, 0) << MIPI_CSI_DPHY_CTRL_DATALANE_ENABLE_OFFSET_BIT) |
|
||||
(0x1 << MIPI_CSI_DPHY_CTRL_CLKLANE_ENABLE_OFFSET_BIT) | 0x1));
|
||||
|
||||
/* Reset dphy analog part */
|
||||
write_csiphy_reg(priv, CSIPHY_CTRL_PWRCTL, 0xe0);
|
||||
@@ -1546,22 +1342,8 @@ static int csi_mipidphy_stream_on(struct mipidphy_priv *priv,
|
||||
|
||||
if (sensor->mbus.type == V4L2_MBUS_CSI2) {
|
||||
/* Reset dphy digital part */
|
||||
if (priv->drv_data->chip_id < CHIP_ID_RK3568) {
|
||||
write_csiphy_reg(priv, CSIPHY_CTRL_DIG_RST, 0x1e);
|
||||
write_csiphy_reg(priv, CSIPHY_CTRL_DIG_RST, 0x1f);
|
||||
} else {
|
||||
if (priv->lane_mode == LANE_MODE_SPLIT) {
|
||||
read_csiphy_reg(priv, CSIPHY_DUAL_CLK_EN, &val);
|
||||
if (!(val & RK3568_DPHY_LANE_DUAL_MODE_EN)) {
|
||||
write_csiphy_reg(priv, CSIPHY_DUAL_CLK_EN, 0x5e);
|
||||
write_csiphy_reg(priv, CSIPHY_DUAL_CLK_EN, 0x5f);
|
||||
}
|
||||
} else {
|
||||
write_csiphy_reg(priv, CSIPHY_DUAL_CLK_EN, 0x1e);
|
||||
write_csiphy_reg(priv, CSIPHY_DUAL_CLK_EN, 0x1f);
|
||||
}
|
||||
mipidphy_config_dual_mode(priv, sensor);
|
||||
}
|
||||
write_csiphy_reg(priv, CSIPHY_CTRL_DIG_RST, 0x1e);
|
||||
write_csiphy_reg(priv, CSIPHY_CTRL_DIG_RST, 0x1f);
|
||||
} else {
|
||||
/* Disable MIPI internal logical and switch to LVDS bank */
|
||||
write_csiphy_reg(priv, CSIPHY_CTRL_DIG_RST, 0x3e);
|
||||
@@ -1594,27 +1376,15 @@ static int csi_mipidphy_stream_on(struct mipidphy_priv *priv,
|
||||
|
||||
/* enable calibration */
|
||||
if (priv->data_rate_mbps > 1500) {
|
||||
if (!priv->is_dual_clk) {
|
||||
write_csiphy_reg(priv, CSIPHY_CLK_CALIB_ENABLE, 0x80);
|
||||
if (sensor->lanes > 0x00)
|
||||
write_csiphy_reg(priv, CSIPHY_LANE0_CALIB_ENABLE, 0x80);
|
||||
if (sensor->lanes > 0x01)
|
||||
write_csiphy_reg(priv, CSIPHY_LANE1_CALIB_ENABLE, 0x80);
|
||||
if (sensor->lanes > 0x02)
|
||||
write_csiphy_reg(priv, CSIPHY_LANE2_CALIB_ENABLE, 0x80);
|
||||
if (sensor->lanes > 0x03)
|
||||
write_csiphy_reg(priv, CSIPHY_LANE3_CALIB_ENABLE, 0x80);
|
||||
} else {
|
||||
if (priv->lane_sel == LANE_BOT) {
|
||||
write_csiphy_reg(priv, CSIPHY_CLK1_CALIB_ENABLE, 0x80);
|
||||
write_csiphy_reg(priv, CSIPHY_LANE2_CALIB_ENABLE, 0x80);
|
||||
write_csiphy_reg(priv, CSIPHY_LANE3_CALIB_ENABLE, 0x80);
|
||||
} else {
|
||||
write_csiphy_reg(priv, CSIPHY_CLK_CALIB_ENABLE, 0x80);
|
||||
write_csiphy_reg(priv, CSIPHY_LANE0_CALIB_ENABLE, 0x80);
|
||||
write_csiphy_reg(priv, CSIPHY_LANE1_CALIB_ENABLE, 0x80);
|
||||
}
|
||||
}
|
||||
write_csiphy_reg(priv, CSIPHY_CLK_CALIB_ENABLE, 0x80);
|
||||
if (sensor->lanes > 0x00)
|
||||
write_csiphy_reg(priv, CSIPHY_LANE0_CALIB_ENABLE, 0x80);
|
||||
if (sensor->lanes > 0x01)
|
||||
write_csiphy_reg(priv, CSIPHY_LANE1_CALIB_ENABLE, 0x80);
|
||||
if (sensor->lanes > 0x02)
|
||||
write_csiphy_reg(priv, CSIPHY_LANE2_CALIB_ENABLE, 0x80);
|
||||
if (sensor->lanes > 0x03)
|
||||
write_csiphy_reg(priv, CSIPHY_LANE3_CALIB_ENABLE, 0x80);
|
||||
}
|
||||
|
||||
/* set clock lane and data lane */
|
||||
@@ -1632,38 +1402,20 @@ static int csi_mipidphy_stream_on(struct mipidphy_priv *priv,
|
||||
hsfreq = hsfreq_ranges[i].cfg_bit;
|
||||
}
|
||||
|
||||
/* TODO: when run dual mode is it necessary to distinguish data rate ? */
|
||||
if (!priv->is_dual_clk) {
|
||||
csi_mipidphy_wr_ths_settle(priv, hsfreq, MIPI_DPHY_LANE_CLOCK);
|
||||
if (sensor->lanes > 0x00)
|
||||
csi_mipidphy_wr_ths_settle(priv, hsfreq, MIPI_DPHY_LANE_DATA0);
|
||||
if (sensor->lanes > 0x01)
|
||||
csi_mipidphy_wr_ths_settle(priv, hsfreq, MIPI_DPHY_LANE_DATA1);
|
||||
if (sensor->lanes > 0x02)
|
||||
csi_mipidphy_wr_ths_settle(priv, hsfreq, MIPI_DPHY_LANE_DATA2);
|
||||
if (sensor->lanes > 0x03)
|
||||
csi_mipidphy_wr_ths_settle(priv, hsfreq, MIPI_DPHY_LANE_DATA3);
|
||||
} else {
|
||||
if (priv->lane_sel == LANE_BOT) {
|
||||
csi_mipidphy_wr_ths_settle(priv, hsfreq, MIPI_DPHY_LANE_CLOCK1);
|
||||
csi_mipidphy_wr_ths_settle(priv, hsfreq, MIPI_DPHY_LANE_DATA2);
|
||||
csi_mipidphy_wr_ths_settle(priv, hsfreq, MIPI_DPHY_LANE_DATA3);
|
||||
} else {
|
||||
csi_mipidphy_wr_ths_settle(priv, hsfreq, MIPI_DPHY_LANE_CLOCK);
|
||||
csi_mipidphy_wr_ths_settle(priv, hsfreq, MIPI_DPHY_LANE_DATA0);
|
||||
csi_mipidphy_wr_ths_settle(priv, hsfreq, MIPI_DPHY_LANE_DATA1);
|
||||
}
|
||||
}
|
||||
|
||||
if (priv->drv_data->chip_id < CHIP_ID_RK3568) {
|
||||
write_grf_reg(priv, GRF_DPHY_CLK_INV_SEL, 0x1);
|
||||
write_grf_reg(priv, GRF_DPHY_CSIPHY_CLKLANE_EN, 0x1);
|
||||
write_grf_reg(priv, GRF_DPHY_CSIPHY_DATALANE_EN,
|
||||
GENMASK(sensor->lanes - 1, 0));
|
||||
}
|
||||
|
||||
mipi_stream_cnt++;
|
||||
csi_mipidphy_wr_ths_settle(priv, hsfreq, MIPI_DPHY_LANE_CLOCK);
|
||||
if (sensor->lanes > 0x00)
|
||||
csi_mipidphy_wr_ths_settle(priv, hsfreq, MIPI_DPHY_LANE_DATA0);
|
||||
if (sensor->lanes > 0x01)
|
||||
csi_mipidphy_wr_ths_settle(priv, hsfreq, MIPI_DPHY_LANE_DATA1);
|
||||
if (sensor->lanes > 0x02)
|
||||
csi_mipidphy_wr_ths_settle(priv, hsfreq, MIPI_DPHY_LANE_DATA2);
|
||||
if (sensor->lanes > 0x03)
|
||||
csi_mipidphy_wr_ths_settle(priv, hsfreq, MIPI_DPHY_LANE_DATA3);
|
||||
|
||||
write_grf_reg(priv, GRF_DPHY_CLK_INV_SEL, 0x1);
|
||||
write_grf_reg(priv, GRF_DPHY_CSIPHY_CLKLANE_EN, 0x1);
|
||||
write_grf_reg(priv, GRF_DPHY_CSIPHY_DATALANE_EN,
|
||||
GENMASK(sensor->lanes - 1, 0));
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1671,10 +1423,6 @@ static int csi_mipidphy_stream_off(struct mipidphy_priv *priv,
|
||||
struct v4l2_subdev *sd)
|
||||
{
|
||||
/* disable all lanes */
|
||||
mipi_stream_cnt--;
|
||||
if (mipi_stream_cnt != 0)
|
||||
return 0;
|
||||
|
||||
write_csiphy_reg(priv, CSIPHY_CTRL_LANE_ENABLE, 0x01);
|
||||
/* disable pll and ldo */
|
||||
write_csiphy_reg(priv, CSIPHY_CTRL_PWRCTL, 0xe3);
|
||||
@@ -1743,17 +1491,6 @@ static const struct dphy_drv_data rk3399_mipidphy_drv_data = {
|
||||
.chip_id = CHIP_ID_RK3399,
|
||||
};
|
||||
|
||||
static const struct dphy_drv_data rk3568_mipidphy_drv_data = {
|
||||
.clks = rv1126_mipidphy_clks,
|
||||
.num_clks = ARRAY_SIZE(rv1126_mipidphy_clks),
|
||||
.hsfreq_ranges = rk1808_rv1126_mipidphy_hsfreq_ranges,
|
||||
.num_hsfreq_ranges = ARRAY_SIZE(rk1808_rv1126_mipidphy_hsfreq_ranges),
|
||||
.csiphy_regs = rk3568_csiphy_regs,
|
||||
.ctl_type = MIPI_DPHY_CTL_CSI_HOST,
|
||||
.individual_init = rk3568_mipidphy_individual_init,
|
||||
.chip_id = CHIP_ID_RK3568,
|
||||
};
|
||||
|
||||
static const struct dphy_drv_data rv1126_mipidphy_drv_data = {
|
||||
.clks = rv1126_mipidphy_clks,
|
||||
.num_clks = ARRAY_SIZE(rv1126_mipidphy_clks),
|
||||
@@ -1786,10 +1523,6 @@ static const struct of_device_id rockchip_mipidphy_match_id[] = {
|
||||
.compatible = "rockchip,rk3399-mipi-dphy",
|
||||
.data = &rk3399_mipidphy_drv_data,
|
||||
},
|
||||
{
|
||||
.compatible = "rockchip,rk3568-csi-dphy",
|
||||
.data = &rk3568_mipidphy_drv_data,
|
||||
},
|
||||
{
|
||||
.compatible = "rockchip,rv1126-csi-dphy",
|
||||
.data = &rv1126_mipidphy_drv_data,
|
||||
@@ -1947,9 +1680,7 @@ static int rockchip_mipidphy_media_init(struct mipidphy_priv *priv)
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = v4l2_async_register_subdev(&priv->sd);
|
||||
|
||||
return ret;
|
||||
return v4l2_async_register_subdev(&priv->sd);
|
||||
}
|
||||
|
||||
static int rockchip_mipidphy_probe(struct platform_device *pdev)
|
||||
@@ -1995,7 +1726,6 @@ static int rockchip_mipidphy_probe(struct platform_device *pdev)
|
||||
dev_dbg(dev, "Failed to get %s\n", drv_data->clks[i]);
|
||||
}
|
||||
|
||||
priv->is_dual_clk = false;
|
||||
priv->grf_regs = drv_data->grf_regs;
|
||||
priv->txrx_regs = drv_data->txrx_regs;
|
||||
priv->csiphy_regs = drv_data->csiphy_regs;
|
||||
@@ -2003,16 +1733,6 @@ static int rockchip_mipidphy_probe(struct platform_device *pdev)
|
||||
if (drv_data->ctl_type == MIPI_DPHY_CTL_CSI_HOST) {
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
priv->csihost_base_addr = devm_ioremap_resource(dev, res);
|
||||
if (IS_ERR(priv->csihost_base_addr)) {
|
||||
resource_size_t offset = res->start;
|
||||
resource_size_t size = resource_size(res);
|
||||
|
||||
priv->csihost_base_addr = devm_ioremap(dev, offset, size);
|
||||
if (IS_ERR(priv->csihost_base_addr)) {
|
||||
dev_err(dev, "Can't find csihost_base_addr\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
}
|
||||
priv->stream_on = csi_mipidphy_stream_on;
|
||||
priv->stream_off = csi_mipidphy_stream_off;
|
||||
} else {
|
||||
@@ -2039,17 +1759,11 @@ static int rockchip_mipidphy_probe(struct platform_device *pdev)
|
||||
goto destroy_mutex;
|
||||
|
||||
pm_runtime_enable(&pdev->dev);
|
||||
if (drv_data->individual_init(priv) < 0)
|
||||
goto clean_entity;
|
||||
|
||||
drv_data->individual_init(priv);
|
||||
return 0;
|
||||
|
||||
clean_entity:
|
||||
media_entity_cleanup(&priv->sd.entity);
|
||||
|
||||
destroy_mutex:
|
||||
mutex_destroy(&priv->mutex);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user