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->base); 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
180 spin_lock_irqsave(&drvdata->spinlock, flags); in etb_enable_perf()
183 if (drvdata->mode == CS_MODE_SYSFS) { in etb_enable_perf()
191 if (drvdata->pid != -1 && drvdata->pid != pid) { in etb_enable_perf()
200 if (drvdata->pid == pid) { in etb_enable_perf()
214 ret = etb_enable_hw(drvdata); in etb_enable_perf()
217 drvdata->pid = pid; in etb_enable_perf()
218 drvdata->mode = CS_MODE_PERF; in etb_enable_perf()
223 spin_unlock_irqrestore(&drvdata->spinlock, flags); in etb_enable_perf()
250 static void __etb_disable_hw(struct etb_drvdata *drvdata) in __etb_disable_hw() argument
253 struct device *dev = &drvdata->csdev->dev; in __etb_disable_hw()
255 CS_UNLOCK(drvdata->base); in __etb_disable_hw()
257 ffcr = readl_relaxed(drvdata->base + ETB_FFCR); in __etb_disable_hw()
260 writel_relaxed(ffcr, drvdata->base + ETB_FFCR); in __etb_disable_hw()
263 writel_relaxed(ffcr, drvdata->base + ETB_FFCR); in __etb_disable_hw()
265 if (coresight_timeout(drvdata->base, ETB_FFCR, ETB_FFCR_BIT, 0)) { in __etb_disable_hw()
271 writel_relaxed(0x0, drvdata->base + ETB_CTL_REG); in __etb_disable_hw()
273 if (coresight_timeout(drvdata->base, ETB_FFSR, ETB_FFSR_BIT, 1)) { in __etb_disable_hw()
278 CS_LOCK(drvdata->base); in __etb_disable_hw()
281 static void etb_dump_hw(struct etb_drvdata *drvdata) in etb_dump_hw() argument
289 struct device *dev = &drvdata->csdev->dev; in etb_dump_hw()
291 CS_UNLOCK(drvdata->base); in etb_dump_hw()
293 read_ptr = readl_relaxed(drvdata->base + ETB_RAM_READ_POINTER); in etb_dump_hw()
294 write_ptr = readl_relaxed(drvdata->base + ETB_RAM_WRITE_POINTER); in etb_dump_hw()
307 if ((readl_relaxed(drvdata->base + ETB_STATUS_REG) in etb_dump_hw()
309 writel_relaxed(0x0, drvdata->base + ETB_RAM_READ_POINTER); in etb_dump_hw()
311 writel_relaxed(write_ptr, drvdata->base + ETB_RAM_READ_POINTER); in etb_dump_hw()
315 depth = drvdata->buffer_depth; in etb_dump_hw()
316 buf_ptr = drvdata->buf; in etb_dump_hw()
318 read_data = readl_relaxed(drvdata->base + in etb_dump_hw()
325 coresight_insert_barrier_packet(drvdata->buf); in etb_dump_hw()
337 writel_relaxed(read_ptr, drvdata->base + ETB_RAM_READ_POINTER); in etb_dump_hw()
339 CS_LOCK(drvdata->base); in etb_dump_hw()
342 static void etb_disable_hw(struct etb_drvdata *drvdata) in etb_disable_hw() argument
344 __etb_disable_hw(drvdata); in etb_disable_hw()
345 etb_dump_hw(drvdata); in etb_disable_hw()
346 coresight_disclaim_device(drvdata->base); in etb_disable_hw()
351 struct etb_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent); in etb_disable() local
354 spin_lock_irqsave(&drvdata->spinlock, flags); in etb_disable()
357 spin_unlock_irqrestore(&drvdata->spinlock, flags); in etb_disable()
362 WARN_ON_ONCE(drvdata->mode == CS_MODE_DISABLED); in etb_disable()
363 etb_disable_hw(drvdata); in etb_disable()
365 drvdata->pid = -1; in etb_disable()
366 drvdata->mode = CS_MODE_DISABLED; in etb_disable()
367 spin_unlock_irqrestore(&drvdata->spinlock, flags); in etb_disable()
436 struct etb_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent); in etb_update_buffer() local
441 capacity = drvdata->buffer_depth * ETB_FRAME_SIZE_WORDS; in etb_update_buffer()
443 spin_lock_irqsave(&drvdata->spinlock, flags); in etb_update_buffer()
449 __etb_disable_hw(drvdata); in etb_update_buffer()
450 CS_UNLOCK(drvdata->base); in etb_update_buffer()
453 read_ptr = readl_relaxed(drvdata->base + ETB_RAM_READ_POINTER); in etb_update_buffer()
454 write_ptr = readl_relaxed(drvdata->base + ETB_RAM_WRITE_POINTER); in etb_update_buffer()
476 status = readl_relaxed(drvdata->base + ETB_STATUS_REG); in etb_update_buffer()
482 to_read = CIRC_CNT(write_ptr, read_ptr, drvdata->buffer_depth); in etb_update_buffer()
505 read_ptr = (write_ptr + drvdata->buffer_depth) - in etb_update_buffer()
508 if (read_ptr > (drvdata->buffer_depth - 1)) in etb_update_buffer()
509 read_ptr -= drvdata->buffer_depth; in etb_update_buffer()
524 writel_relaxed(read_ptr, drvdata->base + ETB_RAM_READ_POINTER); in etb_update_buffer()
532 read_data = readl_relaxed(drvdata->base + in etb_update_buffer()
552 writel_relaxed(0x0, drvdata->base + ETB_RAM_READ_POINTER); in etb_update_buffer()
553 writel_relaxed(0x0, drvdata->base + ETB_RAM_WRITE_POINTER); in etb_update_buffer()
564 __etb_enable_hw(drvdata); in etb_update_buffer()
565 CS_LOCK(drvdata->base); in etb_update_buffer()
567 spin_unlock_irqrestore(&drvdata->spinlock, flags); in etb_update_buffer()
584 static void etb_dump(struct etb_drvdata *drvdata) in etb_dump() argument
588 spin_lock_irqsave(&drvdata->spinlock, flags); in etb_dump()
589 if (drvdata->mode == CS_MODE_SYSFS) { in etb_dump()
590 __etb_disable_hw(drvdata); in etb_dump()
591 etb_dump_hw(drvdata); in etb_dump()
592 __etb_enable_hw(drvdata); in etb_dump()
594 spin_unlock_irqrestore(&drvdata->spinlock, flags); in etb_dump()
596 dev_dbg(&drvdata->csdev->dev, "ETB dumped\n"); in etb_dump()
601 struct etb_drvdata *drvdata = container_of(file->private_data, in etb_open() local
604 if (local_cmpxchg(&drvdata->reading, 0, 1)) in etb_open()
607 dev_dbg(&drvdata->csdev->dev, "%s: successfully opened\n", __func__); in etb_open()
615 struct etb_drvdata *drvdata = container_of(file->private_data, in etb_read() local
617 struct device *dev = &drvdata->csdev->dev; in etb_read()
619 etb_dump(drvdata); in etb_read()
621 depth = drvdata->buffer_depth; in etb_read()
625 if (copy_to_user(data, drvdata->buf + *ppos, len)) { in etb_read()
640 struct etb_drvdata *drvdata = container_of(file->private_data, in etb_release() local
642 local_set(&drvdata->reading, 0); in etb_release()
644 dev_dbg(&drvdata->csdev->dev, "%s: released\n", __func__); in etb_release()
683 struct etb_drvdata *drvdata = dev_get_drvdata(dev->parent); in trigger_cntr_show() local
684 unsigned long val = drvdata->trigger_cntr; in trigger_cntr_show()
695 struct etb_drvdata *drvdata = dev_get_drvdata(dev->parent); in trigger_cntr_store() local
701 drvdata->trigger_cntr = val; in trigger_cntr_store()
732 struct etb_drvdata *drvdata; in etb_probe() local
740 drvdata = devm_kzalloc(dev, sizeof(*drvdata), GFP_KERNEL); in etb_probe()
741 if (!drvdata) in etb_probe()
744 drvdata->atclk = devm_clk_get(&adev->dev, "atclk"); /* optional */ in etb_probe()
745 if (!IS_ERR(drvdata->atclk)) { in etb_probe()
746 ret = clk_prepare_enable(drvdata->atclk); in etb_probe()
750 dev_set_drvdata(dev, drvdata); in etb_probe()
757 drvdata->base = base; in etb_probe()
759 spin_lock_init(&drvdata->spinlock); in etb_probe()
761 drvdata->buffer_depth = etb_get_buffer_depth(drvdata); in etb_probe()
763 if (drvdata->buffer_depth & 0x80000000) in etb_probe()
766 drvdata->buf = devm_kcalloc(dev, in etb_probe()
767 drvdata->buffer_depth, 4, GFP_KERNEL); in etb_probe()
768 if (!drvdata->buf) in etb_probe()
772 drvdata->pid = -1; in etb_probe()
785 drvdata->csdev = coresight_register(&desc); in etb_probe()
786 if (IS_ERR(drvdata->csdev)) in etb_probe()
787 return PTR_ERR(drvdata->csdev); in etb_probe()
789 drvdata->miscdev.name = desc.name; in etb_probe()
790 drvdata->miscdev.minor = MISC_DYNAMIC_MINOR; in etb_probe()
791 drvdata->miscdev.fops = &etb_fops; in etb_probe()
792 ret = misc_register(&drvdata->miscdev); in etb_probe()
800 coresight_unregister(drvdata->csdev); in etb_probe()
806 struct etb_drvdata *drvdata = dev_get_drvdata(&adev->dev); in etb_remove() local
813 misc_deregister(&drvdata->miscdev); in etb_remove()
814 coresight_unregister(drvdata->csdev); in etb_remove()
822 struct etb_drvdata *drvdata = dev_get_drvdata(dev); in etb_runtime_suspend() local
824 if (drvdata && !IS_ERR(drvdata->atclk)) in etb_runtime_suspend()
825 clk_disable_unprepare(drvdata->atclk); in etb_runtime_suspend()
832 struct etb_drvdata *drvdata = dev_get_drvdata(dev); in etb_runtime_resume() local
834 if (drvdata && !IS_ERR(drvdata->atclk)) in etb_runtime_resume()
835 clk_prepare_enable(drvdata->atclk); in etb_runtime_resume()