summaryrefslogtreecommitdiff
path: root/driver/bc12/max14637.c
diff options
context:
space:
mode:
Diffstat (limited to 'driver/bc12/max14637.c')
-rw-r--r--driver/bc12/max14637.c254
1 files changed, 0 insertions, 254 deletions
diff --git a/driver/bc12/max14637.c b/driver/bc12/max14637.c
deleted file mode 100644
index b2e734e1c0..0000000000
--- a/driver/bc12/max14637.c
+++ /dev/null
@@ -1,254 +0,0 @@
-/* Copyright 2017 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-/*
- * MAX14637 USB BC 1.2 Charger Detector driver.
- *
- * NOTE: The driver assumes that CHG_AL_N and SW_OPEN are not connected,
- * therefore the value of CHG_DET indicates whether the source is NOT a
- * low-power standard downstream port (SDP). In order to use higher currents,
- * the system will have to charge ramp.
- */
-
-#include "max14637.h"
-#include "charge_manager.h"
-#include "chipset.h"
-#include "common.h"
-#include "console.h"
-#include "gpio.h"
-#include "hooks.h"
-#include "power.h"
-#include "power/cannonlake.h"
-#include "task.h"
-#include "tcpm/tcpm.h"
-#include "timer.h"
-#include "usb_charge.h"
-#include "usb_pd.h"
-#include "util.h"
-
-#define CPRINTS(format, args...) cprints(CC_USBPD, format, ## args)
-
-#if defined(CONFIG_CHARGE_RAMP_SW) || defined(CONFIG_CHARGE_RAMP_HW)
-/**
- * Returns true if the charger detect pin is activated.
- *
- * @parm cfg driver for chip to read the charger detect pin for.
- * @return 1 if charger detect is activated (high when active high or
- * low with active low), otherwise 0.
- */
-static int is_chg_det_activated(const struct max14637_config_t * const cfg)
-{
- return !!gpio_get_level(cfg->chg_det_pin) ^
- !!(cfg->flags & MAX14637_FLAGS_CHG_DET_ACTIVE_LOW);
-}
-#endif
-
-/**
- * Activates the Chip Enable GPIO based on the enabled value.
- *
- * @param cfg driver for chip that will set chip enable gpio.
- * @param enable 1 to activate gpio (high for active high and low for active
- * low).
- */
-static void activate_chip_enable(
- const struct max14637_config_t * const cfg, const int enable)
-{
- gpio_set_level(
- cfg->chip_enable_pin,
- !!enable ^ !!(cfg->flags & MAX14637_FLAGS_ENABLE_ACTIVE_LOW));
-}
-
-/**
- * Update BC1.2 detected status to charge manager.
- *
- * @param port: The Type-C port where VBUS is present.
- */
-static void update_bc12_status_to_charger_manager(const int port)
-{
- const struct max14637_config_t * const cfg = &max14637_config[port];
- struct charge_port_info new_chg;
-
- new_chg.voltage = USB_CHARGER_VOLTAGE_MV;
-#if defined(CONFIG_CHARGE_RAMP_SW) || defined(CONFIG_CHARGE_RAMP_HW)
- /*
- * The driver assumes that CHG_AL_N and SW_OPEN are not connected,
- * therefore an activated CHG_DET indicates whether the source is NOT a
- * low-power standard downstream port (SDP). The system will have to
- * ramp the current to determine the limit. The Type-C spec prohibits
- * proprietary methods now, therefore 1500mA is the max.
- */
- new_chg.current = is_chg_det_activated(cfg) ? USB_CHARGER_MAX_CURR_MA :
- 500;
-#else
- /*
- * If the board doesn't support charge ramping, then assume the lowest
- * denominator; that is assume the charger detected is a weak dedicated
- * charging port (DCP) which can only supply 500mA.
- */
- new_chg.current = 500;
-#endif /* !defined(CONFIG_CHARGE_RAMP_SW && CONFIG_CHARGE_RAMP_HW) */
-
- charge_manager_update_charge(CHARGE_SUPPLIER_OTHER, port, &new_chg);
-}
-
-/**
- * Perform BC1.2 detection.
- *
- * @param port: The Type-C port where VBUS is present.
- */
-static void bc12_detect(const int port)
-{
- const struct max14637_config_t * const cfg = &max14637_config[port];
-
- /*
- * Enable the IC to begin detection and connect switches if
- * necessary. This is only necessary if the port power role is a
- * sink. If the power role is a source then just keep the max14637
- * powered on so that data switches are close. Note that the gpio enable
- * for this chip is active by default. In order to trigger bc1.2
- * detection, the chip enable must be driven low, then high again so the
- * chip will start bc1.2 client side detection. Add a 100 msec delay to
- * avoid collision with a device that might be doing bc1.2 client side
- * detection.
- */
- msleep(100);
- activate_chip_enable(cfg, 0);
- msleep(CONFIG_BC12_MAX14637_DELAY_FROM_OFF_TO_ON_MS);
- activate_chip_enable(cfg, 1);
-
-#if defined(CONFIG_CHARGE_RAMP_SW) || defined(CONFIG_CHARGE_RAMP_HW)
- /*
- * Apple or TomTom charger detection can take as long as 600ms. Wait a
- * little bit longer for margin.
- */
- msleep(630);
-#endif /* !defined(CONFIG_CHARGE_RAMP_SW && CONFIG_CHARGE_RAMP_HW) */
-}
-
-/**
- * If VBUS is present and port power role is sink, then trigger bc1.2 client
- * detection. If VBUS is not present then update charge manager. Note that both
- * chip_enable and VBUS must be active for the IC to be powered up. Chip enable
- * is kept enabled by default so that bc1.2 client detection is not triggered
- * when the port power role is source.
- *
- * @param port: Which USB Type-C port to examine.
- */
-static void detect_or_power_down_ic(const int port)
-{
- int vbus_present;
-
-#ifdef CONFIG_USB_PD_VBUS_DETECT_TCPC
- vbus_present = tcpm_check_vbus_level(port, VBUS_PRESENT);
-#else
- vbus_present = pd_snk_is_vbus_provided(port);
-#endif /* !defined(CONFIG_USB_PD_VBUS_DETECT_TCPC) */
-
- if (vbus_present) {
-#if defined(CONFIG_POWER_PP5000_CONTROL) && defined(HAS_TASK_CHIPSET)
- /* Turn on the 5V rail to allow the chip to be powered. */
- power_5v_enable(task_get_current(), 1);
-#endif
- if (pd_get_power_role(port) == PD_ROLE_SINK) {
- bc12_detect(port);
- update_bc12_status_to_charger_manager(port);
- }
- } else {
- /* Let charge manager know there's no more charge available. */
- charge_manager_update_charge(CHARGE_SUPPLIER_OTHER, port, NULL);
- /*
- * If latest attached charger is PD Adapter then it would be
- * detected as DCP and data switch of USB2.0 would be open which
- * prevents USB 2.0 data path from working later. As a result,
- * bc12_detect() is called again here and SCP would be detected
- * due to D+/D- are NC (open) if nothing is attached then data
- * switch of USB2.0 can be kept close from now on.
- */
- bc12_detect(port);
-#if defined(CONFIG_POWER_PP5000_CONTROL) && defined(HAS_TASK_CHIPSET)
- /* Issue a request to turn off the rail. */
- power_5v_enable(task_get_current(), 0);
-#endif
- }
-}
-
-static void max14637_usb_charger_task(const int port)
-{
- uint32_t evt;
- const struct max14637_config_t * const cfg = &max14637_config[port];
-
- ASSERT(port >= 0 && port < CONFIG_USB_PD_PORT_MAX_COUNT);
- /*
- * Have chip enable active as default state so data switches are closed
- * and bc1.2 client side detection is not activated when the port power
- * role is a source.
- */
- activate_chip_enable(cfg, 1);
- /* Check whether bc1.2 client mode detection needs to be triggered */
- detect_or_power_down_ic(port);
-
- while (1) {
- evt = task_wait_event(-1);
-
- if (evt & USB_CHG_EVENT_VBUS)
- detect_or_power_down_ic(port);
- }
-}
-
-#if defined(CONFIG_CHARGE_RAMP_SW) || defined(CONFIG_CHARGE_RAMP_HW)
-static int max14637_ramp_allowed(int supplier)
-{
- /*
- * Due to the limitations in the application of the MAX14637, we
- * don't quite know exactly what we're plugged into. Therefore,
- * the supplier type will be CHARGE_SUPPLIER_OTHER.
- */
- return supplier == CHARGE_SUPPLIER_OTHER;
-}
-
-static int max14637_ramp_max(int supplier, int sup_curr)
-{
- /* Use the current limit that was decided by the MAX14637. */
- if (supplier == CHARGE_SUPPLIER_OTHER)
- return sup_curr;
- else
- return 500;
-}
-#endif /* CONFIG_CHARGE_RAMP_SW || CONFIG_CHARGE_RAMP_HW */
-
-/* Called on AP S5 -> S3 and S3/S0iX -> S0 transition */
-static void bc12_chipset_startup(void)
-{
- int port;
-
- /*
- * For each port, trigger a new USB_CHG_EVENT_VBUS event to handle cases
- * where there was no change in VBUS following an AP resume/startup
- * event. If a legacy charger is connected to the port, then VBUS will
- * not drop even during the USB PD hard reset.
- */
- for (port = 0; port < CONFIG_USB_PD_PORT_MAX_COUNT; port++)
- task_set_event(USB_CHG_PORT_TO_TASK_ID(port),
- USB_CHG_EVENT_VBUS);
-}
-DECLARE_HOOK(HOOK_CHIPSET_STARTUP, bc12_chipset_startup, HOOK_PRIO_DEFAULT);
-DECLARE_HOOK(HOOK_CHIPSET_RESUME, bc12_chipset_startup, HOOK_PRIO_DEFAULT);
-
-const struct bc12_drv max14637_drv = {
- .usb_charger_task = max14637_usb_charger_task,
-#if defined(CONFIG_CHARGE_RAMP_SW) || defined(CONFIG_CHARGE_RAMP_HW)
- .ramp_allowed = max14637_ramp_allowed,
- .ramp_max = max14637_ramp_max,
-#endif /* CONFIG_CHARGE_RAMP_SW || CONFIG_CHARGE_RAMP_HW */
-};
-
-#ifdef CONFIG_BC12_SINGLE_DRIVER
-/* provide a default bc12_ports[] for backward compatibility */
-struct bc12_config bc12_ports[CHARGE_PORT_COUNT] = {
- [0 ... (CHARGE_PORT_COUNT - 1)] = {
- .drv = &max14637_drv,
- },
-};
-#endif /* CONFIG_BC12_SINGLE_DRIVER */