On Fri, May 6, 2022 at 2:18 PM Joel Selvaraj <jo@xxxxxxxxxxx> wrote: > Add DRM panel driver for EBBG FT8719 6.18" 2246x1080 DSI video mode > panel, which can be found on some Xiaomi Poco F1 phones. The panel's > backlight is managed through QCOM WLED driver. > > Signed-off-by: Joel Selvaraj <jo@xxxxxxxxxxx> Cool! > +#define dsi_generic_write_seq(dsi, seq...) do { \ > + static const u8 d[] = { seq }; \ > + int ret; \ > + ret = mipi_dsi_generic_write(dsi, d, ARRAY_SIZE(d)); \ > + if (ret < 0) \ > + return ret; \ > + } while (0) > + > +#define dsi_dcs_write_seq(dsi, seq...) do { \ > + static const u8 d[] = { seq }; \ > + int ret; \ > + ret = mipi_dsi_dcs_write_buffer(dsi, d, ARRAY_SIZE(d)); \ > + if (ret < 0) \ > + return ret; \ > + } while (0) First I don't see what the do {} while (0) buys you, just use a basic block {}. Second look at mipi_dbi_command() in include/drm/drm_mipi_dbi.h this is very similar. So this utility macro should be in a generic file such as include/drm/drm_mipi_dsi.h. (Can be added in a separate patch.) Third I think you need only one macro (see below). > +static int ebbg_ft8719_on(struct ebbg_ft8719 *ctx) > +{ > + struct mipi_dsi_device *dsi = ctx->dsi; > + struct device *dev = &dsi->dev; > + int ret; > + > + dsi->mode_flags |= MIPI_DSI_MODE_LPM; > + > + dsi_dcs_write_seq(dsi, 0x00, 0x00); > + dsi_generic_write_seq(dsi, 0xff, 0x87, 0x19, 0x01); It's dubious that you always have dsi_dcs_write_seq() followed by dsi_generic_write_seq(). That means mipi_dsi_generic_write() followed by mipi_dsi_dcs_write_buffer(). But if you look at these commands in drivers/gpu/drm/drm_mipi_dsi.c you see that they do the same thing! Doesn't it work to combine them into one call for each pair? > + dsi_dcs_write_seq(dsi, 0x00, 0x80); > + dsi_generic_write_seq(dsi, 0xff, 0x87, 0x19); Lots of magic numbers. You don't have a datasheet do you? So you could #define some of the magic? > + if (ctx->prepared) > + return 0; (...) > + ctx->prepared = true; > + return 0; (...) > + if (!ctx->prepared) > + return 0; (...) > + ctx->prepared = false; > + return 0; Drop this state variable it is a reimplementation of something that the core will track for you. The rest looks nice! Yours, Linus Walleij