Loading drivers/mfd/cros_ec_dev.c +16 −0 Original line number Diff line number Diff line Loading @@ -381,6 +381,10 @@ static const struct mfd_cell cros_ec_rtc_cells[] = { { .name = "cros-ec-rtc" } }; static const struct mfd_cell cros_usbpd_charger_cells[] = { { .name = "cros-usbpd-charger" } }; static int ec_device_probe(struct platform_device *pdev) { int retval = -ENOMEM; Loading Loading @@ -431,6 +435,18 @@ static int ec_device_probe(struct platform_device *pdev) retval); } /* Check whether this EC instance has the PD charge manager */ if (cros_ec_check_features(ec, EC_FEATURE_USB_PD)) { retval = mfd_add_devices(ec->dev, PLATFORM_DEVID_AUTO, cros_usbpd_charger_cells, ARRAY_SIZE(cros_usbpd_charger_cells), NULL, 0, NULL); if (retval) dev_err(ec->dev, "failed to add cros-usbpd-charger device: %d\n", retval); } /* Take control of the lightbar from the EC. */ lb_manual_suspend_ctrl(ec, 1); Loading include/linux/mfd/cros_ec_commands.h +128 −4 Original line number Diff line number Diff line Loading @@ -2593,14 +2593,18 @@ struct ec_params_current_limit { } __packed; /* * Set maximum external power current. * Set maximum external voltage / current. */ #define EC_CMD_EXT_POWER_CURRENT_LIMIT 0xa2 #define EC_CMD_EXTERNAL_POWER_LIMIT 0x00A2 struct ec_params_ext_power_current_limit { uint32_t limit; /* in mA */ /* Command v0 is used only on Spring and is obsolete + unsupported */ struct ec_params_external_power_limit_v1 { uint16_t current_lim; /* in mA, or EC_POWER_LIMIT_NONE to clear limit */ uint16_t voltage_lim; /* in mV, or EC_POWER_LIMIT_NONE to clear limit */ } __packed; #define EC_POWER_LIMIT_NONE 0xffff /* Inform the EC when entering a sleep state */ #define EC_CMD_HOST_SLEEP_EVENT 0xa9 Loading Loading @@ -2974,6 +2978,12 @@ enum usb_chg_type { USB_CHG_TYPE_VBUS, USB_CHG_TYPE_UNKNOWN, }; enum usb_power_roles { USB_PD_PORT_POWER_DISCONNECTED, USB_PD_PORT_POWER_SOURCE, USB_PD_PORT_POWER_SINK, USB_PD_PORT_POWER_SINK_NOT_CHARGING, }; struct usb_chg_measures { uint16_t voltage_max; Loading @@ -2991,6 +3001,120 @@ struct ec_response_usb_pd_power_info { uint32_t max_power; } __packed; struct ec_params_usb_pd_info_request { uint8_t port; } __packed; /* Read USB-PD Device discovery info */ #define EC_CMD_USB_PD_DISCOVERY 0x0113 struct ec_params_usb_pd_discovery_entry { uint16_t vid; /* USB-IF VID */ uint16_t pid; /* USB-IF PID */ uint8_t ptype; /* product type (hub,periph,cable,ama) */ } __packed; /* Override default charge behavior */ #define EC_CMD_PD_CHARGE_PORT_OVERRIDE 0x0114 /* Negative port parameters have special meaning */ enum usb_pd_override_ports { OVERRIDE_DONT_CHARGE = -2, OVERRIDE_OFF = -1, /* [0, CONFIG_USB_PD_PORT_COUNT): Port# */ }; struct ec_params_charge_port_override { int16_t override_port; /* Override port# */ } __packed; /* Read (and delete) one entry of PD event log */ #define EC_CMD_PD_GET_LOG_ENTRY 0x0115 struct ec_response_pd_log { uint32_t timestamp; /* relative timestamp in milliseconds */ uint8_t type; /* event type : see PD_EVENT_xx below */ uint8_t size_port; /* [7:5] port number [4:0] payload size in bytes */ uint16_t data; /* type-defined data payload */ uint8_t payload[0]; /* optional additional data payload: 0..16 bytes */ } __packed; /* The timestamp is the microsecond counter shifted to get about a ms. */ #define PD_LOG_TIMESTAMP_SHIFT 10 /* 1 LSB = 1024us */ #define PD_LOG_SIZE_MASK 0x1f #define PD_LOG_PORT_MASK 0xe0 #define PD_LOG_PORT_SHIFT 5 #define PD_LOG_PORT_SIZE(port, size) (((port) << PD_LOG_PORT_SHIFT) | \ ((size) & PD_LOG_SIZE_MASK)) #define PD_LOG_PORT(size_port) ((size_port) >> PD_LOG_PORT_SHIFT) #define PD_LOG_SIZE(size_port) ((size_port) & PD_LOG_SIZE_MASK) /* PD event log : entry types */ /* PD MCU events */ #define PD_EVENT_MCU_BASE 0x00 #define PD_EVENT_MCU_CHARGE (PD_EVENT_MCU_BASE+0) #define PD_EVENT_MCU_CONNECT (PD_EVENT_MCU_BASE+1) /* Reserved for custom board event */ #define PD_EVENT_MCU_BOARD_CUSTOM (PD_EVENT_MCU_BASE+2) /* PD generic accessory events */ #define PD_EVENT_ACC_BASE 0x20 #define PD_EVENT_ACC_RW_FAIL (PD_EVENT_ACC_BASE+0) #define PD_EVENT_ACC_RW_ERASE (PD_EVENT_ACC_BASE+1) /* PD power supply events */ #define PD_EVENT_PS_BASE 0x40 #define PD_EVENT_PS_FAULT (PD_EVENT_PS_BASE+0) /* PD video dongles events */ #define PD_EVENT_VIDEO_BASE 0x60 #define PD_EVENT_VIDEO_DP_MODE (PD_EVENT_VIDEO_BASE+0) #define PD_EVENT_VIDEO_CODEC (PD_EVENT_VIDEO_BASE+1) /* Returned in the "type" field, when there is no entry available */ #define PD_EVENT_NO_ENTRY 0xff /* * PD_EVENT_MCU_CHARGE event definition : * the payload is "struct usb_chg_measures" * the data field contains the port state flags as defined below : */ /* Port partner is a dual role device */ #define CHARGE_FLAGS_DUAL_ROLE BIT(15) /* Port is the pending override port */ #define CHARGE_FLAGS_DELAYED_OVERRIDE BIT(14) /* Port is the override port */ #define CHARGE_FLAGS_OVERRIDE BIT(13) /* Charger type */ #define CHARGE_FLAGS_TYPE_SHIFT 3 #define CHARGE_FLAGS_TYPE_MASK (0xf << CHARGE_FLAGS_TYPE_SHIFT) /* Power delivery role */ #define CHARGE_FLAGS_ROLE_MASK (7 << 0) /* * PD_EVENT_PS_FAULT data field flags definition : */ #define PS_FAULT_OCP 1 #define PS_FAULT_FAST_OCP 2 #define PS_FAULT_OVP 3 #define PS_FAULT_DISCH 4 /* * PD_EVENT_VIDEO_CODEC payload is "struct mcdp_info". */ struct mcdp_version { uint8_t major; uint8_t minor; uint16_t build; } __packed; struct mcdp_info { uint8_t family[2]; uint8_t chipid[2]; struct mcdp_version irom; struct mcdp_version fw; } __packed; /* struct mcdp_info field decoding */ #define MCDP_CHIPID(chipid) ((chipid[0] << 8) | chipid[1]) #define MCDP_FAMILY(family) ((family[0] << 8) | family[1]) /* Get info about USB-C SS muxes */ #define EC_CMD_USB_PD_MUX_INFO 0x11a Loading Loading
drivers/mfd/cros_ec_dev.c +16 −0 Original line number Diff line number Diff line Loading @@ -381,6 +381,10 @@ static const struct mfd_cell cros_ec_rtc_cells[] = { { .name = "cros-ec-rtc" } }; static const struct mfd_cell cros_usbpd_charger_cells[] = { { .name = "cros-usbpd-charger" } }; static int ec_device_probe(struct platform_device *pdev) { int retval = -ENOMEM; Loading Loading @@ -431,6 +435,18 @@ static int ec_device_probe(struct platform_device *pdev) retval); } /* Check whether this EC instance has the PD charge manager */ if (cros_ec_check_features(ec, EC_FEATURE_USB_PD)) { retval = mfd_add_devices(ec->dev, PLATFORM_DEVID_AUTO, cros_usbpd_charger_cells, ARRAY_SIZE(cros_usbpd_charger_cells), NULL, 0, NULL); if (retval) dev_err(ec->dev, "failed to add cros-usbpd-charger device: %d\n", retval); } /* Take control of the lightbar from the EC. */ lb_manual_suspend_ctrl(ec, 1); Loading
include/linux/mfd/cros_ec_commands.h +128 −4 Original line number Diff line number Diff line Loading @@ -2593,14 +2593,18 @@ struct ec_params_current_limit { } __packed; /* * Set maximum external power current. * Set maximum external voltage / current. */ #define EC_CMD_EXT_POWER_CURRENT_LIMIT 0xa2 #define EC_CMD_EXTERNAL_POWER_LIMIT 0x00A2 struct ec_params_ext_power_current_limit { uint32_t limit; /* in mA */ /* Command v0 is used only on Spring and is obsolete + unsupported */ struct ec_params_external_power_limit_v1 { uint16_t current_lim; /* in mA, or EC_POWER_LIMIT_NONE to clear limit */ uint16_t voltage_lim; /* in mV, or EC_POWER_LIMIT_NONE to clear limit */ } __packed; #define EC_POWER_LIMIT_NONE 0xffff /* Inform the EC when entering a sleep state */ #define EC_CMD_HOST_SLEEP_EVENT 0xa9 Loading Loading @@ -2974,6 +2978,12 @@ enum usb_chg_type { USB_CHG_TYPE_VBUS, USB_CHG_TYPE_UNKNOWN, }; enum usb_power_roles { USB_PD_PORT_POWER_DISCONNECTED, USB_PD_PORT_POWER_SOURCE, USB_PD_PORT_POWER_SINK, USB_PD_PORT_POWER_SINK_NOT_CHARGING, }; struct usb_chg_measures { uint16_t voltage_max; Loading @@ -2991,6 +3001,120 @@ struct ec_response_usb_pd_power_info { uint32_t max_power; } __packed; struct ec_params_usb_pd_info_request { uint8_t port; } __packed; /* Read USB-PD Device discovery info */ #define EC_CMD_USB_PD_DISCOVERY 0x0113 struct ec_params_usb_pd_discovery_entry { uint16_t vid; /* USB-IF VID */ uint16_t pid; /* USB-IF PID */ uint8_t ptype; /* product type (hub,periph,cable,ama) */ } __packed; /* Override default charge behavior */ #define EC_CMD_PD_CHARGE_PORT_OVERRIDE 0x0114 /* Negative port parameters have special meaning */ enum usb_pd_override_ports { OVERRIDE_DONT_CHARGE = -2, OVERRIDE_OFF = -1, /* [0, CONFIG_USB_PD_PORT_COUNT): Port# */ }; struct ec_params_charge_port_override { int16_t override_port; /* Override port# */ } __packed; /* Read (and delete) one entry of PD event log */ #define EC_CMD_PD_GET_LOG_ENTRY 0x0115 struct ec_response_pd_log { uint32_t timestamp; /* relative timestamp in milliseconds */ uint8_t type; /* event type : see PD_EVENT_xx below */ uint8_t size_port; /* [7:5] port number [4:0] payload size in bytes */ uint16_t data; /* type-defined data payload */ uint8_t payload[0]; /* optional additional data payload: 0..16 bytes */ } __packed; /* The timestamp is the microsecond counter shifted to get about a ms. */ #define PD_LOG_TIMESTAMP_SHIFT 10 /* 1 LSB = 1024us */ #define PD_LOG_SIZE_MASK 0x1f #define PD_LOG_PORT_MASK 0xe0 #define PD_LOG_PORT_SHIFT 5 #define PD_LOG_PORT_SIZE(port, size) (((port) << PD_LOG_PORT_SHIFT) | \ ((size) & PD_LOG_SIZE_MASK)) #define PD_LOG_PORT(size_port) ((size_port) >> PD_LOG_PORT_SHIFT) #define PD_LOG_SIZE(size_port) ((size_port) & PD_LOG_SIZE_MASK) /* PD event log : entry types */ /* PD MCU events */ #define PD_EVENT_MCU_BASE 0x00 #define PD_EVENT_MCU_CHARGE (PD_EVENT_MCU_BASE+0) #define PD_EVENT_MCU_CONNECT (PD_EVENT_MCU_BASE+1) /* Reserved for custom board event */ #define PD_EVENT_MCU_BOARD_CUSTOM (PD_EVENT_MCU_BASE+2) /* PD generic accessory events */ #define PD_EVENT_ACC_BASE 0x20 #define PD_EVENT_ACC_RW_FAIL (PD_EVENT_ACC_BASE+0) #define PD_EVENT_ACC_RW_ERASE (PD_EVENT_ACC_BASE+1) /* PD power supply events */ #define PD_EVENT_PS_BASE 0x40 #define PD_EVENT_PS_FAULT (PD_EVENT_PS_BASE+0) /* PD video dongles events */ #define PD_EVENT_VIDEO_BASE 0x60 #define PD_EVENT_VIDEO_DP_MODE (PD_EVENT_VIDEO_BASE+0) #define PD_EVENT_VIDEO_CODEC (PD_EVENT_VIDEO_BASE+1) /* Returned in the "type" field, when there is no entry available */ #define PD_EVENT_NO_ENTRY 0xff /* * PD_EVENT_MCU_CHARGE event definition : * the payload is "struct usb_chg_measures" * the data field contains the port state flags as defined below : */ /* Port partner is a dual role device */ #define CHARGE_FLAGS_DUAL_ROLE BIT(15) /* Port is the pending override port */ #define CHARGE_FLAGS_DELAYED_OVERRIDE BIT(14) /* Port is the override port */ #define CHARGE_FLAGS_OVERRIDE BIT(13) /* Charger type */ #define CHARGE_FLAGS_TYPE_SHIFT 3 #define CHARGE_FLAGS_TYPE_MASK (0xf << CHARGE_FLAGS_TYPE_SHIFT) /* Power delivery role */ #define CHARGE_FLAGS_ROLE_MASK (7 << 0) /* * PD_EVENT_PS_FAULT data field flags definition : */ #define PS_FAULT_OCP 1 #define PS_FAULT_FAST_OCP 2 #define PS_FAULT_OVP 3 #define PS_FAULT_DISCH 4 /* * PD_EVENT_VIDEO_CODEC payload is "struct mcdp_info". */ struct mcdp_version { uint8_t major; uint8_t minor; uint16_t build; } __packed; struct mcdp_info { uint8_t family[2]; uint8_t chipid[2]; struct mcdp_version irom; struct mcdp_version fw; } __packed; /* struct mcdp_info field decoding */ #define MCDP_CHIPID(chipid) ((chipid[0] << 8) | chipid[1]) #define MCDP_FAMILY(family) ((family[0] << 8) | family[1]) /* Get info about USB-C SS muxes */ #define EC_CMD_USB_PD_MUX_INFO 0x11a Loading