Lines Matching refs:drvdata

100 static inline unsigned int etb_get_buffer_depth(struct etb_drvdata *drvdata)  in etb_get_buffer_depth()  argument
102 return readl_relaxed(drvdata->base + ETB_RAM_DEPTH_REG); in etb_get_buffer_depth()
105 static void __etb_enable_hw(struct etb_drvdata *drvdata) in __etb_enable_hw() argument
110 CS_UNLOCK(drvdata->base); in __etb_enable_hw()
112 depth = drvdata->buffer_depth; in __etb_enable_hw()
114 writel_relaxed(0x0, drvdata->base + ETB_RAM_WRITE_POINTER); in __etb_enable_hw()
117 writel_relaxed(0x0, drvdata->base + ETB_RWD_REG); in __etb_enable_hw()
120 writel_relaxed(0x0, drvdata->base + ETB_RAM_WRITE_POINTER); in __etb_enable_hw()
122 writel_relaxed(0x0, drvdata->base + ETB_RAM_READ_POINTER); in __etb_enable_hw()
124 writel_relaxed(drvdata->trigger_cntr, drvdata->base + ETB_TRG); in __etb_enable_hw()
126 drvdata->base + ETB_FFCR); in __etb_enable_hw()
128 writel_relaxed(ETB_CTL_CAPT_EN, drvdata->base + ETB_CTL_REG); in __etb_enable_hw()
130 CS_LOCK(drvdata->base); in __etb_enable_hw()
133 static int etb_enable_hw(struct etb_drvdata *drvdata) in etb_enable_hw() argument
135 int rc = coresight_claim_device(drvdata->csdev); in etb_enable_hw()
140 __etb_enable_hw(drvdata); in etb_enable_hw()
148 struct etb_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent); in etb_enable_sysfs() local
150 spin_lock_irqsave(&drvdata->spinlock, flags); in etb_enable_sysfs()
153 if (drvdata->mode == CS_MODE_PERF) { in etb_enable_sysfs()
158 if (drvdata->mode == CS_MODE_DISABLED) { in etb_enable_sysfs()
159 ret = etb_enable_hw(drvdata); in etb_enable_sysfs()
163 drvdata->mode = CS_MODE_SYSFS; in etb_enable_sysfs()
168 spin_unlock_irqrestore(&drvdata->spinlock, flags); in etb_enable_sysfs()
177 struct etb_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent); in etb_enable_perf() local
181 spin_lock_irqsave(&drvdata->spinlock, flags); in etb_enable_perf()
184 if (drvdata->mode == CS_MODE_SYSFS) { in etb_enable_perf()
192 if (drvdata->pid != -1 && drvdata->pid != pid) { in etb_enable_perf()
201 if (drvdata->pid == pid) { in etb_enable_perf()
215 ret = etb_enable_hw(drvdata); in etb_enable_perf()
218 drvdata->pid = pid; in etb_enable_perf()
219 drvdata->mode = CS_MODE_PERF; in etb_enable_perf()
224 spin_unlock_irqrestore(&drvdata->spinlock, flags); in etb_enable_perf()
251 static void __etb_disable_hw(struct etb_drvdata *drvdata) in __etb_disable_hw() argument
254 struct device *dev = &drvdata->csdev->dev; in __etb_disable_hw()
255 struct csdev_access *csa = &drvdata->csdev->access; in __etb_disable_hw()
257 CS_UNLOCK(drvdata->base); in __etb_disable_hw()
259 ffcr = readl_relaxed(drvdata->base + ETB_FFCR); in __etb_disable_hw()
262 writel_relaxed(ffcr, drvdata->base + ETB_FFCR); in __etb_disable_hw()
265 writel_relaxed(ffcr, drvdata->base + ETB_FFCR); in __etb_disable_hw()
273 writel_relaxed(0x0, drvdata->base + ETB_CTL_REG); in __etb_disable_hw()
280 CS_LOCK(drvdata->base); in __etb_disable_hw()
283 static void etb_dump_hw(struct etb_drvdata *drvdata) in etb_dump_hw() argument
291 struct device *dev = &drvdata->csdev->dev; in etb_dump_hw()
293 CS_UNLOCK(drvdata->base); in etb_dump_hw()
295 read_ptr = readl_relaxed(drvdata->base + ETB_RAM_READ_POINTER); in etb_dump_hw()
296 write_ptr = readl_relaxed(drvdata->base + ETB_RAM_WRITE_POINTER); in etb_dump_hw()
309 if ((readl_relaxed(drvdata->base + ETB_STATUS_REG) in etb_dump_hw()
311 writel_relaxed(0x0, drvdata->base + ETB_RAM_READ_POINTER); in etb_dump_hw()
313 writel_relaxed(write_ptr, drvdata->base + ETB_RAM_READ_POINTER); in etb_dump_hw()
317 depth = drvdata->buffer_depth; in etb_dump_hw()
318 buf_ptr = drvdata->buf; in etb_dump_hw()
320 read_data = readl_relaxed(drvdata->base + in etb_dump_hw()
327 coresight_insert_barrier_packet(drvdata->buf); in etb_dump_hw()
339 writel_relaxed(read_ptr, drvdata->base + ETB_RAM_READ_POINTER); in etb_dump_hw()
341 CS_LOCK(drvdata->base); in etb_dump_hw()
344 static void etb_disable_hw(struct etb_drvdata *drvdata) in etb_disable_hw() argument
346 __etb_disable_hw(drvdata); in etb_disable_hw()
347 etb_dump_hw(drvdata); in etb_disable_hw()
348 coresight_disclaim_device(drvdata->csdev); in etb_disable_hw()
353 struct etb_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent); in etb_disable() local
356 spin_lock_irqsave(&drvdata->spinlock, flags); in etb_disable()
359 spin_unlock_irqrestore(&drvdata->spinlock, flags); in etb_disable()
364 WARN_ON_ONCE(drvdata->mode == CS_MODE_DISABLED); in etb_disable()
365 etb_disable_hw(drvdata); in etb_disable()
367 drvdata->pid = -1; in etb_disable()
368 drvdata->mode = CS_MODE_DISABLED; in etb_disable()
369 spin_unlock_irqrestore(&drvdata->spinlock, flags); in etb_disable()
439 struct etb_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent); in etb_update_buffer() local
444 capacity = drvdata->buffer_depth * ETB_FRAME_SIZE_WORDS; in etb_update_buffer()
446 spin_lock_irqsave(&drvdata->spinlock, flags); in etb_update_buffer()
452 __etb_disable_hw(drvdata); in etb_update_buffer()
453 CS_UNLOCK(drvdata->base); in etb_update_buffer()
456 read_ptr = readl_relaxed(drvdata->base + ETB_RAM_READ_POINTER); in etb_update_buffer()
457 write_ptr = readl_relaxed(drvdata->base + ETB_RAM_WRITE_POINTER); in etb_update_buffer()
479 status = readl_relaxed(drvdata->base + ETB_STATUS_REG); in etb_update_buffer()
485 to_read = CIRC_CNT(write_ptr, read_ptr, drvdata->buffer_depth); in etb_update_buffer()
508 read_ptr = (write_ptr + drvdata->buffer_depth) - in etb_update_buffer()
511 if (read_ptr > (drvdata->buffer_depth - 1)) in etb_update_buffer()
512 read_ptr -= drvdata->buffer_depth; in etb_update_buffer()
527 writel_relaxed(read_ptr, drvdata->base + ETB_RAM_READ_POINTER); in etb_update_buffer()
535 read_data = readl_relaxed(drvdata->base + in etb_update_buffer()
555 writel_relaxed(0x0, drvdata->base + ETB_RAM_READ_POINTER); in etb_update_buffer()
556 writel_relaxed(0x0, drvdata->base + ETB_RAM_WRITE_POINTER); in etb_update_buffer()
567 __etb_enable_hw(drvdata); in etb_update_buffer()
568 CS_LOCK(drvdata->base); in etb_update_buffer()
570 spin_unlock_irqrestore(&drvdata->spinlock, flags); in etb_update_buffer()
587 static void etb_dump(struct etb_drvdata *drvdata) in etb_dump() argument
591 spin_lock_irqsave(&drvdata->spinlock, flags); in etb_dump()
592 if (drvdata->mode == CS_MODE_SYSFS) { in etb_dump()
593 __etb_disable_hw(drvdata); in etb_dump()
594 etb_dump_hw(drvdata); in etb_dump()
595 __etb_enable_hw(drvdata); in etb_dump()
597 spin_unlock_irqrestore(&drvdata->spinlock, flags); in etb_dump()
599 dev_dbg(&drvdata->csdev->dev, "ETB dumped\n"); in etb_dump()
604 struct etb_drvdata *drvdata = container_of(file->private_data, in etb_open() local
607 if (local_cmpxchg(&drvdata->reading, 0, 1)) in etb_open()
610 dev_dbg(&drvdata->csdev->dev, "%s: successfully opened\n", __func__); in etb_open()
618 struct etb_drvdata *drvdata = container_of(file->private_data, in etb_read() local
620 struct device *dev = &drvdata->csdev->dev; in etb_read()
622 etb_dump(drvdata); in etb_read()
624 depth = drvdata->buffer_depth; in etb_read()
628 if (copy_to_user(data, drvdata->buf + *ppos, len)) { in etb_read()
643 struct etb_drvdata *drvdata = container_of(file->private_data, in etb_release() local
645 local_set(&drvdata->reading, 0); in etb_release()
647 dev_dbg(&drvdata->csdev->dev, "%s: released\n", __func__); in etb_release()
686 struct etb_drvdata *drvdata = dev_get_drvdata(dev->parent); in trigger_cntr_show() local
687 unsigned long val = drvdata->trigger_cntr; in trigger_cntr_show()
698 struct etb_drvdata *drvdata = dev_get_drvdata(dev->parent); in trigger_cntr_store() local
704 drvdata->trigger_cntr = val; in trigger_cntr_store()
735 struct etb_drvdata *drvdata; in etb_probe() local
743 drvdata = devm_kzalloc(dev, sizeof(*drvdata), GFP_KERNEL); in etb_probe()
744 if (!drvdata) in etb_probe()
747 drvdata->atclk = devm_clk_get(&adev->dev, "atclk"); /* optional */ in etb_probe()
748 if (!IS_ERR(drvdata->atclk)) { in etb_probe()
749 ret = clk_prepare_enable(drvdata->atclk); in etb_probe()
753 dev_set_drvdata(dev, drvdata); in etb_probe()
760 drvdata->base = base; in etb_probe()
763 spin_lock_init(&drvdata->spinlock); in etb_probe()
765 drvdata->buffer_depth = etb_get_buffer_depth(drvdata); in etb_probe()
767 if (drvdata->buffer_depth & 0x80000000) in etb_probe()
770 drvdata->buf = devm_kcalloc(dev, in etb_probe()
771 drvdata->buffer_depth, 4, GFP_KERNEL); in etb_probe()
772 if (!drvdata->buf) in etb_probe()
776 drvdata->pid = -1; in etb_probe()
789 drvdata->csdev = coresight_register(&desc); in etb_probe()
790 if (IS_ERR(drvdata->csdev)) in etb_probe()
791 return PTR_ERR(drvdata->csdev); in etb_probe()
793 drvdata->miscdev.name = desc.name; in etb_probe()
794 drvdata->miscdev.minor = MISC_DYNAMIC_MINOR; in etb_probe()
795 drvdata->miscdev.fops = &etb_fops; in etb_probe()
796 ret = misc_register(&drvdata->miscdev); in etb_probe()
804 coresight_unregister(drvdata->csdev); in etb_probe()
810 struct etb_drvdata *drvdata = dev_get_drvdata(&adev->dev); in etb_remove() local
817 misc_deregister(&drvdata->miscdev); in etb_remove()
818 coresight_unregister(drvdata->csdev); in etb_remove()
824 struct etb_drvdata *drvdata = dev_get_drvdata(dev); in etb_runtime_suspend() local
826 if (drvdata && !IS_ERR(drvdata->atclk)) in etb_runtime_suspend()
827 clk_disable_unprepare(drvdata->atclk); in etb_runtime_suspend()
834 struct etb_drvdata *drvdata = dev_get_drvdata(dev); in etb_runtime_resume() local
836 if (drvdata && !IS_ERR(drvdata->atclk)) in etb_runtime_resume()
837 clk_prepare_enable(drvdata->atclk); in etb_runtime_resume()