static int plt_clk_remove(struct platform_device *pdev) { struct clk_plt_data *data; data = platform_get_drvdata(pdev); clkdev_drop(data->ether_clk_lookup); clkdev_drop(data->mclk_lookup); plt_clk_unregister_loop(data, PMC_CLK_NUM); plt_clk_unregister_parents(data); return 0; }
/** * cg2900_core_remove() - Clean resources. * * Function cleans pf_data structure and removes the clock source. */ static int __devexit cg2900_core_remove(struct platform_device *pdev) { clkdev_drop(cg2900_clk_lookup); pf_data = NULL; return 0; }
static int plt_clk_probe(struct platform_device *pdev) { const struct pmc_clk_data *pmc_data; const char **parent_names; struct clk_plt_data *data; unsigned int i; int err; pmc_data = dev_get_platdata(&pdev->dev); if (!pmc_data || !pmc_data->clks) return -EINVAL; data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL); if (!data) return -ENOMEM; parent_names = plt_clk_register_parents(pdev, data, pmc_data->clks); if (IS_ERR(parent_names)) return PTR_ERR(parent_names); for (i = 0; i < PMC_CLK_NUM; i++) { data->clks[i] = plt_clk_register(pdev, i, pmc_data->base, parent_names, data->nparents); if (IS_ERR(data->clks[i])) { err = PTR_ERR(data->clks[i]); goto err_unreg_clk_plt; } } data->mclk_lookup = clkdev_hw_create(&data->clks[3]->hw, "mclk", NULL); if (!data->mclk_lookup) { err = -ENOMEM; goto err_unreg_clk_plt; } data->ether_clk_lookup = clkdev_hw_create(&data->clks[4]->hw, "ether_clk", NULL); if (!data->ether_clk_lookup) { err = -ENOMEM; goto err_drop_mclk; } plt_clk_free_parent_names_loop(parent_names, data->nparents); platform_set_drvdata(pdev, data); return 0; err_drop_mclk: clkdev_drop(data->mclk_lookup); err_unreg_clk_plt: plt_clk_unregister_loop(data, i); plt_clk_unregister_parents(data); plt_clk_free_parent_names_loop(parent_names, data->nparents); return err; }
static void ti_adpll_free_resources(struct ti_adpll_data *d) { int i; for (i = TI_ADPLL_M3; i >= 0; i--) { struct ti_adpll_clock *ac = &d->clocks[i]; if (!ac || IS_ERR_OR_NULL(ac->clk)) continue; if (ac->cl) clkdev_drop(ac->cl); if (ac->unregister) ac->unregister(ac->clk); } }
static int __init migor_init(void) { int ret; ret = clk_register(&siumckb_clk); if (ret < 0) return ret; siumckb_lookup = clkdev_alloc(&siumckb_clk, "siumckb_clk", NULL); if (!siumckb_lookup) { ret = -ENOMEM; goto eclkdevalloc; } clkdev_add(siumckb_lookup); /* Port number used on this machine: port B */ migor_snd_device = platform_device_alloc("soc-audio", 1); if (!migor_snd_device) { ret = -ENOMEM; goto epdevalloc; } platform_set_drvdata(migor_snd_device, &snd_soc_migor); ret = platform_device_add(migor_snd_device); if (ret) goto epdevadd; return 0; epdevadd: platform_device_put(migor_snd_device); epdevalloc: clkdev_drop(siumckb_lookup); eclkdevalloc: clk_unregister(&siumckb_clk); return ret; }
static void plt_clk_unregister_fixed_rate(struct clk_plt_fixed *pclk) { clkdev_drop(pclk->lookup); clk_hw_unregister_fixed_rate(pclk->clk); }
static void plt_clk_unregister(struct clk_plt *pclk) { clkdev_drop(pclk->lookup); }
static void __exit migor_exit(void) { clkdev_drop(siumckb_lookup); clk_unregister(&siumckb_clk); platform_device_unregister(migor_snd_device); }