diff mbox series

From: cy_huang <cy_huang@richtek.com> Subject: usb: add more vendor defined ops in tcpci

Message ID 1565842753-14245-1-git-send-email-u0084500@gmail.com (mailing list archive)
State New, archived
Headers show
Series From: cy_huang <cy_huang@richtek.com> Subject: usb: add more vendor defined ops in tcpci | expand

Commit Message

ChiYuan Huang Aug. 15, 2019, 4:19 a.m. UTC
From: cy_huang <cy_huang@richtek.com>

In real case, not all TCPCs support the tcpc PP control command.
Sometimes, charger/OTG/CurrentLimit functions will need to externally
control via power_supply/regulator/BC1.2(extcon). This patch add the ops
set_vbus/get_current_limit/set_current_limit for vendors.

Signed-off-by: cy_huang <cy_huang@richtek.com>
---
 drivers/usb/typec/tcpm/tcpci.c | 34 ++++++++++++++++++++++++++++++++++
 drivers/usb/typec/tcpm/tcpci.h |  5 +++++
 2 files changed, 39 insertions(+)

Comments

Greg KH Aug. 15, 2019, 7:08 a.m. UTC | #1
On Thu, Aug 15, 2019 at 12:19:13PM +0800, cy_huang wrote:
> From: cy_huang <cy_huang@richtek.com>

Your subject line is a bit odd :)

Also, we need a "real" name here, and in the signed-off-by line, not an
email prefix.

Please fix up and resend.

thanks,

greg k-h
Greg KH Aug. 15, 2019, 7:14 a.m. UTC | #2
On Thu, Aug 15, 2019 at 12:19:13PM +0800, cy_huang wrote:
> diff --git a/drivers/usb/typec/tcpm/tcpci.h b/drivers/usb/typec/tcpm/tcpci.h
> index 303ebde..a6754fb 100644
> --- a/drivers/usb/typec/tcpm/tcpci.h
> +++ b/drivers/usb/typec/tcpm/tcpci.h
> @@ -130,6 +130,11 @@ struct tcpci_data {
>  			 bool enable);
>  	int (*start_drp_toggling)(struct tcpci *tcpci, struct tcpci_data *data,
>  				  enum typec_cc_status cc);
> +	int (*set_vbus)(struct tcpci *tcpci,
> +			struct tcpci_data *data, bool source, bool sink);
> +	int (*get_current_limit)(struct tcpci *tcpci, struct tcpci_data *data);
> +	int (*set_current_limit)(struct tcpci *tcpci,
> +				 struct tcpci_data *data, u32 max_ma, u32 mv);
>  };

You are adding callbacks here with no users of them, which isn't
allowed.  Please also submit the code that uses these callbacks at the
same time so we can review it all together.

thanks,

greg k-h
ChiYuan Huang Aug. 15, 2019, 8:04 a.m. UTC | #3
Greg KH <gregkh@linuxfoundation.org> 於 2019年8月15日 週四 下午3:14寫道:
>
> On Thu, Aug 15, 2019 at 12:19:13PM +0800, cy_huang wrote:
> > diff --git a/drivers/usb/typec/tcpm/tcpci.h b/drivers/usb/typec/tcpm/tcpci.h
> > index 303ebde..a6754fb 100644
> > --- a/drivers/usb/typec/tcpm/tcpci.h
> > +++ b/drivers/usb/typec/tcpm/tcpci.h
> > @@ -130,6 +130,11 @@ struct tcpci_data {
> >                        bool enable);
> >       int (*start_drp_toggling)(struct tcpci *tcpci, struct tcpci_data *data,
> >                                 enum typec_cc_status cc);
> > +     int (*set_vbus)(struct tcpci *tcpci,
> > +                     struct tcpci_data *data, bool source, bool sink);
> > +     int (*get_current_limit)(struct tcpci *tcpci, struct tcpci_data *data);
> > +     int (*set_current_limit)(struct tcpci *tcpci,
> > +                              struct tcpci_data *data, u32 max_ma, u32 mv);
> >  };
>
> You are adding callbacks here with no users of them, which isn't
> allowed.  Please also submit the code that uses these callbacks at the
> same time so we can review it all together.
>
> thanks,
>
> greg k-h

Yes, I'm adding the callback for the sub-pmic (CHG/TCPC)

I'll push the mfd driver first. for the tcpc, it's just a sub device.
diff mbox series

Patch

diff --git a/drivers/usb/typec/tcpm/tcpci.c b/drivers/usb/typec/tcpm/tcpci.c
index c1f7073..22dfcd8 100644
--- a/drivers/usb/typec/tcpm/tcpci.c
+++ b/drivers/usb/typec/tcpm/tcpci.c
@@ -279,6 +279,13 @@  static int tcpci_set_vbus(struct tcpc_dev *tcpc, bool source, bool sink)
 	struct tcpci *tcpci = tcpc_to_tcpci(tcpc);
 	int ret;
 
+	/* Handle vendor set vbus */
+	if (tcpci->data->set_vbus) {
+		ret = tcpci->data->set_vbus(tcpci, tcpci->data, source, sink);
+		if (ret < 0)
+			return ret;
+	}
+
 	/* Disable both source and sink first before enabling anything */
 
 	if (!source) {
@@ -346,6 +353,30 @@  static int tcpci_pd_transmit(struct tcpc_dev *tcpc,
 	return 0;
 }
 
+static int tcpci_get_current_limit(struct tcpc_dev *tcpc)
+{
+	struct tcpci *tcpci = tcpc_to_tcpci(tcpc);
+
+	/* Handle vendor get current limit */
+	if (tcpci->data->get_current_limit)
+		return tcpci->data->get_current_limit(tcpci, tcpci->data);
+
+	return 0;
+}
+
+static int tcpci_set_current_limit(struct tcpc_dev *tcpc, u32 max_ma, u32 mv)
+{
+	struct tcpci *tcpci = tcpc_to_tcpci(tcpc);
+
+	/* Handle vendor set current limit */
+	if (tcpci->data->set_current_limit) {
+		return tcpci->data->set_current_limit(tcpci,
+						      tcpci->data, max_ma, mv);
+	}
+
+	return 0;
+}
+
 static int tcpci_init(struct tcpc_dev *tcpc)
 {
 	struct tcpci *tcpci = tcpc_to_tcpci(tcpc);
@@ -521,6 +552,9 @@  struct tcpci *tcpci_register_port(struct device *dev, struct tcpci_data *data)
 	tcpci->tcpc.set_roles = tcpci_set_roles;
 	tcpci->tcpc.pd_transmit = tcpci_pd_transmit;
 
+	tcpci->tcpc.get_current_limit = tcpci_get_current_limit;
+	tcpci->tcpc.set_current_limit = tcpci_set_current_limit;
+
 	err = tcpci_parse_config(tcpci);
 	if (err < 0)
 		return ERR_PTR(err);
diff --git a/drivers/usb/typec/tcpm/tcpci.h b/drivers/usb/typec/tcpm/tcpci.h
index 303ebde..a6754fb 100644
--- a/drivers/usb/typec/tcpm/tcpci.h
+++ b/drivers/usb/typec/tcpm/tcpci.h
@@ -130,6 +130,11 @@  struct tcpci_data {
 			 bool enable);
 	int (*start_drp_toggling)(struct tcpci *tcpci, struct tcpci_data *data,
 				  enum typec_cc_status cc);
+	int (*set_vbus)(struct tcpci *tcpci,
+			struct tcpci_data *data, bool source, bool sink);
+	int (*get_current_limit)(struct tcpci *tcpci, struct tcpci_data *data);
+	int (*set_current_limit)(struct tcpci *tcpci,
+				 struct tcpci_data *data, u32 max_ma, u32 mv);
 };
 
 struct tcpci *tcpci_register_port(struct device *dev, struct tcpci_data *data);