Every GPIO controller declared in the DT must have the Boolean property gpio-controller set. Some controllers provide IRQ mapped to the GPIO. In that case, the interrupt-cells property should be set too and usually you use 2, but it depends on the need. The first cell is the pin number, and the second represents the interrupt flag.
gpio-cells should be set to identify how many cells are used to describe a GPIO specifier. You usually use <2>, the first cell to identify the GPIO number, and the second for flags. Actually, most of the non-memory mapped GPIO controllers do not use the flags:
expander_1: mcp23016@27 { compatible = "microchip,mcp23016"; interrupt-controller; gpio-controller; #gpio-cells = <2>; interrupt-parent = <&gpio6>; interrupts = <31 IRQ_TYPE_LEVEL_LOW>; ...