[PATCH 1/4] drm/mipi-dbi: Support command mode panel drivers

Noralf Trønnes noralf at tronnes.org
Mon Aug 12 12:05:36 UTC 2019



Den 11.08.2019 16.16, skrev Sam Ravnborg:
> Hi Noralf.
> 
> I really like how this allows us to have a single file for all
> the uses of a driver IC.
> And this patch-set is much easier to grasp than the first RFC.
> 
> General things:
> 
> - The current design have a tight connection between the display
>   controller and the panel. Will this hurt in the long run?
>   In other words, should we try to add a panel_bridge in-between?
>   For now I think this would just make something simple more
>   complicated.
>   So this note was to say - no I think we should not use panel_bridge.
> 

I did look at panel_bridge but it didn't give me anything I needed, it
would only be a 1:1 passthrough layer.

> - drm_panel has proper support for modes.
>   This is today duplicated in mipi_dbi.
>   Could we make it so that when a panel is used then the panel
>   has the mode info - as we then use the panel more in the way we do
>   in other cases?
>   As it is now the mode is specified in mipi_dbi_dev_init()
>   The drm_connector would then, if a panel is used, ask the panel for
>   the mode.
>   I did not really think to the end of this, but it seems wrong that
>   we introduce drm_panel and then keep modes in mipi_dbi.
> 

I considered that, but it would would just generate duplicate code for
the connector. It would make sense to refactor this when/if all mipi dbi
drivers are turned into panel drivers.

> - For backlight support please move this to drm_panel.
>   I have patches that makes it simple to use backlight with drm_panel,
>   and this will then benefit from it.
>   The drm_panel backlight supports requires that a backlight
>   phandle is specified in the DT node of the panel.
> 

I can fix that when I respin if those patches have landed by then.

> Some more specific comments in the following.
> 
> 	Sam
> 
> On Thu, Aug 01, 2019 at 03:52:46PM +0200, Noralf Trønnes wrote:
>> This adds a function that registers a DRM driver for use with MIPI DBI
>> panels in command mode. That is, framebuffer upload over DBI.
>>
>> Signed-off-by: Noralf Trønnes <noralf at tronnes.org>
>> ---
>>  drivers/gpu/drm/drm_mipi_dbi.c | 92 ++++++++++++++++++++++++++++++++++
>>  include/drm/drm_mipi_dbi.h     | 34 +++++++++++++
>>  2 files changed, 126 insertions(+)
>>
>> diff --git a/drivers/gpu/drm/drm_mipi_dbi.c b/drivers/gpu/drm/drm_mipi_dbi.c
>> index 1961f713aaab..797a20e3a017 100644
>> --- a/drivers/gpu/drm/drm_mipi_dbi.c
>> +++ b/drivers/gpu/drm/drm_mipi_dbi.c
>> @@ -17,11 +17,13 @@
>>  #include <drm/drm_damage_helper.h>
>>  #include <drm/drm_drv.h>
>>  #include <drm/drm_gem_cma_helper.h>
>> +#include <drm/drm_fb_helper.h>
>>  #include <drm/drm_format_helper.h>
>>  #include <drm/drm_fourcc.h>
>>  #include <drm/drm_gem_framebuffer_helper.h>
>>  #include <drm/drm_mipi_dbi.h>
>>  #include <drm/drm_modes.h>
>> +#include <drm/drm_panel.h>
>>  #include <drm/drm_probe_helper.h>
>>  #include <drm/drm_rect.h>
>>  #include <drm/drm_vblank.h>
>> @@ -597,6 +599,96 @@ void mipi_dbi_release(struct drm_device *drm)
>>  }
>>  EXPORT_SYMBOL(mipi_dbi_release);
>>  
>> +static void drm_mipi_dbi_panel_pipe_enable(struct drm_simple_display_pipe *pipe,
>> +					   struct drm_crtc_state *crtc_state,
>> +					   struct drm_plane_state *plane_state)
>> +{
>> +	struct mipi_dbi_dev *dbidev = drm_to_mipi_dbi_dev(pipe->crtc.dev);
>> +	struct drm_panel *panel = dbidev->panel;
>> +	int ret, idx;
>> +
>> +	if (!drm_dev_enter(pipe->crtc.dev, &idx))
>> +		return;
>> +
>> +	DRM_DEBUG_KMS("\n");
> Still usefull?
> 

No I think this can go (it was in the code I copied from the driver).

>> +
>> +	ret = drm_panel_prepare(panel);
>> +	if (ret)
>> +		goto out_exit;
>> +
>> +	mipi_dbi_enable_flush(dbidev, crtc_state, plane_state);
>> +
>> +	drm_panel_enable(panel);
>> +out_exit:
> nit - blank line above label?
> 
>> +	drm_dev_exit(idx);
>> +}
>> +
>> +static void drm_mipi_dbi_panel_pipe_disable(struct drm_simple_display_pipe *pipe)
>> +{
>> +	struct mipi_dbi_dev *dbidev = drm_to_mipi_dbi_dev(pipe->crtc.dev);
>> +	struct drm_panel *panel = dbidev->panel;
>> +
>> +	if (!dbidev->enabled)
>> +		return;
>> +
>> +	DRM_DEBUG_KMS("\n");
> Still usefull?
>> +
>> +	dbidev->enabled = false;
>> +	drm_panel_disable(panel);
>> +	drm_panel_unprepare(panel);
>> +}
>> +
>> +static const struct drm_simple_display_pipe_funcs drm_mipi_dbi_pipe_funcs = {
>> +	.enable = drm_mipi_dbi_panel_pipe_enable,
>> +	.disable = drm_mipi_dbi_panel_pipe_disable,
>> +	.update = mipi_dbi_pipe_update,
>> +	.prepare_fb = drm_gem_fb_simple_display_pipe_prepare_fb,
>> +};
>> +
>> +/**
>> + * drm_mipi_dbi_panel_register - Register a MIPI DBI DRM driver
>> + * @panel: DRM Panel
>> + * @dbidev: MIPI DBI device structure to initialize
>> + * @mode: Display mode
>> + *
>> + * This function registeres a DRM driver with @panel attached.
>> + *
>> + * Returns:
>> + * Zero on success, negative error code on failure.
>> + */
>> +int drm_mipi_dbi_panel_register(struct drm_panel *panel, struct mipi_dbi_dev *dbidev,
>> +				struct drm_driver *driver, const struct drm_display_mode *mode,
>> +				u32 rotation)
> Can we make this use enum drm_panel_orientation - so we can use
> of_drm_get_panel_orientation() in the callers?
> of_drm_get_panel_orientation() is not merged yet, but we could do so if
> this patch-set needs it.
> 
> I know that this would require mipi_dbi_dev_init() and all users to be
> updated. But it is a simpler interface so worth it.
> 

That would break rotation on userspace that doesn't know about the panel
orientation property which is a recent addition. These panels are mostly
used in the embedded world not desktop. It also would break fbdev 90/270
rotation (see drm_client_rotation()).

Noralf.

>> +{
>> +	struct device *dev = panel->dev;
>> +	struct drm_device *drm;
>> +	int ret;
>> +
>> +	dbidev->panel = panel;
>> +
>> +	drm = &dbidev->drm;
>> +	ret = devm_drm_dev_init(dev, drm, driver);
>> +	if (ret) {
>> +		kfree(dbidev);
>> +		return ret;
>> +	}
>> +
>> +	drm_mode_config_init(drm);
>> +
>> +	ret = mipi_dbi_dev_init(dbidev, &drm_mipi_dbi_pipe_funcs, mode, rotation);
>> +
>> +	drm_mode_config_reset(drm);
>> +
>> +	ret = drm_dev_register(drm, 0);
>> +	if (ret)
>> +		return ret;
>> +
>> +	drm_fbdev_generic_setup(drm, 16);
>> +
>> +	return 0;
>> +}
>> +EXPORT_SYMBOL(drm_mipi_dbi_panel_register);
>> +
>>  /**
>>   * mipi_dbi_hw_reset - Hardware reset of controller
>>   * @dbi: MIPI DBI structure


More information about the dri-devel mailing list