- gpios : specifies the gpio pins to be used for chipselects.
   The gpios will be referred to as reg = <index> in the SPI child nodes.
   If unspecified, a single SPI device without a chip select can be used.
+- fsl,spisel_boot : for the MPC8306 and MPC8309, specifies that the
+  SPISEL_BOOT signal is used as chip select for a slave device. Use
+  reg = <number of gpios> in the corresponding child node, i.e. 0 if
+  the gpios property is not present.
 
 Example:
        spi@4c0 {
 
 #include <linux/spi/spi_bitbang.h>
 #include <linux/types.h>
 
+#ifdef CONFIG_FSL_SOC
+#include <sysdev/fsl_soc.h>
+#endif
+
+/* Specific to the MPC8306/MPC8309 */
+#define IMMR_SPI_CS_OFFSET 0x14c
+#define SPI_BOOT_SEL_BIT   0x80000000
+
 #include "spi-fsl-lib.h"
 #include "spi-fsl-cpm.h"
 #include "spi-fsl-spi.h"
        struct fsl_spi_platform_data *pdata = dev_get_platdata(dev);
        struct mpc8xxx_spi_probe_info *pinfo = to_of_pinfo(pdata);
        u16 cs = spi->chip_select;
-       int gpio = pinfo->gpios[cs];
-       bool alow = pinfo->alow_flags[cs];
 
-       gpio_set_value(gpio, on ^ alow);
+       if (cs < pinfo->ngpios) {
+               int gpio = pinfo->gpios[cs];
+               bool alow = pinfo->alow_flags[cs];
+
+               gpio_set_value(gpio, on ^ alow);
+       } else {
+               if (WARN_ON_ONCE(cs > pinfo->ngpios || !pinfo->immr_spi_cs))
+                       return;
+               iowrite32be(on ? SPI_BOOT_SEL_BIT : 0, pinfo->immr_spi_cs);
+       }
 }
 
 static int of_fsl_spi_get_chipselects(struct device *dev)
        struct device_node *np = dev->of_node;
        struct fsl_spi_platform_data *pdata = dev_get_platdata(dev);
        struct mpc8xxx_spi_probe_info *pinfo = to_of_pinfo(pdata);
+       bool spisel_boot = IS_ENABLED(CONFIG_FSL_SOC) &&
+               of_property_read_bool(np, "fsl,spisel_boot");
        int ngpios;
        int i = 0;
        int ret;
 
        ngpios = of_gpio_count(np);
-       if (ngpios <= 0) {
+       ngpios = max(ngpios, 0);
+       if (ngpios == 0 && !spisel_boot) {
                /*
                 * SPI w/o chip-select line. One SPI device is still permitted
                 * though.
                return 0;
        }
 
+       pinfo->ngpios = ngpios;
        pinfo->gpios = kmalloc_array(ngpios, sizeof(*pinfo->gpios),
                                     GFP_KERNEL);
        if (!pinfo->gpios)
                }
        }
 
-       pdata->max_chipselect = ngpios;
+#if IS_ENABLED(CONFIG_FSL_SOC)
+       if (spisel_boot) {
+               pinfo->immr_spi_cs = ioremap(get_immrbase() + IMMR_SPI_CS_OFFSET, 4);
+               if (!pinfo->immr_spi_cs) {
+                       ret = -ENOMEM;
+                       i = ngpios - 1;
+                       goto err_loop;
+               }
+       }
+#endif
+
+       pdata->max_chipselect = ngpios + spisel_boot;
        pdata->cs_control = fsl_spi_cs_control;
 
        return 0;