Lines Matching refs:vclock
22 static void ptp_vclock_hash_add(struct ptp_vclock *vclock)
26 hlist_add_head_rcu(&vclock->vclock_hash_node,
27 &vclock_hash[vclock->clock->index % HASH_SIZE(vclock_hash)]);
32 static void ptp_vclock_hash_del(struct ptp_vclock *vclock)
36 hlist_del_init_rcu(&vclock->vclock_hash_node);
45 struct ptp_vclock *vclock = info_to_vclock(ptp);
51 if (mutex_lock_interruptible(&vclock->lock))
53 timecounter_read(&vclock->tc);
54 vclock->cc.mult = PTP_VCLOCK_CC_MULT + adj;
55 mutex_unlock(&vclock->lock);
62 struct ptp_vclock *vclock = info_to_vclock(ptp);
64 if (mutex_lock_interruptible(&vclock->lock))
66 timecounter_adjtime(&vclock->tc, delta);
67 mutex_unlock(&vclock->lock);
75 struct ptp_vclock *vclock = info_to_vclock(ptp);
78 if (mutex_lock_interruptible(&vclock->lock))
80 ns = timecounter_read(&vclock->tc);
81 mutex_unlock(&vclock->lock);
91 struct ptp_vclock *vclock = info_to_vclock(ptp);
92 struct ptp_clock *pptp = vclock->pclock;
101 if (mutex_lock_interruptible(&vclock->lock))
103 ns = timecounter_cyc2time(&vclock->tc, timespec64_to_ns(&pts));
104 mutex_unlock(&vclock->lock);
114 struct ptp_vclock *vclock = info_to_vclock(ptp);
117 if (mutex_lock_interruptible(&vclock->lock))
119 timecounter_init(&vclock->tc, &vclock->cc, ns);
120 mutex_unlock(&vclock->lock);
128 struct ptp_vclock *vclock = info_to_vclock(ptp);
129 struct ptp_clock *pptp = vclock->pclock;
137 if (mutex_lock_interruptible(&vclock->lock))
139 ns = timecounter_cyc2time(&vclock->tc, ktime_to_ns(xtstamp->device));
140 mutex_unlock(&vclock->lock);
149 struct ptp_vclock *vclock = info_to_vclock(ptp);
152 ptp_vclock_gettime(&vclock->info, &ts);
169 struct ptp_vclock *vclock = cc_to_vclock(cc);
170 struct ptp_clock *ptp = vclock->pclock;
187 struct ptp_vclock *vclock;
189 vclock = kzalloc(sizeof(*vclock), GFP_KERNEL);
190 if (!vclock)
193 vclock->pclock = pclock;
194 vclock->info = ptp_vclock_info;
196 vclock->info.gettimex64 = ptp_vclock_gettimex;
198 vclock->info.gettime64 = ptp_vclock_gettime;
200 vclock->info.getcrosststamp = ptp_vclock_getcrosststamp;
201 vclock->cc = ptp_vclock_cc;
203 snprintf(vclock->info.name, PTP_CLOCK_NAME_LEN, "ptp%d_virt",
206 INIT_HLIST_NODE(&vclock->vclock_hash_node);
208 mutex_init(&vclock->lock);
210 vclock->clock = ptp_clock_register(&vclock->info, &pclock->dev);
211 if (IS_ERR_OR_NULL(vclock->clock)) {
212 kfree(vclock);
216 timecounter_init(&vclock->tc, &vclock->cc, 0);
217 ptp_schedule_worker(vclock->clock, PTP_VCLOCK_REFRESH_INTERVAL);
219 ptp_vclock_hash_add(vclock);
221 return vclock;
224 void ptp_vclock_unregister(struct ptp_vclock *vclock)
226 ptp_vclock_hash_del(vclock);
228 ptp_clock_unregister(vclock->clock);
229 kfree(vclock);
271 struct ptp_vclock *vclock;
279 hlist_for_each_entry_rcu(vclock, &vclock_hash[hash], vclock_hash_node) {
280 if (vclock->clock->index != vclock_index)
283 if (mutex_lock_interruptible(&vclock->lock))
285 vclock_ns = timecounter_cyc2time(&vclock->tc, ns);
286 mutex_unlock(&vclock->lock);