Re: [PATCH 02/21] tty: serial: qcom_geni_serial: Use OPP API to set clk/perf state

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



[]..

@@ -1318,13 +1321,16 @@ static int qcom_geni_serial_probe(struct platform_device *pdev)
      if (of_property_read_bool(pdev->dev.of_node, "cts-rts-swap"))
          port->cts_rts_swap = true;
+    port->se.opp = dev_pm_opp_set_clkname(&pdev->dev, "se");
+    dev_pm_opp_of_add_table(&pdev->dev);
+
      uport->private_data = drv;
      platform_set_drvdata(pdev, port);
      port->handle_rx = console ? handle_rx_console : handle_rx_uart;
      ret = uart_add_one_port(drv, uport);
      if (ret)
-        return ret;
+        goto err;
      irq_set_status_flags(uport->irq, IRQ_NOAUTOEN);
      ret = devm_request_irq(uport->dev, uport->irq, qcom_geni_serial_isr,
@@ -1332,7 +1338,7 @@ static int qcom_geni_serial_probe(struct platform_device *pdev)
      if (ret) {
          dev_err(uport->dev, "Failed to get IRQ ret %d\n", ret);
          uart_remove_one_port(drv, uport);
-        return ret;
+        goto err;
      }
      /*
@@ -1349,11 +1355,14 @@ static int qcom_geni_serial_probe(struct platform_device *pdev)
          if (ret) {
              device_init_wakeup(&pdev->dev, false);
              uart_remove_one_port(drv, uport);
-            return ret;
+            goto err;
          }
      }
      return 0;
+err:
+    dev_pm_opp_of_remove_table(&pdev->dev);
do we need to call "dev_pm_opp_put_clkname" here and in remove to release clk resource grabbed by

dev_pm_opp_set_clkname(&pdev->dev, "se");?

Thanks for catching this, I did indeed try to call dev_pm_opp_put_clkname() but the way clk_put
is handled in it seems buggy. I need to go back and fix it. Besides I realized dev_pm_opp_of_remove_table()
does go ahead and do a clk_put on the clock.

Viresh, whats the right way to clean up

+    port->se.opp = dev_pm_opp_set_clkname(&pdev->dev, "se");
+    dev_pm_opp_of_add_table(&pdev->dev);

is it
1. dev_pm_opp_of_remove_table()
   dev_pm_opp_put_clkname()

or
2. dev_pm_opp_put_clkname()
   dev_pm_opp_of_remove_table()

or, what this patch is currently doing, which is just calling dev_pm_opp_of_remove_table()?

Note that both 1. and 2. today result in a crash, since they don't handle clk_put very well.
I can send in a fix if you think dev_pm_opp_put_clkname is needed and in a certain order.

--
QUALCOMM INDIA, on behalf of Qualcomm Innovation Center, Inc. is a member
of Code Aurora Forum, hosted by The Linux Foundation



[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [Linux for Sparc]     [IETF Annouce]     [Security]     [Bugtraq]     [Linux MIPS]     [ECOS]     [Asterisk Internet PBX]     [Linux API]

  Powered by Linux