mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-06 02:50:43 +00:00
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: Archit Taneja <architt@codeaurora.org> Signed-off-by: Rob Clark <robdclark@gmail.com>
This commit is contained in:
parent
7429d860c1
commit
a2b3a5571f
4 changed files with 31 additions and 8 deletions
|
@ -436,7 +436,7 @@ struct msm_kms *mdp4_kms_init(struct drm_device *dev)
|
|||
struct mdp4_kms *mdp4_kms;
|
||||
struct msm_kms *kms = NULL;
|
||||
struct msm_mmu *mmu;
|
||||
int ret;
|
||||
int irq, ret;
|
||||
|
||||
mdp4_kms = kzalloc(sizeof(*mdp4_kms), GFP_KERNEL);
|
||||
if (!mdp4_kms) {
|
||||
|
@ -457,6 +457,15 @@ struct msm_kms *mdp4_kms_init(struct drm_device *dev)
|
|||
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
|
||||
* _get_exclusive() and ignore the error if it does not exist
|
||||
* (and hope that the bootloader left it on for us)
|
||||
|
|
|
@ -580,7 +580,7 @@ struct msm_kms *mdp5_kms_init(struct drm_device *dev)
|
|||
struct msm_kms *kms = NULL;
|
||||
struct msm_mmu *mmu;
|
||||
uint32_t major, minor;
|
||||
int i, ret;
|
||||
int irq, i, ret;
|
||||
|
||||
mdp5_kms = kzalloc(sizeof(*mdp5_kms), GFP_KERNEL);
|
||||
if (!mdp5_kms) {
|
||||
|
@ -610,6 +610,15 @@ struct msm_kms *mdp5_kms_init(struct drm_device *dev)
|
|||
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");
|
||||
if (IS_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)
|
|||
goto fail;
|
||||
}
|
||||
|
||||
pm_runtime_get_sync(dev);
|
||||
ret = drm_irq_install(ddev, platform_get_irq(pdev, 0));
|
||||
pm_runtime_put_sync(dev);
|
||||
if (ret < 0) {
|
||||
dev_err(dev, "failed to install IRQ handler\n");
|
||||
goto fail;
|
||||
if (kms) {
|
||||
pm_runtime_get_sync(dev);
|
||||
ret = drm_irq_install(ddev, kms->irq);
|
||||
pm_runtime_put_sync(dev);
|
||||
if (ret < 0) {
|
||||
dev_err(dev, "failed to install IRQ handler\n");
|
||||
goto fail;
|
||||
}
|
||||
}
|
||||
|
||||
ret = drm_dev_register(ddev, 0);
|
||||
|
|
|
@ -60,6 +60,9 @@ struct msm_kms_funcs {
|
|||
|
||||
struct msm_kms {
|
||||
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,
|
||||
|
|
Loading…
Reference in a new issue