1// Copyright 2017 The Fuchsia Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#pragma once 6 7#include <ddk/device.h> 8#include <ddk/mmio-buffer.h> 9#include <ddk/protocol/platform-device.h> 10#include <zircon/listnode.h> 11#include <zircon/types.h> 12#include <threads.h> 13#include "edid.h" 14 15#define DW_DSI_READ32(a) readl(dsi->mmio.vaddr + a) 16#define DW_DSI_WRITE32(a, v) writel(v, dsi->mmio.vaddr + a) 17 18#define DW_DSI_MASK(start, count) (((1 << (count)) - 1) << (start)) 19 20#define DW_DSI_SET_BITS32(dest, value, count, start) \ 21 DW_DSI_WRITE32(dest, (DW_DSI_READ32(dest) & ~DW_DSI_MASK(start, count)) | \ 22 (((value) << (start)) & DW_DSI_MASK(start, count))) 23#define DW_DSI_SET_MASK(mask, start, count, value) \ 24 ((mask & ~DW_DSI_MASK(start, count)) | \ 25 (((value) << (start)) & DW_DSI_MASK(start, count))) 26 27#define DW_DSI_VERSION 0x0 /* contains the vers of the DSI host controller */ 28#define DW_DSI_PWR_UP 0x4 /* controls the power up of the core */ 29#define DW_DSI_CLKMGR_CFG 0x8 /* configs the factor for internal dividers */ 30#define DW_DSI_DPI_VCID 0xc /* configs the Virt Chan ID for DPI traffic */ 31#define DW_DSI_DPI_COLOR_CODING 0x10 /* configs DPI color coding */ 32#define DW_DSI_DPI_CFG_POL 0x14 /* configs the polarity of DPI signals */ 33#define DW_DSI_DPI_LP_CMD_TIM 0x18 /* configs the timing for lp cmds (in vid mode) */ 34#define DW_DSI_DBI_VCID 0x1c /* configs Virtual Channel ID for DBI traffic */ 35#define DW_DSI_DBI_CFG 0x20 /* configs the bit width of pixels for DBI */ 36#define DW_DSI_DBI_PARTITIONING_EN 0x24 /* host partition DBI traffic automatically */ 37#define DW_DSI_DBI_CMDSIZE 0x28 /* cmd size for auto partitioning of DBI */ 38#define DW_DSI_PCKHDL_CFG 0x2c /* how EoTp, BTA, CRC and ECC are to be used */ 39#define DW_DSI_GEN_VCID 0x30 /* Virtual Channel ID of READ responses to store */ 40#define DW_DSI_MODE_CFG 0x34 /* mode of op between Video or Command Mode */ 41#define DW_DSI_VID_MODE_CFG 0x38 /* Video mode operation config */ 42#define DW_DSI_VID_PKT_SIZE 0x3c /* video packet size */ 43#define DW_DSI_VID_NUM_CHUNKS 0x40 /* number of chunks to use */ 44#define DW_DSI_VID_NULL_SIZE 0x44 /* configs the size of null packets */ 45#define DW_DSI_VID_HSA_TIME 0x48 /* configs the video HSA time */ 46#define DW_DSI_VID_HBP_TIME 0x4c /* configs the video HBP time */ 47#define DW_DSI_VID_HLINE_TIME 0x50 /* configs the overall time for each video line */ 48#define DW_DSI_VID_VSA_LINES 0x54 /* configs the VSA period */ 49#define DW_DSI_VID_VBP_LINES 0x58 /* configs the VBP period */ 50#define DW_DSI_VID_VFP_LINES 0x5c /* configs the VFP period */ 51#define DW_DSI_VID_VACTIVE_LINES 0x60 /* configs the vertical resolution of video */ 52#define DW_DSI_EDPI_CMD_SIZE 0x64 /* configs the size of eDPI packets */ 53#define DW_DSI_CMD_MODE_CFG 0x68 /* command mode operation config */ 54#define DW_DSI_GEN_HDR 0x6c /* header for new packets */ 55#define DW_DSI_GEN_PLD_DATA 0x70 /* payload for packets sent using the Gen i/f */ 56#define DW_DSI_CMD_PKT_STATUS 0x74 /* info about FIFOs related to DBI and Gen i/f */ 57#define DW_DSI_TO_CNT_CFG 0x78 /* counters that trig timeout errors */ 58#define DW_DSI_HS_RD_TO_CNT 0x7c /* Peri Resp timeout after HS Rd operations */ 59#define DW_DSI_LP_RD_TO_CNT 0x80 /* Peri Resp timeout after LP Rd operations */ 60#define DW_DSI_HS_WR_TO_CNT 0x84 /* Peri Resp timeout after HS Wr operations */ 61#define DW_DSI_LP_WR_TO_CNT 0x88 /* Peri Resp timeout after LP Wr operations */ 62#define DW_DSI_BTA_TO_CNT 0x8c /* Peri Resp timeout after Bus Turnaround comp */ 63#define DW_DSI_SDF_3D 0x90 /* 3D cntrl info for VSS packets in video mode. */ 64#define DW_DSI_LPCLK_CTRL 0x94 /* non continuous clock in the clock lane. */ 65#define DW_DSI_PHY_TMR_LPCLK_CFG 0x98 /* time for the clock lane */ 66#define DW_DSI_PHY_TMR_CFG 0x9c /* time for the data lanes */ 67#define DW_DSI_PHY_RSTZ 0xa0 /* controls resets and the PLL of the D-PHY. */ 68#define DW_DSI_PHY_IF_CFG 0xa4 /* number of active lanes */ 69#define DW_DSI_PHY_ULPS_CTRL 0xa8 /* entering and leaving ULPS in the D- PHY. */ 70#define DW_DSI_PHY_TX_TRIGGERS 0xac /* pins that activate triggers in the D-PHY */ 71#define DW_DSI_PHY_STATUS 0xb0 /* contains info about the status of the D- PHY */ 72#define DW_DSI_PHY_TST_CTRL0 0xb4 /* controls clock and clear pins of the D-PHY */ 73#define DW_DSI_PHY_TST_CTRL1 0xb8 /* controls data and enable pins of the D-PHY */ 74#define DW_DSI_INT_ST0 0xbc /* status of intr from ack and D-PHY */ 75#define DW_DSI_INT_ST1 0xc0 /* status of intr related to timeout, ECC, etc */ 76#define DW_DSI_INT_MSK0 0xc4 /* masks interrupts that affect the INT_ST0 reg */ 77#define DW_DSI_INT_MSK1 0xc8 /* masks interrupts that affect the INT_ST1 reg */ 78#define DW_DSI_PHY_CAL 0xcc /* controls the skew calibration of D-PHY. */ 79#define DW_DSI_INT_FORCE0 0xd8 /* forces that affect the INT_ST0 register. */ 80#define DW_DSI_INT_FORCE1 0xdc /* forces interrupts that affect the INT_ST1 reg */ 81#define DW_DSI_DSC_PARAMETER 0xf0 /* configs Display Stream Compression */ 82#define DW_DSI_PHY_TMR_RD_CFG 0xf4 /* PHY related times for ops in lane byte clock */ 83#define DW_DSI_VID_SHADOW_CTRL 0x100 /* controls dpi shadow feature */ 84#define DW_DSI_DPI_VCID_ACT 0x10c /* val used for DPI_VCID. */ 85#define DW_DSI_DPI_COLOR_CODING_ACT 0x110 /* val used for DPI_COLOR_CODING. */ 86#define DW_DSI_DPI_LP_CMD_TIM_ACT 0x118 /* val used for DPI_LP_CMD_TIM. */ 87#define DW_DSI_VID_MODE_CFG_ACT 0x138 /* val used for VID_MODE_CFG.*/ 88#define DW_DSI_VID_PKT_SIZE_ACT 0x13c /* val used for VID_PKT_SIZE.*/ 89#define DW_DSI_VID_NUM_CHUNKS_ACT 0x140 /* val used for VID_NUM_CHUNKS.*/ 90#define DW_DSI_VID_NULL_SIZE_ACT 0x144 /* val used for VID_NULL_SIZE.*/ 91#define DW_DSI_VID_HSA_TIME_ACT 0x148 /* val used for VID_HSA_TIME.*/ 92#define DW_DSI_VID_HBP_TIME_ACT 0x14c /* val used for VID_HBP_TIME.*/ 93#define DW_DSI_VID_HLINE_TIME_ACT 0x150 /* val used for VID_HLINE_TIME.*/ 94#define DW_DSI_VID_VSA_LINES_ACT 0x154 /* val used for VID_VSA_LINES.*/ 95#define DW_DSI_VID_VBP_LINES_ACT 0x158 /* val used for VID_VBP_LINES.*/ 96#define DW_DSI_VID_VFP_LINES_ACT 0x15c /* val used for VID_VFP_LINES.*/ 97#define DW_DSI_VID_VACTIVE_LINES_ACT 0x160 /* val used for VID_VACTIVE_LINES.*/ 98#define DW_DSI_SDF_3D_ACT 0x190 /* val used for SDF_3D.*/ 99 100 101/* Bit DPI_CFG_POL Definitions */ 102#define DW_DSI_DPI_CFG_POL_DATAEN_START (0) 103#define DW_DSI_DPI_CFG_POL_VSYNC_START (1) 104#define DW_DSI_DPI_CFG_POL_HSYNC_START (2) 105#define DW_DSI_DPI_CFG_POL_SHUTD_START (3) 106#define DW_DSI_DPI_CFG_POL_COLORM_START (4) 107 108/* Bit VID_MODE_CFG Definitions */ 109#define DW_DSI_VID_MODE_CFG_LP_CMD_START (15) 110#define DW_DSI_VID_MODE_CFG_LP_CMD_BITS (1) 111#define DW_DSI_VID_MODE_CFG_FRAME_ACK_START (14) 112#define DW_DSI_VID_MODE_CFG_FRAME_ACK_BITS (1) 113#define DW_DSI_VID_MODE_CFG_LP_ALL_START (8) 114#define DW_DSI_VID_MODE_CFG_LP_ALL_BITS (6) 115#define DW_DSI_VID_MODE_CFG_LP_VSA (1 << 8) 116#define DW_DSI_VID_MODE_CFG_LP_VBP (1 << 9) 117#define DW_DSI_VID_MODE_CFG_LP_VFP (1 << 10) 118#define DW_DSI_VID_MODE_CFG_LP_VACT (1 << 11) 119#define DW_DSI_VID_MODE_CFG_LP_HBP (1 << 12) 120#define DW_DSI_VID_MODE_CFG_LP_HFP (1 << 13) 121#define DW_DSI_VID_MODE_CFG_ALL_LP (DW_DSI_VID_MODE_CFG_LP_VSA | \ 122 DW_DSI_VID_MODE_CFG_LP_VBP | \ 123 DW_DSI_VID_MODE_CFG_LP_VFP | \ 124 DW_DSI_VID_MODE_CFG_LP_VACT | \ 125 DW_DSI_VID_MODE_CFG_LP_HBP |\ 126 DW_DSI_VID_MODE_CFG_LP_HFP) 127#define DW_DSI_VID_MODE_CFG_MODE_START (0) 128#define DW_DSI_VID_MODE_CFG_MODE_BITS (2) 129 130/* Bit VID_PKT_SIZE Definitions */ 131#define DW_DSI_VID_PKT_SIZE_START 0 132#define DW_DSI_VID_PKT_SIZE_BITS 14 133 134/* Bit PHY_RSTZ Definitions */ 135#define DW_DSI_PHY_RSTZ_SHUTDOWN (0) 136#define DW_DSI_PHY_RSTZ_ENABLE (0x7) 137 138/* Bit HY_STATUS Definitions */ 139#define DW_DSI_PHY_STATUS_PHY_LOCKED (1 << 0) 140#define DW_DSI_PHY_STATUS_L0STOP (1 << 4) 141#define DW_DSI_PHY_STATUS_LxSTOP(x) (((x + 2) << 1) + 1) 142#define DW_DSI_PHY_STATUS_ALLSTOP (0xA90) 143#define DW_DSI_PHY_STATUS_ 144#define DW_DSI_PHY_TST_CTRL0_TSTCLK (1 << 1) 145#define DW_DSI_PHY_TST_CTRL0_TSTCLR (0 << 0) 146#define DW_DSI_PHY_TST_CTRL1_TESTEN (1 << 16) 147 148 149#define DS_NUM_LANES 4 150#define DSI_COLOR_CODE_24BITS 0x5 151#define DSI_CFG_POL_ACTIVE_HIGH 0 152#define DSI_CFG_POL_ACTIVE_LOW 1 153#define DSI_NON_BURST_SYNC_PULSES 0 154 155#define LANE_BYTE_CLOCK (108000000ULL) 156#define ROUND(x, y) ((x) / (y) + \ 157 ((x) % (y) * 10 / (y) >= 5 ? 1 : 0)) 158#define ROUND1(x, y) ((x) / (y) + ((x) % (y) ? 1 : 0)) 159 160typedef enum { 161 GPIO_MUX, 162 GPIO_PD, 163 GPIO_INT, 164 GPIO_COUNT, 165} hdmi_gpio_if_t; 166 167typedef struct { 168 zx_device_t* zdev; 169 i2c_protocol_t i2c_main; 170 i2c_protocol_t i2c_cec; 171 i2c_protocol_t i2c_edid; 172} adv7533_i2c_t; 173 174 175typedef struct { 176 zx_device_t* zxdev; 177 gpio_protocol_t gpios[GPIO_COUNT]; 178} hdmi_gpio_t; 179 180 181typedef struct { 182 zx_device_t* zxdev; 183 platform_device_protocol_t pdev; 184 zx_device_t* parent; 185 mmio_buffer_t mmio; 186 187 adv7533_i2c_t i2c_dev; // ADV7533 I2C device 188 hdmi_gpio_t hdmi_gpio; // ADV7533-related GPIOs 189 190 char write_buf[64]; // scratch buffer used for the i2c driver 191 192 detailed_timing_t* std_raw_dtd; 193 disp_timing_t* std_disp_timing; 194 detailed_timing_t* raw_dtd; 195 disp_timing_t* disp_timing; 196} dsi_t; 197 198static zx_status_t dsi_mipi_init(dsi_t* dsi); 199