All of lore.kernel.org
 help / color / mirror / Atom feed
From: Sakari Ailus <sakari.ailus@iki.fi>
To: Jacek Anaszewski <j.anaszewski@samsung.com>,
	linux-leds@vger.kernel.org, devicetree@vger.kernel.org,
	linux-media@vger.kernel.org, linux-kernel@vger.kernel.org
Cc: kyungmin.park@samsung.com, b.zolnierkie@samsung.com,
	Andrzej Hajda <a.hajda@samsung.com>,
	Bryan Wu <cooloney@gmail.com>, Richard Purdie <rpurdie@rpsys.net>,
	SangYoung Son <hello.son@smasung.com>,
	Samuel Ortiz <sameo@linux.intel.com>
Subject: Re: [PATCH/RFC v4 16/21] leds: Add support for max77693 mfd flash cell
Date: Mon, 21 Jul 2014 17:12:17 +0300	[thread overview]
Message-ID: <53CD1FC1.4020100@iki.fi> (raw)
In-Reply-To: <1405087464-13762-17-git-send-email-j.anaszewski@samsung.com>

Hi Jacek,

Thanks for the patchset.

Jacek Anaszewski wrote:
> This patch adds led-flash support to Maxim max77693 chipset.
> A device can be exposed to user space through LED subsystem
> sysfs interface or through V4L2 subdevice when the support
> for V4L2 Flash sub-devices is enabled. Device supports up to
> two leds which can work in flash and torch mode. Leds can
> be triggered externally or by software.
> 
> Signed-off-by: Jacek Anaszewski <j.anaszewski@samsung.com>
> Signed-off-by: Andrzej Hajda <a.hajda@samsung.com>
> Acked-by: Lee Jones <lee.jones@linaro.org>
> Acked-by: Kyungmin Park <kyungmin.park@samsung.com>
> Cc: Bryan Wu <cooloney@gmail.com>
> Cc: Richard Purdie <rpurdie@rpsys.net>
> Cc: SangYoung Son <hello.son@smasung.com>
> Cc: Samuel Ortiz <sameo@linux.intel.com>
> ---
>  drivers/leds/Kconfig         |    9 +
>  drivers/leds/Makefile        |    1 +
>  drivers/leds/leds-max77693.c | 1070 ++++++++++++++++++++++++++++++++++++++++++
>  drivers/mfd/max77693.c       |    5 +-
>  include/linux/mfd/max77693.h |   40 ++
>  5 files changed, 1124 insertions(+), 1 deletion(-)
>  create mode 100644 drivers/leds/leds-max77693.c
> 
> diff --git a/drivers/leds/Kconfig b/drivers/leds/Kconfig
> index 5032c6f..794055e 100644
> --- a/drivers/leds/Kconfig
> +++ b/drivers/leds/Kconfig
> @@ -457,6 +457,15 @@ config LEDS_TCA6507
>  	  LED driver chips accessed via the I2C bus.
>  	  Driver support brightness control and hardware-assisted blinking.
>  
> +config LEDS_MAX77693
> +	tristate "LED support for MAX77693 Flash"
> +	depends on LEDS_CLASS_FLASH
> +	depends on MFD_MAX77693
> +	help
> +	  This option enables support for the flash part of the MAX77693
> +	  multifunction device. It has build in control for two leds in flash
> +	  and torch mode.
> +
>  config LEDS_MAX8997
>  	tristate "LED support for MAX8997 PMIC"
>  	depends on LEDS_CLASS && MFD_MAX8997
> diff --git a/drivers/leds/Makefile b/drivers/leds/Makefile
> index 237c5ba..da1a4ba 100644
> --- a/drivers/leds/Makefile
> +++ b/drivers/leds/Makefile
> @@ -55,6 +55,7 @@ obj-$(CONFIG_LEDS_MC13783)		+= leds-mc13783.o
>  obj-$(CONFIG_LEDS_NS2)			+= leds-ns2.o
>  obj-$(CONFIG_LEDS_NETXBIG)		+= leds-netxbig.o
>  obj-$(CONFIG_LEDS_ASIC3)		+= leds-asic3.o
> +obj-$(CONFIG_LEDS_MAX77693)		+= leds-max77693.o
>  obj-$(CONFIG_LEDS_MAX8997)		+= leds-max8997.o
>  obj-$(CONFIG_LEDS_LM355x)		+= leds-lm355x.o
>  obj-$(CONFIG_LEDS_BLINKM)		+= leds-blinkm.o
> diff --git a/drivers/leds/leds-max77693.c b/drivers/leds/leds-max77693.c
> new file mode 100644
> index 0000000..38a2398
> --- /dev/null
> +++ b/drivers/leds/leds-max77693.c
> @@ -0,0 +1,1070 @@
> +/*
> + * LED Flash Class driver for the flash cell of max77693 mfd.
> + *
> + *	Copyright (C) 2014, Samsung Electronics Co., Ltd.
> + *
> + *	Authors: Jacek Anaszewski <j.anaszewski@samsung.com>
> + *		 Andrzej Hajda <a.hajda@samsung.com>
> + *
> + * This program is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU General Public License
> + * version 2 as published by the Free Software Foundation.
> + */
> +
> +#include <asm/div64.h>
> +#include <linux/led-class-flash.h>
> +#include <linux/led-flash-manager.h>
> +#include <linux/mfd/max77693.h>
> +#include <linux/mfd/max77693-private.h>
> +#include <linux/module.h>
> +#include <linux/mutex.h>
> +#include <linux/platform_device.h>
> +#include <linux/regmap.h>
> +#include <linux/slab.h>
> +#include <linux/workqueue.h>
> +#include <media/v4l2-flash.h>
> +
> +#define MAX77693_LED_NAME_1		"max77693-flash_1"
> +#define MAX77693_LED_NAME_2		"max77693-flash_2"
> +
> +#define MAX77693_TORCH_IOUT_BITS	4
> +
> +#define MAX77693_TORCH_NO_TIMER		0x40
> +#define MAX77693_FLASH_TIMER_LEVEL	0x80
> +
> +#define MAX77693_FLASH_EN_OFF		0
> +#define MAX77693_FLASH_EN_FLASH		1
> +#define MAX77693_FLASH_EN_TORCH		2
> +#define MAX77693_FLASH_EN_ON		3
> +
> +#define MAX77693_FLASH_EN1_SHIFT	6
> +#define MAX77693_FLASH_EN2_SHIFT	4
> +#define MAX77693_TORCH_EN1_SHIFT	2
> +#define MAX77693_TORCH_EN2_SHIFT	0

Which registers are these definitions related to? Could they be defined
next to the registers instead?

You could parameterise these macros, e.g.

#define MAX77693_FLASH_EN_SHIFT(a)	(6 - ((a) - 1) * 2)

> +#define MAX77693_FLASH_LOW_BATTERY_EN	0x80
> +
> +#define MAX77693_FLASH_BOOST_FIXED	0x04
> +#define MAX77693_FLASH_BOOST_LEDNUM_2	0x80
> +
> +#define MAX77693_FLASH_TIMEOUT_MIN	62500
> +#define MAX77693_FLASH_TIMEOUT_MAX	1000000
> +#define MAX77693_FLASH_TIMEOUT_STEP	62500
> +
> +#define MAX77693_TORCH_TIMEOUT_MIN	262000
> +#define MAX77693_TORCH_TIMEOUT_MAX	15728000
> +
> +#define MAX77693_FLASH_IOUT_MIN		15625
> +#define MAX77693_FLASH_IOUT_MAX_1LED	1000000
> +#define MAX77693_FLASH_IOUT_MAX_2LEDS	625000
> +#define MAX77693_FLASH_IOUT_STEP	15625
> +
> +#define MAX77693_TORCH_IOUT_MIN		15625
> +#define MAX77693_TORCH_IOUT_MAX		250000
> +#define MAX77693_TORCH_IOUT_STEP	15625
> +
> +#define MAX77693_FLASH_VSYS_MIN		2400
> +#define MAX77693_FLASH_VSYS_MAX		3400
> +#define MAX77693_FLASH_VSYS_STEP	33
> +
> +#define MAX77693_FLASH_VOUT_MIN		3300
> +#define MAX77693_FLASH_VOUT_MAX		5500
> +#define MAX77693_FLASH_VOUT_STEP	25
> +#define MAX77693_FLASH_VOUT_RMIN	0x0c
> +
> +#define MAX77693_LED_STATUS_FLASH_ON	(1 << 3)
> +#define MAX77693_LED_STATUS_TORCH_ON	(1 << 2)
> +
> +#define MAX77693_LED_FLASH_INT_FLED2_OPEN	(1 << 0)
> +#define MAX77693_LED_FLASH_INT_FLED2_SHORT	(1 << 1)
> +#define MAX77693_LED_FLASH_INT_FLED1_OPEN	(1 << 2)
> +#define MAX77693_LED_FLASH_INT_FLED1_SHORT	(1 << 3)
> +#define MAX77693_LED_FLASH_INT_OVER_CURRENT	(1 << 4)
> +
> +#define MAX77693_MODE_OFF			0
> +#define MAX77693_MODE_FLASH1			(1 << 0)
> +#define MAX77693_MODE_FLASH2			(1 << 1)
> +#define MAX77693_MODE_TORCH1			(1 << 2)
> +#define MAX77693_MODE_TORCH2			(1 << 3)
> +#define MAX77693_MODE_FLASH_EXTERNAL1		(1 << 4)
> +#define MAX77693_MODE_FLASH_EXTERNAL2		(1 << 5)
> +
> +enum {
> +	FLED1,
> +	FLED2
> +};
> +
> +enum {
> +	FLASH,
> +	TORCH
> +};
> +
> +struct max77693_led {
> +	struct regmap *regmap;
> +	struct platform_device *pdev;
> +	struct max77693_led_platform_data *pdata;
> +	struct mutex lock;
> +
> +	struct led_classdev_flash ldev1;
> +	struct work_struct work1_brightness_set;
> +	struct v4l2_flash *v4l2_flash1;
> +
> +	struct led_classdev_flash ldev2;
> +	struct work_struct work2_brightness_set;
> +	struct v4l2_flash *v4l2_flash2;
> +
> +	unsigned int torch1_brightness;
> +	unsigned int torch2_brightness;
> +	unsigned int flash1_timeout;
> +	unsigned int flash2_timeout;

Could you use e.g. an array of structs instead? You could remove a lot
of redundant code operating on the other led.

> +	unsigned int current_flash_timeout;
> +	unsigned int mode_flags;
> +	u8 torch_iout_reg;
> +	bool iout_joint;
> +};

...

> +static int max77693_led_probe(struct platform_device *pdev)
> +{
> +	struct device *dev = &pdev->dev;
> +	struct max77693_dev *iodev = dev_get_drvdata(dev->parent);
> +	struct max77693_led *led;
> +	struct max77693_led_platform_data *p;
> +	int ret;
> +
> +	led = devm_kzalloc(dev, sizeof(*led), GFP_KERNEL);
> +	if (!led)
> +		return -ENOMEM;
> +
> +	led->pdev = pdev;
> +	led->regmap = iodev->regmap;
> +	platform_set_drvdata(pdev, led);
> +	ret = max77693_led_get_platform_data(led);
> +	if (ret < 0)
> +		return -EINVAL;
> +
> +	p = led->pdata;
> +	mutex_init(&led->lock);
> +
> +	if (p->num_leds == 1 && p->fleds[FLED1] && p->fleds[FLED2])
> +		led->iout_joint = true;
> +
> +	ret = max77693_setup(led);
> +	if (ret < 0)
> +		return ret;

goto err_register_led1;

> +	if (led->iout_joint || p->fleds[FLED1]) {
> +		ret = max77693_register_led1(led);
> +		if (ret < 0)
> +			goto err_register_led1;
> +	}
> +
> +	if (!led->iout_joint && p->fleds[FLED2]) {
> +		ret = max77693_register_led2(led);
> +		if (ret < 0)
> +			goto err_register_led2;
> +	}
> +
> +	return 0;
> +
> +err_register_led2:
> +	if (!p->fleds[FLED1])
> +		goto err_register_led1;
> +	v4l2_flash_release(led->v4l2_flash1);
> +	led_classdev_flash_unregister(&led->ldev1);
> +err_register_led1:
> +	mutex_destroy(&led->lock);
> +
> +	return ret;
> +}

...

-- 
Kind regards,

Sakari Ailus
sakari.ailus@iki.fi

  reply	other threads:[~2014-07-21 14:12 UTC|newest]

Thread overview: 65+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-07-11 14:04 [PATCH/RFC v4 00/21] LED / flash API integration Jacek Anaszewski
2014-07-11 14:04 ` [PATCH/RFC v4 01/21] leds: make brightness type consistent across whole subsystem Jacek Anaszewski
2014-07-11 14:04 ` [PATCH/RFC v4 02/21] leds: implement sysfs interface locking mechanism Jacek Anaszewski
2014-07-16 15:35   ` Sakari Ailus
2014-07-11 14:04 ` [PATCH/RFC v4 03/21] leds: Improve and export led_update_brightness Jacek Anaszewski
2014-07-11 14:04 ` [PATCH/RFC v4 04/21] leds: Reorder include directives Jacek Anaszewski
     [not found]   ` <1405087464-13762-5-git-send-email-j.anaszewski-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org>
2014-07-16 15:42     ` Sakari Ailus
2014-07-16 15:42       ` Sakari Ailus
2014-07-11 14:04 ` [PATCH/RFC v4 05/21] leds: avoid using deprecated DEVICE_ATTR macro Jacek Anaszewski
     [not found]   ` <1405087464-13762-6-git-send-email-j.anaszewski-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org>
2014-07-16 15:46     ` Sakari Ailus
2014-07-16 15:46       ` Sakari Ailus
2014-07-11 14:04 ` [PATCH/RFC v4 06/21] leds: add API for setting torch brightness Jacek Anaszewski
2014-07-16 21:54   ` Sakari Ailus
2014-08-04 12:35     ` Jacek Anaszewski
2014-08-04 12:50       ` Sakari Ailus
2014-08-07 13:12         ` Jacek Anaszewski
2014-08-14  4:39           ` Sakari Ailus
2014-08-18 19:55             ` Richard Purdie
2014-08-18 20:06               ` Sakari Ailus
2014-07-11 14:04 ` [PATCH/RFC v4 07/21] of: add of_node_ncmp wrapper Jacek Anaszewski
     [not found]   ` <1405087464-13762-8-git-send-email-j.anaszewski-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org>
2014-07-16 22:00     ` Sakari Ailus
2014-07-16 22:00       ` Sakari Ailus
2014-07-28 13:41   ` Grant Likely
2014-07-28 13:41     ` Grant Likely
2014-07-11 14:04 ` [PATCH/RFC v4 08/21] leds: Add sysfs and kernel internal API for flash LEDs Jacek Anaszewski
2014-07-11 14:04 ` [PATCH/RFC v4 09/21] Documentation: leds: Add description of LED Flash Class extension Jacek Anaszewski
2014-07-11 14:04 ` [PATCH/RFC v4 10/21] Documentation: leds: add exemplary asynchronous mux driver Jacek Anaszewski
2014-07-11 14:04 ` [PATCH/RFC v4 11/21] DT: leds: Add flash led devices related properties Jacek Anaszewski
2014-07-11 14:04 ` [PATCH/RFC v4 12/21] DT: Add documentation for LED Class Flash Manger Jacek Anaszewski
2014-07-11 14:04 ` [PATCH/RFC v4 13/21] v4l2-device: add v4l2_device_register_subdev_node API Jacek Anaszewski
2014-07-11 14:04 ` [PATCH/RFC v4 14/21] v4l2-ctrls: add control for flash strobe signal providers Jacek Anaszewski
2014-07-11 14:04 ` [PATCH/RFC v4 15/21] media: Add registration helpers for V4L2 flash Jacek Anaszewski
2014-07-21 11:12   ` Sakari Ailus
     [not found]     ` <53CCF59E.3070200-X3B1VOXEql0@public.gmane.org>
2014-08-04 14:43       ` Jacek Anaszewski
2014-08-04 14:43         ` Jacek Anaszewski
     [not found]         ` <53DF9C2A.8060403-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org>
2014-08-11 12:26           ` Sakari Ailus
2014-08-11 12:26             ` Sakari Ailus
     [not found]             ` <20140811122628.GG16460-S+BSfZ9RZZmRSg0ZkenSGLdO1Tsj/99ntUK59QYPAWc@public.gmane.org>
2014-08-11 13:27               ` Jacek Anaszewski
2014-08-11 13:27                 ` Jacek Anaszewski
2014-08-11 13:45                 ` Jacek Anaszewski
2014-08-14  4:34                 ` Sakari Ailus
     [not found]                   ` <20140814043436.GM16460-S+BSfZ9RZZmRSg0ZkenSGLdO1Tsj/99ntUK59QYPAWc@public.gmane.org>
2014-08-14  8:25                     ` Jacek Anaszewski
2014-08-14  8:25                       ` Jacek Anaszewski
2014-08-20 14:41                       ` Sakari Ailus
2014-08-21  8:38                         ` Jacek Anaszewski
2014-07-11 14:04 ` [PATCH/RFC v4 16/21] leds: Add support for max77693 mfd flash cell Jacek Anaszewski
2014-07-21 14:12   ` Sakari Ailus [this message]
2014-07-11 14:04 ` [PATCH/RFC v4 17/21] DT: Add documentation for the mfd Maxim max77693 Jacek Anaszewski
2014-07-11 14:04 ` [PATCH/RFC v4 18/21] leds: Add driver for AAT1290 current regulator Jacek Anaszewski
2014-07-11 14:04 ` [PATCH/RFC v4 19/21] of: Add Skyworks Solutions, Inc. vendor prefix Jacek Anaszewski
2014-07-11 14:04 ` [PATCH/RFC v4 20/21] DT: Add documentation for the Skyworks AAT1290 Jacek Anaszewski
2014-07-11 14:04 ` [PATCH/RFC v4 21/21] ARM: dts: add aat1290 current regulator device node Jacek Anaszewski
2014-07-16 17:19 ` [PATCH/RFC v4 00/21] LED / flash API integration Bryan Wu
2014-07-16 17:21   ` Bryan Wu
2014-08-08  6:43     ` Jacek Anaszewski
2014-08-08 16:59       ` Bryan Wu
2014-08-11 14:24         ` Jacek Anaszewski
2014-08-06  6:53 ` Sakari Ailus
     [not found]   ` <20140806065358.GC16460-S+BSfZ9RZZmRSg0ZkenSGLdO1Tsj/99ntUK59QYPAWc@public.gmane.org>
2014-08-07  8:21     ` Jacek Anaszewski
2014-08-07  8:21       ` Jacek Anaszewski
2014-08-07  8:31       ` Jacek Anaszewski
2014-08-14  5:03       ` Sakari Ailus
     [not found]         ` <20140814050338.GO16460-S+BSfZ9RZZmRSg0ZkenSGLdO1Tsj/99ntUK59QYPAWc@public.gmane.org>
2014-08-14 10:35           ` Jacek Anaszewski
2014-08-14 10:35             ` Jacek Anaszewski
2014-08-15  4:48             ` Sakari Ailus

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=53CD1FC1.4020100@iki.fi \
    --to=sakari.ailus@iki.fi \
    --cc=a.hajda@samsung.com \
    --cc=b.zolnierkie@samsung.com \
    --cc=cooloney@gmail.com \
    --cc=devicetree@vger.kernel.org \
    --cc=hello.son@smasung.com \
    --cc=j.anaszewski@samsung.com \
    --cc=kyungmin.park@samsung.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-leds@vger.kernel.org \
    --cc=linux-media@vger.kernel.org \
    --cc=rpurdie@rpsys.net \
    --cc=sameo@linux.intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.