drivers/power/supply/cros_usbpd-charger.c
Source file repositories/reference/linux-study-clean/drivers/power/supply/cros_usbpd-charger.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/power/supply/cros_usbpd-charger.c- Extension
.c- Size
- 20104 bytes
- Lines
- 728
- Domain
- Driver Families
- Bucket
- drivers/power
- Inferred role
- Driver Families: implementation source
- Status
- source implementation candidate
Why This File Exists
Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Allocates kernel memory; connect allocation flags and lifetime to context constraints.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/mod_devicetable.hlinux/module.hlinux/platform_data/cros_ec_commands.hlinux/platform_data/cros_ec_proto.hlinux/platform_data/cros_usbpd_notify.hlinux/platform_device.hlinux/power_supply.hlinux/slab.h
Detected Declarations
struct port_datastruct charger_datafunction cros_usbpd_charger_port_is_dedicatedfunction cros_usbpd_charger_ec_commandfunction cros_usbpd_charger_get_num_portsfunction cros_usbpd_charger_get_usbpd_num_portsfunction cros_usbpd_charger_get_discovery_infofunction cros_usbpd_charger_get_power_infofunction cros_usbpd_charger_get_port_statusfunction cros_usbpd_charger_set_ext_power_limitfunction cros_usbpd_charger_power_changedfunction cros_usbpd_charger_get_propfunction cros_usbpd_charger_set_propfunction cros_usbpd_charger_property_is_writeablefunction cros_usbpd_charger_ec_eventfunction cros_usbpd_charger_unregister_notifierfunction cros_usbpd_charger_probefunction cros_usbpd_charger_resume
Annotated Snippet
struct port_data {
int port_number;
char name[CHARGER_DIR_NAME_LENGTH];
char manufacturer[CHARGER_MANUFACTURER_MODEL_LENGTH];
char model_name[CHARGER_MANUFACTURER_MODEL_LENGTH];
struct power_supply *psy;
struct power_supply_desc psy_desc;
int psy_usb_type;
int psy_online;
int psy_status;
int psy_current_max;
int psy_voltage_max_design;
int psy_voltage_now;
int psy_power_max;
struct charger_data *charger;
unsigned long last_update;
};
struct charger_data {
struct device *dev;
struct cros_ec_dev *ec_dev;
struct cros_ec_device *ec_device;
int num_charger_ports;
int num_usbpd_ports;
int num_registered_psy;
struct port_data *ports[EC_USB_PD_MAX_PORTS];
struct notifier_block notifier;
};
static enum power_supply_property cros_usbpd_charger_props[] = {
POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT,
POWER_SUPPLY_PROP_INPUT_VOLTAGE_LIMIT,
POWER_SUPPLY_PROP_ONLINE,
POWER_SUPPLY_PROP_STATUS,
POWER_SUPPLY_PROP_CURRENT_MAX,
POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN,
POWER_SUPPLY_PROP_VOLTAGE_NOW,
POWER_SUPPLY_PROP_MODEL_NAME,
POWER_SUPPLY_PROP_MANUFACTURER,
POWER_SUPPLY_PROP_USB_TYPE
};
static enum power_supply_property cros_usbpd_dedicated_charger_props[] = {
POWER_SUPPLY_PROP_ONLINE,
POWER_SUPPLY_PROP_STATUS,
POWER_SUPPLY_PROP_VOLTAGE_NOW,
};
/* Input voltage/current limit in mV/mA. Default to none. */
static u16 input_voltage_limit = EC_POWER_LIMIT_NONE;
static u16 input_current_limit = EC_POWER_LIMIT_NONE;
static bool cros_usbpd_charger_port_is_dedicated(struct port_data *port)
{
return port->port_number >= port->charger->num_usbpd_ports;
}
static int cros_usbpd_charger_ec_command(struct charger_data *charger,
unsigned int version,
unsigned int command,
void *outdata,
unsigned int outsize,
void *indata,
unsigned int insize)
{
struct cros_ec_dev *ec_dev = charger->ec_dev;
struct cros_ec_command *msg;
int ret;
msg = kzalloc_flex(*msg, data, max(outsize, insize));
if (!msg)
return -ENOMEM;
msg->version = version;
msg->command = ec_dev->cmd_offset + command;
msg->outsize = outsize;
msg->insize = insize;
if (outsize)
memcpy(msg->data, outdata, outsize);
ret = cros_ec_cmd_xfer_status(charger->ec_device, msg);
if (ret >= 0 && insize)
memcpy(indata, msg->data, insize);
kfree(msg);
return ret;
}
static int cros_usbpd_charger_get_num_ports(struct charger_data *charger)
Annotation
- Immediate include surface: `linux/mod_devicetable.h`, `linux/module.h`, `linux/platform_data/cros_ec_commands.h`, `linux/platform_data/cros_ec_proto.h`, `linux/platform_data/cros_usbpd_notify.h`, `linux/platform_device.h`, `linux/power_supply.h`, `linux/slab.h`.
- Detected declarations: `struct port_data`, `struct charger_data`, `function cros_usbpd_charger_port_is_dedicated`, `function cros_usbpd_charger_ec_command`, `function cros_usbpd_charger_get_num_ports`, `function cros_usbpd_charger_get_usbpd_num_ports`, `function cros_usbpd_charger_get_discovery_info`, `function cros_usbpd_charger_get_power_info`, `function cros_usbpd_charger_get_port_status`, `function cros_usbpd_charger_set_ext_power_limit`.
- Atlas domain: Driver Families / drivers/power.
- Implementation status: source implementation candidate.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.