static int __devinit xilinx_spi_probe(struct platform_device *dev) { struct xspi_platform_data *pdata; struct resource *r; int irq; struct spi_master *master; u8 i; pdata = dev->dev.platform_data; if (!pdata) return -ENODEV; r = platform_get_resource(dev, IORESOURCE_MEM, 0); if (!r) return -ENODEV; irq = platform_get_irq(dev, 0); if (irq < 0) return -ENXIO; master = xilinx_spi_init(&dev->dev, r, irq, dev->id); if (!master) return -ENODEV; for (i = 0; i < pdata->num_devices; i++) spi_new_device(master, pdata->devices + i); platform_set_drvdata(dev, master); return 0; }
static int __devinit xilinx_spi_probe(struct platform_device *dev) { struct xspi_platform_data *pdata; struct resource *r; int irq, num_cs = 0, little_endian = 0, bits_per_word = 8; struct spi_master *master; u8 i; pdata = dev->dev.platform_data; if (pdata) { num_cs = pdata->num_chipselect; little_endian = pdata->little_endian; bits_per_word = pdata->bits_per_word; } #ifdef CONFIG_OF if (dev->dev.of_node) { const __be32 *prop; int len; /* number of slave select bits is required */ prop = of_get_property(dev->dev.of_node, "xlnx,num-ss-bits", &len); if (prop && len >= sizeof(*prop)) num_cs = __be32_to_cpup(prop); } #endif if (!num_cs) { dev_err(&dev->dev, "Missing slave select configuration data\n"); return -EINVAL; } r = platform_get_resource(dev, IORESOURCE_MEM, 0); if (!r) return -ENODEV; irq = platform_get_irq(dev, 0); if (irq < 0) return -ENXIO; master = xilinx_spi_init(&dev->dev, r, irq, dev->id, num_cs, little_endian, bits_per_word); if (!master) return -ENODEV; if (pdata) { for (i = 0; i < pdata->num_devices; i++) spi_new_device(master, pdata->devices + i); } platform_set_drvdata(dev, master); return 0; }
static int __devinit xilinx_spi_of_probe(struct of_device *ofdev, const struct of_device_id *match) { struct spi_master *master; struct xspi_platform_data *pdata; struct resource r_mem; struct resource r_irq; int rc = 0; const u32 *prop; int len; rc = of_address_to_resource(ofdev->node, 0, &r_mem); if (rc) { dev_warn(&ofdev->dev, "invalid address\n"); return rc; } rc = of_irq_to_resource(ofdev->node, 0, &r_irq); if (rc == NO_IRQ) { dev_warn(&ofdev->dev, "no IRQ found\n"); return -ENODEV; } ofdev->dev.platform_data = kzalloc(sizeof(struct xspi_platform_data), GFP_KERNEL); pdata = ofdev->dev.platform_data; if (!pdata) return -ENOMEM; /* number of slave select bits is required */ prop = of_get_property(ofdev->node, "xlnx,num-ss-bits", &len); if (!prop || len < sizeof(*prop)) { dev_warn(&ofdev->dev, "no 'xlnx,num-ss-bits' property\n"); return -EINVAL; } pdata->num_chipselect = *prop; pdata->bits_per_word = 8; master = xilinx_spi_init(&ofdev->dev, &r_mem, r_irq.start, -1); if (!master) return -ENODEV; dev_set_drvdata(&ofdev->dev, master); /* Add any subnodes on the SPI bus */ of_register_spi_devices(master, ofdev->node); return 0; }