Re: [RESEND 13/14] leds: flashlight: mt6370: Add Mediatek MT6370 flashlight support

2022-06-02 Thread kernel test robot
Hi ChiaEn,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on pavel-leds/for-next]
[also build test WARNING on lee-mfd/for-mfd-next 
lee-backlight/for-backlight-next v5.18 next-20220602]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:
https://github.com/intel-lab-lkp/linux/commits/ChiaEn-Wu/Add-Mediatek-MT6370-PMIC-support/20220531-211432
base:   git://git.kernel.org/pub/scm/linux/kernel/git/pavel/linux-leds.git 
for-next
config: nios2-allyesconfig 
(https://download.01.org/0day-ci/archive/20220602/202206021739.lzju7zjg-...@intel.com/config)
compiler: nios2-linux-gcc (GCC) 11.3.0
reproduce (this is a W=1 build):
wget 
https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O 
~/bin/make.cross
chmod +x ~/bin/make.cross
# 
https://github.com/intel-lab-lkp/linux/commit/805a8af17c769562ec4b85e9b7d2669d004fe3a6
git remote add linux-review https://github.com/intel-lab-lkp/linux
git fetch --no-tags linux-review 
ChiaEn-Wu/Add-Mediatek-MT6370-PMIC-support/20220531-211432
git checkout 805a8af17c769562ec4b85e9b7d2669d004fe3a6
# save the config file
mkdir build_dir && cp config build_dir/.config
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-11.3.0 make.cross W=1 
O=build_dir ARCH=nios2 SHELL=/bin/bash drivers/gpu/drm/v3d/ drivers/leds/ 
sound/core/

If you fix the issue, kindly add following tag where applicable
Reported-by: kernel test robot 

All warnings (new ones prefixed by >>):

   In file included from include/linux/device.h:15,
from include/linux/leds.h:12,
from include/linux/led-class-flash.h:11,
from drivers/leds/flash/leds-mt6370-flash.c:8:
   drivers/leds/flash/leds-mt6370-flash.c: In function 'mt6370_led_probe':
>> drivers/leds/flash/leds-mt6370-flash.c:591:17: warning: format '%lu' expects 
>> argument of type 'long unsigned int', but argument 3 has type 'size_t' {aka 
>> 'unsigned int'} [-Wformat=]
 591 | "No child node or node count over max led number 
%lu\n", count);
 | 
^~~
   include/linux/dev_printk.h:110:30: note: in definition of macro 
'dev_printk_index_wrap'
 110 | _p_func(dev, fmt, ##__VA_ARGS__);
   \
 |  ^~~
   include/linux/dev_printk.h:144:56: note: in expansion of macro 'dev_fmt'
 144 | dev_printk_index_wrap(_dev_err, KERN_ERR, dev, dev_fmt(fmt), 
##__VA_ARGS__)
 |^~~
   drivers/leds/flash/leds-mt6370-flash.c:590:17: note: in expansion of macro 
'dev_err'
 590 | dev_err(>dev,
 | ^~~
   drivers/leds/flash/leds-mt6370-flash.c:591:68: note: format string is 
defined here
 591 | "No child node or node count over max led number 
%lu\n", count);
 |  ~~^
 ||
 |
long unsigned int
 |  %u


vim +591 drivers/leds/flash/leds-mt6370-flash.c

   580  
   581  static int mt6370_led_probe(struct platform_device *pdev)
   582  {
   583  struct mt6370_priv *priv;
   584  struct fwnode_handle *child;
   585  size_t count;
   586  int i = 0, ret;
   587  
   588  count = device_get_child_node_count(>dev);
   589  if (!count || count > MT6370_MAX_LEDS) {
   590  dev_err(>dev,
 > 591  "No child node or node count over max led number 
 > %lu\n", count);
   592  return -EINVAL;
   593  }
   594  
   595  priv = devm_kzalloc(>dev, struct_size(priv, leds, count),
   596  GFP_KERNEL);
   597  if (!priv)
   598  return -ENOMEM;
   599  
   600  priv->leds_count = count;
   601  priv->dev = >dev;
   602  mutex_init(>lock);
   603  
   604  priv->regmap = dev_get_regmap(pdev->dev.parent, NULL);
   605  if (!priv->regmap) {
   606  dev_err(>dev, "Failed to get parent regmap\n");
   607  return -ENODEV;
   608  }
   609  
   610  device_for_each_child_node(>dev, child) {
   611  struct mt6370_led *led = priv->leds + i;
   612  struct led_init_data init_data = { .fwnode = child, };
   613  
   614  led->priv = priv;
   615  ret = mt6370_init_common_properties(led, _data);
   616 

[RESEND 13/14] leds: flashlight: mt6370: Add Mediatek MT6370 flashlight support

2022-05-31 Thread ChiaEn Wu
From: Alice Chen 

Add Mediatek MT6370 flashlight support

Signed-off-by: Alice Chen 
---
 drivers/leds/flash/Kconfig |   9 +
 drivers/leds/flash/Makefile|   1 +
 drivers/leds/flash/leds-mt6370-flash.c | 665 +
 3 files changed, 675 insertions(+)
 create mode 100644 drivers/leds/flash/leds-mt6370-flash.c

diff --git a/drivers/leds/flash/Kconfig b/drivers/leds/flash/Kconfig
index d3eb689b193c..d38e263aaf09 100644
--- a/drivers/leds/flash/Kconfig
+++ b/drivers/leds/flash/Kconfig
@@ -90,4 +90,13 @@ config LEDS_SGM3140
  This option enables support for the SGM3140 500mA Buck/Boost Charge
  Pump LED Driver.
 
+config LEDS_MT6370_FLASHLIGHT
+   tristate "Flash LED Support for Mediatek MT6370 PMIC"
+   depends on LEDS_CLASS
+   depends on MFD_MT6370
+   help
+ Support 2 channels and torch/strobe mode.
+ Say Y here to enable support for
+ MT6370_FLASH_LED device.
+
 endif # LEDS_CLASS_FLASH
diff --git a/drivers/leds/flash/Makefile b/drivers/leds/flash/Makefile
index 0acbddc0b91b..4c4c1710f506 100644
--- a/drivers/leds/flash/Makefile
+++ b/drivers/leds/flash/Makefile
@@ -9,3 +9,4 @@ obj-$(CONFIG_LEDS_MAX77693) += leds-max77693.o
 obj-$(CONFIG_LEDS_RT4505)  += leds-rt4505.o
 obj-$(CONFIG_LEDS_RT8515)  += leds-rt8515.o
 obj-$(CONFIG_LEDS_SGM3140) += leds-sgm3140.o
+obj-$(CONFIG_LEDS_MT6370_FLASHLIGHT)   += leds-mt6370-flash.o
diff --git a/drivers/leds/flash/leds-mt6370-flash.c 
b/drivers/leds/flash/leds-mt6370-flash.c
new file mode 100644
index ..8f6796aae3e1
--- /dev/null
+++ b/drivers/leds/flash/leds-mt6370-flash.c
@@ -0,0 +1,665 @@
+// SPDX-License-Identifier: GPL-2.0-only
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+enum {
+   MT6370_LED_FLASH1,
+   MT6370_LED_FLASH2,
+   MT6370_MAX_LEDS
+};
+
+/* Virtual definition for multicolor */
+
+#define MT6370_REG_FLEDEN  0x17E
+#define MT6370_REG_STRBTO  0x173
+#define MT6370_REG_CHGSTAT20x1D1
+#define MT6370_REG_FLEDSTAT1   0x1D9
+#defineMT6370_REG_FLEDISTRB(_id)   (0x174 + 4 * _id)
+#define MT6370_REG_FLEDITOR(_id)   (0x175 + 4 * _id)
+#define MT6370_ITORCH_MASK GENMASK(4, 0)
+#define MT6370_ISTROBE_MASKGENMASK(6, 0)
+#define MT6370_STRBTO_MASK GENMASK(6, 0)
+#define MT6370_TORCHEN_MASKBIT(3)
+#define MT6370_STROBEN_MASKBIT(2)
+#define MT6370_FLCSEN_MASK(_id)BIT(MT6370_LED_FLASH2 - _id)
+#define MT6370_FLCSEN_MASK_ALL (BIT(0) | BIT(1))
+#define MT6370_FLEDCHGVINOVP_MASK  BIT(3)
+#define MT6370_FLED1STRBTO_MASKBIT(11)
+#define MT6370_FLED2STRBTO_MASKBIT(10)
+#define MT6370_FLED1STRB_MASK  BIT(9)
+#define MT6370_FLED2STRB_MASK  BIT(8)
+#define MT6370_FLED1SHORT_MASK BIT(7)
+#define MT6370_FLED2SHORT_MASK BIT(6)
+#define MT6370_FLEDLVF_MASKBIT(3)
+
+#define MT6370_LED_JOINT   2
+#define MT6370_RANGE_FLED_REG  4
+#define MT6370_ITORCH_MINUA25000
+#define MT6370_ITORCH_STEPUA   12500
+#define MT6370_ITORCH_MAXUA40
+#define MT6370_ITORCH_DOUBLE_MAXUA 80
+#define MT6370_ISTRB_MINUA 5
+#define MT6370_ISTRB_STEPUA12500
+#define MT6370_ISTRB_MAXUA 150
+#define MT6370_ISTRB_DOUBLE_MAXUA  300
+#define MT6370_STRBTO_MINUS64000
+#define MT6370_STRBTO_STEPUS   32000
+#define MT6370_STRBTO_MAXUS2432000
+
+#define STATE_OFF  0
+#define STATE_KEEP 1
+#define STATE_ON   2
+
+struct mt6370_led {
+   struct led_classdev_flash flash;
+   struct v4l2_flash *v4l2_flash;
+   struct mt6370_priv *priv;
+   u32 led_no;
+   u32 default_state;
+};
+
+struct mt6370_priv {
+   struct device *dev;
+   struct regmap *regmap;
+   struct mutex lock;
+   unsigned int fled_strobe_used;
+   unsigned int fled_torch_used;
+   unsigned int leds_active;
+   unsigned int leds_count;
+   struct mt6370_led leds[];
+};
+
+static int mt6370_torch_brightness_set(struct led_classdev *lcdev,
+  enum led_brightness level)
+{
+   struct mt6370_led *led =
+container_of(lcdev, struct mt6370_led, flash.led_cdev);
+   struct mt6370_priv *priv = led->priv;
+   u32 led_enable_mask = (led->led_no == MT6370_LED_JOINT) ?
+ MT6370_FLCSEN_MASK_ALL :
+ MT6370_FLCSEN_MASK(led->led_no);
+   u32 enable_mask = MT6370_TORCHEN_MASK | led_enable_mask;
+   u32 val = level ? led_enable_mask : 0;
+   u32 prev = priv->fled_torch_used, curr;
+   int ret, i;
+
+   mutex_lock(>lock);
+
+   /*