Update extcon next for v6.12

Detailed description for this pull request:
 - Add missing child node port on exttcon-ptn5150 binding document
 
 - Convert extcon-usb-gpio.txt to yaml format for binding document
 
 - Add new LC824206XA microUSB switch driver
  : Add a new driver for the ON Semiconductor LC824206XA microUSB switch and
    accessory detector chip. It has been tested on a Lenovo Yoga Tablet 2 Pro
    1380. And this driver is only used on x86/ACPI (non devicetree) devices,
    Therefor there is no devicetree bindings documentation.
 
 - Apply immutable branch between power_supply and extcon tree for extcon-lc824206xa.c
 -----BEGIN PGP SIGNATURE-----
 
 iQIzBAABCgAdFiEEsSpuqBtbWtRe4rLGnM3fLN7rz1MFAmbdvSIACgkQnM3fLN7r
 z1NBExAAzjHMFeyfsWr6wwiMgD7/u9zPwGontMnEiyOz8Xin4Pjtv9vVYBJ7EzVJ
 x3STJN1T7QTY//qWmxR8S7bLi/6a6+ehJDaeX2oFEah3YfUcyquflCc62J3Z7YD8
 uJncMyKVnIGTt89MDdjVLkydt4u/YysvHPanQH8RXhCyMimDHQJAamZFMrqLReW7
 O1rIfLe5Q5xu+QRD9wrQoBL4v6cr8Q/t/Byo34Kv9q3Fht5gZ8F+xAWXRNoi9qkC
 VijUdbcowgVN1BLOxUDdWW3AO8d6j3x1JCTH9wpNyMwif4htCmcFgKnMC+x3FFFM
 NaicGGsNwVqCyg67srNgvJbvzDLC+S9Vh3XyN1B2dmT4VqRyd4S1WuJmIOQpV7eL
 aRcq5JhukNXeMAciST/wfUatH3UiD+ncmg+HLb4jJGCsfTO0rk3IzoFOu2RwRhpT
 Xm/pU7bow2HTcOvHraarRHvD1NRteAs3YeZZ4jy+2bD+4QWPibn4f1WoiaqDWcZR
 IcRCCptfunW5E8TxNTvh7hjvBROrg4NHSgmOdUI/wx/13ir06mj9lE76zYeRzJl/
 D20fAAHAzRfvqi+MJdAtKU264ljMyqXc/LCIh3Vb3GC0Vv7yKxS3D6T/Xh0JGrJs
 O9rlaRYAbCDnJqwmeD38oD+jJzYqdqMStCjNXkqsx40p/FgMBxM=
 =BqOv
 -----END PGP SIGNATURE-----

Merge tag 'extcon-next-for-6.12' of ssh://gitolite.kernel.org/pub/scm/linux/kernel/git/chanwoo/extcon into char-misc-next

Chanwoo writes:

Update extcon next for v6.12

Detailed description for this pull request:
- Add missing child node port on exttcon-ptn5150 binding document

- Convert extcon-usb-gpio.txt to yaml format for binding document

- Add new LC824206XA microUSB switch driver
 : Add a new driver for the ON Semiconductor LC824206XA microUSB switch and
   accessory detector chip. It has been tested on a Lenovo Yoga Tablet 2 Pro
   1380. And this driver is only used on x86/ACPI (non devicetree) devices,
   Therefor there is no devicetree bindings documentation.

- Apply immutable branch between power_supply and extcon tree for extcon-lc824206xa.c

* tag 'extcon-next-for-6.12' of ssh://gitolite.kernel.org/pub/scm/linux/kernel/git/chanwoo/extcon:
  extcon: lc824206xa: Fix build error of POWER_SUPPLY_PROP_USB_TYPE
  dt-bindings: extcon: convert extcon-usb-gpio.txt to yaml format
  dt-bindings: extcon: ptn5150: add child node port
  extcon: Add LC824206XA microUSB switch driver
  power: supply: Change usb_types from an array into a bitmask
  power: supply: sysfs: Move power_supply_show_enum_with_available() up
  power: supply: sysfs: Add power_supply_show_enum_with_available() helper
  power: supply: rt9467-charger: Remove "usb_type" property write support
  power: supply: ucs1002: Adjust ucs1002_set_usb_type() to accept string values
  power: supply: "usb_type" property may be written to
This commit is contained in:
Greg Kroah-Hartman 2024-09-08 17:48:12 +02:00
commit 72486eb13b
31 changed files with 687 additions and 275 deletions

View File

@ -592,7 +592,12 @@ Description:
the supply, for example it can show if USB-PD capable source
is attached.
Access: Read-Only
Access: For power-supplies which consume USB power such
as battery charger chips, this indicates the type of
the connected USB power source and is Read-Only.
For power-supplies which act as a USB power-source such as
e.g. the UCS1002 USB Port Power Controller this is writable.
Valid values:
"Unknown", "SDP", "DCP", "CDP", "ACA", "C", "PD",

View File

@ -37,6 +37,11 @@ properties:
GPIO pin (output) used to control VBUS. If skipped, no such control
takes place.
port:
$ref: /schemas/graph.yaml#/properties/port
description:
A port node to link the usb controller for the dual role switch.
required:
- compatible
- interrupts
@ -58,5 +63,11 @@ examples:
interrupt-parent = <&msmgpio>;
interrupts = <78 IRQ_TYPE_LEVEL_HIGH>;
vbus-gpios = <&msmgpio 148 GPIO_ACTIVE_HIGH>;
port {
endpoint {
remote-endpoint = <&usb1_drd_sw>;
};
};
};
};

View File

@ -1,21 +0,0 @@
USB GPIO Extcon device
This is a virtual device used to generate USB cable states from the USB ID pin
connected to a GPIO pin.
Required properties:
- compatible: Should be "linux,extcon-usb-gpio"
Either one of id-gpio or vbus-gpio must be present. Both can be present as well.
- id-gpio: gpio for USB ID pin. See gpio binding.
- vbus-gpio: gpio for USB VBUS pin.
Example: Examples of extcon-usb-gpio node in dra7-evm.dts as listed below:
extcon_usb1 {
compatible = "linux,extcon-usb-gpio";
id-gpio = <&gpio6 1 GPIO_ACTIVE_HIGH>;
}
&omap_dwc3_1 {
extcon = <&extcon_usb1>;
};

View File

@ -0,0 +1,37 @@
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
%YAML 1.2
---
$id: http://devicetree.org/schemas/extcon/linux,extcon-usb-gpio.yaml#
$schema: http://devicetree.org/meta-schemas/core.yaml#
title: USB GPIO Extcon device
maintainers:
- Frank Li <Frank.Li@nxp.com>
description:
This is a virtual device used to generate USB cable states from the USB ID pin
connected to a GPIO pin.
properties:
compatible:
const: linux,extcon-usb-gpio
id-gpios:
description: gpio for USB ID pin. See gpio binding.
vbus-gpios:
description: gpio for USB VBUS pin.
required:
- compatible
additionalProperties: false
examples:
- |
#include <dt-bindings/gpio/gpio.h>
extcon_usb1 {
compatible = "linux,extcon-usb-gpio";
id-gpios = <&gpio6 1 GPIO_ACTIVE_HIGH>;
};

View File

@ -75,6 +75,17 @@ config EXTCON_INTEL_MRFLD
Say Y here to enable extcon support for charger detection / control
on the Intel Merrifield Basin Cove PMIC.
config EXTCON_LC824206XA
tristate "LC824206XA extcon Support"
depends on I2C
depends on POWER_SUPPLY
help
Say Y here to enable support for the ON Semiconductor LC824206XA
microUSB switch and accessory detector chip. The LC824206XA is a USB
port accessory detector and switch. The LC824206XA is fully controlled
using I2C and enables USB data, stereo and mono audio, video,
microphone and UART data to use a common connector port.
config EXTCON_MAX14577
tristate "Maxim MAX14577/77836 EXTCON Support"
depends on MFD_MAX14577

View File

@ -12,6 +12,7 @@ obj-$(CONFIG_EXTCON_GPIO) += extcon-gpio.o
obj-$(CONFIG_EXTCON_INTEL_INT3496) += extcon-intel-int3496.o
obj-$(CONFIG_EXTCON_INTEL_CHT_WC) += extcon-intel-cht-wc.o
obj-$(CONFIG_EXTCON_INTEL_MRFLD) += extcon-intel-mrfld.o
obj-$(CONFIG_EXTCON_LC824206XA) += extcon-lc824206xa.o
obj-$(CONFIG_EXTCON_MAX14577) += extcon-max14577.o
obj-$(CONFIG_EXTCON_MAX3355) += extcon-max3355.o
obj-$(CONFIG_EXTCON_MAX77693) += extcon-max77693.o

View File

@ -461,14 +461,6 @@ static int cht_wc_extcon_psy_get_prop(struct power_supply *psy,
return 0;
}
static const enum power_supply_usb_type cht_wc_extcon_psy_usb_types[] = {
POWER_SUPPLY_USB_TYPE_SDP,
POWER_SUPPLY_USB_TYPE_CDP,
POWER_SUPPLY_USB_TYPE_DCP,
POWER_SUPPLY_USB_TYPE_ACA,
POWER_SUPPLY_USB_TYPE_UNKNOWN,
};
static const enum power_supply_property cht_wc_extcon_psy_props[] = {
POWER_SUPPLY_PROP_USB_TYPE,
POWER_SUPPLY_PROP_ONLINE,
@ -477,8 +469,11 @@ static const enum power_supply_property cht_wc_extcon_psy_props[] = {
static const struct power_supply_desc cht_wc_extcon_psy_desc = {
.name = "cht_wcove_pwrsrc",
.type = POWER_SUPPLY_TYPE_USB,
.usb_types = cht_wc_extcon_psy_usb_types,
.num_usb_types = ARRAY_SIZE(cht_wc_extcon_psy_usb_types),
.usb_types = BIT(POWER_SUPPLY_USB_TYPE_SDP) |
BIT(POWER_SUPPLY_USB_TYPE_CDP) |
BIT(POWER_SUPPLY_USB_TYPE_DCP) |
BIT(POWER_SUPPLY_USB_TYPE_ACA) |
BIT(POWER_SUPPLY_USB_TYPE_UNKNOWN),
.properties = cht_wc_extcon_psy_props,
.num_properties = ARRAY_SIZE(cht_wc_extcon_psy_props),
.get_property = cht_wc_extcon_psy_get_prop,

View File

@ -0,0 +1,495 @@
// SPDX-License-Identifier: GPL-2.0-or-later
/*
* ON Semiconductor LC824206XA Micro USB Switch driver
*
* Copyright (c) 2024 Hans de Goede <hansg@kernel.org>
*
* ON Semiconductor has an "Advance Information" datasheet available
* (ENA2222-D.PDF), but no full datasheet. So there is no documentation
* available for the registers.
*
* This driver is based on the register info from the extcon-fsa9285.c driver,
* from the Lollipop Android sources for the Lenovo Yoga Tablet 2 (Pro)
* 830 / 1050 / 1380 models. Note despite the name this is actually a driver
* for the LC824206XA not the FSA9285. The Android sources can be downloaded
* from Lenovo's support page for these tablets, filename:
* yoga_tab_2_osc_android_to_lollipop_201505.rar.
*/
#include <linux/bits.h>
#include <linux/delay.h>
#include <linux/device.h>
#include <linux/extcon-provider.h>
#include <linux/i2c.h>
#include <linux/interrupt.h>
#include <linux/module.h>
#include <linux/power_supply.h>
#include <linux/property.h>
#include <linux/regulator/consumer.h>
#include <linux/workqueue.h>
/*
* Register defines as mentioned above there is no datasheet with register
* info, so this may not be 100% accurate.
*/
#define REG00 0x00
#define REG00_INIT_VALUE 0x01
#define REG_STATUS 0x01
#define STATUS_OVP BIT(0)
#define STATUS_DATA_SHORT BIT(1)
#define STATUS_VBUS_PRESENT BIT(2)
#define STATUS_USB_ID GENMASK(7, 3)
#define STATUS_USB_ID_GND 0x80
#define STATUS_USB_ID_ACA 0xf0
#define STATUS_USB_ID_FLOAT 0xf8
/*
* This controls the DP/DM muxes + other switches,
* meaning of individual bits is unknown.
*/
#define REG_SWITCH_CONTROL 0x02
#define SWITCH_STEREO_MIC 0xc8
#define SWITCH_USB_HOST 0xec
#define SWITCH_DISCONNECTED 0xf8
#define SWITCH_USB_DEVICE 0xfc
/* 5 bits? ADC 0x10 GND, 0x1a-0x1f ACA, 0x1f float */
#define REG_ID_PIN_ADC_VALUE 0x03
/* Masks for all 3 interrupt registers */
#define INTR_ID_PIN_CHANGE BIT(0)
#define INTR_VBUS_CHANGE BIT(1)
/* Both of these get set after a continuous mode ADC conversion */
#define INTR_ID_PIN_ADC_INT1 BIT(2)
#define INTR_ID_PIN_ADC_INT2 BIT(3)
/* Charger type available in reg 0x09 */
#define INTR_CHARGER_DET_DONE BIT(4)
#define INTR_OVP BIT(5)
/* There are 7 interrupt sources, bit 6 use is unknown (OCP?) */
#define INTR_ALL GENMASK(6, 0)
/* Unmask interrupts this driver cares about */
#define INTR_MASK \
(INTR_ALL & ~(INTR_ID_PIN_CHANGE | INTR_VBUS_CHANGE | INTR_CHARGER_DET_DONE))
/* Active (event happened and not cleared yet) interrupts */
#define REG_INTR_STATUS 0x04
/*
* Writing a 1 to a bit here clears it in INTR_STATUS. These bits do NOT
* auto-reset to 0, so these must be set to 0 manually after clearing.
*/
#define REG_INTR_CLEAR 0x05
/* Interrupts which bit is set to 1 here will not raise the HW IRQ */
#define REG_INTR_MASK 0x06
/* ID pin ADC control, meaning of individual bits is unknown */
#define REG_ID_PIN_ADC_CTRL 0x07
#define ID_PIN_ADC_AUTO 0x40
#define ID_PIN_ADC_CONTINUOUS 0x44
#define REG_CHARGER_DET 0x08
#define CHARGER_DET_ON BIT(0)
#define CHARGER_DET_CDP_ON BIT(1)
#define CHARGER_DET_CDP_VAL BIT(2)
#define REG_CHARGER_TYPE 0x09
#define CHARGER_TYPE_UNKNOWN 0x00
#define CHARGER_TYPE_DCP 0x01
#define CHARGER_TYPE_SDP_OR_CDP 0x04
#define CHARGER_TYPE_QC 0x06
#define REG10 0x10
#define REG10_INIT_VALUE 0x00
struct lc824206xa_data {
struct work_struct work;
struct i2c_client *client;
struct extcon_dev *edev;
struct power_supply *psy;
struct regulator *vbus_boost;
unsigned int usb_type;
unsigned int cable;
unsigned int previous_cable;
u8 switch_control;
u8 previous_switch_control;
bool vbus_ok;
bool vbus_boost_enabled;
bool fastcharge_over_miclr;
};
static const unsigned int lc824206xa_cables[] = {
EXTCON_USB_HOST,
EXTCON_CHG_USB_SDP,
EXTCON_CHG_USB_CDP,
EXTCON_CHG_USB_DCP,
EXTCON_CHG_USB_ACA,
EXTCON_CHG_USB_FAST,
EXTCON_NONE,
};
/* read/write reg helpers to add error logging to smbus byte functions */
static int lc824206xa_read_reg(struct lc824206xa_data *data, u8 reg)
{
int ret;
ret = i2c_smbus_read_byte_data(data->client, reg);
if (ret < 0)
dev_err(&data->client->dev, "Error %d reading reg 0x%02x\n", ret, reg);
return ret;
}
static int lc824206xa_write_reg(struct lc824206xa_data *data, u8 reg, u8 val)
{
int ret;
ret = i2c_smbus_write_byte_data(data->client, reg, val);
if (ret < 0)
dev_err(&data->client->dev, "Error %d writing reg 0x%02x\n", ret, reg);
return ret;
}
static int lc824206xa_get_id(struct lc824206xa_data *data)
{
int ret;
ret = lc824206xa_write_reg(data, REG_ID_PIN_ADC_CTRL, ID_PIN_ADC_CONTINUOUS);
if (ret)
return ret;
ret = lc824206xa_read_reg(data, REG_ID_PIN_ADC_VALUE);
lc824206xa_write_reg(data, REG_ID_PIN_ADC_CTRL, ID_PIN_ADC_AUTO);
return ret;
}
static void lc824206xa_set_vbus_boost(struct lc824206xa_data *data, bool enable)
{
int ret;
if (data->vbus_boost_enabled == enable)
return;
if (enable)
ret = regulator_enable(data->vbus_boost);
else
ret = regulator_disable(data->vbus_boost);
if (ret == 0)
data->vbus_boost_enabled = enable;
else
dev_err(&data->client->dev, "Error updating Vbus boost regulator: %d\n", ret);
}
static void lc824206xa_charger_detect(struct lc824206xa_data *data)
{
int charger_type, ret;
charger_type = lc824206xa_read_reg(data, REG_CHARGER_TYPE);
if (charger_type < 0)
return;
dev_dbg(&data->client->dev, "charger type 0x%02x\n", charger_type);
switch (charger_type) {
case CHARGER_TYPE_UNKNOWN:
data->usb_type = POWER_SUPPLY_USB_TYPE_UNKNOWN;
/* Treat as SDP */
data->cable = EXTCON_CHG_USB_SDP;
data->switch_control = SWITCH_USB_DEVICE;
break;
case CHARGER_TYPE_SDP_OR_CDP:
data->usb_type = POWER_SUPPLY_USB_TYPE_SDP;
data->cable = EXTCON_CHG_USB_SDP;
data->switch_control = SWITCH_USB_DEVICE;
ret = lc824206xa_write_reg(data, REG_CHARGER_DET,
CHARGER_DET_CDP_ON | CHARGER_DET_ON);
if (ret < 0)
break;
msleep(100);
ret = lc824206xa_read_reg(data, REG_CHARGER_DET);
if (ret >= 0 && (ret & CHARGER_DET_CDP_VAL)) {
data->usb_type = POWER_SUPPLY_USB_TYPE_CDP;
data->cable = EXTCON_CHG_USB_CDP;
}
lc824206xa_write_reg(data, REG_CHARGER_DET, CHARGER_DET_ON);
break;
case CHARGER_TYPE_DCP:
data->usb_type = POWER_SUPPLY_USB_TYPE_DCP;
data->cable = EXTCON_CHG_USB_DCP;
if (data->fastcharge_over_miclr)
data->switch_control = SWITCH_STEREO_MIC;
else
data->switch_control = SWITCH_DISCONNECTED;
break;
case CHARGER_TYPE_QC:
data->usb_type = POWER_SUPPLY_USB_TYPE_DCP;
data->cable = EXTCON_CHG_USB_DCP;
data->switch_control = SWITCH_DISCONNECTED;
break;
default:
dev_warn(&data->client->dev, "Unknown charger type: 0x%02x\n", charger_type);
break;
}
}
static void lc824206xa_work(struct work_struct *work)
{
struct lc824206xa_data *data = container_of(work, struct lc824206xa_data, work);
bool vbus_boost_enable = false;
int status, id;
status = lc824206xa_read_reg(data, REG_STATUS);
if (status < 0)
return;
dev_dbg(&data->client->dev, "status 0x%02x\n", status);
data->vbus_ok = (status & (STATUS_VBUS_PRESENT | STATUS_OVP)) == STATUS_VBUS_PRESENT;
/* Read id pin ADC if necessary */
switch (status & STATUS_USB_ID) {
case STATUS_USB_ID_GND:
case STATUS_USB_ID_FLOAT:
break;
default:
/* Happens when the connector is inserted slowly, log at dbg level */
dev_dbg(&data->client->dev, "Unknown status 0x%02x\n", status);
fallthrough;
case STATUS_USB_ID_ACA:
id = lc824206xa_get_id(data);
dev_dbg(&data->client->dev, "RID 0x%02x\n", id);
switch (id) {
case 0x10:
status = STATUS_USB_ID_GND;
break;
case 0x18 ... 0x1e:
status = STATUS_USB_ID_ACA;
break;
case 0x1f:
status = STATUS_USB_ID_FLOAT;
break;
default:
dev_warn(&data->client->dev, "Unknown RID 0x%02x\n", id);
return;
}
}
/* Check for out of spec OTG charging hubs, treat as ACA */
if ((status & STATUS_USB_ID) == STATUS_USB_ID_GND &&
data->vbus_ok && !data->vbus_boost_enabled) {
dev_info(&data->client->dev, "Out of spec USB host adapter with Vbus present, not enabling 5V output\n");
status = STATUS_USB_ID_ACA;
}
switch (status & STATUS_USB_ID) {
case STATUS_USB_ID_ACA:
data->usb_type = POWER_SUPPLY_USB_TYPE_ACA;
data->cable = EXTCON_CHG_USB_ACA;
data->switch_control = SWITCH_USB_HOST;
break;
case STATUS_USB_ID_GND:
data->usb_type = POWER_SUPPLY_USB_TYPE_UNKNOWN;
data->cable = EXTCON_USB_HOST;
data->switch_control = SWITCH_USB_HOST;
vbus_boost_enable = true;
break;
case STATUS_USB_ID_FLOAT:
/* When fast charging with Vbus > 5V, OVP will be set */
if (data->fastcharge_over_miclr &&
data->switch_control == SWITCH_STEREO_MIC &&
(status & STATUS_OVP)) {
data->cable = EXTCON_CHG_USB_FAST;
break;
}
if (data->vbus_ok) {
lc824206xa_charger_detect(data);
} else {
data->usb_type = POWER_SUPPLY_USB_TYPE_UNKNOWN;
data->cable = EXTCON_NONE;
data->switch_control = SWITCH_DISCONNECTED;
}
break;
}
lc824206xa_set_vbus_boost(data, vbus_boost_enable);
if (data->switch_control != data->previous_switch_control) {
lc824206xa_write_reg(data, REG_SWITCH_CONTROL, data->switch_control);
data->previous_switch_control = data->switch_control;
}
if (data->cable != data->previous_cable) {
extcon_set_state_sync(data->edev, data->previous_cable, false);
extcon_set_state_sync(data->edev, data->cable, true);
data->previous_cable = data->cable;
}
power_supply_changed(data->psy);
}
static irqreturn_t lc824206xa_irq(int irq, void *_data)
{
struct lc824206xa_data *data = _data;
int intr_status;
intr_status = lc824206xa_read_reg(data, REG_INTR_STATUS);
if (intr_status < 0)
intr_status = INTR_ALL; /* Should never happen, clear all */
dev_dbg(&data->client->dev, "interrupt 0x%02x\n", intr_status);
lc824206xa_write_reg(data, REG_INTR_CLEAR, intr_status);
lc824206xa_write_reg(data, REG_INTR_CLEAR, 0);
schedule_work(&data->work);
return IRQ_HANDLED;
}
/*
* Newer charger (power_supply) drivers expect the max input current to be
* provided by a parent power_supply device for the charger chip.
*/
static int lc824206xa_psy_get_prop(struct power_supply *psy,
enum power_supply_property psp,
union power_supply_propval *val)
{
struct lc824206xa_data *data = power_supply_get_drvdata(psy);
switch (psp) {
case POWER_SUPPLY_PROP_ONLINE:
val->intval = data->vbus_ok && !data->vbus_boost_enabled;
break;
case POWER_SUPPLY_PROP_USB_TYPE:
val->intval = data->usb_type;
break;
case POWER_SUPPLY_PROP_CURRENT_MAX:
switch (data->usb_type) {
case POWER_SUPPLY_USB_TYPE_DCP:
case POWER_SUPPLY_USB_TYPE_ACA:
val->intval = 2000000;
break;
case POWER_SUPPLY_USB_TYPE_CDP:
val->intval = 1500000;
break;
default:
val->intval = 500000;
}
break;
default:
return -EINVAL;
}
return 0;
}
static const enum power_supply_property lc824206xa_psy_props[] = {
POWER_SUPPLY_PROP_ONLINE,
POWER_SUPPLY_PROP_USB_TYPE,
POWER_SUPPLY_PROP_CURRENT_MAX,
};
static const struct power_supply_desc lc824206xa_psy_desc = {
.name = "lc824206xa-charger-detect",
.type = POWER_SUPPLY_TYPE_USB,
.usb_types = BIT(POWER_SUPPLY_USB_TYPE_SDP) |
BIT(POWER_SUPPLY_USB_TYPE_CDP) |
BIT(POWER_SUPPLY_USB_TYPE_DCP) |
BIT(POWER_SUPPLY_USB_TYPE_ACA) |
BIT(POWER_SUPPLY_USB_TYPE_UNKNOWN),
.properties = lc824206xa_psy_props,
.num_properties = ARRAY_SIZE(lc824206xa_psy_props),
.get_property = lc824206xa_psy_get_prop,
};
static int lc824206xa_probe(struct i2c_client *client)
{
struct power_supply_config psy_cfg = { };
struct device *dev = &client->dev;
struct lc824206xa_data *data;
int ret;
data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL);
if (!data)
return -ENOMEM;
data->client = client;
INIT_WORK(&data->work, lc824206xa_work);
data->cable = EXTCON_NONE;
data->previous_cable = EXTCON_NONE;
data->usb_type = POWER_SUPPLY_USB_TYPE_UNKNOWN;
/* Some designs use a custom fast-charge protocol over the mic L/R inputs */
data->fastcharge_over_miclr =
device_property_read_bool(dev, "onnn,enable-miclr-for-dcp");
data->vbus_boost = devm_regulator_get(dev, "vbus");
if (IS_ERR(data->vbus_boost))
return dev_err_probe(dev, PTR_ERR(data->vbus_boost),
"getting regulator\n");
/* Init */
ret = lc824206xa_write_reg(data, REG00, REG00_INIT_VALUE);
ret |= lc824206xa_write_reg(data, REG10, REG10_INIT_VALUE);
msleep(100);
ret |= lc824206xa_write_reg(data, REG_INTR_CLEAR, INTR_ALL);
ret |= lc824206xa_write_reg(data, REG_INTR_CLEAR, 0);
ret |= lc824206xa_write_reg(data, REG_INTR_MASK, INTR_MASK);
ret |= lc824206xa_write_reg(data, REG_ID_PIN_ADC_CTRL, ID_PIN_ADC_AUTO);
ret |= lc824206xa_write_reg(data, REG_CHARGER_DET, CHARGER_DET_ON);
if (ret)
return -EIO;
/* Initialize extcon device */
data->edev = devm_extcon_dev_allocate(dev, lc824206xa_cables);
if (IS_ERR(data->edev))
return PTR_ERR(data->edev);
ret = devm_extcon_dev_register(dev, data->edev);
if (ret)
return dev_err_probe(dev, ret, "registering extcon device\n");
psy_cfg.drv_data = data;
data->psy = devm_power_supply_register(dev, &lc824206xa_psy_desc, &psy_cfg);
if (IS_ERR(data->psy))
return dev_err_probe(dev, PTR_ERR(data->psy), "registering power supply\n");
ret = devm_request_threaded_irq(dev, client->irq, NULL, lc824206xa_irq,
IRQF_TRIGGER_LOW | IRQF_ONESHOT,
KBUILD_MODNAME, data);
if (ret)
return dev_err_probe(dev, ret, "requesting IRQ\n");
/* Sync initial state */
schedule_work(&data->work);
return 0;
}
static const struct i2c_device_id lc824206xa_i2c_ids[] = {
{ "lc824206xa" },
{ }
};
MODULE_DEVICE_TABLE(i2c, lc824206xa_i2c_ids);
static struct i2c_driver lc824206xa_driver = {
.driver = {
.name = KBUILD_MODNAME,
},
.probe = lc824206xa_probe,
.id_table = lc824206xa_i2c_ids,
};
module_i2c_driver(lc824206xa_driver);
MODULE_AUTHOR("Hans de Goede <hansg@kernel.org>");
MODULE_DESCRIPTION("LC824206XA Micro USB Switch driver");
MODULE_LICENSE("GPL");

View File

@ -411,12 +411,6 @@ static int tusb1210_psy_get_prop(struct power_supply *psy,
return 0;
}
static const enum power_supply_usb_type tusb1210_psy_usb_types[] = {
POWER_SUPPLY_USB_TYPE_SDP,
POWER_SUPPLY_USB_TYPE_DCP,
POWER_SUPPLY_USB_TYPE_UNKNOWN,
};
static const enum power_supply_property tusb1210_psy_props[] = {
POWER_SUPPLY_PROP_ONLINE,
POWER_SUPPLY_PROP_USB_TYPE,
@ -426,8 +420,9 @@ static const enum power_supply_property tusb1210_psy_props[] = {
static const struct power_supply_desc tusb1210_psy_desc = {
.name = "tusb1211-charger-detect",
.type = POWER_SUPPLY_TYPE_USB,
.usb_types = tusb1210_psy_usb_types,
.num_usb_types = ARRAY_SIZE(tusb1210_psy_usb_types),
.usb_types = BIT(POWER_SUPPLY_USB_TYPE_SDP) |
BIT(POWER_SUPPLY_USB_TYPE_DCP) |
BIT(POWER_SUPPLY_USB_TYPE_UNKNOWN),
.properties = tusb1210_psy_props,
.num_properties = ARRAY_SIZE(tusb1210_psy_props),
.get_property = tusb1210_psy_get_prop,

View File

@ -412,13 +412,6 @@ static enum power_supply_property axp813_usb_power_properties[] = {
POWER_SUPPLY_PROP_USB_TYPE,
};
static enum power_supply_usb_type axp813_usb_types[] = {
POWER_SUPPLY_USB_TYPE_SDP,
POWER_SUPPLY_USB_TYPE_DCP,
POWER_SUPPLY_USB_TYPE_CDP,
POWER_SUPPLY_USB_TYPE_UNKNOWN,
};
static const struct power_supply_desc axp20x_usb_power_desc = {
.name = "axp20x-usb",
.type = POWER_SUPPLY_TYPE_USB,
@ -447,8 +440,10 @@ static const struct power_supply_desc axp813_usb_power_desc = {
.property_is_writeable = axp20x_usb_power_prop_writeable,
.get_property = axp20x_usb_power_get_property,
.set_property = axp20x_usb_power_set_property,
.usb_types = axp813_usb_types,
.num_usb_types = ARRAY_SIZE(axp813_usb_types),
.usb_types = BIT(POWER_SUPPLY_USB_TYPE_SDP) |
BIT(POWER_SUPPLY_USB_TYPE_CDP) |
BIT(POWER_SUPPLY_USB_TYPE_DCP) |
BIT(POWER_SUPPLY_USB_TYPE_UNKNOWN),
};
static const char * const axp20x_irq_names[] = {

View File

@ -334,14 +334,6 @@ static const int bq25618_619_ichg_values[] = {
1290000, 1360000, 1430000, 1500000
};
static enum power_supply_usb_type bq256xx_usb_type[] = {
POWER_SUPPLY_USB_TYPE_SDP,
POWER_SUPPLY_USB_TYPE_CDP,
POWER_SUPPLY_USB_TYPE_DCP,
POWER_SUPPLY_USB_TYPE_UNKNOWN,
POWER_SUPPLY_USB_TYPE_ACA,
};
static int bq256xx_array_parse(int array_size, int val, const int array[])
{
int i = 0;
@ -1252,8 +1244,11 @@ static int bq256xx_property_is_writeable(struct power_supply *psy,
static const struct power_supply_desc bq256xx_power_supply_desc = {
.name = "bq256xx-charger",
.type = POWER_SUPPLY_TYPE_USB,
.usb_types = bq256xx_usb_type,
.num_usb_types = ARRAY_SIZE(bq256xx_usb_type),
.usb_types = BIT(POWER_SUPPLY_USB_TYPE_SDP) |
BIT(POWER_SUPPLY_USB_TYPE_CDP) |
BIT(POWER_SUPPLY_USB_TYPE_DCP) |
BIT(POWER_SUPPLY_USB_TYPE_ACA) |
BIT(POWER_SUPPLY_USB_TYPE_UNKNOWN),
.properties = bq256xx_power_supply_props,
.num_properties = ARRAY_SIZE(bq256xx_power_supply_props),
.get_property = bq256xx_get_charger_property,

View File

@ -73,17 +73,6 @@ static enum power_supply_property cros_usbpd_dedicated_charger_props[] = {
POWER_SUPPLY_PROP_VOLTAGE_NOW,
};
static enum power_supply_usb_type cros_usbpd_charger_usb_types[] = {
POWER_SUPPLY_USB_TYPE_UNKNOWN,
POWER_SUPPLY_USB_TYPE_SDP,
POWER_SUPPLY_USB_TYPE_DCP,
POWER_SUPPLY_USB_TYPE_CDP,
POWER_SUPPLY_USB_TYPE_C,
POWER_SUPPLY_USB_TYPE_PD,
POWER_SUPPLY_USB_TYPE_PD_DRP,
POWER_SUPPLY_USB_TYPE_APPLE_BRICK_ID
};
/* 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;
@ -643,9 +632,14 @@ static int cros_usbpd_charger_probe(struct platform_device *pd)
psy_desc->properties = cros_usbpd_charger_props;
psy_desc->num_properties =
ARRAY_SIZE(cros_usbpd_charger_props);
psy_desc->usb_types = cros_usbpd_charger_usb_types;
psy_desc->num_usb_types =
ARRAY_SIZE(cros_usbpd_charger_usb_types);
psy_desc->usb_types = BIT(POWER_SUPPLY_USB_TYPE_UNKNOWN) |
BIT(POWER_SUPPLY_USB_TYPE_SDP) |
BIT(POWER_SUPPLY_USB_TYPE_DCP) |
BIT(POWER_SUPPLY_USB_TYPE_CDP) |
BIT(POWER_SUPPLY_USB_TYPE_C) |
BIT(POWER_SUPPLY_USB_TYPE_PD) |
BIT(POWER_SUPPLY_USB_TYPE_PD_DRP) |
BIT(POWER_SUPPLY_USB_TYPE_APPLE_BRICK_ID);
}
psy_desc->name = port->name;

View File

@ -353,15 +353,10 @@ static enum power_supply_property yoga_c630_psy_adpt_properties[] = {
POWER_SUPPLY_PROP_USB_TYPE,
};
static const enum power_supply_usb_type yoga_c630_psy_adpt_usb_type[] = {
POWER_SUPPLY_USB_TYPE_C,
};
static const struct power_supply_desc yoga_c630_psy_adpt_psy_desc = {
.name = "yoga-c630-adapter",
.type = POWER_SUPPLY_TYPE_USB,
.usb_types = yoga_c630_psy_adpt_usb_type,
.num_usb_types = ARRAY_SIZE(yoga_c630_psy_adpt_usb_type),
.usb_types = BIT(POWER_SUPPLY_USB_TYPE_C),
.properties = yoga_c630_psy_adpt_properties,
.num_properties = ARRAY_SIZE(yoga_c630_psy_adpt_properties),
.get_property = yoga_c630_psy_adpt_get_property,

View File

@ -94,14 +94,6 @@ struct mp2629_prop {
int shift;
};
static enum power_supply_usb_type mp2629_usb_types[] = {
POWER_SUPPLY_USB_TYPE_SDP,
POWER_SUPPLY_USB_TYPE_DCP,
POWER_SUPPLY_USB_TYPE_CDP,
POWER_SUPPLY_USB_TYPE_PD_DRP,
POWER_SUPPLY_USB_TYPE_UNKNOWN
};
static enum power_supply_property mp2629_charger_usb_props[] = {
POWER_SUPPLY_PROP_ONLINE,
POWER_SUPPLY_PROP_USB_TYPE,
@ -487,8 +479,11 @@ unlock:
static const struct power_supply_desc mp2629_usb_desc = {
.name = "mp2629_usb",
.type = POWER_SUPPLY_TYPE_USB,
.usb_types = mp2629_usb_types,
.num_usb_types = ARRAY_SIZE(mp2629_usb_types),
.usb_types = BIT(POWER_SUPPLY_USB_TYPE_SDP) |
BIT(POWER_SUPPLY_USB_TYPE_CDP) |
BIT(POWER_SUPPLY_USB_TYPE_DCP) |
BIT(POWER_SUPPLY_USB_TYPE_PD_DRP) |
BIT(POWER_SUPPLY_USB_TYPE_UNKNOWN),
.properties = mp2629_charger_usb_props,
.num_properties = ARRAY_SIZE(mp2629_charger_usb_props),
.get_property = mp2629_charger_usb_get_prop,

View File

@ -154,13 +154,6 @@ enum mt6360_pmu_chg_type {
MT6360_CHG_TYPE_MAX,
};
static enum power_supply_usb_type mt6360_charger_usb_types[] = {
POWER_SUPPLY_USB_TYPE_UNKNOWN,
POWER_SUPPLY_USB_TYPE_SDP,
POWER_SUPPLY_USB_TYPE_DCP,
POWER_SUPPLY_USB_TYPE_CDP,
};
static int mt6360_get_chrdet_ext_stat(struct mt6360_chg_info *mci,
bool *pwr_rdy)
{
@ -574,8 +567,10 @@ static const struct power_supply_desc mt6360_charger_desc = {
.get_property = mt6360_charger_get_property,
.set_property = mt6360_charger_set_property,
.property_is_writeable = mt6360_charger_property_is_writeable,
.usb_types = mt6360_charger_usb_types,
.num_usb_types = ARRAY_SIZE(mt6360_charger_usb_types),
.usb_types = BIT(POWER_SUPPLY_USB_TYPE_SDP) |
BIT(POWER_SUPPLY_USB_TYPE_CDP) |
BIT(POWER_SUPPLY_USB_TYPE_DCP) |
BIT(POWER_SUPPLY_USB_TYPE_UNKNOWN),
};
static const struct regulator_ops mt6360_chg_otg_ops = {

View File

@ -624,13 +624,6 @@ static enum power_supply_property mt6370_chg_properties[] = {
POWER_SUPPLY_PROP_USB_TYPE,
};
static enum power_supply_usb_type mt6370_chg_usb_types[] = {
POWER_SUPPLY_USB_TYPE_UNKNOWN,
POWER_SUPPLY_USB_TYPE_SDP,
POWER_SUPPLY_USB_TYPE_CDP,
POWER_SUPPLY_USB_TYPE_DCP,
};
static const struct power_supply_desc mt6370_chg_psy_desc = {
.name = "mt6370-charger",
.type = POWER_SUPPLY_TYPE_USB,
@ -639,8 +632,10 @@ static const struct power_supply_desc mt6370_chg_psy_desc = {
.get_property = mt6370_chg_get_property,
.set_property = mt6370_chg_set_property,
.property_is_writeable = mt6370_chg_property_is_writeable,
.usb_types = mt6370_chg_usb_types,
.num_usb_types = ARRAY_SIZE(mt6370_chg_usb_types),
.usb_types = BIT(POWER_SUPPLY_USB_TYPE_SDP) |
BIT(POWER_SUPPLY_USB_TYPE_CDP) |
BIT(POWER_SUPPLY_USB_TYPE_DCP) |
BIT(POWER_SUPPLY_USB_TYPE_UNKNOWN),
};
static const struct regulator_ops mt6370_chg_otg_ops = {

View File

@ -1361,10 +1361,6 @@ __power_supply_register(struct device *parent,
pr_warn("%s: Expected proper parent device for '%s'\n",
__func__, desc->name);
if (psy_has_property(desc, POWER_SUPPLY_PROP_USB_TYPE) &&
(!desc->usb_types || !desc->num_usb_types))
return ERR_PTR(-EINVAL);
psy = kzalloc(sizeof(*psy), GFP_KERNEL);
if (!psy)
return ERR_PTR(-ENOMEM);

View File

@ -209,7 +209,7 @@ static struct power_supply_attr power_supply_attrs[] = {
POWER_SUPPLY_ATTR(TIME_TO_FULL_NOW),
POWER_SUPPLY_ATTR(TIME_TO_FULL_AVG),
POWER_SUPPLY_ENUM_ATTR(TYPE),
POWER_SUPPLY_ATTR(USB_TYPE),
POWER_SUPPLY_ENUM_ATTR(USB_TYPE),
POWER_SUPPLY_ENUM_ATTR(SCOPE),
POWER_SUPPLY_ATTR(PRECHARGE_CURRENT),
POWER_SUPPLY_ATTR(CHARGE_TERM_CURRENT),
@ -237,31 +237,28 @@ static enum power_supply_property dev_attr_psp(struct device_attribute *attr)
return to_ps_attr(attr) - power_supply_attrs;
}
static ssize_t power_supply_show_usb_type(struct device *dev,
const struct power_supply_desc *desc,
union power_supply_propval *value,
char *buf)
static ssize_t power_supply_show_enum_with_available(
struct device *dev, const char * const labels[], int label_count,
unsigned int available_values, int value, char *buf)
{
enum power_supply_usb_type usb_type;
bool match = false, available, active;
ssize_t count = 0;
bool match = false;
int i;
for (i = 0; i < desc->num_usb_types; ++i) {
usb_type = desc->usb_types[i];
for (i = 0; i < label_count; i++) {
available = available_values & BIT(i);
active = i == value;
if (value->intval == usb_type) {
count += sysfs_emit_at(buf, count, "[%s] ",
POWER_SUPPLY_USB_TYPE_TEXT[usb_type]);
if (available && active) {
count += sysfs_emit_at(buf, count, "[%s] ", labels[i]);
match = true;
} else {
count += sysfs_emit_at(buf, count, "%s ",
POWER_SUPPLY_USB_TYPE_TEXT[usb_type]);
} else if (available) {
count += sysfs_emit_at(buf, count, "%s ", labels[i]);
}
}
if (!match) {
dev_warn(dev, "driver reporting unsupported connected type\n");
dev_warn(dev, "driver reporting unavailable enum value %d\n", value);
return -EINVAL;
}
@ -300,8 +297,10 @@ static ssize_t power_supply_show_property(struct device *dev,
switch (psp) {
case POWER_SUPPLY_PROP_USB_TYPE:
ret = power_supply_show_usb_type(dev, psy->desc,
&value, buf);
ret = power_supply_show_enum_with_available(
dev, POWER_SUPPLY_USB_TYPE_TEXT,
ARRAY_SIZE(POWER_SUPPLY_USB_TYPE_TEXT),
psy->desc->usb_types, value.intval, buf);
break;
case POWER_SUPPLY_PROP_CHARGE_BEHAVIOUR:
ret = power_supply_charge_behaviour_show(dev, psy->desc->charge_behaviours,
@ -523,33 +522,10 @@ ssize_t power_supply_charge_behaviour_show(struct device *dev,
enum power_supply_charge_behaviour current_behaviour,
char *buf)
{
bool match = false, available, active;
ssize_t count = 0;
int i;
for (i = 0; i < ARRAY_SIZE(POWER_SUPPLY_CHARGE_BEHAVIOUR_TEXT); i++) {
available = available_behaviours & BIT(i);
active = i == current_behaviour;
if (available && active) {
count += sysfs_emit_at(buf, count, "[%s] ",
POWER_SUPPLY_CHARGE_BEHAVIOUR_TEXT[i]);
match = true;
} else if (available) {
count += sysfs_emit_at(buf, count, "%s ",
POWER_SUPPLY_CHARGE_BEHAVIOUR_TEXT[i]);
}
}
if (!match) {
dev_warn(dev, "driver reporting unsupported charge behaviour\n");
return -EINVAL;
}
if (count)
buf[count - 1] = '\n';
return count;
return power_supply_show_enum_with_available(
dev, POWER_SUPPLY_CHARGE_BEHAVIOUR_TEXT,
ARRAY_SIZE(POWER_SUPPLY_CHARGE_BEHAVIOUR_TEXT),
available_behaviours, current_behaviour, buf);
}
EXPORT_SYMBOL_GPL(power_supply_charge_behaviour_show);

View File

@ -786,19 +786,6 @@ static int qcom_battmgr_usb_get_property(struct power_supply *psy,
return 0;
}
static const enum power_supply_usb_type usb_psy_supported_types[] = {
POWER_SUPPLY_USB_TYPE_UNKNOWN,
POWER_SUPPLY_USB_TYPE_SDP,
POWER_SUPPLY_USB_TYPE_DCP,
POWER_SUPPLY_USB_TYPE_CDP,
POWER_SUPPLY_USB_TYPE_ACA,
POWER_SUPPLY_USB_TYPE_C,
POWER_SUPPLY_USB_TYPE_PD,
POWER_SUPPLY_USB_TYPE_PD_DRP,
POWER_SUPPLY_USB_TYPE_PD_PPS,
POWER_SUPPLY_USB_TYPE_APPLE_BRICK_ID,
};
static const enum power_supply_property sc8280xp_usb_props[] = {
POWER_SUPPLY_PROP_ONLINE,
};
@ -809,8 +796,16 @@ static const struct power_supply_desc sc8280xp_usb_psy_desc = {
.properties = sc8280xp_usb_props,
.num_properties = ARRAY_SIZE(sc8280xp_usb_props),
.get_property = qcom_battmgr_usb_get_property,
.usb_types = usb_psy_supported_types,
.num_usb_types = ARRAY_SIZE(usb_psy_supported_types),
.usb_types = BIT(POWER_SUPPLY_USB_TYPE_UNKNOWN) |
BIT(POWER_SUPPLY_USB_TYPE_SDP) |
BIT(POWER_SUPPLY_USB_TYPE_DCP) |
BIT(POWER_SUPPLY_USB_TYPE_CDP) |
BIT(POWER_SUPPLY_USB_TYPE_ACA) |
BIT(POWER_SUPPLY_USB_TYPE_C) |
BIT(POWER_SUPPLY_USB_TYPE_PD) |
BIT(POWER_SUPPLY_USB_TYPE_PD_DRP) |
BIT(POWER_SUPPLY_USB_TYPE_PD_PPS) |
BIT(POWER_SUPPLY_USB_TYPE_APPLE_BRICK_ID),
};
static const enum power_supply_property sm8350_usb_props[] = {
@ -829,8 +824,16 @@ static const struct power_supply_desc sm8350_usb_psy_desc = {
.properties = sm8350_usb_props,
.num_properties = ARRAY_SIZE(sm8350_usb_props),
.get_property = qcom_battmgr_usb_get_property,
.usb_types = usb_psy_supported_types,
.num_usb_types = ARRAY_SIZE(usb_psy_supported_types),
.usb_types = BIT(POWER_SUPPLY_USB_TYPE_UNKNOWN) |
BIT(POWER_SUPPLY_USB_TYPE_SDP) |
BIT(POWER_SUPPLY_USB_TYPE_DCP) |
BIT(POWER_SUPPLY_USB_TYPE_CDP) |
BIT(POWER_SUPPLY_USB_TYPE_ACA) |
BIT(POWER_SUPPLY_USB_TYPE_C) |
BIT(POWER_SUPPLY_USB_TYPE_PD) |
BIT(POWER_SUPPLY_USB_TYPE_PD_DRP) |
BIT(POWER_SUPPLY_USB_TYPE_PD_PPS) |
BIT(POWER_SUPPLY_USB_TYPE_APPLE_BRICK_ID),
};
static const u8 sm8350_wls_prop_map[] = {

View File

@ -411,13 +411,6 @@ static enum power_supply_property smb2_properties[] = {
POWER_SUPPLY_PROP_USB_TYPE,
};
static enum power_supply_usb_type smb2_usb_types[] = {
POWER_SUPPLY_USB_TYPE_UNKNOWN,
POWER_SUPPLY_USB_TYPE_SDP,
POWER_SUPPLY_USB_TYPE_DCP,
POWER_SUPPLY_USB_TYPE_CDP,
};
static int smb2_get_prop_usb_online(struct smb2_chip *chip, int *val)
{
unsigned int stat;
@ -775,8 +768,10 @@ static irqreturn_t smb2_handle_wdog_bark(int irq, void *data)
static const struct power_supply_desc smb2_psy_desc = {
.name = "pmi8998_charger",
.type = POWER_SUPPLY_TYPE_USB,
.usb_types = smb2_usb_types,
.num_usb_types = ARRAY_SIZE(smb2_usb_types),
.usb_types = BIT(POWER_SUPPLY_USB_TYPE_SDP) |
BIT(POWER_SUPPLY_USB_TYPE_CDP) |
BIT(POWER_SUPPLY_USB_TYPE_DCP) |
BIT(POWER_SUPPLY_USB_TYPE_UNKNOWN),
.properties = smb2_properties,
.num_properties = ARRAY_SIZE(smb2_properties),
.get_property = smb2_get_property,

View File

@ -673,11 +673,6 @@ static enum power_supply_property rk817_chg_props[] = {
POWER_SUPPLY_PROP_VOLTAGE_AVG,
};
static enum power_supply_usb_type rk817_usb_type[] = {
POWER_SUPPLY_USB_TYPE_DCP,
POWER_SUPPLY_USB_TYPE_UNKNOWN,
};
static const struct power_supply_desc rk817_bat_desc = {
.name = "rk817-battery",
.type = POWER_SUPPLY_TYPE_BATTERY,
@ -689,8 +684,8 @@ static const struct power_supply_desc rk817_bat_desc = {
static const struct power_supply_desc rk817_chg_desc = {
.name = "rk817-charger",
.type = POWER_SUPPLY_TYPE_USB,
.usb_types = rk817_usb_type,
.num_usb_types = ARRAY_SIZE(rk817_usb_type),
.usb_types = BIT(POWER_SUPPLY_USB_TYPE_DCP) |
BIT(POWER_SUPPLY_USB_TYPE_UNKNOWN),
.properties = rk817_chg_props,
.num_properties = ARRAY_SIZE(rk817_chg_props),
.get_property = rk817_chg_get_prop,

View File

@ -70,13 +70,6 @@ struct rn5t618_power_info {
int irq;
};
static enum power_supply_usb_type rn5t618_usb_types[] = {
POWER_SUPPLY_USB_TYPE_SDP,
POWER_SUPPLY_USB_TYPE_DCP,
POWER_SUPPLY_USB_TYPE_CDP,
POWER_SUPPLY_USB_TYPE_UNKNOWN
};
static enum power_supply_property rn5t618_usb_props[] = {
/* input current limit is not very accurate */
POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT,
@ -681,8 +674,10 @@ static const struct power_supply_desc rn5t618_adp_desc = {
static const struct power_supply_desc rn5t618_usb_desc = {
.name = "rn5t618-usb",
.type = POWER_SUPPLY_TYPE_USB,
.usb_types = rn5t618_usb_types,
.num_usb_types = ARRAY_SIZE(rn5t618_usb_types),
.usb_types = BIT(POWER_SUPPLY_USB_TYPE_SDP) |
BIT(POWER_SUPPLY_USB_TYPE_CDP) |
BIT(POWER_SUPPLY_USB_TYPE_DCP) |
BIT(POWER_SUPPLY_USB_TYPE_UNKNOWN),
.properties = rn5t618_usb_props,
.num_properties = ARRAY_SIZE(rn5t618_usb_props),
.get_property = rn5t618_usb_get_property,

View File

@ -630,13 +630,6 @@ out:
return ret;
}
static const enum power_supply_usb_type rt9467_chg_usb_types[] = {
POWER_SUPPLY_USB_TYPE_UNKNOWN,
POWER_SUPPLY_USB_TYPE_SDP,
POWER_SUPPLY_USB_TYPE_DCP,
POWER_SUPPLY_USB_TYPE_CDP,
};
static const enum power_supply_property rt9467_chg_properties[] = {
POWER_SUPPLY_PROP_STATUS,
POWER_SUPPLY_PROP_ONLINE,
@ -745,8 +738,6 @@ static int rt9467_psy_set_property(struct power_supply *psy,
RT9467_RANGE_IPREC, val->intval);
case POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT:
return rt9467_psy_set_ieoc(data, val->intval);
case POWER_SUPPLY_PROP_USB_TYPE:
return regmap_field_write(data->rm_field[F_USBCHGEN], val->intval);
default:
return -EINVAL;
}
@ -764,7 +755,6 @@ static int rt9467_chg_prop_is_writeable(struct power_supply *psy,
case POWER_SUPPLY_PROP_INPUT_VOLTAGE_LIMIT:
case POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT:
case POWER_SUPPLY_PROP_PRECHARGE_CURRENT:
case POWER_SUPPLY_PROP_USB_TYPE:
return 1;
default:
return 0;
@ -774,8 +764,10 @@ static int rt9467_chg_prop_is_writeable(struct power_supply *psy,
static const struct power_supply_desc rt9467_chg_psy_desc = {
.name = "rt9467-charger",
.type = POWER_SUPPLY_TYPE_USB,
.usb_types = rt9467_chg_usb_types,
.num_usb_types = ARRAY_SIZE(rt9467_chg_usb_types),
.usb_types = BIT(POWER_SUPPLY_USB_TYPE_SDP) |
BIT(POWER_SUPPLY_USB_TYPE_CDP) |
BIT(POWER_SUPPLY_USB_TYPE_DCP) |
BIT(POWER_SUPPLY_USB_TYPE_UNKNOWN),
.properties = rt9467_chg_properties,
.num_properties = ARRAY_SIZE(rt9467_chg_properties),
.property_is_writeable = rt9467_chg_prop_is_writeable,

View File

@ -333,14 +333,6 @@ static enum power_supply_property rt9471_charger_properties[] = {
POWER_SUPPLY_PROP_MANUFACTURER,
};
static enum power_supply_usb_type rt9471_charger_usb_types[] = {
POWER_SUPPLY_USB_TYPE_UNKNOWN,
POWER_SUPPLY_USB_TYPE_SDP,
POWER_SUPPLY_USB_TYPE_DCP,
POWER_SUPPLY_USB_TYPE_CDP,
POWER_SUPPLY_USB_TYPE_APPLE_BRICK_ID,
};
static int rt9471_charger_property_is_writeable(struct power_supply *psy,
enum power_supply_property psp)
{
@ -726,8 +718,11 @@ static int rt9471_register_psy(struct rt9471_chip *chip)
desc->name = psy_name;
desc->type = POWER_SUPPLY_TYPE_USB;
desc->usb_types = rt9471_charger_usb_types;
desc->num_usb_types = ARRAY_SIZE(rt9471_charger_usb_types);
desc->usb_types = BIT(POWER_SUPPLY_USB_TYPE_SDP) |
BIT(POWER_SUPPLY_USB_TYPE_CDP) |
BIT(POWER_SUPPLY_USB_TYPE_DCP) |
BIT(POWER_SUPPLY_USB_TYPE_APPLE_BRICK_ID) |
BIT(POWER_SUPPLY_USB_TYPE_UNKNOWN);
desc->properties = rt9471_charger_properties;
desc->num_properties = ARRAY_SIZE(rt9471_charger_properties);
desc->get_property = rt9471_charger_get_property;

View File

@ -296,22 +296,17 @@ static int ucs1002_set_max_current(struct ucs1002_info *info, u32 val)
return 0;
}
static enum power_supply_usb_type ucs1002_usb_types[] = {
POWER_SUPPLY_USB_TYPE_PD,
POWER_SUPPLY_USB_TYPE_SDP,
POWER_SUPPLY_USB_TYPE_DCP,
POWER_SUPPLY_USB_TYPE_CDP,
POWER_SUPPLY_USB_TYPE_UNKNOWN,
};
static int ucs1002_set_usb_type(struct ucs1002_info *info, int val)
{
unsigned int mode;
if (val < 0 || val >= ARRAY_SIZE(ucs1002_usb_types))
return -EINVAL;
switch (ucs1002_usb_types[val]) {
switch (val) {
/*
* POWER_SUPPLY_USB_TYPE_UNKNOWN == 0, map this to dedicated for
* userspace API compatibility with older versions of this driver
* which mapped 0 to dedicated.
*/
case POWER_SUPPLY_USB_TYPE_UNKNOWN:
case POWER_SUPPLY_USB_TYPE_PD:
mode = V_SET_ACTIVE_MODE_DEDICATED;
break;
@ -428,8 +423,11 @@ static int ucs1002_property_is_writeable(struct power_supply *psy,
static const struct power_supply_desc ucs1002_charger_desc = {
.name = "ucs1002",
.type = POWER_SUPPLY_TYPE_USB,
.usb_types = ucs1002_usb_types,
.num_usb_types = ARRAY_SIZE(ucs1002_usb_types),
.usb_types = BIT(POWER_SUPPLY_USB_TYPE_SDP) |
BIT(POWER_SUPPLY_USB_TYPE_CDP) |
BIT(POWER_SUPPLY_USB_TYPE_DCP) |
BIT(POWER_SUPPLY_USB_TYPE_PD) |
BIT(POWER_SUPPLY_USB_TYPE_UNKNOWN),
.get_property = ucs1002_get_property,
.set_property = ucs1002_set_property,
.property_is_writeable = ucs1002_property_is_writeable,

View File

@ -1339,12 +1339,6 @@ static void anx7411_get_gpio_irq(struct anx7411_data *ctx)
dev_err(dev, "failed to get GPIO IRQ\n");
}
static enum power_supply_usb_type anx7411_psy_usb_types[] = {
POWER_SUPPLY_USB_TYPE_C,
POWER_SUPPLY_USB_TYPE_PD,
POWER_SUPPLY_USB_TYPE_PD_PPS,
};
static enum power_supply_property anx7411_psy_props[] = {
POWER_SUPPLY_PROP_USB_TYPE,
POWER_SUPPLY_PROP_ONLINE,
@ -1422,8 +1416,9 @@ static int anx7411_psy_register(struct anx7411_data *ctx)
psy_desc->name = psy_name;
psy_desc->type = POWER_SUPPLY_TYPE_USB;
psy_desc->usb_types = anx7411_psy_usb_types;
psy_desc->num_usb_types = ARRAY_SIZE(anx7411_psy_usb_types);
psy_desc->usb_types = BIT(POWER_SUPPLY_USB_TYPE_C) |
BIT(POWER_SUPPLY_USB_TYPE_PD) |
BIT(POWER_SUPPLY_USB_TYPE_PD_PPS);
psy_desc->properties = anx7411_psy_props;
psy_desc->num_properties = ARRAY_SIZE(anx7411_psy_props);

View File

@ -109,12 +109,6 @@ struct rt1719_data {
u16 conn_stat;
};
static const enum power_supply_usb_type rt1719_psy_usb_types[] = {
POWER_SUPPLY_USB_TYPE_C,
POWER_SUPPLY_USB_TYPE_PD,
POWER_SUPPLY_USB_TYPE_PD_PPS
};
static const enum power_supply_property rt1719_psy_properties[] = {
POWER_SUPPLY_PROP_ONLINE,
POWER_SUPPLY_PROP_USB_TYPE,
@ -572,8 +566,9 @@ static int devm_rt1719_psy_register(struct rt1719_data *data)
data->psy_desc.name = psy_name;
data->psy_desc.type = POWER_SUPPLY_TYPE_USB;
data->psy_desc.usb_types = rt1719_psy_usb_types;
data->psy_desc.num_usb_types = ARRAY_SIZE(rt1719_psy_usb_types);
data->psy_desc.usb_types = BIT(POWER_SUPPLY_USB_TYPE_C) |
BIT(POWER_SUPPLY_USB_TYPE_PD) |
BIT(POWER_SUPPLY_USB_TYPE_PD_PPS);
data->psy_desc.properties = rt1719_psy_properties;
data->psy_desc.num_properties = ARRAY_SIZE(rt1719_psy_properties);
data->psy_desc.get_property = rt1719_psy_get_property;

View File

@ -7483,12 +7483,6 @@ static int tcpm_psy_prop_writeable(struct power_supply *psy,
}
}
static enum power_supply_usb_type tcpm_psy_usb_types[] = {
POWER_SUPPLY_USB_TYPE_C,
POWER_SUPPLY_USB_TYPE_PD,
POWER_SUPPLY_USB_TYPE_PD_PPS,
};
static const char *tcpm_psy_name_prefix = "tcpm-source-psy-";
static int devm_tcpm_psy_register(struct tcpm_port *port)
@ -7509,8 +7503,9 @@ static int devm_tcpm_psy_register(struct tcpm_port *port)
port_dev_name);
port->psy_desc.name = psy_name;
port->psy_desc.type = POWER_SUPPLY_TYPE_USB;
port->psy_desc.usb_types = tcpm_psy_usb_types;
port->psy_desc.num_usb_types = ARRAY_SIZE(tcpm_psy_usb_types);
port->psy_desc.usb_types = BIT(POWER_SUPPLY_USB_TYPE_C) |
BIT(POWER_SUPPLY_USB_TYPE_PD) |
BIT(POWER_SUPPLY_USB_TYPE_PD_PPS);
port->psy_desc.properties = tcpm_psy_props;
port->psy_desc.num_properties = ARRAY_SIZE(tcpm_psy_props);
port->psy_desc.get_property = tcpm_psy_get_prop;

View File

@ -150,11 +150,6 @@ static enum power_supply_property tps6598x_psy_props[] = {
POWER_SUPPLY_PROP_ONLINE,
};
static enum power_supply_usb_type tps6598x_psy_usb_types[] = {
POWER_SUPPLY_USB_TYPE_C,
POWER_SUPPLY_USB_TYPE_PD,
};
static const char *tps6598x_psy_name_prefix = "tps6598x-source-psy-";
/*
@ -827,8 +822,8 @@ static int devm_tps6598_psy_register(struct tps6598x *tps)
tps->psy_desc.name = psy_name;
tps->psy_desc.type = POWER_SUPPLY_TYPE_USB;
tps->psy_desc.usb_types = tps6598x_psy_usb_types;
tps->psy_desc.num_usb_types = ARRAY_SIZE(tps6598x_psy_usb_types);
tps->psy_desc.usb_types = BIT(POWER_SUPPLY_USB_TYPE_C) |
BIT(POWER_SUPPLY_USB_TYPE_PD);
tps->psy_desc.properties = tps6598x_psy_props;
tps->psy_desc.num_properties = ARRAY_SIZE(tps6598x_psy_props);
tps->psy_desc.get_property = tps6598x_psy_get_prop;

View File

@ -254,12 +254,6 @@ static int ucsi_psy_get_prop(struct power_supply *psy,
}
}
static enum power_supply_usb_type ucsi_psy_usb_types[] = {
POWER_SUPPLY_USB_TYPE_C,
POWER_SUPPLY_USB_TYPE_PD,
POWER_SUPPLY_USB_TYPE_PD_PPS,
};
int ucsi_register_port_psy(struct ucsi_connector *con)
{
struct power_supply_config psy_cfg = {};
@ -276,8 +270,9 @@ int ucsi_register_port_psy(struct ucsi_connector *con)
con->psy_desc.name = psy_name;
con->psy_desc.type = POWER_SUPPLY_TYPE_USB;
con->psy_desc.usb_types = ucsi_psy_usb_types;
con->psy_desc.num_usb_types = ARRAY_SIZE(ucsi_psy_usb_types);
con->psy_desc.usb_types = BIT(POWER_SUPPLY_USB_TYPE_C) |
BIT(POWER_SUPPLY_USB_TYPE_PD) |
BIT(POWER_SUPPLY_USB_TYPE_PD_PPS);
con->psy_desc.properties = ucsi_psy_props;
con->psy_desc.num_properties = ARRAY_SIZE(ucsi_psy_props);
con->psy_desc.get_property = ucsi_psy_get_prop;

View File

@ -243,8 +243,7 @@ struct power_supply_desc {
const char *name;
enum power_supply_type type;
u8 charge_behaviours;
const enum power_supply_usb_type *usb_types;
size_t num_usb_types;
u32 usb_types;
const enum power_supply_property *properties;
size_t num_properties;