Lines Matching refs:bdev

350 	struct bam_device *bdev;  member
406 static inline void __iomem *bam_addr(struct bam_device *bdev, u32 pipe, in bam_addr() argument
409 const struct reg_offset_data r = bdev->layout[reg]; in bam_addr()
411 return bdev->regs + r.base_offset + in bam_addr()
414 r.ee_mult * bdev->ee; in bam_addr()
425 struct bam_device *bdev = bchan->bdev; in bam_reset_channel() local
430 writel_relaxed(1, bam_addr(bdev, bchan->id, BAM_P_RST)); in bam_reset_channel()
431 writel_relaxed(0, bam_addr(bdev, bchan->id, BAM_P_RST)); in bam_reset_channel()
449 struct bam_device *bdev = bchan->bdev; in bam_chan_init_hw() local
460 bam_addr(bdev, bchan->id, BAM_P_DESC_FIFO_ADDR)); in bam_chan_init_hw()
462 bam_addr(bdev, bchan->id, BAM_P_FIFO_SIZES)); in bam_chan_init_hw()
466 bam_addr(bdev, bchan->id, BAM_P_IRQ_EN)); in bam_chan_init_hw()
469 val = readl_relaxed(bam_addr(bdev, 0, BAM_IRQ_SRCS_MSK_EE)); in bam_chan_init_hw()
471 writel_relaxed(val, bam_addr(bdev, 0, BAM_IRQ_SRCS_MSK_EE)); in bam_chan_init_hw()
481 writel_relaxed(val, bam_addr(bdev, bchan->id, BAM_P_CTRL)); in bam_chan_init_hw()
499 struct bam_device *bdev = bchan->bdev; in bam_alloc_chan() local
505 bchan->fifo_virt = dma_alloc_writecombine(bdev->dev, BAM_DESC_FIFO_SIZE, in bam_alloc_chan()
509 dev_err(bdev->dev, "Failed to allocate desc fifo\n"); in bam_alloc_chan()
526 struct bam_device *bdev = bchan->bdev; in bam_free_chan() local
533 dev_err(bchan->bdev->dev, "Cannot free busy channel\n"); in bam_free_chan()
541 dma_free_writecombine(bdev->dev, BAM_DESC_FIFO_SIZE, bchan->fifo_virt, in bam_free_chan()
546 val = readl_relaxed(bam_addr(bdev, 0, BAM_IRQ_SRCS_MSK_EE)); in bam_free_chan()
548 writel_relaxed(val, bam_addr(bdev, 0, BAM_IRQ_SRCS_MSK_EE)); in bam_free_chan()
551 writel_relaxed(0, bam_addr(bdev, bchan->id, BAM_P_IRQ_EN)); in bam_free_chan()
592 struct bam_device *bdev = bchan->bdev; in bam_prep_slave_sg() local
601 dev_err(bdev->dev, "invalid dma direction\n"); in bam_prep_slave_sg()
695 struct bam_device *bdev = bchan->bdev; in bam_pause() local
699 writel_relaxed(1, bam_addr(bdev, bchan->id, BAM_P_HALT)); in bam_pause()
714 struct bam_device *bdev = bchan->bdev; in bam_resume() local
718 writel_relaxed(0, bam_addr(bdev, bchan->id, BAM_P_HALT)); in bam_resume()
732 static u32 process_channel_irqs(struct bam_device *bdev) in process_channel_irqs() argument
738 srcs = readl_relaxed(bam_addr(bdev, 0, BAM_IRQ_SRCS_EE)); in process_channel_irqs()
744 for (i = 0; i < bdev->num_channels; i++) { in process_channel_irqs()
745 struct bam_chan *bchan = &bdev->channels[i]; in process_channel_irqs()
751 pipe_stts = readl_relaxed(bam_addr(bdev, i, BAM_P_IRQ_STTS)); in process_channel_irqs()
753 writel_relaxed(pipe_stts, bam_addr(bdev, i, BAM_P_IRQ_CLR)); in process_channel_irqs()
794 struct bam_device *bdev = data; in bam_dma_irq() local
797 srcs |= process_channel_irqs(bdev); in bam_dma_irq()
801 tasklet_schedule(&bdev->task); in bam_dma_irq()
804 clr_mask = readl_relaxed(bam_addr(bdev, 0, BAM_IRQ_STTS)); in bam_dma_irq()
809 writel_relaxed(clr_mask, bam_addr(bdev, 0, BAM_IRQ_CLR)); in bam_dma_irq()
865 struct bam_device *bdev = bchan->bdev; in bam_apply_new_config() local
873 writel_relaxed(maxburst, bam_addr(bdev, 0, BAM_DESC_CNT_TRSHLD)); in bam_apply_new_config()
885 struct bam_device *bdev = bchan->bdev; in bam_start_dma() local
940 bam_addr(bdev, bchan->id, BAM_P_EVNT_REG)); in bam_start_dma()
951 struct bam_device *bdev = (struct bam_device *)data; in dma_tasklet() local
957 for (i = 0; i < bdev->num_channels; i++) { in dma_tasklet()
958 bchan = &bdev->channels[i]; in dma_tasklet()
1003 struct bam_device *bdev = container_of(of->of_dma_data, in bam_dma_xlate() local
1011 if (request >= bdev->num_channels) in bam_dma_xlate()
1014 return dma_get_slave_channel(&(bdev->channels[request].vc.chan)); in bam_dma_xlate()
1023 static int bam_init(struct bam_device *bdev) in bam_init() argument
1028 val = readl_relaxed(bam_addr(bdev, 0, BAM_REVISION)) >> NUM_EES_SHIFT; in bam_init()
1032 if (bdev->ee >= val) in bam_init()
1035 val = readl_relaxed(bam_addr(bdev, 0, BAM_NUM_PIPES)); in bam_init()
1036 bdev->num_channels = val & BAM_NUM_PIPES_MASK; in bam_init()
1040 val = readl_relaxed(bam_addr(bdev, 0, BAM_CTRL)); in bam_init()
1042 writel_relaxed(val, bam_addr(bdev, 0, BAM_CTRL)); in bam_init()
1044 writel_relaxed(val, bam_addr(bdev, 0, BAM_CTRL)); in bam_init()
1051 writel_relaxed(val, bam_addr(bdev, 0, BAM_CTRL)); in bam_init()
1055 bam_addr(bdev, 0, BAM_DESC_CNT_TRSHLD)); in bam_init()
1058 writel_relaxed(BAM_CNFG_BITS_DEFAULT, bam_addr(bdev, 0, BAM_CNFG_BITS)); in bam_init()
1062 bam_addr(bdev, 0, BAM_IRQ_EN)); in bam_init()
1065 writel_relaxed(BAM_IRQ_MSK, bam_addr(bdev, 0, BAM_IRQ_SRCS_MSK_EE)); in bam_init()
1070 static void bam_channel_init(struct bam_device *bdev, struct bam_chan *bchan, in bam_channel_init() argument
1074 bchan->bdev = bdev; in bam_channel_init()
1076 vchan_init(&bchan->vc, &bdev->common); in bam_channel_init()
1091 struct bam_device *bdev; in bam_dma_probe() local
1096 bdev = devm_kzalloc(&pdev->dev, sizeof(*bdev), GFP_KERNEL); in bam_dma_probe()
1097 if (!bdev) in bam_dma_probe()
1100 bdev->dev = &pdev->dev; in bam_dma_probe()
1108 bdev->layout = match->data; in bam_dma_probe()
1111 bdev->regs = devm_ioremap_resource(&pdev->dev, iores); in bam_dma_probe()
1112 if (IS_ERR(bdev->regs)) in bam_dma_probe()
1113 return PTR_ERR(bdev->regs); in bam_dma_probe()
1115 bdev->irq = platform_get_irq(pdev, 0); in bam_dma_probe()
1116 if (bdev->irq < 0) in bam_dma_probe()
1117 return bdev->irq; in bam_dma_probe()
1119 ret = of_property_read_u32(pdev->dev.of_node, "qcom,ee", &bdev->ee); in bam_dma_probe()
1121 dev_err(bdev->dev, "Execution environment unspecified\n"); in bam_dma_probe()
1125 bdev->bamclk = devm_clk_get(bdev->dev, "bam_clk"); in bam_dma_probe()
1126 if (IS_ERR(bdev->bamclk)) in bam_dma_probe()
1127 return PTR_ERR(bdev->bamclk); in bam_dma_probe()
1129 ret = clk_prepare_enable(bdev->bamclk); in bam_dma_probe()
1131 dev_err(bdev->dev, "failed to prepare/enable clock\n"); in bam_dma_probe()
1135 ret = bam_init(bdev); in bam_dma_probe()
1139 tasklet_init(&bdev->task, dma_tasklet, (unsigned long)bdev); in bam_dma_probe()
1141 bdev->channels = devm_kcalloc(bdev->dev, bdev->num_channels, in bam_dma_probe()
1142 sizeof(*bdev->channels), GFP_KERNEL); in bam_dma_probe()
1144 if (!bdev->channels) { in bam_dma_probe()
1150 INIT_LIST_HEAD(&bdev->common.channels); in bam_dma_probe()
1152 for (i = 0; i < bdev->num_channels; i++) in bam_dma_probe()
1153 bam_channel_init(bdev, &bdev->channels[i], i); in bam_dma_probe()
1155 ret = devm_request_irq(bdev->dev, bdev->irq, bam_dma_irq, in bam_dma_probe()
1156 IRQF_TRIGGER_HIGH, "bam_dma", bdev); in bam_dma_probe()
1161 bdev->common.dev = bdev->dev; in bam_dma_probe()
1162 bdev->common.dev->dma_parms = &bdev->dma_parms; in bam_dma_probe()
1163 ret = dma_set_max_seg_size(bdev->common.dev, BAM_MAX_DATA_SIZE); in bam_dma_probe()
1165 dev_err(bdev->dev, "cannot set maximum segment size\n"); in bam_dma_probe()
1169 platform_set_drvdata(pdev, bdev); in bam_dma_probe()
1172 dma_cap_zero(bdev->common.cap_mask); in bam_dma_probe()
1173 dma_cap_set(DMA_SLAVE, bdev->common.cap_mask); in bam_dma_probe()
1176 bdev->common.directions = BIT(DMA_DEV_TO_MEM) | BIT(DMA_MEM_TO_DEV); in bam_dma_probe()
1177 bdev->common.residue_granularity = DMA_RESIDUE_GRANULARITY_SEGMENT; in bam_dma_probe()
1178 bdev->common.src_addr_widths = DMA_SLAVE_BUSWIDTH_4_BYTES; in bam_dma_probe()
1179 bdev->common.dst_addr_widths = DMA_SLAVE_BUSWIDTH_4_BYTES; in bam_dma_probe()
1180 bdev->common.device_alloc_chan_resources = bam_alloc_chan; in bam_dma_probe()
1181 bdev->common.device_free_chan_resources = bam_free_chan; in bam_dma_probe()
1182 bdev->common.device_prep_slave_sg = bam_prep_slave_sg; in bam_dma_probe()
1183 bdev->common.device_config = bam_slave_config; in bam_dma_probe()
1184 bdev->common.device_pause = bam_pause; in bam_dma_probe()
1185 bdev->common.device_resume = bam_resume; in bam_dma_probe()
1186 bdev->common.device_terminate_all = bam_dma_terminate_all; in bam_dma_probe()
1187 bdev->common.device_issue_pending = bam_issue_pending; in bam_dma_probe()
1188 bdev->common.device_tx_status = bam_tx_status; in bam_dma_probe()
1189 bdev->common.dev = bdev->dev; in bam_dma_probe()
1191 ret = dma_async_device_register(&bdev->common); in bam_dma_probe()
1193 dev_err(bdev->dev, "failed to register dma async device\n"); in bam_dma_probe()
1198 &bdev->common); in bam_dma_probe()
1205 dma_async_device_unregister(&bdev->common); in bam_dma_probe()
1207 for (i = 0; i < bdev->num_channels; i++) in bam_dma_probe()
1208 tasklet_kill(&bdev->channels[i].vc.task); in bam_dma_probe()
1210 tasklet_kill(&bdev->task); in bam_dma_probe()
1212 clk_disable_unprepare(bdev->bamclk); in bam_dma_probe()
1219 struct bam_device *bdev = platform_get_drvdata(pdev); in bam_dma_remove() local
1223 dma_async_device_unregister(&bdev->common); in bam_dma_remove()
1226 writel_relaxed(0, bam_addr(bdev, 0, BAM_IRQ_SRCS_MSK_EE)); in bam_dma_remove()
1228 devm_free_irq(bdev->dev, bdev->irq, bdev); in bam_dma_remove()
1230 for (i = 0; i < bdev->num_channels; i++) { in bam_dma_remove()
1231 bam_dma_terminate_all(&bdev->channels[i].vc.chan); in bam_dma_remove()
1232 tasklet_kill(&bdev->channels[i].vc.task); in bam_dma_remove()
1234 dma_free_writecombine(bdev->dev, BAM_DESC_FIFO_SIZE, in bam_dma_remove()
1235 bdev->channels[i].fifo_virt, in bam_dma_remove()
1236 bdev->channels[i].fifo_phys); in bam_dma_remove()
1239 tasklet_kill(&bdev->task); in bam_dma_remove()
1241 clk_disable_unprepare(bdev->bamclk); in bam_dma_remove()