Re: [RESEND 13/14] leds: flashlight: mt6370: Add Mediatek MT6370 flashlight support
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
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); + + /*