Lines Matching +full:tx +full:- +full:pins

1 // SPDX-License-Identifier: GPL-2.0
126 struct scmi_pin_info *pins; member
136 ret = ph->xops->xfer_get_init(ph, PROTOCOL_ATTRIBUTES, 0, sizeof(*attr), &t); in scmi_pinctrl_attributes_get()
140 attr = t->rx.buf; in scmi_pinctrl_attributes_get()
142 ret = ph->xops->do_xfer(ph, t); in scmi_pinctrl_attributes_get()
144 pi->nr_functions = GET_FUNCTIONS_NR(attr->attributes_high); in scmi_pinctrl_attributes_get()
145 pi->nr_groups = GET_GROUPS_NR(attr->attributes_low); in scmi_pinctrl_attributes_get()
146 pi->nr_pins = GET_PINS_NR(attr->attributes_low); in scmi_pinctrl_attributes_get()
147 if (pi->nr_pins == 0) { in scmi_pinctrl_attributes_get()
148 dev_warn(ph->dev, "returned zero pins\n"); in scmi_pinctrl_attributes_get()
149 ret = -EINVAL; in scmi_pinctrl_attributes_get()
153 ph->xops->xfer_put(ph, t); in scmi_pinctrl_attributes_get()
160 struct scmi_pinctrl_info *pi = ph->get_priv(ph); in scmi_pinctrl_count_get()
164 return pi->nr_pins; in scmi_pinctrl_count_get()
166 return pi->nr_groups; in scmi_pinctrl_count_get()
168 return pi->nr_functions; in scmi_pinctrl_count_get()
170 return -EINVAL; in scmi_pinctrl_count_get()
185 return -EINVAL; in scmi_pinctrl_validate_id()
197 struct scmi_msg_pinctrl_attributes *tx; in scmi_pinctrl_attributes() local
202 return -EINVAL; in scmi_pinctrl_attributes()
208 ret = ph->xops->xfer_get_init(ph, PINCTRL_ATTRIBUTES, sizeof(*tx), in scmi_pinctrl_attributes()
213 tx = t->tx.buf; in scmi_pinctrl_attributes()
214 rx = t->rx.buf; in scmi_pinctrl_attributes()
215 tx->identifier = cpu_to_le32(selector); in scmi_pinctrl_attributes()
216 tx->flags = cpu_to_le32(type); in scmi_pinctrl_attributes()
218 ret = ph->xops->do_xfer(ph, t); in scmi_pinctrl_attributes()
221 *n_elems = NUM_ELEMS(rx->attributes); in scmi_pinctrl_attributes()
223 strscpy(name, rx->name, SCMI_SHORT_NAME_MAX_SIZE); in scmi_pinctrl_attributes()
225 ext_name_flag = !!EXT_NAME_FLAG(rx->attributes); in scmi_pinctrl_attributes()
228 ph->xops->xfer_put(ph, t); in scmi_pinctrl_attributes()
237 ret = ph->hops->extended_name_get(ph, PINCTRL_NAME_GET, in scmi_pinctrl_attributes()
256 msg->identifier = cpu_to_le32(p->selector); in iter_pinctrl_assoc_prepare_message()
257 msg->flags = cpu_to_le32(p->type); in iter_pinctrl_assoc_prepare_message()
258 msg->index = cpu_to_le32(desc_index); in iter_pinctrl_assoc_prepare_message()
266 st->num_returned = RETURNED(r->flags); in iter_pinctrl_assoc_update_state()
267 st->num_remaining = REMAINING(r->flags); in iter_pinctrl_assoc_update_state()
280 p->array[st->desc_index + st->loop_idx] = in iter_pinctrl_assoc_process_response()
281 le16_to_cpu(r->array[st->loop_idx]); in iter_pinctrl_assoc_process_response()
305 return -EINVAL; in scmi_pinctrl_list_associations()
311 iter = ph->hops->iter_response_init(ph, &ops, size, in scmi_pinctrl_list_associations()
318 return ph->hops->iter_response_run(iter); in scmi_pinctrl_list_associations()
338 attributes = FIELD_PREP(SELECTOR_MASK, p->type); in iter_pinctrl_settings_get_prepare_message()
340 if (p->get_all) { in iter_pinctrl_settings_get_prepare_message()
344 attributes |= FIELD_PREP(CONFIG_TYPE_MASK, p->config_types[0]); in iter_pinctrl_settings_get_prepare_message()
347 msg->attributes = cpu_to_le32(attributes); in iter_pinctrl_settings_get_prepare_message()
348 msg->identifier = cpu_to_le32(p->selector); in iter_pinctrl_settings_get_prepare_message()
358 if (p->get_all) { in iter_pinctrl_settings_get_update_state()
359 st->num_returned = le32_get_bits(r->num_configs, GENMASK(7, 0)); in iter_pinctrl_settings_get_update_state()
360 st->num_remaining = le32_get_bits(r->num_configs, GENMASK(31, 24)); in iter_pinctrl_settings_get_update_state()
362 st->num_returned = 1; in iter_pinctrl_settings_get_update_state()
363 st->num_remaining = 0; in iter_pinctrl_settings_get_update_state()
377 u32 type = le32_get_bits(r->configs[st->loop_idx * 2], GENMASK(7, 0)); in iter_pinctrl_settings_get_process_response()
378 u32 val = le32_to_cpu(r->configs[st->loop_idx * 2 + 1]); in iter_pinctrl_settings_get_process_response()
380 if (p->get_all) { in iter_pinctrl_settings_get_process_response()
381 p->config_types[st->desc_index + st->loop_idx] = type; in iter_pinctrl_settings_get_process_response()
383 if (p->config_types[0] != type) in iter_pinctrl_settings_get_process_response()
384 return -EINVAL; in iter_pinctrl_settings_get_process_response()
387 p->config_values[st->desc_index + st->loop_idx] = val; in iter_pinctrl_settings_get_process_response()
388 ++*p->nr_configs; in iter_pinctrl_settings_get_process_response()
418 return -EINVAL; in scmi_pinctrl_settings_get()
426 iter = ph->hops->iter_response_init(ph, &ops, max_configs, in scmi_pinctrl_settings_get()
433 return ph->hops->iter_response_run(iter); in scmi_pinctrl_settings_get()
456 return -EINVAL; in scmi_pinctrl_settings_get_all()
471 struct scmi_msg_settings_conf *tx; in scmi_pinctrl_settings_conf() local
476 int max_msg_size = ph->hops->get_max_msg_size(ph); in scmi_pinctrl_settings_conf()
479 return -EINVAL; in scmi_pinctrl_settings_conf()
485 configs_in_chunk = (max_msg_size - sizeof(*tx)) / (sizeof(__le32) * 2); in scmi_pinctrl_settings_conf()
487 chunk = (nr_configs - conf_num > configs_in_chunk) ? in scmi_pinctrl_settings_conf()
488 configs_in_chunk : nr_configs - conf_num; in scmi_pinctrl_settings_conf()
490 ret = ph->xops->xfer_get_init(ph, PINCTRL_SETTINGS_CONFIGURE, in scmi_pinctrl_settings_conf()
491 sizeof(*tx) + in scmi_pinctrl_settings_conf()
496 tx = t->tx.buf; in scmi_pinctrl_settings_conf()
497 tx->identifier = cpu_to_le32(selector); in scmi_pinctrl_settings_conf()
498 tx->function_id = cpu_to_le32(0xFFFFFFFF); in scmi_pinctrl_settings_conf()
501 tx->attributes = cpu_to_le32(attributes); in scmi_pinctrl_settings_conf()
504 tx->configs[i * 2] = in scmi_pinctrl_settings_conf()
506 tx->configs[i * 2 + 1] = in scmi_pinctrl_settings_conf()
510 ret = ph->xops->do_xfer(ph, t); in scmi_pinctrl_settings_conf()
512 ph->xops->xfer_put(ph, t); in scmi_pinctrl_settings_conf()
530 struct scmi_msg_settings_conf *tx; in scmi_pinctrl_function_select() local
537 ret = ph->xops->xfer_get_init(ph, PINCTRL_SETTINGS_CONFIGURE, in scmi_pinctrl_function_select()
538 sizeof(*tx), 0, &t); in scmi_pinctrl_function_select()
542 tx = t->tx.buf; in scmi_pinctrl_function_select()
543 tx->identifier = cpu_to_le32(group); in scmi_pinctrl_function_select()
544 tx->function_id = cpu_to_le32(function_id); in scmi_pinctrl_function_select()
546 tx->attributes = cpu_to_le32(attributes); in scmi_pinctrl_function_select()
548 ret = ph->xops->do_xfer(ph, t); in scmi_pinctrl_function_select()
549 ph->xops->xfer_put(ph, t); in scmi_pinctrl_function_select()
561 struct scmi_msg_request *tx; in scmi_pinctrl_request_free() local
564 return -EINVAL; in scmi_pinctrl_request_free()
567 return -EINVAL; in scmi_pinctrl_request_free()
573 ret = ph->xops->xfer_get_init(ph, cmd, sizeof(*tx), 0, &t); in scmi_pinctrl_request_free()
577 tx = t->tx.buf; in scmi_pinctrl_request_free()
578 tx->identifier = cpu_to_le32(identifier); in scmi_pinctrl_request_free()
579 tx->flags = cpu_to_le32(type); in scmi_pinctrl_request_free()
581 ret = ph->xops->do_xfer(ph, t); in scmi_pinctrl_request_free()
582 ph->xops->xfer_put(ph, t); in scmi_pinctrl_request_free()
604 ret = scmi_pinctrl_attributes(ph, GROUP_TYPE, selector, group->name, in scmi_pinctrl_get_group_info()
605 &group->nr_pins); in scmi_pinctrl_get_group_info()
609 if (!group->nr_pins) { in scmi_pinctrl_get_group_info()
610 dev_err(ph->dev, "Group %d has 0 elements", selector); in scmi_pinctrl_get_group_info()
611 return -ENODATA; in scmi_pinctrl_get_group_info()
614 group->group_pins = kmalloc_array(group->nr_pins, in scmi_pinctrl_get_group_info()
615 sizeof(*group->group_pins), in scmi_pinctrl_get_group_info()
617 if (!group->group_pins) in scmi_pinctrl_get_group_info()
618 return -ENOMEM; in scmi_pinctrl_get_group_info()
621 group->nr_pins, group->group_pins); in scmi_pinctrl_get_group_info()
623 kfree(group->group_pins); in scmi_pinctrl_get_group_info()
627 group->present = true; in scmi_pinctrl_get_group_info()
634 struct scmi_pinctrl_info *pi = ph->get_priv(ph); in scmi_pinctrl_get_group_name()
637 return -EINVAL; in scmi_pinctrl_get_group_name()
639 if (selector >= pi->nr_groups || pi->nr_groups == 0) in scmi_pinctrl_get_group_name()
640 return -EINVAL; in scmi_pinctrl_get_group_name()
642 if (!pi->groups[selector].present) { in scmi_pinctrl_get_group_name()
646 &pi->groups[selector]); in scmi_pinctrl_get_group_name()
651 *name = pi->groups[selector].name; in scmi_pinctrl_get_group_name()
657 u32 selector, const u32 **pins, in scmi_pinctrl_group_pins_get() argument
660 struct scmi_pinctrl_info *pi = ph->get_priv(ph); in scmi_pinctrl_group_pins_get()
662 if (!pins || !nr_pins) in scmi_pinctrl_group_pins_get()
663 return -EINVAL; in scmi_pinctrl_group_pins_get()
665 if (selector >= pi->nr_groups || pi->nr_groups == 0) in scmi_pinctrl_group_pins_get()
666 return -EINVAL; in scmi_pinctrl_group_pins_get()
668 if (!pi->groups[selector].present) { in scmi_pinctrl_group_pins_get()
672 &pi->groups[selector]); in scmi_pinctrl_group_pins_get()
677 *pins = pi->groups[selector].group_pins; in scmi_pinctrl_group_pins_get()
678 *nr_pins = pi->groups[selector].nr_pins; in scmi_pinctrl_group_pins_get()
689 ret = scmi_pinctrl_attributes(ph, FUNCTION_TYPE, selector, func->name, in scmi_pinctrl_get_function_info()
690 &func->nr_groups); in scmi_pinctrl_get_function_info()
694 if (!func->nr_groups) { in scmi_pinctrl_get_function_info()
695 dev_err(ph->dev, "Function %d has 0 elements", selector); in scmi_pinctrl_get_function_info()
696 return -ENODATA; in scmi_pinctrl_get_function_info()
699 func->groups = kmalloc_array(func->nr_groups, sizeof(*func->groups), in scmi_pinctrl_get_function_info()
701 if (!func->groups) in scmi_pinctrl_get_function_info()
702 return -ENOMEM; in scmi_pinctrl_get_function_info()
705 func->nr_groups, func->groups); in scmi_pinctrl_get_function_info()
707 kfree(func->groups); in scmi_pinctrl_get_function_info()
711 func->present = true; in scmi_pinctrl_get_function_info()
718 struct scmi_pinctrl_info *pi = ph->get_priv(ph); in scmi_pinctrl_get_function_name()
721 return -EINVAL; in scmi_pinctrl_get_function_name()
723 if (selector >= pi->nr_functions || pi->nr_functions == 0) in scmi_pinctrl_get_function_name()
724 return -EINVAL; in scmi_pinctrl_get_function_name()
726 if (!pi->functions[selector].present) { in scmi_pinctrl_get_function_name()
730 &pi->functions[selector]); in scmi_pinctrl_get_function_name()
735 *name = pi->functions[selector].name; in scmi_pinctrl_get_function_name()
744 struct scmi_pinctrl_info *pi = ph->get_priv(ph); in scmi_pinctrl_function_groups_get()
747 return -EINVAL; in scmi_pinctrl_function_groups_get()
749 if (selector >= pi->nr_functions || pi->nr_functions == 0) in scmi_pinctrl_function_groups_get()
750 return -EINVAL; in scmi_pinctrl_function_groups_get()
752 if (!pi->functions[selector].present) { in scmi_pinctrl_function_groups_get()
756 &pi->functions[selector]); in scmi_pinctrl_function_groups_get()
761 *groups = pi->functions[selector].groups; in scmi_pinctrl_function_groups_get()
762 *nr_groups = pi->functions[selector].nr_groups; in scmi_pinctrl_function_groups_get()
779 return -EINVAL; in scmi_pinctrl_get_pin_info()
781 ret = scmi_pinctrl_attributes(ph, PIN_TYPE, selector, pin->name, NULL); in scmi_pinctrl_get_pin_info()
785 pin->present = true; in scmi_pinctrl_get_pin_info()
792 struct scmi_pinctrl_info *pi = ph->get_priv(ph); in scmi_pinctrl_get_pin_name()
795 return -EINVAL; in scmi_pinctrl_get_pin_name()
797 if (selector >= pi->nr_pins) in scmi_pinctrl_get_pin_name()
798 return -EINVAL; in scmi_pinctrl_get_pin_name()
800 if (!pi->pins[selector].present) { in scmi_pinctrl_get_pin_name()
803 ret = scmi_pinctrl_get_pin_info(ph, selector, &pi->pins[selector]); in scmi_pinctrl_get_pin_name()
808 *name = pi->pins[selector].name; in scmi_pinctrl_get_pin_name()
826 return -EINVAL; in scmi_pinctrl_name_get()
849 ret = ph->xops->version_get(ph, &version); in scmi_pinctrl_protocol_init()
853 dev_dbg(ph->dev, "Pinctrl Version %d.%d\n", in scmi_pinctrl_protocol_init()
856 pinfo = devm_kzalloc(ph->dev, sizeof(*pinfo), GFP_KERNEL); in scmi_pinctrl_protocol_init()
858 return -ENOMEM; in scmi_pinctrl_protocol_init()
864 pinfo->pins = devm_kcalloc(ph->dev, pinfo->nr_pins, in scmi_pinctrl_protocol_init()
865 sizeof(*pinfo->pins), GFP_KERNEL); in scmi_pinctrl_protocol_init()
866 if (!pinfo->pins) in scmi_pinctrl_protocol_init()
867 return -ENOMEM; in scmi_pinctrl_protocol_init()
869 pinfo->groups = devm_kcalloc(ph->dev, pinfo->nr_groups, in scmi_pinctrl_protocol_init()
870 sizeof(*pinfo->groups), GFP_KERNEL); in scmi_pinctrl_protocol_init()
871 if (!pinfo->groups) in scmi_pinctrl_protocol_init()
872 return -ENOMEM; in scmi_pinctrl_protocol_init()
874 pinfo->functions = devm_kcalloc(ph->dev, pinfo->nr_functions, in scmi_pinctrl_protocol_init()
875 sizeof(*pinfo->functions), GFP_KERNEL); in scmi_pinctrl_protocol_init()
876 if (!pinfo->functions) in scmi_pinctrl_protocol_init()
877 return -ENOMEM; in scmi_pinctrl_protocol_init()
879 pinfo->version = version; in scmi_pinctrl_protocol_init()
881 return ph->set_priv(ph, pinfo, version); in scmi_pinctrl_protocol_init()
887 struct scmi_pinctrl_info *pi = ph->get_priv(ph); in scmi_pinctrl_protocol_deinit()
890 for (i = 0; i < pi->nr_groups; i++) { in scmi_pinctrl_protocol_deinit()
891 if (pi->groups[i].present) { in scmi_pinctrl_protocol_deinit()
892 kfree(pi->groups[i].group_pins); in scmi_pinctrl_protocol_deinit()
893 pi->groups[i].present = false; in scmi_pinctrl_protocol_deinit()
898 for (i = 0; i < pi->nr_functions; i++) { in scmi_pinctrl_protocol_deinit()
899 if (pi->functions[i].present) { in scmi_pinctrl_protocol_deinit()
900 kfree(pi->functions[i].groups); in scmi_pinctrl_protocol_deinit()
901 pi->functions[i].present = false; in scmi_pinctrl_protocol_deinit()