Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8c725f85 authored by Ankit Gupta's avatar Ankit Gupta Committed by Gerrit - the friendly Code Review server
Browse files

i2c-msm-v2: only init xfer mode once when necessary



avoid init of xfer mode structures everytime when
structures used. Initialize once only when required

Change-Id: Iafec8688d345d5de7e619a2fb2b3100e94af16c0
Signed-off-by: default avatarAnkit Gupta <ankgupta@codeaurora.org>
parent c8100225
Loading
Loading
Loading
Loading
+37 −36
Original line number Diff line number Diff line
@@ -73,12 +73,21 @@ static void i2c_msm_pm_resume_adptr(struct i2c_msm_ctrl *ctrl);
static void i2c_msm_pm_suspend_adptr(struct i2c_msm_ctrl *ctrl);
static int  i2c_msm_qup_init(struct i2c_msm_ctrl *ctrl);
static int  i2c_msm_pm_resume_impl(struct device *dev);
static int  i2c_msm_fifo_create_struct(struct i2c_msm_ctrl *ctrl);
static int  i2c_msm_bam_create_struct(struct i2c_msm_ctrl *ctrl);
static int  i2c_msm_blk_create_struct(struct i2c_msm_ctrl *ctrl);


/* i2c_msm_bam_get_struct: return the bam structure
 * if not created, call i2c_msm_bam_create_struct to create it
 */
static struct i2c_msm_xfer_mode_bam *i2c_msm_bam_get_struct(
						struct i2c_msm_ctrl *ctrl)
{
	return (struct i2c_msm_xfer_mode_bam *)
				ctrl->ver.xfer_mode[I2C_MSM_XFER_MODE_BAM];
	void *ret_ptr = ctrl->ver.xfer_mode[I2C_MSM_XFER_MODE_BAM];
	if (!ret_ptr && !i2c_msm_bam_create_struct(ctrl))
		ret_ptr = ctrl->ver.xfer_mode[I2C_MSM_XFER_MODE_BAM];
	return (struct i2c_msm_xfer_mode_bam *) ret_ptr;
}

static void i2c_msm_bam_set_struct(struct i2c_msm_ctrl *ctrl,
@@ -88,11 +97,16 @@ static void i2c_msm_bam_set_struct(struct i2c_msm_ctrl *ctrl,
					(struct i2c_msm_xfer_mode *) bam;
}

/* i2c_msm_fifo_get_struct: return the fifo structure
 * if not created, call i2c_msm_fifo_create_struct to create it
 */
static struct i2c_msm_xfer_mode_fifo *i2c_msm_fifo_get_struct(
						struct i2c_msm_ctrl *ctrl)
{
	return (struct i2c_msm_xfer_mode_fifo *)
				ctrl->ver.xfer_mode[I2C_MSM_XFER_MODE_FIFO];
	void *ret_ptr = ctrl->ver.xfer_mode[I2C_MSM_XFER_MODE_FIFO];
	if (!ret_ptr && !i2c_msm_fifo_create_struct(ctrl))
		ret_ptr = ctrl->ver.xfer_mode[I2C_MSM_XFER_MODE_FIFO];
	return (struct i2c_msm_xfer_mode_fifo *) ret_ptr;
}

static void i2c_msm_fifo_set_struct(struct i2c_msm_ctrl *ctrl,
@@ -102,11 +116,16 @@ static void i2c_msm_fifo_set_struct(struct i2c_msm_ctrl *ctrl,
					(struct i2c_msm_xfer_mode *) fifo;
}

/* i2c_msm_blk_get_struct: return the blk structure
 * if not created, call i2c_msm_blk_create_struct to create it
 */
static struct i2c_msm_xfer_mode_blk *i2c_msm_blk_get_struct(
						struct i2c_msm_ctrl *ctrl)
{
	return (struct i2c_msm_xfer_mode_blk *)
				ctrl->ver.xfer_mode[I2C_MSM_XFER_MODE_BLOCK];
	void *ret_ptr = ctrl->ver.xfer_mode[I2C_MSM_XFER_MODE_BLOCK];
	if (!ret_ptr && !i2c_msm_blk_create_struct(ctrl))
		ret_ptr = ctrl->ver.xfer_mode[I2C_MSM_XFER_MODE_BLOCK];
	return (struct i2c_msm_xfer_mode_blk *) ret_ptr;
}

static void i2c_msm_blk_set_struct(struct i2c_msm_ctrl *ctrl,
@@ -1088,7 +1107,8 @@ static void i2c_msm_qup_xfer_init_run_state(struct i2c_msm_ctrl *ctrl)

static void i2c_msm_fifo_destroy_struct(struct i2c_msm_ctrl *ctrl)
{
	struct i2c_msm_xfer_mode_fifo *fifo = i2c_msm_fifo_get_struct(ctrl);
	struct i2c_msm_xfer_mode_fifo *fifo = (struct i2c_msm_xfer_mode_fifo *)
				ctrl->ver.xfer_mode[I2C_MSM_XFER_MODE_FIFO];
	kfree(fifo);
	i2c_msm_fifo_set_struct(ctrl, NULL);
}
@@ -1376,12 +1396,15 @@ static void i2c_msm_blk_teardown(struct i2c_msm_ctrl *ctrl) {}

static void i2c_msm_blk_destroy_struct(struct i2c_msm_ctrl *ctrl)
{
	struct i2c_msm_xfer_mode_blk *blk = i2c_msm_blk_get_struct(ctrl);
	struct i2c_msm_xfer_mode_blk *blk = (struct i2c_msm_xfer_mode_blk *)
				ctrl->ver.xfer_mode[I2C_MSM_XFER_MODE_BLOCK];
	if (blk) {
		kfree(blk->tx_cache);
		kfree(blk->rx_cache);
		kfree(blk);
		i2c_msm_blk_set_struct(ctrl, NULL);
	}
}

/*
 * i2c_msm_blk_create_struct: Allocate memory and initialize blk structure
@@ -2351,7 +2374,8 @@ err_bam_xfer:

static void i2c_msm_bam_destroy_struct(struct i2c_msm_ctrl *ctrl)
{
	struct i2c_msm_xfer_mode_bam *bam = i2c_msm_bam_get_struct(ctrl);
	struct i2c_msm_xfer_mode_bam *bam = (struct i2c_msm_xfer_mode_bam *)
				ctrl->ver.xfer_mode[I2C_MSM_XFER_MODE_BAM];
	kfree(bam);
	i2c_msm_bam_set_struct(ctrl, NULL);
}
@@ -2790,23 +2814,6 @@ static int i2c_msm_qup_mini_core_init(struct i2c_msm_ctrl *ctrl)
	return 0;
}

static int i2c_msm_qup_create_struct(struct i2c_msm_ctrl *ctrl)
{
	int ret = i2c_msm_bam_create_struct(ctrl);
	if (ret)
		return ret;

	ret = i2c_msm_fifo_create_struct(ctrl);
	if (ret)
		i2c_msm_bam_destroy_struct(ctrl);

	ret = i2c_msm_blk_create_struct(ctrl);
	if (ret)
		return ret;

	return ret;
}

static void i2c_msm_qup_destroy_struct(struct i2c_msm_ctrl *ctrl)
{
	i2c_msm_fifo_destroy_struct(ctrl);
@@ -2969,7 +2976,6 @@ i2c_msm_qup_choose_mode(struct i2c_msm_ctrl *ctrl)
static void i2c_msm_qup_set_version(struct i2c_msm_ctrl *ctrl)
{
	ctrl->ver = (struct i2c_msm_ctrl_ver) {
		.create               = i2c_msm_qup_create_struct,
		.destroy              = i2c_msm_qup_destroy_struct,
		.init                 = i2c_msm_qup_init,
		.reset                = i2c_msm_qup_sw_reset,
@@ -4070,11 +4076,6 @@ static int i2c_msm_probe(struct platform_device *pdev)

	i2c_msm_pm_rt_init(ctrl->dev);

	/* allocate xfer modes */
	ret = (*ctrl->ver.create)(ctrl);
	if (ret)
		goto ver_err;

	ret = i2c_msm_rsrcs_irq_init(pdev, ctrl);
	if (ret)
		goto irq_err;
+0 −2
Original line number Diff line number Diff line
@@ -467,7 +467,6 @@ enum i2c_msm_xfer_mode_id {
/*
 * i2c_msm_ctrl_ver: info that is different between i2c controller versions
 *
 * @create   Called once on probe. Allocate transfer modes
 * @destroy  Called once on exit.  Deallocate transfer modes
 * @init     Initialises the controller.
 * @teardown Teardown the controller and the transfer modes.
@@ -484,7 +483,6 @@ enum i2c_msm_xfer_mode_id {
 *                 is a "base class" to the particular transfer mode.
 */
struct i2c_msm_ctrl_ver {
	int			  (*create)     (struct i2c_msm_ctrl *);
	void			  (*destroy)    (struct i2c_msm_ctrl *);
	int			  (*init)       (struct i2c_msm_ctrl *);
	void			  (*teardown)   (struct i2c_msm_ctrl *);