mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-05 02:21:52 +09:00
Merge 696198f89a ("pinctrl: qcom: Clear latched interrupt status when changing IRQ type") into android14-6.1-lts
Steps on the way to 6.1.135 Change-Id: I83ef7ba44208ce8a96d7aca4b3644816b1fd8faf Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
@@ -1247,8 +1247,7 @@
|
||||
};
|
||||
|
||||
pwm0: pwm@1401e000 {
|
||||
compatible = "mediatek,mt8173-disp-pwm",
|
||||
"mediatek,mt6595-disp-pwm";
|
||||
compatible = "mediatek,mt8173-disp-pwm";
|
||||
reg = <0 0x1401e000 0 0x1000>;
|
||||
#pwm-cells = <2>;
|
||||
clocks = <&mmsys CLK_MM_DISP_PWM026M>,
|
||||
@@ -1258,8 +1257,7 @@
|
||||
};
|
||||
|
||||
pwm1: pwm@1401f000 {
|
||||
compatible = "mediatek,mt8173-disp-pwm",
|
||||
"mediatek,mt6595-disp-pwm";
|
||||
compatible = "mediatek,mt8173-disp-pwm";
|
||||
reg = <0 0x1401f000 0 0x1000>;
|
||||
#pwm-cells = <2>;
|
||||
clocks = <&mmsys CLK_MM_DISP_PWM126M>,
|
||||
|
||||
@@ -1593,7 +1593,8 @@ int arch_add_memory(int nid, u64 start, u64 size,
|
||||
__remove_pgd_mapping(swapper_pg_dir,
|
||||
__phys_to_virt(start), size);
|
||||
else {
|
||||
max_pfn = PFN_UP(start + size);
|
||||
/* Address of hotplugged memory can be smaller */
|
||||
max_pfn = max(max_pfn, PFN_UP(start + size));
|
||||
max_low_pfn = max_pfn;
|
||||
}
|
||||
|
||||
|
||||
@@ -52,8 +52,10 @@ out:
|
||||
|
||||
void arch_enter_lazy_mmu_mode(void)
|
||||
{
|
||||
struct tlb_batch *tb = this_cpu_ptr(&tlb_batch);
|
||||
struct tlb_batch *tb;
|
||||
|
||||
preempt_disable();
|
||||
tb = this_cpu_ptr(&tlb_batch);
|
||||
tb->active = 1;
|
||||
}
|
||||
|
||||
@@ -64,6 +66,7 @@ void arch_leave_lazy_mmu_mode(void)
|
||||
if (tb->tlb_nr)
|
||||
flush_tlb_pending();
|
||||
tb->active = 0;
|
||||
preempt_enable();
|
||||
}
|
||||
|
||||
static void tlb_batch_add_one(struct mm_struct *mm, unsigned long vaddr,
|
||||
|
||||
@@ -11460,6 +11460,8 @@ int kvm_arch_vcpu_ioctl_get_mpstate(struct kvm_vcpu *vcpu,
|
||||
if (kvm_mpx_supported())
|
||||
kvm_load_guest_fpu(vcpu);
|
||||
|
||||
kvm_vcpu_srcu_read_lock(vcpu);
|
||||
|
||||
r = kvm_apic_accept_events(vcpu);
|
||||
if (r < 0)
|
||||
goto out;
|
||||
@@ -11473,6 +11475,8 @@ int kvm_arch_vcpu_ioctl_get_mpstate(struct kvm_vcpu *vcpu,
|
||||
mp_state->mp_state = vcpu->arch.mp_state;
|
||||
|
||||
out:
|
||||
kvm_vcpu_srcu_read_unlock(vcpu);
|
||||
|
||||
if (kvm_mpx_supported())
|
||||
kvm_put_guest_fpu(vcpu);
|
||||
vcpu_put(vcpu);
|
||||
|
||||
@@ -1201,11 +1201,16 @@ int mhi_gen_tre(struct mhi_controller *mhi_cntrl, struct mhi_chan *mhi_chan,
|
||||
struct mhi_ring_element *mhi_tre;
|
||||
struct mhi_buf_info *buf_info;
|
||||
int eot, eob, chain, bei;
|
||||
int ret;
|
||||
int ret = 0;
|
||||
|
||||
/* Protect accesses for reading and incrementing WP */
|
||||
write_lock_bh(&mhi_chan->lock);
|
||||
|
||||
if (mhi_chan->ch_state != MHI_CH_STATE_ENABLED) {
|
||||
ret = -ENODEV;
|
||||
goto out;
|
||||
}
|
||||
|
||||
buf_ring = &mhi_chan->buf_ring;
|
||||
tre_ring = &mhi_chan->tre_ring;
|
||||
|
||||
@@ -1223,10 +1228,8 @@ int mhi_gen_tre(struct mhi_controller *mhi_cntrl, struct mhi_chan *mhi_chan,
|
||||
|
||||
if (!info->pre_mapped) {
|
||||
ret = mhi_cntrl->map_single(mhi_cntrl, buf_info);
|
||||
if (ret) {
|
||||
write_unlock_bh(&mhi_chan->lock);
|
||||
return ret;
|
||||
}
|
||||
if (ret)
|
||||
goto out;
|
||||
}
|
||||
|
||||
eob = !!(flags & MHI_EOB);
|
||||
@@ -1243,9 +1246,10 @@ int mhi_gen_tre(struct mhi_controller *mhi_cntrl, struct mhi_chan *mhi_chan,
|
||||
mhi_add_ring_element(mhi_cntrl, tre_ring);
|
||||
mhi_add_ring_element(mhi_cntrl, buf_ring);
|
||||
|
||||
out:
|
||||
write_unlock_bh(&mhi_chan->lock);
|
||||
|
||||
return 0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
int mhi_queue_buf(struct mhi_device *mhi_dev, enum dma_data_direction dir,
|
||||
|
||||
@@ -290,6 +290,9 @@ static int gdsc_enable(struct generic_pm_domain *domain)
|
||||
*/
|
||||
udelay(1);
|
||||
|
||||
if (sc->flags & RETAIN_FF_ENABLE)
|
||||
gdsc_retain_ff_on(sc);
|
||||
|
||||
/* Turn on HW trigger mode if supported */
|
||||
if (sc->flags & HW_CTRL) {
|
||||
ret = gdsc_hwctrl(sc, true);
|
||||
@@ -306,9 +309,6 @@ static int gdsc_enable(struct generic_pm_domain *domain)
|
||||
udelay(1);
|
||||
}
|
||||
|
||||
if (sc->flags & RETAIN_FF_ENABLE)
|
||||
gdsc_retain_ff_on(sc);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -418,13 +418,6 @@ static int gdsc_init(struct gdsc *sc)
|
||||
goto err_disable_supply;
|
||||
}
|
||||
|
||||
/* Turn on HW trigger mode if supported */
|
||||
if (sc->flags & HW_CTRL) {
|
||||
ret = gdsc_hwctrl(sc, true);
|
||||
if (ret < 0)
|
||||
goto err_disable_supply;
|
||||
}
|
||||
|
||||
/*
|
||||
* Make sure the retain bit is set if the GDSC is already on,
|
||||
* otherwise we end up turning off the GDSC and destroying all
|
||||
@@ -432,6 +425,14 @@ static int gdsc_init(struct gdsc *sc)
|
||||
*/
|
||||
if (sc->flags & RETAIN_FF_ENABLE)
|
||||
gdsc_retain_ff_on(sc);
|
||||
|
||||
/* Turn on HW trigger mode if supported */
|
||||
if (sc->flags & HW_CTRL) {
|
||||
ret = gdsc_hwctrl(sc, true);
|
||||
if (ret < 0)
|
||||
goto err_disable_supply;
|
||||
}
|
||||
|
||||
} else if (sc->flags & ALWAYS_ON) {
|
||||
/* If ALWAYS_ON GDSCs are not ON, turn them ON */
|
||||
gdsc_enable(&sc->pd);
|
||||
@@ -463,6 +464,23 @@ err_disable_supply:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void gdsc_pm_subdomain_remove(struct gdsc_desc *desc, size_t num)
|
||||
{
|
||||
struct device *dev = desc->dev;
|
||||
struct gdsc **scs = desc->scs;
|
||||
int i;
|
||||
|
||||
/* Remove subdomains */
|
||||
for (i = num - 1; i >= 0; i--) {
|
||||
if (!scs[i])
|
||||
continue;
|
||||
if (scs[i]->parent)
|
||||
pm_genpd_remove_subdomain(scs[i]->parent, &scs[i]->pd);
|
||||
else if (!IS_ERR_OR_NULL(dev->pm_domain))
|
||||
pm_genpd_remove_subdomain(pd_to_genpd(dev->pm_domain), &scs[i]->pd);
|
||||
}
|
||||
}
|
||||
|
||||
int gdsc_register(struct gdsc_desc *desc,
|
||||
struct reset_controller_dev *rcdev, struct regmap *regmap)
|
||||
{
|
||||
@@ -507,30 +525,27 @@ int gdsc_register(struct gdsc_desc *desc,
|
||||
if (!scs[i])
|
||||
continue;
|
||||
if (scs[i]->parent)
|
||||
pm_genpd_add_subdomain(scs[i]->parent, &scs[i]->pd);
|
||||
ret = pm_genpd_add_subdomain(scs[i]->parent, &scs[i]->pd);
|
||||
else if (!IS_ERR_OR_NULL(dev->pm_domain))
|
||||
pm_genpd_add_subdomain(pd_to_genpd(dev->pm_domain), &scs[i]->pd);
|
||||
ret = pm_genpd_add_subdomain(pd_to_genpd(dev->pm_domain), &scs[i]->pd);
|
||||
if (ret)
|
||||
goto err_pm_subdomain_remove;
|
||||
}
|
||||
|
||||
return of_genpd_add_provider_onecell(dev->of_node, data);
|
||||
|
||||
err_pm_subdomain_remove:
|
||||
gdsc_pm_subdomain_remove(desc, i);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
void gdsc_unregister(struct gdsc_desc *desc)
|
||||
{
|
||||
int i;
|
||||
struct device *dev = desc->dev;
|
||||
struct gdsc **scs = desc->scs;
|
||||
size_t num = desc->num;
|
||||
|
||||
/* Remove subdomains */
|
||||
for (i = 0; i < num; i++) {
|
||||
if (!scs[i])
|
||||
continue;
|
||||
if (scs[i]->parent)
|
||||
pm_genpd_remove_subdomain(scs[i]->parent, &scs[i]->pd);
|
||||
else if (!IS_ERR_OR_NULL(dev->pm_domain))
|
||||
pm_genpd_remove_subdomain(pd_to_genpd(dev->pm_domain), &scs[i]->pd);
|
||||
}
|
||||
gdsc_pm_subdomain_remove(desc, num);
|
||||
of_genpd_del_provider(dev->of_node);
|
||||
}
|
||||
|
||||
|
||||
@@ -179,14 +179,17 @@ static bool sp_pci_is_master(struct sp_device *sp)
|
||||
pdev_new = to_pci_dev(dev_new);
|
||||
pdev_cur = to_pci_dev(dev_cur);
|
||||
|
||||
if (pdev_new->bus->number < pdev_cur->bus->number)
|
||||
return true;
|
||||
if (pci_domain_nr(pdev_new->bus) != pci_domain_nr(pdev_cur->bus))
|
||||
return pci_domain_nr(pdev_new->bus) < pci_domain_nr(pdev_cur->bus);
|
||||
|
||||
if (PCI_SLOT(pdev_new->devfn) < PCI_SLOT(pdev_cur->devfn))
|
||||
return true;
|
||||
if (pdev_new->bus->number != pdev_cur->bus->number)
|
||||
return pdev_new->bus->number < pdev_cur->bus->number;
|
||||
|
||||
if (PCI_FUNC(pdev_new->devfn) < PCI_FUNC(pdev_cur->devfn))
|
||||
return true;
|
||||
if (PCI_SLOT(pdev_new->devfn) != PCI_SLOT(pdev_cur->devfn))
|
||||
return PCI_SLOT(pdev_new->devfn) < PCI_SLOT(pdev_cur->devfn);
|
||||
|
||||
if (PCI_FUNC(pdev_new->devfn) != PCI_FUNC(pdev_cur->devfn))
|
||||
return PCI_FUNC(pdev_new->devfn) < PCI_FUNC(pdev_cur->devfn);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -753,6 +753,7 @@ static int tegra186_gpio_probe(struct platform_device *pdev)
|
||||
struct gpio_irq_chip *irq;
|
||||
struct tegra_gpio *gpio;
|
||||
struct device_node *np;
|
||||
struct resource *res;
|
||||
char **names;
|
||||
int err;
|
||||
|
||||
@@ -772,19 +773,19 @@ static int tegra186_gpio_probe(struct platform_device *pdev)
|
||||
gpio->num_banks++;
|
||||
|
||||
/* get register apertures */
|
||||
gpio->secure = devm_platform_ioremap_resource_byname(pdev, "security");
|
||||
if (IS_ERR(gpio->secure)) {
|
||||
gpio->secure = devm_platform_ioremap_resource(pdev, 0);
|
||||
if (IS_ERR(gpio->secure))
|
||||
return PTR_ERR(gpio->secure);
|
||||
}
|
||||
res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "security");
|
||||
if (!res)
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
gpio->secure = devm_ioremap_resource(&pdev->dev, res);
|
||||
if (IS_ERR(gpio->secure))
|
||||
return PTR_ERR(gpio->secure);
|
||||
|
||||
gpio->base = devm_platform_ioremap_resource_byname(pdev, "gpio");
|
||||
if (IS_ERR(gpio->base)) {
|
||||
gpio->base = devm_platform_ioremap_resource(pdev, 1);
|
||||
if (IS_ERR(gpio->base))
|
||||
return PTR_ERR(gpio->base);
|
||||
}
|
||||
res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "gpio");
|
||||
if (!res)
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
|
||||
gpio->base = devm_ioremap_resource(&pdev->dev, res);
|
||||
if (IS_ERR(gpio->base))
|
||||
return PTR_ERR(gpio->base);
|
||||
|
||||
err = platform_irq_count(pdev);
|
||||
if (err < 0)
|
||||
|
||||
@@ -1012,6 +1012,7 @@ static int zynq_gpio_remove(struct platform_device *pdev)
|
||||
ret = pm_runtime_get_sync(&pdev->dev);
|
||||
if (ret < 0)
|
||||
dev_warn(&pdev->dev, "pm_runtime_get_sync() Failed\n");
|
||||
device_init_wakeup(&pdev->dev, 0);
|
||||
gpiochip_remove(&gpio->chip);
|
||||
clk_disable_unprepare(gpio->clk);
|
||||
device_set_wakeup_capable(&pdev->dev, 0);
|
||||
|
||||
@@ -2362,6 +2362,9 @@ static void i3c_master_unregister_i3c_devs(struct i3c_master_controller *master)
|
||||
*/
|
||||
void i3c_master_queue_ibi(struct i3c_dev_desc *dev, struct i3c_ibi_slot *slot)
|
||||
{
|
||||
if (!dev->ibi || !slot)
|
||||
return;
|
||||
|
||||
atomic_inc(&dev->ibi->pending_ibis);
|
||||
queue_work(dev->common.master->wq, &slot->work);
|
||||
}
|
||||
|
||||
@@ -356,7 +356,7 @@ static int svc_i3c_master_handle_ibi(struct svc_i3c_master *master,
|
||||
slot->len < SVC_I3C_FIFO_SIZE) {
|
||||
mdatactrl = readl(master->regs + SVC_I3C_MDATACTRL);
|
||||
count = SVC_I3C_MDATACTRL_RXCOUNT(mdatactrl);
|
||||
readsl(master->regs + SVC_I3C_MRDATAB, buf, count);
|
||||
readsb(master->regs + SVC_I3C_MRDATAB, buf, count);
|
||||
slot->len += count;
|
||||
buf += count;
|
||||
}
|
||||
|
||||
@@ -389,6 +389,12 @@ static int ebs_map(struct dm_target *ti, struct bio *bio)
|
||||
return DM_MAPIO_REMAPPED;
|
||||
}
|
||||
|
||||
static void ebs_postsuspend(struct dm_target *ti)
|
||||
{
|
||||
struct ebs_c *ec = ti->private;
|
||||
dm_bufio_client_reset(ec->bufio);
|
||||
}
|
||||
|
||||
static void ebs_status(struct dm_target *ti, status_type_t type,
|
||||
unsigned int status_flags, char *result, unsigned int maxlen)
|
||||
{
|
||||
@@ -446,6 +452,7 @@ static struct target_type ebs_target = {
|
||||
.ctr = ebs_ctr,
|
||||
.dtr = ebs_dtr,
|
||||
.map = ebs_map,
|
||||
.postsuspend = ebs_postsuspend,
|
||||
.status = ebs_status,
|
||||
.io_hints = ebs_io_hints,
|
||||
.prepare_ioctl = ebs_prepare_ioctl,
|
||||
|
||||
@@ -4546,16 +4546,19 @@ try_smaller_buffer:
|
||||
|
||||
ic->recalc_bitmap = dm_integrity_alloc_page_list(n_bitmap_pages);
|
||||
if (!ic->recalc_bitmap) {
|
||||
ti->error = "Could not allocate memory for bitmap";
|
||||
r = -ENOMEM;
|
||||
goto bad;
|
||||
}
|
||||
ic->may_write_bitmap = dm_integrity_alloc_page_list(n_bitmap_pages);
|
||||
if (!ic->may_write_bitmap) {
|
||||
ti->error = "Could not allocate memory for bitmap";
|
||||
r = -ENOMEM;
|
||||
goto bad;
|
||||
}
|
||||
ic->bbs = kvmalloc_array(ic->n_bitmap_blocks, sizeof(struct bitmap_block_status), GFP_KERNEL);
|
||||
if (!ic->bbs) {
|
||||
ti->error = "Could not allocate memory for bitmap";
|
||||
r = -ENOMEM;
|
||||
goto bad;
|
||||
}
|
||||
|
||||
@@ -823,6 +823,13 @@ static int verity_map(struct dm_target *ti, struct bio *bio)
|
||||
return DM_MAPIO_SUBMITTED;
|
||||
}
|
||||
|
||||
static void verity_postsuspend(struct dm_target *ti)
|
||||
{
|
||||
struct dm_verity *v = ti->private;
|
||||
flush_workqueue(v->verify_wq);
|
||||
dm_bufio_client_reset(v->bufio);
|
||||
}
|
||||
|
||||
/*
|
||||
* Status: V (valid) or C (corruption found)
|
||||
*/
|
||||
@@ -1538,6 +1545,7 @@ static struct target_type verity_target = {
|
||||
.ctr = verity_ctr,
|
||||
.dtr = verity_dtr,
|
||||
.map = verity_map,
|
||||
.postsuspend = verity_postsuspend,
|
||||
.status = verity_status,
|
||||
.prepare_ioctl = verity_prepare_ioctl,
|
||||
.iterate_devices = verity_iterate_devices,
|
||||
|
||||
@@ -162,7 +162,7 @@ static int kb3930_probe(struct i2c_client *client)
|
||||
devm_gpiod_get_array_optional(dev, "off", GPIOD_IN);
|
||||
if (IS_ERR(ddata->off_gpios))
|
||||
return PTR_ERR(ddata->off_gpios);
|
||||
if (ddata->off_gpios->ndescs < 2) {
|
||||
if (ddata->off_gpios && ddata->off_gpios->ndescs < 2) {
|
||||
dev_err(dev, "invalid off-gpios property\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@@ -482,10 +482,11 @@ static inline u16 INFTL_findwriteunit(struct INFTLrecord *inftl, unsigned block)
|
||||
silly = MAX_LOOPS;
|
||||
|
||||
while (thisEUN <= inftl->lastEUN) {
|
||||
inftl_read_oob(mtd, (thisEUN * inftl->EraseSize) +
|
||||
blockofs, 8, &retlen, (char *)&bci);
|
||||
|
||||
status = bci.Status | bci.Status1;
|
||||
if (inftl_read_oob(mtd, (thisEUN * inftl->EraseSize) +
|
||||
blockofs, 8, &retlen, (char *)&bci) < 0)
|
||||
status = SECTOR_IGNORE;
|
||||
else
|
||||
status = bci.Status | bci.Status1;
|
||||
pr_debug("INFTL: status of block %d in EUN %d is %x\n",
|
||||
block , writeEUN, status);
|
||||
|
||||
|
||||
@@ -387,6 +387,9 @@ static int r852_wait(struct nand_chip *chip)
|
||||
static int r852_ready(struct nand_chip *chip)
|
||||
{
|
||||
struct r852_device *dev = r852_get_dev(nand_to_mtd(chip));
|
||||
if (dev->card_unstable)
|
||||
return 0;
|
||||
|
||||
return !(r852_read_reg(dev, R852_CARD_STA) & R852_CARD_STA_BUSY);
|
||||
}
|
||||
|
||||
|
||||
@@ -327,7 +327,9 @@ gve_get_ethtool_stats(struct net_device *netdev,
|
||||
*/
|
||||
data[i++] = 0;
|
||||
data[i++] = 0;
|
||||
data[i++] = tx->dqo_tx.tail - tx->dqo_tx.head;
|
||||
data[i++] =
|
||||
(tx->dqo_tx.tail - tx->dqo_tx.head) &
|
||||
tx->mask;
|
||||
}
|
||||
do {
|
||||
start =
|
||||
|
||||
@@ -1351,7 +1351,7 @@ static int ntb_transport_probe(struct ntb_client *self, struct ntb_dev *ndev)
|
||||
qp_count = ilog2(qp_bitmap);
|
||||
if (nt->use_msi) {
|
||||
qp_count -= 1;
|
||||
nt->msi_db_mask = 1 << qp_count;
|
||||
nt->msi_db_mask = BIT_ULL(qp_count);
|
||||
ntb_db_clear_mask(ndev, nt->msi_db_mask);
|
||||
}
|
||||
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
|
||||
#define pr_fmt(fmt) "OF: " fmt
|
||||
|
||||
#include <linux/cleanup.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/list.h>
|
||||
@@ -38,11 +39,15 @@
|
||||
unsigned int irq_of_parse_and_map(struct device_node *dev, int index)
|
||||
{
|
||||
struct of_phandle_args oirq;
|
||||
unsigned int ret;
|
||||
|
||||
if (of_irq_parse_one(dev, index, &oirq))
|
||||
return 0;
|
||||
|
||||
return irq_create_of_mapping(&oirq);
|
||||
ret = irq_create_of_mapping(&oirq);
|
||||
of_node_put(oirq.np);
|
||||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(irq_of_parse_and_map);
|
||||
|
||||
@@ -165,6 +170,8 @@ const __be32 *of_irq_parse_imap_parent(const __be32 *imap, int len, struct of_ph
|
||||
* the specifier for each map, and then returns the translated map.
|
||||
*
|
||||
* Return: 0 on success and a negative number on error
|
||||
*
|
||||
* Note: refcount of node @out_irq->np is increased by 1 on success.
|
||||
*/
|
||||
int of_irq_parse_raw(const __be32 *addr, struct of_phandle_args *out_irq)
|
||||
{
|
||||
@@ -310,6 +317,12 @@ int of_irq_parse_raw(const __be32 *addr, struct of_phandle_args *out_irq)
|
||||
addrsize = (imap - match_array) - intsize;
|
||||
|
||||
if (ipar == newpar) {
|
||||
/*
|
||||
* We got @ipar's refcount, but the refcount was
|
||||
* gotten again by of_irq_parse_imap_parent() via its
|
||||
* alias @newpar.
|
||||
*/
|
||||
of_node_put(ipar);
|
||||
pr_debug("%pOF interrupt-map entry to self\n", ipar);
|
||||
return 0;
|
||||
}
|
||||
@@ -339,10 +352,12 @@ EXPORT_SYMBOL_GPL(of_irq_parse_raw);
|
||||
* This function resolves an interrupt for a node by walking the interrupt tree,
|
||||
* finding which interrupt controller node it is attached to, and returning the
|
||||
* interrupt specifier that can be used to retrieve a Linux IRQ number.
|
||||
*
|
||||
* Note: refcount of node @out_irq->np is increased by 1 on success.
|
||||
*/
|
||||
int of_irq_parse_one(struct device_node *device, int index, struct of_phandle_args *out_irq)
|
||||
{
|
||||
struct device_node *p;
|
||||
struct device_node __free(device_node) *p = NULL;
|
||||
const __be32 *addr;
|
||||
u32 intsize;
|
||||
int i, res, addr_len;
|
||||
@@ -367,41 +382,33 @@ int of_irq_parse_one(struct device_node *device, int index, struct of_phandle_ar
|
||||
/* Try the new-style interrupts-extended first */
|
||||
res = of_parse_phandle_with_args(device, "interrupts-extended",
|
||||
"#interrupt-cells", index, out_irq);
|
||||
if (!res)
|
||||
return of_irq_parse_raw(addr_buf, out_irq);
|
||||
if (!res) {
|
||||
p = out_irq->np;
|
||||
} else {
|
||||
/* Look for the interrupt parent. */
|
||||
p = of_irq_find_parent(device);
|
||||
/* Get size of interrupt specifier */
|
||||
if (!p || of_property_read_u32(p, "#interrupt-cells", &intsize))
|
||||
return -EINVAL;
|
||||
|
||||
/* Look for the interrupt parent. */
|
||||
p = of_irq_find_parent(device);
|
||||
if (p == NULL)
|
||||
return -EINVAL;
|
||||
pr_debug(" parent=%pOF, intsize=%d\n", p, intsize);
|
||||
|
||||
/* Get size of interrupt specifier */
|
||||
if (of_property_read_u32(p, "#interrupt-cells", &intsize)) {
|
||||
res = -EINVAL;
|
||||
goto out;
|
||||
/* Copy intspec into irq structure */
|
||||
out_irq->np = p;
|
||||
out_irq->args_count = intsize;
|
||||
for (i = 0; i < intsize; i++) {
|
||||
res = of_property_read_u32_index(device, "interrupts",
|
||||
(index * intsize) + i,
|
||||
out_irq->args + i);
|
||||
if (res)
|
||||
return res;
|
||||
}
|
||||
|
||||
pr_debug(" intspec=%d\n", *out_irq->args);
|
||||
}
|
||||
|
||||
pr_debug(" parent=%pOF, intsize=%d\n", p, intsize);
|
||||
|
||||
/* Copy intspec into irq structure */
|
||||
out_irq->np = p;
|
||||
out_irq->args_count = intsize;
|
||||
for (i = 0; i < intsize; i++) {
|
||||
res = of_property_read_u32_index(device, "interrupts",
|
||||
(index * intsize) + i,
|
||||
out_irq->args + i);
|
||||
if (res)
|
||||
goto out;
|
||||
}
|
||||
|
||||
pr_debug(" intspec=%d\n", *out_irq->args);
|
||||
|
||||
|
||||
/* Check if there are any interrupt-map translations to process */
|
||||
res = of_irq_parse_raw(addr_buf, out_irq);
|
||||
out:
|
||||
of_node_put(p);
|
||||
return res;
|
||||
return of_irq_parse_raw(addr_buf, out_irq);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(of_irq_parse_one);
|
||||
|
||||
@@ -500,8 +507,10 @@ int of_irq_count(struct device_node *dev)
|
||||
struct of_phandle_args irq;
|
||||
int nr = 0;
|
||||
|
||||
while (of_irq_parse_one(dev, nr, &irq) == 0)
|
||||
while (of_irq_parse_one(dev, nr, &irq) == 0) {
|
||||
of_node_put(irq.np);
|
||||
nr++;
|
||||
}
|
||||
|
||||
return nr;
|
||||
}
|
||||
@@ -618,6 +627,8 @@ void __init of_irq_init(const struct of_device_id *matches)
|
||||
__func__, desc->dev, desc->dev,
|
||||
desc->interrupt_parent);
|
||||
of_node_clear_flag(desc->dev, OF_POPULATED);
|
||||
of_node_put(desc->interrupt_parent);
|
||||
of_node_put(desc->dev);
|
||||
kfree(desc);
|
||||
continue;
|
||||
}
|
||||
@@ -648,6 +659,7 @@ void __init of_irq_init(const struct of_device_id *matches)
|
||||
err:
|
||||
list_for_each_entry_safe(desc, temp_desc, &intc_desc_list, list) {
|
||||
list_del(&desc->list);
|
||||
of_node_put(desc->interrupt_parent);
|
||||
of_node_put(desc->dev);
|
||||
kfree(desc);
|
||||
}
|
||||
|
||||
@@ -1488,7 +1488,7 @@ static struct pci_ops brcm7425_pcie_ops = {
|
||||
|
||||
static int brcm_pcie_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct device_node *np = pdev->dev.of_node, *msi_np;
|
||||
struct device_node *np = pdev->dev.of_node;
|
||||
struct pci_host_bridge *bridge;
|
||||
const struct pcie_cfg_data *data;
|
||||
struct brcm_pcie *pcie;
|
||||
@@ -1563,9 +1563,14 @@ static int brcm_pcie_probe(struct platform_device *pdev)
|
||||
goto fail;
|
||||
}
|
||||
|
||||
msi_np = of_parse_phandle(pcie->np, "msi-parent", 0);
|
||||
if (pci_msi_enabled() && msi_np == pcie->np) {
|
||||
ret = brcm_pcie_enable_msi(pcie);
|
||||
if (pci_msi_enabled()) {
|
||||
struct device_node *msi_np = of_parse_phandle(pcie->np, "msi-parent", 0);
|
||||
|
||||
if (msi_np == pcie->np)
|
||||
ret = brcm_pcie_enable_msi(pcie);
|
||||
|
||||
of_node_put(msi_np);
|
||||
|
||||
if (ret) {
|
||||
dev_err(pcie->dev, "probe of internal MSI failed");
|
||||
goto fail;
|
||||
|
||||
@@ -1141,7 +1141,10 @@ static struct pci_bus *pci_alloc_child_bus(struct pci_bus *parent,
|
||||
add_dev:
|
||||
pci_set_bus_msi_domain(child);
|
||||
ret = device_register(&child->dev);
|
||||
WARN_ON(ret < 0);
|
||||
if (WARN_ON(ret < 0)) {
|
||||
put_device(&child->dev);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
pcibios_add_bus(child);
|
||||
|
||||
|
||||
@@ -1006,8 +1006,7 @@ static int msm_gpio_irq_set_type(struct irq_data *d, unsigned int type)
|
||||
struct msm_pinctrl *pctrl = gpiochip_get_data(gc);
|
||||
const struct msm_pingroup *g;
|
||||
unsigned long flags;
|
||||
bool was_enabled;
|
||||
u32 val;
|
||||
u32 val, oldval;
|
||||
|
||||
if (msm_gpio_needs_dual_edge_parent_workaround(d, type)) {
|
||||
set_bit(d->hwirq, pctrl->dual_edge_irqs);
|
||||
@@ -1067,8 +1066,7 @@ static int msm_gpio_irq_set_type(struct irq_data *d, unsigned int type)
|
||||
* internal circuitry of TLMM, toggling the RAW_STATUS
|
||||
* could cause the INTR_STATUS to be set for EDGE interrupts.
|
||||
*/
|
||||
val = msm_readl_intr_cfg(pctrl, g);
|
||||
was_enabled = val & BIT(g->intr_raw_status_bit);
|
||||
val = oldval = msm_readl_intr_cfg(pctrl, g);
|
||||
val |= BIT(g->intr_raw_status_bit);
|
||||
if (g->intr_detection_width == 2) {
|
||||
val &= ~(3 << g->intr_detection_bit);
|
||||
@@ -1121,9 +1119,11 @@ static int msm_gpio_irq_set_type(struct irq_data *d, unsigned int type)
|
||||
/*
|
||||
* The first time we set RAW_STATUS_EN it could trigger an interrupt.
|
||||
* Clear the interrupt. This is safe because we have
|
||||
* IRQCHIP_SET_TYPE_MASKED.
|
||||
* IRQCHIP_SET_TYPE_MASKED. When changing the interrupt type, we could
|
||||
* also still have a non-matching interrupt latched, so clear whenever
|
||||
* making changes to the interrupt configuration.
|
||||
*/
|
||||
if (!was_enabled)
|
||||
if (val != oldval)
|
||||
msm_ack_intr_status(pctrl, g);
|
||||
|
||||
if (test_bit(d->hwirq, pctrl->dual_edge_irqs))
|
||||
|
||||
@@ -131,6 +131,8 @@ static int exynos_chipid_probe(struct platform_device *pdev)
|
||||
|
||||
soc_dev_attr->revision = devm_kasprintf(&pdev->dev, GFP_KERNEL,
|
||||
"%x", soc_info.revision);
|
||||
if (!soc_dev_attr->revision)
|
||||
return -ENOMEM;
|
||||
soc_dev_attr->soc_id = product_id_to_soc_id(soc_info.product_id);
|
||||
if (!soc_dev_attr->soc_id) {
|
||||
pr_err("Unknown SoC\n");
|
||||
|
||||
@@ -373,6 +373,7 @@ static const struct tsadc_table rk3328_code_table[] = {
|
||||
{296, -40000},
|
||||
{304, -35000},
|
||||
{313, -30000},
|
||||
{322, -25000},
|
||||
{331, -20000},
|
||||
{340, -15000},
|
||||
{349, -10000},
|
||||
|
||||
@@ -166,9 +166,12 @@ again:
|
||||
klm->bcount = cpu_to_be32(klm_bcount(dmr->end - dmr->start));
|
||||
preve = dmr->end;
|
||||
} else {
|
||||
u64 bcount = min_t(u64, dmr->start - preve, MAX_KLM_SIZE);
|
||||
|
||||
klm->key = cpu_to_be32(mvdev->res.null_mkey);
|
||||
klm->bcount = cpu_to_be32(klm_bcount(dmr->start - preve));
|
||||
preve = dmr->start;
|
||||
klm->bcount = cpu_to_be32(klm_bcount(bcount));
|
||||
preve += bcount;
|
||||
|
||||
goto again;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4661,6 +4661,18 @@ void __cold close_ctree(struct btrfs_fs_info *fs_info)
|
||||
*/
|
||||
btrfs_flush_workqueue(fs_info->delalloc_workers);
|
||||
|
||||
/*
|
||||
* When finishing a compressed write bio we schedule a work queue item
|
||||
* to finish an ordered extent - btrfs_finish_compressed_write_work()
|
||||
* calls btrfs_finish_ordered_extent() which in turns does a call to
|
||||
* btrfs_queue_ordered_fn(), and that queues the ordered extent
|
||||
* completion either in the endio_write_workers work queue or in the
|
||||
* fs_info->endio_freespace_worker work queue. We flush those queues
|
||||
* below, so before we flush them we must flush this queue for the
|
||||
* workers of compressed writes.
|
||||
*/
|
||||
flush_workqueue(fs_info->compressed_write_workers);
|
||||
|
||||
/*
|
||||
* After we parked the cleaner kthread, ordered extents may have
|
||||
* completed and created new delayed iputs. If one of the async reclaim
|
||||
|
||||
@@ -2041,7 +2041,7 @@ static struct ext4_dir_entry_2 *do_split(handle_t *handle, struct inode *dir,
|
||||
* split it in half by count; each resulting block will have at least
|
||||
* half the space free.
|
||||
*/
|
||||
if (i > 0)
|
||||
if (i >= 0)
|
||||
split = count - move;
|
||||
else
|
||||
split = count/2;
|
||||
|
||||
@@ -1711,7 +1711,6 @@ int jbd2_journal_update_sb_log_tail(journal_t *journal, tid_t tail_tid,
|
||||
|
||||
/* Log is no longer empty */
|
||||
write_lock(&journal->j_state_lock);
|
||||
WARN_ON(!sb->s_sequence);
|
||||
journal->j_flags &= ~JBD2_FLUSHED;
|
||||
write_unlock(&journal->j_state_lock);
|
||||
|
||||
|
||||
@@ -2417,6 +2417,8 @@ static int match_tcon(struct cifs_tcon *tcon, struct smb3_fs_context *ctx)
|
||||
return 0;
|
||||
if (tcon->nodelete != ctx->nodelete)
|
||||
return 0;
|
||||
if (tcon->posix_extensions != ctx->linux_ext)
|
||||
return 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
@@ -1111,6 +1111,11 @@ static int smb3_fs_context_parse_param(struct fs_context *fc,
|
||||
ctx->closetimeo = HZ * result.uint_32;
|
||||
break;
|
||||
case Opt_echo_interval:
|
||||
if (result.uint_32 < SMB_ECHO_INTERVAL_MIN ||
|
||||
result.uint_32 > SMB_ECHO_INTERVAL_MAX) {
|
||||
cifs_errorf(fc, "echo interval is out of bounds\n");
|
||||
goto cifs_parse_mount_err;
|
||||
}
|
||||
ctx->echo_interval = result.uint_32;
|
||||
break;
|
||||
case Opt_snapshot:
|
||||
|
||||
@@ -814,11 +814,12 @@ smb2_handle_cancelled_close(struct cifs_tcon *tcon, __u64 persistent_fid,
|
||||
WARN_ONCE(tcon->tc_count < 0, "tcon refcount is negative");
|
||||
spin_unlock(&cifs_tcp_ses_lock);
|
||||
|
||||
if (tcon->ses)
|
||||
if (tcon->ses) {
|
||||
server = tcon->ses->server;
|
||||
|
||||
cifs_server_dbg(FYI, "tid=0x%x: tcon is closing, skipping async close retry of fid %llu %llu\n",
|
||||
tcon->tid, persistent_fid, volatile_fid);
|
||||
cifs_server_dbg(FYI,
|
||||
"tid=0x%x: tcon is closing, skipping async close retry of fid %llu %llu\n",
|
||||
tcon->tid, persistent_fid, volatile_fid);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -777,6 +777,7 @@ struct sctp_transport {
|
||||
|
||||
/* Reference counting. */
|
||||
refcount_t refcnt;
|
||||
__u32 dead:1,
|
||||
/* RTO-Pending : A flag used to track if one of the DATA
|
||||
* chunks sent to this address is currently being
|
||||
* used to compute a RTT. If this flag is 0,
|
||||
@@ -786,7 +787,7 @@ struct sctp_transport {
|
||||
* calculation completes (i.e. the DATA chunk
|
||||
* is SACK'd) clear this flag.
|
||||
*/
|
||||
__u32 rto_pending:1,
|
||||
rto_pending:1,
|
||||
|
||||
/*
|
||||
* hb_sent : a flag that signals that we have a pending
|
||||
|
||||
@@ -6021,6 +6021,9 @@ static void zap_class(struct pending_free *pf, struct lock_class *class)
|
||||
hlist_del_rcu(&class->hash_entry);
|
||||
WRITE_ONCE(class->key, NULL);
|
||||
WRITE_ONCE(class->name, NULL);
|
||||
/* Class allocated but not used, -1 in nr_unused_locks */
|
||||
if (class->usage_mask == 0)
|
||||
debug_atomic_dec(nr_unused_locks);
|
||||
nr_lock_classes--;
|
||||
__clear_bit(class - lock_classes, lock_classes_in_use);
|
||||
if (class - lock_classes == max_lock_class_idx)
|
||||
|
||||
@@ -6522,6 +6522,7 @@ ftrace_graph_set_hash(struct ftrace_hash *hash, char *buffer)
|
||||
}
|
||||
}
|
||||
}
|
||||
cond_resched();
|
||||
} while_for_each_ftrace_rec();
|
||||
out:
|
||||
mutex_unlock(&ftrace_lock);
|
||||
|
||||
@@ -88,8 +88,6 @@ static void sg_split_phys(struct sg_splitter *splitters, const int nb_splits)
|
||||
if (!j) {
|
||||
out_sg->offset += split->skip_sg0;
|
||||
out_sg->length -= split->skip_sg0;
|
||||
} else {
|
||||
out_sg->offset = 0;
|
||||
}
|
||||
sg_dma_address(out_sg) = 0;
|
||||
sg_dma_len(out_sg) = 0;
|
||||
|
||||
@@ -765,12 +765,17 @@ static int kill_accessing_process(struct task_struct *p, unsigned long pfn,
|
||||
mmap_read_lock(p->mm);
|
||||
ret = walk_page_range(p->mm, 0, TASK_SIZE, &hwp_walk_ops,
|
||||
(void *)&priv);
|
||||
/*
|
||||
* ret = 1 when CMCI wins, regardless of whether try_to_unmap()
|
||||
* succeeds or fails, then kill the process with SIGBUS.
|
||||
* ret = 0 when poison page is a clean page and it's dropped, no
|
||||
* SIGBUS is needed.
|
||||
*/
|
||||
if (ret == 1 && priv.tk.addr)
|
||||
kill_proc(&priv.tk, pfn, flags);
|
||||
else
|
||||
ret = 0;
|
||||
mmap_read_unlock(p->mm);
|
||||
return ret > 0 ? -EHWPOISON : -EFAULT;
|
||||
|
||||
return ret > 0 ? -EHWPOISON : 0;
|
||||
}
|
||||
|
||||
static const char *action_name[] = {
|
||||
|
||||
@@ -2337,7 +2337,7 @@ static bool folio_make_device_exclusive(struct folio *folio,
|
||||
* Restrict to anonymous folios for now to avoid potential writeback
|
||||
* issues.
|
||||
*/
|
||||
if (!folio_test_anon(folio))
|
||||
if (!folio_test_anon(folio) || folio_test_hugetlb(folio))
|
||||
return false;
|
||||
|
||||
rmap_walk(folio, &rwc);
|
||||
|
||||
@@ -8220,7 +8220,7 @@ int node_reclaim(struct pglist_data *pgdat, gfp_t gfp_mask, unsigned int order)
|
||||
return NODE_RECLAIM_NOSCAN;
|
||||
|
||||
ret = __node_reclaim(pgdat, gfp_mask, order);
|
||||
clear_bit(PGDAT_RECLAIM_LOCKED, &pgdat->flags);
|
||||
clear_bit_unlock(PGDAT_RECLAIM_LOCKED, &pgdat->flags);
|
||||
|
||||
if (!ret)
|
||||
count_vm_event(PGSCAN_ZONE_RECLAIM_FAILED);
|
||||
|
||||
@@ -643,8 +643,6 @@ static bool subflow_hmac_valid(const struct request_sock *req,
|
||||
|
||||
subflow_req = mptcp_subflow_rsk(req);
|
||||
msk = subflow_req->msk;
|
||||
if (!msk)
|
||||
return false;
|
||||
|
||||
subflow_generate_hmac(msk->remote_key, msk->local_key,
|
||||
subflow_req->remote_nonce,
|
||||
@@ -739,12 +737,8 @@ static struct sock *subflow_syn_recv_sock(const struct sock *sk,
|
||||
|
||||
} else if (subflow_req->mp_join) {
|
||||
mptcp_get_options(skb, &mp_opt);
|
||||
if (!(mp_opt.suboptions & OPTION_MPTCP_MPJ_ACK) ||
|
||||
!subflow_hmac_valid(req, &mp_opt) ||
|
||||
!mptcp_can_accept_new_subflow(subflow_req->msk)) {
|
||||
SUBFLOW_REQ_INC_STATS(req, MPTCP_MIB_JOINACKMAC);
|
||||
if (!(mp_opt.suboptions & OPTION_MPTCP_MPJ_ACK))
|
||||
fallback = true;
|
||||
}
|
||||
}
|
||||
|
||||
create_child:
|
||||
@@ -794,6 +788,17 @@ create_child:
|
||||
goto dispose_child;
|
||||
}
|
||||
|
||||
if (!subflow_hmac_valid(req, &mp_opt)) {
|
||||
SUBFLOW_REQ_INC_STATS(req, MPTCP_MIB_JOINACKMAC);
|
||||
subflow_add_reset_reason(skb, MPTCP_RST_EPROHIBIT);
|
||||
goto dispose_child;
|
||||
}
|
||||
|
||||
if (!mptcp_can_accept_new_subflow(owner)) {
|
||||
subflow_add_reset_reason(skb, MPTCP_RST_EPROHIBIT);
|
||||
goto dispose_child;
|
||||
}
|
||||
|
||||
/* move the msk reference ownership to the subflow */
|
||||
subflow_req->msk = NULL;
|
||||
ctx->conn = (struct sock *)owner;
|
||||
|
||||
@@ -70,8 +70,9 @@
|
||||
/* Forward declarations for internal helper functions. */
|
||||
static bool sctp_writeable(const struct sock *sk);
|
||||
static void sctp_wfree(struct sk_buff *skb);
|
||||
static int sctp_wait_for_sndbuf(struct sctp_association *asoc, long *timeo_p,
|
||||
size_t msg_len);
|
||||
static int sctp_wait_for_sndbuf(struct sctp_association *asoc,
|
||||
struct sctp_transport *transport,
|
||||
long *timeo_p, size_t msg_len);
|
||||
static int sctp_wait_for_packet(struct sock *sk, int *err, long *timeo_p);
|
||||
static int sctp_wait_for_connect(struct sctp_association *, long *timeo_p);
|
||||
static int sctp_wait_for_accept(struct sock *sk, long timeo);
|
||||
@@ -1826,7 +1827,7 @@ static int sctp_sendmsg_to_asoc(struct sctp_association *asoc,
|
||||
|
||||
if (sctp_wspace(asoc) <= 0 || !sk_wmem_schedule(sk, msg_len)) {
|
||||
timeo = sock_sndtimeo(sk, msg->msg_flags & MSG_DONTWAIT);
|
||||
err = sctp_wait_for_sndbuf(asoc, &timeo, msg_len);
|
||||
err = sctp_wait_for_sndbuf(asoc, transport, &timeo, msg_len);
|
||||
if (err)
|
||||
goto err;
|
||||
if (unlikely(sinfo->sinfo_stream >= asoc->stream.outcnt)) {
|
||||
@@ -9203,8 +9204,9 @@ void sctp_sock_rfree(struct sk_buff *skb)
|
||||
|
||||
|
||||
/* Helper function to wait for space in the sndbuf. */
|
||||
static int sctp_wait_for_sndbuf(struct sctp_association *asoc, long *timeo_p,
|
||||
size_t msg_len)
|
||||
static int sctp_wait_for_sndbuf(struct sctp_association *asoc,
|
||||
struct sctp_transport *transport,
|
||||
long *timeo_p, size_t msg_len)
|
||||
{
|
||||
struct sock *sk = asoc->base.sk;
|
||||
long current_timeo = *timeo_p;
|
||||
@@ -9214,7 +9216,9 @@ static int sctp_wait_for_sndbuf(struct sctp_association *asoc, long *timeo_p,
|
||||
pr_debug("%s: asoc:%p, timeo:%ld, msg_len:%zu\n", __func__, asoc,
|
||||
*timeo_p, msg_len);
|
||||
|
||||
/* Increment the association's refcnt. */
|
||||
/* Increment the transport and association's refcnt. */
|
||||
if (transport)
|
||||
sctp_transport_hold(transport);
|
||||
sctp_association_hold(asoc);
|
||||
|
||||
/* Wait on the association specific sndbuf space. */
|
||||
@@ -9223,7 +9227,7 @@ static int sctp_wait_for_sndbuf(struct sctp_association *asoc, long *timeo_p,
|
||||
TASK_INTERRUPTIBLE);
|
||||
if (asoc->base.dead)
|
||||
goto do_dead;
|
||||
if (!*timeo_p)
|
||||
if ((!*timeo_p) || (transport && transport->dead))
|
||||
goto do_nonblock;
|
||||
if (sk->sk_err || asoc->state >= SCTP_STATE_SHUTDOWN_PENDING)
|
||||
goto do_error;
|
||||
@@ -9248,7 +9252,9 @@ static int sctp_wait_for_sndbuf(struct sctp_association *asoc, long *timeo_p,
|
||||
out:
|
||||
finish_wait(&asoc->wait, &wait);
|
||||
|
||||
/* Release the association's refcnt. */
|
||||
/* Release the transport and association's refcnt. */
|
||||
if (transport)
|
||||
sctp_transport_put(transport);
|
||||
sctp_association_put(asoc);
|
||||
|
||||
return err;
|
||||
|
||||
@@ -117,6 +117,8 @@ fail:
|
||||
*/
|
||||
void sctp_transport_free(struct sctp_transport *transport)
|
||||
{
|
||||
transport->dead = 1;
|
||||
|
||||
/* Try to delete the heartbeat timer. */
|
||||
if (del_timer(&transport->hb_timer))
|
||||
sctp_transport_put(transport);
|
||||
|
||||
@@ -24,8 +24,8 @@
|
||||
#define PLAYBACK_MIN_PERIOD_SIZE 128
|
||||
#define CAPTURE_MIN_NUM_PERIODS 2
|
||||
#define CAPTURE_MAX_NUM_PERIODS 8
|
||||
#define CAPTURE_MAX_PERIOD_SIZE 4096
|
||||
#define CAPTURE_MIN_PERIOD_SIZE 320
|
||||
#define CAPTURE_MAX_PERIOD_SIZE 65536
|
||||
#define CAPTURE_MIN_PERIOD_SIZE 6144
|
||||
#define BUFFER_BYTES_MAX (PLAYBACK_MAX_NUM_PERIODS * PLAYBACK_MAX_PERIOD_SIZE)
|
||||
#define BUFFER_BYTES_MIN (PLAYBACK_MIN_NUM_PERIODS * PLAYBACK_MIN_PERIOD_SIZE)
|
||||
#define SID_MASK_DEFAULT 0xF
|
||||
@@ -292,13 +292,14 @@ static int q6apm_dai_open(struct snd_soc_component *component,
|
||||
}
|
||||
}
|
||||
|
||||
ret = snd_pcm_hw_constraint_step(runtime, 0, SNDRV_PCM_HW_PARAM_PERIOD_BYTES, 32);
|
||||
/* setup 10ms latency to accommodate DSP restrictions */
|
||||
ret = snd_pcm_hw_constraint_step(runtime, 0, SNDRV_PCM_HW_PARAM_PERIOD_SIZE, 480);
|
||||
if (ret < 0) {
|
||||
dev_err(dev, "constraint for period bytes step ret = %d\n", ret);
|
||||
goto err;
|
||||
}
|
||||
|
||||
ret = snd_pcm_hw_constraint_step(runtime, 0, SNDRV_PCM_HW_PARAM_BUFFER_BYTES, 32);
|
||||
ret = snd_pcm_hw_constraint_step(runtime, 0, SNDRV_PCM_HW_PARAM_BUFFER_SIZE, 480);
|
||||
if (ret < 0) {
|
||||
dev_err(dev, "constraint for buffer bytes step ret = %d\n", ret);
|
||||
goto err;
|
||||
|
||||
@@ -902,9 +902,7 @@ static int q6asm_dai_compr_set_params(struct snd_soc_component *component,
|
||||
|
||||
if (ret < 0) {
|
||||
dev_err(dev, "q6asm_open_write failed\n");
|
||||
q6asm_audio_client_free(prtd->audio_client);
|
||||
prtd->audio_client = NULL;
|
||||
return ret;
|
||||
goto open_err;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -913,7 +911,7 @@ static int q6asm_dai_compr_set_params(struct snd_soc_component *component,
|
||||
prtd->session_id, dir);
|
||||
if (ret) {
|
||||
dev_err(dev, "Stream reg failed ret:%d\n", ret);
|
||||
return ret;
|
||||
goto q6_err;
|
||||
}
|
||||
|
||||
ret = __q6asm_dai_compr_set_codec_params(component, stream,
|
||||
@@ -921,7 +919,7 @@ static int q6asm_dai_compr_set_params(struct snd_soc_component *component,
|
||||
prtd->stream_id);
|
||||
if (ret) {
|
||||
dev_err(dev, "codec param setup failed ret:%d\n", ret);
|
||||
return ret;
|
||||
goto q6_err;
|
||||
}
|
||||
|
||||
ret = q6asm_map_memory_regions(dir, prtd->audio_client, prtd->phys,
|
||||
@@ -930,12 +928,21 @@ static int q6asm_dai_compr_set_params(struct snd_soc_component *component,
|
||||
|
||||
if (ret < 0) {
|
||||
dev_err(dev, "Buffer Mapping failed ret:%d\n", ret);
|
||||
return -ENOMEM;
|
||||
ret = -ENOMEM;
|
||||
goto q6_err;
|
||||
}
|
||||
|
||||
prtd->state = Q6ASM_STREAM_RUNNING;
|
||||
|
||||
return 0;
|
||||
|
||||
q6_err:
|
||||
q6asm_cmd(prtd->audio_client, prtd->stream_id, CMD_CLOSE);
|
||||
|
||||
open_err:
|
||||
q6asm_audio_client_free(prtd->audio_client);
|
||||
prtd->audio_client = NULL;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int q6asm_dai_compr_set_metadata(struct snd_soc_component *component,
|
||||
|
||||
Reference in New Issue
Block a user