/**
 * ug31xx_save_config_data - save config data
 * @name : Power Supply name
 * @data : config data input pointer
 * @len : length of config data
 *
 */
int ug31xx_save_config_data(const char *name, u8 *data, int len)
{
    int mip_offset, ret;
    int i;

    pr_info("%s:\n", __func__);

    /* write the fuel gauge config data to umip */
    mip_offset = BATT_UG31_FG_TBL_BODY + BATT_UG31_RESERVED;
    //mip_offset = UMIP_REF_FG_TBL + BATT_FG_TBL_BODY;
    ret = intel_scu_ipc_write_umip(data, len, mip_offset);

    if (ret) {
        UG31_LOGE("%s: * umip write failed *\n", name);
    }
#ifdef BATT_DATA_DEBUG
    else
    {
        for (i=0; i<len; i++)
            printk("0x%02X ", *(data + i));
        printk("\n");
    }
#endif

    return ret;
}
/**
 * mfld_fg_save_config_data - save config data
 * @name : Power Supply name
 * @data : config data input pointer
 * @len : length of config data
 *
 */
int mfld_fg_save_config_data(const char *name, void *data, int len)
{
	int mip_offset, ret;

	/* write the fuel gauge config data to umip */
	mip_offset = UMIP_REF_FG_TBL + BATT_FG_TBL_BODY;
	ret = intel_scu_ipc_write_umip((u8 *)data, len, mip_offset);

	return ret;
}
int ug31xx_write_backup_tag(const char *name, u8 *data)
{
    int mip_offset, ret;

    pr_warn("%s:\n", __func__);

    mip_offset = BATT_UG31_FG_TBL_BODY;
    ret = intel_scu_ipc_write_umip(data, 1, mip_offset);

    if (ret)
        UG31_LOGE("%s: * umip write failed *\n", name);

    return ret;
}
ssize_t Factory_UMIP_store(struct device *dev,
					struct device_attribute *attr,
					const char *buffer, size_t count)
{
	int ret = 0;
	u8 data_write;
	u8 yes;
	u8 no;
	bool bv;

	if (strlen(buffer) != 2) {
		pr_err("The length must be 1\n");
		ret = -EINVAL;
		goto error;
	}

	ret = strtobool(buffer, &bv);
	if (ret) {
		pr_err("Not expected value [Y|y|1|N|n|0]\n");
		goto error;
	}

	if (intel_mid_identify_cpu() == INTEL_MID_CPU_CHIP_PENWELL) {
		ret = intel_scu_ipc_read_mip(&data_write,
						1,
						FACTORY_UMIP_OFFSET,
						0);
		data_write &= ~(1 << FACTORY_BIT_OFFSET);
		data_write |= bv;

		ret = intel_scu_ipc_write_umip(&data_write,
						1,
						FACTORY_UMIP_OFFSET);

		if (ret) {
			pr_err("Could not write to UMIP for Factory\n");
			goto error;
		}
	}

	return count;

error:
	return ret;
}
Esempio n. 5
0
static ssize_t mip_cmd_store(struct device *dev,
		struct device_attribute *attr, const char *buf, size_t size)
{

	int ret;

	memset(mip_cmd, 0, sizeof(mip_cmd));

	ret = sscanf(buf, "%10s", mip_cmd);
	if (ret == 0) {
		mip_dbg_error = -EINVAL;
		goto end;
	}

	if (!strncmp("read_mip", mip_cmd, MIP_CMD_LEN)) {
		memset(mip_data, 0, sizeof(mip_data));
		ret = intel_scu_ipc_read_mip(mip_data, mip_len, mip_offset,
				mip_issigned);
		if (!ret)
			valid_data_nr = mip_len;

	} else if (!strncmp("write_umip", mip_cmd, MIP_CMD_LEN)) {
		if (mip_len == valid_data_nr) {
			ret = intel_scu_ipc_write_umip(mip_data, mip_len,
					mip_offset);
		} else
			goto error;
	} else
		goto error;

	if (ret)
		goto error;
	else
		goto end;

error:
	mip_dbg_error = -EINVAL;

end:
	return size;
}
ssize_t usb_host_enable_timeout_store(struct device *dev,
					struct device_attribute *attr,
					const char *buffer, size_t count)
{
	int ret_ipc, i, string_length;
	char timeout[MAX_USB_TIMEOUT_LEN];

	string_length = strlen(buffer);

	if (string_length < MAX_USB_TIMEOUT_LEN) {
		snprintf(timeout, sizeof(timeout), "%s", buffer);
	} else {
		pr_err("Invalid value written."
		"Check the Availabe values that can be used\n");
		return count;
	}

	for (i = 0; i < MAX_NUM_TIMEOUTS; i++) {
		if (strncmp(timeout, available_usb_host_enable_timeouts[i].name,
			strlen(available_usb_host_enable_timeouts[i].name)))
			continue;

		ret_ipc = intel_scu_ipc_write_umip(
			&available_usb_host_enable_timeouts[i].umip_value,
			1, USB_ENABLE_UMIP_OFFSET);
		if (ret_ipc)
			pr_err("Could not write to UMIP USB Host Enable\n");

		break;
	}

	/* if i is equal to arr_len, that means there is no match */
	if (i == MAX_NUM_TIMEOUTS) {
		pr_err("Invalid value written."
			"Check the Availabe values that can be used\n");
	}

	return count;
}