mbox series

[v6,00/13] Add support for PinePhone LCD panel

Message ID 20200701103126.1512615-1-megous@megous.com
Headers show
Series Add support for PinePhone LCD panel | expand

Message

Ondřej Jirman July 1, 2020, 10:31 a.m. UTC
This patchset adds support for the LCD panel of PinePhone.

I've tested this on PinePhone 1.0 and 1.2.

Please take a look.

thank you and regards,
  Ondrej Jirman

Changes in v6:
- Fixed spacing in yaml
- Fixed wrong vccio->iovcc supply name in the bindings doc
- I noticed that the original driver uses a delay of 20ms in the init
  function to achieve a combined total of 120ms required from post-reset
  to display_on. I've added a similar delay to xbd599_init, so that
  xbd599 panel also has the right timing. (patch 9)
- v5->v6 diff: https://megous.com/dl/tmp/v5-v6.patch
- Added review/ack tags
- Learned to run dt_binding_check by myself ;)

Changes in v5:
- rewritten on top of rocktech-jh057n00900 driver
- rocktech-jh057n00900 renamed to st7703 (controller name)
- converted rocktech-jh057n00900 bindings to yaml and extended for xbd599

Changes in v4:
- use ->type from the mode instead of hardcoding (Samuel)
- move init_sequence to ->prepare (Samuel)
- move anti-flicker delay to ->enable, explain it (Samuel)
- add enter_sleep after display_off (Samuel)
- drop ->disable (move code to ->unprepare)
- add ID bytes dumping (Linus)
  (I can't test it since allwinner DSI driver has a broken
   dcs_read function, and I didn't manage to fix it.)
- document magic bytes (Linus)
- assert reset during powerup
- cleanup powerup timings according to the datasheet

Changes in v3:
- Panel driver renamed to the name of the LCD controller
- Re-organize the driver slightly to more easily support more panels
  based on the same controller.
- Add patch to enable the touchscreen to complete the LCD support
  on PinePhone.
- Dropped the "DSI fix" patch (the driver seems to work for me without it)
- Improved brightness levels handling:
  - PinePhone 1.0 uses default levels generated by the driver
  - On PinePhone 1.1 duty cycles < 20% lead to black screen, so
    default levels can't be used. Martijn Braam came up with a
    list of duty cycle values that lead to perception of linear
    brigtness level <-> light intensity on PinePhone 1.1
- There was some feedback on v2 about this being similar to st7701.
  It's only similar in name. Most of the "user commands" are different,
  so I opted to keep this in a new driver instead of creating st770x.
  
  Anyone who likes to check the differences, here are datasheets:

  - https://megous.com/dl/tmp/ST7703_DS_v01_20160128.pdf
  - https://megous.com/dl/tmp/ST7701.pdf

Changes in v2:
- DT Example fix.
- DT Format fix.
- Raised copyright info to 2020.
- Sort panel operation functions.
- Sort inclusion.


-- For phone owners: --

There's an open question on how to set the backlight brightness values
on post 1.0 revision phone, since lower duty cycles (< 10-20%) lead
to backlight being black. It would be nice if more people can test
the various backlight levels on 1.1 and 1.2 revision with this change
in dts:

       brightness-levels = <0 1000>;
       num-interpolated-steps = <1000>;

and report at what brightness level the backlight turns on. So far it
seems this has a wide range. Lowest useable duty cycle for me is ~7%
on 1.2 and for Martijn ~20% on 1.1.

Icenowy Zheng (2):
  dt-bindings: vendor-prefixes: Add Xingbangda
  arm64: dts: sun50i-a64-pinephone: Enable LCD support on PinePhone

Ondrej Jirman (11):
  dt-bindings: panel: Convert rocktech,jh057n00900 to yaml
  dt-bindings: panel: Add compatible for Xingbangda XBD599 panel
  drm/panel: rocktech-jh057n00900: Rename the driver to st7703
  drm/panel: st7703: Rename functions from jh057n prefix to st7703
  drm/panel: st7703: Prepare for supporting multiple panels
  drm/panel: st7703: Move code specific to jh057n closer together
  drm/panel: st7703: Move generic part of init sequence to enable
    callback
  drm/panel: st7703: Add support for Xingbangda XBD599
  drm/panel: st7703: Enter sleep after display off
  drm/panel: st7703: Assert reset prior to powering down the regulators
  arm64: dts: sun50i-a64-pinephone: Add touchscreen support

 .../display/panel/rocktech,jh057n00900.txt    |  23 -
 .../display/panel/rocktech,jh057n00900.yaml   |  70 ++
 .../devicetree/bindings/vendor-prefixes.yaml  |   2 +
 .../allwinner/sun50i-a64-pinephone-1.1.dts    |  19 +
 .../dts/allwinner/sun50i-a64-pinephone.dtsi   |  54 ++
 drivers/gpu/drm/panel/Kconfig                 |  26 +-
 drivers/gpu/drm/panel/Makefile                |   2 +-
 .../drm/panel/panel-rocktech-jh057n00900.c    | 424 -----------
 drivers/gpu/drm/panel/panel-sitronix-st7703.c | 656 ++++++++++++++++++
 9 files changed, 815 insertions(+), 461 deletions(-)
 delete mode 100644 Documentation/devicetree/bindings/display/panel/rocktech,jh057n00900.txt
 create mode 100644 Documentation/devicetree/bindings/display/panel/rocktech,jh057n00900.yaml
 delete mode 100644 drivers/gpu/drm/panel/panel-rocktech-jh057n00900.c
 create mode 100644 drivers/gpu/drm/panel/panel-sitronix-st7703.c

Comments

Icenowy Zheng July 1, 2020, 12:01 p.m. UTC | #1
于 2020年7月1日 GMT+08:00 下午6:31:26, Ondrej Jirman <megous@megous.com> 写到:
>Pinephone has a Goodix GT917S capacitive touchscreen controller on
>I2C0 bus. Add support for it.
>
>Signed-off-by: Ondrej Jirman <megous@megous.com>
>Acked-by: Linus Walleij <linus.walleij@linaro.org>
>---
> .../dts/allwinner/sun50i-a64-pinephone.dtsi   | 19 +++++++++++++++++++
> 1 file changed, 19 insertions(+)
>
>diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a64-pinephone.dtsi
>b/arch/arm64/boot/dts/allwinner/sun50i-a64-pinephone.dtsi
>index 85a7aa5efd32..2d5694446d17 100644
>--- a/arch/arm64/boot/dts/allwinner/sun50i-a64-pinephone.dtsi
>+++ b/arch/arm64/boot/dts/allwinner/sun50i-a64-pinephone.dtsi
>@@ -123,6 +123,25 @@ &ehci1 {
> 	status = "okay";
> };
> 
>+&i2c0 {
>+	pinctrl-names = "default";
>+	pinctrl-0 = <&i2c0_pins>;
>+	status = "okay";
>+
>+	touchscreen@5d {
>+		compatible = "goodix,gt917s", "goodix,gt911";

Please drop gt911 here. GT917S belong to the GT1x product line, not the same line with GT911.

You will see this in the driver.

>+		reg = <0x5d>;
>+		interrupt-parent = <&pio>;
>+		interrupts = <7 4 IRQ_TYPE_LEVEL_HIGH>; /* PH4 */
>+		irq-gpios = <&pio 7 4 GPIO_ACTIVE_HIGH>; /* PH4 */
>+		reset-gpios = <&pio 7 11 GPIO_ACTIVE_HIGH>; /* PH11 */
>+		AVDD28-supply = <&reg_ldo_io0>;
>+		VDDIO-supply = <&reg_ldo_io0>;
>+		touchscreen-size-x = <720>;
>+		touchscreen-size-y = <1440>;
>+	};
>+};
>+
> &i2c1 {
> 	status = "okay";
>
Sam Ravnborg July 1, 2020, 3:25 p.m. UTC | #2
Hi Ondrej.

On Wed, Jul 01, 2020 at 12:31:13PM +0200, Ondrej Jirman wrote:
> This patchset adds support for the LCD panel of PinePhone.
> 
> I've tested this on PinePhone 1.0 and 1.2.
> 
> Please take a look.
> 
> thank you and regards,
>   Ondrej Jirman
> 
> Changes in v6:
> - Fixed spacing in yaml
> - Fixed wrong vccio->iovcc supply name in the bindings doc
> - I noticed that the original driver uses a delay of 20ms in the init
>   function to achieve a combined total of 120ms required from post-reset
>   to display_on. I've added a similar delay to xbd599_init, so that
>   xbd599 panel also has the right timing. (patch 9)
> - v5->v6 diff: https://megous.com/dl/tmp/v5-v6.patch
> - Added review/ack tags
> - Learned to run dt_binding_check by myself ;)
The patch-set does not apply clean on top of drm-misc-next - due to
vrefresh removal.
Please re-spin.

	Sam
Guido Günther July 1, 2020, 3:54 p.m. UTC | #3
Hi,
On Wed, Jul 01, 2020 at 12:31:13PM +0200, Ondrej Jirman wrote:
> This patchset adds support for the LCD panel of PinePhone.

I gave this a quick spin on the Librem5 devkit so

Tested-by: Guido Günther <agx@sigxcpu.org>

but please also adjust MAINTAINERS so we stay in the loop on driver
changes.
Cheers,
 -- Guido

> 
> I've tested this on PinePhone 1.0 and 1.2.
> 
> Please take a look.
> 
> thank you and regards,
>   Ondrej Jirman
> 
> Changes in v6:
> - Fixed spacing in yaml
> - Fixed wrong vccio->iovcc supply name in the bindings doc
> - I noticed that the original driver uses a delay of 20ms in the init
>   function to achieve a combined total of 120ms required from post-reset
>   to display_on. I've added a similar delay to xbd599_init, so that
>   xbd599 panel also has the right timing. (patch 9)
> - v5->v6 diff: https://megous.com/dl/tmp/v5-v6.patch
> - Added review/ack tags
> - Learned to run dt_binding_check by myself ;)
> 
> Changes in v5:
> - rewritten on top of rocktech-jh057n00900 driver
> - rocktech-jh057n00900 renamed to st7703 (controller name)
> - converted rocktech-jh057n00900 bindings to yaml and extended for xbd599
> 
> Changes in v4:
> - use ->type from the mode instead of hardcoding (Samuel)
> - move init_sequence to ->prepare (Samuel)
> - move anti-flicker delay to ->enable, explain it (Samuel)
> - add enter_sleep after display_off (Samuel)
> - drop ->disable (move code to ->unprepare)
> - add ID bytes dumping (Linus)
>   (I can't test it since allwinner DSI driver has a broken
>    dcs_read function, and I didn't manage to fix it.)
> - document magic bytes (Linus)
> - assert reset during powerup
> - cleanup powerup timings according to the datasheet
> 
> Changes in v3:
> - Panel driver renamed to the name of the LCD controller
> - Re-organize the driver slightly to more easily support more panels
>   based on the same controller.
> - Add patch to enable the touchscreen to complete the LCD support
>   on PinePhone.
> - Dropped the "DSI fix" patch (the driver seems to work for me without it)
> - Improved brightness levels handling:
>   - PinePhone 1.0 uses default levels generated by the driver
>   - On PinePhone 1.1 duty cycles < 20% lead to black screen, so
>     default levels can't be used. Martijn Braam came up with a
>     list of duty cycle values that lead to perception of linear
>     brigtness level <-> light intensity on PinePhone 1.1
> - There was some feedback on v2 about this being similar to st7701.
>   It's only similar in name. Most of the "user commands" are different,
>   so I opted to keep this in a new driver instead of creating st770x.
>   
>   Anyone who likes to check the differences, here are datasheets:
> 
>   - https://megous.com/dl/tmp/ST7703_DS_v01_20160128.pdf
>   - https://megous.com/dl/tmp/ST7701.pdf
> 
> Changes in v2:
> - DT Example fix.
> - DT Format fix.
> - Raised copyright info to 2020.
> - Sort panel operation functions.
> - Sort inclusion.
> 
> 
> -- For phone owners: --
> 
> There's an open question on how to set the backlight brightness values
> on post 1.0 revision phone, since lower duty cycles (< 10-20%) lead
> to backlight being black. It would be nice if more people can test
> the various backlight levels on 1.1 and 1.2 revision with this change
> in dts:
> 
>        brightness-levels = <0 1000>;
>        num-interpolated-steps = <1000>;
> 
> and report at what brightness level the backlight turns on. So far it
> seems this has a wide range. Lowest useable duty cycle for me is ~7%
> on 1.2 and for Martijn ~20% on 1.1.
> 
> Icenowy Zheng (2):
>   dt-bindings: vendor-prefixes: Add Xingbangda
>   arm64: dts: sun50i-a64-pinephone: Enable LCD support on PinePhone
> 
> Ondrej Jirman (11):
>   dt-bindings: panel: Convert rocktech,jh057n00900 to yaml
>   dt-bindings: panel: Add compatible for Xingbangda XBD599 panel
>   drm/panel: rocktech-jh057n00900: Rename the driver to st7703
>   drm/panel: st7703: Rename functions from jh057n prefix to st7703
>   drm/panel: st7703: Prepare for supporting multiple panels
>   drm/panel: st7703: Move code specific to jh057n closer together
>   drm/panel: st7703: Move generic part of init sequence to enable
>     callback
>   drm/panel: st7703: Add support for Xingbangda XBD599
>   drm/panel: st7703: Enter sleep after display off
>   drm/panel: st7703: Assert reset prior to powering down the regulators
>   arm64: dts: sun50i-a64-pinephone: Add touchscreen support
> 
>  .../display/panel/rocktech,jh057n00900.txt    |  23 -
>  .../display/panel/rocktech,jh057n00900.yaml   |  70 ++
>  .../devicetree/bindings/vendor-prefixes.yaml  |   2 +
>  .../allwinner/sun50i-a64-pinephone-1.1.dts    |  19 +
>  .../dts/allwinner/sun50i-a64-pinephone.dtsi   |  54 ++
>  drivers/gpu/drm/panel/Kconfig                 |  26 +-
>  drivers/gpu/drm/panel/Makefile                |   2 +-
>  .../drm/panel/panel-rocktech-jh057n00900.c    | 424 -----------
>  drivers/gpu/drm/panel/panel-sitronix-st7703.c | 656 ++++++++++++++++++
>  9 files changed, 815 insertions(+), 461 deletions(-)
>  delete mode 100644 Documentation/devicetree/bindings/display/panel/rocktech,jh057n00900.txt
>  create mode 100644 Documentation/devicetree/bindings/display/panel/rocktech,jh057n00900.yaml
>  delete mode 100644 drivers/gpu/drm/panel/panel-rocktech-jh057n00900.c
>  create mode 100644 drivers/gpu/drm/panel/panel-sitronix-st7703.c
> 
> -- 
> 2.27.0
>
Guido Günther July 1, 2020, 4 p.m. UTC | #4
Hi,
On Wed, Jul 01, 2020 at 12:31:17PM +0200, Ondrej Jirman wrote:
> This rename is done so that the driver matches the name of the
> display controller and in preparation for adding support for more
> panels to the driver.
> 
> This is just a basic file rename, with no code changes.

Reviewed-by: Guido Günther <agx@sigxcpu.org> 
> 
> Signed-off-by: Ondrej Jirman <megous@megous.com>
> Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
> ---
>  drivers/gpu/drm/panel/Kconfig                 | 26 +++++++++----------
>  drivers/gpu/drm/panel/Makefile                |  2 +-
>  ...-jh057n00900.c => panel-sitronix-st7703.c} |  0
>  3 files changed, 14 insertions(+), 14 deletions(-)
>  rename drivers/gpu/drm/panel/{panel-rocktech-jh057n00900.c => panel-sitronix-st7703.c} (100%)
> 
> diff --git a/drivers/gpu/drm/panel/Kconfig b/drivers/gpu/drm/panel/Kconfig
> index 39055c1f0e2f..de2f2a452be5 100644
> --- a/drivers/gpu/drm/panel/Kconfig
> +++ b/drivers/gpu/drm/panel/Kconfig
> @@ -283,19 +283,6 @@ config DRM_PANEL_RAYDIUM_RM68200
>  	  Say Y here if you want to enable support for Raydium RM68200
>  	  720x1280 DSI video mode panel.
>  
> -config DRM_PANEL_ROCKTECH_JH057N00900
> -	tristate "Rocktech JH057N00900 MIPI touchscreen panel"
> -	depends on OF
> -	depends on DRM_MIPI_DSI
> -	depends on BACKLIGHT_CLASS_DEVICE
> -	help
> -	  Say Y here if you want to enable support for Rocktech JH057N00900
> -	  MIPI DSI panel as e.g. used in the Librem 5 devkit. It has a
> -	  resolution of 720x1440 pixels, a built in backlight and touch
> -	  controller.
> -	  Touch input support is provided by the goodix driver and needs to be
> -	  selected separately.
> -
>  config DRM_PANEL_RONBO_RB070D30
>  	tristate "Ronbo Electronics RB070D30 panel"
>  	depends on OF
> @@ -395,6 +382,19 @@ config DRM_PANEL_SITRONIX_ST7701
>  	  ST7701 controller for 480X864 LCD panels with MIPI/RGB/SPI
>  	  system interfaces.
>  
> +config DRM_PANEL_SITRONIX_ST7703
> +	tristate "Sitronix ST7703 based MIPI touchscreen panels"
> +	depends on OF
> +	depends on DRM_MIPI_DSI
> +	depends on BACKLIGHT_CLASS_DEVICE
> +	help
> +	  Say Y here if you want to enable support for Sitronix ST7703 based
> +	  panels, souch as Rocktech JH057N00900 MIPI DSI panel as e.g. used in
> +	  the Librem 5 devkit. It has a resolution of 720x1440 pixels, a built
> +	  in backlight and touch controller.
> +	  Touch input support is provided by the goodix driver and needs to be
> +	  selected separately.
> +
>  config DRM_PANEL_SITRONIX_ST7789V
>  	tristate "Sitronix ST7789V panel"
>  	depends on OF && SPI
> diff --git a/drivers/gpu/drm/panel/Makefile b/drivers/gpu/drm/panel/Makefile
> index de74f282c433..e45ceac6286f 100644
> --- a/drivers/gpu/drm/panel/Makefile
> +++ b/drivers/gpu/drm/panel/Makefile
> @@ -27,7 +27,6 @@ obj-$(CONFIG_DRM_PANEL_PANASONIC_VVX10F034N00) += panel-panasonic-vvx10f034n00.o
>  obj-$(CONFIG_DRM_PANEL_RASPBERRYPI_TOUCHSCREEN) += panel-raspberrypi-touchscreen.o
>  obj-$(CONFIG_DRM_PANEL_RAYDIUM_RM67191) += panel-raydium-rm67191.o
>  obj-$(CONFIG_DRM_PANEL_RAYDIUM_RM68200) += panel-raydium-rm68200.o
> -obj-$(CONFIG_DRM_PANEL_ROCKTECH_JH057N00900) += panel-rocktech-jh057n00900.o
>  obj-$(CONFIG_DRM_PANEL_RONBO_RB070D30) += panel-ronbo-rb070d30.o
>  obj-$(CONFIG_DRM_PANEL_SAMSUNG_LD9040) += panel-samsung-ld9040.o
>  obj-$(CONFIG_DRM_PANEL_SAMSUNG_S6D16D0) += panel-samsung-s6d16d0.o
> @@ -41,6 +40,7 @@ obj-$(CONFIG_DRM_PANEL_SHARP_LQ101R1SX01) += panel-sharp-lq101r1sx01.o
>  obj-$(CONFIG_DRM_PANEL_SHARP_LS037V7DW01) += panel-sharp-ls037v7dw01.o
>  obj-$(CONFIG_DRM_PANEL_SHARP_LS043T1LE01) += panel-sharp-ls043t1le01.o
>  obj-$(CONFIG_DRM_PANEL_SITRONIX_ST7701) += panel-sitronix-st7701.o
> +obj-$(CONFIG_DRM_PANEL_SITRONIX_ST7703) += panel-sitronix-st7703.o
>  obj-$(CONFIG_DRM_PANEL_SITRONIX_ST7789V) += panel-sitronix-st7789v.o
>  obj-$(CONFIG_DRM_PANEL_SONY_ACX424AKP) += panel-sony-acx424akp.o
>  obj-$(CONFIG_DRM_PANEL_SONY_ACX565AKM) += panel-sony-acx565akm.o
> diff --git a/drivers/gpu/drm/panel/panel-rocktech-jh057n00900.c b/drivers/gpu/drm/panel/panel-sitronix-st7703.c
> similarity index 100%
> rename from drivers/gpu/drm/panel/panel-rocktech-jh057n00900.c
> rename to drivers/gpu/drm/panel/panel-sitronix-st7703.c
> -- 
> 2.27.0
>
Guido Günther July 1, 2020, 4:01 p.m. UTC | #5
Hi,
On Wed, Jul 01, 2020 at 12:31:18PM +0200, Ondrej Jirman wrote:
> This is done so that code that's not specific to a particular
> jh057n panel is named after the controller. Functions specific
> to the panel are kept named after the panel.

Reviewed-by: Guido Günther <agx@sigxcpu.org> 

> 
> Signed-off-by: Ondrej Jirman <megous@megous.com>
> Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
> ---
>  drivers/gpu/drm/panel/panel-sitronix-st7703.c | 90 ++++++++++---------
>  1 file changed, 46 insertions(+), 44 deletions(-)
> 
> diff --git a/drivers/gpu/drm/panel/panel-sitronix-st7703.c b/drivers/gpu/drm/panel/panel-sitronix-st7703.c
> index 38ff742bc120..511af659f273 100644
> --- a/drivers/gpu/drm/panel/panel-sitronix-st7703.c
> +++ b/drivers/gpu/drm/panel/panel-sitronix-st7703.c
> @@ -1,6 +1,8 @@
>  // SPDX-License-Identifier: GPL-2.0
>  /*
> - * Rockteck jh057n00900 5.5" MIPI-DSI panel driver
> + * Driver for panels based on Sitronix ST7703 controller, souch as:
> + *
> + * - Rocktech jh057n00900 5.5" MIPI-DSI panel
>   *
>   * Copyright (C) Purism SPC 2019
>   */
> @@ -21,7 +23,7 @@
>  #include <drm/drm_panel.h>
>  #include <drm/drm_print.h>
>  
> -#define DRV_NAME "panel-rocktech-jh057n00900"
> +#define DRV_NAME "panel-sitronix-st7703"
>  
>  /* Manufacturer specific Commands send via DSI */
>  #define ST7703_CMD_ALL_PIXEL_OFF 0x22
> @@ -45,7 +47,7 @@
>  #define ST7703_CMD_SETGIP1	 0xE9
>  #define ST7703_CMD_SETGIP2	 0xEA
>  
> -struct jh057n {
> +struct st7703 {
>  	struct device *dev;
>  	struct drm_panel panel;
>  	struct gpio_desc *reset_gpio;
> @@ -56,9 +58,9 @@ struct jh057n {
>  	struct dentry *debugfs;
>  };
>  
> -static inline struct jh057n *panel_to_jh057n(struct drm_panel *panel)
> +static inline struct st7703 *panel_to_st7703(struct drm_panel *panel)
>  {
> -	return container_of(panel, struct jh057n, panel);
> +	return container_of(panel, struct st7703, panel);
>  }
>  
>  #define dsi_generic_write_seq(dsi, seq...) do {				\
> @@ -69,7 +71,7 @@ static inline struct jh057n *panel_to_jh057n(struct drm_panel *panel)
>  			return ret;					\
>  	} while (0)
>  
> -static int jh057n_init_sequence(struct jh057n *ctx)
> +static int jh057n_init_sequence(struct st7703 *ctx)
>  {
>  	struct mipi_dsi_device *dsi = to_mipi_dsi_device(ctx->dev);
>  	struct device *dev = ctx->dev;
> @@ -141,9 +143,9 @@ static int jh057n_init_sequence(struct jh057n *ctx)
>  	return 0;
>  }
>  
> -static int jh057n_enable(struct drm_panel *panel)
> +static int st7703_enable(struct drm_panel *panel)
>  {
> -	struct jh057n *ctx = panel_to_jh057n(panel);
> +	struct st7703 *ctx = panel_to_st7703(panel);
>  	int ret;
>  
>  	ret = jh057n_init_sequence(ctx);
> @@ -156,17 +158,17 @@ static int jh057n_enable(struct drm_panel *panel)
>  	return 0;
>  }
>  
> -static int jh057n_disable(struct drm_panel *panel)
> +static int st7703_disable(struct drm_panel *panel)
>  {
> -	struct jh057n *ctx = panel_to_jh057n(panel);
> +	struct st7703 *ctx = panel_to_st7703(panel);
>  	struct mipi_dsi_device *dsi = to_mipi_dsi_device(ctx->dev);
>  
>  	return mipi_dsi_dcs_set_display_off(dsi);
>  }
>  
> -static int jh057n_unprepare(struct drm_panel *panel)
> +static int st7703_unprepare(struct drm_panel *panel)
>  {
> -	struct jh057n *ctx = panel_to_jh057n(panel);
> +	struct st7703 *ctx = panel_to_st7703(panel);
>  
>  	if (!ctx->prepared)
>  		return 0;
> @@ -178,9 +180,9 @@ static int jh057n_unprepare(struct drm_panel *panel)
>  	return 0;
>  }
>  
> -static int jh057n_prepare(struct drm_panel *panel)
> +static int st7703_prepare(struct drm_panel *panel)
>  {
> -	struct jh057n *ctx = panel_to_jh057n(panel);
> +	struct st7703 *ctx = panel_to_st7703(panel);
>  	int ret;
>  
>  	if (ctx->prepared)
> @@ -230,10 +232,10 @@ static const struct drm_display_mode default_mode = {
>  	.height_mm   = 130,
>  };
>  
> -static int jh057n_get_modes(struct drm_panel *panel,
> +static int st7703_get_modes(struct drm_panel *panel,
>  			    struct drm_connector *connector)
>  {
> -	struct jh057n *ctx = panel_to_jh057n(panel);
> +	struct st7703 *ctx = panel_to_st7703(panel);
>  	struct drm_display_mode *mode;
>  
>  	mode = drm_mode_duplicate(connector->dev, &default_mode);
> @@ -254,17 +256,17 @@ static int jh057n_get_modes(struct drm_panel *panel,
>  	return 1;
>  }
>  
> -static const struct drm_panel_funcs jh057n_drm_funcs = {
> -	.disable   = jh057n_disable,
> -	.unprepare = jh057n_unprepare,
> -	.prepare   = jh057n_prepare,
> -	.enable	   = jh057n_enable,
> -	.get_modes = jh057n_get_modes,
> +static const struct drm_panel_funcs st7703_drm_funcs = {
> +	.disable   = st7703_disable,
> +	.unprepare = st7703_unprepare,
> +	.prepare   = st7703_prepare,
> +	.enable	   = st7703_enable,
> +	.get_modes = st7703_get_modes,
>  };
>  
>  static int allpixelson_set(void *data, u64 val)
>  {
> -	struct jh057n *ctx = data;
> +	struct st7703 *ctx = data;
>  	struct mipi_dsi_device *dsi = to_mipi_dsi_device(ctx->dev);
>  
>  	DRM_DEV_DEBUG_DRIVER(ctx->dev, "Setting all pixels on\n");
> @@ -282,7 +284,7 @@ static int allpixelson_set(void *data, u64 val)
>  DEFINE_SIMPLE_ATTRIBUTE(allpixelson_fops, NULL,
>  			allpixelson_set, "%llu\n");
>  
> -static void jh057n_debugfs_init(struct jh057n *ctx)
> +static void st7703_debugfs_init(struct st7703 *ctx)
>  {
>  	ctx->debugfs = debugfs_create_dir(DRV_NAME, NULL);
>  
> @@ -290,16 +292,16 @@ static void jh057n_debugfs_init(struct jh057n *ctx)
>  			    &allpixelson_fops);
>  }
>  
> -static void jh057n_debugfs_remove(struct jh057n *ctx)
> +static void st7703_debugfs_remove(struct st7703 *ctx)
>  {
>  	debugfs_remove_recursive(ctx->debugfs);
>  	ctx->debugfs = NULL;
>  }
>  
> -static int jh057n_probe(struct mipi_dsi_device *dsi)
> +static int st7703_probe(struct mipi_dsi_device *dsi)
>  {
>  	struct device *dev = &dsi->dev;
> -	struct jh057n *ctx;
> +	struct st7703 *ctx;
>  	int ret;
>  
>  	ctx = devm_kzalloc(dev, sizeof(*ctx), GFP_KERNEL);
> @@ -340,7 +342,7 @@ static int jh057n_probe(struct mipi_dsi_device *dsi)
>  		return ret;
>  	}
>  
> -	drm_panel_init(&ctx->panel, dev, &jh057n_drm_funcs,
> +	drm_panel_init(&ctx->panel, dev, &st7703_drm_funcs,
>  		       DRM_MODE_CONNECTOR_DSI);
>  
>  	ret = drm_panel_of_backlight(&ctx->panel);
> @@ -363,13 +365,13 @@ static int jh057n_probe(struct mipi_dsi_device *dsi)
>  		     default_mode.vrefresh,
>  		     mipi_dsi_pixel_format_to_bpp(dsi->format), dsi->lanes);
>  
> -	jh057n_debugfs_init(ctx);
> +	st7703_debugfs_init(ctx);
>  	return 0;
>  }
>  
> -static void jh057n_shutdown(struct mipi_dsi_device *dsi)
> +static void st7703_shutdown(struct mipi_dsi_device *dsi)
>  {
> -	struct jh057n *ctx = mipi_dsi_get_drvdata(dsi);
> +	struct st7703 *ctx = mipi_dsi_get_drvdata(dsi);
>  	int ret;
>  
>  	ret = drm_panel_unprepare(&ctx->panel);
> @@ -383,12 +385,12 @@ static void jh057n_shutdown(struct mipi_dsi_device *dsi)
>  			      ret);
>  }
>  
> -static int jh057n_remove(struct mipi_dsi_device *dsi)
> +static int st7703_remove(struct mipi_dsi_device *dsi)
>  {
> -	struct jh057n *ctx = mipi_dsi_get_drvdata(dsi);
> +	struct st7703 *ctx = mipi_dsi_get_drvdata(dsi);
>  	int ret;
>  
> -	jh057n_shutdown(dsi);
> +	st7703_shutdown(dsi);
>  
>  	ret = mipi_dsi_detach(dsi);
>  	if (ret < 0)
> @@ -397,28 +399,28 @@ static int jh057n_remove(struct mipi_dsi_device *dsi)
>  
>  	drm_panel_remove(&ctx->panel);
>  
> -	jh057n_debugfs_remove(ctx);
> +	st7703_debugfs_remove(ctx);
>  
>  	return 0;
>  }
>  
> -static const struct of_device_id jh057n_of_match[] = {
> +static const struct of_device_id st7703_of_match[] = {
>  	{ .compatible = "rocktech,jh057n00900" },
>  	{ /* sentinel */ }
>  };
> -MODULE_DEVICE_TABLE(of, jh057n_of_match);
> +MODULE_DEVICE_TABLE(of, st7703_of_match);
>  
> -static struct mipi_dsi_driver jh057n_driver = {
> -	.probe	= jh057n_probe,
> -	.remove = jh057n_remove,
> -	.shutdown = jh057n_shutdown,
> +static struct mipi_dsi_driver st7703_driver = {
> +	.probe	= st7703_probe,
> +	.remove = st7703_remove,
> +	.shutdown = st7703_shutdown,
>  	.driver = {
>  		.name = DRV_NAME,
> -		.of_match_table = jh057n_of_match,
> +		.of_match_table = st7703_of_match,
>  	},
>  };
> -module_mipi_dsi_driver(jh057n_driver);
> +module_mipi_dsi_driver(st7703_driver);
>  
>  MODULE_AUTHOR("Guido Günther <agx@sigxcpu.org>");
> -MODULE_DESCRIPTION("DRM driver for Rocktech JH057N00900 MIPI DSI panel");
> +MODULE_DESCRIPTION("DRM driver for Sitronix ST7703 based MIPI DSI panels");
>  MODULE_LICENSE("GPL v2");
> -- 
> 2.27.0
>
Guido Günther July 1, 2020, 4:02 p.m. UTC | #6
Hi,
On Wed, Jul 01, 2020 at 12:31:19PM +0200, Ondrej Jirman wrote:
> Parametrize the driver so that it can support more panels based
> on st7703 controller.

Reviewed-by: Guido Günther <agx@sigxcpu.org> 
> 
> Signed-off-by: Ondrej Jirman <megous@megous.com>
> Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
> ---
>  drivers/gpu/drm/panel/panel-sitronix-st7703.c | 43 +++++++++++++------
>  1 file changed, 31 insertions(+), 12 deletions(-)
> 
> diff --git a/drivers/gpu/drm/panel/panel-sitronix-st7703.c b/drivers/gpu/drm/panel/panel-sitronix-st7703.c
> index 511af659f273..08cbc316266c 100644
> --- a/drivers/gpu/drm/panel/panel-sitronix-st7703.c
> +++ b/drivers/gpu/drm/panel/panel-sitronix-st7703.c
> @@ -13,6 +13,7 @@
>  #include <linux/media-bus-format.h>
>  #include <linux/mod_devicetable.h>
>  #include <linux/module.h>
> +#include <linux/of_device.h>
>  #include <linux/regulator/consumer.h>
>  
>  #include <video/display_timing.h>
> @@ -56,6 +57,15 @@ struct st7703 {
>  	bool prepared;
>  
>  	struct dentry *debugfs;
> +	const struct st7703_panel_desc *desc;
> +};
> +
> +struct st7703_panel_desc {
> +	const struct drm_display_mode *mode;
> +	unsigned int lanes;
> +	unsigned long mode_flags;
> +	enum mipi_dsi_pixel_format format;
> +	int (*init_sequence)(struct st7703 *ctx);
>  };
>  
>  static inline struct st7703 *panel_to_st7703(struct drm_panel *panel)
> @@ -148,7 +158,7 @@ static int st7703_enable(struct drm_panel *panel)
>  	struct st7703 *ctx = panel_to_st7703(panel);
>  	int ret;
>  
> -	ret = jh057n_init_sequence(ctx);
> +	ret = ctx->desc->init_sequence(ctx);
>  	if (ret < 0) {
>  		DRM_DEV_ERROR(ctx->dev, "Panel init sequence failed: %d\n",
>  			      ret);
> @@ -216,7 +226,7 @@ static int st7703_prepare(struct drm_panel *panel)
>  	return ret;
>  }
>  
> -static const struct drm_display_mode default_mode = {
> +static const struct drm_display_mode jh057n00900_mode = {
>  	.hdisplay    = 720,
>  	.hsync_start = 720 + 90,
>  	.hsync_end   = 720 + 90 + 20,
> @@ -232,17 +242,26 @@ static const struct drm_display_mode default_mode = {
>  	.height_mm   = 130,
>  };
>  
> +struct st7703_panel_desc jh057n00900_panel_desc = {
> +	.mode = &jh057n00900_mode,
> +	.lanes = 4,
> +	.mode_flags = MIPI_DSI_MODE_VIDEO |
> +		MIPI_DSI_MODE_VIDEO_BURST | MIPI_DSI_MODE_VIDEO_SYNC_PULSE,
> +	.format = MIPI_DSI_FMT_RGB888,
> +	.init_sequence = jh057n_init_sequence,
> +};
> +
>  static int st7703_get_modes(struct drm_panel *panel,
>  			    struct drm_connector *connector)
>  {
>  	struct st7703 *ctx = panel_to_st7703(panel);
>  	struct drm_display_mode *mode;
>  
> -	mode = drm_mode_duplicate(connector->dev, &default_mode);
> +	mode = drm_mode_duplicate(connector->dev, ctx->desc->mode);
>  	if (!mode) {
>  		DRM_DEV_ERROR(ctx->dev, "Failed to add mode %ux%u@%u\n",
> -			      default_mode.hdisplay, default_mode.vdisplay,
> -			      default_mode.vrefresh);
> +			      ctx->desc->mode->hdisplay, ctx->desc->mode->vdisplay,
> +			      ctx->desc->mode->vrefresh);
>  		return -ENOMEM;
>  	}
>  
> @@ -317,11 +336,11 @@ static int st7703_probe(struct mipi_dsi_device *dsi)
>  	mipi_dsi_set_drvdata(dsi, ctx);
>  
>  	ctx->dev = dev;
> +	ctx->desc = of_device_get_match_data(dev);
>  
> -	dsi->lanes = 4;
> -	dsi->format = MIPI_DSI_FMT_RGB888;
> -	dsi->mode_flags = MIPI_DSI_MODE_VIDEO |
> -		MIPI_DSI_MODE_VIDEO_BURST | MIPI_DSI_MODE_VIDEO_SYNC_PULSE;
> +	dsi->mode_flags = ctx->desc->mode_flags;
> +	dsi->format = ctx->desc->format;
> +	dsi->lanes = ctx->desc->lanes;
>  
>  	ctx->vcc = devm_regulator_get(dev, "vcc");
>  	if (IS_ERR(ctx->vcc)) {
> @@ -361,8 +380,8 @@ static int st7703_probe(struct mipi_dsi_device *dsi)
>  	}
>  
>  	DRM_DEV_INFO(dev, "%ux%u@%u %ubpp dsi %udl - ready\n",
> -		     default_mode.hdisplay, default_mode.vdisplay,
> -		     default_mode.vrefresh,
> +		     ctx->desc->mode->hdisplay, ctx->desc->mode->vdisplay,
> +		     ctx->desc->mode->vrefresh,
>  		     mipi_dsi_pixel_format_to_bpp(dsi->format), dsi->lanes);
>  
>  	st7703_debugfs_init(ctx);
> @@ -405,7 +424,7 @@ static int st7703_remove(struct mipi_dsi_device *dsi)
>  }
>  
>  static const struct of_device_id st7703_of_match[] = {
> -	{ .compatible = "rocktech,jh057n00900" },
> +	{ .compatible = "rocktech,jh057n00900", .data = &jh057n00900_panel_desc },
>  	{ /* sentinel */ }
>  };
>  MODULE_DEVICE_TABLE(of, st7703_of_match);
> -- 
> 2.27.0
>
Guido Günther July 1, 2020, 4:02 p.m. UTC | #7
Hi,
On Wed, Jul 01, 2020 at 12:31:20PM +0200, Ondrej Jirman wrote:
> It's better than having it spread around the driver.

Reviewed-by: Guido Günther <agx@sigxcpu.org> 
> 
> Signed-off-by: Ondrej Jirman <megous@megous.com>
> Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
> ---
>  drivers/gpu/drm/panel/panel-sitronix-st7703.c | 50 +++++++++----------
>  1 file changed, 25 insertions(+), 25 deletions(-)
> 
> diff --git a/drivers/gpu/drm/panel/panel-sitronix-st7703.c b/drivers/gpu/drm/panel/panel-sitronix-st7703.c
> index 08cbc316266c..d03aab10cfef 100644
> --- a/drivers/gpu/drm/panel/panel-sitronix-st7703.c
> +++ b/drivers/gpu/drm/panel/panel-sitronix-st7703.c
> @@ -153,6 +153,31 @@ static int jh057n_init_sequence(struct st7703 *ctx)
>  	return 0;
>  }
>  
> +static const struct drm_display_mode jh057n00900_mode = {
> +	.hdisplay    = 720,
> +	.hsync_start = 720 + 90,
> +	.hsync_end   = 720 + 90 + 20,
> +	.htotal	     = 720 + 90 + 20 + 20,
> +	.vdisplay    = 1440,
> +	.vsync_start = 1440 + 20,
> +	.vsync_end   = 1440 + 20 + 4,
> +	.vtotal	     = 1440 + 20 + 4 + 12,
> +	.vrefresh    = 60,
> +	.clock	     = 75276,
> +	.flags	     = DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC,
> +	.width_mm    = 65,
> +	.height_mm   = 130,
> +};
> +
> +struct st7703_panel_desc jh057n00900_panel_desc = {
> +	.mode = &jh057n00900_mode,
> +	.lanes = 4,
> +	.mode_flags = MIPI_DSI_MODE_VIDEO |
> +		MIPI_DSI_MODE_VIDEO_BURST | MIPI_DSI_MODE_VIDEO_SYNC_PULSE,
> +	.format = MIPI_DSI_FMT_RGB888,
> +	.init_sequence = jh057n_init_sequence,
> +};
> +
>  static int st7703_enable(struct drm_panel *panel)
>  {
>  	struct st7703 *ctx = panel_to_st7703(panel);
> @@ -226,31 +251,6 @@ static int st7703_prepare(struct drm_panel *panel)
>  	return ret;
>  }
>  
> -static const struct drm_display_mode jh057n00900_mode = {
> -	.hdisplay    = 720,
> -	.hsync_start = 720 + 90,
> -	.hsync_end   = 720 + 90 + 20,
> -	.htotal	     = 720 + 90 + 20 + 20,
> -	.vdisplay    = 1440,
> -	.vsync_start = 1440 + 20,
> -	.vsync_end   = 1440 + 20 + 4,
> -	.vtotal	     = 1440 + 20 + 4 + 12,
> -	.vrefresh    = 60,
> -	.clock	     = 75276,
> -	.flags	     = DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC,
> -	.width_mm    = 65,
> -	.height_mm   = 130,
> -};
> -
> -struct st7703_panel_desc jh057n00900_panel_desc = {
> -	.mode = &jh057n00900_mode,
> -	.lanes = 4,
> -	.mode_flags = MIPI_DSI_MODE_VIDEO |
> -		MIPI_DSI_MODE_VIDEO_BURST | MIPI_DSI_MODE_VIDEO_SYNC_PULSE,
> -	.format = MIPI_DSI_FMT_RGB888,
> -	.init_sequence = jh057n_init_sequence,
> -};
> -
>  static int st7703_get_modes(struct drm_panel *panel,
>  			    struct drm_connector *connector)
>  {
> -- 
> 2.27.0
>
Guido Günther July 1, 2020, 4:02 p.m. UTC | #8
Hi,
On Wed, Jul 01, 2020 at 12:31:21PM +0200, Ondrej Jirman wrote:
> Calling sleep out and display on is a controller specific part
> of the initialization process. Move it out of the panel specific
> initialization function to the enable callback.

Reviewed-by: Guido Günther <agx@sigxcpu.org> 

> 
> Signed-off-by: Ondrej Jirman <megous@megous.com>
> Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
> ---
>  drivers/gpu/drm/panel/panel-sitronix-st7703.c | 33 ++++++++++---------
>  1 file changed, 18 insertions(+), 15 deletions(-)
> 
> diff --git a/drivers/gpu/drm/panel/panel-sitronix-st7703.c b/drivers/gpu/drm/panel/panel-sitronix-st7703.c
> index d03aab10cfef..cdbf7dfb4dd4 100644
> --- a/drivers/gpu/drm/panel/panel-sitronix-st7703.c
> +++ b/drivers/gpu/drm/panel/panel-sitronix-st7703.c
> @@ -84,8 +84,6 @@ static inline struct st7703 *panel_to_st7703(struct drm_panel *panel)
>  static int jh057n_init_sequence(struct st7703 *ctx)
>  {
>  	struct mipi_dsi_device *dsi = to_mipi_dsi_device(ctx->dev);
> -	struct device *dev = ctx->dev;
> -	int ret;
>  
>  	/*
>  	 * Init sequence was supplied by the panel vendor. Most of the commands
> @@ -136,20 +134,7 @@ static int jh057n_init_sequence(struct st7703 *ctx)
>  			      0x18, 0x00, 0x09, 0x0E, 0x29, 0x2D, 0x3C, 0x41,
>  			      0x37, 0x07, 0x0B, 0x0D, 0x10, 0x11, 0x0F, 0x10,
>  			      0x11, 0x18);
> -	msleep(20);
> -
> -	ret = mipi_dsi_dcs_exit_sleep_mode(dsi);
> -	if (ret < 0) {
> -		DRM_DEV_ERROR(dev, "Failed to exit sleep mode: %d\n", ret);
> -		return ret;
> -	}
> -	/* Panel is operational 120 msec after reset */
> -	msleep(60);
> -	ret = mipi_dsi_dcs_set_display_on(dsi);
> -	if (ret)
> -		return ret;
>  
> -	DRM_DEV_DEBUG_DRIVER(dev, "Panel init sequence done\n");
>  	return 0;
>  }
>  
> @@ -181,6 +166,7 @@ struct st7703_panel_desc jh057n00900_panel_desc = {
>  static int st7703_enable(struct drm_panel *panel)
>  {
>  	struct st7703 *ctx = panel_to_st7703(panel);
> +	struct mipi_dsi_device *dsi = to_mipi_dsi_device(ctx->dev);
>  	int ret;
>  
>  	ret = ctx->desc->init_sequence(ctx);
> @@ -190,6 +176,23 @@ static int st7703_enable(struct drm_panel *panel)
>  		return ret;
>  	}
>  
> +	msleep(20);
> +
> +	ret = mipi_dsi_dcs_exit_sleep_mode(dsi);
> +	if (ret < 0) {
> +		DRM_DEV_ERROR(ctx->dev, "Failed to exit sleep mode: %d\n", ret);
> +		return ret;
> +	}
> +
> +	/* Panel is operational 120 msec after reset */
> +	msleep(60);
> +
> +	ret = mipi_dsi_dcs_set_display_on(dsi);
> +	if (ret)
> +		return ret;
> +
> +	DRM_DEV_DEBUG_DRIVER(ctx->dev, "Panel init sequence done\n");
> +
>  	return 0;
>  }
>  
> -- 
> 2.27.0
>
Guido Günther July 1, 2020, 4:03 p.m. UTC | #9
Hi,
On Wed, Jul 01, 2020 at 12:31:22PM +0200, Ondrej Jirman wrote:
> Xingbangda XBD599 is a 5.99" 720x1440 MIPI-DSI LCD panel used in
> PinePhone. Add support for it.

Reviewed-by: Guido Günther <agx@sigxcpu.org> 

> 
> Signed-off-by: Icenowy Zheng <icenowy@aosc.io>
> Signed-off-by: Ondrej Jirman <megous@megous.com>
> Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
> ---
>  drivers/gpu/drm/panel/panel-sitronix-st7703.c | 200 +++++++++++++++++-
>  1 file changed, 198 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/gpu/drm/panel/panel-sitronix-st7703.c b/drivers/gpu/drm/panel/panel-sitronix-st7703.c
> index cdbf7dfb4dd4..5cd5503f894f 100644
> --- a/drivers/gpu/drm/panel/panel-sitronix-st7703.c
> +++ b/drivers/gpu/drm/panel/panel-sitronix-st7703.c
> @@ -39,10 +39,11 @@
>  #define ST7703_CMD_SETEXTC	 0xB9
>  #define ST7703_CMD_SETMIPI	 0xBA
>  #define ST7703_CMD_SETVDC	 0xBC
> -#define ST7703_CMD_UNKNOWN0	 0xBF
> +#define ST7703_CMD_UNKNOWN_BF	 0xBF
>  #define ST7703_CMD_SETSCR	 0xC0
>  #define ST7703_CMD_SETPOWER	 0xC1
>  #define ST7703_CMD_SETPANEL	 0xCC
> +#define ST7703_CMD_UNKNOWN_C6	 0xC6
>  #define ST7703_CMD_SETGAMMA	 0xE0
>  #define ST7703_CMD_SETEQ	 0xE3
>  #define ST7703_CMD_SETGIP1	 0xE9
> @@ -109,7 +110,7 @@ static int jh057n_init_sequence(struct st7703 *ctx)
>  	msleep(20);
>  
>  	dsi_generic_write_seq(dsi, ST7703_CMD_SETVCOM, 0x3F, 0x3F);
> -	dsi_generic_write_seq(dsi, ST7703_CMD_UNKNOWN0, 0x02, 0x11, 0x00);
> +	dsi_generic_write_seq(dsi, ST7703_CMD_UNKNOWN_BF, 0x02, 0x11, 0x00);
>  	dsi_generic_write_seq(dsi, ST7703_CMD_SETGIP1,
>  			      0x82, 0x10, 0x06, 0x05, 0x9E, 0x0A, 0xA5, 0x12,
>  			      0x31, 0x23, 0x37, 0x83, 0x04, 0xBC, 0x27, 0x38,
> @@ -163,6 +164,200 @@ struct st7703_panel_desc jh057n00900_panel_desc = {
>  	.init_sequence = jh057n_init_sequence,
>  };
>  
> +#define dsi_dcs_write_seq(dsi, cmd, seq...) do {			\
> +		static const u8 d[] = { seq };				\
> +		int ret;						\
> +		ret = mipi_dsi_dcs_write(dsi, cmd, d, ARRAY_SIZE(d));	\
> +		if (ret < 0)						\
> +			return ret;					\
> +	} while (0)
> +
> +
> +static int xbd599_init_sequence(struct st7703 *ctx)
> +{
> +	struct mipi_dsi_device *dsi = to_mipi_dsi_device(ctx->dev);
> +
> +	/*
> +	 * Init sequence was supplied by the panel vendor.
> +	 */
> +
> +	/* Magic sequence to unlock user commands below. */
> +	dsi_dcs_write_seq(dsi, ST7703_CMD_SETEXTC, 0xF1, 0x12, 0x83);
> +
> +	dsi_dcs_write_seq(dsi, ST7703_CMD_SETMIPI,
> +			  0x33, /* VC_main = 0, Lane_Number = 3 (4 lanes) */
> +			  0x81, /* DSI_LDO_SEL = 1.7V, RTERM = 90 Ohm */
> +			  0x05, /* IHSRX = x6 (Low High Speed driving ability) */
> +			  0xF9, /* TX_CLK_SEL = fDSICLK/16 */
> +			  0x0E, /* HFP_OSC (min. HFP number in DSI mode) */
> +			  0x0E, /* HBP_OSC (min. HBP number in DSI mode) */
> +			  /* The rest is undocumented in ST7703 datasheet */
> +			  0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
> +			  0x44, 0x25, 0x00, 0x91, 0x0a, 0x00, 0x00, 0x02,
> +			  0x4F, 0x11, 0x00, 0x00, 0x37);
> +
> +	dsi_dcs_write_seq(dsi, ST7703_CMD_SETPOWER_EXT,
> +			  0x25, /* PCCS = 2, ECP_DC_DIV = 1/4 HSYNC */
> +			  0x22, /* DT = 15ms XDK_ECP = x2 */
> +			  0x20, /* PFM_DC_DIV = /1 */
> +			  0x03  /* ECP_SYNC_EN = 1, VGX_SYNC_EN = 1 */);
> +
> +	/* RGB I/F porch timing */
> +	dsi_dcs_write_seq(dsi, ST7703_CMD_SETRGBIF,
> +			  0x10, /* VBP_RGB_GEN */
> +			  0x10, /* VFP_RGB_GEN */
> +			  0x05, /* DE_BP_RGB_GEN */
> +			  0x05, /* DE_FP_RGB_GEN */
> +			  /* The rest is undocumented in ST7703 datasheet */
> +			  0x03, 0xFF,
> +			  0x00, 0x00,
> +			  0x00, 0x00);
> +
> +	/* Source driving settings. */
> +	dsi_dcs_write_seq(dsi, ST7703_CMD_SETSCR,
> +			  0x73, /* N_POPON */
> +			  0x73, /* N_NOPON */
> +			  0x50, /* I_POPON */
> +			  0x50, /* I_NOPON */
> +			  0x00, /* SCR[31,24] */
> +			  0xC0, /* SCR[23,16] */
> +			  0x08, /* SCR[15,8] */
> +			  0x70, /* SCR[7,0] */
> +			  0x00  /* Undocumented */);
> +
> +	/* NVDDD_SEL = -1.8V, VDDD_SEL = out of range (possibly 1.9V?) */
> +	dsi_dcs_write_seq(dsi, ST7703_CMD_SETVDC, 0x4E);
> +
> +	/*
> +	 * SS_PANEL = 1 (reverse scan), GS_PANEL = 0 (normal scan)
> +	 * REV_PANEL = 1 (normally black panel), BGR_PANEL = 1 (BGR)
> +	 */
> +	dsi_dcs_write_seq(dsi, ST7703_CMD_SETPANEL, 0x0B);
> +
> +	/* Zig-Zag Type C column inversion. */
> +	dsi_dcs_write_seq(dsi, ST7703_CMD_SETCYC, 0x80);
> +
> +	/* Set display resolution. */
> +	dsi_dcs_write_seq(dsi, ST7703_CMD_SETDISP,
> +			  0xF0, /* NL = 240 */
> +			  0x12, /* RES_V_LSB = 0, BLK_CON = VSSD,
> +				 * RESO_SEL = 720RGB
> +				 */
> +			  0xF0  /* WHITE_GND_EN = 1 (GND),
> +				 * WHITE_FRAME_SEL = 7 frames,
> +				 * ISC = 0 frames
> +				 */);
> +
> +	dsi_dcs_write_seq(dsi, ST7703_CMD_SETEQ,
> +			  0x00, /* PNOEQ */
> +			  0x00, /* NNOEQ */
> +			  0x0B, /* PEQGND */
> +			  0x0B, /* NEQGND */
> +			  0x10, /* PEQVCI */
> +			  0x10, /* NEQVCI */
> +			  0x00, /* PEQVCI1 */
> +			  0x00, /* NEQVCI1 */
> +			  0x00, /* reserved */
> +			  0x00, /* reserved */
> +			  0xFF, /* reserved */
> +			  0x00, /* reserved */
> +			  0xC0, /* ESD_DET_DATA_WHITE = 1, ESD_WHITE_EN = 1 */
> +			  0x10  /* SLPIN_OPTION = 1 (no need vsync after sleep-in)
> +				 * VEDIO_NO_CHECK_EN = 0
> +				 * ESD_WHITE_GND_EN = 0
> +				 * ESD_DET_TIME_SEL = 0 frames
> +				 */);
> +
> +	/* Undocumented command. */
> +	dsi_dcs_write_seq(dsi, ST7703_CMD_UNKNOWN_C6, 0x01, 0x00, 0xFF, 0xFF, 0x00);
> +
> +	dsi_dcs_write_seq(dsi, ST7703_CMD_SETPOWER,
> +			  0x74, /* VBTHS, VBTLS: VGH = 17V, VBL = -11V */
> +			  0x00, /* FBOFF_VGH = 0, FBOFF_VGL = 0 */
> +			  0x32, /* VRP  */
> +			  0x32, /* VRN */
> +			  0x77, /* reserved */
> +			  0xF1, /* APS = 1 (small),
> +				 * VGL_DET_EN = 1, VGH_DET_EN = 1,
> +				 * VGL_TURBO = 1, VGH_TURBO = 1
> +				 */
> +			  0xFF, /* VGH1_L_DIV, VGL1_L_DIV (1.5MHz) */
> +			  0xFF, /* VGH1_R_DIV, VGL1_R_DIV (1.5MHz) */
> +			  0xCC, /* VGH2_L_DIV, VGL2_L_DIV (2.6MHz) */
> +			  0xCC, /* VGH2_R_DIV, VGL2_R_DIV (2.6MHz) */
> +			  0x77, /* VGH3_L_DIV, VGL3_L_DIV (4.5MHz) */
> +			  0x77  /* VGH3_R_DIV, VGL3_R_DIV (4.5MHz) */);
> +
> +	/* Reference voltage. */
> +	dsi_dcs_write_seq(dsi, ST7703_CMD_SETBGP,
> +			  0x07, /* VREF_SEL = 4.2V */
> +			  0x07  /* NVREF_SEL = 4.2V */);
> +	msleep(20);
> +
> +	dsi_dcs_write_seq(dsi, ST7703_CMD_SETVCOM,
> +			  0x2C, /* VCOMDC_F = -0.67V */
> +			  0x2C  /* VCOMDC_B = -0.67V */);
> +
> +	/* Undocumented command. */
> +	dsi_dcs_write_seq(dsi, ST7703_CMD_UNKNOWN_BF, 0x02, 0x11, 0x00);
> +
> +	/* This command is to set forward GIP timing. */
> +	dsi_dcs_write_seq(dsi, ST7703_CMD_SETGIP1,
> +			  0x82, 0x10, 0x06, 0x05, 0xA2, 0x0A, 0xA5, 0x12,
> +			  0x31, 0x23, 0x37, 0x83, 0x04, 0xBC, 0x27, 0x38,
> +			  0x0C, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00,
> +			  0x03, 0x00, 0x00, 0x00, 0x75, 0x75, 0x31, 0x88,
> +			  0x88, 0x88, 0x88, 0x88, 0x88, 0x13, 0x88, 0x64,
> +			  0x64, 0x20, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
> +			  0x02, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
> +			  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
> +
> +	/* This command is to set backward GIP timing. */
> +	dsi_dcs_write_seq(dsi, ST7703_CMD_SETGIP2,
> +			  0x02, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
> +			  0x00, 0x00, 0x00, 0x00, 0x02, 0x46, 0x02, 0x88,
> +			  0x88, 0x88, 0x88, 0x88, 0x88, 0x64, 0x88, 0x13,
> +			  0x57, 0x13, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
> +			  0x75, 0x88, 0x23, 0x14, 0x00, 0x00, 0x02, 0x00,
> +			  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
> +			  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0A,
> +			  0xA5, 0x00, 0x00, 0x00, 0x00);
> +
> +	/* Adjust the gamma characteristics of the panel. */
> +	dsi_dcs_write_seq(dsi, ST7703_CMD_SETGAMMA,
> +			  0x00, 0x09, 0x0D, 0x23, 0x27, 0x3C, 0x41, 0x35,
> +			  0x07, 0x0D, 0x0E, 0x12, 0x13, 0x10, 0x12, 0x12,
> +			  0x18, 0x00, 0x09, 0x0D, 0x23, 0x27, 0x3C, 0x41,
> +			  0x35, 0x07, 0x0D, 0x0E, 0x12, 0x13, 0x10, 0x12,
> +			  0x12, 0x18);
> +
> +	return 0;
> +}
> +
> +static const struct drm_display_mode xbd599_mode = {
> +	.hdisplay    = 720,
> +	.hsync_start = 720 + 40,
> +	.hsync_end   = 720 + 40 + 40,
> +	.htotal	     = 720 + 40 + 40 + 40,
> +	.vdisplay    = 1440,
> +	.vsync_start = 1440 + 18,
> +	.vsync_end   = 1440 + 18 + 10,
> +	.vtotal	     = 1440 + 18 + 10 + 17,
> +	.vrefresh    = 60,
> +	.clock	     = 69000,
> +	.flags	     = DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC,
> +	.width_mm    = 68,
> +	.height_mm   = 136,
> +};
> +
> +static const struct st7703_panel_desc xbd599_desc = {
> +	.mode = &xbd599_mode,
> +	.lanes = 4,
> +	.mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_SYNC_PULSE,
> +	.format = MIPI_DSI_FMT_RGB888,
> +	.init_sequence = xbd599_init_sequence,
> +};
> +
>  static int st7703_enable(struct drm_panel *panel)
>  {
>  	struct st7703 *ctx = panel_to_st7703(panel);
> @@ -428,6 +623,7 @@ static int st7703_remove(struct mipi_dsi_device *dsi)
>  
>  static const struct of_device_id st7703_of_match[] = {
>  	{ .compatible = "rocktech,jh057n00900", .data = &jh057n00900_panel_desc },
> +	{ .compatible = "xingbangda,xbd599", .data = &xbd599_desc },
>  	{ /* sentinel */ }
>  };
>  MODULE_DEVICE_TABLE(of, st7703_of_match);
> -- 
> 2.27.0
>
Guido Günther July 1, 2020, 4:04 p.m. UTC | #10
Hi,
On Wed, Jul 01, 2020 at 12:31:23PM +0200, Ondrej Jirman wrote:
> The datasheet suggests to issue sleep in after display off
> as a part of the panel's shutdown sequence.

Out of curiosity: which exact datasheet did you use?

Reviewed-by: Guido Günther <agx@sigxcpu.org> 

> 
> Signed-off-by: Ondrej Jirman <megous@megous.com>
> Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
> ---
>  drivers/gpu/drm/panel/panel-sitronix-st7703.c | 13 ++++++++++++-
>  1 file changed, 12 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/gpu/drm/panel/panel-sitronix-st7703.c b/drivers/gpu/drm/panel/panel-sitronix-st7703.c
> index 5cd5503f894f..0c4167994d01 100644
> --- a/drivers/gpu/drm/panel/panel-sitronix-st7703.c
> +++ b/drivers/gpu/drm/panel/panel-sitronix-st7703.c
> @@ -395,8 +395,19 @@ static int st7703_disable(struct drm_panel *panel)
>  {
>  	struct st7703 *ctx = panel_to_st7703(panel);
>  	struct mipi_dsi_device *dsi = to_mipi_dsi_device(ctx->dev);
> +	int ret;
> +
> +	ret = mipi_dsi_dcs_set_display_off(dsi);
> +	if (ret < 0)
> +		DRM_DEV_ERROR(ctx->dev,
> +			      "Failed to turn off the display: %d\n", ret);
>  
> -	return mipi_dsi_dcs_set_display_off(dsi);
> +	ret = mipi_dsi_dcs_enter_sleep_mode(dsi);
> +	if (ret < 0)
> +		DRM_DEV_ERROR(ctx->dev,
> +			      "Failed to enter sleep mode: %d\n", ret);
> +
> +	return 0;
>  }
>  
>  static int st7703_unprepare(struct drm_panel *panel)
> -- 
> 2.27.0
>
Guido Günther July 1, 2020, 4:04 p.m. UTC | #11
Hi,
On Wed, Jul 01, 2020 at 12:31:24PM +0200, Ondrej Jirman wrote:
> The reset pin is inverted, so if we don't assert reset, the actual gpio
> will be high and may keep driving the IO port of the panel.

Reviewed-by: Guido Günther <agx@sigxcpu.org>

> 
> Signed-off-by: Ondrej Jirman <megous@megous.com>
> Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
> ---
>  drivers/gpu/drm/panel/panel-sitronix-st7703.c | 1 +
>  1 file changed, 1 insertion(+)
> 
> diff --git a/drivers/gpu/drm/panel/panel-sitronix-st7703.c b/drivers/gpu/drm/panel/panel-sitronix-st7703.c
> index 0c4167994d01..e303b7b1a215 100644
> --- a/drivers/gpu/drm/panel/panel-sitronix-st7703.c
> +++ b/drivers/gpu/drm/panel/panel-sitronix-st7703.c
> @@ -417,6 +417,7 @@ static int st7703_unprepare(struct drm_panel *panel)
>  	if (!ctx->prepared)
>  		return 0;
>  
> +	gpiod_set_value_cansleep(ctx->reset_gpio, 1);
>  	regulator_disable(ctx->iovcc);
>  	regulator_disable(ctx->vcc);
>  	ctx->prepared = false;
> -- 
> 2.27.0
>
Ondřej Jirman July 1, 2020, 4:30 p.m. UTC | #12
Hello Sam,

On Wed, Jul 01, 2020 at 05:25:32PM +0200, Sam Ravnborg wrote:
> Hi Ondrej.
> 
> On Wed, Jul 01, 2020 at 12:31:13PM +0200, Ondrej Jirman wrote:
> > This patchset adds support for the LCD panel of PinePhone.
> > 
> > I've tested this on PinePhone 1.0 and 1.2.
> > 
> > Please take a look.
> > 
> > thank you and regards,
> >   Ondrej Jirman
> > 
> > Changes in v6:
> > - Fixed spacing in yaml
> > - Fixed wrong vccio->iovcc supply name in the bindings doc
> > - I noticed that the original driver uses a delay of 20ms in the init
> >   function to achieve a combined total of 120ms required from post-reset
> >   to display_on. I've added a similar delay to xbd599_init, so that
> >   xbd599 panel also has the right timing. (patch 9)
> > - v5->v6 diff: https://megous.com/dl/tmp/v5-v6.patch
> > - Added review/ack tags
> > - Learned to run dt_binding_check by myself ;)
> The patch-set does not apply clean on top of drm-misc-next - due to
> vrefresh removal.
> Please re-spin.

Sorry for that. Rebased and retested.

thank you,
	o.

> 	Sam
Linus Walleij July 1, 2020, 4:37 p.m. UTC | #13
On Wed, Jul 1, 2020 at 6:30 PM Ondřej Jirman <megous@megous.com> wrote:
> On Wed, Jul 01, 2020 at 05:25:32PM +0200, Sam Ravnborg wrote:
> > Hi Ondrej.
> >
> > On Wed, Jul 01, 2020 at 12:31:13PM +0200, Ondrej Jirman wrote:
> > > This patchset adds support for the LCD panel of PinePhone.
> > >
> > > I've tested this on PinePhone 1.0 and 1.2.
> > >
> > > Please take a look.
> > >
> > > thank you and regards,
> > >   Ondrej Jirman
> > >
> > > Changes in v6:
> > > - Fixed spacing in yaml
> > > - Fixed wrong vccio->iovcc supply name in the bindings doc
> > > - I noticed that the original driver uses a delay of 20ms in the init
> > >   function to achieve a combined total of 120ms required from post-reset
> > >   to display_on. I've added a similar delay to xbd599_init, so that
> > >   xbd599 panel also has the right timing. (patch 9)
> > > - v5->v6 diff: https://megous.com/dl/tmp/v5-v6.patch
> > > - Added review/ack tags
> > > - Learned to run dt_binding_check by myself ;)
> > The patch-set does not apply clean on top of drm-misc-next - due to
> > vrefresh removal.
> > Please re-spin.
>
> Sorry for that. Rebased and retested.

Sam will you apply it? I was in the middle of applying and ran into the same
issue :D

Yours,
Linus Walleij
Ondřej Jirman July 1, 2020, 4:42 p.m. UTC | #14
Hello,

On Wed, Jul 01, 2020 at 05:54:05PM +0200, Guido Günther wrote:
> Hi,
> On Wed, Jul 01, 2020 at 12:31:13PM +0200, Ondrej Jirman wrote:
> > This patchset adds support for the LCD panel of PinePhone.
> 
> I gave this a quick spin on the Librem5 devkit so
> 
> Tested-by: Guido Günther <agx@sigxcpu.org>
> 
> but please also adjust MAINTAINERS so we stay in the loop on driver
> changes.

Ah, right. I'll send a quick followup patch[1] after this gets merged,
or add it to v8 if there will be a need for v8. Thanks for noticing.

[1] https://megous.com/dl/tmp/0001-MAINTAINERS-Update-entry-for-st7703-driver-after-the.patch

And thanks for testing, too. :)

regards,
	o.

> Cheers,
>  -- Guido
> 
> > 
> > I've tested this on PinePhone 1.0 and 1.2.
> > 
> > Please take a look.
> > 
> > thank you and regards,
> >   Ondrej Jirman
> > 
> > Changes in v6:
> > - Fixed spacing in yaml
> > - Fixed wrong vccio->iovcc supply name in the bindings doc
> > - I noticed that the original driver uses a delay of 20ms in the init
> >   function to achieve a combined total of 120ms required from post-reset
> >   to display_on. I've added a similar delay to xbd599_init, so that
> >   xbd599 panel also has the right timing. (patch 9)
> > - v5->v6 diff: https://megous.com/dl/tmp/v5-v6.patch
> > - Added review/ack tags
> > - Learned to run dt_binding_check by myself ;)
> > 
> > Changes in v5:
> > - rewritten on top of rocktech-jh057n00900 driver
> > - rocktech-jh057n00900 renamed to st7703 (controller name)
> > - converted rocktech-jh057n00900 bindings to yaml and extended for xbd599
> > 
> > Changes in v4:
> > - use ->type from the mode instead of hardcoding (Samuel)
> > - move init_sequence to ->prepare (Samuel)
> > - move anti-flicker delay to ->enable, explain it (Samuel)
> > - add enter_sleep after display_off (Samuel)
> > - drop ->disable (move code to ->unprepare)
> > - add ID bytes dumping (Linus)
> >   (I can't test it since allwinner DSI driver has a broken
> >    dcs_read function, and I didn't manage to fix it.)
> > - document magic bytes (Linus)
> > - assert reset during powerup
> > - cleanup powerup timings according to the datasheet
> > 
> > Changes in v3:
> > - Panel driver renamed to the name of the LCD controller
> > - Re-organize the driver slightly to more easily support more panels
> >   based on the same controller.
> > - Add patch to enable the touchscreen to complete the LCD support
> >   on PinePhone.
> > - Dropped the "DSI fix" patch (the driver seems to work for me without it)
> > - Improved brightness levels handling:
> >   - PinePhone 1.0 uses default levels generated by the driver
> >   - On PinePhone 1.1 duty cycles < 20% lead to black screen, so
> >     default levels can't be used. Martijn Braam came up with a
> >     list of duty cycle values that lead to perception of linear
> >     brigtness level <-> light intensity on PinePhone 1.1
> > - There was some feedback on v2 about this being similar to st7701.
> >   It's only similar in name. Most of the "user commands" are different,
> >   so I opted to keep this in a new driver instead of creating st770x.
> >   
> >   Anyone who likes to check the differences, here are datasheets:
> > 
> >   - https://megous.com/dl/tmp/ST7703_DS_v01_20160128.pdf
> >   - https://megous.com/dl/tmp/ST7701.pdf
> > 
> > Changes in v2:
> > - DT Example fix.
> > - DT Format fix.
> > - Raised copyright info to 2020.
> > - Sort panel operation functions.
> > - Sort inclusion.
> > 
> > 
> > -- For phone owners: --
> > 
> > There's an open question on how to set the backlight brightness values
> > on post 1.0 revision phone, since lower duty cycles (< 10-20%) lead
> > to backlight being black. It would be nice if more people can test
> > the various backlight levels on 1.1 and 1.2 revision with this change
> > in dts:
> > 
> >        brightness-levels = <0 1000>;
> >        num-interpolated-steps = <1000>;
> > 
> > and report at what brightness level the backlight turns on. So far it
> > seems this has a wide range. Lowest useable duty cycle for me is ~7%
> > on 1.2 and for Martijn ~20% on 1.1.
> > 
> > Icenowy Zheng (2):
> >   dt-bindings: vendor-prefixes: Add Xingbangda
> >   arm64: dts: sun50i-a64-pinephone: Enable LCD support on PinePhone
> > 
> > Ondrej Jirman (11):
> >   dt-bindings: panel: Convert rocktech,jh057n00900 to yaml
> >   dt-bindings: panel: Add compatible for Xingbangda XBD599 panel
> >   drm/panel: rocktech-jh057n00900: Rename the driver to st7703
> >   drm/panel: st7703: Rename functions from jh057n prefix to st7703
> >   drm/panel: st7703: Prepare for supporting multiple panels
> >   drm/panel: st7703: Move code specific to jh057n closer together
> >   drm/panel: st7703: Move generic part of init sequence to enable
> >     callback
> >   drm/panel: st7703: Add support for Xingbangda XBD599
> >   drm/panel: st7703: Enter sleep after display off
> >   drm/panel: st7703: Assert reset prior to powering down the regulators
> >   arm64: dts: sun50i-a64-pinephone: Add touchscreen support
> > 
> >  .../display/panel/rocktech,jh057n00900.txt    |  23 -
> >  .../display/panel/rocktech,jh057n00900.yaml   |  70 ++
> >  .../devicetree/bindings/vendor-prefixes.yaml  |   2 +
> >  .../allwinner/sun50i-a64-pinephone-1.1.dts    |  19 +
> >  .../dts/allwinner/sun50i-a64-pinephone.dtsi   |  54 ++
> >  drivers/gpu/drm/panel/Kconfig                 |  26 +-
> >  drivers/gpu/drm/panel/Makefile                |   2 +-
> >  .../drm/panel/panel-rocktech-jh057n00900.c    | 424 -----------
> >  drivers/gpu/drm/panel/panel-sitronix-st7703.c | 656 ++++++++++++++++++
> >  9 files changed, 815 insertions(+), 461 deletions(-)
> >  delete mode 100644 Documentation/devicetree/bindings/display/panel/rocktech,jh057n00900.txt
> >  create mode 100644 Documentation/devicetree/bindings/display/panel/rocktech,jh057n00900.yaml
> >  delete mode 100644 drivers/gpu/drm/panel/panel-rocktech-jh057n00900.c
> >  create mode 100644 drivers/gpu/drm/panel/panel-sitronix-st7703.c
> > 
> > -- 
> > 2.27.0
> >
Ondřej Jirman July 1, 2020, 6:57 p.m. UTC | #15
Hi Icenowy,

On Wed, Jul 01, 2020 at 08:01:14PM +0800, Icenowy Zheng wrote:
> 
> 
> 于 2020年7月1日 GMT+08:00 下午6:31:26, Ondrej Jirman <megous@megous.com> 写到:
> >Pinephone has a Goodix GT917S capacitive touchscreen controller on
> >I2C0 bus. Add support for it.
> >
> >Signed-off-by: Ondrej Jirman <megous@megous.com>
> >Acked-by: Linus Walleij <linus.walleij@linaro.org>
> >---
> > .../dts/allwinner/sun50i-a64-pinephone.dtsi   | 19 +++++++++++++++++++
> > 1 file changed, 19 insertions(+)
> >
> >diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a64-pinephone.dtsi
> >b/arch/arm64/boot/dts/allwinner/sun50i-a64-pinephone.dtsi
> >index 85a7aa5efd32..2d5694446d17 100644
> >--- a/arch/arm64/boot/dts/allwinner/sun50i-a64-pinephone.dtsi
> >+++ b/arch/arm64/boot/dts/allwinner/sun50i-a64-pinephone.dtsi
> >@@ -123,6 +123,25 @@ &ehci1 {
> > 	status = "okay";
> > };
> > 
> >+&i2c0 {
> >+	pinctrl-names = "default";
> >+	pinctrl-0 = <&i2c0_pins>;
> >+	status = "okay";
> >+
> >+	touchscreen@5d {
> >+		compatible = "goodix,gt917s", "goodix,gt911";
> 
> Please drop gt911 here. GT917S belong to the GT1x product line, not the same line with GT911.
> 
> You will see this in the driver.

Right. I'll do so in v8.

thnk you and regards,
	o.

> >+		reg = <0x5d>;
> >+		interrupt-parent = <&pio>;
> >+		interrupts = <7 4 IRQ_TYPE_LEVEL_HIGH>; /* PH4 */
> >+		irq-gpios = <&pio 7 4 GPIO_ACTIVE_HIGH>; /* PH4 */
> >+		reset-gpios = <&pio 7 11 GPIO_ACTIVE_HIGH>; /* PH11 */
> >+		AVDD28-supply = <&reg_ldo_io0>;
> >+		VDDIO-supply = <&reg_ldo_io0>;
> >+		touchscreen-size-x = <720>;
> >+		touchscreen-size-y = <1440>;
> >+	};
> >+};
> >+
> > &i2c1 {
> > 	status = "okay";
> >