Message ID | cover.1672728620.git.chiaen_wu@richtek.com |
---|---|
Headers | show |
Series | Add MediaTek MT6370 PMIC support | expand |
On Tue, Jan 03, 2023 at 03:00:07PM +0800, ChiaEn Wu wrote: > From: ChiYuan Huang <cy_huang@richtek.com> > > The MediaTek MT6370 is a highly-integrated smart power management IC, > which includes a single cell Li-Ion/Li-Polymer switching battery > charger, a USB Type-C & Power Delivery (PD) controller, dual > Flash LED current sources, a RGB LED driver, a backlight WLED driver, > a display bias driver and a general LDO for portable devices. > > Add support for the MediaTek MT6370 Current Sink Type LED Indicator > driver. It can control four channels current-sink RGB LEDs with 3 modes: > constant current, PWM, and breath mode. ... > +// SPDX-License-Identifier: GPL-2.0-only > +/* > + * Copyright (C) 2022 Richtek Technology Corp. > + * > + * Authors: > + * ChiYuan Huang <cy_huang@richtek.com> > + * Alice Chen <alice_chen@richtek.com> > + * Redundant blank line. > + */ ... > +#include <asm-generic/unaligned.h> asm/unaligned should work, no? ... > +struct mt6370_pdata { > + const unsigned int *tfreq; > + unsigned int tfreq_len; > + u8 pwm_duty; You may save a few bytes by moving this to the end of the structure. > + u16 reg_rgb1_tr; > + s16 reg_rgb_chrind_tr; > +}; ... > +struct mt6370_priv { > + /* Per LED access lock */ > + struct mutex lock; > + struct device *dev; > + struct regmap *regmap; Isn't one can be derived from the other? > + struct regmap_field *fields[F_MAX_FIELDS]; > + const struct reg_field *reg_fields; > + const struct linear_range *ranges; > + struct reg_cfg *reg_cfgs; > + const struct mt6370_pdata *pdata; > + unsigned int leds_count; > + unsigned int leds_active; > + struct mt6370_led leds[]; > +}; ... > +static int mt6370_isnk_brightness_set(struct led_classdev *lcdev, > + enum led_brightness level) > +{ > + struct mt6370_led *led = container_of(lcdev, struct mt6370_led, isink); > + struct mt6370_priv *priv = led->priv; > + unsigned int enable; > + int ret; > + > + mutex_lock(&priv->lock); > + > + ret = regmap_field_read(priv->fields[F_RGB_EN], &enable); > + if (ret) > + goto out_unlock; > + if (level == 0) { > + enable &= ~MT6370_CHEN_BIT(led->index); > + > + ret = mt6370_set_led_mode(priv, led->index, > + MT6370_LED_REG_MODE); > + if (ret) > + goto out_unlock; > + > + ret = regmap_field_write(priv->fields[F_RGB_EN], enable); > + } else { > + enable |= MT6370_CHEN_BIT(led->index); > + > + ret = mt6370_set_led_brightness(priv, led->index, level); > + if (ret) > + goto out_unlock; > + > + ret = regmap_field_write(priv->fields[F_RGB_EN], enable); > + } Hmm... Wouldn't be below the equivalent? if (level == 0) { enable &= ~MT6370_CHEN_BIT(led->index); ret = mt6370_set_led_mode(priv, led->index, MT6370_LED_REG_MODE); if (ret) goto out_unlock; } else { enable |= MT6370_CHEN_BIT(led->index); ret = mt6370_set_led_brightness(priv, led->index, level); if (ret) goto out_unlock; } ret = regmap_field_write(priv->fields[F_RGB_EN], enable); (Of course even if (ret) goto... is duplicated, but probably better to leave it as is now) > +out_unlock: > + mutex_unlock(&priv->lock); > + > + return ret; > +} ... > + fwnode_for_each_child_node(init_data->fwnode, child) { > + u32 reg, color; > + > + ret = fwnode_property_read_u32(child, "reg", ®); > + if (ret || reg > MT6370_LED_ISNK3 || > + priv->leds_active & BIT(reg)) I don't see where you drop a reference count. > + return -EINVAL; > + > + ret = fwnode_property_read_u32(child, "color", &color); > + if (ret) Ditto. > + return dev_err_probe(dev, ret, > + "LED %d, no color specified\n", > + led->index); > + > + priv->leds_active |= BIT(reg); > + sub_led[num_color].color_index = color; > + sub_led[num_color].channel = reg; > + sub_led[num_color].intensity = 0; > + num_color++; > + } ... > + count = device_get_child_node_count(dev); > + if (!count || count > MT6370_MAX_LEDS) Is the second really critical? Can it be just a warning and clamping of the counter to the upper limit? > + return dev_err_probe(dev, -EINVAL, > + "No child node or node count over max LED number %zu\n", > + count); ... > + device_for_each_child_node(dev, child) { > + struct mt6370_led *led = priv->leds + i++; > + struct led_init_data init_data = { .fwnode = child }; > + u32 reg, color; > + > + ret = fwnode_property_read_u32(child, "reg", ®); > + if (ret) What about reference count? > + return dev_err_probe(dev, ret, "Failed to parse reg property\n"); > + > + if (reg >= MT6370_MAX_LEDS) Ditto. > + return dev_err_probe(dev, -EINVAL, "Error reg property number\n"); > + > + ret = fwnode_property_read_u32(child, "color", &color); > + if (ret) Ditto. > + return dev_err_probe(dev, ret, "Failed to parse color property\n"); > + > + if (color == LED_COLOR_ID_RGB || color == LED_COLOR_ID_MULTI) > + reg = MT6370_VIRTUAL_MULTICOLOR; > + > + if (priv->leds_active & BIT(reg)) Ditto. > + return dev_err_probe(dev, -EINVAL, "Duplicate reg property\n"); > + > + priv->leds_active |= BIT(reg); > + > + led->index = reg; > + led->priv = priv; > + > + ret = mt6370_init_led_properties(led, &init_data); > + if (ret) Ditto. > + return ret; > + > + ret = mt6370_led_register(&pdev->dev, led, &init_data); > + if (ret) Ditto. > + return ret; > + } > + > + return 0; > +}
On Tue, Jan 03, 2023 at 02:45:17PM +0200, Andy Shevchenko wrote: > On Tue, Jan 03, 2023 at 03:00:07PM +0800, ChiaEn Wu wrote: > > From: ChiYuan Huang <cy_huang@richtek.com> > > > > The MediaTek MT6370 is a highly-integrated smart power management IC, > > which includes a single cell Li-Ion/Li-Polymer switching battery > > charger, a USB Type-C & Power Delivery (PD) controller, dual > > Flash LED current sources, a RGB LED driver, a backlight WLED driver, > > a display bias driver and a general LDO for portable devices. > > > > Add support for the MediaTek MT6370 Current Sink Type LED Indicator > > driver. It can control four channels current-sink RGB LEDs with 3 modes: > > constant current, PWM, and breath mode. > > ... > > > +// SPDX-License-Identifier: GPL-2.0-only > > +/* > > + * Copyright (C) 2022 Richtek Technology Corp. > > + * > > + * Authors: > > + * ChiYuan Huang <cy_huang@richtek.com> > > + * Alice Chen <alice_chen@richtek.com> > > > + * > > Redundant blank line. > > > + */ > > ... > > > +#include <asm-generic/unaligned.h> > > asm/unaligned should work, no? > Yes, it works, thanks. > ... > > > +struct mt6370_pdata { > > + const unsigned int *tfreq; > > + unsigned int tfreq_len; > > > + u8 pwm_duty; > > You may save a few bytes by moving this to the end of the structure. > > > + u16 reg_rgb1_tr; > > + s16 reg_rgb_chrind_tr; > > +}; > > ... > > > +struct mt6370_priv { > > + /* Per LED access lock */ > > + struct mutex lock; > > > + struct device *dev; > > + struct regmap *regmap; > > Isn't one can be derived from the other? > No, regmap is derived by the parent dev. But after reviewing its usage, 'dev' can be removed. For this part, only regmap will be kept to check product info. > > + struct regmap_field *fields[F_MAX_FIELDS]; > > + const struct reg_field *reg_fields; > > + const struct linear_range *ranges; > > + struct reg_cfg *reg_cfgs; > > + const struct mt6370_pdata *pdata; > > + unsigned int leds_count; > > + unsigned int leds_active; > > + struct mt6370_led leds[]; > > +}; > > ... > > > +static int mt6370_isnk_brightness_set(struct led_classdev *lcdev, > > + enum led_brightness level) > > +{ > > + struct mt6370_led *led = container_of(lcdev, struct mt6370_led, isink); > > + struct mt6370_priv *priv = led->priv; > > + unsigned int enable; > > + int ret; > > + > > + mutex_lock(&priv->lock); > > + > > + ret = regmap_field_read(priv->fields[F_RGB_EN], &enable); > > + if (ret) > > + goto out_unlock; > > > + if (level == 0) { > > + enable &= ~MT6370_CHEN_BIT(led->index); > > + > > + ret = mt6370_set_led_mode(priv, led->index, > > + MT6370_LED_REG_MODE); > > + if (ret) > > + goto out_unlock; > > + > > + ret = regmap_field_write(priv->fields[F_RGB_EN], enable); > > + } else { > > + enable |= MT6370_CHEN_BIT(led->index); > > + > > + ret = mt6370_set_led_brightness(priv, led->index, level); > > + if (ret) > > + goto out_unlock; > > + > > + ret = regmap_field_write(priv->fields[F_RGB_EN], enable); > > + } > > Hmm... Wouldn't be below the equivalent? > > if (level == 0) { > enable &= ~MT6370_CHEN_BIT(led->index); > > ret = mt6370_set_led_mode(priv, led->index, > MT6370_LED_REG_MODE); > if (ret) > goto out_unlock; > } else { > enable |= MT6370_CHEN_BIT(led->index); > > ret = mt6370_set_led_brightness(priv, led->index, level); > if (ret) > goto out_unlock; > > } > > ret = regmap_field_write(priv->fields[F_RGB_EN], enable); > > (Of course even if (ret) goto... is duplicated, but probably better to leave it > as is now) > It's equivalent. Thanks. > > +out_unlock: > > + mutex_unlock(&priv->lock); > > + > > + return ret; > > +} > > ... > > > + fwnode_for_each_child_node(init_data->fwnode, child) { > > + u32 reg, color; > > + > > + ret = fwnode_property_read_u32(child, "reg", ®); > > + if (ret || reg > MT6370_LED_ISNK3 || > > + priv->leds_active & BIT(reg)) > > I don't see where you drop a reference count. > Fix in next. > > + return -EINVAL; > > + > > + ret = fwnode_property_read_u32(child, "color", &color); > > + if (ret) > > Ditto. > > > + return dev_err_probe(dev, ret, > > + "LED %d, no color specified\n", > > + led->index); > > + > > + priv->leds_active |= BIT(reg); > > + sub_led[num_color].color_index = color; > > + sub_led[num_color].channel = reg; > > + sub_led[num_color].intensity = 0; > > + num_color++; > > + } > > ... > > > + count = device_get_child_node_count(dev); > > + if (!count || count > MT6370_MAX_LEDS) > > Is the second really critical? Can it be just a warning and clamping of the > counter to the upper limit? > I think it's 'must', following by the next, it will dynamically allocate the memory by the count. But sure, like as you said, also can clamp the counter. To use the clamping, it means that need more code to check after 'device_for_each_node'. I think it's better to put the pre-check here to save the release actions if any error. > > + return dev_err_probe(dev, -EINVAL, > > + "No child node or node count over max LED number %zu\n", > > + count); > > ... > > > + device_for_each_child_node(dev, child) { > > + struct mt6370_led *led = priv->leds + i++; > > + struct led_init_data init_data = { .fwnode = child }; > > + u32 reg, color; > > + > > + ret = fwnode_property_read_u32(child, "reg", ®); > > + if (ret) > > What about reference count? > Fix in next. > > + return dev_err_probe(dev, ret, "Failed to parse reg property\n"); > > + > > + if (reg >= MT6370_MAX_LEDS) > > Ditto. > > > + return dev_err_probe(dev, -EINVAL, "Error reg property number\n"); > > + > > + ret = fwnode_property_read_u32(child, "color", &color); > > + if (ret) > > Ditto. > > > + return dev_err_probe(dev, ret, "Failed to parse color property\n"); > > + > > + if (color == LED_COLOR_ID_RGB || color == LED_COLOR_ID_MULTI) > > + reg = MT6370_VIRTUAL_MULTICOLOR; > > + > > + if (priv->leds_active & BIT(reg)) > > Ditto. > > > + return dev_err_probe(dev, -EINVAL, "Duplicate reg property\n"); > > + > > + priv->leds_active |= BIT(reg); > > + > > + led->index = reg; > > + led->priv = priv; > > + > > + ret = mt6370_init_led_properties(led, &init_data); > > + if (ret) > > Ditto. > > > + return ret; > > + > > + ret = mt6370_led_register(&pdev->dev, led, &init_data); > > + if (ret) > > Ditto. > > > + return ret; > > + } > > + > > + return 0; > > +} > > -- > With Best Regards, > Andy Shevchenko > >
From: ChiaEn Wu <chiaen_wu@richtek.com> This patch series add MediaTek MT6370 LED indicator and flashlight support. The MT6370 is a highly-integrated smart power management IC, which includes a single cell Li-Ion/Li-Polymer switching battery charger, a USB Type-C & Power Delivery (PD) controller, dual Flash LED current sources, a RGB LED driver, a backlight WLED driver, a display bias driver and a general LDO for portable devices. First, in this series of patches, - 'dt-binding: mfd' and 'mfd driver' have been applied by Lee in v7. https://lore.kernel.org/all/YvJdpq0MWNPQZw5c@google.com/ https://lore.kernel.org/all/YvJdxEpC2cB58Bq9@google.com/ - 'tcpci driver' has been applied by Greg in v8. https://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb.git/commit/?h=usb-next&id=c2a8ea5997fdfeb43eda259d5533234c3cae05d7 - 'dt-binding: backlight' and 'backlight driver' have been applied by Lee in v9. https://lore.kernel.org/all/YxYSDSlnOELL2mPF@google.com/ https://lore.kernel.org/all/YxYS7%2FdZI69lMXeh@google.com/ - 'dt-binding: charger', 'charger driver' and 'linear_range.h' patch have been applied by Sebastian in v11. https://lore.kernel.org/all/20220920160857.6qfi66gtmgwesq7g@mercury.elektranox.org/ https://lore.kernel.org/all/20220920161218.dkkfvfomrruebahi@mercury.elektranox.org/ https://lore.kernel.org/all/20220920161238.dswtmyon462324dm@mercury.elektranox.org/ - 'dt-binding: leds: LED Indicator' and 'dt-binding: leds: LED Flash' have been applied by Rob in v12. https://lore.kernel.org/all/166480917702.2250974.12439864185418442009.robh@kernel.org/ - 'ADC driver' has been applied by Jonathan in v14. https://lore.kernel.org/all/20221015162217.41c4c112@jic23-huawei/ Second, the LED RGB driver is based on Andy's patch which moves led_init_default_state_get() to the global header. https://lore.kernel.org/all/20220805154907.32263-3-andriy.shevchenko@linux.intel.com/ In addition, we made some changes for MT6370 LED Flash Kconfig (see v15 section of the change log below). Thank you, ChiaEn Wu --- Change in v15: - In Patch 2/2 (MT6370 Flash): - Remove 'depends on LEDS_CLASS_FLASH || !LEDS_CLASS_FLASH' in Kconfig Change in v14: - In Patch 3/3 (MT6370 Flash) - Remove unused 'depend on OF' in Kconfig Change in v13: - In Patch 1/5 (dt-bindings: MT6370 LED Indicator) - Remove 'allOf' property - Add '$ref' and 'unevaluatedProperties: false' in 'multi-led' Change in v12: - In Patch 5/5 (MT6370 Flash): - Rename all 'led_flash_setting *s' --> 'led_flash_setting *setting' - Rename 'max_uA' --> 'max_ua' in mt6370_init_flash_properties() Change in v11: - In Patch 1/8 (dt-bindings: MT6370 Charger) - Add more detailed description of irqs. - Adujust the order of irqs Change in v10: - In Patch 6/8 (MT6370 Charger): - Add a feature (disable input current limit) in 'mt6370_chg_init_setting()' - Add the header file <linux/devm-helpers.h> for using 'devm_work_autocancel()' and 'devm_delayed_work_autocancel() - Rename 'pwr_rdy' to 'opposite_pwr_rdy' in 'mt6370_chg_pwr_rdy_check()' - Rename enum elements ('MT6370_ATTACH_STAT_ATTACH_BC12_NOT_DONE' --> 'MT6370_ATTACH_STAT_ATTACH_WAIT_FOR_BC12') - Revise the assignment value of 'val.intval' in 'mt6370_chg_pwr_rdy_check()' to make the code easy to read. - Revise the initialization of bc12_work (INIT_WORK() --> using devm_work_autocancel()) and mivr_dwork (INIT_DELAYED_WORK + devm_add_action_or_reset() --> devm_delayed_work_autocancel()) - In Patch 8/8 (MT6370 LED Flashlight): - Add the revert code when '__mt6370_flash_brightness_set()' return failed. - Revise type of 'led_no' (u32 -> u8) - Revise type of 'default_state' (u32 -> enum led_default_state) - Revise the return value of '_mt6370_flash_brightness_set()' - Remove the useless function 'mt6370_init_common_properties()' - Use 'led_init_default_state_get()' to init 'led->default_state' Changes in v9: - In Patch 05/10: - Revise LINEAR_RANGE() and LINEAR_RANGE_IDX() - In Patch 07/10: - Fix wrong 'F_IINLMTSEL' setting in 'mt6370_chg_init_setting()' - Revise the usage of LINEAR_RANGE_IDX() - In Patch 09/10: - Revise the format of the comments. - In Patch 10/10: - Revise the format of the comments. Changes in v8: - In Patch 06/12: - Add linear_range_idx macro for declaring the linear_range struct simply. - In Patch 09/12: - Remove MT6370_CHG_LINEAR_RANGE() macro, and change to use LINEAR_RANGE_IDX() macro - In Patch 10/12: - Add include header file <linux/leds.h> - Remove useless 'enum mt6370_state' because of using 'enum led_default_state' - Revise the calculation of 'val' in 'mt6370_gen_breath_pattern()' - Replace the medthod of getting default-state by using led_init_default_state_get() - In Patch 11/12: - Add missing 'dependency config' in Kconfig - Revise all multi-line comments - In Patch 12/12: - Add missing header file <linux/property.h> - Remove useledd header file <linux/of_device.h> - Revise the comment of 'mt6370_check_vendor_info()' Changes in v7: - In Patch 05/13: - Add the second compatible string for 'mt6372' - Add 'mediatek,bled-exponential-mode-enable' property for enable the exponential mode of backlight brightness - Add validation for the maximum value of 'default-brightness' and 'max-brightness' - In Patch 07/13: - Move '#define MT6370_REG_MAXADDR' to the next line of '#define MT6370_REG_CHG_MASK1' - Rename 'MT6370_REG_ADDRLEN' to 'MT6370_MAX_ADDRLEN' - In Patch 08/13: - Revise 'devm_add_action_or_reset(dev, ...)' to one line - Revise 'return regmap_update_bits(...)' with using positive conditional - In Patch 09/13: - Add AICR(100mA ~ 350mA), ICHG(100mA ~ 800mA) macros - Remove 400mA AICR and 900mA ICHG macros - Revise using 'if-else' to 'switch-case' in mt6370_adc_read_scale() where the adc channel is ibus or ibat - In Patch 10/13: - Revise the method to enable/disable irq - Revise all 'if (ret < 0)' to 'if (ret)' after using mt6370_chg_field_set/get() - Revise all 'OTG' text again - In Patch 11/13: - Add the comment for the union of 'struct mt6370_led' - Revise the wrong description of 'Authors' - Revise some typos (e.g. led --> LED) - Revise 'if (!fwnode_property_read_string())' to 'ret = fwnode_property_read_string()' - Replace 'memcpy(...)' with 'put_unaligned_be24()' in mt6370_gen_breath_pattern() - Replace all 'LED_OFF' with 0 - Remove the redundant assignment in mt6370_mc_pattern_clear() - In Patch 12/13: - Fix the indentation. - For the well defined macro, the parenthesis is needed for input parameters. - Replace some dev_warn to dev_info in 'init_flash_properties'. - Add sentinel comment for the terminator entry of of_device_id. - Use priv->fled_torch_used directly. - Delete 0 in {}. - Use _uA instead of _UA in definition. - Refine the description. - Use usleep_range instead of udelay. - Rename config to LEDS_MT6370_FLASH. - Add missing ">" in copyright. - Change the Kconfig order - In Patch 13/13: - Add support 'exponential mode' property parsing - Add 'return dev_err_probe()' after 'if (IS_ERR(priv->enable_gpio))' - Add 'mt6372' compatible string - Revise Kconfig help text - Revise update()/get() for supporting 16384 steps (MT6372) - Revise all shift usages form using 'ffs() and fls()' to defining the _SHIFT macros. - Revise 'brightness ? 1 : 0' to '!!brightness' in gpiod_set_value() Changes in v6: - In Patch 03/13: - Add 'reg' property of led of multi-led to prevent checking error. - In Patch 08/13: - Convert tcpci as device resource managed with 'devm_add_action_or_reset' api. - Refine remvoe callback. - Refine the commit text from 'this commit add' to 'add'. - In Patch 09/13: - Using 'struct device *dev = &pdev->dev' in probe() - Revise the sixth parameter of regmap_read_poll_timeout() by Replacing '1000' with 'MILLI' - Revise the units of three macros - MT6370_AICR_400MA --> MT6370_AICR_400_mA - MT6370_ICHG_500MA --> MT6370_ICHG_500_mA - MT6370_ICHG_900MA --> MT6370_ICHG_900_mA - In patch 10/13: - Remove the varable (*psy_desc) of struct mt6370_priv - Remove the deprecated usb type (POWER_SUPPLY_TYPE_USB_CDP and POWER_SUPPLY_TYPE_USB_DCP) - Remove useless remove() - Revise all units from mini- to micro- - Revise get/set power_supply_prop (change to directly return get/set regmap_field) - Revise probe() and use devm_add_action_or_reset() for handling of the workqueue/delayed_work/mutex - Revise mt6370_chg_psy_desc - Add '.name = "mt6370-charger"' - Use 'static const' - In patch 11/13: - Remove the 'ko' from mt6370 led Kconfig description. - Add both authors for Alice and ChiYuan. - Use pdata to distinguish the code from mt6370/71 to mt6372. - Instead of 'state' define, use the 'state' enum. - Fix the typo for 'MT6372_PMW_DUTY'. - For pwm_duty define, replace with bit macro - 1. - Refine all the labels from 'out' to 'out_unlock'. - Use struct 'dev' variable and 'dev_err_probe' to optimize the LOC. - Revise for the array initialization from {0} to {}. - Move into rgb folder and rename file name to 'leds-mt6370-rgb'. - Refine the 'comma' usage in struct/enum. - In patch 12/13: - Use 'GENMASK' instead of 'BIT'. - Use dev_err_probe to decrease LOC. - Use 'dev' variable to make probe function more clean. - Refine the return of _mt6370_flash_brightness_set function. - Refine the descriptions. - Use mt6370_clamp() instead of clamp_align(). - Use device resource managed API for v4l2 flash_release. Changes in v5: - In patch 07/13: - Add the comma in the last REGMAP_IRQ_REG_LINE(), DEFINE_RES_IRQ_NAMED() and MFD_CELL_RES() - Add the prefix in the first parameter of all mfd_cell - Move enum and struct mt6370_info to mt6370.h - Remove struct device *dev in struct mt6370_info - Revise the description of Kconfig help text - Revise MODULE_DESCRIPTION() - In patch 08/13: - Add comma for the last index of mt6370_reg_init. - Use dev_err_probe to decrease LOC. - Use 'dev' variable to make probe function more clean. - Refine kconfig text. - Remove both 'else' in set_vbus callback. - Remove comma for of_device_id if the assigned member is only one. - In patch 09/13: - Replace using snprintf() with sysfs_emit() in mt6370_adc_read_label() - Remove macro ADC_CONV_TIME_US - Revise all variable ordering - Revise the description of Kconfig help text - Revise MODULE_DESCRIPTION() - In patch 10/13: - Replace unsigned int type of pwr_rdy with bool in mt6370_chg_set_online() - Remove redundant 'else' in mt6370_chg_field_get() - Revise 'if-else' in mt6370_chg_field_set() - Revise 'if' condition in mt6370_chg_enable_irq() - Revise all text 'otg' --> 'OTG' - Revise MT6370_MIVR_IBUS_TH_100_MA --> MT6370_MIVR_IBUS_TH_100_mA - Revise the description of Kconfig help text - In patch 12/13: - Refine the coding style. - Use "dev" instead of "&pdev->dev". - In patch 13/13: - Add missed <mod_devicetable.h> - Add struct device *dev in probe() to make code cleaning - Remove useless including header file <gpio/driver.h>, <of.h> - Remove useless variable uasage in mt6370_init_backlight_properties() - Remove redundant checking enable_gpio in mt6370_bl_update_status() - Remove redundant parentheses in mt6370_bl_get_brightness() - Revise the description of Kconfig help text - Revise the calculation of hys_th_steps Changes in v4: - In patch 02/13: - Add minItems of "io-channel-names" - Replace text "Mediatek" with "MediaTek" - In patch 06/13: - Roll back all "$ref: " to v2 patch style (using "/schemas/...") - In patch 07/13: - Replace text "Mediatek" with "MediaTek" in Kconfig - Replace "first break and then return" with "return directly" in "mt6370_check_vendor_info()" - Add module name related description in Kconfig helptext - Add Copyright in the source code - Add header file "mt6370.h" for all "#define IRQ" - Adjust Makefile order of MT6370 - Refine "bank_idx" and "bank_addr" in "mt6375_regmap_read()" / "mt6375_regmap_write()" - Refine redundant "else if" in "mt6370_regmap_read()" - In patch 08/13: - Replace text "Mediatek" with "MediaTek" in Kconfig - Replace "first ret=regulator_(dis/en)able and then return" with "return directly" in "mt6370_tcpc_set_vbus()" - Replace header file <linux/of.h> with <linux/mod_devicetable.h> - Add Copyright in the source code - Add module name related description in Kconfig helptext - Remove header file <linux/of.h> - Refine all probe error by using dev_err_probe() - In patch 09/13: - Replace text "Mediatek" with "MediaTek" - Replace all "first dev_err() and then return" with "return dev_err_probe()" - Add Copyright in the source code - Add module name related description in Kconfig - Add unit suffix of macro "ADC_CONV_POLLING_TIME" - Add new macro "ADC_CONV_TIME_MS" - Adjust the position of include file <mediatek,mt6370_adc.h> - Adjust the postions between <linux/module.h> and <linux/mod_devicetable.h> - Fix some incorrect characters - In patch 10/13: - Replace text "Mediatek" with "MediaTek" in Kconfig and MODULE_DESCRIPTION() - Replace "mt6370_chg_val_to_reg" and "mt6370_chg_reg_to_val" with "linear_range" API - Replace "first break and then return" with "return directly" in all cases of get/set power_supply_property - Replace all "first dev_err() and then return" with "return dev_err_probe()" - Replace all "return IS_ERR(priv->rdev) ? PTR_ERR(priv->rdev) : 0" with "PTR_ERR_OR_ZERO()" - Replace "priv->dev->of_node" with "dev_of_node()" - Add Copyright in the source code - Add module name related description in Kconfig helptext - Add proper unit of "MT6370_MIVR_IBUS_TH" - Add error check in "mt6370_chg_get_status" - Remove including <mediatek,mt6370_adc.h> header file - Remove redundant comma of every enum terminator line - Remove unwanted blank lines - Remove the useless label (toggle_cfo_exit:) - Remove using atomic - Remove using of_match_ptr() - Fix some incorrect characters - Fix updating wrong bits when using ena_gpiod of OTG regulator - Adjust the probe order in probe() - In patch 11/13: - Replace text "Mediatek" with "MediaTek" in Kconfig - Replace text "const" with "constant" in Kconfig - Add Copyright in the source code - In patch 12/13: - Replace text "Mediatek" with "MediaTek" in Kconfig - Add Copyright in the source code - In patch 13/13: - Replace text "Mediatek" with "MediaTek" in Kconfig - Add Copyright in the source code - Revise the comment of "PWM HYS STEPS" Changes in v3: - Remove ADC ABI file, which is added in v2 Patch 7 - In patch 02/14: - Add items and remove maxItems of io-channels - Add io-channel-names and describe each item - Add "unevaluatedProperties: false" in "usb-otg-vbus-regulator" - Rename "enable-gpio" to "enable-gpios" in "usb-otg-vbus-regulator" - In patch 03/14: - Use leds-class-multicolor.yaml instead of common.yaml. - Split multi-led and led node. - Add subdevice "led" in "multi-led". - In patch 04/14: - Remove the description of enum. - In patch 05/14: - Rename "mediatek,bled-pwm-hys-input-threshold-steps" to "mediatek,bled-pwm-hys-input-th-steps" - Refine "bled-pwm-hys-input-th-steps", "bled-ovp-microvolt", "bled-ocp-microamp" enum values - In patch 06/14: - Use " in entire patchset - Refine ADC description - Rename "enable-gpio" to "enable-gpios" in "regualtor" - In patch 07/14: - Refine Kconfig help text - Refine error message of unknown vendor ID in mt6370_check_vendor_info() - Refine return value handling of mt6370_regmap_read() - Refine all probe error by using dev_err_probe() - Refine "bank_idx" and "bank_addr" in mt6370_regmap_read() and mt6370_regmap_write() - Add "#define VENID*" and drop the comments in mt6370_check_vendor_info() - Drop "MFD" in MODULE_DESCRIPTION() - In patch 09/14: - Refine Kconfig help text - In patch 10/14: - Refine Kconfig help text - Refine all channel value in read_scale() a. current: uA --> mA b. voltage: uV --> mV c. temperature: degrees Celsius --> milli degrees Celsius - Add "default:" condition of switch statement in read_scale() and read_raw() - Add error message for reading ADC register failed - Add the comment for adc_lock - Add <linux/mod_devicetable.h> header file for struct of_device_id - Replace "adc" text with "ADC" in all of the error messages - In patch 12/14: - Refine the grammer of the Kconfig. - Change reg mode to the const current mode. - In patch 14/14: - Refine bool properties parsing (pwm-enable, ovp-shutdown, ocp-shutdown) in DT parsing function - Refine u32 and u8 properties parsing (pwm-hys-input-th-steps, ovp-microvolt, ocp-microamp), from using register value to using actual value - Refine error string of "channle-use" parsing failed - Refine Kconfig help text Changes in v2: - In patch 01/15: - Add "unevaluatedProperties: false". - Delete "DT bindings". - Refine the description to fit in 80 columns. - Skip the connector description. - In patch 02/15: - Refine items description of interrupt-name - Rename "usb-otg-vbus" to "usb-otg-vbus-regulator" - Add constraint properties for ADC - In patch 03/15: - Skip not useful description of "^(multi-)?led@[0-3]$" and reg. - Due to the dependency, remove the mention of mfd document directory. - Delete Soft-start property. In design aspect, we think soft-restart should always be enabled, our new chip has deleted the related setting register , also, we don’t allow user adjust this parameter in this chip. - Refine the commit message. - In patch 04/15: - Skip not useful description of "^led@[0-1]$" and reg. - Add apace after '#'. - Refine the commit message. - In patch 05/15: - Remove "binding documentation" in subject title - Refine description of mt6370 backlight binding document - Refine properties name(bled-pwm-hys-input-bit, bled-ovp-microvolt, bled-ocp-microamp) and their description - In patch 06/15: - Refine ADC and Regulator descriptions - Refine include header usage in example - Refine node name to generic node name("pmic@34") - Refine led example indentation - Refine license of mediatek,mt6370_adc.h - Rename the dts example from IRQ define to number. - Remove mediatek,mt6370.h - In patch 07/15: - Add ABI documentation for mt6370 non-standard ADC sysfs interfaces. - In patch 08/15: - Add all IRQ define into mt6370.c. - Refine include header usage - In patch 09/15: - No changes. - In patch 10/15: - Use 'gpiod_get_from_of_node' to replace 'fwnode_gpiod_get_index'. - In patch 11/15: - Refine Kconfig mt6370 help text - Refine mask&shift to FIELD_PREP() - Refine mutex lock name ("lock" -> "adc_lock") - Refine mt6370_adc_read_scale() - Refine mt6370_adc_read_offset() - Refine mt6370_channel_labels[] by using enum to index chan spec - Refine MT6370_ADC_CHAN() - Refine indio_dev->name - Remove useless include header files - In patch 12/15: - Refine mt6370_chg_otg_rdesc.of_match ("mt6370,otg-vbus" -> "usb-otg-vbus-regulator") to match DT binding - In patch 13/15: - Refine Kconfig description. - Remove include "linux/of.h" and use "linux/mod_devicetable.h". - Place a comma for the last element of the const unsigned int array. - Add a comment line for the mutex 'lock'. - In probe function, use 'dev_err_probe' in some judgement to reduce the LOC. - Refine include header usage. BIT/GENMASK -> linux/bits.h FIELD_GET -> linux/bitfield.h - In patch 14/15: - Add blank line. - Replace container_of() with to_mt6370_led() . - Refine description of ramping. - Refine the mt6370_init_common_properties function. - Refine the probe return. - In patch 15/15: - Refine MT6370 help text in Kconfig - Refine DT Parse function - Remove useless enum - Add comment for 6372 backward compatible in bl_update_status() and check_vendor_info() - Using dev_err_probe(); insteads dev_err()&return; in the probe() drivers/leds/flash/Kconfig | 13 + drivers/leds/flash/Makefile | 1 + drivers/leds/flash/leds-mt6370-flash.c | 631 +++++++++++++++ drivers/leds/rgb/Kconfig | 13 + drivers/leds/rgb/Makefile | 1 + drivers/leds/rgb/leds-mt6370-rgb.c | 1010 ++++++++++++++++++++++++ 6 files changed, 1669 insertions(+) create mode 100644 drivers/leds/flash/leds-mt6370-flash.c create mode 100644 drivers/leds/rgb/leds-mt6370-rgb.c