goto out_pram;
        }
 
-       for (i = 0; i < NUM_GPIOS; i++)
-               pinfo->gpios[i] = of_get_gpio(np, i);
+       for (i = 0; i < NUM_GPIOS; i++) {
+               int gpio;
+
+               pinfo->gpios[i] = -1;
+
+               gpio = of_get_gpio(np, i);
+
+               if (gpio_is_valid(gpio)) {
+                       ret = gpio_request(gpio, "cpm_uart");
+                       if (ret) {
+                               pr_err("can't request gpio #%d: %d\n", i, ret);
+                               continue;
+                       }
+                       if (i == GPIO_RTS || i == GPIO_DTR)
+                               ret = gpio_direction_output(gpio, 0);
+                       else
+                               ret = gpio_direction_input(gpio);
+                       if (ret) {
+                               pr_err("can't set direction for gpio #%d: %d\n",
+                                       i, ret);
+                               gpio_free(gpio);
+                               continue;
+                       }
+                       pinfo->gpios[i] = gpio;
+               }
+       }
 
 #ifdef CONFIG_PPC_EARLY_DEBUG_CPM
        udbg_putc = NULL;