Skip to content

Commit

Permalink
drm/panel: ilitek-ili9881c: Explicitly set address mode, allow 180° r…
Browse files Browse the repository at this point in the history
…otation

We can use horizontal and vertical flipping via the MIPI DCS address
mode to rotate the display by 180° using the device tree "rotation"
property. Since the tl050hdv35 panel has been defined as rotated,
we have to invert the bits there.

Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
Reviewed-by: Neil Armstrong <neil.armstrong@linaro.org>
Link: https://lore.kernel.org/r/20240626-drm-panel-ili9881c-rotation-v1-1-e0ff54173e32@pengutronix.de
Signed-off-by: Neil Armstrong <neil.armstrong@linaro.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20240626-drm-panel-ili9881c-rotation-v1-1-e0ff54173e32@pengutronix.de
  • Loading branch information
Philipp Zabel authored and Neil Armstrong committed Oct 9, 2024
1 parent 15bda06 commit b64e7d5
Showing 1 changed file with 17 additions and 2 deletions.
19 changes: 17 additions & 2 deletions drivers/gpu/drm/panel/panel-ilitek-ili9881c.c
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ struct ili9881c_desc {
const size_t init_length;
const struct drm_display_mode *mode;
const unsigned long mode_flags;
u8 default_address_mode;
};

struct ili9881c {
Expand All @@ -53,6 +54,7 @@ struct ili9881c {
struct gpio_desc *reset;

enum drm_panel_orientation orientation;
u8 address_mode;
};

#define ILI9881C_SWITCH_PAGE_INSTR(_page) \
Expand Down Expand Up @@ -815,8 +817,6 @@ static const struct ili9881c_instr tl050hdv35_init[] = {
ILI9881C_COMMAND_INSTR(0xd1, 0x4b),
ILI9881C_COMMAND_INSTR(0xd2, 0x60),
ILI9881C_COMMAND_INSTR(0xd3, 0x39),
ILI9881C_SWITCH_PAGE_INSTR(0),
ILI9881C_COMMAND_INSTR(0x36, 0x03),
};

static const struct ili9881c_instr w552946ab_init[] = {
Expand Down Expand Up @@ -1299,6 +1299,14 @@ static int ili9881c_prepare(struct drm_panel *panel)
if (ret)
return ret;

if (ctx->address_mode) {
ret = mipi_dsi_dcs_write(ctx->dsi, MIPI_DCS_SET_ADDRESS_MODE,
&ctx->address_mode,
sizeof(ctx->address_mode));
if (ret < 0)
return ret;
}

ret = mipi_dsi_dcs_set_tear_on(ctx->dsi, MIPI_DSI_DCS_TEAR_MODE_VBLANK);
if (ret)
return ret;
Expand Down Expand Up @@ -1521,6 +1529,12 @@ static int ili9881c_dsi_probe(struct mipi_dsi_device *dsi)
return ret;
}

ctx->address_mode = ctx->desc->default_address_mode;
if (ctx->orientation == DRM_MODE_PANEL_ORIENTATION_BOTTOM_UP) {
ctx->address_mode ^= 0x03;
ctx->orientation = DRM_MODE_PANEL_ORIENTATION_NORMAL;
}

ctx->panel.prepare_prev_first = true;

ret = drm_panel_of_backlight(&ctx->panel);
Expand Down Expand Up @@ -1572,6 +1586,7 @@ static const struct ili9881c_desc tl050hdv35_desc = {
.mode = &tl050hdv35_default_mode,
.mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_SYNC_PULSE |
MIPI_DSI_MODE_LPM,
.default_address_mode = 0x03,
};

static const struct ili9881c_desc w552946aba_desc = {
Expand Down

0 comments on commit b64e7d5

Please sign in to comment.