[PATCH v4 2/2] backlight: rt4831: Apply ocp level from devicetree

2022-06-21 Thread cy_huang
From: ChiYuan Huang 

Add 'richtek,bled-ocp-microamp' property parsing in
device_property_init function.

This value may configure prior to the kernel driver. If it's not specified in
devicetree, keep the original setting. Else, use clamp to align the
value in min/max range and also roundup to choose the best selector.

Reported-by: Lucas Tsai 
Signed-off-by: ChiYuan Huang 
Reviewed-by: Daniel Thompson 
---
Hi, Daniel:

I may use the wrong macro, must be 'DIV_ROUND_UP', not 'roundup'.
the v4 is to fix it.

Since v4
- Fix wrong macro usage, must be 'DIV_ROUND_UP', not 'roundup'

Since v2:
- Prase the 'richtek,bled-ocp-microamp', clamp the value in min/max range, and
  roundup to get the best selector.

---
 drivers/video/backlight/rt4831-backlight.c | 33 +-
 1 file changed, 32 insertions(+), 1 deletion(-)

diff --git a/drivers/video/backlight/rt4831-backlight.c 
b/drivers/video/backlight/rt4831-backlight.c
index 42155c7..eb8c59e 100644
--- a/drivers/video/backlight/rt4831-backlight.c
+++ b/drivers/video/backlight/rt4831-backlight.c
@@ -12,6 +12,7 @@
 #define RT4831_REG_BLCFG   0x02
 #define RT4831_REG_BLDIML  0x04
 #define RT4831_REG_ENABLE  0x08
+#define RT4831_REG_BLOPT2  0x11
 
 #define RT4831_BLMAX_BRIGHTNESS2048
 
@@ -23,6 +24,11 @@
 #define RT4831_BLDIML_MASK GENMASK(2, 0)
 #define RT4831_BLDIMH_MASK GENMASK(10, 3)
 #define RT4831_BLDIMH_SHIFT3
+#define RT4831_BLOCP_MASK  GENMASK(1, 0)
+
+#define RT4831_BLOCP_MINUA 90
+#define RT4831_BLOCP_MAXUA 180
+#define RT4831_BLOCP_STEPUA30
 
 struct rt4831_priv {
struct device *dev;
@@ -85,7 +91,7 @@ static int rt4831_parse_backlight_properties(struct 
rt4831_priv *priv,
 {
struct device *dev = priv->dev;
u8 propval;
-   u32 brightness;
+   u32 brightness, ocp_uA;
unsigned int val = 0;
int ret;
 
@@ -120,6 +126,31 @@ static int rt4831_parse_backlight_properties(struct 
rt4831_priv *priv,
if (ret)
return ret;
 
+   /*
+* This OCP level is used to protect and limit the inductor current.
+* If inductor peak current reach the level, low-side MOSFET will be
+* turned off. Meanwhile, the output channel current may be limited.
+* To match the configured channel current, the inductor chosen must
+* be higher than the OCP level.
+*
+* Not like the OVP level, the default 21V can be used in the most
+* application. But if the chosen OCP level is smaller than needed,
+* it will also affect the backlight channel output current to be
+* smaller than the register setting.
+*/
+   ret = device_property_read_u32(dev, "richtek,bled-ocp-microamp",
+  _uA);
+   if (!ret) {
+   ocp_uA = clamp_val(ocp_uA, RT4831_BLOCP_MINUA,
+  RT4831_BLOCP_MAXUA);
+   val = DIV_ROUND_UP(ocp_uA - RT4831_BLOCP_MINUA,
+  RT4831_BLOCP_STEPUA);
+   ret = regmap_update_bits(priv->regmap, RT4831_REG_BLOPT2,
+RT4831_BLOCP_MASK, val);
+   if (ret)
+   return ret;
+   }
+
ret = device_property_read_u8(dev, "richtek,channel-use", );
if (ret) {
dev_err(dev, "richtek,channel-use DT property missing\n");
-- 
2.7.4



[PATCH v4 1/2] dt-bindings: backlight: rt4831: Add the new ocp level property

2022-06-21 Thread cy_huang
From: ChiYuan Huang 

Add 'richtek,bled-ocp-microamp' property to make it chooseable.

The wrong backlight ocp level may affect the backlight channel output
current smaller than configured.

Signed-off-by: ChiYuan Huang 
Reviewed-by: Daniel Thompson 
Reviewed-by: Krzysztof Kozlowski 
---
Since v3:
- Refine the description for backlight ocp property.
- Use the enum to list the supported value.

Since v2:
- Change the property name from 'richtek,bled-ocp-sel' to 
'richtek,bled-ocp-microamp'.

---
 .../devicetree/bindings/leds/backlight/richtek,rt4831-backlight.yaml | 5 +
 1 file changed, 5 insertions(+)

diff --git 
a/Documentation/devicetree/bindings/leds/backlight/richtek,rt4831-backlight.yaml
 
b/Documentation/devicetree/bindings/leds/backlight/richtek,rt4831-backlight.yaml
index e0ac686..99e9e13 100644
--- 
a/Documentation/devicetree/bindings/leds/backlight/richtek,rt4831-backlight.yaml
+++ 
b/Documentation/devicetree/bindings/leds/backlight/richtek,rt4831-backlight.yaml
@@ -47,6 +47,11 @@ properties:
 minimum: 0
 maximum: 3
 
+  richtek,bled-ocp-microamp:
+description: |
+  Backlight over current protection level.
+enum: [90, 120, 150, 180]
+
   richtek,channel-use:
 description: |
   Backlight LED channel to be used.
-- 
2.7.4



[PATCH v4 0/2] Add the property to make backlight OCP level selectable

2022-06-21 Thread cy_huang
From: ChiYuan Huang 

This patch series is to add the backlight ocp level property parsing.

Since  v4
- Fix wrong macro usage, must be 'DIV_ROUND_UP', not 'roundup'

Since  v3
- Refine the description for backlight ocp property.
- Use the enum to list the supported value.

Since v2
- change the property name from the register style 'richtek,bled-ocp-cel' to
  'richtek,bled-ocp-microamp'.
- Use the clamp and roundup to get the ovp level selector.


ChiYuan Huang (2):
  dt-bindings: backlight: rt4831: Add the new ocp level property
  backlight: rt4831: Apply ocp level from devicetree

 .../leds/backlight/richtek,rt4831-backlight.yaml   |  5 
 drivers/video/backlight/rt4831-backlight.c | 33 +-
 2 files changed, 37 insertions(+), 1 deletion(-)

-- 
2.7.4



[PATCH v3 2/2] backlight: rt4831: Apply ocp level from devicetree

2022-06-08 Thread cy_huang
From: ChiYuan Huang 

Add 'richtek,bled-ocp-microamp' property parsing in
device_property_init function.

This value may configure prior to the kernel driver. If it's not specified in
devicetree, keep the original setting. Else, use clamp to align the
value in min/max range and also roundup to choose the best selector.

Reported-by: Lucas Tsai 
Signed-off-by: ChiYuan Huang 
Reviewed-by: Daniel Thompson 
---
Since v2:
- Prase the 'richtek,bled-ocp-microamp', clamp the value in min/max range, and
  roundup to get the best selector.

---
 drivers/video/backlight/rt4831-backlight.c | 33 +-
 1 file changed, 32 insertions(+), 1 deletion(-)

diff --git a/drivers/video/backlight/rt4831-backlight.c 
b/drivers/video/backlight/rt4831-backlight.c
index 42155c7..8c2001b 100644
--- a/drivers/video/backlight/rt4831-backlight.c
+++ b/drivers/video/backlight/rt4831-backlight.c
@@ -12,6 +12,7 @@
 #define RT4831_REG_BLCFG   0x02
 #define RT4831_REG_BLDIML  0x04
 #define RT4831_REG_ENABLE  0x08
+#define RT4831_REG_BLOPT2  0x11
 
 #define RT4831_BLMAX_BRIGHTNESS2048
 
@@ -23,6 +24,11 @@
 #define RT4831_BLDIML_MASK GENMASK(2, 0)
 #define RT4831_BLDIMH_MASK GENMASK(10, 3)
 #define RT4831_BLDIMH_SHIFT3
+#define RT4831_BLOCP_MASK  GENMASK(1, 0)
+
+#define RT4831_BLOCP_MINUA 90
+#define RT4831_BLOCP_MAXUA 180
+#define RT4831_BLOCP_STEPUA30
 
 struct rt4831_priv {
struct device *dev;
@@ -85,7 +91,7 @@ static int rt4831_parse_backlight_properties(struct 
rt4831_priv *priv,
 {
struct device *dev = priv->dev;
u8 propval;
-   u32 brightness;
+   u32 brightness, ocp_uA;
unsigned int val = 0;
int ret;
 
@@ -120,6 +126,31 @@ static int rt4831_parse_backlight_properties(struct 
rt4831_priv *priv,
if (ret)
return ret;
 
+   /*
+* This OCP level is used to protect and limit the inductor current.
+* If inductor peak current reach the level, low-side MOSFET will be
+* turned off. Meanwhile, the output channel current may be limited.
+* To match the configured channel current, the inductor chosen must
+* be higher than the OCP level.
+*
+* Not like the OVP level, the default 21V can be used in the most
+* application. But if the chosen OCP level is smaller than needed,
+* it will also affect the backlight channel output current to be
+* smaller than the register setting.
+*/
+   ret = device_property_read_u32(dev, "richtek,bled-ocp-microamp",
+  _uA);
+   if (!ret) {
+   ocp_uA = clamp_val(ocp_uA, RT4831_BLOCP_MINUA,
+  RT4831_BLOCP_MAXUA);
+   val = roundup(ocp_uA - RT4831_BLOCP_MINUA,
+ RT4831_BLOCP_STEPUA);
+   ret = regmap_update_bits(priv->regmap, RT4831_REG_BLOPT2,
+RT4831_BLOCP_MASK, val);
+   if (ret)
+   return ret;
+   }
+
ret = device_property_read_u8(dev, "richtek,channel-use", );
if (ret) {
dev_err(dev, "richtek,channel-use DT property missing\n");
-- 
2.7.4



[PATCH v3 1/2] dt-bindings: backlight: rt4831: Add the new ocp level property

2022-06-08 Thread cy_huang
From: ChiYuan Huang 

Add 'richtek,bled-ocp-microamp' property to make it chooseable.

The wrong backlight ocp level may affect the backlight channel output
current smaller than configured.

Signed-off-by: ChiYuan Huang 
---
Since v3:
- Refine the description for backlight ocp property.
- Use the enum to list the supported value.

Since v2:
- Change the property name from 'richtek,bled-ocp-sel' to 
'richtek,bled-ocp-microamp'.

---
 .../devicetree/bindings/leds/backlight/richtek,rt4831-backlight.yaml | 5 +
 1 file changed, 5 insertions(+)

diff --git 
a/Documentation/devicetree/bindings/leds/backlight/richtek,rt4831-backlight.yaml
 
b/Documentation/devicetree/bindings/leds/backlight/richtek,rt4831-backlight.yaml
index e0ac686..99e9e13 100644
--- 
a/Documentation/devicetree/bindings/leds/backlight/richtek,rt4831-backlight.yaml
+++ 
b/Documentation/devicetree/bindings/leds/backlight/richtek,rt4831-backlight.yaml
@@ -47,6 +47,11 @@ properties:
 minimum: 0
 maximum: 3
 
+  richtek,bled-ocp-microamp:
+description: |
+  Backlight over current protection level.
+enum: [90, 120, 150, 180]
+
   richtek,channel-use:
 description: |
   Backlight LED channel to be used.
-- 
2.7.4



[PATCH v3 0/2] Add the property to make backlight OCP level selectable

2022-06-08 Thread cy_huang
From: ChiYuan Huang 

This patch series is to add the backlight ocp level property parsing.

Since  v3
- Refine the description for backlight ocp property.
- Use the enum to list the supported value.

Since v2
- change the property name from the register style 'richtek,bled-ocp-cel' to
  'richtek,bled-ocp-microamp'.
- Use the clamp and roundup to get the ovp level selector.

ChiYuan Huang (2):
  dt-bindings: backlight: rt4831: Add the new ocp level property
  backlight: rt4831: Apply ocp level from devicetree

 .../leds/backlight/richtek,rt4831-backlight.yaml   |  5 
 drivers/video/backlight/rt4831-backlight.c | 33 +-
 2 files changed, 37 insertions(+), 1 deletion(-)

-- 
2.7.4



[PATCH v2 2/2] backlight: rt4831: Apply ocp level from devicetree

2022-06-08 Thread cy_huang
From: ChiYuan Huang 

Add 'richtek,bled-ocp-microamp' property parsing in
device_property_init function.

This value may configure prior to the kernel driver. If it's not specified in
devicetree, keep the original setting. Else, use clamp to align the
value in min/max range and also roundup to choose the best selector.

Reported-by: Lucas Tsai 
Signed-off-by: ChiYuan Huang 
---
Since v2:
- Prase the 'richtek,bled-ocp-microamp', clamp the value in min/max range, and
  roundup to get the best selector.

---
 drivers/video/backlight/rt4831-backlight.c | 33 +-
 1 file changed, 32 insertions(+), 1 deletion(-)

diff --git a/drivers/video/backlight/rt4831-backlight.c 
b/drivers/video/backlight/rt4831-backlight.c
index 42155c7..8c2001b 100644
--- a/drivers/video/backlight/rt4831-backlight.c
+++ b/drivers/video/backlight/rt4831-backlight.c
@@ -12,6 +12,7 @@
 #define RT4831_REG_BLCFG   0x02
 #define RT4831_REG_BLDIML  0x04
 #define RT4831_REG_ENABLE  0x08
+#define RT4831_REG_BLOPT2  0x11
 
 #define RT4831_BLMAX_BRIGHTNESS2048
 
@@ -23,6 +24,11 @@
 #define RT4831_BLDIML_MASK GENMASK(2, 0)
 #define RT4831_BLDIMH_MASK GENMASK(10, 3)
 #define RT4831_BLDIMH_SHIFT3
+#define RT4831_BLOCP_MASK  GENMASK(1, 0)
+
+#define RT4831_BLOCP_MINUA 90
+#define RT4831_BLOCP_MAXUA 180
+#define RT4831_BLOCP_STEPUA30
 
 struct rt4831_priv {
struct device *dev;
@@ -85,7 +91,7 @@ static int rt4831_parse_backlight_properties(struct 
rt4831_priv *priv,
 {
struct device *dev = priv->dev;
u8 propval;
-   u32 brightness;
+   u32 brightness, ocp_uA;
unsigned int val = 0;
int ret;
 
@@ -120,6 +126,31 @@ static int rt4831_parse_backlight_properties(struct 
rt4831_priv *priv,
if (ret)
return ret;
 
+   /*
+* This OCP level is used to protect and limit the inductor current.
+* If inductor peak current reach the level, low-side MOSFET will be
+* turned off. Meanwhile, the output channel current may be limited.
+* To match the configured channel current, the inductor chosen must
+* be higher than the OCP level.
+*
+* Not like the OVP level, the default 21V can be used in the most
+* application. But if the chosen OCP level is smaller than needed,
+* it will also affect the backlight channel output current to be
+* smaller than the register setting.
+*/
+   ret = device_property_read_u32(dev, "richtek,bled-ocp-microamp",
+  _uA);
+   if (!ret) {
+   ocp_uA = clamp_val(ocp_uA, RT4831_BLOCP_MINUA,
+  RT4831_BLOCP_MAXUA);
+   val = roundup(ocp_uA - RT4831_BLOCP_MINUA,
+ RT4831_BLOCP_STEPUA);
+   ret = regmap_update_bits(priv->regmap, RT4831_REG_BLOPT2,
+RT4831_BLOCP_MASK, val);
+   if (ret)
+   return ret;
+   }
+
ret = device_property_read_u8(dev, "richtek,channel-use", );
if (ret) {
dev_err(dev, "richtek,channel-use DT property missing\n");
-- 
2.7.4



[PATCH v2 1/2] dt-bindings: backlight: rt4831: Add the new ocp level property

2022-06-08 Thread cy_huang
From: ChiYuan Huang 

Add 'richtek,bled-ocp-microamp' property to make it chooseable.

The wrong backlight ocp level may affect the backlight channel output
current smaller than configured.

Signed-off-by: ChiYuan Huang 
---
Since v2:
- Change the property name from 'richtek,bled-ocp-sel' to 
'richtek,bled-ocp-microamp'.

---
 .../devicetree/bindings/leds/backlight/richtek,rt4831-backlight.yaml | 5 +
 1 file changed, 5 insertions(+)

diff --git 
a/Documentation/devicetree/bindings/leds/backlight/richtek,rt4831-backlight.yaml
 
b/Documentation/devicetree/bindings/leds/backlight/richtek,rt4831-backlight.yaml
index e0ac686..0f4beeb 100644
--- 
a/Documentation/devicetree/bindings/leds/backlight/richtek,rt4831-backlight.yaml
+++ 
b/Documentation/devicetree/bindings/leds/backlight/richtek,rt4831-backlight.yaml
@@ -47,6 +47,11 @@ properties:
 minimum: 0
 maximum: 3
 
+  richtek,bled-ocp-microamp:
+description: |
+  Backlight over current protection level, unit in microamp. The current
+  supported level is 0.9A/1.2A/1.5A/1.8A.
+
   richtek,channel-use:
 description: |
   Backlight LED channel to be used.
-- 
2.7.4



[PATCH v2 0/2] Add the property to make backlight OCP level selectable

2022-06-08 Thread cy_huang
From: ChiYuan Huang 

This patch series is to add the backlight ocp level property parsing.

Since v2:
- change the property name from the register style 'richtek,bled-ocp-cel' to
  'richtek,bled-ocp-microamp'.
- Use the clamp and roundup to get the ovp level selector.

ChiYuan Huang (2):
  dt-bindings: backlight: rt4831: Add the new ocp level property
  backlight: rt4831: Apply ocp level from devicetree

 .../leds/backlight/richtek,rt4831-backlight.yaml   |  5 
 drivers/video/backlight/rt4831-backlight.c | 33 +-
 2 files changed, 37 insertions(+), 1 deletion(-)

-- 
2.7.4



[PATCH 2/2] backlight: rt4831: Add the property parsing for ocp level selection

2022-05-25 Thread cy_huang
From: ChiYuan Huang 

Add the property parsing for ocp level selection.

Reported-by: Lucas Tsai 
Signed-off-by: ChiYuan Huang 
---
 drivers/video/backlight/rt4831-backlight.c | 13 +
 1 file changed, 13 insertions(+)

diff --git a/drivers/video/backlight/rt4831-backlight.c 
b/drivers/video/backlight/rt4831-backlight.c
index 42155c7..c81f7d9 100644
--- a/drivers/video/backlight/rt4831-backlight.c
+++ b/drivers/video/backlight/rt4831-backlight.c
@@ -12,6 +12,7 @@
 #define RT4831_REG_BLCFG   0x02
 #define RT4831_REG_BLDIML  0x04
 #define RT4831_REG_ENABLE  0x08
+#define RT4831_REG_BLOPT2  0x11
 
 #define RT4831_BLMAX_BRIGHTNESS2048
 
@@ -23,6 +24,8 @@
 #define RT4831_BLDIML_MASK GENMASK(2, 0)
 #define RT4831_BLDIMH_MASK GENMASK(10, 3)
 #define RT4831_BLDIMH_SHIFT3
+#define RT4831_BLOCP_MASK  GENMASK(1, 0)
+#define RT4831_BLOCP_SHIFT 0
 
 struct rt4831_priv {
struct device *dev;
@@ -120,6 +123,16 @@ static int rt4831_parse_backlight_properties(struct 
rt4831_priv *priv,
if (ret)
return ret;
 
+   ret = device_property_read_u8(dev, "richtek,bled-ocp-sel", );
+   if (ret)
+   propval = RT4831_BLOCPLVL_1P2A;
+
+   propval = min_t(u8, propval, RT4831_BLOCPLVL_1P8A);
+   ret = regmap_update_bits(priv->regmap, RT4831_REG_BLOPT2, 
RT4831_BLOCP_MASK,
+propval << RT4831_BLOCP_SHIFT);
+   if (ret)
+   return ret;
+
ret = device_property_read_u8(dev, "richtek,channel-use", );
if (ret) {
dev_err(dev, "richtek,channel-use DT property missing\n");
-- 
2.7.4



[PATCH 1/2] dt-bindings: backlight: rt4831: Add the new property for ocp level selection

2022-05-25 Thread cy_huang
From: ChiYuan Huang 

Add the new property for ocp level selection.

Signed-off-by: ChiYuan Huang 
---
 .../bindings/leds/backlight/richtek,rt4831-backlight.yaml | 8 
 include/dt-bindings/leds/rt4831-backlight.h   | 5 +
 2 files changed, 13 insertions(+)

diff --git 
a/Documentation/devicetree/bindings/leds/backlight/richtek,rt4831-backlight.yaml
 
b/Documentation/devicetree/bindings/leds/backlight/richtek,rt4831-backlight.yaml
index e0ac686..c1c59de 100644
--- 
a/Documentation/devicetree/bindings/leds/backlight/richtek,rt4831-backlight.yaml
+++ 
b/Documentation/devicetree/bindings/leds/backlight/richtek,rt4831-backlight.yaml
@@ -47,6 +47,14 @@ properties:
 minimum: 0
 maximum: 3
 
+  richtek,bled-ocp-sel:
+description: |
+  Backlight OCP level selection, currently support 0.9A/1.2A/1.5A/1.8A
+$ref: /schemas/types.yaml#/definitions/uint8
+default: 1
+minimum: 0
+maximum: 3
+
   richtek,channel-use:
 description: |
   Backlight LED channel to be used.
diff --git a/include/dt-bindings/leds/rt4831-backlight.h 
b/include/dt-bindings/leds/rt4831-backlight.h
index 125c635..e8b8609 100644
--- a/include/dt-bindings/leds/rt4831-backlight.h
+++ b/include/dt-bindings/leds/rt4831-backlight.h
@@ -14,6 +14,11 @@
 #define RT4831_BLOVPLVL_25V2
 #define RT4831_BLOVPLVL_29V3
 
+#define RT4831_BLOCPLVL_0P9A   0
+#define RT4831_BLOCPLVL_1P2A   1
+#define RT4831_BLOCPLVL_1P5A   2
+#define RT4831_BLOCPLVL_1P8A   3
+
 #define RT4831_BLED_CH1EN  (1 << 0)
 #define RT4831_BLED_CH2EN  (1 << 1)
 #define RT4831_BLED_CH3EN  (1 << 2)
-- 
2.7.4



[PATCH 0/2] Add the property to make ocp level selectable

2022-05-25 Thread cy_huang
From: ChiYuan Huang 

This patch series is to make ocp level selectable.

Some application design use small inductor. And it's easy to trigger the
over current protection. Due to the OCP limit, It make the brightness current
not match the configured value.

To meet the HW design, the ocp level have to be selectable.

ChiYuan Huang (2):
  dt-bindings: backlight: rt4831: Add the new property for ocp level
selection
  backlight: rt4831: Add the property parsing for ocp level selection

 .../bindings/leds/backlight/richtek,rt4831-backlight.yaml   |  8 
 drivers/video/backlight/rt4831-backlight.c  | 13 +
 include/dt-bindings/leds/rt4831-backlight.h |  5 +
 3 files changed, 26 insertions(+)

-- 
2.7.4



[PATCH v7 4/4] backlight: rt4831: Adds support for Richtek RT4831 backlight

2021-05-17 Thread cy_huang
From: ChiYuan Huang 

Adds support for Richtek RT4831 backlight.

Signed-off-by: ChiYuan Huang 
Reviewed-by: Daniel Thompson 
---
since v7
- Fix typo 'common' to 'commonly' in Kconfig description.
---
 drivers/video/backlight/Kconfig|   8 ++
 drivers/video/backlight/Makefile   |   1 +
 drivers/video/backlight/rt4831-backlight.c | 203 +
 3 files changed, 212 insertions(+)
 create mode 100644 drivers/video/backlight/rt4831-backlight.c

diff --git a/drivers/video/backlight/Kconfig b/drivers/video/backlight/Kconfig
index d83c87b..858f6df 100644
--- a/drivers/video/backlight/Kconfig
+++ b/drivers/video/backlight/Kconfig
@@ -289,6 +289,14 @@ config BACKLIGHT_QCOM_WLED
  If you have the Qualcomm PMIC, say Y to enable a driver for the
  WLED block. Currently it supports PM8941 and PMI8998.
 
+config BACKLIGHT_RT4831
+   tristate "Richtek RT4831 Backlight Driver"
+   depends on MFD_RT4831
+   help
+ This enables support for Richtek RT4831 Backlight driver.
+ It's commonly used to drive the display WLED. There're four channels
+ inisde, and each channel can provide up to 30mA current.
+
 config BACKLIGHT_SAHARA
tristate "Tabletkiosk Sahara Touch-iT Backlight Driver"
depends on X86
diff --git a/drivers/video/backlight/Makefile b/drivers/video/backlight/Makefile
index 685f3f1..cae2c83 100644
--- a/drivers/video/backlight/Makefile
+++ b/drivers/video/backlight/Makefile
@@ -49,6 +49,7 @@ obj-$(CONFIG_BACKLIGHT_PANDORA)   += pandora_bl.o
 obj-$(CONFIG_BACKLIGHT_PCF50633)   += pcf50633-backlight.o
 obj-$(CONFIG_BACKLIGHT_PWM)+= pwm_bl.o
 obj-$(CONFIG_BACKLIGHT_QCOM_WLED)  += qcom-wled.o
+obj-$(CONFIG_BACKLIGHT_RT4831) += rt4831-backlight.o
 obj-$(CONFIG_BACKLIGHT_SAHARA) += kb3886_bl.o
 obj-$(CONFIG_BACKLIGHT_SKY81452)   += sky81452-backlight.o
 obj-$(CONFIG_BACKLIGHT_TOSA)   += tosa_bl.o
diff --git a/drivers/video/backlight/rt4831-backlight.c 
b/drivers/video/backlight/rt4831-backlight.c
new file mode 100644
index ..42155c7
--- /dev/null
+++ b/drivers/video/backlight/rt4831-backlight.c
@@ -0,0 +1,203 @@
+// SPDX-License-Identifier: GPL-2.0-only
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#define RT4831_REG_BLCFG   0x02
+#define RT4831_REG_BLDIML  0x04
+#define RT4831_REG_ENABLE  0x08
+
+#define RT4831_BLMAX_BRIGHTNESS2048
+
+#define RT4831_BLOVP_MASK  GENMASK(7, 5)
+#define RT4831_BLOVP_SHIFT 5
+#define RT4831_BLPWMEN_MASKBIT(0)
+#define RT4831_BLEN_MASK   BIT(4)
+#define RT4831_BLCH_MASK   GENMASK(3, 0)
+#define RT4831_BLDIML_MASK GENMASK(2, 0)
+#define RT4831_BLDIMH_MASK GENMASK(10, 3)
+#define RT4831_BLDIMH_SHIFT3
+
+struct rt4831_priv {
+   struct device *dev;
+   struct regmap *regmap;
+   struct backlight_device *bl;
+};
+
+static int rt4831_bl_update_status(struct backlight_device *bl_dev)
+{
+   struct rt4831_priv *priv = bl_get_data(bl_dev);
+   int brightness = backlight_get_brightness(bl_dev);
+   unsigned int enable = brightness ? RT4831_BLEN_MASK : 0;
+   u8 v[2];
+   int ret;
+
+   if (brightness) {
+   v[0] = (brightness - 1) & RT4831_BLDIML_MASK;
+   v[1] = ((brightness - 1) & RT4831_BLDIMH_MASK) >> 
RT4831_BLDIMH_SHIFT;
+
+   ret = regmap_raw_write(priv->regmap, RT4831_REG_BLDIML, v, 
sizeof(v));
+   if (ret)
+   return ret;
+   }
+
+   return regmap_update_bits(priv->regmap, RT4831_REG_ENABLE, 
RT4831_BLEN_MASK, enable);
+
+}
+
+static int rt4831_bl_get_brightness(struct backlight_device *bl_dev)
+{
+   struct rt4831_priv *priv = bl_get_data(bl_dev);
+   unsigned int val;
+   u8 v[2];
+   int ret;
+
+   ret = regmap_read(priv->regmap, RT4831_REG_ENABLE, );
+   if (ret)
+   return ret;
+
+   if (!(val & RT4831_BLEN_MASK))
+   return 0;
+
+   ret = regmap_raw_read(priv->regmap, RT4831_REG_BLDIML, v, sizeof(v));
+   if (ret)
+   return ret;
+
+   ret = (v[1] << RT4831_BLDIMH_SHIFT) + (v[0] & RT4831_BLDIML_MASK) + 1;
+
+   return ret;
+}
+
+static const struct backlight_ops rt4831_bl_ops = {
+   .options = BL_CORE_SUSPENDRESUME,
+   .update_status = rt4831_bl_update_status,
+   .get_brightness = rt4831_bl_get_brightness,
+};
+
+static int rt4831_parse_backlight_properties(struct rt4831_priv *priv,
+struct backlight_properties 
*bl_props)
+{
+   struct device *dev = priv->dev;
+   u8 propval;
+   u32 brightness;
+   unsigned int val = 0;
+   int ret;
+
+   /* common properties */
+   ret = device_property_read_u32(dev, "max-brightness", );
+   if (ret)
+   brightness = RT4831_BLMAX_BRIGHTNESS;
+
+   bl_props->max_brightness = min_t(u32, 

[PATCH v7 3/4] mfd: rt4831: Adds DT binding document for Richtek RT4831

2021-05-17 Thread cy_huang
From: ChiYuan Huang 

Adds DT binding document for Richtek RT4831.

Signed-off-by: ChiYuan Huang 
Reviewed-by: Rob Herring 
---
 .../devicetree/bindings/mfd/richtek,rt4831.yaml| 90 ++
 1 file changed, 90 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/mfd/richtek,rt4831.yaml

diff --git a/Documentation/devicetree/bindings/mfd/richtek,rt4831.yaml 
b/Documentation/devicetree/bindings/mfd/richtek,rt4831.yaml
new file mode 100644
index ..4762eb1
--- /dev/null
+++ b/Documentation/devicetree/bindings/mfd/richtek,rt4831.yaml
@@ -0,0 +1,90 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/mfd/richtek,rt4831.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Richtek RT4831 DSV and Backlight Integrated IC
+
+maintainers:
+  - ChiYuan Huang 
+
+description: |
+  RT4831 is a multifunctional device that can provide power to the LCD display
+  and LCD backlight.
+
+  For Display Bias Voltage DSVP and DSVN, the output range is about 4V to 6.5V.
+  It's sufficient to meet the current LCD power requirement.
+
+  For the LCD backlight, it can provide four channel WLED driving capability.
+  Each channel driving current is up to 30mA
+
+  Datasheet is available at
+  https://www.richtek.com/assets/product_file/RT4831A/DS4831A-05.pdf
+
+properties:
+  compatible:
+const: richtek,rt4831
+
+  reg:
+description: I2C device address.
+maxItems: 1
+
+  enable-gpios:
+description: |
+  GPIO to enable/disable the chip. It is optional.
+  Some usage directly tied this pin to follow VIO 1.8V power on sequence.
+maxItems: 1
+
+  regulators:
+$ref: ../regulator/richtek,rt4831-regulator.yaml
+
+  backlight:
+$ref: ../leds/backlight/richtek,rt4831-backlight.yaml
+
+required:
+  - compatible
+  - reg
+
+additionalProperties: false
+
+examples:
+  - |
+#include 
+i2c {
+  #address-cells = <1>;
+  #size-cells = <0>;
+
+  rt4831@11 {
+compatible = "richtek,rt4831";
+reg = <0x11>;
+
+regulators {
+  DSVLCM {
+regulator-min-microvolt = <400>;
+regulator-max-microvolt = <715>;
+regulator-allow-bypass;
+  };
+  DSVP {
+regulator-name = "rt4831-dsvp";
+regulator-min-microvolt = <400>;
+regulator-max-microvolt = <650>;
+regulator-boot-on;
+  };
+  DSVN {
+regulator-name = "rt4831-dsvn";
+regulator-min-microvolt = <400>;
+regulator-max-microvolt = <650>;
+regulator-boot-on;
+  };
+};
+
+backlight {
+  compatible = "richtek,rt4831-backlight";
+  default-brightness = <1024>;
+  max-brightness = <2048>;
+  richtek,bled-ovp-sel = /bits/ 8 ;
+  richtek,channel-use = /bits/ 8 ;
+};
+  };
+};
-- 
2.7.4



[PATCH v7 2/4] backlight: rt4831: Adds DT binding document for Richtek RT4831 backlight

2021-05-17 Thread cy_huang
From: ChiYuan Huang 

Adds DT binding document for Richtek RT4831 backlight.

Signed-off-by: ChiYuan Huang 
Reviewed-by: Daniel Thompson 
---
since v7
- Add allOf property refer to common.yaml.
- Remove default-brightness/max-brightness description and refer string.
---
 .../leds/backlight/richtek,rt4831-backlight.yaml   | 62 ++
 include/dt-bindings/leds/rt4831-backlight.h| 23 
 2 files changed, 85 insertions(+)
 create mode 100644 
Documentation/devicetree/bindings/leds/backlight/richtek,rt4831-backlight.yaml
 create mode 100644 include/dt-bindings/leds/rt4831-backlight.h

diff --git 
a/Documentation/devicetree/bindings/leds/backlight/richtek,rt4831-backlight.yaml
 
b/Documentation/devicetree/bindings/leds/backlight/richtek,rt4831-backlight.yaml
new file mode 100644
index ..e0ac686
--- /dev/null
+++ 
b/Documentation/devicetree/bindings/leds/backlight/richtek,rt4831-backlight.yaml
@@ -0,0 +1,62 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: 
http://devicetree.org/schemas/leds/backlight/richtek,rt4831-backlight.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Richtek RT4831 Backlight
+
+maintainers:
+  - ChiYuan Huang 
+
+description: |
+  RT4831 is a mutifunctional device that can provide power to the LCD display
+  and LCD backlight.
+
+  For the LCD backlight, it can provide four channel WLED driving capability.
+  Each channel driving current is up to 30mA
+
+  Datasheet is available at
+  https://www.richtek.com/assets/product_file/RT4831A/DS4831A-05.pdf
+
+allOf:
+  - $ref: common.yaml#
+
+properties:
+  compatible:
+const: richtek,rt4831-backlight
+
+  default-brightness:
+minimum: 0
+maximum: 2048
+
+  max-brightness:
+minimum: 0
+maximum: 2048
+
+  richtek,pwm-enable:
+description: |
+  Specify the backlight dimming following by PWM duty or by SW control.
+type: boolean
+
+  richtek,bled-ovp-sel:
+description: |
+  Backlight OVP level selection, currently support 17V/21V/25V/29V.
+$ref: /schemas/types.yaml#/definitions/uint8
+default: 1
+minimum: 0
+maximum: 3
+
+  richtek,channel-use:
+description: |
+  Backlight LED channel to be used.
+  BIT 0/1/2/3 is used to indicate led channel 1/2/3/4 enable or disable.
+$ref: /schemas/types.yaml#/definitions/uint8
+minimum: 1
+maximum: 15
+
+required:
+  - compatible
+  - richtek,channel-use
+
+additionalProperties: false
diff --git a/include/dt-bindings/leds/rt4831-backlight.h 
b/include/dt-bindings/leds/rt4831-backlight.h
new file mode 100644
index ..125c635
--- /dev/null
+++ b/include/dt-bindings/leds/rt4831-backlight.h
@@ -0,0 +1,23 @@
+/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
+/*
+ * This header provides constants for rt4831 backlight bindings.
+ *
+ * Copyright (C) 2020, Richtek Technology Corp.
+ * Author: ChiYuan Huang 
+ */
+
+#ifndef _DT_BINDINGS_RT4831_BACKLIGHT_H
+#define _DT_BINDINGS_RT4831_BACKLIGHT_H
+
+#define RT4831_BLOVPLVL_17V0
+#define RT4831_BLOVPLVL_21V1
+#define RT4831_BLOVPLVL_25V2
+#define RT4831_BLOVPLVL_29V3
+
+#define RT4831_BLED_CH1EN  (1 << 0)
+#define RT4831_BLED_CH2EN  (1 << 1)
+#define RT4831_BLED_CH3EN  (1 << 2)
+#define RT4831_BLED_CH4EN  (1 << 3)
+#define RT4831_BLED_ALLCHEN((1 << 4) - 1)
+
+#endif /* _DT_BINDINGS_RT4831_BACKLIGHT_H */
-- 
2.7.4



[PATCH v7 1/4] mfd: rt4831: Adds support for Richtek RT4831

2021-05-17 Thread cy_huang
From: ChiYuan Huang 

This adds support Richtek RT4831 core. It includes four channel WLED driver
and Display Bias Voltage outputs.

Signed-off-by: ChiYuan Huang 
---
- Send the patch series for the wrong mail subject.

The RT4831 regulator patches are already on main stream, and can be referred to
9351ab8b0cb6 regulator: rt4831: Adds support for Richtek RT4831 DSV regulator
934b05e81862 regulator: rt4831: Adds DT binding document for Richtek RT4831 DSV 
regulator

since v6
- Respin the date from 2020 to 2021.
- Rmove the shutdown routine.
- Change the macro OF_MFD_CELL to MFD_CELL_OF.

since v5
- Rename file name from rt4831-core.c to rt4831.c
- Change RICHTEK_VID to RICHTEK_VENDOR_ID.
- Change gpio_desc nameing from 'enable' to 'enable_gpio' in probe.
- Change variable 'val' to the meaningful name 'chip_id'.
- Refine the error log when vendor id is not matched.
- Remove of_match_ptr.

since v2
- Refine Kconfig descriptions.
- Add copyright.
- Refine error logs in probe.
- Refine comment lines in remove and shutdown.
---
 drivers/mfd/Kconfig  |  10 +
 drivers/mfd/Makefile |   1 +
 drivers/mfd/rt4831.c | 115 +++
 3 files changed, 126 insertions(+)
 create mode 100644 drivers/mfd/rt4831.c

diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
index 5c7f2b1..49e57c9 100644
--- a/drivers/mfd/Kconfig
+++ b/drivers/mfd/Kconfig
@@ -1076,6 +1076,16 @@ config MFD_RDC321X
  southbridge which provides access to GPIOs and Watchdog using the
  southbridge PCI device configuration space.
 
+config MFD_RT4831
+   tristate "Richtek RT4831 four channel WLED and Display Bias Voltage"
+   depends on I2C
+   select MFD_CORE
+   select REGMAP_I2C
+   help
+ This enables support for the Richtek RT4831 that includes 4 channel
+ WLED driving and Display Bias Voltage. It's commonly used to provide
+ power to the LCD display and LCD backlight.
+
 config MFD_RT5033
tristate "Richtek RT5033 Power Management IC"
depends on I2C
diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile
index 4f6d2b8..eb42bd4 100644
--- a/drivers/mfd/Makefile
+++ b/drivers/mfd/Makefile
@@ -234,6 +234,7 @@ obj-$(CONFIG_MFD_MENF21BMC) += menf21bmc.o
 obj-$(CONFIG_MFD_HI6421_PMIC)  += hi6421-pmic-core.o
 obj-$(CONFIG_MFD_HI655X_PMIC)   += hi655x-pmic.o
 obj-$(CONFIG_MFD_DLN2) += dln2.o
+obj-$(CONFIG_MFD_RT4831)   += rt4831.o
 obj-$(CONFIG_MFD_RT5033)   += rt5033.o
 obj-$(CONFIG_MFD_SKY81452) += sky81452.o
 
diff --git a/drivers/mfd/rt4831.c b/drivers/mfd/rt4831.c
new file mode 100644
index ..b169781
--- /dev/null
+++ b/drivers/mfd/rt4831.c
@@ -0,0 +1,115 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (c) 2021 Richtek Technology Corp.
+ *
+ * Author: ChiYuan Huang 
+ */
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#define RT4831_REG_REVISION0x01
+#define RT4831_REG_ENABLE  0x08
+#define RT4831_REG_I2CPROT 0x15
+
+#define RICHTEK_VENDOR_ID  0x03
+#define RT4831_VID_MASKGENMASK(1, 0)
+#define RT4831_RESET_MASK  BIT(7)
+#define RT4831_I2CSAFETMR_MASK BIT(0)
+
+static const struct mfd_cell rt4831_subdevs[] = {
+   MFD_CELL_OF("rt4831-backlight", NULL, NULL, 0, 0, 
"richtek,rt4831-backlight"),
+   MFD_CELL_NAME("rt4831-regulator")
+};
+
+static bool rt4831_is_accessible_reg(struct device *dev, unsigned int reg)
+{
+   if (reg >= RT4831_REG_REVISION && reg <= RT4831_REG_I2CPROT)
+   return true;
+   return false;
+}
+
+static const struct regmap_config rt4831_regmap_config = {
+   .reg_bits = 8,
+   .val_bits = 8,
+   .max_register = RT4831_REG_I2CPROT,
+
+   .readable_reg = rt4831_is_accessible_reg,
+   .writeable_reg = rt4831_is_accessible_reg,
+};
+
+static int rt4831_probe(struct i2c_client *client)
+{
+   struct gpio_desc *enable_gpio;
+   struct regmap *regmap;
+   unsigned int chip_id;
+   int ret;
+
+   enable_gpio = devm_gpiod_get_optional(>dev, "enable", 
GPIOD_OUT_HIGH);
+   if (IS_ERR(enable_gpio)) {
+   dev_err(>dev, "Failed to get 'enable' GPIO\n");
+   return PTR_ERR(enable_gpio);
+   }
+
+   regmap = devm_regmap_init_i2c(client, _regmap_config);
+   if (IS_ERR(regmap)) {
+   dev_err(>dev, "Failed to initialize regmap\n");
+   return PTR_ERR(regmap);
+   }
+
+   ret = regmap_read(regmap, RT4831_REG_REVISION, _id);
+   if (ret) {
+   dev_err(>dev, "Failed to get H/W revision\n");
+   return ret;
+   }
+
+   if ((chip_id & RT4831_VID_MASK) != RICHTEK_VENDOR_ID) {
+   dev_err(>dev, "Chip vendor ID 0x%02x not matched\n", 
chip_id);
+   return -ENODEV;
+   }
+
+   /*
+* Used to prevent the abnormal shutdown.
+* If SCL/SDA both keep low for one second to reset HW.
+*/
+   ret = 

[PATCH v7 2/4] backlight: rt4831: Adds DT binding document for Richtek RT4831 backlight

2021-05-12 Thread cy_huang
From: ChiYuan Huang 

Adds DT binding document for Richtek RT4831 backlight.

Signed-off-by: ChiYuan Huang 
Reviewed-by: Daniel Thompson 
---
since v7
- Add allOf property refer to common.yaml.
- Remove default-brightness/max-brightness description and refer string.
---
 .../leds/backlight/richtek,rt4831-backlight.yaml   | 62 ++
 include/dt-bindings/leds/rt4831-backlight.h| 23 
 2 files changed, 85 insertions(+)
 create mode 100644 
Documentation/devicetree/bindings/leds/backlight/richtek,rt4831-backlight.yaml
 create mode 100644 include/dt-bindings/leds/rt4831-backlight.h

diff --git 
a/Documentation/devicetree/bindings/leds/backlight/richtek,rt4831-backlight.yaml
 
b/Documentation/devicetree/bindings/leds/backlight/richtek,rt4831-backlight.yaml
new file mode 100644
index ..e0ac686
--- /dev/null
+++ 
b/Documentation/devicetree/bindings/leds/backlight/richtek,rt4831-backlight.yaml
@@ -0,0 +1,62 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: 
http://devicetree.org/schemas/leds/backlight/richtek,rt4831-backlight.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Richtek RT4831 Backlight
+
+maintainers:
+  - ChiYuan Huang 
+
+description: |
+  RT4831 is a mutifunctional device that can provide power to the LCD display
+  and LCD backlight.
+
+  For the LCD backlight, it can provide four channel WLED driving capability.
+  Each channel driving current is up to 30mA
+
+  Datasheet is available at
+  https://www.richtek.com/assets/product_file/RT4831A/DS4831A-05.pdf
+
+allOf:
+  - $ref: common.yaml#
+
+properties:
+  compatible:
+const: richtek,rt4831-backlight
+
+  default-brightness:
+minimum: 0
+maximum: 2048
+
+  max-brightness:
+minimum: 0
+maximum: 2048
+
+  richtek,pwm-enable:
+description: |
+  Specify the backlight dimming following by PWM duty or by SW control.
+type: boolean
+
+  richtek,bled-ovp-sel:
+description: |
+  Backlight OVP level selection, currently support 17V/21V/25V/29V.
+$ref: /schemas/types.yaml#/definitions/uint8
+default: 1
+minimum: 0
+maximum: 3
+
+  richtek,channel-use:
+description: |
+  Backlight LED channel to be used.
+  BIT 0/1/2/3 is used to indicate led channel 1/2/3/4 enable or disable.
+$ref: /schemas/types.yaml#/definitions/uint8
+minimum: 1
+maximum: 15
+
+required:
+  - compatible
+  - richtek,channel-use
+
+additionalProperties: false
diff --git a/include/dt-bindings/leds/rt4831-backlight.h 
b/include/dt-bindings/leds/rt4831-backlight.h
new file mode 100644
index ..125c635
--- /dev/null
+++ b/include/dt-bindings/leds/rt4831-backlight.h
@@ -0,0 +1,23 @@
+/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
+/*
+ * This header provides constants for rt4831 backlight bindings.
+ *
+ * Copyright (C) 2020, Richtek Technology Corp.
+ * Author: ChiYuan Huang 
+ */
+
+#ifndef _DT_BINDINGS_RT4831_BACKLIGHT_H
+#define _DT_BINDINGS_RT4831_BACKLIGHT_H
+
+#define RT4831_BLOVPLVL_17V0
+#define RT4831_BLOVPLVL_21V1
+#define RT4831_BLOVPLVL_25V2
+#define RT4831_BLOVPLVL_29V3
+
+#define RT4831_BLED_CH1EN  (1 << 0)
+#define RT4831_BLED_CH2EN  (1 << 1)
+#define RT4831_BLED_CH3EN  (1 << 2)
+#define RT4831_BLED_CH4EN  (1 << 3)
+#define RT4831_BLED_ALLCHEN((1 << 4) - 1)
+
+#endif /* _DT_BINDINGS_RT4831_BACKLIGHT_H */
-- 
2.7.4



[PATCH v7 1/4] mfd: rt4831: Adds support for Richtek RT4831

2021-05-12 Thread cy_huang
From: ChiYuan Huang 

This adds support Richtek RT4831 core. It includes four channel WLED driver
and Display Bias Voltage outputs.

Signed-off-by: ChiYuan Huang 
---
The RT4831 regulator patches are already on main stream, and can be referred to
9351ab8b0cb6 regulator: rt4831: Adds support for Richtek RT4831 DSV regulator
934b05e81862 regulator: rt4831: Adds DT binding document for Richtek RT4831 DSV 
regulator

since v6
- Respin the date from 2020 to 2021.
- Rmove the shutdown routine.
- Change the macro OF_MFD_CELL to MFD_CELL_OF.

since v5
- Rename file name from rt4831-core.c to rt4831.c
- Change RICHTEK_VID to RICHTEK_VENDOR_ID.
- Change gpio_desc nameing from 'enable' to 'enable_gpio' in probe.
- Change variable 'val' to the meaningful name 'chip_id'.
- Refine the error log when vendor id is not matched.
- Remove of_match_ptr.

since v2
- Refine Kconfig descriptions.
- Add copyright.
- Refine error logs in probe.
- Refine comment lines in remove and shutdown.
---
 drivers/mfd/Kconfig  |  10 +
 drivers/mfd/Makefile |   1 +
 drivers/mfd/rt4831.c | 115 +++
 3 files changed, 126 insertions(+)
 create mode 100644 drivers/mfd/rt4831.c

diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
index 5c7f2b1..49e57c9 100644
--- a/drivers/mfd/Kconfig
+++ b/drivers/mfd/Kconfig
@@ -1076,6 +1076,16 @@ config MFD_RDC321X
  southbridge which provides access to GPIOs and Watchdog using the
  southbridge PCI device configuration space.
 
+config MFD_RT4831
+   tristate "Richtek RT4831 four channel WLED and Display Bias Voltage"
+   depends on I2C
+   select MFD_CORE
+   select REGMAP_I2C
+   help
+ This enables support for the Richtek RT4831 that includes 4 channel
+ WLED driving and Display Bias Voltage. It's commonly used to provide
+ power to the LCD display and LCD backlight.
+
 config MFD_RT5033
tristate "Richtek RT5033 Power Management IC"
depends on I2C
diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile
index 4f6d2b8..eb42bd4 100644
--- a/drivers/mfd/Makefile
+++ b/drivers/mfd/Makefile
@@ -234,6 +234,7 @@ obj-$(CONFIG_MFD_MENF21BMC) += menf21bmc.o
 obj-$(CONFIG_MFD_HI6421_PMIC)  += hi6421-pmic-core.o
 obj-$(CONFIG_MFD_HI655X_PMIC)   += hi655x-pmic.o
 obj-$(CONFIG_MFD_DLN2) += dln2.o
+obj-$(CONFIG_MFD_RT4831)   += rt4831.o
 obj-$(CONFIG_MFD_RT5033)   += rt5033.o
 obj-$(CONFIG_MFD_SKY81452) += sky81452.o
 
diff --git a/drivers/mfd/rt4831.c b/drivers/mfd/rt4831.c
new file mode 100644
index ..b169781
--- /dev/null
+++ b/drivers/mfd/rt4831.c
@@ -0,0 +1,115 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (c) 2021 Richtek Technology Corp.
+ *
+ * Author: ChiYuan Huang 
+ */
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#define RT4831_REG_REVISION0x01
+#define RT4831_REG_ENABLE  0x08
+#define RT4831_REG_I2CPROT 0x15
+
+#define RICHTEK_VENDOR_ID  0x03
+#define RT4831_VID_MASKGENMASK(1, 0)
+#define RT4831_RESET_MASK  BIT(7)
+#define RT4831_I2CSAFETMR_MASK BIT(0)
+
+static const struct mfd_cell rt4831_subdevs[] = {
+   MFD_CELL_OF("rt4831-backlight", NULL, NULL, 0, 0, 
"richtek,rt4831-backlight"),
+   MFD_CELL_NAME("rt4831-regulator")
+};
+
+static bool rt4831_is_accessible_reg(struct device *dev, unsigned int reg)
+{
+   if (reg >= RT4831_REG_REVISION && reg <= RT4831_REG_I2CPROT)
+   return true;
+   return false;
+}
+
+static const struct regmap_config rt4831_regmap_config = {
+   .reg_bits = 8,
+   .val_bits = 8,
+   .max_register = RT4831_REG_I2CPROT,
+
+   .readable_reg = rt4831_is_accessible_reg,
+   .writeable_reg = rt4831_is_accessible_reg,
+};
+
+static int rt4831_probe(struct i2c_client *client)
+{
+   struct gpio_desc *enable_gpio;
+   struct regmap *regmap;
+   unsigned int chip_id;
+   int ret;
+
+   enable_gpio = devm_gpiod_get_optional(>dev, "enable", 
GPIOD_OUT_HIGH);
+   if (IS_ERR(enable_gpio)) {
+   dev_err(>dev, "Failed to get 'enable' GPIO\n");
+   return PTR_ERR(enable_gpio);
+   }
+
+   regmap = devm_regmap_init_i2c(client, _regmap_config);
+   if (IS_ERR(regmap)) {
+   dev_err(>dev, "Failed to initialize regmap\n");
+   return PTR_ERR(regmap);
+   }
+
+   ret = regmap_read(regmap, RT4831_REG_REVISION, _id);
+   if (ret) {
+   dev_err(>dev, "Failed to get H/W revision\n");
+   return ret;
+   }
+
+   if ((chip_id & RT4831_VID_MASK) != RICHTEK_VENDOR_ID) {
+   dev_err(>dev, "Chip vendor ID 0x%02x not matched\n", 
chip_id);
+   return -ENODEV;
+   }
+
+   /*
+* Used to prevent the abnormal shutdown.
+* If SCL/SDA both keep low for one second to reset HW.
+*/
+   ret = regmap_update_bits(regmap, RT4831_REG_I2CPROT, 
RT4831_I2CSAFETMR_MASK,

[PATCH v7 4/4] backlight: rt4831: Adds support for Richtek RT4831 backlight

2021-05-12 Thread cy_huang
From: ChiYuan Huang 

Adds support for Richtek RT4831 backlight.

Signed-off-by: ChiYuan Huang 
Reviewed-by: Daniel Thompson 
---
since v7
- Fix typo 'common' to 'commonly' in Kconfig description.
---
 drivers/video/backlight/Kconfig|   8 ++
 drivers/video/backlight/Makefile   |   1 +
 drivers/video/backlight/rt4831-backlight.c | 203 +
 3 files changed, 212 insertions(+)
 create mode 100644 drivers/video/backlight/rt4831-backlight.c

diff --git a/drivers/video/backlight/Kconfig b/drivers/video/backlight/Kconfig
index d83c87b..858f6df 100644
--- a/drivers/video/backlight/Kconfig
+++ b/drivers/video/backlight/Kconfig
@@ -289,6 +289,14 @@ config BACKLIGHT_QCOM_WLED
  If you have the Qualcomm PMIC, say Y to enable a driver for the
  WLED block. Currently it supports PM8941 and PMI8998.
 
+config BACKLIGHT_RT4831
+   tristate "Richtek RT4831 Backlight Driver"
+   depends on MFD_RT4831
+   help
+ This enables support for Richtek RT4831 Backlight driver.
+ It's commonly used to drive the display WLED. There're four channels
+ inisde, and each channel can provide up to 30mA current.
+
 config BACKLIGHT_SAHARA
tristate "Tabletkiosk Sahara Touch-iT Backlight Driver"
depends on X86
diff --git a/drivers/video/backlight/Makefile b/drivers/video/backlight/Makefile
index 685f3f1..cae2c83 100644
--- a/drivers/video/backlight/Makefile
+++ b/drivers/video/backlight/Makefile
@@ -49,6 +49,7 @@ obj-$(CONFIG_BACKLIGHT_PANDORA)   += pandora_bl.o
 obj-$(CONFIG_BACKLIGHT_PCF50633)   += pcf50633-backlight.o
 obj-$(CONFIG_BACKLIGHT_PWM)+= pwm_bl.o
 obj-$(CONFIG_BACKLIGHT_QCOM_WLED)  += qcom-wled.o
+obj-$(CONFIG_BACKLIGHT_RT4831) += rt4831-backlight.o
 obj-$(CONFIG_BACKLIGHT_SAHARA) += kb3886_bl.o
 obj-$(CONFIG_BACKLIGHT_SKY81452)   += sky81452-backlight.o
 obj-$(CONFIG_BACKLIGHT_TOSA)   += tosa_bl.o
diff --git a/drivers/video/backlight/rt4831-backlight.c 
b/drivers/video/backlight/rt4831-backlight.c
new file mode 100644
index ..42155c7
--- /dev/null
+++ b/drivers/video/backlight/rt4831-backlight.c
@@ -0,0 +1,203 @@
+// SPDX-License-Identifier: GPL-2.0-only
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#define RT4831_REG_BLCFG   0x02
+#define RT4831_REG_BLDIML  0x04
+#define RT4831_REG_ENABLE  0x08
+
+#define RT4831_BLMAX_BRIGHTNESS2048
+
+#define RT4831_BLOVP_MASK  GENMASK(7, 5)
+#define RT4831_BLOVP_SHIFT 5
+#define RT4831_BLPWMEN_MASKBIT(0)
+#define RT4831_BLEN_MASK   BIT(4)
+#define RT4831_BLCH_MASK   GENMASK(3, 0)
+#define RT4831_BLDIML_MASK GENMASK(2, 0)
+#define RT4831_BLDIMH_MASK GENMASK(10, 3)
+#define RT4831_BLDIMH_SHIFT3
+
+struct rt4831_priv {
+   struct device *dev;
+   struct regmap *regmap;
+   struct backlight_device *bl;
+};
+
+static int rt4831_bl_update_status(struct backlight_device *bl_dev)
+{
+   struct rt4831_priv *priv = bl_get_data(bl_dev);
+   int brightness = backlight_get_brightness(bl_dev);
+   unsigned int enable = brightness ? RT4831_BLEN_MASK : 0;
+   u8 v[2];
+   int ret;
+
+   if (brightness) {
+   v[0] = (brightness - 1) & RT4831_BLDIML_MASK;
+   v[1] = ((brightness - 1) & RT4831_BLDIMH_MASK) >> 
RT4831_BLDIMH_SHIFT;
+
+   ret = regmap_raw_write(priv->regmap, RT4831_REG_BLDIML, v, 
sizeof(v));
+   if (ret)
+   return ret;
+   }
+
+   return regmap_update_bits(priv->regmap, RT4831_REG_ENABLE, 
RT4831_BLEN_MASK, enable);
+
+}
+
+static int rt4831_bl_get_brightness(struct backlight_device *bl_dev)
+{
+   struct rt4831_priv *priv = bl_get_data(bl_dev);
+   unsigned int val;
+   u8 v[2];
+   int ret;
+
+   ret = regmap_read(priv->regmap, RT4831_REG_ENABLE, );
+   if (ret)
+   return ret;
+
+   if (!(val & RT4831_BLEN_MASK))
+   return 0;
+
+   ret = regmap_raw_read(priv->regmap, RT4831_REG_BLDIML, v, sizeof(v));
+   if (ret)
+   return ret;
+
+   ret = (v[1] << RT4831_BLDIMH_SHIFT) + (v[0] & RT4831_BLDIML_MASK) + 1;
+
+   return ret;
+}
+
+static const struct backlight_ops rt4831_bl_ops = {
+   .options = BL_CORE_SUSPENDRESUME,
+   .update_status = rt4831_bl_update_status,
+   .get_brightness = rt4831_bl_get_brightness,
+};
+
+static int rt4831_parse_backlight_properties(struct rt4831_priv *priv,
+struct backlight_properties 
*bl_props)
+{
+   struct device *dev = priv->dev;
+   u8 propval;
+   u32 brightness;
+   unsigned int val = 0;
+   int ret;
+
+   /* common properties */
+   ret = device_property_read_u32(dev, "max-brightness", );
+   if (ret)
+   brightness = RT4831_BLMAX_BRIGHTNESS;
+
+   bl_props->max_brightness = min_t(u32, 

[PATCH v7 3/4] mfd: rt4831: Adds DT binding document for Richtek RT4831

2021-05-12 Thread cy_huang
From: ChiYuan Huang 

Adds DT binding document for Richtek RT4831.

Signed-off-by: ChiYuan Huang 
Reviewed-by: Rob Herring 
---
 .../devicetree/bindings/mfd/richtek,rt4831.yaml| 90 ++
 1 file changed, 90 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/mfd/richtek,rt4831.yaml

diff --git a/Documentation/devicetree/bindings/mfd/richtek,rt4831.yaml 
b/Documentation/devicetree/bindings/mfd/richtek,rt4831.yaml
new file mode 100644
index ..4762eb1
--- /dev/null
+++ b/Documentation/devicetree/bindings/mfd/richtek,rt4831.yaml
@@ -0,0 +1,90 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/mfd/richtek,rt4831.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Richtek RT4831 DSV and Backlight Integrated IC
+
+maintainers:
+  - ChiYuan Huang 
+
+description: |
+  RT4831 is a multifunctional device that can provide power to the LCD display
+  and LCD backlight.
+
+  For Display Bias Voltage DSVP and DSVN, the output range is about 4V to 6.5V.
+  It's sufficient to meet the current LCD power requirement.
+
+  For the LCD backlight, it can provide four channel WLED driving capability.
+  Each channel driving current is up to 30mA
+
+  Datasheet is available at
+  https://www.richtek.com/assets/product_file/RT4831A/DS4831A-05.pdf
+
+properties:
+  compatible:
+const: richtek,rt4831
+
+  reg:
+description: I2C device address.
+maxItems: 1
+
+  enable-gpios:
+description: |
+  GPIO to enable/disable the chip. It is optional.
+  Some usage directly tied this pin to follow VIO 1.8V power on sequence.
+maxItems: 1
+
+  regulators:
+$ref: ../regulator/richtek,rt4831-regulator.yaml
+
+  backlight:
+$ref: ../leds/backlight/richtek,rt4831-backlight.yaml
+
+required:
+  - compatible
+  - reg
+
+additionalProperties: false
+
+examples:
+  - |
+#include 
+i2c {
+  #address-cells = <1>;
+  #size-cells = <0>;
+
+  rt4831@11 {
+compatible = "richtek,rt4831";
+reg = <0x11>;
+
+regulators {
+  DSVLCM {
+regulator-min-microvolt = <400>;
+regulator-max-microvolt = <715>;
+regulator-allow-bypass;
+  };
+  DSVP {
+regulator-name = "rt4831-dsvp";
+regulator-min-microvolt = <400>;
+regulator-max-microvolt = <650>;
+regulator-boot-on;
+  };
+  DSVN {
+regulator-name = "rt4831-dsvn";
+regulator-min-microvolt = <400>;
+regulator-max-microvolt = <650>;
+regulator-boot-on;
+  };
+};
+
+backlight {
+  compatible = "richtek,rt4831-backlight";
+  default-brightness = <1024>;
+  max-brightness = <2048>;
+  richtek,bled-ovp-sel = /bits/ 8 ;
+  richtek,channel-use = /bits/ 8 ;
+};
+  };
+};
-- 
2.7.4



[RESEND PATCH v6 4/4] backlight: rt4831: Adds support for Richtek RT4831 backlight

2021-04-26 Thread cy_huang
From: ChiYuan Huang 

Adds support for Richtek RT4831 backlight.

Signed-off-by: ChiYuan Huang 
Reviewed-by: Daniel Thompson 
---
Resend this v6 patch series to loop devicetree reviewers.

For next, if the typo in Kconfig 'common' to 'commonly' can be added the below 
line
Reviewed-by: Daniel Thompson 
---
 drivers/video/backlight/Kconfig|   8 ++
 drivers/video/backlight/Makefile   |   1 +
 drivers/video/backlight/rt4831-backlight.c | 203 +
 3 files changed, 212 insertions(+)
 create mode 100644 drivers/video/backlight/rt4831-backlight.c

diff --git a/drivers/video/backlight/Kconfig b/drivers/video/backlight/Kconfig
index d83c87b..de96441 100644
--- a/drivers/video/backlight/Kconfig
+++ b/drivers/video/backlight/Kconfig
@@ -289,6 +289,14 @@ config BACKLIGHT_QCOM_WLED
  If you have the Qualcomm PMIC, say Y to enable a driver for the
  WLED block. Currently it supports PM8941 and PMI8998.
 
+config BACKLIGHT_RT4831
+   tristate "Richtek RT4831 Backlight Driver"
+   depends on MFD_RT4831
+   help
+ This enables support for Richtek RT4831 Backlight driver.
+ It's common used to drive the display WLED. There're four channels
+ inisde, and each channel can provide up to 30mA current.
+
 config BACKLIGHT_SAHARA
tristate "Tabletkiosk Sahara Touch-iT Backlight Driver"
depends on X86
diff --git a/drivers/video/backlight/Makefile b/drivers/video/backlight/Makefile
index 685f3f1..cae2c83 100644
--- a/drivers/video/backlight/Makefile
+++ b/drivers/video/backlight/Makefile
@@ -49,6 +49,7 @@ obj-$(CONFIG_BACKLIGHT_PANDORA)   += pandora_bl.o
 obj-$(CONFIG_BACKLIGHT_PCF50633)   += pcf50633-backlight.o
 obj-$(CONFIG_BACKLIGHT_PWM)+= pwm_bl.o
 obj-$(CONFIG_BACKLIGHT_QCOM_WLED)  += qcom-wled.o
+obj-$(CONFIG_BACKLIGHT_RT4831) += rt4831-backlight.o
 obj-$(CONFIG_BACKLIGHT_SAHARA) += kb3886_bl.o
 obj-$(CONFIG_BACKLIGHT_SKY81452)   += sky81452-backlight.o
 obj-$(CONFIG_BACKLIGHT_TOSA)   += tosa_bl.o
diff --git a/drivers/video/backlight/rt4831-backlight.c 
b/drivers/video/backlight/rt4831-backlight.c
new file mode 100644
index ..42155c7
--- /dev/null
+++ b/drivers/video/backlight/rt4831-backlight.c
@@ -0,0 +1,203 @@
+// SPDX-License-Identifier: GPL-2.0-only
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#define RT4831_REG_BLCFG   0x02
+#define RT4831_REG_BLDIML  0x04
+#define RT4831_REG_ENABLE  0x08
+
+#define RT4831_BLMAX_BRIGHTNESS2048
+
+#define RT4831_BLOVP_MASK  GENMASK(7, 5)
+#define RT4831_BLOVP_SHIFT 5
+#define RT4831_BLPWMEN_MASKBIT(0)
+#define RT4831_BLEN_MASK   BIT(4)
+#define RT4831_BLCH_MASK   GENMASK(3, 0)
+#define RT4831_BLDIML_MASK GENMASK(2, 0)
+#define RT4831_BLDIMH_MASK GENMASK(10, 3)
+#define RT4831_BLDIMH_SHIFT3
+
+struct rt4831_priv {
+   struct device *dev;
+   struct regmap *regmap;
+   struct backlight_device *bl;
+};
+
+static int rt4831_bl_update_status(struct backlight_device *bl_dev)
+{
+   struct rt4831_priv *priv = bl_get_data(bl_dev);
+   int brightness = backlight_get_brightness(bl_dev);
+   unsigned int enable = brightness ? RT4831_BLEN_MASK : 0;
+   u8 v[2];
+   int ret;
+
+   if (brightness) {
+   v[0] = (brightness - 1) & RT4831_BLDIML_MASK;
+   v[1] = ((brightness - 1) & RT4831_BLDIMH_MASK) >> 
RT4831_BLDIMH_SHIFT;
+
+   ret = regmap_raw_write(priv->regmap, RT4831_REG_BLDIML, v, 
sizeof(v));
+   if (ret)
+   return ret;
+   }
+
+   return regmap_update_bits(priv->regmap, RT4831_REG_ENABLE, 
RT4831_BLEN_MASK, enable);
+
+}
+
+static int rt4831_bl_get_brightness(struct backlight_device *bl_dev)
+{
+   struct rt4831_priv *priv = bl_get_data(bl_dev);
+   unsigned int val;
+   u8 v[2];
+   int ret;
+
+   ret = regmap_read(priv->regmap, RT4831_REG_ENABLE, );
+   if (ret)
+   return ret;
+
+   if (!(val & RT4831_BLEN_MASK))
+   return 0;
+
+   ret = regmap_raw_read(priv->regmap, RT4831_REG_BLDIML, v, sizeof(v));
+   if (ret)
+   return ret;
+
+   ret = (v[1] << RT4831_BLDIMH_SHIFT) + (v[0] & RT4831_BLDIML_MASK) + 1;
+
+   return ret;
+}
+
+static const struct backlight_ops rt4831_bl_ops = {
+   .options = BL_CORE_SUSPENDRESUME,
+   .update_status = rt4831_bl_update_status,
+   .get_brightness = rt4831_bl_get_brightness,
+};
+
+static int rt4831_parse_backlight_properties(struct rt4831_priv *priv,
+struct backlight_properties 
*bl_props)
+{
+   struct device *dev = priv->dev;
+   u8 propval;
+   u32 brightness;
+   unsigned int val = 0;
+   int ret;
+
+   /* common properties */
+   ret = device_property_read_u32(dev, "max-brightness", );
+   if 

[RESEND PATCH v6 3/4] mfd: rt4831: Adds DT binding document for Richtek RT4831

2021-04-26 Thread cy_huang
From: ChiYuan Huang 

Adds DT binding document for Richtek RT4831.

Signed-off-by: ChiYuan Huang 
---
Resend this v6 patch series to loop devicetree reviewers.
---
 .../devicetree/bindings/mfd/richtek,rt4831.yaml| 90 ++
 1 file changed, 90 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/mfd/richtek,rt4831.yaml

diff --git a/Documentation/devicetree/bindings/mfd/richtek,rt4831.yaml 
b/Documentation/devicetree/bindings/mfd/richtek,rt4831.yaml
new file mode 100644
index ..4762eb1
--- /dev/null
+++ b/Documentation/devicetree/bindings/mfd/richtek,rt4831.yaml
@@ -0,0 +1,90 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/mfd/richtek,rt4831.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Richtek RT4831 DSV and Backlight Integrated IC
+
+maintainers:
+  - ChiYuan Huang 
+
+description: |
+  RT4831 is a multifunctional device that can provide power to the LCD display
+  and LCD backlight.
+
+  For Display Bias Voltage DSVP and DSVN, the output range is about 4V to 6.5V.
+  It's sufficient to meet the current LCD power requirement.
+
+  For the LCD backlight, it can provide four channel WLED driving capability.
+  Each channel driving current is up to 30mA
+
+  Datasheet is available at
+  https://www.richtek.com/assets/product_file/RT4831A/DS4831A-05.pdf
+
+properties:
+  compatible:
+const: richtek,rt4831
+
+  reg:
+description: I2C device address.
+maxItems: 1
+
+  enable-gpios:
+description: |
+  GPIO to enable/disable the chip. It is optional.
+  Some usage directly tied this pin to follow VIO 1.8V power on sequence.
+maxItems: 1
+
+  regulators:
+$ref: ../regulator/richtek,rt4831-regulator.yaml
+
+  backlight:
+$ref: ../leds/backlight/richtek,rt4831-backlight.yaml
+
+required:
+  - compatible
+  - reg
+
+additionalProperties: false
+
+examples:
+  - |
+#include 
+i2c {
+  #address-cells = <1>;
+  #size-cells = <0>;
+
+  rt4831@11 {
+compatible = "richtek,rt4831";
+reg = <0x11>;
+
+regulators {
+  DSVLCM {
+regulator-min-microvolt = <400>;
+regulator-max-microvolt = <715>;
+regulator-allow-bypass;
+  };
+  DSVP {
+regulator-name = "rt4831-dsvp";
+regulator-min-microvolt = <400>;
+regulator-max-microvolt = <650>;
+regulator-boot-on;
+  };
+  DSVN {
+regulator-name = "rt4831-dsvn";
+regulator-min-microvolt = <400>;
+regulator-max-microvolt = <650>;
+regulator-boot-on;
+  };
+};
+
+backlight {
+  compatible = "richtek,rt4831-backlight";
+  default-brightness = <1024>;
+  max-brightness = <2048>;
+  richtek,bled-ovp-sel = /bits/ 8 ;
+  richtek,channel-use = /bits/ 8 ;
+};
+  };
+};
-- 
2.7.4

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[RESEND PATCH v6 2/4] backlight: rt4831: Adds DT binding document for Richtek RT4831 backlight

2021-04-26 Thread cy_huang
From: ChiYuan Huang 

Adds DT binding document for Richtek RT4831 backlight.

Signed-off-by: ChiYuan Huang 
Reviewed-by: Daniel Thompson 
---
Resend this v6 patch series to loop devicetree reviewers.

For next, need to add the below line
Reviewed-by: Daniel Thompson 
---
 .../leds/backlight/richtek,rt4831-backlight.yaml   | 65 ++
 include/dt-bindings/leds/rt4831-backlight.h| 23 
 2 files changed, 88 insertions(+)
 create mode 100644 
Documentation/devicetree/bindings/leds/backlight/richtek,rt4831-backlight.yaml
 create mode 100644 include/dt-bindings/leds/rt4831-backlight.h

diff --git 
a/Documentation/devicetree/bindings/leds/backlight/richtek,rt4831-backlight.yaml
 
b/Documentation/devicetree/bindings/leds/backlight/richtek,rt4831-backlight.yaml
new file mode 100644
index ..4da6a66
--- /dev/null
+++ 
b/Documentation/devicetree/bindings/leds/backlight/richtek,rt4831-backlight.yaml
@@ -0,0 +1,65 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: 
http://devicetree.org/schemas/leds/backlight/richtek,rt4831-backlight.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Richtek RT4831 Backlight
+
+maintainers:
+  - ChiYuan Huang 
+
+description: |
+  RT4831 is a mutifunctional device that can provide power to the LCD display
+  and LCD backlight.
+
+  For the LCD backlight, it can provide four channel WLED driving capability.
+  Each channel driving current is up to 30mA
+
+  Datasheet is available at
+  https://www.richtek.com/assets/product_file/RT4831A/DS4831A-05.pdf
+
+properties:
+  compatible:
+const: richtek,rt4831-backlight
+
+  default-brightness:
+description: |
+  The default brightness that applied to the system on start-up.
+$ref: /schemas/types.yaml#/definitions/uint32
+minimum: 0
+maximum: 2048
+
+  max-brightness:
+description: |
+  The max brightness for the H/W limit
+$ref: /schemas/types.yaml#/definitions/uint32
+minimum: 0
+maximum: 2048
+
+  richtek,pwm-enable:
+description: |
+  Specify the backlight dimming following by PWM duty or by SW control.
+type: boolean
+
+  richtek,bled-ovp-sel:
+description: |
+  Backlight OVP level selection, currently support 17V/21V/25V/29V.
+$ref: /schemas/types.yaml#/definitions/uint8
+default: 1
+minimum: 0
+maximum: 3
+
+  richtek,channel-use:
+description: |
+  Backlight LED channel to be used.
+  BIT 0/1/2/3 is used to indicate led channel 1/2/3/4 enable or disable.
+$ref: /schemas/types.yaml#/definitions/uint8
+minimum: 1
+maximum: 15
+
+required:
+  - compatible
+  - richtek,channel-use
+
+additionalProperties: false
diff --git a/include/dt-bindings/leds/rt4831-backlight.h 
b/include/dt-bindings/leds/rt4831-backlight.h
new file mode 100644
index ..125c635
--- /dev/null
+++ b/include/dt-bindings/leds/rt4831-backlight.h
@@ -0,0 +1,23 @@
+/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
+/*
+ * This header provides constants for rt4831 backlight bindings.
+ *
+ * Copyright (C) 2020, Richtek Technology Corp.
+ * Author: ChiYuan Huang 
+ */
+
+#ifndef _DT_BINDINGS_RT4831_BACKLIGHT_H
+#define _DT_BINDINGS_RT4831_BACKLIGHT_H
+
+#define RT4831_BLOVPLVL_17V0
+#define RT4831_BLOVPLVL_21V1
+#define RT4831_BLOVPLVL_25V2
+#define RT4831_BLOVPLVL_29V3
+
+#define RT4831_BLED_CH1EN  (1 << 0)
+#define RT4831_BLED_CH2EN  (1 << 1)
+#define RT4831_BLED_CH3EN  (1 << 2)
+#define RT4831_BLED_CH4EN  (1 << 3)
+#define RT4831_BLED_ALLCHEN((1 << 4) - 1)
+
+#endif /* _DT_BINDINGS_RT4831_BACKLIGHT_H */
-- 
2.7.4

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[RESEND PATCH v6 1/4] mfd: rt4831: Adds support for Richtek RT4831

2021-04-26 Thread cy_huang
From: ChiYuan Huang 

This adds support Richtek RT4831 core. It includes four channel WLED driver
and Display Bias Voltage outputs.

Signed-off-by: ChiYuan Huang 
---
Resend this v6 patch series to loop devicetree reviewers.

The RT4831 regulator patches are already on main stream, and can be referred to
9351ab8b0cb6 regulator: rt4831: Adds support for Richtek RT4831 DSV regulator
934b05e81862 regulator: rt4831: Adds DT binding document for Richtek RT4831 DSV 
regulator

since v6
- Respin the date from 2020 to 2021.
- Rmove the shutdown routine.
- Change the macro OF_MFD_CELL to MFD_CELL_OF.


since v5
- Rename file name from rt4831-core.c to rt4831.c
- Change RICHTEK_VID to RICHTEK_VENDOR_ID.
- Change gpio_desc nameing from 'enable' to 'enable_gpio' in probe.
- Change variable 'val' to the meaningful name 'chip_id'.
- Refine the error log when vendor id is not matched.
- Remove of_match_ptr.

since v2
- Refine Kconfig descriptions.
- Add copyright.
- Refine error logs in probe.
- Refine comment lines in remove and shutdown.
---
 drivers/mfd/Kconfig  |  10 +
 drivers/mfd/Makefile |   1 +
 drivers/mfd/rt4831.c | 115 +++
 3 files changed, 126 insertions(+)
 create mode 100644 drivers/mfd/rt4831.c

diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
index b74efa4..3f43834 100644
--- a/drivers/mfd/Kconfig
+++ b/drivers/mfd/Kconfig
@@ -1065,6 +1065,16 @@ config MFD_RDC321X
  southbridge which provides access to GPIOs and Watchdog using the
  southbridge PCI device configuration space.
 
+config MFD_RT4831
+   tristate "Richtek RT4831 four channel WLED and Display Bias Voltage"
+   depends on I2C
+   select MFD_CORE
+   select REGMAP_I2C
+   help
+ This enables support for the Richtek RT4831 that includes 4 channel
+ WLED driving and Display Bias Voltage. It's commonly used to provide
+ power to the LCD display and LCD backlight.
+
 config MFD_RT5033
tristate "Richtek RT5033 Power Management IC"
depends on I2C
diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile
index 834f546..5986914 100644
--- a/drivers/mfd/Makefile
+++ b/drivers/mfd/Makefile
@@ -235,6 +235,7 @@ obj-$(CONFIG_MFD_MENF21BMC) += menf21bmc.o
 obj-$(CONFIG_MFD_HI6421_PMIC)  += hi6421-pmic-core.o
 obj-$(CONFIG_MFD_HI655X_PMIC)   += hi655x-pmic.o
 obj-$(CONFIG_MFD_DLN2) += dln2.o
+obj-$(CONFIG_MFD_RT4831)   += rt4831.o
 obj-$(CONFIG_MFD_RT5033)   += rt5033.o
 obj-$(CONFIG_MFD_SKY81452) += sky81452.o
 
diff --git a/drivers/mfd/rt4831.c b/drivers/mfd/rt4831.c
new file mode 100644
index ..b169781
--- /dev/null
+++ b/drivers/mfd/rt4831.c
@@ -0,0 +1,115 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (c) 2021 Richtek Technology Corp.
+ *
+ * Author: ChiYuan Huang 
+ */
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#define RT4831_REG_REVISION0x01
+#define RT4831_REG_ENABLE  0x08
+#define RT4831_REG_I2CPROT 0x15
+
+#define RICHTEK_VENDOR_ID  0x03
+#define RT4831_VID_MASKGENMASK(1, 0)
+#define RT4831_RESET_MASK  BIT(7)
+#define RT4831_I2CSAFETMR_MASK BIT(0)
+
+static const struct mfd_cell rt4831_subdevs[] = {
+   MFD_CELL_OF("rt4831-backlight", NULL, NULL, 0, 0, 
"richtek,rt4831-backlight"),
+   MFD_CELL_NAME("rt4831-regulator")
+};
+
+static bool rt4831_is_accessible_reg(struct device *dev, unsigned int reg)
+{
+   if (reg >= RT4831_REG_REVISION && reg <= RT4831_REG_I2CPROT)
+   return true;
+   return false;
+}
+
+static const struct regmap_config rt4831_regmap_config = {
+   .reg_bits = 8,
+   .val_bits = 8,
+   .max_register = RT4831_REG_I2CPROT,
+
+   .readable_reg = rt4831_is_accessible_reg,
+   .writeable_reg = rt4831_is_accessible_reg,
+};
+
+static int rt4831_probe(struct i2c_client *client)
+{
+   struct gpio_desc *enable_gpio;
+   struct regmap *regmap;
+   unsigned int chip_id;
+   int ret;
+
+   enable_gpio = devm_gpiod_get_optional(>dev, "enable", 
GPIOD_OUT_HIGH);
+   if (IS_ERR(enable_gpio)) {
+   dev_err(>dev, "Failed to get 'enable' GPIO\n");
+   return PTR_ERR(enable_gpio);
+   }
+
+   regmap = devm_regmap_init_i2c(client, _regmap_config);
+   if (IS_ERR(regmap)) {
+   dev_err(>dev, "Failed to initialize regmap\n");
+   return PTR_ERR(regmap);
+   }
+
+   ret = regmap_read(regmap, RT4831_REG_REVISION, _id);
+   if (ret) {
+   dev_err(>dev, "Failed to get H/W revision\n");
+   return ret;
+   }
+
+   if ((chip_id & RT4831_VID_MASK) != RICHTEK_VENDOR_ID) {
+   dev_err(>dev, "Chip vendor ID 0x%02x not matched\n", 
chip_id);
+   return -ENODEV;
+   }
+
+   /*
+* Used to prevent the abnormal shutdown.
+* If SCL/SDA both keep low for one second to reset HW.
+*/
+   ret = 

[PATCH v6 4/4] backlight: rt4831: Adds support for Richtek RT4831 backlight

2021-03-28 Thread cy_huang
From: ChiYuan Huang 

Adds support for Richtek RT4831 backlight.

Signed-off-by: ChiYuan Huang 
---
since v6
- Fix Kconfig typo.
- Remove internal mutex lock.
- Add the prefix for max brightness.
- rename init_device_properties to parse_backlight_properties.
- Remove some warning message if default value is adopted.
- Add backlight property scale to LINEAR mapping.
- Fix regmap get to check NULL not IS_ERR.
---
 drivers/video/backlight/Kconfig|   8 ++
 drivers/video/backlight/Makefile   |   1 +
 drivers/video/backlight/rt4831-backlight.c | 203 +
 3 files changed, 212 insertions(+)
 create mode 100644 drivers/video/backlight/rt4831-backlight.c

diff --git a/drivers/video/backlight/Kconfig b/drivers/video/backlight/Kconfig
index d83c87b..de96441 100644
--- a/drivers/video/backlight/Kconfig
+++ b/drivers/video/backlight/Kconfig
@@ -289,6 +289,14 @@ config BACKLIGHT_QCOM_WLED
  If you have the Qualcomm PMIC, say Y to enable a driver for the
  WLED block. Currently it supports PM8941 and PMI8998.
 
+config BACKLIGHT_RT4831
+   tristate "Richtek RT4831 Backlight Driver"
+   depends on MFD_RT4831
+   help
+ This enables support for Richtek RT4831 Backlight driver.
+ It's common used to drive the display WLED. There're four channels
+ inisde, and each channel can provide up to 30mA current.
+
 config BACKLIGHT_SAHARA
tristate "Tabletkiosk Sahara Touch-iT Backlight Driver"
depends on X86
diff --git a/drivers/video/backlight/Makefile b/drivers/video/backlight/Makefile
index 685f3f1..cae2c83 100644
--- a/drivers/video/backlight/Makefile
+++ b/drivers/video/backlight/Makefile
@@ -49,6 +49,7 @@ obj-$(CONFIG_BACKLIGHT_PANDORA)   += pandora_bl.o
 obj-$(CONFIG_BACKLIGHT_PCF50633)   += pcf50633-backlight.o
 obj-$(CONFIG_BACKLIGHT_PWM)+= pwm_bl.o
 obj-$(CONFIG_BACKLIGHT_QCOM_WLED)  += qcom-wled.o
+obj-$(CONFIG_BACKLIGHT_RT4831) += rt4831-backlight.o
 obj-$(CONFIG_BACKLIGHT_SAHARA) += kb3886_bl.o
 obj-$(CONFIG_BACKLIGHT_SKY81452)   += sky81452-backlight.o
 obj-$(CONFIG_BACKLIGHT_TOSA)   += tosa_bl.o
diff --git a/drivers/video/backlight/rt4831-backlight.c 
b/drivers/video/backlight/rt4831-backlight.c
new file mode 100644
index ..42155c7
--- /dev/null
+++ b/drivers/video/backlight/rt4831-backlight.c
@@ -0,0 +1,203 @@
+// SPDX-License-Identifier: GPL-2.0-only
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#define RT4831_REG_BLCFG   0x02
+#define RT4831_REG_BLDIML  0x04
+#define RT4831_REG_ENABLE  0x08
+
+#define RT4831_BLMAX_BRIGHTNESS2048
+
+#define RT4831_BLOVP_MASK  GENMASK(7, 5)
+#define RT4831_BLOVP_SHIFT 5
+#define RT4831_BLPWMEN_MASKBIT(0)
+#define RT4831_BLEN_MASK   BIT(4)
+#define RT4831_BLCH_MASK   GENMASK(3, 0)
+#define RT4831_BLDIML_MASK GENMASK(2, 0)
+#define RT4831_BLDIMH_MASK GENMASK(10, 3)
+#define RT4831_BLDIMH_SHIFT3
+
+struct rt4831_priv {
+   struct device *dev;
+   struct regmap *regmap;
+   struct backlight_device *bl;
+};
+
+static int rt4831_bl_update_status(struct backlight_device *bl_dev)
+{
+   struct rt4831_priv *priv = bl_get_data(bl_dev);
+   int brightness = backlight_get_brightness(bl_dev);
+   unsigned int enable = brightness ? RT4831_BLEN_MASK : 0;
+   u8 v[2];
+   int ret;
+
+   if (brightness) {
+   v[0] = (brightness - 1) & RT4831_BLDIML_MASK;
+   v[1] = ((brightness - 1) & RT4831_BLDIMH_MASK) >> 
RT4831_BLDIMH_SHIFT;
+
+   ret = regmap_raw_write(priv->regmap, RT4831_REG_BLDIML, v, 
sizeof(v));
+   if (ret)
+   return ret;
+   }
+
+   return regmap_update_bits(priv->regmap, RT4831_REG_ENABLE, 
RT4831_BLEN_MASK, enable);
+
+}
+
+static int rt4831_bl_get_brightness(struct backlight_device *bl_dev)
+{
+   struct rt4831_priv *priv = bl_get_data(bl_dev);
+   unsigned int val;
+   u8 v[2];
+   int ret;
+
+   ret = regmap_read(priv->regmap, RT4831_REG_ENABLE, );
+   if (ret)
+   return ret;
+
+   if (!(val & RT4831_BLEN_MASK))
+   return 0;
+
+   ret = regmap_raw_read(priv->regmap, RT4831_REG_BLDIML, v, sizeof(v));
+   if (ret)
+   return ret;
+
+   ret = (v[1] << RT4831_BLDIMH_SHIFT) + (v[0] & RT4831_BLDIML_MASK) + 1;
+
+   return ret;
+}
+
+static const struct backlight_ops rt4831_bl_ops = {
+   .options = BL_CORE_SUSPENDRESUME,
+   .update_status = rt4831_bl_update_status,
+   .get_brightness = rt4831_bl_get_brightness,
+};
+
+static int rt4831_parse_backlight_properties(struct rt4831_priv *priv,
+struct backlight_properties 
*bl_props)
+{
+   struct device *dev = priv->dev;
+   u8 propval;
+   u32 brightness;
+   unsigned int val = 0;
+   int ret;
+
+

[PATCH v6 2/4] backlight: rt4831: Adds DT binding document for Richtek RT4831 backlight

2021-03-28 Thread cy_huang
From: ChiYuan Huang 

Adds DT binding document for Richtek RT4831 backlight.

Signed-off-by: ChiYuan Huang 
---
 .../leds/backlight/richtek,rt4831-backlight.yaml   | 65 ++
 include/dt-bindings/leds/rt4831-backlight.h| 23 
 2 files changed, 88 insertions(+)
 create mode 100644 
Documentation/devicetree/bindings/leds/backlight/richtek,rt4831-backlight.yaml
 create mode 100644 include/dt-bindings/leds/rt4831-backlight.h

diff --git 
a/Documentation/devicetree/bindings/leds/backlight/richtek,rt4831-backlight.yaml
 
b/Documentation/devicetree/bindings/leds/backlight/richtek,rt4831-backlight.yaml
new file mode 100644
index ..4da6a66
--- /dev/null
+++ 
b/Documentation/devicetree/bindings/leds/backlight/richtek,rt4831-backlight.yaml
@@ -0,0 +1,65 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: 
http://devicetree.org/schemas/leds/backlight/richtek,rt4831-backlight.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Richtek RT4831 Backlight
+
+maintainers:
+  - ChiYuan Huang 
+
+description: |
+  RT4831 is a mutifunctional device that can provide power to the LCD display
+  and LCD backlight.
+
+  For the LCD backlight, it can provide four channel WLED driving capability.
+  Each channel driving current is up to 30mA
+
+  Datasheet is available at
+  https://www.richtek.com/assets/product_file/RT4831A/DS4831A-05.pdf
+
+properties:
+  compatible:
+const: richtek,rt4831-backlight
+
+  default-brightness:
+description: |
+  The default brightness that applied to the system on start-up.
+$ref: /schemas/types.yaml#/definitions/uint32
+minimum: 0
+maximum: 2048
+
+  max-brightness:
+description: |
+  The max brightness for the H/W limit
+$ref: /schemas/types.yaml#/definitions/uint32
+minimum: 0
+maximum: 2048
+
+  richtek,pwm-enable:
+description: |
+  Specify the backlight dimming following by PWM duty or by SW control.
+type: boolean
+
+  richtek,bled-ovp-sel:
+description: |
+  Backlight OVP level selection, currently support 17V/21V/25V/29V.
+$ref: /schemas/types.yaml#/definitions/uint8
+default: 1
+minimum: 0
+maximum: 3
+
+  richtek,channel-use:
+description: |
+  Backlight LED channel to be used.
+  BIT 0/1/2/3 is used to indicate led channel 1/2/3/4 enable or disable.
+$ref: /schemas/types.yaml#/definitions/uint8
+minimum: 1
+maximum: 15
+
+required:
+  - compatible
+  - richtek,channel-use
+
+additionalProperties: false
diff --git a/include/dt-bindings/leds/rt4831-backlight.h 
b/include/dt-bindings/leds/rt4831-backlight.h
new file mode 100644
index ..125c635
--- /dev/null
+++ b/include/dt-bindings/leds/rt4831-backlight.h
@@ -0,0 +1,23 @@
+/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
+/*
+ * This header provides constants for rt4831 backlight bindings.
+ *
+ * Copyright (C) 2020, Richtek Technology Corp.
+ * Author: ChiYuan Huang 
+ */
+
+#ifndef _DT_BINDINGS_RT4831_BACKLIGHT_H
+#define _DT_BINDINGS_RT4831_BACKLIGHT_H
+
+#define RT4831_BLOVPLVL_17V0
+#define RT4831_BLOVPLVL_21V1
+#define RT4831_BLOVPLVL_25V2
+#define RT4831_BLOVPLVL_29V3
+
+#define RT4831_BLED_CH1EN  (1 << 0)
+#define RT4831_BLED_CH2EN  (1 << 1)
+#define RT4831_BLED_CH3EN  (1 << 2)
+#define RT4831_BLED_CH4EN  (1 << 3)
+#define RT4831_BLED_ALLCHEN((1 << 4) - 1)
+
+#endif /* _DT_BINDINGS_RT4831_BACKLIGHT_H */
-- 
2.7.4

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v6 3/4] mfd: rt4831: Adds DT binding document for Richtek RT4831

2021-03-28 Thread cy_huang
From: ChiYuan Huang 

Adds DT binding document for Richtek RT4831.

Signed-off-by: ChiYuan Huang 
---
 .../devicetree/bindings/mfd/richtek,rt4831.yaml| 90 ++
 1 file changed, 90 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/mfd/richtek,rt4831.yaml

diff --git a/Documentation/devicetree/bindings/mfd/richtek,rt4831.yaml 
b/Documentation/devicetree/bindings/mfd/richtek,rt4831.yaml
new file mode 100644
index ..4762eb1
--- /dev/null
+++ b/Documentation/devicetree/bindings/mfd/richtek,rt4831.yaml
@@ -0,0 +1,90 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/mfd/richtek,rt4831.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Richtek RT4831 DSV and Backlight Integrated IC
+
+maintainers:
+  - ChiYuan Huang 
+
+description: |
+  RT4831 is a multifunctional device that can provide power to the LCD display
+  and LCD backlight.
+
+  For Display Bias Voltage DSVP and DSVN, the output range is about 4V to 6.5V.
+  It's sufficient to meet the current LCD power requirement.
+
+  For the LCD backlight, it can provide four channel WLED driving capability.
+  Each channel driving current is up to 30mA
+
+  Datasheet is available at
+  https://www.richtek.com/assets/product_file/RT4831A/DS4831A-05.pdf
+
+properties:
+  compatible:
+const: richtek,rt4831
+
+  reg:
+description: I2C device address.
+maxItems: 1
+
+  enable-gpios:
+description: |
+  GPIO to enable/disable the chip. It is optional.
+  Some usage directly tied this pin to follow VIO 1.8V power on sequence.
+maxItems: 1
+
+  regulators:
+$ref: ../regulator/richtek,rt4831-regulator.yaml
+
+  backlight:
+$ref: ../leds/backlight/richtek,rt4831-backlight.yaml
+
+required:
+  - compatible
+  - reg
+
+additionalProperties: false
+
+examples:
+  - |
+#include 
+i2c {
+  #address-cells = <1>;
+  #size-cells = <0>;
+
+  rt4831@11 {
+compatible = "richtek,rt4831";
+reg = <0x11>;
+
+regulators {
+  DSVLCM {
+regulator-min-microvolt = <400>;
+regulator-max-microvolt = <715>;
+regulator-allow-bypass;
+  };
+  DSVP {
+regulator-name = "rt4831-dsvp";
+regulator-min-microvolt = <400>;
+regulator-max-microvolt = <650>;
+regulator-boot-on;
+  };
+  DSVN {
+regulator-name = "rt4831-dsvn";
+regulator-min-microvolt = <400>;
+regulator-max-microvolt = <650>;
+regulator-boot-on;
+  };
+};
+
+backlight {
+  compatible = "richtek,rt4831-backlight";
+  default-brightness = <1024>;
+  max-brightness = <2048>;
+  richtek,bled-ovp-sel = /bits/ 8 ;
+  richtek,channel-use = /bits/ 8 ;
+};
+  };
+};
-- 
2.7.4

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v6 1/4] mfd: rt4831: Adds support for Richtek RT4831

2021-03-28 Thread cy_huang
From: ChiYuan Huang 

This adds support Richtek RT4831 core. It includes four channel WLED driver
and Display Bias Voltage outputs.

Signed-off-by: ChiYuan Huang 
---
The RT4831 regulator patches are already on main stream, and can be referred to
9351ab8b0cb6 regulator: rt4831: Adds support for Richtek RT4831 DSV regulator
934b05e81862 regulator: rt4831: Adds DT binding document for Richtek RT4831 DSV 
regulator

since v6
- Respin the date from 2020 to 2021.
- Rmove the shutdown routine.
- Change the macro OF_MFD_CELL to MFD_CELL_OF.


since v5
- Rename file name from rt4831-core.c to rt4831.c
- Change RICHTEK_VID to RICHTEK_VENDOR_ID.
- Change gpio_desc nameing from 'enable' to 'enable_gpio' in probe.
- Change variable 'val' to the meaningful name 'chip_id'.
- Refine the error log when vendor id is not matched.
- Remove of_match_ptr.

since v2
- Refine Kconfig descriptions.
- Add copyright.
- Refine error logs in probe.
- Refine comment lines in remove and shutdown.
---
 drivers/mfd/Kconfig  |  10 +
 drivers/mfd/Makefile |   1 +
 drivers/mfd/rt4831.c | 115 +++
 3 files changed, 126 insertions(+)
 create mode 100644 drivers/mfd/rt4831.c

diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
index b74efa4..3f43834 100644
--- a/drivers/mfd/Kconfig
+++ b/drivers/mfd/Kconfig
@@ -1065,6 +1065,16 @@ config MFD_RDC321X
  southbridge which provides access to GPIOs and Watchdog using the
  southbridge PCI device configuration space.
 
+config MFD_RT4831
+   tristate "Richtek RT4831 four channel WLED and Display Bias Voltage"
+   depends on I2C
+   select MFD_CORE
+   select REGMAP_I2C
+   help
+ This enables support for the Richtek RT4831 that includes 4 channel
+ WLED driving and Display Bias Voltage. It's commonly used to provide
+ power to the LCD display and LCD backlight.
+
 config MFD_RT5033
tristate "Richtek RT5033 Power Management IC"
depends on I2C
diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile
index 834f546..5986914 100644
--- a/drivers/mfd/Makefile
+++ b/drivers/mfd/Makefile
@@ -235,6 +235,7 @@ obj-$(CONFIG_MFD_MENF21BMC) += menf21bmc.o
 obj-$(CONFIG_MFD_HI6421_PMIC)  += hi6421-pmic-core.o
 obj-$(CONFIG_MFD_HI655X_PMIC)   += hi655x-pmic.o
 obj-$(CONFIG_MFD_DLN2) += dln2.o
+obj-$(CONFIG_MFD_RT4831)   += rt4831.o
 obj-$(CONFIG_MFD_RT5033)   += rt5033.o
 obj-$(CONFIG_MFD_SKY81452) += sky81452.o
 
diff --git a/drivers/mfd/rt4831.c b/drivers/mfd/rt4831.c
new file mode 100644
index ..b169781
--- /dev/null
+++ b/drivers/mfd/rt4831.c
@@ -0,0 +1,115 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (c) 2021 Richtek Technology Corp.
+ *
+ * Author: ChiYuan Huang 
+ */
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#define RT4831_REG_REVISION0x01
+#define RT4831_REG_ENABLE  0x08
+#define RT4831_REG_I2CPROT 0x15
+
+#define RICHTEK_VENDOR_ID  0x03
+#define RT4831_VID_MASKGENMASK(1, 0)
+#define RT4831_RESET_MASK  BIT(7)
+#define RT4831_I2CSAFETMR_MASK BIT(0)
+
+static const struct mfd_cell rt4831_subdevs[] = {
+   MFD_CELL_OF("rt4831-backlight", NULL, NULL, 0, 0, 
"richtek,rt4831-backlight"),
+   MFD_CELL_NAME("rt4831-regulator")
+};
+
+static bool rt4831_is_accessible_reg(struct device *dev, unsigned int reg)
+{
+   if (reg >= RT4831_REG_REVISION && reg <= RT4831_REG_I2CPROT)
+   return true;
+   return false;
+}
+
+static const struct regmap_config rt4831_regmap_config = {
+   .reg_bits = 8,
+   .val_bits = 8,
+   .max_register = RT4831_REG_I2CPROT,
+
+   .readable_reg = rt4831_is_accessible_reg,
+   .writeable_reg = rt4831_is_accessible_reg,
+};
+
+static int rt4831_probe(struct i2c_client *client)
+{
+   struct gpio_desc *enable_gpio;
+   struct regmap *regmap;
+   unsigned int chip_id;
+   int ret;
+
+   enable_gpio = devm_gpiod_get_optional(>dev, "enable", 
GPIOD_OUT_HIGH);
+   if (IS_ERR(enable_gpio)) {
+   dev_err(>dev, "Failed to get 'enable' GPIO\n");
+   return PTR_ERR(enable_gpio);
+   }
+
+   regmap = devm_regmap_init_i2c(client, _regmap_config);
+   if (IS_ERR(regmap)) {
+   dev_err(>dev, "Failed to initialize regmap\n");
+   return PTR_ERR(regmap);
+   }
+
+   ret = regmap_read(regmap, RT4831_REG_REVISION, _id);
+   if (ret) {
+   dev_err(>dev, "Failed to get H/W revision\n");
+   return ret;
+   }
+
+   if ((chip_id & RT4831_VID_MASK) != RICHTEK_VENDOR_ID) {
+   dev_err(>dev, "Chip vendor ID 0x%02x not matched\n", 
chip_id);
+   return -ENODEV;
+   }
+
+   /*
+* Used to prevent the abnormal shutdown.
+* If SCL/SDA both keep low for one second to reset HW.
+*/
+   ret = regmap_update_bits(regmap, RT4831_REG_I2CPROT, 

[PATCH v5 2/6] backlight: rt4831: Adds DT binding document for Richtek RT4831 backlight

2020-12-18 Thread cy_huang
From: ChiYuan Huang 

Adds DT binding document for Richtek RT4831 backlight.

Signed-off-by: ChiYuan Huang 
---
since v5
- Drop the example in dt-binding. Aready full example in mfd dt-binding.

since v3
- Move inlcude/dt-bindings/leds/rt4831-backlight.h from patch 0004 to here.
- Add dual license tag in header and backlight binding document.
- Left backlight dt-binding example only.
---
 .../leds/backlight/richtek,rt4831-backlight.yaml   | 65 ++
 include/dt-bindings/leds/rt4831-backlight.h| 23 
 2 files changed, 88 insertions(+)
 create mode 100644 
Documentation/devicetree/bindings/leds/backlight/richtek,rt4831-backlight.yaml
 create mode 100644 include/dt-bindings/leds/rt4831-backlight.h

diff --git 
a/Documentation/devicetree/bindings/leds/backlight/richtek,rt4831-backlight.yaml
 
b/Documentation/devicetree/bindings/leds/backlight/richtek,rt4831-backlight.yaml
new file mode 100644
index ..4da6a66
--- /dev/null
+++ 
b/Documentation/devicetree/bindings/leds/backlight/richtek,rt4831-backlight.yaml
@@ -0,0 +1,65 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: 
http://devicetree.org/schemas/leds/backlight/richtek,rt4831-backlight.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Richtek RT4831 Backlight
+
+maintainers:
+  - ChiYuan Huang 
+
+description: |
+  RT4831 is a mutifunctional device that can provide power to the LCD display
+  and LCD backlight.
+
+  For the LCD backlight, it can provide four channel WLED driving capability.
+  Each channel driving current is up to 30mA
+
+  Datasheet is available at
+  https://www.richtek.com/assets/product_file/RT4831A/DS4831A-05.pdf
+
+properties:
+  compatible:
+const: richtek,rt4831-backlight
+
+  default-brightness:
+description: |
+  The default brightness that applied to the system on start-up.
+$ref: /schemas/types.yaml#/definitions/uint32
+minimum: 0
+maximum: 2048
+
+  max-brightness:
+description: |
+  The max brightness for the H/W limit
+$ref: /schemas/types.yaml#/definitions/uint32
+minimum: 0
+maximum: 2048
+
+  richtek,pwm-enable:
+description: |
+  Specify the backlight dimming following by PWM duty or by SW control.
+type: boolean
+
+  richtek,bled-ovp-sel:
+description: |
+  Backlight OVP level selection, currently support 17V/21V/25V/29V.
+$ref: /schemas/types.yaml#/definitions/uint8
+default: 1
+minimum: 0
+maximum: 3
+
+  richtek,channel-use:
+description: |
+  Backlight LED channel to be used.
+  BIT 0/1/2/3 is used to indicate led channel 1/2/3/4 enable or disable.
+$ref: /schemas/types.yaml#/definitions/uint8
+minimum: 1
+maximum: 15
+
+required:
+  - compatible
+  - richtek,channel-use
+
+additionalProperties: false
diff --git a/include/dt-bindings/leds/rt4831-backlight.h 
b/include/dt-bindings/leds/rt4831-backlight.h
new file mode 100644
index ..125c635
--- /dev/null
+++ b/include/dt-bindings/leds/rt4831-backlight.h
@@ -0,0 +1,23 @@
+/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
+/*
+ * This header provides constants for rt4831 backlight bindings.
+ *
+ * Copyright (C) 2020, Richtek Technology Corp.
+ * Author: ChiYuan Huang 
+ */
+
+#ifndef _DT_BINDINGS_RT4831_BACKLIGHT_H
+#define _DT_BINDINGS_RT4831_BACKLIGHT_H
+
+#define RT4831_BLOVPLVL_17V0
+#define RT4831_BLOVPLVL_21V1
+#define RT4831_BLOVPLVL_25V2
+#define RT4831_BLOVPLVL_29V3
+
+#define RT4831_BLED_CH1EN  (1 << 0)
+#define RT4831_BLED_CH2EN  (1 << 1)
+#define RT4831_BLED_CH3EN  (1 << 2)
+#define RT4831_BLED_CH4EN  (1 << 3)
+#define RT4831_BLED_ALLCHEN((1 << 4) - 1)
+
+#endif /* _DT_BINDINGS_RT4831_BACKLIGHT_H */
-- 
2.7.4

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v5 3/6] regulator: rt4831: Adds DT binding document for Richtek RT4831 DSV regulator

2020-12-18 Thread cy_huang
From: ChiYuan Huang 

Adds DT binding document for Richtek RT4831 DSV regulator.

Signed-off-by: ChiYuan Huang 
---
since v5
- Revert it back from v3 patch.
- Drop the example in dt-binding, Already full example in mfd dt-binding.
---
 .../regulator/richtek,rt4831-regulator.yaml| 35 ++
 1 file changed, 35 insertions(+)
 create mode 100644 
Documentation/devicetree/bindings/regulator/richtek,rt4831-regulator.yaml

diff --git 
a/Documentation/devicetree/bindings/regulator/richtek,rt4831-regulator.yaml 
b/Documentation/devicetree/bindings/regulator/richtek,rt4831-regulator.yaml
new file mode 100644
index ..d9c2333
--- /dev/null
+++ b/Documentation/devicetree/bindings/regulator/richtek,rt4831-regulator.yaml
@@ -0,0 +1,35 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/regulator/richtek,rt4831-regulator.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Richtek RT4831 Display Bias Voltage Regulator
+
+maintainers:
+  - ChiYuan Huang 
+
+description: |
+  RT4831 is a multifunctional device that can provide power to the LCD display
+  and LCD backlight.
+
+  For Display Bias Voltage DSVP and DSVN, the output range is about 4V to 6.5V.
+  It is sufficient to meet the current LCD power requirement.
+
+  DSVLCM is a boost regulator in IC internal as DSVP and DSVN input power.
+  Its voltage should be configured above 0.15V to 0.2V gap larger than the
+  voltage needed for DSVP and DSVN. Too much voltage gap could improve the
+  voltage drop from the heavy loading scenario. But it also make the power
+  efficiency worse. It's a trade-off.
+
+  Datasheet is available at
+  https://www.richtek.com/assets/product_file/RT4831A/DS4831A-05.pdf
+
+patternProperties:
+  "^DSV(LCM|P|N)$":
+type: object
+$ref: regulator.yaml#
+description:
+  Properties for single Display Bias Voltage regulator.
+
+additionalProperties: false
-- 
2.7.4

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v5 1/6] mfd: rt4831: Adds support for Richtek RT4831 core

2020-12-18 Thread cy_huang
From: ChiYuan Huang 

This adds support Richtek RT4831 core. It includes four channel WLED driver
and Display Bias Voltage outputs.

Signed-off-by: ChiYuan Huang 
---
since v5
- Rename file name from rt4831-core.c to rt4831.c
- Change RICHTEK_VID to RICHTEK_VENDOR_ID.
- Change gpio_desc nameing from 'enable' to 'enable_gpio' in probe.
- Change variable 'val' to the meaningful name 'chip_id'.
- Refine the error log when vendor id is not matched.
- Remove of_match_ptr.

since v2
- Refine Kconfig descriptions.
- Add copyright.
- Refine error logs in probe.
- Refine comment lines in remove and shutdown.
---
 drivers/mfd/Kconfig  |  10 +
 drivers/mfd/Makefile |   1 +
 drivers/mfd/rt4831.c | 124 +++
 3 files changed, 135 insertions(+)
 create mode 100644 drivers/mfd/rt4831.c

diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
index 8b99a13..dfb2640 100644
--- a/drivers/mfd/Kconfig
+++ b/drivers/mfd/Kconfig
@@ -1088,6 +1088,16 @@ config MFD_RDC321X
  southbridge which provides access to GPIOs and Watchdog using the
  southbridge PCI device configuration space.
 
+config MFD_RT4831
+   tristate "Richtek RT4831 four channel WLED and Display Bias Voltage"
+   depends on I2C
+   select MFD_CORE
+   select REGMAP_I2C
+   help
+ This enables support for the Richtek RT4831 that includes 4 channel
+ WLED driving and Display Bias Voltage. It's commonly used to provide
+ power to the LCD display and LCD backlight.
+
 config MFD_RT5033
tristate "Richtek RT5033 Power Management IC"
depends on I2C
diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile
index 1780019..28d247b 100644
--- a/drivers/mfd/Makefile
+++ b/drivers/mfd/Makefile
@@ -235,6 +235,7 @@ obj-$(CONFIG_MFD_MENF21BMC) += menf21bmc.o
 obj-$(CONFIG_MFD_HI6421_PMIC)  += hi6421-pmic-core.o
 obj-$(CONFIG_MFD_HI655X_PMIC)   += hi655x-pmic.o
 obj-$(CONFIG_MFD_DLN2) += dln2.o
+obj-$(CONFIG_MFD_RT4831)   += rt4831.o
 obj-$(CONFIG_MFD_RT5033)   += rt5033.o
 obj-$(CONFIG_MFD_SKY81452) += sky81452.o
 
diff --git a/drivers/mfd/rt4831.c b/drivers/mfd/rt4831.c
new file mode 100644
index ..2bf8364
--- /dev/null
+++ b/drivers/mfd/rt4831.c
@@ -0,0 +1,124 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (c) 2020 Richtek Technology Corp.
+ *
+ * Author: ChiYuan Huang 
+ */
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#define RT4831_REG_REVISION0x01
+#define RT4831_REG_ENABLE  0x08
+#define RT4831_REG_I2CPROT 0x15
+
+#define RICHTEK_VENDOR_ID  0x03
+#define RT4831_VID_MASKGENMASK(1, 0)
+#define RT4831_RESET_MASK  BIT(7)
+#define RT4831_I2CSAFETMR_MASK BIT(0)
+
+static const struct mfd_cell rt4831_subdevs[] = {
+   OF_MFD_CELL("rt4831-backlight", NULL, NULL, 0, 0, 
"richtek,rt4831-backlight"),
+   MFD_CELL_NAME("rt4831-regulator")
+};
+
+static bool rt4831_is_accessible_reg(struct device *dev, unsigned int reg)
+{
+   if (reg >= RT4831_REG_REVISION && reg <= RT4831_REG_I2CPROT)
+   return true;
+   return false;
+}
+
+static const struct regmap_config rt4831_regmap_config = {
+   .reg_bits = 8,
+   .val_bits = 8,
+   .max_register = RT4831_REG_I2CPROT,
+
+   .readable_reg = rt4831_is_accessible_reg,
+   .writeable_reg = rt4831_is_accessible_reg,
+};
+
+static int rt4831_probe(struct i2c_client *client)
+{
+   struct gpio_desc *enable_gpio;
+   struct regmap *regmap;
+   unsigned int chip_id;
+   int ret;
+
+   enable_gpio = devm_gpiod_get_optional(>dev, "enable", 
GPIOD_OUT_HIGH);
+   if (IS_ERR(enable_gpio)) {
+   dev_err(>dev, "Failed to get 'enable' GPIO\n");
+   return PTR_ERR(enable_gpio);
+   }
+
+   regmap = devm_regmap_init_i2c(client, _regmap_config);
+   if (IS_ERR(regmap)) {
+   dev_err(>dev, "Failed to initialize regmap\n");
+   return PTR_ERR(regmap);
+   }
+
+   ret = regmap_read(regmap, RT4831_REG_REVISION, _id);
+   if (ret) {
+   dev_err(>dev, "Failed to get H/W revision\n");
+   return ret;
+   }
+
+   if ((chip_id & RT4831_VID_MASK) != RICHTEK_VENDOR_ID) {
+   dev_err(>dev, "Chip vendor ID 0x%02x not matched\n", 
chip_id);
+   return -ENODEV;
+   }
+
+   /*
+* Used to prevent the abnormal shutdown.
+* If SCL/SDA both keep low for one second to reset HW.
+*/
+   ret = regmap_update_bits(regmap, RT4831_REG_I2CPROT, 
RT4831_I2CSAFETMR_MASK,
+RT4831_I2CSAFETMR_MASK);
+   if (ret) {
+   dev_err(>dev, "Failed to enable I2C safety timer\n");
+   return ret;
+   }
+
+   return devm_mfd_add_devices(>dev, PLATFORM_DEVID_AUTO, 
rt4831_subdevs,
+   ARRAY_SIZE(rt4831_subdevs), NULL, 0, NULL);
+}
+
+static int 

[PATCH v5 4/6] mfd: rt4831: Adds DT binding document for Richtek RT4831 core

2020-12-18 Thread cy_huang
From: ChiYuan Huang 

Adds DT binding document for Richtek RT4831 core.

Signed-off-by: ChiYuan Huang 
---
This patch depends on
 "backlight: rt4831: Adds DT binding document for Richtek RT4831 backlight"
 "regulator: rt4831: Adds DT binding document for Richtek RT4831 DSV regulator"

since v5
- Revert mfd dt-binding to v3 patch.

since v4
- remove v3 regulator binding patch, directly merge it into mfd binding.

since v3
- Move include/dt-bindings/leds/rt4831-backlight.h to patch 0002.
- Add dual license tag in mfd binding document.

since v2
- Add regulator-allow-bypass flag in DSVLCM.
---
 .../devicetree/bindings/mfd/richtek,rt4831.yaml| 90 ++
 1 file changed, 90 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/mfd/richtek,rt4831.yaml

diff --git a/Documentation/devicetree/bindings/mfd/richtek,rt4831.yaml 
b/Documentation/devicetree/bindings/mfd/richtek,rt4831.yaml
new file mode 100644
index ..4762eb1
--- /dev/null
+++ b/Documentation/devicetree/bindings/mfd/richtek,rt4831.yaml
@@ -0,0 +1,90 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/mfd/richtek,rt4831.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Richtek RT4831 DSV and Backlight Integrated IC
+
+maintainers:
+  - ChiYuan Huang 
+
+description: |
+  RT4831 is a multifunctional device that can provide power to the LCD display
+  and LCD backlight.
+
+  For Display Bias Voltage DSVP and DSVN, the output range is about 4V to 6.5V.
+  It's sufficient to meet the current LCD power requirement.
+
+  For the LCD backlight, it can provide four channel WLED driving capability.
+  Each channel driving current is up to 30mA
+
+  Datasheet is available at
+  https://www.richtek.com/assets/product_file/RT4831A/DS4831A-05.pdf
+
+properties:
+  compatible:
+const: richtek,rt4831
+
+  reg:
+description: I2C device address.
+maxItems: 1
+
+  enable-gpios:
+description: |
+  GPIO to enable/disable the chip. It is optional.
+  Some usage directly tied this pin to follow VIO 1.8V power on sequence.
+maxItems: 1
+
+  regulators:
+$ref: ../regulator/richtek,rt4831-regulator.yaml
+
+  backlight:
+$ref: ../leds/backlight/richtek,rt4831-backlight.yaml
+
+required:
+  - compatible
+  - reg
+
+additionalProperties: false
+
+examples:
+  - |
+#include 
+i2c {
+  #address-cells = <1>;
+  #size-cells = <0>;
+
+  rt4831@11 {
+compatible = "richtek,rt4831";
+reg = <0x11>;
+
+regulators {
+  DSVLCM {
+regulator-min-microvolt = <400>;
+regulator-max-microvolt = <715>;
+regulator-allow-bypass;
+  };
+  DSVP {
+regulator-name = "rt4831-dsvp";
+regulator-min-microvolt = <400>;
+regulator-max-microvolt = <650>;
+regulator-boot-on;
+  };
+  DSVN {
+regulator-name = "rt4831-dsvn";
+regulator-min-microvolt = <400>;
+regulator-max-microvolt = <650>;
+regulator-boot-on;
+  };
+};
+
+backlight {
+  compatible = "richtek,rt4831-backlight";
+  default-brightness = <1024>;
+  max-brightness = <2048>;
+  richtek,bled-ovp-sel = /bits/ 8 ;
+  richtek,channel-use = /bits/ 8 ;
+};
+  };
+};
-- 
2.7.4

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v5 6/6] regulator: rt4831: Adds support for Richtek RT4831 DSV regulator

2020-12-18 Thread cy_huang
From: ChiYuan Huang 

Adds support for Richtek RT4831 DSV Regulator

Signed-off-by: ChiYuan Huang 
---
 drivers/regulator/Kconfig|  10 ++
 drivers/regulator/Makefile   |   1 +
 drivers/regulator/rt4831-regulator.c | 198 +++
 3 files changed, 209 insertions(+)
 create mode 100644 drivers/regulator/rt4831-regulator.c

diff --git a/drivers/regulator/Kconfig b/drivers/regulator/Kconfig
index 020a00d..3e875ad 100644
--- a/drivers/regulator/Kconfig
+++ b/drivers/regulator/Kconfig
@@ -931,6 +931,16 @@ config REGULATOR_RT4801
  This adds support for voltage regulators in Richtek RT4801 Display 
Bias IC.
  The device supports two regulators (DSVP/DSVN).
 
+config REGULATOR_RT4831
+   tristate "Richtek RT4831 DSV Regulators"
+   depends on MFD_RT4831
+   help
+ This adds support for voltage regulators in Richtek RT4831.
+ There are three regulators (VLCM/DSVP/DSVN).
+ VLCM is a virtual voltage input for DSVP/DSVN inside IC.
+ And DSVP/DSVN is the real Vout range from 4V to 6.5V.
+ It's common used to provide the power for the display panel.
+
 config REGULATOR_RT5033
tristate "Richtek RT5033 Regulators"
depends on MFD_RT5033
diff --git a/drivers/regulator/Makefile b/drivers/regulator/Makefile
index 6ebae51..eb587d4 100644
--- a/drivers/regulator/Makefile
+++ b/drivers/regulator/Makefile
@@ -115,6 +115,7 @@ obj-$(CONFIG_REGULATOR_RK808)   += rk808-regulator.o
 obj-$(CONFIG_REGULATOR_RN5T618) += rn5t618-regulator.o
 obj-$(CONFIG_REGULATOR_ROHM)   += rohm-regulator.o
 obj-$(CONFIG_REGULATOR_RT4801) += rt4801-regulator.o
+obj-$(CONFIG_REGULATOR_RT4831) += rt4831-regulator.o
 obj-$(CONFIG_REGULATOR_RT5033) += rt5033-regulator.o
 obj-$(CONFIG_REGULATOR_RTMV20) += rtmv20-regulator.o
 obj-$(CONFIG_REGULATOR_S2MPA01) += s2mpa01.o
diff --git a/drivers/regulator/rt4831-regulator.c 
b/drivers/regulator/rt4831-regulator.c
new file mode 100644
index ..3d4695d
--- /dev/null
+++ b/drivers/regulator/rt4831-regulator.c
@@ -0,0 +1,198 @@
+// SPDX-License-Identifier: GPL-2.0-only
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+enum {
+   DSV_OUT_VLCM = 0,
+   DSV_OUT_VPOS,
+   DSV_OUT_VNEG,
+   DSV_OUT_MAX
+};
+
+#define RT4831_REG_DSVEN   0x09
+#define RT4831_REG_VLCM0x0c
+#define RT4831_REG_VPOS0x0d
+#define RT4831_REG_VNEG0x0e
+#define RT4831_REG_FLAGS   0x0f
+
+#define RT4831_VOLT_MASK   GENMASK(5, 0)
+#define RT4831_DSVMODE_SHIFT   5
+#define RT4831_DSVMODE_MASKGENMASK(7, 5)
+#define RT4831_POSADEN_MASKBIT(4)
+#define RT4831_NEGADEN_MASKBIT(3)
+#define RT4831_POSEN_MASK  BIT(2)
+#define RT4831_NEGEN_MASK  BIT(1)
+
+#define RT4831_OTP_MASKBIT(6)
+#define RT4831_LCMOVP_MASK BIT(5)
+#define RT4831_VPOSSCP_MASKBIT(3)
+#define RT4831_VNEGSCP_MASKBIT(2)
+
+#define DSV_MODE_NORMAL(0x4 << RT4831_DSVMODE_SHIFT)
+#define DSV_MODE_BYPASS(0x6 << RT4831_DSVMODE_SHIFT)
+#define STEP_UV5
+#define VLCM_MIN_UV400
+#define VLCM_MAX_UV715
+#define VLCM_N_VOLTAGES((VLCM_MAX_UV - VLCM_MIN_UV) / STEP_UV 
+ 1)
+#define VPN_MIN_UV 400
+#define VPN_MAX_UV 650
+#define VPN_N_VOLTAGES ((VPN_MAX_UV - VPN_MIN_UV) / STEP_UV + 1)
+
+static int rt4831_get_error_flags(struct regulator_dev *rdev, unsigned int 
*flags)
+{
+   struct regmap *regmap = rdev_get_regmap(rdev);
+   int rid = rdev_get_id(rdev);
+   unsigned int val, events = 0;
+   int ret;
+
+   ret = regmap_read(regmap, RT4831_REG_FLAGS, );
+   if (ret)
+   return ret;
+
+   if (val & RT4831_OTP_MASK)
+   events |= REGULATOR_ERROR_OVER_TEMP;
+
+   if (rid == DSV_OUT_VLCM && (val & RT4831_LCMOVP_MASK))
+   events |= REGULATOR_ERROR_OVER_CURRENT;
+
+   if (rid == DSV_OUT_VPOS && (val & RT4831_VPOSSCP_MASK))
+   events |= REGULATOR_ERROR_OVER_CURRENT;
+
+   if (rid == DSV_OUT_VNEG && (val & RT4831_VNEGSCP_MASK))
+   events |= REGULATOR_ERROR_OVER_CURRENT;
+
+   *flags = events;
+   return 0;
+}
+
+static const struct regulator_ops rt4831_dsvlcm_ops = {
+   .list_voltage = regulator_list_voltage_linear,
+   .set_voltage_sel = regulator_set_voltage_sel_regmap,
+   .get_voltage_sel = regulator_get_voltage_sel_regmap,
+   .set_bypass = regulator_set_bypass_regmap,
+   .get_bypass = regulator_get_bypass_regmap,
+   .get_error_flags = rt4831_get_error_flags,
+};
+
+static const struct regulator_ops rt4831_dsvpn_ops = {
+   .list_voltage = regulator_list_voltage_linear,
+   .set_voltage_sel = regulator_set_voltage_sel_regmap,
+   .get_voltage_sel = regulator_get_voltage_sel_regmap,
+   .enable = 

[PATCH v5 5/6] backlight: rt4831: Adds support for Richtek RT4831 backlight

2020-12-18 Thread cy_huang
From: ChiYuan Huang 

Adds support for Richtek RT4831 backlight.

Signed-off-by: ChiYuan Huang 
---
 drivers/video/backlight/Kconfig|   8 ++
 drivers/video/backlight/Makefile   |   1 +
 drivers/video/backlight/rt4831-backlight.c | 219 +
 3 files changed, 228 insertions(+)
 create mode 100644 drivers/video/backlight/rt4831-backlight.c

diff --git a/drivers/video/backlight/Kconfig b/drivers/video/backlight/Kconfig
index d83c87b..666bdb0 100644
--- a/drivers/video/backlight/Kconfig
+++ b/drivers/video/backlight/Kconfig
@@ -289,6 +289,14 @@ config BACKLIGHT_QCOM_WLED
  If you have the Qualcomm PMIC, say Y to enable a driver for the
  WLED block. Currently it supports PM8941 and PMI8998.
 
+config BACKLIGHT_RT4831
+   tristate "Richtek RT4831 Backlight Driver"
+   depends on MFD_RT4831
+   help
+ This enables support for Richtek RT4831 Backlight driver.
+ It's commont used to drive the display WLED. There're four channels
+ inisde, and each channel can provide up to 30mA current.
+
 config BACKLIGHT_SAHARA
tristate "Tabletkiosk Sahara Touch-iT Backlight Driver"
depends on X86
diff --git a/drivers/video/backlight/Makefile b/drivers/video/backlight/Makefile
index 685f3f1..cae2c83 100644
--- a/drivers/video/backlight/Makefile
+++ b/drivers/video/backlight/Makefile
@@ -49,6 +49,7 @@ obj-$(CONFIG_BACKLIGHT_PANDORA)   += pandora_bl.o
 obj-$(CONFIG_BACKLIGHT_PCF50633)   += pcf50633-backlight.o
 obj-$(CONFIG_BACKLIGHT_PWM)+= pwm_bl.o
 obj-$(CONFIG_BACKLIGHT_QCOM_WLED)  += qcom-wled.o
+obj-$(CONFIG_BACKLIGHT_RT4831) += rt4831-backlight.o
 obj-$(CONFIG_BACKLIGHT_SAHARA) += kb3886_bl.o
 obj-$(CONFIG_BACKLIGHT_SKY81452)   += sky81452-backlight.o
 obj-$(CONFIG_BACKLIGHT_TOSA)   += tosa_bl.o
diff --git a/drivers/video/backlight/rt4831-backlight.c 
b/drivers/video/backlight/rt4831-backlight.c
new file mode 100644
index ..816c4d6
--- /dev/null
+++ b/drivers/video/backlight/rt4831-backlight.c
@@ -0,0 +1,219 @@
+// SPDX-License-Identifier: GPL-2.0-only
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#define RT4831_REG_BLCFG   0x02
+#define RT4831_REG_BLDIML  0x04
+#define RT4831_REG_ENABLE  0x08
+
+#define BL_MAX_BRIGHTNESS  2048
+
+#define RT4831_BLOVP_MASK  GENMASK(7, 5)
+#define RT4831_BLOVP_SHIFT 5
+#define RT4831_BLPWMEN_MASKBIT(0)
+#define RT4831_BLEN_MASK   BIT(4)
+#define RT4831_BLCH_MASK   GENMASK(3, 0)
+#define RT4831_BLDIML_MASK GENMASK(2, 0)
+#define RT4831_BLDIMH_MASK GENMASK(10, 3)
+#define RT4831_BLDIMH_SHIFT3
+
+struct rt4831_priv {
+   struct regmap *regmap;
+   struct mutex lock;
+   struct backlight_device *bl;
+};
+
+static int rt4831_bl_update_status(struct backlight_device *bl_dev)
+{
+   struct rt4831_priv *priv = bl_get_data(bl_dev);
+   int brightness = backlight_get_brightness(bl_dev);
+   unsigned int enable = brightness ? RT4831_BLEN_MASK : 0;
+   u8 v[2];
+   int ret;
+
+   mutex_lock(>lock);
+
+   if (brightness) {
+   v[0] = (brightness - 1) & RT4831_BLDIML_MASK;
+   v[1] = ((brightness - 1) & RT4831_BLDIMH_MASK) >> 
RT4831_BLDIMH_SHIFT;
+
+   ret = regmap_raw_write(priv->regmap, RT4831_REG_BLDIML, v, 
sizeof(v));
+   if (ret)
+   goto unlock;
+   }
+
+   ret = regmap_update_bits(priv->regmap, RT4831_REG_ENABLE, 
RT4831_BLEN_MASK, enable);
+
+unlock:
+   mutex_unlock(>lock);
+   return ret;
+}
+
+static int rt4831_bl_get_brightness(struct backlight_device *bl_dev)
+{
+   struct rt4831_priv *priv = bl_get_data(bl_dev);
+   unsigned int val;
+   u8 v[2];
+   int ret;
+
+   mutex_lock(>lock);
+
+   ret = regmap_read(priv->regmap, RT4831_REG_ENABLE, );
+   if (ret)
+   return ret;
+
+   if (!(val & RT4831_BLEN_MASK)) {
+   ret = 0;
+   goto unlock;
+   }
+
+   ret = regmap_raw_read(priv->regmap, RT4831_REG_BLDIML, v, sizeof(v));
+   if (ret)
+   goto unlock;
+
+   ret = (v[1] << RT4831_BLDIMH_SHIFT) + (v[0] & RT4831_BLDIML_MASK) + 1;
+
+unlock:
+   mutex_unlock(>lock);
+   return ret;
+}
+
+static const struct backlight_ops rt4831_bl_ops = {
+   .options = BL_CORE_SUSPENDRESUME,
+   .update_status = rt4831_bl_update_status,
+   .get_brightness = rt4831_bl_get_brightness,
+};
+
+static int rt4831_init_device_properties(struct rt4831_priv *priv, struct 
device *dev,
+ struct backlight_properties *bl_props)
+{
+   u8 propval;
+   u32 brightness;
+   unsigned int val = 0;
+   int ret;
+
+   /* common properties */
+   ret = device_property_read_u32(dev, "max-brightness", );
+   if (ret) {
+   dev_warn(dev,