Message ID | 20200701103126.1512615-1-megous@megous.com |
---|---|
Headers | show |
Series | Add support for PinePhone LCD panel | expand |
于 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 = <®_ldo_io0>; >+ VDDIO-supply = <®_ldo_io0>; >+ touchscreen-size-x = <720>; >+ touchscreen-size-y = <1440>; >+ }; >+}; >+ > &i2c1 { > status = "okay"; >
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
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 >
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 >
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 >
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 >
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 >
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 >
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 >
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 >
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 >
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
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
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 > >
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 = <®_ldo_io0>; > >+ VDDIO-supply = <®_ldo_io0>; > >+ touchscreen-size-x = <720>; > >+ touchscreen-size-y = <1440>; > >+ }; > >+}; > >+ > > &i2c1 { > > status = "okay"; > >