Lines Matching refs:drvdata

93 static unsigned int etb_get_buffer_depth(struct etb_drvdata *drvdata)  in etb_get_buffer_depth()  argument
97 pm_runtime_get_sync(drvdata->dev); in etb_get_buffer_depth()
100 depth = readl_relaxed(drvdata->base + ETB_RAM_DEPTH_REG); in etb_get_buffer_depth()
102 pm_runtime_put(drvdata->dev); in etb_get_buffer_depth()
106 static void etb_enable_hw(struct etb_drvdata *drvdata) in etb_enable_hw() argument
111 CS_UNLOCK(drvdata->base); in etb_enable_hw()
113 depth = drvdata->buffer_depth; in etb_enable_hw()
115 writel_relaxed(0x0, drvdata->base + ETB_RAM_WRITE_POINTER); in etb_enable_hw()
118 writel_relaxed(0x0, drvdata->base + ETB_RWD_REG); in etb_enable_hw()
121 writel_relaxed(0x0, drvdata->base + ETB_RAM_WRITE_POINTER); in etb_enable_hw()
123 writel_relaxed(0x0, drvdata->base + ETB_RAM_READ_POINTER); in etb_enable_hw()
125 writel_relaxed(drvdata->trigger_cntr, drvdata->base + ETB_TRG); in etb_enable_hw()
127 drvdata->base + ETB_FFCR); in etb_enable_hw()
129 writel_relaxed(ETB_CTL_CAPT_EN, drvdata->base + ETB_CTL_REG); in etb_enable_hw()
131 CS_LOCK(drvdata->base); in etb_enable_hw()
138 struct etb_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent); in etb_enable() local
140 val = local_cmpxchg(&drvdata->mode, in etb_enable()
154 spin_lock_irqsave(&drvdata->spinlock, flags); in etb_enable()
155 etb_enable_hw(drvdata); in etb_enable()
156 spin_unlock_irqrestore(&drvdata->spinlock, flags); in etb_enable()
159 dev_info(drvdata->dev, "ETB enabled\n"); in etb_enable()
163 static void etb_disable_hw(struct etb_drvdata *drvdata) in etb_disable_hw() argument
167 CS_UNLOCK(drvdata->base); in etb_disable_hw()
169 ffcr = readl_relaxed(drvdata->base + ETB_FFCR); in etb_disable_hw()
172 writel_relaxed(ffcr, drvdata->base + ETB_FFCR); in etb_disable_hw()
175 writel_relaxed(ffcr, drvdata->base + ETB_FFCR); in etb_disable_hw()
177 if (coresight_timeout(drvdata->base, ETB_FFCR, ETB_FFCR_BIT, 0)) { in etb_disable_hw()
178 dev_err(drvdata->dev, in etb_disable_hw()
183 writel_relaxed(0x0, drvdata->base + ETB_CTL_REG); in etb_disable_hw()
185 if (coresight_timeout(drvdata->base, ETB_FFSR, ETB_FFSR_BIT, 1)) { in etb_disable_hw()
186 dev_err(drvdata->dev, in etb_disable_hw()
190 CS_LOCK(drvdata->base); in etb_disable_hw()
193 static void etb_dump_hw(struct etb_drvdata *drvdata) in etb_dump_hw() argument
202 CS_UNLOCK(drvdata->base); in etb_dump_hw()
204 read_ptr = readl_relaxed(drvdata->base + ETB_RAM_READ_POINTER); in etb_dump_hw()
205 write_ptr = readl_relaxed(drvdata->base + ETB_RAM_WRITE_POINTER); in etb_dump_hw()
210 dev_err(drvdata->dev, in etb_dump_hw()
213 dev_err(drvdata->dev, "frameoff: %lu, frame_endoff: %lu\n", in etb_dump_hw()
218 if ((readl_relaxed(drvdata->base + ETB_STATUS_REG) in etb_dump_hw()
220 writel_relaxed(0x0, drvdata->base + ETB_RAM_READ_POINTER); in etb_dump_hw()
222 writel_relaxed(write_ptr, drvdata->base + ETB_RAM_READ_POINTER); in etb_dump_hw()
226 depth = drvdata->buffer_depth; in etb_dump_hw()
227 buf_ptr = drvdata->buf; in etb_dump_hw()
229 read_data = readl_relaxed(drvdata->base + in etb_dump_hw()
236 coresight_insert_barrier_packet(drvdata->buf); in etb_dump_hw()
248 writel_relaxed(read_ptr, drvdata->base + ETB_RAM_READ_POINTER); in etb_dump_hw()
250 CS_LOCK(drvdata->base); in etb_dump_hw()
255 struct etb_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent); in etb_disable() local
258 spin_lock_irqsave(&drvdata->spinlock, flags); in etb_disable()
259 etb_disable_hw(drvdata); in etb_disable()
260 etb_dump_hw(drvdata); in etb_disable()
261 spin_unlock_irqrestore(&drvdata->spinlock, flags); in etb_disable()
263 local_set(&drvdata->mode, CS_MODE_DISABLED); in etb_disable()
265 dev_info(drvdata->dev, "ETB disabled\n"); in etb_disable()
360 struct etb_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent); in etb_update_buffer() local
365 capacity = drvdata->buffer_depth * ETB_FRAME_SIZE_WORDS; in etb_update_buffer()
367 etb_disable_hw(drvdata); in etb_update_buffer()
368 CS_UNLOCK(drvdata->base); in etb_update_buffer()
371 read_ptr = readl_relaxed(drvdata->base + ETB_RAM_READ_POINTER); in etb_update_buffer()
372 write_ptr = readl_relaxed(drvdata->base + ETB_RAM_WRITE_POINTER); in etb_update_buffer()
380 dev_err(drvdata->dev, in etb_update_buffer()
394 status = readl_relaxed(drvdata->base + ETB_STATUS_REG); in etb_update_buffer()
400 to_read = CIRC_CNT(write_ptr, read_ptr, drvdata->buffer_depth); in etb_update_buffer()
423 read_ptr = (write_ptr + drvdata->buffer_depth) - in etb_update_buffer()
426 if (read_ptr > (drvdata->buffer_depth - 1)) in etb_update_buffer()
427 read_ptr -= drvdata->buffer_depth; in etb_update_buffer()
436 writel_relaxed(read_ptr, drvdata->base + ETB_RAM_READ_POINTER); in etb_update_buffer()
444 read_data = readl_relaxed(drvdata->base + in etb_update_buffer()
464 writel_relaxed(0x0, drvdata->base + ETB_RAM_READ_POINTER); in etb_update_buffer()
465 writel_relaxed(0x0, drvdata->base + ETB_RAM_WRITE_POINTER); in etb_update_buffer()
478 etb_enable_hw(drvdata); in etb_update_buffer()
479 CS_LOCK(drvdata->base); in etb_update_buffer()
496 static void etb_dump(struct etb_drvdata *drvdata) in etb_dump() argument
500 spin_lock_irqsave(&drvdata->spinlock, flags); in etb_dump()
501 if (local_read(&drvdata->mode) == CS_MODE_SYSFS) { in etb_dump()
502 etb_disable_hw(drvdata); in etb_dump()
503 etb_dump_hw(drvdata); in etb_dump()
504 etb_enable_hw(drvdata); in etb_dump()
506 spin_unlock_irqrestore(&drvdata->spinlock, flags); in etb_dump()
508 dev_info(drvdata->dev, "ETB dumped\n"); in etb_dump()
513 struct etb_drvdata *drvdata = container_of(file->private_data, in etb_open() local
516 if (local_cmpxchg(&drvdata->reading, 0, 1)) in etb_open()
519 dev_dbg(drvdata->dev, "%s: successfully opened\n", __func__); in etb_open()
527 struct etb_drvdata *drvdata = container_of(file->private_data, in etb_read() local
530 etb_dump(drvdata); in etb_read()
532 depth = drvdata->buffer_depth; in etb_read()
536 if (copy_to_user(data, drvdata->buf + *ppos, len)) { in etb_read()
537 dev_dbg(drvdata->dev, "%s: copy_to_user failed\n", __func__); in etb_read()
543 dev_dbg(drvdata->dev, "%s: %zu bytes copied, %d bytes left\n", in etb_read()
550 struct etb_drvdata *drvdata = container_of(file->private_data, in etb_release() local
552 local_set(&drvdata->reading, 0); in etb_release()
554 dev_dbg(drvdata->dev, "%s: released\n", __func__); in etb_release()
593 struct etb_drvdata *drvdata = dev_get_drvdata(dev->parent); in trigger_cntr_show() local
594 unsigned long val = drvdata->trigger_cntr; in trigger_cntr_show()
605 struct etb_drvdata *drvdata = dev_get_drvdata(dev->parent); in trigger_cntr_store() local
611 drvdata->trigger_cntr = val; in trigger_cntr_store()
642 struct etb_drvdata *drvdata; in etb_probe() local
654 drvdata = devm_kzalloc(dev, sizeof(*drvdata), GFP_KERNEL); in etb_probe()
655 if (!drvdata) in etb_probe()
658 drvdata->dev = &adev->dev; in etb_probe()
659 drvdata->atclk = devm_clk_get(&adev->dev, "atclk"); /* optional */ in etb_probe()
660 if (!IS_ERR(drvdata->atclk)) { in etb_probe()
661 ret = clk_prepare_enable(drvdata->atclk); in etb_probe()
665 dev_set_drvdata(dev, drvdata); in etb_probe()
672 drvdata->base = base; in etb_probe()
674 spin_lock_init(&drvdata->spinlock); in etb_probe()
676 drvdata->buffer_depth = etb_get_buffer_depth(drvdata); in etb_probe()
679 if (drvdata->buffer_depth & 0x80000000) in etb_probe()
682 drvdata->buf = devm_kcalloc(dev, in etb_probe()
683 drvdata->buffer_depth, 4, GFP_KERNEL); in etb_probe()
684 if (!drvdata->buf) in etb_probe()
693 drvdata->csdev = coresight_register(&desc); in etb_probe()
694 if (IS_ERR(drvdata->csdev)) in etb_probe()
695 return PTR_ERR(drvdata->csdev); in etb_probe()
697 drvdata->miscdev.name = pdata->name; in etb_probe()
698 drvdata->miscdev.minor = MISC_DYNAMIC_MINOR; in etb_probe()
699 drvdata->miscdev.fops = &etb_fops; in etb_probe()
700 ret = misc_register(&drvdata->miscdev); in etb_probe()
707 coresight_unregister(drvdata->csdev); in etb_probe()
714 struct etb_drvdata *drvdata = dev_get_drvdata(dev); in etb_runtime_suspend() local
716 if (drvdata && !IS_ERR(drvdata->atclk)) in etb_runtime_suspend()
717 clk_disable_unprepare(drvdata->atclk); in etb_runtime_suspend()
724 struct etb_drvdata *drvdata = dev_get_drvdata(dev); in etb_runtime_resume() local
726 if (drvdata && !IS_ERR(drvdata->atclk)) in etb_runtime_resume()
727 clk_prepare_enable(drvdata->atclk); in etb_runtime_resume()