Esempio n. 1
0
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;
}