int group;                      /* group index (0-based) */
        unsigned int dir_bits;          /* directions */
        bool active;                    /* activeness */
+       bool valid;                     /* valid group (referred by blocks) */
        char name[64];                  /* seq port name */
 };
 
                sprintf(port->name, "Group %d", group->group + 1);
 }
 
+/* skip non-existing group for static blocks */
+static bool skip_group(struct seq_ump_client *client, struct seq_ump_group *group)
+{
+       return !group->valid &&
+               (client->ump->info.flags & SNDRV_UMP_EP_INFO_STATIC_BLOCKS);
+}
+
 /* create a new sequencer port per UMP group */
 static int seq_ump_group_init(struct seq_ump_client *client, int group_index)
 {
        struct snd_seq_port_info *port __free(kfree) = NULL;
        struct snd_seq_port_callback pcallbacks;
 
+       if (skip_group(client, group))
+               return 0;
+
        port = kzalloc(sizeof(*port), GFP_KERNEL);
        if (!port)
                return -ENOMEM;
                return;
 
        for (i = 0; i < SNDRV_UMP_MAX_GROUPS; i++) {
+               if (skip_group(client, &client->groups[i]))
+                       continue;
+
                old->addr.client = client->seq_client;
                old->addr.port = i;
                err = snd_seq_kernel_client_ctl(client->seq_client,
                group->dir_bits = 0;
                group->active = 0;
                group->group = i;
+               group->valid = false;
        }
 
        list_for_each_entry(fb, &client->ump->block_list, list) {
                        break;
                group = &client->groups[fb->info.first_group];
                for (i = 0; i < fb->info.num_groups; i++, group++) {
+                       group->valid = true;
                        if (fb->info.active)
                                group->active = 1;
                        switch (fb->info.direction) {