diff options
Diffstat (limited to 'drivers/soc')
-rw-r--r-- | drivers/soc/fsl/qe/gpio.c | 2 | ||||
-rw-r--r-- | drivers/soc/fsl/qe/qe_common.c | 66 | ||||
-rw-r--r-- | drivers/soc/fsl/qe/qe_ic.c | 11 | ||||
-rw-r--r-- | drivers/soc/ti/knav_qmss.h | 4 | ||||
-rw-r--r-- | drivers/soc/ti/knav_qmss_acc.c | 14 | ||||
-rw-r--r-- | drivers/soc/ti/knav_qmss_queue.c | 22 |
6 files changed, 64 insertions, 55 deletions
diff --git a/drivers/soc/fsl/qe/gpio.c b/drivers/soc/fsl/qe/gpio.c index aa5c11ac..6584571 100644 --- a/drivers/soc/fsl/qe/gpio.c +++ b/drivers/soc/fsl/qe/gpio.c @@ -63,7 +63,7 @@ static int qe_gpio_get(struct gpio_chip *gc, unsigned int gpio) struct qe_pio_regs __iomem *regs = mm_gc->regs; u32 pin_mask = 1 << (QE_PIO_PINS - 1 - gpio); - return in_be32(®s->cpdata) & pin_mask; + return !!(in_be32(®s->cpdata) & pin_mask); } static void qe_gpio_set(struct gpio_chip *gc, unsigned int gpio, int val) diff --git a/drivers/soc/fsl/qe/qe_common.c b/drivers/soc/fsl/qe/qe_common.c index 419fa5b..41eff80 100644 --- a/drivers/soc/fsl/qe/qe_common.c +++ b/drivers/soc/fsl/qe/qe_common.c @@ -103,6 +103,39 @@ out_muram: } /* + * cpm_muram_alloc_common - cpm_muram_alloc common code + * @size: number of bytes to allocate + * @algo: algorithm for alloc. + * @data: data for genalloc's algorithm. + * + * This function returns an offset into the muram area. + */ +static unsigned long cpm_muram_alloc_common(unsigned long size, + genpool_algo_t algo, void *data) +{ + struct muram_block *entry; + unsigned long start; + + start = gen_pool_alloc_algo(muram_pool, size, algo, data); + if (!start) + goto out2; + start = start - GENPOOL_OFFSET; + memset_io(cpm_muram_addr(start), 0, size); + entry = kmalloc(sizeof(*entry), GFP_ATOMIC); + if (!entry) + goto out1; + entry->start = start; + entry->size = size; + list_add(&entry->head, &muram_block_list); + + return start; +out1: + gen_pool_free(muram_pool, start, size); +out2: + return (unsigned long)-ENOMEM; +} + +/* * cpm_muram_alloc - allocate the requested size worth of multi-user ram * @size: number of bytes to allocate * @align: requested alignment, in bytes @@ -175,39 +208,6 @@ unsigned long cpm_muram_alloc_fixed(unsigned long offset, unsigned long size) } EXPORT_SYMBOL(cpm_muram_alloc_fixed); -/* - * cpm_muram_alloc_common - cpm_muram_alloc common code - * @size: number of bytes to allocate - * @algo: algorithm for alloc. - * @data: data for genalloc's algorithm. - * - * This function returns an offset into the muram area. - */ -unsigned long cpm_muram_alloc_common(unsigned long size, genpool_algo_t algo, - void *data) -{ - struct muram_block *entry; - unsigned long start; - - start = gen_pool_alloc_algo(muram_pool, size, algo, data); - if (!start) - goto out2; - start = start - GENPOOL_OFFSET; - memset_io(cpm_muram_addr(start), 0, size); - entry = kmalloc(sizeof(*entry), GFP_KERNEL); - if (!entry) - goto out1; - entry->start = start; - entry->size = size; - list_add(&entry->head, &muram_block_list); - - return start; -out1: - gen_pool_free(muram_pool, start, size); -out2: - return (unsigned long)-ENOMEM; -} - /** * cpm_muram_addr - turn a muram offset into a virtual address * @offset: muram offset to convert diff --git a/drivers/soc/fsl/qe/qe_ic.c b/drivers/soc/fsl/qe/qe_ic.c index b77d01f..ec2ca86 100644 --- a/drivers/soc/fsl/qe/qe_ic.c +++ b/drivers/soc/fsl/qe/qe_ic.c @@ -259,6 +259,11 @@ static int qe_ic_host_map(struct irq_domain *h, unsigned int virq, struct qe_ic *qe_ic = h->host_data; struct irq_chip *chip; + if (hw >= ARRAY_SIZE(qe_ic_info)) { + pr_err("%s: Invalid hw irq number for QEIC\n", __func__); + return -EINVAL; + } + if (qe_ic_info[hw].mask == 0) { printk(KERN_ERR "Can't map reserved IRQ\n"); return -EINVAL; @@ -407,7 +412,8 @@ int qe_ic_set_priority(unsigned int virq, unsigned int priority) if (priority > 8 || priority == 0) return -EINVAL; - if (src > 127) + if (WARN_ONCE(src >= ARRAY_SIZE(qe_ic_info), + "%s: Invalid hw irq number for QEIC\n", __func__)) return -EINVAL; if (qe_ic_info[src].pri_reg == 0) return -EINVAL; @@ -436,6 +442,9 @@ int qe_ic_set_high_priority(unsigned int virq, unsigned int priority, int high) if (priority > 2 || priority == 0) return -EINVAL; + if (WARN_ONCE(src >= ARRAY_SIZE(qe_ic_info), + "%s: Invalid hw irq number for QEIC\n", __func__)) + return -EINVAL; switch (qe_ic_info[src].pri_reg) { case QEIC_CIPZCC: diff --git a/drivers/soc/ti/knav_qmss.h b/drivers/soc/ti/knav_qmss.h index 6ff936c..905b974d 100644 --- a/drivers/soc/ti/knav_qmss.h +++ b/drivers/soc/ti/knav_qmss.h @@ -93,13 +93,13 @@ struct knav_reg_pdsp_regs { struct knav_reg_acc_command { u32 command; u32 queue_mask; - u32 list_phys; + u32 list_dma; u32 queue_num; u32 timer_config; }; struct knav_link_ram_block { - dma_addr_t phys; + dma_addr_t dma; void *virt; size_t size; }; diff --git a/drivers/soc/ti/knav_qmss_acc.c b/drivers/soc/ti/knav_qmss_acc.c index d2d48f2..0612eba 100644 --- a/drivers/soc/ti/knav_qmss_acc.c +++ b/drivers/soc/ti/knav_qmss_acc.c @@ -122,8 +122,8 @@ static irqreturn_t knav_acc_int_handler(int irq, void *_instdata) channel = acc->channel; list_dma = acc->list_dma[acc->list_index]; list_cpu = acc->list_cpu[acc->list_index]; - dev_dbg(kdev->dev, "acc-irq: channel %d, list %d, virt %p, phys %x\n", - channel, acc->list_index, list_cpu, list_dma); + dev_dbg(kdev->dev, "acc-irq: channel %d, list %d, virt %p, dma %pad\n", + channel, acc->list_index, list_cpu, &list_dma); if (atomic_read(&acc->retrigger_count)) { atomic_dec(&acc->retrigger_count); __knav_acc_notify(range, acc); @@ -297,12 +297,12 @@ knav_acc_write(struct knav_device *kdev, struct knav_pdsp_info *pdsp, u32 result; dev_dbg(kdev->dev, "acc command %08x %08x %08x %08x %08x\n", - cmd->command, cmd->queue_mask, cmd->list_phys, + cmd->command, cmd->queue_mask, cmd->list_dma, cmd->queue_num, cmd->timer_config); writel_relaxed(cmd->timer_config, &pdsp->acc_command->timer_config); writel_relaxed(cmd->queue_num, &pdsp->acc_command->queue_num); - writel_relaxed(cmd->list_phys, &pdsp->acc_command->list_phys); + writel_relaxed(cmd->list_dma, &pdsp->acc_command->list_dma); writel_relaxed(cmd->queue_mask, &pdsp->acc_command->queue_mask); writel_relaxed(cmd->command, &pdsp->acc_command->command); @@ -337,7 +337,7 @@ static void knav_acc_setup_cmd(struct knav_device *kdev, memset(cmd, 0, sizeof(*cmd)); cmd->command = acc->channel; cmd->queue_mask = queue_mask; - cmd->list_phys = acc->list_dma[0]; + cmd->list_dma = (u32)acc->list_dma[0]; cmd->queue_num = info->list_entries << 16; cmd->queue_num |= queue_base; @@ -591,8 +591,8 @@ int knav_init_acc_range(struct knav_device *kdev, acc->list_cpu[1] = list_mem + list_size; acc->list_dma[0] = list_dma; acc->list_dma[1] = list_dma + list_size; - dev_dbg(kdev->dev, "%s: channel %d, phys %08x, virt %8p\n", - acc->name, acc->channel, list_dma, list_mem); + dev_dbg(kdev->dev, "%s: channel %d, dma %pad, virt %8p\n", + acc->name, acc->channel, &list_dma, list_mem); } range->ops = &knav_acc_range_ops; diff --git a/drivers/soc/ti/knav_qmss_queue.c b/drivers/soc/ti/knav_qmss_queue.c index 8c03a80..b73e353 100644 --- a/drivers/soc/ti/knav_qmss_queue.c +++ b/drivers/soc/ti/knav_qmss_queue.c @@ -1023,9 +1023,9 @@ static void knav_queue_setup_region(struct knav_device *kdev, list_add(&pool->region_inst, ®ion->pools); dev_dbg(kdev->dev, - "region %s (%d): size:%d, link:%d@%d, phys:%08x-%08x, virt:%p-%p\n", + "region %s (%d): size:%d, link:%d@%d, dma:%pad-%pad, virt:%p-%p\n", region->name, id, region->desc_size, region->num_desc, - region->link_index, region->dma_start, region->dma_end, + region->link_index, ®ion->dma_start, ®ion->dma_end, region->virt_start, region->virt_end); hw_desc_size = (region->desc_size / 16) - 1; @@ -1033,7 +1033,7 @@ static void knav_queue_setup_region(struct knav_device *kdev, for_each_qmgr(kdev, qmgr) { regs = qmgr->reg_region + id; - writel_relaxed(region->dma_start, ®s->base); + writel_relaxed((u32)region->dma_start, ®s->base); writel_relaxed(region->link_index, ®s->start_index); writel_relaxed(hw_desc_size << 16 | hw_num_desc, ®s->size_count); @@ -1145,14 +1145,14 @@ static int knav_get_link_ram(struct knav_device *kdev, * queue_base specified => using internal or onchip * link ram WARNING - we do not "reserve" this block */ - block->phys = (dma_addr_t)temp[0]; + block->dma = (dma_addr_t)temp[0]; block->virt = NULL; block->size = temp[1]; } else { block->size = temp[1]; /* queue_base not specific => allocate requested size */ block->virt = dmam_alloc_coherent(kdev->dev, - 8 * block->size, &block->phys, + 8 * block->size, &block->dma, GFP_KERNEL); if (!block->virt) { dev_err(kdev->dev, "failed to alloc linkram\n"); @@ -1172,18 +1172,18 @@ static int knav_queue_setup_link_ram(struct knav_device *kdev) for_each_qmgr(kdev, qmgr) { block = &kdev->link_rams[0]; - dev_dbg(kdev->dev, "linkram0: phys:%x, virt:%p, size:%x\n", - block->phys, block->virt, block->size); - writel_relaxed(block->phys, &qmgr->reg_config->link_ram_base0); + dev_dbg(kdev->dev, "linkram0: dma:%pad, virt:%p, size:%x\n", + &block->dma, block->virt, block->size); + writel_relaxed((u32)block->dma, &qmgr->reg_config->link_ram_base0); writel_relaxed(block->size, &qmgr->reg_config->link_ram_size0); block++; if (!block->size) continue; - dev_dbg(kdev->dev, "linkram1: phys:%x, virt:%p, size:%x\n", - block->phys, block->virt, block->size); - writel_relaxed(block->phys, &qmgr->reg_config->link_ram_base1); + dev_dbg(kdev->dev, "linkram1: dma:%pad, virt:%p, size:%x\n", + &block->dma, block->virt, block->size); + writel_relaxed(block->dma, &qmgr->reg_config->link_ram_base1); } return 0; |