#include <linux/of.h>
 #include <linux/of_address.h>
 
-#define NUM_CHANNEL 8
+#define MAX_NUM_CHANNEL 64
 #define MAX_INPUT_MUX 256
 
 #define REG_EDGE_POL   0x00
 
 struct meson_gpio_irq_params {
        unsigned int nr_hwirq;
+       unsigned int nr_channels;
        bool support_edge_both;
        unsigned int edge_both_offset;
        unsigned int edge_single_offset;
        .edge_single_offset = 0,                                \
        .pol_low_offset = 16,                                   \
        .pin_sel_mask = 0xff,                                   \
+       .nr_channels = 8,                                       \
 
 #define INIT_MESON_A1_COMMON_DATA(irqs)                                \
        INIT_MESON_COMMON(irqs, meson_a1_gpio_irq_init,         \
        .edge_single_offset = 8,                                \
        .pol_low_offset = 0,                                    \
        .pin_sel_mask = 0x7f,                                   \
+       .nr_channels = 8,                                       \
 
 static const struct meson_gpio_irq_params meson8_params = {
        INIT_MESON8_COMMON_DATA(134)
 struct meson_gpio_irq_controller {
        const struct meson_gpio_irq_params *params;
        void __iomem *base;
-       u32 channel_irqs[NUM_CHANNEL];
-       DECLARE_BITMAP(channel_map, NUM_CHANNEL);
+       u32 channel_irqs[MAX_NUM_CHANNEL];
+       DECLARE_BITMAP(channel_map, MAX_NUM_CHANNEL);
        spinlock_t lock;
 };
 
        spin_lock_irqsave(&ctl->lock, flags);
 
        /* Find a free channel */
-       idx = find_first_zero_bit(ctl->channel_map, NUM_CHANNEL);
-       if (idx >= NUM_CHANNEL) {
+       idx = find_first_zero_bit(ctl->channel_map, ctl->params->nr_channels);
+       if (idx >= ctl->params->nr_channels) {
                spin_unlock_irqrestore(&ctl->lock, flags);
                pr_err("No channel available\n");
                return -ENOSPC;
        ret = of_property_read_variable_u32_array(node,
                                                  "amlogic,channel-interrupts",
                                                  ctl->channel_irqs,
-                                                 NUM_CHANNEL,
-                                                 NUM_CHANNEL);
+                                                 ctl->params->nr_channels,
+                                                 ctl->params->nr_channels);
        if (ret < 0) {
-               pr_err("can't get %d channel interrupts\n", NUM_CHANNEL);
+               pr_err("can't get %d channel interrupts\n", ctl->params->nr_channels);
                return ret;
        }
 
        }
 
        pr_info("%d to %d gpio interrupt mux initialized\n",
-               ctl->params->nr_hwirq, NUM_CHANNEL);
+               ctl->params->nr_hwirq, ctl->params->nr_channels);
 
        return 0;