Merge "ARM: dts: msm: add sink capabilities to PMI8998 PD PHY"
This commit is contained in:
commit
2aa89ab3ff
3 changed files with 61 additions and 5 deletions
|
@ -43,6 +43,9 @@ Optional properties:
|
||||||
- qcom,vconn-uses-external-source: Indicates whether VCONN supply is sourced
|
- qcom,vconn-uses-external-source: Indicates whether VCONN supply is sourced
|
||||||
from an external regulator. If omitted, then it is
|
from an external regulator. If omitted, then it is
|
||||||
assumed it is connected to VBUS.
|
assumed it is connected to VBUS.
|
||||||
|
- qcom,default-sink-caps: List of 32-bit values representing the nominal sink
|
||||||
|
capabilities in voltage (millivolts) and current
|
||||||
|
(milliamps) pairs.
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
qcom,qpnp-pdphy@1700 {
|
qcom,qpnp-pdphy@1700 {
|
||||||
|
@ -64,4 +67,8 @@ Example:
|
||||||
"msg-tx-failed",
|
"msg-tx-failed",
|
||||||
"msg-tx-discarded",
|
"msg-tx-discarded",
|
||||||
"msg-rx-discarded";
|
"msg-rx-discarded";
|
||||||
|
|
||||||
|
qcom,default-sink-caps = <5000 3000>, /* 5V @ 3A */
|
||||||
|
<9000 3000>, /* 9V @ 3A */
|
||||||
|
<12000 2250>; /* 12V @ 2.25A */
|
||||||
};
|
};
|
||||||
|
|
|
@ -290,6 +290,10 @@
|
||||||
"msg-tx-failed",
|
"msg-tx-failed",
|
||||||
"msg-tx-discarded",
|
"msg-tx-discarded",
|
||||||
"msg-rx-discarded";
|
"msg-rx-discarded";
|
||||||
|
|
||||||
|
qcom,default-sink-caps = <5000 3000>, /* 5V @ 3A */
|
||||||
|
<9000 3000>, /* 9V @ 3A */
|
||||||
|
<12000 2250>; /* 12V @ 2.25A */
|
||||||
};
|
};
|
||||||
|
|
||||||
bcl@4200 {
|
bcl@4200 {
|
||||||
|
|
|
@ -243,6 +243,10 @@ static void *usbpd_ipc_log;
|
||||||
#define MAX_VDM_RESPONSE_TIME 60 /* 2 * tVDMSenderResponse_max(30ms) */
|
#define MAX_VDM_RESPONSE_TIME 60 /* 2 * tVDMSenderResponse_max(30ms) */
|
||||||
#define MAX_VDM_BUSY_TIME 100 /* 2 * tVDMBusy (50ms) */
|
#define MAX_VDM_BUSY_TIME 100 /* 2 * tVDMBusy (50ms) */
|
||||||
|
|
||||||
|
#define PD_SNK_PDO_FIXED(prs, hc, uc, usb_comm, drs, volt, curr) \
|
||||||
|
(((prs) << 29) | ((hc) << 28) | ((uc) << 27) | ((usb_comm) << 26) | \
|
||||||
|
((drs) << 25) | ((volt) << 10) | (curr))
|
||||||
|
|
||||||
/* VDM header is the first 32-bit object following the 16-bit PD header */
|
/* VDM header is the first 32-bit object following the 16-bit PD header */
|
||||||
#define VDM_HDR_SVID(hdr) ((hdr) >> 16)
|
#define VDM_HDR_SVID(hdr) ((hdr) >> 16)
|
||||||
#define VDM_IS_SVDM(hdr) ((hdr) & 0x8000)
|
#define VDM_IS_SVDM(hdr) ((hdr) & 0x8000)
|
||||||
|
@ -273,7 +277,7 @@ static int min_sink_current = 900;
|
||||||
module_param(min_sink_current, int, S_IRUSR | S_IWUSR);
|
module_param(min_sink_current, int, S_IRUSR | S_IWUSR);
|
||||||
|
|
||||||
static const u32 default_src_caps[] = { 0x36019096 }; /* VSafe5V @ 1.5A */
|
static const u32 default_src_caps[] = { 0x36019096 }; /* VSafe5V @ 1.5A */
|
||||||
static const u32 default_snk_caps[] = { 0x2601905A }; /* 5V @ 900mA */
|
static const u32 default_snk_caps[] = { 0x2601912C }; /* VSafe5V @ 3A */
|
||||||
|
|
||||||
struct vdm_tx {
|
struct vdm_tx {
|
||||||
u32 data[7];
|
u32 data[7];
|
||||||
|
@ -318,6 +322,9 @@ struct usbpd {
|
||||||
bool peer_pr_swap;
|
bool peer_pr_swap;
|
||||||
bool peer_dr_swap;
|
bool peer_dr_swap;
|
||||||
|
|
||||||
|
u32 sink_caps[7];
|
||||||
|
int num_sink_caps;
|
||||||
|
|
||||||
struct power_supply *usb_psy;
|
struct power_supply *usb_psy;
|
||||||
struct notifier_block psy_nb;
|
struct notifier_block psy_nb;
|
||||||
|
|
||||||
|
@ -1718,8 +1725,8 @@ static void usbpd_sm(struct work_struct *w)
|
||||||
}
|
}
|
||||||
} else if (IS_CTRL(rx_msg, MSG_GET_SINK_CAP)) {
|
} else if (IS_CTRL(rx_msg, MSG_GET_SINK_CAP)) {
|
||||||
ret = pd_send_msg(pd, MSG_SINK_CAPABILITIES,
|
ret = pd_send_msg(pd, MSG_SINK_CAPABILITIES,
|
||||||
default_snk_caps,
|
pd->sink_caps, pd->num_sink_caps,
|
||||||
ARRAY_SIZE(default_snk_caps), SOP_MSG);
|
SOP_MSG);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
usbpd_err(&pd->dev, "Error sending Sink Caps\n");
|
usbpd_err(&pd->dev, "Error sending Sink Caps\n");
|
||||||
usbpd_set_state(pd, PE_SRC_SEND_SOFT_RESET);
|
usbpd_set_state(pd, PE_SRC_SEND_SOFT_RESET);
|
||||||
|
@ -1996,8 +2003,8 @@ static void usbpd_sm(struct work_struct *w)
|
||||||
usbpd_set_state(pd, PE_SNK_EVALUATE_CAPABILITY);
|
usbpd_set_state(pd, PE_SNK_EVALUATE_CAPABILITY);
|
||||||
} else if (IS_CTRL(rx_msg, MSG_GET_SINK_CAP)) {
|
} else if (IS_CTRL(rx_msg, MSG_GET_SINK_CAP)) {
|
||||||
ret = pd_send_msg(pd, MSG_SINK_CAPABILITIES,
|
ret = pd_send_msg(pd, MSG_SINK_CAPABILITIES,
|
||||||
default_snk_caps,
|
pd->sink_caps, pd->num_sink_caps,
|
||||||
ARRAY_SIZE(default_snk_caps), SOP_MSG);
|
SOP_MSG);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
usbpd_err(&pd->dev, "Error sending Sink Caps\n");
|
usbpd_err(&pd->dev, "Error sending Sink Caps\n");
|
||||||
usbpd_set_state(pd, PE_SNK_SEND_SOFT_RESET);
|
usbpd_set_state(pd, PE_SNK_SEND_SOFT_RESET);
|
||||||
|
@ -3157,6 +3164,44 @@ struct usbpd *usbpd_create(struct device *parent)
|
||||||
pd->vconn_is_external = device_property_present(parent,
|
pd->vconn_is_external = device_property_present(parent,
|
||||||
"qcom,vconn-uses-external-source");
|
"qcom,vconn-uses-external-source");
|
||||||
|
|
||||||
|
pd->num_sink_caps = device_property_read_u32_array(parent,
|
||||||
|
"qcom,default-sink-caps", NULL, 0);
|
||||||
|
if (pd->num_sink_caps) {
|
||||||
|
int i;
|
||||||
|
u32 sink_caps[14];
|
||||||
|
|
||||||
|
if (pd->num_sink_caps % 2 || pd->num_sink_caps > 14) {
|
||||||
|
ret = -EINVAL;
|
||||||
|
usbpd_err(&pd->dev, "default-sink-caps must be be specified as voltage/current, max 7 pairs\n");
|
||||||
|
goto put_psy;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = device_property_read_u32_array(parent,
|
||||||
|
"qcom,default-sink-caps", sink_caps,
|
||||||
|
pd->num_sink_caps);
|
||||||
|
if (ret) {
|
||||||
|
usbpd_err(&pd->dev, "Error reading default-sink-caps\n");
|
||||||
|
goto put_psy;
|
||||||
|
}
|
||||||
|
|
||||||
|
pd->num_sink_caps /= 2;
|
||||||
|
|
||||||
|
for (i = 0; i < pd->num_sink_caps; i++) {
|
||||||
|
int v = sink_caps[i * 2] / 50;
|
||||||
|
int c = sink_caps[i * 2 + 1] / 10;
|
||||||
|
|
||||||
|
pd->sink_caps[i] =
|
||||||
|
PD_SNK_PDO_FIXED(0, 0, 0, 0, 0, v, c);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* First PDO includes additional capabilities */
|
||||||
|
pd->sink_caps[0] |= PD_SNK_PDO_FIXED(1, 0, 0, 1, 1, 0, 0);
|
||||||
|
} else {
|
||||||
|
memcpy(pd->sink_caps, default_snk_caps,
|
||||||
|
sizeof(default_snk_caps));
|
||||||
|
pd->num_sink_caps = ARRAY_SIZE(default_snk_caps);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Register the Android dual-role class (/sys/class/dual_role_usb/).
|
* Register the Android dual-role class (/sys/class/dual_role_usb/).
|
||||||
* The first instance should be named "otg_default" as that's what
|
* The first instance should be named "otg_default" as that's what
|
||||||
|
|
Loading…
Add table
Reference in a new issue