static int mpc52xx_bcom_remove(struct platform_device *op) { /* Clean up the engine */ bcom_engine_cleanup(); /* Cleanup SRAM */ bcom_sram_cleanup(); /* Release regs */ iounmap(bcom_eng->regs); release_mem_region(bcom_eng->regs_base, sizeof(struct mpc52xx_sdma)); /* Release the node */ of_node_put(bcom_eng->ofnode); /* Release memory */ kfree(bcom_eng); bcom_eng = NULL; return 0; }
static int __devinit mpc52xx_bcom_probe(struct of_device *op, const struct of_device_id *match) { struct device_node *ofn_sram; struct resource res_bcom; int rv; /* Inform user we're ok so far */ printk(KERN_INFO "DMA: MPC52xx BestComm driver\n"); /* Get the bestcomm node */ of_node_get(op->dev.of_node); /* Prepare SRAM */ ofn_sram = of_find_matching_node(NULL, mpc52xx_sram_ids); if (!ofn_sram) { printk(KERN_ERR DRIVER_NAME ": " "No SRAM found in device tree\n"); rv = -ENODEV; goto error_ofput; } rv = bcom_sram_init(ofn_sram, DRIVER_NAME); of_node_put(ofn_sram); if (rv) { printk(KERN_ERR DRIVER_NAME ": " "Error in SRAM init\n"); goto error_ofput; } /* Get a clean struct */ bcom_eng = kzalloc(sizeof(struct bcom_engine), GFP_KERNEL); if (!bcom_eng) { printk(KERN_ERR DRIVER_NAME ": " "Can't allocate state structure\n"); rv = -ENOMEM; goto error_sramclean; } /* Save the node */ bcom_eng->ofnode = op->dev.of_node; /* Get, reserve & map io */ if (of_address_to_resource(op->dev.of_node, 0, &res_bcom)) { printk(KERN_ERR DRIVER_NAME ": " "Can't get resource\n"); rv = -EINVAL; goto error_sramclean; } if (!request_mem_region(res_bcom.start, sizeof(struct mpc52xx_sdma), DRIVER_NAME)) { printk(KERN_ERR DRIVER_NAME ": " "Can't request registers region\n"); rv = -EBUSY; goto error_sramclean; } bcom_eng->regs_base = res_bcom.start; bcom_eng->regs = ioremap(res_bcom.start, sizeof(struct mpc52xx_sdma)); if (!bcom_eng->regs) { printk(KERN_ERR DRIVER_NAME ": " "Can't map registers\n"); rv = -ENOMEM; goto error_release; } /* Now, do the real init */ rv = bcom_engine_init(); if (rv) goto error_unmap; /* Done ! */ printk(KERN_INFO "DMA: MPC52xx BestComm engine @%08lx ok !\n", (long)bcom_eng->regs_base); return 0; /* Error path */ error_unmap: iounmap(bcom_eng->regs); error_release: release_mem_region(res_bcom.start, sizeof(struct mpc52xx_sdma)); error_sramclean: kfree(bcom_eng); bcom_sram_cleanup(); error_ofput: of_node_put(op->dev.of_node); printk(KERN_ERR "DMA: MPC52xx BestComm init failed !\n"); return rv; }