unsigned int i;
 
        group = kzalloc(sizeof(*group), GFP_KERNEL);
-       clks = kzalloc(MSTP_MAX_CLOCKS * sizeof(*clks), GFP_KERNEL);
+       clks = kmalloc(MSTP_MAX_CLOCKS * sizeof(*clks), GFP_KERNEL);
        if (group == NULL || clks == NULL) {
                kfree(group);
                kfree(clks);
                return;
        }
 
+       for (i = 0; i < MSTP_MAX_CLOCKS; ++i)
+               clks[i] = ERR_PTR(-ENOENT);
+
        for (i = 0; i < MSTP_MAX_CLOCKS; ++i) {
                const char *parent_name;
                const char *name;
                clks[clkidx] = cpg_mstp_clock_register(name, parent_name,
                                                       clkidx, group);
                if (!IS_ERR(clks[clkidx])) {
-                       group->data.clk_num = max(group->data.clk_num, clkidx);
+                       group->data.clk_num = max(group->data.clk_num,
+                                                 clkidx + 1);
                        /*
                         * Register a clkdev to let board code retrieve the
                         * clock by name and register aliases for non-DT