mbox series

[v3,0/7] usb: typec: tcpci_rt1711h: Add compatible with rt1715

Message ID 20220801101447.86207-1-gene.chen.richtek@gmail.com
Headers show
Series usb: typec: tcpci_rt1711h: Add compatible with rt1715 | expand

Message

Gene Chen Aug. 1, 2022, 10:14 a.m. UTC
This patch series add binding document for rt1711h and compatible driver with
rt1715. Also add different remote rp workaround and initial phy setting.

Gene Chen (7)
 - dt-bindings usb: typec: rt1711h: Add binding for Richtek RT1711H
 - usb: typec: tcpci_rt1711h: Fix vendor setting when set vconn
 - usb: typec: tcpci_rt1711h: Add regulator support when source vbus
 - usb: typec: tcpci_rt1711h: Add initial phy setting
 - usb: typec: tcpci_rt1711h: Add compatible id with rt1715
 - usb: typec: tcpci: Move function "tcpci_to_typec_cc" to common
 - usb: typec: tcpci_rt1711h: Fix CC PHY noise filter of voltage level

 Documentation/devicetree/bindings/usb/richtek,rt1711h.yaml |  100 ++++++++
 drivers/usb/typec/tcpm/tcpci.c                             |   22 -
 drivers/usb/typec/tcpm/tcpci.h                             |   23 +
 drivers/usb/typec/tcpm/tcpci_rt1711h.c                     |  159 +++++++++++--
 4 files changed, 265 insertions(+), 39 deletions(-)

changelogs between v2 & v3
 - binding compatible name with did to validate chip
 - remove postfix name "_mask"
 - move get cc status macro to header

changelogs between v1 & v2
 - Seperate patch by specific purpose
 - Fix binding document error
 - Set cc change woakaround without using tcpci ops callback

Comments

Heikki Krogerus Aug. 2, 2022, 7:57 a.m. UTC | #1
Hi Gene,

On Mon, Aug 01, 2022 at 06:14:42PM +0800, Gene Chen wrote:
> From: Gene Chen <gene_chen@richtek.com>
> 
> replace overwrite whole register with update bits
> 
> Signed-off-by: Gene Chen <gene_chen@richtek.com>
> ---
>  drivers/usb/typec/tcpm/tcpci_rt1711h.c | 15 +++++++++------
>  1 file changed, 9 insertions(+), 6 deletions(-)
> 
> diff --git a/drivers/usb/typec/tcpm/tcpci_rt1711h.c b/drivers/usb/typec/tcpm/tcpci_rt1711h.c
> index b56a0880a044..6197d9a05d36 100644
> --- a/drivers/usb/typec/tcpm/tcpci_rt1711h.c
> +++ b/drivers/usb/typec/tcpm/tcpci_rt1711h.c
> @@ -5,13 +5,15 @@
>   * Richtek RT1711H Type-C Chip Driver
>   */
>  
> -#include <linux/kernel.h>
> -#include <linux/module.h>
> +#include <linux/bits.h>
> +#include <linux/gpio/consumer.h>
>  #include <linux/i2c.h>
>  #include <linux/interrupt.h>
> -#include <linux/gpio/consumer.h>
> -#include <linux/usb/tcpm.h>
> +#include <linux/kernel.h>
> +#include <linux/module.h>
>  #include <linux/regmap.h>
> +#include <linux/usb/tcpm.h>

That header reshuffling is not necessary for this change - at least you
are not giving any reason for it in your commit message.

If there is no real need for that in this patch, then please leave the
headers as they are. You can propose changing the order of the headers
in a separate patch. Though, I would not bother with it unless there
is some real benefit in doing so, and I'm pretty sure there isn't any.

>  #include "tcpci.h"
>  
>  #define RT1711H_VID		0x29CF
> @@ -23,6 +25,7 @@
>  #define RT1711H_RTCTRL8_SET(ck300, ship_off, auto_idle, tout) \
>  			    (((ck300) << 7) | ((ship_off) << 5) | \
>  			    ((auto_idle) << 3) | ((tout) & 0x07))
> +#define RT1711H_AUTOIDLEEN	BIT(3)
>  
>  #define RT1711H_RTCTRL11	0x9E
>  
> @@ -109,8 +112,8 @@ static int rt1711h_set_vconn(struct tcpci *tcpci, struct tcpci_data *tdata,
>  {
>  	struct rt1711h_chip *chip = tdata_to_rt1711h(tdata);
>  
> -	return rt1711h_write8(chip, RT1711H_RTCTRL8,
> -			      RT1711H_RTCTRL8_SET(0, 1, !enable, 2));
> +	return regmap_update_bits(chip->data.regmap, RT1711H_RTCTRL8,
> +				  RT1711H_AUTOIDLEEN, enable ? 0 : RT1711H_AUTOIDLEEN);
>  }
>  
>  static int rt1711h_start_drp_toggling(struct tcpci *tcpci,
> -- 
> 2.25.1

thanks,
Heikki Krogerus Aug. 2, 2022, 8:04 a.m. UTC | #2
On Mon, Aug 01, 2022 at 06:14:43PM +0800, Gene Chen wrote:
> From: Gene Chen <gene_chen@richtek.com>
> 
> Add regulator support when source vbus
> 
> Signed-off-by: Gene Chen <gene_chen@richtek.com>

Acked-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>

> ---
>  drivers/usb/typec/tcpm/tcpci_rt1711h.c | 28 ++++++++++++++++++++++++++
>  1 file changed, 28 insertions(+)
> 
> diff --git a/drivers/usb/typec/tcpm/tcpci_rt1711h.c b/drivers/usb/typec/tcpm/tcpci_rt1711h.c
> index 6197d9a05d36..df7bfe299987 100644
> --- a/drivers/usb/typec/tcpm/tcpci_rt1711h.c
> +++ b/drivers/usb/typec/tcpm/tcpci_rt1711h.c
> @@ -12,6 +12,7 @@
>  #include <linux/kernel.h>
>  #include <linux/module.h>
>  #include <linux/regmap.h>
> +#include <linux/regulator/consumer.h>
>  #include <linux/usb/tcpm.h>
>  
>  #include "tcpci.h"
> @@ -42,6 +43,8 @@ struct rt1711h_chip {
>  	struct tcpci_data data;
>  	struct tcpci *tcpci;
>  	struct device *dev;
> +	struct regulator *vbus;
> +	bool src_en;
>  };
>  
>  static int rt1711h_read16(struct rt1711h_chip *chip, unsigned int reg, u16 *val)
> @@ -105,6 +108,26 @@ static int rt1711h_init(struct tcpci *tcpci, struct tcpci_data *tdata)
>  
>  	/* dcSRC.DRP : 33% */
>  	return rt1711h_write16(chip, RT1711H_RTCTRL16, 330);
> +
> +}
> +
> +static int rt1711h_set_vbus(struct tcpci *tcpci, struct tcpci_data *tdata,
> +			    bool src, bool snk)
> +{
> +	struct rt1711h_chip *chip = tdata_to_rt1711h(tdata);
> +	int ret;
> +
> +	if (chip->src_en == src)
> +		return 0;
> +
> +	if (src)
> +		ret = regulator_enable(chip->vbus);
> +	else
> +		ret = regulator_disable(chip->vbus);
> +
> +	if (!ret)
> +		chip->src_en = src;
> +	return ret;
>  }
>  
>  static int rt1711h_set_vconn(struct tcpci *tcpci, struct tcpci_data *tdata,
> @@ -248,7 +271,12 @@ static int rt1711h_probe(struct i2c_client *client,
>  	if (ret < 0)
>  		return ret;
>  
> +	chip->vbus = devm_regulator_get(&client->dev, "vbus");
> +	if (IS_ERR(chip->vbus))
> +		return PTR_ERR(chip->vbus);
> +
>  	chip->data.init = rt1711h_init;
> +	chip->data.set_vbus = rt1711h_set_vbus;
>  	chip->data.set_vconn = rt1711h_set_vconn;
>  	chip->data.start_drp_toggling = rt1711h_start_drp_toggling;
>  	chip->tcpci = tcpci_register_port(chip->dev, &chip->data);
> -- 
> 2.25.1
Heikki Krogerus Aug. 2, 2022, 8:19 a.m. UTC | #3
Hi Gene,

On Mon, Aug 01, 2022 at 06:14:44PM +0800, Gene Chen wrote:
> From: Gene Chen <gene_chen@richtek.com>
> 
> Add initial phy setting about phy dicard retry,
> rx filter deglitech time and BMC-encoded wait time

I'm sorry, but what does "deglitech" mean? Is it just a typo?

> Signed-off-by: Gene Chen <gene_chen@richtek.com>
> Reviewed-by: Guenter Roeck <linux@roeck-us.net>
> ---
>  drivers/usb/typec/tcpm/tcpci_rt1711h.c | 15 ++++++++++++++-
>  1 file changed, 14 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/usb/typec/tcpm/tcpci_rt1711h.c b/drivers/usb/typec/tcpm/tcpci_rt1711h.c
> index df7bfe299987..33d8ea95b7c1 100644
> --- a/drivers/usb/typec/tcpm/tcpci_rt1711h.c
> +++ b/drivers/usb/typec/tcpm/tcpci_rt1711h.c
> @@ -20,6 +20,9 @@
>  #define RT1711H_VID		0x29CF
>  #define RT1711H_PID		0x1711
>  
> +#define RT1711H_PHYCTRL1	0x80
> +#define RT1711H_PHYCTRL2	0x81
> +
>  #define RT1711H_RTCTRL8		0x9B
>  
>  /* Autoidle timeout = (tout * 2 + 1) * 6.4ms */
> @@ -107,8 +110,18 @@ static int rt1711h_init(struct tcpci *tcpci, struct tcpci_data *tdata)
>  		return ret;
>  
>  	/* dcSRC.DRP : 33% */
> -	return rt1711h_write16(chip, RT1711H_RTCTRL16, 330);
> +	ret = rt1711h_write16(chip, RT1711H_RTCTRL16, 330);
> +	if (ret < 0)
> +		return ret;
> +
> +	/* Enable phy discard retry, retry count 7, rx filter deglitech 100 us */
> +	ret = rt1711h_write8(chip, RT1711H_PHYCTRL1, 0xF1);
> +	if (ret < 0)
> +		return ret;
>  
> +	/* Decrease wait time of BMC-encoded 1 bit from 2.67us to 2.55us */
> +	/* wait time : (val * .4167) us */
> +	return rt1711h_write8(chip, RT1711H_PHYCTRL2, 62);
>  }
>  
>  static int rt1711h_set_vbus(struct tcpci *tcpci, struct tcpci_data *tdata,
> -- 
> 2.25.1

thanks,
Heikki Krogerus Aug. 2, 2022, 8:28 a.m. UTC | #4
On Mon, Aug 01, 2022 at 06:14:45PM +0800, Gene Chen wrote:
> From: Gene Chen <gene_chen@richtek.com>
> 
> Add compatible id with rt1715, and add initial setting for
> specific support PD30 command.
> 
> Signed-off-by: Gene Chen <gene_chen@richtek.com>

Acked-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>

> ---
>  drivers/usb/typec/tcpm/tcpci_rt1711h.c | 43 ++++++++++++++++++++------
>  1 file changed, 34 insertions(+), 9 deletions(-)
> 
> diff --git a/drivers/usb/typec/tcpm/tcpci_rt1711h.c b/drivers/usb/typec/tcpm/tcpci_rt1711h.c
> index 33d8ea95b7c1..da35dd3e8a59 100644
> --- a/drivers/usb/typec/tcpm/tcpci_rt1711h.c
> +++ b/drivers/usb/typec/tcpm/tcpci_rt1711h.c
> @@ -19,6 +19,8 @@
>  
>  #define RT1711H_VID		0x29CF
>  #define RT1711H_PID		0x1711
> +#define RT1711H_DID		0x2171
> +#define RT1715_DID		0x2173
>  
>  #define RT1711H_PHYCTRL1	0x80
>  #define RT1711H_PHYCTRL2	0x81
> @@ -30,6 +32,7 @@
>  			    (((ck300) << 7) | ((ship_off) << 5) | \
>  			    ((auto_idle) << 3) | ((tout) & 0x07))
>  #define RT1711H_AUTOIDLEEN	BIT(3)
> +#define RT1711H_ENEXTMSG	BIT(4)
>  
>  #define RT1711H_RTCTRL11	0x9E
>  
> @@ -48,6 +51,7 @@ struct rt1711h_chip {
>  	struct device *dev;
>  	struct regulator *vbus;
>  	bool src_en;
> +	u16 did;
>  };
>  
>  static int rt1711h_read16(struct rt1711h_chip *chip, unsigned int reg, u16 *val)
> @@ -84,8 +88,9 @@ static struct rt1711h_chip *tdata_to_rt1711h(struct tcpci_data *tdata)
>  
>  static int rt1711h_init(struct tcpci *tcpci, struct tcpci_data *tdata)
>  {
> -	int ret;
>  	struct rt1711h_chip *chip = tdata_to_rt1711h(tdata);
> +	struct regmap *regmap = chip->data.regmap;
> +	int ret;
>  
>  	/* CK 300K from 320K, shipping off, auto_idle enable, tout = 32ms */
>  	ret = rt1711h_write8(chip, RT1711H_RTCTRL8,
> @@ -93,6 +98,14 @@ static int rt1711h_init(struct tcpci *tcpci, struct tcpci_data *tdata)
>  	if (ret < 0)
>  		return ret;
>  
> +	/* Enable PD30 extended message for RT1715 */
> +	if (chip->did == RT1715_DID) {
> +		ret = regmap_update_bits(regmap, RT1711H_RTCTRL8,
> +					 RT1711H_ENEXTMSG, RT1711H_ENEXTMSG);
> +		if (ret < 0)
> +			return ret;
> +	}
> +
>  	/* I2C reset : (val + 1) * 12.5ms */
>  	ret = rt1711h_write8(chip, RT1711H_RTCTRL11,
>  			     RT1711H_RTCTRL11_SET(1, 0x0F));
> @@ -230,7 +243,7 @@ static int rt1711h_sw_reset(struct rt1711h_chip *chip)
>  	return 0;
>  }
>  
> -static int rt1711h_check_revision(struct i2c_client *i2c)
> +static int rt1711h_check_revision(struct i2c_client *i2c, struct rt1711h_chip *chip)
>  {
>  	int ret;
>  
> @@ -248,7 +261,15 @@ static int rt1711h_check_revision(struct i2c_client *i2c)
>  		dev_err(&i2c->dev, "pid is not correct, 0x%04x\n", ret);
>  		return -ENODEV;
>  	}
> -	return 0;
> +	ret = i2c_smbus_read_word_data(i2c, TCPC_BCD_DEV);
> +	if (ret < 0)
> +		return ret;
> +	if (ret != chip->did) {
> +		dev_err(&i2c->dev, "did is not correct, 0x%04x\n", ret);
> +		return -ENODEV;
> +	}
> +	dev_dbg(&i2c->dev, "did is 0x%04x\n", ret);
> +	return ret;
>  }
>  
>  static int rt1711h_probe(struct i2c_client *client,
> @@ -257,16 +278,18 @@ static int rt1711h_probe(struct i2c_client *client,
>  	int ret;
>  	struct rt1711h_chip *chip;
>  
> -	ret = rt1711h_check_revision(client);
> +	chip = devm_kzalloc(&client->dev, sizeof(*chip), GFP_KERNEL);
> +	if (!chip)
> +		return -ENOMEM;
> +
> +	chip->did = (size_t)device_get_match_data(&client->dev);
> +
> +	ret = rt1711h_check_revision(client, chip);
>  	if (ret < 0) {
>  		dev_err(&client->dev, "check vid/pid fail\n");
>  		return ret;
>  	}
>  
> -	chip = devm_kzalloc(&client->dev, sizeof(*chip), GFP_KERNEL);
> -	if (!chip)
> -		return -ENOMEM;
> -
>  	chip->data.regmap = devm_regmap_init_i2c(client,
>  						 &rt1711h_regmap_config);
>  	if (IS_ERR(chip->data.regmap))
> @@ -317,13 +340,15 @@ static int rt1711h_remove(struct i2c_client *client)
>  
>  static const struct i2c_device_id rt1711h_id[] = {
>  	{ "rt1711h", 0 },
> +	{ "rt1715", 0 },
>  	{ }
>  };
>  MODULE_DEVICE_TABLE(i2c, rt1711h_id);
>  
>  #ifdef CONFIG_OF
>  static const struct of_device_id rt1711h_of_match[] = {
> -	{ .compatible = "richtek,rt1711h", },
> +	{ .compatible = "richtek,rt1711h", .data = (void *)RT1711H_DID },
> +	{ .compatible = "richtek,rt1715", .data = (void *)RT1715_DID },
>  	{},
>  };
>  MODULE_DEVICE_TABLE(of, rt1711h_of_match);
> -- 
> 2.25.1
Heikki Krogerus Aug. 2, 2022, 8:32 a.m. UTC | #5
On Mon, Aug 01, 2022 at 06:14:46PM +0800, Gene Chen wrote:
> From: Gene Chen <gene_chen@richtek.com>
> 
> Move transition function "tcpci_to_typec_cc" to common header
> 
> Signed-off-by: Gene Chen <gene_chen@richtek.com>

Acked-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>

> ---
>  drivers/usb/typec/tcpm/tcpci.c | 22 ----------------------
>  drivers/usb/typec/tcpm/tcpci.h | 23 +++++++++++++++++++++++
>  2 files changed, 23 insertions(+), 22 deletions(-)
> 
> diff --git a/drivers/usb/typec/tcpm/tcpci.c b/drivers/usb/typec/tcpm/tcpci.c
> index f33e08eb7670..0f45d456df32 100644
> --- a/drivers/usb/typec/tcpm/tcpci.c
> +++ b/drivers/usb/typec/tcpm/tcpci.c
> @@ -28,11 +28,6 @@
>  #define	VPPS_VALID_MIN_MV			100
>  #define	VSINKDISCONNECT_PD_MIN_PERCENT		90
>  
> -#define tcpc_presenting_rd(reg, cc) \
> -	(!(TCPC_ROLE_CTRL_DRP & (reg)) && \
> -	 (((reg) & (TCPC_ROLE_CTRL_## cc ##_MASK << TCPC_ROLE_CTRL_## cc ##_SHIFT)) == \
> -	  (TCPC_ROLE_CTRL_CC_RD << TCPC_ROLE_CTRL_## cc ##_SHIFT)))
> -
>  struct tcpci {
>  	struct device *dev;
>  
> @@ -219,23 +214,6 @@ static int tcpci_start_toggling(struct tcpc_dev *tcpc,
>  			    TCPC_CMD_LOOK4CONNECTION);
>  }
>  
> -static enum typec_cc_status tcpci_to_typec_cc(unsigned int cc, bool sink)
> -{
> -	switch (cc) {
> -	case 0x1:
> -		return sink ? TYPEC_CC_RP_DEF : TYPEC_CC_RA;
> -	case 0x2:
> -		return sink ? TYPEC_CC_RP_1_5 : TYPEC_CC_RD;
> -	case 0x3:
> -		if (sink)
> -			return TYPEC_CC_RP_3_0;
> -		fallthrough;
> -	case 0x0:
> -	default:
> -		return TYPEC_CC_OPEN;
> -	}
> -}
> -
>  static int tcpci_get_cc(struct tcpc_dev *tcpc,
>  			enum typec_cc_status *cc1, enum typec_cc_status *cc2)
>  {
> diff --git a/drivers/usb/typec/tcpm/tcpci.h b/drivers/usb/typec/tcpm/tcpci.h
> index b2edd45f13c6..3f45cb0426df 100644
> --- a/drivers/usb/typec/tcpm/tcpci.h
> +++ b/drivers/usb/typec/tcpm/tcpci.h
> @@ -166,6 +166,11 @@
>  /* I2C_WRITE_BYTE_COUNT + 1 when TX_BUF_BYTE_x is only accessible I2C_WRITE_BYTE_COUNT */
>  #define TCPC_TRANSMIT_BUFFER_MAX_LEN		31
>  
> +#define tcpc_presenting_rd(reg, cc) \
> +	(!(TCPC_ROLE_CTRL_DRP & (reg)) && \
> +	 (((reg) & (TCPC_ROLE_CTRL_## cc ##_MASK << TCPC_ROLE_CTRL_## cc ##_SHIFT)) == \
> +	  (TCPC_ROLE_CTRL_CC_RD << TCPC_ROLE_CTRL_## cc ##_SHIFT)))
> +
>  struct tcpci;
>  
>  /*
> @@ -206,4 +211,22 @@ irqreturn_t tcpci_irq(struct tcpci *tcpci);
>  
>  struct tcpm_port;
>  struct tcpm_port *tcpci_get_tcpm_port(struct tcpci *tcpci);
> +
> +static inline enum typec_cc_status tcpci_to_typec_cc(unsigned int cc, bool sink)
> +{
> +	switch (cc) {
> +	case 0x1:
> +		return sink ? TYPEC_CC_RP_DEF : TYPEC_CC_RA;
> +	case 0x2:
> +		return sink ? TYPEC_CC_RP_1_5 : TYPEC_CC_RD;
> +	case 0x3:
> +		if (sink)
> +			return TYPEC_CC_RP_3_0;
> +		fallthrough;
> +	case 0x0:
> +	default:
> +		return TYPEC_CC_OPEN;
> +	}
> +}
> +
>  #endif /* __LINUX_USB_TCPCI_H */
> -- 
> 2.25.1
Heikki Krogerus Aug. 2, 2022, 8:42 a.m. UTC | #6
On Mon, Aug 01, 2022 at 06:14:47PM +0800, Gene Chen wrote:
> From: Gene Chen <gene_chen@richtek.com>
> 
> Fix CC PHY noise filter of voltage level according to
> current cc voltage level
> 
> Signed-off-by: Gene Chen <gene_chen@richtek.com>

I was unable to apply this series on top of Greg's latest usb-next, so
I think you need to rebase these. But in any case, for this patch FWIW:

Acked-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>

> ---
>  drivers/usb/typec/tcpm/tcpci_rt1711h.c | 58 +++++++++++++++++++++++++-
>  1 file changed, 57 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/usb/typec/tcpm/tcpci_rt1711h.c b/drivers/usb/typec/tcpm/tcpci_rt1711h.c
> index da35dd3e8a59..6d2568de553b 100644
> --- a/drivers/usb/typec/tcpm/tcpci_rt1711h.c
> +++ b/drivers/usb/typec/tcpm/tcpci_rt1711h.c
> @@ -25,8 +25,11 @@
>  #define RT1711H_PHYCTRL1	0x80
>  #define RT1711H_PHYCTRL2	0x81
>  
> -#define RT1711H_RTCTRL8		0x9B
> +#define RT1711H_RTCTRL4		0x93
> +/* rx threshold of rd/rp: 1b0 for level 0.4V/0.7V, 1b1 for 0.35V/0.75V */
> +#define RT1711H_BMCIO_RXDZSEL	BIT(0)
>  
> +#define RT1711H_RTCTRL8		0x9B
>  /* Autoidle timeout = (tout * 2 + 1) * 6.4ms */
>  #define RT1711H_RTCTRL8_SET(ck300, ship_off, auto_idle, tout) \
>  			    (((ck300) << 7) | ((ship_off) << 5) | \
> @@ -45,6 +48,10 @@
>  #define RT1711H_RTCTRL15	0xA2
>  #define RT1711H_RTCTRL16	0xA3
>  
> +#define RT1711H_RTCTRL18	0xAF
> +/* 1b0 as fixed rx threshold of rd/rp 0.55V, 1b1 depends on RTCRTL4[0] */
> +#define BMCIO_RXDZEN	BIT(0)
> +
>  struct rt1711h_chip {
>  	struct tcpci_data data;
>  	struct tcpci *tcpci;
> @@ -165,6 +172,53 @@ static int rt1711h_set_vconn(struct tcpci *tcpci, struct tcpci_data *tdata,
>  				  RT1711H_AUTOIDLEEN, enable ? 0 : RT1711H_AUTOIDLEEN);
>  }
>  
> +/*
> + * Selects the CC PHY noise filter voltage level according to the remote current
> + * CC voltage level.
> + *
> + * @status: The port's current cc status read from IC
> + * Return 0 if writes succeed; failure code otherwise
> + */
> +static inline int rt1711h_init_cc_params(struct rt1711h_chip *chip, u8 status)
> +{
> +	int ret, cc1, cc2;
> +	u8 role = 0;
> +	u32 rxdz_en, rxdz_sel;
> +
> +	ret = rt1711h_read8(chip, TCPC_ROLE_CTRL, &role);
> +	if (ret < 0)
> +		return ret;
> +
> +	cc1 = tcpci_to_typec_cc((status >> TCPC_CC_STATUS_CC1_SHIFT) &
> +				TCPC_CC_STATUS_CC1_MASK,
> +				status & TCPC_CC_STATUS_TERM ||
> +				tcpc_presenting_rd(role, CC1));
> +	cc2 = tcpci_to_typec_cc((status >> TCPC_CC_STATUS_CC2_SHIFT) &
> +				TCPC_CC_STATUS_CC2_MASK,
> +				status & TCPC_CC_STATUS_TERM ||
> +				tcpc_presenting_rd(role, CC2));
> +
> +	if ((cc1 >= TYPEC_CC_RP_1_5 && cc2 < TYPEC_CC_RP_DEF) ||
> +	    (cc2 >= TYPEC_CC_RP_1_5 && cc1 < TYPEC_CC_RP_DEF)) {
> +		rxdz_en = BMCIO_RXDZEN;
> +		if (chip->did == RT1715_DID)
> +			rxdz_sel = RT1711H_BMCIO_RXDZSEL;
> +		else
> +			rxdz_sel = 0;
> +	} else {
> +		rxdz_en = 0;
> +		rxdz_sel = RT1711H_BMCIO_RXDZSEL;
> +	}
> +
> +	ret = regmap_update_bits(chip->data.regmap, RT1711H_RTCTRL18,
> +				 BMCIO_RXDZEN, rxdz_en);
> +	if (ret < 0)
> +		return ret;
> +
> +	return regmap_update_bits(chip->data.regmap, RT1711H_RTCTRL4,
> +				  RT1711H_BMCIO_RXDZSEL, rxdz_sel);
> +}
> +
>  static int rt1711h_start_drp_toggling(struct tcpci *tcpci,
>  				      struct tcpci_data *tdata,
>  				      enum typec_cc_status cc)
> @@ -225,6 +279,8 @@ static irqreturn_t rt1711h_irq(int irq, void *dev_id)
>  		/* Clear cc change event triggered by starting toggling */
>  		if (status & TCPC_CC_STATUS_TOGGLING)
>  			rt1711h_write8(chip, TCPC_ALERT, TCPC_ALERT_CC_STATUS);
> +		else
> +			rt1711h_init_cc_params(chip, status);
>  	}
>  
>  out:
> -- 
> 2.25.1
Guenter Roeck Aug. 2, 2022, 8:58 a.m. UTC | #7
On Tue, Aug 02, 2022 at 11:19:15AM +0300, Heikki Krogerus wrote:
> Hi Gene,
> 
> On Mon, Aug 01, 2022 at 06:14:44PM +0800, Gene Chen wrote:
> > From: Gene Chen <gene_chen@richtek.com>
> > 
> > Add initial phy setting about phy dicard retry,
> > rx filter deglitech time and BMC-encoded wait time
> 
> I'm sorry, but what does "deglitech" mean? Is it just a typo?
> 

deglitch ?

> > Signed-off-by: Gene Chen <gene_chen@richtek.com>
> > Reviewed-by: Guenter Roeck <linux@roeck-us.net>
> > ---
> >  drivers/usb/typec/tcpm/tcpci_rt1711h.c | 15 ++++++++++++++-
> >  1 file changed, 14 insertions(+), 1 deletion(-)
> > 
> > diff --git a/drivers/usb/typec/tcpm/tcpci_rt1711h.c b/drivers/usb/typec/tcpm/tcpci_rt1711h.c
> > index df7bfe299987..33d8ea95b7c1 100644
> > --- a/drivers/usb/typec/tcpm/tcpci_rt1711h.c
> > +++ b/drivers/usb/typec/tcpm/tcpci_rt1711h.c
> > @@ -20,6 +20,9 @@
> >  #define RT1711H_VID		0x29CF
> >  #define RT1711H_PID		0x1711
> >  
> > +#define RT1711H_PHYCTRL1	0x80
> > +#define RT1711H_PHYCTRL2	0x81
> > +
> >  #define RT1711H_RTCTRL8		0x9B
> >  
> >  /* Autoidle timeout = (tout * 2 + 1) * 6.4ms */
> > @@ -107,8 +110,18 @@ static int rt1711h_init(struct tcpci *tcpci, struct tcpci_data *tdata)
> >  		return ret;
> >  
> >  	/* dcSRC.DRP : 33% */
> > -	return rt1711h_write16(chip, RT1711H_RTCTRL16, 330);
> > +	ret = rt1711h_write16(chip, RT1711H_RTCTRL16, 330);
> > +	if (ret < 0)
> > +		return ret;
> > +
> > +	/* Enable phy discard retry, retry count 7, rx filter deglitech 100 us */
> > +	ret = rt1711h_write8(chip, RT1711H_PHYCTRL1, 0xF1);
> > +	if (ret < 0)
> > +		return ret;
> >  
> > +	/* Decrease wait time of BMC-encoded 1 bit from 2.67us to 2.55us */
> > +	/* wait time : (val * .4167) us */
> > +	return rt1711h_write8(chip, RT1711H_PHYCTRL2, 62);
> >  }
> >  
> >  static int rt1711h_set_vbus(struct tcpci *tcpci, struct tcpci_data *tdata,
> > -- 
> > 2.25.1
> 
> thanks,
> 
> -- 
> heikki
Gene Chen Aug. 3, 2022, 6:08 a.m. UTC | #8
Heikki Krogerus <heikki.krogerus@linux.intel.com> 於 2022年8月2日 週二 下午3:57寫道:
>
> Hi Gene,
>
> On Mon, Aug 01, 2022 at 06:14:42PM +0800, Gene Chen wrote:
> > From: Gene Chen <gene_chen@richtek.com>
> >
> > replace overwrite whole register with update bits
> >
> > Signed-off-by: Gene Chen <gene_chen@richtek.com>
> > ---
> >  drivers/usb/typec/tcpm/tcpci_rt1711h.c | 15 +++++++++------
> >  1 file changed, 9 insertions(+), 6 deletions(-)
> >
> > diff --git a/drivers/usb/typec/tcpm/tcpci_rt1711h.c b/drivers/usb/typec/tcpm/tcpci_rt1711h.c
> > index b56a0880a044..6197d9a05d36 100644
> > --- a/drivers/usb/typec/tcpm/tcpci_rt1711h.c
> > +++ b/drivers/usb/typec/tcpm/tcpci_rt1711h.c
> > @@ -5,13 +5,15 @@
> >   * Richtek RT1711H Type-C Chip Driver
> >   */
> >
> > -#include <linux/kernel.h>
> > -#include <linux/module.h>
> > +#include <linux/bits.h>
> > +#include <linux/gpio/consumer.h>
> >  #include <linux/i2c.h>
> >  #include <linux/interrupt.h>
> > -#include <linux/gpio/consumer.h>
> > -#include <linux/usb/tcpm.h>
> > +#include <linux/kernel.h>
> > +#include <linux/module.h>
> >  #include <linux/regmap.h>
> > +#include <linux/usb/tcpm.h>
>
> That header reshuffling is not necessary for this change - at least you
> are not giving any reason for it in your commit message.
>
> If there is no real need for that in this patch, then please leave the
> headers as they are. You can propose changing the order of the headers
> in a separate patch. Though, I would not bother with it unless there
> is some real benefit in doing so, and I'm pretty sure there isn't any.
>

ACK, I will remove reshuffling.
It was suggested coding style by other reviewer in other driver.

> >  #include "tcpci.h"
> >
> >  #define RT1711H_VID          0x29CF
> > @@ -23,6 +25,7 @@
> >  #define RT1711H_RTCTRL8_SET(ck300, ship_off, auto_idle, tout) \
> >                           (((ck300) << 7) | ((ship_off) << 5) | \
> >                           ((auto_idle) << 3) | ((tout) & 0x07))
> > +#define RT1711H_AUTOIDLEEN   BIT(3)
> >
> >  #define RT1711H_RTCTRL11     0x9E
> >
> > @@ -109,8 +112,8 @@ static int rt1711h_set_vconn(struct tcpci *tcpci, struct tcpci_data *tdata,
> >  {
> >       struct rt1711h_chip *chip = tdata_to_rt1711h(tdata);
> >
> > -     return rt1711h_write8(chip, RT1711H_RTCTRL8,
> > -                           RT1711H_RTCTRL8_SET(0, 1, !enable, 2));
> > +     return regmap_update_bits(chip->data.regmap, RT1711H_RTCTRL8,
> > +                               RT1711H_AUTOIDLEEN, enable ? 0 : RT1711H_AUTOIDLEEN);
> >  }
> >
> >  static int rt1711h_start_drp_toggling(struct tcpci *tcpci,
> > --
> > 2.25.1
>
> thanks,
>
> --
> heikki
Gene Chen Aug. 3, 2022, 6:20 a.m. UTC | #9
Guenter Roeck <linux@roeck-us.net> 於 2022年8月2日 週二 下午4:58寫道:
>
> On Tue, Aug 02, 2022 at 11:19:15AM +0300, Heikki Krogerus wrote:
> > Hi Gene,
> >
> > On Mon, Aug 01, 2022 at 06:14:44PM +0800, Gene Chen wrote:
> > > From: Gene Chen <gene_chen@richtek.com>
> > >
> > > Add initial phy setting about phy dicard retry,
> > > rx filter deglitech time and BMC-encoded wait time
> >
> > I'm sorry, but what does "deglitech" mean? Is it just a typo?
> >
>
> deglitch ?
>

Yes, typo, I will fix it.

> > > Signed-off-by: Gene Chen <gene_chen@richtek.com>
> > > Reviewed-by: Guenter Roeck <linux@roeck-us.net>
> > > ---
> > >  drivers/usb/typec/tcpm/tcpci_rt1711h.c | 15 ++++++++++++++-
> > >  1 file changed, 14 insertions(+), 1 deletion(-)
> > >
> > > diff --git a/drivers/usb/typec/tcpm/tcpci_rt1711h.c b/drivers/usb/typec/tcpm/tcpci_rt1711h.c
> > > index df7bfe299987..33d8ea95b7c1 100644
> > > --- a/drivers/usb/typec/tcpm/tcpci_rt1711h.c
> > > +++ b/drivers/usb/typec/tcpm/tcpci_rt1711h.c
> > > @@ -20,6 +20,9 @@
> > >  #define RT1711H_VID                0x29CF
> > >  #define RT1711H_PID                0x1711
> > >
> > > +#define RT1711H_PHYCTRL1   0x80
> > > +#define RT1711H_PHYCTRL2   0x81
> > > +
> > >  #define RT1711H_RTCTRL8            0x9B
> > >
> > >  /* Autoidle timeout = (tout * 2 + 1) * 6.4ms */
> > > @@ -107,8 +110,18 @@ static int rt1711h_init(struct tcpci *tcpci, struct tcpci_data *tdata)
> > >             return ret;
> > >
> > >     /* dcSRC.DRP : 33% */
> > > -   return rt1711h_write16(chip, RT1711H_RTCTRL16, 330);
> > > +   ret = rt1711h_write16(chip, RT1711H_RTCTRL16, 330);
> > > +   if (ret < 0)
> > > +           return ret;
> > > +
> > > +   /* Enable phy discard retry, retry count 7, rx filter deglitech 100 us */
> > > +   ret = rt1711h_write8(chip, RT1711H_PHYCTRL1, 0xF1);
> > > +   if (ret < 0)
> > > +           return ret;
> > >
> > > +   /* Decrease wait time of BMC-encoded 1 bit from 2.67us to 2.55us */
> > > +   /* wait time : (val * .4167) us */
> > > +   return rt1711h_write8(chip, RT1711H_PHYCTRL2, 62);
> > >  }
> > >
> > >  static int rt1711h_set_vbus(struct tcpci *tcpci, struct tcpci_data *tdata,
> > > --
> > > 2.25.1
> >
> > thanks,
> >
> > --
> > heikki