int mdfld_mot_cmd_mot_panel_power_remove(struct panel_power_props *props)
{
	int r;
	int i;

	if (!props || !props->board)
		return -EINVAL;

	r = mot_panel_power_initial_config(props);
	if (!r) {
		PSB_DEBUG_INIT("Remove panel power start\n");
		/* Disable all regulators */
		for (i = 0; i < props->board->num_voltage_reg; i++) {
			if (props->board->reg[i].gpio != -1)
				gpio_set_value(props->board->reg[i].gpio,
					!props->board->reg[i].gpio_en_val);
		}

		/* Make sure panel in reset */
		if (props->board->reset_gpio)
			gpio_set_value(props->board->reset_gpio,
				props->reset_gpio_en_val);
		PSB_DEBUG_INIT("Remove panel power complete\n");
	}

	return r;
}
int mdfld_mot_cmn_mot_panel_init(struct drm_device *dev,
				int pipe, struct mdfld_dsi_config *config,
				struct panel_funcs *p_funcs)
{
	int r = 0;

	if (!p_funcs->mot_panel || pipe != 0)
		return 0;

	if (p_funcs->mot_panel->acl_update) {
		PSB_DEBUG_INIT("ACL mode supported\n");
		acl_mode_state = p_funcs->mot_panel->acl_init_state;
		r = device_create_file(dev->dev, &dev_attr_acl_mode);
		if (r < 0)
			DRM_ERROR("Failed to create ACL entry, r = %d\n", r);
	}

	if (p_funcs->mot_panel->elvss_tth_supported) {
		PSB_DEBUG_INIT("ELVSS TTH supported\n");
		elvss_tth_state = 0;
		r = device_create_file(dev->dev, &dev_attr_elvss_tth_status);
		if (r < 0)
			DRM_ERROR("Failed to create ELVSS TTH entry, r = %d\n",
				r);
	}

	return r;
}
int32_t psb_msvdx_alloc_fw_bo(struct drm_psb_private *dev_priv)
{
	uint32_t core_rev;
	int32_t ret = 0;
	struct msvdx_private *msvdx_priv = dev_priv->msvdx_private;

	core_rev = PSB_RMSVDX32(MSVDX_CORE_REV_OFFSET);

	if ((core_rev & 0xffffff) < 0x020000)
		msvdx_priv->mtx_mem_size = 16 * 1024;
	else
		msvdx_priv->mtx_mem_size = 56 * 1024;

	PSB_DEBUG_INIT("MSVDX: MTX mem size is 0x%08x bytes, allocate firmware BO size 0x%08x\n", msvdx_priv->mtx_mem_size,
		       msvdx_priv->mtx_mem_size + 4096);

#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 8, 0))
	ret = ttm_buffer_object_create(&dev_priv->bdev, msvdx_priv->mtx_mem_size + 4096, /* DMA may run over a page */
				       ttm_bo_type_kernel,
				       DRM_PSB_FLAG_MEM_MMU | TTM_PL_FLAG_NO_EVICT,
				       0, 0, 0, NULL, &msvdx_priv->fw);
#else
	ret = ttm_buffer_object_create(&dev_priv->bdev, msvdx_priv->mtx_mem_size + 4096, /* DMA may run over a page */
				       ttm_bo_type_kernel,
				       DRM_PSB_FLAG_MEM_MMU | TTM_PL_FLAG_NO_EVICT,
				       0, 0, NULL, &msvdx_priv->fw);
#endif

	if (ret) {
		DRM_ERROR("MSVDX: allocate firmware BO fail\n");
	}
	return ret;
}
int mdfld_mot_cmn_send_cmd_list(struct mdfld_dsi_config *dsi_config,
				struct mdfld_dsi_pkg_sender *sender,
				struct dsi_cmd_entry *list, int num_entry)
{
	struct dsi_cmd_entry *entry;
	u8 *mcs_short_data;
	int i;
	int err = 0;

	for (i = 0; i < num_entry; i++) {
		entry = &list[i];
		PSB_DEBUG_INIT("Sending command # %d, type = %d\n",
			i, entry->type);

		if (entry->type == CMD_MCS_LONG) {
			err = mdfld_dsi_send_mcs_long_hs(sender,
							entry->data,
							entry->len,
							MDFLD_DSI_SEND_PACKAGE);
		} else if ((entry->type == CMD_MCS_SHORT1) &&
			(entry->len == 2)) {
			mcs_short_data = entry->data;
			err = mdfld_dsi_send_mcs_short_hs(sender,
							entry->data[0],
							entry->data[1],
							1,
							MDFLD_DSI_SEND_PACKAGE);
		} else if (entry->type == CMD_MCS_SHORT0) {
			mcs_short_data = entry->data;
			err = mdfld_dsi_send_mcs_short_hs(sender,
							entry->data[0],
							0,
							0,
							MDFLD_DSI_SEND_PACKAGE);
		} else if (entry->type == CMD_SLEEP_MS) {
			msleep(entry->len);
		} else {
			DRM_ERROR("Invalid command entry type %d\n",
				entry->type);
			err = -EINVAL;
		}

		if (err) {
			DRM_ERROR("Failed sending command entry # %d\n", i);
			break;
		}
	}

	return err;
}
int mdfld_mot_cmd_mot_panel_power_apply(struct panel_power_props *props)
{
	int r;
	int i;

	if (!props || !props->board)
		return -EINVAL;

	r = mot_panel_power_initial_config(props);
	if (!r) {
		PSB_DEBUG_INIT("Apply panel power start\n");
		/* Make sure panel in reset */
		if (props->board->reset_gpio)
			gpio_set_value(props->board->reset_gpio,
				props->reset_gpio_en_val);

		/* Enable all regulators */
		for (i = 0; i < props->board->num_voltage_reg; i++) {
			if (props->board->reg[i].gpio != -1)
				gpio_set_value(props->board->reg[i].gpio,
					props->board->reg[i].gpio_en_val);
		}

		msleep(props->reg_apply_post_delay);

		/* Bring panel out of reset */
		if (props->board->reset_gpio) {
			gpio_set_value(props->board->reset_gpio,
				!props->reset_gpio_en_val);
			msleep(props->reset_post_delay);
		}
		PSB_DEBUG_INIT("Apply panel power complete\n");
	}

	return r;
}