Merge 8ecfa36cd4
("Merge tag 'riscv-for-linus-5.13-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/riscv/linux") into android-mainline
Steps on the way to 5.13-rc6 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com> Change-Id: Iaed63766ecfc7e2126e108e93808e79469a9facf
This commit is contained in:
commit
1a6552d0ed
@ -109,8 +109,8 @@ ForEachMacros:
|
||||
- 'css_for_each_child'
|
||||
- 'css_for_each_descendant_post'
|
||||
- 'css_for_each_descendant_pre'
|
||||
- 'cxl_for_each_cmd'
|
||||
- 'device_for_each_child_node'
|
||||
- 'displayid_iter_for_each'
|
||||
- 'dma_fence_chain_for_each'
|
||||
- 'do_for_each_ftrace_op'
|
||||
- 'drm_atomic_crtc_for_each_plane'
|
||||
@ -136,6 +136,7 @@ ForEachMacros:
|
||||
- 'drm_mm_for_each_node_in_range'
|
||||
- 'drm_mm_for_each_node_safe'
|
||||
- 'flow_action_for_each'
|
||||
- 'for_each_acpi_dev_match'
|
||||
- 'for_each_active_dev_scope'
|
||||
- 'for_each_active_drhd_unit'
|
||||
- 'for_each_active_iommu'
|
||||
@ -171,7 +172,6 @@ ForEachMacros:
|
||||
- 'for_each_dapm_widgets'
|
||||
- 'for_each_dev_addr'
|
||||
- 'for_each_dev_scope'
|
||||
- 'for_each_displayid_db'
|
||||
- 'for_each_dma_cap_mask'
|
||||
- 'for_each_dpcm_be'
|
||||
- 'for_each_dpcm_be_rollback'
|
||||
@ -179,6 +179,7 @@ ForEachMacros:
|
||||
- 'for_each_dpcm_fe'
|
||||
- 'for_each_drhd_unit'
|
||||
- 'for_each_dss_dev'
|
||||
- 'for_each_dtpm_table'
|
||||
- 'for_each_efi_memory_desc'
|
||||
- 'for_each_efi_memory_desc_in_map'
|
||||
- 'for_each_element'
|
||||
@ -215,6 +216,7 @@ ForEachMacros:
|
||||
- 'for_each_migratetype_order'
|
||||
- 'for_each_msi_entry'
|
||||
- 'for_each_msi_entry_safe'
|
||||
- 'for_each_msi_vector'
|
||||
- 'for_each_net'
|
||||
- 'for_each_net_continue_reverse'
|
||||
- 'for_each_netdev'
|
||||
@ -270,6 +272,12 @@ ForEachMacros:
|
||||
- 'for_each_prime_number_from'
|
||||
- 'for_each_process'
|
||||
- 'for_each_process_thread'
|
||||
- 'for_each_prop_codec_conf'
|
||||
- 'for_each_prop_dai_codec'
|
||||
- 'for_each_prop_dai_cpu'
|
||||
- 'for_each_prop_dlc_codecs'
|
||||
- 'for_each_prop_dlc_cpus'
|
||||
- 'for_each_prop_dlc_platforms'
|
||||
- 'for_each_property_of_node'
|
||||
- 'for_each_registered_fb'
|
||||
- 'for_each_requested_gpio'
|
||||
@ -430,6 +438,7 @@ ForEachMacros:
|
||||
- 'queue_for_each_hw_ctx'
|
||||
- 'radix_tree_for_each_slot'
|
||||
- 'radix_tree_for_each_tagged'
|
||||
- 'rb_for_each'
|
||||
- 'rbtree_postorder_for_each_entry_safe'
|
||||
- 'rdma_for_each_block'
|
||||
- 'rdma_for_each_port'
|
||||
|
@ -149,6 +149,17 @@ properties:
|
||||
maxItems: 6
|
||||
$ref: /schemas/types.yaml#/definitions/uint32-array
|
||||
|
||||
sink-vdos-v1:
|
||||
description: An array of u32 with each entry, a Vendor Defined Message Object (VDO),
|
||||
providing additional information corresponding to the product, the detailed bit
|
||||
definitions and the order of each VDO can be found in
|
||||
"USB Power Delivery Specification Revision 2.0, Version 1.3" chapter 6.4.4.3.1 Discover
|
||||
Identity. User can specify the VDO array via VDO_IDH/_CERT/_PRODUCT/_CABLE/_AMA defined in
|
||||
dt-bindings/usb/pd.h.
|
||||
minItems: 3
|
||||
maxItems: 6
|
||||
$ref: /schemas/types.yaml#/definitions/uint32-array
|
||||
|
||||
op-sink-microwatt:
|
||||
description: Sink required operating power in microwatt, if source can't
|
||||
offer the power, Capability Mismatch is set. Required for power sink and
|
||||
@ -207,6 +218,10 @@ properties:
|
||||
SNK_READY for non-pd link.
|
||||
type: boolean
|
||||
|
||||
dependencies:
|
||||
sink-vdos-v1: [ 'sink-vdos' ]
|
||||
sink-vdos: [ 'sink-vdos-v1' ]
|
||||
|
||||
required:
|
||||
- compatible
|
||||
|
||||
|
@ -49,7 +49,7 @@ examples:
|
||||
#size-cells = <0>;
|
||||
|
||||
adc@48 {
|
||||
comatible = "ti,ads7828";
|
||||
compatible = "ti,ads7828";
|
||||
reg = <0x48>;
|
||||
vref-supply = <&vref>;
|
||||
ti,differential-input;
|
||||
|
@ -67,9 +67,7 @@ properties:
|
||||
maxItems: 1
|
||||
|
||||
clock-names:
|
||||
maxItems: 1
|
||||
items:
|
||||
- const: fck
|
||||
const: fck
|
||||
|
||||
resets:
|
||||
maxItems: 1
|
||||
|
@ -57,7 +57,7 @@ patternProperties:
|
||||
rate
|
||||
|
||||
sound-dai:
|
||||
$ref: /schemas/types.yaml#/definitions/phandle
|
||||
$ref: /schemas/types.yaml#/definitions/phandle-array
|
||||
description: phandle of the CPU DAI
|
||||
|
||||
patternProperties:
|
||||
@ -71,7 +71,7 @@ patternProperties:
|
||||
|
||||
properties:
|
||||
sound-dai:
|
||||
$ref: /schemas/types.yaml#/definitions/phandle
|
||||
$ref: /schemas/types.yaml#/definitions/phandle-array
|
||||
description: phandle of the codec DAI
|
||||
|
||||
required:
|
||||
|
@ -171,8 +171,8 @@ Shadow pages contain the following information:
|
||||
shadow pages) so role.quadrant takes values in the range 0..3. Each
|
||||
quadrant maps 1GB virtual address space.
|
||||
role.access:
|
||||
Inherited guest access permissions in the form uwx. Note execute
|
||||
permission is positive, not negative.
|
||||
Inherited guest access permissions from the parent ptes in the form uwx.
|
||||
Note execute permission is positive, not negative.
|
||||
role.invalid:
|
||||
The page is invalid and should not be used. It is a root page that is
|
||||
currently pinned (by a cpu hardware register pointing to it); once it is
|
||||
|
@ -18886,6 +18886,13 @@ S: Maintained
|
||||
F: drivers/usb/host/isp116x*
|
||||
F: include/linux/usb/isp116x.h
|
||||
|
||||
USB ISP1760 DRIVER
|
||||
M: Rui Miguel Silva <rui.silva@linaro.org>
|
||||
L: linux-usb@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/usb/isp1760/*
|
||||
F: Documentation/devicetree/bindings/usb/nxp,isp1760.yaml
|
||||
|
||||
USB LAN78XX ETHERNET DRIVER
|
||||
M: Woojung Huh <woojung.huh@microchip.com>
|
||||
M: UNGLinuxDriver@microchip.com
|
||||
|
@ -7,9 +7,11 @@
|
||||
#ifdef CONFIG_CPU_IDLE
|
||||
extern int arm_cpuidle_simple_enter(struct cpuidle_device *dev,
|
||||
struct cpuidle_driver *drv, int index);
|
||||
#define __cpuidle_method_section __used __section("__cpuidle_method_of_table")
|
||||
#else
|
||||
static inline int arm_cpuidle_simple_enter(struct cpuidle_device *dev,
|
||||
struct cpuidle_driver *drv, int index) { return -ENODEV; }
|
||||
#define __cpuidle_method_section __maybe_unused /* drop silently */
|
||||
#endif
|
||||
|
||||
/* Common ARM WFI state */
|
||||
@ -42,8 +44,7 @@ struct of_cpuidle_method {
|
||||
|
||||
#define CPUIDLE_METHOD_OF_DECLARE(name, _method, _ops) \
|
||||
static const struct of_cpuidle_method __cpuidle_method_of_table_##name \
|
||||
__used __section("__cpuidle_method_of_table") \
|
||||
= { .method = _method, .ops = _ops }
|
||||
__cpuidle_method_section = { .method = _method, .ops = _ops }
|
||||
|
||||
extern int arm_cpuidle_suspend(int index);
|
||||
|
||||
|
@ -61,11 +61,11 @@ config RISCV
|
||||
select GENERIC_TIME_VSYSCALL if MMU && 64BIT
|
||||
select HANDLE_DOMAIN_IRQ
|
||||
select HAVE_ARCH_AUDITSYSCALL
|
||||
select HAVE_ARCH_JUMP_LABEL
|
||||
select HAVE_ARCH_JUMP_LABEL_RELATIVE
|
||||
select HAVE_ARCH_JUMP_LABEL if !XIP_KERNEL
|
||||
select HAVE_ARCH_JUMP_LABEL_RELATIVE if !XIP_KERNEL
|
||||
select HAVE_ARCH_KASAN if MMU && 64BIT
|
||||
select HAVE_ARCH_KASAN_VMALLOC if MMU && 64BIT
|
||||
select HAVE_ARCH_KGDB
|
||||
select HAVE_ARCH_KGDB if !XIP_KERNEL
|
||||
select HAVE_ARCH_KGDB_QXFER_PKT
|
||||
select HAVE_ARCH_MMAP_RND_BITS if MMU
|
||||
select HAVE_ARCH_SECCOMP_FILTER
|
||||
@ -80,9 +80,9 @@ config RISCV
|
||||
select HAVE_GCC_PLUGINS
|
||||
select HAVE_GENERIC_VDSO if MMU && 64BIT
|
||||
select HAVE_IRQ_TIME_ACCOUNTING
|
||||
select HAVE_KPROBES
|
||||
select HAVE_KPROBES_ON_FTRACE
|
||||
select HAVE_KRETPROBES
|
||||
select HAVE_KPROBES if !XIP_KERNEL
|
||||
select HAVE_KPROBES_ON_FTRACE if !XIP_KERNEL
|
||||
select HAVE_KRETPROBES if !XIP_KERNEL
|
||||
select HAVE_PCI
|
||||
select HAVE_PERF_EVENTS
|
||||
select HAVE_PERF_REGS
|
||||
@ -231,11 +231,11 @@ config ARCH_RV64I
|
||||
bool "RV64I"
|
||||
select 64BIT
|
||||
select ARCH_SUPPORTS_INT128 if CC_HAS_INT128 && GCC_VERSION >= 50000
|
||||
select HAVE_DYNAMIC_FTRACE if MMU && $(cc-option,-fpatchable-function-entry=8)
|
||||
select HAVE_DYNAMIC_FTRACE if !XIP_KERNEL && MMU && $(cc-option,-fpatchable-function-entry=8)
|
||||
select HAVE_DYNAMIC_FTRACE_WITH_REGS if HAVE_DYNAMIC_FTRACE
|
||||
select HAVE_FTRACE_MCOUNT_RECORD
|
||||
select HAVE_FTRACE_MCOUNT_RECORD if !XIP_KERNEL
|
||||
select HAVE_FUNCTION_GRAPH_TRACER
|
||||
select HAVE_FUNCTION_TRACER
|
||||
select HAVE_FUNCTION_TRACER if !XIP_KERNEL
|
||||
select SWIOTLB if MMU
|
||||
|
||||
endchoice
|
||||
|
@ -1,2 +1,3 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
dtb-$(CONFIG_SOC_MICROCHIP_POLARFIRE) += microchip-mpfs-icicle-kit.dtb
|
||||
obj-$(CONFIG_BUILTIN_DTB) += $(addsuffix .o, $(dtb-y))
|
||||
|
@ -1,3 +1,4 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
dtb-$(CONFIG_SOC_SIFIVE) += hifive-unleashed-a00.dtb \
|
||||
hifive-unmatched-a00.dtb
|
||||
obj-$(CONFIG_BUILTIN_DTB) += $(addsuffix .o, $(dtb-y))
|
||||
|
@ -51,7 +51,7 @@
|
||||
REG_ASM " " newlen "\n" \
|
||||
".word " errata_id "\n"
|
||||
|
||||
#define ALT_NEW_CONSTENT(vendor_id, errata_id, enable, new_c) \
|
||||
#define ALT_NEW_CONTENT(vendor_id, errata_id, enable, new_c) \
|
||||
".if " __stringify(enable) " == 1\n" \
|
||||
".pushsection .alternative, \"a\"\n" \
|
||||
ALT_ENTRY("886b", "888f", __stringify(vendor_id), __stringify(errata_id), "889f - 888f") \
|
||||
@ -69,7 +69,7 @@
|
||||
"886 :\n" \
|
||||
old_c "\n" \
|
||||
"887 :\n" \
|
||||
ALT_NEW_CONSTENT(vendor_id, errata_id, enable, new_c)
|
||||
ALT_NEW_CONTENT(vendor_id, errata_id, enable, new_c)
|
||||
|
||||
#define _ALTERNATIVE_CFG(old_c, new_c, vendor_id, errata_id, CONFIG_k) \
|
||||
__ALTERNATIVE_CFG(old_c, new_c, vendor_id, errata_id, IS_ENABLED(CONFIG_k))
|
||||
|
@ -86,8 +86,13 @@ static void do_trap_error(struct pt_regs *regs, int signo, int code,
|
||||
}
|
||||
}
|
||||
|
||||
#if defined (CONFIG_XIP_KERNEL) && defined (CONFIG_RISCV_ERRATA_ALTERNATIVE)
|
||||
#define __trap_section __section(".xip.traps")
|
||||
#else
|
||||
#define __trap_section
|
||||
#endif
|
||||
#define DO_ERROR_INFO(name, signo, code, str) \
|
||||
asmlinkage __visible void name(struct pt_regs *regs) \
|
||||
asmlinkage __visible __trap_section void name(struct pt_regs *regs) \
|
||||
{ \
|
||||
do_trap_error(regs, signo, code, regs->epc, "Oops - " str); \
|
||||
}
|
||||
@ -111,7 +116,7 @@ DO_ERROR_INFO(do_trap_store_misaligned,
|
||||
int handle_misaligned_load(struct pt_regs *regs);
|
||||
int handle_misaligned_store(struct pt_regs *regs);
|
||||
|
||||
asmlinkage void do_trap_load_misaligned(struct pt_regs *regs)
|
||||
asmlinkage void __trap_section do_trap_load_misaligned(struct pt_regs *regs)
|
||||
{
|
||||
if (!handle_misaligned_load(regs))
|
||||
return;
|
||||
@ -119,7 +124,7 @@ asmlinkage void do_trap_load_misaligned(struct pt_regs *regs)
|
||||
"Oops - load address misaligned");
|
||||
}
|
||||
|
||||
asmlinkage void do_trap_store_misaligned(struct pt_regs *regs)
|
||||
asmlinkage void __trap_section do_trap_store_misaligned(struct pt_regs *regs)
|
||||
{
|
||||
if (!handle_misaligned_store(regs))
|
||||
return;
|
||||
@ -146,7 +151,7 @@ static inline unsigned long get_break_insn_length(unsigned long pc)
|
||||
return GET_INSN_LENGTH(insn);
|
||||
}
|
||||
|
||||
asmlinkage __visible void do_trap_break(struct pt_regs *regs)
|
||||
asmlinkage __visible __trap_section void do_trap_break(struct pt_regs *regs)
|
||||
{
|
||||
#ifdef CONFIG_KPROBES
|
||||
if (kprobe_single_step_handler(regs))
|
||||
|
@ -99,9 +99,22 @@ SECTIONS
|
||||
}
|
||||
PERCPU_SECTION(L1_CACHE_BYTES)
|
||||
|
||||
. = ALIGN(PAGE_SIZE);
|
||||
. = ALIGN(8);
|
||||
.alternative : {
|
||||
__alt_start = .;
|
||||
*(.alternative)
|
||||
__alt_end = .;
|
||||
}
|
||||
__init_end = .;
|
||||
|
||||
. = ALIGN(16);
|
||||
.xip.traps : {
|
||||
__xip_traps_start = .;
|
||||
*(.xip.traps)
|
||||
__xip_traps_end = .;
|
||||
}
|
||||
|
||||
. = ALIGN(PAGE_SIZE);
|
||||
.sdata : {
|
||||
__global_pointer$ = . + 0x800;
|
||||
*(.sdata*)
|
||||
|
@ -200,8 +200,9 @@ endif
|
||||
KBUILD_LDFLAGS += -m elf_$(UTS_MACHINE)
|
||||
|
||||
ifdef CONFIG_LTO_CLANG
|
||||
KBUILD_LDFLAGS += -plugin-opt=-code-model=kernel \
|
||||
-plugin-opt=-stack-alignment=$(if $(CONFIG_X86_32),4,8)
|
||||
ifeq ($(shell test $(CONFIG_LLD_VERSION) -lt 130000; echo $$?),0)
|
||||
KBUILD_LDFLAGS += -plugin-opt=-stack-alignment=$(if $(CONFIG_X86_32),4,8)
|
||||
endif
|
||||
endif
|
||||
|
||||
ifdef CONFIG_X86_NEED_RELOCS
|
||||
|
@ -1406,6 +1406,8 @@ static int snbep_pci2phy_map_init(int devid, int nodeid_loc, int idmap_loc, bool
|
||||
die_id = i;
|
||||
else
|
||||
die_id = topology_phys_to_logical_pkg(i);
|
||||
if (die_id < 0)
|
||||
die_id = -ENODEV;
|
||||
map->pbus_to_dieid[bus] = die_id;
|
||||
break;
|
||||
}
|
||||
@ -1452,14 +1454,14 @@ static int snbep_pci2phy_map_init(int devid, int nodeid_loc, int idmap_loc, bool
|
||||
i = -1;
|
||||
if (reverse) {
|
||||
for (bus = 255; bus >= 0; bus--) {
|
||||
if (map->pbus_to_dieid[bus] >= 0)
|
||||
if (map->pbus_to_dieid[bus] != -1)
|
||||
i = map->pbus_to_dieid[bus];
|
||||
else
|
||||
map->pbus_to_dieid[bus] = i;
|
||||
}
|
||||
} else {
|
||||
for (bus = 0; bus <= 255; bus++) {
|
||||
if (map->pbus_to_dieid[bus] >= 0)
|
||||
if (map->pbus_to_dieid[bus] != -1)
|
||||
i = map->pbus_to_dieid[bus];
|
||||
else
|
||||
map->pbus_to_dieid[bus] = i;
|
||||
@ -5097,9 +5099,10 @@ static struct intel_uncore_type icx_uncore_m2m = {
|
||||
.perf_ctr = SNR_M2M_PCI_PMON_CTR0,
|
||||
.event_ctl = SNR_M2M_PCI_PMON_CTL0,
|
||||
.event_mask = SNBEP_PMON_RAW_EVENT_MASK,
|
||||
.event_mask_ext = SNR_M2M_PCI_PMON_UMASK_EXT,
|
||||
.box_ctl = SNR_M2M_PCI_PMON_BOX_CTL,
|
||||
.ops = &snr_m2m_uncore_pci_ops,
|
||||
.format_group = &skx_uncore_format_group,
|
||||
.format_group = &snr_m2m_uncore_format_group,
|
||||
};
|
||||
|
||||
static struct attribute *icx_upi_uncore_formats_attr[] = {
|
||||
|
@ -63,7 +63,7 @@ static inline unsigned int nmi_perfctr_msr_to_bit(unsigned int msr)
|
||||
case 15:
|
||||
return msr - MSR_P4_BPU_PERFCTR0;
|
||||
}
|
||||
fallthrough;
|
||||
break;
|
||||
case X86_VENDOR_ZHAOXIN:
|
||||
case X86_VENDOR_CENTAUR:
|
||||
return msr - MSR_ARCH_PERFMON_PERFCTR0;
|
||||
@ -96,7 +96,7 @@ static inline unsigned int nmi_evntsel_msr_to_bit(unsigned int msr)
|
||||
case 15:
|
||||
return msr - MSR_P4_BSU_ESCR0;
|
||||
}
|
||||
fallthrough;
|
||||
break;
|
||||
case X86_VENDOR_ZHAOXIN:
|
||||
case X86_VENDOR_CENTAUR:
|
||||
return msr - MSR_ARCH_PERFMON_EVENTSEL0;
|
||||
|
@ -1494,6 +1494,15 @@ static void limit_periodic_timer_frequency(struct kvm_lapic *apic)
|
||||
|
||||
static void cancel_hv_timer(struct kvm_lapic *apic);
|
||||
|
||||
static void cancel_apic_timer(struct kvm_lapic *apic)
|
||||
{
|
||||
hrtimer_cancel(&apic->lapic_timer.timer);
|
||||
preempt_disable();
|
||||
if (apic->lapic_timer.hv_timer_in_use)
|
||||
cancel_hv_timer(apic);
|
||||
preempt_enable();
|
||||
}
|
||||
|
||||
static void apic_update_lvtt(struct kvm_lapic *apic)
|
||||
{
|
||||
u32 timer_mode = kvm_lapic_get_reg(apic, APIC_LVTT) &
|
||||
@ -1502,11 +1511,7 @@ static void apic_update_lvtt(struct kvm_lapic *apic)
|
||||
if (apic->lapic_timer.timer_mode != timer_mode) {
|
||||
if (apic_lvtt_tscdeadline(apic) != (timer_mode ==
|
||||
APIC_LVT_TIMER_TSCDEADLINE)) {
|
||||
hrtimer_cancel(&apic->lapic_timer.timer);
|
||||
preempt_disable();
|
||||
if (apic->lapic_timer.hv_timer_in_use)
|
||||
cancel_hv_timer(apic);
|
||||
preempt_enable();
|
||||
cancel_apic_timer(apic);
|
||||
kvm_lapic_set_reg(apic, APIC_TMICT, 0);
|
||||
apic->lapic_timer.period = 0;
|
||||
apic->lapic_timer.tscdeadline = 0;
|
||||
@ -2092,7 +2097,7 @@ int kvm_lapic_reg_write(struct kvm_lapic *apic, u32 reg, u32 val)
|
||||
if (apic_lvtt_tscdeadline(apic))
|
||||
break;
|
||||
|
||||
hrtimer_cancel(&apic->lapic_timer.timer);
|
||||
cancel_apic_timer(apic);
|
||||
kvm_lapic_set_reg(apic, APIC_TMICT, val);
|
||||
start_apic_timer(apic);
|
||||
break;
|
||||
|
@ -90,8 +90,8 @@ struct guest_walker {
|
||||
gpa_t pte_gpa[PT_MAX_FULL_LEVELS];
|
||||
pt_element_t __user *ptep_user[PT_MAX_FULL_LEVELS];
|
||||
bool pte_writable[PT_MAX_FULL_LEVELS];
|
||||
unsigned pt_access;
|
||||
unsigned pte_access;
|
||||
unsigned int pt_access[PT_MAX_FULL_LEVELS];
|
||||
unsigned int pte_access;
|
||||
gfn_t gfn;
|
||||
struct x86_exception fault;
|
||||
};
|
||||
@ -418,13 +418,15 @@ static int FNAME(walk_addr_generic)(struct guest_walker *walker,
|
||||
}
|
||||
|
||||
walker->ptes[walker->level - 1] = pte;
|
||||
|
||||
/* Convert to ACC_*_MASK flags for struct guest_walker. */
|
||||
walker->pt_access[walker->level - 1] = FNAME(gpte_access)(pt_access ^ walk_nx_mask);
|
||||
} while (!is_last_gpte(mmu, walker->level, pte));
|
||||
|
||||
pte_pkey = FNAME(gpte_pkeys)(vcpu, pte);
|
||||
accessed_dirty = have_ad ? pte_access & PT_GUEST_ACCESSED_MASK : 0;
|
||||
|
||||
/* Convert to ACC_*_MASK flags for struct guest_walker. */
|
||||
walker->pt_access = FNAME(gpte_access)(pt_access ^ walk_nx_mask);
|
||||
walker->pte_access = FNAME(gpte_access)(pte_access ^ walk_nx_mask);
|
||||
errcode = permission_fault(vcpu, mmu, walker->pte_access, pte_pkey, access);
|
||||
if (unlikely(errcode))
|
||||
@ -463,7 +465,8 @@ static int FNAME(walk_addr_generic)(struct guest_walker *walker,
|
||||
}
|
||||
|
||||
pgprintk("%s: pte %llx pte_access %x pt_access %x\n",
|
||||
__func__, (u64)pte, walker->pte_access, walker->pt_access);
|
||||
__func__, (u64)pte, walker->pte_access,
|
||||
walker->pt_access[walker->level - 1]);
|
||||
return 1;
|
||||
|
||||
error:
|
||||
@ -643,7 +646,7 @@ static int FNAME(fetch)(struct kvm_vcpu *vcpu, gpa_t addr,
|
||||
bool huge_page_disallowed = exec && nx_huge_page_workaround_enabled;
|
||||
struct kvm_mmu_page *sp = NULL;
|
||||
struct kvm_shadow_walk_iterator it;
|
||||
unsigned direct_access, access = gw->pt_access;
|
||||
unsigned int direct_access, access;
|
||||
int top_level, level, req_level, ret;
|
||||
gfn_t base_gfn = gw->gfn;
|
||||
|
||||
@ -675,6 +678,7 @@ static int FNAME(fetch)(struct kvm_vcpu *vcpu, gpa_t addr,
|
||||
sp = NULL;
|
||||
if (!is_shadow_present_pte(*it.sptep)) {
|
||||
table_gfn = gw->table_gfn[it.level - 2];
|
||||
access = gw->pt_access[it.level - 2];
|
||||
sp = kvm_mmu_get_page(vcpu, table_gfn, addr, it.level-1,
|
||||
false, access);
|
||||
}
|
||||
|
@ -1103,10 +1103,9 @@ __sev_send_start_query_session_length(struct kvm *kvm, struct kvm_sev_cmd *argp,
|
||||
struct sev_data_send_start data;
|
||||
int ret;
|
||||
|
||||
memset(&data, 0, sizeof(data));
|
||||
data.handle = sev->handle;
|
||||
ret = sev_issue_cmd(kvm, SEV_CMD_SEND_START, &data, &argp->error);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
params->session_len = data.session_len;
|
||||
if (copy_to_user((void __user *)(uintptr_t)argp->data, params,
|
||||
@ -1215,10 +1214,9 @@ __sev_send_update_data_query_lengths(struct kvm *kvm, struct kvm_sev_cmd *argp,
|
||||
struct sev_data_send_update_data data;
|
||||
int ret;
|
||||
|
||||
memset(&data, 0, sizeof(data));
|
||||
data.handle = sev->handle;
|
||||
ret = sev_issue_cmd(kvm, SEV_CMD_SEND_UPDATE_DATA, &data, &argp->error);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
params->hdr_len = data.hdr_len;
|
||||
params->trans_len = data.trans_len;
|
||||
|
@ -1550,16 +1550,16 @@ TRACE_EVENT(kvm_nested_vmenter_failed,
|
||||
TP_ARGS(msg, err),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field(const char *, msg)
|
||||
__string(msg, msg)
|
||||
__field(u32, err)
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->msg = msg;
|
||||
__assign_str(msg, msg);
|
||||
__entry->err = err;
|
||||
),
|
||||
|
||||
TP_printk("%s%s", __entry->msg, !__entry->err ? "" :
|
||||
TP_printk("%s%s", __get_str(msg), !__entry->err ? "" :
|
||||
__print_symbolic(__entry->err, VMX_VMENTER_INSTRUCTION_ERRORS))
|
||||
);
|
||||
|
||||
|
@ -3072,6 +3072,19 @@ static void kvm_vcpu_flush_tlb_all(struct kvm_vcpu *vcpu)
|
||||
static void kvm_vcpu_flush_tlb_guest(struct kvm_vcpu *vcpu)
|
||||
{
|
||||
++vcpu->stat.tlb_flush;
|
||||
|
||||
if (!tdp_enabled) {
|
||||
/*
|
||||
* A TLB flush on behalf of the guest is equivalent to
|
||||
* INVPCID(all), toggling CR4.PGE, etc., which requires
|
||||
* a forced sync of the shadow page tables. Unload the
|
||||
* entire MMU here and the subsequent load will sync the
|
||||
* shadow page tables, and also flush the TLB.
|
||||
*/
|
||||
kvm_mmu_unload(vcpu);
|
||||
return;
|
||||
}
|
||||
|
||||
static_call(kvm_x86_tlb_flush_guest)(vcpu);
|
||||
}
|
||||
|
||||
@ -3101,9 +3114,11 @@ static void record_steal_time(struct kvm_vcpu *vcpu)
|
||||
* expensive IPIs.
|
||||
*/
|
||||
if (guest_pv_has(vcpu, KVM_FEATURE_PV_TLB_FLUSH)) {
|
||||
u8 st_preempted = xchg(&st->preempted, 0);
|
||||
|
||||
trace_kvm_pv_tlb_flush(vcpu->vcpu_id,
|
||||
st->preempted & KVM_VCPU_FLUSH_TLB);
|
||||
if (xchg(&st->preempted, 0) & KVM_VCPU_FLUSH_TLB)
|
||||
st_preempted & KVM_VCPU_FLUSH_TLB);
|
||||
if (st_preempted & KVM_VCPU_FLUSH_TLB)
|
||||
kvm_vcpu_flush_tlb_guest(vcpu);
|
||||
} else {
|
||||
st->preempted = 0;
|
||||
|
@ -233,6 +233,7 @@ async_xor_offs(struct page *dest, unsigned int offset,
|
||||
if (submit->flags & ASYNC_TX_XOR_DROP_DST) {
|
||||
src_cnt--;
|
||||
src_list++;
|
||||
if (src_offs)
|
||||
src_offs++;
|
||||
}
|
||||
|
||||
|
@ -330,32 +330,21 @@ static void acpi_bus_osc_negotiate_platform_control(void)
|
||||
if (ACPI_FAILURE(acpi_run_osc(handle, &context)))
|
||||
return;
|
||||
|
||||
capbuf_ret = context.ret.pointer;
|
||||
if (context.ret.length <= OSC_SUPPORT_DWORD) {
|
||||
kfree(context.ret.pointer);
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* Now run _OSC again with query flag clear and with the caps
|
||||
* supported by both the OS and the platform.
|
||||
*/
|
||||
/* Now run _OSC again with query flag clear */
|
||||
capbuf[OSC_QUERY_DWORD] = 0;
|
||||
capbuf[OSC_SUPPORT_DWORD] = capbuf_ret[OSC_SUPPORT_DWORD];
|
||||
kfree(context.ret.pointer);
|
||||
|
||||
if (ACPI_FAILURE(acpi_run_osc(handle, &context)))
|
||||
return;
|
||||
|
||||
capbuf_ret = context.ret.pointer;
|
||||
if (context.ret.length > OSC_SUPPORT_DWORD) {
|
||||
osc_sb_apei_support_acked =
|
||||
capbuf_ret[OSC_SUPPORT_DWORD] & OSC_SB_APEI_SUPPORT;
|
||||
osc_pc_lpi_support_confirmed =
|
||||
capbuf_ret[OSC_SUPPORT_DWORD] & OSC_SB_PCLPI_SUPPORT;
|
||||
osc_sb_native_usb4_support_confirmed =
|
||||
capbuf_ret[OSC_SUPPORT_DWORD] & OSC_SB_NATIVE_USB4_SUPPORT;
|
||||
}
|
||||
|
||||
kfree(context.ret.pointer);
|
||||
}
|
||||
|
@ -1009,10 +1009,8 @@ static void acpi_sleep_hibernate_setup(void)
|
||||
return;
|
||||
|
||||
acpi_get_table(ACPI_SIG_FACS, 1, (struct acpi_table_header **)&facs);
|
||||
if (facs) {
|
||||
if (facs)
|
||||
s4_hardware_signature = facs->hardware_signature;
|
||||
acpi_put_table((struct acpi_table_header *)facs);
|
||||
}
|
||||
}
|
||||
#else /* !CONFIG_HIBERNATION */
|
||||
static inline void acpi_sleep_hibernate_setup(void) {}
|
||||
|
@ -1879,29 +1879,18 @@ static int lo_compat_ioctl(struct block_device *bdev, fmode_t mode,
|
||||
|
||||
static int lo_open(struct block_device *bdev, fmode_t mode)
|
||||
{
|
||||
struct loop_device *lo;
|
||||
struct loop_device *lo = bdev->bd_disk->private_data;
|
||||
int err;
|
||||
|
||||
/*
|
||||
* take loop_ctl_mutex to protect lo pointer from race with
|
||||
* loop_control_ioctl(LOOP_CTL_REMOVE), however, to reduce contention
|
||||
* release it prior to updating lo->lo_refcnt.
|
||||
*/
|
||||
err = mutex_lock_killable(&loop_ctl_mutex);
|
||||
if (err)
|
||||
return err;
|
||||
lo = bdev->bd_disk->private_data;
|
||||
if (!lo) {
|
||||
mutex_unlock(&loop_ctl_mutex);
|
||||
return -ENXIO;
|
||||
}
|
||||
err = mutex_lock_killable(&lo->lo_mutex);
|
||||
mutex_unlock(&loop_ctl_mutex);
|
||||
if (err)
|
||||
return err;
|
||||
if (lo->lo_state == Lo_deleting)
|
||||
err = -ENXIO;
|
||||
else
|
||||
atomic_inc(&lo->lo_refcnt);
|
||||
mutex_unlock(&lo->lo_mutex);
|
||||
return 0;
|
||||
return err;
|
||||
}
|
||||
|
||||
static void lo_release(struct gendisk *disk, fmode_t mode)
|
||||
@ -2285,7 +2274,7 @@ static long loop_control_ioctl(struct file *file, unsigned int cmd,
|
||||
mutex_unlock(&lo->lo_mutex);
|
||||
break;
|
||||
}
|
||||
lo->lo_disk->private_data = NULL;
|
||||
lo->lo_state = Lo_deleting;
|
||||
mutex_unlock(&lo->lo_mutex);
|
||||
idr_remove(&loop_index_idr, lo->lo_number);
|
||||
loop_remove(lo);
|
||||
|
@ -22,6 +22,7 @@ enum {
|
||||
Lo_unbound,
|
||||
Lo_bound,
|
||||
Lo_rundown,
|
||||
Lo_deleting,
|
||||
};
|
||||
|
||||
struct loop_func_table;
|
||||
|
@ -311,8 +311,8 @@ static const struct mhi_channel_config mhi_foxconn_sdx55_channels[] = {
|
||||
MHI_CHANNEL_CONFIG_DL(5, "DIAG", 32, 1),
|
||||
MHI_CHANNEL_CONFIG_UL(12, "MBIM", 32, 0),
|
||||
MHI_CHANNEL_CONFIG_DL(13, "MBIM", 32, 0),
|
||||
MHI_CHANNEL_CONFIG_UL(32, "AT", 32, 0),
|
||||
MHI_CHANNEL_CONFIG_DL(33, "AT", 32, 0),
|
||||
MHI_CHANNEL_CONFIG_UL(32, "DUN", 32, 0),
|
||||
MHI_CHANNEL_CONFIG_DL(33, "DUN", 32, 0),
|
||||
MHI_CHANNEL_CONFIG_HW_UL(100, "IP_HW0_MBIM", 128, 2),
|
||||
MHI_CHANNEL_CONFIG_HW_DL(101, "IP_HW0_MBIM", 128, 3),
|
||||
};
|
||||
@ -708,7 +708,7 @@ static void mhi_pci_remove(struct pci_dev *pdev)
|
||||
struct mhi_pci_device *mhi_pdev = pci_get_drvdata(pdev);
|
||||
struct mhi_controller *mhi_cntrl = &mhi_pdev->mhi_cntrl;
|
||||
|
||||
del_timer(&mhi_pdev->health_check_timer);
|
||||
del_timer_sync(&mhi_pdev->health_check_timer);
|
||||
cancel_work_sync(&mhi_pdev->recovery_work);
|
||||
|
||||
if (test_and_clear_bit(MHI_PCI_DEV_STARTED, &mhi_pdev->status)) {
|
||||
@ -935,9 +935,43 @@ static int __maybe_unused mhi_pci_resume(struct device *dev)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int __maybe_unused mhi_pci_freeze(struct device *dev)
|
||||
{
|
||||
struct mhi_pci_device *mhi_pdev = dev_get_drvdata(dev);
|
||||
struct mhi_controller *mhi_cntrl = &mhi_pdev->mhi_cntrl;
|
||||
|
||||
/* We want to stop all operations, hibernation does not guarantee that
|
||||
* device will be in the same state as before freezing, especially if
|
||||
* the intermediate restore kernel reinitializes MHI device with new
|
||||
* context.
|
||||
*/
|
||||
if (test_and_clear_bit(MHI_PCI_DEV_STARTED, &mhi_pdev->status)) {
|
||||
mhi_power_down(mhi_cntrl, false);
|
||||
mhi_unprepare_after_power_down(mhi_cntrl);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __maybe_unused mhi_pci_restore(struct device *dev)
|
||||
{
|
||||
struct mhi_pci_device *mhi_pdev = dev_get_drvdata(dev);
|
||||
|
||||
/* Reinitialize the device */
|
||||
queue_work(system_long_wq, &mhi_pdev->recovery_work);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct dev_pm_ops mhi_pci_pm_ops = {
|
||||
SET_RUNTIME_PM_OPS(mhi_pci_runtime_suspend, mhi_pci_runtime_resume, NULL)
|
||||
SET_SYSTEM_SLEEP_PM_OPS(mhi_pci_suspend, mhi_pci_resume)
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
.suspend = mhi_pci_suspend,
|
||||
.resume = mhi_pci_resume,
|
||||
.freeze = mhi_pci_freeze,
|
||||
.thaw = mhi_pci_restore,
|
||||
.restore = mhi_pci_restore,
|
||||
#endif
|
||||
};
|
||||
|
||||
static struct pci_driver mhi_pci_driver = {
|
||||
|
@ -7,7 +7,7 @@
|
||||
#include <linux/slab.h>
|
||||
#include <linux/of_device.h>
|
||||
|
||||
#define WCD_PIN_MASK(p) BIT(p - 1)
|
||||
#define WCD_PIN_MASK(p) BIT(p)
|
||||
#define WCD_REG_DIR_CTL_OFFSET 0x42
|
||||
#define WCD_REG_VAL_CTL_OFFSET 0x43
|
||||
#define WCD934X_NPINS 5
|
||||
|
@ -1057,7 +1057,7 @@ int amdgpu_display_gem_fb_init(struct drm_device *dev,
|
||||
|
||||
return 0;
|
||||
err:
|
||||
drm_err(dev, "Failed to init gem fb: %d\n", ret);
|
||||
drm_dbg_kms(dev, "Failed to init gem fb: %d\n", ret);
|
||||
rfb->base.obj[0] = NULL;
|
||||
return ret;
|
||||
}
|
||||
@ -1094,7 +1094,7 @@ int amdgpu_display_gem_fb_verify_and_init(
|
||||
|
||||
return 0;
|
||||
err:
|
||||
drm_err(dev, "Failed to verify and init gem fb: %d\n", ret);
|
||||
drm_dbg_kms(dev, "Failed to verify and init gem fb: %d\n", ret);
|
||||
rfb->base.obj[0] = NULL;
|
||||
return ret;
|
||||
}
|
||||
|
@ -100,7 +100,7 @@ static void amdgpu_bo_destroy(struct ttm_buffer_object *tbo)
|
||||
kfree(ubo->metadata);
|
||||
}
|
||||
|
||||
kfree(bo);
|
||||
kvfree(bo);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -552,7 +552,7 @@ static int amdgpu_bo_do_create(struct amdgpu_device *adev,
|
||||
BUG_ON(bp->bo_ptr_size < sizeof(struct amdgpu_bo));
|
||||
|
||||
*bo_ptr = NULL;
|
||||
bo = kzalloc(bp->bo_ptr_size, GFP_KERNEL);
|
||||
bo = kvzalloc(bp->bo_ptr_size, GFP_KERNEL);
|
||||
if (bo == NULL)
|
||||
return -ENOMEM;
|
||||
drm_gem_private_object_init(adev_to_drm(adev), &bo->tbo.base, size);
|
||||
|
@ -173,6 +173,9 @@
|
||||
#define mmGC_THROTTLE_CTRL_Sienna_Cichlid 0x2030
|
||||
#define mmGC_THROTTLE_CTRL_Sienna_Cichlid_BASE_IDX 0
|
||||
|
||||
#define mmRLC_SPARE_INT_0_Sienna_Cichlid 0x4ca5
|
||||
#define mmRLC_SPARE_INT_0_Sienna_Cichlid_BASE_IDX 1
|
||||
|
||||
#define GFX_RLCG_GC_WRITE_OLD (0x8 << 28)
|
||||
#define GFX_RLCG_GC_WRITE (0x0 << 28)
|
||||
#define GFX_RLCG_GC_READ (0x1 << 28)
|
||||
@ -1480,8 +1483,15 @@ static u32 gfx_v10_rlcg_rw(struct amdgpu_device *adev, u32 offset, u32 v, uint32
|
||||
(adev->reg_offset[GC_HWIP][0][mmSCRATCH_REG0_BASE_IDX] + mmSCRATCH_REG2) * 4;
|
||||
scratch_reg3 = adev->rmmio +
|
||||
(adev->reg_offset[GC_HWIP][0][mmSCRATCH_REG1_BASE_IDX] + mmSCRATCH_REG3) * 4;
|
||||
|
||||
if (adev->asic_type >= CHIP_SIENNA_CICHLID) {
|
||||
spare_int = adev->rmmio +
|
||||
(adev->reg_offset[GC_HWIP][0][mmRLC_SPARE_INT_0_Sienna_Cichlid_BASE_IDX]
|
||||
+ mmRLC_SPARE_INT_0_Sienna_Cichlid) * 4;
|
||||
} else {
|
||||
spare_int = adev->rmmio +
|
||||
(adev->reg_offset[GC_HWIP][0][mmRLC_SPARE_INT_BASE_IDX] + mmRLC_SPARE_INT) * 4;
|
||||
}
|
||||
|
||||
grbm_cntl = adev->reg_offset[GC_HWIP][0][mmGRBM_GFX_CNTL_BASE_IDX] + mmGRBM_GFX_CNTL;
|
||||
grbm_idx = adev->reg_offset[GC_HWIP][0][mmGRBM_GFX_INDEX_BASE_IDX] + mmGRBM_GFX_INDEX;
|
||||
@ -7349,9 +7359,15 @@ static int gfx_v10_0_hw_fini(void *handle)
|
||||
if (amdgpu_sriov_vf(adev)) {
|
||||
gfx_v10_0_cp_gfx_enable(adev, false);
|
||||
/* Program KIQ position of RLC_CP_SCHEDULERS during destroy */
|
||||
if (adev->asic_type >= CHIP_SIENNA_CICHLID) {
|
||||
tmp = RREG32_SOC15(GC, 0, mmRLC_CP_SCHEDULERS_Sienna_Cichlid);
|
||||
tmp &= 0xffffff00;
|
||||
WREG32_SOC15(GC, 0, mmRLC_CP_SCHEDULERS_Sienna_Cichlid, tmp);
|
||||
} else {
|
||||
tmp = RREG32_SOC15(GC, 0, mmRLC_CP_SCHEDULERS);
|
||||
tmp &= 0xffffff00;
|
||||
WREG32_SOC15(GC, 0, mmRLC_CP_SCHEDULERS, tmp);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -810,6 +810,7 @@ static int smu10_dpm_force_dpm_level(struct pp_hwmgr *hwmgr,
|
||||
break;
|
||||
case AMD_DPM_FORCED_LEVEL_MANUAL:
|
||||
data->fine_grain_enabled = 1;
|
||||
break;
|
||||
case AMD_DPM_FORCED_LEVEL_PROFILE_EXIT:
|
||||
default:
|
||||
break;
|
||||
|
@ -314,9 +314,10 @@ int drm_master_open(struct drm_file *file_priv)
|
||||
void drm_master_release(struct drm_file *file_priv)
|
||||
{
|
||||
struct drm_device *dev = file_priv->minor->dev;
|
||||
struct drm_master *master = file_priv->master;
|
||||
struct drm_master *master;
|
||||
|
||||
mutex_lock(&dev->master_mutex);
|
||||
master = file_priv->master;
|
||||
if (file_priv->magic)
|
||||
idr_remove(&file_priv->master->magic_map, file_priv->magic);
|
||||
|
||||
|
@ -118,17 +118,18 @@ int drm_getunique(struct drm_device *dev, void *data,
|
||||
struct drm_file *file_priv)
|
||||
{
|
||||
struct drm_unique *u = data;
|
||||
struct drm_master *master = file_priv->master;
|
||||
struct drm_master *master;
|
||||
|
||||
mutex_lock(&master->dev->master_mutex);
|
||||
mutex_lock(&dev->master_mutex);
|
||||
master = file_priv->master;
|
||||
if (u->unique_len >= master->unique_len) {
|
||||
if (copy_to_user(u->unique, master->unique, master->unique_len)) {
|
||||
mutex_unlock(&master->dev->master_mutex);
|
||||
mutex_unlock(&dev->master_mutex);
|
||||
return -EFAULT;
|
||||
}
|
||||
}
|
||||
u->unique_len = master->unique_len;
|
||||
mutex_unlock(&master->dev->master_mutex);
|
||||
mutex_unlock(&dev->master_mutex);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -577,7 +577,7 @@ static void mcde_dsi_setup_video_mode(struct mcde_dsi *d,
|
||||
* porches and sync.
|
||||
*/
|
||||
/* (ps/s) / (pixels/s) = ps/pixels */
|
||||
pclk = DIV_ROUND_UP_ULL(1000000000000, mode->clock);
|
||||
pclk = DIV_ROUND_UP_ULL(1000000000000, (mode->clock * 1000));
|
||||
dev_dbg(d->dev, "picoseconds between two pixels: %llu\n",
|
||||
pclk);
|
||||
|
||||
|
@ -157,7 +157,7 @@ static void a6xx_submit(struct msm_gpu *gpu, struct msm_gem_submit *submit)
|
||||
* GPU registers so we need to add 0x1a800 to the register value on A630
|
||||
* to get the right value from PM4.
|
||||
*/
|
||||
get_stats_counter(ring, REG_A6XX_GMU_ALWAYS_ON_COUNTER_L + 0x1a800,
|
||||
get_stats_counter(ring, REG_A6XX_CP_ALWAYS_ON_COUNTER_LO,
|
||||
rbmemptr_stats(ring, index, alwayson_start));
|
||||
|
||||
/* Invalidate CCU depth and color */
|
||||
@ -187,7 +187,7 @@ static void a6xx_submit(struct msm_gpu *gpu, struct msm_gem_submit *submit)
|
||||
|
||||
get_stats_counter(ring, REG_A6XX_RBBM_PERFCTR_CP_0_LO,
|
||||
rbmemptr_stats(ring, index, cpcycles_end));
|
||||
get_stats_counter(ring, REG_A6XX_GMU_ALWAYS_ON_COUNTER_L + 0x1a800,
|
||||
get_stats_counter(ring, REG_A6XX_CP_ALWAYS_ON_COUNTER_LO,
|
||||
rbmemptr_stats(ring, index, alwayson_end));
|
||||
|
||||
/* Write the fence to the scratch register */
|
||||
@ -206,8 +206,8 @@ static void a6xx_submit(struct msm_gpu *gpu, struct msm_gem_submit *submit)
|
||||
OUT_RING(ring, submit->seqno);
|
||||
|
||||
trace_msm_gpu_submit_flush(submit,
|
||||
gmu_read64(&a6xx_gpu->gmu, REG_A6XX_GMU_ALWAYS_ON_COUNTER_L,
|
||||
REG_A6XX_GMU_ALWAYS_ON_COUNTER_H));
|
||||
gpu_read64(gpu, REG_A6XX_CP_ALWAYS_ON_COUNTER_LO,
|
||||
REG_A6XX_CP_ALWAYS_ON_COUNTER_HI));
|
||||
|
||||
a6xx_flush(gpu, ring);
|
||||
}
|
||||
@ -462,6 +462,113 @@ static void a6xx_set_hwcg(struct msm_gpu *gpu, bool state)
|
||||
gpu_write(gpu, REG_A6XX_RBBM_CLOCK_CNTL, state ? clock_cntl_on : 0);
|
||||
}
|
||||
|
||||
/* For a615, a616, a618, A619, a630, a640 and a680 */
|
||||
static const u32 a6xx_protect[] = {
|
||||
A6XX_PROTECT_RDONLY(0x00000, 0x04ff),
|
||||
A6XX_PROTECT_RDONLY(0x00501, 0x0005),
|
||||
A6XX_PROTECT_RDONLY(0x0050b, 0x02f4),
|
||||
A6XX_PROTECT_NORDWR(0x0050e, 0x0000),
|
||||
A6XX_PROTECT_NORDWR(0x00510, 0x0000),
|
||||
A6XX_PROTECT_NORDWR(0x00534, 0x0000),
|
||||
A6XX_PROTECT_NORDWR(0x00800, 0x0082),
|
||||
A6XX_PROTECT_NORDWR(0x008a0, 0x0008),
|
||||
A6XX_PROTECT_NORDWR(0x008ab, 0x0024),
|
||||
A6XX_PROTECT_RDONLY(0x008de, 0x00ae),
|
||||
A6XX_PROTECT_NORDWR(0x00900, 0x004d),
|
||||
A6XX_PROTECT_NORDWR(0x0098d, 0x0272),
|
||||
A6XX_PROTECT_NORDWR(0x00e00, 0x0001),
|
||||
A6XX_PROTECT_NORDWR(0x00e03, 0x000c),
|
||||
A6XX_PROTECT_NORDWR(0x03c00, 0x00c3),
|
||||
A6XX_PROTECT_RDONLY(0x03cc4, 0x1fff),
|
||||
A6XX_PROTECT_NORDWR(0x08630, 0x01cf),
|
||||
A6XX_PROTECT_NORDWR(0x08e00, 0x0000),
|
||||
A6XX_PROTECT_NORDWR(0x08e08, 0x0000),
|
||||
A6XX_PROTECT_NORDWR(0x08e50, 0x001f),
|
||||
A6XX_PROTECT_NORDWR(0x09624, 0x01db),
|
||||
A6XX_PROTECT_NORDWR(0x09e70, 0x0001),
|
||||
A6XX_PROTECT_NORDWR(0x09e78, 0x0187),
|
||||
A6XX_PROTECT_NORDWR(0x0a630, 0x01cf),
|
||||
A6XX_PROTECT_NORDWR(0x0ae02, 0x0000),
|
||||
A6XX_PROTECT_NORDWR(0x0ae50, 0x032f),
|
||||
A6XX_PROTECT_NORDWR(0x0b604, 0x0000),
|
||||
A6XX_PROTECT_NORDWR(0x0be02, 0x0001),
|
||||
A6XX_PROTECT_NORDWR(0x0be20, 0x17df),
|
||||
A6XX_PROTECT_NORDWR(0x0f000, 0x0bff),
|
||||
A6XX_PROTECT_RDONLY(0x0fc00, 0x1fff),
|
||||
A6XX_PROTECT_NORDWR(0x11c00, 0x0000), /* note: infinite range */
|
||||
};
|
||||
|
||||
/* These are for a620 and a650 */
|
||||
static const u32 a650_protect[] = {
|
||||
A6XX_PROTECT_RDONLY(0x00000, 0x04ff),
|
||||
A6XX_PROTECT_RDONLY(0x00501, 0x0005),
|
||||
A6XX_PROTECT_RDONLY(0x0050b, 0x02f4),
|
||||
A6XX_PROTECT_NORDWR(0x0050e, 0x0000),
|
||||
A6XX_PROTECT_NORDWR(0x00510, 0x0000),
|
||||
A6XX_PROTECT_NORDWR(0x00534, 0x0000),
|
||||
A6XX_PROTECT_NORDWR(0x00800, 0x0082),
|
||||
A6XX_PROTECT_NORDWR(0x008a0, 0x0008),
|
||||
A6XX_PROTECT_NORDWR(0x008ab, 0x0024),
|
||||
A6XX_PROTECT_RDONLY(0x008de, 0x00ae),
|
||||
A6XX_PROTECT_NORDWR(0x00900, 0x004d),
|
||||
A6XX_PROTECT_NORDWR(0x0098d, 0x0272),
|
||||
A6XX_PROTECT_NORDWR(0x00e00, 0x0001),
|
||||
A6XX_PROTECT_NORDWR(0x00e03, 0x000c),
|
||||
A6XX_PROTECT_NORDWR(0x03c00, 0x00c3),
|
||||
A6XX_PROTECT_RDONLY(0x03cc4, 0x1fff),
|
||||
A6XX_PROTECT_NORDWR(0x08630, 0x01cf),
|
||||
A6XX_PROTECT_NORDWR(0x08e00, 0x0000),
|
||||
A6XX_PROTECT_NORDWR(0x08e08, 0x0000),
|
||||
A6XX_PROTECT_NORDWR(0x08e50, 0x001f),
|
||||
A6XX_PROTECT_NORDWR(0x08e80, 0x027f),
|
||||
A6XX_PROTECT_NORDWR(0x09624, 0x01db),
|
||||
A6XX_PROTECT_NORDWR(0x09e60, 0x0011),
|
||||
A6XX_PROTECT_NORDWR(0x09e78, 0x0187),
|
||||
A6XX_PROTECT_NORDWR(0x0a630, 0x01cf),
|
||||
A6XX_PROTECT_NORDWR(0x0ae02, 0x0000),
|
||||
A6XX_PROTECT_NORDWR(0x0ae50, 0x032f),
|
||||
A6XX_PROTECT_NORDWR(0x0b604, 0x0000),
|
||||
A6XX_PROTECT_NORDWR(0x0b608, 0x0007),
|
||||
A6XX_PROTECT_NORDWR(0x0be02, 0x0001),
|
||||
A6XX_PROTECT_NORDWR(0x0be20, 0x17df),
|
||||
A6XX_PROTECT_NORDWR(0x0f000, 0x0bff),
|
||||
A6XX_PROTECT_RDONLY(0x0fc00, 0x1fff),
|
||||
A6XX_PROTECT_NORDWR(0x18400, 0x1fff),
|
||||
A6XX_PROTECT_NORDWR(0x1a800, 0x1fff),
|
||||
A6XX_PROTECT_NORDWR(0x1f400, 0x0443),
|
||||
A6XX_PROTECT_RDONLY(0x1f844, 0x007b),
|
||||
A6XX_PROTECT_NORDWR(0x1f887, 0x001b),
|
||||
A6XX_PROTECT_NORDWR(0x1f8c0, 0x0000), /* note: infinite range */
|
||||
};
|
||||
|
||||
static void a6xx_set_cp_protect(struct msm_gpu *gpu)
|
||||
{
|
||||
struct adreno_gpu *adreno_gpu = to_adreno_gpu(gpu);
|
||||
const u32 *regs = a6xx_protect;
|
||||
unsigned i, count = ARRAY_SIZE(a6xx_protect), count_max = 32;
|
||||
|
||||
BUILD_BUG_ON(ARRAY_SIZE(a6xx_protect) > 32);
|
||||
BUILD_BUG_ON(ARRAY_SIZE(a650_protect) > 48);
|
||||
|
||||
if (adreno_is_a650(adreno_gpu)) {
|
||||
regs = a650_protect;
|
||||
count = ARRAY_SIZE(a650_protect);
|
||||
count_max = 48;
|
||||
}
|
||||
|
||||
/*
|
||||
* Enable access protection to privileged registers, fault on an access
|
||||
* protect violation and select the last span to protect from the start
|
||||
* address all the way to the end of the register address space
|
||||
*/
|
||||
gpu_write(gpu, REG_A6XX_CP_PROTECT_CNTL, BIT(0) | BIT(1) | BIT(3));
|
||||
|
||||
for (i = 0; i < count - 1; i++)
|
||||
gpu_write(gpu, REG_A6XX_CP_PROTECT(i), regs[i]);
|
||||
/* last CP_PROTECT to have "infinite" length on the last entry */
|
||||
gpu_write(gpu, REG_A6XX_CP_PROTECT(count_max - 1), regs[i]);
|
||||
}
|
||||
|
||||
static void a6xx_set_ubwc_config(struct msm_gpu *gpu)
|
||||
{
|
||||
struct adreno_gpu *adreno_gpu = to_adreno_gpu(gpu);
|
||||
@ -489,7 +596,7 @@ static void a6xx_set_ubwc_config(struct msm_gpu *gpu)
|
||||
rgb565_predicator << 11 | amsbc << 4 | lower_bit << 1);
|
||||
gpu_write(gpu, REG_A6XX_TPL1_NC_MODE_CNTL, lower_bit << 1);
|
||||
gpu_write(gpu, REG_A6XX_SP_NC_MODE_CNTL,
|
||||
uavflagprd_inv >> 4 | lower_bit << 1);
|
||||
uavflagprd_inv << 4 | lower_bit << 1);
|
||||
gpu_write(gpu, REG_A6XX_UCHE_MODE_CNTL, lower_bit << 21);
|
||||
}
|
||||
|
||||
@ -776,41 +883,7 @@ static int a6xx_hw_init(struct msm_gpu *gpu)
|
||||
}
|
||||
|
||||
/* Protect registers from the CP */
|
||||
gpu_write(gpu, REG_A6XX_CP_PROTECT_CNTL, 0x00000003);
|
||||
|
||||
gpu_write(gpu, REG_A6XX_CP_PROTECT(0),
|
||||
A6XX_PROTECT_RDONLY(0x600, 0x51));
|
||||
gpu_write(gpu, REG_A6XX_CP_PROTECT(1), A6XX_PROTECT_RW(0xae50, 0x2));
|
||||
gpu_write(gpu, REG_A6XX_CP_PROTECT(2), A6XX_PROTECT_RW(0x9624, 0x13));
|
||||
gpu_write(gpu, REG_A6XX_CP_PROTECT(3), A6XX_PROTECT_RW(0x8630, 0x8));
|
||||
gpu_write(gpu, REG_A6XX_CP_PROTECT(4), A6XX_PROTECT_RW(0x9e70, 0x1));
|
||||
gpu_write(gpu, REG_A6XX_CP_PROTECT(5), A6XX_PROTECT_RW(0x9e78, 0x187));
|
||||
gpu_write(gpu, REG_A6XX_CP_PROTECT(6), A6XX_PROTECT_RW(0xf000, 0x810));
|
||||
gpu_write(gpu, REG_A6XX_CP_PROTECT(7),
|
||||
A6XX_PROTECT_RDONLY(0xfc00, 0x3));
|
||||
gpu_write(gpu, REG_A6XX_CP_PROTECT(8), A6XX_PROTECT_RW(0x50e, 0x0));
|
||||
gpu_write(gpu, REG_A6XX_CP_PROTECT(9), A6XX_PROTECT_RDONLY(0x50f, 0x0));
|
||||
gpu_write(gpu, REG_A6XX_CP_PROTECT(10), A6XX_PROTECT_RW(0x510, 0x0));
|
||||
gpu_write(gpu, REG_A6XX_CP_PROTECT(11),
|
||||
A6XX_PROTECT_RDONLY(0x0, 0x4f9));
|
||||
gpu_write(gpu, REG_A6XX_CP_PROTECT(12),
|
||||
A6XX_PROTECT_RDONLY(0x501, 0xa));
|
||||
gpu_write(gpu, REG_A6XX_CP_PROTECT(13),
|
||||
A6XX_PROTECT_RDONLY(0x511, 0x44));
|
||||
gpu_write(gpu, REG_A6XX_CP_PROTECT(14), A6XX_PROTECT_RW(0xe00, 0xe));
|
||||
gpu_write(gpu, REG_A6XX_CP_PROTECT(15), A6XX_PROTECT_RW(0x8e00, 0x0));
|
||||
gpu_write(gpu, REG_A6XX_CP_PROTECT(16), A6XX_PROTECT_RW(0x8e50, 0xf));
|
||||
gpu_write(gpu, REG_A6XX_CP_PROTECT(17), A6XX_PROTECT_RW(0xbe02, 0x0));
|
||||
gpu_write(gpu, REG_A6XX_CP_PROTECT(18),
|
||||
A6XX_PROTECT_RW(0xbe20, 0x11f3));
|
||||
gpu_write(gpu, REG_A6XX_CP_PROTECT(19), A6XX_PROTECT_RW(0x800, 0x82));
|
||||
gpu_write(gpu, REG_A6XX_CP_PROTECT(20), A6XX_PROTECT_RW(0x8a0, 0x8));
|
||||
gpu_write(gpu, REG_A6XX_CP_PROTECT(21), A6XX_PROTECT_RW(0x8ab, 0x19));
|
||||
gpu_write(gpu, REG_A6XX_CP_PROTECT(22), A6XX_PROTECT_RW(0x900, 0x4d));
|
||||
gpu_write(gpu, REG_A6XX_CP_PROTECT(23), A6XX_PROTECT_RW(0x98d, 0x76));
|
||||
gpu_write(gpu, REG_A6XX_CP_PROTECT(24),
|
||||
A6XX_PROTECT_RDONLY(0x980, 0x4));
|
||||
gpu_write(gpu, REG_A6XX_CP_PROTECT(25), A6XX_PROTECT_RW(0xa630, 0x0));
|
||||
a6xx_set_cp_protect(gpu);
|
||||
|
||||
/* Enable expanded apriv for targets that support it */
|
||||
if (gpu->hw_apriv) {
|
||||
@ -1211,7 +1284,7 @@ static int a6xx_pm_suspend(struct msm_gpu *gpu)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (adreno_gpu->base.hw_apriv || a6xx_gpu->has_whereami)
|
||||
if (a6xx_gpu->shadow_bo)
|
||||
for (i = 0; i < gpu->nr_rings; i++)
|
||||
a6xx_gpu->shadow[i] = 0;
|
||||
|
||||
|
@ -44,7 +44,7 @@ struct a6xx_gpu {
|
||||
* REG_CP_PROTECT_REG(n) - this will block both reads and writes for _len
|
||||
* registers starting at _reg.
|
||||
*/
|
||||
#define A6XX_PROTECT_RW(_reg, _len) \
|
||||
#define A6XX_PROTECT_NORDWR(_reg, _len) \
|
||||
((1 << 31) | \
|
||||
(((_len) & 0x3FFF) << 18) | ((_reg) & 0x3FFFF))
|
||||
|
||||
|
@ -432,6 +432,7 @@ static unsigned long dsi_pll_10nm_vco_recalc_rate(struct clk_hw *hw,
|
||||
pll_freq += div_u64(tmp64, multiplier);
|
||||
|
||||
vco_rate = pll_freq;
|
||||
pll_10nm->vco_current_rate = vco_rate;
|
||||
|
||||
DBG("DSI PLL%d returning vco rate = %lu, dec = %x, frac = %x",
|
||||
pll_10nm->phy->id, (unsigned long)vco_rate, dec, frac);
|
||||
|
@ -460,6 +460,7 @@ static unsigned long dsi_pll_7nm_vco_recalc_rate(struct clk_hw *hw,
|
||||
pll_freq += div_u64(tmp64, multiplier);
|
||||
|
||||
vco_rate = pll_freq;
|
||||
pll_7nm->vco_current_rate = vco_rate;
|
||||
|
||||
DBG("DSI PLL%d returning vco rate = %lu, dec = %x, frac = %x",
|
||||
pll_7nm->phy->id, (unsigned long)vco_rate, dec, frac);
|
||||
|
@ -1241,6 +1241,13 @@ static struct drm_gem_object *_msm_gem_new(struct drm_device *dev,
|
||||
|
||||
to_msm_bo(obj)->vram_node = &vma->node;
|
||||
|
||||
/* Call chain get_pages() -> update_inactive() tries to
|
||||
* access msm_obj->mm_list, but it is not initialized yet.
|
||||
* To avoid NULL pointer dereference error, initialize
|
||||
* mm_list to be empty.
|
||||
*/
|
||||
INIT_LIST_HEAD(&msm_obj->mm_list);
|
||||
|
||||
msm_gem_lock(obj);
|
||||
pages = get_pages(obj);
|
||||
msm_gem_unlock(obj);
|
||||
|
@ -286,7 +286,7 @@ int radeon_uvd_resume(struct radeon_device *rdev)
|
||||
if (rdev->uvd.vcpu_bo == NULL)
|
||||
return -EINVAL;
|
||||
|
||||
memcpy(rdev->uvd.cpu_addr, rdev->uvd_fw->data, rdev->uvd_fw->size);
|
||||
memcpy_toio((void __iomem *)rdev->uvd.cpu_addr, rdev->uvd_fw->data, rdev->uvd_fw->size);
|
||||
|
||||
size = radeon_bo_size(rdev->uvd.vcpu_bo);
|
||||
size -= rdev->uvd_fw->size;
|
||||
@ -294,7 +294,7 @@ int radeon_uvd_resume(struct radeon_device *rdev)
|
||||
ptr = rdev->uvd.cpu_addr;
|
||||
ptr += rdev->uvd_fw->size;
|
||||
|
||||
memset(ptr, 0, size);
|
||||
memset_io((void __iomem *)ptr, 0, size);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -209,7 +209,7 @@ static int sun8i_dw_hdmi_bind(struct device *dev, struct device *master,
|
||||
goto err_disable_clk_tmds;
|
||||
}
|
||||
|
||||
ret = sun8i_hdmi_phy_probe(hdmi, phy_node);
|
||||
ret = sun8i_hdmi_phy_get(hdmi, phy_node);
|
||||
of_node_put(phy_node);
|
||||
if (ret) {
|
||||
dev_err(dev, "Couldn't get the HDMI PHY\n");
|
||||
@ -242,7 +242,6 @@ static int sun8i_dw_hdmi_bind(struct device *dev, struct device *master,
|
||||
|
||||
cleanup_encoder:
|
||||
drm_encoder_cleanup(encoder);
|
||||
sun8i_hdmi_phy_remove(hdmi);
|
||||
err_disable_clk_tmds:
|
||||
clk_disable_unprepare(hdmi->clk_tmds);
|
||||
err_assert_ctrl_reset:
|
||||
@ -263,7 +262,6 @@ static void sun8i_dw_hdmi_unbind(struct device *dev, struct device *master,
|
||||
struct sun8i_dw_hdmi *hdmi = dev_get_drvdata(dev);
|
||||
|
||||
dw_hdmi_unbind(hdmi->hdmi);
|
||||
sun8i_hdmi_phy_remove(hdmi);
|
||||
clk_disable_unprepare(hdmi->clk_tmds);
|
||||
reset_control_assert(hdmi->rst_ctrl);
|
||||
gpiod_set_value(hdmi->ddc_en, 0);
|
||||
@ -320,7 +318,32 @@ static struct platform_driver sun8i_dw_hdmi_pltfm_driver = {
|
||||
.of_match_table = sun8i_dw_hdmi_dt_ids,
|
||||
},
|
||||
};
|
||||
module_platform_driver(sun8i_dw_hdmi_pltfm_driver);
|
||||
|
||||
static int __init sun8i_dw_hdmi_init(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = platform_driver_register(&sun8i_dw_hdmi_pltfm_driver);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = platform_driver_register(&sun8i_hdmi_phy_driver);
|
||||
if (ret) {
|
||||
platform_driver_unregister(&sun8i_dw_hdmi_pltfm_driver);
|
||||
return ret;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void __exit sun8i_dw_hdmi_exit(void)
|
||||
{
|
||||
platform_driver_unregister(&sun8i_dw_hdmi_pltfm_driver);
|
||||
platform_driver_unregister(&sun8i_hdmi_phy_driver);
|
||||
}
|
||||
|
||||
module_init(sun8i_dw_hdmi_init);
|
||||
module_exit(sun8i_dw_hdmi_exit);
|
||||
|
||||
MODULE_AUTHOR("Jernej Skrabec <jernej.skrabec@siol.net>");
|
||||
MODULE_DESCRIPTION("Allwinner DW HDMI bridge");
|
||||
|
@ -195,14 +195,15 @@ struct sun8i_dw_hdmi {
|
||||
struct gpio_desc *ddc_en;
|
||||
};
|
||||
|
||||
extern struct platform_driver sun8i_hdmi_phy_driver;
|
||||
|
||||
static inline struct sun8i_dw_hdmi *
|
||||
encoder_to_sun8i_dw_hdmi(struct drm_encoder *encoder)
|
||||
{
|
||||
return container_of(encoder, struct sun8i_dw_hdmi, encoder);
|
||||
}
|
||||
|
||||
int sun8i_hdmi_phy_probe(struct sun8i_dw_hdmi *hdmi, struct device_node *node);
|
||||
void sun8i_hdmi_phy_remove(struct sun8i_dw_hdmi *hdmi);
|
||||
int sun8i_hdmi_phy_get(struct sun8i_dw_hdmi *hdmi, struct device_node *node);
|
||||
|
||||
void sun8i_hdmi_phy_init(struct sun8i_hdmi_phy *phy);
|
||||
void sun8i_hdmi_phy_set_ops(struct sun8i_hdmi_phy *phy,
|
||||
|
@ -5,6 +5,7 @@
|
||||
|
||||
#include <linux/delay.h>
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/of_platform.h>
|
||||
|
||||
#include "sun8i_dw_hdmi.h"
|
||||
|
||||
@ -597,10 +598,30 @@ static const struct of_device_id sun8i_hdmi_phy_of_table[] = {
|
||||
{ /* sentinel */ }
|
||||
};
|
||||
|
||||
int sun8i_hdmi_phy_probe(struct sun8i_dw_hdmi *hdmi, struct device_node *node)
|
||||
int sun8i_hdmi_phy_get(struct sun8i_dw_hdmi *hdmi, struct device_node *node)
|
||||
{
|
||||
struct platform_device *pdev = of_find_device_by_node(node);
|
||||
struct sun8i_hdmi_phy *phy;
|
||||
|
||||
if (!pdev)
|
||||
return -EPROBE_DEFER;
|
||||
|
||||
phy = platform_get_drvdata(pdev);
|
||||
if (!phy)
|
||||
return -EPROBE_DEFER;
|
||||
|
||||
hdmi->phy = phy;
|
||||
|
||||
put_device(&pdev->dev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int sun8i_hdmi_phy_probe(struct platform_device *pdev)
|
||||
{
|
||||
const struct of_device_id *match;
|
||||
struct device *dev = hdmi->dev;
|
||||
struct device *dev = &pdev->dev;
|
||||
struct device_node *node = dev->of_node;
|
||||
struct sun8i_hdmi_phy *phy;
|
||||
struct resource res;
|
||||
void __iomem *regs;
|
||||
@ -704,7 +725,7 @@ int sun8i_hdmi_phy_probe(struct sun8i_dw_hdmi *hdmi, struct device_node *node)
|
||||
clk_prepare_enable(phy->clk_phy);
|
||||
}
|
||||
|
||||
hdmi->phy = phy;
|
||||
platform_set_drvdata(pdev, phy);
|
||||
|
||||
return 0;
|
||||
|
||||
@ -728,9 +749,9 @@ int sun8i_hdmi_phy_probe(struct sun8i_dw_hdmi *hdmi, struct device_node *node)
|
||||
return ret;
|
||||
}
|
||||
|
||||
void sun8i_hdmi_phy_remove(struct sun8i_dw_hdmi *hdmi)
|
||||
static int sun8i_hdmi_phy_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct sun8i_hdmi_phy *phy = hdmi->phy;
|
||||
struct sun8i_hdmi_phy *phy = platform_get_drvdata(pdev);
|
||||
|
||||
clk_disable_unprepare(phy->clk_mod);
|
||||
clk_disable_unprepare(phy->clk_bus);
|
||||
@ -744,4 +765,14 @@ void sun8i_hdmi_phy_remove(struct sun8i_dw_hdmi *hdmi)
|
||||
clk_put(phy->clk_pll1);
|
||||
clk_put(phy->clk_mod);
|
||||
clk_put(phy->clk_bus);
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct platform_driver sun8i_hdmi_phy_driver = {
|
||||
.probe = sun8i_hdmi_phy_probe,
|
||||
.remove = sun8i_hdmi_phy_remove,
|
||||
.driver = {
|
||||
.name = "sun8i-hdmi-phy",
|
||||
.of_match_table = sun8i_hdmi_phy_of_table,
|
||||
},
|
||||
};
|
||||
|
@ -1172,7 +1172,10 @@ int ttm_bo_swapout(struct ttm_buffer_object *bo, struct ttm_operation_ctx *ctx,
|
||||
if (!ttm_bo_evict_swapout_allowable(bo, ctx, &locked, NULL))
|
||||
return -EBUSY;
|
||||
|
||||
if (!ttm_bo_get_unless_zero(bo)) {
|
||||
if (!bo->ttm || !ttm_tt_is_populated(bo->ttm) ||
|
||||
bo->ttm->page_flags & TTM_PAGE_FLAG_SG ||
|
||||
bo->ttm->page_flags & TTM_PAGE_FLAG_SWAPPED ||
|
||||
!ttm_bo_get_unless_zero(bo)) {
|
||||
if (locked)
|
||||
dma_resv_unlock(bo->base.resv);
|
||||
return -EBUSY;
|
||||
|
@ -143,14 +143,8 @@ int ttm_device_swapout(struct ttm_device *bdev, struct ttm_operation_ctx *ctx,
|
||||
|
||||
for (j = 0; j < TTM_MAX_BO_PRIORITY; ++j) {
|
||||
list_for_each_entry(bo, &man->lru[j], lru) {
|
||||
uint32_t num_pages;
|
||||
uint32_t num_pages = PFN_UP(bo->base.size);
|
||||
|
||||
if (!bo->ttm || !ttm_tt_is_populated(bo->ttm) ||
|
||||
bo->ttm->page_flags & TTM_PAGE_FLAG_SG ||
|
||||
bo->ttm->page_flags & TTM_PAGE_FLAG_SWAPPED)
|
||||
continue;
|
||||
|
||||
num_pages = bo->ttm->num_pages;
|
||||
ret = ttm_bo_swapout(bo, ctx, gfp_flags);
|
||||
/* ttm_bo_swapout has dropped the lru_lock */
|
||||
if (!ret)
|
||||
|
@ -372,7 +372,7 @@ static void vc4_atomic_commit_tail(struct drm_atomic_state *state)
|
||||
if (!old_hvs_state->fifo_state[channel].in_use)
|
||||
continue;
|
||||
|
||||
ret = drm_crtc_commit_wait(old_hvs_state->fifo_state[i].pending_commit);
|
||||
ret = drm_crtc_commit_wait(old_hvs_state->fifo_state[channel].pending_commit);
|
||||
if (ret)
|
||||
drm_err(dev, "Timed out waiting for commit\n");
|
||||
}
|
||||
|
@ -771,6 +771,16 @@ static int corsairpsu_raw_event(struct hid_device *hdev, struct hid_report *repo
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
static int corsairpsu_resume(struct hid_device *hdev)
|
||||
{
|
||||
struct corsairpsu_data *priv = hid_get_drvdata(hdev);
|
||||
|
||||
/* some PSUs turn off the microcontroller during standby, so a reinit is required */
|
||||
return corsairpsu_init(priv);
|
||||
}
|
||||
#endif
|
||||
|
||||
static const struct hid_device_id corsairpsu_idtable[] = {
|
||||
{ HID_USB_DEVICE(0x1b1c, 0x1c03) }, /* Corsair HX550i */
|
||||
{ HID_USB_DEVICE(0x1b1c, 0x1c04) }, /* Corsair HX650i */
|
||||
@ -793,6 +803,10 @@ static struct hid_driver corsairpsu_driver = {
|
||||
.probe = corsairpsu_probe,
|
||||
.remove = corsairpsu_remove,
|
||||
.raw_event = corsairpsu_raw_event,
|
||||
#ifdef CONFIG_PM
|
||||
.resume = corsairpsu_resume,
|
||||
.reset_resume = corsairpsu_resume,
|
||||
#endif
|
||||
};
|
||||
module_hid_driver(corsairpsu_driver);
|
||||
|
||||
|
@ -99,6 +99,15 @@ scpi_show_sensor(struct device *dev, struct device_attribute *attr, char *buf)
|
||||
|
||||
scpi_scale_reading(&value, sensor);
|
||||
|
||||
/*
|
||||
* Temperature sensor values are treated as signed values based on
|
||||
* observation even though that is not explicitly specified, and
|
||||
* because an unsigned u64 temperature does not really make practical
|
||||
* sense especially when the temperature is below zero degrees Celsius.
|
||||
*/
|
||||
if (sensor->info.class == TEMPERATURE)
|
||||
return sprintf(buf, "%lld\n", (s64)value);
|
||||
|
||||
return sprintf(buf, "%llu\n", value);
|
||||
}
|
||||
|
||||
|
@ -99,11 +99,14 @@
|
||||
#define POWER_ENABLE 0x19
|
||||
#define TPS23861_NUM_PORTS 4
|
||||
|
||||
#define TPS23861_GENERAL_MASK_1 0x17
|
||||
#define TPS23861_CURRENT_SHUNT_MASK BIT(0)
|
||||
|
||||
#define TEMPERATURE_LSB 652 /* 0.652 degrees Celsius */
|
||||
#define VOLTAGE_LSB 3662 /* 3.662 mV */
|
||||
#define SHUNT_RESISTOR_DEFAULT 255000 /* 255 mOhm */
|
||||
#define CURRENT_LSB_255 62260 /* 62.260 uA */
|
||||
#define CURRENT_LSB_250 61039 /* 61.039 uA */
|
||||
#define CURRENT_LSB_250 62260 /* 62.260 uA */
|
||||
#define CURRENT_LSB_255 61039 /* 61.039 uA */
|
||||
#define RESISTANCE_LSB 110966 /* 11.0966 Ohm*/
|
||||
#define RESISTANCE_LSB_LOW 157216 /* 15.7216 Ohm*/
|
||||
|
||||
@ -117,6 +120,7 @@ struct tps23861_data {
|
||||
static struct regmap_config tps23861_regmap_config = {
|
||||
.reg_bits = 8,
|
||||
.val_bits = 8,
|
||||
.max_register = 0x6f,
|
||||
};
|
||||
|
||||
static int tps23861_read_temp(struct tps23861_data *data, long *val)
|
||||
@ -560,6 +564,15 @@ static int tps23861_probe(struct i2c_client *client)
|
||||
else
|
||||
data->shunt_resistor = SHUNT_RESISTOR_DEFAULT;
|
||||
|
||||
if (data->shunt_resistor == SHUNT_RESISTOR_DEFAULT)
|
||||
regmap_clear_bits(data->regmap,
|
||||
TPS23861_GENERAL_MASK_1,
|
||||
TPS23861_CURRENT_SHUNT_MASK);
|
||||
else
|
||||
regmap_set_bits(data->regmap,
|
||||
TPS23861_GENERAL_MASK_1,
|
||||
TPS23861_CURRENT_SHUNT_MASK);
|
||||
|
||||
hwmon_dev = devm_hwmon_device_register_with_info(dev, client->name,
|
||||
data, &tps23861_chip_info,
|
||||
NULL);
|
||||
|
@ -3248,6 +3248,11 @@ static int ib_uverbs_ex_create_flow(struct uverbs_attr_bundle *attrs)
|
||||
goto err_free_attr;
|
||||
}
|
||||
|
||||
if (!rdma_is_port_valid(uobj->context->device, cmd.flow_attr.port)) {
|
||||
err = -EINVAL;
|
||||
goto err_uobj;
|
||||
}
|
||||
|
||||
qp = uobj_get_obj_read(qp, UVERBS_OBJECT_QP, cmd.qp_handle, attrs);
|
||||
if (!qp) {
|
||||
err = -EINVAL;
|
||||
|
@ -581,12 +581,9 @@ static int mlx4_ib_query_device(struct ib_device *ibdev,
|
||||
props->cq_caps.max_cq_moderation_count = MLX4_MAX_CQ_COUNT;
|
||||
props->cq_caps.max_cq_moderation_period = MLX4_MAX_CQ_PERIOD;
|
||||
|
||||
if (!mlx4_is_slave(dev->dev))
|
||||
err = mlx4_get_internal_clock_params(dev->dev, &clock_params);
|
||||
|
||||
if (uhw->outlen >= resp.response_length + sizeof(resp.hca_core_clock_offset)) {
|
||||
resp.response_length += sizeof(resp.hca_core_clock_offset);
|
||||
if (!err && !mlx4_is_slave(dev->dev)) {
|
||||
if (!mlx4_get_internal_clock_params(dev->dev, &clock_params)) {
|
||||
resp.comp_mask |= MLX4_IB_QUERY_DEV_RESP_MASK_CORE_CLOCK_OFFSET;
|
||||
resp.hca_core_clock_offset = clock_params.offset % PAGE_SIZE;
|
||||
}
|
||||
@ -1702,9 +1699,6 @@ static struct ib_flow *mlx4_ib_create_flow(struct ib_qp *qp,
|
||||
struct mlx4_dev *dev = (to_mdev(qp->device))->dev;
|
||||
int is_bonded = mlx4_is_bonded(dev);
|
||||
|
||||
if (!rdma_is_port_valid(qp->device, flow_attr->port))
|
||||
return ERR_PTR(-EINVAL);
|
||||
|
||||
if (flow_attr->flags & ~IB_FLOW_ATTR_FLAGS_DONT_TRAP)
|
||||
return ERR_PTR(-EOPNOTSUPP);
|
||||
|
||||
|
@ -849,15 +849,14 @@ static void destroy_cq_user(struct mlx5_ib_cq *cq, struct ib_udata *udata)
|
||||
ib_umem_release(cq->buf.umem);
|
||||
}
|
||||
|
||||
static void init_cq_frag_buf(struct mlx5_ib_cq *cq,
|
||||
struct mlx5_ib_cq_buf *buf)
|
||||
static void init_cq_frag_buf(struct mlx5_ib_cq_buf *buf)
|
||||
{
|
||||
int i;
|
||||
void *cqe;
|
||||
struct mlx5_cqe64 *cqe64;
|
||||
|
||||
for (i = 0; i < buf->nent; i++) {
|
||||
cqe = get_cqe(cq, i);
|
||||
cqe = mlx5_frag_buf_get_wqe(&buf->fbc, i);
|
||||
cqe64 = buf->cqe_size == 64 ? cqe : cqe + 64;
|
||||
cqe64->op_own = MLX5_CQE_INVALID << 4;
|
||||
}
|
||||
@ -883,7 +882,7 @@ static int create_cq_kernel(struct mlx5_ib_dev *dev, struct mlx5_ib_cq *cq,
|
||||
if (err)
|
||||
goto err_db;
|
||||
|
||||
init_cq_frag_buf(cq, &cq->buf);
|
||||
init_cq_frag_buf(&cq->buf);
|
||||
|
||||
*inlen = MLX5_ST_SZ_BYTES(create_cq_in) +
|
||||
MLX5_FLD_SZ_BYTES(create_cq_in, pas[0]) *
|
||||
@ -1184,7 +1183,7 @@ static int resize_kernel(struct mlx5_ib_dev *dev, struct mlx5_ib_cq *cq,
|
||||
if (err)
|
||||
goto ex;
|
||||
|
||||
init_cq_frag_buf(cq, cq->resize_buf);
|
||||
init_cq_frag_buf(cq->resize_buf);
|
||||
|
||||
return 0;
|
||||
|
||||
|
@ -41,6 +41,7 @@ struct mlx5_ib_user_db_page {
|
||||
struct ib_umem *umem;
|
||||
unsigned long user_virt;
|
||||
int refcnt;
|
||||
struct mm_struct *mm;
|
||||
};
|
||||
|
||||
int mlx5_ib_db_map_user(struct mlx5_ib_ucontext *context,
|
||||
@ -53,7 +54,8 @@ int mlx5_ib_db_map_user(struct mlx5_ib_ucontext *context,
|
||||
mutex_lock(&context->db_page_mutex);
|
||||
|
||||
list_for_each_entry(page, &context->db_page_list, list)
|
||||
if (page->user_virt == (virt & PAGE_MASK))
|
||||
if ((current->mm == page->mm) &&
|
||||
(page->user_virt == (virt & PAGE_MASK)))
|
||||
goto found;
|
||||
|
||||
page = kmalloc(sizeof(*page), GFP_KERNEL);
|
||||
@ -71,6 +73,8 @@ int mlx5_ib_db_map_user(struct mlx5_ib_ucontext *context,
|
||||
kfree(page);
|
||||
goto out;
|
||||
}
|
||||
mmgrab(current->mm);
|
||||
page->mm = current->mm;
|
||||
|
||||
list_add(&page->list, &context->db_page_list);
|
||||
|
||||
@ -91,6 +95,7 @@ void mlx5_ib_db_unmap_user(struct mlx5_ib_ucontext *context, struct mlx5_db *db)
|
||||
|
||||
if (!--db->u.user_page->refcnt) {
|
||||
list_del(&db->u.user_page->list);
|
||||
mmdrop(db->u.user_page->mm);
|
||||
ib_umem_release(db->u.user_page->umem);
|
||||
kfree(db->u.user_page);
|
||||
}
|
||||
|
@ -1194,9 +1194,8 @@ static struct ib_flow *mlx5_ib_create_flow(struct ib_qp *qp,
|
||||
goto free_ucmd;
|
||||
}
|
||||
|
||||
if (flow_attr->port > dev->num_ports ||
|
||||
(flow_attr->flags &
|
||||
~(IB_FLOW_ATTR_FLAGS_DONT_TRAP | IB_FLOW_ATTR_FLAGS_EGRESS))) {
|
||||
if (flow_attr->flags &
|
||||
~(IB_FLOW_ATTR_FLAGS_DONT_TRAP | IB_FLOW_ATTR_FLAGS_EGRESS)) {
|
||||
err = -EINVAL;
|
||||
goto free_ucmd;
|
||||
}
|
||||
@ -2134,6 +2133,12 @@ static int UVERBS_HANDLER(MLX5_IB_METHOD_FLOW_MATCHER_CREATE)(
|
||||
if (err)
|
||||
goto end;
|
||||
|
||||
if (obj->ns_type == MLX5_FLOW_NAMESPACE_FDB &&
|
||||
mlx5_eswitch_mode(dev->mdev) != MLX5_ESWITCH_OFFLOADS) {
|
||||
err = -EINVAL;
|
||||
goto end;
|
||||
}
|
||||
|
||||
uobj->object = obj;
|
||||
obj->mdev = dev->mdev;
|
||||
atomic_set(&obj->usecnt, 0);
|
||||
|
@ -1940,8 +1940,8 @@ int mlx5_ib_dereg_mr(struct ib_mr *ibmr, struct ib_udata *udata)
|
||||
mlx5r_deref_wait_odp_mkey(&mr->mmkey);
|
||||
|
||||
if (ibmr->type == IB_MR_TYPE_INTEGRITY) {
|
||||
xa_cmpxchg(&dev->sig_mrs, mlx5_base_mkey(mr->mmkey.key), ibmr,
|
||||
NULL, GFP_KERNEL);
|
||||
xa_cmpxchg(&dev->sig_mrs, mlx5_base_mkey(mr->mmkey.key),
|
||||
mr->sig, NULL, GFP_KERNEL);
|
||||
|
||||
if (mr->mtt_mr) {
|
||||
rc = mlx5_ib_dereg_mr(&mr->mtt_mr->ibmr, NULL);
|
||||
|
@ -163,6 +163,7 @@ static size_t ipoib_get_size(const struct net_device *dev)
|
||||
|
||||
static struct rtnl_link_ops ipoib_link_ops __read_mostly = {
|
||||
.kind = "ipoib",
|
||||
.netns_refund = true,
|
||||
.maxtype = IFLA_IPOIB_MAX,
|
||||
.policy = ipoib_policy,
|
||||
.priv_size = sizeof(struct ipoib_dev_priv),
|
||||
|
@ -364,7 +364,6 @@ struct cached_dev {
|
||||
|
||||
/* The rest of this all shows up in sysfs */
|
||||
unsigned int sequential_cutoff;
|
||||
unsigned int readahead;
|
||||
|
||||
unsigned int io_disable:1;
|
||||
unsigned int verify:1;
|
||||
|
@ -880,9 +880,9 @@ static int cached_dev_cache_miss(struct btree *b, struct search *s,
|
||||
struct bio *bio, unsigned int sectors)
|
||||
{
|
||||
int ret = MAP_CONTINUE;
|
||||
unsigned int reada = 0;
|
||||
struct cached_dev *dc = container_of(s->d, struct cached_dev, disk);
|
||||
struct bio *miss, *cache_bio;
|
||||
unsigned int size_limit;
|
||||
|
||||
s->cache_missed = 1;
|
||||
|
||||
@ -892,14 +892,10 @@ static int cached_dev_cache_miss(struct btree *b, struct search *s,
|
||||
goto out_submit;
|
||||
}
|
||||
|
||||
if (!(bio->bi_opf & REQ_RAHEAD) &&
|
||||
!(bio->bi_opf & (REQ_META|REQ_PRIO)) &&
|
||||
s->iop.c->gc_stats.in_use < CUTOFF_CACHE_READA)
|
||||
reada = min_t(sector_t, dc->readahead >> 9,
|
||||
get_capacity(bio->bi_bdev->bd_disk) -
|
||||
bio_end_sector(bio));
|
||||
|
||||
s->insert_bio_sectors = min(sectors, bio_sectors(bio) + reada);
|
||||
/* Limitation for valid replace key size and cache_bio bvecs number */
|
||||
size_limit = min_t(unsigned int, BIO_MAX_VECS * PAGE_SECTORS,
|
||||
(1 << KEY_SIZE_BITS) - 1);
|
||||
s->insert_bio_sectors = min3(size_limit, sectors, bio_sectors(bio));
|
||||
|
||||
s->iop.replace_key = KEY(s->iop.inode,
|
||||
bio->bi_iter.bi_sector + s->insert_bio_sectors,
|
||||
@ -911,7 +907,8 @@ static int cached_dev_cache_miss(struct btree *b, struct search *s,
|
||||
|
||||
s->iop.replace = true;
|
||||
|
||||
miss = bio_next_split(bio, sectors, GFP_NOIO, &s->d->bio_split);
|
||||
miss = bio_next_split(bio, s->insert_bio_sectors, GFP_NOIO,
|
||||
&s->d->bio_split);
|
||||
|
||||
/* btree_search_recurse()'s btree iterator is no good anymore */
|
||||
ret = miss == bio ? MAP_DONE : -EINTR;
|
||||
@ -933,9 +930,6 @@ static int cached_dev_cache_miss(struct btree *b, struct search *s,
|
||||
if (bch_bio_alloc_pages(cache_bio, __GFP_NOWARN|GFP_NOIO))
|
||||
goto out_put;
|
||||
|
||||
if (reada)
|
||||
bch_mark_cache_readahead(s->iop.c, s->d);
|
||||
|
||||
s->cache_miss = miss;
|
||||
s->iop.bio = cache_bio;
|
||||
bio_get(cache_bio);
|
||||
|
@ -46,7 +46,6 @@ read_attribute(cache_misses);
|
||||
read_attribute(cache_bypass_hits);
|
||||
read_attribute(cache_bypass_misses);
|
||||
read_attribute(cache_hit_ratio);
|
||||
read_attribute(cache_readaheads);
|
||||
read_attribute(cache_miss_collisions);
|
||||
read_attribute(bypassed);
|
||||
|
||||
@ -64,7 +63,6 @@ SHOW(bch_stats)
|
||||
DIV_SAFE(var(cache_hits) * 100,
|
||||
var(cache_hits) + var(cache_misses)));
|
||||
|
||||
var_print(cache_readaheads);
|
||||
var_print(cache_miss_collisions);
|
||||
sysfs_hprint(bypassed, var(sectors_bypassed) << 9);
|
||||
#undef var
|
||||
@ -86,7 +84,6 @@ static struct attribute *bch_stats_files[] = {
|
||||
&sysfs_cache_bypass_hits,
|
||||
&sysfs_cache_bypass_misses,
|
||||
&sysfs_cache_hit_ratio,
|
||||
&sysfs_cache_readaheads,
|
||||
&sysfs_cache_miss_collisions,
|
||||
&sysfs_bypassed,
|
||||
NULL
|
||||
@ -113,7 +110,6 @@ void bch_cache_accounting_clear(struct cache_accounting *acc)
|
||||
acc->total.cache_misses = 0;
|
||||
acc->total.cache_bypass_hits = 0;
|
||||
acc->total.cache_bypass_misses = 0;
|
||||
acc->total.cache_readaheads = 0;
|
||||
acc->total.cache_miss_collisions = 0;
|
||||
acc->total.sectors_bypassed = 0;
|
||||
}
|
||||
@ -145,7 +141,6 @@ static void scale_stats(struct cache_stats *stats, unsigned long rescale_at)
|
||||
scale_stat(&stats->cache_misses);
|
||||
scale_stat(&stats->cache_bypass_hits);
|
||||
scale_stat(&stats->cache_bypass_misses);
|
||||
scale_stat(&stats->cache_readaheads);
|
||||
scale_stat(&stats->cache_miss_collisions);
|
||||
scale_stat(&stats->sectors_bypassed);
|
||||
}
|
||||
@ -168,7 +163,6 @@ static void scale_accounting(struct timer_list *t)
|
||||
move_stat(cache_misses);
|
||||
move_stat(cache_bypass_hits);
|
||||
move_stat(cache_bypass_misses);
|
||||
move_stat(cache_readaheads);
|
||||
move_stat(cache_miss_collisions);
|
||||
move_stat(sectors_bypassed);
|
||||
|
||||
@ -209,14 +203,6 @@ void bch_mark_cache_accounting(struct cache_set *c, struct bcache_device *d,
|
||||
mark_cache_stats(&c->accounting.collector, hit, bypass);
|
||||
}
|
||||
|
||||
void bch_mark_cache_readahead(struct cache_set *c, struct bcache_device *d)
|
||||
{
|
||||
struct cached_dev *dc = container_of(d, struct cached_dev, disk);
|
||||
|
||||
atomic_inc(&dc->accounting.collector.cache_readaheads);
|
||||
atomic_inc(&c->accounting.collector.cache_readaheads);
|
||||
}
|
||||
|
||||
void bch_mark_cache_miss_collision(struct cache_set *c, struct bcache_device *d)
|
||||
{
|
||||
struct cached_dev *dc = container_of(d, struct cached_dev, disk);
|
||||
|
@ -7,7 +7,6 @@ struct cache_stat_collector {
|
||||
atomic_t cache_misses;
|
||||
atomic_t cache_bypass_hits;
|
||||
atomic_t cache_bypass_misses;
|
||||
atomic_t cache_readaheads;
|
||||
atomic_t cache_miss_collisions;
|
||||
atomic_t sectors_bypassed;
|
||||
};
|
||||
|
@ -137,7 +137,6 @@ rw_attribute(io_disable);
|
||||
rw_attribute(discard);
|
||||
rw_attribute(running);
|
||||
rw_attribute(label);
|
||||
rw_attribute(readahead);
|
||||
rw_attribute(errors);
|
||||
rw_attribute(io_error_limit);
|
||||
rw_attribute(io_error_halflife);
|
||||
@ -260,7 +259,6 @@ SHOW(__bch_cached_dev)
|
||||
var_printf(partial_stripes_expensive, "%u");
|
||||
|
||||
var_hprint(sequential_cutoff);
|
||||
var_hprint(readahead);
|
||||
|
||||
sysfs_print(running, atomic_read(&dc->running));
|
||||
sysfs_print(state, states[BDEV_STATE(&dc->sb)]);
|
||||
@ -365,7 +363,6 @@ STORE(__cached_dev)
|
||||
sysfs_strtoul_clamp(sequential_cutoff,
|
||||
dc->sequential_cutoff,
|
||||
0, UINT_MAX);
|
||||
d_strtoi_h(readahead);
|
||||
|
||||
if (attr == &sysfs_clear_stats)
|
||||
bch_cache_accounting_clear(&dc->accounting);
|
||||
@ -538,7 +535,6 @@ static struct attribute *bch_cached_dev_files[] = {
|
||||
&sysfs_running,
|
||||
&sysfs_state,
|
||||
&sysfs_label,
|
||||
&sysfs_readahead,
|
||||
#ifdef CONFIG_BCACHE_DEBUG
|
||||
&sysfs_verify,
|
||||
&sysfs_bypass_torture_test,
|
||||
|
@ -468,6 +468,7 @@ static void rtl8411_init_common_params(struct rtsx_pcr *pcr)
|
||||
pcr->sd30_drive_sel_1v8 = DRIVER_TYPE_B;
|
||||
pcr->sd30_drive_sel_3v3 = DRIVER_TYPE_D;
|
||||
pcr->aspm_en = ASPM_L1_EN;
|
||||
pcr->aspm_mode = ASPM_MODE_CFG;
|
||||
pcr->tx_initial_phase = SET_CLOCK_PHASE(23, 7, 14);
|
||||
pcr->rx_initial_phase = SET_CLOCK_PHASE(4, 3, 10);
|
||||
pcr->ic_version = rtl8411_get_ic_version(pcr);
|
||||
|
@ -255,6 +255,7 @@ void rts5209_init_params(struct rtsx_pcr *pcr)
|
||||
pcr->sd30_drive_sel_1v8 = DRIVER_TYPE_B;
|
||||
pcr->sd30_drive_sel_3v3 = DRIVER_TYPE_D;
|
||||
pcr->aspm_en = ASPM_L1_EN;
|
||||
pcr->aspm_mode = ASPM_MODE_CFG;
|
||||
pcr->tx_initial_phase = SET_CLOCK_PHASE(27, 27, 16);
|
||||
pcr->rx_initial_phase = SET_CLOCK_PHASE(24, 6, 5);
|
||||
|
||||
|
@ -358,6 +358,7 @@ void rts5227_init_params(struct rtsx_pcr *pcr)
|
||||
pcr->sd30_drive_sel_1v8 = CFG_DRIVER_TYPE_B;
|
||||
pcr->sd30_drive_sel_3v3 = CFG_DRIVER_TYPE_B;
|
||||
pcr->aspm_en = ASPM_L1_EN;
|
||||
pcr->aspm_mode = ASPM_MODE_CFG;
|
||||
pcr->tx_initial_phase = SET_CLOCK_PHASE(27, 27, 15);
|
||||
pcr->rx_initial_phase = SET_CLOCK_PHASE(30, 7, 7);
|
||||
|
||||
@ -483,6 +484,7 @@ void rts522a_init_params(struct rtsx_pcr *pcr)
|
||||
|
||||
rts5227_init_params(pcr);
|
||||
pcr->ops = &rts522a_pcr_ops;
|
||||
pcr->aspm_mode = ASPM_MODE_REG;
|
||||
pcr->tx_initial_phase = SET_CLOCK_PHASE(20, 20, 11);
|
||||
pcr->reg_pm_ctrl3 = RTS522A_PM_CTRL3;
|
||||
|
||||
|
@ -718,6 +718,7 @@ void rts5228_init_params(struct rtsx_pcr *pcr)
|
||||
pcr->sd30_drive_sel_1v8 = CFG_DRIVER_TYPE_B;
|
||||
pcr->sd30_drive_sel_3v3 = CFG_DRIVER_TYPE_B;
|
||||
pcr->aspm_en = ASPM_L1_EN;
|
||||
pcr->aspm_mode = ASPM_MODE_REG;
|
||||
pcr->tx_initial_phase = SET_CLOCK_PHASE(28, 27, 11);
|
||||
pcr->rx_initial_phase = SET_CLOCK_PHASE(24, 6, 5);
|
||||
|
||||
|
@ -246,6 +246,7 @@ void rts5229_init_params(struct rtsx_pcr *pcr)
|
||||
pcr->sd30_drive_sel_1v8 = DRIVER_TYPE_B;
|
||||
pcr->sd30_drive_sel_3v3 = DRIVER_TYPE_D;
|
||||
pcr->aspm_en = ASPM_L1_EN;
|
||||
pcr->aspm_mode = ASPM_MODE_CFG;
|
||||
pcr->tx_initial_phase = SET_CLOCK_PHASE(27, 27, 15);
|
||||
pcr->rx_initial_phase = SET_CLOCK_PHASE(30, 6, 6);
|
||||
|
||||
|
@ -566,6 +566,7 @@ void rts5249_init_params(struct rtsx_pcr *pcr)
|
||||
pcr->sd30_drive_sel_1v8 = CFG_DRIVER_TYPE_B;
|
||||
pcr->sd30_drive_sel_3v3 = CFG_DRIVER_TYPE_B;
|
||||
pcr->aspm_en = ASPM_L1_EN;
|
||||
pcr->aspm_mode = ASPM_MODE_CFG;
|
||||
pcr->tx_initial_phase = SET_CLOCK_PHASE(1, 29, 16);
|
||||
pcr->rx_initial_phase = SET_CLOCK_PHASE(24, 6, 5);
|
||||
|
||||
@ -729,6 +730,7 @@ static const struct pcr_ops rts524a_pcr_ops = {
|
||||
void rts524a_init_params(struct rtsx_pcr *pcr)
|
||||
{
|
||||
rts5249_init_params(pcr);
|
||||
pcr->aspm_mode = ASPM_MODE_REG;
|
||||
pcr->tx_initial_phase = SET_CLOCK_PHASE(27, 29, 11);
|
||||
pcr->option.ltr_l1off_sspwrgate = LTR_L1OFF_SSPWRGATE_5250_DEF;
|
||||
pcr->option.ltr_l1off_snooze_sspwrgate =
|
||||
@ -845,6 +847,7 @@ static const struct pcr_ops rts525a_pcr_ops = {
|
||||
void rts525a_init_params(struct rtsx_pcr *pcr)
|
||||
{
|
||||
rts5249_init_params(pcr);
|
||||
pcr->aspm_mode = ASPM_MODE_REG;
|
||||
pcr->tx_initial_phase = SET_CLOCK_PHASE(25, 29, 11);
|
||||
pcr->option.ltr_l1off_sspwrgate = LTR_L1OFF_SSPWRGATE_5250_DEF;
|
||||
pcr->option.ltr_l1off_snooze_sspwrgate =
|
||||
|
@ -628,6 +628,7 @@ void rts5260_init_params(struct rtsx_pcr *pcr)
|
||||
pcr->sd30_drive_sel_1v8 = CFG_DRIVER_TYPE_B;
|
||||
pcr->sd30_drive_sel_3v3 = CFG_DRIVER_TYPE_B;
|
||||
pcr->aspm_en = ASPM_L1_EN;
|
||||
pcr->aspm_mode = ASPM_MODE_REG;
|
||||
pcr->tx_initial_phase = SET_CLOCK_PHASE(27, 29, 11);
|
||||
pcr->rx_initial_phase = SET_CLOCK_PHASE(24, 6, 5);
|
||||
|
||||
|
@ -783,6 +783,7 @@ void rts5261_init_params(struct rtsx_pcr *pcr)
|
||||
pcr->sd30_drive_sel_1v8 = 0x00;
|
||||
pcr->sd30_drive_sel_3v3 = 0x00;
|
||||
pcr->aspm_en = ASPM_L1_EN;
|
||||
pcr->aspm_mode = ASPM_MODE_REG;
|
||||
pcr->tx_initial_phase = SET_CLOCK_PHASE(27, 27, 11);
|
||||
pcr->rx_initial_phase = SET_CLOCK_PHASE(24, 6, 5);
|
||||
|
||||
|
@ -85,12 +85,18 @@ static void rtsx_comm_set_aspm(struct rtsx_pcr *pcr, bool enable)
|
||||
if (pcr->aspm_enabled == enable)
|
||||
return;
|
||||
|
||||
if (pcr->aspm_mode == ASPM_MODE_CFG) {
|
||||
pcie_capability_clear_and_set_word(pcr->pci, PCI_EXP_LNKCTL,
|
||||
PCI_EXP_LNKCTL_ASPMC,
|
||||
enable ? pcr->aspm_en : 0);
|
||||
} else if (pcr->aspm_mode == ASPM_MODE_REG) {
|
||||
if (pcr->aspm_en & 0x02)
|
||||
rtsx_pci_write_register(pcr, ASPM_FORCE_CTL, FORCE_ASPM_CTL0 |
|
||||
FORCE_ASPM_CTL1, enable ? 0 : FORCE_ASPM_CTL0 | FORCE_ASPM_CTL1);
|
||||
else
|
||||
rtsx_pci_write_register(pcr, ASPM_FORCE_CTL, FORCE_ASPM_CTL0 |
|
||||
FORCE_ASPM_CTL1, FORCE_ASPM_CTL0 | FORCE_ASPM_CTL1);
|
||||
}
|
||||
|
||||
if (!enable && (pcr->aspm_en & 0x02))
|
||||
mdelay(10);
|
||||
@ -1394,6 +1400,7 @@ static int rtsx_pci_init_hw(struct rtsx_pcr *pcr)
|
||||
return err;
|
||||
}
|
||||
|
||||
if (pcr->aspm_mode == ASPM_MODE_REG)
|
||||
rtsx_pci_write_register(pcr, ASPM_FORCE_CTL, 0x30, 0x30);
|
||||
|
||||
/* No CD interrupt if probing driver with card inserted.
|
||||
@ -1410,6 +1417,8 @@ static int rtsx_pci_init_hw(struct rtsx_pcr *pcr)
|
||||
static int rtsx_pci_init_chip(struct rtsx_pcr *pcr)
|
||||
{
|
||||
int err;
|
||||
u16 cfg_val;
|
||||
u8 val;
|
||||
|
||||
spin_lock_init(&pcr->lock);
|
||||
mutex_init(&pcr->pcr_mutex);
|
||||
@ -1477,6 +1486,21 @@ static int rtsx_pci_init_chip(struct rtsx_pcr *pcr)
|
||||
if (!pcr->slots)
|
||||
return -ENOMEM;
|
||||
|
||||
if (pcr->aspm_mode == ASPM_MODE_CFG) {
|
||||
pcie_capability_read_word(pcr->pci, PCI_EXP_LNKCTL, &cfg_val);
|
||||
if (cfg_val & PCI_EXP_LNKCTL_ASPM_L1)
|
||||
pcr->aspm_enabled = true;
|
||||
else
|
||||
pcr->aspm_enabled = false;
|
||||
|
||||
} else if (pcr->aspm_mode == ASPM_MODE_REG) {
|
||||
rtsx_pci_read_register(pcr, ASPM_FORCE_CTL, &val);
|
||||
if (val & FORCE_ASPM_CTL0 && val & FORCE_ASPM_CTL1)
|
||||
pcr->aspm_enabled = false;
|
||||
else
|
||||
pcr->aspm_enabled = true;
|
||||
}
|
||||
|
||||
if (pcr->ops->fetch_vendor_settings)
|
||||
pcr->ops->fetch_vendor_settings(pcr);
|
||||
|
||||
@ -1506,7 +1530,6 @@ static int rtsx_pci_probe(struct pci_dev *pcidev,
|
||||
struct pcr_handle *handle;
|
||||
u32 base, len;
|
||||
int ret, i, bar = 0;
|
||||
u8 val;
|
||||
|
||||
dev_dbg(&(pcidev->dev),
|
||||
": Realtek PCI-E Card Reader found at %s [%04x:%04x] (rev %x)\n",
|
||||
@ -1572,11 +1595,6 @@ static int rtsx_pci_probe(struct pci_dev *pcidev,
|
||||
pcr->host_cmds_addr = pcr->rtsx_resv_buf_addr;
|
||||
pcr->host_sg_tbl_ptr = pcr->rtsx_resv_buf + HOST_CMDS_BUF_LEN;
|
||||
pcr->host_sg_tbl_addr = pcr->rtsx_resv_buf_addr + HOST_CMDS_BUF_LEN;
|
||||
rtsx_pci_read_register(pcr, ASPM_FORCE_CTL, &val);
|
||||
if (val & FORCE_ASPM_CTL0 && val & FORCE_ASPM_CTL1)
|
||||
pcr->aspm_enabled = false;
|
||||
else
|
||||
pcr->aspm_enabled = true;
|
||||
pcr->card_inserted = 0;
|
||||
pcr->card_removed = 0;
|
||||
INIT_DELAYED_WORK(&pcr->carddet_work, rtsx_pci_card_detect);
|
||||
|
@ -692,14 +692,19 @@ static int renesas_sdhi_execute_tuning(struct mmc_host *mmc, u32 opcode)
|
||||
|
||||
/* Issue CMD19 twice for each tap */
|
||||
for (i = 0; i < 2 * priv->tap_num; i++) {
|
||||
int cmd_error;
|
||||
|
||||
/* Set sampling clock position */
|
||||
sd_scc_write32(host, priv, SH_MOBILE_SDHI_SCC_TAPSET, i % priv->tap_num);
|
||||
|
||||
if (mmc_send_tuning(mmc, opcode, NULL) == 0)
|
||||
if (mmc_send_tuning(mmc, opcode, &cmd_error) == 0)
|
||||
set_bit(i, priv->taps);
|
||||
|
||||
if (sd_scc_read32(host, priv, SH_MOBILE_SDHI_SCC_SMPCMP) == 0)
|
||||
set_bit(i, priv->smpcmp);
|
||||
|
||||
if (cmd_error)
|
||||
mmc_abort_tuning(mmc, opcode);
|
||||
}
|
||||
|
||||
ret = renesas_sdhi_select_tuning(host);
|
||||
@ -939,7 +944,7 @@ static const struct soc_device_attribute sdhi_quirks_match[] = {
|
||||
{ .soc_id = "r8a7795", .revision = "ES3.*", .data = &sdhi_quirks_bad_taps2367 },
|
||||
{ .soc_id = "r8a7796", .revision = "ES1.[012]", .data = &sdhi_quirks_4tap_nohs400 },
|
||||
{ .soc_id = "r8a7796", .revision = "ES1.*", .data = &sdhi_quirks_r8a7796_es13 },
|
||||
{ .soc_id = "r8a7796", .revision = "ES3.*", .data = &sdhi_quirks_bad_taps1357 },
|
||||
{ .soc_id = "r8a77961", .data = &sdhi_quirks_bad_taps1357 },
|
||||
{ .soc_id = "r8a77965", .data = &sdhi_quirks_r8a77965 },
|
||||
{ .soc_id = "r8a77980", .data = &sdhi_quirks_nohs400 },
|
||||
{ .soc_id = "r8a77990", .data = &sdhi_quirks_r8a77990 },
|
||||
|
@ -823,6 +823,7 @@ int mlx4_QUERY_DEV_CAP(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap)
|
||||
#define QUERY_DEV_CAP_MAD_DEMUX_OFFSET 0xb0
|
||||
#define QUERY_DEV_CAP_DMFS_HIGH_RATE_QPN_BASE_OFFSET 0xa8
|
||||
#define QUERY_DEV_CAP_DMFS_HIGH_RATE_QPN_RANGE_OFFSET 0xac
|
||||
#define QUERY_DEV_CAP_MAP_CLOCK_TO_USER 0xc1
|
||||
#define QUERY_DEV_CAP_QP_RATE_LIMIT_NUM_OFFSET 0xcc
|
||||
#define QUERY_DEV_CAP_QP_RATE_LIMIT_MAX_OFFSET 0xd0
|
||||
#define QUERY_DEV_CAP_QP_RATE_LIMIT_MIN_OFFSET 0xd2
|
||||
@ -841,6 +842,8 @@ int mlx4_QUERY_DEV_CAP(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap)
|
||||
|
||||
if (mlx4_is_mfunc(dev))
|
||||
disable_unsupported_roce_caps(outbox);
|
||||
MLX4_GET(field, outbox, QUERY_DEV_CAP_MAP_CLOCK_TO_USER);
|
||||
dev_cap->map_clock_to_user = field & 0x80;
|
||||
MLX4_GET(field, outbox, QUERY_DEV_CAP_RSVD_QP_OFFSET);
|
||||
dev_cap->reserved_qps = 1 << (field & 0xf);
|
||||
MLX4_GET(field, outbox, QUERY_DEV_CAP_MAX_QP_OFFSET);
|
||||
|
@ -131,6 +131,7 @@ struct mlx4_dev_cap {
|
||||
u32 health_buffer_addrs;
|
||||
struct mlx4_port_cap port_cap[MLX4_MAX_PORTS + 1];
|
||||
bool wol_port[MLX4_MAX_PORTS + 1];
|
||||
bool map_clock_to_user;
|
||||
};
|
||||
|
||||
struct mlx4_func_cap {
|
||||
|
@ -498,6 +498,7 @@ static int mlx4_dev_cap(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap)
|
||||
}
|
||||
}
|
||||
|
||||
dev->caps.map_clock_to_user = dev_cap->map_clock_to_user;
|
||||
dev->caps.uar_page_size = PAGE_SIZE;
|
||||
dev->caps.num_uars = dev_cap->uar_size / PAGE_SIZE;
|
||||
dev->caps.local_ca_ack_delay = dev_cap->local_ca_ack_delay;
|
||||
@ -1948,6 +1949,11 @@ int mlx4_get_internal_clock_params(struct mlx4_dev *dev,
|
||||
if (mlx4_is_slave(dev))
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
if (!dev->caps.map_clock_to_user) {
|
||||
mlx4_dbg(dev, "Map clock to user is not supported.\n");
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
if (!params)
|
||||
return -EINVAL;
|
||||
|
||||
|
@ -684,6 +684,7 @@ static void xenvif_disconnect_queue(struct xenvif_queue *queue)
|
||||
{
|
||||
if (queue->task) {
|
||||
kthread_stop(queue->task);
|
||||
put_task_struct(queue->task);
|
||||
queue->task = NULL;
|
||||
}
|
||||
|
||||
@ -745,6 +746,11 @@ int xenvif_connect_data(struct xenvif_queue *queue,
|
||||
if (IS_ERR(task))
|
||||
goto kthread_err;
|
||||
queue->task = task;
|
||||
/*
|
||||
* Take a reference to the task in order to prevent it from being freed
|
||||
* if the thread function returns before kthread_stop is called.
|
||||
*/
|
||||
get_task_struct(task);
|
||||
|
||||
task = kthread_run(xenvif_dealloc_kthread, queue,
|
||||
"%s-dealloc", queue->name);
|
||||
|
@ -78,7 +78,7 @@ static inline u32 brcm_usb_readl(void __iomem *addr)
|
||||
* Other architectures (e.g., ARM) either do not support big endian, or
|
||||
* else leave I/O in little endian mode.
|
||||
*/
|
||||
if (IS_ENABLED(CONFIG_MIPS) && IS_ENABLED(__BIG_ENDIAN))
|
||||
if (IS_ENABLED(CONFIG_MIPS) && IS_ENABLED(CONFIG_CPU_BIG_ENDIAN))
|
||||
return __raw_readl(addr);
|
||||
else
|
||||
return readl_relaxed(addr);
|
||||
@ -87,7 +87,7 @@ static inline u32 brcm_usb_readl(void __iomem *addr)
|
||||
static inline void brcm_usb_writel(u32 val, void __iomem *addr)
|
||||
{
|
||||
/* See brcmnand_readl() comments */
|
||||
if (IS_ENABLED(CONFIG_MIPS) && IS_ENABLED(__BIG_ENDIAN))
|
||||
if (IS_ENABLED(CONFIG_MIPS) && IS_ENABLED(CONFIG_CPU_BIG_ENDIAN))
|
||||
__raw_writel(val, addr);
|
||||
else
|
||||
writel_relaxed(val, addr);
|
||||
|
@ -940,6 +940,7 @@ static int cdns_sierra_phy_probe(struct platform_device *pdev)
|
||||
sp->nsubnodes = node;
|
||||
|
||||
if (sp->num_lanes > SIERRA_MAX_LANES) {
|
||||
ret = -EINVAL;
|
||||
dev_err(dev, "Invalid lane configuration\n");
|
||||
goto put_child2;
|
||||
}
|
||||
|
@ -949,6 +949,8 @@ static int mtk_phy_init(struct phy *phy)
|
||||
break;
|
||||
default:
|
||||
dev_err(tphy->dev, "incompatible PHY type\n");
|
||||
clk_disable_unprepare(instance->ref_clk);
|
||||
clk_disable_unprepare(instance->da_ref_clk);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
@ -2470,6 +2470,10 @@ static int sparx5_serdes_probe(struct platform_device *pdev)
|
||||
priv->coreclock = clock;
|
||||
|
||||
iores = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
if (!iores) {
|
||||
dev_err(priv->dev, "Invalid resource\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
iomem = devm_ioremap(priv->dev, iores->start, resource_size(iores));
|
||||
if (IS_ERR(iomem)) {
|
||||
dev_err(priv->dev, "Unable to get serdes registers: %s\n",
|
||||
|
@ -341,7 +341,7 @@ static struct platform_driver mt7621_pci_phy_driver = {
|
||||
.probe = mt7621_pci_phy_probe,
|
||||
.driver = {
|
||||
.name = "mt7621-pci-phy",
|
||||
.of_match_table = of_match_ptr(mt7621_pci_phy_ids),
|
||||
.of_match_table = mt7621_pci_phy_ids,
|
||||
},
|
||||
};
|
||||
|
||||
|
@ -1212,6 +1212,7 @@ static int wiz_probe(struct platform_device *pdev)
|
||||
|
||||
if (wiz->typec_dir_delay < WIZ_TYPEC_DIR_DEBOUNCE_MIN ||
|
||||
wiz->typec_dir_delay > WIZ_TYPEC_DIR_DEBOUNCE_MAX) {
|
||||
ret = -EINVAL;
|
||||
dev_err(dev, "Invalid typec-dir-debounce property\n");
|
||||
goto err_addr_to_resource;
|
||||
}
|
||||
|
@ -2702,8 +2702,8 @@ static int aspeed_g5_sig_expr_eval(struct aspeed_pinmux_data *ctx,
|
||||
}
|
||||
|
||||
/**
|
||||
* Configure a pin's signal by applying an expression's descriptor state for
|
||||
* all descriptors in the expression.
|
||||
* aspeed_g5_sig_expr_set() - Configure a pin's signal by applying an
|
||||
* expression's descriptor state for all descriptors in the expression.
|
||||
*
|
||||
* @ctx: The pinmux context
|
||||
* @expr: The expression associated with the function whose signal is to be
|
||||
|
@ -2611,8 +2611,8 @@ static struct aspeed_pin_config aspeed_g6_configs[] = {
|
||||
};
|
||||
|
||||
/**
|
||||
* Configure a pin's signal by applying an expression's descriptor state for
|
||||
* all descriptors in the expression.
|
||||
* aspeed_g6_sig_expr_set() - Configure a pin's signal by applying an
|
||||
* expression's descriptor state for all descriptors in the expression.
|
||||
*
|
||||
* @ctx: The pinmux context
|
||||
* @expr: The expression associated with the function whose signal is to be
|
||||
|
@ -108,7 +108,8 @@ static int aspeed_sig_expr_disable(struct aspeed_pinmux_data *ctx,
|
||||
}
|
||||
|
||||
/**
|
||||
* Disable a signal on a pin by disabling all provided signal expressions.
|
||||
* aspeed_disable_sig() - Disable a signal on a pin by disabling all provided
|
||||
* signal expressions.
|
||||
*
|
||||
* @ctx: The pinmux context
|
||||
* @exprs: The list of signal expressions (from a priority level on a pin)
|
||||
|
@ -21,7 +21,8 @@ static inline void aspeed_sig_desc_print_val(
|
||||
}
|
||||
|
||||
/**
|
||||
* Query the enabled or disabled state of a signal descriptor
|
||||
* aspeed_sig_desc_eval() - Query the enabled or disabled state of a signal
|
||||
* descriptor.
|
||||
*
|
||||
* @desc: The signal descriptor of interest
|
||||
* @enabled: True to query the enabled state, false to query disabled state
|
||||
|
@ -223,7 +223,7 @@ config PINCTRL_SC7280
|
||||
config PINCTRL_SC8180X
|
||||
tristate "Qualcomm Technologies Inc SC8180x pin controller driver"
|
||||
depends on GPIOLIB && (OF || ACPI)
|
||||
select PINCTRL_MSM
|
||||
depends on PINCTRL_MSM
|
||||
help
|
||||
This is the pinctrl, pinmux, pinconf and gpiolib driver for the
|
||||
Qualcomm Technologies Inc TLMM block found on the Qualcomm
|
||||
|
@ -410,15 +410,15 @@ static const char * const gpio_groups[] = {
|
||||
"gpio29", "gpio30", "gpio31", "gpio32", "gpio33", "gpio34", "gpio35",
|
||||
"gpio36", "gpio37", "gpio38", "gpio39", "gpio40", "gpio41", "gpio42",
|
||||
"gpio43", "gpio44", "gpio45", "gpio46", "gpio47", "gpio48", "gpio49",
|
||||
"gpio50", "gpio51", "gpio52", "gpio52", "gpio53", "gpio53", "gpio54",
|
||||
"gpio55", "gpio56", "gpio57", "gpio58", "gpio59", "gpio60", "gpio61",
|
||||
"gpio62", "gpio63", "gpio64", "gpio65", "gpio66", "gpio67", "gpio68",
|
||||
"gpio69", "gpio70", "gpio71", "gpio72", "gpio73", "gpio74", "gpio75",
|
||||
"gpio76", "gpio77", "gpio78", "gpio79", "gpio80", "gpio81", "gpio82",
|
||||
"gpio83", "gpio84", "gpio85", "gpio86", "gpio87", "gpio88", "gpio89",
|
||||
"gpio90", "gpio91", "gpio92", "gpio93", "gpio94", "gpio95", "gpio96",
|
||||
"gpio97", "gpio98", "gpio99", "gpio100", "gpio101", "gpio102",
|
||||
"gpio103", "gpio104", "gpio105", "gpio106", "gpio107",
|
||||
"gpio50", "gpio51", "gpio52", "gpio53", "gpio54", "gpio55", "gpio56",
|
||||
"gpio57", "gpio58", "gpio59", "gpio60", "gpio61", "gpio62", "gpio63",
|
||||
"gpio64", "gpio65", "gpio66", "gpio67", "gpio68", "gpio69", "gpio70",
|
||||
"gpio71", "gpio72", "gpio73", "gpio74", "gpio75", "gpio76", "gpio77",
|
||||
"gpio78", "gpio79", "gpio80", "gpio81", "gpio82", "gpio83", "gpio84",
|
||||
"gpio85", "gpio86", "gpio87", "gpio88", "gpio89", "gpio90", "gpio91",
|
||||
"gpio92", "gpio93", "gpio94", "gpio95", "gpio96", "gpio97", "gpio98",
|
||||
"gpio99", "gpio100", "gpio101", "gpio102", "gpio103", "gpio104",
|
||||
"gpio105", "gpio106", "gpio107",
|
||||
};
|
||||
|
||||
static const char * const qdss_stm_groups[] = {
|
||||
|
@ -127,7 +127,7 @@ static int rt2880_pmx_group_enable(struct pinctrl_dev *pctrldev,
|
||||
if (p->groups[group].enabled) {
|
||||
dev_err(p->dev, "%s is already enabled\n",
|
||||
p->groups[group].name);
|
||||
return -EBUSY;
|
||||
return 0;
|
||||
}
|
||||
|
||||
p->groups[group].enabled = 1;
|
||||
|
@ -683,13 +683,13 @@ static int mlxreg_hotplug_probe(struct platform_device *pdev)
|
||||
|
||||
err = devm_request_irq(&pdev->dev, priv->irq,
|
||||
mlxreg_hotplug_irq_handler, IRQF_TRIGGER_FALLING
|
||||
| IRQF_SHARED | IRQF_NO_AUTOEN,
|
||||
"mlxreg-hotplug", priv);
|
||||
| IRQF_SHARED, "mlxreg-hotplug", priv);
|
||||
if (err) {
|
||||
dev_err(&pdev->dev, "Failed to request irq: %d\n", err);
|
||||
return err;
|
||||
}
|
||||
|
||||
disable_irq(priv->irq);
|
||||
spin_lock_init(&priv->lock);
|
||||
INIT_DELAYED_WORK(&priv->dwork_irq, mlxreg_hotplug_work_handler);
|
||||
dev_set_drvdata(&pdev->dev, priv);
|
||||
|
@ -1907,7 +1907,7 @@ static int ssam_ssh_event_disable(struct ssam_controller *ctrl,
|
||||
{
|
||||
int status;
|
||||
|
||||
status = __ssam_ssh_event_request(ctrl, reg, reg.cid_enable, id, flags);
|
||||
status = __ssam_ssh_event_request(ctrl, reg, reg.cid_disable, id, flags);
|
||||
|
||||
if (status < 0 && status != -EINVAL) {
|
||||
ssam_err(ctrl,
|
||||
|
@ -156,7 +156,7 @@ static const struct software_node *ssam_node_group_sl2[] = {
|
||||
NULL,
|
||||
};
|
||||
|
||||
/* Devices for Surface Laptop 3. */
|
||||
/* Devices for Surface Laptop 3 and 4. */
|
||||
static const struct software_node *ssam_node_group_sl3[] = {
|
||||
&ssam_node_root,
|
||||
&ssam_node_bat_ac,
|
||||
@ -521,9 +521,12 @@ static const struct acpi_device_id ssam_platform_hub_match[] = {
|
||||
/* Surface Laptop 3 (13", Intel) */
|
||||
{ "MSHW0114", (unsigned long)ssam_node_group_sl3 },
|
||||
|
||||
/* Surface Laptop 3 (15", AMD) */
|
||||
/* Surface Laptop 3 (15", AMD) and 4 (15", AMD) */
|
||||
{ "MSHW0110", (unsigned long)ssam_node_group_sl3 },
|
||||
|
||||
/* Surface Laptop 4 (13", Intel) */
|
||||
{ "MSHW0250", (unsigned long)ssam_node_group_sl3 },
|
||||
|
||||
/* Surface Laptop Go 1 */
|
||||
{ "MSHW0118", (unsigned long)ssam_node_group_slg1 },
|
||||
|
||||
|
@ -427,6 +427,7 @@ static int surface_dtx_open(struct inode *inode, struct file *file)
|
||||
*/
|
||||
if (test_bit(SDTX_DEVICE_SHUTDOWN_BIT, &ddev->flags)) {
|
||||
up_write(&ddev->client_lock);
|
||||
mutex_destroy(&client->read_lock);
|
||||
sdtx_device_put(client->ddev);
|
||||
kfree(client);
|
||||
return -ENODEV;
|
||||
|
@ -8853,6 +8853,7 @@ static const struct tpacpi_quirk fan_quirk_table[] __initconst = {
|
||||
TPACPI_Q_LNV3('N', '2', 'O', TPACPI_FAN_2CTL), /* P1 / X1 Extreme (2nd gen) */
|
||||
TPACPI_Q_LNV3('N', '2', 'V', TPACPI_FAN_2CTL), /* P1 / X1 Extreme (3nd gen) */
|
||||
TPACPI_Q_LNV3('N', '3', '0', TPACPI_FAN_2CTL), /* P15 (1st gen) / P15v (1st gen) */
|
||||
TPACPI_Q_LNV3('N', '3', '2', TPACPI_FAN_2CTL), /* X1 Carbon (9th gen) */
|
||||
};
|
||||
|
||||
static int __init fan_init(struct ibm_init_struct *iibm)
|
||||
|
@ -1031,7 +1031,7 @@ config REGULATOR_RT5033
|
||||
current source, LDO and Buck.
|
||||
|
||||
config REGULATOR_RTMV20
|
||||
tristate "RTMV20 Laser Diode Regulator"
|
||||
tristate "Richtek RTMV20 Laser Diode Regulator"
|
||||
depends on I2C
|
||||
select REGMAP_I2C
|
||||
help
|
||||
|
@ -28,16 +28,16 @@ static const struct linear_range atc2609a_dcdc_voltage_ranges[] = {
|
||||
|
||||
static const struct linear_range atc2609a_ldo_voltage_ranges0[] = {
|
||||
REGULATOR_LINEAR_RANGE(700000, 0, 15, 100000),
|
||||
REGULATOR_LINEAR_RANGE(2100000, 16, 28, 100000),
|
||||
REGULATOR_LINEAR_RANGE(2100000, 0, 12, 100000),
|
||||
};
|
||||
|
||||
static const struct linear_range atc2609a_ldo_voltage_ranges1[] = {
|
||||
REGULATOR_LINEAR_RANGE(850000, 0, 15, 100000),
|
||||
REGULATOR_LINEAR_RANGE(2100000, 16, 27, 100000),
|
||||
REGULATOR_LINEAR_RANGE(2100000, 0, 11, 100000),
|
||||
};
|
||||
|
||||
static const unsigned int atc260x_ldo_voltage_range_sel[] = {
|
||||
0x0, 0x1,
|
||||
0x0, 0x20,
|
||||
};
|
||||
|
||||
static int atc260x_dcdc_set_voltage_time_sel(struct regulator_dev *rdev,
|
||||
@ -411,7 +411,7 @@ enum atc2609a_reg_ids {
|
||||
.owner = THIS_MODULE, \
|
||||
}
|
||||
|
||||
#define atc2609a_reg_desc_ldo_range_pick(num, n_range) { \
|
||||
#define atc2609a_reg_desc_ldo_range_pick(num, n_range, n_volt) { \
|
||||
.name = "LDO"#num, \
|
||||
.supply_name = "ldo"#num, \
|
||||
.of_match = of_match_ptr("ldo"#num), \
|
||||
@ -421,6 +421,7 @@ enum atc2609a_reg_ids {
|
||||
.type = REGULATOR_VOLTAGE, \
|
||||
.linear_ranges = atc2609a_ldo_voltage_ranges##n_range, \
|
||||
.n_linear_ranges = ARRAY_SIZE(atc2609a_ldo_voltage_ranges##n_range), \
|
||||
.n_voltages = n_volt, \
|
||||
.vsel_reg = ATC2609A_PMU_LDO##num##_CTL0, \
|
||||
.vsel_mask = GENMASK(4, 1), \
|
||||
.vsel_range_reg = ATC2609A_PMU_LDO##num##_CTL0, \
|
||||
@ -458,12 +459,12 @@ static const struct regulator_desc atc2609a_reg[] = {
|
||||
atc2609a_reg_desc_ldo_bypass(0),
|
||||
atc2609a_reg_desc_ldo_bypass(1),
|
||||
atc2609a_reg_desc_ldo_bypass(2),
|
||||
atc2609a_reg_desc_ldo_range_pick(3, 0),
|
||||
atc2609a_reg_desc_ldo_range_pick(4, 0),
|
||||
atc2609a_reg_desc_ldo_range_pick(3, 0, 29),
|
||||
atc2609a_reg_desc_ldo_range_pick(4, 0, 29),
|
||||
atc2609a_reg_desc_ldo(5),
|
||||
atc2609a_reg_desc_ldo_range_pick(6, 1),
|
||||
atc2609a_reg_desc_ldo_range_pick(7, 0),
|
||||
atc2609a_reg_desc_ldo_range_pick(8, 0),
|
||||
atc2609a_reg_desc_ldo_range_pick(6, 1, 28),
|
||||
atc2609a_reg_desc_ldo_range_pick(7, 0, 29),
|
||||
atc2609a_reg_desc_ldo_range_pick(8, 0, 29),
|
||||
atc2609a_reg_desc_ldo_fixed(9),
|
||||
};
|
||||
|
||||
|
@ -334,7 +334,7 @@ BD718XX_OPS(bd71837_buck_regulator_ops, regulator_list_voltage_linear_range,
|
||||
NULL);
|
||||
|
||||
BD718XX_OPS(bd71837_buck_regulator_nolinear_ops, regulator_list_voltage_table,
|
||||
regulator_map_voltage_ascend, bd718xx_set_voltage_sel_restricted,
|
||||
regulator_map_voltage_ascend, bd71837_set_voltage_sel_restricted,
|
||||
regulator_get_voltage_sel_regmap, regulator_set_voltage_time_sel,
|
||||
NULL);
|
||||
/*
|
||||
|
@ -1425,6 +1425,12 @@ static int set_machine_constraints(struct regulator_dev *rdev)
|
||||
* and we have control then make sure it is enabled.
|
||||
*/
|
||||
if (rdev->constraints->always_on || rdev->constraints->boot_on) {
|
||||
/* If we want to enable this regulator, make sure that we know
|
||||
* the supplying regulator.
|
||||
*/
|
||||
if (rdev->supply_name && !rdev->supply)
|
||||
return -EPROBE_DEFER;
|
||||
|
||||
if (rdev->supply) {
|
||||
ret = regulator_enable(rdev->supply);
|
||||
if (ret < 0) {
|
||||
|
@ -225,8 +225,9 @@ static int cros_ec_regulator_probe(struct platform_device *pdev)
|
||||
|
||||
drvdata->dev = devm_regulator_register(dev, &drvdata->desc, &cfg);
|
||||
if (IS_ERR(drvdata->dev)) {
|
||||
ret = PTR_ERR(drvdata->dev);
|
||||
dev_err(&pdev->dev, "Failed to register regulator: %d\n", ret);
|
||||
return PTR_ERR(drvdata->dev);
|
||||
return ret;
|
||||
}
|
||||
|
||||
platform_set_drvdata(pdev, drvdata);
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user