r8152: don't execute runtime suspend if the tx is not empty
[firefly-linux-kernel-4.4.55.git] / drivers / ssb / pci.c
index fc0bb4923ac32f4e497f65643b1eeb9f1c4224de..77b551da57288c11d21d6ff40b65b1d8b01ed887 100644 (file)
@@ -470,7 +470,15 @@ static void sprom_extract_r458(struct ssb_sprom *out, const u16 *in)
 
 static void sprom_extract_r45(struct ssb_sprom *out, const u16 *in)
 {
+       static const u16 pwr_info_offset[] = {
+               SSB_SPROM4_PWR_INFO_CORE0, SSB_SPROM4_PWR_INFO_CORE1,
+               SSB_SPROM4_PWR_INFO_CORE2, SSB_SPROM4_PWR_INFO_CORE3
+       };
        u16 il0mac_offset;
+       int i;
+
+       BUILD_BUG_ON(ARRAY_SIZE(pwr_info_offset) !=
+                    ARRAY_SIZE(out->core_pwr_info));
 
        if (out->revision == 4)
                il0mac_offset = SSB_SPROM4_IL0MAC;
@@ -526,14 +534,59 @@ static void sprom_extract_r45(struct ssb_sprom *out, const u16 *in)
        }
 
        /* Extract the antenna gain values. */
-       SPEX(antenna_gain.a0, SSB_SPROM4_AGAIN01,
-            SSB_SPROM4_AGAIN0, SSB_SPROM4_AGAIN0_SHIFT);
-       SPEX(antenna_gain.a1, SSB_SPROM4_AGAIN01,
-            SSB_SPROM4_AGAIN1, SSB_SPROM4_AGAIN1_SHIFT);
-       SPEX(antenna_gain.a2, SSB_SPROM4_AGAIN23,
-            SSB_SPROM4_AGAIN2, SSB_SPROM4_AGAIN2_SHIFT);
-       SPEX(antenna_gain.a3, SSB_SPROM4_AGAIN23,
-            SSB_SPROM4_AGAIN3, SSB_SPROM4_AGAIN3_SHIFT);
+       out->antenna_gain.a0 = sprom_extract_antgain(out->revision, in,
+                                                    SSB_SPROM4_AGAIN01,
+                                                    SSB_SPROM4_AGAIN0,
+                                                    SSB_SPROM4_AGAIN0_SHIFT);
+       out->antenna_gain.a1 = sprom_extract_antgain(out->revision, in,
+                                                    SSB_SPROM4_AGAIN01,
+                                                    SSB_SPROM4_AGAIN1,
+                                                    SSB_SPROM4_AGAIN1_SHIFT);
+       out->antenna_gain.a2 = sprom_extract_antgain(out->revision, in,
+                                                    SSB_SPROM4_AGAIN23,
+                                                    SSB_SPROM4_AGAIN2,
+                                                    SSB_SPROM4_AGAIN2_SHIFT);
+       out->antenna_gain.a3 = sprom_extract_antgain(out->revision, in,
+                                                    SSB_SPROM4_AGAIN23,
+                                                    SSB_SPROM4_AGAIN3,
+                                                    SSB_SPROM4_AGAIN3_SHIFT);
+
+       /* Extract cores power info info */
+       for (i = 0; i < ARRAY_SIZE(pwr_info_offset); i++) {
+               u16 o = pwr_info_offset[i];
+
+               SPEX(core_pwr_info[i].itssi_2g, o + SSB_SPROM4_2G_MAXP_ITSSI,
+                       SSB_SPROM4_2G_ITSSI, SSB_SPROM4_2G_ITSSI_SHIFT);
+               SPEX(core_pwr_info[i].maxpwr_2g, o + SSB_SPROM4_2G_MAXP_ITSSI,
+                       SSB_SPROM4_2G_MAXP, 0);
+
+               SPEX(core_pwr_info[i].pa_2g[0], o + SSB_SPROM4_2G_PA_0, ~0, 0);
+               SPEX(core_pwr_info[i].pa_2g[1], o + SSB_SPROM4_2G_PA_1, ~0, 0);
+               SPEX(core_pwr_info[i].pa_2g[2], o + SSB_SPROM4_2G_PA_2, ~0, 0);
+               SPEX(core_pwr_info[i].pa_2g[3], o + SSB_SPROM4_2G_PA_3, ~0, 0);
+
+               SPEX(core_pwr_info[i].itssi_5g, o + SSB_SPROM4_5G_MAXP_ITSSI,
+                       SSB_SPROM4_5G_ITSSI, SSB_SPROM4_5G_ITSSI_SHIFT);
+               SPEX(core_pwr_info[i].maxpwr_5g, o + SSB_SPROM4_5G_MAXP_ITSSI,
+                       SSB_SPROM4_5G_MAXP, 0);
+               SPEX(core_pwr_info[i].maxpwr_5gh, o + SSB_SPROM4_5GHL_MAXP,
+                       SSB_SPROM4_5GH_MAXP, 0);
+               SPEX(core_pwr_info[i].maxpwr_5gl, o + SSB_SPROM4_5GHL_MAXP,
+                       SSB_SPROM4_5GL_MAXP, SSB_SPROM4_5GL_MAXP_SHIFT);
+
+               SPEX(core_pwr_info[i].pa_5gl[0], o + SSB_SPROM4_5GL_PA_0, ~0, 0);
+               SPEX(core_pwr_info[i].pa_5gl[1], o + SSB_SPROM4_5GL_PA_1, ~0, 0);
+               SPEX(core_pwr_info[i].pa_5gl[2], o + SSB_SPROM4_5GL_PA_2, ~0, 0);
+               SPEX(core_pwr_info[i].pa_5gl[3], o + SSB_SPROM4_5GL_PA_3, ~0, 0);
+               SPEX(core_pwr_info[i].pa_5g[0], o + SSB_SPROM4_5G_PA_0, ~0, 0);
+               SPEX(core_pwr_info[i].pa_5g[1], o + SSB_SPROM4_5G_PA_1, ~0, 0);
+               SPEX(core_pwr_info[i].pa_5g[2], o + SSB_SPROM4_5G_PA_2, ~0, 0);
+               SPEX(core_pwr_info[i].pa_5g[3], o + SSB_SPROM4_5G_PA_3, ~0, 0);
+               SPEX(core_pwr_info[i].pa_5gh[0], o + SSB_SPROM4_5GH_PA_0, ~0, 0);
+               SPEX(core_pwr_info[i].pa_5gh[1], o + SSB_SPROM4_5GH_PA_1, ~0, 0);
+               SPEX(core_pwr_info[i].pa_5gh[2], o + SSB_SPROM4_5GH_PA_2, ~0, 0);
+               SPEX(core_pwr_info[i].pa_5gh[3], o + SSB_SPROM4_5GH_PA_3, ~0, 0);
+       }
 
        sprom_extract_r458(out, in);
 
@@ -623,14 +676,22 @@ static void sprom_extract_r8(struct ssb_sprom *out, const u16 *in)
        SPEX32(ofdm5ghpo, SSB_SPROM8_OFDM5GHPO, 0xFFFFFFFF, 0);
 
        /* Extract the antenna gain values. */
-       SPEX(antenna_gain.a0, SSB_SPROM8_AGAIN01,
-            SSB_SPROM8_AGAIN0, SSB_SPROM8_AGAIN0_SHIFT);
-       SPEX(antenna_gain.a1, SSB_SPROM8_AGAIN01,
-            SSB_SPROM8_AGAIN1, SSB_SPROM8_AGAIN1_SHIFT);
-       SPEX(antenna_gain.a2, SSB_SPROM8_AGAIN23,
-            SSB_SPROM8_AGAIN2, SSB_SPROM8_AGAIN2_SHIFT);
-       SPEX(antenna_gain.a3, SSB_SPROM8_AGAIN23,
-            SSB_SPROM8_AGAIN3, SSB_SPROM8_AGAIN3_SHIFT);
+       out->antenna_gain.a0 = sprom_extract_antgain(out->revision, in,
+                                                    SSB_SPROM8_AGAIN01,
+                                                    SSB_SPROM8_AGAIN0,
+                                                    SSB_SPROM8_AGAIN0_SHIFT);
+       out->antenna_gain.a1 = sprom_extract_antgain(out->revision, in,
+                                                    SSB_SPROM8_AGAIN01,
+                                                    SSB_SPROM8_AGAIN1,
+                                                    SSB_SPROM8_AGAIN1_SHIFT);
+       out->antenna_gain.a2 = sprom_extract_antgain(out->revision, in,
+                                                    SSB_SPROM8_AGAIN23,
+                                                    SSB_SPROM8_AGAIN2,
+                                                    SSB_SPROM8_AGAIN2_SHIFT);
+       out->antenna_gain.a3 = sprom_extract_antgain(out->revision, in,
+                                                    SSB_SPROM8_AGAIN23,
+                                                    SSB_SPROM8_AGAIN3,
+                                                    SSB_SPROM8_AGAIN3_SHIFT);
 
        /* Extract cores power info info */
        for (i = 0; i < ARRAY_SIZE(pwr_info_offset); i++) {
@@ -848,6 +909,7 @@ static int ssb_pci_sprom_get(struct ssb_bus *bus,
                        if (err) {
                                ssb_warn("WARNING: Using fallback SPROM failed (err %d)\n",
                                         err);
+                               goto out_free;
                        } else {
                                ssb_dbg("Using SPROM revision %d provided by platform\n",
                                        sprom->revision);