mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-06 19:08:57 +09:00
Merge 4f12b742eb ("Merge tag 'nfs-for-5.17-3' of git://git.linux-nfs.org/projects/anna/linux-nfs") into android-mainline
Steps on the way to 5.17-rc5 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com> Change-Id: I2c9e7bc334ef8d441db437626bead3f3b0c27ff9
This commit is contained in:
@@ -8,6 +8,7 @@ title: Audio codec controlled by ChromeOS EC
|
||||
|
||||
maintainers:
|
||||
- Cheng-Yi Chiang <cychiang@chromium.org>
|
||||
- Tzung-Bi Shih <tzungbi@google.com>
|
||||
|
||||
description: |
|
||||
Google's ChromeOS EC codec is a digital mic codec provided by the
|
||||
|
||||
@@ -4547,6 +4547,7 @@ F: drivers/platform/chrome/
|
||||
|
||||
CHROMEOS EC CODEC DRIVER
|
||||
M: Cheng-Yi Chiang <cychiang@chromium.org>
|
||||
M: Tzung-Bi Shih <tzungbi@google.com>
|
||||
R: Guenter Roeck <groeck@chromium.org>
|
||||
S: Maintained
|
||||
F: Documentation/devicetree/bindings/sound/google,cros-ec-codec.yaml
|
||||
|
||||
@@ -106,7 +106,7 @@
|
||||
msr_s SYS_ICC_SRE_EL2, x0
|
||||
isb // Make sure SRE is now set
|
||||
mrs_s x0, SYS_ICC_SRE_EL2 // Read SRE back,
|
||||
tbz x0, #0, 1f // and check that it sticks
|
||||
tbz x0, #0, .Lskip_gicv3_\@ // and check that it sticks
|
||||
msr_s SYS_ICH_HCR_EL2, xzr // Reset ICC_HCR_EL2 to defaults
|
||||
.Lskip_gicv3_\@:
|
||||
.endm
|
||||
|
||||
@@ -421,14 +421,14 @@ InstructionTLBMiss:
|
||||
*/
|
||||
/* Get PTE (linux-style) and check access */
|
||||
mfspr r3,SPRN_IMISS
|
||||
#ifdef CONFIG_MODULES
|
||||
#if defined(CONFIG_MODULES) || defined(CONFIG_DEBUG_PAGEALLOC) || defined(CONFIG_KFENCE)
|
||||
lis r1, TASK_SIZE@h /* check if kernel address */
|
||||
cmplw 0,r1,r3
|
||||
#endif
|
||||
mfspr r2, SPRN_SDR1
|
||||
li r1,_PAGE_PRESENT | _PAGE_ACCESSED | _PAGE_EXEC | _PAGE_USER
|
||||
rlwinm r2, r2, 28, 0xfffff000
|
||||
#ifdef CONFIG_MODULES
|
||||
#if defined(CONFIG_MODULES) || defined(CONFIG_DEBUG_PAGEALLOC) || defined(CONFIG_KFENCE)
|
||||
bgt- 112f
|
||||
lis r2, (swapper_pg_dir - PAGE_OFFSET)@ha /* if kernel address, use */
|
||||
li r1,_PAGE_PRESENT | _PAGE_ACCESSED | _PAGE_EXEC
|
||||
|
||||
@@ -3264,12 +3264,14 @@ void emulate_update_regs(struct pt_regs *regs, struct instruction_op *op)
|
||||
case BARRIER_EIEIO:
|
||||
eieio();
|
||||
break;
|
||||
#ifdef CONFIG_PPC64
|
||||
case BARRIER_LWSYNC:
|
||||
asm volatile("lwsync" : : : "memory");
|
||||
break;
|
||||
case BARRIER_PTESYNC:
|
||||
asm volatile("ptesync" : : : "memory");
|
||||
break;
|
||||
#endif
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
* Copyright (c) 2020 Western Digital Corporation or its affiliates.
|
||||
*/
|
||||
|
||||
#include <linux/bits.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/pm.h>
|
||||
#include <linux/reboot.h>
|
||||
@@ -85,7 +86,7 @@ static unsigned long __sbi_v01_cpumask_to_hartmask(const struct cpumask *cpu_mas
|
||||
pr_warn("Unable to send any request to hartid > BITS_PER_LONG for SBI v0.1\n");
|
||||
break;
|
||||
}
|
||||
hmask |= 1 << hartid;
|
||||
hmask |= BIT(hartid);
|
||||
}
|
||||
|
||||
return hmask;
|
||||
@@ -160,7 +161,7 @@ static int __sbi_send_ipi_v01(const struct cpumask *cpu_mask)
|
||||
{
|
||||
unsigned long hart_mask;
|
||||
|
||||
if (!cpu_mask)
|
||||
if (!cpu_mask || cpumask_empty(cpu_mask))
|
||||
cpu_mask = cpu_online_mask;
|
||||
hart_mask = __sbi_v01_cpumask_to_hartmask(cpu_mask);
|
||||
|
||||
@@ -176,7 +177,7 @@ static int __sbi_rfence_v01(int fid, const struct cpumask *cpu_mask,
|
||||
int result = 0;
|
||||
unsigned long hart_mask;
|
||||
|
||||
if (!cpu_mask)
|
||||
if (!cpu_mask || cpumask_empty(cpu_mask))
|
||||
cpu_mask = cpu_online_mask;
|
||||
hart_mask = __sbi_v01_cpumask_to_hartmask(cpu_mask);
|
||||
|
||||
@@ -249,26 +250,37 @@ static void __sbi_set_timer_v02(uint64_t stime_value)
|
||||
|
||||
static int __sbi_send_ipi_v02(const struct cpumask *cpu_mask)
|
||||
{
|
||||
unsigned long hartid, cpuid, hmask = 0, hbase = 0;
|
||||
unsigned long hartid, cpuid, hmask = 0, hbase = 0, htop = 0;
|
||||
struct sbiret ret = {0};
|
||||
int result;
|
||||
|
||||
if (!cpu_mask)
|
||||
if (!cpu_mask || cpumask_empty(cpu_mask))
|
||||
cpu_mask = cpu_online_mask;
|
||||
|
||||
for_each_cpu(cpuid, cpu_mask) {
|
||||
hartid = cpuid_to_hartid_map(cpuid);
|
||||
if (hmask && ((hbase + BITS_PER_LONG) <= hartid)) {
|
||||
ret = sbi_ecall(SBI_EXT_IPI, SBI_EXT_IPI_SEND_IPI,
|
||||
hmask, hbase, 0, 0, 0, 0);
|
||||
if (ret.error)
|
||||
goto ecall_failed;
|
||||
hmask = 0;
|
||||
hbase = 0;
|
||||
if (hmask) {
|
||||
if (hartid + BITS_PER_LONG <= htop ||
|
||||
hbase + BITS_PER_LONG <= hartid) {
|
||||
ret = sbi_ecall(SBI_EXT_IPI,
|
||||
SBI_EXT_IPI_SEND_IPI, hmask,
|
||||
hbase, 0, 0, 0, 0);
|
||||
if (ret.error)
|
||||
goto ecall_failed;
|
||||
hmask = 0;
|
||||
} else if (hartid < hbase) {
|
||||
/* shift the mask to fit lower hartid */
|
||||
hmask <<= hbase - hartid;
|
||||
hbase = hartid;
|
||||
}
|
||||
}
|
||||
if (!hmask)
|
||||
if (!hmask) {
|
||||
hbase = hartid;
|
||||
hmask |= 1UL << (hartid - hbase);
|
||||
htop = hartid;
|
||||
} else if (hartid > htop) {
|
||||
htop = hartid;
|
||||
}
|
||||
hmask |= BIT(hartid - hbase);
|
||||
}
|
||||
|
||||
if (hmask) {
|
||||
@@ -344,25 +356,35 @@ static int __sbi_rfence_v02(int fid, const struct cpumask *cpu_mask,
|
||||
unsigned long start, unsigned long size,
|
||||
unsigned long arg4, unsigned long arg5)
|
||||
{
|
||||
unsigned long hartid, cpuid, hmask = 0, hbase = 0;
|
||||
unsigned long hartid, cpuid, hmask = 0, hbase = 0, htop = 0;
|
||||
int result;
|
||||
|
||||
if (!cpu_mask)
|
||||
if (!cpu_mask || cpumask_empty(cpu_mask))
|
||||
cpu_mask = cpu_online_mask;
|
||||
|
||||
for_each_cpu(cpuid, cpu_mask) {
|
||||
hartid = cpuid_to_hartid_map(cpuid);
|
||||
if (hmask && ((hbase + BITS_PER_LONG) <= hartid)) {
|
||||
result = __sbi_rfence_v02_call(fid, hmask, hbase,
|
||||
start, size, arg4, arg5);
|
||||
if (result)
|
||||
return result;
|
||||
hmask = 0;
|
||||
hbase = 0;
|
||||
if (hmask) {
|
||||
if (hartid + BITS_PER_LONG <= htop ||
|
||||
hbase + BITS_PER_LONG <= hartid) {
|
||||
result = __sbi_rfence_v02_call(fid, hmask,
|
||||
hbase, start, size, arg4, arg5);
|
||||
if (result)
|
||||
return result;
|
||||
hmask = 0;
|
||||
} else if (hartid < hbase) {
|
||||
/* shift the mask to fit lower hartid */
|
||||
hmask <<= hbase - hartid;
|
||||
hbase = hartid;
|
||||
}
|
||||
}
|
||||
if (!hmask)
|
||||
if (!hmask) {
|
||||
hbase = hartid;
|
||||
hmask |= 1UL << (hartid - hbase);
|
||||
htop = hartid;
|
||||
} else if (hartid > htop) {
|
||||
htop = hartid;
|
||||
}
|
||||
hmask |= BIT(hartid - hbase);
|
||||
}
|
||||
|
||||
if (hmask) {
|
||||
|
||||
@@ -7018,6 +7018,8 @@ static void bfq_exit_queue(struct elevator_queue *e)
|
||||
spin_unlock_irq(&bfqd->lock);
|
||||
#endif
|
||||
|
||||
wbt_enable_default(bfqd->queue);
|
||||
|
||||
kfree(bfqd);
|
||||
}
|
||||
|
||||
|
||||
@@ -284,13 +284,6 @@ void blk_queue_start_drain(struct request_queue *q)
|
||||
wake_up_all(&q->mq_freeze_wq);
|
||||
}
|
||||
|
||||
void blk_set_queue_dying(struct request_queue *q)
|
||||
{
|
||||
blk_queue_flag_set(QUEUE_FLAG_DYING, q);
|
||||
blk_queue_start_drain(q);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(blk_set_queue_dying);
|
||||
|
||||
/**
|
||||
* blk_cleanup_queue - shutdown a request queue
|
||||
* @q: request queue to shutdown
|
||||
@@ -308,7 +301,8 @@ void blk_cleanup_queue(struct request_queue *q)
|
||||
WARN_ON_ONCE(blk_queue_registered(q));
|
||||
|
||||
/* mark @q DYING, no new request or merges will be allowed afterwards */
|
||||
blk_set_queue_dying(q);
|
||||
blk_queue_flag_set(QUEUE_FLAG_DYING, q);
|
||||
blk_queue_start_drain(q);
|
||||
|
||||
blk_queue_flag_set(QUEUE_FLAG_NOMERGES, q);
|
||||
blk_queue_flag_set(QUEUE_FLAG_NOXMERGES, q);
|
||||
|
||||
@@ -446,7 +446,7 @@ static struct bio *bio_copy_kern(struct request_queue *q, void *data,
|
||||
if (bytes > len)
|
||||
bytes = len;
|
||||
|
||||
page = alloc_page(GFP_NOIO | gfp_mask);
|
||||
page = alloc_page(GFP_NOIO | __GFP_ZERO | gfp_mask);
|
||||
if (!page)
|
||||
goto cleanup;
|
||||
|
||||
|
||||
@@ -736,6 +736,10 @@ static void blk_complete_request(struct request *req)
|
||||
|
||||
/* Completion has already been traced */
|
||||
bio_clear_flag(bio, BIO_TRACE_COMPLETION);
|
||||
|
||||
if (req_op(req) == REQ_OP_ZONE_APPEND)
|
||||
bio->bi_iter.bi_sector = req->__sector;
|
||||
|
||||
if (!is_flush)
|
||||
bio_endio(bio);
|
||||
bio = next;
|
||||
|
||||
@@ -525,8 +525,6 @@ void elv_unregister_queue(struct request_queue *q)
|
||||
kobject_del(&e->kobj);
|
||||
|
||||
e->registered = 0;
|
||||
/* Re-enable throttling in case elevator disabled it */
|
||||
wbt_enable_default(q);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -548,6 +548,20 @@ out_free_ext_minor:
|
||||
}
|
||||
EXPORT_SYMBOL(device_add_disk);
|
||||
|
||||
/**
|
||||
* blk_mark_disk_dead - mark a disk as dead
|
||||
* @disk: disk to mark as dead
|
||||
*
|
||||
* Mark as disk as dead (e.g. surprise removed) and don't accept any new I/O
|
||||
* to this disk.
|
||||
*/
|
||||
void blk_mark_disk_dead(struct gendisk *disk)
|
||||
{
|
||||
set_bit(GD_DEAD, &disk->state);
|
||||
blk_queue_start_drain(disk->queue);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(blk_mark_disk_dead);
|
||||
|
||||
/**
|
||||
* del_gendisk - remove the gendisk
|
||||
* @disk: the struct gendisk to remove
|
||||
|
||||
@@ -96,6 +96,11 @@ static const struct dmi_system_id processor_power_dmi_table[] = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK Computer Inc."),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME,"L8400B series Notebook PC")},
|
||||
(void *)1},
|
||||
/* T40 can not handle C3 idle state */
|
||||
{ set_max_cstate, "IBM ThinkPad T40", {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "IBM"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "23737CU")},
|
||||
(void *)2},
|
||||
{},
|
||||
};
|
||||
|
||||
|
||||
@@ -400,7 +400,7 @@ int __init_or_acpilib acpi_table_parse_entries_array(
|
||||
|
||||
acpi_get_table(id, instance, &table_header);
|
||||
if (!table_header) {
|
||||
pr_warn("%4.4s not present\n", id);
|
||||
pr_debug("%4.4s not present\n", id);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
|
||||
@@ -79,6 +79,7 @@
|
||||
#include <linux/ioprio.h>
|
||||
#include <linux/blk-cgroup.h>
|
||||
#include <linux/sched/mm.h>
|
||||
#include <linux/statfs.h>
|
||||
|
||||
#include "loop.h"
|
||||
|
||||
@@ -774,8 +775,13 @@ static void loop_config_discard(struct loop_device *lo)
|
||||
granularity = 0;
|
||||
|
||||
} else {
|
||||
struct kstatfs sbuf;
|
||||
|
||||
max_discard_sectors = UINT_MAX >> 9;
|
||||
granularity = inode->i_sb->s_blocksize;
|
||||
if (!vfs_statfs(&file->f_path, &sbuf))
|
||||
granularity = sbuf.f_bsize;
|
||||
else
|
||||
max_discard_sectors = 0;
|
||||
}
|
||||
|
||||
if (max_discard_sectors) {
|
||||
|
||||
@@ -4112,7 +4112,7 @@ static void mtip_pci_remove(struct pci_dev *pdev)
|
||||
"Completion workers still active!\n");
|
||||
}
|
||||
|
||||
blk_set_queue_dying(dd->queue);
|
||||
blk_mark_disk_dead(dd->disk);
|
||||
set_bit(MTIP_DDF_REMOVE_PENDING_BIT, &dd->dd_flag);
|
||||
|
||||
/* Clean up the block layer. */
|
||||
|
||||
@@ -7185,7 +7185,7 @@ static ssize_t do_rbd_remove(struct bus_type *bus,
|
||||
* IO to complete/fail.
|
||||
*/
|
||||
blk_mq_freeze_queue(rbd_dev->disk->queue);
|
||||
blk_set_queue_dying(rbd_dev->disk->queue);
|
||||
blk_mark_disk_dead(rbd_dev->disk);
|
||||
}
|
||||
|
||||
del_gendisk(rbd_dev->disk);
|
||||
|
||||
@@ -2126,7 +2126,7 @@ static void blkfront_closing(struct blkfront_info *info)
|
||||
|
||||
/* No more blkif_request(). */
|
||||
blk_mq_stop_hw_queues(info->rq);
|
||||
blk_set_queue_dying(info->rq);
|
||||
blk_mark_disk_dead(info->gd);
|
||||
set_capacity(info->gd, 0);
|
||||
|
||||
for_each_rinfo(info, rinfo, i) {
|
||||
|
||||
@@ -2077,7 +2077,7 @@ static void __dm_destroy(struct mapped_device *md, bool wait)
|
||||
set_bit(DMF_FREEING, &md->flags);
|
||||
spin_unlock(&_minor_lock);
|
||||
|
||||
blk_set_queue_dying(md->queue);
|
||||
blk_mark_disk_dead(md->disk);
|
||||
|
||||
/*
|
||||
* Take suspend_lock so that presuspend and postsuspend methods
|
||||
|
||||
@@ -264,16 +264,20 @@ static int phram_setup(const char *val)
|
||||
}
|
||||
}
|
||||
|
||||
if (erasesize)
|
||||
div_u64_rem(len, (uint32_t)erasesize, &rem);
|
||||
|
||||
if (len == 0 || erasesize == 0 || erasesize > len
|
||||
|| erasesize > UINT_MAX || rem) {
|
||||
|| erasesize > UINT_MAX) {
|
||||
parse_err("illegal erasesize or len\n");
|
||||
ret = -EINVAL;
|
||||
goto error;
|
||||
}
|
||||
|
||||
div_u64_rem(len, (uint32_t)erasesize, &rem);
|
||||
if (rem) {
|
||||
parse_err("len is not multiple of erasesize\n");
|
||||
ret = -EINVAL;
|
||||
goto error;
|
||||
}
|
||||
|
||||
ret = register_device(name, start, len, (uint32_t)erasesize);
|
||||
if (ret)
|
||||
goto error;
|
||||
|
||||
@@ -42,7 +42,8 @@ config MTD_NAND_OMAP2
|
||||
tristate "OMAP2, OMAP3, OMAP4 and Keystone NAND controller"
|
||||
depends on ARCH_OMAP2PLUS || ARCH_KEYSTONE || ARCH_K3 || COMPILE_TEST
|
||||
depends on HAS_IOMEM
|
||||
select OMAP_GPMC if ARCH_K3
|
||||
select MEMORY
|
||||
select OMAP_GPMC
|
||||
help
|
||||
Support for NAND flash on Texas Instruments OMAP2, OMAP3, OMAP4
|
||||
and Keystone platforms.
|
||||
|
||||
@@ -2106,7 +2106,7 @@ static int brcmnand_read_by_pio(struct mtd_info *mtd, struct nand_chip *chip,
|
||||
mtd->oobsize / trans,
|
||||
host->hwcfg.sector_size_1k);
|
||||
|
||||
if (!ret) {
|
||||
if (ret != -EBADMSG) {
|
||||
*err_addr = brcmnand_get_uncorrecc_addr(ctrl);
|
||||
|
||||
if (*err_addr)
|
||||
|
||||
@@ -2285,7 +2285,7 @@ static int gpmi_nfc_exec_op(struct nand_chip *chip,
|
||||
this->hw.must_apply_timings = false;
|
||||
ret = gpmi_nfc_apply_timings(this);
|
||||
if (ret)
|
||||
return ret;
|
||||
goto out_pm;
|
||||
}
|
||||
|
||||
dev_dbg(this->dev, "%s: %d instructions\n", __func__, op->ninstrs);
|
||||
@@ -2414,6 +2414,7 @@ unmap:
|
||||
|
||||
this->bch = false;
|
||||
|
||||
out_pm:
|
||||
pm_runtime_mark_last_busy(this->dev);
|
||||
pm_runtime_put_autosuspend(this->dev);
|
||||
|
||||
|
||||
@@ -68,9 +68,14 @@ static struct ingenic_ecc *ingenic_ecc_get(struct device_node *np)
|
||||
struct ingenic_ecc *ecc;
|
||||
|
||||
pdev = of_find_device_by_node(np);
|
||||
if (!pdev || !platform_get_drvdata(pdev))
|
||||
if (!pdev)
|
||||
return ERR_PTR(-EPROBE_DEFER);
|
||||
|
||||
if (!platform_get_drvdata(pdev)) {
|
||||
put_device(&pdev->dev);
|
||||
return ERR_PTR(-EPROBE_DEFER);
|
||||
}
|
||||
|
||||
ecc = platform_get_drvdata(pdev);
|
||||
clk_prepare_enable(ecc->clk);
|
||||
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
/*
|
||||
* Copyright (c) 2016, The Linux Foundation. All rights reserved.
|
||||
*/
|
||||
|
||||
#include <linux/clk.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/bitops.h>
|
||||
@@ -3073,10 +3072,6 @@ static int qcom_nandc_probe(struct platform_device *pdev)
|
||||
if (dma_mapping_error(dev, nandc->base_dma))
|
||||
return -ENXIO;
|
||||
|
||||
ret = qcom_nandc_alloc(nandc);
|
||||
if (ret)
|
||||
goto err_nandc_alloc;
|
||||
|
||||
ret = clk_prepare_enable(nandc->core_clk);
|
||||
if (ret)
|
||||
goto err_core_clk;
|
||||
@@ -3085,6 +3080,10 @@ static int qcom_nandc_probe(struct platform_device *pdev)
|
||||
if (ret)
|
||||
goto err_aon_clk;
|
||||
|
||||
ret = qcom_nandc_alloc(nandc);
|
||||
if (ret)
|
||||
goto err_nandc_alloc;
|
||||
|
||||
ret = qcom_nandc_setup(nandc);
|
||||
if (ret)
|
||||
goto err_setup;
|
||||
@@ -3096,15 +3095,14 @@ static int qcom_nandc_probe(struct platform_device *pdev)
|
||||
return 0;
|
||||
|
||||
err_setup:
|
||||
qcom_nandc_unalloc(nandc);
|
||||
err_nandc_alloc:
|
||||
clk_disable_unprepare(nandc->aon_clk);
|
||||
err_aon_clk:
|
||||
clk_disable_unprepare(nandc->core_clk);
|
||||
err_core_clk:
|
||||
qcom_nandc_unalloc(nandc);
|
||||
err_nandc_alloc:
|
||||
dma_unmap_resource(dev, res->start, resource_size(res),
|
||||
DMA_BIDIRECTIONAL, 0);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
@@ -58,11 +58,11 @@ static int parse_qcomsmem_part(struct mtd_info *mtd,
|
||||
const struct mtd_partition **pparts,
|
||||
struct mtd_part_parser_data *data)
|
||||
{
|
||||
size_t len = SMEM_FLASH_PTABLE_HDR_LEN;
|
||||
int ret, i, j, tmpparts, numparts = 0;
|
||||
struct smem_flash_pentry *pentry;
|
||||
struct smem_flash_ptable *ptable;
|
||||
size_t len = SMEM_FLASH_PTABLE_HDR_LEN;
|
||||
struct mtd_partition *parts;
|
||||
int ret, i, numparts;
|
||||
char *name, *c;
|
||||
|
||||
if (IS_ENABLED(CONFIG_MTD_SPI_NOR_USE_4K_SECTORS)
|
||||
@@ -75,7 +75,8 @@ static int parse_qcomsmem_part(struct mtd_info *mtd,
|
||||
pr_debug("Parsing partition table info from SMEM\n");
|
||||
ptable = qcom_smem_get(SMEM_APPS, SMEM_AARM_PARTITION_TABLE, &len);
|
||||
if (IS_ERR(ptable)) {
|
||||
pr_err("Error reading partition table header\n");
|
||||
if (PTR_ERR(ptable) != -EPROBE_DEFER)
|
||||
pr_err("Error reading partition table header\n");
|
||||
return PTR_ERR(ptable);
|
||||
}
|
||||
|
||||
@@ -87,8 +88,8 @@ static int parse_qcomsmem_part(struct mtd_info *mtd,
|
||||
}
|
||||
|
||||
/* Ensure that # of partitions is less than the max we have allocated */
|
||||
numparts = le32_to_cpu(ptable->numparts);
|
||||
if (numparts > SMEM_FLASH_PTABLE_MAX_PARTS_V4) {
|
||||
tmpparts = le32_to_cpu(ptable->numparts);
|
||||
if (tmpparts > SMEM_FLASH_PTABLE_MAX_PARTS_V4) {
|
||||
pr_err("Partition numbers exceed the max limit\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
@@ -116,11 +117,17 @@ static int parse_qcomsmem_part(struct mtd_info *mtd,
|
||||
return PTR_ERR(ptable);
|
||||
}
|
||||
|
||||
for (i = 0; i < tmpparts; i++) {
|
||||
pentry = &ptable->pentry[i];
|
||||
if (pentry->name[0] != '\0')
|
||||
numparts++;
|
||||
}
|
||||
|
||||
parts = kcalloc(numparts, sizeof(*parts), GFP_KERNEL);
|
||||
if (!parts)
|
||||
return -ENOMEM;
|
||||
|
||||
for (i = 0; i < numparts; i++) {
|
||||
for (i = 0, j = 0; i < tmpparts; i++) {
|
||||
pentry = &ptable->pentry[i];
|
||||
if (pentry->name[0] == '\0')
|
||||
continue;
|
||||
@@ -135,24 +142,25 @@ static int parse_qcomsmem_part(struct mtd_info *mtd,
|
||||
for (c = name; *c != '\0'; c++)
|
||||
*c = tolower(*c);
|
||||
|
||||
parts[i].name = name;
|
||||
parts[i].offset = le32_to_cpu(pentry->offset) * mtd->erasesize;
|
||||
parts[i].mask_flags = pentry->attr;
|
||||
parts[i].size = le32_to_cpu(pentry->length) * mtd->erasesize;
|
||||
parts[j].name = name;
|
||||
parts[j].offset = le32_to_cpu(pentry->offset) * mtd->erasesize;
|
||||
parts[j].mask_flags = pentry->attr;
|
||||
parts[j].size = le32_to_cpu(pentry->length) * mtd->erasesize;
|
||||
pr_debug("%d: %s offs=0x%08x size=0x%08x attr:0x%08x\n",
|
||||
i, pentry->name, le32_to_cpu(pentry->offset),
|
||||
le32_to_cpu(pentry->length), pentry->attr);
|
||||
j++;
|
||||
}
|
||||
|
||||
pr_debug("SMEM partition table found: ver: %d len: %d\n",
|
||||
le32_to_cpu(ptable->version), numparts);
|
||||
le32_to_cpu(ptable->version), tmpparts);
|
||||
*pparts = parts;
|
||||
|
||||
return numparts;
|
||||
|
||||
out_free_parts:
|
||||
while (--i >= 0)
|
||||
kfree(parts[i].name);
|
||||
while (--j >= 0)
|
||||
kfree(parts[j].name);
|
||||
kfree(parts);
|
||||
*pparts = NULL;
|
||||
|
||||
@@ -166,6 +174,8 @@ static void parse_qcomsmem_cleanup(const struct mtd_partition *pparts,
|
||||
|
||||
for (i = 0; i < nr_parts; i++)
|
||||
kfree(pparts[i].name);
|
||||
|
||||
kfree(pparts);
|
||||
}
|
||||
|
||||
static const struct of_device_id qcomsmem_of_match_table[] = {
|
||||
|
||||
@@ -4574,7 +4574,7 @@ static void nvme_set_queue_dying(struct nvme_ns *ns)
|
||||
if (test_and_set_bit(NVME_NS_DEAD, &ns->flags))
|
||||
return;
|
||||
|
||||
blk_set_queue_dying(ns->queue);
|
||||
blk_mark_disk_dead(ns->disk);
|
||||
nvme_start_ns_queue(ns);
|
||||
|
||||
set_capacity_and_notify(ns->disk, 0);
|
||||
|
||||
@@ -848,7 +848,7 @@ void nvme_mpath_remove_disk(struct nvme_ns_head *head)
|
||||
{
|
||||
if (!head->disk)
|
||||
return;
|
||||
blk_set_queue_dying(head->disk->queue);
|
||||
blk_mark_disk_dead(head->disk);
|
||||
/* make sure all pending bios are cleaned up */
|
||||
kblockd_schedule_work(&head->requeue_work);
|
||||
flush_work(&head->requeue_work);
|
||||
|
||||
@@ -411,17 +411,12 @@ out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int init_clks(struct platform_device *pdev, struct clk **clk)
|
||||
static void init_clks(struct platform_device *pdev, struct clk **clk)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = CLK_NONE + 1; i < CLK_MAX; i++) {
|
||||
for (i = CLK_NONE + 1; i < CLK_MAX; i++)
|
||||
clk[i] = devm_clk_get(&pdev->dev, clk_names[i]);
|
||||
if (IS_ERR(clk[i]))
|
||||
return PTR_ERR(clk[i]);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct scp *init_scp(struct platform_device *pdev,
|
||||
@@ -431,7 +426,7 @@ static struct scp *init_scp(struct platform_device *pdev,
|
||||
{
|
||||
struct genpd_onecell_data *pd_data;
|
||||
struct resource *res;
|
||||
int i, j, ret;
|
||||
int i, j;
|
||||
struct scp *scp;
|
||||
struct clk *clk[CLK_MAX];
|
||||
|
||||
@@ -486,9 +481,7 @@ static struct scp *init_scp(struct platform_device *pdev,
|
||||
|
||||
pd_data->num_domains = num;
|
||||
|
||||
ret = init_clks(pdev, clk);
|
||||
if (ret)
|
||||
return ERR_PTR(ret);
|
||||
init_clks(pdev, clk);
|
||||
|
||||
for (i = 0; i < num; i++) {
|
||||
struct scp_domain *scpd = &scp->domains[i];
|
||||
|
||||
@@ -949,6 +949,9 @@ static void populate_new_aces(char *nacl_base,
|
||||
pnntace = (struct cifs_ace *) (nacl_base + nsize);
|
||||
nsize += setup_special_mode_ACE(pnntace, nmode);
|
||||
num_aces++;
|
||||
pnntace = (struct cifs_ace *) (nacl_base + nsize);
|
||||
nsize += setup_authusers_ACE(pnntace);
|
||||
num_aces++;
|
||||
goto set_size;
|
||||
}
|
||||
|
||||
@@ -1297,7 +1300,7 @@ static int build_sec_desc(struct cifs_ntsd *pntsd, struct cifs_ntsd *pnntsd,
|
||||
|
||||
if (uid_valid(uid)) { /* chown */
|
||||
uid_t id;
|
||||
nowner_sid_ptr = kmalloc(sizeof(struct cifs_sid),
|
||||
nowner_sid_ptr = kzalloc(sizeof(struct cifs_sid),
|
||||
GFP_KERNEL);
|
||||
if (!nowner_sid_ptr) {
|
||||
rc = -ENOMEM;
|
||||
@@ -1326,7 +1329,7 @@ static int build_sec_desc(struct cifs_ntsd *pntsd, struct cifs_ntsd *pnntsd,
|
||||
}
|
||||
if (gid_valid(gid)) { /* chgrp */
|
||||
gid_t id;
|
||||
ngroup_sid_ptr = kmalloc(sizeof(struct cifs_sid),
|
||||
ngroup_sid_ptr = kzalloc(sizeof(struct cifs_sid),
|
||||
GFP_KERNEL);
|
||||
if (!ngroup_sid_ptr) {
|
||||
rc = -ENOMEM;
|
||||
@@ -1613,7 +1616,7 @@ id_mode_to_cifs_acl(struct inode *inode, const char *path, __u64 *pnmode,
|
||||
nsecdesclen = secdesclen;
|
||||
if (pnmode && *pnmode != NO_CHANGE_64) { /* chmod */
|
||||
if (mode_from_sid)
|
||||
nsecdesclen += sizeof(struct cifs_ace);
|
||||
nsecdesclen += 2 * sizeof(struct cifs_ace);
|
||||
else /* cifsacl */
|
||||
nsecdesclen += 5 * sizeof(struct cifs_ace);
|
||||
} else { /* chown */
|
||||
|
||||
@@ -919,6 +919,7 @@ cifs_smb3_do_mount(struct file_system_type *fs_type,
|
||||
|
||||
out_super:
|
||||
deactivate_locked_super(sb);
|
||||
return root;
|
||||
out:
|
||||
if (cifs_sb) {
|
||||
kfree(cifs_sb->prepath);
|
||||
|
||||
@@ -149,7 +149,7 @@ const struct fs_parameter_spec smb3_fs_parameters[] = {
|
||||
fsparam_u32("echo_interval", Opt_echo_interval),
|
||||
fsparam_u32("max_credits", Opt_max_credits),
|
||||
fsparam_u32("handletimeout", Opt_handletimeout),
|
||||
fsparam_u32("snapshot", Opt_snapshot),
|
||||
fsparam_u64("snapshot", Opt_snapshot),
|
||||
fsparam_u32("max_channels", Opt_max_channels),
|
||||
|
||||
/* Mount options which take string value */
|
||||
@@ -1078,7 +1078,7 @@ static int smb3_fs_context_parse_param(struct fs_context *fc,
|
||||
ctx->echo_interval = result.uint_32;
|
||||
break;
|
||||
case Opt_snapshot:
|
||||
ctx->snapshot_time = result.uint_32;
|
||||
ctx->snapshot_time = result.uint_64;
|
||||
break;
|
||||
case Opt_max_credits:
|
||||
if (result.uint_32 < 20 || result.uint_32 > 60000) {
|
||||
|
||||
@@ -127,11 +127,6 @@ int cifs_try_adding_channels(struct cifs_sb_info *cifs_sb, struct cifs_ses *ses)
|
||||
struct cifs_server_iface *ifaces = NULL;
|
||||
size_t iface_count;
|
||||
|
||||
if (ses->server->dialect < SMB30_PROT_ID) {
|
||||
cifs_dbg(VFS, "multichannel is not supported on this protocol version, use 3.0 or above\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
spin_lock(&ses->chan_lock);
|
||||
|
||||
new_chan_count = old_chan_count = ses->chan_count;
|
||||
@@ -145,6 +140,12 @@ int cifs_try_adding_channels(struct cifs_sb_info *cifs_sb, struct cifs_ses *ses)
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (ses->server->dialect < SMB30_PROT_ID) {
|
||||
spin_unlock(&ses->chan_lock);
|
||||
cifs_dbg(VFS, "multichannel is not supported on this protocol version, use 3.0 or above\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!(ses->server->capabilities & SMB2_GLOBAL_CAP_MULTI_CHANNEL)) {
|
||||
ses->chan_max = 1;
|
||||
spin_unlock(&ses->chan_lock);
|
||||
|
||||
@@ -175,11 +175,13 @@ static int cifs_xattr_set(const struct xattr_handler *handler,
|
||||
switch (handler->flags) {
|
||||
case XATTR_CIFS_NTSD_FULL:
|
||||
aclflags = (CIFS_ACL_OWNER |
|
||||
CIFS_ACL_GROUP |
|
||||
CIFS_ACL_DACL |
|
||||
CIFS_ACL_SACL);
|
||||
break;
|
||||
case XATTR_CIFS_NTSD:
|
||||
aclflags = (CIFS_ACL_OWNER |
|
||||
CIFS_ACL_GROUP |
|
||||
CIFS_ACL_DACL);
|
||||
break;
|
||||
case XATTR_CIFS_ACL:
|
||||
|
||||
@@ -2010,14 +2010,14 @@ no_open:
|
||||
if (!res) {
|
||||
inode = d_inode(dentry);
|
||||
if ((lookup_flags & LOOKUP_DIRECTORY) && inode &&
|
||||
!S_ISDIR(inode->i_mode))
|
||||
!(S_ISDIR(inode->i_mode) || S_ISLNK(inode->i_mode)))
|
||||
res = ERR_PTR(-ENOTDIR);
|
||||
else if (inode && S_ISREG(inode->i_mode))
|
||||
res = ERR_PTR(-EOPENSTALE);
|
||||
} else if (!IS_ERR(res)) {
|
||||
inode = d_inode(res);
|
||||
if ((lookup_flags & LOOKUP_DIRECTORY) && inode &&
|
||||
!S_ISDIR(inode->i_mode)) {
|
||||
!(S_ISDIR(inode->i_mode) || S_ISLNK(inode->i_mode))) {
|
||||
dput(res);
|
||||
res = ERR_PTR(-ENOTDIR);
|
||||
} else if (inode && S_ISREG(inode->i_mode)) {
|
||||
|
||||
@@ -853,12 +853,9 @@ int nfs_getattr(struct user_namespace *mnt_userns, const struct path *path,
|
||||
}
|
||||
|
||||
/* Flush out writes to the server in order to update c/mtime. */
|
||||
if ((request_mask & (STATX_CTIME|STATX_MTIME)) &&
|
||||
S_ISREG(inode->i_mode)) {
|
||||
err = filemap_write_and_wait(inode->i_mapping);
|
||||
if (err)
|
||||
goto out;
|
||||
}
|
||||
if ((request_mask & (STATX_CTIME | STATX_MTIME)) &&
|
||||
S_ISREG(inode->i_mode))
|
||||
filemap_write_and_wait(inode->i_mapping);
|
||||
|
||||
/*
|
||||
* We may force a getattr if the user cares about atime.
|
||||
|
||||
@@ -1229,8 +1229,7 @@ nfs4_update_changeattr_locked(struct inode *inode,
|
||||
NFS_INO_INVALID_ACCESS | NFS_INO_INVALID_ACL |
|
||||
NFS_INO_INVALID_SIZE | NFS_INO_INVALID_OTHER |
|
||||
NFS_INO_INVALID_BLOCKS | NFS_INO_INVALID_NLINK |
|
||||
NFS_INO_INVALID_MODE | NFS_INO_INVALID_XATTR |
|
||||
NFS_INO_REVAL_PAGECACHE;
|
||||
NFS_INO_INVALID_MODE | NFS_INO_INVALID_XATTR;
|
||||
nfsi->attrtimeo = NFS_MINATTRTIMEO(inode);
|
||||
}
|
||||
nfsi->attrtimeo_timestamp = jiffies;
|
||||
|
||||
@@ -748,7 +748,8 @@ extern bool blk_queue_can_use_dma_map_merging(struct request_queue *q,
|
||||
|
||||
bool __must_check blk_get_queue(struct request_queue *);
|
||||
extern void blk_put_queue(struct request_queue *);
|
||||
extern void blk_set_queue_dying(struct request_queue *);
|
||||
|
||||
void blk_mark_disk_dead(struct gendisk *disk);
|
||||
|
||||
#ifdef CONFIG_BLOCK
|
||||
/*
|
||||
|
||||
@@ -511,7 +511,8 @@ static void *snd_dma_noncontig_alloc(struct snd_dma_buffer *dmab, size_t size)
|
||||
DEFAULT_GFP, 0);
|
||||
if (!sgt)
|
||||
return NULL;
|
||||
dmab->dev.need_sync = dma_need_sync(dmab->dev.dev, dmab->dev.dir);
|
||||
dmab->dev.need_sync = dma_need_sync(dmab->dev.dev,
|
||||
sg_dma_address(sgt->sgl));
|
||||
p = dma_vmap_noncontiguous(dmab->dev.dev, size, sgt);
|
||||
if (p)
|
||||
dmab->private_data = sgt;
|
||||
@@ -540,9 +541,9 @@ static void snd_dma_noncontig_sync(struct snd_dma_buffer *dmab,
|
||||
if (mode == SNDRV_DMA_SYNC_CPU) {
|
||||
if (dmab->dev.dir == DMA_TO_DEVICE)
|
||||
return;
|
||||
invalidate_kernel_vmap_range(dmab->area, dmab->bytes);
|
||||
dma_sync_sgtable_for_cpu(dmab->dev.dev, dmab->private_data,
|
||||
dmab->dev.dir);
|
||||
invalidate_kernel_vmap_range(dmab->area, dmab->bytes);
|
||||
} else {
|
||||
if (dmab->dev.dir == DMA_FROM_DEVICE)
|
||||
return;
|
||||
@@ -671,9 +672,13 @@ static const struct snd_malloc_ops snd_dma_sg_wc_ops = {
|
||||
*/
|
||||
static void *snd_dma_noncoherent_alloc(struct snd_dma_buffer *dmab, size_t size)
|
||||
{
|
||||
dmab->dev.need_sync = dma_need_sync(dmab->dev.dev, dmab->dev.dir);
|
||||
return dma_alloc_noncoherent(dmab->dev.dev, size, &dmab->addr,
|
||||
dmab->dev.dir, DEFAULT_GFP);
|
||||
void *p;
|
||||
|
||||
p = dma_alloc_noncoherent(dmab->dev.dev, size, &dmab->addr,
|
||||
dmab->dev.dir, DEFAULT_GFP);
|
||||
if (p)
|
||||
dmab->dev.need_sync = dma_need_sync(dmab->dev.dev, dmab->addr);
|
||||
return p;
|
||||
}
|
||||
|
||||
static void snd_dma_noncoherent_free(struct snd_dma_buffer *dmab)
|
||||
|
||||
@@ -1615,6 +1615,7 @@ static const struct snd_pci_quirk probe_mask_list[] = {
|
||||
/* forced codec slots */
|
||||
SND_PCI_QUIRK(0x1043, 0x1262, "ASUS W5Fm", 0x103),
|
||||
SND_PCI_QUIRK(0x1046, 0x1262, "ASUS W5F", 0x103),
|
||||
SND_PCI_QUIRK(0x1558, 0x0351, "Schenker Dock 15", 0x105),
|
||||
/* WinFast VP200 H (Teradici) user reported broken communication */
|
||||
SND_PCI_QUIRK(0x3a21, 0x040d, "WinFast VP200 H", 0x101),
|
||||
{}
|
||||
@@ -1798,8 +1799,6 @@ static int azx_create(struct snd_card *card, struct pci_dev *pci,
|
||||
|
||||
assign_position_fix(chip, check_position_fix(chip, position_fix[dev]));
|
||||
|
||||
check_probe_mask(chip, dev);
|
||||
|
||||
if (single_cmd < 0) /* allow fallback to single_cmd at errors */
|
||||
chip->fallback_to_single_cmd = 1;
|
||||
else /* explicitly set to single_cmd or not */
|
||||
@@ -1825,6 +1824,8 @@ static int azx_create(struct snd_card *card, struct pci_dev *pci,
|
||||
chip->bus.core.needs_damn_long_delay = 1;
|
||||
}
|
||||
|
||||
check_probe_mask(chip, dev);
|
||||
|
||||
err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops);
|
||||
if (err < 0) {
|
||||
dev_err(card->dev, "Error creating device [card]!\n");
|
||||
@@ -1940,6 +1941,7 @@ static int azx_first_init(struct azx *chip)
|
||||
dma_bits = 32;
|
||||
if (dma_set_mask_and_coherent(&pci->dev, DMA_BIT_MASK(dma_bits)))
|
||||
dma_set_mask_and_coherent(&pci->dev, DMA_BIT_MASK(32));
|
||||
dma_set_max_seg_size(&pci->dev, UINT_MAX);
|
||||
|
||||
/* read number of streams from GCAP register instead of using
|
||||
* hardcoded value
|
||||
|
||||
@@ -138,6 +138,22 @@ struct alc_spec {
|
||||
* COEF access helper functions
|
||||
*/
|
||||
|
||||
static void coef_mutex_lock(struct hda_codec *codec)
|
||||
{
|
||||
struct alc_spec *spec = codec->spec;
|
||||
|
||||
snd_hda_power_up_pm(codec);
|
||||
mutex_lock(&spec->coef_mutex);
|
||||
}
|
||||
|
||||
static void coef_mutex_unlock(struct hda_codec *codec)
|
||||
{
|
||||
struct alc_spec *spec = codec->spec;
|
||||
|
||||
mutex_unlock(&spec->coef_mutex);
|
||||
snd_hda_power_down_pm(codec);
|
||||
}
|
||||
|
||||
static int __alc_read_coefex_idx(struct hda_codec *codec, hda_nid_t nid,
|
||||
unsigned int coef_idx)
|
||||
{
|
||||
@@ -151,12 +167,11 @@ static int __alc_read_coefex_idx(struct hda_codec *codec, hda_nid_t nid,
|
||||
static int alc_read_coefex_idx(struct hda_codec *codec, hda_nid_t nid,
|
||||
unsigned int coef_idx)
|
||||
{
|
||||
struct alc_spec *spec = codec->spec;
|
||||
unsigned int val;
|
||||
|
||||
mutex_lock(&spec->coef_mutex);
|
||||
coef_mutex_lock(codec);
|
||||
val = __alc_read_coefex_idx(codec, nid, coef_idx);
|
||||
mutex_unlock(&spec->coef_mutex);
|
||||
coef_mutex_unlock(codec);
|
||||
return val;
|
||||
}
|
||||
|
||||
@@ -173,11 +188,9 @@ static void __alc_write_coefex_idx(struct hda_codec *codec, hda_nid_t nid,
|
||||
static void alc_write_coefex_idx(struct hda_codec *codec, hda_nid_t nid,
|
||||
unsigned int coef_idx, unsigned int coef_val)
|
||||
{
|
||||
struct alc_spec *spec = codec->spec;
|
||||
|
||||
mutex_lock(&spec->coef_mutex);
|
||||
coef_mutex_lock(codec);
|
||||
__alc_write_coefex_idx(codec, nid, coef_idx, coef_val);
|
||||
mutex_unlock(&spec->coef_mutex);
|
||||
coef_mutex_unlock(codec);
|
||||
}
|
||||
|
||||
#define alc_write_coef_idx(codec, coef_idx, coef_val) \
|
||||
@@ -198,11 +211,9 @@ static void alc_update_coefex_idx(struct hda_codec *codec, hda_nid_t nid,
|
||||
unsigned int coef_idx, unsigned int mask,
|
||||
unsigned int bits_set)
|
||||
{
|
||||
struct alc_spec *spec = codec->spec;
|
||||
|
||||
mutex_lock(&spec->coef_mutex);
|
||||
coef_mutex_lock(codec);
|
||||
__alc_update_coefex_idx(codec, nid, coef_idx, mask, bits_set);
|
||||
mutex_unlock(&spec->coef_mutex);
|
||||
coef_mutex_unlock(codec);
|
||||
}
|
||||
|
||||
#define alc_update_coef_idx(codec, coef_idx, mask, bits_set) \
|
||||
@@ -235,9 +246,7 @@ struct coef_fw {
|
||||
static void alc_process_coef_fw(struct hda_codec *codec,
|
||||
const struct coef_fw *fw)
|
||||
{
|
||||
struct alc_spec *spec = codec->spec;
|
||||
|
||||
mutex_lock(&spec->coef_mutex);
|
||||
coef_mutex_lock(codec);
|
||||
for (; fw->nid; fw++) {
|
||||
if (fw->mask == (unsigned short)-1)
|
||||
__alc_write_coefex_idx(codec, fw->nid, fw->idx, fw->val);
|
||||
@@ -245,7 +254,7 @@ static void alc_process_coef_fw(struct hda_codec *codec,
|
||||
__alc_update_coefex_idx(codec, fw->nid, fw->idx,
|
||||
fw->mask, fw->val);
|
||||
}
|
||||
mutex_unlock(&spec->coef_mutex);
|
||||
coef_mutex_unlock(codec);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -9170,6 +9179,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
||||
SND_PCI_QUIRK(0x17aa, 0x3824, "Legion Y9000X 2020", ALC285_FIXUP_LEGION_Y9000X_SPEAKERS),
|
||||
SND_PCI_QUIRK(0x17aa, 0x3827, "Ideapad S740", ALC285_FIXUP_IDEAPAD_S740_COEF),
|
||||
SND_PCI_QUIRK(0x17aa, 0x3834, "Lenovo IdeaPad Slim 9i 14ITL5", ALC287_FIXUP_YOGA7_14ITL_SPEAKERS),
|
||||
SND_PCI_QUIRK(0x17aa, 0x383d, "Legion Y9000X 2019", ALC285_FIXUP_LEGION_Y9000X_SPEAKERS),
|
||||
SND_PCI_QUIRK(0x17aa, 0x3843, "Yoga 9i", ALC287_FIXUP_IDEAPAD_BASS_SPK_AMP),
|
||||
SND_PCI_QUIRK(0x17aa, 0x3847, "Legion 7 16ACHG6", ALC287_FIXUP_LEGION_16ACHG6),
|
||||
SND_PCI_QUIRK(0x17aa, 0x384a, "Lenovo Yoga 7 15ITL5", ALC287_FIXUP_YOGA7_14ITL_SPEAKERS),
|
||||
|
||||
@@ -21,7 +21,6 @@
|
||||
#include <linux/gpio/consumer.h>
|
||||
|
||||
#define EN_SPKR_GPIO_GB 0x11F
|
||||
#define EN_SPKR_GPIO_NK 0x146
|
||||
#define EN_SPKR_GPIO_NONE -EINVAL
|
||||
|
||||
enum be_id {
|
||||
|
||||
@@ -37,7 +37,7 @@ static struct acp_card_drvdata sof_rt5682_max_data = {
|
||||
.hs_codec_id = RT5682,
|
||||
.amp_codec_id = MAX98360A,
|
||||
.dmic_codec_id = DMIC,
|
||||
.gpio_spkr_en = EN_SPKR_GPIO_NK,
|
||||
.gpio_spkr_en = EN_SPKR_GPIO_NONE,
|
||||
};
|
||||
|
||||
static struct acp_card_drvdata sof_rt5682s_max_data = {
|
||||
@@ -47,7 +47,7 @@ static struct acp_card_drvdata sof_rt5682s_max_data = {
|
||||
.hs_codec_id = RT5682S,
|
||||
.amp_codec_id = MAX98360A,
|
||||
.dmic_codec_id = DMIC,
|
||||
.gpio_spkr_en = EN_SPKR_GPIO_NK,
|
||||
.gpio_spkr_en = EN_SPKR_GPIO_NONE,
|
||||
};
|
||||
|
||||
static const struct snd_kcontrol_new acp_controls[] = {
|
||||
|
||||
@@ -1022,11 +1022,13 @@ static void rt5668_jack_detect_handler(struct work_struct *work)
|
||||
container_of(work, struct rt5668_priv, jack_detect_work.work);
|
||||
int val, btn_type;
|
||||
|
||||
while (!rt5668->component)
|
||||
usleep_range(10000, 15000);
|
||||
|
||||
while (!rt5668->component->card->instantiated)
|
||||
usleep_range(10000, 15000);
|
||||
if (!rt5668->component || !rt5668->component->card ||
|
||||
!rt5668->component->card->instantiated) {
|
||||
/* card not yet ready, try later */
|
||||
mod_delayed_work(system_power_efficient_wq,
|
||||
&rt5668->jack_detect_work, msecs_to_jiffies(15));
|
||||
return;
|
||||
}
|
||||
|
||||
mutex_lock(&rt5668->calibrate_mutex);
|
||||
|
||||
|
||||
@@ -1092,11 +1092,13 @@ void rt5682_jack_detect_handler(struct work_struct *work)
|
||||
struct snd_soc_dapm_context *dapm;
|
||||
int val, btn_type;
|
||||
|
||||
while (!rt5682->component)
|
||||
usleep_range(10000, 15000);
|
||||
|
||||
while (!rt5682->component->card->instantiated)
|
||||
usleep_range(10000, 15000);
|
||||
if (!rt5682->component || !rt5682->component->card ||
|
||||
!rt5682->component->card->instantiated) {
|
||||
/* card not yet ready, try later */
|
||||
mod_delayed_work(system_power_efficient_wq,
|
||||
&rt5682->jack_detect_work, msecs_to_jiffies(15));
|
||||
return;
|
||||
}
|
||||
|
||||
dapm = snd_soc_component_get_dapm(rt5682->component);
|
||||
|
||||
|
||||
@@ -824,11 +824,13 @@ static void rt5682s_jack_detect_handler(struct work_struct *work)
|
||||
container_of(work, struct rt5682s_priv, jack_detect_work.work);
|
||||
int val, btn_type;
|
||||
|
||||
while (!rt5682s->component)
|
||||
usleep_range(10000, 15000);
|
||||
|
||||
while (!rt5682s->component->card->instantiated)
|
||||
usleep_range(10000, 15000);
|
||||
if (!rt5682s->component || !rt5682s->component->card ||
|
||||
!rt5682s->component->card->instantiated) {
|
||||
/* card not yet ready, try later */
|
||||
mod_delayed_work(system_power_efficient_wq,
|
||||
&rt5682s->jack_detect_work, msecs_to_jiffies(15));
|
||||
return;
|
||||
}
|
||||
|
||||
mutex_lock(&rt5682s->jdet_mutex);
|
||||
mutex_lock(&rt5682s->calibrate_mutex);
|
||||
|
||||
@@ -38,10 +38,12 @@ static void tas2770_reset(struct tas2770_priv *tas2770)
|
||||
gpiod_set_value_cansleep(tas2770->reset_gpio, 0);
|
||||
msleep(20);
|
||||
gpiod_set_value_cansleep(tas2770->reset_gpio, 1);
|
||||
usleep_range(1000, 2000);
|
||||
}
|
||||
|
||||
snd_soc_component_write(tas2770->component, TAS2770_SW_RST,
|
||||
TAS2770_RST);
|
||||
usleep_range(1000, 2000);
|
||||
}
|
||||
|
||||
static int tas2770_set_bias_level(struct snd_soc_component *component,
|
||||
@@ -110,6 +112,7 @@ static int tas2770_codec_resume(struct snd_soc_component *component)
|
||||
|
||||
if (tas2770->sdz_gpio) {
|
||||
gpiod_set_value_cansleep(tas2770->sdz_gpio, 1);
|
||||
usleep_range(1000, 2000);
|
||||
} else {
|
||||
ret = snd_soc_component_update_bits(component, TAS2770_PWR_CTRL,
|
||||
TAS2770_PWR_CTRL_MASK,
|
||||
@@ -510,8 +513,10 @@ static int tas2770_codec_probe(struct snd_soc_component *component)
|
||||
|
||||
tas2770->component = component;
|
||||
|
||||
if (tas2770->sdz_gpio)
|
||||
if (tas2770->sdz_gpio) {
|
||||
gpiod_set_value_cansleep(tas2770->sdz_gpio, 1);
|
||||
usleep_range(1000, 2000);
|
||||
}
|
||||
|
||||
tas2770_reset(tas2770);
|
||||
|
||||
|
||||
@@ -1441,7 +1441,8 @@ static int wm_adsp_buffer_parse_coeff(struct cs_dsp_coeff_ctl *cs_ctl)
|
||||
int ret, i;
|
||||
|
||||
for (i = 0; i < 5; ++i) {
|
||||
ret = cs_dsp_coeff_read_ctrl(cs_ctl, 0, &coeff_v1, sizeof(coeff_v1));
|
||||
ret = cs_dsp_coeff_read_ctrl(cs_ctl, 0, &coeff_v1,
|
||||
min(cs_ctl->len, sizeof(coeff_v1)));
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
|
||||
@@ -952,6 +952,7 @@ static int skl_first_init(struct hdac_bus *bus)
|
||||
/* allow 64bit DMA address if supported by H/W */
|
||||
if (dma_set_mask_and_coherent(bus->dev, DMA_BIT_MASK(64)))
|
||||
dma_set_mask_and_coherent(bus->dev, DMA_BIT_MASK(32));
|
||||
dma_set_max_seg_size(bus->dev, UINT_MAX);
|
||||
|
||||
/* initialize streams */
|
||||
snd_hdac_ext_stream_init_all
|
||||
|
||||
@@ -524,7 +524,7 @@ static int lpass_platform_pcmops_trigger(struct snd_soc_component *component,
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
ret = regmap_update_bits(map, reg_irqclr, val_irqclr, val_irqclr);
|
||||
ret = regmap_write_bits(map, reg_irqclr, val_irqclr, val_irqclr);
|
||||
if (ret) {
|
||||
dev_err(soc_runtime->dev, "error writing to irqclear reg: %d\n", ret);
|
||||
return ret;
|
||||
@@ -665,7 +665,7 @@ static irqreturn_t lpass_dma_interrupt_handler(
|
||||
return -EINVAL;
|
||||
}
|
||||
if (interrupts & LPAIF_IRQ_PER(chan)) {
|
||||
rv = regmap_update_bits(map, reg, mask, (LPAIF_IRQ_PER(chan) | val));
|
||||
rv = regmap_write_bits(map, reg, mask, (LPAIF_IRQ_PER(chan) | val));
|
||||
if (rv) {
|
||||
dev_err(soc_runtime->dev,
|
||||
"error writing to irqclear reg: %d\n", rv);
|
||||
@@ -676,7 +676,7 @@ static irqreturn_t lpass_dma_interrupt_handler(
|
||||
}
|
||||
|
||||
if (interrupts & LPAIF_IRQ_XRUN(chan)) {
|
||||
rv = regmap_update_bits(map, reg, mask, (LPAIF_IRQ_XRUN(chan) | val));
|
||||
rv = regmap_write_bits(map, reg, mask, (LPAIF_IRQ_XRUN(chan) | val));
|
||||
if (rv) {
|
||||
dev_err(soc_runtime->dev,
|
||||
"error writing to irqclear reg: %d\n", rv);
|
||||
@@ -688,7 +688,7 @@ static irqreturn_t lpass_dma_interrupt_handler(
|
||||
}
|
||||
|
||||
if (interrupts & LPAIF_IRQ_ERR(chan)) {
|
||||
rv = regmap_update_bits(map, reg, mask, (LPAIF_IRQ_ERR(chan) | val));
|
||||
rv = regmap_write_bits(map, reg, mask, (LPAIF_IRQ_ERR(chan) | val));
|
||||
if (rv) {
|
||||
dev_err(soc_runtime->dev,
|
||||
"error writing to irqclear reg: %d\n", rv);
|
||||
|
||||
@@ -308,7 +308,7 @@ int snd_soc_put_volsw(struct snd_kcontrol *kcontrol,
|
||||
unsigned int sign_bit = mc->sign_bit;
|
||||
unsigned int mask = (1 << fls(max)) - 1;
|
||||
unsigned int invert = mc->invert;
|
||||
int err;
|
||||
int err, ret;
|
||||
bool type_2r = false;
|
||||
unsigned int val2 = 0;
|
||||
unsigned int val, val_mask;
|
||||
@@ -350,12 +350,18 @@ int snd_soc_put_volsw(struct snd_kcontrol *kcontrol,
|
||||
err = snd_soc_component_update_bits(component, reg, val_mask, val);
|
||||
if (err < 0)
|
||||
return err;
|
||||
ret = err;
|
||||
|
||||
if (type_2r)
|
||||
if (type_2r) {
|
||||
err = snd_soc_component_update_bits(component, reg2, val_mask,
|
||||
val2);
|
||||
val2);
|
||||
/* Don't discard any error code or drop change flag */
|
||||
if (ret == 0 || err < 0) {
|
||||
ret = err;
|
||||
}
|
||||
}
|
||||
|
||||
return err;
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_soc_put_volsw);
|
||||
|
||||
@@ -421,6 +427,7 @@ int snd_soc_put_volsw_sx(struct snd_kcontrol *kcontrol,
|
||||
int min = mc->min;
|
||||
unsigned int mask = (1U << (fls(min + max) - 1)) - 1;
|
||||
int err = 0;
|
||||
int ret;
|
||||
unsigned int val, val_mask;
|
||||
|
||||
if (ucontrol->value.integer.value[0] < 0)
|
||||
@@ -437,6 +444,7 @@ int snd_soc_put_volsw_sx(struct snd_kcontrol *kcontrol,
|
||||
err = snd_soc_component_update_bits(component, reg, val_mask, val);
|
||||
if (err < 0)
|
||||
return err;
|
||||
ret = err;
|
||||
|
||||
if (snd_soc_volsw_is_stereo(mc)) {
|
||||
unsigned int val2;
|
||||
@@ -447,6 +455,11 @@ int snd_soc_put_volsw_sx(struct snd_kcontrol *kcontrol,
|
||||
|
||||
err = snd_soc_component_update_bits(component, reg2, val_mask,
|
||||
val2);
|
||||
|
||||
/* Don't discard any error code or drop change flag */
|
||||
if (ret == 0 || err < 0) {
|
||||
ret = err;
|
||||
}
|
||||
}
|
||||
return err;
|
||||
}
|
||||
@@ -506,7 +519,7 @@ int snd_soc_put_volsw_range(struct snd_kcontrol *kcontrol,
|
||||
unsigned int mask = (1 << fls(max)) - 1;
|
||||
unsigned int invert = mc->invert;
|
||||
unsigned int val, val_mask;
|
||||
int ret;
|
||||
int err, ret;
|
||||
|
||||
if (invert)
|
||||
val = (max - ucontrol->value.integer.value[0]) & mask;
|
||||
@@ -515,9 +528,10 @@ int snd_soc_put_volsw_range(struct snd_kcontrol *kcontrol,
|
||||
val_mask = mask << shift;
|
||||
val = val << shift;
|
||||
|
||||
ret = snd_soc_component_update_bits(component, reg, val_mask, val);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
err = snd_soc_component_update_bits(component, reg, val_mask, val);
|
||||
if (err < 0)
|
||||
return err;
|
||||
ret = err;
|
||||
|
||||
if (snd_soc_volsw_is_stereo(mc)) {
|
||||
if (invert)
|
||||
@@ -527,8 +541,12 @@ int snd_soc_put_volsw_range(struct snd_kcontrol *kcontrol,
|
||||
val_mask = mask << shift;
|
||||
val = val << shift;
|
||||
|
||||
ret = snd_soc_component_update_bits(component, rreg, val_mask,
|
||||
err = snd_soc_component_update_bits(component, rreg, val_mask,
|
||||
val);
|
||||
/* Don't discard any error code or drop change flag */
|
||||
if (ret == 0 || err < 0) {
|
||||
ret = err;
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
@@ -877,6 +895,7 @@ int snd_soc_put_xr_sx(struct snd_kcontrol *kcontrol,
|
||||
unsigned long mask = (1UL<<mc->nbits)-1;
|
||||
long max = mc->max;
|
||||
long val = ucontrol->value.integer.value[0];
|
||||
int ret = 0;
|
||||
unsigned int i;
|
||||
|
||||
if (val < mc->min || val > mc->max)
|
||||
@@ -891,9 +910,11 @@ int snd_soc_put_xr_sx(struct snd_kcontrol *kcontrol,
|
||||
regmask, regval);
|
||||
if (err < 0)
|
||||
return err;
|
||||
if (err > 0)
|
||||
ret = err;
|
||||
}
|
||||
|
||||
return 0;
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_soc_put_xr_sx);
|
||||
|
||||
|
||||
@@ -956,6 +956,7 @@ int hda_dsp_probe(struct snd_sof_dev *sdev)
|
||||
dev_dbg(sdev->dev, "DMA mask is 32 bit\n");
|
||||
dma_set_mask_and_coherent(&pci->dev, DMA_BIT_MASK(32));
|
||||
}
|
||||
dma_set_max_seg_size(&pci->dev, UINT_MAX);
|
||||
|
||||
/* init streams */
|
||||
ret = hda_dsp_stream_init(sdev);
|
||||
|
||||
@@ -47,13 +47,13 @@ struct snd_usb_implicit_fb_match {
|
||||
static const struct snd_usb_implicit_fb_match playback_implicit_fb_quirks[] = {
|
||||
/* Generic matching */
|
||||
IMPLICIT_FB_GENERIC_DEV(0x0499, 0x1509), /* Steinberg UR22 */
|
||||
IMPLICIT_FB_GENERIC_DEV(0x0763, 0x2080), /* M-Audio FastTrack Ultra */
|
||||
IMPLICIT_FB_GENERIC_DEV(0x0763, 0x2081), /* M-Audio FastTrack Ultra */
|
||||
IMPLICIT_FB_GENERIC_DEV(0x0763, 0x2030), /* M-Audio Fast Track C400 */
|
||||
IMPLICIT_FB_GENERIC_DEV(0x0763, 0x2031), /* M-Audio Fast Track C600 */
|
||||
|
||||
/* Fixed EP */
|
||||
/* FIXME: check the availability of generic matching */
|
||||
IMPLICIT_FB_FIXED_DEV(0x0763, 0x2080, 0x81, 2), /* M-Audio FastTrack Ultra */
|
||||
IMPLICIT_FB_FIXED_DEV(0x0763, 0x2081, 0x81, 2), /* M-Audio FastTrack Ultra */
|
||||
IMPLICIT_FB_FIXED_DEV(0x2466, 0x8010, 0x81, 2), /* Fractal Audio Axe-Fx III */
|
||||
IMPLICIT_FB_FIXED_DEV(0x31e9, 0x0001, 0x81, 2), /* Solid State Logic SSL2 */
|
||||
IMPLICIT_FB_FIXED_DEV(0x31e9, 0x0002, 0x81, 2), /* Solid State Logic SSL2+ */
|
||||
|
||||
@@ -3678,17 +3678,14 @@ static int restore_mixer_value(struct usb_mixer_elem_list *list)
|
||||
err = snd_usb_set_cur_mix_value(cval, c + 1, idx,
|
||||
cval->cache_val[idx]);
|
||||
if (err < 0)
|
||||
return err;
|
||||
break;
|
||||
}
|
||||
idx++;
|
||||
}
|
||||
} else {
|
||||
/* master */
|
||||
if (cval->cached) {
|
||||
err = snd_usb_set_cur_mix_value(cval, 0, 0, *cval->cache_val);
|
||||
if (err < 0)
|
||||
return err;
|
||||
}
|
||||
if (cval->cached)
|
||||
snd_usb_set_cur_mix_value(cval, 0, 0, *cval->cache_val);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
Reference in New Issue
Block a user