aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/meson/meson_drv.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/meson/meson_drv.c')
-rw-r--r--drivers/gpu/drm/meson/meson_drv.c37
1 files changed, 26 insertions, 11 deletions
diff --git a/drivers/gpu/drm/meson/meson_drv.c b/drivers/gpu/drm/meson/meson_drv.c
index f9ad0e960263..32b1a6cdecfc 100644
--- a/drivers/gpu/drm/meson/meson_drv.c
+++ b/drivers/gpu/drm/meson/meson_drv.c
@@ -189,40 +189,55 @@ static int meson_drv_bind_master(struct device *dev, bool has_components)
189 189
190 res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "vpu"); 190 res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "vpu");
191 regs = devm_ioremap_resource(dev, res); 191 regs = devm_ioremap_resource(dev, res);
192 if (IS_ERR(regs)) 192 if (IS_ERR(regs)) {
193 return PTR_ERR(regs); 193 ret = PTR_ERR(regs);
194 goto free_drm;
195 }
194 196
195 priv->io_base = regs; 197 priv->io_base = regs;
196 198
197 res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "hhi"); 199 res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "hhi");
200 if (!res)
201 return -EINVAL;
198 /* Simply ioremap since it may be a shared register zone */ 202 /* Simply ioremap since it may be a shared register zone */
199 regs = devm_ioremap(dev, res->start, resource_size(res)); 203 regs = devm_ioremap(dev, res->start, resource_size(res));
200 if (!regs) 204 if (!regs) {
201 return -EADDRNOTAVAIL; 205 ret = -EADDRNOTAVAIL;
206 goto free_drm;
207 }
202 208
203 priv->hhi = devm_regmap_init_mmio(dev, regs, 209 priv->hhi = devm_regmap_init_mmio(dev, regs,
204 &meson_regmap_config); 210 &meson_regmap_config);
205 if (IS_ERR(priv->hhi)) { 211 if (IS_ERR(priv->hhi)) {
206 dev_err(&pdev->dev, "Couldn't create the HHI regmap\n"); 212 dev_err(&pdev->dev, "Couldn't create the HHI regmap\n");
207 return PTR_ERR(priv->hhi); 213 ret = PTR_ERR(priv->hhi);
214 goto free_drm;
208 } 215 }
209 216
210 res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "dmc"); 217 res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "dmc");
218 if (!res)
219 return -EINVAL;
211 /* Simply ioremap since it may be a shared register zone */ 220 /* Simply ioremap since it may be a shared register zone */
212 regs = devm_ioremap(dev, res->start, resource_size(res)); 221 regs = devm_ioremap(dev, res->start, resource_size(res));
213 if (!regs) 222 if (!regs) {
214 return -EADDRNOTAVAIL; 223 ret = -EADDRNOTAVAIL;
224 goto free_drm;
225 }
215 226
216 priv->dmc = devm_regmap_init_mmio(dev, regs, 227 priv->dmc = devm_regmap_init_mmio(dev, regs,
217 &meson_regmap_config); 228 &meson_regmap_config);
218 if (IS_ERR(priv->dmc)) { 229 if (IS_ERR(priv->dmc)) {
219 dev_err(&pdev->dev, "Couldn't create the DMC regmap\n"); 230 dev_err(&pdev->dev, "Couldn't create the DMC regmap\n");
220 return PTR_ERR(priv->dmc); 231 ret = PTR_ERR(priv->dmc);
232 goto free_drm;
221 } 233 }
222 234
223 priv->vsync_irq = platform_get_irq(pdev, 0); 235 priv->vsync_irq = platform_get_irq(pdev, 0);
224 236
225 drm_vblank_init(drm, 1); 237 ret = drm_vblank_init(drm, 1);
238 if (ret)
239 goto free_drm;
240
226 drm_mode_config_init(drm); 241 drm_mode_config_init(drm);
227 drm->mode_config.max_width = 3840; 242 drm->mode_config.max_width = 3840;
228 drm->mode_config.max_height = 2160; 243 drm->mode_config.max_height = 2160;
@@ -281,7 +296,7 @@ static int meson_drv_bind_master(struct device *dev, bool has_components)
281 return 0; 296 return 0;
282 297
283free_drm: 298free_drm:
284 drm_dev_unref(drm); 299 drm_dev_put(drm);
285 300
286 return ret; 301 return ret;
287} 302}
@@ -300,7 +315,7 @@ static void meson_drv_unbind(struct device *dev)
300 drm_kms_helper_poll_fini(drm); 315 drm_kms_helper_poll_fini(drm);
301 drm_fbdev_cma_fini(priv->fbdev); 316 drm_fbdev_cma_fini(priv->fbdev);
302 drm_mode_config_cleanup(drm); 317 drm_mode_config_cleanup(drm);
303 drm_dev_unref(drm); 318 drm_dev_put(drm);
304 319
305} 320}
306 321