Introduce Embedded Controller driver for Acer A500
Subsystems (5)
v3 cover Introduce Embedded Controller driver for Acer A500
Hello!
This series adds support for the Embedded Controller which is found on Acer Iconia Tab A500 (Android tablet device).
The Embedded Controller is ENE KB930 and it's running firmware customized for the A500. The firmware interface may be reused by some other sibling Acer tablets, although none of those tablets are supported in upstream yet. Please review and apply, thanks in advance!
Changelog:
v3: - Rebased on a recent linux-next. Fixed new merge conflict and dropped
"regmap: Use flexible sleep" patch because it's already applied.
v2: - Factored out KB930 device-tree binding into a separate file, like it
was suggested by Lubomir Rintel.
- Switched to use regmap API like it was suggested by Lubomir Rintel.
- Added patch "regmap: Use flexible sleep" which allows not to hog CPU while LED is switching state.
- Corrected MODULE_LICENSE to use "GPL" in all patches.
- Corrected MFD driver Kconfig entry like it was suggested by Lubomir Rintel, it now depends on I2C.
- Switched to use I2C probe_new() in the MFD driver.
- Renamed the global pm_off variable, like it was suggested by Lubomir Rintel and Lee Jones.
- Dropped serial number from the battery driver because I realized that it's not a battery serial, but a device serial.
- Battery driver now uses dev_err_probe(), like it was suggested by Sebastian Reichel.
- Dropped legacy LED_ON usage from the LED driver and renamed the LEDs, like it was suggested by Pavel Machek. I also checked whether LED-name customization via device-tree could be needed by other potentially compatible devices and it shouldn't be needed, anyways it won't be difficult to extend the code even if I'm wrong.
Dmitry Osipenko (5):
dt-bindings: mfd: Add ENE KB930 Embedded Controller binding
mfd: Add driver for Embedded Controller found on Acer Iconia Tab A500
power: supply: Add battery gauge driver for Acer Iconia Tab A500
leds: Add driver for Acer Iconia Tab A500
ARM: tegra: acer-a500: Add Embedded Controller
.../devicetree/bindings/mfd/ene-kb930.yaml | 66 ++++ .../boot/dts/tegra20-acer-a500-picasso.dts | 17 + drivers/leds/Kconfig | 7 + drivers/leds/Makefile | 1 + drivers/leds/leds-acer-a500.c | 129 ++++++++ drivers/mfd/Kconfig | 12 + drivers/mfd/Makefile | 1 + drivers/mfd/acer-ec-a500.c | 203 ++++++++++++ drivers/power/supply/Kconfig | 6 + drivers/power/supply/Makefile | 1 + drivers/power/supply/acer_a500_battery.c | 297 ++++++++++++++++++ 11 files changed, 740 insertions(+) create mode 100644 Documentation/devicetree/bindings/mfd/ene-kb930.yaml create mode 100644 drivers/leds/leds-acer-a500.c create mode 100644 drivers/mfd/acer-ec-a500.c create mode 100644 drivers/power/supply/acer_a500_battery.c
Signature · 1 line
2.27.0
PATCH v3 1/5 dt-bindings: mfd: Add ENE KB930 Embedded Controller binding
Add binding document for the ENE KB930 Embedded Controller.
--- .../devicetree/bindings/mfd/ene-kb930.yaml | 66 +++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 Documentation/devicetree/bindings/mfd/ene-kb930.yaml
Documentation/devicetree/bindings/mfd/ene-kb930.yaml new file +66 -0
@@ -0,0 +1,66 @@ +# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/mfd/ene-kb930.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: ENE KB930 Embedded Controller bindings + +description: | + This binding describes the ENE KB930 Embedded Controller attached to an + I2C bus. + +maintainers: + - Dmitry Osipenko <[email protected]> + +properties: + compatible: + items: + - enum: + - acer,a500-iconia-ec # Acer A500 Iconia tablet device + - enum: + - ene,kb930 + reg: + maxItems: 1 + + monitored-battery: true + power-supplies: true + system-power-controller: true + +required: + - compatible + - reg + +additionalProperties: false + +examples: + - | + battery: battery-cell { + compatible = "simple-battery"; + charge-full-design-microamp-hours = <3260000>; + energy-full-design-microwatt-hours = <24000000>; + operating-range-celsius = <0 40>; + }; + + mains: ac-adapter { + compatible = "gpio-charger"; + charger-type = "mains"; + gpios = <&gpio 125 0>; + }; + + i2c { + #address-cells = <1>; + #size-cells = <0>; + + embedded-controller@58 { + compatible = "acer,a500-iconia-ec", "ene,kb930"; + reg = <0x58>; + + system-power-controller; + + monitored-battery = <&battery>; + power-supplies = <&mains>; + }; + }; + +...
Signature · 1 line
2.27.0
Re: [PATCH v3 1/5] dt-bindings: mfd: Add ENE KB930 Embedded Controller binding
Quoted 8 lines · Dmitry Osipenko
Add binding document for the ENE KB930 Embedded Controller.
Signed-off-by Dmitry Osipenko <[email protected]>--- .../devicetree/bindings/mfd/ene-kb930.yaml | 66 +++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 Documentation/devicetree/bindings/mfd/ene-kb930.yaml
Sebastian Reichel
maintainerRe: [PATCH v3 1/5] dt-bindings: mfd: Add ENE KB930 Embedded Controller binding
In reply to Dmitry OsipenkoHi,
Quoted 30 lines · Dmitry Osipenko
Add binding document for the ENE KB930 Embedded Controller.
Signed-off-by Dmitry Osipenko <[email protected]>--- .../devicetree/bindings/mfd/ene-kb930.yaml | 66 +++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 Documentation/devicetree/bindings/mfd/ene-kb930.yamlDocumentation/devicetree/bindings/mfd/ene-kb930.yaml new file +16
-0@@ -0,0 +1,66 @@ +# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/mfd/ene-kb930.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: ENE KB930 Embedded Controller bindings + +description: | + This binding describes the ENE KB930 Embedded Controller attached to an + I2C bus. + +maintainers: + - Dmitry Osipenko <[email protected]> + +properties:
Documentation/devicetree/bindings/mfd/ene-kb930.yaml line 26
Quoted 10 lines
Documentation/devicetree/bindings/mfd/ene-kb930.yaml new file +10
-0+ compatible: + items: + - enum: + - acer,a500-iconia-ec # Acer A500 Iconia tablet device + - enum: + - ene,kb930 + reg: + maxItems: 1 + + monitored-battery: true
^^^ this is not being used by your battery driver. Do you plan to use it in the future or is it a copy&paste mistake? :)
-- Sebastian
Quoted 43 lines
Documentation/devicetree/bindings/mfd/ene-kb930.yaml new file +40
-0+ power-supplies: true + system-power-controller: true + +required: + - compatible + - reg + +additionalProperties: false + +examples: + - | + battery: battery-cell { + compatible = "simple-battery"; + charge-full-design-microamp-hours = <3260000>; + energy-full-design-microwatt-hours = <24000000>; + operating-range-celsius = <0 40>; + }; + + mains: ac-adapter { + compatible = "gpio-charger"; + charger-type = "mains"; + gpios = <&gpio 125 0>; + }; + + i2c { + #address-cells = <1>; + #size-cells = <0>; + + embedded-controller@58 { + compatible = "acer,a500-iconia-ec", "ene,kb930"; + reg = <0x58>; + + system-power-controller; + + monitored-battery = <&battery>; + power-supplies = <&mains>; + }; + }; + +...Signature · 1 line
2.27.0
Re: [PATCH v3 1/5] dt-bindings: mfd: Add ENE KB930 Embedded Controller binding
09.10.2020 02:00, Sebastian Reichel пишет:
Quoted 38 lines
Hi,
Quoted 35 lines · Dmitry Osipenko
Add binding document for the ENE KB930 Embedded Controller.
Signed-off-by Dmitry Osipenko <[email protected]>--- .../devicetree/bindings/mfd/ene-kb930.yaml | 66 +++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 Documentation/devicetree/bindings/mfd/ene-kb930.yamlDocumentation/devicetree/bindings/mfd/ene-kb930.yaml new file +21
-0@@ -0,0 +1,66 @@ +# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/mfd/ene-kb930.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: ENE KB930 Embedded Controller bindings + +description: | + This binding describes the ENE KB930 Embedded Controller attached to an + I2C bus. + +maintainers: + - Dmitry Osipenko <[email protected]> + +properties: + compatible: + items: + - enum: + - acer,a500-iconia-ec # Acer A500 Iconia tablet device + - enum:
Quoted 8 lines
Documentation/devicetree/bindings/mfd/ene-kb930.yaml line 26
Quoted 5 lines
Documentation/devicetree/bindings/mfd/ene-kb930.yaml new file +5
-0+ - ene,kb930 + reg: + maxItems: 1 + + monitored-battery: true^^^ this is not being used by your battery driver. Do you plan to use it in the future or is it a copy&paste mistake? :)
Hello, this is correct that driver doesn't use monitored-battery info, but I was thinking that it's good to have anyways in the device-tree because this completes hardware description + the gauge driver isn't aware about maximal battery temperature. Hence it may become useful and it doesn't hurt to have that additional information about battery cell.
PATCH v3 2/5 mfd: Add driver for Embedded Controller found on Acer Iconia Tab A500
In reply to Dmitry OsipenkoAcer Iconia Tab A500 is an Android tablet device, it has ENE KB930 Embedded Controller which provides battery-gauge, LED, GPIO and some other functions. The EC uses firmware that is specifically customized for Acer A500. This patch adds MFD driver for the Embedded Controller which allows to power-off / reboot the A500 device, it also provides a common register read/write API that will be used by the sub-devices.
--- drivers/mfd/Kconfig | 12 +++ drivers/mfd/Makefile | 1 + drivers/mfd/acer-ec-a500.c | 203 +++++++++++++++++++++++++++++++++++++ 3 files changed, 216 insertions(+) create mode 100644 drivers/mfd/acer-ec-a500.c
drivers/mfd/Kconfig +12 -0
@@ -2062,6 +2062,18 @@ config MFD_KHADAS_MCU additional drivers must be enabled in order to use the functionality of the device. +config MFD_ACER_A500_EC + tristate "Embedded Controller driver for Acer Iconia Tab A500" + depends on I2C + depends on ARCH_TEGRA_2x_SOC || COMPILE_TEST + select MFD_CORE + select REGMAP + help + Support for Acer Iconia Tab A500 Embedded Controller. + + The controller itself is ENE KB930, it is running firmware + customized for the specific needs of the Acer A500 hardware. + menu "Multimedia Capabilities Port drivers" depends on ARCH_SA1100
drivers/mfd/Makefile +1 -0
@@ -262,5 +262,6 @@ obj-$(CONFIG_MFD_ROHM_BD71828) += rohm-bd71828.o obj-$(CONFIG_MFD_ROHM_BD718XX) += rohm-bd718x7.o obj-$(CONFIG_MFD_STMFX) += stmfx.o obj-$(CONFIG_MFD_KHADAS_MCU) += khadas-mcu.o +obj-$(CONFIG_MFD_ACER_A500_EC) += acer-ec-a500.o obj-$(CONFIG_SGI_MFD_IOC3) += ioc3.o
drivers/mfd/acer-ec-a500.c new file +203 -0
203 lines not on this page · raw message
Signature · 1 line
2.27.0
PATCH v3 3/5 power: supply: Add battery gauge driver for Acer Iconia Tab A500
In reply to Dmitry OsipenkoThis patch adds battery gauge driver for Acer Iconia Tab A500 device. The battery gauge function is provided via the Embedded Controller, which is found on the Acer A500.
--- drivers/power/supply/Kconfig | 6 + drivers/power/supply/Makefile | 1 + drivers/power/supply/acer_a500_battery.c | 297 +++++++++++++++++++++++ 3 files changed, 304 insertions(+) create mode 100644 drivers/power/supply/acer_a500_battery.c
drivers/power/supply/Kconfig +6 -0
@@ -760,4 +760,10 @@ config RN5T618_POWER This driver can also be built as a module. If so, the module will be called rn5t618_power. +config BATTERY_ACER_A500 + tristate "Acer Iconia Tab A500 battery driver" + depends on MFD_ACER_A500_EC + help + Say Y to include support for Acer Iconia Tab A500 battery fuel gauge. + endif # POWER_SUPPLY
drivers/power/supply/Makefile +1 -0
@@ -97,3 +97,4 @@ obj-$(CONFIG_CHARGER_BD70528) += bd70528-charger.o obj-$(CONFIG_CHARGER_BD99954) += bd99954-charger.o obj-$(CONFIG_CHARGER_WILCO) += wilco-charger.o obj-$(CONFIG_RN5T618_POWER) += rn5t618_power.o +obj-$(CONFIG_BATTERY_ACER_A500) += acer_a500_battery.o
drivers/power/supply/acer_a500_battery.c new file +297 -0
297 lines not on this page · raw message
Signature · 1 line
2.27.0
Re: [PATCH v3 3/5] power: supply: Add battery gauge driver for Acer Iconia Tab A500
Hi,
Quoted 6 lines · Dmitry Osipenko
This patch adds battery gauge driver for Acer Iconia Tab A500 device. The battery gauge function is provided via the Embedded Controller, which is found on the Acer A500.
Signed-off-by Dmitry Osipenko <[email protected]>---
-- Sebastian
Quoted 336 lines
drivers/power/supply/Kconfig | 6 + drivers/power/supply/Makefile | 1 + drivers/power/supply/acer_a500_battery.c | 297 +++++++++++++++++++++++ 3 files changed, 304 insertions(+) create mode 100644 drivers/power/supply/acer_a500_battery.cdrivers/power/supply/Kconfig +6
-0@@ -760,4 +760,10 @@ config RN5T618_POWER This driver can also be built as a module. If so, the module will be called rn5t618_power. +config BATTERY_ACER_A500 + tristate "Acer Iconia Tab A500 battery driver" + depends on MFD_ACER_A500_EC + help + Say Y to include support for Acer Iconia Tab A500 battery fuel gauge. + endif # POWER_SUPPLYdrivers/power/supply/Makefile +1
-0@@ -97,3 +97,4 @@ obj-$(CONFIG_CHARGER_BD70528) += bd70528-charger.o obj-$(CONFIG_CHARGER_BD99954) += bd99954-charger.o obj-$(CONFIG_CHARGER_WILCO) += wilco-charger.o obj-$(CONFIG_RN5T618_POWER) += rn5t618_power.o +obj-$(CONFIG_BATTERY_ACER_A500) += acer_a500_battery.odrivers/power/supply/acer_a500_battery.c new file +297
-0@@ -0,0 +1,297 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* +* Battery driver for Acer Iconia Tab A500. +* +* Copyright 2020 GRATE-driver project. +* +* Based on downstream driver from Acer Inc. +* Based on NVIDIA Gas Gauge driver for SBS Compliant Batteries. +* +* Copyright (c) 2010, NVIDIA Corporation. +*/ + +#include <linux/module.h> +#include <linux/platform_device.h> +#include <linux/power_supply.h> +#include <linux/regmap.h> +#include <linux/sched.h> +#include <linux/slab.h> +#include <linux/workqueue.h> + +enum { +REG_CAPACITY , +REG_VOLTAGE , +REG_CURRENT , +REG_DESIGN_CAPACITY , +REG_TEMPERATURE , +}; + +#define EC_DATA (_reg, _psp) { \ + .psp = POWER_SUPPLY_PROP_ ## _psp, \ + .reg = _reg, \ +} + +static const struct battery_register { +enum power_supply_property psp; +unsigned int reg; +} ec_data[] = { + [REG_CAPACITY ] =EC_DATA (0x00 ,CAPACITY ), + [REG_VOLTAGE ] =EC_DATA (0x01 ,VOLTAGE_NOW ), + [REG_CURRENT ] =EC_DATA (0x03 ,CURRENT_NOW ), + [REG_DESIGN_CAPACITY ] =EC_DATA (0x08 ,CHARGE_FULL_DESIGN ), + [REG_TEMPERATURE ] =EC_DATA (0x0a ,TEMP ), +}; + +static const enum power_supply_property a500_battery_properties[] = { +POWER_SUPPLY_PROP_CAPACITY , +POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN , +POWER_SUPPLY_PROP_CURRENT_NOW , +POWER_SUPPLY_PROP_PRESENT , +POWER_SUPPLY_PROP_STATUS , +POWER_SUPPLY_PROP_TECHNOLOGY , +POWER_SUPPLY_PROP_TEMP , +POWER_SUPPLY_PROP_VOLTAGE_NOW , +}; + +struct a500_battery { +struct delayed_work poll_work; +struct power_supply *psy; +struct regmap *rmap; +unsigned int capacity; +}; + +static bool a500_battery_update_capacity (struct a500_battery *bat) +{ +unsigned int capacity; +int err; + + err =regmap_read (bat->rmap, ec_data[REG_CAPACITY ].reg, &capacity); +if (err) +return false; + +/* capacity can be >100% even if max value is 100% */ + capacity =min (capacity,100u ); + +if (bat->capacity != capacity) { + bat->capacity = capacity; +return true; + } + +return false; +} + +static int a500_battery_get_status (struct a500_battery *bat) +{ +if (bat->capacity <100 ) { +if (power_supply_am_i_supplied (bat->psy)) +return POWER_SUPPLY_STATUS_CHARGING ; +else +return POWER_SUPPLY_STATUS_DISCHARGING ; + } + +return POWER_SUPPLY_STATUS_FULL ; +} + +static void a500_battery_unit_adjustment (struct device *dev, +enum power_supply_property psp, +union power_supply_propval *val) +{ +const unsigned int base_unit_conversion =1000 ; +const unsigned int temp_kelvin_to_celsius =2731 ; + +switch (psp) { +case POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN : +case POWER_SUPPLY_PROP_CURRENT_NOW : +case POWER_SUPPLY_PROP_VOLTAGE_NOW : + val->intval *= base_unit_conversion; +break ; + +case POWER_SUPPLY_PROP_TEMP : + val->intval -= temp_kelvin_to_celsius; +break ; + +case POWER_SUPPLY_PROP_PRESENT : + val->intval = !!val->intval; +break ; + +default : +dev_dbg (dev, +"%s: no need for unit conversion %d\n" , __func__, psp); + } +} + +static int a500_battery_get_ec_data_index (struct device *dev, +enum power_supply_property psp) +{ +unsigned int i; + +/* +* DESIGN_CAPACITY register always returns a non-zero value if +* battery is connected and zero if disconnected, hence we'll use +* it for judging the battery presence. +*/ +if (psp ==POWER_SUPPLY_PROP_PRESENT ) + psp =POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN ; + +for (i =0 ; i <ARRAY_SIZE (ec_data); i++) +if (psp == ec_data[i].psp) +return i; + +dev_dbg (dev,"%s: invalid property %u\n" , __func__, psp); + +return -EINVAL ; +} + +static int a500_battery_get_property (struct power_supply *psy, +enum power_supply_property psp, +union power_supply_propval *val) +{ +struct a500_battery *bat =power_supply_get_drvdata (psy); +struct device *dev = psy->dev.parent; +int ret =0 ; + +switch (psp) { +case POWER_SUPPLY_PROP_STATUS : + val->intval =a500_battery_get_status (bat); +break ; + +case POWER_SUPPLY_PROP_TECHNOLOGY : + val->intval =POWER_SUPPLY_TECHNOLOGY_LION ; +break ; + +case POWER_SUPPLY_PROP_CAPACITY : +a500_battery_update_capacity (bat); + val->intval = bat->capacity; +break ; + +case POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN : +case POWER_SUPPLY_PROP_CURRENT_NOW : +case POWER_SUPPLY_PROP_VOLTAGE_NOW : +case POWER_SUPPLY_PROP_PRESENT : +case POWER_SUPPLY_PROP_TEMP : + ret =a500_battery_get_ec_data_index (dev, psp); +if (ret <0 ) +break ; + + ret =regmap_read (bat->rmap, ec_data[ret].reg, &val->intval); +break ; + +default : +dev_err (dev,"%s: invalid property %u\n" , __func__, psp); +return -EINVAL ; + } + +if (!ret) { +/* convert units to match requirements of power supply class */ +a500_battery_unit_adjustment (dev, psp, val); + } + +dev_dbg (dev,"%s: property = %d, value = %x\n" , + __func__, psp, val->intval); + +/* return NODATA for properties if battery not presents */ +if (ret) +return -ENODATA ; + +return 0 ; +} + +static void a500_battery_poll_work (struct work_struct *work) +{ +struct a500_battery *bat; +bool capacity_changed; + + bat = container_of(work, struct a500_battery, poll_work.work); + capacity_changed =a500_battery_update_capacity (bat); + +if (capacity_changed) +power_supply_changed (bat->psy); + +/* continuously send uevent notification */ +schedule_delayed_work (&bat->poll_work,30 *HZ ); +} + +static const struct power_supply_desc a500_battery_desc = { + .name ="ec-battery" , + .type =POWER_SUPPLY_TYPE_BATTERY , + .properties = a500_battery_properties, + .get_property = a500_battery_get_property, + .num_properties =ARRAY_SIZE (a500_battery_properties), + .external_power_changed = power_supply_changed, +}; + +static int a500_battery_probe (struct platform_device *pdev) +{ +struct power_supply_config psy_cfg = {}; +struct a500_battery *bat; + + bat =devm_kzalloc (&pdev->dev,sizeof (*bat),GFP_KERNEL ); +if (!bat) +return -ENOMEM ; + +platform_set_drvdata (pdev, bat); + + psy_cfg.of_node = pdev->dev.parent->of_node; + psy_cfg.drv_data = bat; + + bat->rmap =dev_get_regmap (pdev->dev.parent,"KB930" ); +if (!bat->rmap) +return -EINVAL ; + + bat->psy =devm_power_supply_register_no_ws (&pdev->dev, + &a500_battery_desc, + &psy_cfg); +if (IS_ERR (bat->psy)) +return dev_err_probe (&pdev->dev,PTR_ERR (bat->psy), +"failed to register battery\n" ); + +INIT_DELAYED_WORK (&bat->poll_work, a500_battery_poll_work); +schedule_delayed_work (&bat->poll_work,HZ ); + +return 0 ; +} + +static int a500_battery_remove (struct platform_device *pdev) +{ +struct a500_battery *bat =dev_get_drvdata (&pdev->dev); + +cancel_delayed_work_sync (&bat->poll_work); + +return 0 ; +} + +static int __maybe_unused a500_battery_suspend (struct device *dev) +{ +struct a500_battery *bat =dev_get_drvdata (dev); + +cancel_delayed_work_sync (&bat->poll_work); + +return 0 ; +} + +static int __maybe_unused a500_battery_resume (struct device *dev) +{ +struct a500_battery *bat =dev_get_drvdata (dev); + +schedule_delayed_work (&bat->poll_work,HZ ); + +return 0 ; +} + +static SIMPLE_DEV_PM_OPS(a500_battery_pm_ops, + a500_battery_suspend, a500_battery_resume); + +static struct platform_driver a500_battery_driver = { + .driver = { + .name ="acer-a500-iconia-battery" , + .pm = &a500_battery_pm_ops, + }, + .probe = a500_battery_probe, + .remove = a500_battery_remove, +}; +module_platform_driver (a500_battery_driver); + +MODULE_DESCRIPTION ("Battery gauge driver for Acer Iconia Tab A500" ); +MODULE_AUTHOR ("Dmitry Osipenko <[email protected]>" ); +MODULE_ALIAS ("platform:acer-a500-iconia-battery" ); +MODULE_LICENSE ("GPL" );Signature · 1 line
2.27.0
PATCH v3 4/5 leds: Add driver for Acer Iconia Tab A500
In reply to Dmitry OsipenkoAcer Iconia Tab A500 is an Android tablet device which has two LEDs embedded into the Power Button. Orange LED indicates "battery charging" status and white LED indicates "wake-up/charge-done" status. The new LED driver provides control over both LEDs to userspace.
--- drivers/leds/Kconfig | 7 ++ drivers/leds/Makefile | 1 + drivers/leds/leds-acer-a500.c | 129 ++++++++++++++++++++++++++++++++++ 3 files changed, 137 insertions(+) create mode 100644 drivers/leds/leds-acer-a500.c
drivers/leds/Kconfig +7 -0
@@ -921,6 +921,13 @@ config LEDS_SGM3140 This option enables support for the SGM3140 500mA Buck/Boost Charge Pump LED Driver. +config LEDS_ACER_A500 + tristate "Power button LED support for Acer Iconia Tab A500" + depends on LEDS_CLASS && MFD_ACER_A500_EC + help + This option enables support for the Power Button LED of + Acer Iconia Tab A500. + comment "LED Triggers" source "drivers/leds/trigger/Kconfig"
drivers/leds/Makefile +1 -0
@@ -10,6 +10,7 @@ obj-$(CONFIG_LEDS_TRIGGERS) += led-triggers.o # LED Platform Drivers (keep this sorted, M-| sort) obj-$(CONFIG_LEDS_88PM860X) += leds-88pm860x.o obj-$(CONFIG_LEDS_AAT1290) += leds-aat1290.o +obj-$(CONFIG_LEDS_ACER_A500) += leds-acer-a500.o obj-$(CONFIG_LEDS_ADP5520) += leds-adp5520.o obj-$(CONFIG_LEDS_AN30259A) += leds-an30259a.o obj-$(CONFIG_LEDS_APU) += leds-apu.o
drivers/leds/leds-acer-a500.c new file +129 -0
129 lines not on this page · raw message
Signature · 1 line
2.27.0
Pavel Machek
AppliedRe: [PATCH v3 4/5] leds: Add driver for Acer Iconia Tab A500
Quoted 6 lines · Dmitry Osipenko
Acer Iconia Tab A500 is an Android tablet device which has two LEDs embedded into the Power Button. Orange LED indicates "battery charging" status and white LED indicates "wake-up/charge-done" status. The new LED driver provides control over both LEDs to userspace.
Signed-off-by Dmitry Osipenko <[email protected]>
Thanks, applied.
Pavel
Signature · 2 lines
(english) http://www.livejournal.com/~pavelmachek (cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
Re: [PATCH v3 4/5] leds: Add driver for Acer Iconia Tab A500
24.09.2020 15:00, Pavel Machek пишет:
Quoted 9 lines · Dmitry Osipenko
Quoted 6 lines
Acer Iconia Tab A500 is an Android tablet device which has two LEDs embedded into the Power Button. Orange LED indicates "battery charging" status and white LED indicates "wake-up/charge-done" status. The new LED driver provides control over both LEDs to userspace.
Signed-off-by Dmitry Osipenko <[email protected]>Thanks, applied.
Thank you :)
PATCH v3 5/5 ARM: tegra: acer-a500: Add Embedded Controller
In reply to Dmitry OsipenkoThis patch adds device-tree node for the Embedded Controller which is found on the Picasso board. The Embedded Controller itself is ENE KB930, it provides functions like battery-gauge/LED/GPIO/etc and it uses firmware that is specifically customized for the Acer A500 device.
--- arch/arm/boot/dts/tegra20-acer-a500-picasso.dts | 17 +++++++++++++++++ 1 file changed, 17 insertions(+)
arch/arm/boot/dts/tegra20-acer-a500-picasso.dts +17 -0
@@ -502,6 +502,16 @@ panel_ddc: i2c@1 { reg = <1>; #address-cells = <1>; #size-cells = <0>; + + embedded-controller@58 { + compatible = "acer,a500-iconia-ec", "ene,kb930"; + reg = <0x58>; + + system-power-controller; + + monitored-battery = <&bat1010>; + power-supplies = <&mains>; + }; }; };
@@ -780,6 +790,13 @@ backlight: backlight { default-brightness-level = <20>; }; + bat1010: battery-2s1p { + compatible = "simple-battery"; + charge-full-design-microamp-hours = <3260000>; + energy-full-design-microwatt-hours = <24000000>; + operating-range-celsius = <0 40>; + }; + /* PMIC has a built-in 32KHz oscillator which is used by PMC */ clk32k_in: clock@0 { compatible = "fixed-clock";
Signature · 1 line
2.27.0