
From: Frederik Aalund fpa@sbtinstruments.com
Some devices have their own framebuffer memory that is not shared directly with the CPU. For said devices, we need to copy U-boot's framebuffer (priv->fb) to the device's own framebuffer memory. E.g., via SPI.
To support these devices, I've added the copy_fb_to_hw op. It's optional, so existing drivers do not need to define this op.
I've used this new op to add support for the SSD2119 display panel driver over 4-wire SPI. I'll add this video driver in a subsequent patch.
Signed-off-by: Frederik Aalund fpa@sbtinstruments.com [agust: add Kconfig option] Signed-off-by: Anatolij Gustschin agust@denx.de --- Changes in v2: - make this copy op optional and add Kconfig entry - check 'ops' pointer before dereferencing
drivers/video/Kconfig | 10 ++++++++++ drivers/video/video-uclass.c | 18 ++++++++++++++++++ include/video.h | 8 +++++++- 3 files changed, 35 insertions(+), 1 deletion(-)
diff --git a/drivers/video/Kconfig b/drivers/video/Kconfig index e2e1f9c476..bb8c033d3d 100644 --- a/drivers/video/Kconfig +++ b/drivers/video/Kconfig @@ -53,6 +53,16 @@ config VIDEO_COPY To use this, your video driver must set @copy_base in struct video_uc_platdata.
+config VIDEO_COPY_TO_HW + bool "Enable copying the frame buffer to external display hardware" + depends on DM_VIDEO + help + Some devices have their own framebuffer memory that is not + shared directly with the CPU. For such devices, the framebuffer + must be copied to the device's own framebuffer memory, e.g. via SPI. + Enable this option and implement video_ops copy_fb_to_hw() to + support this feature. + config BACKLIGHT_PWM bool "Generic PWM based Backlight Driver" depends on BACKLIGHT && DM_PWM diff --git a/drivers/video/video-uclass.c b/drivers/video/video-uclass.c index 650891e49d..00e861bd55 100644 --- a/drivers/video/video-uclass.c +++ b/drivers/video/video-uclass.c @@ -196,6 +196,24 @@ void video_sync(struct udevice *vid, bool force) last_sync = get_timer(0); } #endif + /* + * Some devices have their own framebuffer memory that is not + * shared directly with the CPU. For said devices, we need to + * copy U-Boot's framebuffer (priv->fb) to the device's own + * framebuffer memory. E.g., via SPI. + */ + if (IS_ENABLED(CONFIG_VIDEO_COPY_TO_HW)) { + struct video_ops *ops = video_get_ops(vid); + int ret; + + if (ops && ops->copy_fb_to_hw) { + ret = ops->copy_fb_to_hw(vid); + if (ret) { + dev_err(vid, "Could not copy frame buffer to hardware: %d\n", + ret); + } + } + } }
void video_sync_all(void) diff --git a/include/video.h b/include/video.h index 9d09d2409a..91ade65a73 100644 --- a/include/video.h +++ b/include/video.h @@ -114,8 +114,14 @@ struct video_priv { u8 bg_col_idx; };
-/* Placeholder - there are no video operations at present */ struct video_ops { + /** + * copy_fb_to_hw() - Copy the current frame buffer to the hardware + * + * @dev: Video device + * @return 0 if OK, -ve on error + */ + int (*copy_fb_to_hw)(struct udevice *dev); };
#define video_get_ops(dev) ((struct video_ops *)(dev)->driver->ops)