static enum rpc_accept_stat rpc_bbc_edp_register( u32 version, struct nvshm_rpc_message *req, struct nvshm_rpc_message **resp) { u32 num_states; u32 *states; struct nvshm_rpc_datum_out req_data[] = { NVSHM_RPC_OUT_ARRAY(TYPE_UINT, &num_states, &states), }; int rc; /* Decode request */ if (nvshm_rpc_utils_decode_args(req, false, req_data, ARRAY_SIZE(req_data)) < 0) return RPC_GARBAGE_ARGS; /* Call */ rc = tegra_bbc_proxy_edp_register(proxy_dev, num_states, states); kfree(states); /* Encode response */ { struct nvshm_rpc_datum_in resp_data[] = { NVSHM_RPC_IN_SINT(rc), }; *resp = nvshm_rpc_utils_prepare_response(req, RPC_SUCCESS, resp_data, ARRAY_SIZE(resp_data)); } return *resp ? RPC_SUCCESS : RPC_SYSTEM_ERR; }
static ssize_t i_max_store(struct device *pdev, struct device_attribute *attr, const char *buff, size_t size) { char *s, *state_i_max, buf[50]; unsigned int states[MAX_MODEM_EDP_STATES]; unsigned int num_states = 0; int ret; /* retrieve max current for supported states */ strlcpy(buf, buff, sizeof(buf)); s = strim(buf); while (s && (num_states < MAX_MODEM_EDP_STATES)) { state_i_max = strsep(&s, ","); ret = kstrtoul(state_i_max, 10, (unsigned long *)&states[num_states]); if (ret) { dev_err(pdev, "invalid bbc state-current setting\n"); goto done; } num_states++; } if (s && (num_states >= MAX_MODEM_EDP_STATES)) { dev_err(pdev, "number of bbc EDP states exceeded max\n"); ret = -EINVAL; goto done; } ret = tegra_bbc_proxy_edp_register(pdev, num_states, states); if (ret) goto done; ret = size; done: return ret; }