From f03977713e04da7e3b9f186a04f2e6cd4983b6ae Mon Sep 17 00:00:00 2001 From: Linyu Yuan Date: Thu, 17 Sep 2020 09:26:56 +0800 Subject: [PATCH 1/2] usb: misc: nb7vpq904m: disable chip during probe currently when power up with no usb cable, chip only disable when system enter suspend state, disable chip during probe will consume lower power early. another fix is no need to disable chip again for suspend operation. Change-Id: I182b8d96c45c0225fed2be6b35c0aba488c0589f Signed-off-by: Linyu Yuan --- drivers/usb/misc/ssusb-redriver-nb7vpq904m.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/drivers/usb/misc/ssusb-redriver-nb7vpq904m.c b/drivers/usb/misc/ssusb-redriver-nb7vpq904m.c index 1bc4e250f0c3..6cb5b02dca9d 100644 --- a/drivers/usb/misc/ssusb-redriver-nb7vpq904m.c +++ b/drivers/usb/misc/ssusb-redriver-nb7vpq904m.c @@ -634,6 +634,9 @@ static int redriver_i2c_probe(struct i2c_client *client, redriver->dev = &client->dev; i2c_set_clientdata(client, redriver); + /* init mode is OP_MODE_NONE and disable chip for power */ + ssusb_redriver_gen_dev_set(redriver); + ret = ssusb_redriver_read_configuration(redriver); if (ret < 0) { dev_err(&client->dev, @@ -941,7 +944,8 @@ static int __maybe_unused redriver_i2c_suspend(struct device *dev) dev_dbg(redriver->dev, "%s: SS USB redriver suspend.\n", __func__); - if (redriver->op_mode != OP_MODE_DP) { + if (redriver->op_mode != OP_MODE_DP && + redriver->op_mode != OP_MODE_NONE) { redriver->op_mode = OP_MODE_NONE; ssusb_redriver_gen_dev_set(redriver); } From 49edb9f93d3a00ae8c6a799d5c17279ff2270cf8 Mon Sep 17 00:00:00 2001 From: Linyu Yuan Date: Tue, 8 Sep 2020 09:59:15 +0800 Subject: [PATCH 2/2] usb: misc: nb7vpq904m: remove register read operation each register contain one parameter, there is no need to read register before write, it can improve time when change a mode. Change-Id: Ifc9e7fd1f9bf9c6a048308dcc0cc2a476d1fc2d4 Signed-off-by: Linyu Yuan --- drivers/usb/misc/ssusb-redriver-nb7vpq904m.c | 84 +++++--------------- 1 file changed, 20 insertions(+), 64 deletions(-) diff --git a/drivers/usb/misc/ssusb-redriver-nb7vpq904m.c b/drivers/usb/misc/ssusb-redriver-nb7vpq904m.c index 6cb5b02dca9d..09ccc8cef065 100644 --- a/drivers/usb/misc/ssusb-redriver-nb7vpq904m.c +++ b/drivers/usb/misc/ssusb-redriver-nb7vpq904m.c @@ -46,7 +46,7 @@ #define OP_MODE_SHIFT 1 #define EQ_SETTING_MASK 0x07 -#define OUTPUT_COMPRESSION_MASK 0x03 +#define OUTPUT_COMPRESSION_MASK 0x0b #define LOSS_MATCH_MASK 0x03 #define FLAT_GAIN_MASK 0x03 @@ -125,25 +125,6 @@ static const char * const opmode_string[] = { }; #define OPMODESTR(x) opmode_string[x] -static int redriver_i2c_reg_get(struct ssusb_redriver *redriver, - u8 reg, u8 *val) -{ - int ret; - unsigned int val_tmp; - - ret = regmap_read(redriver->regmap, (unsigned int)reg, &val_tmp); - if (ret < 0) { - dev_err(redriver->dev, "reading reg 0x%02x failure\n", reg); - return ret; - } - - *val = (u8)val_tmp; - - dev_dbg(redriver->dev, "reading reg 0x%02x=0x%02x\n", reg, *val); - - return 0; -} - static int redriver_i2c_reg_set(struct ssusb_redriver *redriver, u8 reg, u8 val) { @@ -240,13 +221,8 @@ static int ssusb_redriver_param_config(struct ssusb_redriver *redriver, if (redriver->chan_mode[j] == i) { reg_addr = reg_base + (j << 1); - ret = redriver_i2c_reg_get(redriver, - reg_addr, ®_val); - if (ret < 0) - return ret; - - reg_val &= ~(mask << shift); - reg_val |= (val << shift); + reg_val = (val << shift); + reg_val &= (mask << shift); ret = redriver_i2c_reg_set(redriver, reg_addr, reg_val); @@ -256,20 +232,15 @@ static int ssusb_redriver_param_config(struct ssusb_redriver *redriver, stored_val[i][j] = val; } - } else if (channel < CHANNEL_NUM * CHAN_MODE_NUM) { + } else { real_channel = channel % CHANNEL_NUM; chan_mode = channel / CHANNEL_NUM; if (redriver->chan_mode[real_channel] == chan_mode) { reg_addr = reg_base + (real_channel << 1); - ret = redriver_i2c_reg_get(redriver, - reg_addr, ®_val); - if (ret < 0) - return ret; - - reg_val &= ~(mask << shift); - reg_val |= (val << shift); + reg_val = (val << shift); + reg_val &= (mask << shift); ret = redriver_i2c_reg_set(redriver, reg_addr, reg_val); @@ -278,9 +249,6 @@ static int ssusb_redriver_param_config(struct ssusb_redriver *redriver, } stored_val[chan_mode][real_channel] = val; - } else { - dev_err(redriver->dev, "error channel value.\n"); - return ret; } return 0; @@ -289,47 +257,35 @@ static int ssusb_redriver_param_config(struct ssusb_redriver *redriver, static int ssusb_redriver_eq_config( struct ssusb_redriver *redriver, u8 channel, u8 val) { - if (val <= EQ_SETTING_MASK) - return ssusb_redriver_param_config(redriver, - EQ_SET_REG_BASE, channel, EQ_SETTING_MASK, - EQ_SETTING_SHIFT, val, redriver->eq); - else - return -EINVAL; + return ssusb_redriver_param_config(redriver, + EQ_SET_REG_BASE, channel, EQ_SETTING_MASK, + EQ_SETTING_SHIFT, val, redriver->eq); } static int ssusb_redriver_flat_gain_config( struct ssusb_redriver *redriver, u8 channel, u8 val) { - if (val <= FLAT_GAIN_MASK) - return ssusb_redriver_param_config(redriver, - FLAT_GAIN_REG_BASE, channel, FLAT_GAIN_MASK, - FLAT_GAIN_SHIFT, val, redriver->flat_gain); - else - return -EINVAL; + return ssusb_redriver_param_config(redriver, + FLAT_GAIN_REG_BASE, channel, FLAT_GAIN_MASK, + FLAT_GAIN_SHIFT, val, redriver->flat_gain); } static int ssusb_redriver_output_comp_config( struct ssusb_redriver *redriver, u8 channel, u8 val) { - if (val <= OUTPUT_COMPRESSION_MASK) - return ssusb_redriver_param_config(redriver, - OUT_COMP_AND_POL_REG_BASE, channel, - OUTPUT_COMPRESSION_MASK, - OUTPUT_COMPRESSION_SHIFT, val, - redriver->output_comp); - else - return -EINVAL; + return ssusb_redriver_param_config(redriver, + OUT_COMP_AND_POL_REG_BASE, channel, + OUTPUT_COMPRESSION_MASK, + OUTPUT_COMPRESSION_SHIFT, val, + redriver->output_comp); } static int ssusb_redriver_loss_match_config( struct ssusb_redriver *redriver, u8 channel, u8 val) { - if (val <= LOSS_MATCH_MASK) - return ssusb_redriver_param_config(redriver, - LOSS_MATCH_REG_BASE, channel, LOSS_MATCH_MASK, - LOSS_MATCH_SHIFT, val, redriver->loss_match); - else - return -EINVAL; + return ssusb_redriver_param_config(redriver, + LOSS_MATCH_REG_BASE, channel, LOSS_MATCH_MASK, + LOSS_MATCH_SHIFT, val, redriver->loss_match); } static int ssusb_redriver_channel_update(struct ssusb_redriver *redriver)