Author: manu
Date: Thu Jan 16 20:19:20 2020
New Revision: 356802
URL: https://svnweb.freebsd.org/changeset/base/356802

Log:
  arm: allwinner: ahci: target-supply is optional
  
  The target-supply regulator is optional so don't fail if it's not present.
  While here disable the clock on detach.
  
  MFC after:    2 weeks
  X-MFC-With:   356600

Modified:
  head/sys/arm/allwinner/a10_ahci.c

Modified: head/sys/arm/allwinner/a10_ahci.c
==============================================================================
--- head/sys/arm/allwinner/a10_ahci.c   Thu Jan 16 20:12:15 2020        
(r356801)
+++ head/sys/arm/allwinner/a10_ahci.c   Thu Jan 16 20:19:20 2020        
(r356802)
@@ -122,6 +122,8 @@ __FBSDID("$FreeBSD$");
 struct ahci_a10_softc {
        struct ahci_controller  ahci_ctlr;
        regulator_t             ahci_reg;
+       clk_t                   clk_pll;
+       clk_t                   clk_gate;
 };
 
 static void inline
@@ -303,11 +305,9 @@ ahci_a10_attach(device_t dev)
        int error;
        struct ahci_a10_softc *sc;
        struct ahci_controller *ctlr;
-       clk_t clk_pll, clk_gate;
 
        sc = device_get_softc(dev);
        ctlr = &sc->ahci_ctlr;
-       clk_pll = clk_gate = NULL;
 
        ctlr->quirks = AHCI_Q_NOPMP;
        ctlr->vendorid = 0;
@@ -319,41 +319,38 @@ ahci_a10_attach(device_t dev)
            &ctlr->r_rid, RF_ACTIVE)))
                return (ENXIO);
 
-       /* Enable the regulator */
-       error = regulator_get_by_ofw_property(dev, 0, "target-supply",
-           &sc->ahci_reg);
-       if (error != 0) {
-               device_printf(dev, "Cannot get regulator\n");
-               goto fail;
+       /* Enable the (optional) regulator */
+       if (regulator_get_by_ofw_property(dev, 0, "target-supply",
+           &sc->ahci_reg)  == 0) {
+               error = regulator_enable(sc->ahci_reg);
+               if (error != 0) {
+                       device_printf(dev, "Could not enable regulator\n");
+                       goto fail;
+               }
        }
-       error = regulator_enable(sc->ahci_reg);
-       if (error != 0) {
-               device_printf(dev, "Could not enable regulator\n");
-               goto fail;
-       }
 
        /* Enable clocks */
-       error = clk_get_by_ofw_index(dev, 0, 0, &clk_gate);
+       error = clk_get_by_ofw_index(dev, 0, 0, &sc->clk_gate);
        if (error != 0) {
                device_printf(dev, "Cannot get gate clock\n");
                goto fail;
        }
-       error = clk_get_by_ofw_index(dev, 0, 1, &clk_pll);
+       error = clk_get_by_ofw_index(dev, 0, 1, &sc->clk_pll);
        if (error != 0) {
                device_printf(dev, "Cannot get PLL clock\n");
                goto fail;
        }
-       error = clk_set_freq(clk_pll, PLL_FREQ, CLK_SET_ROUND_DOWN);
+       error = clk_set_freq(sc->clk_pll, PLL_FREQ, CLK_SET_ROUND_DOWN);
        if (error != 0) {
                device_printf(dev, "Cannot set PLL frequency\n");
                goto fail;
        }
-       error = clk_enable(clk_pll);
+       error = clk_enable(sc->clk_pll);
        if (error != 0) {
                device_printf(dev, "Cannot enable PLL\n");
                goto fail;
        }
-       error = clk_enable(clk_gate);
+       error = clk_enable(sc->clk_gate);
        if (error != 0) {
                device_printf(dev, "Cannot enable clk gate\n");
                goto fail;
@@ -378,12 +375,12 @@ ahci_a10_attach(device_t dev)
        return (ahci_attach(dev));
 
 fail:
-       if (sc->ahci_reg != 0)
+       if (sc->ahci_reg != NULL)
                regulator_disable(sc->ahci_reg);
-       if (clk_gate != NULL)
-               clk_release(clk_gate);
-       if (clk_pll != NULL)
-               clk_release(clk_pll);
+       if (sc->clk_gate != NULL)
+               clk_release(sc->clk_gate);
+       if (sc->clk_pll != NULL)
+               clk_release(sc->clk_pll);
        bus_release_resource(dev, SYS_RES_MEMORY, ctlr->r_rid, ctlr->r_mem);
        return (error);
 }
@@ -391,7 +388,19 @@ fail:
 static int
 ahci_a10_detach(device_t dev)
 {
+       struct ahci_a10_softc *sc;
+       struct ahci_controller *ctlr;
 
+       sc = device_get_softc(dev);
+       ctlr = &sc->ahci_ctlr;
+
+       if (sc->ahci_reg != NULL)
+               regulator_disable(sc->ahci_reg);
+       if (sc->clk_gate != NULL)
+               clk_release(sc->clk_gate);
+       if (sc->clk_pll != NULL)
+               clk_release(sc->clk_pll);
+       bus_release_resource(dev, SYS_RES_MEMORY, ctlr->r_rid, ctlr->r_mem);
        return (ahci_detach(dev));
 }
 
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to