Lines Matching defs:hellcreek
14 #include "hellcreek.h"
18 u16 hellcreek_ptp_read(struct hellcreek *hellcreek, unsigned int offset)
20 return readw(hellcreek->ptp_base + offset);
23 void hellcreek_ptp_write(struct hellcreek *hellcreek, u16 data,
26 writew(data, hellcreek->ptp_base + offset);
30 static u64 hellcreek_ptp_clock_read(struct hellcreek *hellcreek)
35 hellcreek_ptp_write(hellcreek, PR_COMMAND_C_SS, PR_COMMAND_C);
44 nsh = hellcreek_ptp_read(hellcreek, PR_SS_SYNC_DATA_C);
45 nsh = hellcreek_ptp_read(hellcreek, PR_SS_SYNC_DATA_C);
46 nsh = hellcreek_ptp_read(hellcreek, PR_SS_SYNC_DATA_C);
47 nsh = hellcreek_ptp_read(hellcreek, PR_SS_SYNC_DATA_C);
48 nsl = hellcreek_ptp_read(hellcreek, PR_SS_SYNC_DATA_C);
53 static u64 __hellcreek_ptp_gettime(struct hellcreek *hellcreek)
57 ns = hellcreek_ptp_clock_read(hellcreek);
58 if (ns < hellcreek->last_ts)
59 hellcreek->seconds++;
60 hellcreek->last_ts = ns;
61 ns += hellcreek->seconds * NSEC_PER_SEC;
71 u64 hellcreek_ptp_gettime_seconds(struct hellcreek *hellcreek, u64 ns)
75 __hellcreek_ptp_gettime(hellcreek);
76 if (hellcreek->last_ts > ns)
77 s = hellcreek->seconds * NSEC_PER_SEC;
79 s = (hellcreek->seconds - 1) * NSEC_PER_SEC;
87 struct hellcreek *hellcreek = ptp_to_hellcreek(ptp);
90 mutex_lock(&hellcreek->ptp_lock);
91 ns = __hellcreek_ptp_gettime(hellcreek);
92 mutex_unlock(&hellcreek->ptp_lock);
102 struct hellcreek *hellcreek = ptp_to_hellcreek(ptp);
109 mutex_lock(&hellcreek->ptp_lock);
112 hellcreek->seconds = ts->tv_sec;
113 hellcreek->last_ts = ts->tv_nsec;
116 hellcreek_ptp_write(hellcreek, 0x00, PR_CLOCK_WRITE_C);
117 hellcreek_ptp_write(hellcreek, 0x00, PR_CLOCK_WRITE_C);
118 hellcreek_ptp_write(hellcreek, secl, PR_CLOCK_WRITE_C);
119 hellcreek_ptp_write(hellcreek, nsh, PR_CLOCK_WRITE_C);
120 hellcreek_ptp_write(hellcreek, nsl, PR_CLOCK_WRITE_C);
122 mutex_unlock(&hellcreek->ptp_lock);
129 struct hellcreek *hellcreek = ptp_to_hellcreek(ptp);
160 mutex_lock(&hellcreek->ptp_lock);
163 hellcreek_ptp_write(hellcreek, negative, PR_CLOCK_DRIFT_C);
164 hellcreek_ptp_write(hellcreek, 0x00, PR_CLOCK_DRIFT_C);
165 hellcreek_ptp_write(hellcreek, 0x00, PR_CLOCK_DRIFT_C);
166 hellcreek_ptp_write(hellcreek, addendh, PR_CLOCK_DRIFT_C);
167 hellcreek_ptp_write(hellcreek, addendl, PR_CLOCK_DRIFT_C);
169 mutex_unlock(&hellcreek->ptp_lock);
176 struct hellcreek *hellcreek = ptp_to_hellcreek(ptp);
207 mutex_lock(&hellcreek->ptp_lock);
210 hellcreek_ptp_write(hellcreek, negative, PR_CLOCK_OFFSET_C);
211 hellcreek_ptp_write(hellcreek, MAX_NS_PER_STEP, PR_CLOCK_OFFSET_C);
212 hellcreek_ptp_write(hellcreek, MIN_CLK_CYCLES_BETWEEN_STEPS,
214 hellcreek_ptp_write(hellcreek, countl, PR_CLOCK_OFFSET_C);
215 hellcreek_ptp_write(hellcreek, counth, PR_CLOCK_OFFSET_C);
217 mutex_unlock(&hellcreek->ptp_lock);
231 struct hellcreek *hellcreek;
233 hellcreek = dw_overflow_to_hellcreek(dw);
235 mutex_lock(&hellcreek->ptp_lock);
236 __hellcreek_ptp_gettime(hellcreek);
237 mutex_unlock(&hellcreek->ptp_lock);
239 schedule_delayed_work(&hellcreek->overflow_work,
243 static enum led_brightness hellcreek_get_brightness(struct hellcreek *hellcreek,
246 return (hellcreek->status_out & led) ? 1 : 0;
249 static void hellcreek_set_brightness(struct hellcreek *hellcreek, int led,
252 mutex_lock(&hellcreek->ptp_lock);
255 hellcreek->status_out |= led;
257 hellcreek->status_out &= ~led;
259 hellcreek_ptp_write(hellcreek, hellcreek->status_out, STATUS_OUT);
261 mutex_unlock(&hellcreek->ptp_lock);
267 struct hellcreek *hellcreek = led_to_hellcreek(ldev, led_sync_good);
269 hellcreek_set_brightness(hellcreek, STATUS_OUT_SYNC_GOOD, b);
274 struct hellcreek *hellcreek = led_to_hellcreek(ldev, led_sync_good);
276 return hellcreek_get_brightness(hellcreek, STATUS_OUT_SYNC_GOOD);
282 struct hellcreek *hellcreek = led_to_hellcreek(ldev, led_is_gm);
284 hellcreek_set_brightness(hellcreek, STATUS_OUT_IS_GM, b);
289 struct hellcreek *hellcreek = led_to_hellcreek(ldev, led_is_gm);
291 return hellcreek_get_brightness(hellcreek, STATUS_OUT_IS_GM);
298 static int hellcreek_led_setup(struct hellcreek *hellcreek)
305 of_node_get(hellcreek->dev->of_node);
306 leds = of_find_node_by_name(hellcreek->dev->of_node, "leds");
308 dev_err(hellcreek->dev, "No LEDs specified in device tree!\n");
312 hellcreek->status_out = 0;
316 dev_err(hellcreek->dev, "First LED not specified!\n");
321 hellcreek->led_sync_good.name = ret ? "sync_good" : label;
326 hellcreek->led_sync_good.brightness = 1;
329 hellcreek->led_sync_good.brightness =
330 hellcreek_get_brightness(hellcreek, STATUS_OUT_SYNC_GOOD);
333 hellcreek->led_sync_good.brightness = 0;
336 hellcreek->led_sync_good.max_brightness = 1;
337 hellcreek->led_sync_good.brightness_set = hellcreek_led_sync_good_set;
338 hellcreek->led_sync_good.brightness_get = hellcreek_led_sync_good_get;
342 dev_err(hellcreek->dev, "Second LED not specified!\n");
348 hellcreek->led_is_gm.name = ret ? "is_gm" : label;
353 hellcreek->led_is_gm.brightness = 1;
356 hellcreek->led_is_gm.brightness =
357 hellcreek_get_brightness(hellcreek, STATUS_OUT_IS_GM);
360 hellcreek->led_is_gm.brightness = 0;
363 hellcreek->led_is_gm.max_brightness = 1;
364 hellcreek->led_is_gm.brightness_set = hellcreek_led_is_gm_set;
365 hellcreek->led_is_gm.brightness_get = hellcreek_led_is_gm_get;
368 if (hellcreek->led_sync_good.brightness == 1)
369 hellcreek_set_brightness(hellcreek, STATUS_OUT_SYNC_GOOD, 1);
370 if (hellcreek->led_is_gm.brightness == 1)
371 hellcreek_set_brightness(hellcreek, STATUS_OUT_IS_GM, 1);
374 led_classdev_register(hellcreek->dev, &hellcreek->led_sync_good);
375 led_classdev_register(hellcreek->dev, &hellcreek->led_is_gm);
385 int hellcreek_ptp_setup(struct hellcreek *hellcreek)
391 INIT_DELAYED_WORK(&hellcreek->overflow_work,
395 hellcreek->ptp_clock_info.owner = THIS_MODULE;
396 snprintf(hellcreek->ptp_clock_info.name,
397 sizeof(hellcreek->ptp_clock_info.name),
398 dev_name(hellcreek->dev));
404 hellcreek->ptp_clock_info.max_adj = 62500000;
405 hellcreek->ptp_clock_info.n_alarm = 0;
406 hellcreek->ptp_clock_info.n_pins = 0;
407 hellcreek->ptp_clock_info.n_ext_ts = 0;
408 hellcreek->ptp_clock_info.n_per_out = 0;
409 hellcreek->ptp_clock_info.pps = 0;
410 hellcreek->ptp_clock_info.adjfine = hellcreek_ptp_adjfine;
411 hellcreek->ptp_clock_info.adjtime = hellcreek_ptp_adjtime;
412 hellcreek->ptp_clock_info.gettime64 = hellcreek_ptp_gettime;
413 hellcreek->ptp_clock_info.settime64 = hellcreek_ptp_settime;
414 hellcreek->ptp_clock_info.enable = hellcreek_ptp_enable;
415 hellcreek->ptp_clock_info.do_aux_work = hellcreek_hwtstamp_work;
417 hellcreek->ptp_clock = ptp_clock_register(&hellcreek->ptp_clock_info,
418 hellcreek->dev);
419 if (IS_ERR(hellcreek->ptp_clock))
420 return PTR_ERR(hellcreek->ptp_clock);
425 status = hellcreek_ptp_read(hellcreek, PR_CLOCK_STATUS_C);
427 hellcreek_ptp_write(hellcreek,
432 hellcreek_ptp_write(hellcreek, status | PR_CLOCK_STATUS_C_ENA_DRIFT,
436 ret = hellcreek_led_setup(hellcreek);
438 if (hellcreek->ptp_clock)
439 ptp_clock_unregister(hellcreek->ptp_clock);
443 schedule_delayed_work(&hellcreek->overflow_work,
449 void hellcreek_ptp_free(struct hellcreek *hellcreek)
451 led_classdev_unregister(&hellcreek->led_is_gm);
452 led_classdev_unregister(&hellcreek->led_sync_good);
453 cancel_delayed_work_sync(&hellcreek->overflow_work);
454 if (hellcreek->ptp_clock)
455 ptp_clock_unregister(hellcreek->ptp_clock);
456 hellcreek->ptp_clock = NULL;