Пример #1
0
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;
}
Пример #2
0
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;
}