diff options
Diffstat (limited to 'drivers/media/platform/rockchip/isp1/mipi_dphy_sy.c')
-rw-r--r-- | drivers/media/platform/rockchip/isp1/mipi_dphy_sy.c | 64 |
1 files changed, 45 insertions, 19 deletions
diff --git a/drivers/media/platform/rockchip/isp1/mipi_dphy_sy.c b/drivers/media/platform/rockchip/isp1/mipi_dphy_sy.c index 4baafc61fb5f..8b1e385dbcde 100644 --- a/drivers/media/platform/rockchip/isp1/mipi_dphy_sy.c +++ b/drivers/media/platform/rockchip/isp1/mipi_dphy_sy.c @@ -46,6 +46,10 @@ #include <media/v4l2-fwnode.h> #include <media/v4l2-subdev.h> +#include <linux/reset.h> + +#define BEHAVE_LIKE_MARVIN 1 + #define RK3288_GRF_SOC_CON6 0x025c #define RK3288_GRF_SOC_CON8 0x0264 #define RK3288_GRF_SOC_CON9 0x0268 @@ -86,8 +90,16 @@ /* * CSI HOST */ + +#if BEHAVE_LIKE_MARVIN +/* values acc. to RK3399 TRM and camsys_soc_rk3399.h */ +#define CSIHOST_PHY_TEST_CTRL0 0xb4 +#define CSIHOST_PHY_TEST_CTRL1 0xb8 +#else #define CSIHOST_PHY_TEST_CTRL0 0x30 #define CSIHOST_PHY_TEST_CTRL1 0x34 +#endif + #define CSIHOST_PHY_SHUTDOWNZ 0x08 #define CSIHOST_DPHY_RSTZ 0x0c @@ -338,6 +350,17 @@ static void mipidphy1_wr_reg(struct mipidphy_priv *priv, unsigned char addr, writel(PHY_TESTCLK, priv->txrx_base_addr + CSIHOST_PHY_TEST_CTRL0); } +static int mipidphy1_rd_reg(struct mipidphy_priv *priv, unsigned char addr) +{ + /*TESTEN =1,TESTDIN=addr*/ + writel((PHY_TESTEN_ADDR | addr), + priv->txrx_base_addr + CSIHOST_PHY_TEST_CTRL1); + /*TESTCLK=0*/ + writel(0x00, priv->txrx_base_addr + CSIHOST_PHY_TEST_CTRL0); + + return readl(priv->txrx_base_addr + CSIHOST_PHY_TEST_CTRL1) >> 8; +} + static void csi_mipidphy_wr_ths_settle(struct mipidphy_priv *priv, int hsfreq, enum mipi_dphy_lane lane) { @@ -595,6 +618,7 @@ static const char * const rk3399_mipidphy_clks[] = { "dphy-ref", "dphy-cfg", "grf", + "pclk", }; static int mipidphy_rx_stream_on(struct mipidphy_priv *priv, @@ -654,8 +678,6 @@ static int mipidphy_rx_stream_on(struct mipidphy_priv *priv, // Compare with camsys_soc_rk3399.c / camsys_rk3399_mipihpy_cfg() -#define BEHAVE_LIKE_MARVIN 1 - static int mipidphy_txrx_stream_on(struct mipidphy_priv *priv, struct v4l2_subdev *sd) { @@ -696,18 +718,10 @@ static int mipidphy_txrx_stream_on(struct mipidphy_priv *priv, printk("%s:%d: dphy start\n", __func__, __LINE__); writel(0, priv->txrx_base_addr + CSIHOST_PHY_SHUTDOWNZ); writel(0, priv->txrx_base_addr + CSIHOST_DPHY_RSTZ); -#if BEHAVE_LIKE_MARVIN -#define CAMSYS_DSIHOST_PHY_TEST_CTRL0 (0x00b4) - writel(PHY_TESTCLK, priv->txrx_base_addr + CAMSYS_DSIHOST_PHY_TEST_CTRL0); - writel(PHY_TESTCLR, priv->txrx_base_addr + CAMSYS_DSIHOST_PHY_TEST_CTRL0); - usleep_range(100, 150); - writel(PHY_TESTCLK, priv->txrx_base_addr + CAMSYS_DSIHOST_PHY_TEST_CTRL0); -#else writel(PHY_TESTCLK, priv->txrx_base_addr + CSIHOST_PHY_TEST_CTRL0); writel(PHY_TESTCLR, priv->txrx_base_addr + CSIHOST_PHY_TEST_CTRL0); usleep_range(100, 150); writel(PHY_TESTCLK, priv->txrx_base_addr + CSIHOST_PHY_TEST_CTRL0); -#endif usleep_range(100, 150); printk("%s:%d: dphy started\n", __func__, __LINE__); @@ -723,18 +737,19 @@ static int mipidphy_txrx_stream_on(struct mipidphy_priv *priv, THS_SETTLE_COUNTER_THRESHOLD); #if BEHAVE_LIKE_MARVIN -#define CAMSYS_DSIHOST_PHY_TEST_CTRL1 (0x00b8) - mipidphy1_wr_reg(priv, CAMSYS_DSIHOST_PHY_TEST_CTRL0, 0x00000002); - mipidphy1_wr_reg(priv, CAMSYS_DSIHOST_PHY_TEST_CTRL1, 0x00000000); + mipidphy1_rd_reg(priv, 0x75); + mipidphy1_wr_reg(priv, CSIHOST_PHY_TEST_CTRL0, 0x00000002); + mipidphy1_wr_reg(priv, CSIHOST_PHY_TEST_CTRL1, 0x00000000); mipidphy1_wr_reg(priv, CSIHOST_DPHY_RSTZ, 0x00000002); -#endif - +#else /* Normal operation */ mipidphy1_wr_reg(priv, 0x0, 0); +#endif return 0; } +// NOT CALLED FOR PEAFOWL static int csi_mipidphy_stream_on(struct mipidphy_priv *priv, struct v4l2_subdev *sd) { @@ -994,10 +1009,10 @@ static int rockchip_mipidphy_media_init(struct mipidphy_priv *priv) } static struct resource txrx_base_res = { - .start = 0xff968000, - .end = 0xff968000+0x8000, - .name = "txrx_base", - .flags = IORESOURCE_MEM, + .start = 0xff968000, + .end = 0xff968000+0x8000, + .name = "txrx_base", + .flags = IORESOURCE_MEM, }; static int rockchip_mipidphy_probe(struct platform_device *pdev) @@ -1010,6 +1025,7 @@ static int rockchip_mipidphy_probe(struct platform_device *pdev) const struct of_device_id *of_id; const struct dphy_drv_data *drv_data; int i, ret; + struct reset_control *rst; printk("%s:%d: called\n", __func__, __LINE__); @@ -1081,6 +1097,16 @@ static int rockchip_mipidphy_probe(struct platform_device *pdev) pm_runtime_enable(&pdev->dev); + + printk("%s:%d: deasserting reset\n", __func__, __LINE__); + rst = devm_reset_control_get(dev, "apb"); + if (IS_ERR(rst)) { + dev_err(dev, "failed to get reset control\n"); + return PTR_ERR(rst); + } + reset_control_deassert(rst); + udelay(10); + return 0; } |