* @irq_rx_name: irq rx name
  * @irq_tx: virtual tx interrupt number
  * @irq_tx_name: irq tx name
- * @cts_gpio: clear to send gpio
+ * @cts_gpiod: clear to send GPIO
  * @dev: device descriptor
  **/
 struct pic32_sport {
        const char *irq_tx_name;
        bool enable_tx_irq;
 
-       bool hw_flow_ctrl;
-       int cts_gpio;
+       struct gpio_desc *cts_gpiod;
 
        struct clk *clk;
 
                                        PIC32_UART_MODE_LPBK);
 }
 
-/* get the state of CTS input pin for this port */
-static unsigned int get_cts_state(struct pic32_sport *sport)
-{
-       /* read and invert UxCTS */
-       if (gpio_is_valid(sport->cts_gpio))
-               return !gpio_get_value(sport->cts_gpio);
-
-       return 1;
-}
-
 /* serial core request to return the state of misc UART input pins */
 static unsigned int pic32_uart_get_mctrl(struct uart_port *port)
 {
        struct pic32_sport *sport = to_pic32_sport(port);
        unsigned int mctrl = 0;
 
-       if (!sport->hw_flow_ctrl)
+       /* get the state of CTS input pin for this port */
+       if (!sport->cts_gpiod)
                mctrl |= TIOCM_CTS;
-       else if (get_cts_state(sport))
+       else if (gpiod_get_value(sport->cts_gpiod))
                mctrl |= TIOCM_CTS;
 
        /* DSR and CD are not supported in PIC32, so return 1
                                        PIC32_UART_MODE_PDSEL0);
        }
        /* if hw flow ctrl, then the pins must be specified in device tree */
-       if ((new->c_cflag & CRTSCTS) && sport->hw_flow_ctrl) {
+       if ((new->c_cflag & CRTSCTS) && sport->cts_gpiod) {
                /* enable hardware flow control */
                pic32_uart_writel(sport, PIC32_SET(PIC32_UART_MODE),
                                        PIC32_UART_MODE_UEN1);
 
 static int pic32_uart_probe(struct platform_device *pdev)
 {
-       struct device_node *np = pdev->dev.of_node;
+       struct device *dev = &pdev->dev;
+       struct device_node *np = dev->of_node;
        struct pic32_sport *sport;
        int uart_idx = 0;
        struct resource *res_mem;
        /* Hardware flow control: gpios
         * !Note: Basically, CTS is needed for reading the status.
         */
-       sport->hw_flow_ctrl = false;
-       sport->cts_gpio = of_get_named_gpio(np, "cts-gpios", 0);
-       if (gpio_is_valid(sport->cts_gpio)) {
-               sport->hw_flow_ctrl = true;
-
-               ret = devm_gpio_request(sport->dev,
-                                       sport->cts_gpio, "CTS");
-               if (ret) {
-                       dev_err(&pdev->dev,
-                               "error requesting CTS GPIO\n");
-                       goto err;
-               }
-
-               ret = gpio_direction_input(sport->cts_gpio);
-               if (ret) {
-                       dev_err(&pdev->dev, "error setting CTS GPIO\n");
-                       goto err;
-               }
-       }
+       sport->cts_gpiod = devm_gpiod_get_optional(dev, "cts", GPIOD_IN);
+       if (IS_ERR(sport->cts_gpiod))
+               return dev_err_probe(dev, PTR_ERR(sport->cts_gpiod), "error requesting CTS GPIO\n");
+       gpiod_set_consumer_name(sport->cts_gpiod, "CTS");
 
        pic32_sports[uart_idx] = sport;
        port = &sport->port;