Lines Matching full:clk

41 nvkm_clk_adjust(struct nvkm_clk *clk, bool adjust,  in nvkm_clk_adjust()  argument
44 struct nvkm_bios *bios = clk->subdev.device->bios; in nvkm_clk_adjust()
79 nvkm_cstate_valid(struct nvkm_clk *clk, struct nvkm_cstate *cstate, in nvkm_cstate_valid() argument
82 const struct nvkm_domain *domain = clk->domains; in nvkm_cstate_valid()
83 struct nvkm_volt *volt = clk->subdev.device->volt; in nvkm_cstate_valid()
89 switch (clk->boost_mode) { in nvkm_cstate_valid()
91 if (clk->base_khz && freq > clk->base_khz) in nvkm_cstate_valid()
95 if (clk->boost_khz && freq > clk->boost_khz) in nvkm_cstate_valid()
112 nvkm_cstate_find_best(struct nvkm_clk *clk, struct nvkm_pstate *pstate, in nvkm_cstate_find_best() argument
115 struct nvkm_device *device = clk->subdev.device; in nvkm_cstate_find_best()
128 nvkm_volt_map(volt, volt->max0_id, clk->temp)); in nvkm_cstate_find_best()
131 nvkm_volt_map(volt, volt->max1_id, clk->temp)); in nvkm_cstate_find_best()
134 nvkm_volt_map(volt, volt->max2_id, clk->temp)); in nvkm_cstate_find_best()
137 if (nvkm_cstate_valid(clk, cstate, max_volt, clk->temp)) in nvkm_cstate_find_best()
145 nvkm_cstate_get(struct nvkm_clk *clk, struct nvkm_pstate *pstate, int cstatei) in nvkm_cstate_get() argument
160 nvkm_cstate_prog(struct nvkm_clk *clk, struct nvkm_pstate *pstate, int cstatei) in nvkm_cstate_prog() argument
162 struct nvkm_subdev *subdev = &clk->subdev; in nvkm_cstate_prog()
170 cstate = nvkm_cstate_get(clk, pstate, cstatei); in nvkm_cstate_prog()
171 cstate = nvkm_cstate_find_best(clk, pstate, cstate); in nvkm_cstate_prog()
186 pstate->base.voltage, clk->temp, +1); in nvkm_cstate_prog()
193 ret = clk->func->calc(clk, cstate); in nvkm_cstate_prog()
195 ret = clk->func->prog(clk); in nvkm_cstate_prog()
196 clk->func->tidy(clk); in nvkm_cstate_prog()
201 pstate->base.voltage, clk->temp, -1); in nvkm_cstate_prog()
223 nvkm_cstate_new(struct nvkm_clk *clk, int idx, struct nvkm_pstate *pstate) in nvkm_cstate_new() argument
225 struct nvkm_bios *bios = clk->subdev.device->bios; in nvkm_cstate_new()
226 struct nvkm_volt *volt = clk->subdev.device->volt; in nvkm_cstate_new()
227 const struct nvkm_domain *domain = clk->domains; in nvkm_cstate_new()
250 u32 freq = nvkm_clk_adjust(clk, true, pstate->pstate, in nvkm_cstate_new()
265 nvkm_pstate_prog(struct nvkm_clk *clk, int pstatei) in nvkm_pstate_prog() argument
267 struct nvkm_subdev *subdev = &clk->subdev; in nvkm_pstate_prog()
273 list_for_each_entry(pstate, &clk->states, head) { in nvkm_pstate_prog()
279 clk->pstate = pstatei; in nvkm_pstate_prog()
294 return nvkm_cstate_prog(clk, pstate, NVKM_CLK_CSTATE_HIGHEST); in nvkm_pstate_prog()
300 struct nvkm_clk *clk = container_of(work, typeof(*clk), work); in nvkm_pstate_work() local
301 struct nvkm_subdev *subdev = &clk->subdev; in nvkm_pstate_work()
304 if (!atomic_xchg(&clk->waiting, 0)) in nvkm_pstate_work()
306 clk->pwrsrc = power_supply_is_system_supplied(); in nvkm_pstate_work()
309 clk->pstate, clk->pwrsrc, clk->ustate_ac, clk->ustate_dc, in nvkm_pstate_work()
310 clk->astate, clk->temp, clk->dstate); in nvkm_pstate_work()
312 pstate = clk->pwrsrc ? clk->ustate_ac : clk->ustate_dc; in nvkm_pstate_work()
313 if (clk->state_nr && pstate != -1) { in nvkm_pstate_work()
314 pstate = (pstate < 0) ? clk->astate : pstate; in nvkm_pstate_work()
315 pstate = min(pstate, clk->state_nr - 1); in nvkm_pstate_work()
316 pstate = max(pstate, clk->dstate); in nvkm_pstate_work()
318 pstate = clk->pstate = -1; in nvkm_pstate_work()
322 if (pstate != clk->pstate) { in nvkm_pstate_work()
323 int ret = nvkm_pstate_prog(clk, pstate); in nvkm_pstate_work()
330 wake_up_all(&clk->wait); in nvkm_pstate_work()
331 nvkm_notify_get(&clk->pwrsrc_ntfy); in nvkm_pstate_work()
335 nvkm_pstate_calc(struct nvkm_clk *clk, bool wait) in nvkm_pstate_calc() argument
337 atomic_set(&clk->waiting, 1); in nvkm_pstate_calc()
338 schedule_work(&clk->work); in nvkm_pstate_calc()
340 wait_event(clk->wait, !atomic_read(&clk->waiting)); in nvkm_pstate_calc()
345 nvkm_pstate_info(struct nvkm_clk *clk, struct nvkm_pstate *pstate) in nvkm_pstate_info() argument
347 const struct nvkm_domain *clock = clk->domains - 1; in nvkm_pstate_info()
349 struct nvkm_subdev *subdev = &clk->subdev; in nvkm_pstate_info()
401 nvkm_pstate_new(struct nvkm_clk *clk, int idx) in nvkm_pstate_new() argument
403 struct nvkm_bios *bios = clk->subdev.device->bios; in nvkm_pstate_new()
404 const struct nvkm_domain *domain = clk->domains - 1; in nvkm_pstate_new()
445 perfS.v40.freq = nvkm_clk_adjust(clk, false, in nvkm_pstate_new()
458 nvkm_cstate_new(clk, idx, pstate); in nvkm_pstate_new()
462 nvkm_pstate_info(clk, pstate); in nvkm_pstate_new()
463 list_add_tail(&pstate->head, &clk->states); in nvkm_pstate_new()
464 clk->state_nr++; in nvkm_pstate_new()
472 nvkm_clk_ustate_update(struct nvkm_clk *clk, int req) in nvkm_clk_ustate_update() argument
477 if (!clk->allow_reclock) in nvkm_clk_ustate_update()
481 list_for_each_entry(pstate, &clk->states, head) { in nvkm_clk_ustate_update()
496 nvkm_clk_nstate(struct nvkm_clk *clk, const char *mode, int arglen) in nvkm_clk_nstate() argument
500 if (clk->allow_reclock && !strncasecmpz(mode, "auto", arglen)) in nvkm_clk_nstate()
509 ret = nvkm_clk_ustate_update(clk, v); in nvkm_clk_nstate()
520 nvkm_clk_ustate(struct nvkm_clk *clk, int req, int pwr) in nvkm_clk_ustate() argument
522 int ret = nvkm_clk_ustate_update(clk, req); in nvkm_clk_ustate()
524 if (ret -= 2, pwr) clk->ustate_ac = ret; in nvkm_clk_ustate()
525 else clk->ustate_dc = ret; in nvkm_clk_ustate()
526 return nvkm_pstate_calc(clk, true); in nvkm_clk_ustate()
532 nvkm_clk_astate(struct nvkm_clk *clk, int req, int rel, bool wait) in nvkm_clk_astate() argument
534 if (!rel) clk->astate = req; in nvkm_clk_astate()
535 if ( rel) clk->astate += rel; in nvkm_clk_astate()
536 clk->astate = min(clk->astate, clk->state_nr - 1); in nvkm_clk_astate()
537 clk->astate = max(clk->astate, 0); in nvkm_clk_astate()
538 return nvkm_pstate_calc(clk, wait); in nvkm_clk_astate()
542 nvkm_clk_tstate(struct nvkm_clk *clk, u8 temp) in nvkm_clk_tstate() argument
544 if (clk->temp == temp) in nvkm_clk_tstate()
546 clk->temp = temp; in nvkm_clk_tstate()
547 return nvkm_pstate_calc(clk, false); in nvkm_clk_tstate()
551 nvkm_clk_dstate(struct nvkm_clk *clk, int req, int rel) in nvkm_clk_dstate() argument
553 if (!rel) clk->dstate = req; in nvkm_clk_dstate()
554 if ( rel) clk->dstate += rel; in nvkm_clk_dstate()
555 clk->dstate = min(clk->dstate, clk->state_nr - 1); in nvkm_clk_dstate()
556 clk->dstate = max(clk->dstate, 0); in nvkm_clk_dstate()
557 return nvkm_pstate_calc(clk, true); in nvkm_clk_dstate()
563 struct nvkm_clk *clk = in nvkm_clk_pwrsrc() local
564 container_of(notify, typeof(*clk), pwrsrc_ntfy); in nvkm_clk_pwrsrc()
565 nvkm_pstate_calc(clk, false); in nvkm_clk_pwrsrc()
574 nvkm_clk_read(struct nvkm_clk *clk, enum nv_clk_src src) in nvkm_clk_read() argument
576 return clk->func->read(clk, src); in nvkm_clk_read()
582 struct nvkm_clk *clk = nvkm_clk(subdev); in nvkm_clk_fini() local
583 nvkm_notify_put(&clk->pwrsrc_ntfy); in nvkm_clk_fini()
584 flush_work(&clk->work); in nvkm_clk_fini()
585 if (clk->func->fini) in nvkm_clk_fini()
586 clk->func->fini(clk); in nvkm_clk_fini()
593 struct nvkm_clk *clk = nvkm_clk(subdev); in nvkm_clk_init() local
594 const struct nvkm_domain *clock = clk->domains; in nvkm_clk_init()
597 memset(&clk->bstate, 0x00, sizeof(clk->bstate)); in nvkm_clk_init()
598 INIT_LIST_HEAD(&clk->bstate.list); in nvkm_clk_init()
599 clk->bstate.pstate = 0xff; in nvkm_clk_init()
602 ret = nvkm_clk_read(clk, clock->name); in nvkm_clk_init()
607 clk->bstate.base.domain[clock->name] = ret; in nvkm_clk_init()
611 nvkm_pstate_info(clk, &clk->bstate); in nvkm_clk_init()
613 if (clk->func->init) in nvkm_clk_init()
614 return clk->func->init(clk); in nvkm_clk_init()
616 clk->astate = clk->state_nr - 1; in nvkm_clk_init()
617 clk->dstate = 0; in nvkm_clk_init()
618 clk->pstate = -1; in nvkm_clk_init()
619 clk->temp = 90; /* reasonable default value */ in nvkm_clk_init()
620 nvkm_pstate_calc(clk, true); in nvkm_clk_init()
627 struct nvkm_clk *clk = nvkm_clk(subdev); in nvkm_clk_dtor() local
630 nvkm_notify_fini(&clk->pwrsrc_ntfy); in nvkm_clk_dtor()
633 if (clk->func->pstates) in nvkm_clk_dtor()
634 return clk; in nvkm_clk_dtor()
636 list_for_each_entry_safe(pstate, temp, &clk->states, head) { in nvkm_clk_dtor()
640 return clk; in nvkm_clk_dtor()
652 enum nvkm_subdev_type type, int inst, bool allow_reclock, struct nvkm_clk *clk) in nvkm_clk_ctor() argument
654 struct nvkm_subdev *subdev = &clk->subdev; in nvkm_clk_ctor()
665 clk->boost_khz = boost.clock_mhz * 1000; in nvkm_clk_ctor()
667 clk->base_khz = base.clock_mhz * 1000; in nvkm_clk_ctor()
670 clk->func = func; in nvkm_clk_ctor()
671 INIT_LIST_HEAD(&clk->states); in nvkm_clk_ctor()
672 clk->domains = func->domains; in nvkm_clk_ctor()
673 clk->ustate_ac = -1; in nvkm_clk_ctor()
674 clk->ustate_dc = -1; in nvkm_clk_ctor()
675 clk->allow_reclock = allow_reclock; in nvkm_clk_ctor()
677 INIT_WORK(&clk->work, nvkm_pstate_work); in nvkm_clk_ctor()
678 init_waitqueue_head(&clk->wait); in nvkm_clk_ctor()
679 atomic_set(&clk->waiting, 0); in nvkm_clk_ctor()
685 ret = nvkm_pstate_new(clk, idx++); in nvkm_clk_ctor()
689 list_add_tail(&func->pstates[idx].head, &clk->states); in nvkm_clk_ctor()
690 clk->state_nr = func->nr_pstates; in nvkm_clk_ctor()
694 NULL, 0, 0, &clk->pwrsrc_ntfy); in nvkm_clk_ctor()
700 clk->ustate_ac = nvkm_clk_nstate(clk, mode, arglen); in nvkm_clk_ctor()
701 clk->ustate_dc = nvkm_clk_nstate(clk, mode, arglen); in nvkm_clk_ctor()
706 clk->ustate_ac = nvkm_clk_nstate(clk, mode, arglen); in nvkm_clk_ctor()
710 clk->ustate_dc = nvkm_clk_nstate(clk, mode, arglen); in nvkm_clk_ctor()
712 clk->boost_mode = nvkm_longopt(device->cfgopt, "NvBoost", in nvkm_clk_ctor()