mirror of
https://git.proxmox.com/git/mirror_ubuntu-kernels.git
synced 2025-12-07 18:50:41 +00:00
drm/msm/mdp4: move resource allocation to the _probe function
To let the probe function bail early if any of the resources is unavailable, move resource allocattion from kms_init directly to the probe callback. While we are at it, replace irq_of_parse_and_map() with platform_get_irq(). Reviewed-by: Abhinav Kumar <quic_abhinavk@quicinc.com> Reviewed-by: Rob Clark <robdclark@gmail.com> Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org> Patchwork: https://patchwork.freedesktop.org/patch/561628/ Signed-off-by: Rob Clark <robdclark@chromium.org>
This commit is contained in:
parent
c53a1aeee4
commit
3c74682637
@ -135,8 +135,6 @@ static void mdp4_destroy(struct msm_kms *kms)
|
||||
pm_runtime_disable(dev);
|
||||
|
||||
mdp_kms_destroy(&mdp4_kms->base);
|
||||
|
||||
kfree(mdp4_kms);
|
||||
}
|
||||
|
||||
static const struct mdp_kms_funcs kms_funcs = {
|
||||
@ -380,56 +378,27 @@ static int mdp4_kms_init(struct drm_device *dev)
|
||||
{
|
||||
struct platform_device *pdev = to_platform_device(dev->dev);
|
||||
struct msm_drm_private *priv = dev->dev_private;
|
||||
struct mdp4_kms *mdp4_kms;
|
||||
struct mdp4_kms *mdp4_kms = to_mdp4_kms(to_mdp_kms(priv->kms));
|
||||
struct msm_kms *kms = NULL;
|
||||
struct msm_mmu *mmu;
|
||||
struct msm_gem_address_space *aspace;
|
||||
int irq, ret;
|
||||
int ret;
|
||||
u32 major, minor;
|
||||
unsigned long max_clk;
|
||||
|
||||
/* TODO: Chips that aren't apq8064 have a 200 Mhz max_clk */
|
||||
max_clk = 266667000;
|
||||
|
||||
mdp4_kms = kzalloc(sizeof(*mdp4_kms), GFP_KERNEL);
|
||||
if (!mdp4_kms) {
|
||||
DRM_DEV_ERROR(dev->dev, "failed to allocate kms\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
ret = mdp_kms_init(&mdp4_kms->base, &kms_funcs);
|
||||
if (ret) {
|
||||
DRM_DEV_ERROR(dev->dev, "failed to init kms\n");
|
||||
goto fail;
|
||||
}
|
||||
|
||||
priv->kms = &mdp4_kms->base.base;
|
||||
kms = priv->kms;
|
||||
|
||||
mdp4_kms->dev = dev;
|
||||
|
||||
mdp4_kms->mmio = msm_ioremap(pdev, NULL);
|
||||
if (IS_ERR(mdp4_kms->mmio)) {
|
||||
ret = PTR_ERR(mdp4_kms->mmio);
|
||||
goto fail;
|
||||
}
|
||||
|
||||
irq = platform_get_irq(pdev, 0);
|
||||
if (irq < 0) {
|
||||
ret = irq;
|
||||
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)
|
||||
*/
|
||||
mdp4_kms->vdd = devm_regulator_get_exclusive(&pdev->dev, "vdd");
|
||||
if (IS_ERR(mdp4_kms->vdd))
|
||||
mdp4_kms->vdd = NULL;
|
||||
|
||||
if (mdp4_kms->vdd) {
|
||||
ret = regulator_enable(mdp4_kms->vdd);
|
||||
if (ret) {
|
||||
@ -438,24 +407,6 @@ static int mdp4_kms_init(struct drm_device *dev)
|
||||
}
|
||||
}
|
||||
|
||||
mdp4_kms->clk = devm_clk_get(&pdev->dev, "core_clk");
|
||||
if (IS_ERR(mdp4_kms->clk)) {
|
||||
DRM_DEV_ERROR(dev->dev, "failed to get core_clk\n");
|
||||
ret = PTR_ERR(mdp4_kms->clk);
|
||||
goto fail;
|
||||
}
|
||||
|
||||
mdp4_kms->pclk = devm_clk_get(&pdev->dev, "iface_clk");
|
||||
if (IS_ERR(mdp4_kms->pclk))
|
||||
mdp4_kms->pclk = NULL;
|
||||
|
||||
mdp4_kms->axi_clk = devm_clk_get(&pdev->dev, "bus_clk");
|
||||
if (IS_ERR(mdp4_kms->axi_clk)) {
|
||||
DRM_DEV_ERROR(dev->dev, "failed to get axi_clk\n");
|
||||
ret = PTR_ERR(mdp4_kms->axi_clk);
|
||||
goto fail;
|
||||
}
|
||||
|
||||
clk_set_rate(mdp4_kms->clk, max_clk);
|
||||
|
||||
read_mdp_hw_revision(mdp4_kms, &major, &minor);
|
||||
@ -470,10 +421,9 @@ static int mdp4_kms_init(struct drm_device *dev)
|
||||
mdp4_kms->rev = minor;
|
||||
|
||||
if (mdp4_kms->rev >= 2) {
|
||||
mdp4_kms->lut_clk = devm_clk_get(&pdev->dev, "lut_clk");
|
||||
if (IS_ERR(mdp4_kms->lut_clk)) {
|
||||
if (!mdp4_kms->lut_clk) {
|
||||
DRM_DEV_ERROR(dev->dev, "failed to get lut_clk\n");
|
||||
ret = PTR_ERR(mdp4_kms->lut_clk);
|
||||
ret = -ENODEV;
|
||||
goto fail;
|
||||
}
|
||||
clk_set_rate(mdp4_kms->lut_clk, max_clk);
|
||||
@ -557,7 +507,53 @@ static const struct dev_pm_ops mdp4_pm_ops = {
|
||||
|
||||
static int mdp4_probe(struct platform_device *pdev)
|
||||
{
|
||||
return msm_drv_probe(&pdev->dev, mdp4_kms_init, NULL);
|
||||
struct device *dev = &pdev->dev;
|
||||
struct mdp4_kms *mdp4_kms;
|
||||
int irq;
|
||||
|
||||
mdp4_kms = devm_kzalloc(dev, sizeof(*mdp4_kms), GFP_KERNEL);
|
||||
if (!mdp4_kms)
|
||||
return dev_err_probe(dev, -ENOMEM, "failed to allocate kms\n");
|
||||
|
||||
mdp4_kms->mmio = msm_ioremap(pdev, NULL);
|
||||
if (IS_ERR(mdp4_kms->mmio))
|
||||
return PTR_ERR(mdp4_kms->mmio);
|
||||
|
||||
irq = platform_get_irq(pdev, 0);
|
||||
if (irq < 0)
|
||||
return dev_err_probe(dev, irq, "failed to get irq\n");
|
||||
|
||||
mdp4_kms->base.base.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)
|
||||
*/
|
||||
mdp4_kms->vdd = devm_regulator_get_exclusive(&pdev->dev, "vdd");
|
||||
if (IS_ERR(mdp4_kms->vdd))
|
||||
mdp4_kms->vdd = NULL;
|
||||
|
||||
mdp4_kms->clk = devm_clk_get(&pdev->dev, "core_clk");
|
||||
if (IS_ERR(mdp4_kms->clk))
|
||||
return dev_err_probe(dev, PTR_ERR(mdp4_kms->clk), "failed to get core_clk\n");
|
||||
|
||||
mdp4_kms->pclk = devm_clk_get(&pdev->dev, "iface_clk");
|
||||
if (IS_ERR(mdp4_kms->pclk))
|
||||
mdp4_kms->pclk = NULL;
|
||||
|
||||
mdp4_kms->axi_clk = devm_clk_get(&pdev->dev, "bus_clk");
|
||||
if (IS_ERR(mdp4_kms->axi_clk))
|
||||
return dev_err_probe(dev, PTR_ERR(mdp4_kms->axi_clk), "failed to get axi_clk\n");
|
||||
|
||||
/*
|
||||
* This is required for revn >= 2. Handle errors here and let the kms
|
||||
* init bail out if the clock is not provided.
|
||||
*/
|
||||
mdp4_kms->lut_clk = devm_clk_get_optional(&pdev->dev, "lut_clk");
|
||||
if (IS_ERR(mdp4_kms->lut_clk))
|
||||
return dev_err_probe(dev, PTR_ERR(mdp4_kms->lut_clk), "failed to get lut_clk\n");
|
||||
|
||||
return msm_drv_probe(&pdev->dev, mdp4_kms_init, &mdp4_kms->base.base);
|
||||
}
|
||||
|
||||
static int mdp4_remove(struct platform_device *pdev)
|
||||
|
||||
Loading…
Reference in New Issue
Block a user