Lines Matching +full:reg +full:- +full:names
1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (c) 2015-2016, The Linux Foundation. All rights reserved.
8 * (C) 2014-2015 Pratik Patel <pratikp@codeaurora.org>
12 * (C) 2015-2016 Mathieu Poirier <mathieu.poirier@linaro.org>
16 * (C) 2015-2016 Chunyan Zhang <zhang.chunyan@linaro.org>
24 #include <linux/coresight-stm.h>
33 #include "coresight-priv.h"
85 #define stm_channel_addr(drvdata, ch) (drvdata->chs.base + \
100 * struct channel_space - central management entity for extended ports
114 * struct stm_drvdata - specifics associated to an STM component
151 CS_UNLOCK(drvdata->base); in stm_hwevent_enable_hw()
153 writel_relaxed(drvdata->stmhebsr, drvdata->base + STMHEBSR); in stm_hwevent_enable_hw()
154 writel_relaxed(drvdata->stmheter, drvdata->base + STMHETER); in stm_hwevent_enable_hw()
155 writel_relaxed(drvdata->stmheer, drvdata->base + STMHEER); in stm_hwevent_enable_hw()
158 drvdata->base + STMHEMCR); in stm_hwevent_enable_hw()
160 CS_LOCK(drvdata->base); in stm_hwevent_enable_hw()
165 CS_UNLOCK(drvdata->base); in stm_port_enable_hw()
168 drvdata->base + STMSPTRIGCSR); in stm_port_enable_hw()
169 writel_relaxed(drvdata->stmspscr, drvdata->base + STMSPSCR); in stm_port_enable_hw()
170 writel_relaxed(drvdata->stmsper, drvdata->base + STMSPER); in stm_port_enable_hw()
172 CS_LOCK(drvdata->base); in stm_port_enable_hw()
177 if (drvdata->stmheer) in stm_enable_hw()
182 CS_UNLOCK(drvdata->base); in stm_enable_hw()
185 writel_relaxed(0xFFF, drvdata->base + STMSYNCR); in stm_enable_hw()
186 writel_relaxed((drvdata->traceid << 16 | /* trace id */ in stm_enable_hw()
189 drvdata->base + STMTCSR); in stm_enable_hw()
191 CS_LOCK(drvdata->base); in stm_enable_hw()
198 struct stm_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent); in stm_enable()
201 return -EINVAL; in stm_enable()
203 val = local_cmpxchg(&drvdata->mode, CS_MODE_DISABLED, mode); in stm_enable()
207 return -EBUSY; in stm_enable()
209 pm_runtime_get_sync(csdev->dev.parent); in stm_enable()
211 spin_lock(&drvdata->spinlock); in stm_enable()
213 spin_unlock(&drvdata->spinlock); in stm_enable()
215 dev_dbg(&csdev->dev, "STM tracing enabled\n"); in stm_enable()
221 CS_UNLOCK(drvdata->base); in stm_hwevent_disable_hw()
223 writel_relaxed(0x0, drvdata->base + STMHEMCR); in stm_hwevent_disable_hw()
224 writel_relaxed(0x0, drvdata->base + STMHEER); in stm_hwevent_disable_hw()
225 writel_relaxed(0x0, drvdata->base + STMHETER); in stm_hwevent_disable_hw()
227 CS_LOCK(drvdata->base); in stm_hwevent_disable_hw()
232 CS_UNLOCK(drvdata->base); in stm_port_disable_hw()
234 writel_relaxed(0x0, drvdata->base + STMSPER); in stm_port_disable_hw()
235 writel_relaxed(0x0, drvdata->base + STMSPTRIGCSR); in stm_port_disable_hw()
237 CS_LOCK(drvdata->base); in stm_port_disable_hw()
244 CS_UNLOCK(drvdata->base); in stm_disable_hw()
246 val = readl_relaxed(drvdata->base + STMTCSR); in stm_disable_hw()
248 writel_relaxed(val, drvdata->base + STMTCSR); in stm_disable_hw()
250 CS_LOCK(drvdata->base); in stm_disable_hw()
253 if (drvdata->stmheer) in stm_disable_hw()
260 struct stm_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent); in stm_disable()
267 if (local_read(&drvdata->mode) == CS_MODE_SYSFS) { in stm_disable()
268 spin_lock(&drvdata->spinlock); in stm_disable()
270 spin_unlock(&drvdata->spinlock); in stm_disable()
273 coresight_timeout(drvdata->base, STMTCSR, STMTCSR_BUSY_BIT, 0); in stm_disable()
275 pm_runtime_put(csdev->dev.parent); in stm_disable()
277 local_set(&drvdata->mode, CS_MODE_DISABLED); in stm_disable()
278 dev_dbg(&csdev->dev, "STM tracing disabled\n"); in stm_disable()
284 struct stm_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent); in stm_trace_id()
286 return drvdata->traceid; in stm_trace_id()
301 return ((unsigned long)addr & (write_bytes - 1)); in stm_addr_unaligned()
340 if (!drvdata || !drvdata->csdev) in stm_generic_link()
341 return -EINVAL; in stm_generic_link()
343 return coresight_enable(drvdata->csdev); in stm_generic_link()
351 if (!drvdata || !drvdata->csdev) in stm_generic_unlink()
354 coresight_disable(drvdata->csdev); in stm_generic_unlink()
365 addr = drvdata->chs.phys + channel * BYTES_PER_CHANNEL; in stm_mmio_addr()
382 if (!(drvdata && local_read(&drvdata->mode))) in stm_generic_set_options()
383 return -EINVAL; in stm_generic_set_options()
385 if (channel >= drvdata->numsp) in stm_generic_set_options()
386 return -EINVAL; in stm_generic_set_options()
390 set_bit(channel, drvdata->chs.guaranteed); in stm_generic_set_options()
394 clear_bit(channel, drvdata->chs.guaranteed); in stm_generic_set_options()
398 return -EINVAL; in stm_generic_set_options()
417 if (!(drvdata && local_read(&drvdata->mode))) in stm_generic_packet()
418 return -EACCES; in stm_generic_packet()
420 if (channel >= drvdata->numsp) in stm_generic_packet()
421 return -EINVAL; in stm_generic_packet()
427 stm_flags |= test_bit(channel, drvdata->chs.guaranteed) ? in stm_generic_packet()
430 if (size > drvdata->write_bytes) in stm_generic_packet()
431 size = drvdata->write_bytes; in stm_generic_packet()
444 stm_send(ch_addr, payload, 1, drvdata->write_bytes); in stm_generic_packet()
452 drvdata->write_bytes); in stm_generic_packet()
456 return -ENOTSUPP; in stm_generic_packet()
465 struct stm_drvdata *drvdata = dev_get_drvdata(dev->parent); in hwevent_enable_show()
466 unsigned long val = drvdata->stmheer; in hwevent_enable_show()
475 struct stm_drvdata *drvdata = dev_get_drvdata(dev->parent); in hwevent_enable_store()
481 return -EINVAL; in hwevent_enable_store()
483 drvdata->stmheer = val; in hwevent_enable_store()
485 drvdata->stmheter = val; in hwevent_enable_store()
494 struct stm_drvdata *drvdata = dev_get_drvdata(dev->parent); in hwevent_select_show()
495 unsigned long val = drvdata->stmhebsr; in hwevent_select_show()
504 struct stm_drvdata *drvdata = dev_get_drvdata(dev->parent); in hwevent_select_store()
510 return -EINVAL; in hwevent_select_store()
512 drvdata->stmhebsr = val; in hwevent_select_store()
521 struct stm_drvdata *drvdata = dev_get_drvdata(dev->parent); in port_select_show()
524 if (!local_read(&drvdata->mode)) { in port_select_show()
525 val = drvdata->stmspscr; in port_select_show()
527 spin_lock(&drvdata->spinlock); in port_select_show()
528 val = readl_relaxed(drvdata->base + STMSPSCR); in port_select_show()
529 spin_unlock(&drvdata->spinlock); in port_select_show()
539 struct stm_drvdata *drvdata = dev_get_drvdata(dev->parent); in port_select_store()
547 spin_lock(&drvdata->spinlock); in port_select_store()
548 drvdata->stmspscr = val; in port_select_store()
550 if (local_read(&drvdata->mode)) { in port_select_store()
551 CS_UNLOCK(drvdata->base); in port_select_store()
553 stmsper = readl_relaxed(drvdata->base + STMSPER); in port_select_store()
554 writel_relaxed(0x0, drvdata->base + STMSPER); in port_select_store()
555 writel_relaxed(drvdata->stmspscr, drvdata->base + STMSPSCR); in port_select_store()
556 writel_relaxed(stmsper, drvdata->base + STMSPER); in port_select_store()
557 CS_LOCK(drvdata->base); in port_select_store()
559 spin_unlock(&drvdata->spinlock); in port_select_store()
568 struct stm_drvdata *drvdata = dev_get_drvdata(dev->parent); in port_enable_show()
571 if (!local_read(&drvdata->mode)) { in port_enable_show()
572 val = drvdata->stmsper; in port_enable_show()
574 spin_lock(&drvdata->spinlock); in port_enable_show()
575 val = readl_relaxed(drvdata->base + STMSPER); in port_enable_show()
576 spin_unlock(&drvdata->spinlock); in port_enable_show()
586 struct stm_drvdata *drvdata = dev_get_drvdata(dev->parent); in port_enable_store()
594 spin_lock(&drvdata->spinlock); in port_enable_store()
595 drvdata->stmsper = val; in port_enable_store()
597 if (local_read(&drvdata->mode)) { in port_enable_store()
598 CS_UNLOCK(drvdata->base); in port_enable_store()
599 writel_relaxed(drvdata->stmsper, drvdata->base + STMSPER); in port_enable_store()
600 CS_LOCK(drvdata->base); in port_enable_store()
602 spin_unlock(&drvdata->spinlock); in port_enable_store()
612 struct stm_drvdata *drvdata = dev_get_drvdata(dev->parent); in traceid_show()
614 val = drvdata->traceid; in traceid_show()
624 struct stm_drvdata *drvdata = dev_get_drvdata(dev->parent); in traceid_store()
631 drvdata->traceid = val & 0x7f; in traceid_store()
697 struct device_node *np = dev->of_node; in of_stm_get_stimulus_area()
699 while (!of_property_read_string_index(np, "reg-names", index, &name)) { in of_stm_get_stimulus_area()
700 if (strcmp("stm-stimulus-base", name)) { in of_stm_get_stimulus_area()
711 return -EINVAL; in of_stm_get_stimulus_area()
719 return -ENOENT; in of_stm_get_stimulus_area()
743 rc = -ENOENT; in acpi_stm_get_stimulus_area()
745 if (resource_type(rent->res) != IORESOURCE_MEM) in acpi_stm_get_stimulus_area()
748 *res = *rent->res; in acpi_stm_get_stimulus_area()
763 return -ENOENT; in acpi_stm_get_stimulus_area()
775 return -ENOENT; in stm_get_stimulus_area()
785 stmspfeat2r = readl_relaxed(drvdata->base + STMSPFEAT2R); in stm_fundamental_data_size()
789 * 0 - 32-bit data in stm_fundamental_data_size()
790 * 1 - 64-bit data in stm_fundamental_data_size()
799 numsp = readl_relaxed(drvdata->base + CORESIGHT_DEVID); in stm_num_stimulus_port()
813 drvdata->stmspscr = 0x0; in stm_init_default_data()
819 drvdata->stmsper = ~0x0; in stm_init_default_data()
827 drvdata->traceid = 0x1; in stm_init_default_data()
830 bitmap_clear(drvdata->chs.guaranteed, 0, drvdata->numsp); in stm_init_default_data()
836 drvdata->stm.name = name; in stm_init_generic_data()
842 drvdata->stm.sw_start = 1; in stm_init_generic_data()
843 drvdata->stm.sw_end = 1; in stm_init_generic_data()
844 drvdata->stm.hw_override = true; in stm_init_generic_data()
845 drvdata->stm.sw_nchannels = drvdata->numsp; in stm_init_generic_data()
846 drvdata->stm.sw_mmiosz = BYTES_PER_CHANNEL; in stm_init_generic_data()
847 drvdata->stm.packet = stm_generic_packet; in stm_init_generic_data()
848 drvdata->stm.mmio_addr = stm_mmio_addr; in stm_init_generic_data()
849 drvdata->stm.link = stm_generic_link; in stm_init_generic_data()
850 drvdata->stm.unlink = stm_generic_unlink; in stm_init_generic_data()
851 drvdata->stm.set_options = stm_generic_set_options; in stm_init_generic_data()
859 struct device *dev = &adev->dev; in stm_probe()
862 struct resource *res = &adev->res; in stm_probe()
869 return -ENOMEM; in stm_probe()
873 return -ENOMEM; in stm_probe()
875 drvdata->atclk = devm_clk_get(&adev->dev, "atclk"); /* optional */ in stm_probe()
876 if (!IS_ERR(drvdata->atclk)) { in stm_probe()
877 ret = clk_prepare_enable(drvdata->atclk); in stm_probe()
886 drvdata->base = base; in stm_probe()
891 drvdata->chs.phys = ch_res.start; in stm_probe()
896 drvdata->chs.base = base; in stm_probe()
898 drvdata->write_bytes = stm_fundamental_data_size(drvdata); in stm_probe()
901 drvdata->numsp = boot_nr_channel; in stm_probe()
903 drvdata->numsp = stm_num_stimulus_port(drvdata); in stm_probe()
905 bitmap_size = BITS_TO_LONGS(drvdata->numsp) * sizeof(long); in stm_probe()
909 return -ENOMEM; in stm_probe()
910 drvdata->chs.guaranteed = guaranteed; in stm_probe()
912 spin_lock_init(&drvdata->spinlock); in stm_probe()
917 if (stm_register_device(dev, &drvdata->stm, THIS_MODULE)) { in stm_probe()
921 return -EPROBE_DEFER; in stm_probe()
929 adev->dev.platform_data = pdata; in stm_probe()
937 drvdata->csdev = coresight_register(&desc); in stm_probe()
938 if (IS_ERR(drvdata->csdev)) { in stm_probe()
939 ret = PTR_ERR(drvdata->csdev); in stm_probe()
943 pm_runtime_put(&adev->dev); in stm_probe()
945 dev_info(&drvdata->csdev->dev, "%s initialized\n", in stm_probe()
950 stm_unregister_device(&drvdata->stm); in stm_probe()
956 struct stm_drvdata *drvdata = dev_get_drvdata(&adev->dev); in stm_remove()
958 coresight_unregister(drvdata->csdev); in stm_remove()
960 stm_unregister_device(&drvdata->stm); in stm_remove()
970 if (drvdata && !IS_ERR(drvdata->atclk)) in stm_runtime_suspend()
971 clk_disable_unprepare(drvdata->atclk); in stm_runtime_suspend()
980 if (drvdata && !IS_ERR(drvdata->atclk)) in stm_runtime_resume()
981 clk_prepare_enable(drvdata->atclk); in stm_runtime_resume()
1001 .name = "coresight-stm",