Lines Matching refs:drvdata
61 void cti_write_all_hw_regs(struct cti_drvdata *drvdata) in cti_write_all_hw_regs() argument
63 struct cti_config *config = &drvdata->config; in cti_write_all_hw_regs()
66 CS_UNLOCK(drvdata->base); in cti_write_all_hw_regs()
69 writel_relaxed(0, drvdata->base + CTICONTROL); in cti_write_all_hw_regs()
73 writel_relaxed(config->ctiinen[i], drvdata->base + CTIINEN(i)); in cti_write_all_hw_regs()
75 drvdata->base + CTIOUTEN(i)); in cti_write_all_hw_regs()
79 writel_relaxed(config->ctigate, drvdata->base + CTIGATE); in cti_write_all_hw_regs()
80 writel_relaxed(config->asicctl, drvdata->base + ASICCTL); in cti_write_all_hw_regs()
81 writel_relaxed(config->ctiappset, drvdata->base + CTIAPPSET); in cti_write_all_hw_regs()
84 writel_relaxed(1, drvdata->base + CTICONTROL); in cti_write_all_hw_regs()
86 CS_LOCK(drvdata->base); in cti_write_all_hw_regs()
90 static int cti_enable_hw(struct cti_drvdata *drvdata) in cti_enable_hw() argument
92 struct cti_config *config = &drvdata->config; in cti_enable_hw()
96 spin_lock_irqsave(&drvdata->spinlock, flags); in cti_enable_hw()
103 rc = coresight_claim_device(drvdata->csdev); in cti_enable_hw()
107 cti_write_all_hw_regs(drvdata); in cti_enable_hw()
110 atomic_inc(&drvdata->config.enable_req_count); in cti_enable_hw()
111 spin_unlock_irqrestore(&drvdata->spinlock, flags); in cti_enable_hw()
115 atomic_inc(&drvdata->config.enable_req_count); in cti_enable_hw()
119 spin_unlock_irqrestore(&drvdata->spinlock, flags); in cti_enable_hw()
124 static void cti_cpuhp_enable_hw(struct cti_drvdata *drvdata) in cti_cpuhp_enable_hw() argument
126 struct cti_config *config = &drvdata->config; in cti_cpuhp_enable_hw()
128 spin_lock(&drvdata->spinlock); in cti_cpuhp_enable_hw()
132 if (!atomic_read(&drvdata->config.enable_req_count)) in cti_cpuhp_enable_hw()
136 if (coresight_claim_device(drvdata->csdev)) in cti_cpuhp_enable_hw()
139 cti_write_all_hw_regs(drvdata); in cti_cpuhp_enable_hw()
141 spin_unlock(&drvdata->spinlock); in cti_cpuhp_enable_hw()
146 spin_unlock(&drvdata->spinlock); in cti_cpuhp_enable_hw()
150 static int cti_disable_hw(struct cti_drvdata *drvdata) in cti_disable_hw() argument
152 struct cti_config *config = &drvdata->config; in cti_disable_hw()
153 struct coresight_device *csdev = drvdata->csdev; in cti_disable_hw()
156 spin_lock(&drvdata->spinlock); in cti_disable_hw()
159 if (!atomic_read(&drvdata->config.enable_req_count)) { in cti_disable_hw()
165 if (atomic_dec_return(&drvdata->config.enable_req_count) > 0) in cti_disable_hw()
172 CS_UNLOCK(drvdata->base); in cti_disable_hw()
175 writel_relaxed(0, drvdata->base + CTICONTROL); in cti_disable_hw()
179 CS_LOCK(drvdata->base); in cti_disable_hw()
180 spin_unlock(&drvdata->spinlock); in cti_disable_hw()
185 spin_unlock(&drvdata->spinlock); in cti_disable_hw()
189 void cti_write_single_reg(struct cti_drvdata *drvdata, int offset, u32 value) in cti_write_single_reg() argument
191 CS_UNLOCK(drvdata->base); in cti_write_single_reg()
192 writel_relaxed(value, drvdata->base + offset); in cti_write_single_reg()
193 CS_LOCK(drvdata->base); in cti_write_single_reg()
198 struct cti_drvdata *drvdata = dev_get_drvdata(dev->parent); in cti_write_intack() local
199 struct cti_config *config = &drvdata->config; in cti_write_intack()
201 spin_lock(&drvdata->spinlock); in cti_write_intack()
204 cti_write_single_reg(drvdata, CTIINTACK, ackval); in cti_write_intack()
205 spin_unlock(&drvdata->spinlock); in cti_write_intack()
218 struct cti_drvdata *drvdata) in cti_set_default_config() argument
220 struct cti_config *config = &drvdata->config; in cti_set_default_config()
223 devid = readl_relaxed(drvdata->base + CORESIGHT_DEVID); in cti_set_default_config()
249 int cti_add_connection_entry(struct device *dev, struct cti_drvdata *drvdata, in cti_add_connection_entry() argument
254 struct cti_device *cti_dev = &drvdata->ctidev; in cti_add_connection_entry()
273 drvdata->config.trig_in_use |= tc->con_in->used_mask; in cti_add_connection_entry()
274 drvdata->config.trig_out_use |= tc->con_out->used_mask; in cti_add_connection_entry()
313 int cti_add_default_connection(struct device *dev, struct cti_drvdata *drvdata) in cti_add_default_connection() argument
316 int n_trigs = drvdata->config.nr_trig_max; in cti_add_default_connection()
330 ret = cti_add_connection_entry(dev, drvdata, tc, NULL, "default"); in cti_add_default_connection()
340 struct cti_drvdata *drvdata = dev_get_drvdata(dev->parent); in cti_channel_trig_op() local
341 struct cti_config *config = &drvdata->config; in cti_channel_trig_op()
372 spin_lock(&drvdata->spinlock); in cti_channel_trig_op()
390 cti_write_single_reg(drvdata, reg_offset, reg_value); in cti_channel_trig_op()
391 spin_unlock(&drvdata->spinlock); in cti_channel_trig_op()
398 struct cti_drvdata *drvdata = dev_get_drvdata(dev->parent); in cti_channel_gate_op() local
399 struct cti_config *config = &drvdata->config; in cti_channel_gate_op()
409 spin_lock(&drvdata->spinlock); in cti_channel_gate_op()
427 cti_write_single_reg(drvdata, CTIGATE, reg_value); in cti_channel_gate_op()
429 spin_unlock(&drvdata->spinlock); in cti_channel_gate_op()
436 struct cti_drvdata *drvdata = dev_get_drvdata(dev->parent); in cti_channel_setop() local
437 struct cti_config *config = &drvdata->config; in cti_channel_setop()
448 spin_lock(&drvdata->spinlock); in cti_channel_setop()
475 cti_write_single_reg(drvdata, reg_offset, reg_value); in cti_channel_setop()
476 spin_unlock(&drvdata->spinlock); in cti_channel_setop()
481 static bool cti_add_sysfs_link(struct cti_drvdata *drvdata, in cti_add_sysfs_link() argument
487 link_info.orig = drvdata->csdev; in cti_add_sysfs_link()
490 link_info.target_name = dev_name(&drvdata->csdev->dev); in cti_add_sysfs_link()
494 dev_warn(&drvdata->csdev->dev, in cti_add_sysfs_link()
500 static void cti_remove_sysfs_link(struct cti_drvdata *drvdata, in cti_remove_sysfs_link() argument
505 link_info.orig = drvdata->csdev; in cti_remove_sysfs_link()
508 link_info.target_name = dev_name(&drvdata->csdev->dev); in cti_remove_sysfs_link()
522 struct cti_drvdata *drvdata = container_of(ctidev, struct cti_drvdata, in cti_match_fixup_csdev() local
532 if (cti_add_sysfs_link(drvdata, tc)) in cti_match_fixup_csdev()
622 static void cti_update_conn_xrefs(struct cti_drvdata *drvdata) in cti_update_conn_xrefs() argument
625 struct cti_device *ctidev = &drvdata->ctidev; in cti_update_conn_xrefs()
630 if (cti_add_sysfs_link(drvdata, tc)) in cti_update_conn_xrefs()
633 drvdata->csdev); in cti_update_conn_xrefs()
641 static void cti_remove_conn_xrefs(struct cti_drvdata *drvdata) in cti_remove_conn_xrefs() argument
644 struct cti_device *ctidev = &drvdata->ctidev; in cti_remove_conn_xrefs()
650 cti_remove_sysfs_link(drvdata, tc); in cti_remove_conn_xrefs()
660 struct cti_drvdata *drvdata; in cti_cpu_pm_notify() local
668 drvdata = cti_cpu_drvdata[cpu]; in cti_cpu_pm_notify()
669 csdev = drvdata->csdev; in cti_cpu_pm_notify()
671 if (WARN_ON_ONCE(drvdata->ctidev.cpu != cpu)) in cti_cpu_pm_notify()
674 spin_lock(&drvdata->spinlock); in cti_cpu_pm_notify()
679 drvdata->config.hw_powered = false; in cti_cpu_pm_notify()
680 if (drvdata->config.hw_enabled) in cti_cpu_pm_notify()
685 drvdata->config.hw_powered = true; in cti_cpu_pm_notify()
686 if (drvdata->config.hw_enabled) { in cti_cpu_pm_notify()
688 drvdata->config.hw_enabled = false; in cti_cpu_pm_notify()
694 drvdata->config.hw_powered = true; in cti_cpu_pm_notify()
695 drvdata->config.hw_enabled = false; in cti_cpu_pm_notify()
698 if (atomic_read(&drvdata->config.enable_req_count)) { in cti_cpu_pm_notify()
703 drvdata->config.hw_enabled = true; in cti_cpu_pm_notify()
704 cti_write_all_hw_regs(drvdata); in cti_cpu_pm_notify()
714 spin_unlock(&drvdata->spinlock); in cti_cpu_pm_notify()
725 struct cti_drvdata *drvdata = cti_cpu_drvdata[cpu]; in cti_starting_cpu() local
727 if (!drvdata) in cti_starting_cpu()
730 cti_cpuhp_enable_hw(drvdata); in cti_starting_cpu()
736 struct cti_drvdata *drvdata = cti_cpu_drvdata[cpu]; in cti_dying_cpu() local
738 if (!drvdata) in cti_dying_cpu()
741 spin_lock(&drvdata->spinlock); in cti_dying_cpu()
742 drvdata->config.hw_powered = false; in cti_dying_cpu()
743 if (drvdata->config.hw_enabled) in cti_dying_cpu()
744 coresight_disclaim_device(drvdata->csdev); in cti_dying_cpu()
745 spin_unlock(&drvdata->spinlock); in cti_dying_cpu()
749 static int cti_pm_setup(struct cti_drvdata *drvdata) in cti_pm_setup() argument
753 if (drvdata->ctidev.cpu == -1) in cti_pm_setup()
778 cti_cpu_drvdata[drvdata->ctidev.cpu] = drvdata; in cti_pm_setup()
784 static void cti_pm_release(struct cti_drvdata *drvdata) in cti_pm_release() argument
786 if (drvdata->ctidev.cpu == -1) in cti_pm_release()
789 cti_cpu_drvdata[drvdata->ctidev.cpu] = NULL; in cti_pm_release()
799 struct cti_drvdata *drvdata = csdev_to_cti_drvdata(csdev); in cti_enable() local
801 return cti_enable_hw(drvdata); in cti_enable()
806 struct cti_drvdata *drvdata = csdev_to_cti_drvdata(csdev); in cti_disable() local
808 return cti_disable_hw(drvdata); in cti_disable()
826 struct cti_drvdata *drvdata = dev_get_drvdata(dev->parent); in cti_device_release() local
830 cti_pm_release(drvdata); in cti_device_release()
834 if (ect_item == drvdata) { in cti_device_release()
841 if (drvdata->csdev_release) in cti_device_release()
842 drvdata->csdev_release(dev); in cti_device_release()
846 struct cti_drvdata *drvdata = dev_get_drvdata(&adev->dev); in cti_remove() local
849 cti_remove_conn_xrefs(drvdata); in cti_remove()
852 coresight_unregister(drvdata->csdev); in cti_remove()
860 struct cti_drvdata *drvdata = NULL; in cti_probe() local
866 drvdata = devm_kzalloc(dev, sizeof(*drvdata), GFP_KERNEL); in cti_probe()
867 if (!drvdata) in cti_probe()
875 drvdata->base = base; in cti_probe()
878 dev_set_drvdata(dev, drvdata); in cti_probe()
881 drvdata->ctidev.cpu = -1; in cti_probe()
882 drvdata->ctidev.nr_trig_con = 0; in cti_probe()
883 drvdata->ctidev.ctm_id = 0; in cti_probe()
884 INIT_LIST_HEAD(&drvdata->ctidev.trig_cons); in cti_probe()
886 spin_lock_init(&drvdata->spinlock); in cti_probe()
889 cti_set_default_config(dev, drvdata); in cti_probe()
898 drvdata->config.hw_powered = true; in cti_probe()
901 if (drvdata->ctidev.cpu >= 0) in cti_probe()
903 drvdata->ctidev.cpu); in cti_probe()
910 ret = cti_pm_setup(drvdata); in cti_probe()
915 ret = cti_create_cons_sysfs(dev, drvdata); in cti_probe()
927 cti_desc.groups = drvdata->ctidev.con_groups; in cti_probe()
929 drvdata->csdev = coresight_register(&cti_desc); in cti_probe()
930 if (IS_ERR(drvdata->csdev)) { in cti_probe()
931 ret = PTR_ERR(drvdata->csdev); in cti_probe()
937 list_add(&drvdata->node, &ect_net); in cti_probe()
939 cti_update_conn_xrefs(drvdata); in cti_probe()
943 drvdata->csdev_release = drvdata->csdev->dev.release; in cti_probe()
944 drvdata->csdev->dev.release = cti_device_release; in cti_probe()
948 dev_info(&drvdata->csdev->dev, "CTI initialized\n"); in cti_probe()
952 cti_pm_release(drvdata); in cti_probe()