static int pic32_spi_hw_probe(struct platform_device *pdev, struct pic32_spi *pic32s) { struct resource *mem; int ret; mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); pic32s->regs = devm_ioremap_resource(&pdev->dev, mem); if (IS_ERR(pic32s->regs)) return PTR_ERR(pic32s->regs); pic32s->dma_base = mem->start; /* get irq resources: err-irq, rx-irq, tx-irq */ pic32s->fault_irq = platform_get_irq_byname(pdev, "fault"); if (pic32s->fault_irq < 0) { dev_err(&pdev->dev, "fault-irq not found\n"); return pic32s->fault_irq; } pic32s->rx_irq = platform_get_irq_byname(pdev, "rx"); if (pic32s->rx_irq < 0) { dev_err(&pdev->dev, "rx-irq not found\n"); return pic32s->rx_irq; } pic32s->tx_irq = platform_get_irq_byname(pdev, "tx"); if (pic32s->tx_irq < 0) { dev_err(&pdev->dev, "tx-irq not found\n"); return pic32s->tx_irq; } /* get clock */ pic32s->clk = devm_clk_get(&pdev->dev, "mck0"); if (IS_ERR(pic32s->clk)) { dev_err(&pdev->dev, "clk not found\n"); ret = PTR_ERR(pic32s->clk); goto err_unmap_mem; } ret = clk_prepare_enable(pic32s->clk); if (ret) goto err_unmap_mem; pic32_spi_hw_init(pic32s); return 0; err_unmap_mem: dev_err(&pdev->dev, "%s failed, err %d\n", __func__, ret); return ret; }
static int pic32_spi_probe(struct udevice *bus) { struct pic32_spi_priv *priv = dev_get_priv(bus); struct dm_spi_bus *dm_spi = dev_get_uclass_priv(bus); struct udevice *clkdev; fdt_addr_t addr; fdt_size_t size; int ret; debug("%s: %d, bus: %i\n", __func__, __LINE__, bus->seq); addr = fdtdec_get_addr_size(gd->fdt_blob, bus->of_offset, "reg", &size); if (addr == FDT_ADDR_T_NONE) return -EINVAL; priv->regs = ioremap(addr, size); if (!priv->regs) return -EINVAL; dm_spi->max_hz = fdtdec_get_int(gd->fdt_blob, bus->of_offset, "spi-max-frequency", 250000000); /* get clock rate */ ret = clk_get_by_index(bus, 0, &clkdev); if (ret < 0) { printf("pic32-spi: error, clk not found\n"); return ret; } priv->clk_rate = clk_get_periph_rate(clkdev, ret); /* initialize HW */ pic32_spi_hw_init(priv); /* set word len */ pic32_spi_set_word_size(priv, SPI_DEFAULT_WORDLEN); /* PIC32 SPI controller can automatically drive /CS during transfer * depending on fifo fill-level. /CS will stay asserted as long as * TX fifo is non-empty, else will be deasserted confirming completion * of the ongoing transfer. To avoid this sort of error we will drive * /CS manually by toggling cs-gpio pins. */ ret = gpio_request_by_name_nodev(gd->fdt_blob, bus->of_offset, "cs-gpios", 0, &priv->cs_gpio, GPIOD_IS_OUT); if (ret) { printf("pic32-spi: error, cs-gpios not found\n"); return ret; } return 0; }