[PATCH 01/14] drm: bridge: icn6211: Fix register layout
Jagan Teki
jagan at amarulasolutions.com
Fri Jan 14 08:16:30 UTC 2022
Hi Marek,
Thanks for the patches.
On Fri, Jan 14, 2022 at 9:18 AM Marek Vasut <marex at denx.de> wrote:
>
> The chip register layout has nothing to do with MIPI DCS, the registers
> incorrectly marked as MIPI DCS in the driver are regular chip registers
> often with completely different function.
>
> Fill in the actual register names and bits from [1] and [2] and add the
> entire register layout, since the documentation for this chip is hard to
> come by.
>
> [1] https://github.com/rockchip-linux/kernel/blob/develop-4.19/drivers/gpu/drm/bridge/icn6211.c
> [2] https://github.com/tdjastrzebski/ICN6211-Configurator
>
> Fixes: ce517f18944e3 ("drm: bridge: Add Chipone ICN6211 MIPI-DSI to RGB bridge")
> Signed-off-by: Marek Vasut <marex at denx.de>
> Cc: Jagan Teki <jagan at amarulasolutions.com>
> Cc: Robert Foss <robert.foss at linaro.org>
> Cc: Sam Ravnborg <sam at ravnborg.org>
> Cc: Thomas Zimmermann <tzimmermann at suse.de>
> To: dri-devel at lists.freedesktop.org
> ---
> drivers/gpu/drm/bridge/chipone-icn6211.c | 134 ++++++++++++++++++++---
> 1 file changed, 117 insertions(+), 17 deletions(-)
>
> diff --git a/drivers/gpu/drm/bridge/chipone-icn6211.c b/drivers/gpu/drm/bridge/chipone-icn6211.c
> index a6151db955868..eb26615b2993a 100644
> --- a/drivers/gpu/drm/bridge/chipone-icn6211.c
> +++ b/drivers/gpu/drm/bridge/chipone-icn6211.c
> @@ -14,8 +14,19 @@
> #include <linux/of_device.h>
> #include <linux/regulator/consumer.h>
>
> -#include <video/mipi_display.h>
> -
> +#define VENDOR_ID 0x00
> +#define DEVICE_ID_H 0x01
> +#define DEVICE_ID_L 0x02
> +#define VERSION_ID 0x03
> +#define FIRMWARE_VERSION 0x08
> +#define CONFIG_FINISH 0x09
> +#define PD_CTRL(n) (0x0a + ((n) & 0x3)) /* 0..3 */
> +#define RST_CTRL(n) (0x0e + ((n) & 0x1)) /* 0..1 */
> +#define SYS_CTRL(n) (0x10 + ((n) & 0x7)) /* 0..4 */
> +#define RGB_DRV(n) (0x18 + ((n) & 0x3)) /* 0..3 */
> +#define RGB_DLY(n) (0x1c + ((n) & 0x1)) /* 0..1 */
> +#define RGB_TEST_CTRL 0x1e
> +#define ATE_PLL_EN 0x1f
> #define HACTIVE_LI 0x20
> #define VACTIVE_LI 0x21
> #define VACTIVE_HACTIVE_HI 0x22
> @@ -26,6 +37,95 @@
> #define VFP 0x27
> #define VSYNC 0x28
> #define VBP 0x29
> +#define BIST_POL 0x2a
> +#define BIST_POL_BIST_MODE(n) (((n) & 0xf) << 4)
> +#define BIST_POL_BIST_GEN BIT(3)
> +#define BIST_POL_HSYNC_POL BIT(2)
> +#define BIST_POL_VSYNC_POL BIT(1)
> +#define BIST_POL_DE_POL BIT(0)
> +#define BIST_RED 0x2b
> +#define BIST_GREEN 0x2c
> +#define BIST_BLUE 0x2d
> +#define BIST_CHESS_X 0x2e
> +#define BIST_CHESS_Y 0x2f
> +#define BIST_CHESS_XY_H 0x30
> +#define BIST_FRAME_TIME_L 0x31
> +#define BIST_FRAME_TIME_H 0x32
> +#define FIFO_MAX_ADDR_LOW 0x33
> +#define SYNC_EVENT_DLY 0x34
> +#define HSW_MIN 0x35
> +#define HFP_MIN 0x36
> +#define LOGIC_RST_NUM 0x37
> +#define OSC_CTRL(n) (0x48 + ((n) & 0x7)) /* 0..5 */
> +#define BG_CTRL 0x4e
> +#define LDO_PLL 0x4f
> +#define PLL_CTRL(n) (0x50 + ((n) & 0xf)) /* 0..15 */
> +#define PLL_CTRL_6_EXTERNAL 0x90
> +#define PLL_CTRL_6_MIPI_CLK 0x92
> +#define PLL_CTRL_6_INTERNAL 0x93
> +#define PLL_REM(n) (0x60 + ((n) & 0x3)) /* 0..2 */
> +#define PLL_DIV(n) (0x63 + ((n) & 0x3)) /* 0..2 */
> +#define PLL_FRAC(n) (0x66 + ((n) & 0x3)) /* 0..2 */
> +#define PLL_INT(n) (0x69 + ((n) & 0x1)) /* 0..1 */
> +#define PLL_REF_DIV 0x6b
> +#define PLL_REF_DIV_P(n) ((n) & 0xf)
> +#define PLL_REF_DIV_Pe BIT(4)
> +#define PLL_REF_DIV_S(n) (((n) & 0x7) << 5)
> +#define PLL_SSC_P(n) (0x6c + ((n) & 0x3)) /* 0..2 */
> +#define PLL_SSC_STEP(n) (0x6f + ((n) & 0x3)) /* 0..2 */
> +#define PLL_SSC_OFFSET(n) (0x72 + ((n) & 0x3)) /* 0..3 */
> +#define GPIO_OEN 0x79
> +#define MIPI_CFG_PW 0x7a
> +#define MIPI_CFG_PW_CONFIG_DSI 0xc1
> +#define MIPI_CFG_PW_CONFIG_I2C 0x3e
> +#define GPIO_SEL(n) (0x7b + ((n) & 0x1)) /* 0..1 */
> +#define IRQ_SEL 0x7d
> +#define DBG_SEL 0x7e
> +#define DBG_SIGNAL 0x7f
> +#define MIPI_ERR_VECTOR_L 0x80
> +#define MIPI_ERR_VECTOR_H 0x81
> +#define MIPI_ERR_VECTOR_EN_L 0x82
> +#define MIPI_ERR_VECTOR_EN_H 0x83
> +#define MIPI_MAX_SIZE_L 0x84
> +#define MIPI_MAX_SIZE_H 0x85
> +#define DSI_CTRL 0x86
> +#define DSI_CTRL_UNKNOWN 0x28
> +#define DSI_CTRL_DSI_LANES(n) ((n) & 0x3)
> +#define MIPI_PN_SWAP 0x87
> +#define MIPI_PN_SWAP_CLK BIT(4)
> +#define MIPI_PN_SWAP_D(n) BIT((n) & 0x3)
> +#define MIPI_SOT_SYNC_BIT_(n) (0x88 + ((n) & 0x1)) /* 0..1 */
> +#define MIPI_ULPS_CTRL 0x8a
> +#define MIPI_CLK_CHK_VAR 0x8e
> +#define MIPI_CLK_CHK_INI 0x8f
> +#define MIPI_T_TERM_EN 0x90
> +#define MIPI_T_HS_SETTLE 0x91
> +#define MIPI_T_TA_SURE_PRE 0x92
> +#define MIPI_T_LPX_SET 0x94
> +#define MIPI_T_CLK_MISS 0x95
> +#define MIPI_INIT_TIME_L 0x96
> +#define MIPI_INIT_TIME_H 0x97
> +#define MIPI_T_CLK_TERM_EN 0x99
> +#define MIPI_T_CLK_SETTLE 0x9a
> +#define MIPI_TO_HS_RX_L 0x9e
> +#define MIPI_TO_HS_RX_H 0x9f
> +#define MIPI_PHY_(n) (0xa0 + ((n) & 0x7)) /* 0..5 */
> +#define MIPI_PD_RX 0xb0
> +#define MIPI_PD_TERM 0xb1
> +#define MIPI_PD_HSRX 0xb2
> +#define MIPI_PD_LPTX 0xb3
> +#define MIPI_PD_LPRX 0xb4
> +#define MIPI_PD_CK_LANE 0xb5
> +#define MIPI_FORCE_0 0xb6
> +#define MIPI_RST_CTRL 0xb7
> +#define MIPI_RST_NUM 0xb8
> +#define MIPI_DBG_SET_(n) (0xc0 + ((n) & 0xf)) /* 0..9 */
> +#define MIPI_DBG_SEL 0xe0
> +#define MIPI_DBG_DATA 0xe1
> +#define MIPI_ATE_TEST_SEL 0xe2
> +#define MIPI_ATE_STATUS_(n) (0xe3 + ((n) & 0x1)) /* 0..1 */
> +#define MIPI_ATE_STATUS_1 0xe4
> +#define ICN6211_MAX_REGISTER MIPI_ATE_STATUS(1)
>
> struct chipone {
> struct device *dev;
> @@ -66,13 +166,13 @@ static void chipone_enable(struct drm_bridge *bridge)
> struct chipone *icn = bridge_to_chipone(bridge);
> struct drm_display_mode *mode = bridge_to_mode(bridge);
>
> - ICN6211_DSI(icn, 0x7a, 0xc1);
> + ICN6211_DSI(icn, MIPI_CFG_PW, MIPI_CFG_PW_CONFIG_DSI);
>
> ICN6211_DSI(icn, HACTIVE_LI, mode->hdisplay & 0xff);
>
> ICN6211_DSI(icn, VACTIVE_LI, mode->vdisplay & 0xff);
>
> - /**
> + /*
> * lsb nibble: 2nd nibble of hdisplay
> * msb nibble: 2nd nibble of vdisplay
> */
> @@ -95,21 +195,21 @@ static void chipone_enable(struct drm_bridge *bridge)
> ICN6211_DSI(icn, VBP, mode->vtotal - mode->vsync_end);
>
> /* dsi specific sequence */
> - ICN6211_DSI(icn, MIPI_DCS_SET_TEAR_OFF, 0x80);
> - ICN6211_DSI(icn, MIPI_DCS_SET_ADDRESS_MODE, 0x28);
> - ICN6211_DSI(icn, 0xb5, 0xa0);
> - ICN6211_DSI(icn, 0x5c, 0xff);
> - ICN6211_DSI(icn, MIPI_DCS_SET_COLUMN_ADDRESS, 0x01);
> - ICN6211_DSI(icn, MIPI_DCS_GET_POWER_SAVE, 0x92);
> - ICN6211_DSI(icn, 0x6b, 0x71);
> - ICN6211_DSI(icn, 0x69, 0x2b);
> - ICN6211_DSI(icn, MIPI_DCS_ENTER_SLEEP_MODE, 0x40);
> - ICN6211_DSI(icn, MIPI_DCS_EXIT_SLEEP_MODE, 0x98);
> + ICN6211_DSI(icn, SYNC_EVENT_DLY, 0x80);
> + ICN6211_DSI(icn, HFP_MIN, 0x28);
> + ICN6211_DSI(icn, MIPI_PD_CK_LANE, 0xa0);
> + ICN6211_DSI(icn, PLL_CTRL(12), 0xff);
> + ICN6211_DSI(icn, BIST_POL, BIST_POL_DE_POL);
> + ICN6211_DSI(icn, PLL_CTRL(6), PLL_CTRL_6_MIPI_CLK);
> + ICN6211_DSI(icn, PLL_REF_DIV, 0x71);
> + ICN6211_DSI(icn, PLL_INT(0), 0x2b);
> + ICN6211_DSI(icn, SYS_CTRL(0), 0x40);
> + ICN6211_DSI(icn, SYS_CTRL(1), 0x98);
>
> /* icn6211 specific sequence */
> - ICN6211_DSI(icn, 0xb6, 0x20);
> - ICN6211_DSI(icn, 0x51, 0x20);
> - ICN6211_DSI(icn, 0x09, 0x10);
> + ICN6211_DSI(icn, MIPI_FORCE_0, 0x20);
> + ICN6211_DSI(icn, PLL_CTRL(1), 0x20);
> + ICN6211_DSI(icn, CONFIG_FINISH, 0x10);
All these fixes and few of features support are valid only for
I2C-based ICN6211. If possible please confirm with the vendor. The
driver I've written based on non-I2C-based ICN6211 chip, which is
present in BananaPi Panel.
Chip part: ICN6211 A59058 1634.
Not sure, may be we can have separated bridge driver for I2C-based
ICN6211 that I don't have in my design for testing.
Thanks,
Jagan.
More information about the dri-devel
mailing list