diff options
Diffstat (limited to 'drivers/gpu/drm/meson/meson_drv.c')
-rw-r--r-- | drivers/gpu/drm/meson/meson_drv.c | 37 |
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 | ||
283 | free_drm: | 298 | free_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 | ||