diff mbox series

drm/panel: novatek-nt35950: transition to mipi_dsi wrapped functions

Message ID 20240824084422.202946-1-tejasvipin76@gmail.com (mailing list archive)
State New, archived
Headers show
Series drm/panel: novatek-nt35950: transition to mipi_dsi wrapped functions | expand

Commit Message

Tejas Vipin Aug. 24, 2024, 8:44 a.m. UTC
Changes the novatek-nt35950 panel to use multi style functions for
improved error handling.

Signed-off-by: Tejas Vipin <tejasvipin76@gmail.com>
---
 drivers/gpu/drm/panel/panel-novatek-nt35950.c | 214 ++++++------------
 1 file changed, 70 insertions(+), 144 deletions(-)

Comments

Neil Armstrong Aug. 27, 2024, 4:32 p.m. UTC | #1
On 24/08/2024 10:44, Tejas Vipin wrote:
> Changes the novatek-nt35950 panel to use multi style functions for
> improved error handling.
> 
> Signed-off-by: Tejas Vipin <tejasvipin76@gmail.com>
> ---
>   drivers/gpu/drm/panel/panel-novatek-nt35950.c | 214 ++++++------------
>   1 file changed, 70 insertions(+), 144 deletions(-)
> 
> diff --git a/drivers/gpu/drm/panel/panel-novatek-nt35950.c b/drivers/gpu/drm/panel/panel-novatek-nt35950.c
> index 028fdac293f7..fa4db7a3bc25 100644
> --- a/drivers/gpu/drm/panel/panel-novatek-nt35950.c
> +++ b/drivers/gpu/drm/panel/panel-novatek-nt35950.c
> @@ -100,106 +100,89 @@ static void nt35950_reset(struct nt35950 *nt)
>   
>   /*
>    * nt35950_set_cmd2_page - Select manufacturer control (CMD2) page
> + * @dsi_ctx: context for mipi_dsi functions
>    * @nt:   Main driver structure
>    * @page: Page number (0-7)
> - *
> - * Return: Number of transferred bytes or negative number on error
>    */
> -static int nt35950_set_cmd2_page(struct nt35950 *nt, u8 page)
> +static void nt35950_set_cmd2_page(struct mipi_dsi_multi_context *dsi_ctx,
> +				  struct nt35950 *nt, u8 page)
>   {
>   	const u8 mauc_cmd2_page[] = { MCS_CMD_MAUCCTR, 0x55, 0xaa, 0x52,
>   				      0x08, page };
> -	int ret;
>   
> -	ret = mipi_dsi_dcs_write_buffer(nt->dsi[0], mauc_cmd2_page,
> +	mipi_dsi_dcs_write_buffer_multi(dsi_ctx, mauc_cmd2_page,
>   					ARRAY_SIZE(mauc_cmd2_page));
> -	if (ret < 0)
> -		return ret;
> +	if (dsi_ctx->accum_err)
> +		return;
>   
>   	nt->last_page = page;
> -	return 0;
>   }
>   
>   /*
>    * nt35950_set_data_compression - Set data compression mode
> + * @dsi_ctx: context for mipi_dsi functions
>    * @nt:        Main driver structure
>    * @comp_mode: Compression mode
> - *
> - * Return: Number of transferred bytes or negative number on error
>    */
> -static int nt35950_set_data_compression(struct nt35950 *nt, u8 comp_mode)
> +static void nt35950_set_data_compression(struct mipi_dsi_multi_context *dsi_ctx,
> +					 struct nt35950 *nt, u8 comp_mode)
>   {
>   	u8 cmd_data_compression[] = { MCS_PARAM_DATA_COMPRESSION, comp_mode };
>   	u8 cmd_vesa_dsc_on[] = { MCS_PARAM_VESA_DSC_ON, !!comp_mode };
>   	u8 cmd_vesa_dsc_setting[] = { MCS_PARAM_VESA_DSC_SETTING, 0x03 };
>   	u8 last_page = nt->last_page;
> -	int ret;
>   
>   	/* Set CMD2 Page 0 if we're not there yet */
> -	if (last_page != 0) {
> -		ret = nt35950_set_cmd2_page(nt, 0);
> -		if (ret < 0)
> -			return ret;
> -	}
> +	if (last_page != 0)
> +		nt35950_set_cmd2_page(dsi_ctx, nt, 0);
>   
> -	ret = mipi_dsi_dcs_write_buffer(nt->dsi[0], cmd_data_compression,
> +	mipi_dsi_dcs_write_buffer_multi(dsi_ctx, cmd_data_compression,
>   					ARRAY_SIZE(cmd_data_compression));
> -	if (ret < 0)
> -		return ret;
> -
> -	ret = mipi_dsi_dcs_write_buffer(nt->dsi[0], cmd_vesa_dsc_on,
> +	mipi_dsi_dcs_write_buffer_multi(dsi_ctx, cmd_vesa_dsc_on,
>   					ARRAY_SIZE(cmd_vesa_dsc_on));
> -	if (ret < 0)
> -		return ret;
>   
>   	/* Set the vesa dsc setting on Page 4 */
> -	ret = nt35950_set_cmd2_page(nt, 4);
> -	if (ret < 0)
> -		return ret;
> +	nt35950_set_cmd2_page(dsi_ctx, nt, 4);
>   
>   	/* Display Stream Compression setting, always 0x03 */
> -	ret = mipi_dsi_dcs_write_buffer(nt->dsi[0], cmd_vesa_dsc_setting,
> +	mipi_dsi_dcs_write_buffer_multi(dsi_ctx, cmd_vesa_dsc_setting,
>   					ARRAY_SIZE(cmd_vesa_dsc_setting));
> -	if (ret < 0)
> -		return ret;
>   
>   	/* Get back to the previously set page */
> -	return nt35950_set_cmd2_page(nt, last_page);
> +	nt35950_set_cmd2_page(dsi_ctx, nt, last_page);
>   }
>   
>   /*
>    * nt35950_set_scaler - Enable/disable resolution upscaling
> - * @nt:        Main driver structure
> + * @dsi_ctx: context for mipi_dsi functions
>    * @scale_up:  Scale up function control
> - *
> - * Return: Number of transferred bytes or negative number on error
>    */
> -static int nt35950_set_scaler(struct nt35950 *nt, u8 scale_up)
> +static void nt35950_set_scaler(struct mipi_dsi_multi_context *dsi_ctx,
> +			       u8 scale_up)
>   {
>   	u8 cmd_scaler[] = { MCS_PARAM_SCALER_FUNCTION, scale_up };
>   
> -	return mipi_dsi_dcs_write_buffer(nt->dsi[0], cmd_scaler,
> -					 ARRAY_SIZE(cmd_scaler));
> +	mipi_dsi_dcs_write_buffer_multi(dsi_ctx, cmd_scaler,
> +					ARRAY_SIZE(cmd_scaler));
>   }
>   
>   /*
>    * nt35950_set_scale_mode - Resolution upscaling mode
> - * @nt:   Main driver structure
> + * @dsi_ctx: context for mipi_dsi functions
>    * @mode: Scaler mode (MCS_DATA_COMPRESSION_*)
> - *
> - * Return: Number of transferred bytes or negative number on error
>    */
> -static int nt35950_set_scale_mode(struct nt35950 *nt, u8 mode)
> +static void nt35950_set_scale_mode(struct mipi_dsi_multi_context *dsi_ctx,
> +				   u8 mode)
>   {
>   	u8 cmd_scaler[] = { MCS_PARAM_SCALEUP_MODE, mode };
>   
> -	return mipi_dsi_dcs_write_buffer(nt->dsi[0], cmd_scaler,
> -					 ARRAY_SIZE(cmd_scaler));
> +	mipi_dsi_dcs_write_buffer_multi(dsi_ctx, cmd_scaler,
> +					ARRAY_SIZE(cmd_scaler));
>   }
>   
>   /*
>    * nt35950_inject_black_image - Display a completely black image
> - * @nt:   Main driver structure
> + * @dsi_ctx: context for mipi_dsi functions
>    *
>    * After IC setup, the attached panel may show random data
>    * due to driveric behavior changes (resolution, compression,
> @@ -208,43 +191,34 @@ static int nt35950_set_scale_mode(struct nt35950 *nt, u8 mode)
>    * the display.
>    * It makes sense to push a black image before sending the sleep-out
>    * and display-on commands.
> - *
> - * Return: Number of transferred bytes or negative number on error
>    */
> -static int nt35950_inject_black_image(struct nt35950 *nt)
> +static void nt35950_inject_black_image(struct mipi_dsi_multi_context *dsi_ctx)
>   {
>   	const u8 cmd0_black_img[] = { 0x6f, 0x01 };
>   	const u8 cmd1_black_img[] = { 0xf3, 0x10 };
>   	u8 cmd_test[] = { 0xff, 0xaa, 0x55, 0xa5, 0x80 };
> -	int ret;
>   
>   	/* Enable test command */
> -	ret = mipi_dsi_dcs_write_buffer(nt->dsi[0], cmd_test, ARRAY_SIZE(cmd_test));
> -	if (ret < 0)
> -		return ret;
> +	mipi_dsi_dcs_write_buffer_multi(dsi_ctx, cmd_test, ARRAY_SIZE(cmd_test));
>   
>   	/* Send a black image */
> -	ret = mipi_dsi_dcs_write_buffer(nt->dsi[0], cmd0_black_img,
> +	mipi_dsi_dcs_write_buffer_multi(dsi_ctx, cmd0_black_img,
>   					ARRAY_SIZE(cmd0_black_img));
> -	if (ret < 0)
> -		return ret;
> -	ret = mipi_dsi_dcs_write_buffer(nt->dsi[0], cmd1_black_img,
> +	mipi_dsi_dcs_write_buffer_multi(dsi_ctx, cmd1_black_img,
>   					ARRAY_SIZE(cmd1_black_img));
> -	if (ret < 0)
> -		return ret;
>   
>   	/* Disable test command */
>   	cmd_test[ARRAY_SIZE(cmd_test) - 1] = 0x00;
> -	return mipi_dsi_dcs_write_buffer(nt->dsi[0], cmd_test, ARRAY_SIZE(cmd_test));
> +	mipi_dsi_dcs_write_buffer_multi(dsi_ctx, cmd_test, ARRAY_SIZE(cmd_test));
>   }
>   
>   /*
>    * nt35950_set_dispout - Set Display Output register parameters
>    * @nt:    Main driver structure
> - *
> - * Return: Number of transferred bytes or negative number on error
> + * @dsi_ctx: context for mipi_dsi functions
>    */
> -static int nt35950_set_dispout(struct nt35950 *nt)
> +static void nt35950_set_dispout(struct mipi_dsi_multi_context *dsi_ctx,
> +				struct nt35950 *nt)
>   {
>   	u8 cmd_dispout[] = { MCS_PARAM_DISP_OUTPUT_CTRL, 0x00 };
>   	const struct nt35950_panel_mode *mode_data = nt->desc->mode_data;
> @@ -254,8 +228,8 @@ static int nt35950_set_dispout(struct nt35950 *nt)
>   	if (mode_data[nt->cur_mode].enable_sram)
>   		cmd_dispout[1] |= MCS_DISP_OUT_SRAM_EN;
>   
> -	return mipi_dsi_dcs_write_buffer(nt->dsi[0], cmd_dispout,
> -					 ARRAY_SIZE(cmd_dispout));
> +	mipi_dsi_dcs_write_buffer_multi(dsi_ctx, cmd_dispout,
> +					ARRAY_SIZE(cmd_dispout));
>   }
>   
>   static int nt35950_get_current_mode(struct nt35950 *nt)
> @@ -284,109 +258,68 @@ static int nt35950_on(struct nt35950 *nt)
>   {
>   	const struct nt35950_panel_mode *mode_data = nt->desc->mode_data;
>   	struct mipi_dsi_device *dsi = nt->dsi[0];
> -	struct device *dev = &dsi->dev;
> -	int ret;
> +	struct mipi_dsi_multi_context dsi_ctx = { .dsi = dsi };
>   
>   	nt->cur_mode = nt35950_get_current_mode(nt);
>   	nt->dsi[0]->mode_flags |= MIPI_DSI_MODE_LPM;
>   	nt->dsi[1]->mode_flags |= MIPI_DSI_MODE_LPM;
>   
> -	ret = nt35950_set_cmd2_page(nt, 0);
> -	if (ret < 0)
> -		return ret;
> -
> -	ret = nt35950_set_data_compression(nt, mode_data[nt->cur_mode].compression);
> -	if (ret < 0)
> -		return ret;
> -
> -	ret = nt35950_set_scale_mode(nt, mode_data[nt->cur_mode].scaler_mode);
> -	if (ret < 0)
> -		return ret;
> -
> -	ret = nt35950_set_scaler(nt, mode_data[nt->cur_mode].scaler_on);
> -	if (ret < 0)
> -		return ret;
> +	nt35950_set_cmd2_page(&dsi_ctx, nt, 0);
> +	nt35950_set_data_compression(&dsi_ctx, nt, mode_data[nt->cur_mode].compression);
> +	nt35950_set_scale_mode(&dsi_ctx, mode_data[nt->cur_mode].scaler_mode);
> +	nt35950_set_scaler(&dsi_ctx, mode_data[nt->cur_mode].scaler_on);
> +	nt35950_set_dispout(&dsi_ctx, nt);
>   
> -	ret = nt35950_set_dispout(nt);
> -	if (ret < 0)
> -		return ret;
> -
> -	ret = mipi_dsi_dcs_set_tear_on(dsi, MIPI_DSI_DCS_TEAR_MODE_VBLANK);
> -	if (ret < 0) {
> -		dev_err(dev, "Failed to set tear on: %d\n", ret);
> -		return ret;
> -	}
> -
> -	ret = mipi_dsi_dcs_set_tear_scanline(dsi, 0);
> -	if (ret < 0) {
> -		dev_err(dev, "Failed to set tear scanline: %d\n", ret);
> -		return ret;
> -	}
> +	mipi_dsi_dcs_set_tear_on_multi(&dsi_ctx, MIPI_DSI_DCS_TEAR_MODE_VBLANK);
> +	mipi_dsi_dcs_set_tear_scanline_multi(&dsi_ctx, 0);
>   
>   	/* CMD2 Page 1 */
> -	ret = nt35950_set_cmd2_page(nt, 1);
> -	if (ret < 0)
> -		return ret;
> +	nt35950_set_cmd2_page(&dsi_ctx, nt, 1);
>   
>   	/* Unknown command */
> -	mipi_dsi_dcs_write_seq(dsi, 0xd4, 0x88, 0x88);
> +	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xd4, 0x88, 0x88);
>   
>   	/* CMD2 Page 7 */
> -	ret = nt35950_set_cmd2_page(nt, 7);
> -	if (ret < 0)
> -		return ret;
> +	nt35950_set_cmd2_page(&dsi_ctx, nt, 7);
>   
>   	/* Enable SubPixel Rendering */
> -	mipi_dsi_dcs_write_seq(dsi, MCS_PARAM_SPR_EN, 0x01);
> +	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, MCS_PARAM_SPR_EN, 0x01);
>   
>   	/* SPR Mode: YYG Rainbow-RGB */
> -	mipi_dsi_dcs_write_seq(dsi, MCS_PARAM_SPR_MODE, MCS_SPR_MODE_YYG_RAINBOW_RGB);
> +	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, MCS_PARAM_SPR_MODE,
> +				     MCS_SPR_MODE_YYG_RAINBOW_RGB);
>   
>   	/* CMD3 */
> -	ret = nt35950_inject_black_image(nt);
> -	if (ret < 0)
> -		return ret;
> +	nt35950_inject_black_image(&dsi_ctx);
> +	mipi_dsi_dcs_exit_sleep_mode_multi(&dsi_ctx);
> +	mipi_dsi_msleep(&dsi_ctx, 120);
>   
> -	ret = mipi_dsi_dcs_exit_sleep_mode(dsi);
> -	if (ret < 0)
> -		return ret;
> -	msleep(120);
> -
> -	ret = mipi_dsi_dcs_set_display_on(dsi);
> -	if (ret < 0)
> -		return ret;
> -	msleep(120);
> +	mipi_dsi_dcs_set_display_on_multi(&dsi_ctx);
> +	mipi_dsi_msleep(&dsi_ctx, 120);
>   
>   	nt->dsi[0]->mode_flags &= ~MIPI_DSI_MODE_LPM;
>   	nt->dsi[1]->mode_flags &= ~MIPI_DSI_MODE_LPM;
>   
> -	return 0;
> +	return dsi_ctx.accum_err;
>   }
>   
>   static int nt35950_off(struct nt35950 *nt)
>   {
> -	struct device *dev = &nt->dsi[0]->dev;
> -	int ret;
> +	struct mipi_dsi_device *dsi = nt->dsi[0];
> +	struct mipi_dsi_multi_context dsi_ctx = { .dsi = dsi };
>   
> -	ret = mipi_dsi_dcs_set_display_off(nt->dsi[0]);
> -	if (ret < 0) {
> -		dev_err(dev, "Failed to set display off: %d\n", ret);
> -		goto set_lpm;
> -	}
> -	usleep_range(10000, 11000);
> +	mipi_dsi_dcs_set_display_off_multi(&dsi_ctx);
> +	mipi_dsi_usleep_range(&dsi_ctx, 10000, 11000);
>   
> -	ret = mipi_dsi_dcs_enter_sleep_mode(nt->dsi[0]);
> -	if (ret < 0) {
> -		dev_err(dev, "Failed to enter sleep mode: %d\n", ret);
> -		goto set_lpm;
> -	}
> -	msleep(150);
> +	mipi_dsi_dcs_enter_sleep_mode_multi(&dsi_ctx);
> +	mipi_dsi_msleep(&dsi_ctx, 150);
>   
> -set_lpm:
> -	nt->dsi[0]->mode_flags |= MIPI_DSI_MODE_LPM;
> -	nt->dsi[1]->mode_flags |= MIPI_DSI_MODE_LPM;
> +	if (dsi_ctx.accum_err) {
> +		nt->dsi[0]->mode_flags |= MIPI_DSI_MODE_LPM;
> +		nt->dsi[1]->mode_flags |= MIPI_DSI_MODE_LPM;
> +	}
>   
> -	return 0;
> +	return dsi_ctx.accum_err;
>   }
>   
>   static int nt35950_sharp_init_vregs(struct nt35950 *nt, struct device *dev)
> @@ -427,7 +360,6 @@ static int nt35950_sharp_init_vregs(struct nt35950 *nt, struct device *dev)
>   static int nt35950_prepare(struct drm_panel *panel)
>   {
>   	struct nt35950 *nt = to_nt35950(panel);
> -	struct device *dev = &nt->dsi[0]->dev;
>   	int ret;
>   
>   	ret = regulator_enable(nt->vregs[0].consumer);
> @@ -452,10 +384,8 @@ static int nt35950_prepare(struct drm_panel *panel)
>   	nt35950_reset(nt);
>   
>   	ret = nt35950_on(nt);
> -	if (ret < 0) {
> -		dev_err(dev, "Failed to initialize panel: %d\n", ret);
> +	if (ret < 0)
>   		goto end;
> -	}
>   
>   end:
>   	if (ret < 0) {
> @@ -469,12 +399,8 @@ static int nt35950_prepare(struct drm_panel *panel)
>   static int nt35950_unprepare(struct drm_panel *panel)
>   {
>   	struct nt35950 *nt = to_nt35950(panel);
> -	struct device *dev = &nt->dsi[0]->dev;
> -	int ret;
>   
> -	ret = nt35950_off(nt);
> -	if (ret < 0)
> -		dev_err(dev, "Failed to deinitialize panel: %d\n", ret);
> +	nt35950_off(nt);
>   
>   	gpiod_set_value_cansleep(nt->reset_gpio, 0);
>   	regulator_bulk_disable(ARRAY_SIZE(nt->vregs), nt->vregs);

Looks fine!

Reviewed-by: Neil Armstrong <neil.armstrong@linaro.org>
Doug Anderson Aug. 27, 2024, 7:26 p.m. UTC | #2
Hi,

On Sat, Aug 24, 2024 at 1:44 AM Tejas Vipin <tejasvipin76@gmail.com> wrote:
>
> +static void nt35950_set_cmd2_page(struct mipi_dsi_multi_context *dsi_ctx,
> +                                 struct nt35950 *nt, u8 page)
>  {
>         const u8 mauc_cmd2_page[] = { MCS_CMD_MAUCCTR, 0x55, 0xaa, 0x52,
>                                       0x08, page };
> -       int ret;
>
> -       ret = mipi_dsi_dcs_write_buffer(nt->dsi[0], mauc_cmd2_page,
> +       mipi_dsi_dcs_write_buffer_multi(dsi_ctx, mauc_cmd2_page,
>                                         ARRAY_SIZE(mauc_cmd2_page));
> -       if (ret < 0)
> -               return ret;
> +       if (dsi_ctx->accum_err)
> +               return;
>
>         nt->last_page = page;
> -       return 0;

nit: It's a style choice, but I personally would have changed the above to just:

if (!dsi_ctx->accum_err)
  nt->last_page = page;


> @@ -284,109 +258,68 @@ static int nt35950_on(struct nt35950 *nt)
>  {
>         const struct nt35950_panel_mode *mode_data = nt->desc->mode_data;
>         struct mipi_dsi_device *dsi = nt->dsi[0];
> -       struct device *dev = &dsi->dev;
> -       int ret;
> +       struct mipi_dsi_multi_context dsi_ctx = { .dsi = dsi };
>
>         nt->cur_mode = nt35950_get_current_mode(nt);
>         nt->dsi[0]->mode_flags |= MIPI_DSI_MODE_LPM;
>         nt->dsi[1]->mode_flags |= MIPI_DSI_MODE_LPM;
>
> -       ret = nt35950_set_cmd2_page(nt, 0);
> -       if (ret < 0)
> -               return ret;
> -
> -       ret = nt35950_set_data_compression(nt, mode_data[nt->cur_mode].compression);
> -       if (ret < 0)
> -               return ret;
> -
> -       ret = nt35950_set_scale_mode(nt, mode_data[nt->cur_mode].scaler_mode);
> -       if (ret < 0)
> -               return ret;
> -
> -       ret = nt35950_set_scaler(nt, mode_data[nt->cur_mode].scaler_on);
> -       if (ret < 0)
> -               return ret;
> +       nt35950_set_cmd2_page(&dsi_ctx, nt, 0);
> +       nt35950_set_data_compression(&dsi_ctx, nt, mode_data[nt->cur_mode].compression);
> +       nt35950_set_scale_mode(&dsi_ctx, mode_data[nt->cur_mode].scaler_mode);
> +       nt35950_set_scaler(&dsi_ctx, mode_data[nt->cur_mode].scaler_on);
> +       nt35950_set_dispout(&dsi_ctx, nt);
>
> -       ret = nt35950_set_dispout(nt);
> -       if (ret < 0)
> -               return ret;
> -
> -       ret = mipi_dsi_dcs_set_tear_on(dsi, MIPI_DSI_DCS_TEAR_MODE_VBLANK);
> -       if (ret < 0) {
> -               dev_err(dev, "Failed to set tear on: %d\n", ret);
> -               return ret;
> -       }
> -
> -       ret = mipi_dsi_dcs_set_tear_scanline(dsi, 0);
> -       if (ret < 0) {
> -               dev_err(dev, "Failed to set tear scanline: %d\n", ret);
> -               return ret;
> -       }
> +       mipi_dsi_dcs_set_tear_on_multi(&dsi_ctx, MIPI_DSI_DCS_TEAR_MODE_VBLANK);
> +       mipi_dsi_dcs_set_tear_scanline_multi(&dsi_ctx, 0);
>
>         /* CMD2 Page 1 */
> -       ret = nt35950_set_cmd2_page(nt, 1);
> -       if (ret < 0)
> -               return ret;
> +       nt35950_set_cmd2_page(&dsi_ctx, nt, 1);
>
>         /* Unknown command */
> -       mipi_dsi_dcs_write_seq(dsi, 0xd4, 0x88, 0x88);
> +       mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xd4, 0x88, 0x88);
>
>         /* CMD2 Page 7 */
> -       ret = nt35950_set_cmd2_page(nt, 7);
> -       if (ret < 0)
> -               return ret;
> +       nt35950_set_cmd2_page(&dsi_ctx, nt, 7);
>
>         /* Enable SubPixel Rendering */
> -       mipi_dsi_dcs_write_seq(dsi, MCS_PARAM_SPR_EN, 0x01);
> +       mipi_dsi_dcs_write_seq_multi(&dsi_ctx, MCS_PARAM_SPR_EN, 0x01);
>
>         /* SPR Mode: YYG Rainbow-RGB */
> -       mipi_dsi_dcs_write_seq(dsi, MCS_PARAM_SPR_MODE, MCS_SPR_MODE_YYG_RAINBOW_RGB);
> +       mipi_dsi_dcs_write_seq_multi(&dsi_ctx, MCS_PARAM_SPR_MODE,
> +                                    MCS_SPR_MODE_YYG_RAINBOW_RGB);
>
>         /* CMD3 */
> -       ret = nt35950_inject_black_image(nt);
> -       if (ret < 0)
> -               return ret;
> +       nt35950_inject_black_image(&dsi_ctx);
> +       mipi_dsi_dcs_exit_sleep_mode_multi(&dsi_ctx);
> +       mipi_dsi_msleep(&dsi_ctx, 120);
>
> -       ret = mipi_dsi_dcs_exit_sleep_mode(dsi);
> -       if (ret < 0)
> -               return ret;
> -       msleep(120);
> -
> -       ret = mipi_dsi_dcs_set_display_on(dsi);
> -       if (ret < 0)
> -               return ret;
> -       msleep(120);
> +       mipi_dsi_dcs_set_display_on_multi(&dsi_ctx);
> +       mipi_dsi_msleep(&dsi_ctx, 120);
>
>         nt->dsi[0]->mode_flags &= ~MIPI_DSI_MODE_LPM;
>         nt->dsi[1]->mode_flags &= ~MIPI_DSI_MODE_LPM;
>
> -       return 0;
> +       return dsi_ctx.accum_err;

I think you only want to clear "MIPI_DSI_MODE_LPM" if there was no
error, right? That matches the old code. So you'd want:

if (dsi_ctx.accum_err)
  return dsi_ctx.accum_err;

nt->dsi[0]->mode_flags &= ~MIPI_DSI_MODE_LPM;
nt->dsi[1]->mode_flags &= ~MIPI_DSI_MODE_LPM;

return 0;


>  static int nt35950_off(struct nt35950 *nt)
>  {
> -       struct device *dev = &nt->dsi[0]->dev;
> -       int ret;
> +       struct mipi_dsi_device *dsi = nt->dsi[0];
> +       struct mipi_dsi_multi_context dsi_ctx = { .dsi = dsi };
>
> -       ret = mipi_dsi_dcs_set_display_off(nt->dsi[0]);
> -       if (ret < 0) {
> -               dev_err(dev, "Failed to set display off: %d\n", ret);
> -               goto set_lpm;
> -       }
> -       usleep_range(10000, 11000);
> +       mipi_dsi_dcs_set_display_off_multi(&dsi_ctx);
> +       mipi_dsi_usleep_range(&dsi_ctx, 10000, 11000);
>
> -       ret = mipi_dsi_dcs_enter_sleep_mode(nt->dsi[0]);
> -       if (ret < 0) {
> -               dev_err(dev, "Failed to enter sleep mode: %d\n", ret);
> -               goto set_lpm;
> -       }
> -       msleep(150);
> +       mipi_dsi_dcs_enter_sleep_mode_multi(&dsi_ctx);
> +       mipi_dsi_msleep(&dsi_ctx, 150);
>
> -set_lpm:
> -       nt->dsi[0]->mode_flags |= MIPI_DSI_MODE_LPM;
> -       nt->dsi[1]->mode_flags |= MIPI_DSI_MODE_LPM;
> +       if (dsi_ctx.accum_err) {
> +               nt->dsi[0]->mode_flags |= MIPI_DSI_MODE_LPM;
> +               nt->dsi[1]->mode_flags |= MIPI_DSI_MODE_LPM;
> +       }

I'm pretty sure you want to set MIPI_DSI_MODE_LPM _unconditionally,
right? The old code would set it in both error and non-error cases I
think.


> @@ -452,10 +384,8 @@ static int nt35950_prepare(struct drm_panel *panel)
>         nt35950_reset(nt);
>
>         ret = nt35950_on(nt);
> -       if (ret < 0) {
> -               dev_err(dev, "Failed to initialize panel: %d\n", ret);
> +       if (ret < 0)
>                 goto end;
> -       }

I'd just get rid of the "if" test since "end" is next anyway. Given
that there's no error message it seems silly to have the "if" test
now.


> @@ -469,12 +399,8 @@ static int nt35950_prepare(struct drm_panel *panel)
>  static int nt35950_unprepare(struct drm_panel *panel)
>  {
>         struct nt35950 *nt = to_nt35950(panel);
> -       struct device *dev = &nt->dsi[0]->dev;
> -       int ret;
>
> -       ret = nt35950_off(nt);
> -       if (ret < 0)
> -               dev_err(dev, "Failed to deinitialize panel: %d\n", ret);
> +       nt35950_off(nt);

This is the only caller of nt35950_off() and you no longer check the
return code, so you can just make nt35950_off() void, right?
diff mbox series

Patch

diff --git a/drivers/gpu/drm/panel/panel-novatek-nt35950.c b/drivers/gpu/drm/panel/panel-novatek-nt35950.c
index 028fdac293f7..fa4db7a3bc25 100644
--- a/drivers/gpu/drm/panel/panel-novatek-nt35950.c
+++ b/drivers/gpu/drm/panel/panel-novatek-nt35950.c
@@ -100,106 +100,89 @@  static void nt35950_reset(struct nt35950 *nt)
 
 /*
  * nt35950_set_cmd2_page - Select manufacturer control (CMD2) page
+ * @dsi_ctx: context for mipi_dsi functions
  * @nt:   Main driver structure
  * @page: Page number (0-7)
- *
- * Return: Number of transferred bytes or negative number on error
  */
-static int nt35950_set_cmd2_page(struct nt35950 *nt, u8 page)
+static void nt35950_set_cmd2_page(struct mipi_dsi_multi_context *dsi_ctx,
+				  struct nt35950 *nt, u8 page)
 {
 	const u8 mauc_cmd2_page[] = { MCS_CMD_MAUCCTR, 0x55, 0xaa, 0x52,
 				      0x08, page };
-	int ret;
 
-	ret = mipi_dsi_dcs_write_buffer(nt->dsi[0], mauc_cmd2_page,
+	mipi_dsi_dcs_write_buffer_multi(dsi_ctx, mauc_cmd2_page,
 					ARRAY_SIZE(mauc_cmd2_page));
-	if (ret < 0)
-		return ret;
+	if (dsi_ctx->accum_err)
+		return;
 
 	nt->last_page = page;
-	return 0;
 }
 
 /*
  * nt35950_set_data_compression - Set data compression mode
+ * @dsi_ctx: context for mipi_dsi functions
  * @nt:        Main driver structure
  * @comp_mode: Compression mode
- *
- * Return: Number of transferred bytes or negative number on error
  */
-static int nt35950_set_data_compression(struct nt35950 *nt, u8 comp_mode)
+static void nt35950_set_data_compression(struct mipi_dsi_multi_context *dsi_ctx,
+					 struct nt35950 *nt, u8 comp_mode)
 {
 	u8 cmd_data_compression[] = { MCS_PARAM_DATA_COMPRESSION, comp_mode };
 	u8 cmd_vesa_dsc_on[] = { MCS_PARAM_VESA_DSC_ON, !!comp_mode };
 	u8 cmd_vesa_dsc_setting[] = { MCS_PARAM_VESA_DSC_SETTING, 0x03 };
 	u8 last_page = nt->last_page;
-	int ret;
 
 	/* Set CMD2 Page 0 if we're not there yet */
-	if (last_page != 0) {
-		ret = nt35950_set_cmd2_page(nt, 0);
-		if (ret < 0)
-			return ret;
-	}
+	if (last_page != 0)
+		nt35950_set_cmd2_page(dsi_ctx, nt, 0);
 
-	ret = mipi_dsi_dcs_write_buffer(nt->dsi[0], cmd_data_compression,
+	mipi_dsi_dcs_write_buffer_multi(dsi_ctx, cmd_data_compression,
 					ARRAY_SIZE(cmd_data_compression));
-	if (ret < 0)
-		return ret;
-
-	ret = mipi_dsi_dcs_write_buffer(nt->dsi[0], cmd_vesa_dsc_on,
+	mipi_dsi_dcs_write_buffer_multi(dsi_ctx, cmd_vesa_dsc_on,
 					ARRAY_SIZE(cmd_vesa_dsc_on));
-	if (ret < 0)
-		return ret;
 
 	/* Set the vesa dsc setting on Page 4 */
-	ret = nt35950_set_cmd2_page(nt, 4);
-	if (ret < 0)
-		return ret;
+	nt35950_set_cmd2_page(dsi_ctx, nt, 4);
 
 	/* Display Stream Compression setting, always 0x03 */
-	ret = mipi_dsi_dcs_write_buffer(nt->dsi[0], cmd_vesa_dsc_setting,
+	mipi_dsi_dcs_write_buffer_multi(dsi_ctx, cmd_vesa_dsc_setting,
 					ARRAY_SIZE(cmd_vesa_dsc_setting));
-	if (ret < 0)
-		return ret;
 
 	/* Get back to the previously set page */
-	return nt35950_set_cmd2_page(nt, last_page);
+	nt35950_set_cmd2_page(dsi_ctx, nt, last_page);
 }
 
 /*
  * nt35950_set_scaler - Enable/disable resolution upscaling
- * @nt:        Main driver structure
+ * @dsi_ctx: context for mipi_dsi functions
  * @scale_up:  Scale up function control
- *
- * Return: Number of transferred bytes or negative number on error
  */
-static int nt35950_set_scaler(struct nt35950 *nt, u8 scale_up)
+static void nt35950_set_scaler(struct mipi_dsi_multi_context *dsi_ctx,
+			       u8 scale_up)
 {
 	u8 cmd_scaler[] = { MCS_PARAM_SCALER_FUNCTION, scale_up };
 
-	return mipi_dsi_dcs_write_buffer(nt->dsi[0], cmd_scaler,
-					 ARRAY_SIZE(cmd_scaler));
+	mipi_dsi_dcs_write_buffer_multi(dsi_ctx, cmd_scaler,
+					ARRAY_SIZE(cmd_scaler));
 }
 
 /*
  * nt35950_set_scale_mode - Resolution upscaling mode
- * @nt:   Main driver structure
+ * @dsi_ctx: context for mipi_dsi functions
  * @mode: Scaler mode (MCS_DATA_COMPRESSION_*)
- *
- * Return: Number of transferred bytes or negative number on error
  */
-static int nt35950_set_scale_mode(struct nt35950 *nt, u8 mode)
+static void nt35950_set_scale_mode(struct mipi_dsi_multi_context *dsi_ctx,
+				   u8 mode)
 {
 	u8 cmd_scaler[] = { MCS_PARAM_SCALEUP_MODE, mode };
 
-	return mipi_dsi_dcs_write_buffer(nt->dsi[0], cmd_scaler,
-					 ARRAY_SIZE(cmd_scaler));
+	mipi_dsi_dcs_write_buffer_multi(dsi_ctx, cmd_scaler,
+					ARRAY_SIZE(cmd_scaler));
 }
 
 /*
  * nt35950_inject_black_image - Display a completely black image
- * @nt:   Main driver structure
+ * @dsi_ctx: context for mipi_dsi functions
  *
  * After IC setup, the attached panel may show random data
  * due to driveric behavior changes (resolution, compression,
@@ -208,43 +191,34 @@  static int nt35950_set_scale_mode(struct nt35950 *nt, u8 mode)
  * the display.
  * It makes sense to push a black image before sending the sleep-out
  * and display-on commands.
- *
- * Return: Number of transferred bytes or negative number on error
  */
-static int nt35950_inject_black_image(struct nt35950 *nt)
+static void nt35950_inject_black_image(struct mipi_dsi_multi_context *dsi_ctx)
 {
 	const u8 cmd0_black_img[] = { 0x6f, 0x01 };
 	const u8 cmd1_black_img[] = { 0xf3, 0x10 };
 	u8 cmd_test[] = { 0xff, 0xaa, 0x55, 0xa5, 0x80 };
-	int ret;
 
 	/* Enable test command */
-	ret = mipi_dsi_dcs_write_buffer(nt->dsi[0], cmd_test, ARRAY_SIZE(cmd_test));
-	if (ret < 0)
-		return ret;
+	mipi_dsi_dcs_write_buffer_multi(dsi_ctx, cmd_test, ARRAY_SIZE(cmd_test));
 
 	/* Send a black image */
-	ret = mipi_dsi_dcs_write_buffer(nt->dsi[0], cmd0_black_img,
+	mipi_dsi_dcs_write_buffer_multi(dsi_ctx, cmd0_black_img,
 					ARRAY_SIZE(cmd0_black_img));
-	if (ret < 0)
-		return ret;
-	ret = mipi_dsi_dcs_write_buffer(nt->dsi[0], cmd1_black_img,
+	mipi_dsi_dcs_write_buffer_multi(dsi_ctx, cmd1_black_img,
 					ARRAY_SIZE(cmd1_black_img));
-	if (ret < 0)
-		return ret;
 
 	/* Disable test command */
 	cmd_test[ARRAY_SIZE(cmd_test) - 1] = 0x00;
-	return mipi_dsi_dcs_write_buffer(nt->dsi[0], cmd_test, ARRAY_SIZE(cmd_test));
+	mipi_dsi_dcs_write_buffer_multi(dsi_ctx, cmd_test, ARRAY_SIZE(cmd_test));
 }
 
 /*
  * nt35950_set_dispout - Set Display Output register parameters
  * @nt:    Main driver structure
- *
- * Return: Number of transferred bytes or negative number on error
+ * @dsi_ctx: context for mipi_dsi functions
  */
-static int nt35950_set_dispout(struct nt35950 *nt)
+static void nt35950_set_dispout(struct mipi_dsi_multi_context *dsi_ctx,
+				struct nt35950 *nt)
 {
 	u8 cmd_dispout[] = { MCS_PARAM_DISP_OUTPUT_CTRL, 0x00 };
 	const struct nt35950_panel_mode *mode_data = nt->desc->mode_data;
@@ -254,8 +228,8 @@  static int nt35950_set_dispout(struct nt35950 *nt)
 	if (mode_data[nt->cur_mode].enable_sram)
 		cmd_dispout[1] |= MCS_DISP_OUT_SRAM_EN;
 
-	return mipi_dsi_dcs_write_buffer(nt->dsi[0], cmd_dispout,
-					 ARRAY_SIZE(cmd_dispout));
+	mipi_dsi_dcs_write_buffer_multi(dsi_ctx, cmd_dispout,
+					ARRAY_SIZE(cmd_dispout));
 }
 
 static int nt35950_get_current_mode(struct nt35950 *nt)
@@ -284,109 +258,68 @@  static int nt35950_on(struct nt35950 *nt)
 {
 	const struct nt35950_panel_mode *mode_data = nt->desc->mode_data;
 	struct mipi_dsi_device *dsi = nt->dsi[0];
-	struct device *dev = &dsi->dev;
-	int ret;
+	struct mipi_dsi_multi_context dsi_ctx = { .dsi = dsi };
 
 	nt->cur_mode = nt35950_get_current_mode(nt);
 	nt->dsi[0]->mode_flags |= MIPI_DSI_MODE_LPM;
 	nt->dsi[1]->mode_flags |= MIPI_DSI_MODE_LPM;
 
-	ret = nt35950_set_cmd2_page(nt, 0);
-	if (ret < 0)
-		return ret;
-
-	ret = nt35950_set_data_compression(nt, mode_data[nt->cur_mode].compression);
-	if (ret < 0)
-		return ret;
-
-	ret = nt35950_set_scale_mode(nt, mode_data[nt->cur_mode].scaler_mode);
-	if (ret < 0)
-		return ret;
-
-	ret = nt35950_set_scaler(nt, mode_data[nt->cur_mode].scaler_on);
-	if (ret < 0)
-		return ret;
+	nt35950_set_cmd2_page(&dsi_ctx, nt, 0);
+	nt35950_set_data_compression(&dsi_ctx, nt, mode_data[nt->cur_mode].compression);
+	nt35950_set_scale_mode(&dsi_ctx, mode_data[nt->cur_mode].scaler_mode);
+	nt35950_set_scaler(&dsi_ctx, mode_data[nt->cur_mode].scaler_on);
+	nt35950_set_dispout(&dsi_ctx, nt);
 
-	ret = nt35950_set_dispout(nt);
-	if (ret < 0)
-		return ret;
-
-	ret = mipi_dsi_dcs_set_tear_on(dsi, MIPI_DSI_DCS_TEAR_MODE_VBLANK);
-	if (ret < 0) {
-		dev_err(dev, "Failed to set tear on: %d\n", ret);
-		return ret;
-	}
-
-	ret = mipi_dsi_dcs_set_tear_scanline(dsi, 0);
-	if (ret < 0) {
-		dev_err(dev, "Failed to set tear scanline: %d\n", ret);
-		return ret;
-	}
+	mipi_dsi_dcs_set_tear_on_multi(&dsi_ctx, MIPI_DSI_DCS_TEAR_MODE_VBLANK);
+	mipi_dsi_dcs_set_tear_scanline_multi(&dsi_ctx, 0);
 
 	/* CMD2 Page 1 */
-	ret = nt35950_set_cmd2_page(nt, 1);
-	if (ret < 0)
-		return ret;
+	nt35950_set_cmd2_page(&dsi_ctx, nt, 1);
 
 	/* Unknown command */
-	mipi_dsi_dcs_write_seq(dsi, 0xd4, 0x88, 0x88);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xd4, 0x88, 0x88);
 
 	/* CMD2 Page 7 */
-	ret = nt35950_set_cmd2_page(nt, 7);
-	if (ret < 0)
-		return ret;
+	nt35950_set_cmd2_page(&dsi_ctx, nt, 7);
 
 	/* Enable SubPixel Rendering */
-	mipi_dsi_dcs_write_seq(dsi, MCS_PARAM_SPR_EN, 0x01);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, MCS_PARAM_SPR_EN, 0x01);
 
 	/* SPR Mode: YYG Rainbow-RGB */
-	mipi_dsi_dcs_write_seq(dsi, MCS_PARAM_SPR_MODE, MCS_SPR_MODE_YYG_RAINBOW_RGB);
+	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, MCS_PARAM_SPR_MODE,
+				     MCS_SPR_MODE_YYG_RAINBOW_RGB);
 
 	/* CMD3 */
-	ret = nt35950_inject_black_image(nt);
-	if (ret < 0)
-		return ret;
+	nt35950_inject_black_image(&dsi_ctx);
+	mipi_dsi_dcs_exit_sleep_mode_multi(&dsi_ctx);
+	mipi_dsi_msleep(&dsi_ctx, 120);
 
-	ret = mipi_dsi_dcs_exit_sleep_mode(dsi);
-	if (ret < 0)
-		return ret;
-	msleep(120);
-
-	ret = mipi_dsi_dcs_set_display_on(dsi);
-	if (ret < 0)
-		return ret;
-	msleep(120);
+	mipi_dsi_dcs_set_display_on_multi(&dsi_ctx);
+	mipi_dsi_msleep(&dsi_ctx, 120);
 
 	nt->dsi[0]->mode_flags &= ~MIPI_DSI_MODE_LPM;
 	nt->dsi[1]->mode_flags &= ~MIPI_DSI_MODE_LPM;
 
-	return 0;
+	return dsi_ctx.accum_err;
 }
 
 static int nt35950_off(struct nt35950 *nt)
 {
-	struct device *dev = &nt->dsi[0]->dev;
-	int ret;
+	struct mipi_dsi_device *dsi = nt->dsi[0];
+	struct mipi_dsi_multi_context dsi_ctx = { .dsi = dsi };
 
-	ret = mipi_dsi_dcs_set_display_off(nt->dsi[0]);
-	if (ret < 0) {
-		dev_err(dev, "Failed to set display off: %d\n", ret);
-		goto set_lpm;
-	}
-	usleep_range(10000, 11000);
+	mipi_dsi_dcs_set_display_off_multi(&dsi_ctx);
+	mipi_dsi_usleep_range(&dsi_ctx, 10000, 11000);
 
-	ret = mipi_dsi_dcs_enter_sleep_mode(nt->dsi[0]);
-	if (ret < 0) {
-		dev_err(dev, "Failed to enter sleep mode: %d\n", ret);
-		goto set_lpm;
-	}
-	msleep(150);
+	mipi_dsi_dcs_enter_sleep_mode_multi(&dsi_ctx);
+	mipi_dsi_msleep(&dsi_ctx, 150);
 
-set_lpm:
-	nt->dsi[0]->mode_flags |= MIPI_DSI_MODE_LPM;
-	nt->dsi[1]->mode_flags |= MIPI_DSI_MODE_LPM;
+	if (dsi_ctx.accum_err) {
+		nt->dsi[0]->mode_flags |= MIPI_DSI_MODE_LPM;
+		nt->dsi[1]->mode_flags |= MIPI_DSI_MODE_LPM;
+	}
 
-	return 0;
+	return dsi_ctx.accum_err;
 }
 
 static int nt35950_sharp_init_vregs(struct nt35950 *nt, struct device *dev)
@@ -427,7 +360,6 @@  static int nt35950_sharp_init_vregs(struct nt35950 *nt, struct device *dev)
 static int nt35950_prepare(struct drm_panel *panel)
 {
 	struct nt35950 *nt = to_nt35950(panel);
-	struct device *dev = &nt->dsi[0]->dev;
 	int ret;
 
 	ret = regulator_enable(nt->vregs[0].consumer);
@@ -452,10 +384,8 @@  static int nt35950_prepare(struct drm_panel *panel)
 	nt35950_reset(nt);
 
 	ret = nt35950_on(nt);
-	if (ret < 0) {
-		dev_err(dev, "Failed to initialize panel: %d\n", ret);
+	if (ret < 0)
 		goto end;
-	}
 
 end:
 	if (ret < 0) {
@@ -469,12 +399,8 @@  static int nt35950_prepare(struct drm_panel *panel)
 static int nt35950_unprepare(struct drm_panel *panel)
 {
 	struct nt35950 *nt = to_nt35950(panel);
-	struct device *dev = &nt->dsi[0]->dev;
-	int ret;
 
-	ret = nt35950_off(nt);
-	if (ret < 0)
-		dev_err(dev, "Failed to deinitialize panel: %d\n", ret);
+	nt35950_off(nt);
 
 	gpiod_set_value_cansleep(nt->reset_gpio, 0);
 	regulator_bulk_disable(ARRAY_SIZE(nt->vregs), nt->vregs);