From: Heikki Krogerus <heikki.krogerus@linux.intel.com>
To: Adam Thomson <Adam.Thomson.Opensource@diasemi.com>
Cc: Guenter Roeck <linux@roeck-us.net>,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
Sebastian Reichel <sre@kernel.org>,
Hans de Goede <hdegoede@redhat.com>,
Yueyao Zhu <yueyao.zhu@gmail.com>,
Rui Miguel Silva <rmfrfs@gmail.com>,
linux-usb@vger.kernel.org, linux-pm@vger.kernel.org,
linux-kernel@vger.kernel.org, support.opensource@diasemi.com
Subject: Re: [PATCH v4 1/7] typec: tcpm: Add PD Rev 3.0 definitions to PD header
Date: Tue, 30 Jan 2018 14:21:34 +0200 [thread overview]
Message-ID: <20180130122134.GA14922@kuha.fi.intel.com> (raw)
In-Reply-To: <ab71575c23391464262493ae353c098b268116a4.1514904982.git.Adam.Thomson.Opensource@diasemi.com>
On Tue, Jan 02, 2018 at 03:50:49PM +0000, Adam Thomson wrote:
> This commit adds definitions for PD Rev 3.0 messages, including
> APDO PPS and extended message support for TCPM.
>
> Signed-off-by: Adam Thomson <Adam.Thomson.Opensource@diasemi.com>
Just one nitpick. I noticed that you are exceeding the 80 character
limit per line in several places in this series, and I many cases it
does not look like splitting the line would make the code any less
readable.
But I don't think that is critical, so if there are no other comments:
Acked-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
> ---
> include/linux/usb/pd.h | 185 ++++++++++++++++++++++++++++++++++++++++++++++---
> 1 file changed, 174 insertions(+), 11 deletions(-)
>
> diff --git a/include/linux/usb/pd.h b/include/linux/usb/pd.h
> index b3d41d7..ff359bdf 100644
> --- a/include/linux/usb/pd.h
> +++ b/include/linux/usb/pd.h
> @@ -35,6 +35,13 @@ enum pd_ctrl_msg_type {
> PD_CTRL_WAIT = 12,
> PD_CTRL_SOFT_RESET = 13,
> /* 14-15 Reserved */
> + PD_CTRL_NOT_SUPP = 16,
> + PD_CTRL_GET_SOURCE_CAP_EXT = 17,
> + PD_CTRL_GET_STATUS = 18,
> + PD_CTRL_FR_SWAP = 19,
> + PD_CTRL_GET_PPS_STATUS = 20,
> + PD_CTRL_GET_COUNTRY_CODES = 21,
> + /* 22-31 Reserved */
> };
>
> enum pd_data_msg_type {
> @@ -43,13 +50,39 @@ enum pd_data_msg_type {
> PD_DATA_REQUEST = 2,
> PD_DATA_BIST = 3,
> PD_DATA_SINK_CAP = 4,
> - /* 5-14 Reserved */
> + PD_DATA_BATT_STATUS = 5,
> + PD_DATA_ALERT = 6,
> + PD_DATA_GET_COUNTRY_INFO = 7,
> + /* 8-14 Reserved */
> PD_DATA_VENDOR_DEF = 15,
> + /* 16-31 Reserved */
> +};
> +
> +enum pd_ext_msg_type {
> + /* 0 Reserved */
> + PD_EXT_SOURCE_CAP_EXT = 1,
> + PD_EXT_STATUS = 2,
> + PD_EXT_GET_BATT_CAP = 3,
> + PD_EXT_GET_BATT_STATUS = 4,
> + PD_EXT_BATT_CAP = 5,
> + PD_EXT_GET_MANUFACTURER_INFO = 6,
> + PD_EXT_MANUFACTURER_INFO = 7,
> + PD_EXT_SECURITY_REQUEST = 8,
> + PD_EXT_SECURITY_RESPONSE = 9,
> + PD_EXT_FW_UPDATE_REQUEST = 10,
> + PD_EXT_FW_UPDATE_RESPONSE = 11,
> + PD_EXT_PPS_STATUS = 12,
> + PD_EXT_COUNTRY_INFO = 13,
> + PD_EXT_COUNTRY_CODES = 14,
> + /* 15-31 Reserved */
> };
>
> #define PD_REV10 0x0
> #define PD_REV20 0x1
> +#define PD_REV30 0x2
> +#define PD_MAX_REV PD_REV30
>
> +#define PD_HEADER_EXT_HDR BIT(15)
> #define PD_HEADER_CNT_SHIFT 12
> #define PD_HEADER_CNT_MASK 0x7
> #define PD_HEADER_ID_SHIFT 9
> @@ -59,18 +92,19 @@ enum pd_data_msg_type {
> #define PD_HEADER_REV_MASK 0x3
> #define PD_HEADER_DATA_ROLE BIT(5)
> #define PD_HEADER_TYPE_SHIFT 0
> -#define PD_HEADER_TYPE_MASK 0xf
> +#define PD_HEADER_TYPE_MASK 0x1f
>
> -#define PD_HEADER(type, pwr, data, id, cnt) \
> +#define PD_HEADER(type, pwr, data, rev, id, cnt, ext_hdr) \
> ((((type) & PD_HEADER_TYPE_MASK) << PD_HEADER_TYPE_SHIFT) | \
> ((pwr) == TYPEC_SOURCE ? PD_HEADER_PWR_ROLE : 0) | \
> ((data) == TYPEC_HOST ? PD_HEADER_DATA_ROLE : 0) | \
> - (PD_REV20 << PD_HEADER_REV_SHIFT) | \
> + (rev << PD_HEADER_REV_SHIFT) | \
> (((id) & PD_HEADER_ID_MASK) << PD_HEADER_ID_SHIFT) | \
> - (((cnt) & PD_HEADER_CNT_MASK) << PD_HEADER_CNT_SHIFT))
> + (((cnt) & PD_HEADER_CNT_MASK) << PD_HEADER_CNT_SHIFT) | \
> + ((ext_hdr) ? PD_HEADER_EXT_HDR : 0))
>
> #define PD_HEADER_LE(type, pwr, data, id, cnt) \
> - cpu_to_le16(PD_HEADER((type), (pwr), (data), (id), (cnt)))
> + cpu_to_le16(PD_HEADER((type), (pwr), (data), PD_REV20, (id), (cnt), (0)))
>
> static inline unsigned int pd_header_cnt(u16 header)
> {
> @@ -102,16 +136,75 @@ static inline unsigned int pd_header_msgid_le(__le16 header)
> return pd_header_msgid(le16_to_cpu(header));
> }
>
> +static inline unsigned int pd_header_rev(u16 header)
> +{
> + return (header >> PD_HEADER_REV_SHIFT) & PD_HEADER_REV_MASK;
> +}
> +
> +static inline unsigned int pd_header_rev_le(__le16 header)
> +{
> + return pd_header_rev(le16_to_cpu(header));
> +}
> +
> +#define PD_EXT_HDR_CHUNKED BIT(15)
> +#define PD_EXT_HDR_CHUNK_NUM_SHIFT 11
> +#define PD_EXT_HDR_CHUNK_NUM_MASK 0xf
> +#define PD_EXT_HDR_REQ_CHUNK BIT(10)
> +#define PD_EXT_HDR_DATA_SIZE_SHIFT 0
> +#define PD_EXT_HDR_DATA_SIZE_MASK 0x1ff
> +
> +#define PD_EXT_HDR(data_size, req_chunk, chunk_num, chunked) \
> + ((((data_size) & PD_EXT_HDR_DATA_SIZE_MASK) << PD_EXT_HDR_DATA_SIZE_SHIFT) | \
> + ((req_chunk) ? PD_EXT_HDR_REQ_CHUNK : 0) | \
> + (((chunk_num) & PD_EXT_HDR_CHUNK_NUM_MASK) << PD_EXT_HDR_CHUNK_NUM_SHIFT) | \
> + ((chunked) ? PD_EXT_HDR_CHUNKED : 0))
> +
> +#define PD_EXT_HDR_LE(data_size, req_chunk, chunk_num, chunked) \
> + cpu_to_le16(PD_EXT_HDR((data_size), (req_chunk), (chunk_num), (chunked)))
> +
> +static inline unsigned int pd_ext_header_chunk_num(u16 ext_header)
> +{
> + return (ext_header >> PD_EXT_HDR_CHUNK_NUM_SHIFT) &
> + PD_EXT_HDR_CHUNK_NUM_MASK;
> +}
> +
> +static inline unsigned int pd_ext_header_data_size(u16 ext_header)
> +{
> + return (ext_header >> PD_EXT_HDR_DATA_SIZE_SHIFT) &
> + PD_EXT_HDR_DATA_SIZE_MASK;
> +}
> +
> +static inline unsigned int pd_ext_header_data_size_le(__le16 ext_header)
> +{
> + return pd_ext_header_data_size(le16_to_cpu(ext_header));
> +}
> +
> #define PD_MAX_PAYLOAD 7
> +#define PD_EXT_MAX_CHUNK_DATA 26
>
> /**
> - * struct pd_message - PD message as seen on wire
> - * @header: PD message header
> - * @payload: PD message payload
> - */
> + * struct pd_chunked_ext_message_data - PD chunked extended message data as
> + * seen on wire
> + * @header: PD extended message header
> + * @data: PD extended message data
> + */
> +struct pd_chunked_ext_message_data {
> + __le16 header;
> + u8 data[PD_EXT_MAX_CHUNK_DATA];
> +} __packed;
> +
> +/**
> + * struct pd_message - PD message as seen on wire
> + * @header: PD message header
> + * @payload: PD message payload
> + * @ext_msg: PD message chunked extended message data
> + */
> struct pd_message {
> __le16 header;
> - __le32 payload[PD_MAX_PAYLOAD];
> + union {
> + __le32 payload[PD_MAX_PAYLOAD];
> + struct pd_chunked_ext_message_data ext_msg;
> + };
> } __packed;
>
> /* PDO: Power Data Object */
> @@ -121,6 +214,7 @@ enum pd_pdo_type {
> PDO_TYPE_FIXED = 0,
> PDO_TYPE_BATT = 1,
> PDO_TYPE_VAR = 2,
> + PDO_TYPE_APDO = 3,
> };
>
> #define PDO_TYPE_SHIFT 30
> @@ -174,6 +268,34 @@ enum pd_pdo_type {
> (PDO_TYPE(PDO_TYPE_VAR) | PDO_VAR_MIN_VOLT(min_mv) | \
> PDO_VAR_MAX_VOLT(max_mv) | PDO_VAR_MAX_CURR(max_ma))
>
> +enum pd_apdo_type {
> + APDO_TYPE_PPS = 0,
> +};
> +
> +#define PDO_APDO_TYPE_SHIFT 28 /* Only valid value currently is 0x0 - PPS */
> +#define PDO_APDO_TYPE_MASK 0x3
> +
> +#define PDO_APDO_TYPE(t) ((t) << PDO_APDO_TYPE_SHIFT)
> +
> +#define PDO_PPS_APDO_MAX_VOLT_SHIFT 17 /* 100mV units */
> +#define PDO_PPS_APDO_MIN_VOLT_SHIFT 8 /* 100mV units */
> +#define PDO_PPS_APDO_MAX_CURR_SHIFT 0 /* 50mA units */
> +
> +#define PDO_PPS_APDO_VOLT_MASK 0xff
> +#define PDO_PPS_APDO_CURR_MASK 0x7f
> +
> +#define PDO_PPS_APDO_MIN_VOLT(mv) \
> + ((((mv) / 100) & PDO_PPS_APDO_VOLT_MASK) << PDO_PPS_APDO_MIN_VOLT_SHIFT)
> +#define PDO_PPS_APDO_MAX_VOLT(mv) \
> + ((((mv) / 100) & PDO_PPS_APDO_VOLT_MASK) << PDO_PPS_APDO_MAX_VOLT_SHIFT)
> +#define PDO_PPS_APDO_MAX_CURR(ma) \
> + ((((ma) / 50) & PDO_PPS_APDO_CURR_MASK) << PDO_PPS_APDO_MAX_CURR_SHIFT)
> +
> +#define PDO_PPS_APDO(min_mv, max_mv, max_ma) \
> + (PDO_TYPE(PDO_TYPE_APDO) | PDO_APDO_TYPE(APDO_TYPE_PPS) | \
> + PDO_PPS_APDO_MIN_VOLT(min_mv) | PDO_PPS_APDO_MAX_VOLT(max_mv) | \
> + PDO_PPS_APDO_MAX_CURR(max_ma))
> +
> static inline enum pd_pdo_type pdo_type(u32 pdo)
> {
> return (pdo >> PDO_TYPE_SHIFT) & PDO_TYPE_MASK;
> @@ -204,6 +326,29 @@ static inline unsigned int pdo_max_power(u32 pdo)
> return ((pdo >> PDO_BATT_MAX_PWR_SHIFT) & PDO_PWR_MASK) * 250;
> }
>
> +static inline enum pd_apdo_type pdo_apdo_type(u32 pdo)
> +{
> + return (pdo >> PDO_APDO_TYPE_SHIFT) & PDO_APDO_TYPE_MASK;
> +}
> +
> +static inline unsigned int pdo_pps_apdo_min_voltage(u32 pdo)
> +{
> + return ((pdo >> PDO_PPS_APDO_MIN_VOLT_SHIFT) &
> + PDO_PPS_APDO_VOLT_MASK) * 100;
> +}
> +
> +static inline unsigned int pdo_pps_apdo_max_voltage(u32 pdo)
> +{
> + return ((pdo >> PDO_PPS_APDO_MAX_VOLT_SHIFT) &
> + PDO_PPS_APDO_VOLT_MASK) * 100;
> +}
> +
> +static inline unsigned int pdo_pps_apdo_max_current(u32 pdo)
> +{
> + return ((pdo >> PDO_PPS_APDO_MAX_CURR_SHIFT) &
> + PDO_PPS_APDO_CURR_MASK) * 50;
> +}
> +
> /* RDO: Request Data Object */
> #define RDO_OBJ_POS_SHIFT 28
> #define RDO_OBJ_POS_MASK 0x7
> @@ -237,6 +382,24 @@ static inline unsigned int pdo_max_power(u32 pdo)
> (RDO_OBJ(idx) | (flags) | \
> RDO_BATT_OP_PWR(op_mw) | RDO_BATT_MAX_PWR(max_mw))
>
> +#define RDO_PROG_VOLT_MASK 0x7ff
> +#define RDO_PROG_CURR_MASK 0x7f
> +
> +#define RDO_PROG_VOLT_SHIFT 9
> +#define RDO_PROG_CURR_SHIFT 0
> +
> +#define RDO_PROG_VOLT_MV_STEP 20
> +#define RDO_PROG_CURR_MA_STEP 50
> +
> +#define PDO_PROG_OUT_VOLT(mv) \
> + ((((mv) / RDO_PROG_VOLT_MV_STEP) & RDO_PROG_VOLT_MASK) << RDO_PROG_VOLT_SHIFT)
> +#define PDO_PROG_OP_CURR(ma) \
> + ((((ma) / RDO_PROG_CURR_MA_STEP) & RDO_PROG_CURR_MASK) << RDO_PROG_CURR_SHIFT)
> +
> +#define RDO_PROG(idx, out_mv, op_ma, flags) \
> + (RDO_OBJ(idx) | (flags) | \
> + PDO_PROG_OUT_VOLT(out_mv) | PDO_PROG_OP_CURR(op_ma))
> +
> static inline unsigned int rdo_index(u32 rdo)
> {
> return (rdo >> RDO_OBJ_POS_SHIFT) & RDO_OBJ_POS_MASK;
> --
> 1.9.1
--
heikki
WARNING: multiple messages have this Message-ID (diff)
From: Heikki Krogerus <heikki.krogerus@linux.intel.com>
To: Adam Thomson <Adam.Thomson.Opensource@diasemi.com>
Cc: Guenter Roeck <linux@roeck-us.net>,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
Sebastian Reichel <sre@kernel.org>,
Hans de Goede <hdegoede@redhat.com>,
Yueyao Zhu <yueyao.zhu@gmail.com>,
Rui Miguel Silva <rmfrfs@gmail.com>,
linux-usb@vger.kernel.org, linux-pm@vger.kernel.org,
linux-kernel@vger.kernel.org, support.opensource@diasemi.com
Subject: [v4,1/7] typec: tcpm: Add PD Rev 3.0 definitions to PD header
Date: Tue, 30 Jan 2018 14:21:34 +0200 [thread overview]
Message-ID: <20180130122134.GA14922@kuha.fi.intel.com> (raw)
On Tue, Jan 02, 2018 at 03:50:49PM +0000, Adam Thomson wrote:
> This commit adds definitions for PD Rev 3.0 messages, including
> APDO PPS and extended message support for TCPM.
>
> Signed-off-by: Adam Thomson <Adam.Thomson.Opensource@diasemi.com>
Just one nitpick. I noticed that you are exceeding the 80 character
limit per line in several places in this series, and I many cases it
does not look like splitting the line would make the code any less
readable.
But I don't think that is critical, so if there are no other comments:
Acked-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
> ---
> include/linux/usb/pd.h | 185 ++++++++++++++++++++++++++++++++++++++++++++++---
> 1 file changed, 174 insertions(+), 11 deletions(-)
>
> diff --git a/include/linux/usb/pd.h b/include/linux/usb/pd.h
> index b3d41d7..ff359bdf 100644
> --- a/include/linux/usb/pd.h
> +++ b/include/linux/usb/pd.h
> @@ -35,6 +35,13 @@ enum pd_ctrl_msg_type {
> PD_CTRL_WAIT = 12,
> PD_CTRL_SOFT_RESET = 13,
> /* 14-15 Reserved */
> + PD_CTRL_NOT_SUPP = 16,
> + PD_CTRL_GET_SOURCE_CAP_EXT = 17,
> + PD_CTRL_GET_STATUS = 18,
> + PD_CTRL_FR_SWAP = 19,
> + PD_CTRL_GET_PPS_STATUS = 20,
> + PD_CTRL_GET_COUNTRY_CODES = 21,
> + /* 22-31 Reserved */
> };
>
> enum pd_data_msg_type {
> @@ -43,13 +50,39 @@ enum pd_data_msg_type {
> PD_DATA_REQUEST = 2,
> PD_DATA_BIST = 3,
> PD_DATA_SINK_CAP = 4,
> - /* 5-14 Reserved */
> + PD_DATA_BATT_STATUS = 5,
> + PD_DATA_ALERT = 6,
> + PD_DATA_GET_COUNTRY_INFO = 7,
> + /* 8-14 Reserved */
> PD_DATA_VENDOR_DEF = 15,
> + /* 16-31 Reserved */
> +};
> +
> +enum pd_ext_msg_type {
> + /* 0 Reserved */
> + PD_EXT_SOURCE_CAP_EXT = 1,
> + PD_EXT_STATUS = 2,
> + PD_EXT_GET_BATT_CAP = 3,
> + PD_EXT_GET_BATT_STATUS = 4,
> + PD_EXT_BATT_CAP = 5,
> + PD_EXT_GET_MANUFACTURER_INFO = 6,
> + PD_EXT_MANUFACTURER_INFO = 7,
> + PD_EXT_SECURITY_REQUEST = 8,
> + PD_EXT_SECURITY_RESPONSE = 9,
> + PD_EXT_FW_UPDATE_REQUEST = 10,
> + PD_EXT_FW_UPDATE_RESPONSE = 11,
> + PD_EXT_PPS_STATUS = 12,
> + PD_EXT_COUNTRY_INFO = 13,
> + PD_EXT_COUNTRY_CODES = 14,
> + /* 15-31 Reserved */
> };
>
> #define PD_REV10 0x0
> #define PD_REV20 0x1
> +#define PD_REV30 0x2
> +#define PD_MAX_REV PD_REV30
>
> +#define PD_HEADER_EXT_HDR BIT(15)
> #define PD_HEADER_CNT_SHIFT 12
> #define PD_HEADER_CNT_MASK 0x7
> #define PD_HEADER_ID_SHIFT 9
> @@ -59,18 +92,19 @@ enum pd_data_msg_type {
> #define PD_HEADER_REV_MASK 0x3
> #define PD_HEADER_DATA_ROLE BIT(5)
> #define PD_HEADER_TYPE_SHIFT 0
> -#define PD_HEADER_TYPE_MASK 0xf
> +#define PD_HEADER_TYPE_MASK 0x1f
>
> -#define PD_HEADER(type, pwr, data, id, cnt) \
> +#define PD_HEADER(type, pwr, data, rev, id, cnt, ext_hdr) \
> ((((type) & PD_HEADER_TYPE_MASK) << PD_HEADER_TYPE_SHIFT) | \
> ((pwr) == TYPEC_SOURCE ? PD_HEADER_PWR_ROLE : 0) | \
> ((data) == TYPEC_HOST ? PD_HEADER_DATA_ROLE : 0) | \
> - (PD_REV20 << PD_HEADER_REV_SHIFT) | \
> + (rev << PD_HEADER_REV_SHIFT) | \
> (((id) & PD_HEADER_ID_MASK) << PD_HEADER_ID_SHIFT) | \
> - (((cnt) & PD_HEADER_CNT_MASK) << PD_HEADER_CNT_SHIFT))
> + (((cnt) & PD_HEADER_CNT_MASK) << PD_HEADER_CNT_SHIFT) | \
> + ((ext_hdr) ? PD_HEADER_EXT_HDR : 0))
>
> #define PD_HEADER_LE(type, pwr, data, id, cnt) \
> - cpu_to_le16(PD_HEADER((type), (pwr), (data), (id), (cnt)))
> + cpu_to_le16(PD_HEADER((type), (pwr), (data), PD_REV20, (id), (cnt), (0)))
>
> static inline unsigned int pd_header_cnt(u16 header)
> {
> @@ -102,16 +136,75 @@ static inline unsigned int pd_header_msgid_le(__le16 header)
> return pd_header_msgid(le16_to_cpu(header));
> }
>
> +static inline unsigned int pd_header_rev(u16 header)
> +{
> + return (header >> PD_HEADER_REV_SHIFT) & PD_HEADER_REV_MASK;
> +}
> +
> +static inline unsigned int pd_header_rev_le(__le16 header)
> +{
> + return pd_header_rev(le16_to_cpu(header));
> +}
> +
> +#define PD_EXT_HDR_CHUNKED BIT(15)
> +#define PD_EXT_HDR_CHUNK_NUM_SHIFT 11
> +#define PD_EXT_HDR_CHUNK_NUM_MASK 0xf
> +#define PD_EXT_HDR_REQ_CHUNK BIT(10)
> +#define PD_EXT_HDR_DATA_SIZE_SHIFT 0
> +#define PD_EXT_HDR_DATA_SIZE_MASK 0x1ff
> +
> +#define PD_EXT_HDR(data_size, req_chunk, chunk_num, chunked) \
> + ((((data_size) & PD_EXT_HDR_DATA_SIZE_MASK) << PD_EXT_HDR_DATA_SIZE_SHIFT) | \
> + ((req_chunk) ? PD_EXT_HDR_REQ_CHUNK : 0) | \
> + (((chunk_num) & PD_EXT_HDR_CHUNK_NUM_MASK) << PD_EXT_HDR_CHUNK_NUM_SHIFT) | \
> + ((chunked) ? PD_EXT_HDR_CHUNKED : 0))
> +
> +#define PD_EXT_HDR_LE(data_size, req_chunk, chunk_num, chunked) \
> + cpu_to_le16(PD_EXT_HDR((data_size), (req_chunk), (chunk_num), (chunked)))
> +
> +static inline unsigned int pd_ext_header_chunk_num(u16 ext_header)
> +{
> + return (ext_header >> PD_EXT_HDR_CHUNK_NUM_SHIFT) &
> + PD_EXT_HDR_CHUNK_NUM_MASK;
> +}
> +
> +static inline unsigned int pd_ext_header_data_size(u16 ext_header)
> +{
> + return (ext_header >> PD_EXT_HDR_DATA_SIZE_SHIFT) &
> + PD_EXT_HDR_DATA_SIZE_MASK;
> +}
> +
> +static inline unsigned int pd_ext_header_data_size_le(__le16 ext_header)
> +{
> + return pd_ext_header_data_size(le16_to_cpu(ext_header));
> +}
> +
> #define PD_MAX_PAYLOAD 7
> +#define PD_EXT_MAX_CHUNK_DATA 26
>
> /**
> - * struct pd_message - PD message as seen on wire
> - * @header: PD message header
> - * @payload: PD message payload
> - */
> + * struct pd_chunked_ext_message_data - PD chunked extended message data as
> + * seen on wire
> + * @header: PD extended message header
> + * @data: PD extended message data
> + */
> +struct pd_chunked_ext_message_data {
> + __le16 header;
> + u8 data[PD_EXT_MAX_CHUNK_DATA];
> +} __packed;
> +
> +/**
> + * struct pd_message - PD message as seen on wire
> + * @header: PD message header
> + * @payload: PD message payload
> + * @ext_msg: PD message chunked extended message data
> + */
> struct pd_message {
> __le16 header;
> - __le32 payload[PD_MAX_PAYLOAD];
> + union {
> + __le32 payload[PD_MAX_PAYLOAD];
> + struct pd_chunked_ext_message_data ext_msg;
> + };
> } __packed;
>
> /* PDO: Power Data Object */
> @@ -121,6 +214,7 @@ enum pd_pdo_type {
> PDO_TYPE_FIXED = 0,
> PDO_TYPE_BATT = 1,
> PDO_TYPE_VAR = 2,
> + PDO_TYPE_APDO = 3,
> };
>
> #define PDO_TYPE_SHIFT 30
> @@ -174,6 +268,34 @@ enum pd_pdo_type {
> (PDO_TYPE(PDO_TYPE_VAR) | PDO_VAR_MIN_VOLT(min_mv) | \
> PDO_VAR_MAX_VOLT(max_mv) | PDO_VAR_MAX_CURR(max_ma))
>
> +enum pd_apdo_type {
> + APDO_TYPE_PPS = 0,
> +};
> +
> +#define PDO_APDO_TYPE_SHIFT 28 /* Only valid value currently is 0x0 - PPS */
> +#define PDO_APDO_TYPE_MASK 0x3
> +
> +#define PDO_APDO_TYPE(t) ((t) << PDO_APDO_TYPE_SHIFT)
> +
> +#define PDO_PPS_APDO_MAX_VOLT_SHIFT 17 /* 100mV units */
> +#define PDO_PPS_APDO_MIN_VOLT_SHIFT 8 /* 100mV units */
> +#define PDO_PPS_APDO_MAX_CURR_SHIFT 0 /* 50mA units */
> +
> +#define PDO_PPS_APDO_VOLT_MASK 0xff
> +#define PDO_PPS_APDO_CURR_MASK 0x7f
> +
> +#define PDO_PPS_APDO_MIN_VOLT(mv) \
> + ((((mv) / 100) & PDO_PPS_APDO_VOLT_MASK) << PDO_PPS_APDO_MIN_VOLT_SHIFT)
> +#define PDO_PPS_APDO_MAX_VOLT(mv) \
> + ((((mv) / 100) & PDO_PPS_APDO_VOLT_MASK) << PDO_PPS_APDO_MAX_VOLT_SHIFT)
> +#define PDO_PPS_APDO_MAX_CURR(ma) \
> + ((((ma) / 50) & PDO_PPS_APDO_CURR_MASK) << PDO_PPS_APDO_MAX_CURR_SHIFT)
> +
> +#define PDO_PPS_APDO(min_mv, max_mv, max_ma) \
> + (PDO_TYPE(PDO_TYPE_APDO) | PDO_APDO_TYPE(APDO_TYPE_PPS) | \
> + PDO_PPS_APDO_MIN_VOLT(min_mv) | PDO_PPS_APDO_MAX_VOLT(max_mv) | \
> + PDO_PPS_APDO_MAX_CURR(max_ma))
> +
> static inline enum pd_pdo_type pdo_type(u32 pdo)
> {
> return (pdo >> PDO_TYPE_SHIFT) & PDO_TYPE_MASK;
> @@ -204,6 +326,29 @@ static inline unsigned int pdo_max_power(u32 pdo)
> return ((pdo >> PDO_BATT_MAX_PWR_SHIFT) & PDO_PWR_MASK) * 250;
> }
>
> +static inline enum pd_apdo_type pdo_apdo_type(u32 pdo)
> +{
> + return (pdo >> PDO_APDO_TYPE_SHIFT) & PDO_APDO_TYPE_MASK;
> +}
> +
> +static inline unsigned int pdo_pps_apdo_min_voltage(u32 pdo)
> +{
> + return ((pdo >> PDO_PPS_APDO_MIN_VOLT_SHIFT) &
> + PDO_PPS_APDO_VOLT_MASK) * 100;
> +}
> +
> +static inline unsigned int pdo_pps_apdo_max_voltage(u32 pdo)
> +{
> + return ((pdo >> PDO_PPS_APDO_MAX_VOLT_SHIFT) &
> + PDO_PPS_APDO_VOLT_MASK) * 100;
> +}
> +
> +static inline unsigned int pdo_pps_apdo_max_current(u32 pdo)
> +{
> + return ((pdo >> PDO_PPS_APDO_MAX_CURR_SHIFT) &
> + PDO_PPS_APDO_CURR_MASK) * 50;
> +}
> +
> /* RDO: Request Data Object */
> #define RDO_OBJ_POS_SHIFT 28
> #define RDO_OBJ_POS_MASK 0x7
> @@ -237,6 +382,24 @@ static inline unsigned int pdo_max_power(u32 pdo)
> (RDO_OBJ(idx) | (flags) | \
> RDO_BATT_OP_PWR(op_mw) | RDO_BATT_MAX_PWR(max_mw))
>
> +#define RDO_PROG_VOLT_MASK 0x7ff
> +#define RDO_PROG_CURR_MASK 0x7f
> +
> +#define RDO_PROG_VOLT_SHIFT 9
> +#define RDO_PROG_CURR_SHIFT 0
> +
> +#define RDO_PROG_VOLT_MV_STEP 20
> +#define RDO_PROG_CURR_MA_STEP 50
> +
> +#define PDO_PROG_OUT_VOLT(mv) \
> + ((((mv) / RDO_PROG_VOLT_MV_STEP) & RDO_PROG_VOLT_MASK) << RDO_PROG_VOLT_SHIFT)
> +#define PDO_PROG_OP_CURR(ma) \
> + ((((ma) / RDO_PROG_CURR_MA_STEP) & RDO_PROG_CURR_MASK) << RDO_PROG_CURR_SHIFT)
> +
> +#define RDO_PROG(idx, out_mv, op_ma, flags) \
> + (RDO_OBJ(idx) | (flags) | \
> + PDO_PROG_OUT_VOLT(out_mv) | PDO_PROG_OP_CURR(op_ma))
> +
> static inline unsigned int rdo_index(u32 rdo)
> {
> return (rdo >> RDO_OBJ_POS_SHIFT) & RDO_OBJ_POS_MASK;
> --
> 1.9.1
next prev parent reply other threads:[~2018-01-30 12:21 UTC|newest]
Thread overview: 67+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-01-02 15:50 [PATCH v4 0/7] typec: tcpm: Add sink side support for PPS Adam Thomson
2018-01-02 15:50 ` Adam Thomson
2018-01-02 15:50 ` [PATCH v4 1/7] typec: tcpm: Add PD Rev 3.0 definitions to PD header Adam Thomson
2018-01-02 15:50 ` Adam Thomson
2018-01-02 15:50 ` [v4,1/7] " Opensource [Adam Thomson]
2018-01-30 12:21 ` Heikki Krogerus [this message]
2018-01-30 12:21 ` Heikki Krogerus
2018-02-06 14:14 ` [PATCH v4 1/7] " Adam Thomson
2018-02-06 14:14 ` [v4,1/7] " Opensource [Adam Thomson]
2018-01-02 15:50 ` [PATCH v4 2/7] typec: tcpm: Add ADO header for Alert message handling Adam Thomson
2018-01-02 15:50 ` Adam Thomson
2018-01-02 15:50 ` [v4,2/7] " Opensource [Adam Thomson]
2018-01-30 12:22 ` [PATCH v4 2/7] " Heikki Krogerus
2018-01-30 12:22 ` [v4,2/7] " Heikki Krogerus
2018-01-02 15:50 ` [PATCH v4 3/7] typec: tcpm: Add SDB header for Status " Adam Thomson
2018-01-02 15:50 ` Adam Thomson
2018-01-02 15:50 ` [v4,3/7] " Opensource [Adam Thomson]
[not found] ` <b11474b10b9a5a7865d38d58a166899a08d08521.1514904982.git.Adam.Thomson.Opensource-WBD+wuPFNBhBDgjK7y7TUQ@public.gmane.org>
2018-01-30 12:22 ` [PATCH v4 3/7] " Heikki Krogerus
2018-01-30 12:22 ` Heikki Krogerus
2018-01-30 12:22 ` [v4,3/7] " Heikki Krogerus
2018-01-02 15:50 ` [PATCH v4 4/7] typec: tcpm: Add core support for sink side PPS Adam Thomson
2018-01-02 15:50 ` Adam Thomson
2018-01-02 15:50 ` [v4,4/7] " Opensource [Adam Thomson]
2018-01-30 12:46 ` [PATCH v4 4/7] " Heikki Krogerus
2018-01-30 12:46 ` [v4,4/7] " Heikki Krogerus
2018-02-06 14:33 ` [PATCH v4 4/7] " Adam Thomson
2018-02-06 14:33 ` [v4,4/7] " Opensource [Adam Thomson]
2018-02-06 14:53 ` [PATCH v4 4/7] " Heikki Krogerus
2018-02-06 14:53 ` [v4,4/7] " Heikki Krogerus
2018-01-02 15:50 ` [PATCH v4 5/7] power: supply: Add 'connected_type' property and supporting code Adam Thomson
2018-01-02 15:50 ` Adam Thomson
2018-01-02 15:50 ` [v4,5/7] " Opensource [Adam Thomson]
2018-01-30 12:54 ` [PATCH v4 5/7] " Heikki Krogerus
2018-01-30 12:54 ` [v4,5/7] " Heikki Krogerus
2018-02-08 21:30 ` [PATCH v4 5/7] " Sebastian Reichel
2018-02-08 21:30 ` [v4,5/7] " Sebastian Reichel
2018-02-09 11:28 ` [PATCH v4 5/7] " Adam Thomson
2018-02-09 11:28 ` [v4,5/7] " Opensource [Adam Thomson]
2018-02-09 15:01 ` [PATCH v4 5/7] " Sebastian Reichel
2018-02-09 15:01 ` [v4,5/7] " Sebastian Reichel
2018-02-09 15:43 ` [PATCH v4 5/7] " Adam Thomson
2018-02-09 15:43 ` [v4,5/7] " Opensource [Adam Thomson]
2018-01-02 15:50 ` [PATCH v4 6/7] typec: tcpm: Represent source supply through power_supply class Adam Thomson
2018-01-02 15:50 ` Adam Thomson
2018-01-02 15:50 ` [v4,6/7] " Opensource [Adam Thomson]
2018-01-30 13:11 ` [PATCH v4 6/7] " Heikki Krogerus
2018-01-30 13:11 ` [v4,6/7] " Heikki Krogerus
2018-02-06 15:51 ` [PATCH v4 6/7] " Adam Thomson
2018-02-06 15:51 ` [v4,6/7] " Opensource [Adam Thomson]
2018-02-08 10:45 ` [PATCH v4 6/7] " Heikki Krogerus
2018-02-08 10:45 ` [v4,6/7] " Heikki Krogerus
2018-02-09 16:06 ` [PATCH v4 6/7] " Adam Thomson
2018-02-09 16:06 ` [v4,6/7] " Opensource [Adam Thomson]
2018-01-02 15:50 ` [PATCH v4 7/7] typec: tcpm: Add support for sink PPS related messages Adam Thomson
2018-01-02 15:50 ` Adam Thomson
2018-01-02 15:50 ` [v4,7/7] " Opensource [Adam Thomson]
2018-01-30 13:18 ` [PATCH v4 7/7] " Heikki Krogerus
2018-01-30 13:18 ` [v4,7/7] " Heikki Krogerus
[not found] ` <cover.1514904982.git.Adam.Thomson.Opensource-WBD+wuPFNBhBDgjK7y7TUQ@public.gmane.org>
2018-01-22 14:31 ` [PATCH v4 0/7] typec: tcpm: Add sink side support for PPS Greg Kroah-Hartman
2018-01-22 14:31 ` Greg Kroah-Hartman
2018-01-22 15:57 ` Guenter Roeck
2018-01-30 13:25 ` Heikki Krogerus
2018-01-30 14:27 ` Guenter Roeck
2018-02-05 10:30 ` Adam Thomson
2018-03-09 17:33 ` Greg Kroah-Hartman
2018-03-12 8:32 ` Adam Thomson
2018-03-19 10:39 ` Adam Thomson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20180130122134.GA14922@kuha.fi.intel.com \
--to=heikki.krogerus@linux.intel.com \
--cc=Adam.Thomson.Opensource@diasemi.com \
--cc=gregkh@linuxfoundation.org \
--cc=hdegoede@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pm@vger.kernel.org \
--cc=linux-usb@vger.kernel.org \
--cc=linux@roeck-us.net \
--cc=rmfrfs@gmail.com \
--cc=sre@kernel.org \
--cc=support.opensource@diasemi.com \
--cc=yueyao.zhu@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.