lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID:
 <DB7PR04MB4010B2B32D48F2288EF5C9FC9422A@DB7PR04MB4010.eurprd04.prod.outlook.com>
Date: Tue, 5 Aug 2025 02:23:54 +0000
From: Joseph Guo <qijian.guo@....com>
To: Ying Liu <victor.liu@....com>, Andrzej Hajda <andrzej.hajda@...el.com>,
	Neil Armstrong <neil.armstrong@...aro.org>, Robert Foss <rfoss@...nel.org>,
	Laurent Pinchart <laurent.pinchart@...asonboard.com>, Jonas Karlman
	<jonas@...boo.se>, Jernej Skrabec <jernej.skrabec@...il.com>, David Airlie
	<airlied@...il.com>, Simona Vetter <simona@...ll.ch>, Maarten Lankhorst
	<maarten.lankhorst@...ux.intel.com>, Maxime Ripard <mripard@...nel.org>,
	Thomas Zimmermann <tzimmermann@...e.de>, Rob Herring <robh@...nel.org>,
	Krzysztof Kozlowski <krzk+dt@...nel.org>, Conor Dooley <conor+dt@...nel.org>,
	Jessica Zhang <quic_jesszhan@...cinc.com>, Thierry Reding
	<thierry.reding@...il.com>, Sam Ravnborg <sam@...nborg.org>
CC: "dri-devel@...ts.freedesktop.org" <dri-devel@...ts.freedesktop.org>,
	"devicetree@...r.kernel.org" <devicetree@...r.kernel.org>,
	"linux-kernel@...r.kernel.org" <linux-kernel@...r.kernel.org>
Subject: RE: [PATCH v2 3/3] drm: bridge: Add waveshare DSI2DPI unit driver

Hi Ying

> -----Original Message-----
> From: Ying Liu <victor.liu@....com>
> Sent: Tuesday, August 5, 2025 10:22 AM
> To: Joseph Guo <qijian.guo@....com>; Andrzej Hajda
> <andrzej.hajda@...el.com>; Neil Armstrong <neil.armstrong@...aro.org>;
> Robert Foss <rfoss@...nel.org>; Laurent Pinchart
> <laurent.pinchart@...asonboard.com>; Jonas Karlman <jonas@...boo.se>;
> Jernej Skrabec <jernej.skrabec@...il.com>; David Airlie
> <airlied@...il.com>; Simona Vetter <simona@...ll.ch>; Maarten Lankhorst
> <maarten.lankhorst@...ux.intel.com>; Maxime Ripard
> <mripard@...nel.org>; Thomas Zimmermann <tzimmermann@...e.de>;
> Rob Herring <robh@...nel.org>; Krzysztof Kozlowski <krzk+dt@...nel.org>;
> Conor Dooley <conor+dt@...nel.org>; Jessica Zhang
> <quic_jesszhan@...cinc.com>; Thierry Reding <thierry.reding@...il.com>;
> Sam Ravnborg <sam@...nborg.org>
> Cc: dri-devel@...ts.freedesktop.org; devicetree@...r.kernel.org; linux-
> kernel@...r.kernel.org
> Subject: Re: [PATCH v2 3/3] drm: bridge: Add waveshare DSI2DPI unit driver
> 
> Hi Joseph,
> 
> On 08/04/2025, Joseph Guo wrote:
> > Waveshare touchscreen consists of a DPI panel and a driver board.
> > The waveshare driver board consists of ICN6211 and a MCU to convert
> > DSI to DPI and control the backlight.
> > This driver treats the MCU and ICN6211 board as a whole unit.
> > It can support all resolution waveshare DSI2DPI based panel, the
> > timing table should come from 'panel-dpi' panel in the device tree.
> >
> > Signed-off-by: Joseph Guo <qijian.guo@....com>
> 
> For next version, you may add:
> Suggested-by: Liu Ying <victor.liu@....com>
> 
> > ---
> >  drivers/gpu/drm/bridge/Kconfig         |  11 ++
> >  drivers/gpu/drm/bridge/Makefile        |   1 +
> >  drivers/gpu/drm/bridge/waveshare-dsi.c | 210
> > +++++++++++++++++++++++++++++++++
> >  3 files changed, 222 insertions(+)
> 
> This patch doesn't apply to drm-misc-next cleanly.  I see conflicts in Kconfig
> and Makefile.  It seems that you generate the patch series based on NXP
> down stream kernel instead of the upstream kernel.
> 
[Joseph] OK, I will generate the patch based on upstream kernel in next version instead.
> >
> > diff --git a/drivers/gpu/drm/bridge/Kconfig
> > b/drivers/gpu/drm/bridge/Kconfig index
> >
> cb3b797fcea1c73e83c9187fef6582296b340305..26fec25c61ed7d950c094e0224
> f1
> > 196946079485 100644
> > --- a/drivers/gpu/drm/bridge/Kconfig
> > +++ b/drivers/gpu/drm/bridge/Kconfig
> > @@ -472,4 +472,15 @@ config DRM_ITE_IT6161
> >  	help
> >  	  ITE IT6161 bridge chip driver.
> >
> > +config DRM_WAVESHARE_BRIDGE
> 
> Sort the config names alphabetically.
> 
> > +	tristate "Waveshare DSI bridge"
> 
> depends on BACKLIGHT_CLASS_DEVICE
> 
> > +	depends on OF
> > +	select DRM_PANEL_BRIDGE
> > +	select DRM_KMS_HELPER
> > +	select DRM_MIPI_DSI
> > +	select REGMAP_I2C
> > +	help
> > +	  Driver for waveshare DSI to DPI bridge board.
> > +	  Please say Y if you have such hardware
> > +
> >  endmenu
> > diff --git a/drivers/gpu/drm/bridge/Makefile
> > b/drivers/gpu/drm/bridge/Makefile index
> >
> d1db90688a150fdc3a5fd40acebe740798c452b0..3caa4d8f71675804328aa5a51
> ec6
> > 7b2587938621 100644
> > --- a/drivers/gpu/drm/bridge/Makefile
> > +++ b/drivers/gpu/drm/bridge/Makefile
> > @@ -48,3 +48,4 @@ obj-$(CONFIG_DRM_ITE_IT6263) += it6263.o
> >  obj-$(CONFIG_DRM_ITE_IT6161) += it6161.o
> >  obj-$(CONFIG_DRM_SEC_MIPI_DSIM) += sec-dsim.o
> >  obj-$(CONFIG_DRM_NXP_SEIKO_43WVFIG) += nxp-seiko-43wvfig.o
> > +obj-$(CONFIG_DRM_WAVESHARE_BRIDGE) += waveshare-dsi.o
> 
> Sort the config names alphabetically with the best effort.
> 
> > diff --git a/drivers/gpu/drm/bridge/waveshare-dsi.c
> > b/drivers/gpu/drm/bridge/waveshare-dsi.c
> > new file mode 100644
> > index
> >
> 0000000000000000000000000000000000000000..efb3a2fc501b5725b02f498625
> 26
> > d1704a3a4b7b
> > --- /dev/null
> > +++ b/drivers/gpu/drm/bridge/waveshare-dsi.c
> > @@ -0,0 +1,210 @@
> > +// SPDX-License-Identifier: GPL-2.0
> > +/*
> > + *  Copyright 2025 NXP
> 
> Nit: Drop a space between * and C.
> 
> > + * Based on panel-raspberrypi-touchscreen by Broadcom */
> > +
> > +#include <linux/backlight.h>
> > +#include <linux/err.h>
> > +#include <linux/i2c.h>
> > +#include <linux/module.h>
> > +#include <linux/of.h>
> > +#include <linux/of_graph.h>
> > +#include <linux/regmap.h>
> > +
> > +#include <drm/drm_atomic_helper.h>
> > +#include <drm/drm_bridge.h>
> > +#include <drm/drm_mipi_dsi.h>
> > +#include <drm/drm_of.h>
> > +#include <drm/drm_panel.h>
> > +#include <drm/drm_print.h>
> > +
> > +struct ws_bridge {
> > +	struct drm_bridge bridge;
> > +	struct drm_bridge *next_bridge;
> > +	struct backlight_device *backlight;
> > +	struct device *dev;
> > +	struct regmap *reg_map;
> > +};
> > +
> > +static const struct regmap_config ws_regmap_config = {
> > +	.reg_bits = 8,
> > +	.val_bits = 8,
> > +	.max_register = 0xff,
> > +	.disable_debugfs = true,
> 
> drivers/gpu/drm/bridge/waveshare-dsi.c:34:10: error: ‘const struct
> regmap_config’ has no member named ‘disable_debugfs’
>    34 |         .disable_debugfs = true,
>       |          ^~~~~~~~~~~~~~~
> 
> > +};
> > +
> > +static struct ws_bridge *bridge_to_ws_bridge(struct drm_bridge
> > +*bridge) {
> > +	return container_of(bridge, struct ws_bridge, bridge); }
> > +
> > +static int ws_bridge_attach_dsi(struct ws_bridge *ws) {
> > +	struct device_node *dsi_host_node;
> > +	struct mipi_dsi_host *host;
> > +	struct mipi_dsi_device *dsi;
> > +	const struct mipi_dsi_device_info info = {
> > +		.type = "ws-bridge",
> > +		.channel = 0,
> > +		.node = NULL,
> > +	};
> > +	struct device *dev = ws->dev;
> > +	int ret;
> 
> Nit: Sort these variables in reverse Christmas tree fashion.
> 
> > +
> > +	dsi_host_node = of_graph_get_remote_node(dev->of_node, 0, 0);
> > +	if (!dsi_host_node) {
> > +		dev_err(dev, "Failed to get remote port\n");
> > +		return -ENODEV;
> > +	}
> > +
> > +	host = of_find_mipi_dsi_host_by_node(dsi_host_node);
> > +
> 
> Nit: Drop this blank line.
> 
> > +	of_node_put(dsi_host_node);
> > +	if (!host)
> > +		return dev_err_probe(dev, -EPROBE_DEFER, "Failed to find
> > +dsi_host\n");
> > +
> > +	dsi = devm_mipi_dsi_device_register_full(dev, host, &info);
> > +
> 
> Ditto.
> 
> > +	if (IS_ERR(dsi))
> > +		return dev_err_probe(dev, PTR_ERR(dsi), "Failed to create
> dsi
> > +device\n");
> > +
> > +	dsi->mode_flags = MIPI_DSI_MODE_VIDEO_HSE |
> MIPI_DSI_MODE_VIDEO |
> > +			  MIPI_DSI_CLOCK_NON_CONTINUOUS;
> > +	dsi->format = MIPI_DSI_FMT_RGB888;
> > +	dsi->lanes = 2;
> > +
> > +	ret = devm_mipi_dsi_attach(dev, dsi);
> > +	if (ret < 0)
> > +		return dev_err_probe(dev, ret, "Failed to attach dsi to
> host\n");
> > +
> > +	return 0;
> > +}
> > +
> > +static int ws_bridge_bridge_attach(struct drm_bridge *bridge,
> > +				   enum drm_bridge_attach_flags flags)
> 
> drivers/gpu/drm/bridge/waveshare-dsi.c:117:19: error: initialization of ‘int
> (*)(struct drm_bridge *, struct drm_encoder *, enum
> drm_bridge_attach_flags)’ from incompatible pointer type ‘int (*)(struct
> drm_bridge *, enum drm_bridge_attach_flags)’ [-Werror=incompatible-
> pointer-types]
[Joseph] It seems all the build error and warning came from the different version of downstream and upstream. I will resolve them all in v3. Thank you.

Regards,
Joseph
>   117 |         .attach = ws_bridge_bridge_attach,
>       |                   ^~~~~~~~~~~~~~~~~~~~~~~
> 
> > +{
> > +	struct ws_bridge *ws = bridge_to_ws_bridge(bridge);
> > +	int ret;
> > +
> > +	ret = ws_bridge_attach_dsi(ws);
> > +	if (ret)
> > +		return ret;
> > +
> > +	return drm_bridge_attach(ws->bridge.encoder, ws->next_bridge,
> > +				 &ws->bridge, flags);
> > +}
> > +
> > +static void ws_bridge_bridge_enable(struct drm_bridge *bridge) {
> > +	struct ws_bridge *ws = bridge_to_ws_bridge(bridge);
> > +
> > +	regmap_write(ws->reg_map, 0xad, 0x01);
> > +	backlight_enable(ws->backlight);
> > +}
> > +
> > +static void ws_bridge_bridge_disable(struct drm_bridge *bridge) {
> > +	struct ws_bridge *ws = bridge_to_ws_bridge(bridge);
> > +
> > +	backlight_disable(ws->backlight);
> > +	regmap_write(ws->reg_map, 0xad, 0x00); }
> > +
> > +static const struct drm_bridge_funcs ws_bridge_bridge_funcs = {
> > +	.enable = ws_bridge_bridge_enable,
> > +	.disable = ws_bridge_bridge_disable,
> > +	.attach = ws_bridge_bridge_attach,
> > +};
> > +
> > +static int ws_bridge_bl_update_status(struct backlight_device *bl) {
> > +	struct ws_bridge *ws = bl_get_data(bl);
> > +
> > +	regmap_write(ws->reg_map, 0xab, 0xff -
> backlight_get_brightness(bl));
> > +	regmap_write(ws->reg_map, 0xaa, 0x01);
> > +
> > +	return 0;
> > +}
> > +
> > +static const struct backlight_ops ws_bridge_bl_ops = {
> > +	.update_status = ws_bridge_bl_update_status, };
> > +
> > +static struct backlight_device *ws_bridge_create_backlight(struct
> > +ws_bridge *ws) {
> > +	struct device *dev = ws->dev;
> > +	const struct backlight_properties props = {
> > +		.type = BACKLIGHT_RAW,
> > +		.brightness = 255,
> > +		.max_brightness = 255,
> > +	};
> 
> Nit: Sort these variables in reverse Christmas tree fashion.
> 
> > +
> > +	return devm_backlight_device_register(dev, dev_name(dev), dev,
> ws,
> > +					      &ws_bridge_bl_ops, &props); }
> > +
> > +static int ws_bridge_probe(struct i2c_client *i2c) {
> > +	struct device *dev = &i2c->dev;
> > +	struct ws_bridge *ws;
> > +	struct drm_panel *panel;
> > +	int ret;
> > +	struct backlight_device *backlight;
> 
> Ditto.
> 
> > +
> > +	ws = devm_kzalloc(dev, sizeof(*ws), GFP_KERNEL);
> 
> Recently upstream bridge drivers were changed to use
> devm_drm_bridge_alloc() to allocate the main structure which contains the
> DRM bridge member.
> devm_kzalloc() is no more allowed to be used.
> 
> > +	if (!ws)
> > +		return -ENOMEM;
> > +
> > +	ws->dev = dev;
> > +
> > +	ws->reg_map = devm_regmap_init_i2c(i2c, &ws_regmap_config);
> > +	if (IS_ERR(ws->reg_map))
> > +		return dev_err_probe(dev, PTR_ERR(ws->reg_map), "Failed
> to allocate
> > +regmap\n");
> > +
> > +	ret = drm_of_find_panel_or_bridge(dev->of_node, 1, -1, &panel,
> NULL);
> > +	if (ret)
> > +		return dev_err_probe(dev, ret, "Failed to find remote
> panel\n");
> > +
> > +	ws->next_bridge = devm_drm_panel_bridge_add(dev, panel);
> > +	if (IS_ERR(ws->next_bridge))
> > +		return PTR_ERR(ws->next_bridge);
> > +
> > +	ws->backlight = ws_bridge_create_backlight(ws);
> > +	if (IS_ERR(backlight)) {
> > +		ret = PTR_ERR(backlight);
> > +		dev_err(dev, "Failed to create backlight: %d\n", ret);
> > +		return ret;
> > +	}
> > +
> > +	regmap_write(ws->reg_map, 0xc0, 0x01);
> > +	regmap_write(ws->reg_map, 0xc2, 0x01);
> > +	regmap_write(ws->reg_map, 0xac, 0x01);
> > +
> > +	ws->bridge.funcs = &ws_bridge_bridge_funcs;
> > +	ws->bridge.type = DRM_MODE_CONNECTOR_DPI;
> > +	ws->bridge.of_node = dev->of_node;
> > +	devm_drm_bridge_add(dev, &ws->bridge);
> > +
> > +	return 0;
> > +}
> > +
> > +static const struct of_device_id ws_bridge_of_ids[] = {
> > +	{.compatible = "waveshare,dsi2dpi",},
> > +	{ }
> > +};
> > +
> > +MODULE_DEVICE_TABLE(of, ws_bridge_of_ids);
> > +
> > +static struct i2c_driver ws_bridge_driver = {
> > +	.driver = {
> > +		.name = "ws_dsi2dpi",
> > +		.of_match_table = ws_bridge_of_ids,
> > +	},
> > +	.probe = ws_bridge_probe,
> > +};
> > +module_i2c_driver(ws_bridge_driver);
> > +
> > +MODULE_AUTHOR("Joseph Guo <qijian.guo@....com>");
> > +MODULE_DESCRIPTION("Waveshare DSI2DPI bridge driver");
> > +MODULE_LICENSE("GPL");
> >
> 
> 
> --
> Regards,
> Liu Ying

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ