root/drivers/gpu/drm/tegra/mipi-phy.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. mipi_dphy_timing_get_default
  2. mipi_dphy_timing_validate

   1 // SPDX-License-Identifier: GPL-2.0-only
   2 /*
   3  * Copyright (C) 2013 NVIDIA Corporation
   4  */
   5 
   6 #include <linux/errno.h>
   7 #include <linux/kernel.h>
   8 
   9 #include "mipi-phy.h"
  10 
  11 /*
  12  * Default D-PHY timings based on MIPI D-PHY specification. Derived from the
  13  * valid ranges specified in Section 6.9, Table 14, Page 40 of the D-PHY
  14  * specification (v1.2) with minor adjustments.
  15  */
  16 int mipi_dphy_timing_get_default(struct mipi_dphy_timing *timing,
  17                                  unsigned long period)
  18 {
  19         timing->clkmiss = 0;
  20         timing->clkpost = 70 + 52 * period;
  21         timing->clkpre = 8;
  22         timing->clkprepare = 65;
  23         timing->clksettle = 95;
  24         timing->clktermen = 0;
  25         timing->clktrail = 80;
  26         timing->clkzero = 260;
  27         timing->dtermen = 0;
  28         timing->eot = 0;
  29         timing->hsexit = 120;
  30         timing->hsprepare = 65 + 5 * period;
  31         timing->hszero = 145 + 5 * period;
  32         timing->hssettle = 85 + 6 * period;
  33         timing->hsskip = 40;
  34 
  35         /*
  36          * The MIPI D-PHY specification (Section 6.9, v1.2, Table 14, Page 40)
  37          * contains this formula as:
  38          *
  39          *     T_HS-TRAIL = max(n * 8 * period, 60 + n * 4 * period)
  40          *
  41          * where n = 1 for forward-direction HS mode and n = 4 for reverse-
  42          * direction HS mode. There's only one setting and this function does
  43          * not parameterize on anything other that period, so this code will
  44          * assumes that reverse-direction HS mode is supported and uses n = 4.
  45          */
  46         timing->hstrail = max(4 * 8 * period, 60 + 4 * 4 * period);
  47 
  48         timing->init = 100000;
  49         timing->lpx = 60;
  50         timing->taget = 5 * timing->lpx;
  51         timing->tago = 4 * timing->lpx;
  52         timing->tasure = 2 * timing->lpx;
  53         timing->wakeup = 1000000;
  54 
  55         return 0;
  56 }
  57 
  58 /*
  59  * Validate D-PHY timing according to MIPI D-PHY specification (v1.2, Section
  60  * Section 6.9 "Global Operation Timing Parameters").
  61  */
  62 int mipi_dphy_timing_validate(struct mipi_dphy_timing *timing,
  63                               unsigned long period)
  64 {
  65         if (timing->clkmiss > 60)
  66                 return -EINVAL;
  67 
  68         if (timing->clkpost < (60 + 52 * period))
  69                 return -EINVAL;
  70 
  71         if (timing->clkpre < 8)
  72                 return -EINVAL;
  73 
  74         if (timing->clkprepare < 38 || timing->clkprepare > 95)
  75                 return -EINVAL;
  76 
  77         if (timing->clksettle < 95 || timing->clksettle > 300)
  78                 return -EINVAL;
  79 
  80         if (timing->clktermen > 38)
  81                 return -EINVAL;
  82 
  83         if (timing->clktrail < 60)
  84                 return -EINVAL;
  85 
  86         if (timing->clkprepare + timing->clkzero < 300)
  87                 return -EINVAL;
  88 
  89         if (timing->dtermen > 35 + 4 * period)
  90                 return -EINVAL;
  91 
  92         if (timing->eot > 105 + 12 * period)
  93                 return -EINVAL;
  94 
  95         if (timing->hsexit < 100)
  96                 return -EINVAL;
  97 
  98         if (timing->hsprepare < 40 + 4 * period ||
  99             timing->hsprepare > 85 + 6 * period)
 100                 return -EINVAL;
 101 
 102         if (timing->hsprepare + timing->hszero < 145 + 10 * period)
 103                 return -EINVAL;
 104 
 105         if ((timing->hssettle < 85 + 6 * period) ||
 106             (timing->hssettle > 145 + 10 * period))
 107                 return -EINVAL;
 108 
 109         if (timing->hsskip < 40 || timing->hsskip > 55 + 4 * period)
 110                 return -EINVAL;
 111 
 112         if (timing->hstrail < max(8 * period, 60 + 4 * period))
 113                 return -EINVAL;
 114 
 115         if (timing->init < 100000)
 116                 return -EINVAL;
 117 
 118         if (timing->lpx < 50)
 119                 return -EINVAL;
 120 
 121         if (timing->taget != 5 * timing->lpx)
 122                 return -EINVAL;
 123 
 124         if (timing->tago != 4 * timing->lpx)
 125                 return -EINVAL;
 126 
 127         if (timing->tasure < timing->lpx || timing->tasure > 2 * timing->lpx)
 128                 return -EINVAL;
 129 
 130         if (timing->wakeup < 1000000)
 131                 return -EINVAL;
 132 
 133         return 0;
 134 }

/* [<][>][^][v][top][bottom][index][help] */