Lines Matching +full:duty +full:- +full:cycle
1 // SPDX-License-Identifier: GPL-2.0
5 * Copyright (C) 2018-2024 ARM Ltd.
9 #include <linux/clk-provider.h>
51 ret = scmi_proto_clk_ops->rate_get(clk->ph, clk->id, &rate);
69 if (clk->info->rate_discrete)
72 fmin = clk->info->range.min_rate;
73 fmax = clk->info->range.max_rate;
79 ftmp = rate - fmin;
80 ftmp += clk->info->range.step_size - 1; /* to round up */
81 do_div(ftmp, clk->info->range.step_size);
83 return ftmp * clk->info->range.step_size + fmin;
91 return scmi_proto_clk_ops->rate_set(clk->ph, clk->id, rate);
98 return scmi_proto_clk_ops->parent_set(clk->ph, clk->id, parent_index);
107 ret = scmi_proto_clk_ops->parent_get(clk->ph, clk->id, &parent_id);
111 for (p_idx = 0; p_idx < clk->info->num_parents; p_idx++) {
112 if (clk->parent_data[p_idx].index == parent_id)
116 if (p_idx == clk->info->num_parents)
135 return scmi_proto_clk_ops->enable(clk->ph, clk->id, NOT_ATOMIC);
142 scmi_proto_clk_ops->disable(clk->ph, clk->id, NOT_ATOMIC);
149 return scmi_proto_clk_ops->enable(clk->ph, clk->id, ATOMIC);
156 scmi_proto_clk_ops->disable(clk->ph, clk->id, ATOMIC);
165 ret = scmi_proto_clk_ops->state_get(clk->ph, clk->id, &enabled, atomic);
167 dev_warn(clk->dev,
168 "Failed to get state for clock ID %d\n", clk->id);
183 static int scmi_clk_get_duty_cycle(struct clk_hw *hw, struct clk_duty *duty)
189 ret = scmi_proto_clk_ops->config_oem_get(clk->ph, clk->id,
193 duty->num = val;
194 duty->den = 100;
196 dev_warn(clk->dev,
197 "Failed to get duty cycle for clock ID %d\n", clk->id);
203 static int scmi_clk_set_duty_cycle(struct clk_hw *hw, struct clk_duty *duty)
209 /* SCMI OEM Duty Cycle is expressed as a percentage */
210 val = (duty->num * 100) / duty->den;
211 ret = scmi_proto_clk_ops->config_oem_set(clk->ph, clk->id,
215 dev_warn(clk->dev,
216 "Failed to set duty cycle(%u/%u) for clock ID %d\n",
217 duty->num, duty->den, clk->id);
230 .num_parents = sclk->info->num_parents,
232 .name = sclk->info->name,
233 .parent_data = sclk->parent_data,
236 sclk->hw.init = &init;
237 ret = devm_clk_hw_register(dev, &sclk->hw);
241 if (sclk->info->rate_discrete) {
242 int num_rates = sclk->info->list.num_rates;
245 return -EINVAL;
247 min_rate = sclk->info->list.rates[0];
248 max_rate = sclk->info->list.rates[num_rates - 1];
250 min_rate = sclk->info->range.min_rate;
251 max_rate = sclk->info->range.max_rate;
254 clk_hw_set_rate_range(&sclk->hw, min_rate, max_rate);
259 * scmi_clk_ops_alloc() - Alloc and configure clock operations
288 ops->enable = scmi_clk_atomic_enable;
289 ops->disable = scmi_clk_atomic_disable;
291 ops->prepare = scmi_clk_enable;
292 ops->unprepare = scmi_clk_disable;
297 ops->is_enabled = scmi_clk_atomic_is_enabled;
299 ops->is_prepared = scmi_clk_is_enabled;
302 ops->recalc_rate = scmi_clk_recalc_rate;
303 ops->round_rate = scmi_clk_round_rate;
304 ops->determine_rate = scmi_clk_determine_rate;
306 ops->set_rate = scmi_clk_set_rate;
309 ops->get_parent = scmi_clk_get_parent;
311 ops->set_parent = scmi_clk_set_parent;
313 /* Duty cycle */
315 ops->get_duty_cycle = scmi_clk_get_duty_cycle;
316 ops->set_duty_cycle = scmi_clk_set_duty_cycle;
323 * scmi_clk_ops_select() - Select a proper set of clock operations
352 const struct scmi_clock_info *ci = sclk->info;
361 if (atomic_capable && ci->enable_latency <= atomic_threshold_us)
364 if (!ci->state_ctrl_forbidden)
367 if (!ci->rate_ctrl_forbidden)
370 if (!ci->parent_ctrl_forbidden)
373 if (ci->extended_config)
384 /* Did not find a pre-allocated clock_ops */
385 ops = scmi_clk_ops_alloc(sclk->dev, feats_key);
402 struct device *dev = &sdev->dev;
403 struct device_node *np = dev->of_node;
404 const struct scmi_handle *handle = sdev->handle;
410 return -ENODEV;
413 handle->devm_protocol_get(sdev, SCMI_PROTOCOL_CLOCK, &ph);
417 count = scmi_proto_clk_ops->count_get(ph);
420 return -EINVAL;
426 return -ENOMEM;
428 clk_data->num = count;
429 hws = clk_data->hws;
431 transport_is_atomic = handle->is_transport_atomic(handle,
436 return -ENOMEM;
445 sclk->info = scmi_proto_clk_ops->info_get(ph, idx);
446 if (!sclk->info) {
452 sclk->id = idx;
453 sclk->ph = ph;
454 sclk->dev = dev;
458 * because it cannot be shared between multiple probe-sequences
467 return -ENOMEM;
470 if (sclk->info->num_parents > 0) {
471 sclk->parent_data = devm_kcalloc(dev, sclk->info->num_parents,
472 sizeof(*sclk->parent_data), GFP_KERNEL);
473 if (!sclk->parent_data)
474 return -ENOMEM;
476 for (int i = 0; i < sclk->info->num_parents; i++) {
477 sclk->parent_data[i].index = sclk->info->parents[i];
478 sclk->parent_data[i].hw = hws[sclk->info->parents[i]];
485 devm_kfree(dev, sclk->parent_data);
489 sclk->info->name,
490 scmi_ops->enable ? " (atomic ops)" : "");
505 .name = "scmi-clocks",