This is the 5.4.80 stable release
-----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEEZH8oZUiU471FcZm+ONu9yGCSaT4FAl+8/L0ACgkQONu9yGCS aT624w/+M3fyTWj45qssxAOYUbWH4OPzKjMTKq1qHOGTBGYcVLxmggDV5xziQs8B WiCUysdJsM9Xwe/a9+fy9X2FHk7KxILf02mYLVcwyLJLXCHsCXtvBeTf937h5SaI cIsR1e2LQ7s1mTnVmBs2DGDQcD6Y17f/FoTpBejOSB9O+MSBNoBhOR/aaDUzzLm1 sfpQ3zpnF6iAo2KYITxq/QkyRyiCPMl1c+/ggLTYvrM15DGhnChPN9j1+X0TLdjz UuZakvX/UY9vnY6oWla7wybwUzZMfFqZtehvwFA4wqeZqXcJcb+nBpfpoT1Gp9bv cpz+8nmF0ER1eS6m1C/XqiTr3IqDOSAHfcu80HzJRC+dmcXjxyNj+AZyFhm+uCJS IyUi6+mFwCypg3II2QEMNYdeips4Qj051IPNl5gEteNC4GQqXef3JdR52qIDzsHe 9xgQVFZjVDYpZ6AOkyjqzGJ0dy3a1f7GNIPxwe6DUnbkOkOB+Z5KhGFbEOp+yGoa 3PUnVvtrTs07VkB0afwoj7xIyfowmjxCPSSXkfnYY2iJ6FYsfCm2x/RtM5tTvgT+ E8W71RxsyRwhjC2Z85wi6PR59XTIJcw3oJvJkrvchCAsc3Z1L7wBtjyHdvouxo8+ h/NlGOAisTiQFdT2IixgmTZaoxE7fQLDCJDMmgZT2qPJ1hn7Pbo= =Puge -----END PGP SIGNATURE----- gpgsig -----BEGIN PGP SIGNATURE----- iQIzBAABCgAdFiEEdQaENiSDAlGTDEbB7G51OISzHs0FAl+9WisACgkQ7G51OISz Hs3jpA/8DXrkNu/ObTWzrCgdSIBVHUcN9mJqh7q67at5XnSTJwiN3iIa6ni3Sb63 6wqOYazsSB4KQWosjWSgzYzTsasrB4OgeFMKXxrBM8uoPniNPaSQZk3cJs+v8kQg ptd6vhu4AoV4gKYLQqps2rDJ+VpG7N8YI3Cb8KrxDzff0NWfWtKpJlyUnEd+ABIM oKfknpDumjK3mHFTgmZb0YK6WWtXlxhBge74hnogkuw0g5yvZ5PNvdat6nrMlof3 ytN067rV97saMAZE0syaKKnpBpWAKCYeTCx0xhZrphQMl/XafYPOdZbCj3B380Fb OlDrCprYKGLDF9HedYgDJia4omK36CGh4S+ZjwBfV4DtNlsd+qXzcz/OMrx0B557 AZJpYLtq8XG71ogJ57fbgda10PGd21cLtTAQBkal0FTH3+56MH9mX14oOwr+vzcA 7dK80TbSGLIGWwRDYQI4OAgS3uLCrwrDvvf8lZEB+uV5pIIYr1YQ25e+UFLQuzUH nKsXnUsrTNm2WkeOoFh7+O8JkMT3JyN7jteT19u2RZ1ZLNgJJJHyY2BivGyOONbV vkZzKlfeXtyXvC4aSx9wpvW86vJzwTY+fde9E+5S3SgG9ixsVGf8+dlfMF/kmgtF 1atdOYQYWDoVzKpcVtr6JCtpVkT2Wi3cqo5UUdBkRznd+3wZG1w= =Fg5i -----END PGP SIGNATURE----- Merge tag 'v5.4.80' into 5.4-2.2.x-imx This is the 5.4.80 stable release Conflicts (manual resolve): - arch/arm64/boot/dts/freescale/imx8mn.dtsi: Fix minor merge conflict where commit [8381af1b684c] in stable tree removed one blank line. - drivers/net/can/flexcan.c: Fix merge fuzz during integration of stable commit [4c0a778fcf7b5]. Signed-off-by: Andrey Zhizhikin <andrey.zhizhikin@leica-geosystems.com>5.4-rM2-2.2.x-imx-squashed
commit
2490de76d9
|
@ -82,7 +82,8 @@ Default MMUv2-compatible layout::
|
|||
+------------------+
|
||||
| VMALLOC area | VMALLOC_START 0xc0000000 128MB - 64KB
|
||||
+------------------+ VMALLOC_END
|
||||
| Cache aliasing | TLBTEMP_BASE_1 0xc7ff0000 DCACHE_WAY_SIZE
|
||||
+------------------+
|
||||
| Cache aliasing | TLBTEMP_BASE_1 0xc8000000 DCACHE_WAY_SIZE
|
||||
| remap area 1 |
|
||||
+------------------+
|
||||
| Cache aliasing | TLBTEMP_BASE_2 DCACHE_WAY_SIZE
|
||||
|
@ -124,7 +125,8 @@ Default MMUv2-compatible layout::
|
|||
+------------------+
|
||||
| VMALLOC area | VMALLOC_START 0xa0000000 128MB - 64KB
|
||||
+------------------+ VMALLOC_END
|
||||
| Cache aliasing | TLBTEMP_BASE_1 0xa7ff0000 DCACHE_WAY_SIZE
|
||||
+------------------+
|
||||
| Cache aliasing | TLBTEMP_BASE_1 0xa8000000 DCACHE_WAY_SIZE
|
||||
| remap area 1 |
|
||||
+------------------+
|
||||
| Cache aliasing | TLBTEMP_BASE_2 DCACHE_WAY_SIZE
|
||||
|
@ -167,7 +169,8 @@ Default MMUv2-compatible layout::
|
|||
+------------------+
|
||||
| VMALLOC area | VMALLOC_START 0x90000000 128MB - 64KB
|
||||
+------------------+ VMALLOC_END
|
||||
| Cache aliasing | TLBTEMP_BASE_1 0x97ff0000 DCACHE_WAY_SIZE
|
||||
+------------------+
|
||||
| Cache aliasing | TLBTEMP_BASE_1 0x98000000 DCACHE_WAY_SIZE
|
||||
| remap area 1 |
|
||||
+------------------+
|
||||
| Cache aliasing | TLBTEMP_BASE_2 DCACHE_WAY_SIZE
|
||||
|
|
2
Makefile
2
Makefile
|
@ -1,7 +1,7 @@
|
|||
# SPDX-License-Identifier: GPL-2.0
|
||||
VERSION = 5
|
||||
PATCHLEVEL = 4
|
||||
SUBLEVEL = 79
|
||||
SUBLEVEL = 80
|
||||
EXTRAVERSION =
|
||||
NAME = Kleptomaniac Octopus
|
||||
|
||||
|
|
|
@ -59,7 +59,7 @@
|
|||
MX50_PAD_CSPI_MISO__CSPI_MISO 0x00
|
||||
MX50_PAD_CSPI_MOSI__CSPI_MOSI 0x00
|
||||
MX50_PAD_CSPI_SS0__GPIO4_11 0xc4
|
||||
MX50_PAD_ECSPI1_MOSI__CSPI_SS1 0xf4
|
||||
MX50_PAD_ECSPI1_MOSI__GPIO4_13 0x84
|
||||
>;
|
||||
};
|
||||
|
||||
|
|
|
@ -98,7 +98,7 @@
|
|||
&fec {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_enet>;
|
||||
phy-mode = "rgmii";
|
||||
phy-mode = "rgmii-id";
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
|
|
|
@ -154,7 +154,7 @@
|
|||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&gmac_rgmii_pins>;
|
||||
phy-handle = <&phy1>;
|
||||
phy-mode = "rgmii";
|
||||
phy-mode = "rgmii-id";
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
|
|
|
@ -130,7 +130,7 @@
|
|||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&gmac_rgmii_pins>;
|
||||
phy-handle = <&phy1>;
|
||||
phy-mode = "rgmii";
|
||||
phy-mode = "rgmii-id";
|
||||
phy-supply = <®_gmac_3v3>;
|
||||
status = "okay";
|
||||
};
|
||||
|
|
|
@ -151,7 +151,7 @@
|
|||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&gmac_rgmii_pins>;
|
||||
phy-handle = <&phy1>;
|
||||
phy-mode = "rgmii";
|
||||
phy-mode = "rgmii-id";
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
|
|
|
@ -131,7 +131,7 @@
|
|||
pinctrl-0 = <&emac_rgmii_pins>;
|
||||
phy-supply = <®_sw>;
|
||||
phy-handle = <&rgmii_phy>;
|
||||
phy-mode = "rgmii";
|
||||
phy-mode = "rgmii-id";
|
||||
allwinner,rx-delay-ps = <700>;
|
||||
allwinner,tx-delay-ps = <700>;
|
||||
status = "okay";
|
||||
|
|
|
@ -183,7 +183,7 @@
|
|||
pinctrl-0 = <&emac_rgmii_pins>;
|
||||
phy-supply = <®_dldo4>;
|
||||
phy-handle = <&rgmii_phy>;
|
||||
phy-mode = "rgmii";
|
||||
phy-mode = "rgmii-id";
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
|
|
|
@ -53,11 +53,6 @@
|
|||
};
|
||||
};
|
||||
|
||||
&emac {
|
||||
/* LEDs changed to active high on the plus */
|
||||
/delete-property/ allwinner,leds-active-low;
|
||||
};
|
||||
|
||||
&mmc1 {
|
||||
vmmc-supply = <®_vcc3v3>;
|
||||
bus-width = <4>;
|
||||
|
|
|
@ -67,7 +67,7 @@
|
|||
pinctrl-0 = <&emac_rgmii_pins>;
|
||||
phy-supply = <®_gmac_3v3>;
|
||||
phy-handle = <&ext_rgmii_phy>;
|
||||
phy-mode = "rgmii";
|
||||
phy-mode = "rgmii-id";
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
|
|
|
@ -129,7 +129,7 @@
|
|||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&gmac_rgmii_pins>;
|
||||
phy-handle = <&phy1>;
|
||||
phy-mode = "rgmii";
|
||||
phy-mode = "rgmii-id";
|
||||
phy-supply = <®_dc1sw>;
|
||||
status = "okay";
|
||||
};
|
||||
|
|
|
@ -129,7 +129,7 @@
|
|||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&gmac_rgmii_pins>;
|
||||
phy-handle = <&phy1>;
|
||||
phy-mode = "rgmii";
|
||||
phy-mode = "rgmii-id";
|
||||
phy-supply = <®_cldo1>;
|
||||
status = "okay";
|
||||
};
|
||||
|
|
|
@ -124,7 +124,7 @@
|
|||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&gmac_rgmii_pins>;
|
||||
phy-handle = <&phy1>;
|
||||
phy-mode = "rgmii";
|
||||
phy-mode = "rgmii-id";
|
||||
phy-supply = <®_cldo1>;
|
||||
status = "okay";
|
||||
};
|
||||
|
|
|
@ -126,7 +126,7 @@
|
|||
pinctrl-0 = <&emac_rgmii_pins>;
|
||||
phy-supply = <®_gmac_3v3>;
|
||||
phy-handle = <&ext_rgmii_phy>;
|
||||
phy-mode = "rgmii";
|
||||
phy-mode = "rgmii-id";
|
||||
|
||||
status = "okay";
|
||||
};
|
||||
|
|
|
@ -127,7 +127,7 @@
|
|||
&emac {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&rgmii_pins>;
|
||||
phy-mode = "rgmii";
|
||||
phy-mode = "rgmii-id";
|
||||
phy-handle = <&ext_rgmii_phy>;
|
||||
phy-supply = <®_dc1sw>;
|
||||
status = "okay";
|
||||
|
|
|
@ -129,7 +129,7 @@
|
|||
&emac {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&rgmii_pins>;
|
||||
phy-mode = "rgmii";
|
||||
phy-mode = "rgmii-id";
|
||||
phy-handle = <&ext_rgmii_phy>;
|
||||
phy-supply = <®_gmac_3v3>;
|
||||
status = "okay";
|
||||
|
|
|
@ -52,7 +52,7 @@
|
|||
&emac {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&rgmii_pins>;
|
||||
phy-mode = "rgmii";
|
||||
phy-mode = "rgmii-txid";
|
||||
phy-handle = <&ext_rgmii_phy>;
|
||||
status = "okay";
|
||||
};
|
||||
|
|
|
@ -157,7 +157,7 @@
|
|||
pinctrl-0 = <&emac_rgmii_pins>;
|
||||
phy-supply = <®_gmac_3v3>;
|
||||
phy-handle = <&ext_rgmii_phy>;
|
||||
phy-mode = "rgmii";
|
||||
phy-mode = "rgmii-id";
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
|
|
|
@ -164,7 +164,7 @@
|
|||
pinctrl-0 = <&emac_rgmii_pins>;
|
||||
phy-supply = <®_gmac_3v3>;
|
||||
phy-handle = <&ext_rgmii_phy>;
|
||||
phy-mode = "rgmii";
|
||||
phy-mode = "rgmii-id";
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
|
|
|
@ -83,7 +83,7 @@
|
|||
&emac {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&ext_rgmii_pins>;
|
||||
phy-mode = "rgmii";
|
||||
phy-mode = "rgmii-id";
|
||||
phy-handle = <&ext_rgmii_phy>;
|
||||
phy-supply = <®_aldo2>;
|
||||
status = "okay";
|
||||
|
|
|
@ -66,7 +66,7 @@
|
|||
&emac {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&ext_rgmii_pins>;
|
||||
phy-mode = "rgmii";
|
||||
phy-mode = "rgmii-id";
|
||||
phy-handle = <&ext_rgmii_phy>;
|
||||
phy-supply = <®_aldo2>;
|
||||
allwinner,rx-delay-ps = <200>;
|
||||
|
|
|
@ -262,6 +262,8 @@ extern struct arm64_ftr_reg arm64_ftr_reg_ctrel0;
|
|||
/*
|
||||
* CPU feature detected at boot time based on feature of one or more CPUs.
|
||||
* All possible conflicts for a late CPU are ignored.
|
||||
* NOTE: this means that a late CPU with the feature will *not* cause the
|
||||
* capability to be advertised by cpus_have_*cap()!
|
||||
*/
|
||||
#define ARM64_CPUCAP_WEAK_LOCAL_CPU_FEATURE \
|
||||
(ARM64_CPUCAP_SCOPE_LOCAL_CPU | \
|
||||
|
|
|
@ -511,14 +511,13 @@ static void erratum_1418040_thread_switch(struct task_struct *prev,
|
|||
bool prev32, next32;
|
||||
u64 val;
|
||||
|
||||
if (!(IS_ENABLED(CONFIG_ARM64_ERRATUM_1418040) &&
|
||||
cpus_have_const_cap(ARM64_WORKAROUND_1418040)))
|
||||
if (!IS_ENABLED(CONFIG_ARM64_ERRATUM_1418040))
|
||||
return;
|
||||
|
||||
prev32 = is_compat_thread(task_thread_info(prev));
|
||||
next32 = is_compat_thread(task_thread_info(next));
|
||||
|
||||
if (prev32 == next32)
|
||||
if (prev32 == next32 || !this_cpu_has_cap(ARM64_WORKAROUND_1418040))
|
||||
return;
|
||||
|
||||
val = read_sysreg(cntkctl_el1);
|
||||
|
|
|
@ -66,7 +66,6 @@ static int cpu_psci_cpu_disable(unsigned int cpu)
|
|||
|
||||
static void cpu_psci_cpu_die(unsigned int cpu)
|
||||
{
|
||||
int ret;
|
||||
/*
|
||||
* There are no known implementations of PSCI actually using the
|
||||
* power state field, pass a sensible default for now.
|
||||
|
@ -74,9 +73,7 @@ static void cpu_psci_cpu_die(unsigned int cpu)
|
|||
u32 state = PSCI_POWER_STATE_TYPE_POWER_DOWN <<
|
||||
PSCI_0_2_POWER_STATE_TYPE_SHIFT;
|
||||
|
||||
ret = psci_ops.cpu_off(state);
|
||||
|
||||
pr_crit("unable to power off CPU%u (%d)\n", cpu, ret);
|
||||
psci_ops.cpu_off(state);
|
||||
}
|
||||
|
||||
static int cpu_psci_cpu_kill(unsigned int cpu)
|
||||
|
|
|
@ -388,6 +388,7 @@ void cpu_die_early(void)
|
|||
|
||||
/* Mark this CPU absent */
|
||||
set_cpu_present(cpu, 0);
|
||||
rcu_report_dead(cpu);
|
||||
|
||||
#ifdef CONFIG_HOTPLUG_CPU
|
||||
update_cpu_boot_status(CPU_KILL_ME);
|
||||
|
|
|
@ -152,6 +152,7 @@ static struct clk __init *alchemy_clk_setup_cpu(const char *parent_name,
|
|||
{
|
||||
struct clk_init_data id;
|
||||
struct clk_hw *h;
|
||||
struct clk *clk;
|
||||
|
||||
h = kzalloc(sizeof(*h), GFP_KERNEL);
|
||||
if (!h)
|
||||
|
@ -164,7 +165,13 @@ static struct clk __init *alchemy_clk_setup_cpu(const char *parent_name,
|
|||
id.ops = &alchemy_clkops_cpu;
|
||||
h->init = &id;
|
||||
|
||||
return clk_register(NULL, h);
|
||||
clk = clk_register(NULL, h);
|
||||
if (IS_ERR(clk)) {
|
||||
pr_err("failed to register clock\n");
|
||||
kfree(h);
|
||||
}
|
||||
|
||||
return clk;
|
||||
}
|
||||
|
||||
/* AUXPLLs ************************************************************/
|
||||
|
|
|
@ -437,6 +437,7 @@ int has_transparent_hugepage(void)
|
|||
}
|
||||
return mask == PM_HUGE_MASK;
|
||||
}
|
||||
EXPORT_SYMBOL(has_transparent_hugepage);
|
||||
|
||||
#endif /* CONFIG_TRANSPARENT_HUGEPAGE */
|
||||
|
||||
|
|
|
@ -2217,4 +2217,4 @@ out:
|
|||
}
|
||||
|
||||
arch_initcall(init_cpum_sampling_pmu);
|
||||
core_param(cpum_sfb_size, CPUM_SF_MAX_SDB, sfb_size, 0640);
|
||||
core_param(cpum_sfb_size, CPUM_SF_MAX_SDB, sfb_size, 0644);
|
||||
|
|
|
@ -100,53 +100,6 @@ static int has_newer_microcode(void *mc, unsigned int csig, int cpf, int new_rev
|
|||
return find_matching_signature(mc, csig, cpf);
|
||||
}
|
||||
|
||||
/*
|
||||
* Given CPU signature and a microcode patch, this function finds if the
|
||||
* microcode patch has matching family and model with the CPU.
|
||||
*
|
||||
* %true - if there's a match
|
||||
* %false - otherwise
|
||||
*/
|
||||
static bool microcode_matches(struct microcode_header_intel *mc_header,
|
||||
unsigned long sig)
|
||||
{
|
||||
unsigned long total_size = get_totalsize(mc_header);
|
||||
unsigned long data_size = get_datasize(mc_header);
|
||||
struct extended_sigtable *ext_header;
|
||||
unsigned int fam_ucode, model_ucode;
|
||||
struct extended_signature *ext_sig;
|
||||
unsigned int fam, model;
|
||||
int ext_sigcount, i;
|
||||
|
||||
fam = x86_family(sig);
|
||||
model = x86_model(sig);
|
||||
|
||||
fam_ucode = x86_family(mc_header->sig);
|
||||
model_ucode = x86_model(mc_header->sig);
|
||||
|
||||
if (fam == fam_ucode && model == model_ucode)
|
||||
return true;
|
||||
|
||||
/* Look for ext. headers: */
|
||||
if (total_size <= data_size + MC_HEADER_SIZE)
|
||||
return false;
|
||||
|
||||
ext_header = (void *) mc_header + data_size + MC_HEADER_SIZE;
|
||||
ext_sig = (void *)ext_header + EXT_HEADER_SIZE;
|
||||
ext_sigcount = ext_header->count;
|
||||
|
||||
for (i = 0; i < ext_sigcount; i++) {
|
||||
fam_ucode = x86_family(ext_sig->sig);
|
||||
model_ucode = x86_model(ext_sig->sig);
|
||||
|
||||
if (fam == fam_ucode && model == model_ucode)
|
||||
return true;
|
||||
|
||||
ext_sig++;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
static struct ucode_patch *memdup_patch(void *data, unsigned int size)
|
||||
{
|
||||
struct ucode_patch *p;
|
||||
|
@ -164,7 +117,7 @@ static struct ucode_patch *memdup_patch(void *data, unsigned int size)
|
|||
return p;
|
||||
}
|
||||
|
||||
static void save_microcode_patch(void *data, unsigned int size)
|
||||
static void save_microcode_patch(struct ucode_cpu_info *uci, void *data, unsigned int size)
|
||||
{
|
||||
struct microcode_header_intel *mc_hdr, *mc_saved_hdr;
|
||||
struct ucode_patch *iter, *tmp, *p = NULL;
|
||||
|
@ -210,6 +163,9 @@ static void save_microcode_patch(void *data, unsigned int size)
|
|||
if (!p)
|
||||
return;
|
||||
|
||||
if (!find_matching_signature(p->data, uci->cpu_sig.sig, uci->cpu_sig.pf))
|
||||
return;
|
||||
|
||||
/*
|
||||
* Save for early loading. On 32-bit, that needs to be a physical
|
||||
* address as the APs are running from physical addresses, before
|
||||
|
@ -344,13 +300,14 @@ scan_microcode(void *data, size_t size, struct ucode_cpu_info *uci, bool save)
|
|||
|
||||
size -= mc_size;
|
||||
|
||||
if (!microcode_matches(mc_header, uci->cpu_sig.sig)) {
|
||||
if (!find_matching_signature(data, uci->cpu_sig.sig,
|
||||
uci->cpu_sig.pf)) {
|
||||
data += mc_size;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (save) {
|
||||
save_microcode_patch(data, mc_size);
|
||||
save_microcode_patch(uci, data, mc_size);
|
||||
goto next;
|
||||
}
|
||||
|
||||
|
@ -483,14 +440,14 @@ static void show_saved_mc(void)
|
|||
* Save this microcode patch. It will be loaded early when a CPU is
|
||||
* hot-added or resumes.
|
||||
*/
|
||||
static void save_mc_for_early(u8 *mc, unsigned int size)
|
||||
static void save_mc_for_early(struct ucode_cpu_info *uci, u8 *mc, unsigned int size)
|
||||
{
|
||||
/* Synchronization during CPU hotplug. */
|
||||
static DEFINE_MUTEX(x86_cpu_microcode_mutex);
|
||||
|
||||
mutex_lock(&x86_cpu_microcode_mutex);
|
||||
|
||||
save_microcode_patch(mc, size);
|
||||
save_microcode_patch(uci, mc, size);
|
||||
show_saved_mc();
|
||||
|
||||
mutex_unlock(&x86_cpu_microcode_mutex);
|
||||
|
@ -934,7 +891,7 @@ static enum ucode_state generic_load_microcode(int cpu, struct iov_iter *iter)
|
|||
* permanent memory. So it will be loaded early when a CPU is hot added
|
||||
* or resumes.
|
||||
*/
|
||||
save_mc_for_early(new_mc, new_mc_size);
|
||||
save_mc_for_early(uci, new_mc, new_mc_size);
|
||||
|
||||
pr_debug("CPU%d found a matching microcode update with version 0x%x (current=0x%x)\n",
|
||||
cpu, new_rev, uci->cpu_sig.rev);
|
||||
|
|
|
@ -512,9 +512,6 @@ int tboot_force_iommu(void)
|
|||
if (!tboot_enabled())
|
||||
return 0;
|
||||
|
||||
if (intel_iommu_tboot_noforce)
|
||||
return 1;
|
||||
|
||||
if (no_iommu || swiotlb || dmar_disabled)
|
||||
pr_warning("Forcing Intel-IOMMU to enabled\n");
|
||||
|
||||
|
|
|
@ -217,28 +217,30 @@ int __init efi_alloc_page_tables(void)
|
|||
gfp_mask = GFP_KERNEL | __GFP_ZERO;
|
||||
efi_pgd = (pgd_t *)__get_free_pages(gfp_mask, PGD_ALLOCATION_ORDER);
|
||||
if (!efi_pgd)
|
||||
return -ENOMEM;
|
||||
goto fail;
|
||||
|
||||
pgd = efi_pgd + pgd_index(EFI_VA_END);
|
||||
p4d = p4d_alloc(&init_mm, pgd, EFI_VA_END);
|
||||
if (!p4d) {
|
||||
free_page((unsigned long)efi_pgd);
|
||||
return -ENOMEM;
|
||||
}
|
||||
if (!p4d)
|
||||
goto free_pgd;
|
||||
|
||||
pud = pud_alloc(&init_mm, p4d, EFI_VA_END);
|
||||
if (!pud) {
|
||||
if (pgtable_l5_enabled())
|
||||
free_page((unsigned long) pgd_page_vaddr(*pgd));
|
||||
free_pages((unsigned long)efi_pgd, PGD_ALLOCATION_ORDER);
|
||||
return -ENOMEM;
|
||||
}
|
||||
if (!pud)
|
||||
goto free_p4d;
|
||||
|
||||
efi_mm.pgd = efi_pgd;
|
||||
mm_init_cpumask(&efi_mm);
|
||||
init_new_context(NULL, &efi_mm);
|
||||
|
||||
return 0;
|
||||
|
||||
free_p4d:
|
||||
if (pgtable_l5_enabled())
|
||||
free_page((unsigned long)pgd_page_vaddr(*pgd));
|
||||
free_pgd:
|
||||
free_pages((unsigned long)efi_pgd, PGD_ALLOCATION_ORDER);
|
||||
fail:
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -70,7 +70,7 @@
|
|||
*/
|
||||
#define VMALLOC_START (XCHAL_KSEG_CACHED_VADDR - 0x10000000)
|
||||
#define VMALLOC_END (VMALLOC_START + 0x07FEFFFF)
|
||||
#define TLBTEMP_BASE_1 (VMALLOC_END + 1)
|
||||
#define TLBTEMP_BASE_1 (VMALLOC_START + 0x08000000)
|
||||
#define TLBTEMP_BASE_2 (TLBTEMP_BASE_1 + DCACHE_WAY_SIZE)
|
||||
#if 2 * DCACHE_WAY_SIZE > ICACHE_WAY_SIZE
|
||||
#define TLBTEMP_SIZE (2 * DCACHE_WAY_SIZE)
|
||||
|
|
|
@ -71,8 +71,10 @@ static inline void kmap_invalidate_coherent(struct page *page,
|
|||
kvaddr = TLBTEMP_BASE_1 +
|
||||
(page_to_phys(page) & DCACHE_ALIAS_MASK);
|
||||
|
||||
preempt_disable();
|
||||
__invalidate_dcache_page_alias(kvaddr,
|
||||
page_to_phys(page));
|
||||
preempt_enable();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -157,6 +159,7 @@ void flush_dcache_page(struct page *page)
|
|||
if (!alias && !mapping)
|
||||
return;
|
||||
|
||||
preempt_disable();
|
||||
virt = TLBTEMP_BASE_1 + (phys & DCACHE_ALIAS_MASK);
|
||||
__flush_invalidate_dcache_page_alias(virt, phys);
|
||||
|
||||
|
@ -167,6 +170,7 @@ void flush_dcache_page(struct page *page)
|
|||
|
||||
if (mapping)
|
||||
__invalidate_icache_page_alias(virt, phys);
|
||||
preempt_enable();
|
||||
}
|
||||
|
||||
/* There shouldn't be an entry in the cache for this page anymore. */
|
||||
|
@ -200,8 +204,10 @@ void local_flush_cache_page(struct vm_area_struct *vma, unsigned long address,
|
|||
unsigned long phys = page_to_phys(pfn_to_page(pfn));
|
||||
unsigned long virt = TLBTEMP_BASE_1 + (address & DCACHE_ALIAS_MASK);
|
||||
|
||||
preempt_disable();
|
||||
__flush_invalidate_dcache_page_alias(virt, phys);
|
||||
__invalidate_icache_page_alias(virt, phys);
|
||||
preempt_enable();
|
||||
}
|
||||
EXPORT_SYMBOL(local_flush_cache_page);
|
||||
|
||||
|
@ -228,11 +234,13 @@ update_mmu_cache(struct vm_area_struct * vma, unsigned long addr, pte_t *ptep)
|
|||
unsigned long phys = page_to_phys(page);
|
||||
unsigned long tmp;
|
||||
|
||||
preempt_disable();
|
||||
tmp = TLBTEMP_BASE_1 + (phys & DCACHE_ALIAS_MASK);
|
||||
__flush_invalidate_dcache_page_alias(tmp, phys);
|
||||
tmp = TLBTEMP_BASE_1 + (addr & DCACHE_ALIAS_MASK);
|
||||
__flush_invalidate_dcache_page_alias(tmp, phys);
|
||||
__invalidate_icache_page_alias(tmp, phys);
|
||||
preempt_enable();
|
||||
|
||||
clear_bit(PG_arch_1, &page->flags);
|
||||
}
|
||||
|
@ -266,7 +274,9 @@ void copy_to_user_page(struct vm_area_struct *vma, struct page *page,
|
|||
|
||||
if (alias) {
|
||||
unsigned long t = TLBTEMP_BASE_1 + (vaddr & DCACHE_ALIAS_MASK);
|
||||
preempt_disable();
|
||||
__flush_invalidate_dcache_page_alias(t, phys);
|
||||
preempt_enable();
|
||||
}
|
||||
|
||||
/* Copy data */
|
||||
|
@ -281,9 +291,11 @@ void copy_to_user_page(struct vm_area_struct *vma, struct page *page,
|
|||
if (alias) {
|
||||
unsigned long t = TLBTEMP_BASE_1 + (vaddr & DCACHE_ALIAS_MASK);
|
||||
|
||||
preempt_disable();
|
||||
__flush_invalidate_dcache_range((unsigned long) dst, len);
|
||||
if ((vma->vm_flags & VM_EXEC) != 0)
|
||||
__invalidate_icache_page_alias(t, phys);
|
||||
preempt_enable();
|
||||
|
||||
} else if ((vma->vm_flags & VM_EXEC) != 0) {
|
||||
__flush_dcache_range((unsigned long)dst,len);
|
||||
|
@ -305,7 +317,9 @@ extern void copy_from_user_page(struct vm_area_struct *vma, struct page *page,
|
|||
|
||||
if (alias) {
|
||||
unsigned long t = TLBTEMP_BASE_1 + (vaddr & DCACHE_ALIAS_MASK);
|
||||
preempt_disable();
|
||||
__flush_invalidate_dcache_page_alias(t, phys);
|
||||
preempt_enable();
|
||||
}
|
||||
|
||||
memcpy(dst, src, len);
|
||||
|
|
|
@ -85,7 +85,18 @@ static const struct dmi_system_id lid_blacklst[] = {
|
|||
*/
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "MEDION"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "E2215T MD60198"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "E2215T"),
|
||||
},
|
||||
.driver_data = (void *)(long)ACPI_BUTTON_LID_INIT_OPEN,
|
||||
},
|
||||
{
|
||||
/*
|
||||
* Medion Akoya E2228T, notification of the LID device only
|
||||
* happens on close, not on open and _LID always returns closed.
|
||||
*/
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "MEDION"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "E2228T"),
|
||||
},
|
||||
.driver_data = (void *)(long)ACPI_BUTTON_LID_INIT_OPEN,
|
||||
},
|
||||
|
|
|
@ -1706,6 +1706,8 @@ static int ns_send(struct atm_vcc *vcc, struct sk_buff *skb)
|
|||
|
||||
if (push_scqe(card, vc, scq, &scqe, skb) != 0) {
|
||||
atomic_inc(&vcc->stats->tx_err);
|
||||
dma_unmap_single(&card->pcidev->dev, NS_PRV_DMA(skb), skb->len,
|
||||
DMA_TO_DEVICE);
|
||||
dev_kfree_skb_any(skb);
|
||||
return -EIO;
|
||||
}
|
||||
|
|
|
@ -299,8 +299,8 @@ irq_source_info_dcn20[DAL_IRQ_SOURCES_NUMBER] = {
|
|||
pflip_int_entry(1),
|
||||
pflip_int_entry(2),
|
||||
pflip_int_entry(3),
|
||||
[DC_IRQ_SOURCE_PFLIP5] = dummy_irq_entry(),
|
||||
[DC_IRQ_SOURCE_PFLIP6] = dummy_irq_entry(),
|
||||
pflip_int_entry(4),
|
||||
pflip_int_entry(5),
|
||||
[DC_IRQ_SOURCE_PFLIP_UNDERLAY0] = dummy_irq_entry(),
|
||||
gpio_pad_int_entry(0),
|
||||
gpio_pad_int_entry(1),
|
||||
|
|
|
@ -11893,10 +11893,11 @@ compute_sink_pipe_bpp(const struct drm_connector_state *conn_state,
|
|||
case 10 ... 11:
|
||||
bpp = 10 * 3;
|
||||
break;
|
||||
case 12:
|
||||
case 12 ... 16:
|
||||
bpp = 12 * 3;
|
||||
break;
|
||||
default:
|
||||
MISSING_CASE(conn_state->max_bpc);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
|
|
@ -209,6 +209,7 @@ static int sun8i_dw_hdmi_bind(struct device *dev, struct device *master,
|
|||
phy_node = of_parse_phandle(dev->of_node, "phys", 0);
|
||||
if (!phy_node) {
|
||||
dev_err(dev, "Can't found PHY phandle\n");
|
||||
ret = -EINVAL;
|
||||
goto err_disable_clk_tmds;
|
||||
}
|
||||
|
||||
|
|
|
@ -328,7 +328,7 @@ static const char mse_bluetooth_descriptor[] = {
|
|||
0x25, 0x01, /* LOGICAL_MAX (1) */
|
||||
0x75, 0x01, /* REPORT_SIZE (1) */
|
||||
0x95, 0x04, /* REPORT_COUNT (4) */
|
||||
0x81, 0x06, /* INPUT */
|
||||
0x81, 0x02, /* INPUT (Data,Var,Abs) */
|
||||
0xC0, /* END_COLLECTION */
|
||||
0xC0, /* END_COLLECTION */
|
||||
};
|
||||
|
@ -866,11 +866,24 @@ static void logi_dj_recv_queue_notification(struct dj_receiver_dev *djrcv_dev,
|
|||
schedule_work(&djrcv_dev->work);
|
||||
}
|
||||
|
||||
/*
|
||||
* Some quad/bluetooth keyboards have a builtin touchpad in this case we see
|
||||
* only 1 paired device with a device_type of REPORT_TYPE_KEYBOARD. For the
|
||||
* touchpad to work we must also forward mouse input reports to the dj_hiddev
|
||||
* created for the keyboard (instead of forwarding them to a second paired
|
||||
* device with a device_type of REPORT_TYPE_MOUSE as we normally would).
|
||||
*/
|
||||
static const u16 kbd_builtin_touchpad_ids[] = {
|
||||
0xb309, /* Dinovo Edge */
|
||||
0xb30c, /* Dinovo Mini */
|
||||
};
|
||||
|
||||
static void logi_hidpp_dev_conn_notif_equad(struct hid_device *hdev,
|
||||
struct hidpp_event *hidpp_report,
|
||||
struct dj_workitem *workitem)
|
||||
{
|
||||
struct dj_receiver_dev *djrcv_dev = hid_get_drvdata(hdev);
|
||||
int i, id;
|
||||
|
||||
workitem->type = WORKITEM_TYPE_PAIRED;
|
||||
workitem->device_type = hidpp_report->params[HIDPP_PARAM_DEVICE_INFO] &
|
||||
|
@ -882,6 +895,13 @@ static void logi_hidpp_dev_conn_notif_equad(struct hid_device *hdev,
|
|||
workitem->reports_supported |= STD_KEYBOARD | MULTIMEDIA |
|
||||
POWER_KEYS | MEDIA_CENTER |
|
||||
HIDPP;
|
||||
id = (workitem->quad_id_msb << 8) | workitem->quad_id_lsb;
|
||||
for (i = 0; i < ARRAY_SIZE(kbd_builtin_touchpad_ids); i++) {
|
||||
if (id == kbd_builtin_touchpad_ids[i]) {
|
||||
workitem->reports_supported |= STD_MOUSE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case REPORT_TYPE_MOUSE:
|
||||
workitem->reports_supported |= STD_MOUSE | HIDPP;
|
||||
|
|
|
@ -88,6 +88,8 @@ MODULE_PARM_DESC(disable_tap_to_click,
|
|||
#define HIDPP_CAPABILITY_BATTERY_MILEAGE BIT(2)
|
||||
#define HIDPP_CAPABILITY_BATTERY_LEVEL_STATUS BIT(3)
|
||||
|
||||
#define lg_map_key_clear(c) hid_map_usage_clear(hi, usage, bit, max, EV_KEY, (c))
|
||||
|
||||
/*
|
||||
* There are two hidpp protocols in use, the first version hidpp10 is known
|
||||
* as register access protocol or RAP, the second version hidpp20 is known as
|
||||
|
@ -2768,6 +2770,26 @@ static int g920_get_config(struct hidpp_device *hidpp,
|
|||
return g920_ff_set_autocenter(hidpp, data);
|
||||
}
|
||||
|
||||
/* -------------------------------------------------------------------------- */
|
||||
/* Logitech Dinovo Mini keyboard with builtin touchpad */
|
||||
/* -------------------------------------------------------------------------- */
|
||||
#define DINOVO_MINI_PRODUCT_ID 0xb30c
|
||||
|
||||
static int lg_dinovo_input_mapping(struct hid_device *hdev, struct hid_input *hi,
|
||||
struct hid_field *field, struct hid_usage *usage,
|
||||
unsigned long **bit, int *max)
|
||||
{
|
||||
if ((usage->hid & HID_USAGE_PAGE) != HID_UP_LOGIVENDOR)
|
||||
return 0;
|
||||
|
||||
switch (usage->hid & HID_USAGE) {
|
||||
case 0x00d: lg_map_key_clear(KEY_MEDIA); break;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* -------------------------------------------------------------------------- */
|
||||
/* HID++1.0 devices which use HID++ reports for their wheels */
|
||||
/* -------------------------------------------------------------------------- */
|
||||
|
@ -3003,6 +3025,9 @@ static int hidpp_input_mapping(struct hid_device *hdev, struct hid_input *hi,
|
|||
field->application != HID_GD_MOUSE)
|
||||
return m560_input_mapping(hdev, hi, field, usage, bit, max);
|
||||
|
||||
if (hdev->product == DINOVO_MINI_PRODUCT_ID)
|
||||
return lg_dinovo_input_mapping(hdev, hi, field, usage, bit, max);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -3741,6 +3766,7 @@ static const struct hid_device_id hidpp_devices[] = {
|
|||
LDJ_DEVICE(0x405e), .driver_data = HIDPP_QUIRK_HI_RES_SCROLL_X2121 },
|
||||
{ /* Mouse Logitech MX Anywhere 2 */
|
||||
LDJ_DEVICE(0x404a), .driver_data = HIDPP_QUIRK_HI_RES_SCROLL_X2121 },
|
||||
{ LDJ_DEVICE(0x4072), .driver_data = HIDPP_QUIRK_HI_RES_SCROLL_X2121 },
|
||||
{ LDJ_DEVICE(0xb013), .driver_data = HIDPP_QUIRK_HI_RES_SCROLL_X2121 },
|
||||
{ LDJ_DEVICE(0xb018), .driver_data = HIDPP_QUIRK_HI_RES_SCROLL_X2121 },
|
||||
{ LDJ_DEVICE(0xb01f), .driver_data = HIDPP_QUIRK_HI_RES_SCROLL_X2121 },
|
||||
|
|
|
@ -251,9 +251,13 @@ int hv_synic_cleanup(unsigned int cpu)
|
|||
|
||||
/*
|
||||
* Hyper-V does not provide a way to change the connect CPU once
|
||||
* it is set; we must prevent the connect CPU from going offline.
|
||||
* it is set; we must prevent the connect CPU from going offline
|
||||
* while the VM is running normally. But in the panic or kexec()
|
||||
* path where the vmbus is already disconnected, the CPU must be
|
||||
* allowed to shut down.
|
||||
*/
|
||||
if (cpu == VMBUS_CONNECT_CPU)
|
||||
if (cpu == VMBUS_CONNECT_CPU &&
|
||||
vmbus_connection.conn_state == CONNECTED)
|
||||
return -EBUSY;
|
||||
|
||||
/*
|
||||
|
|
|
@ -54,16 +54,18 @@ static irqreturn_t pulse_handler(int irq, void *dev_id)
|
|||
static void sample_timer(struct timer_list *t)
|
||||
{
|
||||
struct pwm_fan_ctx *ctx = from_timer(ctx, t, rpm_timer);
|
||||
unsigned int delta = ktime_ms_delta(ktime_get(), ctx->sample_start);
|
||||
int pulses;
|
||||
u64 tmp;
|
||||
|
||||
pulses = atomic_read(&ctx->pulses);
|
||||
atomic_sub(pulses, &ctx->pulses);
|
||||
tmp = (u64)pulses * ktime_ms_delta(ktime_get(), ctx->sample_start) * 60;
|
||||
do_div(tmp, ctx->pulses_per_revolution * 1000);
|
||||
ctx->rpm = tmp;
|
||||
if (delta) {
|
||||
pulses = atomic_read(&ctx->pulses);
|
||||
atomic_sub(pulses, &ctx->pulses);
|
||||
ctx->rpm = (unsigned int)(pulses * 1000 * 60) /
|
||||
(ctx->pulses_per_revolution * delta);
|
||||
|
||||
ctx->sample_start = ktime_get();
|
||||
}
|
||||
|
||||
ctx->sample_start = ktime_get();
|
||||
mod_timer(&ctx->rpm_timer, jiffies + HZ);
|
||||
}
|
||||
|
||||
|
|
|
@ -126,6 +126,12 @@ enum kx_chipset {
|
|||
KX_MAX_CHIPS /* this must be last */
|
||||
};
|
||||
|
||||
enum kx_acpi_type {
|
||||
ACPI_GENERIC,
|
||||
ACPI_SMO8500,
|
||||
ACPI_KIOX010A,
|
||||
};
|
||||
|
||||
struct kxcjk1013_data {
|
||||
struct i2c_client *client;
|
||||
struct iio_trigger *dready_trig;
|
||||
|
@ -142,7 +148,7 @@ struct kxcjk1013_data {
|
|||
bool motion_trigger_on;
|
||||
int64_t timestamp;
|
||||
enum kx_chipset chipset;
|
||||
bool is_smo8500_device;
|
||||
enum kx_acpi_type acpi_type;
|
||||
};
|
||||
|
||||
enum kxcjk1013_axis {
|
||||
|
@ -269,6 +275,32 @@ static const struct {
|
|||
{19163, 1, 0},
|
||||
{38326, 0, 1} };
|
||||
|
||||
#ifdef CONFIG_ACPI
|
||||
enum kiox010a_fn_index {
|
||||
KIOX010A_SET_LAPTOP_MODE = 1,
|
||||
KIOX010A_SET_TABLET_MODE = 2,
|
||||
};
|
||||
|
||||
static int kiox010a_dsm(struct device *dev, int fn_index)
|
||||
{
|
||||
acpi_handle handle = ACPI_HANDLE(dev);
|
||||
guid_t kiox010a_dsm_guid;
|
||||
union acpi_object *obj;
|
||||
|
||||
if (!handle)
|
||||
return -ENODEV;
|
||||
|
||||
guid_parse("1f339696-d475-4e26-8cad-2e9f8e6d7a91", &kiox010a_dsm_guid);
|
||||
|
||||
obj = acpi_evaluate_dsm(handle, &kiox010a_dsm_guid, 1, fn_index, NULL);
|
||||
if (!obj)
|
||||
return -EIO;
|
||||
|
||||
ACPI_FREE(obj);
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
static int kxcjk1013_set_mode(struct kxcjk1013_data *data,
|
||||
enum kxcjk1013_mode mode)
|
||||
{
|
||||
|
@ -346,6 +378,13 @@ static int kxcjk1013_chip_init(struct kxcjk1013_data *data)
|
|||
{
|
||||
int ret;
|
||||
|
||||
#ifdef CONFIG_ACPI
|
||||
if (data->acpi_type == ACPI_KIOX010A) {
|
||||
/* Make sure the kbd and touchpad on 2-in-1s using 2 KXCJ91008-s work */
|
||||
kiox010a_dsm(&data->client->dev, KIOX010A_SET_LAPTOP_MODE);
|
||||
}
|
||||
#endif
|
||||
|
||||
ret = i2c_smbus_read_byte_data(data->client, KXCJK1013_REG_WHO_AM_I);
|
||||
if (ret < 0) {
|
||||
dev_err(&data->client->dev, "Error reading who_am_i\n");
|
||||
|
@ -1233,7 +1272,7 @@ static irqreturn_t kxcjk1013_data_rdy_trig_poll(int irq, void *private)
|
|||
|
||||
static const char *kxcjk1013_match_acpi_device(struct device *dev,
|
||||
enum kx_chipset *chipset,
|
||||
bool *is_smo8500_device)
|
||||
enum kx_acpi_type *acpi_type)
|
||||
{
|
||||
const struct acpi_device_id *id;
|
||||
|
||||
|
@ -1242,7 +1281,9 @@ static const char *kxcjk1013_match_acpi_device(struct device *dev,
|
|||
return NULL;
|
||||
|
||||
if (strcmp(id->id, "SMO8500") == 0)
|
||||
*is_smo8500_device = true;
|
||||
*acpi_type = ACPI_SMO8500;
|
||||
else if (strcmp(id->id, "KIOX010A") == 0)
|
||||
*acpi_type = ACPI_KIOX010A;
|
||||
|
||||
*chipset = (enum kx_chipset)id->driver_data;
|
||||
|
||||
|
@ -1278,7 +1319,7 @@ static int kxcjk1013_probe(struct i2c_client *client,
|
|||
} else if (ACPI_HANDLE(&client->dev)) {
|
||||
name = kxcjk1013_match_acpi_device(&client->dev,
|
||||
&data->chipset,
|
||||
&data->is_smo8500_device);
|
||||
&data->acpi_type);
|
||||
} else
|
||||
return -ENODEV;
|
||||
|
||||
|
@ -1296,7 +1337,7 @@ static int kxcjk1013_probe(struct i2c_client *client,
|
|||
indio_dev->modes = INDIO_DIRECT_MODE;
|
||||
indio_dev->info = &kxcjk1013_info;
|
||||
|
||||
if (client->irq > 0 && !data->is_smo8500_device) {
|
||||
if (client->irq > 0 && data->acpi_type != ACPI_SMO8500) {
|
||||
ret = devm_request_threaded_irq(&client->dev, client->irq,
|
||||
kxcjk1013_data_rdy_trig_poll,
|
||||
kxcjk1013_event_handler,
|
||||
|
|
|
@ -9,9 +9,9 @@
|
|||
#include <linux/err.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/mod_devicetable.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/property.h>
|
||||
#include <linux/iopoll.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/iio/iio.h>
|
||||
|
@ -279,6 +279,8 @@ static int mt6577_auxadc_probe(struct platform_device *pdev)
|
|||
goto err_disable_clk;
|
||||
}
|
||||
|
||||
adc_dev->dev_comp = device_get_match_data(&pdev->dev);
|
||||
|
||||
mutex_init(&adc_dev->lock);
|
||||
|
||||
mt6577_auxadc_mod_reg(adc_dev->reg_base + MT6577_AUXADC_MISC,
|
||||
|
|
|
@ -485,6 +485,7 @@ config VCNL4000
|
|||
|
||||
config VCNL4035
|
||||
tristate "VCNL4035 combined ALS and proximity sensor"
|
||||
select IIO_BUFFER
|
||||
select IIO_TRIGGERED_BUFFER
|
||||
select REGMAP_I2C
|
||||
depends on I2C
|
||||
|
|
|
@ -80,6 +80,9 @@ config INFINIBAND_ADDR_TRANS_CONFIGFS
|
|||
This allows the user to config the default GID type that the CM
|
||||
uses for each device, when initiaing new connections.
|
||||
|
||||
config INFINIBAND_VIRT_DMA
|
||||
def_bool !HIGHMEM
|
||||
|
||||
if INFINIBAND_USER_ACCESS || !INFINIBAND_USER_ACCESS
|
||||
source "drivers/infiniband/hw/mthca/Kconfig"
|
||||
source "drivers/infiniband/hw/qib/Kconfig"
|
||||
|
|
|
@ -266,7 +266,7 @@ static int pvrdma_register_device(struct pvrdma_dev *dev)
|
|||
}
|
||||
ret = ib_device_set_netdev(&dev->ib_dev, dev->netdev, 1);
|
||||
if (ret)
|
||||
return ret;
|
||||
goto err_srq_free;
|
||||
spin_lock_init(&dev->srq_tbl_lock);
|
||||
rdma_set_device_sysfs_group(&dev->ib_dev, &pvrdma_attr_group);
|
||||
|
||||
|
|
|
@ -1,7 +1,8 @@
|
|||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
config INFINIBAND_RDMAVT
|
||||
tristate "RDMA verbs transport library"
|
||||
depends on X86_64 && ARCH_DMA_ADDR_T_64BIT
|
||||
depends on INFINIBAND_VIRT_DMA
|
||||
depends on X86_64
|
||||
depends on PCI
|
||||
select DMA_VIRT_OPS
|
||||
---help---
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
config RDMA_RXE
|
||||
tristate "Software RDMA over Ethernet (RoCE) driver"
|
||||
depends on INET && PCI && INFINIBAND
|
||||
depends on !64BIT || ARCH_DMA_ADDR_T_64BIT
|
||||
depends on INFINIBAND_VIRT_DMA
|
||||
select NET_UDP_TUNNEL
|
||||
select CRYPTO_CRC32
|
||||
select DMA_VIRT_OPS
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
config RDMA_SIW
|
||||
tristate "Software RDMA over TCP/IP (iWARP) driver"
|
||||
depends on INET && INFINIBAND && LIBCRC32C
|
||||
depends on INFINIBAND_VIRT_DMA
|
||||
select DMA_VIRT_OPS
|
||||
help
|
||||
This driver implements the iWARP RDMA transport over
|
||||
|
|
|
@ -696,7 +696,7 @@ struct adxl34x *adxl34x_probe(struct device *dev, int irq,
|
|||
struct input_dev *input_dev;
|
||||
const struct adxl34x_platform_data *pdata;
|
||||
int err, range, i;
|
||||
unsigned char revid;
|
||||
int revid;
|
||||
|
||||
if (!irq) {
|
||||
dev_err(dev, "no IRQ?\n");
|
||||
|
|
|
@ -109,6 +109,7 @@ config TOUCHSCREEN_AD7879_SPI
|
|||
config TOUCHSCREEN_ADC
|
||||
tristate "Generic ADC based resistive touchscreen"
|
||||
depends on IIO
|
||||
select IIO_BUFFER
|
||||
select IIO_BUFFER_CB
|
||||
help
|
||||
Say Y here if you want to use the generic ADC
|
||||
|
|
|
@ -179,7 +179,7 @@ static int rwbf_quirk;
|
|||
* (used when kernel is launched w/ TXT)
|
||||
*/
|
||||
static int force_on = 0;
|
||||
int intel_iommu_tboot_noforce;
|
||||
static int intel_iommu_tboot_noforce;
|
||||
static int no_platform_optin;
|
||||
|
||||
#define ROOT_ENTRY_NR (VTD_PAGE_SIZE/sizeof(struct root_entry))
|
||||
|
@ -4927,7 +4927,8 @@ int __init intel_iommu_init(void)
|
|||
* Intel IOMMU is required for a TXT/tboot launch or platform
|
||||
* opt in, so enforce that.
|
||||
*/
|
||||
force_on = tboot_force_iommu() || platform_optin_force_iommu();
|
||||
force_on = (!intel_iommu_tboot_noforce && tboot_force_iommu()) ||
|
||||
platform_optin_force_iommu();
|
||||
|
||||
if (iommu_init_mempool()) {
|
||||
if (force_on)
|
||||
|
|
|
@ -669,6 +669,15 @@ static void sdhci_intel_set_power(struct sdhci_host *host, unsigned char mode,
|
|||
}
|
||||
}
|
||||
|
||||
static void sdhci_intel_set_uhs_signaling(struct sdhci_host *host,
|
||||
unsigned int timing)
|
||||
{
|
||||
/* Set UHS timing to SDR25 for High Speed mode */
|
||||
if (timing == MMC_TIMING_MMC_HS || timing == MMC_TIMING_SD_HS)
|
||||
timing = MMC_TIMING_UHS_SDR25;
|
||||
sdhci_set_uhs_signaling(host, timing);
|
||||
}
|
||||
|
||||
#define INTEL_HS400_ES_REG 0x78
|
||||
#define INTEL_HS400_ES_BIT BIT(0)
|
||||
|
||||
|
@ -725,7 +734,7 @@ static const struct sdhci_ops sdhci_intel_byt_ops = {
|
|||
.enable_dma = sdhci_pci_enable_dma,
|
||||
.set_bus_width = sdhci_set_bus_width,
|
||||
.reset = sdhci_reset,
|
||||
.set_uhs_signaling = sdhci_set_uhs_signaling,
|
||||
.set_uhs_signaling = sdhci_intel_set_uhs_signaling,
|
||||
.hw_reset = sdhci_pci_hw_reset,
|
||||
};
|
||||
|
||||
|
@ -735,7 +744,7 @@ static const struct sdhci_ops sdhci_intel_glk_ops = {
|
|||
.enable_dma = sdhci_pci_enable_dma,
|
||||
.set_bus_width = sdhci_set_bus_width,
|
||||
.reset = sdhci_cqhci_reset,
|
||||
.set_uhs_signaling = sdhci_set_uhs_signaling,
|
||||
.set_uhs_signaling = sdhci_intel_set_uhs_signaling,
|
||||
.hw_reset = sdhci_pci_hw_reset,
|
||||
.irq = sdhci_cqhci_irq,
|
||||
};
|
||||
|
|
|
@ -567,7 +567,7 @@ static void can_restart(struct net_device *dev)
|
|||
}
|
||||
cf->can_id |= CAN_ERR_RESTARTED;
|
||||
|
||||
netif_rx(skb);
|
||||
netif_rx_ni(skb);
|
||||
|
||||
stats->rx_packets++;
|
||||
stats->rx_bytes += cf->can_dlc;
|
||||
|
|
|
@ -754,8 +754,10 @@ static int flexcan_get_berr_counter(const struct net_device *dev,
|
|||
int err;
|
||||
|
||||
err = pm_runtime_get_sync(priv->dev);
|
||||
if (err < 0)
|
||||
if (err < 0) {
|
||||
pm_runtime_put_noidle(priv->dev);
|
||||
return err;
|
||||
}
|
||||
|
||||
err = __flexcan_get_berr_counter(dev, bec);
|
||||
|
||||
|
@ -1602,14 +1604,10 @@ static int flexcan_chip_start(struct net_device *dev)
|
|||
|
||||
}
|
||||
|
||||
err = flexcan_transceiver_enable(priv);
|
||||
if (err)
|
||||
goto out_chip_disable;
|
||||
|
||||
/* synchronize with the can bus */
|
||||
err = flexcan_chip_unfreeze(priv);
|
||||
if (err)
|
||||
goto out_transceiver_disable;
|
||||
goto out_chip_disable;
|
||||
|
||||
priv->can.state = CAN_STATE_ERROR_ACTIVE;
|
||||
|
||||
|
@ -1627,8 +1625,6 @@ static int flexcan_chip_start(struct net_device *dev)
|
|||
|
||||
return 0;
|
||||
|
||||
out_transceiver_disable:
|
||||
flexcan_transceiver_disable(priv);
|
||||
out_chip_disable:
|
||||
flexcan_chip_disable(priv);
|
||||
return err;
|
||||
|
@ -1658,7 +1654,6 @@ static int __flexcan_chip_stop(struct net_device *dev, bool disable_on_error)
|
|||
priv->write(priv->reg_ctrl_default & ~FLEXCAN_CTRL_ERR_ALL,
|
||||
®s->ctrl);
|
||||
|
||||
flexcan_transceiver_disable(priv);
|
||||
priv->can.state = CAN_STATE_STOPPED;
|
||||
|
||||
return 0;
|
||||
|
@ -1691,21 +1686,28 @@ static int flexcan_open(struct net_device *dev)
|
|||
}
|
||||
|
||||
err = pm_runtime_get_sync(priv->dev);
|
||||
if (err < 0)
|
||||
if (err < 0) {
|
||||
pm_runtime_put_noidle(priv->dev);
|
||||
return err;
|
||||
}
|
||||
|
||||
err = open_candev(dev);
|
||||
if (err)
|
||||
goto out_runtime_put;
|
||||
|
||||
err = request_irq(dev->irq, flexcan_irq, IRQF_SHARED, dev->name, dev);
|
||||
err = flexcan_transceiver_enable(priv);
|
||||
if (err)
|
||||
goto out_close;
|
||||
|
||||
err = request_irq(dev->irq, flexcan_irq, IRQF_SHARED, dev->name, dev);
|
||||
if (err)
|
||||
goto out_transceiver_disable;
|
||||
|
||||
if (priv->can.ctrlmode & CAN_CTRLMODE_FD)
|
||||
priv->mb_size = sizeof(struct flexcan_mb) + CANFD_MAX_DLEN;
|
||||
else
|
||||
priv->mb_size = sizeof(struct flexcan_mb) + CAN_MAX_DLEN;
|
||||
|
||||
priv->mb_count = (sizeof(priv->regs->mb[0]) / priv->mb_size) +
|
||||
(sizeof(priv->regs->mb[1]) / priv->mb_size);
|
||||
|
||||
|
@ -1753,6 +1755,8 @@ static int flexcan_open(struct net_device *dev)
|
|||
can_rx_offload_del(&priv->offload);
|
||||
out_free_irq:
|
||||
free_irq(dev->irq, dev);
|
||||
out_transceiver_disable:
|
||||
flexcan_transceiver_disable(priv);
|
||||
out_close:
|
||||
close_candev(dev);
|
||||
out_runtime_put:
|
||||
|
@ -1771,6 +1775,7 @@ static int flexcan_close(struct net_device *dev)
|
|||
|
||||
can_rx_offload_del(&priv->offload);
|
||||
free_irq(dev->irq, dev);
|
||||
flexcan_transceiver_disable(priv);
|
||||
|
||||
close_candev(dev);
|
||||
pm_runtime_put(priv->dev);
|
||||
|
|
|
@ -287,12 +287,12 @@ struct kvaser_pciefd_tx_packet {
|
|||
static const struct can_bittiming_const kvaser_pciefd_bittiming_const = {
|
||||
.name = KVASER_PCIEFD_DRV_NAME,
|
||||
.tseg1_min = 1,
|
||||
.tseg1_max = 255,
|
||||
.tseg1_max = 512,
|
||||
.tseg2_min = 1,
|
||||
.tseg2_max = 32,
|
||||
.sjw_max = 16,
|
||||
.brp_min = 1,
|
||||
.brp_max = 4096,
|
||||
.brp_max = 8192,
|
||||
.brp_inc = 1,
|
||||
};
|
||||
|
||||
|
|
|
@ -16,7 +16,8 @@ config CAN_M_CAN_PLATFORM
|
|||
|
||||
config CAN_M_CAN_TCAN4X5X
|
||||
depends on CAN_M_CAN
|
||||
depends on REGMAP_SPI
|
||||
depends on SPI
|
||||
select REGMAP_SPI
|
||||
tristate "TCAN4X5X M_CAN device"
|
||||
---help---
|
||||
Say Y here if you want support for Texas Instruments TCAN4x5x
|
||||
|
|
|
@ -664,7 +664,7 @@ static int m_can_handle_state_change(struct net_device *dev,
|
|||
unsigned int ecr;
|
||||
|
||||
switch (new_state) {
|
||||
case CAN_STATE_ERROR_ACTIVE:
|
||||
case CAN_STATE_ERROR_WARNING:
|
||||
/* error warning state */
|
||||
cdev->can.can_stats.error_warning++;
|
||||
cdev->can.state = CAN_STATE_ERROR_WARNING;
|
||||
|
@ -693,7 +693,7 @@ static int m_can_handle_state_change(struct net_device *dev,
|
|||
__m_can_get_berr_counter(dev, &bec);
|
||||
|
||||
switch (new_state) {
|
||||
case CAN_STATE_ERROR_ACTIVE:
|
||||
case CAN_STATE_ERROR_WARNING:
|
||||
/* error warning state */
|
||||
cf->can_id |= CAN_ERR_CRTL;
|
||||
cf->data[1] = (bec.txerr > bec.rxerr) ?
|
||||
|
@ -913,6 +913,8 @@ static irqreturn_t m_can_isr(int irq, void *dev_id)
|
|||
struct net_device_stats *stats = &dev->stats;
|
||||
u32 ir;
|
||||
|
||||
if (pm_runtime_suspended(cdev->dev))
|
||||
return IRQ_NONE;
|
||||
ir = m_can_read(cdev, M_CAN_IR);
|
||||
if (!ir)
|
||||
return IRQ_NONE;
|
||||
|
@ -1366,6 +1368,9 @@ static void m_can_stop(struct net_device *dev)
|
|||
/* disable all interrupts */
|
||||
m_can_disable_all_interrupts(cdev);
|
||||
|
||||
/* Set init mode to disengage from the network */
|
||||
m_can_config_endisable(cdev, true);
|
||||
|
||||
/* set the state as STOPPED */
|
||||
cdev->can.state = CAN_STATE_STOPPED;
|
||||
}
|
||||
|
@ -1764,6 +1769,12 @@ out:
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(m_can_class_allocate_dev);
|
||||
|
||||
void m_can_class_free_dev(struct net_device *net)
|
||||
{
|
||||
free_candev(net);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(m_can_class_free_dev);
|
||||
|
||||
int m_can_class_register(struct m_can_classdev *m_can_dev)
|
||||
{
|
||||
int ret;
|
||||
|
|
|
@ -99,6 +99,7 @@ struct m_can_classdev {
|
|||
};
|
||||
|
||||
struct m_can_classdev *m_can_class_allocate_dev(struct device *dev);
|
||||
void m_can_class_free_dev(struct net_device *net);
|
||||
int m_can_class_register(struct m_can_classdev *cdev);
|
||||
void m_can_class_unregister(struct m_can_classdev *cdev);
|
||||
int m_can_class_get_clocks(struct m_can_classdev *cdev);
|
||||
|
|
|
@ -467,6 +467,10 @@ static int tcan4x5x_can_probe(struct spi_device *spi)
|
|||
|
||||
priv->regmap = devm_regmap_init(&spi->dev, &tcan4x5x_bus,
|
||||
&spi->dev, &tcan4x5x_regmap);
|
||||
if (IS_ERR(priv->regmap)) {
|
||||
ret = PTR_ERR(priv->regmap);
|
||||
goto out_clk;
|
||||
}
|
||||
|
||||
tcan4x5x_power_enable(priv->power, 1);
|
||||
|
||||
|
@ -497,10 +501,10 @@ static int tcan4x5x_can_remove(struct spi_device *spi)
|
|||
{
|
||||
struct tcan4x5x_priv *priv = spi_get_drvdata(spi);
|
||||
|
||||
tcan4x5x_power_enable(priv->power, 0);
|
||||
|
||||
m_can_class_unregister(priv->mcan_dev);
|
||||
|
||||
tcan4x5x_power_enable(priv->power, 0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -873,7 +873,8 @@ static int ti_hecc_probe(struct platform_device *pdev)
|
|||
priv->base = devm_ioremap_resource(&pdev->dev, res);
|
||||
if (IS_ERR(priv->base)) {
|
||||
dev_err(&pdev->dev, "hecc ioremap failed\n");
|
||||
return PTR_ERR(priv->base);
|
||||
err = PTR_ERR(priv->base);
|
||||
goto probe_exit_candev;
|
||||
}
|
||||
|
||||
/* handle hecc-ram memory */
|
||||
|
@ -886,7 +887,8 @@ static int ti_hecc_probe(struct platform_device *pdev)
|
|||
priv->hecc_ram = devm_ioremap_resource(&pdev->dev, res);
|
||||
if (IS_ERR(priv->hecc_ram)) {
|
||||
dev_err(&pdev->dev, "hecc-ram ioremap failed\n");
|
||||
return PTR_ERR(priv->hecc_ram);
|
||||
err = PTR_ERR(priv->hecc_ram);
|
||||
goto probe_exit_candev;
|
||||
}
|
||||
|
||||
/* handle mbx memory */
|
||||
|
@ -899,13 +901,14 @@ static int ti_hecc_probe(struct platform_device *pdev)
|
|||
priv->mbx = devm_ioremap_resource(&pdev->dev, res);
|
||||
if (IS_ERR(priv->mbx)) {
|
||||
dev_err(&pdev->dev, "mbx ioremap failed\n");
|
||||
return PTR_ERR(priv->mbx);
|
||||
err = PTR_ERR(priv->mbx);
|
||||
goto probe_exit_candev;
|
||||
}
|
||||
|
||||
irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
|
||||
if (!irq) {
|
||||
dev_err(&pdev->dev, "No irq resource\n");
|
||||
goto probe_exit;
|
||||
goto probe_exit_candev;
|
||||
}
|
||||
|
||||
priv->ndev = ndev;
|
||||
|
@ -969,7 +972,7 @@ probe_exit_release_clk:
|
|||
clk_put(priv->clk);
|
||||
probe_exit_candev:
|
||||
free_candev(ndev);
|
||||
probe_exit:
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
|
|
|
@ -367,7 +367,7 @@ static const struct can_bittiming_const kvaser_usb_hydra_kcan_bittiming_c = {
|
|||
.tseg2_max = 32,
|
||||
.sjw_max = 16,
|
||||
.brp_min = 1,
|
||||
.brp_max = 4096,
|
||||
.brp_max = 8192,
|
||||
.brp_inc = 1,
|
||||
};
|
||||
|
||||
|
|
|
@ -326,8 +326,6 @@ static netdev_tx_t mcba_usb_start_xmit(struct sk_buff *skb,
|
|||
if (!ctx)
|
||||
return NETDEV_TX_BUSY;
|
||||
|
||||
can_put_echo_skb(skb, priv->netdev, ctx->ndx);
|
||||
|
||||
if (cf->can_id & CAN_EFF_FLAG) {
|
||||
/* SIDH | SIDL | EIDH | EIDL
|
||||
* 28 - 21 | 20 19 18 x x x 17 16 | 15 - 8 | 7 - 0
|
||||
|
@ -357,6 +355,8 @@ static netdev_tx_t mcba_usb_start_xmit(struct sk_buff *skb,
|
|||
if (cf->can_id & CAN_RTR_FLAG)
|
||||
usb_msg.dlc |= MCBA_DLC_RTR_MASK;
|
||||
|
||||
can_put_echo_skb(skb, priv->netdev, ctx->ndx);
|
||||
|
||||
err = mcba_usb_xmit(priv, (struct mcba_usb_msg *)&usb_msg, ctx);
|
||||
if (err)
|
||||
goto xmit_failed;
|
||||
|
|
|
@ -156,7 +156,7 @@ void peak_usb_get_ts_time(struct peak_time_ref *time_ref, u32 ts, ktime_t *time)
|
|||
if (time_ref->ts_dev_1 < time_ref->ts_dev_2) {
|
||||
/* case when event time (tsw) wraps */
|
||||
if (ts < time_ref->ts_dev_1)
|
||||
delta_ts = 1 << time_ref->adapter->ts_used_bits;
|
||||
delta_ts = BIT_ULL(time_ref->adapter->ts_used_bits);
|
||||
|
||||
/* Otherwise, sync time counter (ts_dev_2) has wrapped:
|
||||
* handle case when event time (tsn) hasn't.
|
||||
|
@ -168,7 +168,7 @@ void peak_usb_get_ts_time(struct peak_time_ref *time_ref, u32 ts, ktime_t *time)
|
|||
* tsn ts
|
||||
*/
|
||||
} else if (time_ref->ts_dev_1 < ts) {
|
||||
delta_ts = -(1 << time_ref->adapter->ts_used_bits);
|
||||
delta_ts = -BIT_ULL(time_ref->adapter->ts_used_bits);
|
||||
}
|
||||
|
||||
/* add delay between last sync and event timestamps */
|
||||
|
|
|
@ -26,6 +26,7 @@
|
|||
*/
|
||||
|
||||
#include <linux/clk.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/firmware.h>
|
||||
#include <linux/if_bridge.h>
|
||||
|
@ -1818,6 +1819,16 @@ static int gswip_gphy_fw_list(struct gswip_priv *priv,
|
|||
i++;
|
||||
}
|
||||
|
||||
/* The standalone PHY11G requires 300ms to be fully
|
||||
* initialized and ready for any MDIO communication after being
|
||||
* taken out of reset. For the SoC-internal GPHY variant there
|
||||
* is no (known) documentation for the minimum time after a
|
||||
* reset. Use the same value as for the standalone variant as
|
||||
* some users have reported internal PHYs not being detected
|
||||
* without any delay.
|
||||
*/
|
||||
msleep(300);
|
||||
|
||||
return 0;
|
||||
|
||||
remove_gphy:
|
||||
|
|
|
@ -125,11 +125,9 @@ static int mv88e6xxx_g1_vtu_vid_write(struct mv88e6xxx_chip *chip,
|
|||
* Offset 0x08: VTU/STU Data Register 2
|
||||
* Offset 0x09: VTU/STU Data Register 3
|
||||
*/
|
||||
|
||||
static int mv88e6185_g1_vtu_data_read(struct mv88e6xxx_chip *chip,
|
||||
struct mv88e6xxx_vtu_entry *entry)
|
||||
static int mv88e6185_g1_vtu_stu_data_read(struct mv88e6xxx_chip *chip,
|
||||
u16 *regs)
|
||||
{
|
||||
u16 regs[3];
|
||||
int i;
|
||||
|
||||
/* Read all 3 VTU/STU Data registers */
|
||||
|
@ -142,12 +140,45 @@ static int mv88e6185_g1_vtu_data_read(struct mv88e6xxx_chip *chip,
|
|||
return err;
|
||||
}
|
||||
|
||||
/* Extract MemberTag and PortState data */
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int mv88e6185_g1_vtu_data_read(struct mv88e6xxx_chip *chip,
|
||||
struct mv88e6xxx_vtu_entry *entry)
|
||||
{
|
||||
u16 regs[3];
|
||||
int err;
|
||||
int i;
|
||||
|
||||
err = mv88e6185_g1_vtu_stu_data_read(chip, regs);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
/* Extract MemberTag data */
|
||||
for (i = 0; i < mv88e6xxx_num_ports(chip); ++i) {
|
||||
unsigned int member_offset = (i % 4) * 4;
|
||||
unsigned int state_offset = member_offset + 2;
|
||||
|
||||
entry->member[i] = (regs[i / 4] >> member_offset) & 0x3;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int mv88e6185_g1_stu_data_read(struct mv88e6xxx_chip *chip,
|
||||
struct mv88e6xxx_vtu_entry *entry)
|
||||
{
|
||||
u16 regs[3];
|
||||
int err;
|
||||
int i;
|
||||
|
||||
err = mv88e6185_g1_vtu_stu_data_read(chip, regs);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
/* Extract PortState data */
|
||||
for (i = 0; i < mv88e6xxx_num_ports(chip); ++i) {
|
||||
unsigned int state_offset = (i % 4) * 4 + 2;
|
||||
|
||||
entry->state[i] = (regs[i / 4] >> state_offset) & 0x3;
|
||||
}
|
||||
|
||||
|
@ -349,6 +380,10 @@ int mv88e6185_g1_vtu_getnext(struct mv88e6xxx_chip *chip,
|
|||
if (err)
|
||||
return err;
|
||||
|
||||
err = mv88e6185_g1_stu_data_read(chip, entry);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
/* VTU DBNum[3:0] are located in VTU Operation 3:0
|
||||
* VTU DBNum[7:4] are located in VTU Operation 11:8
|
||||
*/
|
||||
|
@ -374,11 +409,6 @@ int mv88e6352_g1_vtu_getnext(struct mv88e6xxx_chip *chip,
|
|||
return err;
|
||||
|
||||
if (entry->valid) {
|
||||
/* Fetch (and mask) VLAN PortState data from the STU */
|
||||
err = mv88e6xxx_g1_vtu_stu_get(chip, entry);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
err = mv88e6185_g1_vtu_data_read(chip, entry);
|
||||
if (err)
|
||||
return err;
|
||||
|
@ -386,6 +416,15 @@ int mv88e6352_g1_vtu_getnext(struct mv88e6xxx_chip *chip,
|
|||
err = mv88e6xxx_g1_vtu_fid_read(chip, entry);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
/* Fetch VLAN PortState data from the STU */
|
||||
err = mv88e6xxx_g1_vtu_stu_get(chip, entry);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
err = mv88e6185_g1_stu_data_read(chip, entry);
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -2391,7 +2391,8 @@ static int b44_init_one(struct ssb_device *sdev,
|
|||
goto err_out_free_dev;
|
||||
}
|
||||
|
||||
if (dma_set_mask_and_coherent(sdev->dma_dev, DMA_BIT_MASK(30))) {
|
||||
err = dma_set_mask_and_coherent(sdev->dma_dev, DMA_BIT_MASK(30));
|
||||
if (err) {
|
||||
dev_err(sdev->dev,
|
||||
"Required 30BIT DMA mask unsupported by the system\n");
|
||||
goto err_out_powerdown;
|
||||
|
|
|
@ -2584,7 +2584,7 @@ static int bnxt_get_module_eeprom(struct net_device *dev,
|
|||
/* Read A2 portion of the EEPROM */
|
||||
if (length) {
|
||||
start -= ETH_MODULE_SFF_8436_LEN;
|
||||
rc = bnxt_read_sfp_module_eeprom_info(bp, I2C_DEV_ADDR_A2, 1,
|
||||
rc = bnxt_read_sfp_module_eeprom_info(bp, I2C_DEV_ADDR_A2, 0,
|
||||
start, length, data);
|
||||
}
|
||||
return rc;
|
||||
|
|
|
@ -1891,6 +1891,8 @@ static int ftgmac100_probe(struct platform_device *pdev)
|
|||
return 0;
|
||||
|
||||
err_ncsi_dev:
|
||||
if (priv->ndev)
|
||||
ncsi_unregister_dev(priv->ndev);
|
||||
err_register_netdev:
|
||||
ftgmac100_destroy_mdio(netdev);
|
||||
err_setup_mdio:
|
||||
|
@ -1911,6 +1913,8 @@ static int ftgmac100_remove(struct platform_device *pdev)
|
|||
netdev = platform_get_drvdata(pdev);
|
||||
priv = netdev_priv(netdev);
|
||||
|
||||
if (priv->ndev)
|
||||
ncsi_unregister_dev(priv->ndev);
|
||||
unregister_netdev(netdev);
|
||||
|
||||
clk_disable_unprepare(priv->clk);
|
||||
|
|
|
@ -1864,8 +1864,8 @@ int mlx4_INIT_HCA(struct mlx4_dev *dev, struct mlx4_init_hca_param *param)
|
|||
#define INIT_HCA_LOG_RD_OFFSET (INIT_HCA_QPC_OFFSET + 0x77)
|
||||
#define INIT_HCA_MCAST_OFFSET 0x0c0
|
||||
#define INIT_HCA_MC_BASE_OFFSET (INIT_HCA_MCAST_OFFSET + 0x00)
|
||||
#define INIT_HCA_LOG_MC_ENTRY_SZ_OFFSET (INIT_HCA_MCAST_OFFSET + 0x12)
|
||||
#define INIT_HCA_LOG_MC_HASH_SZ_OFFSET (INIT_HCA_MCAST_OFFSET + 0x16)
|
||||
#define INIT_HCA_LOG_MC_ENTRY_SZ_OFFSET (INIT_HCA_MCAST_OFFSET + 0x13)
|
||||
#define INIT_HCA_LOG_MC_HASH_SZ_OFFSET (INIT_HCA_MCAST_OFFSET + 0x17)
|
||||
#define INIT_HCA_UC_STEERING_OFFSET (INIT_HCA_MCAST_OFFSET + 0x18)
|
||||
#define INIT_HCA_LOG_MC_TABLE_SZ_OFFSET (INIT_HCA_MCAST_OFFSET + 0x1b)
|
||||
#define INIT_HCA_DEVICE_MANAGED_FLOW_STEERING_EN 0x6
|
||||
|
@ -1873,7 +1873,7 @@ int mlx4_INIT_HCA(struct mlx4_dev *dev, struct mlx4_init_hca_param *param)
|
|||
#define INIT_HCA_DRIVER_VERSION_SZ 0x40
|
||||
#define INIT_HCA_FS_PARAM_OFFSET 0x1d0
|
||||
#define INIT_HCA_FS_BASE_OFFSET (INIT_HCA_FS_PARAM_OFFSET + 0x00)
|
||||
#define INIT_HCA_FS_LOG_ENTRY_SZ_OFFSET (INIT_HCA_FS_PARAM_OFFSET + 0x12)
|
||||
#define INIT_HCA_FS_LOG_ENTRY_SZ_OFFSET (INIT_HCA_FS_PARAM_OFFSET + 0x13)
|
||||
#define INIT_HCA_FS_A0_OFFSET (INIT_HCA_FS_PARAM_OFFSET + 0x18)
|
||||
#define INIT_HCA_FS_LOG_TABLE_SZ_OFFSET (INIT_HCA_FS_PARAM_OFFSET + 0x1b)
|
||||
#define INIT_HCA_FS_ETH_BITS_OFFSET (INIT_HCA_FS_PARAM_OFFSET + 0x21)
|
||||
|
|
|
@ -182,8 +182,8 @@ struct mlx4_init_hca_param {
|
|||
u64 cmpt_base;
|
||||
u64 mtt_base;
|
||||
u64 global_caps;
|
||||
u16 log_mc_entry_sz;
|
||||
u16 log_mc_hash_sz;
|
||||
u8 log_mc_entry_sz;
|
||||
u8 log_mc_hash_sz;
|
||||
u16 hca_core_clock; /* Internal Clock Frequency (in MHz) */
|
||||
u8 log_num_qps;
|
||||
u8 log_num_srqs;
|
||||
|
|
|
@ -1592,6 +1592,10 @@ int mlx5_esw_modify_vport_rate(struct mlx5_eswitch *esw, u16 vport_num,
|
|||
struct mlx5_vport *vport;
|
||||
|
||||
vport = mlx5_eswitch_get_vport(esw, vport_num);
|
||||
|
||||
if (!vport->qos.enabled)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
MLX5_SET(scheduling_context, ctx, max_average_bw, rate_mbps);
|
||||
|
||||
return mlx5_modify_scheduling_element_cmd(esw->dev,
|
||||
|
@ -2369,12 +2373,15 @@ static u32 calculate_vports_min_rate_divider(struct mlx5_eswitch *esw)
|
|||
max_guarantee = evport->info.min_rate;
|
||||
}
|
||||
|
||||
return max_t(u32, max_guarantee / fw_max_bw_share, 1);
|
||||
if (max_guarantee)
|
||||
return max_t(u32, max_guarantee / fw_max_bw_share, 1);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int normalize_vports_min_rate(struct mlx5_eswitch *esw, u32 divider)
|
||||
static int normalize_vports_min_rate(struct mlx5_eswitch *esw)
|
||||
{
|
||||
u32 fw_max_bw_share = MLX5_CAP_QOS(esw->dev, max_tsar_bw_share);
|
||||
u32 divider = calculate_vports_min_rate_divider(esw);
|
||||
struct mlx5_vport *evport;
|
||||
u32 vport_max_rate;
|
||||
u32 vport_min_rate;
|
||||
|
@ -2387,9 +2394,9 @@ static int normalize_vports_min_rate(struct mlx5_eswitch *esw, u32 divider)
|
|||
continue;
|
||||
vport_min_rate = evport->info.min_rate;
|
||||
vport_max_rate = evport->info.max_rate;
|
||||
bw_share = MLX5_MIN_BW_SHARE;
|
||||
bw_share = 0;
|
||||
|
||||
if (vport_min_rate)
|
||||
if (divider)
|
||||
bw_share = MLX5_RATE_TO_BW_SHARE(vport_min_rate,
|
||||
divider,
|
||||
fw_max_bw_share);
|
||||
|
@ -2414,7 +2421,6 @@ int mlx5_eswitch_set_vport_rate(struct mlx5_eswitch *esw, u16 vport,
|
|||
struct mlx5_vport *evport = mlx5_eswitch_get_vport(esw, vport);
|
||||
u32 fw_max_bw_share;
|
||||
u32 previous_min_rate;
|
||||
u32 divider;
|
||||
bool min_rate_supported;
|
||||
bool max_rate_supported;
|
||||
int err = 0;
|
||||
|
@ -2439,8 +2445,7 @@ int mlx5_eswitch_set_vport_rate(struct mlx5_eswitch *esw, u16 vport,
|
|||
|
||||
previous_min_rate = evport->info.min_rate;
|
||||
evport->info.min_rate = min_rate;
|
||||
divider = calculate_vports_min_rate_divider(esw);
|
||||
err = normalize_vports_min_rate(esw, divider);
|
||||
err = normalize_vports_min_rate(esw);
|
||||
if (err) {
|
||||
evport->info.min_rate = previous_min_rate;
|
||||
goto unlock;
|
||||
|
|
|
@ -496,6 +496,13 @@ static void del_sw_hw_rule(struct fs_node *node)
|
|||
goto out;
|
||||
}
|
||||
|
||||
if (rule->dest_attr.type == MLX5_FLOW_DESTINATION_TYPE_PORT &&
|
||||
--fte->dests_size) {
|
||||
fte->modify_mask |= BIT(MLX5_SET_FTE_MODIFY_ENABLE_MASK_ACTION);
|
||||
fte->action.action &= ~MLX5_FLOW_CONTEXT_ACTION_ALLOW;
|
||||
goto out;
|
||||
}
|
||||
|
||||
if ((fte->action.action & MLX5_FLOW_CONTEXT_ACTION_FWD_DEST) &&
|
||||
--fte->dests_size) {
|
||||
fte->modify_mask |=
|
||||
|
|
|
@ -444,7 +444,8 @@ static void mlxsw_emad_trans_timeout_schedule(struct mlxsw_reg_trans *trans)
|
|||
if (trans->core->fw_flash_in_progress)
|
||||
timeout = msecs_to_jiffies(MLXSW_EMAD_TIMEOUT_DURING_FW_FLASH_MS);
|
||||
|
||||
queue_delayed_work(trans->core->emad_wq, &trans->timeout_dw, timeout);
|
||||
queue_delayed_work(trans->core->emad_wq, &trans->timeout_dw,
|
||||
timeout << trans->retries);
|
||||
}
|
||||
|
||||
static int mlxsw_emad_transmit(struct mlxsw_core *mlxsw_core,
|
||||
|
|
|
@ -145,7 +145,8 @@ static void lan743x_intr_software_isr(void *context)
|
|||
|
||||
int_sts = lan743x_csr_read(adapter, INT_STS);
|
||||
if (int_sts & INT_BIT_SW_GP_) {
|
||||
lan743x_csr_write(adapter, INT_STS, INT_BIT_SW_GP_);
|
||||
/* disable the interrupt to prevent repeated re-triggering */
|
||||
lan743x_csr_write(adapter, INT_EN_CLR, INT_BIT_SW_GP_);
|
||||
intr->software_isr_flag = 1;
|
||||
}
|
||||
}
|
||||
|
@ -1242,13 +1243,13 @@ clean_up_data_descriptor:
|
|||
goto clear_active;
|
||||
|
||||
if (!(buffer_info->flags & TX_BUFFER_INFO_FLAG_TIMESTAMP_REQUESTED)) {
|
||||
dev_kfree_skb(buffer_info->skb);
|
||||
dev_kfree_skb_any(buffer_info->skb);
|
||||
goto clear_skb;
|
||||
}
|
||||
|
||||
if (cleanup) {
|
||||
lan743x_ptp_unrequest_tx_timestamp(tx->adapter);
|
||||
dev_kfree_skb(buffer_info->skb);
|
||||
dev_kfree_skb_any(buffer_info->skb);
|
||||
} else {
|
||||
ignore_sync = (buffer_info->flags &
|
||||
TX_BUFFER_INFO_FLAG_IGNORE_SYNC) != 0;
|
||||
|
@ -1558,7 +1559,7 @@ static netdev_tx_t lan743x_tx_xmit_frame(struct lan743x_tx *tx,
|
|||
if (required_number_of_descriptors >
|
||||
lan743x_tx_get_avail_desc(tx)) {
|
||||
if (required_number_of_descriptors > (tx->ring_size - 1)) {
|
||||
dev_kfree_skb(skb);
|
||||
dev_kfree_skb_irq(skb);
|
||||
} else {
|
||||
/* save to overflow buffer */
|
||||
tx->overflow_skb = skb;
|
||||
|
@ -1591,7 +1592,7 @@ static netdev_tx_t lan743x_tx_xmit_frame(struct lan743x_tx *tx,
|
|||
start_frame_length,
|
||||
do_timestamp,
|
||||
skb->ip_summed == CHECKSUM_PARTIAL)) {
|
||||
dev_kfree_skb(skb);
|
||||
dev_kfree_skb_irq(skb);
|
||||
goto unlock;
|
||||
}
|
||||
|
||||
|
@ -1610,7 +1611,7 @@ static netdev_tx_t lan743x_tx_xmit_frame(struct lan743x_tx *tx,
|
|||
* frame assembler clean up was performed inside
|
||||
* lan743x_tx_frame_add_fragment
|
||||
*/
|
||||
dev_kfree_skb(skb);
|
||||
dev_kfree_skb_irq(skb);
|
||||
goto unlock;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2742,14 +2742,18 @@ qed_iwarp_ll2_start(struct qed_hwfn *p_hwfn,
|
|||
iwarp_info->partial_fpdus = kcalloc((u16)p_hwfn->p_rdma_info->num_qps,
|
||||
sizeof(*iwarp_info->partial_fpdus),
|
||||
GFP_KERNEL);
|
||||
if (!iwarp_info->partial_fpdus)
|
||||
if (!iwarp_info->partial_fpdus) {
|
||||
rc = -ENOMEM;
|
||||
goto err;
|
||||
}
|
||||
|
||||
iwarp_info->max_num_partial_fpdus = (u16)p_hwfn->p_rdma_info->num_qps;
|
||||
|
||||
iwarp_info->mpa_intermediate_buf = kzalloc(buff_size, GFP_KERNEL);
|
||||
if (!iwarp_info->mpa_intermediate_buf)
|
||||
if (!iwarp_info->mpa_intermediate_buf) {
|
||||
rc = -ENOMEM;
|
||||
goto err;
|
||||
}
|
||||
|
||||
/* The mpa_bufs array serves for pending RX packets received on the
|
||||
* mpa ll2 that don't have place on the tx ring and require later
|
||||
|
@ -2759,8 +2763,10 @@ qed_iwarp_ll2_start(struct qed_hwfn *p_hwfn,
|
|||
iwarp_info->mpa_bufs = kcalloc(data.input.rx_num_desc,
|
||||
sizeof(*iwarp_info->mpa_bufs),
|
||||
GFP_KERNEL);
|
||||
if (!iwarp_info->mpa_bufs)
|
||||
if (!iwarp_info->mpa_bufs) {
|
||||
rc = -ENOMEM;
|
||||
goto err;
|
||||
}
|
||||
|
||||
INIT_LIST_HEAD(&iwarp_info->mpa_buf_pending_list);
|
||||
INIT_LIST_HEAD(&iwarp_info->mpa_buf_list);
|
||||
|
|
|
@ -2251,7 +2251,8 @@ static int qlcnic_83xx_restart_hw(struct qlcnic_adapter *adapter)
|
|||
|
||||
/* Boot either flash image or firmware image from host file system */
|
||||
if (qlcnic_load_fw_file == 1) {
|
||||
if (qlcnic_83xx_load_fw_image_from_host(adapter))
|
||||
err = qlcnic_83xx_load_fw_image_from_host(adapter);
|
||||
if (err)
|
||||
return err;
|
||||
} else {
|
||||
QLC_SHARED_REG_WR32(adapter, QLCNIC_FW_IMG_VALID,
|
||||
|
|
|
@ -188,6 +188,11 @@ rx_handler_result_t rmnet_rx_handler(struct sk_buff **pskb)
|
|||
|
||||
dev = skb->dev;
|
||||
port = rmnet_get_port_rcu(dev);
|
||||
if (unlikely(!port)) {
|
||||
atomic_long_inc(&skb->dev->rx_nohandler);
|
||||
kfree_skb(skb);
|
||||
goto done;
|
||||
}
|
||||
|
||||
switch (port->rmnet_mode) {
|
||||
case RMNET_EPMODE_VND:
|
||||
|
|
|
@ -2876,6 +2876,7 @@ static int cpsw_probe(struct platform_device *pdev)
|
|||
CPSW_MAX_QUEUES, CPSW_MAX_QUEUES);
|
||||
if (!ndev) {
|
||||
dev_err(dev, "error allocating net_device\n");
|
||||
ret = -ENOMEM;
|
||||
goto clean_cpts;
|
||||
}
|
||||
|
||||
|
|
|
@ -221,8 +221,7 @@ static void geneve_rx(struct geneve_dev *geneve, struct geneve_sock *gs,
|
|||
if (ip_tunnel_collect_metadata() || gs->collect_md) {
|
||||
__be16 flags;
|
||||
|
||||
flags = TUNNEL_KEY | TUNNEL_GENEVE_OPT |
|
||||
(gnvh->oam ? TUNNEL_OAM : 0) |
|
||||
flags = TUNNEL_KEY | (gnvh->oam ? TUNNEL_OAM : 0) |
|
||||
(gnvh->critical ? TUNNEL_CRIT_OPT : 0);
|
||||
|
||||
tun_dst = udp_tun_rx_dst(skb, geneve_get_sk_family(gs), flags,
|
||||
|
|
|
@ -1092,7 +1092,7 @@ static const struct usb_device_id products[] = {
|
|||
{QMI_FIXED_INTF(0x05c6, 0x9011, 4)},
|
||||
{QMI_FIXED_INTF(0x05c6, 0x9021, 1)},
|
||||
{QMI_FIXED_INTF(0x05c6, 0x9022, 2)},
|
||||
{QMI_FIXED_INTF(0x05c6, 0x9025, 4)}, /* Alcatel-sbell ASB TL131 TDD LTE (China Mobile) */
|
||||
{QMI_QUIRK_SET_DTR(0x05c6, 0x9025, 4)}, /* Alcatel-sbell ASB TL131 TDD LTE (China Mobile) */
|
||||
{QMI_FIXED_INTF(0x05c6, 0x9026, 3)},
|
||||
{QMI_FIXED_INTF(0x05c6, 0x902e, 5)},
|
||||
{QMI_FIXED_INTF(0x05c6, 0x9031, 5)},
|
||||
|
|
|
@ -2811,7 +2811,9 @@ static int rockchip_gpio_to_irq(struct gpio_chip *gc, unsigned offset)
|
|||
if (!bank->domain)
|
||||
return -ENXIO;
|
||||
|
||||
clk_enable(bank->clk);
|
||||
virq = irq_create_mapping(bank->domain, offset);
|
||||
clk_disable(bank->clk);
|
||||
|
||||
return (virq) ? : -ENXIO;
|
||||
}
|
||||
|
|
|
@ -1275,7 +1275,6 @@ static int _regulator_do_enable(struct regulator_dev *rdev);
|
|||
/**
|
||||
* set_machine_constraints - sets regulator constraints
|
||||
* @rdev: regulator source
|
||||
* @constraints: constraints to apply
|
||||
*
|
||||
* Allows platform initialisation code to define and constrain
|
||||
* regulator circuits e.g. valid voltage/current ranges, etc. NOTE:
|
||||
|
@ -1283,21 +1282,11 @@ static int _regulator_do_enable(struct regulator_dev *rdev);
|
|||
* regulator operations to proceed i.e. set_voltage, set_current_limit,
|
||||
* set_mode.
|
||||
*/
|
||||
static int set_machine_constraints(struct regulator_dev *rdev,
|
||||
const struct regulation_constraints *constraints)
|
||||
static int set_machine_constraints(struct regulator_dev *rdev)
|
||||
{
|
||||
int ret = 0;
|
||||
const struct regulator_ops *ops = rdev->desc->ops;
|
||||
|
||||
if (constraints)
|
||||
rdev->constraints = kmemdup(constraints, sizeof(*constraints),
|
||||
GFP_KERNEL);
|
||||
else
|
||||
rdev->constraints = kzalloc(sizeof(*constraints),
|
||||
GFP_KERNEL);
|
||||
if (!rdev->constraints)
|
||||
return -ENOMEM;
|
||||
|
||||
ret = machine_constraints_voltage(rdev, rdev->constraints);
|
||||
if (ret != 0)
|
||||
return ret;
|
||||
|
@ -1811,6 +1800,15 @@ static int regulator_resolve_supply(struct regulator_dev *rdev)
|
|||
}
|
||||
}
|
||||
|
||||
if (r == rdev) {
|
||||
dev_err(dev, "Supply for %s (%s) resolved to itself\n",
|
||||
rdev->desc->name, rdev->supply_name);
|
||||
if (!have_full_constraints())
|
||||
return -EINVAL;
|
||||
r = dummy_regulator_rdev;
|
||||
get_device(&r->dev);
|
||||
}
|
||||
|
||||
/*
|
||||
* If the supply's parent device is not the same as the
|
||||
* regulator's parent device, then ensure the parent device
|
||||
|
@ -5025,7 +5023,6 @@ struct regulator_dev *
|
|||
regulator_register(const struct regulator_desc *regulator_desc,
|
||||
const struct regulator_config *cfg)
|
||||
{
|
||||
const struct regulation_constraints *constraints = NULL;
|
||||
const struct regulator_init_data *init_data;
|
||||
struct regulator_config *config = NULL;
|
||||
static atomic_t regulator_no = ATOMIC_INIT(-1);
|
||||
|
@ -5164,14 +5161,23 @@ regulator_register(const struct regulator_desc *regulator_desc,
|
|||
|
||||
/* set regulator constraints */
|
||||
if (init_data)
|
||||
constraints = &init_data->constraints;
|
||||
rdev->constraints = kmemdup(&init_data->constraints,
|
||||
sizeof(*rdev->constraints),
|
||||
GFP_KERNEL);
|
||||
else
|
||||
rdev->constraints = kzalloc(sizeof(*rdev->constraints),
|
||||
GFP_KERNEL);
|
||||
if (!rdev->constraints) {
|
||||
ret = -ENOMEM;
|
||||
goto wash;
|
||||
}
|
||||
|
||||
if (init_data && init_data->supply_regulator)
|
||||
rdev->supply_name = init_data->supply_regulator;
|
||||
else if (regulator_desc->supply_name)
|
||||
rdev->supply_name = regulator_desc->supply_name;
|
||||
|
||||
ret = set_machine_constraints(rdev, constraints);
|
||||
ret = set_machine_constraints(rdev);
|
||||
if (ret == -EPROBE_DEFER) {
|
||||
/* Regulator might be in bypass mode and so needs its supply
|
||||
* to set the constraints */
|
||||
|
@ -5180,7 +5186,7 @@ regulator_register(const struct regulator_desc *regulator_desc,
|
|||
* that is just being created */
|
||||
ret = regulator_resolve_supply(rdev);
|
||||
if (!ret)
|
||||
ret = set_machine_constraints(rdev, constraints);
|
||||
ret = set_machine_constraints(rdev);
|
||||
else
|
||||
rdev_dbg(rdev, "unable to resolve supply early: %pe\n",
|
||||
ERR_PTR(ret));
|
||||
|
|
|
@ -844,11 +844,14 @@ static int pfuze100_regulator_probe(struct i2c_client *client,
|
|||
* the switched regulator till yet.
|
||||
*/
|
||||
if (pfuze_chip->flags & PFUZE_FLAG_DISABLE_SW) {
|
||||
if (pfuze_chip->regulator_descs[i].sw_reg) {
|
||||
desc->ops = &pfuze100_sw_disable_regulator_ops;
|
||||
desc->enable_val = 0x8;
|
||||
desc->disable_val = 0x0;
|
||||
desc->enable_time = 500;
|
||||
if (pfuze_chip->chip_id == PFUZE100 ||
|
||||
pfuze_chip->chip_id == PFUZE200) {
|
||||
if (pfuze_chip->regulator_descs[i].sw_reg) {
|
||||
desc->ops = &pfuze100_sw_disable_regulator_ops;
|
||||
desc->enable_val = 0x8;
|
||||
desc->disable_val = 0x0;
|
||||
desc->enable_time = 500;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -342,8 +342,17 @@ static int ti_abb_set_voltage_sel(struct regulator_dev *rdev, unsigned sel)
|
|||
return ret;
|
||||
}
|
||||
|
||||
/* If data is exactly the same, then just update index, no change */
|
||||
info = &abb->info[sel];
|
||||
/*
|
||||
* When Linux kernel is starting up, we are'nt sure of the
|
||||
* Bias configuration that bootloader has configured.
|
||||
* So, we get to know the actual setting the first time
|
||||
* we are asked to transition.
|
||||
*/
|
||||
if (abb->current_info_idx == -EINVAL)
|
||||
goto just_set_abb;
|
||||
|
||||
/* If data is exactly the same, then just update index, no change */
|
||||
oinfo = &abb->info[abb->current_info_idx];
|
||||
if (!memcmp(info, oinfo, sizeof(*info))) {
|
||||
dev_dbg(dev, "%s: Same data new idx=%d, old idx=%d\n", __func__,
|
||||
|
@ -351,6 +360,7 @@ static int ti_abb_set_voltage_sel(struct regulator_dev *rdev, unsigned sel)
|
|||
goto out;
|
||||
}
|
||||
|
||||
just_set_abb:
|
||||
ret = ti_abb_set_opp(rdev, abb, info);
|
||||
|
||||
out:
|
||||
|
|
|
@ -2980,6 +2980,12 @@ static int _dasd_requeue_request(struct dasd_ccw_req *cqr)
|
|||
|
||||
if (!block)
|
||||
return -EINVAL;
|
||||
/*
|
||||
* If the request is an ERP request there is nothing to requeue.
|
||||
* This will be done with the remaining original request.
|
||||
*/
|
||||
if (cqr->refers)
|
||||
return 0;
|
||||
spin_lock_irq(&cqr->dq->lock);
|
||||
req = (struct request *) cqr->callback_data;
|
||||
blk_mq_requeue_request(req, false);
|
||||
|
|
|
@ -1569,12 +1569,12 @@ start:
|
|||
*/
|
||||
/* fallthrough */
|
||||
case CLKS_OFF:
|
||||
ufshcd_scsi_block_requests(hba);
|
||||
hba->clk_gating.state = REQ_CLKS_ON;
|
||||
trace_ufshcd_clk_gating(dev_name(hba->dev),
|
||||
hba->clk_gating.state);
|
||||
queue_work(hba->clk_gating.clk_gating_workq,
|
||||
&hba->clk_gating.ungate_work);
|
||||
if (queue_work(hba->clk_gating.clk_gating_workq,
|
||||
&hba->clk_gating.ungate_work))
|
||||
ufshcd_scsi_block_requests(hba);
|
||||
/*
|
||||
* fall through to check if we should wait for this
|
||||
* work to be done or not.
|
||||
|
|
|
@ -494,7 +494,7 @@ static int bcm2835aux_spi_probe(struct platform_device *pdev)
|
|||
unsigned long clk_hz;
|
||||
int err;
|
||||
|
||||
master = spi_alloc_master(&pdev->dev, sizeof(*bs));
|
||||
master = devm_spi_alloc_master(&pdev->dev, sizeof(*bs));
|
||||
if (!master)
|
||||
return -ENOMEM;
|
||||
|
||||
|
@ -524,29 +524,24 @@ static int bcm2835aux_spi_probe(struct platform_device *pdev)
|
|||
|
||||
/* the main area */
|
||||
bs->regs = devm_platform_ioremap_resource(pdev, 0);
|
||||
if (IS_ERR(bs->regs)) {
|
||||
err = PTR_ERR(bs->regs);
|
||||
goto out_master_put;
|
||||
}
|
||||
if (IS_ERR(bs->regs))
|
||||
return PTR_ERR(bs->regs);
|
||||
|
||||
bs->clk = devm_clk_get(&pdev->dev, NULL);
|
||||
if (IS_ERR(bs->clk)) {
|
||||
err = PTR_ERR(bs->clk);
|
||||
dev_err(&pdev->dev, "could not get clk: %d\n", err);
|
||||
goto out_master_put;
|
||||
return PTR_ERR(bs->clk);
|
||||
}
|
||||
|
||||
bs->irq = platform_get_irq(pdev, 0);
|
||||
if (bs->irq <= 0) {
|
||||
err = bs->irq ? bs->irq : -ENODEV;
|
||||
goto out_master_put;
|
||||
}
|
||||
if (bs->irq <= 0)
|
||||
return bs->irq ? bs->irq : -ENODEV;
|
||||
|
||||
/* this also enables the HW block */
|
||||
err = clk_prepare_enable(bs->clk);
|
||||
if (err) {
|
||||
dev_err(&pdev->dev, "could not prepare clock: %d\n", err);
|
||||
goto out_master_put;
|
||||
return err;
|
||||
}
|
||||
|
||||
/* just checking if the clock returns a sane value */
|
||||
|
@ -581,8 +576,6 @@ static int bcm2835aux_spi_probe(struct platform_device *pdev)
|
|||
|
||||
out_clk_disable:
|
||||
clk_disable_unprepare(bs->clk);
|
||||
out_master_put:
|
||||
spi_master_put(master);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
|
|
@ -1007,9 +1007,6 @@ static int fsl_lpspi_remove(struct platform_device *pdev)
|
|||
spi_controller_get_devdata(controller);
|
||||
|
||||
pm_runtime_disable(fsl_lpspi->dev);
|
||||
|
||||
spi_master_put(controller);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -680,7 +680,7 @@ static int npcm_fiu_probe(struct platform_device *pdev)
|
|||
int ret;
|
||||
int id;
|
||||
|
||||
ctrl = spi_alloc_master(dev, sizeof(*fiu));
|
||||
ctrl = devm_spi_alloc_master(dev, sizeof(*fiu));
|
||||
if (!ctrl)
|
||||
return -ENOMEM;
|
||||
|
||||
|
|
|
@ -2257,6 +2257,49 @@ struct spi_controller *__spi_alloc_controller(struct device *dev,
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(__spi_alloc_controller);
|
||||
|
||||
static void devm_spi_release_controller(struct device *dev, void *ctlr)
|
||||
{
|
||||
spi_controller_put(*(struct spi_controller **)ctlr);
|
||||
}
|
||||
|
||||
/**
|
||||
* __devm_spi_alloc_controller - resource-managed __spi_alloc_controller()
|
||||
* @dev: physical device of SPI controller
|
||||
* @size: how much zeroed driver-private data to allocate
|
||||
* @slave: whether to allocate an SPI master (false) or SPI slave (true)
|
||||
* Context: can sleep
|
||||
*
|
||||
* Allocate an SPI controller and automatically release a reference on it
|
||||
* when @dev is unbound from its driver. Drivers are thus relieved from
|
||||
* having to call spi_controller_put().
|
||||
*
|
||||
* The arguments to this function are identical to __spi_alloc_controller().
|
||||
*
|
||||
* Return: the SPI controller structure on success, else NULL.
|
||||
*/
|
||||
struct spi_controller *__devm_spi_alloc_controller(struct device *dev,
|
||||
unsigned int size,
|
||||
bool slave)
|
||||
{
|
||||
struct spi_controller **ptr, *ctlr;
|
||||
|
||||
ptr = devres_alloc(devm_spi_release_controller, sizeof(*ptr),
|
||||
GFP_KERNEL);
|
||||
if (!ptr)
|
||||
return NULL;
|
||||
|
||||
ctlr = __spi_alloc_controller(dev, size, slave);
|
||||
if (ctlr) {
|
||||
*ptr = ctlr;
|
||||
devres_add(dev, ptr);
|
||||
} else {
|
||||
devres_free(ptr);
|
||||
}
|
||||
|
||||
return ctlr;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(__devm_spi_alloc_controller);
|
||||
|
||||
#ifdef CONFIG_OF
|
||||
static int of_spi_get_gpio_numbers(struct spi_controller *ctlr)
|
||||
{
|
||||
|
@ -2576,6 +2619,11 @@ int devm_spi_register_controller(struct device *dev,
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(devm_spi_register_controller);
|
||||
|
||||
static int devm_spi_match_controller(struct device *dev, void *res, void *ctlr)
|
||||
{
|
||||
return *(struct spi_controller **)res == ctlr;
|
||||
}
|
||||
|
||||
static int __unregister(struct device *dev, void *null)
|
||||
{
|
||||
spi_unregister_device(to_spi_device(dev));
|
||||
|
@ -2617,7 +2665,15 @@ void spi_unregister_controller(struct spi_controller *ctlr)
|
|||
list_del(&ctlr->list);
|
||||
mutex_unlock(&board_lock);
|
||||
|
||||
device_unregister(&ctlr->dev);
|
||||
device_del(&ctlr->dev);
|
||||
|
||||
/* Release the last reference on the controller if its driver
|
||||
* has not yet been converted to devm_spi_alloc_master/slave().
|
||||
*/
|
||||
if (!devres_find(ctlr->dev.parent, devm_spi_release_controller,
|
||||
devm_spi_match_controller, ctlr))
|
||||
put_device(&ctlr->dev);
|
||||
|
||||
/* free bus id */
|
||||
mutex_lock(&board_lock);
|
||||
if (found == ctlr)
|
||||
|
|
|
@ -21,6 +21,7 @@ static const struct sdio_device_id sdio_ids[] =
|
|||
{ SDIO_DEVICE(0x024c, 0x0525), },
|
||||
{ SDIO_DEVICE(0x024c, 0x0623), },
|
||||
{ SDIO_DEVICE(0x024c, 0x0626), },
|
||||
{ SDIO_DEVICE(0x024c, 0x0627), },
|
||||
{ SDIO_DEVICE(0x024c, 0xb723), },
|
||||
{ /* end: all zeroes */ },
|
||||
};
|
||||
|
|
|
@ -49,15 +49,25 @@ static int spk_ttyio_ldisc_open(struct tty_struct *tty)
|
|||
|
||||
if (!tty->ops->write)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
mutex_lock(&speakup_tty_mutex);
|
||||
if (speakup_tty) {
|
||||
mutex_unlock(&speakup_tty_mutex);
|
||||
return -EBUSY;
|
||||
}
|
||||
speakup_tty = tty;
|
||||
|
||||
ldisc_data = kmalloc(sizeof(struct spk_ldisc_data), GFP_KERNEL);
|
||||
if (!ldisc_data)
|
||||
if (!ldisc_data) {
|
||||
speakup_tty = NULL;
|
||||
mutex_unlock(&speakup_tty_mutex);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
init_completion(&ldisc_data->completion);
|
||||
ldisc_data->buf_free = true;
|
||||
speakup_tty->disc_data = ldisc_data;
|
||||
mutex_unlock(&speakup_tty_mutex);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -886,8 +886,14 @@ static irqreturn_t imx_uart_int(int irq, void *dev_id)
|
|||
struct imx_port *sport = dev_id;
|
||||
unsigned int usr1, usr2, ucr1, ucr2, ucr3, ucr4;
|
||||
irqreturn_t ret = IRQ_NONE;
|
||||
unsigned long flags = 0;
|
||||
|
||||
spin_lock(&sport->port.lock);
|
||||
/*
|
||||
* IRQs might not be disabled upon entering this interrupt handler,
|
||||
* e.g. when interrupt handlers are forced to be threaded. To support
|
||||
* this scenario as well, disable IRQs when acquiring the spinlock.
|
||||
*/
|
||||
spin_lock_irqsave(&sport->port.lock, flags);
|
||||
|
||||
usr1 = imx_uart_readl(sport, USR1);
|
||||
usr2 = imx_uart_readl(sport, USR2);
|
||||
|
@ -955,7 +961,7 @@ static irqreturn_t imx_uart_int(int irq, void *dev_id)
|
|||
ret = IRQ_HANDLED;
|
||||
}
|
||||
|
||||
spin_unlock(&sport->port.lock);
|
||||
spin_unlock_irqrestore(&sport->port.lock, flags);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
@ -1960,16 +1966,6 @@ imx_uart_console_write(struct console *co, const char *s, unsigned int count)
|
|||
unsigned int ucr1;
|
||||
unsigned long flags = 0;
|
||||
int locked = 1;
|
||||
int retval;
|
||||
|
||||
retval = clk_enable(sport->clk_per);
|
||||
if (retval)
|
||||
return;
|
||||
retval = clk_enable(sport->clk_ipg);
|
||||
if (retval) {
|
||||
clk_disable(sport->clk_per);
|
||||
return;
|
||||
}
|
||||
|
||||
if (sport->port.sysrq)
|
||||
locked = 0;
|
||||
|
@ -2005,9 +2001,6 @@ imx_uart_console_write(struct console *co, const char *s, unsigned int count)
|
|||
|
||||
if (locked)
|
||||
spin_unlock_irqrestore(&sport->port.lock, flags);
|
||||
|
||||
clk_disable(sport->clk_ipg);
|
||||
clk_disable(sport->clk_per);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -2108,15 +2101,14 @@ imx_uart_console_setup(struct console *co, char *options)
|
|||
|
||||
retval = uart_set_options(&sport->port, co, baud, parity, bits, flow);
|
||||
|
||||
clk_disable(sport->clk_ipg);
|
||||
if (retval) {
|
||||
clk_unprepare(sport->clk_ipg);
|
||||
clk_disable_unprepare(sport->clk_ipg);
|
||||
goto error_console;
|
||||
}
|
||||
|
||||
retval = clk_prepare(sport->clk_per);
|
||||
retval = clk_prepare_enable(sport->clk_per);
|
||||
if (retval)
|
||||
clk_unprepare(sport->clk_ipg);
|
||||
clk_disable_unprepare(sport->clk_ipg);
|
||||
|
||||
error_console:
|
||||
return retval;
|
||||
|
|
|
@ -21,6 +21,7 @@ LIST_HEAD(efivarfs_list);
|
|||
static void efivarfs_evict_inode(struct inode *inode)
|
||||
{
|
||||
clear_inode(inode);
|
||||
kfree(inode->i_private);
|
||||
}
|
||||
|
||||
static const struct super_operations efivarfs_ops = {
|
||||
|
|
|
@ -2496,7 +2496,8 @@ void ext4_insert_dentry(struct inode *inode,
|
|||
struct ext4_filename *fname);
|
||||
static inline void ext4_update_dx_flag(struct inode *inode)
|
||||
{
|
||||
if (!ext4_has_feature_dir_index(inode->i_sb)) {
|
||||
if (!ext4_has_feature_dir_index(inode->i_sb) &&
|
||||
ext4_test_inode_flag(inode, EXT4_INODE_INDEX)) {
|
||||
/* ext4_iget() should have caught this... */
|
||||
WARN_ON_ONCE(ext4_has_feature_metadata_csum(inode->i_sb));
|
||||
ext4_clear_inode_flag(inode, EXT4_INODE_INDEX);
|
||||
|
|
|
@ -2574,13 +2574,13 @@ int gfs2_check_blk_type(struct gfs2_sbd *sdp, u64 no_addr, unsigned int type)
|
|||
|
||||
rbm.rgd = rgd;
|
||||
error = gfs2_rbm_from_block(&rbm, no_addr);
|
||||
if (WARN_ON_ONCE(error))
|
||||
goto fail;
|
||||
|
||||
if (gfs2_testbit(&rbm, false) != type)
|
||||
error = -ESTALE;
|
||||
if (!WARN_ON_ONCE(error)) {
|
||||
if (gfs2_testbit(&rbm, false) != type)
|
||||
error = -ESTALE;
|
||||
}
|
||||
|
||||
gfs2_glock_dq_uninit(&rgd_gh);
|
||||
|
||||
fail:
|
||||
return error;
|
||||
}
|
||||
|
|
|
@ -887,7 +887,7 @@ ssize_t simple_attr_write(struct file *file, const char __user *buf,
|
|||
size_t len, loff_t *ppos)
|
||||
{
|
||||
struct simple_attr *attr;
|
||||
u64 val;
|
||||
unsigned long long val;
|
||||
size_t size;
|
||||
ssize_t ret;
|
||||
|
||||
|
@ -905,7 +905,9 @@ ssize_t simple_attr_write(struct file *file, const char __user *buf,
|
|||
goto out;
|
||||
|
||||
attr->set_buf[size] = '\0';
|
||||
val = simple_strtoll(attr->set_buf, NULL, 0);
|
||||
ret = kstrtoull(attr->set_buf, 0, &val);
|
||||
if (ret)
|
||||
goto out;
|
||||
ret = attr->set(attr->data, val);
|
||||
if (ret == 0)
|
||||
ret = len; /* on success, claim we got the whole input */
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue