
Because the HDLCD driver acts as a component master it can end up enabling the runtime PM functionality before the encoders are initialised. This can cause crashes if the component slave never probes (missing module) or if the PM operations kick in before the probe finishes. Move the enabling of the runtime PM after the component master has finished collecting the slave components and use the DRM atomic helpers to suspend and resume the device. Tested-by: Robin Murphy <Robin.Murphy@arm.com> Signed-off-by: Liviu Dudau <Liviu.Dudau@arm.com>
42 lines
966 B
C
42 lines
966 B
C
/*
|
|
* ARM HDLCD Controller register definition
|
|
*/
|
|
|
|
#ifndef __HDLCD_DRV_H__
|
|
#define __HDLCD_DRV_H__
|
|
|
|
struct hdlcd_drm_private {
|
|
void __iomem *mmio;
|
|
struct clk *clk;
|
|
struct drm_fbdev_cma *fbdev;
|
|
struct drm_framebuffer *fb;
|
|
struct list_head event_list;
|
|
struct drm_crtc crtc;
|
|
struct drm_plane *plane;
|
|
struct drm_atomic_state *state;
|
|
#ifdef CONFIG_DEBUG_FS
|
|
atomic_t buffer_underrun_count;
|
|
atomic_t bus_error_count;
|
|
atomic_t vsync_count;
|
|
atomic_t dma_end_count;
|
|
#endif
|
|
};
|
|
|
|
#define crtc_to_hdlcd_priv(x) container_of(x, struct hdlcd_drm_private, crtc)
|
|
|
|
static inline void hdlcd_write(struct hdlcd_drm_private *hdlcd,
|
|
unsigned int reg, u32 value)
|
|
{
|
|
writel(value, hdlcd->mmio + reg);
|
|
}
|
|
|
|
static inline u32 hdlcd_read(struct hdlcd_drm_private *hdlcd, unsigned int reg)
|
|
{
|
|
return readl(hdlcd->mmio + reg);
|
|
}
|
|
|
|
int hdlcd_setup_crtc(struct drm_device *dev);
|
|
void hdlcd_set_scanout(struct hdlcd_drm_private *hdlcd);
|
|
|
|
#endif /* __HDLCD_DRV_H__ */
|