static int rockchip_spi_test_probe(struct spi_device *spi) { int ret; int i =0; char txbuf[256],rxbuf[256]; int id = 0; static struct dw_spi_chip *spi_chip_data; struct spi_test_data *spi_test_data; if(!spi) return -ENOMEM; if (!spi_chip_data && spi->dev.of_node) { spi_chip_data = rockchip_spi_parse_dt(&spi->dev); if (IS_ERR(spi_chip_data)) return -ENOMEM; } spi_test_data = (struct spi_test_data *)kzalloc(sizeof(struct spi_test_data), GFP_KERNEL); if(!spi_test_data){ dev_err(&spi->dev, "ERR: no memory for spi_test_data\n"); return -ENOMEM; } spi->bits_per_word = 8; spi->controller_data = spi_chip_data; spi_test_data->spi = spi; spi_test_data->dev = &spi->dev; ret = spi_setup(spi); if (ret < 0){ dev_err(spi_test_data->dev, "ERR: fail to setup spi\n"); return -1; } if((spi->master->bus_num == 0) && (spi->chip_select == 0)) id = 0; else if((spi->master->bus_num == 0) && (spi->chip_select == 1)) id = 1; else if ((spi->master->bus_num == 1) && (spi->chip_select == 0)) id = 2; else if ((spi->master->bus_num == 1) && (spi->chip_select == 1)) id = 3; else if ((spi->master->bus_num == 2) && (spi->chip_select == 0)) id = 4; else if ((spi->master->bus_num == 2) && (spi->chip_select == 1)) id = 5; g_spi_test_data[id] = spi_test_data; printk("%s:name=%s,bus_num=%d,cs=%d,mode=%d,speed=%d\n",__func__,spi->modalias, spi->master->bus_num, spi->chip_select, spi->mode, spi->max_speed_hz); printk("%s:poll_mode=%d, type=%d, enable_dma=%d\n",__func__, spi_chip_data->poll_mode, spi_chip_data->type, spi_chip_data->enable_dma); return ret; }
static int rockchip_spi_probe(struct platform_device *pdev) { struct resource *mem_res; struct rockchip_spi_driver_data *sdd; struct rockchip_spi_info *info = pdev->dev.platform_data; struct dw_spi *dws; int ret, irq; char clk_name[16]; if (!info && pdev->dev.of_node) { info = rockchip_spi_parse_dt(&pdev->dev); if (IS_ERR(info)) return PTR_ERR(info); } if (!info) { dev_err(&pdev->dev, "platform_data missing!\n"); return -ENODEV; } sdd = kzalloc(sizeof(struct rockchip_spi_driver_data), GFP_KERNEL); if (!sdd) { ret = -ENOMEM; goto err_kfree; } sdd->pdev = pdev; sdd->info = info; dws = &sdd->dws; atomic_set(&dws->debug_flag, 0);//debug flag /* Get basic io resource and map it */ irq = platform_get_irq(pdev, 0); if (irq < 0) { dev_warn(&pdev->dev, "Failed to get IRQ: %d\n", irq); return irq; } mem_res = platform_get_resource(pdev, IORESOURCE_MEM, 0); if (mem_res == NULL) { dev_err(&pdev->dev, "Unable to get SPI MEM resource\n"); ret = -ENXIO; goto err_unmap; } dws->regs = ioremap(mem_res->start, (mem_res->end - mem_res->start) + 1); if (!dws->regs){ ret = -EBUSY; goto err_unmap; } dws->paddr = mem_res->start; dws->iolen = (mem_res->end - mem_res->start) + 1; printk(KERN_INFO "dws->regs: %p\n", dws->regs); //get bus num if (pdev->dev.of_node) { ret = of_alias_get_id(pdev->dev.of_node, "spi"); if (ret < 0) { dev_err(&pdev->dev, "failed to get alias id, errno %d\n", ret); goto err_release_mem; } info->bus_num = ret; } else { info->bus_num = pdev->id; } /* Setup clocks */ sdd->clk_spi = devm_clk_get(&pdev->dev, "spi"); if (IS_ERR(sdd->clk_spi)) { dev_err(&pdev->dev, "Unable to acquire clock 'spi'\n"); ret = PTR_ERR(sdd->clk_spi); goto err_clk; } if (clk_prepare_enable(sdd->clk_spi)) { dev_err(&pdev->dev, "Couldn't enable clock 'spi'\n"); ret = -EBUSY; goto err_clk; } sprintf(clk_name, "pclk_spi%d", info->src_clk_nr); sdd->pclk_spi = devm_clk_get(&pdev->dev, clk_name); if (IS_ERR(sdd->pclk_spi)) { dev_err(&pdev->dev, "Unable to acquire clock '%s'\n", clk_name); ret = PTR_ERR(sdd->pclk_spi); goto err_pclk; } if (clk_prepare_enable(sdd->pclk_spi)) { dev_err(&pdev->dev, "Couldn't enable clock '%s'\n", clk_name); ret = -EBUSY; goto err_pclk; } clk_set_rate(sdd->clk_spi, info->spi_freq); dws->max_freq = clk_get_rate(sdd->clk_spi); dws->parent_dev = &pdev->dev; dws->bus_num = info->bus_num; dws->num_cs = info->num_cs; dws->irq = irq; dws->clk_spi = sdd->clk_spi; dws->pclk_spi = sdd->pclk_spi; /* * handling for rockchip paltforms, like dma setup, * clock rate, FIFO depth. */ #ifdef CONFIG_SPI_ROCKCHIP_DMA ret = dw_spi_dma_init(dws); if (ret) printk("%s:fail to init dma\n",__func__); #endif ret = dw_spi_add_host(dws); if (ret) goto err_release_mem; platform_set_drvdata(pdev, sdd); printk("%s:num_cs=%d,irq=%d,freq=%d ok\n",__func__, info->num_cs, irq, dws->max_freq); return 0; err_release_mem: release_mem_region(mem_res->start, (mem_res->end - mem_res->start) + 1); err_pclk: clk_disable_unprepare(sdd->pclk_spi); err_clk: clk_disable_unprepare(sdd->clk_spi); err_unmap: iounmap(dws->regs); err_kfree: kfree(sdd); return ret; }