static int ibmebus_unregister_device(struct device *dev) { device_remove_file(dev, &dev_attr_name); of_device_unregister(to_of_device(dev)); return 0; }
/* * Shutdown JobR independent of platform property code */ int caam_jr_shutdown(struct device *dev) { struct caam_drv_private_jr *jrp = dev_get_drvdata(dev); dma_addr_t inpbusaddr, outbusaddr; int ret; ret = caam_reset_hw_jr(dev); tasklet_kill(&jrp->irqtask); /* Release interrupt */ free_irq(jrp->irq, dev); /* Free rings */ inpbusaddr = rd_reg64(&jrp->rregs->inpring_base); outbusaddr = rd_reg64(&jrp->rregs->outring_base); dma_free_coherent(dev, sizeof(dma_addr_t) * JOBR_DEPTH, jrp->inpring, inpbusaddr); dma_free_coherent(dev, sizeof(struct jr_outentry) * JOBR_DEPTH, jrp->outring, outbusaddr); kfree(jrp->entinfo); of_device_unregister(jrp->jr_pdev); return ret; }
/* Call with ams_info.lock held! */ int ams_sensor_attach(void) { int result; const u32 *prop; /* Get orientation */ prop = of_get_property(ams_info.of_node, "orientation", NULL); if (!prop) return -ENODEV; ams_info.orient1 = *prop; ams_info.orient2 = *(prop + 1); /* Register freefall interrupt handler */ result = pmf_register_irq_client(ams_info.of_node, "accel-int-1", &ams_freefall_client); if (result < 0) return -ENODEV; /* Reset saved irqs */ ams_info.worker_irqs = 0; /* Register shock interrupt handler */ result = pmf_register_irq_client(ams_info.of_node, "accel-int-2", &ams_shock_client); if (result < 0) goto release_freefall; /* Create device */ ams_info.of_dev = of_platform_device_create(ams_info.of_node, "ams", NULL); if (!ams_info.of_dev) { result = -ENODEV; goto release_shock; } /* Create attributes */ result = device_create_file(&ams_info.of_dev->dev, &dev_attr_current); if (result) goto release_of; ams_info.vflag = !!(ams_info.get_vendor() & 0x10); /* Init input device */ result = ams_input_init(); if (result) goto release_device_file; return result; release_device_file: device_remove_file(&ams_info.of_dev->dev, &dev_attr_current); release_of: of_device_unregister(ams_info.of_dev); release_shock: pmf_unregister_irq_client(&ams_shock_client); release_freefall: pmf_unregister_irq_client(&ams_freefall_client); return result; }
static int dwc3_omap_remove_core(struct device *dev, void *c) { struct platform_device *pdev = to_platform_device(dev); of_device_unregister(pdev); return 0; }
struct ion_platform_data *ion_parse_dt(struct platform_device *pdev, struct ion_of_heap *compatible) { int num_heaps, ret; const struct device_node *dt_node = pdev->dev.of_node; struct device_node *node; struct ion_platform_heap *heaps; struct ion_platform_data *data; int i = 0; num_heaps = of_get_available_child_count(dt_node); if (!num_heaps) return ERR_PTR(-EINVAL); heaps = devm_kzalloc(&pdev->dev, sizeof(struct ion_platform_heap) * num_heaps, GFP_KERNEL); if (!heaps) return ERR_PTR(-ENOMEM); data = devm_kzalloc(&pdev->dev, sizeof(struct ion_platform_data), GFP_KERNEL); if (!data) return ERR_PTR(-ENOMEM); for_each_available_child_of_node(dt_node, node) { struct platform_device *heap_pdev; ret = ion_parse_dt_heap_common(node, &heaps[i], compatible); if (ret) return ERR_PTR(ret); heap_pdev = of_platform_device_create(node, heaps[i].name, &pdev->dev); if (!heap_pdev) return ERR_PTR(-ENOMEM); heap_pdev->dev.platform_data = &heaps[i]; heaps[i].priv = &heap_pdev->dev; ret = ion_setup_heap_common(pdev, node, &heaps[i]); if (ret) goto out_err; i++; } data->heaps = heaps; data->nr = num_heaps; return data; out_err: for ( ; i >= 0; i--) if (heaps[i].priv) of_device_unregister(to_platform_device(heaps[i].priv)); return ERR_PTR(ret); }
static int sms_hub_remove_child(struct device *dev, void *data) { struct platform_device *pdev = to_platform_device(dev); pm_runtime_get_sync(dev); of_device_unregister(pdev); return 0; }
void ion_destroy_platform_data(struct ion_platform_data *data) { int i; for (i = 0; i < data->nr; i++) if (data->heaps[i].priv) of_device_unregister(to_platform_device( data->heaps[i].priv)); }
void ams_sensor_detach(void) { /* Remove input device */ ams_input_exit(); /* Remove attributes */ device_remove_file(&ams_info.of_dev->dev, &dev_attr_current); /* Flush interrupt worker * * We do this after ams_info.exit(), because an interrupt might * have arrived before disabling them. */ flush_scheduled_work(); /* Remove device */ of_device_unregister(ams_info.of_dev); /* Remove handler */ pmf_unregister_irq_client(&ams_shock_client); pmf_unregister_irq_client(&ams_freefall_client); }
void soundbus_remove_one(struct soundbus_dev *dev) { of_device_unregister(&dev->ofdev); }
/* * Probe routine for each detected JobR subsystem. It assumes that * property detection was picked up externally. */ int caam_jr_probe(struct platform_device *pdev, struct device_node *np, int ring) { struct device *ctrldev, *jrdev; struct platform_device *jr_pdev; struct caam_drv_private *ctrlpriv; struct caam_drv_private_jr *jrpriv; u32 *jroffset; int error; ctrldev = &pdev->dev; ctrlpriv = dev_get_drvdata(ctrldev); jrpriv = kmalloc(sizeof(struct caam_drv_private_jr), GFP_KERNEL); if (jrpriv == NULL) { dev_err(ctrldev, "can't alloc private mem for job ring %d\n", ring); return -ENOMEM; } jrpriv->parentdev = ctrldev; /* point back to parent */ jrpriv->ridx = ring; /* save ring identity relative to detection */ /* * Derive a pointer to the detected JobRs regs * Driver has already iomapped the entire space, we just * need to add in the offset to this JobR. Don't know if I * like this long-term, but it'll run */ jroffset = (u32 *)of_get_property(np, "reg", NULL); jrpriv->rregs = (struct caam_job_ring __iomem *)((void *)ctrlpriv->ctrl + *jroffset); /* Build a local dev for each detected queue */ jr_pdev = of_platform_device_create(np, NULL, ctrldev); if (jr_pdev == NULL) { kfree(jrpriv); return -EINVAL; } jrpriv->jr_pdev = jr_pdev; jrdev = &jr_pdev->dev; dev_set_drvdata(jrdev, jrpriv); ctrlpriv->jrdev[ring] = jrdev; if (sizeof(dma_addr_t) == sizeof(u64)) if (of_device_is_compatible(np, "fsl,sec-v5.0-job-ring")) dma_set_mask(jrdev, DMA_BIT_MASK(40)); else dma_set_mask(jrdev, DMA_BIT_MASK(36)); else dma_set_mask(jrdev, DMA_BIT_MASK(32)); /* Identify the interrupt */ jrpriv->irq = irq_of_parse_and_map(np, 0); /* Now do the platform independent part */ error = caam_jr_init(jrdev); /* now turn on hardware */ if (error) { of_device_unregister(jr_pdev); kfree(jrpriv); return error; } return error; }