All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v9 0/8] Add Skyworks SKY81452 device drivers
@ 2014-12-02  8:05 ` gyungoh-Re5JQEeQqe8AvxtiuMwx3w
  0 siblings, 0 replies; 24+ messages in thread
From: gyungoh @ 2014-12-02  8:05 UTC (permalink / raw)
  To: sameo, lee.jones, jg1.han, cooloney, broonie, lgirdwood
  Cc: jack.yoo, linux-kernel, devicetree, grant.likely, robh+dt,
	mark.rutland, ijc+devicetree, galak, pawel.moll, heiko, jason,
	treding, florian.vaussard, trivial, linux, andrew, jic23

From: Gyungoh Yoo <jack.yoo@skyworksinc.com>

This patch set includes regulator and backlight driver for SKY81452.
Also it includes documents for device tree and module.
The initial version of sky81452-regulator was applied. Fo this, incremental
patches are included.

v9:
Removed the change to remove MODULE_VERSION() for sky81452-regulator

v8:
Renamed property names for backlight with vendor prefix
Modified gpio-enable property to generic property for GPIO
Made up the example for backlight DT
Changed the DT parsing of regulator using regulator_node and of_match

v7:
Modified licensing text to GPLv2
Splitted Kconfig renaming from DT patch

v6:
Added new line character at the end of line of dev_err()

v5:
Changed DT for regulator : 'lout' node should be defined under 'regulator'
Removed compatible string from sky81452-regulator driver
Modified sky81452-regulator to return EINVAL when of_node is NULL
Move sky81452-backlight.h to include/linux/platform_data

v4:
Removed MODULE_VERSION()
Modified license to GPLv2
Removed calling to backlight_device_unregister() in sky81452-backlight

v3:
Cleaned-up DBG messages
Cleaned-up DT
Fixed the backlight name from 'sky81452-bl' to 'sky81452-backlight'
Assigned mfd_cell.of_compatible for binding device node
Modified error messages
Modified sky81452-regulator to return ENODATA when of_node is NULL

v2:
Split the patches for each sub-system
Added 'reg' attribute for I2C address in device tree documents
Added 'compatible' attribute in child drivers
Renamed CONFIG_SKY81452 to CONFIG_MFD_SKY81452
Changed the dependency from I2C=y to I2C, for CONFIG_MFD_SKY81452
Added message for exception or errors.
Added vendor prefix for Skyworks Solutions, Inc.
Add SKY81452 to the Trivial Devices list


Gyungoh Yoo (8):
  mfd: Add support for Skyworks SKY81452 driver
  backlight: Add support Skyworks SKY81452 backlight driver
  devicetree: mfd: Add new SKY81452 mfd binding
  devicetree: backlight: Add new SKY81452 backlight binding
  devicetree: Add vendor prefix for Skyworks Solutions, Inc.
  devicetree: i2c: Add SKY81452 to the Trivial Devices list
  regulator: sky81452: Modify Device Tree structure
  devicetree: regulator: sky81452: Modify Device Tree structure

 .../devicetree/bindings/i2c/trivial-devices.txt    |   1 +
 Documentation/devicetree/bindings/mfd/sky81452.txt |  36 +++
 .../bindings/regulator/sky81452-regulator.txt      |  10 +-
 .../devicetree/bindings/vendor-prefixes.txt        |   1 +
 .../video/backlight/sky81452-backlight.txt         |  29 ++
 drivers/mfd/Kconfig                                |  12 +
 drivers/mfd/Makefile                               |   1 +
 drivers/mfd/sky81452.c                             | 108 +++++++
 drivers/regulator/sky81452-regulator.c             |  45 +--
 drivers/video/backlight/Kconfig                    |  10 +
 drivers/video/backlight/Makefile                   |   1 +
 drivers/video/backlight/sky81452-backlight.c       | 340 +++++++++++++++++++++
 include/linux/mfd/sky81452.h                       |  31 ++
 include/linux/platform_data/sky81452-backlight.h   |  46 +++
 14 files changed, 631 insertions(+), 40 deletions(-)
 create mode 100644 Documentation/devicetree/bindings/mfd/sky81452.txt
 create mode 100644 Documentation/devicetree/bindings/video/backlight/sky81452-backlight.txt
 create mode 100644 drivers/mfd/sky81452.c
 create mode 100644 drivers/video/backlight/sky81452-backlight.c
 create mode 100644 include/linux/mfd/sky81452.h
 create mode 100644 include/linux/platform_data/sky81452-backlight.h

-- 
1.9.1


^ permalink raw reply	[flat|nested] 24+ messages in thread

* [PATCH v9 0/8] Add Skyworks SKY81452 device drivers
@ 2014-12-02  8:05 ` gyungoh-Re5JQEeQqe8AvxtiuMwx3w
  0 siblings, 0 replies; 24+ messages in thread
From: gyungoh-Re5JQEeQqe8AvxtiuMwx3w @ 2014-12-02  8:05 UTC (permalink / raw)
  To: sameo-VuQAYsv1563Yd54FQh9/CA, lee.jones-QSEj5FYQhm4dnm+yROfE0A,
	jg1.han-Sze3O3UU22JBDgjK7y7TUQ, cooloney-Re5JQEeQqe8AvxtiuMwx3w,
	broonie-DgEjT+Ai2ygdnm+yROfE0A, lgirdwood-Re5JQEeQqe8AvxtiuMwx3w
  Cc: jack.yoo-tjhQNA90jdKqndwCJWfcng,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA,
	devicetree-u79uwXL29TY76Z2rM5mHXA,
	grant.likely-QSEj5FYQhm4dnm+yROfE0A,
	robh+dt-DgEjT+Ai2ygdnm+yROfE0A, mark.rutland-5wv7dgnIgG8,
	ijc+devicetree-KcIKpvwj1kUDXYZnReoRVg,
	galak-sgV2jX0FEOL9JmXXK+q4OQ, pawel.moll-5wv7dgnIgG8,
	heiko-4mtYJXux2i+zQB+pC5nmwQ, jason-NLaQJdtUoK4Be96aLqz0jA,
	treding-DDmLM1+adcrQT0dZR+AlfA, florian.vaussard-p8DiymsW2f8,
	trivial-DgEjT+Ai2ygdnm+yROfE0A, linux-0h96xk9xTtrk1uMJSBkQmQ,
	andrew-g2DYL2Zd6BY, jic23-DgEjT+Ai2ygdnm+yROfE0A

From: Gyungoh Yoo <jack.yoo-tjhQNA90jdKqndwCJWfcng@public.gmane.org>

This patch set includes regulator and backlight driver for SKY81452.
Also it includes documents for device tree and module.
The initial version of sky81452-regulator was applied. Fo this, incremental
patches are included.

v9:
Removed the change to remove MODULE_VERSION() for sky81452-regulator

v8:
Renamed property names for backlight with vendor prefix
Modified gpio-enable property to generic property for GPIO
Made up the example for backlight DT
Changed the DT parsing of regulator using regulator_node and of_match

v7:
Modified licensing text to GPLv2
Splitted Kconfig renaming from DT patch

v6:
Added new line character at the end of line of dev_err()

v5:
Changed DT for regulator : 'lout' node should be defined under 'regulator'
Removed compatible string from sky81452-regulator driver
Modified sky81452-regulator to return EINVAL when of_node is NULL
Move sky81452-backlight.h to include/linux/platform_data

v4:
Removed MODULE_VERSION()
Modified license to GPLv2
Removed calling to backlight_device_unregister() in sky81452-backlight

v3:
Cleaned-up DBG messages
Cleaned-up DT
Fixed the backlight name from 'sky81452-bl' to 'sky81452-backlight'
Assigned mfd_cell.of_compatible for binding device node
Modified error messages
Modified sky81452-regulator to return ENODATA when of_node is NULL

v2:
Split the patches for each sub-system
Added 'reg' attribute for I2C address in device tree documents
Added 'compatible' attribute in child drivers
Renamed CONFIG_SKY81452 to CONFIG_MFD_SKY81452
Changed the dependency from I2C=y to I2C, for CONFIG_MFD_SKY81452
Added message for exception or errors.
Added vendor prefix for Skyworks Solutions, Inc.
Add SKY81452 to the Trivial Devices list


Gyungoh Yoo (8):
  mfd: Add support for Skyworks SKY81452 driver
  backlight: Add support Skyworks SKY81452 backlight driver
  devicetree: mfd: Add new SKY81452 mfd binding
  devicetree: backlight: Add new SKY81452 backlight binding
  devicetree: Add vendor prefix for Skyworks Solutions, Inc.
  devicetree: i2c: Add SKY81452 to the Trivial Devices list
  regulator: sky81452: Modify Device Tree structure
  devicetree: regulator: sky81452: Modify Device Tree structure

 .../devicetree/bindings/i2c/trivial-devices.txt    |   1 +
 Documentation/devicetree/bindings/mfd/sky81452.txt |  36 +++
 .../bindings/regulator/sky81452-regulator.txt      |  10 +-
 .../devicetree/bindings/vendor-prefixes.txt        |   1 +
 .../video/backlight/sky81452-backlight.txt         |  29 ++
 drivers/mfd/Kconfig                                |  12 +
 drivers/mfd/Makefile                               |   1 +
 drivers/mfd/sky81452.c                             | 108 +++++++
 drivers/regulator/sky81452-regulator.c             |  45 +--
 drivers/video/backlight/Kconfig                    |  10 +
 drivers/video/backlight/Makefile                   |   1 +
 drivers/video/backlight/sky81452-backlight.c       | 340 +++++++++++++++++++++
 include/linux/mfd/sky81452.h                       |  31 ++
 include/linux/platform_data/sky81452-backlight.h   |  46 +++
 14 files changed, 631 insertions(+), 40 deletions(-)
 create mode 100644 Documentation/devicetree/bindings/mfd/sky81452.txt
 create mode 100644 Documentation/devicetree/bindings/video/backlight/sky81452-backlight.txt
 create mode 100644 drivers/mfd/sky81452.c
 create mode 100644 drivers/video/backlight/sky81452-backlight.c
 create mode 100644 include/linux/mfd/sky81452.h
 create mode 100644 include/linux/platform_data/sky81452-backlight.h

-- 
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

^ permalink raw reply	[flat|nested] 24+ messages in thread

* [PATCH v9 1/8] mfd: Add support for Skyworks SKY81452 driver
  2014-12-02  8:05 ` gyungoh-Re5JQEeQqe8AvxtiuMwx3w
  (?)
@ 2014-12-02  8:05 ` gyungoh
  -1 siblings, 0 replies; 24+ messages in thread
From: gyungoh @ 2014-12-02  8:05 UTC (permalink / raw)
  To: sameo, lee.jones, jg1.han, cooloney, broonie, lgirdwood
  Cc: jack.yoo, linux-kernel, devicetree, grant.likely, robh+dt,
	mark.rutland, ijc+devicetree, galak, pawel.moll, heiko, jason,
	treding, florian.vaussard, trivial, linux, andrew, jic23

From: Gyungoh Yoo <jack.yoo@skyworksinc.com>

Signed-off-by: Gyungoh Yoo <jack.yoo@skyworksinc.com>
Acked-by: Lee Jones <lee.jones@linaro.org>
---
Changes v9:
Nothing

Changes v8:
Nothing

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:
Removed MODULE_VERSION()
Modified license to GPLv2

Changes v3:
Fixed the backlight name from 'sky81452-bl' to 'sky81452-backlight'
Assigned mfd_cell.of_compatible for binding device node
Modified error messages

Changes v2:
Renamed CONFIG_SKY81452 to CONFIG_MFD_SKY81452
Changed the dependency from I2C=y to I2C, for CONFIG_MFD_SKY81452
Added message for exception or errors

 drivers/mfd/Kconfig          |  12 +++++
 drivers/mfd/Makefile         |   1 +
 drivers/mfd/sky81452.c       | 108 +++++++++++++++++++++++++++++++++++++++++++
 include/linux/mfd/sky81452.h |  31 +++++++++++++
 4 files changed, 152 insertions(+)
 create mode 100644 drivers/mfd/sky81452.c
 create mode 100644 include/linux/mfd/sky81452.h

diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
index 1456ea7..a54244c 100644
--- a/drivers/mfd/Kconfig
+++ b/drivers/mfd/Kconfig
@@ -693,6 +693,18 @@ config MFD_SM501_GPIO
 	 lines on the SM501. The platform data is used to supply the
 	 base number for the first GPIO line to register.
 
+config MFD_SKY81452
+	tristate "Skyworks Solutions SKY81452"
+	select MFD_CORE
+	select REGMAP_I2C
+	depends on I2C
+	help
+	  This is the core driver for the Skyworks SKY81452 backlight and
+	  voltage regulator device.
+
+	  This driver can also be built as a module.  If so, the module
+	  will be called sky81452.
+
 config MFD_SMSC
        bool "SMSC ECE1099 series chips"
        depends on I2C=y
diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile
index 8bd54b1..d9683ea 100644
--- a/drivers/mfd/Makefile
+++ b/drivers/mfd/Makefile
@@ -174,6 +174,7 @@ obj-$(CONFIG_MFD_STW481X)	+= stw481x.o
 obj-$(CONFIG_MFD_IPAQ_MICRO)	+= ipaq-micro.o
 obj-$(CONFIG_MFD_MENF21BMC)	+= menf21bmc.o
 obj-$(CONFIG_MFD_HI6421_PMIC)	+= hi6421-pmic-core.o
+obj-$(CONFIG_MFD_SKY81452)		+= sky81452.o
 
 intel-soc-pmic-objs		:= intel_soc_pmic_core.o intel_soc_pmic_crc.o
 obj-$(CONFIG_INTEL_SOC_PMIC)	+= intel-soc-pmic.o
diff --git a/drivers/mfd/sky81452.c b/drivers/mfd/sky81452.c
new file mode 100644
index 0000000..b0c9b04
--- /dev/null
+++ b/drivers/mfd/sky81452.c
@@ -0,0 +1,108 @@
+/*
+ * sky81452.c	SKY81452 MFD 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/kernel.h>
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/err.h>
+#include <linux/slab.h>
+#include <linux/i2c.h>
+#include <linux/regmap.h>
+#include <linux/mfd/core.h>
+#include <linux/mfd/sky81452.h>
+
+static const struct regmap_config sky81452_config = {
+	.reg_bits = 8,
+	.val_bits = 8,
+};
+
+static int sky81452_probe(struct i2c_client *client,
+				const struct i2c_device_id *id)
+{
+	struct device *dev = &client->dev;
+	const struct sky81452_platform_data *pdata = dev_get_platdata(dev);
+	struct mfd_cell cells[2];
+	struct regmap *regmap;
+	int ret;
+
+	if (!pdata) {
+		pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL);
+		if (!pdata)
+			return -ENOMEM;
+	}
+
+	regmap = devm_regmap_init_i2c(client, &sky81452_config);
+	if (IS_ERR(regmap)) {
+		dev_err(dev, "failed to initialize.err=%ld\n", PTR_ERR(regmap));
+		return PTR_ERR(regmap);
+	}
+
+	i2c_set_clientdata(client, regmap);
+
+	memset(cells, 0, sizeof(cells));
+	cells[0].name = "sky81452-backlight";
+	cells[0].of_compatible = "skyworks,sky81452-backlight";
+	cells[0].platform_data = pdata->bl_pdata;
+	cells[0].pdata_size = sizeof(*pdata->bl_pdata);
+	cells[1].name = "sky81452-regulator";
+	cells[1].platform_data = pdata->regulator_init_data;
+	cells[1].pdata_size = sizeof(*pdata->regulator_init_data);
+
+	ret = mfd_add_devices(dev, -1, cells, ARRAY_SIZE(cells), NULL, 0, NULL);
+	if (ret)
+		dev_err(dev, "failed to add child devices. err=%d\n", ret);
+
+	return ret;
+}
+
+static int sky81452_remove(struct i2c_client *client)
+{
+	mfd_remove_devices(&client->dev);
+	return 0;
+}
+
+static const struct i2c_device_id sky81452_ids[] = {
+	{ "sky81452" },
+	{ }
+};
+MODULE_DEVICE_TABLE(i2c, sky81452_ids);
+
+#ifdef CONFIG_OF
+static const struct of_device_id sky81452_of_match[] = {
+	{ .compatible = "skyworks,sky81452", },
+	{ }
+};
+MODULE_DEVICE_TABLE(of, sky81452_of_match);
+#endif
+
+static struct i2c_driver sky81452_driver = {
+	.driver = {
+		.name = "sky81452",
+		.of_match_table = of_match_ptr(sky81452_of_match),
+	},
+	.probe = sky81452_probe,
+	.remove = sky81452_remove,
+	.id_table = sky81452_ids,
+};
+
+module_i2c_driver(sky81452_driver);
+
+MODULE_DESCRIPTION("Skyworks SKY81452 MFD driver");
+MODULE_AUTHOR("Gyungoh Yoo <jack.yoo@skyworksinc.com>");
+MODULE_LICENSE("GPL v2");
diff --git a/include/linux/mfd/sky81452.h b/include/linux/mfd/sky81452.h
new file mode 100644
index 0000000..b0925fa
--- /dev/null
+++ b/include/linux/mfd/sky81452.h
@@ -0,0 +1,31 @@
+/*
+ * sky81452.h	SKY81452 MFD 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_H
+#define _SKY81452_H
+
+#include <linux/platform_data/sky81452-backlight.h>
+#include <linux/regulator/machine.h>
+
+struct sky81452_platform_data {
+	struct sky81452_bl_platform_data *bl_pdata;
+	struct regulator_init_data *regulator_init_data;
+};
+
+#endif
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 24+ messages in thread

* [PATCH v9 2/8] backlight: Add support Skyworks SKY81452 backlight driver
  2014-12-02  8:05 ` gyungoh-Re5JQEeQqe8AvxtiuMwx3w
  (?)
  (?)
@ 2014-12-02  8:05 ` gyungoh
  2014-12-02 22:22   ` Bryan Wu
  2014-12-03  2:19     ` Jingoo Han
  -1 siblings, 2 replies; 24+ messages in thread
From: gyungoh @ 2014-12-02  8:05 UTC (permalink / raw)
  To: sameo, lee.jones, jg1.han, cooloney, broonie, lgirdwood
  Cc: jack.yoo, linux-kernel, devicetree, grant.likely, robh+dt,
	mark.rutland, ijc+devicetree, galak, pawel.moll, heiko, jason,
	treding, florian.vaussard, trivial, linux, andrew, jic23

From: Gyungoh Yoo <jack.yoo@skyworksinc.com>

Signed-off-by: Gyungoh Yoo <jack.yoo@skyworksinc.com>
---
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     | 340 +++++++++++++++++++++++
 include/linux/platform_data/sky81452-backlight.h |  46 +++
 4 files changed, 397 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..45e575f
--- /dev/null
+++ b/drivers/video/backlight/sky81452-backlight.c
@@ -0,0 +1,340 @@
+/*
+ * 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 int sky81452_bl_get_brightness(struct backlight_device *bd)
+{
+	return bd->props.brightness;
+}
+
+static const struct backlight_ops sky81452_bl_ops = {
+	.update_status = sky81452_bl_update_status,
+	.get_brightness = sky81452_bl_get_brightness,
+};
+
+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


^ permalink raw reply related	[flat|nested] 24+ messages in thread

* [PATCH v9 3/8] devicetree: mfd: Add new SKY81452 mfd binding
  2014-12-02  8:05 ` gyungoh-Re5JQEeQqe8AvxtiuMwx3w
                   ` (2 preceding siblings ...)
  (?)
@ 2014-12-02  8:05 ` gyungoh
  2014-12-02 14:07   ` Lee Jones
  -1 siblings, 1 reply; 24+ messages in thread
From: gyungoh @ 2014-12-02  8:05 UTC (permalink / raw)
  To: sameo, lee.jones, jg1.han, cooloney, broonie, lgirdwood
  Cc: jack.yoo, linux-kernel, devicetree, grant.likely, robh+dt,
	mark.rutland, ijc+devicetree, galak, pawel.moll, heiko, jason,
	treding, florian.vaussard, trivial, linux, andrew, jic23

From: Gyungoh Yoo <jack.yoo@skyworksinc.com>

Signed-off-by: Gyungoh Yoo <jack.yoo@skyworksinc.com>
---
Changes v9:
Nothing

Changes v8:
Made up the example for backlight DT

Changes v7:
Nothing

Changes v6:
Nothing

Changes v5:
Changed DT for regulator : 'lout' node should be defined under 'regulator'
Removed compatible string from sky81452-regulator driver

Changes v4:
Nothing

Changes v3:
Nothing

Changes v2:
Added reg attribute for I2C slave address

 Documentation/devicetree/bindings/mfd/sky81452.txt | 36 ++++++++++++++++++++++
 1 file changed, 36 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/mfd/sky81452.txt

diff --git a/Documentation/devicetree/bindings/mfd/sky81452.txt b/Documentation/devicetree/bindings/mfd/sky81452.txt
new file mode 100644
index 0000000..ab71473
--- /dev/null
+++ b/Documentation/devicetree/bindings/mfd/sky81452.txt
@@ -0,0 +1,36 @@
+SKY81452 bindings
+
+Required properties:
+- compatible	: Must be "skyworks,sky81452"
+- reg		: I2C slave address
+
+Required child nodes:
+- backlight	: container node for backlight following the binding
+		in video/backlight/sky81452-backlight.txt
+- regulator	: container node for regulators following the binding
+		in regulator/sky81452-regulator.txt
+
+Example:
+
+	sky81452@2c {
+		compatible = "skyworks,sky81452";
+		reg = <0x2c>;
+
+		backlight {
+			compatible = "skyworks,sky81452-backlight";
+			name = "pwm-backlight";
+			skyworks,en-channels = <0x3f>;
+			skyworks,ignore-pwm;
+			skyworks,phase-shift;
+			skyworks,ovp-level = <20>;
+			skyworks,current-limit = <2300>;
+		};
+
+		regulator {
+			lout {
+				regulator-name = "sky81452-lout";
+				regulator-min-microvolt = <4500000>;
+				regulator-max-microvolt = <8000000>;
+			};
+		};
+	};
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 24+ messages in thread

* [PATCH v9 4/8] devicetree: backlight: Add new SKY81452 backlight binding
  2014-12-02  8:05 ` gyungoh-Re5JQEeQqe8AvxtiuMwx3w
                   ` (3 preceding siblings ...)
  (?)
@ 2014-12-02  8:05 ` gyungoh
  2014-12-02 22:24   ` Bryan Wu
  -1 siblings, 1 reply; 24+ messages in thread
From: gyungoh @ 2014-12-02  8:05 UTC (permalink / raw)
  To: sameo, lee.jones, jg1.han, cooloney, broonie, lgirdwood
  Cc: jack.yoo, linux-kernel, devicetree, grant.likely, robh+dt,
	mark.rutland, ijc+devicetree, galak, pawel.moll, heiko, jason,
	treding, florian.vaussard, trivial, linux, andrew, jic23

From: Gyungoh Yoo <jack.yoo@skyworksinc.com>

Signed-off-by: Gyungoh Yoo <jack.yoo@skyworksinc.com>
---
Changes v9:
Nothing

Changes v8:
Renamed property names for backlight with vendor prefix
Modified gpio-enable property to generic property for GPIO
Made up the example for backlight DT

Changes v7:
Nothing

Changes v6:
Nothing

Changes v5:
Nothing

Changes v4:
Nothing

Changes v3:
Nothing

Changes v2:
Added reg attribute for I2C slave address

 .../video/backlight/sky81452-backlight.txt         | 29 ++++++++++++++++++++++
 1 file changed, 29 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/video/backlight/sky81452-backlight.txt

diff --git a/Documentation/devicetree/bindings/video/backlight/sky81452-backlight.txt b/Documentation/devicetree/bindings/video/backlight/sky81452-backlight.txt
new file mode 100644
index 0000000..8daebf5
--- /dev/null
+++ b/Documentation/devicetree/bindings/video/backlight/sky81452-backlight.txt
@@ -0,0 +1,29 @@
+SKY81452-backlight bindings
+
+Required properties:
+- compatible		: Must be "skyworks,sky81452-backlight"
+
+Optional properties:
+- name			: Name of backlight device. Default is 'lcd-backlight'.
+- gpios			: GPIO to use to EN pin.
+			See Documentation/devicetree/bindings/gpio/gpio.txt
+- skyworks,en-channels	: Enable mask for current sink channel 1 to 6.
+- skyworks,ignore-pwm	: Ignore both PWM input
+- skyworks,dpwm-mode	: Enable DPWM dimming mode, otherwise Analog dimming.
+- skyworks,phase-shift	: Enable phase shift mode
+- skyworks,ovp-level	: Over-voltage protection level.
+			Should be between 14 or 28V.
+- skyworks,short-detection-threshold	: It should be one of 4, 5, 6 and 7V.
+- skyworks,current-limit	: It should be 2300mA or 2750mA.
+
+Example:
+
+	backlight {
+		compatible = "skyworks,sky81452-backlight";
+		name = "pwm-backlight";
+		skyworks,en-channels = <0x3f>;
+		skyworks,ignore-pwm;
+		skyworks,phase-shift;
+		skyworks,ovp-level = <20>;
+		skyworks,current-limit = <2300>;
+	};
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 24+ messages in thread

* [PATCH v9 5/8] devicetree: Add vendor prefix for Skyworks Solutions, Inc.
  2014-12-02  8:05 ` gyungoh-Re5JQEeQqe8AvxtiuMwx3w
                   ` (4 preceding siblings ...)
  (?)
@ 2014-12-02  8:05 ` gyungoh
  -1 siblings, 0 replies; 24+ messages in thread
From: gyungoh @ 2014-12-02  8:05 UTC (permalink / raw)
  To: sameo, lee.jones, jg1.han, cooloney, broonie, lgirdwood
  Cc: jack.yoo, linux-kernel, devicetree, grant.likely, robh+dt,
	mark.rutland, ijc+devicetree, galak, pawel.moll, heiko, jason,
	treding, florian.vaussard, trivial, linux, andrew, jic23

From: Gyungoh Yoo <jack.yoo@skyworksinc.com>

Signed-off-by: Gyungoh Yoo <jack.yoo@skyworksinc.com>
---
Changes v9:
Nothing

Changes v8:
Nothing

Changes v7:
Nothing

Changes v6:
Nothing

Changes v5:
Nothing

Changes v4:
Nothing

Changes v3:
Nothing

Changes v2:
Added vendor prefix for Skyworks Solutions, Inc.

 Documentation/devicetree/bindings/vendor-prefixes.txt | 1 +
 1 file changed, 1 insertion(+)

diff --git a/Documentation/devicetree/bindings/vendor-prefixes.txt b/Documentation/devicetree/bindings/vendor-prefixes.txt
index a344ec2..68143f0 100644
--- a/Documentation/devicetree/bindings/vendor-prefixes.txt
+++ b/Documentation/devicetree/bindings/vendor-prefixes.txt
@@ -140,6 +140,7 @@ sii	Seiko Instruments, Inc.
 silergy	Silergy Corp.
 sirf	SiRF Technology, Inc.
 sitronix	Sitronix Technology Corporation
+skyworks	Skyworks Solutions, Inc.
 smsc	Standard Microsystems Corporation
 snps	Synopsys, Inc.
 solidrun	SolidRun
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 24+ messages in thread

* [PATCH v9 6/8] devicetree: i2c: Add SKY81452 to the Trivial Devices list
  2014-12-02  8:05 ` gyungoh-Re5JQEeQqe8AvxtiuMwx3w
                   ` (5 preceding siblings ...)
  (?)
@ 2014-12-02  8:05 ` gyungoh
  -1 siblings, 0 replies; 24+ messages in thread
From: gyungoh @ 2014-12-02  8:05 UTC (permalink / raw)
  To: sameo, lee.jones, jg1.han, cooloney, broonie, lgirdwood
  Cc: jack.yoo, linux-kernel, devicetree, grant.likely, robh+dt,
	mark.rutland, ijc+devicetree, galak, pawel.moll, heiko, jason,
	treding, florian.vaussard, trivial, linux, andrew, jic23

From: Gyungoh Yoo <jack.yoo@skyworksinc.com>

Signed-off-by: Gyungoh Yoo <jack.yoo@skyworksinc.com>
---
Changes v9:
Nothing

Changes v8:
Nothing

Changes v7:
Nothing

Changes v6:
Nothing

Changes v5:
Nothing

Changes v4:
Nothing

Changes v3:
Nothing

Changes v2:
Add SKY81452 to the Trivial Devices list

 Documentation/devicetree/bindings/i2c/trivial-devices.txt | 1 +
 1 file changed, 1 insertion(+)

diff --git a/Documentation/devicetree/bindings/i2c/trivial-devices.txt b/Documentation/devicetree/bindings/i2c/trivial-devices.txt
index fbde415..122fa1e 100644
--- a/Documentation/devicetree/bindings/i2c/trivial-devices.txt
+++ b/Documentation/devicetree/bindings/i2c/trivial-devices.txt
@@ -77,6 +77,7 @@ ramtron,24c64		i2c serial eeprom  (24cxx)
 ricoh,rs5c372a		I2C bus SERIAL INTERFACE REAL-TIME CLOCK IC
 samsung,24ad0xd1	S524AD0XF1 (128K/256K-bit Serial EEPROM for Low Power)
 sii,s35390a		2-wire CMOS real-time clock
+skyworks,sky81452	Skyworks SKY81452: Six-Channel White LED Driver with Touch Panel Bias Supply
 st-micro,24c256		i2c serial eeprom  (24cxx)
 stm,m41t00		Serial Access TIMEKEEPER
 stm,m41t62		Serial real-time clock (RTC) with alarm
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 24+ messages in thread

* [PATCH v9 7/8] regulator: sky81452: Modify Device Tree structure
  2014-12-02  8:05 ` gyungoh-Re5JQEeQqe8AvxtiuMwx3w
                   ` (6 preceding siblings ...)
  (?)
@ 2014-12-02  8:05 ` gyungoh
  2014-12-02 12:22   ` Mark Brown
  -1 siblings, 1 reply; 24+ messages in thread
From: gyungoh @ 2014-12-02  8:05 UTC (permalink / raw)
  To: sameo, lee.jones, jg1.han, cooloney, broonie, lgirdwood
  Cc: jack.yoo, linux-kernel, devicetree, grant.likely, robh+dt,
	mark.rutland, ijc+devicetree, galak, pawel.moll, heiko, jason,
	treding, florian.vaussard, trivial, linux, andrew, jic23

From: Gyungoh Yoo <jack.yoo@skyworksinc.com>

Signed-off-by: Gyungoh Yoo <jack.yoo@skyworksinc.com>
---
Changes v9:
Removed the change to remove MODULE_VERSION()

Changes v8:
Changed the DT parsing of regulator using regulator_node and of_match

Changes v7:
Modified licensing text to GPLv2
Splitted Kconfig renaming from DT patch

Changes v6:
Added new line character at the end of line of dev_err()

Changes v5:
Changed DT for regulator : 'lout' node should be defined under 'regulator'
Removed compatible string
Modified to return EINVAL when of_node is NULL

Changes v4:
Removed MODULE_VERSION()
Modified license to GPLv2

Changes v3:
Modified to return ENODATA when of_node is NULL
Modified the messages in error cases

Changes v2:
Added 'compatible' attribute in the driver
Added message for exception or errors.

 drivers/regulator/sky81452-regulator.c | 45 +++++++---------------------------
 1 file changed, 9 insertions(+), 36 deletions(-)

diff --git a/drivers/regulator/sky81452-regulator.c b/drivers/regulator/sky81452-regulator.c
index 476b80a..6478606 100644
--- a/drivers/regulator/sky81452-regulator.c
+++ b/drivers/regulator/sky81452-regulator.c
@@ -5,9 +5,8 @@
  * 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 as published by the
- * Free Software Foundation; either version 2, or (at your option) any
- * later version.
+ * 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
@@ -52,6 +51,8 @@ static const struct regulator_linear_range sky81452_reg_ranges[] = {
 
 static const struct regulator_desc sky81452_reg = {
 	.name = "LOUT",
+	.of_match = of_match_ptr("lout"),
+	.regulators_node = of_match_ptr("regulator"),
 	.ops = &sky81452_reg_ops,
 	.type = REGULATOR_VOLTAGE,
 	.owner = THIS_MODULE,
@@ -64,30 +65,6 @@ static const struct regulator_desc sky81452_reg = {
 	.enable_mask = SKY81452_LEN,
 };
 
-#ifdef CONFIG_OF
-static struct regulator_init_data *sky81452_reg_parse_dt(struct device *dev)
-{
-	struct regulator_init_data *init_data;
-	struct device_node *np;
-
-	np = of_get_child_by_name(dev->parent->of_node, "regulator");
-	if (unlikely(!np)) {
-		dev_err(dev, "regulator node not found");
-		return NULL;
-	}
-
-	init_data = of_get_regulator_init_data(dev, np);
-
-	of_node_put(np);
-	return init_data;
-}
-#else
-static struct regulator_init_data *sky81452_reg_parse_dt(struct device *dev)
-{
-	return ERR_PTR(-EINVAL);
-}
-#endif
-
 static int sky81452_reg_probe(struct platform_device *pdev)
 {
 	struct device *dev = &pdev->dev;
@@ -95,20 +72,16 @@ static int sky81452_reg_probe(struct platform_device *pdev)
 	struct regulator_config config = { };
 	struct regulator_dev *rdev;
 
-	if (!init_data) {
-		init_data = sky81452_reg_parse_dt(dev);
-		if (IS_ERR(init_data))
-			return PTR_ERR(init_data);
-	}
-
-	config.dev = dev;
+	config.dev = dev->parent;
 	config.init_data = init_data;
 	config.of_node = dev->of_node;
 	config.regmap = dev_get_drvdata(dev->parent);
 
 	rdev = devm_regulator_register(dev, &sky81452_reg, &config);
-	if (IS_ERR(rdev))
+	if (IS_ERR(rdev)) {
+		dev_err(dev, "failed to register. err=%ld\n", PTR_ERR(rdev));
 		return PTR_ERR(rdev);
+	}
 
 	platform_set_drvdata(pdev, rdev);
 
@@ -126,4 +99,4 @@ module_platform_driver(sky81452_reg_driver);
 
 MODULE_DESCRIPTION("Skyworks SKY81452 Regulator driver");
 MODULE_AUTHOR("Gyungoh Yoo <jack.yoo@skyworksinc.com>");
-MODULE_LICENSE("GPL");
+MODULE_LICENSE("GPL v2");
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 24+ messages in thread

* [PATCH v9 8/8] devicetree: regulator: sky81452: Modify Device Tree structure
  2014-12-02  8:05 ` gyungoh-Re5JQEeQqe8AvxtiuMwx3w
                   ` (7 preceding siblings ...)
  (?)
@ 2014-12-02  8:05 ` gyungoh
  2014-12-02 12:22   ` Mark Brown
  -1 siblings, 1 reply; 24+ messages in thread
From: gyungoh @ 2014-12-02  8:05 UTC (permalink / raw)
  To: sameo, lee.jones, jg1.han, cooloney, broonie, lgirdwood
  Cc: jack.yoo, linux-kernel, devicetree, grant.likely, robh+dt,
	mark.rutland, ijc+devicetree, galak, pawel.moll, heiko, jason,
	treding, florian.vaussard, trivial, linux, andrew, jic23

From: Gyungoh Yoo <jack.yoo@skyworksinc.com>

Signed-off-by: Gyungoh Yoo <jack.yoo@skyworksinc.com>
---
Changes v9:
Nothing

Changes v8:
Nothing

Changes v7:
Nothing

Changes v6:
Nothing

Changes v5:
Changed DT for regulator : 'lout' node should be defined under 'regulator'
Removed compatible string from sky81452-regulator driver

Changes v4:
Nothing

Changes v3:
Nothing

Changes v2:
Added 'compatible' attribute in the driver

 .../devicetree/bindings/regulator/sky81452-regulator.txt       | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/Documentation/devicetree/bindings/regulator/sky81452-regulator.txt b/Documentation/devicetree/bindings/regulator/sky81452-regulator.txt
index 882455e..f9acbc1 100644
--- a/Documentation/devicetree/bindings/regulator/sky81452-regulator.txt
+++ b/Documentation/devicetree/bindings/regulator/sky81452-regulator.txt
@@ -1,6 +1,7 @@
 SKY81452 voltage regulator
 
 Required properties:
+- regulator node named lout.
 - any required generic properties defined in regulator.txt
 
 Optional properties:
@@ -9,8 +10,9 @@ Optional properties:
 Example:
 
 	regulator {
-		/* generic regulator properties */
-		regulator-name = "touch_en";
-		regulator-min-microvolt = <4500000>;
-		regulator-max-microvolt = <8000000>;
+		lout {
+			regulator-name = "sky81452-lout";
+			regulator-min-microvolt = <4500000>;
+			regulator-max-microvolt = <8000000>;
+		};
 	};
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 24+ messages in thread

* Re: [PATCH v9 7/8] regulator: sky81452: Modify Device Tree structure
  2014-12-02  8:05 ` [PATCH v9 7/8] regulator: sky81452: Modify Device Tree structure gyungoh
@ 2014-12-02 12:22   ` Mark Brown
  0 siblings, 0 replies; 24+ messages in thread
From: Mark Brown @ 2014-12-02 12:22 UTC (permalink / raw)
  To: gyungoh
  Cc: sameo, lee.jones, jg1.han, cooloney, lgirdwood, jack.yoo,
	linux-kernel, devicetree, grant.likely, robh+dt, mark.rutland,
	ijc+devicetree, galak, pawel.moll, heiko, jason, treding,
	florian.vaussard, trivial, linux, andrew, jic23

[-- Attachment #1: Type: text/plain, Size: 132 bytes --]

On Tue, Dec 02, 2014 at 05:05:28PM +0900, gyungoh@gmail.com wrote:
> From: Gyungoh Yoo <jack.yoo@skyworksinc.com>

Applied, thanks.

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 473 bytes --]

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [PATCH v9 8/8] devicetree: regulator: sky81452: Modify Device Tree structure
  2014-12-02  8:05 ` [PATCH v9 8/8] devicetree: " gyungoh
@ 2014-12-02 12:22   ` Mark Brown
  0 siblings, 0 replies; 24+ messages in thread
From: Mark Brown @ 2014-12-02 12:22 UTC (permalink / raw)
  To: gyungoh
  Cc: sameo, lee.jones, jg1.han, cooloney, lgirdwood, jack.yoo,
	linux-kernel, devicetree, grant.likely, robh+dt, mark.rutland,
	ijc+devicetree, galak, pawel.moll, heiko, jason, treding,
	florian.vaussard, trivial, linux, andrew, jic23

[-- Attachment #1: Type: text/plain, Size: 132 bytes --]

On Tue, Dec 02, 2014 at 05:05:29PM +0900, gyungoh@gmail.com wrote:
> From: Gyungoh Yoo <jack.yoo@skyworksinc.com>

Applied, thanks.

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 473 bytes --]

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [PATCH v9 3/8] devicetree: mfd: Add new SKY81452 mfd binding
  2014-12-02  8:05 ` [PATCH v9 3/8] devicetree: mfd: Add new SKY81452 mfd binding gyungoh
@ 2014-12-02 14:07   ` Lee Jones
  2014-12-03  3:09       ` Gyungoh Yoo
  0 siblings, 1 reply; 24+ messages in thread
From: Lee Jones @ 2014-12-02 14:07 UTC (permalink / raw)
  To: gyungoh
  Cc: sameo, jg1.han, cooloney, broonie, lgirdwood, jack.yoo,
	linux-kernel, devicetree, grant.likely, robh+dt, mark.rutland,
	ijc+devicetree, galak, pawel.moll, heiko, jason, treding,
	florian.vaussard, trivial, linux, andrew, jic23

This requires a DT Ack.

> From: Gyungoh Yoo <jack.yoo@skyworksinc.com>
> 
> Signed-off-by: Gyungoh Yoo <jack.yoo@skyworksinc.com>
> ---
> Changes v9:
> Nothing
> 
> Changes v8:
> Made up the example for backlight DT
> 
> Changes v7:
> Nothing
> 
> Changes v6:
> Nothing
> 
> Changes v5:
> Changed DT for regulator : 'lout' node should be defined under 'regulator'
> Removed compatible string from sky81452-regulator driver
> 
> Changes v4:
> Nothing
> 
> Changes v3:
> Nothing
> 
> Changes v2:
> Added reg attribute for I2C slave address
> 
>  Documentation/devicetree/bindings/mfd/sky81452.txt | 36 ++++++++++++++++++++++
>  1 file changed, 36 insertions(+)
>  create mode 100644 Documentation/devicetree/bindings/mfd/sky81452.txt
> 
> diff --git a/Documentation/devicetree/bindings/mfd/sky81452.txt b/Documentation/devicetree/bindings/mfd/sky81452.txt
> new file mode 100644
> index 0000000..ab71473
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/mfd/sky81452.txt
> @@ -0,0 +1,36 @@
> +SKY81452 bindings
> +
> +Required properties:
> +- compatible	: Must be "skyworks,sky81452"
> +- reg		: I2C slave address
> +
> +Required child nodes:
> +- backlight	: container node for backlight following the binding
> +		in video/backlight/sky81452-backlight.txt
> +- regulator	: container node for regulators following the binding
> +		in regulator/sky81452-regulator.txt
> +
> +Example:
> +
> +	sky81452@2c {
> +		compatible = "skyworks,sky81452";
> +		reg = <0x2c>;
> +
> +		backlight {
> +			compatible = "skyworks,sky81452-backlight";
> +			name = "pwm-backlight";
> +			skyworks,en-channels = <0x3f>;
> +			skyworks,ignore-pwm;
> +			skyworks,phase-shift;
> +			skyworks,ovp-level = <20>;
> +			skyworks,current-limit = <2300>;
> +		};
> +
> +		regulator {
> +			lout {
> +				regulator-name = "sky81452-lout";
> +				regulator-min-microvolt = <4500000>;
> +				regulator-max-microvolt = <8000000>;
> +			};
> +		};
> +	};

-- 
Lee Jones
Linaro STMicroelectronics Landing Team Lead
Linaro.org │ Open source software for ARM SoCs
Follow Linaro: Facebook | Twitter | Blog

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [PATCH v9 2/8] backlight: Add support Skyworks SKY81452 backlight driver
  2014-12-02  8:05 ` [PATCH v9 2/8] backlight: Add support Skyworks SKY81452 backlight driver gyungoh
@ 2014-12-02 22:22   ` Bryan Wu
  2014-12-03  8:48     ` Lee Jones
  2014-12-03  2:19     ` Jingoo Han
  1 sibling, 1 reply; 24+ messages in thread
From: Bryan Wu @ 2014-12-02 22:22 UTC (permalink / raw)
  To: gyungoh
  Cc: Samuel Ortiz, Lee Jones, Jingoo Han, Mark Brown, Liam Girdwood,
	jack.yoo, lkml, devicetree, Grant Likely, Rob Herring,
	Mark Rutland, Ian Campbell, Kumar Gala, Pawel Moll, heiko,
	Jason Cooper, Thierry Reding, florian.vaussard, Jiri Kosina,
	Guenter Roeck, Andrew Lunn, jic23

On Tue, Dec 2, 2014 at 12:05 AM,  <gyungoh@gmail.com> wrote:
> From: Gyungoh Yoo <jack.yoo@skyworksinc.com>
>
> Signed-off-by: Gyungoh Yoo <jack.yoo@skyworksinc.com>

This patch looks good to me and I think Jingoo reviewed it already. So
please take my Ack here:
Acked-by: Bryan Wu <cooloney@gmail.com>

Lee, can you apply this patch?

Thanks,
-Bryan

> ---
> 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     | 340 +++++++++++++++++++++++
>  include/linux/platform_data/sky81452-backlight.h |  46 +++
>  4 files changed, 397 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..45e575f
> --- /dev/null
> +++ b/drivers/video/backlight/sky81452-backlight.c
> @@ -0,0 +1,340 @@
> +/*
> + * 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 int sky81452_bl_get_brightness(struct backlight_device *bd)
> +{
> +       return bd->props.brightness;
> +}
> +
> +static const struct backlight_ops sky81452_bl_ops = {
> +       .update_status = sky81452_bl_update_status,
> +       .get_brightness = sky81452_bl_get_brightness,
> +};
> +
> +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
>

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [PATCH v9 4/8] devicetree: backlight: Add new SKY81452 backlight binding
  2014-12-02  8:05 ` [PATCH v9 4/8] devicetree: backlight: Add new SKY81452 backlight binding gyungoh
@ 2014-12-02 22:24   ` Bryan Wu
  0 siblings, 0 replies; 24+ messages in thread
From: Bryan Wu @ 2014-12-02 22:24 UTC (permalink / raw)
  To: gyungoh
  Cc: Samuel Ortiz, Lee Jones, Jingoo Han, Mark Brown, Liam Girdwood,
	jack.yoo, lkml, devicetree, Grant Likely, Rob Herring,
	Mark Rutland, Ian Campbell, Kumar Gala, Pawel Moll, heiko,
	Jason Cooper, Thierry Reding, florian.vaussard, Jiri Kosina,
	Guenter Roeck, Andrew Lunn, jic23

On Tue, Dec 2, 2014 at 12:05 AM,  <gyungoh@gmail.com> wrote:
> From: Gyungoh Yoo <jack.yoo@skyworksinc.com>
>
> Signed-off-by: Gyungoh Yoo <jack.yoo@skyworksinc.com>


Acked-by: Bryan Wu <cooloney@gmail.com>

Thanks,
-Bryan

> ---
> Changes v9:
> Nothing
>
> Changes v8:
> Renamed property names for backlight with vendor prefix
> Modified gpio-enable property to generic property for GPIO
> Made up the example for backlight DT
>
> Changes v7:
> Nothing
>
> Changes v6:
> Nothing
>
> Changes v5:
> Nothing
>
> Changes v4:
> Nothing
>
> Changes v3:
> Nothing
>
> Changes v2:
> Added reg attribute for I2C slave address
>
>  .../video/backlight/sky81452-backlight.txt         | 29 ++++++++++++++++++++++
>  1 file changed, 29 insertions(+)
>  create mode 100644 Documentation/devicetree/bindings/video/backlight/sky81452-backlight.txt
>
> diff --git a/Documentation/devicetree/bindings/video/backlight/sky81452-backlight.txt b/Documentation/devicetree/bindings/video/backlight/sky81452-backlight.txt
> new file mode 100644
> index 0000000..8daebf5
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/video/backlight/sky81452-backlight.txt
> @@ -0,0 +1,29 @@
> +SKY81452-backlight bindings
> +
> +Required properties:
> +- compatible           : Must be "skyworks,sky81452-backlight"
> +
> +Optional properties:
> +- name                 : Name of backlight device. Default is 'lcd-backlight'.
> +- gpios                        : GPIO to use to EN pin.
> +                       See Documentation/devicetree/bindings/gpio/gpio.txt
> +- skyworks,en-channels : Enable mask for current sink channel 1 to 6.
> +- skyworks,ignore-pwm  : Ignore both PWM input
> +- skyworks,dpwm-mode   : Enable DPWM dimming mode, otherwise Analog dimming.
> +- skyworks,phase-shift : Enable phase shift mode
> +- skyworks,ovp-level   : Over-voltage protection level.
> +                       Should be between 14 or 28V.
> +- skyworks,short-detection-threshold   : It should be one of 4, 5, 6 and 7V.
> +- skyworks,current-limit       : It should be 2300mA or 2750mA.
> +
> +Example:
> +
> +       backlight {
> +               compatible = "skyworks,sky81452-backlight";
> +               name = "pwm-backlight";
> +               skyworks,en-channels = <0x3f>;
> +               skyworks,ignore-pwm;
> +               skyworks,phase-shift;
> +               skyworks,ovp-level = <20>;
> +               skyworks,current-limit = <2300>;
> +       };
> --
> 1.9.1
>

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [PATCH v9 2/8] backlight: Add support Skyworks SKY81452 backlight driver
@ 2014-12-03  2:19     ` Jingoo Han
  0 siblings, 0 replies; 24+ messages in thread
From: Jingoo Han @ 2014-12-03  2:19 UTC (permalink / raw)
  To: gyungoh, sameo, lee.jones, cooloney, broonie, lgirdwood
  Cc: jack.yoo, linux-kernel, devicetree, grant.likely, robh+dt,
	mark.rutland, ijc+devicetree, galak, pawel.moll, heiko, jason,
	treding, florian.vaussard, trivial, linux, andrew, jic23,
	'Jingoo Han'

On Tuesday, December 02, 2014 5:05 PM, Gyungoh Yoo wrote:
> 
> From: Gyungoh Yoo <jack.yoo@skyworksinc.com>
> 
> Signed-off-by: Gyungoh Yoo <jack.yoo@skyworksinc.com>
> ---
> 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     | 340 +++++++++++++++++++++++
>  include/linux/platform_data/sky81452-backlight.h |  46 +++
>  4 files changed, 397 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..45e575f
> --- /dev/null
> +++ b/drivers/video/backlight/sky81452-backlight.c
> @@ -0,0 +1,340 @@
> +/*
> + * 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 int sky81452_bl_get_brightness(struct backlight_device *bd)
> +{
> +	return bd->props.brightness;
> +}

Please remove sky81452_bl_get_brightness().
In the case of just returning 'props.brightness',
backglight core can also return 'props.brightness'.
So, there is no need to add sky81452_bl_get_brightness().

Please refer to the following patches.
  backlight: Remove trivial get_brightness implementations
  backlight: Show brightness even if get_brightness is not implemented

Others look good.
Thanks.

Best regards,
Jingoo Han

> +
> +static const struct backlight_ops sky81452_bl_ops = {
> +	.update_status = sky81452_bl_update_status,
> +	.get_brightness = sky81452_bl_get_brightness,
> +};
> +
> +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


^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [PATCH v9 2/8] backlight: Add support Skyworks SKY81452 backlight driver
@ 2014-12-03  2:19     ` Jingoo Han
  0 siblings, 0 replies; 24+ messages in thread
From: Jingoo Han @ 2014-12-03  2:19 UTC (permalink / raw)
  To: gyungoh-Re5JQEeQqe8AvxtiuMwx3w, sameo-VuQAYsv1563Yd54FQh9/CA,
	lee.jones-QSEj5FYQhm4dnm+yROfE0A,
	cooloney-Re5JQEeQqe8AvxtiuMwx3w, broonie-DgEjT+Ai2ygdnm+yROfE0A,
	lgirdwood-Re5JQEeQqe8AvxtiuMwx3w
  Cc: jack.yoo-tjhQNA90jdKqndwCJWfcng,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA,
	devicetree-u79uwXL29TY76Z2rM5mHXA,
	grant.likely-QSEj5FYQhm4dnm+yROfE0A,
	robh+dt-DgEjT+Ai2ygdnm+yROfE0A, mark.rutland-5wv7dgnIgG8,
	ijc+devicetree-KcIKpvwj1kUDXYZnReoRVg,
	galak-sgV2jX0FEOL9JmXXK+q4OQ, pawel.moll-5wv7dgnIgG8,
	heiko-4mtYJXux2i+zQB+pC5nmwQ, jason-NLaQJdtUoK4Be96aLqz0jA,
	treding-DDmLM1+adcrQT0dZR+AlfA, florian.vaussard-p8DiymsW2f8,
	trivial-DgEjT+Ai2ygdnm+yROfE0A, linux-0h96xk9xTtrk1uMJSBkQmQ,
	andrew-g2DYL2Zd6BY, jic23-DgEjT+Ai2ygdnm+yROfE0A,
	'Jingoo Han'

On Tuesday, December 02, 2014 5:05 PM, Gyungoh Yoo wrote:
> 
> From: Gyungoh Yoo <jack.yoo-tjhQNA90jdKqndwCJWfcng@public.gmane.org>
> 
> Signed-off-by: Gyungoh Yoo <jack.yoo-tjhQNA90jdKqndwCJWfcng@public.gmane.org>
> ---
> 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     | 340 +++++++++++++++++++++++
>  include/linux/platform_data/sky81452-backlight.h |  46 +++
>  4 files changed, 397 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..45e575f
> --- /dev/null
> +++ b/drivers/video/backlight/sky81452-backlight.c
> @@ -0,0 +1,340 @@
> +/*
> + * 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 int sky81452_bl_get_brightness(struct backlight_device *bd)
> +{
> +	return bd->props.brightness;
> +}

Please remove sky81452_bl_get_brightness().
In the case of just returning 'props.brightness',
backglight core can also return 'props.brightness'.
So, there is no need to add sky81452_bl_get_brightness().

Please refer to the following patches.
  backlight: Remove trivial get_brightness implementations
  backlight: Show brightness even if get_brightness is not implemented

Others look good.
Thanks.

Best regards,
Jingoo Han

> +
> +static const struct backlight_ops sky81452_bl_ops = {
> +	.update_status = sky81452_bl_update_status,
> +	.get_brightness = sky81452_bl_get_brightness,
> +};
> +
> +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

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [PATCH v9 2/8] backlight: Add support Skyworks SKY81452 backlight driver
@ 2014-12-03  2:42       ` Gyungoh Yoo
  0 siblings, 0 replies; 24+ messages in thread
From: Gyungoh Yoo @ 2014-12-03  2:42 UTC (permalink / raw)
  To: Jingoo Han
  Cc: sameo, lee.jones, cooloney, broonie, lgirdwood, jack.yoo,
	linux-kernel, devicetree, grant.likely, robh+dt, mark.rutland,
	ijc+devicetree, galak, pawel.moll, heiko, jason, treding,
	florian.vaussard, trivial, linux, andrew, jic23

On Wed, Dec 03, 2014 at 11:19:06AM +0900, Jingoo Han wrote:
> On Tuesday, December 02, 2014 5:05 PM, Gyungoh Yoo wrote:
> > 
> > From: Gyungoh Yoo <jack.yoo@skyworksinc.com>
> > 
> > Signed-off-by: Gyungoh Yoo <jack.yoo@skyworksinc.com>
> > ---
> > 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     | 340 +++++++++++++++++++++++
> >  include/linux/platform_data/sky81452-backlight.h |  46 +++
> >  4 files changed, 397 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..45e575f
> > --- /dev/null
> > +++ b/drivers/video/backlight/sky81452-backlight.c
> > @@ -0,0 +1,340 @@
> > +/*
> > + * 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 int sky81452_bl_get_brightness(struct backlight_device *bd)
> > +{
> > +	return bd->props.brightness;
> > +}
> 
> Please remove sky81452_bl_get_brightness().
> In the case of just returning 'props.brightness',
> backglight core can also return 'props.brightness'.
> So, there is no need to add sky81452_bl_get_brightness().
> 
> Please refer to the following patches.
>   backlight: Remove trivial get_brightness implementations
>   backlight: Show brightness even if get_brightness is not implemented

I see. I will remove it.
Thank you.

> 
> Others look good.
> Thanks.
> 
> Best regards,
> Jingoo Han
> 
> > +
> > +static const struct backlight_ops sky81452_bl_ops = {
> > +	.update_status = sky81452_bl_update_status,
> > +	.get_brightness = sky81452_bl_get_brightness,
> > +};
> > +
> > +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
> 

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [PATCH v9 2/8] backlight: Add support Skyworks SKY81452 backlight driver
@ 2014-12-03  2:42       ` Gyungoh Yoo
  0 siblings, 0 replies; 24+ messages in thread
From: Gyungoh Yoo @ 2014-12-03  2:42 UTC (permalink / raw)
  To: Jingoo Han
  Cc: sameo-VuQAYsv1563Yd54FQh9/CA, lee.jones-QSEj5FYQhm4dnm+yROfE0A,
	cooloney-Re5JQEeQqe8AvxtiuMwx3w, broonie-DgEjT+Ai2ygdnm+yROfE0A,
	lgirdwood-Re5JQEeQqe8AvxtiuMwx3w,
	jack.yoo-tjhQNA90jdKqndwCJWfcng,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA,
	devicetree-u79uwXL29TY76Z2rM5mHXA,
	grant.likely-QSEj5FYQhm4dnm+yROfE0A,
	robh+dt-DgEjT+Ai2ygdnm+yROfE0A, mark.rutland-5wv7dgnIgG8,
	ijc+devicetree-KcIKpvwj1kUDXYZnReoRVg,
	galak-sgV2jX0FEOL9JmXXK+q4OQ, pawel.moll-5wv7dgnIgG8,
	heiko-4mtYJXux2i+zQB+pC5nmwQ, jason-NLaQJdtUoK4Be96aLqz0jA,
	treding-DDmLM1+adcrQT0dZR+AlfA, florian.vaussard-p8DiymsW2f8,
	trivial-DgEjT+Ai2ygdnm+yROfE0A, linux-0h96xk9xTtrk1uMJSBkQmQ,
	andrew-g2DYL2Zd6BY, jic23-DgEjT+Ai2ygdnm+yROfE0A

On Wed, Dec 03, 2014 at 11:19:06AM +0900, Jingoo Han wrote:
> On Tuesday, December 02, 2014 5:05 PM, Gyungoh Yoo wrote:
> > 
> > From: Gyungoh Yoo <jack.yoo-tjhQNA90jdKqndwCJWfcng@public.gmane.org>
> > 
> > Signed-off-by: Gyungoh Yoo <jack.yoo-tjhQNA90jdKqndwCJWfcng@public.gmane.org>
> > ---
> > 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     | 340 +++++++++++++++++++++++
> >  include/linux/platform_data/sky81452-backlight.h |  46 +++
> >  4 files changed, 397 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..45e575f
> > --- /dev/null
> > +++ b/drivers/video/backlight/sky81452-backlight.c
> > @@ -0,0 +1,340 @@
> > +/*
> > + * 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 int sky81452_bl_get_brightness(struct backlight_device *bd)
> > +{
> > +	return bd->props.brightness;
> > +}
> 
> Please remove sky81452_bl_get_brightness().
> In the case of just returning 'props.brightness',
> backglight core can also return 'props.brightness'.
> So, there is no need to add sky81452_bl_get_brightness().
> 
> Please refer to the following patches.
>   backlight: Remove trivial get_brightness implementations
>   backlight: Show brightness even if get_brightness is not implemented

I see. I will remove it.
Thank you.

> 
> Others look good.
> Thanks.
> 
> Best regards,
> Jingoo Han
> 
> > +
> > +static const struct backlight_ops sky81452_bl_ops = {
> > +	.update_status = sky81452_bl_update_status,
> > +	.get_brightness = sky81452_bl_get_brightness,
> > +};
> > +
> > +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

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [PATCH v9 3/8] devicetree: mfd: Add new SKY81452 mfd binding
  2014-12-02 14:07   ` Lee Jones
@ 2014-12-03  3:09       ` Gyungoh Yoo
  0 siblings, 0 replies; 24+ messages in thread
From: Gyungoh Yoo @ 2014-12-03  3:09 UTC (permalink / raw)
  To: Lee Jones
  Cc: sameo, jg1.han, cooloney, broonie, lgirdwood, jack.yoo,
	linux-kernel, devicetree, grant.likely, robh+dt, mark.rutland,
	ijc+devicetree, galak, pawel.moll, heiko, jason, treding,
	florian.vaussard, trivial, linux, andrew, jic23

On Tue, Dec 02, 2014 at 02:07:27PM +0000, Lee Jones wrote:
> This requires a DT Ack.

I think I need to double-check the recipients.
Thank you for the comment.

> 
> > From: Gyungoh Yoo <jack.yoo@skyworksinc.com>
> > 
> > Signed-off-by: Gyungoh Yoo <jack.yoo@skyworksinc.com>
> > ---
> > Changes v9:
> > Nothing
> > 
> > Changes v8:
> > Made up the example for backlight DT
> > 
> > Changes v7:
> > Nothing
> > 
> > Changes v6:
> > Nothing
> > 
> > Changes v5:
> > Changed DT for regulator : 'lout' node should be defined under 'regulator'
> > Removed compatible string from sky81452-regulator driver
> > 
> > Changes v4:
> > Nothing
> > 
> > Changes v3:
> > Nothing
> > 
> > Changes v2:
> > Added reg attribute for I2C slave address
> > 
> >  Documentation/devicetree/bindings/mfd/sky81452.txt | 36 ++++++++++++++++++++++
> >  1 file changed, 36 insertions(+)
> >  create mode 100644 Documentation/devicetree/bindings/mfd/sky81452.txt
> > 
> > diff --git a/Documentation/devicetree/bindings/mfd/sky81452.txt b/Documentation/devicetree/bindings/mfd/sky81452.txt
> > new file mode 100644
> > index 0000000..ab71473
> > --- /dev/null
> > +++ b/Documentation/devicetree/bindings/mfd/sky81452.txt
> > @@ -0,0 +1,36 @@
> > +SKY81452 bindings
> > +
> > +Required properties:
> > +- compatible	: Must be "skyworks,sky81452"
> > +- reg		: I2C slave address
> > +
> > +Required child nodes:
> > +- backlight	: container node for backlight following the binding
> > +		in video/backlight/sky81452-backlight.txt
> > +- regulator	: container node for regulators following the binding
> > +		in regulator/sky81452-regulator.txt
> > +
> > +Example:
> > +
> > +	sky81452@2c {
> > +		compatible = "skyworks,sky81452";
> > +		reg = <0x2c>;
> > +
> > +		backlight {
> > +			compatible = "skyworks,sky81452-backlight";
> > +			name = "pwm-backlight";
> > +			skyworks,en-channels = <0x3f>;
> > +			skyworks,ignore-pwm;
> > +			skyworks,phase-shift;
> > +			skyworks,ovp-level = <20>;
> > +			skyworks,current-limit = <2300>;
> > +		};
> > +
> > +		regulator {
> > +			lout {
> > +				regulator-name = "sky81452-lout";
> > +				regulator-min-microvolt = <4500000>;
> > +				regulator-max-microvolt = <8000000>;
> > +			};
> > +		};
> > +	};
> 
> -- 
> Lee Jones
> Linaro STMicroelectronics Landing Team Lead
> Linaro.org │ Open source software for ARM SoCs
> Follow Linaro: Facebook | Twitter | Blog

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [PATCH v9 3/8] devicetree: mfd: Add new SKY81452 mfd binding
@ 2014-12-03  3:09       ` Gyungoh Yoo
  0 siblings, 0 replies; 24+ messages in thread
From: Gyungoh Yoo @ 2014-12-03  3:09 UTC (permalink / raw)
  To: Lee Jones
  Cc: sameo-VuQAYsv1563Yd54FQh9/CA, jg1.han-Sze3O3UU22JBDgjK7y7TUQ,
	cooloney-Re5JQEeQqe8AvxtiuMwx3w, broonie-DgEjT+Ai2ygdnm+yROfE0A,
	lgirdwood-Re5JQEeQqe8AvxtiuMwx3w,
	jack.yoo-tjhQNA90jdKqndwCJWfcng,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA,
	devicetree-u79uwXL29TY76Z2rM5mHXA,
	grant.likely-QSEj5FYQhm4dnm+yROfE0A,
	robh+dt-DgEjT+Ai2ygdnm+yROfE0A, mark.rutland-5wv7dgnIgG8,
	ijc+devicetree-KcIKpvwj1kUDXYZnReoRVg,
	galak-sgV2jX0FEOL9JmXXK+q4OQ, pawel.moll-5wv7dgnIgG8,
	heiko-4mtYJXux2i+zQB+pC5nmwQ, jason-NLaQJdtUoK4Be96aLqz0jA,
	treding-DDmLM1+adcrQT0dZR+AlfA, florian.vaussard-p8DiymsW2f8,
	trivial-DgEjT+Ai2ygdnm+yROfE0A, linux-0h96xk9xTtrk1uMJSBkQmQ,
	andrew-g2DYL2Zd6BY, jic23-DgEjT+Ai2ygdnm+yROfE0A

On Tue, Dec 02, 2014 at 02:07:27PM +0000, Lee Jones wrote:
> This requires a DT Ack.

I think I need to double-check the recipients.
Thank you for the comment.

> 
> > From: Gyungoh Yoo <jack.yoo-tjhQNA90jdKqndwCJWfcng@public.gmane.org>
> > 
> > Signed-off-by: Gyungoh Yoo <jack.yoo-tjhQNA90jdKqndwCJWfcng@public.gmane.org>
> > ---
> > Changes v9:
> > Nothing
> > 
> > Changes v8:
> > Made up the example for backlight DT
> > 
> > Changes v7:
> > Nothing
> > 
> > Changes v6:
> > Nothing
> > 
> > Changes v5:
> > Changed DT for regulator : 'lout' node should be defined under 'regulator'
> > Removed compatible string from sky81452-regulator driver
> > 
> > Changes v4:
> > Nothing
> > 
> > Changes v3:
> > Nothing
> > 
> > Changes v2:
> > Added reg attribute for I2C slave address
> > 
> >  Documentation/devicetree/bindings/mfd/sky81452.txt | 36 ++++++++++++++++++++++
> >  1 file changed, 36 insertions(+)
> >  create mode 100644 Documentation/devicetree/bindings/mfd/sky81452.txt
> > 
> > diff --git a/Documentation/devicetree/bindings/mfd/sky81452.txt b/Documentation/devicetree/bindings/mfd/sky81452.txt
> > new file mode 100644
> > index 0000000..ab71473
> > --- /dev/null
> > +++ b/Documentation/devicetree/bindings/mfd/sky81452.txt
> > @@ -0,0 +1,36 @@
> > +SKY81452 bindings
> > +
> > +Required properties:
> > +- compatible	: Must be "skyworks,sky81452"
> > +- reg		: I2C slave address
> > +
> > +Required child nodes:
> > +- backlight	: container node for backlight following the binding
> > +		in video/backlight/sky81452-backlight.txt
> > +- regulator	: container node for regulators following the binding
> > +		in regulator/sky81452-regulator.txt
> > +
> > +Example:
> > +
> > +	sky81452@2c {
> > +		compatible = "skyworks,sky81452";
> > +		reg = <0x2c>;
> > +
> > +		backlight {
> > +			compatible = "skyworks,sky81452-backlight";
> > +			name = "pwm-backlight";
> > +			skyworks,en-channels = <0x3f>;
> > +			skyworks,ignore-pwm;
> > +			skyworks,phase-shift;
> > +			skyworks,ovp-level = <20>;
> > +			skyworks,current-limit = <2300>;
> > +		};
> > +
> > +		regulator {
> > +			lout {
> > +				regulator-name = "sky81452-lout";
> > +				regulator-min-microvolt = <4500000>;
> > +				regulator-max-microvolt = <8000000>;
> > +			};
> > +		};
> > +	};
> 
> -- 
> Lee Jones
> Linaro STMicroelectronics Landing Team Lead
> Linaro.org │ Open source software for ARM SoCs
> Follow Linaro: Facebook | Twitter | Blog
--
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

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [PATCH v9 3/8] devicetree: mfd: Add new SKY81452 mfd binding
  2014-12-03  3:09       ` Gyungoh Yoo
@ 2014-12-03  3:39         ` Jingoo Han
  -1 siblings, 0 replies; 24+ messages in thread
From: Jingoo Han @ 2014-12-03  3:39 UTC (permalink / raw)
  To: 'Gyungoh Yoo', 'Lee Jones'
  Cc: sameo, cooloney, broonie, lgirdwood, jack.yoo, linux-kernel,
	devicetree, grant.likely, robh+dt, mark.rutland, ijc+devicetree,
	galak, pawel.moll, heiko, jason, treding, florian.vaussard,
	trivial, linux, andrew, jic23, 'Jingoo Han'

On Wednesday, December 03, 2014 12:09 PM, Gyungoh Yoo wrote:
> On Tue, Dec 02, 2014 at 02:07:27PM +0000, Lee Jones wrote:
> > This requires a DT Ack.
> 
> I think I need to double-check the recipients.
> Thank you for the comment.

Yes, right.
We should be careful when creating new DT properties.
This is because DT can be handled as ABI. Thus, Ack from
DT maintainers is necessary for merging new DT properties,
even though other subsystem maintainers or reviews gave
Ack for this.

Best regards,
Jingoo Han

> 
> >
> > > From: Gyungoh Yoo <jack.yoo@skyworksinc.com>
> > >
> > > Signed-off-by: Gyungoh Yoo <jack.yoo@skyworksinc.com>
> > > ---
> > > Changes v9:
> > > Nothing
> > >
> > > Changes v8:
> > > Made up the example for backlight DT
> > >
> > > Changes v7:
> > > Nothing
> > >
> > > Changes v6:
> > > Nothing
> > >
> > > Changes v5:
> > > Changed DT for regulator : 'lout' node should be defined under 'regulator'
> > > Removed compatible string from sky81452-regulator driver
> > >
> > > Changes v4:
> > > Nothing
> > >
> > > Changes v3:
> > > Nothing
> > >
> > > Changes v2:
> > > Added reg attribute for I2C slave address
> > >
> > >  Documentation/devicetree/bindings/mfd/sky81452.txt | 36 ++++++++++++++++++++++
> > >  1 file changed, 36 insertions(+)
> > >  create mode 100644 Documentation/devicetree/bindings/mfd/sky81452.txt
> > >
> > > diff --git a/Documentation/devicetree/bindings/mfd/sky81452.txt
> b/Documentation/devicetree/bindings/mfd/sky81452.txt
> > > new file mode 100644
> > > index 0000000..ab71473
> > > --- /dev/null
> > > +++ b/Documentation/devicetree/bindings/mfd/sky81452.txt
> > > @@ -0,0 +1,36 @@
> > > +SKY81452 bindings
> > > +
> > > +Required properties:
> > > +- compatible	: Must be "skyworks,sky81452"
> > > +- reg		: I2C slave address
> > > +
> > > +Required child nodes:
> > > +- backlight	: container node for backlight following the binding
> > > +		in video/backlight/sky81452-backlight.txt
> > > +- regulator	: container node for regulators following the binding
> > > +		in regulator/sky81452-regulator.txt
> > > +
> > > +Example:
> > > +
> > > +	sky81452@2c {
> > > +		compatible = "skyworks,sky81452";
> > > +		reg = <0x2c>;
> > > +
> > > +		backlight {
> > > +			compatible = "skyworks,sky81452-backlight";
> > > +			name = "pwm-backlight";
> > > +			skyworks,en-channels = <0x3f>;
> > > +			skyworks,ignore-pwm;
> > > +			skyworks,phase-shift;
> > > +			skyworks,ovp-level = <20>;
> > > +			skyworks,current-limit = <2300>;
> > > +		};
> > > +
> > > +		regulator {
> > > +			lout {
> > > +				regulator-name = "sky81452-lout";
> > > +				regulator-min-microvolt = <4500000>;
> > > +				regulator-max-microvolt = <8000000>;
> > > +			};
> > > +		};
> > > +	};
> >
> > --
> > Lee Jones
> > Linaro STMicroelectronics Landing Team Lead
> > Linaro.org │ Open source software for ARM SoCs
> > Follow Linaro: Facebook | Twitter | Blog


^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [PATCH v9 3/8] devicetree: mfd: Add new SKY81452 mfd binding
@ 2014-12-03  3:39         ` Jingoo Han
  0 siblings, 0 replies; 24+ messages in thread
From: Jingoo Han @ 2014-12-03  3:39 UTC (permalink / raw)
  To: 'Gyungoh Yoo', 'Lee Jones'
  Cc: sameo-VuQAYsv1563Yd54FQh9/CA, cooloney-Re5JQEeQqe8AvxtiuMwx3w,
	broonie-DgEjT+Ai2ygdnm+yROfE0A, lgirdwood-Re5JQEeQqe8AvxtiuMwx3w,
	jack.yoo-tjhQNA90jdKqndwCJWfcng,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA,
	devicetree-u79uwXL29TY76Z2rM5mHXA,
	grant.likely-QSEj5FYQhm4dnm+yROfE0A,
	robh+dt-DgEjT+Ai2ygdnm+yROfE0A, mark.rutland-5wv7dgnIgG8,
	ijc+devicetree-KcIKpvwj1kUDXYZnReoRVg,
	galak-sgV2jX0FEOL9JmXXK+q4OQ, pawel.moll-5wv7dgnIgG8,
	heiko-4mtYJXux2i+zQB+pC5nmwQ, jason-NLaQJdtUoK4Be96aLqz0jA,
	treding-DDmLM1+adcrQT0dZR+AlfA, florian.vaussard-p8DiymsW2f8,
	trivial-DgEjT+Ai2ygdnm+yROfE0A, linux-0h96xk9xTtrk1uMJSBkQmQ,
	andrew-g2DYL2Zd6BY, jic23-DgEjT+Ai2ygdnm+yROfE0A,
	'Jingoo Han'

On Wednesday, December 03, 2014 12:09 PM, Gyungoh Yoo wrote:
> On Tue, Dec 02, 2014 at 02:07:27PM +0000, Lee Jones wrote:
> > This requires a DT Ack.
> 
> I think I need to double-check the recipients.
> Thank you for the comment.

Yes, right.
We should be careful when creating new DT properties.
This is because DT can be handled as ABI. Thus, Ack from
DT maintainers is necessary for merging new DT properties,
even though other subsystem maintainers or reviews gave
Ack for this.

Best regards,
Jingoo Han

> 
> >
> > > From: Gyungoh Yoo <jack.yoo-tjhQNA90jdKqndwCJWfcng@public.gmane.org>
> > >
> > > Signed-off-by: Gyungoh Yoo <jack.yoo-tjhQNA90jdKqndwCJWfcng@public.gmane.org>
> > > ---
> > > Changes v9:
> > > Nothing
> > >
> > > Changes v8:
> > > Made up the example for backlight DT
> > >
> > > Changes v7:
> > > Nothing
> > >
> > > Changes v6:
> > > Nothing
> > >
> > > Changes v5:
> > > Changed DT for regulator : 'lout' node should be defined under 'regulator'
> > > Removed compatible string from sky81452-regulator driver
> > >
> > > Changes v4:
> > > Nothing
> > >
> > > Changes v3:
> > > Nothing
> > >
> > > Changes v2:
> > > Added reg attribute for I2C slave address
> > >
> > >  Documentation/devicetree/bindings/mfd/sky81452.txt | 36 ++++++++++++++++++++++
> > >  1 file changed, 36 insertions(+)
> > >  create mode 100644 Documentation/devicetree/bindings/mfd/sky81452.txt
> > >
> > > diff --git a/Documentation/devicetree/bindings/mfd/sky81452.txt
> b/Documentation/devicetree/bindings/mfd/sky81452.txt
> > > new file mode 100644
> > > index 0000000..ab71473
> > > --- /dev/null
> > > +++ b/Documentation/devicetree/bindings/mfd/sky81452.txt
> > > @@ -0,0 +1,36 @@
> > > +SKY81452 bindings
> > > +
> > > +Required properties:
> > > +- compatible	: Must be "skyworks,sky81452"
> > > +- reg		: I2C slave address
> > > +
> > > +Required child nodes:
> > > +- backlight	: container node for backlight following the binding
> > > +		in video/backlight/sky81452-backlight.txt
> > > +- regulator	: container node for regulators following the binding
> > > +		in regulator/sky81452-regulator.txt
> > > +
> > > +Example:
> > > +
> > > +	sky81452@2c {
> > > +		compatible = "skyworks,sky81452";
> > > +		reg = <0x2c>;
> > > +
> > > +		backlight {
> > > +			compatible = "skyworks,sky81452-backlight";
> > > +			name = "pwm-backlight";
> > > +			skyworks,en-channels = <0x3f>;
> > > +			skyworks,ignore-pwm;
> > > +			skyworks,phase-shift;
> > > +			skyworks,ovp-level = <20>;
> > > +			skyworks,current-limit = <2300>;
> > > +		};
> > > +
> > > +		regulator {
> > > +			lout {
> > > +				regulator-name = "sky81452-lout";
> > > +				regulator-min-microvolt = <4500000>;
> > > +				regulator-max-microvolt = <8000000>;
> > > +			};
> > > +		};
> > > +	};
> >
> > --
> > Lee Jones
> > Linaro STMicroelectronics Landing Team Lead
> > Linaro.org │ Open source software for ARM SoCs
> > Follow Linaro: Facebook | Twitter | Blog

--
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

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [PATCH v9 2/8] backlight: Add support Skyworks SKY81452 backlight driver
  2014-12-02 22:22   ` Bryan Wu
@ 2014-12-03  8:48     ` Lee Jones
  0 siblings, 0 replies; 24+ messages in thread
From: Lee Jones @ 2014-12-03  8:48 UTC (permalink / raw)
  To: Bryan Wu
  Cc: gyungoh, Samuel Ortiz, Jingoo Han, Mark Brown, Liam Girdwood,
	jack.yoo, lkml, devicetree, Grant Likely, Rob Herring,
	Mark Rutland, Ian Campbell, Kumar Gala, Pawel Moll, heiko,
	Jason Cooper, Thierry Reding, florian.vaussard, Jiri Kosina,
	Guenter Roeck, Andrew Lunn, jic23

On Tue, 02 Dec 2014, Bryan Wu wrote:

> On Tue, Dec 2, 2014 at 12:05 AM,  <gyungoh@gmail.com> wrote:
> > From: Gyungoh Yoo <jack.yoo@skyworksinc.com>
> >
> > Signed-off-by: Gyungoh Yoo <jack.yoo@skyworksinc.com>
> 
> This patch looks good to me and I think Jingoo reviewed it already. So
> please take my Ack here:
> Acked-by: Bryan Wu <cooloney@gmail.com>
> 
> Lee, can you apply this patch?

I can, but we need to see what's happening with the other patches in
the set first.

-- 
Lee Jones
Linaro STMicroelectronics Landing Team Lead
Linaro.org │ Open source software for ARM SoCs
Follow Linaro: Facebook | Twitter | Blog

^ permalink raw reply	[flat|nested] 24+ messages in thread

end of thread, other threads:[~2014-12-03  8:48 UTC | newest]

Thread overview: 24+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-12-02  8:05 [PATCH v9 0/8] Add Skyworks SKY81452 device drivers gyungoh
2014-12-02  8:05 ` gyungoh-Re5JQEeQqe8AvxtiuMwx3w
2014-12-02  8:05 ` [PATCH v9 1/8] mfd: Add support for Skyworks SKY81452 driver gyungoh
2014-12-02  8:05 ` [PATCH v9 2/8] backlight: Add support Skyworks SKY81452 backlight driver gyungoh
2014-12-02 22:22   ` Bryan Wu
2014-12-03  8:48     ` Lee Jones
2014-12-03  2:19   ` Jingoo Han
2014-12-03  2:19     ` Jingoo Han
2014-12-03  2:42     ` Gyungoh Yoo
2014-12-03  2:42       ` Gyungoh Yoo
2014-12-02  8:05 ` [PATCH v9 3/8] devicetree: mfd: Add new SKY81452 mfd binding gyungoh
2014-12-02 14:07   ` Lee Jones
2014-12-03  3:09     ` Gyungoh Yoo
2014-12-03  3:09       ` Gyungoh Yoo
2014-12-03  3:39       ` Jingoo Han
2014-12-03  3:39         ` Jingoo Han
2014-12-02  8:05 ` [PATCH v9 4/8] devicetree: backlight: Add new SKY81452 backlight binding gyungoh
2014-12-02 22:24   ` Bryan Wu
2014-12-02  8:05 ` [PATCH v9 5/8] devicetree: Add vendor prefix for Skyworks Solutions, Inc gyungoh
2014-12-02  8:05 ` [PATCH v9 6/8] devicetree: i2c: Add SKY81452 to the Trivial Devices list gyungoh
2014-12-02  8:05 ` [PATCH v9 7/8] regulator: sky81452: Modify Device Tree structure gyungoh
2014-12-02 12:22   ` Mark Brown
2014-12-02  8:05 ` [PATCH v9 8/8] devicetree: " gyungoh
2014-12-02 12:22   ` Mark Brown

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.