Re: [PATCH v3 2/2] display/drm/bridge: TC358775 DSI/LVDS driver

2020-06-20 Thread Sam Ravnborg
Hi Vinay.

> +
> +static int tc_probe(struct i2c_client *client, const struct i2c_device_id 
> *id)
> +{
> + struct device *dev = >dev;
> + struct drm_panel *panel;
> + struct tc_data *tc;
> + int ret;
> +
> + tc = devm_kzalloc(dev, sizeof(*tc), GFP_KERNEL);
> + if (!tc)
> + return -ENOMEM;
> +
> + tc->dev = dev;
> + tc->i2c = client;
> +
> + ret = drm_of_find_panel_or_bridge(dev->of_node, TC358775_LVDS_OUT0,
> +   0, , NULL);
> + if (ret < 0)
> + return ret;
> + if (!panel)
> + return -ENODEV;
> +
> + panel->connector_type = DRM_MODE_CONNECTOR_LVDS;

The panel is responsible for specifying the connector_type.
It is wrong to let users of panel set it.

Fix the panel and not the bridge driver.


> +
> + tc->panel_bridge = devm_drm_panel_bridge_add(dev, panel);
> + if (IS_ERR(tc->panel_bridge))
> + return PTR_ERR(tc->panel_bridge);
> +
> + ret = tc358775_parse_dt(dev->of_node, tc);
> + if (ret)
> + return ret;
> +
> + tc->vddio = devm_regulator_get(dev, "vddio-supply");
> + if (IS_ERR(tc->vddio)) {
> + ret = PTR_ERR(tc->vddio);
> + dev_err(dev, "vddio-supply not found\n");
> + return ret;
> + }
> +
> + tc->vdd = devm_regulator_get(dev, "vdd-supply");
> + if (IS_ERR(tc->vdd)) {
> + ret = PTR_ERR(tc->vddio);
> + dev_err(dev, "vdd-supply not found\n");
> + return ret;
> + }
> +
> + tc->stby_gpio = devm_gpiod_get(dev, "stby", GPIOD_OUT_HIGH);
> + if (IS_ERR(tc->stby_gpio)) {
> + ret = PTR_ERR(tc->stby_gpio);
> + dev_err(dev, "cannot get stby-gpio %d\n", ret);
> + return ret;
> + }
> +
> + tc->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_HIGH);
> + if (IS_ERR(tc->reset_gpio)) {
> + ret = PTR_ERR(tc->reset_gpio);
> + dev_err(dev, "cannot get reset-gpios %d\n", ret);
> + return ret;
> + }
> +
> + tc->bridge.funcs = _bridge_funcs;
> + tc->bridge.of_node = dev->of_node;
> + drm_bridge_add(>bridge);
> +
> + i2c_set_clientdata(client, tc);
> +
> + return 0;
> +}
> +

Sam
___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


Re: [PATCH v3 2/2] display/drm/bridge: TC358775 DSI/LVDS driver

2020-06-19 Thread kernel test robot
Hi Vinay,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on linus/master]
[also build test WARNING on v5.8-rc1 next-20200618]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use  as documented in
https://git-scm.com/docs/git-format-patch]

url:
https://github.com/0day-ci/linux/commits/Vinay-Simha-BN/dt-binding-Add-DSI-LVDS-TC358775-bridge-bindings/20200618-202234
base:   https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git 
1b5044021070efa3259f3e9548dc35d1eb6aa844
config: nds32-randconfig-r002-20200619 (attached as .config)
compiler: nds32le-linux-gcc (GCC) 9.3.0
reproduce (this is a W=1 build):
wget 
https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O 
~/bin/make.cross
chmod +x ~/bin/make.cross
# save the attached .config to linux build tree
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross 
ARCH=nds32 

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot 

All warnings (new ones prefixed by >>, old ones prefixed by <<):

>> drivers/gpu/drm/bridge/tc358775.c:505:5: warning: no previous prototype for 
>> 'tc358775_parse_dt' [-Wmissing-prototypes]
505 | int tc358775_parse_dt(struct device_node *np, struct tc_data *tc)
| ^

vim +/tc358775_parse_dt +505 drivers/gpu/drm/bridge/tc358775.c

   504  
 > 505  int tc358775_parse_dt(struct device_node *np, struct tc_data *tc)
   506  {
   507  struct device_node *endpoint;
   508  struct device_node *parent;
   509  struct device_node *remote;
   510  struct property *prop;
   511  int len;
   512  
   513  endpoint = of_graph_get_endpoint_by_regs(tc->dev->of_node,
   514   TC358775_DSI_IN, -1);
   515  if (endpoint) {
   516  /* dsi0_out node */
   517  parent = of_graph_get_remote_port_parent(endpoint);
   518  of_node_put(endpoint);
   519  if (parent) {
   520  /* dsi0 port 1 */
   521  endpoint = 
of_graph_get_endpoint_by_regs(parent, 1, -1);
   522  of_node_put(parent);
   523  if (endpoint) {
   524  prop = of_find_property(endpoint, 
"data-lanes",
   525  );
   526  of_node_put(endpoint);
   527  if (!prop) {
   528  dev_err(tc->dev,
   529  "failed to find data 
lane\n");
   530  return -EPROBE_DEFER;
   531  }
   532  }
   533  }
   534  }
   535  
   536  tc->num_dsi_lanes = len / sizeof(u32);
   537  
   538  if (tc->num_dsi_lanes < 1 || tc->num_dsi_lanes > 4)
   539  return -EINVAL;
   540  
   541  tc->host_node = of_graph_get_remote_node(np, 0, 0);
   542  if (!tc->host_node)
   543  return -ENODEV;
   544  
   545  of_node_put(tc->host_node);
   546  
   547  endpoint = of_graph_get_endpoint_by_regs(tc->dev->of_node,
   548   TC358775_LVDS_OUT1, 
-1);
   549  if (endpoint) {
   550  remote = of_graph_get_remote_port_parent(endpoint);
   551  of_node_put(endpoint);
   552  
   553  if (remote) {
   554  if (of_device_is_available(remote))
   555  tc->dual_link = true;
   556  of_node_put(remote);
   557  }
   558  }
   559  
   560  dev_dbg(tc->dev, "no.of dsi lanes: %d\n", tc->num_dsi_lanes);
   561  dev_dbg(tc->dev, "operating in %s-link mode\n",
   562  tc->dual_link ? "dual" : "single");
   563  
   564  return 0;
   565  }
   566  

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-...@lists.01.org


.config.gz
Description: application/gzip
___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


Re: [PATCH v3 2/2] display/drm/bridge: TC358775 DSI/LVDS driver

2020-06-19 Thread kernel test robot
Hi Vinay,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on linus/master]
[also build test WARNING on v5.8-rc1 next-20200618]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use  as documented in
https://git-scm.com/docs/git-format-patch]

url:
https://github.com/0day-ci/linux/commits/Vinay-Simha-BN/dt-binding-Add-DSI-LVDS-TC358775-bridge-bindings/20200618-202234
base:   https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git 
1b5044021070efa3259f3e9548dc35d1eb6aa844
config: x86_64-randconfig-r034-20200619 (attached as .config)
compiler: clang version 11.0.0 (https://github.com/llvm/llvm-project 
487ca07fcc75d52755c9fe2ee05bcb3b6c44)
reproduce (this is a W=1 build):
wget 
https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O 
~/bin/make.cross
chmod +x ~/bin/make.cross
# install x86_64 cross compiling tool for clang build
# apt-get install binutils-x86-64-linux-gnu
# save the attached .config to linux build tree
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross ARCH=x86_64 

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot 

All warnings (new ones prefixed by >>, old ones prefixed by <<):

>> drivers/gpu/drm/bridge/tc358775.c:505:5: warning: no previous prototype for 
>> function 'tc358775_parse_dt' [-Wmissing-prototypes]
int tc358775_parse_dt(struct device_node *np, struct tc_data *tc)
^
drivers/gpu/drm/bridge/tc358775.c:505:1: note: declare 'static' if the function 
is not intended to be used outside of this translation unit
int tc358775_parse_dt(struct device_node *np, struct tc_data *tc)
^
static
>> drivers/gpu/drm/bridge/tc358775.c:523:8: warning: variable 'len' is used 
>> uninitialized whenever 'if' condition is false [-Wsometimes-uninitialized]
if (endpoint) {
^~~~
drivers/gpu/drm/bridge/tc358775.c:536:22: note: uninitialized use occurs here
tc->num_dsi_lanes = len / sizeof(u32);
^~~
drivers/gpu/drm/bridge/tc358775.c:523:4: note: remove the 'if' if its condition 
is always true
if (endpoint) {
^~
drivers/gpu/drm/bridge/tc358775.c:519:7: warning: variable 'len' is used 
uninitialized whenever 'if' condition is false [-Wsometimes-uninitialized]
if (parent) {
^~
drivers/gpu/drm/bridge/tc358775.c:536:22: note: uninitialized use occurs here
tc->num_dsi_lanes = len / sizeof(u32);
^~~
drivers/gpu/drm/bridge/tc358775.c:519:3: note: remove the 'if' if its condition 
is always true
if (parent) {
^~~~
drivers/gpu/drm/bridge/tc358775.c:515:6: warning: variable 'len' is used 
uninitialized whenever 'if' condition is false [-Wsometimes-uninitialized]
if (endpoint) {
^~~~
drivers/gpu/drm/bridge/tc358775.c:536:22: note: uninitialized use occurs here
tc->num_dsi_lanes = len / sizeof(u32);
^~~
drivers/gpu/drm/bridge/tc358775.c:515:2: note: remove the 'if' if its condition 
is always true
if (endpoint) {
^~
drivers/gpu/drm/bridge/tc358775.c:511:9: note: initialize the variable 'len' to 
silence this warning
int len;
^
= 0
4 warnings generated.

vim +/tc358775_parse_dt +505 drivers/gpu/drm/bridge/tc358775.c

   504  
 > 505  int tc358775_parse_dt(struct device_node *np, struct tc_data *tc)
   506  {
   507  struct device_node *endpoint;
   508  struct device_node *parent;
   509  struct device_node *remote;
   510  struct property *prop;
   511  int len;
   512  
   513  endpoint = of_graph_get_endpoint_by_regs(tc->dev->of_node,
   514   TC358775_DSI_IN, -1);
   515  if (endpoint) {
   516  /* dsi0_out node */
   517  parent = of_graph_get_remote_port_parent(endpoint);
   518  of_node_put(endpoint);
   519  if (parent) {
   520  /* dsi0 port 1 */
   521  endpoint = 
of_graph_get_endpoint_by_regs(parent, 1, -1);
   522  of_node_put(parent);
 > 523  if (endpoint) {
   524  prop = of_find_property(endpoint, 
"data-lanes",
   525  );
   526  of_node_put(endpoint);
   527  if (!prop) {
   528  dev_err(tc->dev,
   529  "failed to find data 
lane\n");
   530  return -EPROBE_DEFER;
   531  }
   532  }
   533  }
   534  }
   535  
   536  tc->num_dsi_lanes = len / sizeof(u32);
   537  
   538  if (tc->num_dsi_lanes < 1 || tc->num_dsi_lanes > 4)
   539  return -EINVAL;
   540  
   541  

[PATCH v3 2/2] display/drm/bridge: TC358775 DSI/LVDS driver

2020-06-19 Thread Vinay Simha BN
Signed-off-by: Vinay Simha BN 

---
v1:
 Initial version

v2:
* Andrzej Hajda review comments incorporated
  SPDX identifier
  development debug removed
  alphabetic order headers
  u32 instead of unit32_t
  magic numbers to macros for CLRSI and mux registers
  ignored return value

* Laurent Pinchart review comments incorporated
  mdelay to usleep_range
  bus_formats added

v3:
* Andrzej Hajda review comments incorporated
  drm_connector_status removed
  u32 rev removed and local variabl is used
  regulator enable disable with proper orders and delays
  as per the spec
  devm_drm_panel_bridge_add method used instead of panel
  description modified
  dual port implemented
---
 drivers/gpu/drm/bridge/Kconfig|  10 +
 drivers/gpu/drm/bridge/Makefile   |   1 +
 drivers/gpu/drm/bridge/tc358775.c | 725 ++
 3 files changed, 736 insertions(+)
 create mode 100644 drivers/gpu/drm/bridge/tc358775.c

diff --git a/drivers/gpu/drm/bridge/Kconfig b/drivers/gpu/drm/bridge/Kconfig
index 43271c21d3fc..084e9853944a 100644
--- a/drivers/gpu/drm/bridge/Kconfig
+++ b/drivers/gpu/drm/bridge/Kconfig
@@ -181,6 +181,16 @@ config DRM_TOSHIBA_TC358768
help
  Toshiba TC358768AXBG/TC358778XBG DSI bridge chip driver.
 
+config DRM_TOSHIBA_TC358775
+tristate "Toshiba TC358775 LVDS bridge"
+depends on OF
+select DRM_KMS_HELPER
+select REGMAP_I2C
+select DRM_PANEL
+   select DRM_MIPI_DSI
+---help---
+  Toshiba TC358775 LVDS bridge chip driver.
+
 config DRM_TI_TFP410
tristate "TI TFP410 DVI/HDMI bridge"
depends on OF
diff --git a/drivers/gpu/drm/bridge/Makefile b/drivers/gpu/drm/bridge/Makefile
index d63d4b7e4347..23c770b3bfe4 100644
--- a/drivers/gpu/drm/bridge/Makefile
+++ b/drivers/gpu/drm/bridge/Makefile
@@ -15,6 +15,7 @@ obj-$(CONFIG_DRM_THINE_THC63LVD1024) += thc63lvd1024.o
 obj-$(CONFIG_DRM_TOSHIBA_TC358764) += tc358764.o
 obj-$(CONFIG_DRM_TOSHIBA_TC358767) += tc358767.o
 obj-$(CONFIG_DRM_TOSHIBA_TC358768) += tc358768.o
+obj-$(CONFIG_DRM_TOSHIBA_TC358775) += tc358775.o
 obj-$(CONFIG_DRM_I2C_ADV7511) += adv7511/
 obj-$(CONFIG_DRM_TI_SN65DSI86) += ti-sn65dsi86.o
 obj-$(CONFIG_DRM_TI_TFP410) += ti-tfp410.o
diff --git a/drivers/gpu/drm/bridge/tc358775.c 
b/drivers/gpu/drm/bridge/tc358775.c
new file mode 100644
index ..87af3271b635
--- /dev/null
+++ b/drivers/gpu/drm/bridge/tc358775.c
@@ -0,0 +1,725 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * tc358775 DSI to LVDS bridge driver
+ *
+ * Copyright (C) 2020 SMART Wireless Computing
+ * Author: Vinay Simha BN 
+ *
+ */
+//#define DEBUG
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#define FLD_MASK(start, end)(((1 << ((start) - (end) + 1)) - 1) << (end))
+#define FLD_VAL(val, start, end) (((val) << (end)) & FLD_MASK(start, end))
+
+/* Registers */
+
+/* DSI D-PHY Layer Registers */
+#define D0W_DPHYCONTTX  0x0004  /* Data Lane 0 DPHY Tx Control */
+#define CLW_DPHYCONTRX  0x0020  /* Clock Lane DPHY Rx Control */
+#define D0W_DPHYCONTRX  0x0024  /* Data Lane 0 DPHY Rx Control */
+#define D1W_DPHYCONTRX  0x0028  /* Data Lane 1 DPHY Rx Control */
+#define D2W_DPHYCONTRX  0x002C  /* Data Lane 2 DPHY Rx Control */
+#define D3W_DPHYCONTRX  0x0030  /* Data Lane 3 DPHY Rx Control */
+#define COM_DPHYCONTRX  0x0038  /* DPHY Rx Common Control */
+#define CLW_CNTRL   0x0040  /* Clock Lane Control */
+#define D0W_CNTRL   0x0044  /* Data Lane 0 Control */
+#define D1W_CNTRL   0x0048  /* Data Lane 1 Control */
+#define D2W_CNTRL   0x004C  /* Data Lane 2 Control */
+#define D3W_CNTRL   0x0050  /* Data Lane 3 Control */
+#define DFTMODE_CNTRL   0x0054  /* DFT Mode Control */
+
+/* DSI PPI Layer Registers */
+#define PPI_STARTPPI0x0104  /* START control bit of PPI-TX function. */
+#define PPI_START_FUNCTION  1
+
+#define PPI_BUSYPPI 0x0108
+#define PPI_LINEINITCNT 0x0110  /* Line Initialization Wait Counter  */
+#define PPI_LPTXTIMECNT 0x0114
+#define PPI_LANEENABLE  0x0134  /* Enables each lane at the PPI layer. */
+#define PPI_TX_RX_TA0x013C  /* DSI Bus Turn Around timing parameters */
+
+/* Analog timer function enable */
+#define PPI_CLS_ATMR0x0140  /* Delay for Clock Lane in LPRX  */
+#define PPI_D0S_ATMR0x0144  /* Delay for Data Lane 0 in LPRX */
+#define PPI_D1S_ATMR0x0148  /* Delay for Data Lane 1 in LPRX */
+#define PPI_D2S_ATMR0x014C  /* Delay for Data Lane 2 in LPRX */
+#define PPI_D3S_ATMR0x0150  /* Delay for Data Lane 3 in LPRX */
+
+#define PPI_D0S_CLRSIPOCOUNT0x0164  /* For lane 0 */
+#define PPI_D1S_CLRSIPOCOUNT0x0168  /* For lane 1 */
+#define PPI_D2S_CLRSIPOCOUNT0x016C  /* For lane 2 */
+#define PPI_D3S_CLRSIPOCOUNT0x0170  /* For lane 3 */
+
+#define CLS_PRE 0x0180  /* Digital Counter inside of PHY IO */
+#define D0S_PRE 0x0184  /*