svn commit: r356689 - stable/12/sys/arm/allwinner
Kyle Evans
kevans at FreeBSD.org
Mon Jan 13 18:16:57 UTC 2020
Author: kevans
Date: Mon Jan 13 18:16:57 2020
New Revision: 356689
URL: https://svnweb.freebsd.org/changeset/base/356689
Log:
MFC r356600: a10_ahci: grab the target-supply regulator and enable it
This regulator is marked regulator-boot-on, but it will get shutdown if it's
not actually used/enabled by a driver. This should fix sata on the
cubieboard{1,2}.
Modified:
stable/12/sys/arm/allwinner/a10_ahci.c
Directory Properties:
stable/12/ (props changed)
Modified: stable/12/sys/arm/allwinner/a10_ahci.c
==============================================================================
--- stable/12/sys/arm/allwinner/a10_ahci.c Mon Jan 13 17:02:42 2020 (r356688)
+++ stable/12/sys/arm/allwinner/a10_ahci.c Mon Jan 13 18:16:57 2020 (r356689)
@@ -48,6 +48,7 @@ __FBSDID("$FreeBSD$");
#include <dev/ahci/ahci.h>
#include <dev/extres/clk/clk.h>
+#include <dev/extres/regulator/regulator.h>
/*
* Allwinner a1x/a2x/a8x SATA attachment. This is just the AHCI register
@@ -119,6 +120,11 @@ __FBSDID("$FreeBSD$");
#define PLL_FREQ 100000000
+struct ahci_a10_softc {
+ struct ahci_controller ahci_ctlr;
+ regulator_t ahci_reg;
+};
+
static void inline
ahci_set(struct resource *m, bus_size_t off, uint32_t set)
{
@@ -296,10 +302,12 @@ static int
ahci_a10_attach(device_t dev)
{
int error;
+ struct ahci_a10_softc *sc;
struct ahci_controller *ctlr;
clk_t clk_pll, clk_gate;
- ctlr = device_get_softc(dev);
+ sc = device_get_softc(dev);
+ ctlr = &sc->ahci_ctlr;
clk_pll = clk_gate = NULL;
ctlr->quirks = AHCI_Q_NOPMP;
@@ -312,6 +320,19 @@ 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;
+ }
+ 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);
if (error != 0) {
@@ -358,6 +379,8 @@ ahci_a10_attach(device_t dev)
return (ahci_attach(dev));
fail:
+ if (sc->ahci_reg != 0)
+ regulator_disable(sc->ahci_reg);
if (clk_gate != NULL)
clk_release(clk_gate);
if (clk_pll != NULL)
@@ -389,7 +412,7 @@ static device_method_t ahci_ata_methods[] = {
static driver_t ahci_ata_driver = {
"ahci",
ahci_ata_methods,
- sizeof(struct ahci_controller)
+ sizeof(struct ahci_a10_softc)
};
DRIVER_MODULE(a10_ahci, simplebus, ahci_ata_driver, ahci_devclass, 0, 0);
More information about the svn-src-stable-12
mailing list