cohc 1260 drivers/dma/coh901318.c #define COHC_2_DEV(cohc) (&cohc->chan.dev->device) cohc 1316 drivers/dma/coh901318.c static void coh901318_list_print(struct coh901318_chan *cohc, cohc 1323 drivers/dma/coh901318.c dev_vdbg(COHC_2_DEV(cohc), "i %d, lli %p, ctrl 0x%x, src %pad" cohc 1409 drivers/dma/coh901318.c cohc_chan_param(struct coh901318_chan *cohc) cohc 1411 drivers/dma/coh901318.c return &chan_config[cohc->id].param; cohc 1415 drivers/dma/coh901318.c cohc_chan_conf(struct coh901318_chan *cohc) cohc 1417 drivers/dma/coh901318.c return &chan_config[cohc->id]; cohc 1420 drivers/dma/coh901318.c static void enable_powersave(struct coh901318_chan *cohc) cohc 1423 drivers/dma/coh901318.c struct powersave *pm = &cohc->base->pm; cohc 1427 drivers/dma/coh901318.c pm->started_channels &= ~(1ULL << cohc->id); cohc 1431 drivers/dma/coh901318.c static void disable_powersave(struct coh901318_chan *cohc) cohc 1434 drivers/dma/coh901318.c struct powersave *pm = &cohc->base->pm; cohc 1438 drivers/dma/coh901318.c pm->started_channels |= (1ULL << cohc->id); cohc 1443 drivers/dma/coh901318.c static inline int coh901318_set_ctrl(struct coh901318_chan *cohc, u32 control) cohc 1445 drivers/dma/coh901318.c int channel = cohc->id; cohc 1446 drivers/dma/coh901318.c void __iomem *virtbase = cohc->base->virtbase; cohc 1454 drivers/dma/coh901318.c static inline int coh901318_set_conf(struct coh901318_chan *cohc, u32 conf) cohc 1456 drivers/dma/coh901318.c int channel = cohc->id; cohc 1457 drivers/dma/coh901318.c void __iomem *virtbase = cohc->base->virtbase; cohc 1466 drivers/dma/coh901318.c static int coh901318_start(struct coh901318_chan *cohc) cohc 1469 drivers/dma/coh901318.c int channel = cohc->id; cohc 1470 drivers/dma/coh901318.c void __iomem *virtbase = cohc->base->virtbase; cohc 1472 drivers/dma/coh901318.c disable_powersave(cohc); cohc 1485 drivers/dma/coh901318.c static int coh901318_prep_linked_list(struct coh901318_chan *cohc, cohc 1488 drivers/dma/coh901318.c int channel = cohc->id; cohc 1489 drivers/dma/coh901318.c void __iomem *virtbase = cohc->base->virtbase; cohc 1513 drivers/dma/coh901318.c coh901318_desc_get(struct coh901318_chan *cohc) cohc 1517 drivers/dma/coh901318.c if (list_empty(&cohc->free)) { cohc 1526 drivers/dma/coh901318.c dma_async_tx_descriptor_init(&desc->desc, &cohc->chan); cohc 1529 drivers/dma/coh901318.c desc = list_first_entry(&cohc->free, cohc 1545 drivers/dma/coh901318.c coh901318_desc_free(struct coh901318_chan *cohc, struct coh901318_desc *cohd) cohc 1547 drivers/dma/coh901318.c list_add_tail(&cohd->node, &cohc->free); cohc 1552 drivers/dma/coh901318.c coh901318_desc_submit(struct coh901318_chan *cohc, struct coh901318_desc *desc) cohc 1554 drivers/dma/coh901318.c list_add_tail(&desc->node, &cohc->active); cohc 1558 drivers/dma/coh901318.c coh901318_first_active_get(struct coh901318_chan *cohc) cohc 1560 drivers/dma/coh901318.c return list_first_entry_or_null(&cohc->active, struct coh901318_desc, cohc 1571 drivers/dma/coh901318.c coh901318_desc_queue(struct coh901318_chan *cohc, struct coh901318_desc *desc) cohc 1573 drivers/dma/coh901318.c list_add_tail(&desc->node, &cohc->queue); cohc 1577 drivers/dma/coh901318.c coh901318_first_queued(struct coh901318_chan *cohc) cohc 1579 drivers/dma/coh901318.c return list_first_entry_or_null(&cohc->queue, struct coh901318_desc, cohc 1603 drivers/dma/coh901318.c struct coh901318_chan *cohc = to_coh901318_chan(chan); cohc 1610 drivers/dma/coh901318.c spin_lock_irqsave(&cohc->lock, flags); cohc 1617 drivers/dma/coh901318.c list_for_each(pos, &cohc->active) { cohc 1631 drivers/dma/coh901318.c left = readl(cohc->base->virtbase + cohc 1633 drivers/dma/coh901318.c COH901318_CX_CTRL_SPACING * cohc->id) & cohc 1637 drivers/dma/coh901318.c ladd = readl(cohc->base->virtbase + cohc 1640 drivers/dma/coh901318.c cohc->id) & cohc 1669 drivers/dma/coh901318.c list_for_each(pos, &cohc->queue) { cohc 1674 drivers/dma/coh901318.c spin_unlock_irqrestore(&cohc->lock, flags); cohc 1687 drivers/dma/coh901318.c struct coh901318_chan *cohc = to_coh901318_chan(chan); cohc 1688 drivers/dma/coh901318.c int channel = cohc->id; cohc 1689 drivers/dma/coh901318.c void __iomem *virtbase = cohc->base->virtbase; cohc 1691 drivers/dma/coh901318.c spin_lock_irqsave(&cohc->lock, flags); cohc 1700 drivers/dma/coh901318.c cohc->stopped = 1; cohc 1718 drivers/dma/coh901318.c cohc->stopped = 1; cohc 1720 drivers/dma/coh901318.c enable_powersave(cohc); cohc 1722 drivers/dma/coh901318.c spin_unlock_irqrestore(&cohc->lock, flags); cohc 1733 drivers/dma/coh901318.c struct coh901318_chan *cohc = to_coh901318_chan(chan); cohc 1734 drivers/dma/coh901318.c int channel = cohc->id; cohc 1736 drivers/dma/coh901318.c spin_lock_irqsave(&cohc->lock, flags); cohc 1738 drivers/dma/coh901318.c disable_powersave(cohc); cohc 1740 drivers/dma/coh901318.c if (cohc->stopped) { cohc 1742 drivers/dma/coh901318.c val = readl(cohc->base->virtbase + COH901318_CX_CFG + cohc 1747 drivers/dma/coh901318.c writel(val, cohc->base->virtbase + COH901318_CX_CFG + cohc 1750 drivers/dma/coh901318.c cohc->stopped = 0; cohc 1753 drivers/dma/coh901318.c spin_unlock_irqrestore(&cohc->lock, flags); cohc 1800 drivers/dma/coh901318.c static int coh901318_config(struct coh901318_chan *cohc, cohc 1804 drivers/dma/coh901318.c int channel = cohc->id; cohc 1805 drivers/dma/coh901318.c void __iomem *virtbase = cohc->base->virtbase; cohc 1810 drivers/dma/coh901318.c p = cohc_chan_param(cohc); cohc 1823 drivers/dma/coh901318.c coh901318_set_conf(cohc, p->config); cohc 1824 drivers/dma/coh901318.c coh901318_set_ctrl(cohc, p->ctrl_lli_last); cohc 1836 drivers/dma/coh901318.c static struct coh901318_desc *coh901318_queue_start(struct coh901318_chan *cohc) cohc 1844 drivers/dma/coh901318.c cohd = coh901318_first_queued(cohc); cohc 1850 drivers/dma/coh901318.c cohc->busy = 1; cohc 1852 drivers/dma/coh901318.c coh901318_desc_submit(cohc, cohd); cohc 1855 drivers/dma/coh901318.c coh901318_set_conf(cohc, cohd->head_config); cohc 1856 drivers/dma/coh901318.c coh901318_set_ctrl(cohc, cohd->head_ctrl); cohc 1857 drivers/dma/coh901318.c coh901318_prep_linked_list(cohc, cohd->lli); cohc 1860 drivers/dma/coh901318.c coh901318_start(cohc); cohc 1873 drivers/dma/coh901318.c struct coh901318_chan *cohc = (struct coh901318_chan *) data; cohc 1878 drivers/dma/coh901318.c dev_vdbg(COHC_2_DEV(cohc), "[%s] chan_id %d" cohc 1880 drivers/dma/coh901318.c cohc->id, cohc->nbr_active_done); cohc 1882 drivers/dma/coh901318.c spin_lock_irqsave(&cohc->lock, flags); cohc 1885 drivers/dma/coh901318.c cohd_fin = coh901318_first_active_get(cohc); cohc 1897 drivers/dma/coh901318.c coh901318_lli_free(&cohc->base->pool, &cohd_fin->lli); cohc 1901 drivers/dma/coh901318.c coh901318_desc_free(cohc, cohd_fin); cohc 1903 drivers/dma/coh901318.c spin_unlock_irqrestore(&cohc->lock, flags); cohc 1908 drivers/dma/coh901318.c spin_lock_irqsave(&cohc->lock, flags); cohc 1917 drivers/dma/coh901318.c cohc->nbr_active_done--; cohc 1918 drivers/dma/coh901318.c if (cohc->nbr_active_done) { cohc 1919 drivers/dma/coh901318.c dev_dbg(COHC_2_DEV(cohc), "scheduling tasklet again, new IRQs " cohc 1921 drivers/dma/coh901318.c if (cohc_chan_conf(cohc)->priority_high) cohc 1922 drivers/dma/coh901318.c tasklet_hi_schedule(&cohc->tasklet); cohc 1924 drivers/dma/coh901318.c tasklet_schedule(&cohc->tasklet); cohc 1927 drivers/dma/coh901318.c spin_unlock_irqrestore(&cohc->lock, flags); cohc 1932 drivers/dma/coh901318.c spin_unlock_irqrestore(&cohc->lock, flags); cohc 1933 drivers/dma/coh901318.c dev_err(COHC_2_DEV(cohc), "[%s] No active dma desc\n", __func__); cohc 1938 drivers/dma/coh901318.c static void dma_tc_handle(struct coh901318_chan *cohc) cohc 1944 drivers/dma/coh901318.c if (!cohc->allocated) { cohc 1945 drivers/dma/coh901318.c dev_err(COHC_2_DEV(cohc), "spurious interrupt from " cohc 1959 drivers/dma/coh901318.c BUG_ON(list_empty(&cohc->active)); cohc 1961 drivers/dma/coh901318.c cohc->nbr_active_done++; cohc 1967 drivers/dma/coh901318.c if (coh901318_queue_start(cohc) == NULL) cohc 1968 drivers/dma/coh901318.c cohc->busy = 0; cohc 1974 drivers/dma/coh901318.c if (cohc_chan_conf(cohc)->priority_high) cohc 1975 drivers/dma/coh901318.c tasklet_hi_schedule(&cohc->tasklet); cohc 1977 drivers/dma/coh901318.c tasklet_schedule(&cohc->tasklet); cohc 1988 drivers/dma/coh901318.c struct coh901318_chan *cohc; cohc 2008 drivers/dma/coh901318.c cohc = &base->chans[ch]; cohc 2009 drivers/dma/coh901318.c spin_lock(&cohc->lock); cohc 2015 drivers/dma/coh901318.c dev_crit(COHC_2_DEV(cohc), cohc 2024 drivers/dma/coh901318.c dev_warn(COHC_2_DEV(cohc), cohc 2034 drivers/dma/coh901318.c enable_powersave(cohc); cohc 2043 drivers/dma/coh901318.c dma_tc_handle(cohc); cohc 2046 drivers/dma/coh901318.c spin_unlock(&cohc->lock); cohc 2054 drivers/dma/coh901318.c cohc = &base->chans[ch]; cohc 2055 drivers/dma/coh901318.c spin_lock(&cohc->lock); cohc 2061 drivers/dma/coh901318.c dev_crit(COHC_2_DEV(cohc), cohc 2070 drivers/dma/coh901318.c dev_warn(COHC_2_DEV(cohc), cohc 2080 drivers/dma/coh901318.c enable_powersave(cohc); cohc 2088 drivers/dma/coh901318.c dma_tc_handle(cohc); cohc 2091 drivers/dma/coh901318.c spin_unlock(&cohc->lock); cohc 2100 drivers/dma/coh901318.c struct coh901318_chan *cohc = to_coh901318_chan(chan); cohc 2102 drivers/dma/coh901318.c void __iomem *virtbase = cohc->base->virtbase; cohc 2106 drivers/dma/coh901318.c spin_lock_irqsave(&cohc->lock, flags); cohc 2109 drivers/dma/coh901318.c if (cohc->id < 32) { cohc 2110 drivers/dma/coh901318.c writel(1 << cohc->id, virtbase + COH901318_BE_INT_CLEAR1); cohc 2111 drivers/dma/coh901318.c writel(1 << cohc->id, virtbase + COH901318_TC_INT_CLEAR1); cohc 2113 drivers/dma/coh901318.c writel(1 << (cohc->id - 32), virtbase + cohc 2115 drivers/dma/coh901318.c writel(1 << (cohc->id - 32), virtbase + cohc 2119 drivers/dma/coh901318.c enable_powersave(cohc); cohc 2121 drivers/dma/coh901318.c while ((cohd = coh901318_first_active_get(cohc))) { cohc 2123 drivers/dma/coh901318.c coh901318_lli_free(&cohc->base->pool, &cohd->lli); cohc 2127 drivers/dma/coh901318.c coh901318_desc_free(cohc, cohd); cohc 2130 drivers/dma/coh901318.c while ((cohd = coh901318_first_queued(cohc))) { cohc 2132 drivers/dma/coh901318.c coh901318_lli_free(&cohc->base->pool, &cohd->lli); cohc 2136 drivers/dma/coh901318.c coh901318_desc_free(cohc, cohd); cohc 2140 drivers/dma/coh901318.c cohc->nbr_active_done = 0; cohc 2141 drivers/dma/coh901318.c cohc->busy = 0; cohc 2143 drivers/dma/coh901318.c spin_unlock_irqrestore(&cohc->lock, flags); cohc 2150 drivers/dma/coh901318.c struct coh901318_chan *cohc = to_coh901318_chan(chan); cohc 2153 drivers/dma/coh901318.c dev_vdbg(COHC_2_DEV(cohc), "[%s] DMA channel %d\n", cohc 2154 drivers/dma/coh901318.c __func__, cohc->id); cohc 2159 drivers/dma/coh901318.c spin_lock_irqsave(&cohc->lock, flags); cohc 2161 drivers/dma/coh901318.c coh901318_config(cohc, NULL); cohc 2163 drivers/dma/coh901318.c cohc->allocated = 1; cohc 2166 drivers/dma/coh901318.c spin_unlock_irqrestore(&cohc->lock, flags); cohc 2174 drivers/dma/coh901318.c struct coh901318_chan *cohc = to_coh901318_chan(chan); cohc 2175 drivers/dma/coh901318.c int channel = cohc->id; cohc 2178 drivers/dma/coh901318.c spin_lock_irqsave(&cohc->lock, flags); cohc 2181 drivers/dma/coh901318.c writel(0x00000000U, cohc->base->virtbase + COH901318_CX_CFG + cohc 2183 drivers/dma/coh901318.c writel(0x00000000U, cohc->base->virtbase + COH901318_CX_CTRL + cohc 2186 drivers/dma/coh901318.c cohc->allocated = 0; cohc 2188 drivers/dma/coh901318.c spin_unlock_irqrestore(&cohc->lock, flags); cohc 2199 drivers/dma/coh901318.c struct coh901318_chan *cohc = to_coh901318_chan(tx->chan); cohc 2203 drivers/dma/coh901318.c spin_lock_irqsave(&cohc->lock, flags); cohc 2206 drivers/dma/coh901318.c coh901318_desc_queue(cohc, cohd); cohc 2208 drivers/dma/coh901318.c spin_unlock_irqrestore(&cohc->lock, flags); cohc 2220 drivers/dma/coh901318.c struct coh901318_chan *cohc = to_coh901318_chan(chan); cohc 2222 drivers/dma/coh901318.c u32 ctrl_last = cohc_chan_param(cohc)->ctrl_lli_last; cohc 2225 drivers/dma/coh901318.c spin_lock_irqsave(&cohc->lock, flg); cohc 2227 drivers/dma/coh901318.c dev_vdbg(COHC_2_DEV(cohc), cohc 2229 drivers/dma/coh901318.c __func__, cohc->id, &src, &dest, size); cohc 2239 drivers/dma/coh901318.c lli = coh901318_lli_alloc(&cohc->base->pool, lli_len); cohc 2245 drivers/dma/coh901318.c &cohc->base->pool, lli, src, size, dest, cohc 2246 drivers/dma/coh901318.c cohc_chan_param(cohc)->ctrl_lli_chained, cohc 2251 drivers/dma/coh901318.c COH_DBG(coh901318_list_print(cohc, lli)); cohc 2254 drivers/dma/coh901318.c cohd = coh901318_desc_get(cohc); cohc 2259 drivers/dma/coh901318.c spin_unlock_irqrestore(&cohc->lock, flg); cohc 2263 drivers/dma/coh901318.c spin_unlock_irqrestore(&cohc->lock, flg); cohc 2272 drivers/dma/coh901318.c struct coh901318_chan *cohc = to_coh901318_chan(chan); cohc 2280 drivers/dma/coh901318.c u32 ctrl_chained = cohc_chan_param(cohc)->ctrl_lli_chained; cohc 2281 drivers/dma/coh901318.c u32 ctrl = cohc_chan_param(cohc)->ctrl_lli; cohc 2282 drivers/dma/coh901318.c u32 ctrl_last = cohc_chan_param(cohc)->ctrl_lli_last; cohc 2292 drivers/dma/coh901318.c spin_lock_irqsave(&cohc->lock, flg); cohc 2294 drivers/dma/coh901318.c dev_vdbg(COHC_2_DEV(cohc), "[%s] sg_len %d dir %d\n", cohc 2301 drivers/dma/coh901318.c params = cohc_chan_param(cohc); cohc 2308 drivers/dma/coh901318.c ctrl_chained |= cohc->ctrl; cohc 2309 drivers/dma/coh901318.c ctrl_last |= cohc->ctrl; cohc 2310 drivers/dma/coh901318.c ctrl |= cohc->ctrl; cohc 2352 drivers/dma/coh901318.c lli = coh901318_lli_alloc(&cohc->base->pool, len); cohc 2357 drivers/dma/coh901318.c coh901318_dma_set_runtimeconfig(chan, &cohc->config, direction); cohc 2360 drivers/dma/coh901318.c ret = coh901318_lli_fill_sg(&cohc->base->pool, lli, sgl, sg_len, cohc 2361 drivers/dma/coh901318.c cohc->addr, cohc 2370 drivers/dma/coh901318.c COH_DBG(coh901318_list_print(cohc, lli)); cohc 2373 drivers/dma/coh901318.c cohd = coh901318_desc_get(cohc); cohc 2386 drivers/dma/coh901318.c spin_unlock_irqrestore(&cohc->lock, flg); cohc 2392 drivers/dma/coh901318.c spin_unlock_irqrestore(&cohc->lock, flg); cohc 2401 drivers/dma/coh901318.c struct coh901318_chan *cohc = to_coh901318_chan(chan); cohc 2410 drivers/dma/coh901318.c if (ret == DMA_IN_PROGRESS && cohc->stopped) cohc 2419 drivers/dma/coh901318.c struct coh901318_chan *cohc = to_coh901318_chan(chan); cohc 2422 drivers/dma/coh901318.c spin_lock_irqsave(&cohc->lock, flags); cohc 2430 drivers/dma/coh901318.c if (!cohc->busy) cohc 2431 drivers/dma/coh901318.c coh901318_queue_start(cohc); cohc 2433 drivers/dma/coh901318.c spin_unlock_irqrestore(&cohc->lock, flags); cohc 2501 drivers/dma/coh901318.c struct coh901318_chan *cohc = to_coh901318_chan(chan); cohc 2518 drivers/dma/coh901318.c dev_err(COHC_2_DEV(cohc), "illegal channel mode\n"); cohc 2522 drivers/dma/coh901318.c dev_dbg(COHC_2_DEV(cohc), "configure channel for %d byte transfers\n", cohc 2563 drivers/dma/coh901318.c dev_err(COHC_2_DEV(cohc), cohc 2569 drivers/dma/coh901318.c dev_dbg(COHC_2_DEV(cohc), cohc 2573 drivers/dma/coh901318.c cohc->addr = addr; cohc 2574 drivers/dma/coh901318.c cohc->ctrl = ctrl; cohc 2582 drivers/dma/coh901318.c struct coh901318_chan *cohc = to_coh901318_chan(chan); cohc 2584 drivers/dma/coh901318.c memcpy(&cohc->config, config, sizeof(*config)); cohc 2594 drivers/dma/coh901318.c struct coh901318_chan *cohc; cohc 2600 drivers/dma/coh901318.c cohc = &base->chans[i]; cohc 2602 drivers/dma/coh901318.c cohc->base = base; cohc 2603 drivers/dma/coh901318.c cohc->chan.device = dma; cohc 2604 drivers/dma/coh901318.c cohc->id = i; cohc 2610 drivers/dma/coh901318.c spin_lock_init(&cohc->lock); cohc 2612 drivers/dma/coh901318.c cohc->nbr_active_done = 0; cohc 2613 drivers/dma/coh901318.c cohc->busy = 0; cohc 2614 drivers/dma/coh901318.c INIT_LIST_HEAD(&cohc->free); cohc 2615 drivers/dma/coh901318.c INIT_LIST_HEAD(&cohc->active); cohc 2616 drivers/dma/coh901318.c INIT_LIST_HEAD(&cohc->queue); cohc 2618 drivers/dma/coh901318.c tasklet_init(&cohc->tasklet, dma_tasklet, cohc 2619 drivers/dma/coh901318.c (unsigned long) cohc); cohc 2621 drivers/dma/coh901318.c list_add_tail(&cohc->chan.device_node, cohc 2755 drivers/dma/coh901318.c struct coh901318_chan *cohc; cohc 2759 drivers/dma/coh901318.c cohc = &base->chans[i]; cohc 2761 drivers/dma/coh901318.c tasklet_kill(&cohc->tasklet);