* [PATCH v3 00/11] mfd: add support for max77650 PMIC
@ 2019-02-01 9:47 Bartosz Golaszewski
2019-02-01 9:47 ` [PATCH v3 01/11] dt-bindings: mfd: add DT bindings for max77650 Bartosz Golaszewski
` (10 more replies)
0 siblings, 11 replies; 31+ messages in thread
From: Bartosz Golaszewski @ 2019-02-01 9:47 UTC (permalink / raw)
To: Rob Herring, Mark Rutland, Linus Walleij, Dmitry Torokhov,
Jacek Anaszewski, Pavel Machek, Lee Jones, Sebastian Reichel,
Liam Girdwood, Greg Kroah-Hartman
Cc: linux-kernel, linux-gpio, devicetree, linux-input, linux-leds,
linux-pm, Bartosz Golaszewski
From: Bartosz Golaszewski <bgolaszewski@baylibre.com>
This series adds support for max77650 ultra low-power PMIC. It provides
the core mfd driver and a set of five sub-drivers for the regulator,
power supply, gpio, leds and input subsystems.
Patches 1-6 add the DT binding documents. Patches 7-12 add all drivers.
Last patch adds a MAINTAINERS entry for this device.
Note that patch 8/13 depends on commit 03c87b95ac04 ("regulator: provide
rdev_get_regmap()") which was picked up by Mark Brown for v5.1.
v1 -> v2:
General:
- use C++ style comments for the SPDX license identifier and the
copyright header
- s/MODULE_LICENSE("GPL")/MODULE_LICENSE("GPL v2")/
- lookup the virtual interrupt numbers in the MFD driver, setup
resources for child devices and use platform_get_irq_byname()
in sub-drivers
- picked up review tags
- use devm_request_any_context_irq() for interrupt requests
LEDs:
- changed the max77650_leds_ prefix to max77650_led_
- drop the max77650_leds structure as the only field it held was the
regmap pointer, move said pointer to struct max77650_led
- change the driver name to "max77650-led"
- drop the last return value check and return the result of
regmap_write() directly
- change the labeling scheme to one consistent with other LED drivers
ONKEY:
- drop the key reporting helper and call the input functions directly
from interrupt handlers
- rename the rv local variable to error
- drop parent device asignment
Regulator:
- drop the unnecessary init_data lookup from the driver code
- drop unnecessary include
Charger:
- disable the charger on driver remove
- change the power supply type to POWER_SUPPLY_TYPE_USB
GPIO:
- drop interrupt support until we have correct implementation of hierarchical
irqs in gpiolib
v2 -> v3:
General:
- dropped regulator patches as they're already in Mark Brown's branch
LED:
- fix the compatible string in the DT binding example
- use the max_brightness property
- use a common prefix ("MAX77650_LED") for all defines in the driver
MFD:
- add the MODULE_DEVICE_TABLE()
- add a sentinel to the of_device_id array
- constify the pointers to irq names
- use an enum instead of defines for interrupt indexes
Bartosz Golaszewski (11):
dt-bindings: mfd: add DT bindings for max77650
dt-bindings: power: supply: add DT bindings for max77650
dt-bindings: gpio: add DT bindings for max77650
dt-bindings: leds: add DT bindings for max77650
dt-bindings: input: add DT bindings for max77650
mfd: max77650: new core mfd driver
power: supply: max77650: add support for battery charger
gpio: max77650: add GPIO support
leds: max77650: add LEDs support
input: max77650: add onkey support
MAINTAINERS: add an entry for max77650 mfd driver
.../bindings/gpio/gpio-max77650.txt | 34 ++
.../bindings/input/max77650-onkey.txt | 26 ++
.../bindings/leds/leds-max77650.txt | 57 +++
.../devicetree/bindings/mfd/max77650.txt | 28 ++
.../power/supply/max77650-charger.txt | 27 ++
MAINTAINERS | 14 +
drivers/gpio/Kconfig | 7 +
drivers/gpio/Makefile | 1 +
drivers/gpio/gpio-max77650.c | 189 ++++++++++
drivers/input/misc/Kconfig | 9 +
drivers/input/misc/Makefile | 1 +
drivers/input/misc/max77650-onkey.c | 127 +++++++
drivers/leds/Kconfig | 6 +
drivers/leds/Makefile | 1 +
drivers/leds/leds-max77650.c | 147 ++++++++
drivers/mfd/Kconfig | 11 +
drivers/mfd/Makefile | 1 +
drivers/mfd/max77650.c | 342 +++++++++++++++++
drivers/power/supply/Kconfig | 7 +
drivers/power/supply/Makefile | 1 +
drivers/power/supply/max77650-charger.c | 355 ++++++++++++++++++
include/linux/mfd/max77650.h | 59 +++
22 files changed, 1450 insertions(+)
create mode 100644 Documentation/devicetree/bindings/gpio/gpio-max77650.txt
create mode 100644 Documentation/devicetree/bindings/input/max77650-onkey.txt
create mode 100644 Documentation/devicetree/bindings/leds/leds-max77650.txt
create mode 100644 Documentation/devicetree/bindings/mfd/max77650.txt
create mode 100644 Documentation/devicetree/bindings/power/supply/max77650-charger.txt
create mode 100644 drivers/gpio/gpio-max77650.c
create mode 100644 drivers/input/misc/max77650-onkey.c
create mode 100644 drivers/leds/leds-max77650.c
create mode 100644 drivers/mfd/max77650.c
create mode 100644 drivers/power/supply/max77650-charger.c
create mode 100644 include/linux/mfd/max77650.h
--
2.20.1
^ permalink raw reply [flat|nested] 31+ messages in thread
* [PATCH v3 01/11] dt-bindings: mfd: add DT bindings for max77650
2019-02-01 9:47 [PATCH v3 00/11] mfd: add support for max77650 PMIC Bartosz Golaszewski
@ 2019-02-01 9:47 ` Bartosz Golaszewski
2019-02-01 9:47 ` [PATCH v3 02/11] dt-bindings: power: supply: " Bartosz Golaszewski
` (9 subsequent siblings)
10 siblings, 0 replies; 31+ messages in thread
From: Bartosz Golaszewski @ 2019-02-01 9:47 UTC (permalink / raw)
To: Rob Herring, Mark Rutland, Linus Walleij, Dmitry Torokhov,
Jacek Anaszewski, Pavel Machek, Lee Jones, Sebastian Reichel,
Liam Girdwood, Greg Kroah-Hartman
Cc: linux-kernel, linux-gpio, devicetree, linux-input, linux-leds,
linux-pm, Bartosz Golaszewski
From: Bartosz Golaszewski <bgolaszewski@baylibre.com>
Add a DT binding document for max77650 ultra-low power PMIC. This
describes the core mfd device.
Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
---
.../devicetree/bindings/mfd/max77650.txt | 28 +++++++++++++++++++
1 file changed, 28 insertions(+)
create mode 100644 Documentation/devicetree/bindings/mfd/max77650.txt
diff --git a/Documentation/devicetree/bindings/mfd/max77650.txt b/Documentation/devicetree/bindings/mfd/max77650.txt
new file mode 100644
index 000000000000..84631d3b1e14
--- /dev/null
+++ b/Documentation/devicetree/bindings/mfd/max77650.txt
@@ -0,0 +1,28 @@
+MAX77650 ultra low-power PMIC from Maxim Integrated.
+
+Required properties:
+-------------------
+- compatible: Must be "maxim,max77650"
+- reg: I2C device address.
+- interrupts: The interrupt on the parent the controller is
+ connected to.
+- interrupt-parent: phandle of the parent interrupt controller.
+- interrupt-controller: Marks the device node as an interrupt controller.
+- #interrupt-cells: Must be <2>.
+
+For device-tree bindings of sub-modules (regulator, power supply, GPIO, LEDs
+and onkey) refer to the binding documents under the respective sub-system
+directories.
+
+Example:
+--------
+
+ pmic: max77650@48 {
+ compatible = "maxim,max77650";
+ reg = <0x48>;
+
+ interrupt-controller;
+ interrupt-parent = <&gpio2>;
+ #interrupt-cells = <2>;
+ interrupts = <3 IRQ_TYPE_LEVEL_LOW>;
+ };
--
2.20.1
^ permalink raw reply related [flat|nested] 31+ messages in thread
* [PATCH v3 02/11] dt-bindings: power: supply: add DT bindings for max77650
2019-02-01 9:47 [PATCH v3 00/11] mfd: add support for max77650 PMIC Bartosz Golaszewski
2019-02-01 9:47 ` [PATCH v3 01/11] dt-bindings: mfd: add DT bindings for max77650 Bartosz Golaszewski
@ 2019-02-01 9:47 ` Bartosz Golaszewski
2019-02-12 11:54 ` Pavel Machek
2019-02-01 9:47 ` [PATCH v3 03/11] dt-bindings: gpio: " Bartosz Golaszewski
` (8 subsequent siblings)
10 siblings, 1 reply; 31+ messages in thread
From: Bartosz Golaszewski @ 2019-02-01 9:47 UTC (permalink / raw)
To: Rob Herring, Mark Rutland, Linus Walleij, Dmitry Torokhov,
Jacek Anaszewski, Pavel Machek, Lee Jones, Sebastian Reichel,
Liam Girdwood, Greg Kroah-Hartman
Cc: linux-kernel, linux-gpio, devicetree, linux-input, linux-leds,
linux-pm, Bartosz Golaszewski
From: Bartosz Golaszewski <bgolaszewski@baylibre.com>
Add the DT binding document for the battery charger module of max77650.
Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
---
.../power/supply/max77650-charger.txt | 27 +++++++++++++++++++
1 file changed, 27 insertions(+)
create mode 100644 Documentation/devicetree/bindings/power/supply/max77650-charger.txt
diff --git a/Documentation/devicetree/bindings/power/supply/max77650-charger.txt b/Documentation/devicetree/bindings/power/supply/max77650-charger.txt
new file mode 100644
index 000000000000..f3e00d41e299
--- /dev/null
+++ b/Documentation/devicetree/bindings/power/supply/max77650-charger.txt
@@ -0,0 +1,27 @@
+Battery charger driver for MAX77650 PMIC from Maxim Integrated.
+
+This module is part of the MAX77650 MFD device. For more details
+see Documentation/devicetree/bindings/mfd/max77650.txt.
+
+The charger is represented as a sub-node of the PMIC node on the device tree.
+
+Required properties:
+--------------------
+- compatible: Must be "maxim,max77650-charger"
+
+Optional properties:
+--------------------
+- maxim,vchgin-min: Minimum CHGIN regulation voltage (in microvolts). Must be
+ one of: 4000000, 4100000, 4200000, 4300000, 4400000,
+ 4500000, 4600000, 4700000.
+- maxim,ichgin-lim: CHGIN input current limit (in microamps). Must be one of:
+ 95000, 190000, 285000, 380000, 475000.
+
+Example:
+--------
+
+ charger {
+ compatible = "maxim,max77650-charger";
+ maxim,vchgin-min = <4200000>;
+ maxim,ichgin-lim = <285000>;
+ };
--
2.20.1
^ permalink raw reply related [flat|nested] 31+ messages in thread
* [PATCH v3 03/11] dt-bindings: gpio: add DT bindings for max77650
2019-02-01 9:47 [PATCH v3 00/11] mfd: add support for max77650 PMIC Bartosz Golaszewski
2019-02-01 9:47 ` [PATCH v3 01/11] dt-bindings: mfd: add DT bindings for max77650 Bartosz Golaszewski
2019-02-01 9:47 ` [PATCH v3 02/11] dt-bindings: power: supply: " Bartosz Golaszewski
@ 2019-02-01 9:47 ` Bartosz Golaszewski
2019-02-01 9:47 ` [PATCH v3 04/11] dt-bindings: leds: " Bartosz Golaszewski
` (7 subsequent siblings)
10 siblings, 0 replies; 31+ messages in thread
From: Bartosz Golaszewski @ 2019-02-01 9:47 UTC (permalink / raw)
To: Rob Herring, Mark Rutland, Linus Walleij, Dmitry Torokhov,
Jacek Anaszewski, Pavel Machek, Lee Jones, Sebastian Reichel,
Liam Girdwood, Greg Kroah-Hartman
Cc: linux-kernel, linux-gpio, devicetree, linux-input, linux-leds,
linux-pm, Bartosz Golaszewski
From: Bartosz Golaszewski <bgolaszewski@baylibre.com>
Add the DT binding document for the GPIO module of max77650.
Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
---
.../bindings/gpio/gpio-max77650.txt | 34 +++++++++++++++++++
1 file changed, 34 insertions(+)
create mode 100644 Documentation/devicetree/bindings/gpio/gpio-max77650.txt
diff --git a/Documentation/devicetree/bindings/gpio/gpio-max77650.txt b/Documentation/devicetree/bindings/gpio/gpio-max77650.txt
new file mode 100644
index 000000000000..b5dbbe934deb
--- /dev/null
+++ b/Documentation/devicetree/bindings/gpio/gpio-max77650.txt
@@ -0,0 +1,34 @@
+GPIO driver for MAX77650 PMIC from Maxim Integrated.
+
+This module is part of the MAX77650 MFD device. For more details
+see Documentation/devicetree/bindings/mfd/max77650.txt.
+
+The GPIO controller is represented as a sub-node of the PMIC node on
+the device tree.
+
+This device has a single GPIO pin.
+
+Required properties:
+--------------------
+- compatible: Must be "maxim,max77650-gpio"
+- gpio-controller : Marks the device node as a gpio controller.
+- #gpio-cells : Must be <2>. The first cell is the pin number and
+ the second cell is used to specify the gpio active
+ state.
+
+Optional properties:
+--------------------
+gpio-line-names: Single string containing the name of the GPIO line.
+
+For more details, please refer to the generic GPIO DT binding document
+<devicetree/bindings/gpio/gpio.txt>.
+
+Example:
+--------
+
+ gpio {
+ compatible = "maxim,max77650-gpio";
+ gpio-line-names = "max77650-charger";
+ gpio-controller;
+ #gpio-cells = <2>;
+ };
--
2.20.1
^ permalink raw reply related [flat|nested] 31+ messages in thread
* [PATCH v3 04/11] dt-bindings: leds: add DT bindings for max77650
2019-02-01 9:47 [PATCH v3 00/11] mfd: add support for max77650 PMIC Bartosz Golaszewski
` (2 preceding siblings ...)
2019-02-01 9:47 ` [PATCH v3 03/11] dt-bindings: gpio: " Bartosz Golaszewski
@ 2019-02-01 9:47 ` Bartosz Golaszewski
2019-02-01 9:47 ` [PATCH v3 05/11] dt-bindings: input: " Bartosz Golaszewski
` (6 subsequent siblings)
10 siblings, 0 replies; 31+ messages in thread
From: Bartosz Golaszewski @ 2019-02-01 9:47 UTC (permalink / raw)
To: Rob Herring, Mark Rutland, Linus Walleij, Dmitry Torokhov,
Jacek Anaszewski, Pavel Machek, Lee Jones, Sebastian Reichel,
Liam Girdwood, Greg Kroah-Hartman
Cc: linux-kernel, linux-gpio, devicetree, linux-input, linux-leds,
linux-pm, Bartosz Golaszewski
From: Bartosz Golaszewski <bgolaszewski@baylibre.com>
Add the DT binding document for the LEDs module of max77650.
Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
---
.../bindings/leds/leds-max77650.txt | 57 +++++++++++++++++++
1 file changed, 57 insertions(+)
create mode 100644 Documentation/devicetree/bindings/leds/leds-max77650.txt
diff --git a/Documentation/devicetree/bindings/leds/leds-max77650.txt b/Documentation/devicetree/bindings/leds/leds-max77650.txt
new file mode 100644
index 000000000000..3a67115cc1da
--- /dev/null
+++ b/Documentation/devicetree/bindings/leds/leds-max77650.txt
@@ -0,0 +1,57 @@
+LED driver for MAX77650 PMIC from Maxim Integrated.
+
+This module is part of the MAX77650 MFD device. For more details
+see Documentation/devicetree/bindings/mfd/max77650.txt.
+
+The LED controller is represented as a sub-node of the PMIC node on
+the device tree.
+
+This device has three current sinks.
+
+Required properties:
+--------------------
+- compatible: Must be "maxim,max77650-led"
+- #address-cells: Must be <1>.
+- #size-cells: Must be <0>.
+
+Each LED is represented as a sub-node of the LED-controller node. Up to
+three sub-nodes can be defined.
+
+Required properties of the sub-node:
+------------------------------------
+
+- reg: Must be <0>, <1> or <2>.
+
+Optional properties of the sub-node:
+------------------------------------
+
+- label: See Documentation/devicetree/bindings/leds/common.txt
+- linux,default-trigger: See Documentation/devicetree/bindings/leds/common.txt
+
+For more details, please refer to the generic GPIO DT binding document
+<devicetree/bindings/gpio/gpio.txt>.
+
+Example:
+--------
+
+ leds {
+ compatible = "maxim,max77650-led";
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ led@0 {
+ reg = <0>;
+ label = "blue:usr0";
+ };
+
+ led@1 {
+ reg = <1>;
+ label = "red:usr1";
+ linux,default-trigger = "heartbeat";
+ };
+
+ led@2 {
+ reg = <2>;
+ label = "green:usr2";
+ };
+ };
--
2.20.1
^ permalink raw reply related [flat|nested] 31+ messages in thread
* [PATCH v3 05/11] dt-bindings: input: add DT bindings for max77650
2019-02-01 9:47 [PATCH v3 00/11] mfd: add support for max77650 PMIC Bartosz Golaszewski
` (3 preceding siblings ...)
2019-02-01 9:47 ` [PATCH v3 04/11] dt-bindings: leds: " Bartosz Golaszewski
@ 2019-02-01 9:47 ` Bartosz Golaszewski
2019-02-01 9:47 ` [PATCH v3 06/11] mfd: max77650: new core mfd driver Bartosz Golaszewski
` (5 subsequent siblings)
10 siblings, 0 replies; 31+ messages in thread
From: Bartosz Golaszewski @ 2019-02-01 9:47 UTC (permalink / raw)
To: Rob Herring, Mark Rutland, Linus Walleij, Dmitry Torokhov,
Jacek Anaszewski, Pavel Machek, Lee Jones, Sebastian Reichel,
Liam Girdwood, Greg Kroah-Hartman
Cc: linux-kernel, linux-gpio, devicetree, linux-input, linux-leds,
linux-pm, Bartosz Golaszewski
From: Bartosz Golaszewski <bgolaszewski@baylibre.com>
Add the DT binding document for the onkey module of max77650.
Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
---
.../bindings/input/max77650-onkey.txt | 26 +++++++++++++++++++
1 file changed, 26 insertions(+)
create mode 100644 Documentation/devicetree/bindings/input/max77650-onkey.txt
diff --git a/Documentation/devicetree/bindings/input/max77650-onkey.txt b/Documentation/devicetree/bindings/input/max77650-onkey.txt
new file mode 100644
index 000000000000..37c80898be4d
--- /dev/null
+++ b/Documentation/devicetree/bindings/input/max77650-onkey.txt
@@ -0,0 +1,26 @@
+Onkey driver for MAX77650 PMIC from Maxim Integrated.
+
+This module is part of the MAX77650 MFD device. For more details
+see Documentation/devicetree/bindings/mfd/max77650.txt.
+
+The onkey controller is represented as a sub-node of the PMIC node on
+the device tree.
+
+Required properties:
+--------------------
+- compatible: Must be "maxim,max77650-onkey".
+
+Optional properties:
+- linux,code: The key-code to be reported when the key is pressed.
+ Defaults to KEY_POWER.
+- maxim,onkey-mode: Must be "push" or "slide" depending on the type of
+ button used by the system. Defaults to "push".
+
+Example:
+--------
+
+ onkey {
+ compatible = "maxim,max77650-onkey";
+ linux,code = <KEY_END>;
+ maxim,onkey-mode = "slide";
+ };
--
2.20.1
^ permalink raw reply related [flat|nested] 31+ messages in thread
* [PATCH v3 06/11] mfd: max77650: new core mfd driver
2019-02-01 9:47 [PATCH v3 00/11] mfd: add support for max77650 PMIC Bartosz Golaszewski
` (4 preceding siblings ...)
2019-02-01 9:47 ` [PATCH v3 05/11] dt-bindings: input: " Bartosz Golaszewski
@ 2019-02-01 9:47 ` Bartosz Golaszewski
2019-02-12 12:01 ` Pavel Machek
2019-02-01 9:47 ` [PATCH v3 07/11] power: supply: max77650: add support for battery charger Bartosz Golaszewski
` (4 subsequent siblings)
10 siblings, 1 reply; 31+ messages in thread
From: Bartosz Golaszewski @ 2019-02-01 9:47 UTC (permalink / raw)
To: Rob Herring, Mark Rutland, Linus Walleij, Dmitry Torokhov,
Jacek Anaszewski, Pavel Machek, Lee Jones, Sebastian Reichel,
Liam Girdwood, Greg Kroah-Hartman
Cc: linux-kernel, linux-gpio, devicetree, linux-input, linux-leds,
linux-pm, Bartosz Golaszewski
From: Bartosz Golaszewski <bgolaszewski@baylibre.com>
Add the core mfd driver for max77650 PMIC. We define five sub-devices
for which the drivers will be added in subsequent patches.
Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
---
drivers/mfd/Kconfig | 11 ++
drivers/mfd/Makefile | 1 +
drivers/mfd/max77650.c | 342 +++++++++++++++++++++++++++++++++++
include/linux/mfd/max77650.h | 59 ++++++
4 files changed, 413 insertions(+)
create mode 100644 drivers/mfd/max77650.c
create mode 100644 include/linux/mfd/max77650.h
diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
index f461460a2aeb..828fd193b4ee 100644
--- a/drivers/mfd/Kconfig
+++ b/drivers/mfd/Kconfig
@@ -734,6 +734,17 @@ config MFD_MAX77620
provides common support for accessing the device; additional drivers
must be enabled in order to use the functionality of the device.
+config MFD_MAX77650
+ tristate "Maxim MAX77650/77651 PMIC Support"
+ depends on I2C
+ depends on OF || COMPILE_TEST
+ select MFD_CORE
+ select REGMAP_I2C
+ help
+ Say yes here to add support for Maxim Semiconductor MAX77650 and
+ MAX77651 Power Management ICs. This is the core multifunction
+ driver for interacting with the device.
+
config MFD_MAX77686
tristate "Maxim Semiconductor MAX77686/802 PMIC Support"
depends on I2C
diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile
index 12980a4ad460..3b912a4015d1 100644
--- a/drivers/mfd/Makefile
+++ b/drivers/mfd/Makefile
@@ -151,6 +151,7 @@ obj-$(CONFIG_MFD_DA9150) += da9150-core.o
obj-$(CONFIG_MFD_MAX14577) += max14577.o
obj-$(CONFIG_MFD_MAX77620) += max77620.o
+obj-$(CONFIG_MFD_MAX77650) += max77650.o
obj-$(CONFIG_MFD_MAX77686) += max77686.o
obj-$(CONFIG_MFD_MAX77693) += max77693.o
obj-$(CONFIG_MFD_MAX77843) += max77843.o
diff --git a/drivers/mfd/max77650.c b/drivers/mfd/max77650.c
new file mode 100644
index 000000000000..7c6164f1fde4
--- /dev/null
+++ b/drivers/mfd/max77650.c
@@ -0,0 +1,342 @@
+// SPDX-License-Identifier: GPL-2.0
+//
+// Copyright (C) 2018 BayLibre SAS
+// Author: Bartosz Golaszewski <bgolaszewski@baylibre.com>
+//
+// Core MFD driver for MAXIM 77650/77651 charger/power-supply.
+
+#include <linux/i2c.h>
+#include <linux/interrupt.h>
+#include <linux/irq.h>
+#include <linux/mfd/core.h>
+#include <linux/mfd/max77650.h>
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/regmap.h>
+#include <linux/slab.h>
+
+#define MAX77650_INT_GPI_F_MSK BIT(0)
+#define MAX77650_INT_GPI_R_MSK BIT(1)
+#define MAX77650_INT_GPI_MSK \
+ (MAX77650_INT_GPI_F_MSK | MAX77650_INT_GPI_R_MSK)
+#define MAX77650_INT_nEN_F_MSK BIT(2)
+#define MAX77650_INT_nEN_R_MSK BIT(3)
+#define MAX77650_INT_TJAL1_R_MSK BIT(4)
+#define MAX77650_INT_TJAL2_R_MSK BIT(5)
+#define MAX77650_INT_DOD_R_MSK BIT(6)
+
+#define MAX77650_INT_THM_MSK BIT(0)
+#define MAX77650_INT_CHG_MSK BIT(1)
+#define MAX77650_INT_CHGIN_MSK BIT(2)
+#define MAX77650_INT_TJ_REG_MSK BIT(3)
+#define MAX77650_INT_CHGIN_CTRL_MSK BIT(4)
+#define MAX77650_INT_SYS_CTRL_MSK BIT(5)
+#define MAX77650_INT_SYS_CNFG_MSK BIT(6)
+
+#define MAX77650_INT_GLBL_OFFSET 0
+#define MAX77650_INT_CHG_OFFSET 1
+
+#define MAX77650_SBIA_LPM_MASK BIT(5)
+#define MAX77650_SBIA_LPM_DISABLED 0x00
+
+enum {
+ MAX77650_INT_GPI = 0,
+ MAX77650_INT_nEN_F,
+ MAX77650_INT_nEN_R,
+ MAX77650_INT_TJAL1_R,
+ MAX77650_INT_TJAL2_R,
+ MAX77650_INT_DOD_R,
+ MAX77650_INT_THM,
+ MAX77650_INT_CHG,
+ MAX77650_INT_CHGIN,
+ MAX77650_INT_TJ_REG,
+ MAX77650_INT_CHGIN_CTRL,
+ MAX77650_INT_SYS_CTRL,
+ MAX77650_INT_SYS_CNFG,
+};
+
+enum {
+ MAX77650_CELL_REGULATOR = 0,
+ MAX77650_CELL_CHARGER,
+ MAX77650_CELL_GPIO,
+ MAX77650_CELL_LED,
+ MAX77650_CELL_ONKEY,
+ MAX77650_NUM_CELLS,
+};
+
+struct max77650_irq_mapping {
+ int cell_num;
+ const int *irqs;
+ const char *const *irq_names;
+ unsigned int num_irqs;
+};
+
+static const int max77650_charger_irqs[] = {
+ MAX77650_INT_CHG,
+ MAX77650_INT_CHGIN,
+};
+
+static const int max77650_gpio_irqs[] = {
+ MAX77650_INT_GPI,
+};
+
+static const int max77650_onkey_irqs[] = {
+ MAX77650_INT_nEN_F,
+ MAX77650_INT_nEN_R,
+};
+
+static const char *const max77650_charger_irq_names[] = {
+ "CHG",
+ "CHGIN",
+};
+
+static const char *const max77650_gpio_irq_names[] = {
+ "GPI",
+};
+
+static const char *const max77650_onkey_irq_names[] = {
+ "nEN_F",
+ "nEN_R",
+};
+
+static const struct max77650_irq_mapping max77650_irq_mapping_table[] = {
+ {
+ .cell_num = MAX77650_CELL_CHARGER,
+ .irqs = max77650_charger_irqs,
+ .irq_names = max77650_charger_irq_names,
+ .num_irqs = ARRAY_SIZE(max77650_charger_irqs),
+ },
+ {
+ .cell_num = MAX77650_CELL_GPIO,
+ .irqs = max77650_gpio_irqs,
+ .irq_names = max77650_gpio_irq_names,
+ .num_irqs = ARRAY_SIZE(max77650_gpio_irqs),
+ },
+ {
+ .cell_num = MAX77650_CELL_ONKEY,
+ .irqs = max77650_onkey_irqs,
+ .irq_names = max77650_onkey_irq_names,
+ .num_irqs = ARRAY_SIZE(max77650_onkey_irqs),
+ },
+};
+
+static const struct mfd_cell max77650_cells[] = {
+ [MAX77650_CELL_REGULATOR] = {
+ .name = "max77650-regulator",
+ .of_compatible = "maxim,max77650-regulator",
+ },
+ [MAX77650_CELL_CHARGER] = {
+ .name = "max77650-charger",
+ .of_compatible = "maxim,max77650-charger",
+ },
+ [MAX77650_CELL_GPIO] = {
+ .name = "max77650-gpio",
+ .of_compatible = "maxim,max77650-gpio",
+ },
+ [MAX77650_CELL_LED] = {
+ .name = "max77650-led",
+ .of_compatible = "maxim,max77650-led",
+ },
+ [MAX77650_CELL_ONKEY] = {
+ .name = "max77650-onkey",
+ .of_compatible = "maxim,max77650-onkey",
+ },
+};
+
+static const struct regmap_irq max77650_irqs[] = {
+ [MAX77650_INT_GPI] = {
+ .reg_offset = MAX77650_INT_GLBL_OFFSET,
+ .mask = MAX77650_INT_GPI_MSK,
+ .type = {
+ .type_falling_val = MAX77650_INT_GPI_F_MSK,
+ .type_rising_val = MAX77650_INT_GPI_R_MSK,
+ .types_supported = IRQ_TYPE_EDGE_BOTH,
+ },
+ },
+ [MAX77650_INT_nEN_F] = {
+ .reg_offset = MAX77650_INT_GLBL_OFFSET,
+ .mask = MAX77650_INT_nEN_F_MSK,
+ },
+ [MAX77650_INT_nEN_R] = {
+ .reg_offset = MAX77650_INT_GLBL_OFFSET,
+ .mask = MAX77650_INT_nEN_R_MSK,
+ },
+ [MAX77650_INT_TJAL1_R] = {
+ .reg_offset = MAX77650_INT_GLBL_OFFSET,
+ .mask = MAX77650_INT_TJAL1_R_MSK,
+ },
+ [MAX77650_INT_TJAL2_R] = {
+ .reg_offset = MAX77650_INT_GLBL_OFFSET,
+ .mask = MAX77650_INT_TJAL2_R_MSK,
+ },
+ [MAX77650_INT_DOD_R] = {
+ .reg_offset = MAX77650_INT_GLBL_OFFSET,
+ .mask = MAX77650_INT_DOD_R_MSK,
+ },
+ [MAX77650_INT_THM] = {
+ .reg_offset = MAX77650_INT_CHG_OFFSET,
+ .mask = MAX77650_INT_THM_MSK,
+ },
+ [MAX77650_INT_CHG] = {
+ .reg_offset = MAX77650_INT_CHG_OFFSET,
+ .mask = MAX77650_INT_CHG_MSK,
+ },
+ [MAX77650_INT_CHGIN] = {
+ .reg_offset = MAX77650_INT_CHG_OFFSET,
+ .mask = MAX77650_INT_CHGIN_MSK,
+ },
+ [MAX77650_INT_TJ_REG] = {
+ .reg_offset = MAX77650_INT_CHG_OFFSET,
+ .mask = MAX77650_INT_TJ_REG_MSK,
+ },
+ [MAX77650_INT_CHGIN_CTRL] = {
+ .reg_offset = MAX77650_INT_CHG_OFFSET,
+ .mask = MAX77650_INT_CHGIN_CTRL_MSK,
+ },
+ [MAX77650_INT_SYS_CTRL] = {
+ .reg_offset = MAX77650_INT_CHG_OFFSET,
+ .mask = MAX77650_INT_SYS_CTRL_MSK,
+ },
+ [MAX77650_INT_SYS_CNFG] = {
+ .reg_offset = MAX77650_INT_CHG_OFFSET,
+ .mask = MAX77650_INT_SYS_CNFG_MSK,
+ },
+};
+
+static const struct regmap_irq_chip max77650_irq_chip = {
+ .name = "max77650-irq",
+ .irqs = max77650_irqs,
+ .num_irqs = ARRAY_SIZE(max77650_irqs),
+ .num_regs = 2,
+ .status_base = MAX77650_REG_INT_GLBL,
+ .mask_base = MAX77650_REG_INTM_GLBL,
+ .type_in_mask = true,
+ .type_invert = true,
+ .init_ack_masked = true,
+ .clear_on_unmask = true,
+};
+
+static const struct regmap_config max77650_regmap_config = {
+ .name = "max77650",
+ .reg_bits = 8,
+ .val_bits = 8,
+};
+
+static int max77650_setup_irqs(struct device *dev, struct mfd_cell *cells)
+{
+ const struct max77650_irq_mapping *mapping;
+ struct regmap_irq_chip_data *irq_data;
+ struct i2c_client *i2c;
+ struct mfd_cell *cell;
+ struct resource *res;
+ struct regmap *map;
+ int i, j, irq, rv;
+
+ i2c = to_i2c_client(dev);
+
+ map = dev_get_regmap(dev, NULL);
+ if (!map)
+ return -ENODEV;
+
+ rv = devm_regmap_add_irq_chip(dev, map, i2c->irq,
+ IRQF_ONESHOT | IRQF_SHARED, -1,
+ &max77650_irq_chip, &irq_data);
+ if (rv)
+ return rv;
+
+ for (i = 0; i < ARRAY_SIZE(max77650_irq_mapping_table); i++) {
+ mapping = &max77650_irq_mapping_table[i];
+ cell = &cells[mapping->cell_num];
+
+ res = devm_kcalloc(dev, sizeof(*res),
+ mapping->num_irqs, GFP_KERNEL);
+ if (!res)
+ return -ENOMEM;
+
+ cell->resources = res;
+ cell->num_resources = mapping->num_irqs;
+
+ for (j = 0; j < mapping->num_irqs; j++) {
+ irq = regmap_irq_get_virq(irq_data, mapping->irqs[j]);
+ if (irq < 0)
+ return irq;
+
+ res[j].start = res[j].end = irq;
+ res[j].flags = IORESOURCE_IRQ;
+ res[j].name = mapping->irq_names[j];
+ }
+ }
+
+ return 0;
+}
+
+static int max77650_i2c_probe(struct i2c_client *i2c)
+{
+ struct device *dev = &i2c->dev;
+ struct mfd_cell *cells;
+ struct regmap *map;
+ unsigned int val;
+ int rv;
+
+ map = devm_regmap_init_i2c(i2c, &max77650_regmap_config);
+ if (IS_ERR(map))
+ return PTR_ERR(map);
+
+ rv = regmap_read(map, MAX77650_REG_CID, &val);
+ if (rv)
+ return rv;
+
+ switch (MAX77650_CID_BITS(val)) {
+ case MAX77650_CID_77650A:
+ case MAX77650_CID_77650C:
+ case MAX77650_CID_77651A:
+ case MAX77650_CID_77651B:
+ break;
+ default:
+ return -ENODEV;
+ }
+
+ /*
+ * This IC has a low-power mode which reduces the quiescent current
+ * consumption to ~5.6uA but is only suitable for systems consuming
+ * less than ~2mA. Since this is not likely the case even on
+ * linux-based wearables - keep the chip in normal power mode.
+ */
+ rv = regmap_update_bits(map,
+ MAX77650_REG_CNFG_GLBL,
+ MAX77650_SBIA_LPM_MASK,
+ MAX77650_SBIA_LPM_DISABLED);
+ if (rv)
+ return rv;
+
+ cells = devm_kmemdup(dev, max77650_cells,
+ sizeof(max77650_cells), GFP_KERNEL);
+ if (!cells)
+ return -ENOMEM;
+
+ rv = max77650_setup_irqs(dev, cells);
+ if (rv)
+ return rv;
+
+ return devm_mfd_add_devices(dev, -1, cells,
+ MAX77650_NUM_CELLS, NULL, 0, NULL);
+}
+
+static const struct of_device_id max77650_of_match[] = {
+ { .compatible = "maxim,max77650" },
+ { }
+};
+MODULE_DEVICE_TABLE(of, max77650_of_match);
+
+static struct i2c_driver max77650_i2c_driver = {
+ .driver = {
+ .name = "max77650",
+ .of_match_table = of_match_ptr(max77650_of_match),
+ },
+ .probe_new = max77650_i2c_probe,
+};
+module_i2c_driver(max77650_i2c_driver);
+
+MODULE_DESCRIPTION("MAXIM 77650/77651 multi-function core driver");
+MODULE_AUTHOR("Bartosz Golaszewski <bgolaszewski@baylibre.com>");
+MODULE_LICENSE("GPL v2");
diff --git a/include/linux/mfd/max77650.h b/include/linux/mfd/max77650.h
new file mode 100644
index 000000000000..c809e211a8cd
--- /dev/null
+++ b/include/linux/mfd/max77650.h
@@ -0,0 +1,59 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2018 BayLibre SAS
+ * Author: Bartosz Golaszewski <bgolaszewski@baylibre.com>
+ *
+ * Common definitions for MAXIM 77650/77651 charger/power-supply.
+ */
+
+#ifndef MAX77650_H
+#define MAX77650_H
+
+#include <linux/bits.h>
+
+#define MAX77650_REG_INT_GLBL 0x00
+#define MAX77650_REG_INT_CHG 0x01
+#define MAX77650_REG_STAT_CHG_A 0x02
+#define MAX77650_REG_STAT_CHG_B 0x03
+#define MAX77650_REG_ERCFLAG 0x04
+#define MAX77650_REG_STAT_GLBL 0x05
+#define MAX77650_REG_INTM_GLBL 0x06
+#define MAX77650_REG_INTM_CHG 0x07
+#define MAX77650_REG_CNFG_GLBL 0x10
+#define MAX77650_REG_CID 0x11
+#define MAX77650_REG_CNFG_GPIO 0x12
+#define MAX77650_REG_CNFG_CHG_A 0x18
+#define MAX77650_REG_CNFG_CHG_B 0x19
+#define MAX77650_REG_CNFG_CHG_C 0x1a
+#define MAX77650_REG_CNFG_CHG_D 0x1b
+#define MAX77650_REG_CNFG_CHG_E 0x1c
+#define MAX77650_REG_CNFG_CHG_F 0x1d
+#define MAX77650_REG_CNFG_CHG_G 0x1e
+#define MAX77650_REG_CNFG_CHG_H 0x1f
+#define MAX77650_REG_CNFG_CHG_I 0x20
+#define MAX77650_REG_CNFG_SBB_TOP 0x28
+#define MAX77650_REG_CNFG_SBB0_A 0x29
+#define MAX77650_REG_CNFG_SBB0_B 0x2a
+#define MAX77650_REG_CNFG_SBB1_A 0x2b
+#define MAX77650_REG_CNFG_SBB1_B 0x2c
+#define MAX77650_REG_CNFG_SBB2_A 0x2d
+#define MAX77650_REG_CNFG_SBB2_B 0x2e
+#define MAX77650_REG_CNFG_LDO_A 0x38
+#define MAX77650_REG_CNFG_LDO_B 0x39
+#define MAX77650_REG_CNFG_LED0_A 0x40
+#define MAX77650_REG_CNFG_LED1_A 0x41
+#define MAX77650_REG_CNFG_LED2_A 0x42
+#define MAX77650_REG_CNFG_LED0_B 0x43
+#define MAX77650_REG_CNFG_LED1_B 0x44
+#define MAX77650_REG_CNFG_LED2_B 0x45
+#define MAX77650_REG_CNFG_LED_TOP 0x46
+
+#define MAX77650_CID_MASK GENMASK(3, 0)
+#define MAX77650_CID_BITS(_reg) (_reg & MAX77650_CID_MASK)
+
+#define MAX77650_CID_77650A 0x03
+#define MAX77650_CID_77650C 0x0a
+#define MAX77650_CID_77651A 0x06
+#define MAX77650_CID_77651B 0x08
+
+#endif /* MAX77650_H */
--
2.20.1
^ permalink raw reply related [flat|nested] 31+ messages in thread
* [PATCH v3 07/11] power: supply: max77650: add support for battery charger
2019-02-01 9:47 [PATCH v3 00/11] mfd: add support for max77650 PMIC Bartosz Golaszewski
` (5 preceding siblings ...)
2019-02-01 9:47 ` [PATCH v3 06/11] mfd: max77650: new core mfd driver Bartosz Golaszewski
@ 2019-02-01 9:47 ` Bartosz Golaszewski
2019-02-12 12:07 ` Pavel Machek
2019-02-12 12:08 ` Pavel Machek
2019-02-01 9:47 ` [PATCH v3 08/11] gpio: max77650: add GPIO support Bartosz Golaszewski
` (3 subsequent siblings)
10 siblings, 2 replies; 31+ messages in thread
From: Bartosz Golaszewski @ 2019-02-01 9:47 UTC (permalink / raw)
To: Rob Herring, Mark Rutland, Linus Walleij, Dmitry Torokhov,
Jacek Anaszewski, Pavel Machek, Lee Jones, Sebastian Reichel,
Liam Girdwood, Greg Kroah-Hartman
Cc: linux-kernel, linux-gpio, devicetree, linux-input, linux-leds,
linux-pm, Bartosz Golaszewski
From: Bartosz Golaszewski <bgolaszewski@baylibre.com>
Add basic support for the battery charger for max77650 PMIC.
Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
---
drivers/power/supply/Kconfig | 7 +
drivers/power/supply/Makefile | 1 +
drivers/power/supply/max77650-charger.c | 355 ++++++++++++++++++++++++
3 files changed, 363 insertions(+)
create mode 100644 drivers/power/supply/max77650-charger.c
diff --git a/drivers/power/supply/Kconfig b/drivers/power/supply/Kconfig
index e901b9879e7e..0230c96fa94d 100644
--- a/drivers/power/supply/Kconfig
+++ b/drivers/power/supply/Kconfig
@@ -499,6 +499,13 @@ config CHARGER_DETECTOR_MAX14656
Revision 1.2 and can be found e.g. in Kindle 4/5th generation
readers and certain LG devices.
+config CHARGER_MAX77650
+ tristate "Maxim MAX77650 battery charger driver"
+ depends on MFD_MAX77650
+ help
+ Say Y to enable support for the battery charger control of MAX77650
+ PMICs.
+
config CHARGER_MAX77693
tristate "Maxim MAX77693 battery charger driver"
depends on MFD_MAX77693
diff --git a/drivers/power/supply/Makefile b/drivers/power/supply/Makefile
index b731c2a9b695..b73eb8c5c1a9 100644
--- a/drivers/power/supply/Makefile
+++ b/drivers/power/supply/Makefile
@@ -70,6 +70,7 @@ obj-$(CONFIG_CHARGER_MANAGER) += charger-manager.o
obj-$(CONFIG_CHARGER_LTC3651) += ltc3651-charger.o
obj-$(CONFIG_CHARGER_MAX14577) += max14577_charger.o
obj-$(CONFIG_CHARGER_DETECTOR_MAX14656) += max14656_charger_detector.o
+obj-$(CONFIG_CHARGER_MAX77650) += max77650-charger.o
obj-$(CONFIG_CHARGER_MAX77693) += max77693_charger.o
obj-$(CONFIG_CHARGER_MAX8997) += max8997_charger.o
obj-$(CONFIG_CHARGER_MAX8998) += max8998_charger.o
diff --git a/drivers/power/supply/max77650-charger.c b/drivers/power/supply/max77650-charger.c
new file mode 100644
index 000000000000..7055c9b5ee24
--- /dev/null
+++ b/drivers/power/supply/max77650-charger.c
@@ -0,0 +1,355 @@
+// SPDX-License-Identifier: GPL-2.0
+//
+// Copyright (C) 2018 BayLibre SAS
+// Author: Bartosz Golaszewski <bgolaszewski@baylibre.com>
+//
+// Battery charger driver for MAXIM 77650/77651 charger/power-supply.
+
+#include <linux/i2c.h>
+#include <linux/interrupt.h>
+#include <linux/mfd/max77650.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include <linux/power_supply.h>
+#include <linux/regmap.h>
+
+#define MAX77650_CHARGER_ENABLED BIT(0)
+#define MAX77650_CHARGER_DISABLED 0x00
+#define MAX77650_CHARGER_CHG_EN_MASK BIT(0)
+
+#define MAX77650_CHARGER_CHG_DTLS_MASK GENMASK(7, 4)
+#define MAX77650_CHARGER_CHG_DTLS_BITS(_reg) \
+ (((_reg) & MAX77650_CHARGER_CHG_DTLS_MASK) >> 4)
+
+#define MAX77650_CHARGER_CHG_OFF 0x00
+#define MAX77650_CHARGER_CHG_PREQ 0x01
+#define MAX77650_CHARGER_CHG_ON_CURR 0x02
+#define MAX77650_CHARGER_CHG_ON_JCURR 0x03
+#define MAX77650_CHARGER_CHG_ON_VOLT 0x04
+#define MAX77650_CHARGER_CHG_ON_JVOLT 0x05
+#define MAX77650_CHARGER_CHG_ON_TOPOFF 0x06
+#define MAX77650_CHARGER_CHG_ON_JTOPOFF 0x07
+#define MAX77650_CHARGER_CHG_DONE 0x08
+#define MAX77650_CHARGER_CHG_JDONE 0x09
+#define MAX77650_CHARGER_CHG_SUSP_PF 0x0a
+#define MAX77650_CHARGER_CHG_SUSP_FCF 0x0b
+#define MAX77650_CHARGER_CHG_SUSP_BTF 0x0c
+
+#define MAX77650_CHARGER_CHGIN_DTLS_MASK GENMASK(3, 2)
+#define MAX77650_CHARGER_CHGIN_DTLS_BITS(_reg) \
+ (((_reg) & MAX77650_CHARGER_CHGIN_DTLS_MASK) >> 2)
+
+#define MAX77650_CHARGER_CHGIN_UVL 0x00
+#define MAX77650_CHARGER_CHGIN_OVL 0x01
+#define MAX77650_CHARGER_CHGIN_OKAY 0x11
+
+#define MAX77650_CHARGER_CHG_MASK BIT(1)
+#define MAX77650_CHARGER_CHG_CHARGING(_reg) \
+ (((_reg) & MAX77650_CHARGER_CHG_MASK) > 1)
+
+#define MAX77650_CHARGER_VCHGIN_MIN_MASK 0xc0
+#define MAX77650_CHARGER_VCHGIN_MIN_SHIFT(_val) ((_val) << 5)
+
+#define MAX77650_CHARGER_ICHGIN_LIM_MASK 0x1c
+#define MAX77650_CHARGER_ICHGIN_LIM_SHIFT(_val) ((_val) << 2)
+
+struct max77650_charger_data {
+ struct regmap *map;
+ struct device *dev;
+};
+
+static enum power_supply_property max77650_charger_properties[] = {
+ POWER_SUPPLY_PROP_STATUS,
+ POWER_SUPPLY_PROP_ONLINE,
+ POWER_SUPPLY_PROP_CHARGE_TYPE
+};
+
+static const unsigned int max77650_charger_vchgin_min_table[] = {
+ 4000000, 4100000, 4200000, 4300000, 4400000, 4500000, 4600000, 4700000
+};
+
+static const unsigned int max77650_charger_ichgin_lim_table[] = {
+ 95000, 190000, 285000, 380000, 475000
+};
+
+static int max77650_charger_set_vchgin_min(struct max77650_charger_data *chg,
+ unsigned int val)
+{
+ int i, rv;
+
+ for (i = 0; i < ARRAY_SIZE(max77650_charger_vchgin_min_table); i++) {
+ if (val == max77650_charger_vchgin_min_table[i]) {
+ rv = regmap_update_bits(chg->map,
+ MAX77650_REG_CNFG_CHG_B,
+ MAX77650_CHARGER_VCHGIN_MIN_MASK,
+ MAX77650_CHARGER_VCHGIN_MIN_SHIFT(i));
+ if (rv)
+ return rv;
+
+ return 0;
+ }
+ }
+
+ return -EINVAL;
+}
+
+static int max77650_charger_set_ichgin_lim(struct max77650_charger_data *chg,
+ unsigned int val)
+{
+ int i, rv;
+
+ for (i = 0; i < ARRAY_SIZE(max77650_charger_ichgin_lim_table); i++) {
+ if (val == max77650_charger_ichgin_lim_table[i]) {
+ rv = regmap_update_bits(chg->map,
+ MAX77650_REG_CNFG_CHG_B,
+ MAX77650_CHARGER_ICHGIN_LIM_MASK,
+ MAX77650_CHARGER_ICHGIN_LIM_SHIFT(i));
+ if (rv)
+ return rv;
+
+ return 0;
+ }
+ }
+
+ return -EINVAL;
+}
+
+static void max77650_charger_enable(struct max77650_charger_data *chg)
+{
+ int rv;
+
+ rv = regmap_update_bits(chg->map,
+ MAX77650_REG_CNFG_CHG_B,
+ MAX77650_CHARGER_CHG_EN_MASK,
+ MAX77650_CHARGER_ENABLED);
+ if (rv)
+ dev_err(chg->dev, "unable to enable the charger: %d\n", rv);
+}
+
+static void max77650_charger_disable(struct max77650_charger_data *chg)
+{
+ int rv;
+
+ rv = regmap_update_bits(chg->map,
+ MAX77650_REG_CNFG_CHG_B,
+ MAX77650_CHARGER_CHG_EN_MASK,
+ MAX77650_CHARGER_DISABLED);
+ if (rv)
+ dev_err(chg->dev, "unable to disable the charger: %d\n", rv);
+}
+
+static irqreturn_t max77650_charger_check_status(int irq, void *data)
+{
+ struct max77650_charger_data *chg = data;
+ int rv, reg;
+
+ rv = regmap_read(chg->map, MAX77650_REG_STAT_CHG_B, ®);
+ if (rv) {
+ dev_err(chg->dev,
+ "unable to read the charger status: %d\n", rv);
+ return IRQ_HANDLED;
+ }
+
+ switch (MAX77650_CHARGER_CHGIN_DTLS_BITS(reg)) {
+ case MAX77650_CHARGER_CHGIN_UVL:
+ dev_err(chg->dev, "undervoltage lockout detected, disabling charger\n");
+ max77650_charger_disable(chg);
+ break;
+ case MAX77650_CHARGER_CHGIN_OVL:
+ dev_err(chg->dev, "overvoltage lockout detected, disabling charger\n");
+ max77650_charger_disable(chg);
+ break;
+ case MAX77650_CHARGER_CHGIN_OKAY:
+ max77650_charger_enable(chg);
+ break;
+ default:
+ /* May be 0x10 - debouncing */
+ break;
+ }
+
+ return IRQ_HANDLED;
+}
+
+static int max77650_charger_get_property(struct power_supply *psy,
+ enum power_supply_property psp,
+ union power_supply_propval *val)
+{
+ struct max77650_charger_data *chg = power_supply_get_drvdata(psy);
+ int rv, reg;
+
+ switch (psp) {
+ case POWER_SUPPLY_PROP_STATUS:
+ rv = regmap_read(chg->map, MAX77650_REG_STAT_CHG_B, ®);
+ if (rv)
+ return rv;
+
+ if (MAX77650_CHARGER_CHG_CHARGING(reg)) {
+ val->intval = POWER_SUPPLY_STATUS_CHARGING;
+ break;
+ }
+
+ switch (MAX77650_CHARGER_CHG_DTLS_BITS(reg)) {
+ case MAX77650_CHARGER_CHG_OFF:
+ case MAX77650_CHARGER_CHG_SUSP_PF:
+ case MAX77650_CHARGER_CHG_SUSP_FCF:
+ case MAX77650_CHARGER_CHG_SUSP_BTF:
+ val->intval = POWER_SUPPLY_STATUS_NOT_CHARGING;
+ break;
+ case MAX77650_CHARGER_CHG_PREQ:
+ case MAX77650_CHARGER_CHG_ON_CURR:
+ case MAX77650_CHARGER_CHG_ON_JCURR:
+ case MAX77650_CHARGER_CHG_ON_VOLT:
+ case MAX77650_CHARGER_CHG_ON_JVOLT:
+ case MAX77650_CHARGER_CHG_ON_TOPOFF:
+ case MAX77650_CHARGER_CHG_ON_JTOPOFF:
+ val->intval = POWER_SUPPLY_STATUS_CHARGING;
+ break;
+ case MAX77650_CHARGER_CHG_DONE:
+ val->intval = POWER_SUPPLY_STATUS_FULL;
+ break;
+ default:
+ val->intval = POWER_SUPPLY_STATUS_UNKNOWN;
+ }
+ break;
+ case POWER_SUPPLY_PROP_ONLINE:
+ rv = regmap_read(chg->map, MAX77650_REG_STAT_CHG_B, ®);
+ if (rv)
+ return rv;
+
+ val->intval = MAX77650_CHARGER_CHG_CHARGING(reg);
+ break;
+ case POWER_SUPPLY_PROP_CHARGE_TYPE:
+ rv = regmap_read(chg->map, MAX77650_REG_STAT_CHG_B, ®);
+ if (rv)
+ return rv;
+
+ if (!MAX77650_CHARGER_CHG_CHARGING(reg)) {
+ val->intval = POWER_SUPPLY_CHARGE_TYPE_NONE;
+ break;
+ }
+
+ switch (MAX77650_CHARGER_CHG_DTLS_BITS(reg)) {
+ case MAX77650_CHARGER_CHG_PREQ:
+ case MAX77650_CHARGER_CHG_ON_CURR:
+ case MAX77650_CHARGER_CHG_ON_JCURR:
+ case MAX77650_CHARGER_CHG_ON_VOLT:
+ case MAX77650_CHARGER_CHG_ON_JVOLT:
+ val->intval = POWER_SUPPLY_CHARGE_TYPE_FAST;
+ break;
+ case MAX77650_CHARGER_CHG_ON_TOPOFF:
+ case MAX77650_CHARGER_CHG_ON_JTOPOFF:
+ val->intval = POWER_SUPPLY_CHARGE_TYPE_TRICKLE;
+ break;
+ default:
+ val->intval = POWER_SUPPLY_CHARGE_TYPE_UNKNOWN;
+ }
+ break;
+ default:
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
+static const struct power_supply_desc max77650_battery_desc = {
+ .name = "max77650",
+ .type = POWER_SUPPLY_TYPE_USB,
+ .get_property = max77650_charger_get_property,
+ .properties = max77650_charger_properties,
+ .num_properties = ARRAY_SIZE(max77650_charger_properties),
+};
+
+static int max77650_charger_probe(struct platform_device *pdev)
+{
+ struct power_supply_config pscfg = {};
+ struct max77650_charger_data *chg;
+ struct power_supply *battery;
+ struct device *dev, *parent;
+ int rv, chg_irq, chgin_irq;
+ unsigned int prop;
+
+ dev = &pdev->dev;
+ parent = dev->parent;
+
+ chg = devm_kzalloc(dev, sizeof(*chg), GFP_KERNEL);
+ if (!chg)
+ return -ENOMEM;
+
+ platform_set_drvdata(pdev, chg);
+
+ chg->map = dev_get_regmap(parent, NULL);
+ if (!chg->map)
+ return -ENODEV;
+
+ chg->dev = dev;
+
+ pscfg.of_node = dev->of_node;
+ pscfg.drv_data = chg;
+
+ chg_irq = platform_get_irq_byname(pdev, "CHG");
+ if (chg_irq < 0)
+ return chg_irq;
+
+ chgin_irq = platform_get_irq_byname(pdev, "CHGIN");
+ if (chgin_irq < 0)
+ return chgin_irq;
+
+ rv = devm_request_any_context_irq(dev, chg_irq,
+ max77650_charger_check_status,
+ IRQF_ONESHOT, "chg", chg);
+ if (rv < 0)
+ return rv;
+
+ rv = devm_request_any_context_irq(dev, chgin_irq,
+ max77650_charger_check_status,
+ IRQF_ONESHOT, "chgin", chg);
+ if (rv < 0)
+ return rv;
+
+ battery = devm_power_supply_register(dev,
+ &max77650_battery_desc, &pscfg);
+ if (IS_ERR(battery))
+ return PTR_ERR(battery);
+
+ rv = of_property_read_u32(dev->of_node, "maxim,vchgin-min", &prop);
+ if (rv == 0) {
+ rv = max77650_charger_set_vchgin_min(chg, prop);
+ if (rv)
+ return rv;
+ }
+
+ rv = of_property_read_u32(dev->of_node, "maxim,ichgin-lim", &prop);
+ if (rv == 0) {
+ rv = max77650_charger_set_ichgin_lim(chg, prop);
+ if (rv)
+ return rv;
+ }
+
+ return regmap_update_bits(chg->map,
+ MAX77650_REG_CNFG_CHG_B,
+ MAX77650_CHARGER_CHG_EN_MASK,
+ MAX77650_CHARGER_ENABLED);
+}
+
+static int max77650_charger_remove(struct platform_device *pdev)
+{
+ struct max77650_charger_data *chg = platform_get_drvdata(pdev);
+
+ return regmap_update_bits(chg->map,
+ MAX77650_REG_CNFG_CHG_B,
+ MAX77650_CHARGER_CHG_EN_MASK,
+ MAX77650_CHARGER_DISABLED);
+}
+
+static struct platform_driver max77650_charger_driver = {
+ .driver = {
+ .name = "max77650-charger",
+ },
+ .probe = max77650_charger_probe,
+ .remove = max77650_charger_remove,
+};
+module_platform_driver(max77650_charger_driver);
+
+MODULE_DESCRIPTION("MAXIM 77650/77651 charger driver");
+MODULE_AUTHOR("Bartosz Golaszewski <bgolaszewski@baylibre.com>");
+MODULE_LICENSE("GPL v2");
--
2.20.1
^ permalink raw reply related [flat|nested] 31+ messages in thread
* [PATCH v3 08/11] gpio: max77650: add GPIO support
2019-02-01 9:47 [PATCH v3 00/11] mfd: add support for max77650 PMIC Bartosz Golaszewski
` (6 preceding siblings ...)
2019-02-01 9:47 ` [PATCH v3 07/11] power: supply: max77650: add support for battery charger Bartosz Golaszewski
@ 2019-02-01 9:47 ` Bartosz Golaszewski
2019-02-04 10:49 ` Bartosz Golaszewski
2019-02-01 9:47 ` [PATCH v3 09/11] leds: max77650: add LEDs support Bartosz Golaszewski
` (2 subsequent siblings)
10 siblings, 1 reply; 31+ messages in thread
From: Bartosz Golaszewski @ 2019-02-01 9:47 UTC (permalink / raw)
To: Rob Herring, Mark Rutland, Linus Walleij, Dmitry Torokhov,
Jacek Anaszewski, Pavel Machek, Lee Jones, Sebastian Reichel,
Liam Girdwood, Greg Kroah-Hartman
Cc: linux-kernel, linux-gpio, devicetree, linux-input, linux-leds,
linux-pm, Bartosz Golaszewski
From: Bartosz Golaszewski <bgolaszewski@baylibre.com>
Add GPIO support for max77650 mfd device. This PMIC exposes a single
GPIO line.
Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
---
drivers/gpio/Kconfig | 7 ++
drivers/gpio/Makefile | 1 +
drivers/gpio/gpio-max77650.c | 189 +++++++++++++++++++++++++++++++++++
3 files changed, 197 insertions(+)
create mode 100644 drivers/gpio/gpio-max77650.c
diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig
index b5a2845347ec..fb297fe5bfec 100644
--- a/drivers/gpio/Kconfig
+++ b/drivers/gpio/Kconfig
@@ -1095,6 +1095,13 @@ config GPIO_MAX77620
driver also provides interrupt support for each of the gpios.
Say yes here to enable the max77620 to be used as gpio controller.
+config GPIO_MAX77650
+ tristate "Maxim MAX77650/77651 GPIO support"
+ depends on MFD_MAX77650
+ help
+ GPIO driver for MAX77650/77651 PMIC from Maxim Semiconductor.
+ These chips have a single pin that can be configured as GPIO.
+
config GPIO_MSIC
bool "Intel MSIC mixed signal gpio support"
depends on (X86 || COMPILE_TEST) && MFD_INTEL_MSIC
diff --git a/drivers/gpio/Makefile b/drivers/gpio/Makefile
index 37628f8dbf70..8bdad50db822 100644
--- a/drivers/gpio/Makefile
+++ b/drivers/gpio/Makefile
@@ -78,6 +78,7 @@ obj-$(CONFIG_GPIO_MAX7300) += gpio-max7300.o
obj-$(CONFIG_GPIO_MAX7301) += gpio-max7301.o
obj-$(CONFIG_GPIO_MAX732X) += gpio-max732x.o
obj-$(CONFIG_GPIO_MAX77620) += gpio-max77620.o
+obj-$(CONFIG_GPIO_MAX77650) += gpio-max77650.o
obj-$(CONFIG_GPIO_MB86S7X) += gpio-mb86s7x.o
obj-$(CONFIG_GPIO_MENZ127) += gpio-menz127.o
obj-$(CONFIG_GPIO_MERRIFIELD) += gpio-merrifield.o
diff --git a/drivers/gpio/gpio-max77650.c b/drivers/gpio/gpio-max77650.c
new file mode 100644
index 000000000000..8382dd85c548
--- /dev/null
+++ b/drivers/gpio/gpio-max77650.c
@@ -0,0 +1,189 @@
+// SPDX-License-Identifier: GPL-2.0
+//
+// Copyright (C) 2018 BayLibre SAS
+// Author: Bartosz Golaszewski <bgolaszewski@baylibre.com>
+//
+// GPIO driver for MAXIM 77650/77651 charger/power-supply.
+
+#include <linux/gpio/driver.h>
+#include <linux/i2c.h>
+#include <linux/mfd/max77650.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include <linux/regmap.h>
+
+#define MAX77650_GPIO_DIR_MASK BIT(0)
+#define MAX77650_GPIO_INVAL_MASK BIT(1)
+#define MAX77650_GPIO_DRV_MASK BIT(2)
+#define MAX77650_GPIO_OUTVAL_MASK BIT(3)
+#define MAX77650_GPIO_DEBOUNCE_MASK BIT(4)
+
+#define MAX77650_GPIO_DIR_OUT 0x00
+#define MAX77650_GPIO_DIR_IN BIT(0)
+#define MAX77650_GPIO_OUT_LOW 0x00
+#define MAX77650_GPIO_OUT_HIGH BIT(3)
+#define MAX77650_GPIO_DRV_OPEN_DRAIN 0x00
+#define MAX77650_GPIO_DRV_PUSH_PULL BIT(2)
+#define MAX77650_GPIO_DEBOUNCE BIT(4)
+
+#define MAX77650_GPIO_DIR_BITS(_reg) \
+ ((_reg) & MAX77650_GPIO_DIR_MASK)
+#define MAX77650_GPIO_INVAL_BITS(_reg) \
+ (((_reg) & MAX77650_GPIO_INVAL_MASK) >> 1)
+
+struct max77650_gpio_chip {
+ struct regmap *map;
+ struct gpio_chip gc;
+};
+
+static int max77650_gpio_direction_input(struct gpio_chip *gc,
+ unsigned int offset)
+{
+ struct max77650_gpio_chip *chip = gpiochip_get_data(gc);
+
+ return regmap_update_bits(chip->map,
+ MAX77650_REG_CNFG_GPIO,
+ MAX77650_GPIO_DIR_MASK,
+ MAX77650_GPIO_DIR_IN);
+}
+
+static int max77650_gpio_direction_output(struct gpio_chip *gc,
+ unsigned int offset, int value)
+{
+ struct max77650_gpio_chip *chip = gpiochip_get_data(gc);
+ int mask, regval;
+
+ mask = MAX77650_GPIO_DIR_MASK | MAX77650_GPIO_OUTVAL_MASK;
+ regval = value ? MAX77650_GPIO_OUT_HIGH : MAX77650_GPIO_OUT_LOW;
+ regval |= MAX77650_GPIO_DIR_OUT;
+
+ return regmap_update_bits(chip->map,
+ MAX77650_REG_CNFG_GPIO, mask, regval);
+}
+
+static void max77650_gpio_set_value(struct gpio_chip *gc,
+ unsigned int offset, int value)
+{
+ struct max77650_gpio_chip *chip = gpiochip_get_data(gc);
+ int rv, regval;
+
+ regval = value ? MAX77650_GPIO_OUT_HIGH : MAX77650_GPIO_OUT_LOW;
+
+ rv = regmap_update_bits(chip->map, MAX77650_REG_CNFG_GPIO,
+ MAX77650_GPIO_OUTVAL_MASK, regval);
+ if (rv)
+ dev_err(gc->parent, "cannot set GPIO value: %d\n", rv);
+}
+
+static int max77650_gpio_get_value(struct gpio_chip *gc,
+ unsigned int offset)
+{
+ struct max77650_gpio_chip *chip = gpiochip_get_data(gc);
+ unsigned int val;
+ int rv;
+
+ rv = regmap_read(chip->map, MAX77650_REG_CNFG_GPIO, &val);
+ if (rv)
+ return rv;
+
+ return MAX77650_GPIO_INVAL_BITS(val);
+}
+
+static int max77650_gpio_get_direction(struct gpio_chip *gc,
+ unsigned int offset)
+{
+ struct max77650_gpio_chip *chip = gpiochip_get_data(gc);
+ unsigned int val;
+ int rv;
+
+ rv = regmap_read(chip->map, MAX77650_REG_CNFG_GPIO, &val);
+ if (rv)
+ return rv;
+
+ return MAX77650_GPIO_DIR_BITS(val);
+}
+
+static int max77650_gpio_set_config(struct gpio_chip *gc,
+ unsigned int offset, unsigned long cfg)
+{
+ struct max77650_gpio_chip *chip = gpiochip_get_data(gc);
+
+ switch (pinconf_to_config_param(cfg)) {
+ case PIN_CONFIG_DRIVE_OPEN_DRAIN:
+ return regmap_update_bits(chip->map,
+ MAX77650_REG_CNFG_GPIO,
+ MAX77650_GPIO_DRV_MASK,
+ MAX77650_GPIO_DRV_OPEN_DRAIN);
+ case PIN_CONFIG_DRIVE_PUSH_PULL:
+ return regmap_update_bits(chip->map,
+ MAX77650_REG_CNFG_GPIO,
+ MAX77650_GPIO_DRV_MASK,
+ MAX77650_GPIO_DRV_PUSH_PULL);
+ case PIN_CONFIG_INPUT_DEBOUNCE:
+ return regmap_update_bits(chip->map,
+ MAX77650_REG_CNFG_GPIO,
+ MAX77650_GPIO_DEBOUNCE_MASK,
+ MAX77650_GPIO_DEBOUNCE);
+ default:
+ return -ENOTSUPP;
+ }
+}
+
+static int max77650_gpio_to_irq(struct gpio_chip *gc, unsigned int offset)
+{
+ /*
+ * TODO Add interrupt support.
+ *
+ * We first need to properly support hierarchical irqs in gpiolib
+ * and regmap irq_chip.
+ */
+ return -EOPNOTSUPP;
+}
+
+static int max77650_gpio_probe(struct platform_device *pdev)
+{
+ struct max77650_gpio_chip *chip;
+ struct device *dev, *parent;
+ struct i2c_client *i2c;
+
+ dev = &pdev->dev;
+ parent = dev->parent;
+ i2c = to_i2c_client(parent);
+
+ chip = devm_kzalloc(dev, sizeof(*chip), GFP_KERNEL);
+ if (!chip)
+ return -ENOMEM;
+
+ chip->map = dev_get_regmap(parent, NULL);
+ if (!chip->map)
+ return -ENODEV;
+
+ chip->gc.base = -1;
+ chip->gc.ngpio = 1;
+ chip->gc.label = i2c->name;
+ chip->gc.parent = dev;
+ chip->gc.owner = THIS_MODULE;
+ chip->gc.can_sleep = true;
+
+ chip->gc.direction_input = max77650_gpio_direction_input;
+ chip->gc.direction_output = max77650_gpio_direction_output;
+ chip->gc.set = max77650_gpio_set_value;
+ chip->gc.get = max77650_gpio_get_value;
+ chip->gc.get_direction = max77650_gpio_get_direction;
+ chip->gc.set_config = max77650_gpio_set_config;
+ chip->gc.to_irq = max77650_gpio_to_irq;
+
+ return devm_gpiochip_add_data(dev, &chip->gc, chip);
+}
+
+static struct platform_driver max77650_gpio_driver = {
+ .driver = {
+ .name = "max77650-gpio",
+ },
+ .probe = max77650_gpio_probe,
+};
+module_platform_driver(max77650_gpio_driver);
+
+MODULE_DESCRIPTION("MAXIM 77650/77651 GPIO driver");
+MODULE_AUTHOR("Bartosz Golaszewski <bgolaszewski@baylibre.com>");
+MODULE_LICENSE("GPL v2");
--
2.20.1
^ permalink raw reply related [flat|nested] 31+ messages in thread
* [PATCH v3 09/11] leds: max77650: add LEDs support
2019-02-01 9:47 [PATCH v3 00/11] mfd: add support for max77650 PMIC Bartosz Golaszewski
` (7 preceding siblings ...)
2019-02-01 9:47 ` [PATCH v3 08/11] gpio: max77650: add GPIO support Bartosz Golaszewski
@ 2019-02-01 9:47 ` Bartosz Golaszewski
2019-02-01 19:45 ` Jacek Anaszewski
` (2 more replies)
2019-02-01 9:47 ` [PATCH v3 10/11] input: max77650: add onkey support Bartosz Golaszewski
2019-02-01 9:47 ` [PATCH v3 11/11] MAINTAINERS: add an entry for max77650 mfd driver Bartosz Golaszewski
10 siblings, 3 replies; 31+ messages in thread
From: Bartosz Golaszewski @ 2019-02-01 9:47 UTC (permalink / raw)
To: Rob Herring, Mark Rutland, Linus Walleij, Dmitry Torokhov,
Jacek Anaszewski, Pavel Machek, Lee Jones, Sebastian Reichel,
Liam Girdwood, Greg Kroah-Hartman
Cc: linux-kernel, linux-gpio, devicetree, linux-input, linux-leds,
linux-pm, Bartosz Golaszewski
From: Bartosz Golaszewski <bgolaszewski@baylibre.com>
This adds basic support for LEDs for the max77650 PMIC. The device has
three current sinks for driving LEDs.
Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
---
drivers/leds/Kconfig | 6 ++
drivers/leds/Makefile | 1 +
drivers/leds/leds-max77650.c | 147 +++++++++++++++++++++++++++++++++++
3 files changed, 154 insertions(+)
create mode 100644 drivers/leds/leds-max77650.c
diff --git a/drivers/leds/Kconfig b/drivers/leds/Kconfig
index a72f97fca57b..6e7a8f51eccc 100644
--- a/drivers/leds/Kconfig
+++ b/drivers/leds/Kconfig
@@ -608,6 +608,12 @@ config LEDS_TLC591XX
This option enables support for Texas Instruments TLC59108
and TLC59116 LED controllers.
+config LEDS_MAX77650
+ tristate "LED support for Maxim MAX77650 PMIC"
+ depends on MFD_MAX77650
+ help
+ LEDs driver for MAX77650 family of PMICs from Maxim Integrated."
+
config LEDS_MAX77693
tristate "LED support for MAX77693 Flash"
depends on LEDS_CLASS_FLASH
diff --git a/drivers/leds/Makefile b/drivers/leds/Makefile
index 4c1b0054f379..f48b2404dbb7 100644
--- a/drivers/leds/Makefile
+++ b/drivers/leds/Makefile
@@ -61,6 +61,7 @@ obj-$(CONFIG_LEDS_MC13783) += leds-mc13783.o
obj-$(CONFIG_LEDS_NS2) += leds-ns2.o
obj-$(CONFIG_LEDS_NETXBIG) += leds-netxbig.o
obj-$(CONFIG_LEDS_ASIC3) += leds-asic3.o
+obj-$(CONFIG_LEDS_MAX77650) += leds-max77650.o
obj-$(CONFIG_LEDS_MAX77693) += leds-max77693.o
obj-$(CONFIG_LEDS_MAX8997) += leds-max8997.o
obj-$(CONFIG_LEDS_LM355x) += leds-lm355x.o
diff --git a/drivers/leds/leds-max77650.c b/drivers/leds/leds-max77650.c
new file mode 100644
index 000000000000..6b74ce9cac12
--- /dev/null
+++ b/drivers/leds/leds-max77650.c
@@ -0,0 +1,147 @@
+// SPDX-License-Identifier: GPL-2.0
+//
+// Copyright (C) 2018 BayLibre SAS
+// Author: Bartosz Golaszewski <bgolaszewski@baylibre.com>
+//
+// LED driver for MAXIM 77650/77651 charger/power-supply.
+
+#include <linux/i2c.h>
+#include <linux/leds.h>
+#include <linux/mfd/max77650.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include <linux/regmap.h>
+
+#define MAX77650_LED_NUM_LEDS 3
+
+#define MAX77650_LED_A_BASE 0x40
+#define MAX77650_LED_B_BASE 0x43
+
+#define MAX77650_LED_BR_MASK GENMASK(4, 0)
+#define MAX77650_LED_EN_MASK GENMASK(7, 6)
+
+#define MAX77650_LED_MAX_BRIGHTNESS MAX77650_LED_BR_MASK
+
+/* Enable EN_LED_MSTR. */
+#define MAX77650_LED_TOP_DEFAULT BIT(0)
+
+#define MAX77650_LED_ENABLE GENMASK(7, 6)
+#define MAX77650_LED_DISABLE 0x00
+
+#define MAX77650_LED_A_DEFAULT MAX77650_LED_DISABLE
+/* 100% on duty */
+#define MAX77650_LED_B_DEFAULT GENMASK(3, 0)
+
+struct max77650_led {
+ struct led_classdev cdev;
+ struct regmap *map;
+ unsigned int regA;
+ unsigned int regB;
+};
+
+static struct max77650_led *max77650_to_led(struct led_classdev *cdev)
+{
+ return container_of(cdev, struct max77650_led, cdev);
+}
+
+static int max77650_led_brightness_set(struct led_classdev *cdev,
+ enum led_brightness brightness)
+{
+ struct max77650_led *led = max77650_to_led(cdev);
+ int val, mask;
+
+ mask = MAX77650_LED_BR_MASK | MAX77650_LED_EN_MASK;
+
+ if (brightness == LED_OFF)
+ val = MAX77650_LED_DISABLE;
+ else
+ val = MAX77650_LED_ENABLE | brightness;
+
+ return regmap_update_bits(led->map, led->regA, mask, val);
+}
+
+static int max77650_led_probe(struct platform_device *pdev)
+{
+ struct device_node *of_node, *child;
+ struct max77650_led *leds, *led;
+ struct device *parent;
+ struct device *dev;
+ struct regmap *map;
+ const char *label;
+ int rv, num_leds;
+ u32 reg;
+
+ dev = &pdev->dev;
+ parent = dev->parent;
+ of_node = dev->of_node;
+
+ if (!of_node)
+ return -ENODEV;
+
+ leds = devm_kcalloc(dev, sizeof(*leds),
+ MAX77650_LED_NUM_LEDS, GFP_KERNEL);
+ if (!leds)
+ return -ENOMEM;
+
+ map = dev_get_regmap(dev->parent, NULL);
+ if (!map)
+ return -ENODEV;
+
+ num_leds = of_get_child_count(of_node);
+ if (!num_leds || num_leds > MAX77650_LED_NUM_LEDS)
+ return -ENODEV;
+
+ for_each_child_of_node(of_node, child) {
+ rv = of_property_read_u32(child, "reg", ®);
+ if (rv || reg >= MAX77650_LED_NUM_LEDS)
+ return -EINVAL;
+
+ led = &leds[reg];
+ led->map = map;
+ led->regA = MAX77650_LED_A_BASE + reg;
+ led->regB = MAX77650_LED_B_BASE + reg;
+ led->cdev.brightness_set_blocking = max77650_led_brightness_set;
+ led->cdev.max_brightness = MAX77650_LED_MAX_BRIGHTNESS;
+
+ label = of_get_property(child, "label", NULL);
+ if (!label) {
+ led->cdev.name = "max77650::";
+ } else {
+ led->cdev.name = devm_kasprintf(dev, GFP_KERNEL,
+ "max77650:%s", label);
+ if (!led->cdev.name)
+ return -ENOMEM;
+ }
+
+ of_property_read_string(child, "linux,default-trigger",
+ &led->cdev.default_trigger);
+
+ rv = devm_of_led_classdev_register(dev, child, &led->cdev);
+ if (rv)
+ return rv;
+
+ rv = regmap_write(map, led->regA, MAX77650_LED_A_DEFAULT);
+ if (rv)
+ return rv;
+
+ rv = regmap_write(map, led->regB, MAX77650_LED_B_DEFAULT);
+ if (rv)
+ return rv;
+ }
+
+ return regmap_write(map,
+ MAX77650_REG_CNFG_LED_TOP,
+ MAX77650_LED_TOP_DEFAULT);
+}
+
+static struct platform_driver max77650_led_driver = {
+ .driver = {
+ .name = "max77650-led",
+ },
+ .probe = max77650_led_probe,
+};
+module_platform_driver(max77650_led_driver);
+
+MODULE_DESCRIPTION("MAXIM 77650/77651 LED driver");
+MODULE_AUTHOR("Bartosz Golaszewski <bgolaszewski@baylibre.com>");
+MODULE_LICENSE("GPL v2");
--
2.20.1
^ permalink raw reply related [flat|nested] 31+ messages in thread
* [PATCH v3 10/11] input: max77650: add onkey support
2019-02-01 9:47 [PATCH v3 00/11] mfd: add support for max77650 PMIC Bartosz Golaszewski
` (8 preceding siblings ...)
2019-02-01 9:47 ` [PATCH v3 09/11] leds: max77650: add LEDs support Bartosz Golaszewski
@ 2019-02-01 9:47 ` Bartosz Golaszewski
2019-02-12 12:17 ` Pavel Machek
2019-02-01 9:47 ` [PATCH v3 11/11] MAINTAINERS: add an entry for max77650 mfd driver Bartosz Golaszewski
10 siblings, 1 reply; 31+ messages in thread
From: Bartosz Golaszewski @ 2019-02-01 9:47 UTC (permalink / raw)
To: Rob Herring, Mark Rutland, Linus Walleij, Dmitry Torokhov,
Jacek Anaszewski, Pavel Machek, Lee Jones, Sebastian Reichel,
Liam Girdwood, Greg Kroah-Hartman
Cc: linux-kernel, linux-gpio, devicetree, linux-input, linux-leds,
linux-pm, Bartosz Golaszewski
From: Bartosz Golaszewski <bgolaszewski@baylibre.com>
Add support for the push- and slide-button events for max77650.
Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
Acked-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
---
drivers/input/misc/Kconfig | 9 ++
drivers/input/misc/Makefile | 1 +
drivers/input/misc/max77650-onkey.c | 127 ++++++++++++++++++++++++++++
3 files changed, 137 insertions(+)
create mode 100644 drivers/input/misc/max77650-onkey.c
diff --git a/drivers/input/misc/Kconfig b/drivers/input/misc/Kconfig
index ca59a2be9bc5..bb9c45c1269e 100644
--- a/drivers/input/misc/Kconfig
+++ b/drivers/input/misc/Kconfig
@@ -180,6 +180,15 @@ config INPUT_M68K_BEEP
tristate "M68k Beeper support"
depends on M68K
+config INPUT_MAX77650_ONKEY
+ tristate "Maxim MAX77650 ONKEY support"
+ depends on MFD_MAX77650
+ help
+ Support the ONKEY of the MAX77650 PMIC as an input device.
+
+ To compile this driver as a module, choose M here: the module
+ will be called max77650-onkey.
+
config INPUT_MAX77693_HAPTIC
tristate "MAXIM MAX77693/MAX77843 haptic controller support"
depends on (MFD_MAX77693 || MFD_MAX77843) && PWM
diff --git a/drivers/input/misc/Makefile b/drivers/input/misc/Makefile
index 9d0f9d1ff68f..5bd53590ce60 100644
--- a/drivers/input/misc/Makefile
+++ b/drivers/input/misc/Makefile
@@ -43,6 +43,7 @@ obj-$(CONFIG_INPUT_IXP4XX_BEEPER) += ixp4xx-beeper.o
obj-$(CONFIG_INPUT_KEYSPAN_REMOTE) += keyspan_remote.o
obj-$(CONFIG_INPUT_KXTJ9) += kxtj9.o
obj-$(CONFIG_INPUT_M68K_BEEP) += m68kspkr.o
+obj-$(CONFIG_INPUT_MAX77650_ONKEY) += max77650-onkey.o
obj-$(CONFIG_INPUT_MAX77693_HAPTIC) += max77693-haptic.o
obj-$(CONFIG_INPUT_MAX8925_ONKEY) += max8925_onkey.o
obj-$(CONFIG_INPUT_MAX8997_HAPTIC) += max8997_haptic.o
diff --git a/drivers/input/misc/max77650-onkey.c b/drivers/input/misc/max77650-onkey.c
new file mode 100644
index 000000000000..7fc3e9196abb
--- /dev/null
+++ b/drivers/input/misc/max77650-onkey.c
@@ -0,0 +1,127 @@
+// SPDX-License-Identifier: GPL-2.0
+//
+// Copyright (C) 2018 BayLibre SAS
+// Author: Bartosz Golaszewski <bgolaszewski@baylibre.com>
+//
+// ONKEY driver for MAXIM 77650/77651 charger/power-supply.
+
+#include <linux/i2c.h>
+#include <linux/input.h>
+#include <linux/interrupt.h>
+#include <linux/mfd/max77650.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include <linux/regmap.h>
+
+#define MAX77650_ONKEY_MODE_MASK BIT(3)
+#define MAX77650_ONKEY_MODE_PUSH 0x00
+#define MAX77650_ONKEY_MODE_SLIDE BIT(3)
+
+struct max77650_onkey {
+ struct input_dev *input;
+ unsigned int code;
+};
+
+static irqreturn_t max77650_onkey_falling(int irq, void *data)
+{
+ struct max77650_onkey *onkey = data;
+
+ input_report_key(onkey->input, onkey->code, 0);
+ input_sync(onkey->input);
+
+ return IRQ_HANDLED;
+}
+
+static irqreturn_t max77650_onkey_rising(int irq, void *data)
+{
+ struct max77650_onkey *onkey = data;
+
+ input_report_key(onkey->input, onkey->code, 1);
+ input_sync(onkey->input);
+
+ return IRQ_HANDLED;
+}
+
+static int max77650_onkey_probe(struct platform_device *pdev)
+{
+ int irq_r, irq_f, error, mode;
+ struct max77650_onkey *onkey;
+ struct device *dev, *parent;
+ const char *mode_prop;
+ struct regmap *map;
+
+ dev = &pdev->dev;
+ parent = dev->parent;
+
+ map = dev_get_regmap(parent, NULL);
+ if (!map)
+ return -ENODEV;
+
+ onkey = devm_kzalloc(dev, sizeof(*onkey), GFP_KERNEL);
+ if (!onkey)
+ return -ENOMEM;
+
+ error = device_property_read_u32(dev, "linux,code", &onkey->code);
+ if (error)
+ onkey->code = KEY_POWER;
+
+ error = device_property_read_string(dev,
+ "maxim,onkey-mode", &mode_prop);
+ if (error)
+ mode_prop = "push";
+
+ if (strcmp(mode_prop, "push") == 0)
+ mode = MAX77650_ONKEY_MODE_PUSH;
+ else if (strcmp(mode_prop, "slide") == 0)
+ mode = MAX77650_ONKEY_MODE_SLIDE;
+ else
+ return -EINVAL;
+
+ error = regmap_update_bits(map, MAX77650_REG_CNFG_GLBL,
+ MAX77650_ONKEY_MODE_MASK, mode);
+ if (error)
+ return error;
+
+ irq_f = platform_get_irq_byname(pdev, "nEN_F");
+ if (irq_f < 0)
+ return irq_f;
+
+ irq_r = platform_get_irq_byname(pdev, "nEN_R");
+ if (irq_r < 0)
+ return irq_r;
+
+ onkey->input = devm_input_allocate_device(dev);
+ if (!onkey->input)
+ return -ENOMEM;
+
+ onkey->input->name = "max77650_onkey";
+ onkey->input->phys = "max77650_onkey/input0";
+ onkey->input->id.bustype = BUS_I2C;
+ input_set_capability(onkey->input, EV_KEY, onkey->code);
+
+ error = devm_request_any_context_irq(dev, irq_f,
+ max77650_onkey_falling,
+ IRQF_ONESHOT, "onkey-down",
+ onkey);
+ if (error < 0)
+ return error;
+
+ error = devm_request_any_context_irq(dev, irq_r, max77650_onkey_rising,
+ IRQF_ONESHOT, "onkey-up", onkey);
+ if (error < 0)
+ return error;
+
+ return input_register_device(onkey->input);
+}
+
+static struct platform_driver max77650_onkey_driver = {
+ .driver = {
+ .name = "max77650-onkey",
+ },
+ .probe = max77650_onkey_probe,
+};
+module_platform_driver(max77650_onkey_driver);
+
+MODULE_DESCRIPTION("MAXIM 77650/77651 ONKEY driver");
+MODULE_AUTHOR("Bartosz Golaszewski <bgolaszewski@baylibre.com>");
+MODULE_LICENSE("GPL v2");
--
2.20.1
^ permalink raw reply related [flat|nested] 31+ messages in thread
* [PATCH v3 11/11] MAINTAINERS: add an entry for max77650 mfd driver
2019-02-01 9:47 [PATCH v3 00/11] mfd: add support for max77650 PMIC Bartosz Golaszewski
` (9 preceding siblings ...)
2019-02-01 9:47 ` [PATCH v3 10/11] input: max77650: add onkey support Bartosz Golaszewski
@ 2019-02-01 9:47 ` Bartosz Golaszewski
10 siblings, 0 replies; 31+ messages in thread
From: Bartosz Golaszewski @ 2019-02-01 9:47 UTC (permalink / raw)
To: Rob Herring, Mark Rutland, Linus Walleij, Dmitry Torokhov,
Jacek Anaszewski, Pavel Machek, Lee Jones, Sebastian Reichel,
Liam Girdwood, Greg Kroah-Hartman
Cc: linux-kernel, linux-gpio, devicetree, linux-input, linux-leds,
linux-pm, Bartosz Golaszewski
From: Bartosz Golaszewski <bgolaszewski@baylibre.com>
I plan on extending this set of drivers so add myself as maintainer.
Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
---
MAINTAINERS | 14 ++++++++++++++
1 file changed, 14 insertions(+)
diff --git a/MAINTAINERS b/MAINTAINERS
index 9f64f8d3740e..d4032d94c275 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -9221,6 +9221,20 @@ S: Maintained
F: Documentation/devicetree/bindings/sound/max9860.txt
F: sound/soc/codecs/max9860.*
+MAXIM MAX77650 PMIC MFD DRIVER
+M: Bartosz Golaszewski <bgolaszewski@baylibre.com>
+L: linux-kernel@vger.kernel.org
+S: Maintained
+F: Documentation/devicetree/bindings/*/*max77650.txt
+F: Documentation/devicetree/bindings/*/max77650*.txt
+F: include/linux/mfd/max77650.h
+F: drivers/mfd/max77650.c
+F: drivers/regulator/max77650-regulator.c
+F: drivers/power/supply/max77650-charger.c
+F: drivers/input/misc/max77650-onkey.c
+F: drivers/leds/leds-max77650.c
+F: drivers/gpio/gpio-max77650.c
+
MAXIM MAX77802 PMIC REGULATOR DEVICE DRIVER
M: Javier Martinez Canillas <javier@dowhile0.org>
L: linux-kernel@vger.kernel.org
--
2.20.1
^ permalink raw reply related [flat|nested] 31+ messages in thread
* Re: [PATCH v3 09/11] leds: max77650: add LEDs support
2019-02-01 9:47 ` [PATCH v3 09/11] leds: max77650: add LEDs support Bartosz Golaszewski
@ 2019-02-01 19:45 ` Jacek Anaszewski
2019-02-01 20:14 ` Dan Murphy
2019-02-12 12:12 ` Pavel Machek
2019-02-13 22:08 ` kbuild test robot
2 siblings, 1 reply; 31+ messages in thread
From: Jacek Anaszewski @ 2019-02-01 19:45 UTC (permalink / raw)
To: Bartosz Golaszewski, Rob Herring, Mark Rutland, Linus Walleij,
Dmitry Torokhov, Pavel Machek, Lee Jones, Sebastian Reichel,
Liam Girdwood, Greg Kroah-Hartman
Cc: linux-kernel, linux-gpio, devicetree, linux-input, linux-leds,
linux-pm, Bartosz Golaszewski
Hi Bartosz,
Thanks for the update.
On 2/1/19 10:47 AM, Bartosz Golaszewski wrote:
> From: Bartosz Golaszewski <bgolaszewski@baylibre.com>
>
> This adds basic support for LEDs for the max77650 PMIC. The device has
> three current sinks for driving LEDs.
>
> Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
> ---
> drivers/leds/Kconfig | 6 ++
> drivers/leds/Makefile | 1 +
> drivers/leds/leds-max77650.c | 147 +++++++++++++++++++++++++++++++++++
> 3 files changed, 154 insertions(+)
> create mode 100644 drivers/leds/leds-max77650.c
>
> diff --git a/drivers/leds/Kconfig b/drivers/leds/Kconfig
> index a72f97fca57b..6e7a8f51eccc 100644
> --- a/drivers/leds/Kconfig
> +++ b/drivers/leds/Kconfig
> @@ -608,6 +608,12 @@ config LEDS_TLC591XX
> This option enables support for Texas Instruments TLC59108
> and TLC59116 LED controllers.
>
> +config LEDS_MAX77650
> + tristate "LED support for Maxim MAX77650 PMIC"
> + depends on MFD_MAX77650
> + help
> + LEDs driver for MAX77650 family of PMICs from Maxim Integrated."
> +
> config LEDS_MAX77693
> tristate "LED support for MAX77693 Flash"
> depends on LEDS_CLASS_FLASH
> diff --git a/drivers/leds/Makefile b/drivers/leds/Makefile
> index 4c1b0054f379..f48b2404dbb7 100644
> --- a/drivers/leds/Makefile
> +++ b/drivers/leds/Makefile
> @@ -61,6 +61,7 @@ obj-$(CONFIG_LEDS_MC13783) += leds-mc13783.o
> obj-$(CONFIG_LEDS_NS2) += leds-ns2.o
> obj-$(CONFIG_LEDS_NETXBIG) += leds-netxbig.o
> obj-$(CONFIG_LEDS_ASIC3) += leds-asic3.o
> +obj-$(CONFIG_LEDS_MAX77650) += leds-max77650.o
> obj-$(CONFIG_LEDS_MAX77693) += leds-max77693.o
> obj-$(CONFIG_LEDS_MAX8997) += leds-max8997.o
> obj-$(CONFIG_LEDS_LM355x) += leds-lm355x.o
> diff --git a/drivers/leds/leds-max77650.c b/drivers/leds/leds-max77650.c
> new file mode 100644
> index 000000000000..6b74ce9cac12
> --- /dev/null
> +++ b/drivers/leds/leds-max77650.c
> @@ -0,0 +1,147 @@
> +// SPDX-License-Identifier: GPL-2.0
> +//
> +// Copyright (C) 2018 BayLibre SAS
> +// Author: Bartosz Golaszewski <bgolaszewski@baylibre.com>
> +//
> +// LED driver for MAXIM 77650/77651 charger/power-supply.
> +
> +#include <linux/i2c.h>
> +#include <linux/leds.h>
> +#include <linux/mfd/max77650.h>
> +#include <linux/module.h>
> +#include <linux/platform_device.h>
> +#include <linux/regmap.h>
> +
> +#define MAX77650_LED_NUM_LEDS 3
> +
> +#define MAX77650_LED_A_BASE 0x40
> +#define MAX77650_LED_B_BASE 0x43
> +
> +#define MAX77650_LED_BR_MASK GENMASK(4, 0)
> +#define MAX77650_LED_EN_MASK GENMASK(7, 6)
> +
> +#define MAX77650_LED_MAX_BRIGHTNESS MAX77650_LED_BR_MASK
> +
> +/* Enable EN_LED_MSTR. */
> +#define MAX77650_LED_TOP_DEFAULT BIT(0)
> +
> +#define MAX77650_LED_ENABLE GENMASK(7, 6)
> +#define MAX77650_LED_DISABLE 0x00
> +
> +#define MAX77650_LED_A_DEFAULT MAX77650_LED_DISABLE
> +/* 100% on duty */
> +#define MAX77650_LED_B_DEFAULT GENMASK(3, 0)
> +
> +struct max77650_led {
> + struct led_classdev cdev;
> + struct regmap *map;
> + unsigned int regA;
> + unsigned int regB;
> +};
> +
> +static struct max77650_led *max77650_to_led(struct led_classdev *cdev)
> +{
> + return container_of(cdev, struct max77650_led, cdev);
> +}
> +
> +static int max77650_led_brightness_set(struct led_classdev *cdev,
> + enum led_brightness brightness)
> +{
> + struct max77650_led *led = max77650_to_led(cdev);
> + int val, mask;
> +
> + mask = MAX77650_LED_BR_MASK | MAX77650_LED_EN_MASK;
> +
> + if (brightness == LED_OFF)
> + val = MAX77650_LED_DISABLE;
> + else
> + val = MAX77650_LED_ENABLE | brightness;
> +
> + return regmap_update_bits(led->map, led->regA, mask, val);
> +}
> +
> +static int max77650_led_probe(struct platform_device *pdev)
> +{
> + struct device_node *of_node, *child;
> + struct max77650_led *leds, *led;
> + struct device *parent;
> + struct device *dev;
> + struct regmap *map;
> + const char *label;
> + int rv, num_leds;
> + u32 reg;
> +
> + dev = &pdev->dev;
> + parent = dev->parent;
> + of_node = dev->of_node;
> +
> + if (!of_node)
> + return -ENODEV;
> +
> + leds = devm_kcalloc(dev, sizeof(*leds),
> + MAX77650_LED_NUM_LEDS, GFP_KERNEL);
> + if (!leds)
> + return -ENOMEM;
> +
> + map = dev_get_regmap(dev->parent, NULL);
> + if (!map)
> + return -ENODEV;
> +
> + num_leds = of_get_child_count(of_node);
> + if (!num_leds || num_leds > MAX77650_LED_NUM_LEDS)
> + return -ENODEV;
> +
> + for_each_child_of_node(of_node, child) {
> + rv = of_property_read_u32(child, "reg", ®);
> + if (rv || reg >= MAX77650_LED_NUM_LEDS)
> + return -EINVAL;
> +
> + led = &leds[reg];
> + led->map = map;
> + led->regA = MAX77650_LED_A_BASE + reg;
> + led->regB = MAX77650_LED_B_BASE + reg;
> + led->cdev.brightness_set_blocking = max77650_led_brightness_set;
> + led->cdev.max_brightness = MAX77650_LED_MAX_BRIGHTNESS;
> +
> + label = of_get_property(child, "label", NULL);
> + if (!label) {
> + led->cdev.name = "max77650::";
> + } else {
> + led->cdev.name = devm_kasprintf(dev, GFP_KERNEL,
> + "max77650:%s", label);
> + if (!led->cdev.name)
> + return -ENOMEM;
> + }
> +
> + of_property_read_string(child, "linux,default-trigger",
> + &led->cdev.default_trigger);
> +
> + rv = devm_of_led_classdev_register(dev, child, &led->cdev);
> + if (rv)
> + return rv;
> +
> + rv = regmap_write(map, led->regA, MAX77650_LED_A_DEFAULT);
> + if (rv)
> + return rv;
> +
> + rv = regmap_write(map, led->regB, MAX77650_LED_B_DEFAULT);
> + if (rv)
> + return rv;
> + }
> +
> + return regmap_write(map,
> + MAX77650_REG_CNFG_LED_TOP,
> + MAX77650_LED_TOP_DEFAULT);
> +}
> +
> +static struct platform_driver max77650_led_driver = {
> + .driver = {
> + .name = "max77650-led",
> + },
> + .probe = max77650_led_probe,
> +};
> +module_platform_driver(max77650_led_driver);
> +
> +MODULE_DESCRIPTION("MAXIM 77650/77651 LED driver");
> +MODULE_AUTHOR("Bartosz Golaszewski <bgolaszewski@baylibre.com>");
> +MODULE_LICENSE("GPL v2");
>
Acked-by: Jacek Anaszewski <jacek.anaszewski@gmail.com>
--
Best regards,
Jacek Anaszewski
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [PATCH v3 09/11] leds: max77650: add LEDs support
2019-02-01 19:45 ` Jacek Anaszewski
@ 2019-02-01 20:14 ` Dan Murphy
2019-02-02 14:39 ` Bartosz Golaszewski
2019-02-12 12:10 ` Pavel Machek
0 siblings, 2 replies; 31+ messages in thread
From: Dan Murphy @ 2019-02-01 20:14 UTC (permalink / raw)
To: Jacek Anaszewski, Bartosz Golaszewski, Rob Herring, Mark Rutland,
Linus Walleij, Dmitry Torokhov, Pavel Machek, Lee Jones,
Sebastian Reichel, Liam Girdwood, Greg Kroah-Hartman
Cc: linux-kernel, linux-gpio, devicetree, linux-input, linux-leds,
linux-pm, Bartosz Golaszewski
Hi
On 2/1/19 1:45 PM, Jacek Anaszewski wrote:
> Hi Bartosz,
>
> Thanks for the update.
>
> On 2/1/19 10:47 AM, Bartosz Golaszewski wrote:
>> From: Bartosz Golaszewski <bgolaszewski@baylibre.com>
>>
>> This adds basic support for LEDs for the max77650 PMIC. The device has
>> three current sinks for driving LEDs.
>>
>> Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
>> ---
>> drivers/leds/Kconfig | 6 ++
>> drivers/leds/Makefile | 1 +
>> drivers/leds/leds-max77650.c | 147 +++++++++++++++++++++++++++++++++++
>> 3 files changed, 154 insertions(+)
>> create mode 100644 drivers/leds/leds-max77650.c
>>
>> diff --git a/drivers/leds/Kconfig b/drivers/leds/Kconfig
>> index a72f97fca57b..6e7a8f51eccc 100644
>> --- a/drivers/leds/Kconfig
>> +++ b/drivers/leds/Kconfig
>> @@ -608,6 +608,12 @@ config LEDS_TLC591XX
>> This option enables support for Texas Instruments TLC59108
>> and TLC59116 LED controllers.
>> +config LEDS_MAX77650
>> + tristate "LED support for Maxim MAX77650 PMIC"
>> + depends on MFD_MAX77650
>> + help
>> + LEDs driver for MAX77650 family of PMICs from Maxim Integrated."
>> +
>> config LEDS_MAX77693
>> tristate "LED support for MAX77693 Flash"
>> depends on LEDS_CLASS_FLASH
>> diff --git a/drivers/leds/Makefile b/drivers/leds/Makefile
>> index 4c1b0054f379..f48b2404dbb7 100644
>> --- a/drivers/leds/Makefile
>> +++ b/drivers/leds/Makefile
>> @@ -61,6 +61,7 @@ obj-$(CONFIG_LEDS_MC13783) += leds-mc13783.o
>> obj-$(CONFIG_LEDS_NS2) += leds-ns2.o
>> obj-$(CONFIG_LEDS_NETXBIG) += leds-netxbig.o
>> obj-$(CONFIG_LEDS_ASIC3) += leds-asic3.o
>> +obj-$(CONFIG_LEDS_MAX77650) += leds-max77650.o
>> obj-$(CONFIG_LEDS_MAX77693) += leds-max77693.o
>> obj-$(CONFIG_LEDS_MAX8997) += leds-max8997.o
>> obj-$(CONFIG_LEDS_LM355x) += leds-lm355x.o
>> diff --git a/drivers/leds/leds-max77650.c b/drivers/leds/leds-max77650.c
>> new file mode 100644
>> index 000000000000..6b74ce9cac12
>> --- /dev/null
>> +++ b/drivers/leds/leds-max77650.c
>> @@ -0,0 +1,147 @@
>> +// SPDX-License-Identifier: GPL-2.0
>> +//
>> +// Copyright (C) 2018 BayLibre SAS
>> +// Author: Bartosz Golaszewski <bgolaszewski@baylibre.com>
>> +//
>> +// LED driver for MAXIM 77650/77651 charger/power-supply.
>> +
>> +#include <linux/i2c.h>
>> +#include <linux/leds.h>
>> +#include <linux/mfd/max77650.h>
>> +#include <linux/module.h>
>> +#include <linux/platform_device.h>
>> +#include <linux/regmap.h>
>> +
>> +#define MAX77650_LED_NUM_LEDS 3
>> +
>> +#define MAX77650_LED_A_BASE 0x40
>> +#define MAX77650_LED_B_BASE 0x43
>> +
>> +#define MAX77650_LED_BR_MASK GENMASK(4, 0)
>> +#define MAX77650_LED_EN_MASK GENMASK(7, 6)
>> +
>> +#define MAX77650_LED_MAX_BRIGHTNESS MAX77650_LED_BR_MASK
>> +
>> +/* Enable EN_LED_MSTR. */
>> +#define MAX77650_LED_TOP_DEFAULT BIT(0)
>> +
>> +#define MAX77650_LED_ENABLE GENMASK(7, 6)
>> +#define MAX77650_LED_DISABLE 0x00
>> +
>> +#define MAX77650_LED_A_DEFAULT MAX77650_LED_DISABLE
>> +/* 100% on duty */
>> +#define MAX77650_LED_B_DEFAULT GENMASK(3, 0)
>> +
>> +struct max77650_led {
>> + struct led_classdev cdev;
>> + struct regmap *map;
>> + unsigned int regA;
>> + unsigned int regB;
Please don't use camel case.
>> +};
>> +
>> +static struct max77650_led *max77650_to_led(struct led_classdev *cdev)
>> +{
>> + return container_of(cdev, struct max77650_led, cdev);
>> +}
>> +
>> +static int max77650_led_brightness_set(struct led_classdev *cdev,
>> + enum led_brightness brightness)
>> +{
>> + struct max77650_led *led = max77650_to_led(cdev);
>> + int val, mask;
>> +
The register value and bits are only 8 bit why an int?
>> + mask = MAX77650_LED_BR_MASK | MAX77650_LED_EN_MASK;
>> +
>> + if (brightness == LED_OFF)
>> + val = MAX77650_LED_DISABLE;
>> + else
>> + val = MAX77650_LED_ENABLE | brightness;
>> +
>> + return regmap_update_bits(led->map, led->regA, mask, val);
>> +}
>> +
>> +static int max77650_led_probe(struct platform_device *pdev)
>> +{
>> + struct device_node *of_node, *child;
>> + struct max77650_led *leds, *led;
>> + struct device *parent;
>> + struct device *dev;
>> + struct regmap *map;
>> + const char *label;
>> + int rv, num_leds;
>> + u32 reg;
>> +
>> + dev = &pdev->dev;
>> + parent = dev->parent;
>> + of_node = dev->of_node;
>> +
>> + if (!of_node)
>> + return -ENODEV;
>> +
>> + leds = devm_kcalloc(dev, sizeof(*leds),
>> + MAX77650_LED_NUM_LEDS, GFP_KERNEL);
>> + if (!leds)
>> + return -ENOMEM;
>> +
>> + map = dev_get_regmap(dev->parent, NULL);
>> + if (!map)
>> + return -ENODEV;
>> +
>> + num_leds = of_get_child_count(of_node);
>> + if (!num_leds || num_leds > MAX77650_LED_NUM_LEDS)
>> + return -ENODEV;
>> +
>> + for_each_child_of_node(of_node, child) {
>> + rv = of_property_read_u32(child, "reg", ®);
Can we use the fwnode_property_read_u32 call here?
And the same for all below as well?
>> + if (rv || reg >= MAX77650_LED_NUM_LEDS)
>> + return -EINVAL;
>> +
>> + led = &leds[reg];
>> + led->map = map;
>> + led->regA = MAX77650_LED_A_BASE + reg;
>> + led->regB = MAX77650_LED_B_BASE + reg;
>> + led->cdev.brightness_set_blocking = max77650_led_brightness_set;
>> + led->cdev.max_brightness = MAX77650_LED_MAX_BRIGHTNESS;
>> +
>> + label = of_get_property(child, "label", NULL);
>> + if (!label) {
>> + led->cdev.name = "max77650::";
>> + } else {
>> + led->cdev.name = devm_kasprintf(dev, GFP_KERNEL,
>> + "max77650:%s", label);
>> + if (!led->cdev.name)
>> + return -ENOMEM;
>> + }
>> +
>> + of_property_read_string(child, "linux,default-trigger",
>> + &led->cdev.default_trigger);
>> +
>> + rv = devm_of_led_classdev_register(dev, child, &led->cdev);
>> + if (rv)
>> + return rv;
>> +
>> + rv = regmap_write(map, led->regA, MAX77650_LED_A_DEFAULT);
>> + if (rv)
>> + return rv;
>> +
>> + rv = regmap_write(map, led->regB, MAX77650_LED_B_DEFAULT);
>> + if (rv)
>> + return rv;
>> + }
>> +
>> + return regmap_write(map,
>> + MAX77650_REG_CNFG_LED_TOP,
>> + MAX77650_LED_TOP_DEFAULT);
>> +}
>> +
>> +static struct platform_driver max77650_led_driver = {
>> + .driver = {
>> + .name = "max77650-led",
>> + },
>> + .probe = max77650_led_probe,
>> +};
>> +module_platform_driver(max77650_led_driver);
>> +
>> +MODULE_DESCRIPTION("MAXIM 77650/77651 LED driver");
>> +MODULE_AUTHOR("Bartosz Golaszewski <bgolaszewski@baylibre.com>");
>> +MODULE_LICENSE("GPL v2");
>>
>
> Acked-by: Jacek Anaszewski <jacek.anaszewski@gmail.com>
>
--
------------------
Dan Murphy
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [PATCH v3 09/11] leds: max77650: add LEDs support
2019-02-01 20:14 ` Dan Murphy
@ 2019-02-02 14:39 ` Bartosz Golaszewski
2019-02-12 12:10 ` Pavel Machek
1 sibling, 0 replies; 31+ messages in thread
From: Bartosz Golaszewski @ 2019-02-02 14:39 UTC (permalink / raw)
To: Dan Murphy
Cc: Jacek Anaszewski, Rob Herring, Mark Rutland, Linus Walleij,
Dmitry Torokhov, Pavel Machek, Lee Jones, Sebastian Reichel,
Liam Girdwood, Greg Kroah-Hartman, Linux Kernel Mailing List,
open list:GPIO SUBSYSTEM, devicetree, Linux Input,
Linux LED Subsystem, Linux PM list, Bartosz Golaszewski
pt., 1 lut 2019 o 21:15 Dan Murphy <dmurphy@ti.com> napisał(a):
>
> Hi
>
> On 2/1/19 1:45 PM, Jacek Anaszewski wrote:
> > Hi Bartosz,
> >
> > Thanks for the update.
> >
> > On 2/1/19 10:47 AM, Bartosz Golaszewski wrote:
> >> From: Bartosz Golaszewski <bgolaszewski@baylibre.com>
> >>
> >> This adds basic support for LEDs for the max77650 PMIC. The device has
> >> three current sinks for driving LEDs.
> >>
> >> Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
> >> ---
> >> drivers/leds/Kconfig | 6 ++
> >> drivers/leds/Makefile | 1 +
> >> drivers/leds/leds-max77650.c | 147 +++++++++++++++++++++++++++++++++++
> >> 3 files changed, 154 insertions(+)
> >> create mode 100644 drivers/leds/leds-max77650.c
> >>
> >> diff --git a/drivers/leds/Kconfig b/drivers/leds/Kconfig
> >> index a72f97fca57b..6e7a8f51eccc 100644
> >> --- a/drivers/leds/Kconfig
> >> +++ b/drivers/leds/Kconfig
> >> @@ -608,6 +608,12 @@ config LEDS_TLC591XX
> >> This option enables support for Texas Instruments TLC59108
> >> and TLC59116 LED controllers.
> >> +config LEDS_MAX77650
> >> + tristate "LED support for Maxim MAX77650 PMIC"
> >> + depends on MFD_MAX77650
> >> + help
> >> + LEDs driver for MAX77650 family of PMICs from Maxim Integrated."
> >> +
> >> config LEDS_MAX77693
> >> tristate "LED support for MAX77693 Flash"
> >> depends on LEDS_CLASS_FLASH
> >> diff --git a/drivers/leds/Makefile b/drivers/leds/Makefile
> >> index 4c1b0054f379..f48b2404dbb7 100644
> >> --- a/drivers/leds/Makefile
> >> +++ b/drivers/leds/Makefile
> >> @@ -61,6 +61,7 @@ obj-$(CONFIG_LEDS_MC13783) += leds-mc13783.o
> >> obj-$(CONFIG_LEDS_NS2) += leds-ns2.o
> >> obj-$(CONFIG_LEDS_NETXBIG) += leds-netxbig.o
> >> obj-$(CONFIG_LEDS_ASIC3) += leds-asic3.o
> >> +obj-$(CONFIG_LEDS_MAX77650) += leds-max77650.o
> >> obj-$(CONFIG_LEDS_MAX77693) += leds-max77693.o
> >> obj-$(CONFIG_LEDS_MAX8997) += leds-max8997.o
> >> obj-$(CONFIG_LEDS_LM355x) += leds-lm355x.o
> >> diff --git a/drivers/leds/leds-max77650.c b/drivers/leds/leds-max77650.c
> >> new file mode 100644
> >> index 000000000000..6b74ce9cac12
> >> --- /dev/null
> >> +++ b/drivers/leds/leds-max77650.c
> >> @@ -0,0 +1,147 @@
> >> +// SPDX-License-Identifier: GPL-2.0
> >> +//
> >> +// Copyright (C) 2018 BayLibre SAS
> >> +// Author: Bartosz Golaszewski <bgolaszewski@baylibre.com>
> >> +//
> >> +// LED driver for MAXIM 77650/77651 charger/power-supply.
> >> +
> >> +#include <linux/i2c.h>
> >> +#include <linux/leds.h>
> >> +#include <linux/mfd/max77650.h>
> >> +#include <linux/module.h>
> >> +#include <linux/platform_device.h>
> >> +#include <linux/regmap.h>
> >> +
> >> +#define MAX77650_LED_NUM_LEDS 3
> >> +
> >> +#define MAX77650_LED_A_BASE 0x40
> >> +#define MAX77650_LED_B_BASE 0x43
> >> +
> >> +#define MAX77650_LED_BR_MASK GENMASK(4, 0)
> >> +#define MAX77650_LED_EN_MASK GENMASK(7, 6)
> >> +
> >> +#define MAX77650_LED_MAX_BRIGHTNESS MAX77650_LED_BR_MASK
> >> +
> >> +/* Enable EN_LED_MSTR. */
> >> +#define MAX77650_LED_TOP_DEFAULT BIT(0)
> >> +
> >> +#define MAX77650_LED_ENABLE GENMASK(7, 6)
> >> +#define MAX77650_LED_DISABLE 0x00
> >> +
> >> +#define MAX77650_LED_A_DEFAULT MAX77650_LED_DISABLE
> >> +/* 100% on duty */
> >> +#define MAX77650_LED_B_DEFAULT GENMASK(3, 0)
> >> +
> >> +struct max77650_led {
> >> + struct led_classdev cdev;
> >> + struct regmap *map;
> >> + unsigned int regA;
> >> + unsigned int regB;
>
> Please don't use camel case.
>
Sorry, but this is pointless nitpicking. The registers are referred to
in the manual as LED[012]_A and LED[012]_B so these variable names
reflect that. The difference between ThisKindOfCamelCase and regA/regB
is obvious. It's much more readable than for example rega or reg_a. I
also used the same approach in the regulator module and there were no
complaints.
> >> +};
> >> +
> >> +static struct max77650_led *max77650_to_led(struct led_classdev *cdev)
> >> +{
> >> + return container_of(cdev, struct max77650_led, cdev);
> >> +}
> >> +
> >> +static int max77650_led_brightness_set(struct led_classdev *cdev,
> >> + enum led_brightness brightness)
> >> +{
> >> + struct max77650_led *led = max77650_to_led(cdev);
> >> + int val, mask;
> >> +
>
> The register value and bits are only 8 bit why an int?
>
Because regmap_update_bits() deals with 32-bit integers. There's no
hurt and it's less confusing.
> >> + mask = MAX77650_LED_BR_MASK | MAX77650_LED_EN_MASK;
> >> +
> >> + if (brightness == LED_OFF)
> >> + val = MAX77650_LED_DISABLE;
> >> + else
> >> + val = MAX77650_LED_ENABLE | brightness;
> >> +
> >> + return regmap_update_bits(led->map, led->regA, mask, val);
> >> +}
> >> +
> >> +static int max77650_led_probe(struct platform_device *pdev)
> >> +{
> >> + struct device_node *of_node, *child;
> >> + struct max77650_led *leds, *led;
> >> + struct device *parent;
> >> + struct device *dev;
> >> + struct regmap *map;
> >> + const char *label;
> >> + int rv, num_leds;
> >> + u32 reg;
> >> +
> >> + dev = &pdev->dev;
> >> + parent = dev->parent;
> >> + of_node = dev->of_node;
> >> +
> >> + if (!of_node)
> >> + return -ENODEV;
> >> +
> >> + leds = devm_kcalloc(dev, sizeof(*leds),
> >> + MAX77650_LED_NUM_LEDS, GFP_KERNEL);
> >> + if (!leds)
> >> + return -ENOMEM;
> >> +
> >> + map = dev_get_regmap(dev->parent, NULL);
> >> + if (!map)
> >> + return -ENODEV;
> >> +
> >> + num_leds = of_get_child_count(of_node);
> >> + if (!num_leds || num_leds > MAX77650_LED_NUM_LEDS)
> >> + return -ENODEV;
> >> +
> >> + for_each_child_of_node(of_node, child) {
> >> + rv = of_property_read_u32(child, "reg", ®);
>
> Can we use the fwnode_property_read_u32 call here?
> And the same for all below as well?
>
>
Of course we can. But why? This is a low-power PMIC. Is there really a
chance that a non-DT system will want to use it? If so - we will be
able to convert it if needed. For now: I'd stick with of_* functions.
> >> + if (rv || reg >= MAX77650_LED_NUM_LEDS)
> >> + return -EINVAL;
> >> +
> >> + led = &leds[reg];
> >> + led->map = map;
> >> + led->regA = MAX77650_LED_A_BASE + reg;
> >> + led->regB = MAX77650_LED_B_BASE + reg;
> >> + led->cdev.brightness_set_blocking = max77650_led_brightness_set;
> >> + led->cdev.max_brightness = MAX77650_LED_MAX_BRIGHTNESS;
> >> +
> >> + label = of_get_property(child, "label", NULL);
> >> + if (!label) {
> >> + led->cdev.name = "max77650::";
> >> + } else {
> >> + led->cdev.name = devm_kasprintf(dev, GFP_KERNEL,
> >> + "max77650:%s", label);
> >> + if (!led->cdev.name)
> >> + return -ENOMEM;
> >> + }
> >> +
> >> + of_property_read_string(child, "linux,default-trigger",
> >> + &led->cdev.default_trigger);
> >> +
> >> + rv = devm_of_led_classdev_register(dev, child, &led->cdev);
> >> + if (rv)
> >> + return rv;
> >> +
> >> + rv = regmap_write(map, led->regA, MAX77650_LED_A_DEFAULT);
> >> + if (rv)
> >> + return rv;
> >> +
> >> + rv = regmap_write(map, led->regB, MAX77650_LED_B_DEFAULT);
> >> + if (rv)
> >> + return rv;
> >> + }
> >> +
> >> + return regmap_write(map,
> >> + MAX77650_REG_CNFG_LED_TOP,
> >> + MAX77650_LED_TOP_DEFAULT);
> >> +}
> >> +
> >> +static struct platform_driver max77650_led_driver = {
> >> + .driver = {
> >> + .name = "max77650-led",
> >> + },
> >> + .probe = max77650_led_probe,
> >> +};
> >> +module_platform_driver(max77650_led_driver);
> >> +
> >> +MODULE_DESCRIPTION("MAXIM 77650/77651 LED driver");
> >> +MODULE_AUTHOR("Bartosz Golaszewski <bgolaszewski@baylibre.com>");
> >> +MODULE_LICENSE("GPL v2");
> >>
> >
> > Acked-by: Jacek Anaszewski <jacek.anaszewski@gmail.com>
> >
>
>
> --
> ------------------
> Dan Murphy
Best regards,
Bartosz Golaszewski
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [PATCH v3 08/11] gpio: max77650: add GPIO support
2019-02-01 9:47 ` [PATCH v3 08/11] gpio: max77650: add GPIO support Bartosz Golaszewski
@ 2019-02-04 10:49 ` Bartosz Golaszewski
0 siblings, 0 replies; 31+ messages in thread
From: Bartosz Golaszewski @ 2019-02-04 10:49 UTC (permalink / raw)
To: Rob Herring, Mark Rutland, Linus Walleij, Dmitry Torokhov,
Jacek Anaszewski, Pavel Machek, Lee Jones, Sebastian Reichel,
Liam Girdwood, Greg Kroah-Hartman
Cc: Linux Kernel Mailing List, open list:GPIO SUBSYSTEM, devicetree,
Linux Input, Linux LED Subsystem, Linux PM list,
Bartosz Golaszewski
pt., 1 lut 2019 o 10:48 Bartosz Golaszewski <brgl@bgdev.pl> napisał(a):
>
> From: Bartosz Golaszewski <bgolaszewski@baylibre.com>
>
> Add GPIO support for max77650 mfd device. This PMIC exposes a single
> GPIO line.
>
> Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
> ---
> drivers/gpio/Kconfig | 7 ++
> drivers/gpio/Makefile | 1 +
> drivers/gpio/gpio-max77650.c | 189 +++++++++++++++++++++++++++++++++++
> 3 files changed, 197 insertions(+)
> create mode 100644 drivers/gpio/gpio-max77650.c
>
> diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig
> index b5a2845347ec..fb297fe5bfec 100644
> --- a/drivers/gpio/Kconfig
> +++ b/drivers/gpio/Kconfig
> @@ -1095,6 +1095,13 @@ config GPIO_MAX77620
> driver also provides interrupt support for each of the gpios.
> Say yes here to enable the max77620 to be used as gpio controller.
>
> +config GPIO_MAX77650
> + tristate "Maxim MAX77650/77651 GPIO support"
> + depends on MFD_MAX77650
> + help
> + GPIO driver for MAX77650/77651 PMIC from Maxim Semiconductor.
> + These chips have a single pin that can be configured as GPIO.
> +
> config GPIO_MSIC
> bool "Intel MSIC mixed signal gpio support"
> depends on (X86 || COMPILE_TEST) && MFD_INTEL_MSIC
> diff --git a/drivers/gpio/Makefile b/drivers/gpio/Makefile
> index 37628f8dbf70..8bdad50db822 100644
> --- a/drivers/gpio/Makefile
> +++ b/drivers/gpio/Makefile
> @@ -78,6 +78,7 @@ obj-$(CONFIG_GPIO_MAX7300) += gpio-max7300.o
> obj-$(CONFIG_GPIO_MAX7301) += gpio-max7301.o
> obj-$(CONFIG_GPIO_MAX732X) += gpio-max732x.o
> obj-$(CONFIG_GPIO_MAX77620) += gpio-max77620.o
> +obj-$(CONFIG_GPIO_MAX77650) += gpio-max77650.o
> obj-$(CONFIG_GPIO_MB86S7X) += gpio-mb86s7x.o
> obj-$(CONFIG_GPIO_MENZ127) += gpio-menz127.o
> obj-$(CONFIG_GPIO_MERRIFIELD) += gpio-merrifield.o
> diff --git a/drivers/gpio/gpio-max77650.c b/drivers/gpio/gpio-max77650.c
> new file mode 100644
> index 000000000000..8382dd85c548
> --- /dev/null
> +++ b/drivers/gpio/gpio-max77650.c
> @@ -0,0 +1,189 @@
> +// SPDX-License-Identifier: GPL-2.0
> +//
> +// Copyright (C) 2018 BayLibre SAS
> +// Author: Bartosz Golaszewski <bgolaszewski@baylibre.com>
> +//
> +// GPIO driver for MAXIM 77650/77651 charger/power-supply.
> +
> +#include <linux/gpio/driver.h>
> +#include <linux/i2c.h>
> +#include <linux/mfd/max77650.h>
> +#include <linux/module.h>
> +#include <linux/platform_device.h>
> +#include <linux/regmap.h>
> +
> +#define MAX77650_GPIO_DIR_MASK BIT(0)
> +#define MAX77650_GPIO_INVAL_MASK BIT(1)
> +#define MAX77650_GPIO_DRV_MASK BIT(2)
> +#define MAX77650_GPIO_OUTVAL_MASK BIT(3)
> +#define MAX77650_GPIO_DEBOUNCE_MASK BIT(4)
> +
> +#define MAX77650_GPIO_DIR_OUT 0x00
> +#define MAX77650_GPIO_DIR_IN BIT(0)
> +#define MAX77650_GPIO_OUT_LOW 0x00
> +#define MAX77650_GPIO_OUT_HIGH BIT(3)
> +#define MAX77650_GPIO_DRV_OPEN_DRAIN 0x00
> +#define MAX77650_GPIO_DRV_PUSH_PULL BIT(2)
> +#define MAX77650_GPIO_DEBOUNCE BIT(4)
> +
> +#define MAX77650_GPIO_DIR_BITS(_reg) \
> + ((_reg) & MAX77650_GPIO_DIR_MASK)
> +#define MAX77650_GPIO_INVAL_BITS(_reg) \
> + (((_reg) & MAX77650_GPIO_INVAL_MASK) >> 1)
> +
> +struct max77650_gpio_chip {
> + struct regmap *map;
> + struct gpio_chip gc;
> +};
> +
> +static int max77650_gpio_direction_input(struct gpio_chip *gc,
> + unsigned int offset)
> +{
> + struct max77650_gpio_chip *chip = gpiochip_get_data(gc);
> +
> + return regmap_update_bits(chip->map,
> + MAX77650_REG_CNFG_GPIO,
> + MAX77650_GPIO_DIR_MASK,
> + MAX77650_GPIO_DIR_IN);
> +}
> +
> +static int max77650_gpio_direction_output(struct gpio_chip *gc,
> + unsigned int offset, int value)
> +{
> + struct max77650_gpio_chip *chip = gpiochip_get_data(gc);
> + int mask, regval;
> +
> + mask = MAX77650_GPIO_DIR_MASK | MAX77650_GPIO_OUTVAL_MASK;
> + regval = value ? MAX77650_GPIO_OUT_HIGH : MAX77650_GPIO_OUT_LOW;
> + regval |= MAX77650_GPIO_DIR_OUT;
> +
> + return regmap_update_bits(chip->map,
> + MAX77650_REG_CNFG_GPIO, mask, regval);
> +}
> +
> +static void max77650_gpio_set_value(struct gpio_chip *gc,
> + unsigned int offset, int value)
> +{
> + struct max77650_gpio_chip *chip = gpiochip_get_data(gc);
> + int rv, regval;
> +
> + regval = value ? MAX77650_GPIO_OUT_HIGH : MAX77650_GPIO_OUT_LOW;
> +
> + rv = regmap_update_bits(chip->map, MAX77650_REG_CNFG_GPIO,
> + MAX77650_GPIO_OUTVAL_MASK, regval);
> + if (rv)
> + dev_err(gc->parent, "cannot set GPIO value: %d\n", rv);
> +}
> +
> +static int max77650_gpio_get_value(struct gpio_chip *gc,
> + unsigned int offset)
> +{
> + struct max77650_gpio_chip *chip = gpiochip_get_data(gc);
> + unsigned int val;
> + int rv;
> +
> + rv = regmap_read(chip->map, MAX77650_REG_CNFG_GPIO, &val);
> + if (rv)
> + return rv;
> +
> + return MAX77650_GPIO_INVAL_BITS(val);
> +}
> +
> +static int max77650_gpio_get_direction(struct gpio_chip *gc,
> + unsigned int offset)
> +{
> + struct max77650_gpio_chip *chip = gpiochip_get_data(gc);
> + unsigned int val;
> + int rv;
> +
> + rv = regmap_read(chip->map, MAX77650_REG_CNFG_GPIO, &val);
> + if (rv)
> + return rv;
> +
> + return MAX77650_GPIO_DIR_BITS(val);
> +}
> +
> +static int max77650_gpio_set_config(struct gpio_chip *gc,
> + unsigned int offset, unsigned long cfg)
> +{
> + struct max77650_gpio_chip *chip = gpiochip_get_data(gc);
> +
> + switch (pinconf_to_config_param(cfg)) {
> + case PIN_CONFIG_DRIVE_OPEN_DRAIN:
> + return regmap_update_bits(chip->map,
> + MAX77650_REG_CNFG_GPIO,
> + MAX77650_GPIO_DRV_MASK,
> + MAX77650_GPIO_DRV_OPEN_DRAIN);
> + case PIN_CONFIG_DRIVE_PUSH_PULL:
> + return regmap_update_bits(chip->map,
> + MAX77650_REG_CNFG_GPIO,
> + MAX77650_GPIO_DRV_MASK,
> + MAX77650_GPIO_DRV_PUSH_PULL);
> + case PIN_CONFIG_INPUT_DEBOUNCE:
> + return regmap_update_bits(chip->map,
> + MAX77650_REG_CNFG_GPIO,
> + MAX77650_GPIO_DEBOUNCE_MASK,
> + MAX77650_GPIO_DEBOUNCE);
> + default:
> + return -ENOTSUPP;
> + }
> +}
> +
> +static int max77650_gpio_to_irq(struct gpio_chip *gc, unsigned int offset)
> +{
> + /*
> + * TODO Add interrupt support.
> + *
> + * We first need to properly support hierarchical irqs in gpiolib
> + * and regmap irq_chip.
> + */
> + return -EOPNOTSUPP;
> +}
> +
> +static int max77650_gpio_probe(struct platform_device *pdev)
> +{
> + struct max77650_gpio_chip *chip;
> + struct device *dev, *parent;
> + struct i2c_client *i2c;
> +
> + dev = &pdev->dev;
> + parent = dev->parent;
> + i2c = to_i2c_client(parent);
> +
> + chip = devm_kzalloc(dev, sizeof(*chip), GFP_KERNEL);
> + if (!chip)
> + return -ENOMEM;
> +
> + chip->map = dev_get_regmap(parent, NULL);
> + if (!chip->map)
> + return -ENODEV;
> +
> + chip->gc.base = -1;
> + chip->gc.ngpio = 1;
> + chip->gc.label = i2c->name;
> + chip->gc.parent = dev;
> + chip->gc.owner = THIS_MODULE;
> + chip->gc.can_sleep = true;
> +
> + chip->gc.direction_input = max77650_gpio_direction_input;
> + chip->gc.direction_output = max77650_gpio_direction_output;
> + chip->gc.set = max77650_gpio_set_value;
> + chip->gc.get = max77650_gpio_get_value;
> + chip->gc.get_direction = max77650_gpio_get_direction;
> + chip->gc.set_config = max77650_gpio_set_config;
> + chip->gc.to_irq = max77650_gpio_to_irq;
> +
> + return devm_gpiochip_add_data(dev, &chip->gc, chip);
> +}
> +
> +static struct platform_driver max77650_gpio_driver = {
> + .driver = {
> + .name = "max77650-gpio",
> + },
> + .probe = max77650_gpio_probe,
> +};
> +module_platform_driver(max77650_gpio_driver);
> +
> +MODULE_DESCRIPTION("MAXIM 77650/77651 GPIO driver");
> +MODULE_AUTHOR("Bartosz Golaszewski <bgolaszewski@baylibre.com>");
> +MODULE_LICENSE("GPL v2");
> --
> 2.20.1
>
I forgot to collect the tag, but Linus left his Reviewed-by:.
Bart
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [PATCH v3 02/11] dt-bindings: power: supply: add DT bindings for max77650
2019-02-01 9:47 ` [PATCH v3 02/11] dt-bindings: power: supply: " Bartosz Golaszewski
@ 2019-02-12 11:54 ` Pavel Machek
2019-02-12 13:28 ` Bartosz Golaszewski
0 siblings, 1 reply; 31+ messages in thread
From: Pavel Machek @ 2019-02-12 11:54 UTC (permalink / raw)
To: Bartosz Golaszewski
Cc: Rob Herring, Mark Rutland, Linus Walleij, Dmitry Torokhov,
Jacek Anaszewski, Lee Jones, Sebastian Reichel, Liam Girdwood,
Greg Kroah-Hartman, linux-kernel, linux-gpio, devicetree,
linux-input, linux-leds, linux-pm, Bartosz Golaszewski
[-- Attachment #1: Type: text/plain, Size: 1532 bytes --]
Hi!
> diff --git a/Documentation/devicetree/bindings/power/supply/max77650-charger.txt b/Documentation/devicetree/bindings/power/supply/max77650-charger.txt
> new file mode 100644
> index 000000000000..f3e00d41e299
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/power/supply/max77650-charger.txt
> @@ -0,0 +1,27 @@
> +Battery charger driver for MAX77650 PMIC from Maxim Integrated.
> +
> +This module is part of the MAX77650 MFD device. For more details
> +see Documentation/devicetree/bindings/mfd/max77650.txt.
> +
> +The charger is represented as a sub-node of the PMIC node on the device tree.
> +
> +Required properties:
> +--------------------
> +- compatible: Must be "maxim,max77650-charger"
> +
> +Optional properties:
> +--------------------
> +- maxim,vchgin-min: Minimum CHGIN regulation voltage (in microvolts). Must be
> + one of: 4000000, 4100000, 4200000, 4300000, 4400000,
> + 4500000, 4600000, 4700000.
> +- maxim,ichgin-lim: CHGIN input current limit (in microamps). Must be one of:
> + 95000, 190000, 285000, 380000, 475000.
We already have richtek,min-input-voltage-regulation and
ti,minimum-sys-voltage and ti,in-dpm-voltage.
This is not too consistent with with the rest.. and perhaps common
name should be used for those?
See also ti,current-limit. That seems to be direct match.
Best regards,
Pavel
--
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 181 bytes --]
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [PATCH v3 06/11] mfd: max77650: new core mfd driver
2019-02-01 9:47 ` [PATCH v3 06/11] mfd: max77650: new core mfd driver Bartosz Golaszewski
@ 2019-02-12 12:01 ` Pavel Machek
0 siblings, 0 replies; 31+ messages in thread
From: Pavel Machek @ 2019-02-12 12:01 UTC (permalink / raw)
To: Bartosz Golaszewski
Cc: Rob Herring, Mark Rutland, Linus Walleij, Dmitry Torokhov,
Jacek Anaszewski, Lee Jones, Sebastian Reichel, Liam Girdwood,
Greg Kroah-Hartman, linux-kernel, linux-gpio, devicetree,
linux-input, linux-leds, linux-pm, Bartosz Golaszewski
[-- Attachment #1: Type: text/plain, Size: 1660 bytes --]
On Fri 2019-02-01 10:47:31, Bartosz Golaszewski wrote:
> From: Bartosz Golaszewski <bgolaszewski@baylibre.com>
>
> Add the core mfd driver for max77650 PMIC. We define five sub-devices
> for which the drivers will be added in subsequent patches.
>
> Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
> ---
> drivers/mfd/Kconfig | 11 ++
> drivers/mfd/Makefile | 1 +
> drivers/mfd/max77650.c | 342 +++++++++++++++++++++++++++++++++++
> include/linux/mfd/max77650.h | 59 ++++++
> 4 files changed, 413 insertions(+)
> create mode 100644 drivers/mfd/max77650.c
> create mode 100644 include/linux/mfd/max77650.h
>
> diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
> index f461460a2aeb..828fd193b4ee 100644
> --- a/drivers/mfd/Kconfig
> +++ b/drivers/mfd/Kconfig
> @@ -734,6 +734,17 @@ config MFD_MAX77620
> provides common support for accessing the device; additional drivers
> must be enabled in order to use the functionality of the device.
>
> +config MFD_MAX77650
> + tristate "Maxim MAX77650/77651 PMIC Support"
> + depends on I2C
> + depends on OF || COMPILE_TEST
> + select MFD_CORE
> + select REGMAP_I2C
> + help
> + Say yes here to add support for Maxim Semiconductor MAX77650 and
"Say Y" would be more common and consistent with your ther patch.
> + MAX77651 Power Management ICs. This is the core multifunction
> + driver for interacting with the device.
Mention modular build and module name here?
--
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 181 bytes --]
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [PATCH v3 07/11] power: supply: max77650: add support for battery charger
2019-02-01 9:47 ` [PATCH v3 07/11] power: supply: max77650: add support for battery charger Bartosz Golaszewski
@ 2019-02-12 12:07 ` Pavel Machek
2019-02-12 13:31 ` Bartosz Golaszewski
2019-02-12 12:08 ` Pavel Machek
1 sibling, 1 reply; 31+ messages in thread
From: Pavel Machek @ 2019-02-12 12:07 UTC (permalink / raw)
To: Bartosz Golaszewski
Cc: Rob Herring, Mark Rutland, Linus Walleij, Dmitry Torokhov,
Jacek Anaszewski, Lee Jones, Sebastian Reichel, Liam Girdwood,
Greg Kroah-Hartman, linux-kernel, linux-gpio, devicetree,
linux-input, linux-leds, linux-pm, Bartosz Golaszewski
[-- Attachment #1: Type: text/plain, Size: 1632 bytes --]
Hi!
> +#define MAX77650_CHARGER_ENABLED BIT(0)
> +#define MAX77650_CHARGER_DISABLED 0x00
> +#define MAX77650_CHARGER_CHG_EN_MASK BIT(0)
> +
> +#define MAX77650_CHARGER_CHG_DTLS_MASK GENMASK(7, 4)
> +#define MAX77650_CHARGER_CHG_DTLS_BITS(_reg) \
> + (((_reg) & MAX77650_CHARGER_CHG_DTLS_MASK) >> 4)
> +
> +#define MAX77650_CHARGER_CHG_OFF 0x00
> +#define MAX77650_CHARGER_CHG_PREQ 0x01
> +#define MAX77650_CHARGER_CHG_ON_CURR 0x02
> +#define MAX77650_CHARGER_CHG_ON_JCURR 0x03
> +#define MAX77650_CHARGER_CHG_ON_VOLT 0x04
> +#define MAX77650_CHARGER_CHG_ON_JVOLT 0x05
> +#define MAX77650_CHARGER_CHG_ON_TOPOFF 0x06
> +#define MAX77650_CHARGER_CHG_ON_JTOPOFF 0x07
> +#define MAX77650_CHARGER_CHG_DONE 0x08
> +#define MAX77650_CHARGER_CHG_JDONE 0x09
> +#define MAX77650_CHARGER_CHG_SUSP_PF 0x0a
> +#define MAX77650_CHARGER_CHG_SUSP_FCF 0x0b
> +#define MAX77650_CHARGER_CHG_SUSP_BTF 0x0c
These are really bad define names. We are in charger driver, so
MAX77650_CHARGER_ really should be shortened/ommited. OTOH
more space should be given to "CHG_SUSP_BTF" as it is impossible to decipher.
> +#define MAX77650_CHARGER_CHGIN_DTLS_MASK GENMASK(3, 2)
> +#define MAX77650_CHARGER_CHGIN_DTLS_BITS(_reg) \
> + (((_reg) & MAX77650_CHARGER_CHGIN_DTLS_MASK) >> 2)
> +
> +#define MAX77650_CHARGER_CHGIN_UVL 0x00
> +#define MAX77650_CHARGER_CHGIN_OVL 0x01
> +#define MAX77650_CHARGER_CHGIN_OKAY 0x11
UVL -> UNDERVOLTAGE, OVL -> OVERVOLTAGE?
--
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 181 bytes --]
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [PATCH v3 07/11] power: supply: max77650: add support for battery charger
2019-02-01 9:47 ` [PATCH v3 07/11] power: supply: max77650: add support for battery charger Bartosz Golaszewski
2019-02-12 12:07 ` Pavel Machek
@ 2019-02-12 12:08 ` Pavel Machek
1 sibling, 0 replies; 31+ messages in thread
From: Pavel Machek @ 2019-02-12 12:08 UTC (permalink / raw)
To: Bartosz Golaszewski
Cc: Rob Herring, Mark Rutland, Linus Walleij, Dmitry Torokhov,
Jacek Anaszewski, Lee Jones, Sebastian Reichel, Liam Girdwood,
Greg Kroah-Hartman, linux-kernel, linux-gpio, devicetree,
linux-input, linux-leds, linux-pm, Bartosz Golaszewski
[-- Attachment #1: Type: text/plain, Size: 869 bytes --]
On Fri 2019-02-01 10:47:32, Bartosz Golaszewski wrote:
> From: Bartosz Golaszewski <bgolaszewski@baylibre.com>
>
> Add basic support for the battery charger for max77650 PMIC.
>
> diff --git a/drivers/power/supply/max77650-charger.c b/drivers/power/supply/max77650-charger.c
> new file mode 100644
> index 000000000000..7055c9b5ee24
> --- /dev/null
> +++ b/drivers/power/supply/max77650-charger.c
> @@ -0,0 +1,355 @@
> +// SPDX-License-Identifier: GPL-2.0
> +//
> +// Copyright (C) 2018 BayLibre SAS
> +// Author: Bartosz Golaszewski <bgolaszewski@baylibre.com>
> +//
> +// Battery charger driver for MAXIM 77650/77651 charger/power-supply.
> +
If available, pointer to a datasheet would be welcome here.
--
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 181 bytes --]
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [PATCH v3 09/11] leds: max77650: add LEDs support
2019-02-01 20:14 ` Dan Murphy
2019-02-02 14:39 ` Bartosz Golaszewski
@ 2019-02-12 12:10 ` Pavel Machek
1 sibling, 0 replies; 31+ messages in thread
From: Pavel Machek @ 2019-02-12 12:10 UTC (permalink / raw)
To: Dan Murphy
Cc: Jacek Anaszewski, Bartosz Golaszewski, Rob Herring, Mark Rutland,
Linus Walleij, Dmitry Torokhov, Lee Jones, Sebastian Reichel,
Liam Girdwood, Greg Kroah-Hartman, linux-kernel, linux-gpio,
devicetree, linux-input, linux-leds, linux-pm,
Bartosz Golaszewski
[-- Attachment #1: Type: text/plain, Size: 748 bytes --]
Hi!
> >> +static struct max77650_led *max77650_to_led(struct led_classdev *cdev)
> >> +{
> >> + return container_of(cdev, struct max77650_led, cdev);
> >> +}
> >> +
> >> +static int max77650_led_brightness_set(struct led_classdev *cdev,
> >> + enum led_brightness brightness)
> >> +{
> >> + struct max77650_led *led = max77650_to_led(cdev);
> >> + int val, mask;
> >> +
>
> The register value and bits are only 8 bit why an int?
int is word size CPU prefers. It is ok here. If you force u8, it may
actually result in slower/bigger code.
Pavel
--
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 181 bytes --]
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [PATCH v3 09/11] leds: max77650: add LEDs support
2019-02-01 9:47 ` [PATCH v3 09/11] leds: max77650: add LEDs support Bartosz Golaszewski
2019-02-01 19:45 ` Jacek Anaszewski
@ 2019-02-12 12:12 ` Pavel Machek
2019-02-13 10:58 ` Bartosz Golaszewski
2019-02-13 22:08 ` kbuild test robot
2 siblings, 1 reply; 31+ messages in thread
From: Pavel Machek @ 2019-02-12 12:12 UTC (permalink / raw)
To: Bartosz Golaszewski
Cc: Rob Herring, Mark Rutland, Linus Walleij, Dmitry Torokhov,
Jacek Anaszewski, Lee Jones, Sebastian Reichel, Liam Girdwood,
Greg Kroah-Hartman, linux-kernel, linux-gpio, devicetree,
linux-input, linux-leds, linux-pm, Bartosz Golaszewski
[-- Attachment #1: Type: text/plain, Size: 705 bytes --]
> diff --git a/drivers/leds/Kconfig b/drivers/leds/Kconfig
> index a72f97fca57b..6e7a8f51eccc 100644
> --- a/drivers/leds/Kconfig
> +++ b/drivers/leds/Kconfig
> @@ -608,6 +608,12 @@ config LEDS_TLC591XX
> This option enables support for Texas Instruments TLC59108
> and TLC59116 LED controllers.
>
> +config LEDS_MAX77650
> + tristate "LED support for Maxim MAX77650 PMIC"
> + depends on MFD_MAX77650
> + help
> + LEDs driver for MAX77650 family of PMICs from Maxim Integrated."
> +
List the chips? Remove extra "?
Pavel
--
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 181 bytes --]
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [PATCH v3 10/11] input: max77650: add onkey support
2019-02-01 9:47 ` [PATCH v3 10/11] input: max77650: add onkey support Bartosz Golaszewski
@ 2019-02-12 12:17 ` Pavel Machek
2019-02-12 13:29 ` Bartosz Golaszewski
0 siblings, 1 reply; 31+ messages in thread
From: Pavel Machek @ 2019-02-12 12:17 UTC (permalink / raw)
To: Bartosz Golaszewski
Cc: Rob Herring, Mark Rutland, Linus Walleij, Dmitry Torokhov,
Jacek Anaszewski, Lee Jones, Sebastian Reichel, Liam Girdwood,
Greg Kroah-Hartman, linux-kernel, linux-gpio, devicetree,
linux-input, linux-leds, linux-pm, Bartosz Golaszewski
[-- Attachment #1: Type: text/plain, Size: 729 bytes --]
Hi!
> + error = device_property_read_string(dev,
> + "maxim,onkey-mode", &mode_prop);
> + if (error)
> + mode_prop = "push";
> +
> + if (strcmp(mode_prop, "push") == 0)
> + mode = MAX77650_ONKEY_MODE_PUSH;
> + else if (strcmp(mode_prop, "slide") == 0)
> + mode = MAX77650_ONKEY_MODE_SLIDE;
> + else
> + return -EINVAL;
...
> + onkey->input->name = "max77650_onkey";
> + onkey->input->phys = "max77650_onkey/input0";
> + onkey->input->id.bustype = BUS_I2C;
> + input_set_capability(onkey->input, EV_KEY, onkey->code);
Is EV_KEY correct for mode==slide?
--
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 181 bytes --]
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [PATCH v3 02/11] dt-bindings: power: supply: add DT bindings for max77650
2019-02-12 11:54 ` Pavel Machek
@ 2019-02-12 13:28 ` Bartosz Golaszewski
2019-02-12 13:47 ` Pavel Machek
0 siblings, 1 reply; 31+ messages in thread
From: Bartosz Golaszewski @ 2019-02-12 13:28 UTC (permalink / raw)
To: Pavel Machek
Cc: Rob Herring, Mark Rutland, Linus Walleij, Dmitry Torokhov,
Jacek Anaszewski, Lee Jones, Sebastian Reichel, Liam Girdwood,
Greg Kroah-Hartman, Linux Kernel Mailing List,
open list:GPIO SUBSYSTEM, devicetree, Linux Input,
Linux LED Subsystem, Linux PM list, Bartosz Golaszewski
wt., 12 lut 2019 o 12:54 Pavel Machek <pavel@ucw.cz> napisał(a):
>
> Hi!
>
> > diff --git a/Documentation/devicetree/bindings/power/supply/max77650-charger.txt b/Documentation/devicetree/bindings/power/supply/max77650-charger.txt
> > new file mode 100644
> > index 000000000000..f3e00d41e299
> > --- /dev/null
> > +++ b/Documentation/devicetree/bindings/power/supply/max77650-charger.txt
> > @@ -0,0 +1,27 @@
> > +Battery charger driver for MAX77650 PMIC from Maxim Integrated.
> > +
> > +This module is part of the MAX77650 MFD device. For more details
> > +see Documentation/devicetree/bindings/mfd/max77650.txt.
> > +
> > +The charger is represented as a sub-node of the PMIC node on the device tree.
> > +
> > +Required properties:
> > +--------------------
> > +- compatible: Must be "maxim,max77650-charger"
> > +
> > +Optional properties:
> > +--------------------
> > +- maxim,vchgin-min: Minimum CHGIN regulation voltage (in microvolts). Must be
> > + one of: 4000000, 4100000, 4200000, 4300000, 4400000,
> > + 4500000, 4600000, 4700000.
> > +- maxim,ichgin-lim: CHGIN input current limit (in microamps). Must be one of:
> > + 95000, 190000, 285000, 380000, 475000.
>
> We already have richtek,min-input-voltage-regulation and
> ti,minimum-sys-voltage and ti,in-dpm-voltage.
>
> This is not too consistent with with the rest.. and perhaps common
> name should be used for those?
>
> See also ti,current-limit. That seems to be direct match.
>
Well I can't really use a TI-specific property name on a maxim part, can I?
Bart
PS This version was superseded by v4.
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [PATCH v3 10/11] input: max77650: add onkey support
2019-02-12 12:17 ` Pavel Machek
@ 2019-02-12 13:29 ` Bartosz Golaszewski
2019-02-12 13:47 ` Pavel Machek
0 siblings, 1 reply; 31+ messages in thread
From: Bartosz Golaszewski @ 2019-02-12 13:29 UTC (permalink / raw)
To: Pavel Machek
Cc: Rob Herring, Mark Rutland, Linus Walleij, Dmitry Torokhov,
Jacek Anaszewski, Lee Jones, Sebastian Reichel, Liam Girdwood,
Greg Kroah-Hartman, Linux Kernel Mailing List,
open list:GPIO SUBSYSTEM, devicetree, Linux Input,
Linux LED Subsystem, Linux PM list, Bartosz Golaszewski
wt., 12 lut 2019 o 13:17 Pavel Machek <pavel@ucw.cz> napisał(a):
>
> Hi!
>
> > + error = device_property_read_string(dev,
> > + "maxim,onkey-mode", &mode_prop);
> > + if (error)
> > + mode_prop = "push";
> > +
> > + if (strcmp(mode_prop, "push") == 0)
> > + mode = MAX77650_ONKEY_MODE_PUSH;
> > + else if (strcmp(mode_prop, "slide") == 0)
> > + mode = MAX77650_ONKEY_MODE_SLIDE;
> > + else
> > + return -EINVAL;
> ...
> > + onkey->input->name = "max77650_onkey";
> > + onkey->input->phys = "max77650_onkey/input0";
> > + onkey->input->id.bustype = BUS_I2C;
> > + input_set_capability(onkey->input, EV_KEY, onkey->code);
>
> Is EV_KEY correct for mode==slide?
>
Others are not really documented. Does EV_SW stand for switch event?
In that case it would probably be better.
Bart
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [PATCH v3 07/11] power: supply: max77650: add support for battery charger
2019-02-12 12:07 ` Pavel Machek
@ 2019-02-12 13:31 ` Bartosz Golaszewski
2019-02-12 13:54 ` Pavel Machek
0 siblings, 1 reply; 31+ messages in thread
From: Bartosz Golaszewski @ 2019-02-12 13:31 UTC (permalink / raw)
To: Pavel Machek
Cc: Rob Herring, Mark Rutland, Linus Walleij, Dmitry Torokhov,
Jacek Anaszewski, Lee Jones, Sebastian Reichel, Liam Girdwood,
Greg Kroah-Hartman, Linux Kernel Mailing List,
open list:GPIO SUBSYSTEM, devicetree, Linux Input,
Linux LED Subsystem, Linux PM list, Bartosz Golaszewski
wt., 12 lut 2019 o 13:07 Pavel Machek <pavel@ucw.cz> napisał(a):
>
> Hi!
>
> > +#define MAX77650_CHARGER_ENABLED BIT(0)
> > +#define MAX77650_CHARGER_DISABLED 0x00
> > +#define MAX77650_CHARGER_CHG_EN_MASK BIT(0)
> > +
> > +#define MAX77650_CHARGER_CHG_DTLS_MASK GENMASK(7, 4)
> > +#define MAX77650_CHARGER_CHG_DTLS_BITS(_reg) \
> > + (((_reg) & MAX77650_CHARGER_CHG_DTLS_MASK) >> 4)
> > +
> > +#define MAX77650_CHARGER_CHG_OFF 0x00
> > +#define MAX77650_CHARGER_CHG_PREQ 0x01
> > +#define MAX77650_CHARGER_CHG_ON_CURR 0x02
> > +#define MAX77650_CHARGER_CHG_ON_JCURR 0x03
> > +#define MAX77650_CHARGER_CHG_ON_VOLT 0x04
> > +#define MAX77650_CHARGER_CHG_ON_JVOLT 0x05
> > +#define MAX77650_CHARGER_CHG_ON_TOPOFF 0x06
> > +#define MAX77650_CHARGER_CHG_ON_JTOPOFF 0x07
> > +#define MAX77650_CHARGER_CHG_DONE 0x08
> > +#define MAX77650_CHARGER_CHG_JDONE 0x09
> > +#define MAX77650_CHARGER_CHG_SUSP_PF 0x0a
> > +#define MAX77650_CHARGER_CHG_SUSP_FCF 0x0b
> > +#define MAX77650_CHARGER_CHG_SUSP_BTF 0x0c
>
> These are really bad define names. We are in charger driver, so
> MAX77650_CHARGER_ really should be shortened/ommited. OTOH
> more space should be given to "CHG_SUSP_BTF" as it is impossible to decipher.
>
I disagree about the prefix bit. I prefer to use common prefixes for
all symbols in a driver. I would rather add comments to every
definition here.
Bart
> > +#define MAX77650_CHARGER_CHGIN_DTLS_MASK GENMASK(3, 2)
> > +#define MAX77650_CHARGER_CHGIN_DTLS_BITS(_reg) \
> > + (((_reg) & MAX77650_CHARGER_CHGIN_DTLS_MASK) >> 2)
> > +
> > +#define MAX77650_CHARGER_CHGIN_UVL 0x00
> > +#define MAX77650_CHARGER_CHGIN_OVL 0x01
> > +#define MAX77650_CHARGER_CHGIN_OKAY 0x11
>
> UVL -> UNDERVOLTAGE, OVL -> OVERVOLTAGE?
>
>
> --
> (english) http://www.livejournal.com/~pavelmachek
> (cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [PATCH v3 02/11] dt-bindings: power: supply: add DT bindings for max77650
2019-02-12 13:28 ` Bartosz Golaszewski
@ 2019-02-12 13:47 ` Pavel Machek
0 siblings, 0 replies; 31+ messages in thread
From: Pavel Machek @ 2019-02-12 13:47 UTC (permalink / raw)
To: Bartosz Golaszewski
Cc: Rob Herring, Mark Rutland, Linus Walleij, Dmitry Torokhov,
Jacek Anaszewski, Lee Jones, Sebastian Reichel, Liam Girdwood,
Greg Kroah-Hartman, Linux Kernel Mailing List,
open list:GPIO SUBSYSTEM, devicetree, Linux Input,
Linux LED Subsystem, Linux PM list, Bartosz Golaszewski
[-- Attachment #1: Type: text/plain, Size: 2060 bytes --]
On Tue 2019-02-12 14:28:10, Bartosz Golaszewski wrote:
> wt., 12 lut 2019 o 12:54 Pavel Machek <pavel@ucw.cz> napisał(a):
> >
> > Hi!
> >
> > > diff --git a/Documentation/devicetree/bindings/power/supply/max77650-charger.txt b/Documentation/devicetree/bindings/power/supply/max77650-charger.txt
> > > new file mode 100644
> > > index 000000000000..f3e00d41e299
> > > --- /dev/null
> > > +++ b/Documentation/devicetree/bindings/power/supply/max77650-charger.txt
> > > @@ -0,0 +1,27 @@
> > > +Battery charger driver for MAX77650 PMIC from Maxim Integrated.
> > > +
> > > +This module is part of the MAX77650 MFD device. For more details
> > > +see Documentation/devicetree/bindings/mfd/max77650.txt.
> > > +
> > > +The charger is represented as a sub-node of the PMIC node on the device tree.
> > > +
> > > +Required properties:
> > > +--------------------
> > > +- compatible: Must be "maxim,max77650-charger"
> > > +
> > > +Optional properties:
> > > +--------------------
> > > +- maxim,vchgin-min: Minimum CHGIN regulation voltage (in microvolts). Must be
> > > + one of: 4000000, 4100000, 4200000, 4300000, 4400000,
> > > + 4500000, 4600000, 4700000.
> > > +- maxim,ichgin-lim: CHGIN input current limit (in microamps). Must be one of:
> > > + 95000, 190000, 285000, 380000, 475000.
> >
> > We already have richtek,min-input-voltage-regulation and
> > ti,minimum-sys-voltage and ti,in-dpm-voltage.
> >
> > This is not too consistent with with the rest.. and perhaps common
> > name should be used for those?
> >
> > See also ti,current-limit. That seems to be direct match.
> >
>
> Well I can't really use a TI-specific property name on a maxim part, can I?
Well, I'm saying that you should introduce common names for common
stuff. "current-limit" sounds like reasonable name.
Pavel
--
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 181 bytes --]
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [PATCH v3 10/11] input: max77650: add onkey support
2019-02-12 13:29 ` Bartosz Golaszewski
@ 2019-02-12 13:47 ` Pavel Machek
0 siblings, 0 replies; 31+ messages in thread
From: Pavel Machek @ 2019-02-12 13:47 UTC (permalink / raw)
To: Bartosz Golaszewski
Cc: Rob Herring, Mark Rutland, Linus Walleij, Dmitry Torokhov,
Jacek Anaszewski, Lee Jones, Sebastian Reichel, Liam Girdwood,
Greg Kroah-Hartman, Linux Kernel Mailing List,
open list:GPIO SUBSYSTEM, devicetree, Linux Input,
Linux LED Subsystem, Linux PM list, Bartosz Golaszewski
[-- Attachment #1: Type: text/plain, Size: 1190 bytes --]
On Tue 2019-02-12 14:29:49, Bartosz Golaszewski wrote:
> wt., 12 lut 2019 o 13:17 Pavel Machek <pavel@ucw.cz> napisał(a):
> >
> > Hi!
> >
> > > + error = device_property_read_string(dev,
> > > + "maxim,onkey-mode", &mode_prop);
> > > + if (error)
> > > + mode_prop = "push";
> > > +
> > > + if (strcmp(mode_prop, "push") == 0)
> > > + mode = MAX77650_ONKEY_MODE_PUSH;
> > > + else if (strcmp(mode_prop, "slide") == 0)
> > > + mode = MAX77650_ONKEY_MODE_SLIDE;
> > > + else
> > > + return -EINVAL;
> > ...
> > > + onkey->input->name = "max77650_onkey";
> > > + onkey->input->phys = "max77650_onkey/input0";
> > > + onkey->input->id.bustype = BUS_I2C;
> > > + input_set_capability(onkey->input, EV_KEY, onkey->code);
> >
> > Is EV_KEY correct for mode==slide?
> >
>
> Others are not really documented. Does EV_SW stand for switch event?
> In that case it would probably be better.
I believe so.
--
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 181 bytes --]
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [PATCH v3 07/11] power: supply: max77650: add support for battery charger
2019-02-12 13:31 ` Bartosz Golaszewski
@ 2019-02-12 13:54 ` Pavel Machek
0 siblings, 0 replies; 31+ messages in thread
From: Pavel Machek @ 2019-02-12 13:54 UTC (permalink / raw)
To: Bartosz Golaszewski
Cc: Rob Herring, Mark Rutland, Linus Walleij, Dmitry Torokhov,
Jacek Anaszewski, Lee Jones, Sebastian Reichel, Liam Girdwood,
Greg Kroah-Hartman, Linux Kernel Mailing List,
open list:GPIO SUBSYSTEM, devicetree, Linux Input,
Linux LED Subsystem, Linux PM list, Bartosz Golaszewski
[-- Attachment #1: Type: text/plain, Size: 2721 bytes --]
On Tue 2019-02-12 14:31:52, Bartosz Golaszewski wrote:
> wt., 12 lut 2019 o 13:07 Pavel Machek <pavel@ucw.cz> napisał(a):
> >
> > Hi!
> >
> > > +#define MAX77650_CHARGER_ENABLED BIT(0)
> > > +#define MAX77650_CHARGER_DISABLED 0x00
> > > +#define MAX77650_CHARGER_CHG_EN_MASK BIT(0)
> > > +
> > > +#define MAX77650_CHARGER_CHG_DTLS_MASK GENMASK(7, 4)
> > > +#define MAX77650_CHARGER_CHG_DTLS_BITS(_reg) \
> > > + (((_reg) & MAX77650_CHARGER_CHG_DTLS_MASK) >> 4)
> > > +
> > > +#define MAX77650_CHARGER_CHG_OFF 0x00
> > > +#define MAX77650_CHARGER_CHG_PREQ 0x01
> > > +#define MAX77650_CHARGER_CHG_ON_CURR 0x02
> > > +#define MAX77650_CHARGER_CHG_ON_JCURR 0x03
> > > +#define MAX77650_CHARGER_CHG_ON_VOLT 0x04
> > > +#define MAX77650_CHARGER_CHG_ON_JVOLT 0x05
> > > +#define MAX77650_CHARGER_CHG_ON_TOPOFF 0x06
> > > +#define MAX77650_CHARGER_CHG_ON_JTOPOFF 0x07
> > > +#define MAX77650_CHARGER_CHG_DONE 0x08
> > > +#define MAX77650_CHARGER_CHG_JDONE 0x09
> > > +#define MAX77650_CHARGER_CHG_SUSP_PF 0x0a
> > > +#define MAX77650_CHARGER_CHG_SUSP_FCF 0x0b
> > > +#define MAX77650_CHARGER_CHG_SUSP_BTF 0x0c
> >
> > These are really bad define names. We are in charger driver, so
> > MAX77650_CHARGER_ really should be shortened/ommited. OTOH
> > more space should be given to "CHG_SUSP_BTF" as it is impossible to decipher.
> >
>
> I disagree about the prefix bit. I prefer to use common prefixes for
> all symbols in a driver. I would rather add comments to every
> definition here.
So what about shortened? (And what about UVL/OVL below?)
And... what you prefer is not quite important. It is important that
other people can read your code. And what "PF" is is
important... unlike MAX77650_CHARGER_ which is long but unimportant.
> > > +#define MAX77650_CHARGER_CHGIN_DTLS_MASK GENMASK(3, 2)
> > > +#define MAX77650_CHARGER_CHGIN_DTLS_BITS(_reg) \
> > > + (((_reg) & MAX77650_CHARGER_CHGIN_DTLS_MASK) >> 2)
> > > +
> > > +#define MAX77650_CHARGER_CHGIN_UVL 0x00
> > > +#define MAX77650_CHARGER_CHGIN_OVL 0x01
> > > +#define MAX77650_CHARGER_CHGIN_OKAY 0x11
> >
> > UVL -> UNDERVOLTAGE, OVL -> OVERVOLTAGE?
> >
> >
> > --
> > (english) http://www.livejournal.com/~pavelmachek
> > (cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
--
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 181 bytes --]
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [PATCH v3 09/11] leds: max77650: add LEDs support
2019-02-12 12:12 ` Pavel Machek
@ 2019-02-13 10:58 ` Bartosz Golaszewski
0 siblings, 0 replies; 31+ messages in thread
From: Bartosz Golaszewski @ 2019-02-13 10:58 UTC (permalink / raw)
To: Pavel Machek
Cc: Rob Herring, Mark Rutland, Linus Walleij, Dmitry Torokhov,
Jacek Anaszewski, Lee Jones, Sebastian Reichel, Liam Girdwood,
Greg Kroah-Hartman, Linux Kernel Mailing List,
open list:GPIO SUBSYSTEM, devicetree, Linux Input,
Linux LED Subsystem, Linux PM list, Bartosz Golaszewski
wt., 12 lut 2019 o 13:12 Pavel Machek <pavel@ucw.cz> napisał(a):
>
>
> > diff --git a/drivers/leds/Kconfig b/drivers/leds/Kconfig
> > index a72f97fca57b..6e7a8f51eccc 100644
> > --- a/drivers/leds/Kconfig
> > +++ b/drivers/leds/Kconfig
> > @@ -608,6 +608,12 @@ config LEDS_TLC591XX
> > This option enables support for Texas Instruments TLC59108
> > and TLC59116 LED controllers.
> >
> > +config LEDS_MAX77650
> > + tristate "LED support for Maxim MAX77650 PMIC"
> > + depends on MFD_MAX77650
> > + help
> > + LEDs driver for MAX77650 family of PMICs from Maxim Integrated."
> > +
>
> List the chips? Remove extra "?
> Pavel
They are already listed in the core mfd Kconfig, but thanks for
spotting that stray ".
Bart
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [PATCH v3 09/11] leds: max77650: add LEDs support
2019-02-01 9:47 ` [PATCH v3 09/11] leds: max77650: add LEDs support Bartosz Golaszewski
2019-02-01 19:45 ` Jacek Anaszewski
2019-02-12 12:12 ` Pavel Machek
@ 2019-02-13 22:08 ` kbuild test robot
2 siblings, 0 replies; 31+ messages in thread
From: kbuild test robot @ 2019-02-13 22:08 UTC (permalink / raw)
To: Bartosz Golaszewski
Cc: kbuild-all, Rob Herring, Mark Rutland, Linus Walleij,
Dmitry Torokhov, Jacek Anaszewski, Pavel Machek, Lee Jones,
Sebastian Reichel, Liam Girdwood, Greg Kroah-Hartman,
linux-kernel, linux-gpio, devicetree, linux-input, linux-leds,
linux-pm, Bartosz Golaszewski
[-- Attachment #1: Type: text/plain, Size: 3326 bytes --]
Hi Bartosz,
I love your patch! Yet something to improve:
[auto build test ERROR on ljones-mfd/for-mfd-next]
[also build test ERROR on v5.0-rc4 next-20190212]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]
url: https://github.com/0day-ci/linux/commits/Bartosz-Golaszewski/mfd-add-support-for-max77650-PMIC/20190203-031133
base: https://git.kernel.org/pub/scm/linux/kernel/git/lee/mfd.git for-mfd-next
config: x86_64-randconfig-s5-02140238 (attached as .config)
compiler: gcc-8 (Debian 8.2.0-20) 8.2.0
reproduce:
# save the attached .config to linux build tree
make ARCH=x86_64
All errors (new ones prefixed by >>):
ld: drivers/leds/leds-max77650.o: in function `max77650_led_probe':
>> drivers/leds/leds-max77650.c:119: undefined reference to `devm_of_led_classdev_register'
vim +119 drivers/leds/leds-max77650.c
62
63 static int max77650_led_probe(struct platform_device *pdev)
64 {
65 struct device_node *of_node, *child;
66 struct max77650_led *leds, *led;
67 struct device *parent;
68 struct device *dev;
69 struct regmap *map;
70 const char *label;
71 int rv, num_leds;
72 u32 reg;
73
74 dev = &pdev->dev;
75 parent = dev->parent;
76 of_node = dev->of_node;
77
78 if (!of_node)
79 return -ENODEV;
80
81 leds = devm_kcalloc(dev, sizeof(*leds),
82 MAX77650_LED_NUM_LEDS, GFP_KERNEL);
83 if (!leds)
84 return -ENOMEM;
85
86 map = dev_get_regmap(dev->parent, NULL);
87 if (!map)
88 return -ENODEV;
89
90 num_leds = of_get_child_count(of_node);
91 if (!num_leds || num_leds > MAX77650_LED_NUM_LEDS)
92 return -ENODEV;
93
94 for_each_child_of_node(of_node, child) {
95 rv = of_property_read_u32(child, "reg", ®);
96 if (rv || reg >= MAX77650_LED_NUM_LEDS)
97 return -EINVAL;
98
99 led = &leds[reg];
100 led->map = map;
101 led->regA = MAX77650_LED_A_BASE + reg;
102 led->regB = MAX77650_LED_B_BASE + reg;
103 led->cdev.brightness_set_blocking = max77650_led_brightness_set;
104 led->cdev.max_brightness = MAX77650_LED_MAX_BRIGHTNESS;
105
106 label = of_get_property(child, "label", NULL);
107 if (!label) {
108 led->cdev.name = "max77650::";
109 } else {
110 led->cdev.name = devm_kasprintf(dev, GFP_KERNEL,
111 "max77650:%s", label);
112 if (!led->cdev.name)
113 return -ENOMEM;
114 }
115
116 of_property_read_string(child, "linux,default-trigger",
117 &led->cdev.default_trigger);
118
> 119 rv = devm_of_led_classdev_register(dev, child, &led->cdev);
120 if (rv)
121 return rv;
122
123 rv = regmap_write(map, led->regA, MAX77650_LED_A_DEFAULT);
124 if (rv)
125 return rv;
126
127 rv = regmap_write(map, led->regB, MAX77650_LED_B_DEFAULT);
128 if (rv)
129 return rv;
130 }
131
132 return regmap_write(map,
133 MAX77650_REG_CNFG_LED_TOP,
134 MAX77650_LED_TOP_DEFAULT);
135 }
136
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 27603 bytes --]
^ permalink raw reply [flat|nested] 31+ messages in thread
end of thread, other threads:[~2019-02-13 22:10 UTC | newest]
Thread overview: 31+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-02-01 9:47 [PATCH v3 00/11] mfd: add support for max77650 PMIC Bartosz Golaszewski
2019-02-01 9:47 ` [PATCH v3 01/11] dt-bindings: mfd: add DT bindings for max77650 Bartosz Golaszewski
2019-02-01 9:47 ` [PATCH v3 02/11] dt-bindings: power: supply: " Bartosz Golaszewski
2019-02-12 11:54 ` Pavel Machek
2019-02-12 13:28 ` Bartosz Golaszewski
2019-02-12 13:47 ` Pavel Machek
2019-02-01 9:47 ` [PATCH v3 03/11] dt-bindings: gpio: " Bartosz Golaszewski
2019-02-01 9:47 ` [PATCH v3 04/11] dt-bindings: leds: " Bartosz Golaszewski
2019-02-01 9:47 ` [PATCH v3 05/11] dt-bindings: input: " Bartosz Golaszewski
2019-02-01 9:47 ` [PATCH v3 06/11] mfd: max77650: new core mfd driver Bartosz Golaszewski
2019-02-12 12:01 ` Pavel Machek
2019-02-01 9:47 ` [PATCH v3 07/11] power: supply: max77650: add support for battery charger Bartosz Golaszewski
2019-02-12 12:07 ` Pavel Machek
2019-02-12 13:31 ` Bartosz Golaszewski
2019-02-12 13:54 ` Pavel Machek
2019-02-12 12:08 ` Pavel Machek
2019-02-01 9:47 ` [PATCH v3 08/11] gpio: max77650: add GPIO support Bartosz Golaszewski
2019-02-04 10:49 ` Bartosz Golaszewski
2019-02-01 9:47 ` [PATCH v3 09/11] leds: max77650: add LEDs support Bartosz Golaszewski
2019-02-01 19:45 ` Jacek Anaszewski
2019-02-01 20:14 ` Dan Murphy
2019-02-02 14:39 ` Bartosz Golaszewski
2019-02-12 12:10 ` Pavel Machek
2019-02-12 12:12 ` Pavel Machek
2019-02-13 10:58 ` Bartosz Golaszewski
2019-02-13 22:08 ` kbuild test robot
2019-02-01 9:47 ` [PATCH v3 10/11] input: max77650: add onkey support Bartosz Golaszewski
2019-02-12 12:17 ` Pavel Machek
2019-02-12 13:29 ` Bartosz Golaszewski
2019-02-12 13:47 ` Pavel Machek
2019-02-01 9:47 ` [PATCH v3 11/11] MAINTAINERS: add an entry for max77650 mfd driver Bartosz Golaszewski
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).