static int mxs_saif_probe(struct platform_device *pdev) { struct device_node *np = pdev->dev.of_node; struct resource *iores; struct mxs_saif *saif; int irq, ret = 0; struct device_node *master; if (!np) return -EINVAL; saif = devm_kzalloc(&pdev->dev, sizeof(*saif), GFP_KERNEL); if (!saif) return -ENOMEM; ret = of_alias_get_id(np, "saif"); if (ret < 0) return ret; else saif->id = ret; if (saif->id >= ARRAY_SIZE(mxs_saif)) { dev_err(&pdev->dev, "get wrong saif id\n"); return -EINVAL; } /* * If there is no "fsl,saif-master" phandle, it's a saif * master. Otherwise, it's a slave and its phandle points * to the master. */ master = of_parse_phandle(np, "fsl,saif-master", 0); if (!master) { saif->master_id = saif->id; } else { ret = of_alias_get_id(master, "saif"); if (ret < 0) return ret; else saif->master_id = ret; if (saif->master_id >= ARRAY_SIZE(mxs_saif)) { dev_err(&pdev->dev, "get wrong master id\n"); return -EINVAL; } } mxs_saif[saif->id] = saif; saif->clk = devm_clk_get(&pdev->dev, NULL); if (IS_ERR(saif->clk)) { ret = PTR_ERR(saif->clk); dev_err(&pdev->dev, "Cannot get the clock: %d\n", ret); return ret; } iores = platform_get_resource(pdev, IORESOURCE_MEM, 0); saif->base = devm_ioremap_resource(&pdev->dev, iores); if (IS_ERR(saif->base)) return PTR_ERR(saif->base); irq = platform_get_irq(pdev, 0); if (irq < 0) { ret = irq; dev_err(&pdev->dev, "failed to get irq resource: %d\n", ret); return ret; } saif->dev = &pdev->dev; ret = devm_request_irq(&pdev->dev, irq, mxs_saif_irq, 0, dev_name(&pdev->dev), saif); if (ret) { dev_err(&pdev->dev, "failed to request irq\n"); return ret; } platform_set_drvdata(pdev, saif); /* We only support saif0 being tx and clock master */ if (saif->id == 0) { ret = mxs_saif_mclk_init(pdev); if (ret) dev_warn(&pdev->dev, "failed to init clocks\n"); } ret = devm_snd_soc_register_component(&pdev->dev, &mxs_saif_component, &mxs_saif_dai, 1); if (ret) { dev_err(&pdev->dev, "register DAI failed\n"); return ret; } ret = mxs_pcm_platform_register(&pdev->dev); if (ret) { dev_err(&pdev->dev, "register PCM failed: %d\n", ret); return ret; } return 0; }
static int __devinit mxs_saif_probe(struct platform_device *pdev) { struct device_node *np = pdev->dev.of_node; struct resource *iores, *dmares; struct mxs_saif *saif; struct mxs_saif_platform_data *pdata; struct pinctrl *pinctrl; int ret = 0; if (!np && pdev->id >= ARRAY_SIZE(mxs_saif)) return -EINVAL; saif = devm_kzalloc(&pdev->dev, sizeof(*saif), GFP_KERNEL); if (!saif) return -ENOMEM; if (np) { struct device_node *master; saif->id = of_alias_get_id(np, "saif"); if (saif->id < 0) return saif->id; /* * If there is no "fsl,saif-master" phandle, it's a saif * master. Otherwise, it's a slave and its phandle points * to the master. */ master = of_parse_phandle(np, "fsl,saif-master", 0); if (!master) { saif->master_id = saif->id; } else { saif->master_id = of_alias_get_id(master, "saif"); if (saif->master_id < 0) return saif->master_id; } } else { saif->id = pdev->id; pdata = pdev->dev.platform_data; if (pdata && !pdata->master_mode) saif->master_id = pdata->master_id; else saif->master_id = saif->id; } if (saif->master_id < 0 || saif->master_id >= ARRAY_SIZE(mxs_saif)) { dev_err(&pdev->dev, "get wrong master id\n"); return -EINVAL; } mxs_saif[saif->id] = saif; pinctrl = devm_pinctrl_get_select_default(&pdev->dev); if (IS_ERR(pinctrl)) { ret = PTR_ERR(pinctrl); return ret; } saif->clk = clk_get(&pdev->dev, NULL); if (IS_ERR(saif->clk)) { ret = PTR_ERR(saif->clk); dev_err(&pdev->dev, "Cannot get the clock: %d\n", ret); return ret; } iores = platform_get_resource(pdev, IORESOURCE_MEM, 0); saif->base = devm_request_and_ioremap(&pdev->dev, iores); if (!saif->base) { dev_err(&pdev->dev, "ioremap failed\n"); ret = -ENODEV; goto failed_get_resource; } dmares = platform_get_resource(pdev, IORESOURCE_DMA, 0); if (!dmares) { /* * TODO: This is a temporary solution and should be changed * to use generic DMA binding later when the helplers get in. */ ret = of_property_read_u32(np, "fsl,saif-dma-channel", &saif->dma_param.chan_num); if (ret) { dev_err(&pdev->dev, "failed to get dma channel\n"); goto failed_get_resource; } } else { saif->dma_param.chan_num = dmares->start; } saif->irq = platform_get_irq(pdev, 0); if (saif->irq < 0) { ret = saif->irq; dev_err(&pdev->dev, "failed to get irq resource: %d\n", ret); goto failed_get_resource; } saif->dev = &pdev->dev; ret = devm_request_irq(&pdev->dev, saif->irq, mxs_saif_irq, 0, "mxs-saif", saif); if (ret) { dev_err(&pdev->dev, "failed to request irq\n"); goto failed_get_resource; } saif->dma_param.chan_irq = platform_get_irq(pdev, 1); if (saif->dma_param.chan_irq < 0) { ret = saif->dma_param.chan_irq; dev_err(&pdev->dev, "failed to get dma irq resource: %d\n", ret); goto failed_get_resource; } platform_set_drvdata(pdev, saif); ret = snd_soc_register_dai(&pdev->dev, &mxs_saif_dai); if (ret) { dev_err(&pdev->dev, "register DAI failed\n"); goto failed_get_resource; } ret = mxs_pcm_platform_register(&pdev->dev); if (ret) { dev_err(&pdev->dev, "register PCM failed: %d\n", ret); goto failed_pdev_alloc; } return 0; failed_pdev_alloc: snd_soc_unregister_dai(&pdev->dev); failed_get_resource: clk_put(saif->clk); return ret; }