static int ci13xxx_msm_probe(struct platform_device *pdev) { struct ci13xxx_msm_context *ctx; struct platform_device *plat_ci; struct resource *res; int ret, rc; struct ci13xxx_platform_data *pdata = pdev->dev.platform_data; dev_dbg(&pdev->dev, "ci13xxx_msm_probe\n"); ctx = devm_kzalloc(&pdev->dev, sizeof(*ctx), GFP_KERNEL); if (!ctx) return -ENOMEM; if (pdata) { /* Acceptable values for nz_itc are: 0,1,2,4,8,16,32,64 */ if (pdata->log2_itc > CI13XXX_MSM_MAX_LOG2_ITC || pdata->log2_itc <= 0) ci13xxx_msm_platdata.nz_itc = 0; else ci13xxx_msm_platdata.nz_itc = 1 << (pdata->log2_itc-1); ci13xxx_msm_platdata.l1_supported = pdata->l1_supported; } res = platform_get_resource_byname(pdev, IORESOURCE_IO, "USB_RESUME"); if (res) { ret = ci13xxx_msm_install_wake_gpio(pdev, res); if (ret < 0) { dev_err(&pdev->dev, "gpio irq install failed\n"); return ret; } } plat_ci = ci13xxx_add_device(&pdev->dev, pdev->resource, pdev->num_resources, &ci13xxx_msm_platdata); if (IS_ERR(plat_ci)) { dev_err(&pdev->dev, "ci13xxx_add_device failed!\n"); goto gpio_uninstall; } platform_set_drvdata(pdev, ctx); pm_runtime_no_callbacks(&pdev->dev); pm_runtime_enable(&pdev->dev); return 0; gpio_uninstall: ci13xxx_msm_uninstall_wake_gpio(pdev); return PTR_ERR(plat_ci); }
static int __devinit ci13xxx_msm_probe(struct platform_device *pdev) { struct platform_device *plat_ci; dev_dbg(&pdev->dev, "ci13xxx_msm_probe\n"); plat_ci = ci13xxx_add_device(&pdev->dev, pdev->resource, pdev->num_resources, &ci13xxx_msm_platdata); if (IS_ERR(plat_ci)) { dev_err(&pdev->dev, "ci13xxx_add_device failed!\n"); return PTR_ERR(plat_ci); } platform_set_drvdata(pdev, plat_ci); pm_runtime_no_callbacks(&pdev->dev); pm_runtime_enable(&pdev->dev); return 0; }
static int __devinit ci13xxx_imx_probe(struct platform_device *pdev) { struct ci13xxx_imx_data *data; struct platform_device *plat_ci, *phy_pdev; struct device_node *phy_np; struct resource *res; struct regulator *reg_vbus; struct pinctrl *pinctrl; int ret; if (of_find_property(pdev->dev.of_node, "fsl,usbmisc", NULL) && !usbmisc_ops) return -EPROBE_DEFER; data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL); if (!data) { dev_err(&pdev->dev, "Failed to allocate CI13xxx-IMX data!\n"); return -ENOMEM; } res = platform_get_resource(pdev, IORESOURCE_MEM, 0); if (!res) { dev_err(&pdev->dev, "Can't get device resources!\n"); return -ENOENT; } pinctrl = devm_pinctrl_get_select_default(&pdev->dev); if (IS_ERR(pinctrl)) dev_warn(&pdev->dev, "pinctrl get/select failed, err=%ld\n", PTR_ERR(pinctrl)); data->clk = devm_clk_get(&pdev->dev, NULL); if (IS_ERR(data->clk)) { dev_err(&pdev->dev, "Failed to get clock, err=%ld\n", PTR_ERR(data->clk)); return PTR_ERR(data->clk); } ret = clk_prepare_enable(data->clk); if (ret) { dev_err(&pdev->dev, "Failed to prepare or enable clock, err=%d\n", ret); return ret; } phy_np = of_parse_phandle(pdev->dev.of_node, "fsl,usbphy", 0); if (phy_np) { data->phy_np = phy_np; phy_pdev = of_find_device_by_node(phy_np); if (phy_pdev) { struct usb_phy *phy; phy = pdev_to_phy(phy_pdev); if (phy && try_module_get(phy_pdev->dev.driver->owner)) { usb_phy_init(phy); data->phy = phy; } } } /* we only support host now, so enable vbus here */ reg_vbus = devm_regulator_get(&pdev->dev, "vbus"); if (!IS_ERR(reg_vbus)) { ret = regulator_enable(reg_vbus); if (ret) { dev_err(&pdev->dev, "Failed to enable vbus regulator, err=%d\n", ret); goto put_np; } data->reg_vbus = reg_vbus; } else { reg_vbus = NULL; } ci13xxx_imx_platdata.phy = data->phy; if (!pdev->dev.dma_mask) { pdev->dev.dma_mask = devm_kzalloc(&pdev->dev, sizeof(*pdev->dev.dma_mask), GFP_KERNEL); if (!pdev->dev.dma_mask) { ret = -ENOMEM; dev_err(&pdev->dev, "Failed to alloc dma_mask!\n"); goto err; } *pdev->dev.dma_mask = DMA_BIT_MASK(32); dma_set_coherent_mask(&pdev->dev, *pdev->dev.dma_mask); } if (usbmisc_ops && usbmisc_ops->init) { ret = usbmisc_ops->init(&pdev->dev); if (ret) { dev_err(&pdev->dev, "usbmisc init failed, ret=%d\n", ret); goto err; } } plat_ci = ci13xxx_add_device(&pdev->dev, pdev->resource, pdev->num_resources, &ci13xxx_imx_platdata); if (IS_ERR(plat_ci)) { ret = PTR_ERR(plat_ci); dev_err(&pdev->dev, "Can't register ci_hdrc platform device, err=%d\n", ret); goto err; } data->ci_pdev = plat_ci; platform_set_drvdata(pdev, data); pm_runtime_no_callbacks(&pdev->dev); pm_runtime_enable(&pdev->dev); return 0; err: if (reg_vbus) regulator_disable(reg_vbus); put_np: if (phy_np) of_node_put(phy_np); clk_disable_unprepare(data->clk); return ret; }