Commit a2b3a557 authored by Archit Taneja's avatar Archit Taneja Committed by Rob Clark

drm/msm: Get irq number within kms driver itself

The driver gets the irq number using platform_get_irq on the main kms
platform device. This works fine since both MDP4 and MDP5 currently
have a flat device hierarchy. The platform device tied with the
drm_device points to the MDP DT node in both cases.

This won't work when MDP5 supports a tree-like hierarchy. In this
case, the platform device tied to the top level drm_device is the
MDSS DT node, and the irq we need for KMS is the one generated by
MDP5, not MDSS.

Get the irq number from the MDP4/5 kms driver itself. Each driver
can later provide the irq number based on what device hierarchy it
uses.

While we're at it, call drm_irq_install only when we have a valid KMS
driver.
Signed-off-by: default avatarArchit Taneja <architt@codeaurora.org>
Signed-off-by: default avatarRob Clark <robdclark@gmail.com>
parent 7429d860
...@@ -436,7 +436,7 @@ struct msm_kms *mdp4_kms_init(struct drm_device *dev) ...@@ -436,7 +436,7 @@ struct msm_kms *mdp4_kms_init(struct drm_device *dev)
struct mdp4_kms *mdp4_kms; struct mdp4_kms *mdp4_kms;
struct msm_kms *kms = NULL; struct msm_kms *kms = NULL;
struct msm_mmu *mmu; struct msm_mmu *mmu;
int ret; int irq, ret;
mdp4_kms = kzalloc(sizeof(*mdp4_kms), GFP_KERNEL); mdp4_kms = kzalloc(sizeof(*mdp4_kms), GFP_KERNEL);
if (!mdp4_kms) { if (!mdp4_kms) {
...@@ -457,6 +457,15 @@ struct msm_kms *mdp4_kms_init(struct drm_device *dev) ...@@ -457,6 +457,15 @@ struct msm_kms *mdp4_kms_init(struct drm_device *dev)
goto fail; goto fail;
} }
irq = platform_get_irq(pdev, 0);
if (irq < 0) {
ret = irq;
dev_err(dev->dev, "failed to get irq: %d\n", ret);
goto fail;
}
kms->irq = irq;
/* NOTE: driver for this regulator still missing upstream.. use /* NOTE: driver for this regulator still missing upstream.. use
* _get_exclusive() and ignore the error if it does not exist * _get_exclusive() and ignore the error if it does not exist
* (and hope that the bootloader left it on for us) * (and hope that the bootloader left it on for us)
......
...@@ -580,7 +580,7 @@ struct msm_kms *mdp5_kms_init(struct drm_device *dev) ...@@ -580,7 +580,7 @@ struct msm_kms *mdp5_kms_init(struct drm_device *dev)
struct msm_kms *kms = NULL; struct msm_kms *kms = NULL;
struct msm_mmu *mmu; struct msm_mmu *mmu;
uint32_t major, minor; uint32_t major, minor;
int i, ret; int irq, i, ret;
mdp5_kms = kzalloc(sizeof(*mdp5_kms), GFP_KERNEL); mdp5_kms = kzalloc(sizeof(*mdp5_kms), GFP_KERNEL);
if (!mdp5_kms) { if (!mdp5_kms) {
...@@ -610,6 +610,15 @@ struct msm_kms *mdp5_kms_init(struct drm_device *dev) ...@@ -610,6 +610,15 @@ struct msm_kms *mdp5_kms_init(struct drm_device *dev)
goto fail; goto fail;
} }
irq = platform_get_irq(pdev, 0);
if (irq < 0) {
ret = irq;
dev_err(dev->dev, "failed to get irq: %d\n", ret);
goto fail;
}
kms->irq = irq;
mdp5_kms->vdd = devm_regulator_get(&pdev->dev, "vdd"); mdp5_kms->vdd = devm_regulator_get(&pdev->dev, "vdd");
if (IS_ERR(mdp5_kms->vdd)) { if (IS_ERR(mdp5_kms->vdd)) {
ret = PTR_ERR(mdp5_kms->vdd); ret = PTR_ERR(mdp5_kms->vdd);
......
...@@ -417,12 +417,14 @@ static int msm_drm_init(struct device *dev, struct drm_driver *drv) ...@@ -417,12 +417,14 @@ static int msm_drm_init(struct device *dev, struct drm_driver *drv)
goto fail; goto fail;
} }
pm_runtime_get_sync(dev); if (kms) {
ret = drm_irq_install(ddev, platform_get_irq(pdev, 0)); pm_runtime_get_sync(dev);
pm_runtime_put_sync(dev); ret = drm_irq_install(ddev, kms->irq);
if (ret < 0) { pm_runtime_put_sync(dev);
dev_err(dev, "failed to install IRQ handler\n"); if (ret < 0) {
goto fail; dev_err(dev, "failed to install IRQ handler\n");
goto fail;
}
} }
ret = drm_dev_register(ddev, 0); ret = drm_dev_register(ddev, 0);
......
...@@ -60,6 +60,9 @@ struct msm_kms_funcs { ...@@ -60,6 +60,9 @@ struct msm_kms_funcs {
struct msm_kms { struct msm_kms {
const struct msm_kms_funcs *funcs; const struct msm_kms_funcs *funcs;
/* irq number to be passed on to drm_irq_install */
int irq;
}; };
static inline void msm_kms_init(struct msm_kms *kms, static inline void msm_kms_init(struct msm_kms *kms,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment