All of lore.kernel.org
 help / color / mirror / Atom feed
From: Gyungoh Yoo <gyungoh@gmail.com>
To: Jingoo Han <jg1.han@samsung.com>
Cc: sameo@linux.intel.com, lee.jones@linaro.org,
	grant.likely@linaro.org, robh+dt@kernel.org, cooloney@gmail.com,
	pawel.moll@arm.com, mark.rutland@arm.com,
	ijc+devicetree@hellion.org.uk, galak@codeaurora.org,
	trivial@kernel.org, akpm@linux-foundation.org, jic23@kernel.org,
	thomas.petazzoni@free-electrons.com, ktsai@capellamicro.com,
	hs@denx.de, stwiss.opensource@diasemi.com,
	matti.vaittinen@nsn.com, broonie@kernel.org,
	jason@lakedaemon.net, heiko@sntech.de, shawn.guo@freescale.com,
	florian.vaussard@epfl.ch, andrew@lunn.ch,
	antonynpavlov@gmail.com, hytszk@gmail.com, plagnioj@jcrosoft.com,
	tomi.valkeinen@ti.com, jack.yoo@skyworksinc.com,
	linux-fbdev@vger.kernel.org, linux-kernel@vger.kernel.org,
	devicetree@vger.kernel.org
Subject: Re: [PATCH v10 2/6] backlight: Add support Skyworks SKY81452 backlight driver
Date: Thu, 18 Dec 2014 15:13:24 +0900	[thread overview]
Message-ID: <20141218061324.GA3107@jack-ThinkPad-T520> (raw)
In-Reply-To: <001101d01a89$2a629590$7f27c0b0$%han@samsung.com>

On Thu, Dec 18, 2014 at 03:09:21PM +0900, Jingoo Han wrote:
> On Thursday, December 18, 2014 2:48 PM, Gyungoh Yoo wrote:
> > 
> > From: Gyungoh Yoo <jack.yoo@skyworksinc.com>
> > 
> > Signed-off-by: Gyungoh Yoo <jack.yoo@skyworksinc.com>
> 
> Please add the following 'Acked-by's when you send this patch
> next time.
> 
> Acked-by: Jingoo Han <jg1.han@samsung.com>
> Acked-by: Bryan Wu <cooloney@gmail.com>

I see.
Thank you.

> 
> Best regards,
> Jingoo Han
> 
> > ---
> > Changes v10:
> > Removed trivial get_brightness implementations
> > 
> > Changes v9:
> > Nothing
> > 
> > Changes v8:
> > Renamed property names for backlight with vendor prefix
> > Modified gpio-enable property to generic property for GPIO
> > 
> > Changes v7:
> > Modified licensing text to GPLv2
> > 
> > Changes v6:
> > Added new line character at the end of line of dev_err()
> > 
> > Changes v5:
> > Move sky81452-backlight.h to include/linux/platform_data
> > 
> > Changes v4:
> > Reordering header files for readability
> > Removed calling to backlight_device_unregister()
> > Removed MODULE_VERSION()
> > Modified license to GPLv2
> > 
> > Changes v3:
> > Modified DBG messages
> > 
> > Changes v2:
> > Added 'compatible' attribute in the driver
> > Added message for exception or errors
> > 
> >  drivers/video/backlight/Kconfig                  |  10 +
> >  drivers/video/backlight/Makefile                 |   1 +
> >  drivers/video/backlight/sky81452-backlight.c     | 334 +++++++++++++++++++++++
> >  include/linux/platform_data/sky81452-backlight.h |  46 ++++
> >  4 files changed, 391 insertions(+)
> >  create mode 100644 drivers/video/backlight/sky81452-backlight.c
> >  create mode 100644 include/linux/platform_data/sky81452-backlight.h
> > 
> > diff --git a/drivers/video/backlight/Kconfig b/drivers/video/backlight/Kconfig
> > index 8d03924..2586fdd 100644
> > --- a/drivers/video/backlight/Kconfig
> > +++ b/drivers/video/backlight/Kconfig
> > @@ -409,6 +409,16 @@ config BACKLIGHT_PANDORA
> >  	  If you have a Pandora console, say Y to enable the
> >  	  backlight driver.
> > 
> > +config BACKLIGHT_SKY81452
> > +	tristate "Backlight driver for SKY81452"
> > +	depends on BACKLIGHT_CLASS_DEVICE && MFD_SKY81452
> > +	help
> > +	  If you have a Skyworks SKY81452, say Y to enable the
> > +	  backlight driver.
> > +
> > +	  To compile this driver as a module, choose M here: the module will
> > +	  be called sky81452-backlight
> > +
> >  config BACKLIGHT_TPS65217
> >  	tristate "TPS65217 Backlight"
> >  	depends on BACKLIGHT_CLASS_DEVICE && MFD_TPS65217
> > diff --git a/drivers/video/backlight/Makefile b/drivers/video/backlight/Makefile
> > index fcd50b73..d67073f 100644
> > --- a/drivers/video/backlight/Makefile
> > +++ b/drivers/video/backlight/Makefile
> > @@ -50,6 +50,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_SAHARA)		+= kb3886_bl.o
> > +obj-$(CONFIG_BACKLIGHT_SKY81452)	+= sky81452-backlight.o
> >  obj-$(CONFIG_BACKLIGHT_TOSA)		+= tosa_bl.o
> >  obj-$(CONFIG_BACKLIGHT_TPS65217)	+= tps65217_bl.o
> >  obj-$(CONFIG_BACKLIGHT_WM831X)		+= wm831x_bl.o
> > diff --git a/drivers/video/backlight/sky81452-backlight.c b/drivers/video/backlight/sky81452-
> > backlight.c
> > new file mode 100644
> > index 0000000..8105597
> > --- /dev/null
> > +++ b/drivers/video/backlight/sky81452-backlight.c
> > @@ -0,0 +1,334 @@
> > +/*
> > + * sky81452-backlight.c	SKY81452 backlight driver
> > + *
> > + * Copyright 2014 Skyworks Solutions Inc.
> > + * Author : Gyungoh Yoo <jack.yoo@skyworksinc.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.
> > + *
> > + * This program is distributed in the hope that it will be useful, but
> > + * WITHOUT ANY WARRANTY; without even the implied warranty of
> > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> > + * General Public License for more details.
> > + *
> > + * You should have received a copy of the GNU General Public License along
> > + * with this program; if not, see <http://www.gnu.org/licenses/>.
> > + */
> > +
> > +#include <linux/backlight.h>
> > +#include <linux/err.h>
> > +#include <linux/gpio.h>
> > +#include <linux/init.h>
> > +#include <linux/kernel.h>
> > +#include <linux/module.h>
> > +#include <linux/of.h>
> > +#include <linux/of_gpio.h>
> > +#include <linux/platform_device.h>
> > +#include <linux/regmap.h>
> > +#include <linux/platform_data/sky81452-backlight.h>
> > +#include <linux/slab.h>
> > +
> > +/* registers */
> > +#define SKY81452_REG0	0x00
> > +#define SKY81452_REG1	0x01
> > +#define SKY81452_REG2	0x02
> > +#define SKY81452_REG4	0x04
> > +#define SKY81452_REG5	0x05
> > +
> > +/* bit mask */
> > +#define SKY81452_CS	0xFF
> > +#define SKY81452_EN	0x3F
> > +#define SKY81452_IGPW	0x20
> > +#define SKY81452_PWMMD	0x10
> > +#define SKY81452_PHASE	0x08
> > +#define SKY81452_ILIM	0x04
> > +#define SKY81452_VSHRT	0x03
> > +#define SKY81452_OCP	0x80
> > +#define SKY81452_OTMP	0x40
> > +#define SKY81452_SHRT	0x3F
> > +#define SKY81452_OPN	0x3F
> > +
> > +#define SKY81452_DEFAULT_NAME "lcd-backlight"
> > +#define SKY81452_MAX_BRIGHTNESS	(SKY81452_CS + 1)
> > +
> > +#define CTZ(b) __builtin_ctz(b)
> > +
> > +static int sky81452_bl_update_status(struct backlight_device *bd)
> > +{
> > +	const struct sky81452_bl_platform_data *pdata =
> > +			dev_get_platdata(bd->dev.parent);
> > +	const unsigned int brightness = (unsigned int)bd->props.brightness;
> > +	struct regmap *regmap = bl_get_data(bd);
> > +	int ret;
> > +
> > +	if (brightness > 0) {
> > +		ret = regmap_write(regmap, SKY81452_REG0, brightness - 1);
> > +		if (IS_ERR_VALUE(ret))
> > +			return ret;
> > +
> > +		return regmap_update_bits(regmap, SKY81452_REG1, SKY81452_EN,
> > +					pdata->enable << CTZ(SKY81452_EN));
> > +	}
> > +
> > +	return regmap_update_bits(regmap, SKY81452_REG1, SKY81452_EN, 0);
> > +}
> > +
> > +static const struct backlight_ops sky81452_bl_ops = {
> > +	.update_status = sky81452_bl_update_status,
> > +};
> > +
> > +static ssize_t sky81452_bl_store_enable(struct device *dev,
> > +		struct device_attribute *attr, const char *buf, size_t count)
> > +{
> > +	struct regmap *regmap = bl_get_data(to_backlight_device(dev));
> > +	unsigned long value;
> > +	int ret;
> > +
> > +	ret = kstrtoul(buf, 16, &value);
> > +	if (IS_ERR_VALUE(ret))
> > +		return ret;
> > +
> > +	ret = regmap_update_bits(regmap, SKY81452_REG1, SKY81452_EN,
> > +					value << CTZ(SKY81452_EN));
> > +	if (IS_ERR_VALUE(ret))
> > +		return ret;
> > +
> > +	return count;
> > +}
> > +
> > +static ssize_t sky81452_bl_show_open_short(struct device *dev,
> > +		struct device_attribute *attr, char *buf)
> > +{
> > +	struct regmap *regmap = bl_get_data(to_backlight_device(dev));
> > +	unsigned int reg, value = 0;
> > +	char tmp[3];
> > +	int i, ret;
> > +
> > +	reg = !strcmp(attr->attr.name, "open") ? SKY81452_REG5 : SKY81452_REG4;
> > +	ret = regmap_read(regmap, reg, &value);
> > +	if (IS_ERR_VALUE(ret))
> > +		return ret;
> > +
> > +	if (value & SKY81452_SHRT) {
> > +		*buf = 0;
> > +		for (i = 0; i < 6; i++) {
> > +			if (value & 0x01) {
> > +				sprintf(tmp, "%d ", i + 1);
> > +				strcat(buf, tmp);
> > +			}
> > +			value >>= 1;
> > +		}
> > +		strcat(buf, "\n");
> > +	} else {
> > +		strcpy(buf, "none\n");
> > +	}
> > +
> > +	return strlen(buf);
> > +}
> > +
> > +static ssize_t sky81452_bl_show_fault(struct device *dev,
> > +		struct device_attribute *attr, char *buf)
> > +{
> > +	struct regmap *regmap = bl_get_data(to_backlight_device(dev));
> > +	unsigned int value = 0;
> > +	int ret;
> > +
> > +	ret = regmap_read(regmap, SKY81452_REG4, &value);
> > +	if (IS_ERR_VALUE(ret))
> > +		return ret;
> > +
> > +	*buf = 0;
> > +
> > +	if (value & SKY81452_OCP)
> > +		strcat(buf, "over-current ");
> > +
> > +	if (value & SKY81452_OTMP)
> > +		strcat(buf, "over-temperature");
> > +
> > +	strcat(buf, "\n");
> > +	return strlen(buf);
> > +}
> > +
> > +static DEVICE_ATTR(enable, S_IWGRP | S_IWUSR, NULL, sky81452_bl_store_enable);
> > +static DEVICE_ATTR(open, S_IRUGO, sky81452_bl_show_open_short, NULL);
> > +static DEVICE_ATTR(short, S_IRUGO, sky81452_bl_show_open_short, NULL);
> > +static DEVICE_ATTR(fault, S_IRUGO, sky81452_bl_show_fault, NULL);
> > +
> > +static struct attribute *sky81452_bl_attribute[] = {
> > +	&dev_attr_enable.attr,
> > +	&dev_attr_open.attr,
> > +	&dev_attr_short.attr,
> > +	&dev_attr_fault.attr,
> > +	NULL
> > +};
> > +
> > +static const struct attribute_group sky81452_bl_attr_group = {
> > +	.attrs = sky81452_bl_attribute,
> > +};
> > +
> > +#ifdef CONFIG_OF
> > +static struct sky81452_bl_platform_data *sky81452_bl_parse_dt(
> > +							struct device *dev)
> > +{
> > +	struct device_node *np = of_node_get(dev->of_node);
> > +	struct sky81452_bl_platform_data *pdata;
> > +	int ret;
> > +
> > +	if (!np) {
> > +		dev_err(dev, "backlight node not found.\n");
> > +		return ERR_PTR(-ENODATA);
> > +	}
> > +
> > +	pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL);
> > +	if (!pdata) {
> > +		of_node_put(np);
> > +		return ERR_PTR(-ENOMEM);
> > +	}
> > +
> > +	of_property_read_string(np, "name", &pdata->name);
> > +	pdata->ignore_pwm = of_property_read_bool(np, "skyworks,ignore-pwm");
> > +	pdata->dpwm_mode = of_property_read_bool(np, "skyworks,dpwm-mode");
> > +	pdata->phase_shift = of_property_read_bool(np, "skyworks,phase-shift");
> > +	pdata->gpio_enable = of_get_gpio(np, 0);
> > +
> > +	ret = of_property_read_u32(np, "skyworks,en-channels", &pdata->enable);
> > +	if (IS_ERR_VALUE(ret))
> > +		pdata->enable = SKY81452_EN >> CTZ(SKY81452_EN);
> > +
> > +	ret = of_property_read_u32(np, "skyworks,short-detection-threshold",
> > +			&pdata->short_detection_threshold);
> > +	if (IS_ERR_VALUE(ret))
> > +		pdata->short_detection_threshold = 7;
> > +
> > +	ret = of_property_read_u32(np, "skyworks,current-limit",
> > +			&pdata->boost_current_limit);
> > +	if (IS_ERR_VALUE(ret))
> > +		pdata->boost_current_limit = 2750;
> > +
> > +	of_node_put(np);
> > +	return pdata;
> > +}
> > +#else
> > +static struct sky81452_bl_platform_data *sky81452_bl_parse_dt(
> > +							struct device *dev)
> > +{
> > +	return ERR_PTR(-EINVAL);
> > +}
> > +#endif
> > +
> > +static int sky81452_bl_init_device(struct regmap *regmap,
> > +		struct sky81452_bl_platform_data *pdata)
> > +{
> > +	unsigned int value;
> > +
> > +	value = pdata->ignore_pwm ? SKY81452_IGPW : 0;
> > +	value |= pdata->dpwm_mode ? SKY81452_PWMMD : 0;
> > +	value |= pdata->phase_shift ? 0 : SKY81452_PHASE;
> > +
> > +	if (pdata->boost_current_limit == 2300)
> > +		value |= SKY81452_ILIM;
> > +	else if (pdata->boost_current_limit != 2750)
> > +		return -EINVAL;
> > +
> > +	if (pdata->short_detection_threshold < 4 ||
> > +				pdata->short_detection_threshold > 7)
> > +		return -EINVAL;
> > +	value |= (7 - pdata->short_detection_threshold) << CTZ(SKY81452_VSHRT);
> > +
> > +	return regmap_write(regmap, SKY81452_REG2, value);
> > +}
> > +
> > +static int sky81452_bl_probe(struct platform_device *pdev)
> > +{
> > +	struct device *dev = &pdev->dev;
> > +	struct regmap *regmap = dev_get_drvdata(dev->parent);
> > +	struct sky81452_bl_platform_data *pdata = dev_get_platdata(dev);
> > +	struct backlight_device *bd;
> > +	struct backlight_properties props;
> > +	const char *name;
> > +	int ret;
> > +
> > +	if (!pdata) {
> > +		pdata = sky81452_bl_parse_dt(dev);
> > +		if (IS_ERR(pdata))
> > +			return PTR_ERR(pdata);
> > +	}
> > +
> > +	if (gpio_is_valid(pdata->gpio_enable)) {
> > +		ret = devm_gpio_request_one(dev, pdata->gpio_enable,
> > +					GPIOF_OUT_INIT_HIGH, "sky81452-en");
> > +		if (IS_ERR_VALUE(ret)) {
> > +			dev_err(dev, "failed to request GPIO. err=%d\n", ret);
> > +			return ret;
> > +		}
> > +	}
> > +
> > +	ret = sky81452_bl_init_device(regmap, pdata);
> > +	if (IS_ERR_VALUE(ret)) {
> > +		dev_err(dev, "failed to initialize. err=%d\n", ret);
> > +		return ret;
> > +	}
> > +
> > +	memset(&props, 0, sizeof(props));
> > +	props.max_brightness = SKY81452_MAX_BRIGHTNESS,
> > +	name = pdata->name ? pdata->name : SKY81452_DEFAULT_NAME;
> > +	bd = devm_backlight_device_register(dev, name, dev, regmap,
> > +						&sky81452_bl_ops, &props);
> > +	if (IS_ERR(bd)) {
> > +		dev_err(dev, "failed to register. err=%ld\n", PTR_ERR(bd));
> > +		return PTR_ERR(bd);
> > +	}
> > +
> > +	platform_set_drvdata(pdev, bd);
> > +
> > +	ret  = sysfs_create_group(&bd->dev.kobj, &sky81452_bl_attr_group);
> > +	if (IS_ERR_VALUE(ret)) {
> > +		dev_err(dev, "failed to create attribute. err=%d\n", ret);
> > +		return ret;
> > +	}
> > +
> > +	return ret;
> > +}
> > +
> > +static int sky81452_bl_remove(struct platform_device *pdev)
> > +{
> > +	const struct sky81452_bl_platform_data *pdata =
> > +						dev_get_platdata(&pdev->dev);
> > +	struct backlight_device *bd = platform_get_drvdata(pdev);
> > +
> > +	sysfs_remove_group(&bd->dev.kobj, &sky81452_bl_attr_group);
> > +
> > +	bd->props.power = FB_BLANK_UNBLANK;
> > +	bd->props.brightness = 0;
> > +	backlight_update_status(bd);
> > +
> > +	if (gpio_is_valid(pdata->gpio_enable))
> > +		gpio_set_value_cansleep(pdata->gpio_enable, 0);
> > +
> > +	return 0;
> > +}
> > +
> > +#ifdef CONFIG_OF
> > +static const struct of_device_id sky81452_bl_of_match[] = {
> > +	{ .compatible = "skyworks,sky81452-backlight", },
> > +	{ }
> > +};
> > +MODULE_DEVICE_TABLE(of, sky81452_bl_of_match);
> > +#endif
> > +
> > +static struct platform_driver sky81452_bl_driver = {
> > +	.driver = {
> > +		.name = "sky81452-backlight",
> > +		.of_match_table = of_match_ptr(sky81452_bl_of_match),
> > +	},
> > +	.probe = sky81452_bl_probe,
> > +	.remove = sky81452_bl_remove,
> > +};
> > +
> > +module_platform_driver(sky81452_bl_driver);
> > +
> > +MODULE_DESCRIPTION("Skyworks SKY81452 backlight driver");
> > +MODULE_AUTHOR("Gyungoh Yoo <jack.yoo@skyworksinc.com>");
> > +MODULE_LICENSE("GPL v2");
> > diff --git a/include/linux/platform_data/sky81452-backlight.h b/include/linux/platform_data/sky81452-
> > backlight.h
> > new file mode 100644
> > index 0000000..1231e9b
> > --- /dev/null
> > +++ b/include/linux/platform_data/sky81452-backlight.h
> > @@ -0,0 +1,46 @@
> > +/*
> > + * sky81452.h	SKY81452 backlight driver
> > + *
> > + * Copyright 2014 Skyworks Solutions Inc.
> > + * Author : Gyungoh Yoo <jack.yoo@skyworksinc.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.
> > + *
> > + * This program is distributed in the hope that it will be useful, but
> > + * WITHOUT ANY WARRANTY; without even the implied warranty of
> > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> > + * General Public License for more details.
> > + *
> > + * You should have received a copy of the GNU General Public License along
> > + * with this program; if not, see <http://www.gnu.org/licenses/>.
> > + */
> > +
> > +#ifndef _SKY81452_BACKLIGHT_H
> > +#define _SKY81452_BACKLIGHT_H
> > +
> > +/**
> > + * struct sky81452_platform_data
> > + * @name:	backlight driver name.
> > +		If it is not defined, default name is lcd-backlight.
> > + * @gpio_enable:GPIO number which control EN pin
> > + * @enable:	Enable mask for current sink channel 1, 2, 3, 4, 5 and 6.
> > + * @ignore_pwm:	true if DPWMI should be ignored.
> > + * @dpwm_mode:	true is DPWM dimming mode, otherwise Analog dimming mode.
> > + * @phase_shift:true is phase shift mode.
> > + * @short_detecion_threshold:	It should be one of 4, 5, 6 and 7V.
> > + * @boost_current_limit:	It should be one of 2300, 2750mA.
> > + */
> > +struct sky81452_bl_platform_data {
> > +	const char *name;
> > +	int gpio_enable;
> > +	unsigned int enable;
> > +	bool ignore_pwm;
> > +	bool dpwm_mode;
> > +	bool phase_shift;
> > +	unsigned int short_detection_threshold;
> > +	unsigned int boost_current_limit;
> > +};
> > +
> > +#endif
> > --
> > 1.9.1
> 

WARNING: multiple messages have this Message-ID (diff)
From: Gyungoh Yoo <gyungoh-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
To: Jingoo Han <jg1.han-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org>
Cc: sameo-VuQAYsv1563Yd54FQh9/CA@public.gmane.org,
	lee.jones-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org,
	grant.likely-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org,
	robh+dt-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org,
	cooloney-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org,
	pawel.moll-5wv7dgnIgG8@public.gmane.org,
	mark.rutland-5wv7dgnIgG8@public.gmane.org,
	ijc+devicetree-KcIKpvwj1kUDXYZnReoRVg@public.gmane.org,
	galak-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org,
	trivial-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org,
	akpm-de/tnXTf+JLsfHDXvbKv3WD2FQJk+8+b@public.gmane.org,
	jic23-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org,
	thomas.petazzoni-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org,
	ktsai-GubuWUlQtMwciDkP5Hr2oA@public.gmane.org,
	hs-ynQEQJNshbs@public.gmane.org,
	stwiss.opensource-WBD+wuPFNBhBDgjK7y7TUQ@public.gmane.org,
	matti.vaittinen-OYasijW0DpE@public.gmane.org,
	broonie-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org,
	jason-NLaQJdtUoK4Be96aLqz0jA@public.gmane.org,
	heiko-4mtYJXux2i+zQB+pC5nmwQ@public.gmane.org,
	shawn.guo-KZfg59tc24xl57MIdRCFDg@public.gmane.org,
	florian.vaussard-p8DiymsW2f8@public.gmane.org,
	andrew-g2DYL2Zd6BY@public.gmane.org,
	antonynpavlov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org,
	hytszk-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org,
	plagnioj-sclMFOaUSTBWk0Htik3J/w@public.gmane.org,
	tomi.valkeinen-l0cyMroinI0@public.gmane.org,
	jack.yoo-tjhQNA90jdKqndwCJWfcng@public.gmane.org,
	linux-fbdev-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
	devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
Subject: Re: [PATCH v10 2/6] backlight: Add support Skyworks SKY81452 backlight driver
Date: Thu, 18 Dec 2014 15:13:24 +0900	[thread overview]
Message-ID: <20141218061324.GA3107@jack-ThinkPad-T520> (raw)
In-Reply-To: <001101d01a89$2a629590$7f27c0b0$%han-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org>

On Thu, Dec 18, 2014 at 03:09:21PM +0900, Jingoo Han wrote:
> On Thursday, December 18, 2014 2:48 PM, Gyungoh Yoo wrote:
> > 
> > From: Gyungoh Yoo <jack.yoo-tjhQNA90jdKqndwCJWfcng@public.gmane.org>
> > 
> > Signed-off-by: Gyungoh Yoo <jack.yoo-tjhQNA90jdKqndwCJWfcng@public.gmane.org>
> 
> Please add the following 'Acked-by's when you send this patch
> next time.
> 
> Acked-by: Jingoo Han <jg1.han-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org>
> Acked-by: Bryan Wu <cooloney-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>

I see.
Thank you.

> 
> Best regards,
> Jingoo Han
> 
> > ---
> > Changes v10:
> > Removed trivial get_brightness implementations
> > 
> > Changes v9:
> > Nothing
> > 
> > Changes v8:
> > Renamed property names for backlight with vendor prefix
> > Modified gpio-enable property to generic property for GPIO
> > 
> > Changes v7:
> > Modified licensing text to GPLv2
> > 
> > Changes v6:
> > Added new line character at the end of line of dev_err()
> > 
> > Changes v5:
> > Move sky81452-backlight.h to include/linux/platform_data
> > 
> > Changes v4:
> > Reordering header files for readability
> > Removed calling to backlight_device_unregister()
> > Removed MODULE_VERSION()
> > Modified license to GPLv2
> > 
> > Changes v3:
> > Modified DBG messages
> > 
> > Changes v2:
> > Added 'compatible' attribute in the driver
> > Added message for exception or errors
> > 
> >  drivers/video/backlight/Kconfig                  |  10 +
> >  drivers/video/backlight/Makefile                 |   1 +
> >  drivers/video/backlight/sky81452-backlight.c     | 334 +++++++++++++++++++++++
> >  include/linux/platform_data/sky81452-backlight.h |  46 ++++
> >  4 files changed, 391 insertions(+)
> >  create mode 100644 drivers/video/backlight/sky81452-backlight.c
> >  create mode 100644 include/linux/platform_data/sky81452-backlight.h
> > 
> > diff --git a/drivers/video/backlight/Kconfig b/drivers/video/backlight/Kconfig
> > index 8d03924..2586fdd 100644
> > --- a/drivers/video/backlight/Kconfig
> > +++ b/drivers/video/backlight/Kconfig
> > @@ -409,6 +409,16 @@ config BACKLIGHT_PANDORA
> >  	  If you have a Pandora console, say Y to enable the
> >  	  backlight driver.
> > 
> > +config BACKLIGHT_SKY81452
> > +	tristate "Backlight driver for SKY81452"
> > +	depends on BACKLIGHT_CLASS_DEVICE && MFD_SKY81452
> > +	help
> > +	  If you have a Skyworks SKY81452, say Y to enable the
> > +	  backlight driver.
> > +
> > +	  To compile this driver as a module, choose M here: the module will
> > +	  be called sky81452-backlight
> > +
> >  config BACKLIGHT_TPS65217
> >  	tristate "TPS65217 Backlight"
> >  	depends on BACKLIGHT_CLASS_DEVICE && MFD_TPS65217
> > diff --git a/drivers/video/backlight/Makefile b/drivers/video/backlight/Makefile
> > index fcd50b73..d67073f 100644
> > --- a/drivers/video/backlight/Makefile
> > +++ b/drivers/video/backlight/Makefile
> > @@ -50,6 +50,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_SAHARA)		+= kb3886_bl.o
> > +obj-$(CONFIG_BACKLIGHT_SKY81452)	+= sky81452-backlight.o
> >  obj-$(CONFIG_BACKLIGHT_TOSA)		+= tosa_bl.o
> >  obj-$(CONFIG_BACKLIGHT_TPS65217)	+= tps65217_bl.o
> >  obj-$(CONFIG_BACKLIGHT_WM831X)		+= wm831x_bl.o
> > diff --git a/drivers/video/backlight/sky81452-backlight.c b/drivers/video/backlight/sky81452-
> > backlight.c
> > new file mode 100644
> > index 0000000..8105597
> > --- /dev/null
> > +++ b/drivers/video/backlight/sky81452-backlight.c
> > @@ -0,0 +1,334 @@
> > +/*
> > + * sky81452-backlight.c	SKY81452 backlight driver
> > + *
> > + * Copyright 2014 Skyworks Solutions Inc.
> > + * Author : Gyungoh Yoo <jack.yoo-tjhQNA90jdKqndwCJWfcng@public.gmane.org>
> > + *
> > + * 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.
> > + *
> > + * This program is distributed in the hope that it will be useful, but
> > + * WITHOUT ANY WARRANTY; without even the implied warranty of
> > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> > + * General Public License for more details.
> > + *
> > + * You should have received a copy of the GNU General Public License along
> > + * with this program; if not, see <http://www.gnu.org/licenses/>.
> > + */
> > +
> > +#include <linux/backlight.h>
> > +#include <linux/err.h>
> > +#include <linux/gpio.h>
> > +#include <linux/init.h>
> > +#include <linux/kernel.h>
> > +#include <linux/module.h>
> > +#include <linux/of.h>
> > +#include <linux/of_gpio.h>
> > +#include <linux/platform_device.h>
> > +#include <linux/regmap.h>
> > +#include <linux/platform_data/sky81452-backlight.h>
> > +#include <linux/slab.h>
> > +
> > +/* registers */
> > +#define SKY81452_REG0	0x00
> > +#define SKY81452_REG1	0x01
> > +#define SKY81452_REG2	0x02
> > +#define SKY81452_REG4	0x04
> > +#define SKY81452_REG5	0x05
> > +
> > +/* bit mask */
> > +#define SKY81452_CS	0xFF
> > +#define SKY81452_EN	0x3F
> > +#define SKY81452_IGPW	0x20
> > +#define SKY81452_PWMMD	0x10
> > +#define SKY81452_PHASE	0x08
> > +#define SKY81452_ILIM	0x04
> > +#define SKY81452_VSHRT	0x03
> > +#define SKY81452_OCP	0x80
> > +#define SKY81452_OTMP	0x40
> > +#define SKY81452_SHRT	0x3F
> > +#define SKY81452_OPN	0x3F
> > +
> > +#define SKY81452_DEFAULT_NAME "lcd-backlight"
> > +#define SKY81452_MAX_BRIGHTNESS	(SKY81452_CS + 1)
> > +
> > +#define CTZ(b) __builtin_ctz(b)
> > +
> > +static int sky81452_bl_update_status(struct backlight_device *bd)
> > +{
> > +	const struct sky81452_bl_platform_data *pdata =
> > +			dev_get_platdata(bd->dev.parent);
> > +	const unsigned int brightness = (unsigned int)bd->props.brightness;
> > +	struct regmap *regmap = bl_get_data(bd);
> > +	int ret;
> > +
> > +	if (brightness > 0) {
> > +		ret = regmap_write(regmap, SKY81452_REG0, brightness - 1);
> > +		if (IS_ERR_VALUE(ret))
> > +			return ret;
> > +
> > +		return regmap_update_bits(regmap, SKY81452_REG1, SKY81452_EN,
> > +					pdata->enable << CTZ(SKY81452_EN));
> > +	}
> > +
> > +	return regmap_update_bits(regmap, SKY81452_REG1, SKY81452_EN, 0);
> > +}
> > +
> > +static const struct backlight_ops sky81452_bl_ops = {
> > +	.update_status = sky81452_bl_update_status,
> > +};
> > +
> > +static ssize_t sky81452_bl_store_enable(struct device *dev,
> > +		struct device_attribute *attr, const char *buf, size_t count)
> > +{
> > +	struct regmap *regmap = bl_get_data(to_backlight_device(dev));
> > +	unsigned long value;
> > +	int ret;
> > +
> > +	ret = kstrtoul(buf, 16, &value);
> > +	if (IS_ERR_VALUE(ret))
> > +		return ret;
> > +
> > +	ret = regmap_update_bits(regmap, SKY81452_REG1, SKY81452_EN,
> > +					value << CTZ(SKY81452_EN));
> > +	if (IS_ERR_VALUE(ret))
> > +		return ret;
> > +
> > +	return count;
> > +}
> > +
> > +static ssize_t sky81452_bl_show_open_short(struct device *dev,
> > +		struct device_attribute *attr, char *buf)
> > +{
> > +	struct regmap *regmap = bl_get_data(to_backlight_device(dev));
> > +	unsigned int reg, value = 0;
> > +	char tmp[3];
> > +	int i, ret;
> > +
> > +	reg = !strcmp(attr->attr.name, "open") ? SKY81452_REG5 : SKY81452_REG4;
> > +	ret = regmap_read(regmap, reg, &value);
> > +	if (IS_ERR_VALUE(ret))
> > +		return ret;
> > +
> > +	if (value & SKY81452_SHRT) {
> > +		*buf = 0;
> > +		for (i = 0; i < 6; i++) {
> > +			if (value & 0x01) {
> > +				sprintf(tmp, "%d ", i + 1);
> > +				strcat(buf, tmp);
> > +			}
> > +			value >>= 1;
> > +		}
> > +		strcat(buf, "\n");
> > +	} else {
> > +		strcpy(buf, "none\n");
> > +	}
> > +
> > +	return strlen(buf);
> > +}
> > +
> > +static ssize_t sky81452_bl_show_fault(struct device *dev,
> > +		struct device_attribute *attr, char *buf)
> > +{
> > +	struct regmap *regmap = bl_get_data(to_backlight_device(dev));
> > +	unsigned int value = 0;
> > +	int ret;
> > +
> > +	ret = regmap_read(regmap, SKY81452_REG4, &value);
> > +	if (IS_ERR_VALUE(ret))
> > +		return ret;
> > +
> > +	*buf = 0;
> > +
> > +	if (value & SKY81452_OCP)
> > +		strcat(buf, "over-current ");
> > +
> > +	if (value & SKY81452_OTMP)
> > +		strcat(buf, "over-temperature");
> > +
> > +	strcat(buf, "\n");
> > +	return strlen(buf);
> > +}
> > +
> > +static DEVICE_ATTR(enable, S_IWGRP | S_IWUSR, NULL, sky81452_bl_store_enable);
> > +static DEVICE_ATTR(open, S_IRUGO, sky81452_bl_show_open_short, NULL);
> > +static DEVICE_ATTR(short, S_IRUGO, sky81452_bl_show_open_short, NULL);
> > +static DEVICE_ATTR(fault, S_IRUGO, sky81452_bl_show_fault, NULL);
> > +
> > +static struct attribute *sky81452_bl_attribute[] = {
> > +	&dev_attr_enable.attr,
> > +	&dev_attr_open.attr,
> > +	&dev_attr_short.attr,
> > +	&dev_attr_fault.attr,
> > +	NULL
> > +};
> > +
> > +static const struct attribute_group sky81452_bl_attr_group = {
> > +	.attrs = sky81452_bl_attribute,
> > +};
> > +
> > +#ifdef CONFIG_OF
> > +static struct sky81452_bl_platform_data *sky81452_bl_parse_dt(
> > +							struct device *dev)
> > +{
> > +	struct device_node *np = of_node_get(dev->of_node);
> > +	struct sky81452_bl_platform_data *pdata;
> > +	int ret;
> > +
> > +	if (!np) {
> > +		dev_err(dev, "backlight node not found.\n");
> > +		return ERR_PTR(-ENODATA);
> > +	}
> > +
> > +	pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL);
> > +	if (!pdata) {
> > +		of_node_put(np);
> > +		return ERR_PTR(-ENOMEM);
> > +	}
> > +
> > +	of_property_read_string(np, "name", &pdata->name);
> > +	pdata->ignore_pwm = of_property_read_bool(np, "skyworks,ignore-pwm");
> > +	pdata->dpwm_mode = of_property_read_bool(np, "skyworks,dpwm-mode");
> > +	pdata->phase_shift = of_property_read_bool(np, "skyworks,phase-shift");
> > +	pdata->gpio_enable = of_get_gpio(np, 0);
> > +
> > +	ret = of_property_read_u32(np, "skyworks,en-channels", &pdata->enable);
> > +	if (IS_ERR_VALUE(ret))
> > +		pdata->enable = SKY81452_EN >> CTZ(SKY81452_EN);
> > +
> > +	ret = of_property_read_u32(np, "skyworks,short-detection-threshold",
> > +			&pdata->short_detection_threshold);
> > +	if (IS_ERR_VALUE(ret))
> > +		pdata->short_detection_threshold = 7;
> > +
> > +	ret = of_property_read_u32(np, "skyworks,current-limit",
> > +			&pdata->boost_current_limit);
> > +	if (IS_ERR_VALUE(ret))
> > +		pdata->boost_current_limit = 2750;
> > +
> > +	of_node_put(np);
> > +	return pdata;
> > +}
> > +#else
> > +static struct sky81452_bl_platform_data *sky81452_bl_parse_dt(
> > +							struct device *dev)
> > +{
> > +	return ERR_PTR(-EINVAL);
> > +}
> > +#endif
> > +
> > +static int sky81452_bl_init_device(struct regmap *regmap,
> > +		struct sky81452_bl_platform_data *pdata)
> > +{
> > +	unsigned int value;
> > +
> > +	value = pdata->ignore_pwm ? SKY81452_IGPW : 0;
> > +	value |= pdata->dpwm_mode ? SKY81452_PWMMD : 0;
> > +	value |= pdata->phase_shift ? 0 : SKY81452_PHASE;
> > +
> > +	if (pdata->boost_current_limit == 2300)
> > +		value |= SKY81452_ILIM;
> > +	else if (pdata->boost_current_limit != 2750)
> > +		return -EINVAL;
> > +
> > +	if (pdata->short_detection_threshold < 4 ||
> > +				pdata->short_detection_threshold > 7)
> > +		return -EINVAL;
> > +	value |= (7 - pdata->short_detection_threshold) << CTZ(SKY81452_VSHRT);
> > +
> > +	return regmap_write(regmap, SKY81452_REG2, value);
> > +}
> > +
> > +static int sky81452_bl_probe(struct platform_device *pdev)
> > +{
> > +	struct device *dev = &pdev->dev;
> > +	struct regmap *regmap = dev_get_drvdata(dev->parent);
> > +	struct sky81452_bl_platform_data *pdata = dev_get_platdata(dev);
> > +	struct backlight_device *bd;
> > +	struct backlight_properties props;
> > +	const char *name;
> > +	int ret;
> > +
> > +	if (!pdata) {
> > +		pdata = sky81452_bl_parse_dt(dev);
> > +		if (IS_ERR(pdata))
> > +			return PTR_ERR(pdata);
> > +	}
> > +
> > +	if (gpio_is_valid(pdata->gpio_enable)) {
> > +		ret = devm_gpio_request_one(dev, pdata->gpio_enable,
> > +					GPIOF_OUT_INIT_HIGH, "sky81452-en");
> > +		if (IS_ERR_VALUE(ret)) {
> > +			dev_err(dev, "failed to request GPIO. err=%d\n", ret);
> > +			return ret;
> > +		}
> > +	}
> > +
> > +	ret = sky81452_bl_init_device(regmap, pdata);
> > +	if (IS_ERR_VALUE(ret)) {
> > +		dev_err(dev, "failed to initialize. err=%d\n", ret);
> > +		return ret;
> > +	}
> > +
> > +	memset(&props, 0, sizeof(props));
> > +	props.max_brightness = SKY81452_MAX_BRIGHTNESS,
> > +	name = pdata->name ? pdata->name : SKY81452_DEFAULT_NAME;
> > +	bd = devm_backlight_device_register(dev, name, dev, regmap,
> > +						&sky81452_bl_ops, &props);
> > +	if (IS_ERR(bd)) {
> > +		dev_err(dev, "failed to register. err=%ld\n", PTR_ERR(bd));
> > +		return PTR_ERR(bd);
> > +	}
> > +
> > +	platform_set_drvdata(pdev, bd);
> > +
> > +	ret  = sysfs_create_group(&bd->dev.kobj, &sky81452_bl_attr_group);
> > +	if (IS_ERR_VALUE(ret)) {
> > +		dev_err(dev, "failed to create attribute. err=%d\n", ret);
> > +		return ret;
> > +	}
> > +
> > +	return ret;
> > +}
> > +
> > +static int sky81452_bl_remove(struct platform_device *pdev)
> > +{
> > +	const struct sky81452_bl_platform_data *pdata =
> > +						dev_get_platdata(&pdev->dev);
> > +	struct backlight_device *bd = platform_get_drvdata(pdev);
> > +
> > +	sysfs_remove_group(&bd->dev.kobj, &sky81452_bl_attr_group);
> > +
> > +	bd->props.power = FB_BLANK_UNBLANK;
> > +	bd->props.brightness = 0;
> > +	backlight_update_status(bd);
> > +
> > +	if (gpio_is_valid(pdata->gpio_enable))
> > +		gpio_set_value_cansleep(pdata->gpio_enable, 0);
> > +
> > +	return 0;
> > +}
> > +
> > +#ifdef CONFIG_OF
> > +static const struct of_device_id sky81452_bl_of_match[] = {
> > +	{ .compatible = "skyworks,sky81452-backlight", },
> > +	{ }
> > +};
> > +MODULE_DEVICE_TABLE(of, sky81452_bl_of_match);
> > +#endif
> > +
> > +static struct platform_driver sky81452_bl_driver = {
> > +	.driver = {
> > +		.name = "sky81452-backlight",
> > +		.of_match_table = of_match_ptr(sky81452_bl_of_match),
> > +	},
> > +	.probe = sky81452_bl_probe,
> > +	.remove = sky81452_bl_remove,
> > +};
> > +
> > +module_platform_driver(sky81452_bl_driver);
> > +
> > +MODULE_DESCRIPTION("Skyworks SKY81452 backlight driver");
> > +MODULE_AUTHOR("Gyungoh Yoo <jack.yoo-tjhQNA90jdKqndwCJWfcng@public.gmane.org>");
> > +MODULE_LICENSE("GPL v2");
> > diff --git a/include/linux/platform_data/sky81452-backlight.h b/include/linux/platform_data/sky81452-
> > backlight.h
> > new file mode 100644
> > index 0000000..1231e9b
> > --- /dev/null
> > +++ b/include/linux/platform_data/sky81452-backlight.h
> > @@ -0,0 +1,46 @@
> > +/*
> > + * sky81452.h	SKY81452 backlight driver
> > + *
> > + * Copyright 2014 Skyworks Solutions Inc.
> > + * Author : Gyungoh Yoo <jack.yoo-tjhQNA90jdKqndwCJWfcng@public.gmane.org>
> > + *
> > + * 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.
> > + *
> > + * This program is distributed in the hope that it will be useful, but
> > + * WITHOUT ANY WARRANTY; without even the implied warranty of
> > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> > + * General Public License for more details.
> > + *
> > + * You should have received a copy of the GNU General Public License along
> > + * with this program; if not, see <http://www.gnu.org/licenses/>.
> > + */
> > +
> > +#ifndef _SKY81452_BACKLIGHT_H
> > +#define _SKY81452_BACKLIGHT_H
> > +
> > +/**
> > + * struct sky81452_platform_data
> > + * @name:	backlight driver name.
> > +		If it is not defined, default name is lcd-backlight.
> > + * @gpio_enable:GPIO number which control EN pin
> > + * @enable:	Enable mask for current sink channel 1, 2, 3, 4, 5 and 6.
> > + * @ignore_pwm:	true if DPWMI should be ignored.
> > + * @dpwm_mode:	true is DPWM dimming mode, otherwise Analog dimming mode.
> > + * @phase_shift:true is phase shift mode.
> > + * @short_detecion_threshold:	It should be one of 4, 5, 6 and 7V.
> > + * @boost_current_limit:	It should be one of 2300, 2750mA.
> > + */
> > +struct sky81452_bl_platform_data {
> > +	const char *name;
> > +	int gpio_enable;
> > +	unsigned int enable;
> > +	bool ignore_pwm;
> > +	bool dpwm_mode;
> > +	bool phase_shift;
> > +	unsigned int short_detection_threshold;
> > +	unsigned int boost_current_limit;
> > +};
> > +
> > +#endif
> > --
> > 1.9.1
> 
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

WARNING: multiple messages have this Message-ID (diff)
From: Gyungoh Yoo <gyungoh@gmail.com>
To: Jingoo Han <jg1.han-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org>
Cc: sameo-VuQAYsv1563Yd54FQh9/CA@public.gmane.org,
	lee.jones-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org,
	grant.likely-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org,
	robh+dt-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org,
	cooloney-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org,
	pawel.moll-5wv7dgnIgG8@public.gmane.org,
	mark.rutland-5wv7dgnIgG8@public.gmane.org,
	ijc+devicetree-KcIKpvwj1kUDXYZnReoRVg@public.gmane.org,
	galak-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org,
	trivial-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org,
	akpm-de/tnXTf+JLsfHDXvbKv3WD2FQJk+8+b@public.gmane.org,
	jic23-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org,
	thomas.petazzoni-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org,
	ktsai-GubuWUlQtMwciDkP5Hr2oA@public.gmane.org,
	hs-ynQEQJNshbs@public.gmane.org,
	stwiss.opensource-WBD+wuPFNBhBDgjK7y7TUQ@public.gmane.org,
	matti.vaittinen-OYasijW0DpE@public.gmane.org,
	broonie-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org,
	jason-NLaQJdtUoK4Be96aLqz0jA@public.gmane.org,
	heiko-4mtYJXux2i+zQB+pC5nmwQ@public.gmane.org,
	shawn.guo-KZfg59tc24xl57MIdRCFDg@public.gmane.org,
	florian.vaussard-p8DiymsW2f8@public.gmane.org,
	andrew-g2DYL2Zd6BY@public.gmane.org,
	antonynpavlov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org,
	hytszk-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org,
	plagnioj-sclMFOaUSTBWk0Htik3J/w@public.gmane.org,
	tomi.valkeinen-l0cyMroinI0@public.gmane.org,
	jack.yoo-tjhQNA90jdKqndwCJWfcng@public.gmane.org,
	linux-fbdev-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
	devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
Subject: Re: [PATCH v10 2/6] backlight: Add support Skyworks SKY81452 backlight driver
Date: Thu, 18 Dec 2014 06:13:24 +0000	[thread overview]
Message-ID: <20141218061324.GA3107@jack-ThinkPad-T520> (raw)
In-Reply-To: <001101d01a89$2a629590$7f27c0b0$%han-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org>

On Thu, Dec 18, 2014 at 03:09:21PM +0900, Jingoo Han wrote:
> On Thursday, December 18, 2014 2:48 PM, Gyungoh Yoo wrote:
> > 
> > From: Gyungoh Yoo <jack.yoo@skyworksinc.com>
> > 
> > Signed-off-by: Gyungoh Yoo <jack.yoo@skyworksinc.com>
> 
> Please add the following 'Acked-by's when you send this patch
> next time.
> 
> Acked-by: Jingoo Han <jg1.han@samsung.com>
> Acked-by: Bryan Wu <cooloney@gmail.com>

I see.
Thank you.

> 
> Best regards,
> Jingoo Han
> 
> > ---
> > Changes v10:
> > Removed trivial get_brightness implementations
> > 
> > Changes v9:
> > Nothing
> > 
> > Changes v8:
> > Renamed property names for backlight with vendor prefix
> > Modified gpio-enable property to generic property for GPIO
> > 
> > Changes v7:
> > Modified licensing text to GPLv2
> > 
> > Changes v6:
> > Added new line character at the end of line of dev_err()
> > 
> > Changes v5:
> > Move sky81452-backlight.h to include/linux/platform_data
> > 
> > Changes v4:
> > Reordering header files for readability
> > Removed calling to backlight_device_unregister()
> > Removed MODULE_VERSION()
> > Modified license to GPLv2
> > 
> > Changes v3:
> > Modified DBG messages
> > 
> > Changes v2:
> > Added 'compatible' attribute in the driver
> > Added message for exception or errors
> > 
> >  drivers/video/backlight/Kconfig                  |  10 +
> >  drivers/video/backlight/Makefile                 |   1 +
> >  drivers/video/backlight/sky81452-backlight.c     | 334 +++++++++++++++++++++++
> >  include/linux/platform_data/sky81452-backlight.h |  46 ++++
> >  4 files changed, 391 insertions(+)
> >  create mode 100644 drivers/video/backlight/sky81452-backlight.c
> >  create mode 100644 include/linux/platform_data/sky81452-backlight.h
> > 
> > diff --git a/drivers/video/backlight/Kconfig b/drivers/video/backlight/Kconfig
> > index 8d03924..2586fdd 100644
> > --- a/drivers/video/backlight/Kconfig
> > +++ b/drivers/video/backlight/Kconfig
> > @@ -409,6 +409,16 @@ config BACKLIGHT_PANDORA
> >  	  If you have a Pandora console, say Y to enable the
> >  	  backlight driver.
> > 
> > +config BACKLIGHT_SKY81452
> > +	tristate "Backlight driver for SKY81452"
> > +	depends on BACKLIGHT_CLASS_DEVICE && MFD_SKY81452
> > +	help
> > +	  If you have a Skyworks SKY81452, say Y to enable the
> > +	  backlight driver.
> > +
> > +	  To compile this driver as a module, choose M here: the module will
> > +	  be called sky81452-backlight
> > +
> >  config BACKLIGHT_TPS65217
> >  	tristate "TPS65217 Backlight"
> >  	depends on BACKLIGHT_CLASS_DEVICE && MFD_TPS65217
> > diff --git a/drivers/video/backlight/Makefile b/drivers/video/backlight/Makefile
> > index fcd50b73..d67073f 100644
> > --- a/drivers/video/backlight/Makefile
> > +++ b/drivers/video/backlight/Makefile
> > @@ -50,6 +50,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_SAHARA)		+= kb3886_bl.o
> > +obj-$(CONFIG_BACKLIGHT_SKY81452)	+= sky81452-backlight.o
> >  obj-$(CONFIG_BACKLIGHT_TOSA)		+= tosa_bl.o
> >  obj-$(CONFIG_BACKLIGHT_TPS65217)	+= tps65217_bl.o
> >  obj-$(CONFIG_BACKLIGHT_WM831X)		+= wm831x_bl.o
> > diff --git a/drivers/video/backlight/sky81452-backlight.c b/drivers/video/backlight/sky81452-
> > backlight.c
> > new file mode 100644
> > index 0000000..8105597
> > --- /dev/null
> > +++ b/drivers/video/backlight/sky81452-backlight.c
> > @@ -0,0 +1,334 @@
> > +/*
> > + * sky81452-backlight.c	SKY81452 backlight driver
> > + *
> > + * Copyright 2014 Skyworks Solutions Inc.
> > + * Author : Gyungoh Yoo <jack.yoo@skyworksinc.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.
> > + *
> > + * This program is distributed in the hope that it will be useful, but
> > + * WITHOUT ANY WARRANTY; without even the implied warranty of
> > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> > + * General Public License for more details.
> > + *
> > + * You should have received a copy of the GNU General Public License along
> > + * with this program; if not, see <http://www.gnu.org/licenses/>.
> > + */
> > +
> > +#include <linux/backlight.h>
> > +#include <linux/err.h>
> > +#include <linux/gpio.h>
> > +#include <linux/init.h>
> > +#include <linux/kernel.h>
> > +#include <linux/module.h>
> > +#include <linux/of.h>
> > +#include <linux/of_gpio.h>
> > +#include <linux/platform_device.h>
> > +#include <linux/regmap.h>
> > +#include <linux/platform_data/sky81452-backlight.h>
> > +#include <linux/slab.h>
> > +
> > +/* registers */
> > +#define SKY81452_REG0	0x00
> > +#define SKY81452_REG1	0x01
> > +#define SKY81452_REG2	0x02
> > +#define SKY81452_REG4	0x04
> > +#define SKY81452_REG5	0x05
> > +
> > +/* bit mask */
> > +#define SKY81452_CS	0xFF
> > +#define SKY81452_EN	0x3F
> > +#define SKY81452_IGPW	0x20
> > +#define SKY81452_PWMMD	0x10
> > +#define SKY81452_PHASE	0x08
> > +#define SKY81452_ILIM	0x04
> > +#define SKY81452_VSHRT	0x03
> > +#define SKY81452_OCP	0x80
> > +#define SKY81452_OTMP	0x40
> > +#define SKY81452_SHRT	0x3F
> > +#define SKY81452_OPN	0x3F
> > +
> > +#define SKY81452_DEFAULT_NAME "lcd-backlight"
> > +#define SKY81452_MAX_BRIGHTNESS	(SKY81452_CS + 1)
> > +
> > +#define CTZ(b) __builtin_ctz(b)
> > +
> > +static int sky81452_bl_update_status(struct backlight_device *bd)
> > +{
> > +	const struct sky81452_bl_platform_data *pdata > > +			dev_get_platdata(bd->dev.parent);
> > +	const unsigned int brightness = (unsigned int)bd->props.brightness;
> > +	struct regmap *regmap = bl_get_data(bd);
> > +	int ret;
> > +
> > +	if (brightness > 0) {
> > +		ret = regmap_write(regmap, SKY81452_REG0, brightness - 1);
> > +		if (IS_ERR_VALUE(ret))
> > +			return ret;
> > +
> > +		return regmap_update_bits(regmap, SKY81452_REG1, SKY81452_EN,
> > +					pdata->enable << CTZ(SKY81452_EN));
> > +	}
> > +
> > +	return regmap_update_bits(regmap, SKY81452_REG1, SKY81452_EN, 0);
> > +}
> > +
> > +static const struct backlight_ops sky81452_bl_ops = {
> > +	.update_status = sky81452_bl_update_status,
> > +};
> > +
> > +static ssize_t sky81452_bl_store_enable(struct device *dev,
> > +		struct device_attribute *attr, const char *buf, size_t count)
> > +{
> > +	struct regmap *regmap = bl_get_data(to_backlight_device(dev));
> > +	unsigned long value;
> > +	int ret;
> > +
> > +	ret = kstrtoul(buf, 16, &value);
> > +	if (IS_ERR_VALUE(ret))
> > +		return ret;
> > +
> > +	ret = regmap_update_bits(regmap, SKY81452_REG1, SKY81452_EN,
> > +					value << CTZ(SKY81452_EN));
> > +	if (IS_ERR_VALUE(ret))
> > +		return ret;
> > +
> > +	return count;
> > +}
> > +
> > +static ssize_t sky81452_bl_show_open_short(struct device *dev,
> > +		struct device_attribute *attr, char *buf)
> > +{
> > +	struct regmap *regmap = bl_get_data(to_backlight_device(dev));
> > +	unsigned int reg, value = 0;
> > +	char tmp[3];
> > +	int i, ret;
> > +
> > +	reg = !strcmp(attr->attr.name, "open") ? SKY81452_REG5 : SKY81452_REG4;
> > +	ret = regmap_read(regmap, reg, &value);
> > +	if (IS_ERR_VALUE(ret))
> > +		return ret;
> > +
> > +	if (value & SKY81452_SHRT) {
> > +		*buf = 0;
> > +		for (i = 0; i < 6; i++) {
> > +			if (value & 0x01) {
> > +				sprintf(tmp, "%d ", i + 1);
> > +				strcat(buf, tmp);
> > +			}
> > +			value >>= 1;
> > +		}
> > +		strcat(buf, "\n");
> > +	} else {
> > +		strcpy(buf, "none\n");
> > +	}
> > +
> > +	return strlen(buf);
> > +}
> > +
> > +static ssize_t sky81452_bl_show_fault(struct device *dev,
> > +		struct device_attribute *attr, char *buf)
> > +{
> > +	struct regmap *regmap = bl_get_data(to_backlight_device(dev));
> > +	unsigned int value = 0;
> > +	int ret;
> > +
> > +	ret = regmap_read(regmap, SKY81452_REG4, &value);
> > +	if (IS_ERR_VALUE(ret))
> > +		return ret;
> > +
> > +	*buf = 0;
> > +
> > +	if (value & SKY81452_OCP)
> > +		strcat(buf, "over-current ");
> > +
> > +	if (value & SKY81452_OTMP)
> > +		strcat(buf, "over-temperature");
> > +
> > +	strcat(buf, "\n");
> > +	return strlen(buf);
> > +}
> > +
> > +static DEVICE_ATTR(enable, S_IWGRP | S_IWUSR, NULL, sky81452_bl_store_enable);
> > +static DEVICE_ATTR(open, S_IRUGO, sky81452_bl_show_open_short, NULL);
> > +static DEVICE_ATTR(short, S_IRUGO, sky81452_bl_show_open_short, NULL);
> > +static DEVICE_ATTR(fault, S_IRUGO, sky81452_bl_show_fault, NULL);
> > +
> > +static struct attribute *sky81452_bl_attribute[] = {
> > +	&dev_attr_enable.attr,
> > +	&dev_attr_open.attr,
> > +	&dev_attr_short.attr,
> > +	&dev_attr_fault.attr,
> > +	NULL
> > +};
> > +
> > +static const struct attribute_group sky81452_bl_attr_group = {
> > +	.attrs = sky81452_bl_attribute,
> > +};
> > +
> > +#ifdef CONFIG_OF
> > +static struct sky81452_bl_platform_data *sky81452_bl_parse_dt(
> > +							struct device *dev)
> > +{
> > +	struct device_node *np = of_node_get(dev->of_node);
> > +	struct sky81452_bl_platform_data *pdata;
> > +	int ret;
> > +
> > +	if (!np) {
> > +		dev_err(dev, "backlight node not found.\n");
> > +		return ERR_PTR(-ENODATA);
> > +	}
> > +
> > +	pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL);
> > +	if (!pdata) {
> > +		of_node_put(np);
> > +		return ERR_PTR(-ENOMEM);
> > +	}
> > +
> > +	of_property_read_string(np, "name", &pdata->name);
> > +	pdata->ignore_pwm = of_property_read_bool(np, "skyworks,ignore-pwm");
> > +	pdata->dpwm_mode = of_property_read_bool(np, "skyworks,dpwm-mode");
> > +	pdata->phase_shift = of_property_read_bool(np, "skyworks,phase-shift");
> > +	pdata->gpio_enable = of_get_gpio(np, 0);
> > +
> > +	ret = of_property_read_u32(np, "skyworks,en-channels", &pdata->enable);
> > +	if (IS_ERR_VALUE(ret))
> > +		pdata->enable = SKY81452_EN >> CTZ(SKY81452_EN);
> > +
> > +	ret = of_property_read_u32(np, "skyworks,short-detection-threshold",
> > +			&pdata->short_detection_threshold);
> > +	if (IS_ERR_VALUE(ret))
> > +		pdata->short_detection_threshold = 7;
> > +
> > +	ret = of_property_read_u32(np, "skyworks,current-limit",
> > +			&pdata->boost_current_limit);
> > +	if (IS_ERR_VALUE(ret))
> > +		pdata->boost_current_limit = 2750;
> > +
> > +	of_node_put(np);
> > +	return pdata;
> > +}
> > +#else
> > +static struct sky81452_bl_platform_data *sky81452_bl_parse_dt(
> > +							struct device *dev)
> > +{
> > +	return ERR_PTR(-EINVAL);
> > +}
> > +#endif
> > +
> > +static int sky81452_bl_init_device(struct regmap *regmap,
> > +		struct sky81452_bl_platform_data *pdata)
> > +{
> > +	unsigned int value;
> > +
> > +	value = pdata->ignore_pwm ? SKY81452_IGPW : 0;
> > +	value |= pdata->dpwm_mode ? SKY81452_PWMMD : 0;
> > +	value |= pdata->phase_shift ? 0 : SKY81452_PHASE;
> > +
> > +	if (pdata->boost_current_limit = 2300)
> > +		value |= SKY81452_ILIM;
> > +	else if (pdata->boost_current_limit != 2750)
> > +		return -EINVAL;
> > +
> > +	if (pdata->short_detection_threshold < 4 ||
> > +				pdata->short_detection_threshold > 7)
> > +		return -EINVAL;
> > +	value |= (7 - pdata->short_detection_threshold) << CTZ(SKY81452_VSHRT);
> > +
> > +	return regmap_write(regmap, SKY81452_REG2, value);
> > +}
> > +
> > +static int sky81452_bl_probe(struct platform_device *pdev)
> > +{
> > +	struct device *dev = &pdev->dev;
> > +	struct regmap *regmap = dev_get_drvdata(dev->parent);
> > +	struct sky81452_bl_platform_data *pdata = dev_get_platdata(dev);
> > +	struct backlight_device *bd;
> > +	struct backlight_properties props;
> > +	const char *name;
> > +	int ret;
> > +
> > +	if (!pdata) {
> > +		pdata = sky81452_bl_parse_dt(dev);
> > +		if (IS_ERR(pdata))
> > +			return PTR_ERR(pdata);
> > +	}
> > +
> > +	if (gpio_is_valid(pdata->gpio_enable)) {
> > +		ret = devm_gpio_request_one(dev, pdata->gpio_enable,
> > +					GPIOF_OUT_INIT_HIGH, "sky81452-en");
> > +		if (IS_ERR_VALUE(ret)) {
> > +			dev_err(dev, "failed to request GPIO. err=%d\n", ret);
> > +			return ret;
> > +		}
> > +	}
> > +
> > +	ret = sky81452_bl_init_device(regmap, pdata);
> > +	if (IS_ERR_VALUE(ret)) {
> > +		dev_err(dev, "failed to initialize. err=%d\n", ret);
> > +		return ret;
> > +	}
> > +
> > +	memset(&props, 0, sizeof(props));
> > +	props.max_brightness = SKY81452_MAX_BRIGHTNESS,
> > +	name = pdata->name ? pdata->name : SKY81452_DEFAULT_NAME;
> > +	bd = devm_backlight_device_register(dev, name, dev, regmap,
> > +						&sky81452_bl_ops, &props);
> > +	if (IS_ERR(bd)) {
> > +		dev_err(dev, "failed to register. err=%ld\n", PTR_ERR(bd));
> > +		return PTR_ERR(bd);
> > +	}
> > +
> > +	platform_set_drvdata(pdev, bd);
> > +
> > +	ret  = sysfs_create_group(&bd->dev.kobj, &sky81452_bl_attr_group);
> > +	if (IS_ERR_VALUE(ret)) {
> > +		dev_err(dev, "failed to create attribute. err=%d\n", ret);
> > +		return ret;
> > +	}
> > +
> > +	return ret;
> > +}
> > +
> > +static int sky81452_bl_remove(struct platform_device *pdev)
> > +{
> > +	const struct sky81452_bl_platform_data *pdata > > +						dev_get_platdata(&pdev->dev);
> > +	struct backlight_device *bd = platform_get_drvdata(pdev);
> > +
> > +	sysfs_remove_group(&bd->dev.kobj, &sky81452_bl_attr_group);
> > +
> > +	bd->props.power = FB_BLANK_UNBLANK;
> > +	bd->props.brightness = 0;
> > +	backlight_update_status(bd);
> > +
> > +	if (gpio_is_valid(pdata->gpio_enable))
> > +		gpio_set_value_cansleep(pdata->gpio_enable, 0);
> > +
> > +	return 0;
> > +}
> > +
> > +#ifdef CONFIG_OF
> > +static const struct of_device_id sky81452_bl_of_match[] = {
> > +	{ .compatible = "skyworks,sky81452-backlight", },
> > +	{ }
> > +};
> > +MODULE_DEVICE_TABLE(of, sky81452_bl_of_match);
> > +#endif
> > +
> > +static struct platform_driver sky81452_bl_driver = {
> > +	.driver = {
> > +		.name = "sky81452-backlight",
> > +		.of_match_table = of_match_ptr(sky81452_bl_of_match),
> > +	},
> > +	.probe = sky81452_bl_probe,
> > +	.remove = sky81452_bl_remove,
> > +};
> > +
> > +module_platform_driver(sky81452_bl_driver);
> > +
> > +MODULE_DESCRIPTION("Skyworks SKY81452 backlight driver");
> > +MODULE_AUTHOR("Gyungoh Yoo <jack.yoo@skyworksinc.com>");
> > +MODULE_LICENSE("GPL v2");
> > diff --git a/include/linux/platform_data/sky81452-backlight.h b/include/linux/platform_data/sky81452-
> > backlight.h
> > new file mode 100644
> > index 0000000..1231e9b
> > --- /dev/null
> > +++ b/include/linux/platform_data/sky81452-backlight.h
> > @@ -0,0 +1,46 @@
> > +/*
> > + * sky81452.h	SKY81452 backlight driver
> > + *
> > + * Copyright 2014 Skyworks Solutions Inc.
> > + * Author : Gyungoh Yoo <jack.yoo@skyworksinc.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.
> > + *
> > + * This program is distributed in the hope that it will be useful, but
> > + * WITHOUT ANY WARRANTY; without even the implied warranty of
> > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> > + * General Public License for more details.
> > + *
> > + * You should have received a copy of the GNU General Public License along
> > + * with this program; if not, see <http://www.gnu.org/licenses/>.
> > + */
> > +
> > +#ifndef _SKY81452_BACKLIGHT_H
> > +#define _SKY81452_BACKLIGHT_H
> > +
> > +/**
> > + * struct sky81452_platform_data
> > + * @name:	backlight driver name.
> > +		If it is not defined, default name is lcd-backlight.
> > + * @gpio_enable:GPIO number which control EN pin
> > + * @enable:	Enable mask for current sink channel 1, 2, 3, 4, 5 and 6.
> > + * @ignore_pwm:	true if DPWMI should be ignored.
> > + * @dpwm_mode:	true is DPWM dimming mode, otherwise Analog dimming mode.
> > + * @phase_shift:true is phase shift mode.
> > + * @short_detecion_threshold:	It should be one of 4, 5, 6 and 7V.
> > + * @boost_current_limit:	It should be one of 2300, 2750mA.
> > + */
> > +struct sky81452_bl_platform_data {
> > +	const char *name;
> > +	int gpio_enable;
> > +	unsigned int enable;
> > +	bool ignore_pwm;
> > +	bool dpwm_mode;
> > +	bool phase_shift;
> > +	unsigned int short_detection_threshold;
> > +	unsigned int boost_current_limit;
> > +};
> > +
> > +#endif
> > --
> > 1.9.1
> 

  reply	other threads:[~2014-12-18  6:13 UTC|newest]

Thread overview: 111+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-12-18  5:47 [PATCH v10 0/6] Add Skyworks SKY81452 device drivers gyungoh
2014-12-18  5:47 ` gyungoh
2014-12-18  5:47 ` gyungoh-Re5JQEeQqe8AvxtiuMwx3w
2014-12-18  5:47 ` [PATCH v10 1/6] mfd: Add support for Skyworks SKY81452 driver gyungoh
2014-12-18  5:47   ` gyungoh
2014-12-18  5:47   ` gyungoh-Re5JQEeQqe8AvxtiuMwx3w
2014-12-18  5:47 ` [PATCH v10 2/6] backlight: Add support Skyworks SKY81452 backlight driver gyungoh
2014-12-18  5:47   ` gyungoh
2014-12-18  6:09   ` Jingoo Han
2014-12-18  6:09     ` Jingoo Han
2014-12-18  6:09     ` Jingoo Han
2014-12-18  6:13     ` Gyungoh Yoo [this message]
2014-12-18  6:13       ` Gyungoh Yoo
2014-12-18  6:13       ` Gyungoh Yoo
2014-12-18  5:47 ` [PATCH v10 3/6] devicetree: mfd: Add new SKY81452 mfd binding gyungoh
2014-12-18  5:47   ` gyungoh
2014-12-18  8:32   ` Lee Jones
2014-12-18  8:32     ` Lee Jones
2014-12-18  5:47 ` [PATCH v10 4/6] devicetree: backlight: Add new SKY81452 backlight binding gyungoh
2014-12-18  5:47   ` gyungoh
2014-12-18  8:30   ` Lee Jones
2014-12-18  8:30     ` Lee Jones
2014-12-18  5:47 ` [PATCH v10 5/6] devicetree: Add vendor prefix for Skyworks Solutions, Inc gyungoh
2014-12-18  5:47   ` gyungoh
2014-12-18  8:29   ` Lee Jones
2014-12-18  8:29     ` Lee Jones
2014-12-18  5:47 ` [PATCH v10 6/6] devicetree: i2c: Add SKY81452 to the Trivial Devices list gyungoh
2014-12-18  5:47   ` gyungoh
  -- strict thread matches above, loose matches on Subject: below --
2015-02-05  6:29 [PATCH v10 0/6] Add Skyworks SKY81452 device drivers gyungoh
2015-02-05  6:29 ` gyungoh
2015-02-05  6:29 ` [PATCH v10 1/6] mfd: Add support for Skyworks SKY81452 driver gyungoh
2015-02-05  6:29   ` gyungoh
2015-02-05  6:34 ` [PATCH v10 0/6] Add Skyworks SKY81452 device drivers Gyungoh Yoo
2015-02-05  6:34   ` Gyungoh Yoo
2015-02-05  6:34   ` Gyungoh Yoo
2015-01-23  6:28 gyungoh
2015-01-23  6:28 ` gyungoh
2015-01-23  6:28 ` gyungoh-Re5JQEeQqe8AvxtiuMwx3w
2015-01-23  6:28 ` [PATCH v10 1/6] mfd: Add support for Skyworks SKY81452 driver gyungoh
2015-01-23  6:28   ` gyungoh
2015-01-23  6:28 ` [PATCH v10 2/6] backlight: Add support Skyworks SKY81452 backlight driver gyungoh
2015-01-23  6:28   ` gyungoh
2015-01-23  6:28 ` [PATCH v10 3/6] devicetree: Add new SKY81452 mfd binding gyungoh
2015-01-23  6:28   ` gyungoh
2015-01-23  6:28 ` [PATCH v10 4/6] devicetree: Add new SKY81452 backlight binding gyungoh
2015-01-23  6:28   ` gyungoh
2015-01-27  7:02   ` Gyungoh Yoo
2015-01-27  7:02     ` Gyungoh Yoo
2015-02-04 15:11   ` Rob Herring
2015-02-04 15:11     ` Rob Herring
2015-02-04 15:11     ` Rob Herring
2015-02-05  4:59     ` Gyungoh Yoo
2015-02-05  4:59       ` Gyungoh Yoo
2015-02-05  4:59       ` Gyungoh Yoo
2015-02-05 13:22       ` Rob Herring
2015-01-23  6:28 ` [PATCH v10 5/6] devicetree: Add vendor prefix for Skyworks Solutions, Inc gyungoh
2015-01-23  6:28   ` gyungoh
2015-01-23  6:28   ` gyungoh-Re5JQEeQqe8AvxtiuMwx3w
2015-01-23  6:28 ` [PATCH v10 6/6] devicetree: i2c: Add SKY81452 to the Trivial Devices list gyungoh
2015-01-23  6:28   ` gyungoh
2015-01-07  2:19 [PATCH v10 0/6] Add Skyworks SKY81452 device drivers gyungoh
2015-01-07  2:19 ` gyungoh
2015-01-07  2:19 ` [PATCH v10 1/6] mfd: Add support for Skyworks SKY81452 driver gyungoh
2015-01-07  2:19   ` gyungoh
2015-01-07  2:19 ` [PATCH v10 2/6] backlight: Add support Skyworks SKY81452 backlight driver gyungoh
2015-01-07  2:19   ` gyungoh
2015-01-07  2:19 ` [PATCH v10 3/6] devicetree: mfd: Add new SKY81452 mfd binding gyungoh
2015-01-07  2:19   ` gyungoh
2015-01-09  1:30   ` Gyungoh Yoo
2015-01-09  1:30     ` Gyungoh Yoo
2015-01-09  1:30     ` Gyungoh Yoo
2015-01-07  2:19 ` [PATCH v10 4/6] devicetree: backlight: Add new SKY81452 backlight binding gyungoh
2015-01-07  2:19   ` gyungoh
2015-01-09  1:31   ` Gyungoh Yoo
2015-01-09  1:31     ` Gyungoh Yoo
2015-01-07  2:19 ` [PATCH v10 5/6] devicetree: Add vendor prefix for Skyworks Solutions, Inc gyungoh
2015-01-07  2:19   ` gyungoh
2015-01-07  2:19 ` [PATCH v10 6/6] devicetree: i2c: Add SKY81452 to the Trivial Devices list gyungoh
2015-01-07  2:19   ` gyungoh
2015-01-07  2:19   ` gyungoh-Re5JQEeQqe8AvxtiuMwx3w
2015-01-18 17:40 ` [PATCH v10 0/6] Add Skyworks SKY81452 device drivers Lee Jones
2015-01-18 17:40   ` Lee Jones
2015-01-18 17:40   ` Lee Jones
2015-01-19  1:41   ` Gyungoh Yoo
2015-01-19  1:41     ` Gyungoh Yoo
2015-01-19  1:41     ` Gyungoh Yoo
2015-01-19  8:10     ` Lee Jones
2015-01-19  8:10       ` Lee Jones
2015-01-19  8:10       ` Lee Jones
2014-12-03  7:05 gyungoh
2014-12-03  7:05 ` gyungoh
2014-12-03  7:05 ` gyungoh-Re5JQEeQqe8AvxtiuMwx3w
2014-12-03  7:05 ` [PATCH v10 1/6] mfd: Add support for Skyworks SKY81452 driver gyungoh
2014-12-03  7:05   ` gyungoh
2014-12-03  7:05 ` [PATCH v10 2/6] backlight: Add support Skyworks SKY81452 backlight driver gyungoh
2014-12-03  7:05   ` gyungoh
2014-12-03  7:13   ` Jingoo Han
2014-12-03  7:13     ` Jingoo Han
2014-12-03 10:02   ` Oliver Neukum
2014-12-03 10:02     ` Oliver Neukum
2014-12-04  2:04     ` Gyungoh Yoo
2014-12-04  2:04       ` Gyungoh Yoo
2014-12-04  2:04       ` Gyungoh Yoo
2014-12-03  7:05 ` [PATCH v10 3/6] devicetree: mfd: Add new SKY81452 mfd binding gyungoh
2014-12-03  7:05   ` gyungoh
2014-12-03  7:05 ` [PATCH v10 4/6] devicetree: backlight: Add new SKY81452 backlight binding gyungoh
2014-12-03  7:05   ` gyungoh
2014-12-03  7:05 ` [PATCH v10 5/6] devicetree: Add vendor prefix for Skyworks Solutions, Inc gyungoh
2014-12-03  7:05   ` gyungoh
2014-12-03  7:05 ` [PATCH v10 6/6] devicetree: i2c: Add SKY81452 to the Trivial Devices list gyungoh
2014-12-03  7:05   ` gyungoh

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=20141218061324.GA3107@jack-ThinkPad-T520 \
    --to=gyungoh@gmail.com \
    --cc=akpm@linux-foundation.org \
    --cc=andrew@lunn.ch \
    --cc=antonynpavlov@gmail.com \
    --cc=broonie@kernel.org \
    --cc=cooloney@gmail.com \
    --cc=devicetree@vger.kernel.org \
    --cc=florian.vaussard@epfl.ch \
    --cc=galak@codeaurora.org \
    --cc=grant.likely@linaro.org \
    --cc=heiko@sntech.de \
    --cc=hs@denx.de \
    --cc=hytszk@gmail.com \
    --cc=ijc+devicetree@hellion.org.uk \
    --cc=jack.yoo@skyworksinc.com \
    --cc=jason@lakedaemon.net \
    --cc=jg1.han@samsung.com \
    --cc=jic23@kernel.org \
    --cc=ktsai@capellamicro.com \
    --cc=lee.jones@linaro.org \
    --cc=linux-fbdev@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mark.rutland@arm.com \
    --cc=matti.vaittinen@nsn.com \
    --cc=pawel.moll@arm.com \
    --cc=plagnioj@jcrosoft.com \
    --cc=robh+dt@kernel.org \
    --cc=sameo@linux.intel.com \
    --cc=shawn.guo@freescale.com \
    --cc=stwiss.opensource@diasemi.com \
    --cc=thomas.petazzoni@free-electrons.com \
    --cc=tomi.valkeinen@ti.com \
    --cc=trivial@kernel.org \
    /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.