summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/msm/mdp/mdp_kms.h
diff options
context:
space:
mode:
authorRob Clark <robdclark@gmail.com>2013-11-30 17:24:22 -0500
committerRob Clark <robdclark@gmail.com>2014-01-09 14:44:05 -0500
commit9e0efa63565511dc75846e6b036a4b80e92b9a98 (patch)
tree4f9efd191aaf9cb622c9d451e96e4c3859e4850c /drivers/gpu/drm/msm/mdp/mdp_kms.h
parentdd2da6e34672100b5fd811fbf2cf97e29c08080f (diff)
downloadlinux-stable-9e0efa63565511dc75846e6b036a4b80e92b9a98.tar.gz
linux-stable-9e0efa63565511dc75846e6b036a4b80e92b9a98.tar.bz2
linux-stable-9e0efa63565511dc75846e6b036a4b80e92b9a98.zip
drm/msm: move irq utils to mdp_kms
We'll want basically the same thing for mdp5, so refactor it out so it can be shared. Signed-off-by: Rob Clark <robdclark@gmail.com>
Diffstat (limited to 'drivers/gpu/drm/msm/mdp/mdp_kms.h')
-rw-r--r--drivers/gpu/drm/msm/mdp/mdp_kms.h57
1 files changed, 56 insertions, 1 deletions
diff --git a/drivers/gpu/drm/msm/mdp/mdp_kms.h b/drivers/gpu/drm/msm/mdp/mdp_kms.h
index 710edf7e19d1..99557b5ad4fd 100644
--- a/drivers/gpu/drm/msm/mdp/mdp_kms.h
+++ b/drivers/gpu/drm/msm/mdp/mdp_kms.h
@@ -23,8 +23,64 @@
#include <linux/regulator/consumer.h>
#include "msm_drv.h"
+#include "msm_kms.h"
#include "mdp_common.xml.h"
+struct mdp_kms;
+
+struct mdp_kms_funcs {
+ struct msm_kms_funcs base;
+ void (*set_irqmask)(struct mdp_kms *mdp_kms, uint32_t irqmask);
+};
+
+struct mdp_kms {
+ struct msm_kms base;
+
+ const struct mdp_kms_funcs *funcs;
+
+ /* irq handling: */
+ bool in_irq;
+ struct list_head irq_list; /* list of mdp4_irq */
+ uint32_t vblank_mask; /* irq bits set for userspace vblank */
+};
+#define to_mdp_kms(x) container_of(x, struct mdp_kms, base)
+
+static inline void mdp_kms_init(struct mdp_kms *mdp_kms,
+ const struct mdp_kms_funcs *funcs)
+{
+ mdp_kms->funcs = funcs;
+ INIT_LIST_HEAD(&mdp_kms->irq_list);
+ msm_kms_init(&mdp_kms->base, &funcs->base);
+}
+
+/*
+ * irq helpers:
+ */
+
+/* For transiently registering for different MDP irqs that various parts
+ * of the KMS code need during setup/configuration. These are not
+ * necessarily the same as what drm_vblank_get/put() are requesting, and
+ * the hysteresis in drm_vblank_put() is not necessarily desirable for
+ * internal housekeeping related irq usage.
+ */
+struct mdp_irq {
+ struct list_head node;
+ uint32_t irqmask;
+ bool registered;
+ void (*irq)(struct mdp_irq *irq, uint32_t irqstatus);
+};
+
+void mdp_dispatch_irqs(struct mdp_kms *mdp_kms, uint32_t status);
+void mdp_update_vblank_mask(struct mdp_kms *mdp_kms, uint32_t mask, bool enable);
+void mdp_irq_wait(struct mdp_kms *mdp_kms, uint32_t irqmask);
+void mdp_irq_register(struct mdp_kms *mdp_kms, struct mdp_irq *irq);
+void mdp_irq_unregister(struct mdp_kms *mdp_kms, struct mdp_irq *irq);
+
+
+/*
+ * pixel format helpers:
+ */
+
struct mdp_format {
struct msm_format base;
enum mdp_bpc bpc_r, bpc_g, bpc_b;
@@ -35,7 +91,6 @@ struct mdp_format {
};
#define to_mdp_format(x) container_of(x, struct mdp_format, base)
-
uint32_t mdp_get_formats(uint32_t *formats, uint32_t max_formats);
const struct msm_format *mdp_get_format(struct msm_kms *kms, uint32_t format);