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()
566 __etb_enable_hw(drvdata); in etb_update_buffer()
567 CS_LOCK(drvdata->base); in etb_update_buffer()
569 spin_unlock_irqrestore(&drvdata->spinlock, flags); in etb_update_buffer()
586 static void etb_dump(struct etb_drvdata *drvdata) in etb_dump() argument
590 spin_lock_irqsave(&drvdata->spinlock, flags); in etb_dump()
591 if (drvdata->mode == CS_MODE_SYSFS) { in etb_dump()
592 __etb_disable_hw(drvdata); in etb_dump()
593 etb_dump_hw(drvdata); in etb_dump()
594 __etb_enable_hw(drvdata); in etb_dump()
596 spin_unlock_irqrestore(&drvdata->spinlock, flags); in etb_dump()
598 dev_dbg(&drvdata->csdev->dev, "ETB dumped\n"); in etb_dump()
603 struct etb_drvdata *drvdata = container_of(file->private_data, in etb_open() local
606 if (local_cmpxchg(&drvdata->reading, 0, 1)) in etb_open()
609 dev_dbg(&drvdata->csdev->dev, "%s: successfully opened\n", __func__); in etb_open()
617 struct etb_drvdata *drvdata = container_of(file->private_data, in etb_read() local
619 struct device *dev = &drvdata->csdev->dev; in etb_read()
621 etb_dump(drvdata); in etb_read()
623 depth = drvdata->buffer_depth; in etb_read()
627 if (copy_to_user(data, drvdata->buf + *ppos, len)) { in etb_read()
642 struct etb_drvdata *drvdata = container_of(file->private_data, in etb_release() local
644 local_set(&drvdata->reading, 0); in etb_release()
646 dev_dbg(&drvdata->csdev->dev, "%s: released\n", __func__); in etb_release()
673 struct etb_drvdata *drvdata = dev_get_drvdata(dev->parent); in trigger_cntr_show() local
674 unsigned long val = drvdata->trigger_cntr; in trigger_cntr_show()
685 struct etb_drvdata *drvdata = dev_get_drvdata(dev->parent); in trigger_cntr_store() local
691 drvdata->trigger_cntr = val; in trigger_cntr_store()
722 struct etb_drvdata *drvdata; in etb_probe() local
730 drvdata = devm_kzalloc(dev, sizeof(*drvdata), GFP_KERNEL); in etb_probe()
731 if (!drvdata) in etb_probe()
734 drvdata->atclk = devm_clk_get(&adev->dev, "atclk"); /* optional */ in etb_probe()
735 if (!IS_ERR(drvdata->atclk)) { in etb_probe()
736 ret = clk_prepare_enable(drvdata->atclk); in etb_probe()
740 dev_set_drvdata(dev, drvdata); in etb_probe()
747 drvdata->base = base; in etb_probe()
750 spin_lock_init(&drvdata->spinlock); in etb_probe()
752 drvdata->buffer_depth = etb_get_buffer_depth(drvdata); in etb_probe()
754 if (drvdata->buffer_depth & 0x80000000) in etb_probe()
757 drvdata->buf = devm_kcalloc(dev, in etb_probe()
758 drvdata->buffer_depth, 4, GFP_KERNEL); in etb_probe()
759 if (!drvdata->buf) in etb_probe()
763 drvdata->pid = -1; in etb_probe()
776 drvdata->csdev = coresight_register(&desc); in etb_probe()
777 if (IS_ERR(drvdata->csdev)) in etb_probe()
778 return PTR_ERR(drvdata->csdev); in etb_probe()
780 drvdata->miscdev.name = desc.name; in etb_probe()
781 drvdata->miscdev.minor = MISC_DYNAMIC_MINOR; in etb_probe()
782 drvdata->miscdev.fops = &etb_fops; in etb_probe()
783 ret = misc_register(&drvdata->miscdev); in etb_probe()
791 coresight_unregister(drvdata->csdev); in etb_probe()
797 struct etb_drvdata *drvdata = dev_get_drvdata(&adev->dev); in etb_remove() local
804 misc_deregister(&drvdata->miscdev); in etb_remove()
805 coresight_unregister(drvdata->csdev); in etb_remove()
811 struct etb_drvdata *drvdata = dev_get_drvdata(dev); in etb_runtime_suspend() local
813 if (drvdata && !IS_ERR(drvdata->atclk)) in etb_runtime_suspend()
814 clk_disable_unprepare(drvdata->atclk); in etb_runtime_suspend()
821 struct etb_drvdata *drvdata = dev_get_drvdata(dev); in etb_runtime_resume() local
823 if (drvdata && !IS_ERR(drvdata->atclk)) in etb_runtime_resume()
824 clk_prepare_enable(drvdata->atclk); in etb_runtime_resume()