Merge 358feceebb
("Merge tag 'clk-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/clk/linux") into android-mainline
Final steps on the way to 5.11-final Signed-off-by: Greg Kroah-Hartman <gregkh@google.com> Change-Id: I81cdc8804b9c18e722385cac332c042bc5e68113
This commit is contained in:
commit
542ddf1f44
@ -1029,7 +1029,7 @@ All time durations are in microseconds.
|
||||
one number is written, $MAX is updated.
|
||||
|
||||
cpu.pressure
|
||||
A read-only nested-key file which exists on non-root cgroups.
|
||||
A read-write nested-keyed file.
|
||||
|
||||
Shows pressure stall information for CPU. See
|
||||
:ref:`Documentation/accounting/psi.rst <psi>` for details.
|
||||
@ -1475,7 +1475,7 @@ PAGE_SIZE multiple when read back.
|
||||
reduces the impact on the workload and memory management.
|
||||
|
||||
memory.pressure
|
||||
A read-only nested-key file which exists on non-root cgroups.
|
||||
A read-only nested-keyed file.
|
||||
|
||||
Shows pressure stall information for memory. See
|
||||
:ref:`Documentation/accounting/psi.rst <psi>` for details.
|
||||
@ -1714,7 +1714,7 @@ IO Interface Files
|
||||
8:16 rbps=2097152 wbps=max riops=max wiops=max
|
||||
|
||||
io.pressure
|
||||
A read-only nested-key file which exists on non-root cgroups.
|
||||
A read-only nested-keyed file.
|
||||
|
||||
Shows pressure stall information for IO. See
|
||||
:ref:`Documentation/accounting/psi.rst <psi>` for details.
|
||||
|
14
MAINTAINERS
14
MAINTAINERS
@ -4468,7 +4468,7 @@ F: include/linux/console*
|
||||
|
||||
CONTROL GROUP (CGROUP)
|
||||
M: Tejun Heo <tj@kernel.org>
|
||||
M: Li Zefan <lizefan@huawei.com>
|
||||
M: Zefan Li <lizefan.x@bytedance.com>
|
||||
M: Johannes Weiner <hannes@cmpxchg.org>
|
||||
L: cgroups@vger.kernel.org
|
||||
S: Maintained
|
||||
@ -4492,11 +4492,9 @@ F: block/blk-throttle.c
|
||||
F: include/linux/blk-cgroup.h
|
||||
|
||||
CONTROL GROUP - CPUSET
|
||||
M: Li Zefan <lizefan@huawei.com>
|
||||
M: Zefan Li <lizefan.x@bytedance.com>
|
||||
L: cgroups@vger.kernel.org
|
||||
S: Maintained
|
||||
W: http://www.bullopensource.org/cpuset/
|
||||
W: http://oss.sgi.com/projects/cpusets/
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/tj/cgroup.git
|
||||
F: Documentation/admin-guide/cgroup-v1/cpusets.rst
|
||||
F: include/linux/cpuset.h
|
||||
@ -9568,14 +9566,16 @@ F: drivers/hwmon/k8temp.c
|
||||
KASAN
|
||||
M: Andrey Ryabinin <ryabinin.a.a@gmail.com>
|
||||
R: Alexander Potapenko <glider@google.com>
|
||||
R: Andrey Konovalov <andreyknvl@gmail.com>
|
||||
R: Dmitry Vyukov <dvyukov@google.com>
|
||||
L: kasan-dev@googlegroups.com
|
||||
S: Maintained
|
||||
F: Documentation/dev-tools/kasan.rst
|
||||
F: arch/*/include/asm/kasan.h
|
||||
F: arch/*/include/asm/*kasan.h
|
||||
F: arch/*/mm/kasan_init*
|
||||
F: include/linux/kasan*.h
|
||||
F: lib/test_kasan.c
|
||||
F: lib/Kconfig.kasan
|
||||
F: lib/test_kasan*.c
|
||||
F: mm/kasan/
|
||||
F: scripts/Makefile.kasan
|
||||
|
||||
@ -9590,7 +9590,7 @@ F: scripts/kconfig/
|
||||
|
||||
KCOV
|
||||
R: Dmitry Vyukov <dvyukov@google.com>
|
||||
R: Andrey Konovalov <andreyknvl@google.com>
|
||||
R: Andrey Konovalov <andreyknvl@gmail.com>
|
||||
L: kasan-dev@googlegroups.com
|
||||
S: Maintained
|
||||
F: Documentation/dev-tools/kcov.rst
|
||||
|
@ -378,8 +378,6 @@ static int __init xen_guest_init(void)
|
||||
return -ENOMEM;
|
||||
}
|
||||
gnttab_init();
|
||||
if (!xen_initial_domain())
|
||||
xenbus_probe();
|
||||
|
||||
/*
|
||||
* Making sure board specific code will not set up ops for
|
||||
|
@ -1705,16 +1705,12 @@ static void bti_enable(const struct arm64_cpu_capabilities *__unused)
|
||||
#ifdef CONFIG_ARM64_MTE
|
||||
static void cpu_enable_mte(struct arm64_cpu_capabilities const *cap)
|
||||
{
|
||||
static bool cleared_zero_page = false;
|
||||
|
||||
/*
|
||||
* Clear the tags in the zero page. This needs to be done via the
|
||||
* linear map which has the Tagged attribute.
|
||||
*/
|
||||
if (!cleared_zero_page) {
|
||||
cleared_zero_page = true;
|
||||
if (!test_and_set_bit(PG_mte_tagged, &ZERO_PAGE(0)->flags))
|
||||
mte_clear_page_tags(lm_alias(empty_zero_page));
|
||||
}
|
||||
|
||||
kasan_init_hw_tags_cpu();
|
||||
}
|
||||
|
@ -329,11 +329,12 @@ static int __access_remote_tags(struct mm_struct *mm, unsigned long addr,
|
||||
* would cause the existing tags to be cleared if the page
|
||||
* was never mapped with PROT_MTE.
|
||||
*/
|
||||
if (!test_bit(PG_mte_tagged, &page->flags)) {
|
||||
if (!(vma->vm_flags & VM_MTE)) {
|
||||
ret = -EOPNOTSUPP;
|
||||
put_page(page);
|
||||
break;
|
||||
}
|
||||
WARN_ON_ONCE(!test_bit(PG_mte_tagged, &page->flags));
|
||||
|
||||
/* limit access to the end of the page */
|
||||
offset = offset_in_page(addr);
|
||||
|
@ -63,6 +63,9 @@ int main(void)
|
||||
OFFSET(TI_FLAGS, thread_info, flags);
|
||||
OFFSET(TI_CPU, thread_info, cpu);
|
||||
OFFSET(TI_PRE, thread_info, preempt_count);
|
||||
#ifdef CONFIG_PREEMPTION
|
||||
DEFINE(TI_PRE_COUNT, offsetof(struct thread_info, preempt_count));
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -62,7 +62,7 @@ extern unsigned long _ramend;
|
||||
#include <asm/page_no.h>
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_DISCONTIGMEM
|
||||
#if !defined(CONFIG_MMU) || defined(CONFIG_DISCONTIGMEM)
|
||||
#define __phys_to_pfn(paddr) ((unsigned long)((paddr) >> PAGE_SHIFT))
|
||||
#define __pfn_to_phys(pfn) PFN_PHYS(pfn)
|
||||
#endif
|
||||
|
@ -199,25 +199,31 @@ DECLARE_STATIC_KEY_FALSE(uaccess_flush_key);
|
||||
|
||||
#ifdef CONFIG_PPC_PKEY
|
||||
|
||||
extern u64 __ro_after_init default_uamor;
|
||||
extern u64 __ro_after_init default_amr;
|
||||
extern u64 __ro_after_init default_iamr;
|
||||
|
||||
#include <asm/mmu.h>
|
||||
#include <asm/ptrace.h>
|
||||
|
||||
/*
|
||||
* For kernel thread that doesn't have thread.regs return
|
||||
* default AMR/IAMR values.
|
||||
/* usage of kthread_use_mm() should inherit the
|
||||
* AMR value of the operating address space. But, the AMR value is
|
||||
* thread-specific and we inherit the address space and not thread
|
||||
* access restrictions. Because of this ignore AMR value when accessing
|
||||
* userspace via kernel thread.
|
||||
*/
|
||||
static inline u64 current_thread_amr(void)
|
||||
{
|
||||
if (current->thread.regs)
|
||||
return current->thread.regs->amr;
|
||||
return AMR_KUAP_BLOCKED;
|
||||
return default_amr;
|
||||
}
|
||||
|
||||
static inline u64 current_thread_iamr(void)
|
||||
{
|
||||
if (current->thread.regs)
|
||||
return current->thread.regs->iamr;
|
||||
return AMR_KUEP_BLOCKED;
|
||||
return default_iamr;
|
||||
}
|
||||
#endif /* CONFIG_PPC_PKEY */
|
||||
|
||||
|
@ -5,10 +5,6 @@
|
||||
|
||||
#include <asm/book3s/64/hash-pkey.h>
|
||||
|
||||
extern u64 __ro_after_init default_uamor;
|
||||
extern u64 __ro_after_init default_amr;
|
||||
extern u64 __ro_after_init default_iamr;
|
||||
|
||||
static inline u64 vmflag_to_pte_pkey_bits(u64 vm_flags)
|
||||
{
|
||||
if (!mmu_has_feature(MMU_FTR_PKEY))
|
||||
|
@ -31,6 +31,7 @@ static u32 initial_allocation_mask __ro_after_init;
|
||||
u64 default_amr __ro_after_init = ~0x0UL;
|
||||
u64 default_iamr __ro_after_init = 0x5555555555555555UL;
|
||||
u64 default_uamor __ro_after_init;
|
||||
EXPORT_SYMBOL(default_amr);
|
||||
/*
|
||||
* Key used to implement PROT_EXEC mmap. Denies READ/WRITE
|
||||
* We pick key 2 because 0 is special key and 1 is reserved as per ISA.
|
||||
|
@ -90,7 +90,6 @@ ð0 {
|
||||
phy0: ethernet-phy@0 {
|
||||
compatible = "ethernet-phy-id0007.0771";
|
||||
reg = <0>;
|
||||
reset-gpios = <&gpio 12 GPIO_ACTIVE_LOW>;
|
||||
};
|
||||
};
|
||||
|
||||
|
@ -108,7 +108,7 @@ static unsigned long ccu_mp_round_rate(struct ccu_mux_internal *mux,
|
||||
max_m = cmp->m.max ?: 1 << cmp->m.width;
|
||||
max_p = cmp->p.max ?: 1 << ((1 << cmp->p.width) - 1);
|
||||
|
||||
if (!(clk_hw_get_flags(hw) & CLK_SET_RATE_PARENT)) {
|
||||
if (!clk_hw_can_set_rate_parent(&cmp->common.hw)) {
|
||||
ccu_mp_find_best(*parent_rate, rate, max_m, max_p, &m, &p);
|
||||
rate = *parent_rate / p / m;
|
||||
} else {
|
||||
|
@ -441,8 +441,9 @@ config GPIO_MXC
|
||||
select GENERIC_IRQ_CHIP
|
||||
|
||||
config GPIO_MXS
|
||||
def_bool y
|
||||
bool "Freescale MXS GPIO support" if COMPILE_TEST
|
||||
depends on ARCH_MXS || COMPILE_TEST
|
||||
default y if ARCH_MXS
|
||||
select GPIO_GENERIC
|
||||
select GENERIC_IRQ_CHIP
|
||||
|
||||
|
@ -25,6 +25,9 @@
|
||||
/* Maximum value for gpio line identifiers */
|
||||
#define EP93XX_GPIO_LINE_MAX 63
|
||||
|
||||
/* Number of GPIO chips in EP93XX */
|
||||
#define EP93XX_GPIO_CHIP_NUM 8
|
||||
|
||||
/* Maximum value for irq capable line identifiers */
|
||||
#define EP93XX_GPIO_LINE_MAX_IRQ 23
|
||||
|
||||
@ -34,74 +37,75 @@
|
||||
*/
|
||||
#define EP93XX_GPIO_F_IRQ_BASE 80
|
||||
|
||||
struct ep93xx_gpio_irq_chip {
|
||||
struct irq_chip ic;
|
||||
u8 irq_offset;
|
||||
u8 int_unmasked;
|
||||
u8 int_enabled;
|
||||
u8 int_type1;
|
||||
u8 int_type2;
|
||||
u8 int_debounce;
|
||||
};
|
||||
|
||||
struct ep93xx_gpio_chip {
|
||||
struct gpio_chip gc;
|
||||
struct ep93xx_gpio_irq_chip *eic;
|
||||
};
|
||||
|
||||
struct ep93xx_gpio {
|
||||
void __iomem *base;
|
||||
struct gpio_chip gc[8];
|
||||
struct ep93xx_gpio_chip gc[EP93XX_GPIO_CHIP_NUM];
|
||||
};
|
||||
|
||||
#define to_ep93xx_gpio_chip(x) container_of(x, struct ep93xx_gpio_chip, gc)
|
||||
|
||||
static struct ep93xx_gpio_irq_chip *to_ep93xx_gpio_irq_chip(struct gpio_chip *gc)
|
||||
{
|
||||
struct ep93xx_gpio_chip *egc = to_ep93xx_gpio_chip(gc);
|
||||
|
||||
return egc->eic;
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
* Interrupt handling for EP93xx on-chip GPIOs
|
||||
*************************************************************************/
|
||||
static unsigned char gpio_int_unmasked[3];
|
||||
static unsigned char gpio_int_enabled[3];
|
||||
static unsigned char gpio_int_type1[3];
|
||||
static unsigned char gpio_int_type2[3];
|
||||
static unsigned char gpio_int_debounce[3];
|
||||
#define EP93XX_INT_TYPE1_OFFSET 0x00
|
||||
#define EP93XX_INT_TYPE2_OFFSET 0x04
|
||||
#define EP93XX_INT_EOI_OFFSET 0x08
|
||||
#define EP93XX_INT_EN_OFFSET 0x0c
|
||||
#define EP93XX_INT_STATUS_OFFSET 0x10
|
||||
#define EP93XX_INT_RAW_STATUS_OFFSET 0x14
|
||||
#define EP93XX_INT_DEBOUNCE_OFFSET 0x18
|
||||
|
||||
/* Port ordering is: A B F */
|
||||
static const u8 int_type1_register_offset[3] = { 0x90, 0xac, 0x4c };
|
||||
static const u8 int_type2_register_offset[3] = { 0x94, 0xb0, 0x50 };
|
||||
static const u8 eoi_register_offset[3] = { 0x98, 0xb4, 0x54 };
|
||||
static const u8 int_en_register_offset[3] = { 0x9c, 0xb8, 0x58 };
|
||||
static const u8 int_debounce_register_offset[3] = { 0xa8, 0xc4, 0x64 };
|
||||
|
||||
static void ep93xx_gpio_update_int_params(struct ep93xx_gpio *epg, unsigned port)
|
||||
static void ep93xx_gpio_update_int_params(struct ep93xx_gpio *epg,
|
||||
struct ep93xx_gpio_irq_chip *eic)
|
||||
{
|
||||
BUG_ON(port > 2);
|
||||
writeb_relaxed(0, epg->base + eic->irq_offset + EP93XX_INT_EN_OFFSET);
|
||||
|
||||
writeb_relaxed(0, epg->base + int_en_register_offset[port]);
|
||||
writeb_relaxed(eic->int_type2,
|
||||
epg->base + eic->irq_offset + EP93XX_INT_TYPE2_OFFSET);
|
||||
|
||||
writeb_relaxed(gpio_int_type2[port],
|
||||
epg->base + int_type2_register_offset[port]);
|
||||
writeb_relaxed(eic->int_type1,
|
||||
epg->base + eic->irq_offset + EP93XX_INT_TYPE1_OFFSET);
|
||||
|
||||
writeb_relaxed(gpio_int_type1[port],
|
||||
epg->base + int_type1_register_offset[port]);
|
||||
|
||||
writeb(gpio_int_unmasked[port] & gpio_int_enabled[port],
|
||||
epg->base + int_en_register_offset[port]);
|
||||
}
|
||||
|
||||
static int ep93xx_gpio_port(struct gpio_chip *gc)
|
||||
{
|
||||
struct ep93xx_gpio *epg = gpiochip_get_data(gc);
|
||||
int port = 0;
|
||||
|
||||
while (port < ARRAY_SIZE(epg->gc) && gc != &epg->gc[port])
|
||||
port++;
|
||||
|
||||
/* This should not happen but is there as a last safeguard */
|
||||
if (port == ARRAY_SIZE(epg->gc)) {
|
||||
pr_crit("can't find the GPIO port\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
return port;
|
||||
writeb_relaxed(eic->int_unmasked & eic->int_enabled,
|
||||
epg->base + eic->irq_offset + EP93XX_INT_EN_OFFSET);
|
||||
}
|
||||
|
||||
static void ep93xx_gpio_int_debounce(struct gpio_chip *gc,
|
||||
unsigned int offset, bool enable)
|
||||
{
|
||||
struct ep93xx_gpio *epg = gpiochip_get_data(gc);
|
||||
int port = ep93xx_gpio_port(gc);
|
||||
struct ep93xx_gpio_irq_chip *eic = to_ep93xx_gpio_irq_chip(gc);
|
||||
int port_mask = BIT(offset);
|
||||
|
||||
if (enable)
|
||||
gpio_int_debounce[port] |= port_mask;
|
||||
eic->int_debounce |= port_mask;
|
||||
else
|
||||
gpio_int_debounce[port] &= ~port_mask;
|
||||
eic->int_debounce &= ~port_mask;
|
||||
|
||||
writeb(gpio_int_debounce[port],
|
||||
epg->base + int_debounce_register_offset[port]);
|
||||
writeb(eic->int_debounce,
|
||||
epg->base + eic->irq_offset + EP93XX_INT_DEBOUNCE_OFFSET);
|
||||
}
|
||||
|
||||
static void ep93xx_gpio_ab_irq_handler(struct irq_desc *desc)
|
||||
@ -122,12 +126,12 @@ static void ep93xx_gpio_ab_irq_handler(struct irq_desc *desc)
|
||||
*/
|
||||
stat = readb(epg->base + EP93XX_GPIO_A_INT_STATUS);
|
||||
for_each_set_bit(offset, &stat, 8)
|
||||
generic_handle_irq(irq_find_mapping(epg->gc[0].irq.domain,
|
||||
generic_handle_irq(irq_find_mapping(epg->gc[0].gc.irq.domain,
|
||||
offset));
|
||||
|
||||
stat = readb(epg->base + EP93XX_GPIO_B_INT_STATUS);
|
||||
for_each_set_bit(offset, &stat, 8)
|
||||
generic_handle_irq(irq_find_mapping(epg->gc[1].irq.domain,
|
||||
generic_handle_irq(irq_find_mapping(epg->gc[1].gc.irq.domain,
|
||||
offset));
|
||||
|
||||
chained_irq_exit(irqchip, desc);
|
||||
@ -153,52 +157,52 @@ static void ep93xx_gpio_f_irq_handler(struct irq_desc *desc)
|
||||
static void ep93xx_gpio_irq_ack(struct irq_data *d)
|
||||
{
|
||||
struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
|
||||
struct ep93xx_gpio_irq_chip *eic = to_ep93xx_gpio_irq_chip(gc);
|
||||
struct ep93xx_gpio *epg = gpiochip_get_data(gc);
|
||||
int port = ep93xx_gpio_port(gc);
|
||||
int port_mask = BIT(d->irq & 7);
|
||||
|
||||
if (irqd_get_trigger_type(d) == IRQ_TYPE_EDGE_BOTH) {
|
||||
gpio_int_type2[port] ^= port_mask; /* switch edge direction */
|
||||
ep93xx_gpio_update_int_params(epg, port);
|
||||
eic->int_type2 ^= port_mask; /* switch edge direction */
|
||||
ep93xx_gpio_update_int_params(epg, eic);
|
||||
}
|
||||
|
||||
writeb(port_mask, epg->base + eoi_register_offset[port]);
|
||||
writeb(port_mask, epg->base + eic->irq_offset + EP93XX_INT_EOI_OFFSET);
|
||||
}
|
||||
|
||||
static void ep93xx_gpio_irq_mask_ack(struct irq_data *d)
|
||||
{
|
||||
struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
|
||||
struct ep93xx_gpio_irq_chip *eic = to_ep93xx_gpio_irq_chip(gc);
|
||||
struct ep93xx_gpio *epg = gpiochip_get_data(gc);
|
||||
int port = ep93xx_gpio_port(gc);
|
||||
int port_mask = BIT(d->irq & 7);
|
||||
|
||||
if (irqd_get_trigger_type(d) == IRQ_TYPE_EDGE_BOTH)
|
||||
gpio_int_type2[port] ^= port_mask; /* switch edge direction */
|
||||
eic->int_type2 ^= port_mask; /* switch edge direction */
|
||||
|
||||
gpio_int_unmasked[port] &= ~port_mask;
|
||||
ep93xx_gpio_update_int_params(epg, port);
|
||||
eic->int_unmasked &= ~port_mask;
|
||||
ep93xx_gpio_update_int_params(epg, eic);
|
||||
|
||||
writeb(port_mask, epg->base + eoi_register_offset[port]);
|
||||
writeb(port_mask, epg->base + eic->irq_offset + EP93XX_INT_EOI_OFFSET);
|
||||
}
|
||||
|
||||
static void ep93xx_gpio_irq_mask(struct irq_data *d)
|
||||
{
|
||||
struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
|
||||
struct ep93xx_gpio_irq_chip *eic = to_ep93xx_gpio_irq_chip(gc);
|
||||
struct ep93xx_gpio *epg = gpiochip_get_data(gc);
|
||||
int port = ep93xx_gpio_port(gc);
|
||||
|
||||
gpio_int_unmasked[port] &= ~BIT(d->irq & 7);
|
||||
ep93xx_gpio_update_int_params(epg, port);
|
||||
eic->int_unmasked &= ~BIT(d->irq & 7);
|
||||
ep93xx_gpio_update_int_params(epg, eic);
|
||||
}
|
||||
|
||||
static void ep93xx_gpio_irq_unmask(struct irq_data *d)
|
||||
{
|
||||
struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
|
||||
struct ep93xx_gpio_irq_chip *eic = to_ep93xx_gpio_irq_chip(gc);
|
||||
struct ep93xx_gpio *epg = gpiochip_get_data(gc);
|
||||
int port = ep93xx_gpio_port(gc);
|
||||
|
||||
gpio_int_unmasked[port] |= BIT(d->irq & 7);
|
||||
ep93xx_gpio_update_int_params(epg, port);
|
||||
eic->int_unmasked |= BIT(d->irq & 7);
|
||||
ep93xx_gpio_update_int_params(epg, eic);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -209,8 +213,8 @@ static void ep93xx_gpio_irq_unmask(struct irq_data *d)
|
||||
static int ep93xx_gpio_irq_type(struct irq_data *d, unsigned int type)
|
||||
{
|
||||
struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
|
||||
struct ep93xx_gpio_irq_chip *eic = to_ep93xx_gpio_irq_chip(gc);
|
||||
struct ep93xx_gpio *epg = gpiochip_get_data(gc);
|
||||
int port = ep93xx_gpio_port(gc);
|
||||
int offset = d->irq & 7;
|
||||
int port_mask = BIT(offset);
|
||||
irq_flow_handler_t handler;
|
||||
@ -219,32 +223,32 @@ static int ep93xx_gpio_irq_type(struct irq_data *d, unsigned int type)
|
||||
|
||||
switch (type) {
|
||||
case IRQ_TYPE_EDGE_RISING:
|
||||
gpio_int_type1[port] |= port_mask;
|
||||
gpio_int_type2[port] |= port_mask;
|
||||
eic->int_type1 |= port_mask;
|
||||
eic->int_type2 |= port_mask;
|
||||
handler = handle_edge_irq;
|
||||
break;
|
||||
case IRQ_TYPE_EDGE_FALLING:
|
||||
gpio_int_type1[port] |= port_mask;
|
||||
gpio_int_type2[port] &= ~port_mask;
|
||||
eic->int_type1 |= port_mask;
|
||||
eic->int_type2 &= ~port_mask;
|
||||
handler = handle_edge_irq;
|
||||
break;
|
||||
case IRQ_TYPE_LEVEL_HIGH:
|
||||
gpio_int_type1[port] &= ~port_mask;
|
||||
gpio_int_type2[port] |= port_mask;
|
||||
eic->int_type1 &= ~port_mask;
|
||||
eic->int_type2 |= port_mask;
|
||||
handler = handle_level_irq;
|
||||
break;
|
||||
case IRQ_TYPE_LEVEL_LOW:
|
||||
gpio_int_type1[port] &= ~port_mask;
|
||||
gpio_int_type2[port] &= ~port_mask;
|
||||
eic->int_type1 &= ~port_mask;
|
||||
eic->int_type2 &= ~port_mask;
|
||||
handler = handle_level_irq;
|
||||
break;
|
||||
case IRQ_TYPE_EDGE_BOTH:
|
||||
gpio_int_type1[port] |= port_mask;
|
||||
eic->int_type1 |= port_mask;
|
||||
/* set initial polarity based on current input level */
|
||||
if (gc->get(gc, offset))
|
||||
gpio_int_type2[port] &= ~port_mask; /* falling */
|
||||
eic->int_type2 &= ~port_mask; /* falling */
|
||||
else
|
||||
gpio_int_type2[port] |= port_mask; /* rising */
|
||||
eic->int_type2 |= port_mask; /* rising */
|
||||
handler = handle_edge_irq;
|
||||
break;
|
||||
default:
|
||||
@ -253,22 +257,13 @@ static int ep93xx_gpio_irq_type(struct irq_data *d, unsigned int type)
|
||||
|
||||
irq_set_handler_locked(d, handler);
|
||||
|
||||
gpio_int_enabled[port] |= port_mask;
|
||||
eic->int_enabled |= port_mask;
|
||||
|
||||
ep93xx_gpio_update_int_params(epg, port);
|
||||
ep93xx_gpio_update_int_params(epg, eic);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct irq_chip ep93xx_gpio_irq_chip = {
|
||||
.name = "GPIO",
|
||||
.irq_ack = ep93xx_gpio_irq_ack,
|
||||
.irq_mask_ack = ep93xx_gpio_irq_mask_ack,
|
||||
.irq_mask = ep93xx_gpio_irq_mask,
|
||||
.irq_unmask = ep93xx_gpio_irq_unmask,
|
||||
.irq_set_type = ep93xx_gpio_irq_type,
|
||||
};
|
||||
|
||||
/*************************************************************************
|
||||
* gpiolib interface for EP93xx on-chip GPIOs
|
||||
*************************************************************************/
|
||||
@ -276,17 +271,19 @@ struct ep93xx_gpio_bank {
|
||||
const char *label;
|
||||
int data;
|
||||
int dir;
|
||||
int irq;
|
||||
int base;
|
||||
bool has_irq;
|
||||
bool has_hierarchical_irq;
|
||||
unsigned int irq_base;
|
||||
};
|
||||
|
||||
#define EP93XX_GPIO_BANK(_label, _data, _dir, _base, _has_irq, _has_hier, _irq_base) \
|
||||
#define EP93XX_GPIO_BANK(_label, _data, _dir, _irq, _base, _has_irq, _has_hier, _irq_base) \
|
||||
{ \
|
||||
.label = _label, \
|
||||
.data = _data, \
|
||||
.dir = _dir, \
|
||||
.irq = _irq, \
|
||||
.base = _base, \
|
||||
.has_irq = _has_irq, \
|
||||
.has_hierarchical_irq = _has_hier, \
|
||||
@ -295,16 +292,16 @@ struct ep93xx_gpio_bank {
|
||||
|
||||
static struct ep93xx_gpio_bank ep93xx_gpio_banks[] = {
|
||||
/* Bank A has 8 IRQs */
|
||||
EP93XX_GPIO_BANK("A", 0x00, 0x10, 0, true, false, 64),
|
||||
EP93XX_GPIO_BANK("A", 0x00, 0x10, 0x90, 0, true, false, 64),
|
||||
/* Bank B has 8 IRQs */
|
||||
EP93XX_GPIO_BANK("B", 0x04, 0x14, 8, true, false, 72),
|
||||
EP93XX_GPIO_BANK("C", 0x08, 0x18, 40, false, false, 0),
|
||||
EP93XX_GPIO_BANK("D", 0x0c, 0x1c, 24, false, false, 0),
|
||||
EP93XX_GPIO_BANK("E", 0x20, 0x24, 32, false, false, 0),
|
||||
EP93XX_GPIO_BANK("B", 0x04, 0x14, 0xac, 8, true, false, 72),
|
||||
EP93XX_GPIO_BANK("C", 0x08, 0x18, 0x00, 40, false, false, 0),
|
||||
EP93XX_GPIO_BANK("D", 0x0c, 0x1c, 0x00, 24, false, false, 0),
|
||||
EP93XX_GPIO_BANK("E", 0x20, 0x24, 0x00, 32, false, false, 0),
|
||||
/* Bank F has 8 IRQs */
|
||||
EP93XX_GPIO_BANK("F", 0x30, 0x34, 16, false, true, 0),
|
||||
EP93XX_GPIO_BANK("G", 0x38, 0x3c, 48, false, false, 0),
|
||||
EP93XX_GPIO_BANK("H", 0x40, 0x44, 56, false, false, 0),
|
||||
EP93XX_GPIO_BANK("F", 0x30, 0x34, 0x4c, 16, false, true, 0),
|
||||
EP93XX_GPIO_BANK("G", 0x38, 0x3c, 0x00, 48, false, false, 0),
|
||||
EP93XX_GPIO_BANK("H", 0x40, 0x44, 0x00, 56, false, false, 0),
|
||||
};
|
||||
|
||||
static int ep93xx_gpio_set_config(struct gpio_chip *gc, unsigned offset,
|
||||
@ -326,13 +323,23 @@ static int ep93xx_gpio_f_to_irq(struct gpio_chip *gc, unsigned offset)
|
||||
return EP93XX_GPIO_F_IRQ_BASE + offset;
|
||||
}
|
||||
|
||||
static int ep93xx_gpio_add_bank(struct gpio_chip *gc,
|
||||
static void ep93xx_init_irq_chip(struct device *dev, struct irq_chip *ic)
|
||||
{
|
||||
ic->irq_ack = ep93xx_gpio_irq_ack;
|
||||
ic->irq_mask_ack = ep93xx_gpio_irq_mask_ack;
|
||||
ic->irq_mask = ep93xx_gpio_irq_mask;
|
||||
ic->irq_unmask = ep93xx_gpio_irq_unmask;
|
||||
ic->irq_set_type = ep93xx_gpio_irq_type;
|
||||
}
|
||||
|
||||
static int ep93xx_gpio_add_bank(struct ep93xx_gpio_chip *egc,
|
||||
struct platform_device *pdev,
|
||||
struct ep93xx_gpio *epg,
|
||||
struct ep93xx_gpio_bank *bank)
|
||||
{
|
||||
void __iomem *data = epg->base + bank->data;
|
||||
void __iomem *dir = epg->base + bank->dir;
|
||||
struct gpio_chip *gc = &egc->gc;
|
||||
struct device *dev = &pdev->dev;
|
||||
struct gpio_irq_chip *girq;
|
||||
int err;
|
||||
@ -346,8 +353,21 @@ static int ep93xx_gpio_add_bank(struct gpio_chip *gc,
|
||||
|
||||
girq = &gc->irq;
|
||||
if (bank->has_irq || bank->has_hierarchical_irq) {
|
||||
struct irq_chip *ic;
|
||||
|
||||
gc->set_config = ep93xx_gpio_set_config;
|
||||
girq->chip = &ep93xx_gpio_irq_chip;
|
||||
egc->eic = devm_kcalloc(dev, 1,
|
||||
sizeof(*egc->eic),
|
||||
GFP_KERNEL);
|
||||
if (!egc->eic)
|
||||
return -ENOMEM;
|
||||
egc->eic->irq_offset = bank->irq;
|
||||
ic = &egc->eic->ic;
|
||||
ic->name = devm_kasprintf(dev, GFP_KERNEL, "gpio-irq-%s", bank->label);
|
||||
if (!ic->name)
|
||||
return -ENOMEM;
|
||||
ep93xx_init_irq_chip(dev, ic);
|
||||
girq->chip = ic;
|
||||
}
|
||||
|
||||
if (bank->has_irq) {
|
||||
@ -389,7 +409,7 @@ static int ep93xx_gpio_add_bank(struct gpio_chip *gc,
|
||||
gpio_irq = EP93XX_GPIO_F_IRQ_BASE + i;
|
||||
irq_set_chip_data(gpio_irq, &epg->gc[5]);
|
||||
irq_set_chip_and_handler(gpio_irq,
|
||||
&ep93xx_gpio_irq_chip,
|
||||
girq->chip,
|
||||
handle_level_irq);
|
||||
irq_clear_status_flags(gpio_irq, IRQ_NOREQUEST);
|
||||
}
|
||||
@ -415,7 +435,7 @@ static int ep93xx_gpio_probe(struct platform_device *pdev)
|
||||
return PTR_ERR(epg->base);
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(ep93xx_gpio_banks); i++) {
|
||||
struct gpio_chip *gc = &epg->gc[i];
|
||||
struct ep93xx_gpio_chip *gc = &epg->gc[i];
|
||||
struct ep93xx_gpio_bank *bank = &ep93xx_gpio_banks[i];
|
||||
|
||||
if (ep93xx_gpio_add_bank(gc, pdev, epg, bank))
|
||||
|
@ -297,8 +297,8 @@ static struct _vcs_dpi_soc_bounding_box_st dcn2_0_soc = {
|
||||
},
|
||||
},
|
||||
.num_states = 5,
|
||||
.sr_exit_time_us = 11.6,
|
||||
.sr_enter_plus_exit_time_us = 13.9,
|
||||
.sr_exit_time_us = 8.6,
|
||||
.sr_enter_plus_exit_time_us = 10.9,
|
||||
.urgent_latency_us = 4.0,
|
||||
.urgent_latency_pixel_data_only_us = 4.0,
|
||||
.urgent_latency_pixel_mixed_with_vm_data_us = 4.0,
|
||||
|
@ -4224,6 +4224,7 @@ drm_dp_mst_detect_port(struct drm_connector *connector,
|
||||
|
||||
switch (port->pdt) {
|
||||
case DP_PEER_DEVICE_NONE:
|
||||
break;
|
||||
case DP_PEER_DEVICE_MST_BRANCHING:
|
||||
if (!port->mcs)
|
||||
ret = connector_status_connected;
|
||||
|
@ -182,6 +182,7 @@ struct intel_overlay {
|
||||
struct intel_crtc *crtc;
|
||||
struct i915_vma *vma;
|
||||
struct i915_vma *old_vma;
|
||||
struct intel_frontbuffer *frontbuffer;
|
||||
bool active;
|
||||
bool pfit_active;
|
||||
u32 pfit_vscale_ratio; /* shifted-point number, (1<<12) == 1.0 */
|
||||
@ -282,21 +283,19 @@ static void intel_overlay_flip_prepare(struct intel_overlay *overlay,
|
||||
struct i915_vma *vma)
|
||||
{
|
||||
enum pipe pipe = overlay->crtc->pipe;
|
||||
struct intel_frontbuffer *from = NULL, *to = NULL;
|
||||
struct intel_frontbuffer *frontbuffer = NULL;
|
||||
|
||||
drm_WARN_ON(&overlay->i915->drm, overlay->old_vma);
|
||||
|
||||
if (overlay->vma)
|
||||
from = intel_frontbuffer_get(overlay->vma->obj);
|
||||
if (vma)
|
||||
to = intel_frontbuffer_get(vma->obj);
|
||||
frontbuffer = intel_frontbuffer_get(vma->obj);
|
||||
|
||||
intel_frontbuffer_track(from, to, INTEL_FRONTBUFFER_OVERLAY(pipe));
|
||||
intel_frontbuffer_track(overlay->frontbuffer, frontbuffer,
|
||||
INTEL_FRONTBUFFER_OVERLAY(pipe));
|
||||
|
||||
if (to)
|
||||
intel_frontbuffer_put(to);
|
||||
if (from)
|
||||
intel_frontbuffer_put(from);
|
||||
if (overlay->frontbuffer)
|
||||
intel_frontbuffer_put(overlay->frontbuffer);
|
||||
overlay->frontbuffer = frontbuffer;
|
||||
|
||||
intel_frontbuffer_flip_prepare(overlay->i915,
|
||||
INTEL_FRONTBUFFER_OVERLAY(pipe));
|
||||
|
@ -23,36 +23,6 @@ static const char *tc_port_mode_name(enum tc_port_mode mode)
|
||||
return names[mode];
|
||||
}
|
||||
|
||||
static void
|
||||
tc_port_load_fia_params(struct drm_i915_private *i915,
|
||||
struct intel_digital_port *dig_port)
|
||||
{
|
||||
enum port port = dig_port->base.port;
|
||||
enum tc_port tc_port = intel_port_to_tc(i915, port);
|
||||
u32 modular_fia;
|
||||
|
||||
if (INTEL_INFO(i915)->display.has_modular_fia) {
|
||||
modular_fia = intel_uncore_read(&i915->uncore,
|
||||
PORT_TX_DFLEXDPSP(FIA1));
|
||||
drm_WARN_ON(&i915->drm, modular_fia == 0xffffffff);
|
||||
modular_fia &= MODULAR_FIA_MASK;
|
||||
} else {
|
||||
modular_fia = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Each Modular FIA instance houses 2 TC ports. In SOC that has more
|
||||
* than two TC ports, there are multiple instances of Modular FIA.
|
||||
*/
|
||||
if (modular_fia) {
|
||||
dig_port->tc_phy_fia = tc_port / 2;
|
||||
dig_port->tc_phy_fia_idx = tc_port % 2;
|
||||
} else {
|
||||
dig_port->tc_phy_fia = FIA1;
|
||||
dig_port->tc_phy_fia_idx = tc_port;
|
||||
}
|
||||
}
|
||||
|
||||
static enum intel_display_power_domain
|
||||
tc_cold_get_power_domain(struct intel_digital_port *dig_port)
|
||||
{
|
||||
@ -646,6 +616,43 @@ void intel_tc_port_put_link(struct intel_digital_port *dig_port)
|
||||
mutex_unlock(&dig_port->tc_lock);
|
||||
}
|
||||
|
||||
static bool
|
||||
tc_has_modular_fia(struct drm_i915_private *i915, struct intel_digital_port *dig_port)
|
||||
{
|
||||
intel_wakeref_t wakeref;
|
||||
u32 val;
|
||||
|
||||
if (!INTEL_INFO(i915)->display.has_modular_fia)
|
||||
return false;
|
||||
|
||||
wakeref = tc_cold_block(dig_port);
|
||||
val = intel_uncore_read(&i915->uncore, PORT_TX_DFLEXDPSP(FIA1));
|
||||
tc_cold_unblock(dig_port, wakeref);
|
||||
|
||||
drm_WARN_ON(&i915->drm, val == 0xffffffff);
|
||||
|
||||
return val & MODULAR_FIA_MASK;
|
||||
}
|
||||
|
||||
static void
|
||||
tc_port_load_fia_params(struct drm_i915_private *i915, struct intel_digital_port *dig_port)
|
||||
{
|
||||
enum port port = dig_port->base.port;
|
||||
enum tc_port tc_port = intel_port_to_tc(i915, port);
|
||||
|
||||
/*
|
||||
* Each Modular FIA instance houses 2 TC ports. In SOC that has more
|
||||
* than two TC ports, there are multiple instances of Modular FIA.
|
||||
*/
|
||||
if (tc_has_modular_fia(i915, dig_port)) {
|
||||
dig_port->tc_phy_fia = tc_port / 2;
|
||||
dig_port->tc_phy_fia_idx = tc_port % 2;
|
||||
} else {
|
||||
dig_port->tc_phy_fia = FIA1;
|
||||
dig_port->tc_phy_fia_idx = tc_port;
|
||||
}
|
||||
}
|
||||
|
||||
void intel_tc_port_init(struct intel_digital_port *dig_port, bool is_legacy)
|
||||
{
|
||||
struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev);
|
||||
|
@ -689,6 +689,30 @@ static void sun4i_tcon1_mode_set(struct sun4i_tcon *tcon,
|
||||
SUN4I_TCON1_BASIC5_V_SYNC(vsync) |
|
||||
SUN4I_TCON1_BASIC5_H_SYNC(hsync));
|
||||
|
||||
/* Setup the polarity of multiple signals */
|
||||
if (tcon->quirks->polarity_in_ch0) {
|
||||
val = 0;
|
||||
|
||||
if (mode->flags & DRM_MODE_FLAG_PHSYNC)
|
||||
val |= SUN4I_TCON0_IO_POL_HSYNC_POSITIVE;
|
||||
|
||||
if (mode->flags & DRM_MODE_FLAG_PVSYNC)
|
||||
val |= SUN4I_TCON0_IO_POL_VSYNC_POSITIVE;
|
||||
|
||||
regmap_write(tcon->regs, SUN4I_TCON0_IO_POL_REG, val);
|
||||
} else {
|
||||
/* according to vendor driver, this bit must be always set */
|
||||
val = SUN4I_TCON1_IO_POL_UNKNOWN;
|
||||
|
||||
if (mode->flags & DRM_MODE_FLAG_PHSYNC)
|
||||
val |= SUN4I_TCON1_IO_POL_HSYNC_POSITIVE;
|
||||
|
||||
if (mode->flags & DRM_MODE_FLAG_PVSYNC)
|
||||
val |= SUN4I_TCON1_IO_POL_VSYNC_POSITIVE;
|
||||
|
||||
regmap_write(tcon->regs, SUN4I_TCON1_IO_POL_REG, val);
|
||||
}
|
||||
|
||||
/* Map output pins to channel 1 */
|
||||
regmap_update_bits(tcon->regs, SUN4I_TCON_GCTL_REG,
|
||||
SUN4I_TCON_GCTL_IOMAP_MASK,
|
||||
@ -1517,6 +1541,7 @@ static const struct sun4i_tcon_quirks sun8i_a83t_tv_quirks = {
|
||||
|
||||
static const struct sun4i_tcon_quirks sun8i_r40_tv_quirks = {
|
||||
.has_channel_1 = true,
|
||||
.polarity_in_ch0 = true,
|
||||
.set_mux = sun8i_r40_tcon_tv_set_mux,
|
||||
};
|
||||
|
||||
|
@ -153,6 +153,11 @@
|
||||
#define SUN4I_TCON1_BASIC5_V_SYNC(height) (((height) - 1) & 0x3ff)
|
||||
|
||||
#define SUN4I_TCON1_IO_POL_REG 0xf0
|
||||
/* there is no documentation about this bit */
|
||||
#define SUN4I_TCON1_IO_POL_UNKNOWN BIT(26)
|
||||
#define SUN4I_TCON1_IO_POL_HSYNC_POSITIVE BIT(25)
|
||||
#define SUN4I_TCON1_IO_POL_VSYNC_POSITIVE BIT(24)
|
||||
|
||||
#define SUN4I_TCON1_IO_TRI_REG 0xf4
|
||||
|
||||
#define SUN4I_TCON_ECC_FIFO_REG 0xf8
|
||||
@ -235,6 +240,7 @@ struct sun4i_tcon_quirks {
|
||||
bool needs_de_be_mux; /* sun6i needs mux to select backend */
|
||||
bool needs_edp_reset; /* a80 edp reset needed for tcon0 access */
|
||||
bool supports_lvds; /* Does the TCON support an LVDS output? */
|
||||
bool polarity_in_ch0; /* some tcon1 channels have polarity bits in tcon0 pol register */
|
||||
u8 dclk_min_div; /* minimum divider for TCON0 DCLK */
|
||||
|
||||
/* callback to handle tcon muxing options */
|
||||
|
@ -21,8 +21,7 @@ static void sun8i_dw_hdmi_encoder_mode_set(struct drm_encoder *encoder,
|
||||
{
|
||||
struct sun8i_dw_hdmi *hdmi = encoder_to_sun8i_dw_hdmi(encoder);
|
||||
|
||||
if (hdmi->quirks->set_rate)
|
||||
clk_set_rate(hdmi->clk_tmds, mode->crtc_clock * 1000);
|
||||
clk_set_rate(hdmi->clk_tmds, mode->crtc_clock * 1000);
|
||||
}
|
||||
|
||||
static const struct drm_encoder_helper_funcs
|
||||
@ -48,11 +47,9 @@ sun8i_dw_hdmi_mode_valid_h6(struct dw_hdmi *hdmi, void *data,
|
||||
{
|
||||
/*
|
||||
* Controller support maximum of 594 MHz, which correlates to
|
||||
* 4K@60Hz 4:4:4 or RGB. However, for frequencies greater than
|
||||
* 340 MHz scrambling has to be enabled. Because scrambling is
|
||||
* not yet implemented, just limit to 340 MHz for now.
|
||||
* 4K@60Hz 4:4:4 or RGB.
|
||||
*/
|
||||
if (mode->clock > 340000)
|
||||
if (mode->clock > 594000)
|
||||
return MODE_CLOCK_HIGH;
|
||||
|
||||
return MODE_OK;
|
||||
@ -295,7 +292,6 @@ static int sun8i_dw_hdmi_remove(struct platform_device *pdev)
|
||||
|
||||
static const struct sun8i_dw_hdmi_quirks sun8i_a83t_quirks = {
|
||||
.mode_valid = sun8i_dw_hdmi_mode_valid_a83t,
|
||||
.set_rate = true,
|
||||
};
|
||||
|
||||
static const struct sun8i_dw_hdmi_quirks sun50i_h6_quirks = {
|
||||
|
@ -179,7 +179,6 @@ struct sun8i_dw_hdmi_quirks {
|
||||
enum drm_mode_status (*mode_valid)(struct dw_hdmi *hdmi, void *data,
|
||||
const struct drm_display_info *info,
|
||||
const struct drm_display_mode *mode);
|
||||
unsigned int set_rate : 1;
|
||||
unsigned int use_drm_infoframe : 1;
|
||||
};
|
||||
|
||||
|
@ -104,29 +104,21 @@ static const struct dw_hdmi_mpll_config sun50i_h6_mpll_cfg[] = {
|
||||
|
||||
static const struct dw_hdmi_curr_ctrl sun50i_h6_cur_ctr[] = {
|
||||
/* pixelclk bpp8 bpp10 bpp12 */
|
||||
{ 25175000, { 0x0000, 0x0000, 0x0000 }, },
|
||||
{ 27000000, { 0x0012, 0x0000, 0x0000 }, },
|
||||
{ 59400000, { 0x0008, 0x0008, 0x0008 }, },
|
||||
{ 72000000, { 0x0008, 0x0008, 0x001b }, },
|
||||
{ 74250000, { 0x0013, 0x0013, 0x0013 }, },
|
||||
{ 90000000, { 0x0008, 0x001a, 0x001b }, },
|
||||
{ 118800000, { 0x001b, 0x001a, 0x001b }, },
|
||||
{ 144000000, { 0x001b, 0x001a, 0x0034 }, },
|
||||
{ 180000000, { 0x001b, 0x0033, 0x0034 }, },
|
||||
{ 216000000, { 0x0036, 0x0033, 0x0034 }, },
|
||||
{ 237600000, { 0x0036, 0x0033, 0x001b }, },
|
||||
{ 288000000, { 0x0036, 0x001b, 0x001b }, },
|
||||
{ 297000000, { 0x0019, 0x001b, 0x0019 }, },
|
||||
{ 330000000, { 0x0036, 0x001b, 0x001b }, },
|
||||
{ 594000000, { 0x003f, 0x001b, 0x001b }, },
|
||||
{ 74250000, { 0x0013, 0x001a, 0x001b }, },
|
||||
{ 148500000, { 0x0019, 0x0033, 0x0034 }, },
|
||||
{ 297000000, { 0x0019, 0x001b, 0x001b }, },
|
||||
{ 594000000, { 0x0010, 0x001b, 0x001b }, },
|
||||
{ ~0UL, { 0x0000, 0x0000, 0x0000 }, }
|
||||
};
|
||||
|
||||
static const struct dw_hdmi_phy_config sun50i_h6_phy_config[] = {
|
||||
/*pixelclk symbol term vlev*/
|
||||
{ 74250000, 0x8009, 0x0004, 0x0232},
|
||||
{ 148500000, 0x8029, 0x0004, 0x0273},
|
||||
{ 594000000, 0x8039, 0x0004, 0x014a},
|
||||
{ 27000000, 0x8009, 0x0007, 0x02b0 },
|
||||
{ 74250000, 0x8009, 0x0006, 0x022d },
|
||||
{ 148500000, 0x8029, 0x0006, 0x0270 },
|
||||
{ 297000000, 0x8039, 0x0005, 0x01ab },
|
||||
{ 594000000, 0x8029, 0x0000, 0x008a },
|
||||
{ ~0UL, 0x0000, 0x0000, 0x0000}
|
||||
};
|
||||
|
||||
|
@ -33,6 +33,7 @@
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/highmem.h>
|
||||
|
||||
#ifdef CONFIG_X86
|
||||
#include <asm/set_memory.h>
|
||||
@ -218,6 +219,15 @@ static void ttm_pool_unmap(struct ttm_pool *pool, dma_addr_t dma_addr,
|
||||
/* Give pages into a specific pool_type */
|
||||
static void ttm_pool_type_give(struct ttm_pool_type *pt, struct page *p)
|
||||
{
|
||||
unsigned int i, num_pages = 1 << pt->order;
|
||||
|
||||
for (i = 0; i < num_pages; ++i) {
|
||||
if (PageHighMem(p))
|
||||
clear_highpage(p + i);
|
||||
else
|
||||
clear_page(page_address(p + i));
|
||||
}
|
||||
|
||||
spin_lock(&pt->lock);
|
||||
list_add(&p->lru, &pt->pages);
|
||||
spin_unlock(&pt->lock);
|
||||
|
@ -220,7 +220,7 @@ static void vc4_plane_reset(struct drm_plane *plane)
|
||||
__drm_atomic_helper_plane_reset(plane, &vc4_state->base);
|
||||
}
|
||||
|
||||
static void vc4_dlist_write(struct vc4_plane_state *vc4_state, u32 val)
|
||||
static void vc4_dlist_counter_increment(struct vc4_plane_state *vc4_state)
|
||||
{
|
||||
if (vc4_state->dlist_count == vc4_state->dlist_size) {
|
||||
u32 new_size = max(4u, vc4_state->dlist_count * 2);
|
||||
@ -235,7 +235,15 @@ static void vc4_dlist_write(struct vc4_plane_state *vc4_state, u32 val)
|
||||
vc4_state->dlist_size = new_size;
|
||||
}
|
||||
|
||||
vc4_state->dlist[vc4_state->dlist_count++] = val;
|
||||
vc4_state->dlist_count++;
|
||||
}
|
||||
|
||||
static void vc4_dlist_write(struct vc4_plane_state *vc4_state, u32 val)
|
||||
{
|
||||
unsigned int idx = vc4_state->dlist_count;
|
||||
|
||||
vc4_dlist_counter_increment(vc4_state);
|
||||
vc4_state->dlist[idx] = val;
|
||||
}
|
||||
|
||||
/* Returns the scl0/scl1 field based on whether the dimensions need to
|
||||
@ -978,8 +986,10 @@ static int vc4_plane_mode_set(struct drm_plane *plane,
|
||||
* be set when calling vc4_plane_allocate_lbm().
|
||||
*/
|
||||
if (vc4_state->y_scaling[0] != VC4_SCALING_NONE ||
|
||||
vc4_state->y_scaling[1] != VC4_SCALING_NONE)
|
||||
vc4_state->lbm_offset = vc4_state->dlist_count++;
|
||||
vc4_state->y_scaling[1] != VC4_SCALING_NONE) {
|
||||
vc4_state->lbm_offset = vc4_state->dlist_count;
|
||||
vc4_dlist_counter_increment(vc4_state);
|
||||
}
|
||||
|
||||
if (num_planes > 1) {
|
||||
/* Emit Cb/Cr as channel 0 and Y as channel
|
||||
|
@ -1396,19 +1396,11 @@ static void zynqmp_disp_enable(struct zynqmp_disp *disp)
|
||||
*/
|
||||
static void zynqmp_disp_disable(struct zynqmp_disp *disp)
|
||||
{
|
||||
struct drm_crtc *crtc = &disp->crtc;
|
||||
|
||||
zynqmp_disp_audio_disable(&disp->audio);
|
||||
|
||||
zynqmp_disp_avbuf_disable_audio(&disp->avbuf);
|
||||
zynqmp_disp_avbuf_disable_channels(&disp->avbuf);
|
||||
zynqmp_disp_avbuf_disable(&disp->avbuf);
|
||||
|
||||
/* Mark the flip is done as crtc is disabled anyway */
|
||||
if (crtc->state->event) {
|
||||
complete_all(crtc->state->event->base.completion);
|
||||
crtc->state->event = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
static inline struct zynqmp_disp *crtc_to_disp(struct drm_crtc *crtc)
|
||||
@ -1499,6 +1491,13 @@ zynqmp_disp_crtc_atomic_disable(struct drm_crtc *crtc,
|
||||
|
||||
drm_crtc_vblank_off(&disp->crtc);
|
||||
|
||||
spin_lock_irq(&crtc->dev->event_lock);
|
||||
if (crtc->state->event) {
|
||||
drm_crtc_send_vblank_event(crtc, crtc->state->event);
|
||||
crtc->state->event = NULL;
|
||||
}
|
||||
spin_unlock_irq(&crtc->dev->event_lock);
|
||||
|
||||
clk_disable_unprepare(disp->pclk);
|
||||
pm_runtime_put_sync(disp->dev);
|
||||
}
|
||||
|
@ -57,6 +57,8 @@
|
||||
#define STM32F7_I2C_CR1_RXDMAEN BIT(15)
|
||||
#define STM32F7_I2C_CR1_TXDMAEN BIT(14)
|
||||
#define STM32F7_I2C_CR1_ANFOFF BIT(12)
|
||||
#define STM32F7_I2C_CR1_DNF_MASK GENMASK(11, 8)
|
||||
#define STM32F7_I2C_CR1_DNF(n) (((n) & 0xf) << 8)
|
||||
#define STM32F7_I2C_CR1_ERRIE BIT(7)
|
||||
#define STM32F7_I2C_CR1_TCIE BIT(6)
|
||||
#define STM32F7_I2C_CR1_STOPIE BIT(5)
|
||||
@ -160,7 +162,7 @@ enum {
|
||||
};
|
||||
|
||||
#define STM32F7_I2C_DNF_DEFAULT 0
|
||||
#define STM32F7_I2C_DNF_MAX 16
|
||||
#define STM32F7_I2C_DNF_MAX 15
|
||||
|
||||
#define STM32F7_I2C_ANALOG_FILTER_ENABLE 1
|
||||
#define STM32F7_I2C_ANALOG_FILTER_DELAY_MIN 50 /* ns */
|
||||
@ -725,6 +727,13 @@ static void stm32f7_i2c_hw_config(struct stm32f7_i2c_dev *i2c_dev)
|
||||
else
|
||||
stm32f7_i2c_set_bits(i2c_dev->base + STM32F7_I2C_CR1,
|
||||
STM32F7_I2C_CR1_ANFOFF);
|
||||
|
||||
/* Program the Digital Filter */
|
||||
stm32f7_i2c_clr_bits(i2c_dev->base + STM32F7_I2C_CR1,
|
||||
STM32F7_I2C_CR1_DNF_MASK);
|
||||
stm32f7_i2c_set_bits(i2c_dev->base + STM32F7_I2C_CR1,
|
||||
STM32F7_I2C_CR1_DNF(i2c_dev->setup.dnf));
|
||||
|
||||
stm32f7_i2c_set_bits(i2c_dev->base + STM32F7_I2C_CR1,
|
||||
STM32F7_I2C_CR1_PE);
|
||||
}
|
||||
|
@ -6881,6 +6881,7 @@ static void __exit scsi_debug_exit(void)
|
||||
|
||||
sdebug_erase_all_stores(false);
|
||||
xa_destroy(per_store_ap);
|
||||
kfree(sdebug_q_arr);
|
||||
}
|
||||
|
||||
device_initcall(scsi_debug_init);
|
||||
|
@ -115,7 +115,6 @@ int xenbus_probe_node(struct xen_bus_type *bus,
|
||||
const char *type,
|
||||
const char *nodename);
|
||||
int xenbus_probe_devices(struct xen_bus_type *bus);
|
||||
void xenbus_probe(void);
|
||||
|
||||
void xenbus_dev_changed(const char *node, struct xen_bus_type *bus);
|
||||
|
||||
|
@ -683,7 +683,7 @@ void unregister_xenstore_notifier(struct notifier_block *nb)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(unregister_xenstore_notifier);
|
||||
|
||||
void xenbus_probe(void)
|
||||
static void xenbus_probe(void)
|
||||
{
|
||||
xenstored_ready = 1;
|
||||
|
||||
|
@ -3044,6 +3044,8 @@ int __cold open_ctree(struct super_block *sb, struct btrfs_fs_devices *fs_device
|
||||
goto fail_alloc;
|
||||
}
|
||||
|
||||
fs_info->csum_size = btrfs_super_csum_size(disk_super);
|
||||
|
||||
ret = btrfs_init_csum_hash(fs_info, csum_type);
|
||||
if (ret) {
|
||||
err = ret;
|
||||
@ -3161,7 +3163,6 @@ int __cold open_ctree(struct super_block *sb, struct btrfs_fs_devices *fs_device
|
||||
fs_info->nodesize = nodesize;
|
||||
fs_info->sectorsize = sectorsize;
|
||||
fs_info->sectorsize_bits = ilog2(sectorsize);
|
||||
fs_info->csum_size = btrfs_super_csum_size(disk_super);
|
||||
fs_info->csums_per_leaf = BTRFS_MAX_ITEM_SIZE(fs_info) / fs_info->csum_size;
|
||||
fs_info->stripesize = stripesize;
|
||||
|
||||
|
@ -469,7 +469,7 @@ cifs_show_cache_flavor(struct seq_file *s, struct cifs_sb_info *cifs_sb)
|
||||
static int cifs_show_devname(struct seq_file *m, struct dentry *root)
|
||||
{
|
||||
struct cifs_sb_info *cifs_sb = CIFS_SB(root->d_sb);
|
||||
char *devname = kstrdup(cifs_sb->ctx->UNC, GFP_KERNEL);
|
||||
char *devname = kstrdup(cifs_sb->ctx->source, GFP_KERNEL);
|
||||
|
||||
if (devname == NULL)
|
||||
seq_puts(m, "none");
|
||||
|
@ -2756,6 +2756,7 @@ int cifs_setup_cifs_sb(struct cifs_sb_info *cifs_sb)
|
||||
cifs_sb->prepath = kstrdup(ctx->prepath, GFP_KERNEL);
|
||||
if (cifs_sb->prepath == NULL)
|
||||
return -ENOMEM;
|
||||
cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_USE_PREFIX_PATH;
|
||||
}
|
||||
|
||||
return 0;
|
||||
@ -2983,6 +2984,14 @@ expand_dfs_referral(const unsigned int xid, struct cifs_ses *ses,
|
||||
rc = PTR_ERR(mdata);
|
||||
mdata = NULL;
|
||||
} else {
|
||||
/*
|
||||
* We can not clear out the whole structure since we
|
||||
* no longer have an explicit function to parse
|
||||
* a mount-string. Instead we need to clear out the
|
||||
* individual fields that are no longer valid.
|
||||
*/
|
||||
kfree(ctx->prepath);
|
||||
ctx->prepath = NULL;
|
||||
rc = cifs_setup_volume_info(ctx, mdata, fake_devname);
|
||||
}
|
||||
kfree(fake_devname);
|
||||
|
@ -148,7 +148,6 @@ const struct fs_parameter_spec smb3_fs_parameters[] = {
|
||||
|
||||
/* Mount options which take string value */
|
||||
fsparam_string("source", Opt_source),
|
||||
fsparam_string("unc", Opt_source),
|
||||
fsparam_string("user", Opt_user),
|
||||
fsparam_string("username", Opt_user),
|
||||
fsparam_string("pass", Opt_pass),
|
||||
@ -178,6 +177,11 @@ const struct fs_parameter_spec smb3_fs_parameters[] = {
|
||||
fsparam_flag_no("auto", Opt_ignore),
|
||||
fsparam_string("cred", Opt_ignore),
|
||||
fsparam_string("credentials", Opt_ignore),
|
||||
/*
|
||||
* UNC and prefixpath is now extracted from Opt_source
|
||||
* in the new mount API so we can just ignore them going forward.
|
||||
*/
|
||||
fsparam_string("unc", Opt_ignore),
|
||||
fsparam_string("prefixpath", Opt_ignore),
|
||||
{}
|
||||
};
|
||||
@ -313,6 +317,7 @@ smb3_fs_context_dup(struct smb3_fs_context *new_ctx, struct smb3_fs_context *ctx
|
||||
new_ctx->password = NULL;
|
||||
new_ctx->domainname = NULL;
|
||||
new_ctx->UNC = NULL;
|
||||
new_ctx->source = NULL;
|
||||
new_ctx->iocharset = NULL;
|
||||
|
||||
/*
|
||||
@ -323,6 +328,7 @@ smb3_fs_context_dup(struct smb3_fs_context *new_ctx, struct smb3_fs_context *ctx
|
||||
DUP_CTX_STR(username);
|
||||
DUP_CTX_STR(password);
|
||||
DUP_CTX_STR(UNC);
|
||||
DUP_CTX_STR(source);
|
||||
DUP_CTX_STR(domainname);
|
||||
DUP_CTX_STR(nodename);
|
||||
DUP_CTX_STR(iocharset);
|
||||
@ -732,6 +738,7 @@ static int smb3_reconfigure(struct fs_context *fc)
|
||||
* just use what we already have in cifs_sb->ctx.
|
||||
*/
|
||||
STEAL_STRING(cifs_sb, ctx, UNC);
|
||||
STEAL_STRING(cifs_sb, ctx, source);
|
||||
STEAL_STRING(cifs_sb, ctx, username);
|
||||
STEAL_STRING(cifs_sb, ctx, password);
|
||||
STEAL_STRING(cifs_sb, ctx, domainname);
|
||||
@ -974,6 +981,11 @@ static int smb3_fs_context_parse_param(struct fs_context *fc,
|
||||
cifs_dbg(VFS, "Unknown error parsing devname\n");
|
||||
goto cifs_parse_mount_err;
|
||||
}
|
||||
ctx->source = kstrdup(param->string, GFP_KERNEL);
|
||||
if (ctx->source == NULL) {
|
||||
cifs_dbg(VFS, "OOM when copying UNC string\n");
|
||||
goto cifs_parse_mount_err;
|
||||
}
|
||||
fc->source = kstrdup(param->string, GFP_KERNEL);
|
||||
if (fc->source == NULL) {
|
||||
cifs_dbg(VFS, "OOM when copying UNC string\n");
|
||||
@ -1396,6 +1408,8 @@ smb3_cleanup_fs_context_contents(struct smb3_fs_context *ctx)
|
||||
ctx->password = NULL;
|
||||
kfree(ctx->UNC);
|
||||
ctx->UNC = NULL;
|
||||
kfree(ctx->source);
|
||||
ctx->source = NULL;
|
||||
kfree(ctx->domainname);
|
||||
ctx->domainname = NULL;
|
||||
kfree(ctx->nodename);
|
||||
@ -1533,8 +1547,8 @@ void smb3_update_mnt_flags(struct cifs_sb_info *cifs_sb)
|
||||
cifs_sb->mnt_cifs_flags |= (CIFS_MOUNT_MULTIUSER |
|
||||
CIFS_MOUNT_NO_PERM);
|
||||
else
|
||||
cifs_sb->mnt_cifs_flags &= ~(CIFS_MOUNT_MULTIUSER |
|
||||
CIFS_MOUNT_NO_PERM);
|
||||
cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_MULTIUSER;
|
||||
|
||||
|
||||
if (ctx->strict_io)
|
||||
cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_STRICT_IO;
|
||||
|
@ -159,6 +159,7 @@ struct smb3_fs_context {
|
||||
char *username;
|
||||
char *password;
|
||||
char *domainname;
|
||||
char *source;
|
||||
char *UNC;
|
||||
char *nodename;
|
||||
char *iocharset; /* local code page for mapping to and from Unicode */
|
||||
|
@ -857,7 +857,8 @@ static const struct io_op_def io_op_defs[] = {
|
||||
.pollout = 1,
|
||||
.needs_async_data = 1,
|
||||
.async_size = sizeof(struct io_async_msghdr),
|
||||
.work_flags = IO_WQ_WORK_MM | IO_WQ_WORK_BLKCG,
|
||||
.work_flags = IO_WQ_WORK_MM | IO_WQ_WORK_BLKCG |
|
||||
IO_WQ_WORK_FS,
|
||||
},
|
||||
[IORING_OP_RECVMSG] = {
|
||||
.needs_file = 1,
|
||||
@ -866,7 +867,8 @@ static const struct io_op_def io_op_defs[] = {
|
||||
.buffer_select = 1,
|
||||
.needs_async_data = 1,
|
||||
.async_size = sizeof(struct io_async_msghdr),
|
||||
.work_flags = IO_WQ_WORK_MM | IO_WQ_WORK_BLKCG,
|
||||
.work_flags = IO_WQ_WORK_MM | IO_WQ_WORK_BLKCG |
|
||||
IO_WQ_WORK_FS,
|
||||
},
|
||||
[IORING_OP_TIMEOUT] = {
|
||||
.needs_async_data = 1,
|
||||
|
@ -192,8 +192,6 @@ void xs_suspend_cancel(void);
|
||||
|
||||
struct work_struct;
|
||||
|
||||
void xenbus_probe(void);
|
||||
|
||||
#define XENBUS_IS_ERR_READ(str) ({ \
|
||||
if (!IS_ERR(str) && strlen(str) == 0) { \
|
||||
kfree(str); \
|
||||
|
@ -918,6 +918,9 @@ int cgroup1_parse_param(struct fs_context *fc, struct fs_parameter *param)
|
||||
for_each_subsys(ss, i) {
|
||||
if (strcmp(param->key, ss->legacy_name))
|
||||
continue;
|
||||
if (!cgroup_ssid_enabled(i) || cgroup1_ssid_disabled(i))
|
||||
return invalfc(fc, "Disabled controller '%s'",
|
||||
param->key);
|
||||
ctx->subsys_mask |= (1 << i);
|
||||
return 0;
|
||||
}
|
||||
|
@ -3566,6 +3566,7 @@ static ssize_t cgroup_pressure_write(struct kernfs_open_file *of, char *buf,
|
||||
{
|
||||
struct psi_trigger *new;
|
||||
struct cgroup *cgrp;
|
||||
struct psi_group *psi;
|
||||
|
||||
cgrp = cgroup_kn_lock_live(of->kn, false);
|
||||
if (!cgrp)
|
||||
@ -3574,7 +3575,8 @@ static ssize_t cgroup_pressure_write(struct kernfs_open_file *of, char *buf,
|
||||
cgroup_get(cgrp);
|
||||
cgroup_kn_unlock(of->kn);
|
||||
|
||||
new = psi_trigger_create(&cgrp->psi, buf, nbytes, res);
|
||||
psi = cgroup_ino(cgrp) == 1 ? &psi_system : &cgrp->psi;
|
||||
new = psi_trigger_create(psi, buf, nbytes, res);
|
||||
if (IS_ERR(new)) {
|
||||
cgroup_put(cgrp);
|
||||
return PTR_ERR(new);
|
||||
|
@ -2746,7 +2746,7 @@ trace_event_buffer_lock_reserve(struct trace_buffer **current_rb,
|
||||
(entry = this_cpu_read(trace_buffered_event))) {
|
||||
/* Try to use the per cpu buffer first */
|
||||
val = this_cpu_inc_return(trace_buffered_event_cnt);
|
||||
if (val == 1) {
|
||||
if ((len < (PAGE_SIZE - sizeof(*entry))) && val == 1) {
|
||||
trace_event_setup(entry, type, flags, pc);
|
||||
entry->array[0] = len;
|
||||
return entry;
|
||||
|
@ -265,7 +265,11 @@ if ($arch eq "x86_64") {
|
||||
|
||||
# force flags for this arch
|
||||
$ld .= " -m shlelf_linux";
|
||||
$objcopy .= " -O elf32-sh-linux";
|
||||
if ($endian eq "big") {
|
||||
$objcopy .= " -O elf32-shbig-linux";
|
||||
} else {
|
||||
$objcopy .= " -O elf32-sh-linux";
|
||||
}
|
||||
|
||||
} elsif ($arch eq "powerpc") {
|
||||
my $ldemulation;
|
||||
|
Loading…
Reference in New Issue
Block a user