- "microchip,mcp23s08" for  8 GPIO SPI version
     - "microchip,mcp23s17" for 16 GPIO SPI version
+    - "microchip,mcp23s18" for 16 GPIO SPI version
     - "microchip,mcp23008" for  8 GPIO I2C version or
     - "microchip,mcp23017" for 16 GPIO I2C version of the chip
     NOTE: Do not use the old mcp prefix any more. It is deprecated and will be
   - first cell is the pin number
   - second cell is used to specify flags.
 - interrupt-controller: Marks the device node as a interrupt controller.
-NOTE: The interrupt functionality is only supported for i2c versions of the
-chips. The spi chips can also do the interrupts, but this is not supported by
-the linux driver yet.
 
 Optional device specific properties:
 - microchip,irq-mirror: Sets the mirror flag in the IOCON register. Devices
 
 #define MCP_TYPE_S17   1
 #define MCP_TYPE_008   2
 #define MCP_TYPE_017   3
+#define MCP_TYPE_S18    4
 
 /* Registers are all 8 bits wide.
  *
                mcp->chip.ngpio = 16;
                mcp->chip.label = "mcp23s17";
                break;
+
+       case MCP_TYPE_S18:
+               mcp->ops = &mcp23s17_ops;
+               mcp->chip.ngpio = 16;
+               mcp->chip.label = "mcp23s18";
+               break;
 #endif /* CONFIG_SPI_MASTER */
 
 #if IS_ENABLED(CONFIG_I2C)
                        of_property_read_bool(mcp->chip.parent->of_node,
                                              "microchip,irq-active-high");
 
-               if (type == MCP_TYPE_017)
-                       mirror = pdata->mirror;
+               mirror = pdata->mirror;
        }
 
        if ((status & IOCON_SEQOP) || !(status & IOCON_HAEN) || mirror ||
                .compatible = "microchip,mcp23s17",
                .data = (void *) MCP_TYPE_S17,
        },
+       {
+               .compatible = "microchip,mcp23s18",
+               .data = (void *) MCP_TYPE_S18,
+       },
 /* NOTE: The use of the mcp prefix is deprecated and will be removed. */
        {
                .compatible = "mcp,mcp23s08",
                        goto fail;
 
                if (pdata->base != -1)
-                       pdata->base += (type == MCP_TYPE_S17) ? 16 : 8;
-               ngpio += (type == MCP_TYPE_S17) ? 16 : 8;
+                       pdata->base += data->mcp[addr]->chip.ngpio;
+               ngpio += data->mcp[addr]->chip.ngpio;
        }
        data->ngpio = ngpio;
 
 static const struct spi_device_id mcp23s08_ids[] = {
        { "mcp23s08", MCP_TYPE_S08 },
        { "mcp23s17", MCP_TYPE_S17 },
+       { "mcp23s18", MCP_TYPE_S18 },
        { },
 };
 MODULE_DEVICE_TABLE(spi, mcp23s08_ids);