1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Copyright (C) 2018 Cadence Design Systems Inc. 4*4882a593Smuzhiyun */ 5*4882a593Smuzhiyun 6*4882a593Smuzhiyun #ifndef __PHY_MIPI_DPHY_H_ 7*4882a593Smuzhiyun #define __PHY_MIPI_DPHY_H_ 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun /** 10*4882a593Smuzhiyun * struct phy_configure_opts_mipi_dphy - MIPI D-PHY configuration set 11*4882a593Smuzhiyun * 12*4882a593Smuzhiyun * This structure is used to represent the configuration state of a 13*4882a593Smuzhiyun * MIPI D-PHY phy. 14*4882a593Smuzhiyun */ 15*4882a593Smuzhiyun struct phy_configure_opts_mipi_dphy { 16*4882a593Smuzhiyun /** 17*4882a593Smuzhiyun * @clk_miss: 18*4882a593Smuzhiyun * 19*4882a593Smuzhiyun * Timeout, in picoseconds, for receiver to detect absence of 20*4882a593Smuzhiyun * Clock transitions and disable the Clock Lane HS-RX. 21*4882a593Smuzhiyun * 22*4882a593Smuzhiyun * Maximum value: 60000 ps 23*4882a593Smuzhiyun */ 24*4882a593Smuzhiyun unsigned int clk_miss; 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun /** 27*4882a593Smuzhiyun * @clk_post: 28*4882a593Smuzhiyun * 29*4882a593Smuzhiyun * Time, in picoseconds, that the transmitter continues to 30*4882a593Smuzhiyun * send HS clock after the last associated Data Lane has 31*4882a593Smuzhiyun * transitioned to LP Mode. Interval is defined as the period 32*4882a593Smuzhiyun * from the end of @hs_trail to the beginning of @clk_trail. 33*4882a593Smuzhiyun * 34*4882a593Smuzhiyun * Minimum value: 60000 ps + 52 * @hs_clk_rate period in ps 35*4882a593Smuzhiyun */ 36*4882a593Smuzhiyun unsigned int clk_post; 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun /** 39*4882a593Smuzhiyun * @clk_pre: 40*4882a593Smuzhiyun * 41*4882a593Smuzhiyun * Time, in UI, that the HS clock shall be driven by 42*4882a593Smuzhiyun * the transmitter prior to any associated Data Lane beginning 43*4882a593Smuzhiyun * the transition from LP to HS mode. 44*4882a593Smuzhiyun * 45*4882a593Smuzhiyun * Minimum value: 8 UI 46*4882a593Smuzhiyun */ 47*4882a593Smuzhiyun unsigned int clk_pre; 48*4882a593Smuzhiyun 49*4882a593Smuzhiyun /** 50*4882a593Smuzhiyun * @clk_prepare: 51*4882a593Smuzhiyun * 52*4882a593Smuzhiyun * Time, in picoseconds, that the transmitter drives the Clock 53*4882a593Smuzhiyun * Lane LP-00 Line state immediately before the HS-0 Line 54*4882a593Smuzhiyun * state starting the HS transmission. 55*4882a593Smuzhiyun * 56*4882a593Smuzhiyun * Minimum value: 38000 ps 57*4882a593Smuzhiyun * Maximum value: 95000 ps 58*4882a593Smuzhiyun */ 59*4882a593Smuzhiyun unsigned int clk_prepare; 60*4882a593Smuzhiyun 61*4882a593Smuzhiyun /** 62*4882a593Smuzhiyun * @clk_settle: 63*4882a593Smuzhiyun * 64*4882a593Smuzhiyun * Time interval, in picoseconds, during which the HS receiver 65*4882a593Smuzhiyun * should ignore any Clock Lane HS transitions, starting from 66*4882a593Smuzhiyun * the beginning of @clk_prepare. 67*4882a593Smuzhiyun * 68*4882a593Smuzhiyun * Minimum value: 95000 ps 69*4882a593Smuzhiyun * Maximum value: 300000 ps 70*4882a593Smuzhiyun */ 71*4882a593Smuzhiyun unsigned int clk_settle; 72*4882a593Smuzhiyun 73*4882a593Smuzhiyun /** 74*4882a593Smuzhiyun * @clk_term_en: 75*4882a593Smuzhiyun * 76*4882a593Smuzhiyun * Time, in picoseconds, for the Clock Lane receiver to enable 77*4882a593Smuzhiyun * the HS line termination. 78*4882a593Smuzhiyun * 79*4882a593Smuzhiyun * Maximum value: 38000 ps 80*4882a593Smuzhiyun */ 81*4882a593Smuzhiyun unsigned int clk_term_en; 82*4882a593Smuzhiyun 83*4882a593Smuzhiyun /** 84*4882a593Smuzhiyun * @clk_trail: 85*4882a593Smuzhiyun * 86*4882a593Smuzhiyun * Time, in picoseconds, that the transmitter drives the HS-0 87*4882a593Smuzhiyun * state after the last payload clock bit of a HS transmission 88*4882a593Smuzhiyun * burst. 89*4882a593Smuzhiyun * 90*4882a593Smuzhiyun * Minimum value: 60000 ps 91*4882a593Smuzhiyun */ 92*4882a593Smuzhiyun unsigned int clk_trail; 93*4882a593Smuzhiyun 94*4882a593Smuzhiyun /** 95*4882a593Smuzhiyun * @clk_zero: 96*4882a593Smuzhiyun * 97*4882a593Smuzhiyun * Time, in picoseconds, that the transmitter drives the HS-0 98*4882a593Smuzhiyun * state prior to starting the Clock. 99*4882a593Smuzhiyun */ 100*4882a593Smuzhiyun unsigned int clk_zero; 101*4882a593Smuzhiyun 102*4882a593Smuzhiyun /** 103*4882a593Smuzhiyun * @d_term_en: 104*4882a593Smuzhiyun * 105*4882a593Smuzhiyun * Time, in picoseconds, for the Data Lane receiver to enable 106*4882a593Smuzhiyun * the HS line termination. 107*4882a593Smuzhiyun * 108*4882a593Smuzhiyun * Maximum value: 35000 ps + 4 * @hs_clk_rate period in ps 109*4882a593Smuzhiyun */ 110*4882a593Smuzhiyun unsigned int d_term_en; 111*4882a593Smuzhiyun 112*4882a593Smuzhiyun /** 113*4882a593Smuzhiyun * @eot: 114*4882a593Smuzhiyun * 115*4882a593Smuzhiyun * Transmitted time interval, in picoseconds, from the start 116*4882a593Smuzhiyun * of @hs_trail or @clk_trail, to the start of the LP- 11 117*4882a593Smuzhiyun * state following a HS burst. 118*4882a593Smuzhiyun * 119*4882a593Smuzhiyun * Maximum value: 105000 ps + 12 * @hs_clk_rate period in ps 120*4882a593Smuzhiyun */ 121*4882a593Smuzhiyun unsigned int eot; 122*4882a593Smuzhiyun 123*4882a593Smuzhiyun /** 124*4882a593Smuzhiyun * @hs_exit: 125*4882a593Smuzhiyun * 126*4882a593Smuzhiyun * Time, in picoseconds, that the transmitter drives LP-11 127*4882a593Smuzhiyun * following a HS burst. 128*4882a593Smuzhiyun * 129*4882a593Smuzhiyun * Minimum value: 100000 ps 130*4882a593Smuzhiyun */ 131*4882a593Smuzhiyun unsigned int hs_exit; 132*4882a593Smuzhiyun 133*4882a593Smuzhiyun /** 134*4882a593Smuzhiyun * @hs_prepare: 135*4882a593Smuzhiyun * 136*4882a593Smuzhiyun * Time, in picoseconds, that the transmitter drives the Data 137*4882a593Smuzhiyun * Lane LP-00 Line state immediately before the HS-0 Line 138*4882a593Smuzhiyun * state starting the HS transmission. 139*4882a593Smuzhiyun * 140*4882a593Smuzhiyun * Minimum value: 40000 ps + 4 * @hs_clk_rate period in ps 141*4882a593Smuzhiyun * Maximum value: 85000 ps + 6 * @hs_clk_rate period in ps 142*4882a593Smuzhiyun */ 143*4882a593Smuzhiyun unsigned int hs_prepare; 144*4882a593Smuzhiyun 145*4882a593Smuzhiyun /** 146*4882a593Smuzhiyun * @hs_settle: 147*4882a593Smuzhiyun * 148*4882a593Smuzhiyun * Time interval, in picoseconds, during which the HS receiver 149*4882a593Smuzhiyun * shall ignore any Data Lane HS transitions, starting from 150*4882a593Smuzhiyun * the beginning of @hs_prepare. 151*4882a593Smuzhiyun * 152*4882a593Smuzhiyun * Minimum value: 85000 ps + 6 * @hs_clk_rate period in ps 153*4882a593Smuzhiyun * Maximum value: 145000 ps + 10 * @hs_clk_rate period in ps 154*4882a593Smuzhiyun */ 155*4882a593Smuzhiyun unsigned int hs_settle; 156*4882a593Smuzhiyun 157*4882a593Smuzhiyun /** 158*4882a593Smuzhiyun * @hs_skip: 159*4882a593Smuzhiyun * 160*4882a593Smuzhiyun * Time interval, in picoseconds, during which the HS-RX 161*4882a593Smuzhiyun * should ignore any transitions on the Data Lane, following a 162*4882a593Smuzhiyun * HS burst. The end point of the interval is defined as the 163*4882a593Smuzhiyun * beginning of the LP-11 state following the HS burst. 164*4882a593Smuzhiyun * 165*4882a593Smuzhiyun * Minimum value: 40000 ps 166*4882a593Smuzhiyun * Maximum value: 55000 ps + 4 * @hs_clk_rate period in ps 167*4882a593Smuzhiyun */ 168*4882a593Smuzhiyun unsigned int hs_skip; 169*4882a593Smuzhiyun 170*4882a593Smuzhiyun /** 171*4882a593Smuzhiyun * @hs_trail: 172*4882a593Smuzhiyun * 173*4882a593Smuzhiyun * Time, in picoseconds, that the transmitter drives the 174*4882a593Smuzhiyun * flipped differential state after last payload data bit of a 175*4882a593Smuzhiyun * HS transmission burst 176*4882a593Smuzhiyun * 177*4882a593Smuzhiyun * Minimum value: max(8 * @hs_clk_rate period in ps, 178*4882a593Smuzhiyun * 60000 ps + 4 * @hs_clk_rate period in ps) 179*4882a593Smuzhiyun */ 180*4882a593Smuzhiyun unsigned int hs_trail; 181*4882a593Smuzhiyun 182*4882a593Smuzhiyun /** 183*4882a593Smuzhiyun * @hs_zero: 184*4882a593Smuzhiyun * 185*4882a593Smuzhiyun * Time, in picoseconds, that the transmitter drives the HS-0 186*4882a593Smuzhiyun * state prior to transmitting the Sync sequence. 187*4882a593Smuzhiyun */ 188*4882a593Smuzhiyun unsigned int hs_zero; 189*4882a593Smuzhiyun 190*4882a593Smuzhiyun /** 191*4882a593Smuzhiyun * @init: 192*4882a593Smuzhiyun * 193*4882a593Smuzhiyun * Time, in microseconds for the initialization period to 194*4882a593Smuzhiyun * complete. 195*4882a593Smuzhiyun * 196*4882a593Smuzhiyun * Minimum value: 100 us 197*4882a593Smuzhiyun */ 198*4882a593Smuzhiyun unsigned int init; 199*4882a593Smuzhiyun 200*4882a593Smuzhiyun /** 201*4882a593Smuzhiyun * @lpx: 202*4882a593Smuzhiyun * 203*4882a593Smuzhiyun * Transmitted length, in picoseconds, of any Low-Power state 204*4882a593Smuzhiyun * period. 205*4882a593Smuzhiyun * 206*4882a593Smuzhiyun * Minimum value: 50000 ps 207*4882a593Smuzhiyun */ 208*4882a593Smuzhiyun unsigned int lpx; 209*4882a593Smuzhiyun 210*4882a593Smuzhiyun /** 211*4882a593Smuzhiyun * @ta_get: 212*4882a593Smuzhiyun * 213*4882a593Smuzhiyun * Time, in picoseconds, that the new transmitter drives the 214*4882a593Smuzhiyun * Bridge state (LP-00) after accepting control during a Link 215*4882a593Smuzhiyun * Turnaround. 216*4882a593Smuzhiyun * 217*4882a593Smuzhiyun * Value: 5 * @lpx 218*4882a593Smuzhiyun */ 219*4882a593Smuzhiyun unsigned int ta_get; 220*4882a593Smuzhiyun 221*4882a593Smuzhiyun /** 222*4882a593Smuzhiyun * @ta_go: 223*4882a593Smuzhiyun * 224*4882a593Smuzhiyun * Time, in picoseconds, that the transmitter drives the 225*4882a593Smuzhiyun * Bridge state (LP-00) before releasing control during a Link 226*4882a593Smuzhiyun * Turnaround. 227*4882a593Smuzhiyun * 228*4882a593Smuzhiyun * Value: 4 * @lpx 229*4882a593Smuzhiyun */ 230*4882a593Smuzhiyun unsigned int ta_go; 231*4882a593Smuzhiyun 232*4882a593Smuzhiyun /** 233*4882a593Smuzhiyun * @ta_sure: 234*4882a593Smuzhiyun * 235*4882a593Smuzhiyun * Time, in picoseconds, that the new transmitter waits after 236*4882a593Smuzhiyun * the LP-10 state before transmitting the Bridge state 237*4882a593Smuzhiyun * (LP-00) during a Link Turnaround. 238*4882a593Smuzhiyun * 239*4882a593Smuzhiyun * Minimum value: @lpx 240*4882a593Smuzhiyun * Maximum value: 2 * @lpx 241*4882a593Smuzhiyun */ 242*4882a593Smuzhiyun unsigned int ta_sure; 243*4882a593Smuzhiyun 244*4882a593Smuzhiyun /** 245*4882a593Smuzhiyun * @wakeup: 246*4882a593Smuzhiyun * 247*4882a593Smuzhiyun * Time, in microseconds, that a transmitter drives a Mark-1 248*4882a593Smuzhiyun * state prior to a Stop state in order to initiate an exit 249*4882a593Smuzhiyun * from ULPS. 250*4882a593Smuzhiyun * 251*4882a593Smuzhiyun * Minimum value: 1000 us 252*4882a593Smuzhiyun */ 253*4882a593Smuzhiyun unsigned int wakeup; 254*4882a593Smuzhiyun 255*4882a593Smuzhiyun /** 256*4882a593Smuzhiyun * @hs_clk_rate: 257*4882a593Smuzhiyun * 258*4882a593Smuzhiyun * Clock rate, in Hertz, of the high-speed clock. 259*4882a593Smuzhiyun */ 260*4882a593Smuzhiyun unsigned long hs_clk_rate; 261*4882a593Smuzhiyun 262*4882a593Smuzhiyun /** 263*4882a593Smuzhiyun * @lp_clk_rate: 264*4882a593Smuzhiyun * 265*4882a593Smuzhiyun * Clock rate, in Hertz, of the low-power clock. 266*4882a593Smuzhiyun */ 267*4882a593Smuzhiyun unsigned long lp_clk_rate; 268*4882a593Smuzhiyun 269*4882a593Smuzhiyun /** 270*4882a593Smuzhiyun * @lanes: 271*4882a593Smuzhiyun * 272*4882a593Smuzhiyun * Number of active, consecutive, data lanes, starting from 273*4882a593Smuzhiyun * lane 0, used for the transmissions. 274*4882a593Smuzhiyun */ 275*4882a593Smuzhiyun unsigned char lanes; 276*4882a593Smuzhiyun }; 277*4882a593Smuzhiyun 278*4882a593Smuzhiyun int phy_mipi_dphy_get_default_config(unsigned long pixel_clock, 279*4882a593Smuzhiyun unsigned int bpp, 280*4882a593Smuzhiyun unsigned int lanes, 281*4882a593Smuzhiyun struct phy_configure_opts_mipi_dphy *cfg); 282*4882a593Smuzhiyun int phy_mipi_dphy_config_validate(struct phy_configure_opts_mipi_dphy *cfg); 283*4882a593Smuzhiyun 284*4882a593Smuzhiyun #endif /* __PHY_MIPI_DPHY_H_ */ 285