net: Move CONFIG_RTL8139 to Kconfig
[oweals/u-boot.git] / drivers / spi / spi-uclass.c
index 737ae64052acace832e332ba16ea69e3ddc8adc6..5561f36762f9c6e45eff240c5e377920b96a0482 100644 (file)
@@ -95,13 +95,13 @@ int spi_xfer(struct spi_slave *slave, unsigned int bitlen,
        return spi_get_ops(bus)->xfer(dev, bitlen, dout, din, flags);
 }
 
-int spi_post_bind(struct udevice *dev)
+static int spi_post_bind(struct udevice *dev)
 {
        /* Scan the bus for devices */
        return dm_scan_fdt_node(dev, gd->fdt_blob, dev->of_offset, false);
 }
 
-int spi_child_post_bind(struct udevice *dev)
+static int spi_child_post_bind(struct udevice *dev)
 {
        struct dm_spi_slave_platdata *plat = dev_get_parent_platdata(dev);
 
@@ -111,20 +111,40 @@ int spi_child_post_bind(struct udevice *dev)
        return spi_slave_ofdata_to_platdata(gd->fdt_blob, dev->of_offset, plat);
 }
 
-int spi_post_probe(struct udevice *bus)
+static int spi_post_probe(struct udevice *bus)
 {
        struct dm_spi_bus *spi = dev_get_uclass_priv(bus);
 
        spi->max_hz = fdtdec_get_int(gd->fdt_blob, bus->of_offset,
                                     "spi-max-frequency", 0);
 
+#if defined(CONFIG_NEEDS_MANUAL_RELOC)
+       struct dm_spi_ops *ops = spi_get_ops(bus);
+
+
+       if (ops->claim_bus)
+               ops->claim_bus += gd->reloc_off;
+       if (ops->release_bus)
+               ops->release_bus += gd->reloc_off;
+       if (ops->set_wordlen)
+               ops->set_wordlen += gd->reloc_off;
+       if (ops->xfer)
+               ops->xfer += gd->reloc_off;
+       if (ops->set_speed)
+               ops->set_speed += gd->reloc_off;
+       if (ops->set_mode)
+               ops->set_mode += gd->reloc_off;
+       if (ops->cs_info)
+               ops->cs_info += gd->reloc_off;
+#endif
+
        return 0;
 }
 
-int spi_child_pre_probe(struct udevice *dev)
+static int spi_child_pre_probe(struct udevice *dev)
 {
        struct dm_spi_slave_platdata *plat = dev_get_parent_platdata(dev);
-       struct spi_slave *slave = dev_get_parentdata(dev);
+       struct spi_slave *slave = dev_get_parent_priv(dev);
 
        /*
         * This is needed because we pass struct spi_slave around the place
@@ -137,6 +157,8 @@ int spi_child_pre_probe(struct udevice *dev)
 
        slave->max_hz = plat->max_hz;
        slave->mode = plat->mode;
+       slave->mode_rx = plat->mode_rx;
+       slave->wordlen = SPI_DEFAULT_WORDLEN;
 
        return 0;
 }
@@ -282,7 +304,7 @@ int spi_get_bus_and_cs(int busnum, int cs, int speed, int mode,
                ret = device_probe(dev);
                if (ret)
                        goto err;
-               slave = dev_get_parentdata(dev);
+               slave = dev_get_parent_priv(dev);
                slave->dev = dev;
        }
 
@@ -291,7 +313,7 @@ int spi_get_bus_and_cs(int busnum, int cs, int speed, int mode,
                goto err;
 
        *busp = bus;
-       *devp = dev_get_parentdata(dev);
+       *devp = dev_get_parent_priv(dev);
        debug("%s: bus=%p, slave=%p\n", __func__, bus, *devp);
 
        return 0;
@@ -320,7 +342,7 @@ struct spi_slave *spi_setup_slave_fdt(const void *blob, int node,
        ret = device_get_child_by_of_offset(bus, node, &dev);
        if (ret)
                return NULL;
-       return dev_get_parentdata(dev);
+       return dev_get_parent_priv(dev);
 }
 
 /* Compatibility function - to be removed */
@@ -348,7 +370,8 @@ void spi_free_slave(struct spi_slave *slave)
 int spi_slave_ofdata_to_platdata(const void *blob, int node,
                                 struct dm_spi_slave_platdata *plat)
 {
-       int mode = 0;
+       int mode = 0, mode_rx = 0;
+       int value;
 
        plat->cs = fdtdec_get_int(blob, node, "reg", -1);
        plat->max_hz = fdtdec_get_int(blob, node, "spi-max-frequency", 0);
@@ -358,10 +381,46 @@ int spi_slave_ofdata_to_platdata(const void *blob, int node,
                mode |= SPI_CPHA;
        if (fdtdec_get_bool(blob, node, "spi-cs-high"))
                mode |= SPI_CS_HIGH;
+       if (fdtdec_get_bool(blob, node, "spi-3wire"))
+               mode |= SPI_3WIRE;
        if (fdtdec_get_bool(blob, node, "spi-half-duplex"))
                mode |= SPI_PREAMBLE;
+
+       /* Device DUAL/QUAD mode */
+       value = fdtdec_get_uint(blob, node, "spi-tx-bus-width", 1);
+       switch (value) {
+       case 1:
+               break;
+       case 2:
+               mode |= SPI_TX_DUAL;
+               break;
+       case 4:
+               mode |= SPI_TX_QUAD;
+               break;
+       default:
+               error("spi-tx-bus-width %d not supported\n", value);
+               break;
+       }
+
        plat->mode = mode;
 
+       value = fdtdec_get_uint(blob, node, "spi-rx-bus-width", 1);
+       switch (value) {
+       case 1:
+               break;
+       case 2:
+               mode_rx |= SPI_RX_DUAL;
+               break;
+       case 4:
+               mode_rx |= SPI_RX_QUAD;
+               break;
+       default:
+               error("spi-rx-bus-width %d not supported\n", value);
+               break;
+       }
+
+       plat->mode_rx = mode_rx;
+
        return 0;
 }