Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

dmaengine: ste_dma40: Return error codes properly

This makes the probe() and its subfunction d40_hw_detect_init()
return proper error codes.

One effect of this is that deferred probe, e.g from the clock,
will start to work, would it happen. Also it is better design.

Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Link: https://lore.kernel.org/r/20230417-ux500-dma40-cleanup-v3-7-60bfa6785968@linaro.org
Signed-off-by: Vinod Koul <vkoul@kernel.org>

authored by

Linus Walleij and committed by
Vinod Koul
2893f6bc 339f5041

+24 -22
+24 -22
drivers/dma/ste_dma40.c
··· 3132 3132 kmem_cache_destroy(desc_slab); 3133 3133 } 3134 3134 3135 - static struct d40_base * __init d40_hw_detect_init(struct platform_device *pdev) 3135 + static int __init d40_hw_detect_init(struct platform_device *pdev, 3136 + struct d40_base **retbase) 3136 3137 { 3137 3138 struct stedma40_platform_data *plat_data = dev_get_platdata(&pdev->dev); 3138 3139 struct device *dev = &pdev->dev; ··· 3151 3150 3152 3151 clk = devm_clk_get_enabled(dev, NULL); 3153 3152 if (IS_ERR(clk)) 3154 - return NULL; 3153 + return PTR_ERR(clk); 3155 3154 3156 3155 /* Get IO for DMAC base address */ 3157 3156 virtbase = devm_platform_ioremap_resource_byname(pdev, "base"); 3158 - if (IS_ERR(virtbase)) { 3159 - dev_err(dev, "No IO base defined\n"); 3160 - return NULL; 3161 - } 3157 + if (IS_ERR(virtbase)) 3158 + return PTR_ERR(virtbase); 3162 3159 3163 3160 /* This is just a regular AMBA PrimeCell ID actually */ 3164 3161 for (pid = 0, i = 0; i < 4; i++) ··· 3168 3169 3169 3170 if (cid != AMBA_CID) { 3170 3171 d40_err(dev, "Unknown hardware! No PrimeCell ID\n"); 3171 - return NULL; 3172 + return -EINVAL; 3172 3173 } 3173 3174 if (AMBA_MANF_BITS(pid) != AMBA_VENDOR_ST) { 3174 3175 d40_err(dev, "Unknown designer! Got %x wanted %x\n", 3175 3176 AMBA_MANF_BITS(pid), 3176 3177 AMBA_VENDOR_ST); 3177 - return NULL; 3178 + return -EINVAL; 3178 3179 } 3179 3180 /* 3180 3181 * HW revision: ··· 3188 3189 rev = AMBA_REV_BITS(pid); 3189 3190 if (rev < 2) { 3190 3191 d40_err(dev, "hardware revision: %d is not supported", rev); 3191 - return NULL; 3192 + return -EINVAL; 3192 3193 } 3193 3194 3194 3195 /* The number of physical channels on this HW */ ··· 3215 3216 sizeof(struct d40_chan), GFP_KERNEL); 3216 3217 3217 3218 if (!base) 3218 - return NULL; 3219 + return -ENOMEM; 3219 3220 3220 3221 base->rev = rev; 3221 3222 base->clk = clk; ··· 3262 3263 sizeof(*base->phy_res), 3263 3264 GFP_KERNEL); 3264 3265 if (!base->phy_res) 3265 - return NULL; 3266 + return -ENOMEM; 3266 3267 3267 3268 base->lookup_phy_chans = devm_kcalloc(dev, num_phy_chans, 3268 3269 sizeof(*base->lookup_phy_chans), 3269 3270 GFP_KERNEL); 3270 3271 if (!base->lookup_phy_chans) 3271 - return NULL; 3272 + return -ENOMEM; 3272 3273 3273 3274 base->lookup_log_chans = devm_kcalloc(dev, num_log_chans, 3274 3275 sizeof(*base->lookup_log_chans), 3275 3276 GFP_KERNEL); 3276 3277 if (!base->lookup_log_chans) 3277 - return NULL; 3278 + return -ENOMEM; 3278 3279 3279 3280 base->reg_val_backup_chan = devm_kmalloc_array(dev, base->num_phy_chans, 3280 3281 sizeof(d40_backup_regs_chan), 3281 3282 GFP_KERNEL); 3282 3283 if (!base->reg_val_backup_chan) 3283 - return NULL; 3284 + return -ENOMEM; 3284 3285 3285 3286 base->lcla_pool.alloc_map = devm_kcalloc(dev, num_phy_chans 3286 3287 * D40_LCLA_LINK_PER_EVENT_GRP, 3287 3288 sizeof(*base->lcla_pool.alloc_map), 3288 3289 GFP_KERNEL); 3289 3290 if (!base->lcla_pool.alloc_map) 3290 - return NULL; 3291 + return -ENOMEM; 3291 3292 3292 3293 base->regs_interrupt = devm_kmalloc_array(dev, base->gen_dmac.il_size, 3293 3294 sizeof(*base->regs_interrupt), 3294 3295 GFP_KERNEL); 3295 3296 if (!base->regs_interrupt) 3296 - return NULL; 3297 + return -ENOMEM; 3297 3298 3298 3299 base->desc_slab = kmem_cache_create(D40_NAME, sizeof(struct d40_desc), 3299 3300 0, SLAB_HWCACHE_ALIGN, 3300 3301 NULL); 3301 3302 if (!base->desc_slab) 3302 - return NULL; 3303 + return -ENOMEM; 3303 3304 3304 3305 ret = devm_add_action_or_reset(dev, d40_drop_kmem_cache_action, 3305 3306 base->desc_slab); 3306 3307 if (ret) 3307 - return NULL; 3308 + return ret; 3308 3309 3309 - return base; 3310 + *retbase = base; 3311 + 3312 + return 0; 3310 3313 } 3311 3314 3312 3315 static void __init d40_hw_init(struct d40_base *base) ··· 3504 3503 struct device *dev = &pdev->dev; 3505 3504 struct device_node *np = pdev->dev.of_node; 3506 3505 struct device_node *np_lcpa; 3507 - int ret = -ENOENT; 3508 3506 struct d40_base *base; 3509 3507 struct resource *res; 3510 3508 struct resource res_lcpa; 3511 3509 int num_reserved_chans; 3512 3510 u32 val; 3511 + int ret; 3513 3512 3514 3513 if (d40_of_probe(dev, np)) { 3515 3514 ret = -ENOMEM; 3516 3515 goto report_failure; 3517 3516 } 3518 3517 3519 - base = d40_hw_detect_init(pdev); 3520 - if (!base) 3518 + ret = d40_hw_detect_init(pdev, &base); 3519 + if (ret) 3521 3520 goto report_failure; 3522 3521 3523 3522 num_reserved_chans = d40_phy_res_init(base); ··· 3531 3530 np_lcpa = of_parse_phandle(np, "sram", 0); 3532 3531 if (!np_lcpa) { 3533 3532 dev_err(dev, "no LCPA SRAM node\n"); 3533 + ret = -EINVAL; 3534 3534 goto report_failure; 3535 3535 } 3536 3536 /* This is no device so read the address directly from the node */