static int __devexit omap34_xx_bridge_remove(struct platform_device *pdev) { dev_t devno; bool ret; int status = 0; bhandle hdrv_obj = NULL; status = cfg_get_object((u32 *) &hdrv_obj, REG_DRV_OBJECT); if (DSP_FAILED(status)) goto func_cont; #ifdef CONFIG_BRIDGE_DVFS if (cpufreq_unregister_notifier(&iva_clk_notifier, CPUFREQ_TRANSITION_NOTIFIER)) pr_err("%s: clk_notifier_unregister failed for iva2_ck\n", __func__); #endif /* #ifdef CONFIG_BRIDGE_DVFS */ if (driver_context) { /* Put the DSP in reset state */ ret = dsp_deinit(driver_context); driver_context = 0; DBC_ASSERT(ret == true); } #ifdef CONFIG_BRIDGE_DVFS clk_put(clk_handle); clk_handle = NULL; #endif /* #ifdef CONFIG_BRIDGE_DVFS */ func_cont: mem_ext_phys_pool_release(); services_exit(); bridge_destroy_sysfs(); devno = MKDEV(driver_major, 0); cdev_del(&bridge_cdev); unregister_chrdev_region(devno, 1); if (bridge_class) { /* remove the device from sysfs */ device_destroy(bridge_class, MKDEV(driver_major, 0)); class_destroy(bridge_class); } return 0; }
static int __devexit omap34_xx_bridge_remove(struct platform_device *pdev) { dev_t devno; int status = 0; struct drv_data *drv_datap = dev_get_drvdata(bridge); if (!drv_datap || !drv_datap->drv_object) { status = -ENODATA; pr_err("%s: Failed to retrieve the object handle\n", __func__); goto func_cont; } #ifdef CONFIG_TIDSPBRIDGE_DVFS if (cpufreq_unregister_notifier(&iva_clk_notifier, CPUFREQ_TRANSITION_NOTIFIER)) pr_err("%s: cpufreq_unregister_notifier failed for iva2_ck\n", __func__); #endif if (driver_context) { dsp_deinit(driver_context); driver_context = 0; } kfree(drv_datap); dev_set_drvdata(bridge, NULL); func_cont: mem_ext_phys_pool_release(); dsp_clk_exit(); devno = MKDEV(driver_major, 0); cdev_del(&bridge_cdev); unregister_chrdev_region(devno, 1); if (bridge_class) { device_destroy(bridge_class, MKDEV(driver_major, 0)); class_destroy(bridge_class); } return 0; }
static int omap3_bridge_startup(struct platform_device *pdev) { struct omap_dsp_platform_data *pdata = pdev->dev.platform_data; struct drv_data *drv_datap = NULL; u32 phys_membase, phys_memsize; int err; #ifdef CONFIG_TIDSPBRIDGE_RECOVERY bridge_rec_queue = create_workqueue("bridge_rec_queue"); INIT_WORK(&bridge_recovery_work, bridge_recover); INIT_COMPLETION(bridge_comp); #endif #ifdef CONFIG_PM bridge_suspend_data.suspended = 0; init_waitqueue_head(&bridge_suspend_data.suspend_wq); #ifdef CONFIG_TIDSPBRIDGE_DVFS for (i = 0; i < 6; i++) pdata->mpu_speed[i] = vdd1_rate_table_bridge[i].rate; err = cpufreq_register_notifier(&iva_clk_notifier, CPUFREQ_TRANSITION_NOTIFIER); if (err) pr_err("%s: clk_notifier_register failed for iva2_ck\n", __func__); #endif #endif dsp_clk_init(); drv_datap = kzalloc(sizeof(struct drv_data), GFP_KERNEL); if (!drv_datap) { err = -ENOMEM; goto err1; } drv_datap->shm_size = shm_size; drv_datap->tc_wordswapon = tc_wordswapon; if (base_img) { drv_datap->base_img = kmalloc(strlen(base_img) + 1, GFP_KERNEL); if (!drv_datap->base_img) { err = -ENOMEM; goto err2; } strncpy(drv_datap->base_img, base_img, strlen(base_img) + 1); } dev_set_drvdata(bridge, drv_datap); if (shm_size < 0x10000) { err = -EINVAL; pr_err("%s: shm size must be at least 64 KB\n", __func__); goto err3; } dev_dbg(bridge, "%s: requested shm_size = 0x%x\n", __func__, shm_size); phys_membase = pdata->phys_mempool_base; phys_memsize = pdata->phys_mempool_size; if (phys_membase > 0 && phys_memsize > 0) mem_ext_phys_pool_init(phys_membase, phys_memsize); if (tc_wordswapon) dev_dbg(bridge, "%s: TC Word Swap is enabled\n", __func__); driver_context = dsp_init(&err); if (err) { pr_err("DSP Bridge driver initialization failed\n"); goto err4; } return 0; err4: mem_ext_phys_pool_release(); err3: kfree(drv_datap->base_img); err2: kfree(drv_datap); err1: #ifdef CONFIG_TIDSPBRIDGE_DVFS cpufreq_unregister_notifier(&iva_clk_notifier, CPUFREQ_TRANSITION_NOTIFIER); #endif dsp_clk_exit(); return err; }