All of lore.kernel.org
 help / color / mirror / Atom feed
From: Dmitry Eremin-Solenikov <dbaryshkov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
To: Russell King <linux-lFZ/pmaqli7XmaaqVzeoHQ@public.gmane.org>,
	Daniel Mack <daniel-cYrQPVfZoowdnm+yROfE0A@public.gmane.org>,
	Robert Jarzmik <robert.jarzmik-GANU6spQydw@public.gmane.org>,
	Linus Walleij
	<linus.walleij-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>,
	Alexandre Courbot
	<gnurou-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>,
	Wolfram Sang <wsa-z923LK4zBo2bacvFa/9K2g@public.gmane.org>,
	Dmitry Torokhov
	<dmitry.torokhov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>,
	Bryan Wu <cooloney-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>,
	Richard Purdie <rpurdie-Fm38FmjxZ/leoWH0uzbU5w@public.gmane.org>,
	Samuel Ortiz <sameo-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>,
	Lee Jones <lee.jones-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>,
	Mark Brown <broonie-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>,
	Jingoo Han <jg1.han-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org>,
	Jean-Christophe Plagniol-Villard
	<plagnioj-sclMFOaUSTBWk0Htik3J/w@public.gmane.org>,
	Tomi Valkeinen <tomi.valkeinen-l0cyMroinI0@public.gmane.org>,
	Liam Girdwood <lgirdwood-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>,
	Andrea Adami
	<andrea.adami-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
Cc: linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org,
	linux-gpio-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
	linux-i2c-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
	linux-input-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
	linux-leds-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
	linux-spi-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
	linux-fbdev-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
	alsa-devel-K7yf7f+aM1XWsZ/bQMPhNw@public.gmane.org
Subject: [PATCH v2 06/17] video: lcd: add LoCoMo LCD driver
Date: Tue, 28 Apr 2015 02:55:43 +0300	[thread overview]
Message-ID: <1430178954-11138-7-git-send-email-dbaryshkov@gmail.com> (raw)
In-Reply-To: <1430178954-11138-1-git-send-email-dbaryshkov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>

LoCoMo has some special handling for TFT screens attached to Collie and
Poodle. Implement that as a separate driver.

Signed-off-by: Dmitry Eremin-Solenikov <dbaryshkov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
---
 drivers/video/backlight/Kconfig      |  10 ++
 drivers/video/backlight/Makefile     |   1 +
 drivers/video/backlight/locomo_lcd.c | 285 +++++++++++++++++++++++++++++++++++
 3 files changed, 296 insertions(+)
 create mode 100644 drivers/video/backlight/locomo_lcd.c

diff --git a/drivers/video/backlight/Kconfig b/drivers/video/backlight/Kconfig
index 6c093e2..b2f995c 100644
--- a/drivers/video/backlight/Kconfig
+++ b/drivers/video/backlight/Kconfig
@@ -48,6 +48,16 @@ config LCD_LMS283GF05
 	  SPI driver for Samsung LMS283GF05. This provides basic support
 	  for powering the LCD up/down through a sysfs interface.
 
+config LCD_LOCOMO
+	tristate "Sharp LOCOMO LCD Driver"
+	depends on MFD_LOCOMO
+	select IIO
+	help
+	  If you have a Sharp Zaurus SL-5500 (Collie) or SL-5600 (Poodle) say y to
+	  enable the LCD driver.  The panel starts up in power
+	  off state, so you need this driver in order to see any
+	  output.
+
 config LCD_LTV350QV
 	tristate "Samsung LTV350QV LCD Panel"
 	depends on SPI_MASTER
diff --git a/drivers/video/backlight/Makefile b/drivers/video/backlight/Makefile
index 2de73d2..686cf1a 100644
--- a/drivers/video/backlight/Makefile
+++ b/drivers/video/backlight/Makefile
@@ -11,6 +11,7 @@ obj-$(CONFIG_LCD_L4F00242T03)		+= l4f00242t03.o
 obj-$(CONFIG_LCD_LD9040)		+= ld9040.o
 obj-$(CONFIG_LCD_LMS283GF05)		+= lms283gf05.o
 obj-$(CONFIG_LCD_LMS501KF03)		+= lms501kf03.o
+obj-$(CONFIG_LCD_LOCOMO)		+= locomo_lcd.o
 obj-$(CONFIG_LCD_LTV350QV)		+= ltv350qv.o
 obj-$(CONFIG_LCD_PLATFORM)		+= platform_lcd.o
 obj-$(CONFIG_LCD_S6E63M0)		+= s6e63m0.o
diff --git a/drivers/video/backlight/locomo_lcd.c b/drivers/video/backlight/locomo_lcd.c
new file mode 100644
index 0000000..dc316cb
--- /dev/null
+++ b/drivers/video/backlight/locomo_lcd.c
@@ -0,0 +1,285 @@
+/*
+ * Backlight control code for Sharp Zaurus SL-5500
+ *
+ * Copyright 2005 John Lenz <lenz-hcNo3dDEHLuVc3sceRu5cw@public.gmane.org>
+ * Maintainer: Pavel Machek <pavel-+ZI9xUNit7I@public.gmane.org> (unless John wants to :-)
+ * GPL v2
+ *
+ * This driver assumes single CPU. That's okay, because collie is
+ * slightly old hardware, and no one is going to retrofit second CPU to
+ * old PDA.
+ */
+
+#include <linux/delay.h>
+#include <linux/fb.h>
+#include <linux/gpio/consumer.h>
+#include <linux/iio/consumer.h>
+#include <linux/lcd.h>
+#include <linux/mfd/locomo.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include <linux/regmap.h>
+
+struct locomo_lcd {
+	struct regmap *regmap;
+	struct platform_device *dev;
+	struct locomo_lcd_platform_data *data;
+	int power;
+	struct iio_channel *comadj;
+	struct gpio_desc *vsha, *vshd, *vee, *mod;
+};
+
+static void locomo_lcd_on(struct locomo_lcd *lcd)
+{
+	gpiod_set_value(lcd->vsha, 1);
+	usleep_range(2000, 3000);
+
+	gpiod_set_value(lcd->vshd, 1);
+	usleep_range(2000, 3000);
+
+	iio_write_channel_raw(lcd->comadj, lcd->data->comadj);
+	usleep_range(5000, 6000);
+
+	gpiod_set_value(lcd->vee, 1);
+	usleep_range(10000, 11000);
+
+	/* TFTCRST | CPSOUT=0 | CPSEN */
+	regmap_write(lcd->regmap, LOCOMO_TC, 0x01);
+
+	/* Set CPSD */
+	regmap_write(lcd->regmap, LOCOMO_CPSD, 6);
+
+	/* TFTCRST | CPSOUT=0 | CPSEN */
+	regmap_write(lcd->regmap, LOCOMO_TC, 0x04 | 0x01);
+	usleep_range(10000, 11000);
+
+	gpiod_set_value(lcd->mod, 1);
+}
+
+static void locomo_lcd_off(struct locomo_lcd *lcd)
+{
+	/* TFTCRST=1 | CPSOUT=1 | CPSEN = 0 */
+	regmap_write(lcd->regmap, LOCOMO_TC, 0x06);
+	usleep_range(1000, 2000);
+
+	gpiod_set_value(lcd->vsha, 0);
+	msleep(110);
+
+	gpiod_set_value(lcd->vee, 0);
+	msleep(700);
+
+	iio_write_channel_raw(lcd->comadj, 0);
+	usleep_range(5000, 6000);
+
+	/* TFTCRST=0 | CPSOUT=0 | CPSEN = 0 */
+	regmap_write(lcd->regmap, LOCOMO_TC, 0);
+	gpiod_set_value(lcd->mod, 0);
+	gpiod_set_value(lcd->vshd, 0);
+}
+
+static void locomo_lcd_program_adsync(struct locomo_lcd *lcd)
+{
+	regmap_write(lcd->regmap, LOCOMO_ASD,
+			6 + 8 + 320 + 30 - 10);
+	regmap_update_bits(lcd->regmap, LOCOMO_ASD,
+		0x8000,
+		0x8000);
+
+	regmap_write(lcd->regmap, LOCOMO_HSD,
+			6 + 8 + 320 + 30 - 10 - 128 + 4);
+	regmap_update_bits(lcd->regmap, LOCOMO_HSD,
+		0x8000,
+		0x8000);
+
+	regmap_write(lcd->regmap, LOCOMO_HSC, 128 / 8);
+
+	/* XON */
+	regmap_write(lcd->regmap, LOCOMO_TADC, 0x80);
+	usleep_range(1000, 1100);
+
+	/* CLK9MEN */
+	regmap_update_bits(lcd->regmap, LOCOMO_TADC,
+		0x10,
+		0x10);
+	usleep_range(100, 200);
+}
+
+static void locomo_lcd_disable_adsync(struct locomo_lcd *lcd)
+{
+	/* ADSTART */
+	regmap_write(lcd->regmap, LOCOMO_ASD, 0x00);
+
+	/* 18MHz clock off*/
+	regmap_write(lcd->regmap, LOCOMO_TADC, 0x00);
+}
+
+int locomo_lcd_set_power(struct lcd_device *ldev, int power)
+{
+	struct locomo_lcd *lcd = lcd_get_data(ldev);
+
+	dev_dbg(&ldev->dev, "LCD power %d (is %d)\n", power, lcd->power);
+
+	if (!power && lcd->power)
+		locomo_lcd_on(lcd);
+
+	if (power && !lcd->power)
+		locomo_lcd_off(lcd);
+
+	lcd->power = power;
+
+	return 0;
+}
+
+static int locomo_lcd_get_power(struct lcd_device *ldev)
+{
+	struct locomo_lcd *lcd = lcd_get_data(ldev);
+
+	return lcd->power;
+}
+
+static struct lcd_ops locomo_lcd_ops = {
+	.set_power = locomo_lcd_set_power,
+	.get_power = locomo_lcd_get_power,
+};
+
+#ifdef CONFIG_PM_SLEEP
+static int locomo_lcd_suspend(struct device *dev)
+{
+	struct lcd_device *ldev = dev_get_drvdata(dev);
+	struct locomo_lcd *lcd = lcd_get_data(ldev);
+
+	locomo_lcd_off(lcd);
+
+	locomo_lcd_disable_adsync(lcd);
+
+	return 0;
+}
+
+static int locomo_lcd_resume(struct device *dev)
+{
+	struct lcd_device *ldev = dev_get_drvdata(dev);
+	struct locomo_lcd *lcd = lcd_get_data(ldev);
+
+	locomo_lcd_program_adsync(lcd);
+
+	if (!lcd->power)
+		locomo_lcd_on(lcd);
+
+	return 0;
+}
+
+static SIMPLE_DEV_PM_OPS(locomo_lcd_pm, locomo_lcd_suspend, locomo_lcd_resume);
+#define LOCOMOLCD_PM	(&locomo_lcd_pm)
+#else
+#define LOCOMOLCD_PM	NULL
+#endif
+
+static int locomo_lcd_probe(struct platform_device *dev)
+{
+	struct lcd_device *lcd_dev;
+	struct locomo_lcd *lcd;
+	int rc;
+
+	lcd = devm_kmalloc(&dev->dev, sizeof(struct locomo_lcd), GFP_KERNEL);
+	if (!lcd)
+		return -ENOMEM;
+
+	lcd->dev = dev;
+	lcd->power = FB_BLANK_NORMAL;
+
+	lcd->regmap = dev_get_regmap(dev->dev.parent, NULL);
+	if (!lcd->regmap)
+		return -ENODEV;
+
+	lcd->data = dev_get_platdata(&dev->dev);
+	if (!lcd->data)
+		return -EINVAL;
+
+	lcd->vsha = devm_gpiod_get(&dev->dev, "VSHA", GPIOD_OUT_LOW);
+	if (IS_ERR(lcd->vsha))
+		return PTR_ERR(lcd->vsha);
+
+	lcd->vshd = devm_gpiod_get(&dev->dev, "VSHD", GPIOD_OUT_LOW);
+	if (IS_ERR(lcd->vshd))
+		return PTR_ERR(lcd->vshd);
+
+	lcd->vee = devm_gpiod_get(&dev->dev, "Vee", GPIOD_OUT_LOW);
+	if (IS_ERR(lcd->vee))
+		return PTR_ERR(lcd->vee);
+
+	lcd->mod = devm_gpiod_get(&dev->dev, "MOD", GPIOD_OUT_LOW);
+	if (IS_ERR(lcd->mod))
+		return PTR_ERR(lcd->mod);
+
+	lcd->comadj = iio_channel_get(&dev->dev, "comadj");
+	if (IS_ERR(lcd->comadj)) {
+		rc = PTR_ERR(lcd->comadj);
+		if (rc == -ENODEV)
+			rc = -EPROBE_DEFER;
+
+		return rc;
+	}
+
+	locomo_lcd_program_adsync(lcd);
+
+	lcd_dev = devm_lcd_device_register(&dev->dev, "locomo", &dev->dev, lcd,
+			&locomo_lcd_ops);
+	if (IS_ERR(lcd_dev)) {
+		rc = PTR_ERR(lcd_dev);
+		goto err;
+	}
+
+	platform_set_drvdata(dev, lcd_dev);
+
+	lcd_set_power(lcd_dev, FB_BLANK_UNBLANK);
+
+	return 0;
+
+err:
+	locomo_lcd_disable_adsync(lcd);
+	iio_channel_release(lcd->comadj);
+
+	return rc;
+}
+
+static int locomo_lcd_remove(struct platform_device *dev)
+{
+	struct lcd_device *ldev = platform_get_drvdata(dev);
+	struct locomo_lcd *lcd = lcd_get_data(ldev);
+
+	locomo_lcd_off(lcd);
+
+	locomo_lcd_disable_adsync(lcd);
+
+	iio_channel_release(lcd->comadj);
+
+	return 0;
+}
+
+static void locomo_lcd_shutdown(struct platform_device *dev)
+{
+	struct lcd_device *ldev = platform_get_drvdata(dev);
+	struct locomo_lcd *lcd = lcd_get_data(ldev);
+
+	locomo_lcd_off(lcd);
+
+	locomo_lcd_disable_adsync(lcd);
+}
+
+static struct platform_driver locomo_lcd_driver = {
+	.driver = {
+		.name	= "locomo-lcd",
+		.pm	= LOCOMOLCD_PM,
+	},
+	.probe	= locomo_lcd_probe,
+	.remove	= locomo_lcd_remove,
+	.shutdown = locomo_lcd_shutdown,
+};
+
+module_platform_driver(locomo_lcd_driver);
+
+MODULE_AUTHOR("John Lenz <lenz-hcNo3dDEHLuVc3sceRu5cw@public.gmane.org>");
+MODULE_AUTHOR("Pavel Machek <pavel-+ZI9xUNit7I@public.gmane.org>");
+MODULE_DESCRIPTION("LoCoMo LCD driver");
+MODULE_LICENSE("GPL v2");
+MODULE_ALIAS("platform:locomo-lcd");
-- 
2.1.4

WARNING: multiple messages have this Message-ID (diff)
From: Dmitry Eremin-Solenikov <dbaryshkov@gmail.com>
To: Russell King <linux-lFZ/pmaqli7XmaaqVzeoHQ@public.gmane.org>,
	Daniel Mack <daniel-cYrQPVfZoowdnm+yROfE0A@public.gmane.org>,
	Robert Jarzmik <robert.jarzmik-GANU6spQydw@public.gmane.org>,
	Linus Walleij
	<linus.walleij-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>,
	Alexandre Courbot
	<gnurou-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>,
	Wolfram Sang <wsa-z923LK4zBo2bacvFa/9K2g@public.gmane.org>,
	Dmitry Torokhov
	<dmitry.torokhov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>,
	Bryan Wu <cooloney-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>,
	Richard Purdie <rpurdie-Fm38FmjxZ/leoWH0uzbU5w@public.gmane.org>,
	Samuel Ortiz <sameo-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>,
	Lee Jones <lee.jones-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>,
	Mark Brown <broonie-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>,
	Jingoo Han <jg1.han-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org>,
	Jean-Christophe Plagniol-Villard
	<plagnioj-sclMFOaUSTBWk0Htik3J/w@public.gmane.org>,
	Tomi Valkeinen <tomi.valkeinen-l0cyMroinI0@public.gmane.org>,
	Liam Girdwood <lgirdwood-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>,
	Andrea Adami
	<andrea.adami-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
Cc: linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org,
	linux-gpio-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
	linux-i2c-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
	linux-input-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
	linux-leds-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
	linux-spi-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
	linux-fbdev-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
	alsa-devel-K7yf7f+aM1XWsZ/bQMPhNw@public.gmane.org
Subject: [PATCH v2 06/17] video: lcd: add LoCoMo LCD driver
Date: Mon, 27 Apr 2015 23:55:43 +0000	[thread overview]
Message-ID: <1430178954-11138-7-git-send-email-dbaryshkov@gmail.com> (raw)
In-Reply-To: <1430178954-11138-1-git-send-email-dbaryshkov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>

LoCoMo has some special handling for TFT screens attached to Collie and
Poodle. Implement that as a separate driver.

Signed-off-by: Dmitry Eremin-Solenikov <dbaryshkov@gmail.com>
---
 drivers/video/backlight/Kconfig      |  10 ++
 drivers/video/backlight/Makefile     |   1 +
 drivers/video/backlight/locomo_lcd.c | 285 +++++++++++++++++++++++++++++++++++
 3 files changed, 296 insertions(+)
 create mode 100644 drivers/video/backlight/locomo_lcd.c

diff --git a/drivers/video/backlight/Kconfig b/drivers/video/backlight/Kconfig
index 6c093e2..b2f995c 100644
--- a/drivers/video/backlight/Kconfig
+++ b/drivers/video/backlight/Kconfig
@@ -48,6 +48,16 @@ config LCD_LMS283GF05
 	  SPI driver for Samsung LMS283GF05. This provides basic support
 	  for powering the LCD up/down through a sysfs interface.
 
+config LCD_LOCOMO
+	tristate "Sharp LOCOMO LCD Driver"
+	depends on MFD_LOCOMO
+	select IIO
+	help
+	  If you have a Sharp Zaurus SL-5500 (Collie) or SL-5600 (Poodle) say y to
+	  enable the LCD driver.  The panel starts up in power
+	  off state, so you need this driver in order to see any
+	  output.
+
 config LCD_LTV350QV
 	tristate "Samsung LTV350QV LCD Panel"
 	depends on SPI_MASTER
diff --git a/drivers/video/backlight/Makefile b/drivers/video/backlight/Makefile
index 2de73d2..686cf1a 100644
--- a/drivers/video/backlight/Makefile
+++ b/drivers/video/backlight/Makefile
@@ -11,6 +11,7 @@ obj-$(CONFIG_LCD_L4F00242T03)		+= l4f00242t03.o
 obj-$(CONFIG_LCD_LD9040)		+= ld9040.o
 obj-$(CONFIG_LCD_LMS283GF05)		+= lms283gf05.o
 obj-$(CONFIG_LCD_LMS501KF03)		+= lms501kf03.o
+obj-$(CONFIG_LCD_LOCOMO)		+= locomo_lcd.o
 obj-$(CONFIG_LCD_LTV350QV)		+= ltv350qv.o
 obj-$(CONFIG_LCD_PLATFORM)		+= platform_lcd.o
 obj-$(CONFIG_LCD_S6E63M0)		+= s6e63m0.o
diff --git a/drivers/video/backlight/locomo_lcd.c b/drivers/video/backlight/locomo_lcd.c
new file mode 100644
index 0000000..dc316cb
--- /dev/null
+++ b/drivers/video/backlight/locomo_lcd.c
@@ -0,0 +1,285 @@
+/*
+ * Backlight control code for Sharp Zaurus SL-5500
+ *
+ * Copyright 2005 John Lenz <lenz@cs.wisc.edu>
+ * Maintainer: Pavel Machek <pavel@ucw.cz> (unless John wants to :-)
+ * GPL v2
+ *
+ * This driver assumes single CPU. That's okay, because collie is
+ * slightly old hardware, and no one is going to retrofit second CPU to
+ * old PDA.
+ */
+
+#include <linux/delay.h>
+#include <linux/fb.h>
+#include <linux/gpio/consumer.h>
+#include <linux/iio/consumer.h>
+#include <linux/lcd.h>
+#include <linux/mfd/locomo.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include <linux/regmap.h>
+
+struct locomo_lcd {
+	struct regmap *regmap;
+	struct platform_device *dev;
+	struct locomo_lcd_platform_data *data;
+	int power;
+	struct iio_channel *comadj;
+	struct gpio_desc *vsha, *vshd, *vee, *mod;
+};
+
+static void locomo_lcd_on(struct locomo_lcd *lcd)
+{
+	gpiod_set_value(lcd->vsha, 1);
+	usleep_range(2000, 3000);
+
+	gpiod_set_value(lcd->vshd, 1);
+	usleep_range(2000, 3000);
+
+	iio_write_channel_raw(lcd->comadj, lcd->data->comadj);
+	usleep_range(5000, 6000);
+
+	gpiod_set_value(lcd->vee, 1);
+	usleep_range(10000, 11000);
+
+	/* TFTCRST | CPSOUT=0 | CPSEN */
+	regmap_write(lcd->regmap, LOCOMO_TC, 0x01);
+
+	/* Set CPSD */
+	regmap_write(lcd->regmap, LOCOMO_CPSD, 6);
+
+	/* TFTCRST | CPSOUT=0 | CPSEN */
+	regmap_write(lcd->regmap, LOCOMO_TC, 0x04 | 0x01);
+	usleep_range(10000, 11000);
+
+	gpiod_set_value(lcd->mod, 1);
+}
+
+static void locomo_lcd_off(struct locomo_lcd *lcd)
+{
+	/* TFTCRST=1 | CPSOUT=1 | CPSEN = 0 */
+	regmap_write(lcd->regmap, LOCOMO_TC, 0x06);
+	usleep_range(1000, 2000);
+
+	gpiod_set_value(lcd->vsha, 0);
+	msleep(110);
+
+	gpiod_set_value(lcd->vee, 0);
+	msleep(700);
+
+	iio_write_channel_raw(lcd->comadj, 0);
+	usleep_range(5000, 6000);
+
+	/* TFTCRST=0 | CPSOUT=0 | CPSEN = 0 */
+	regmap_write(lcd->regmap, LOCOMO_TC, 0);
+	gpiod_set_value(lcd->mod, 0);
+	gpiod_set_value(lcd->vshd, 0);
+}
+
+static void locomo_lcd_program_adsync(struct locomo_lcd *lcd)
+{
+	regmap_write(lcd->regmap, LOCOMO_ASD,
+			6 + 8 + 320 + 30 - 10);
+	regmap_update_bits(lcd->regmap, LOCOMO_ASD,
+		0x8000,
+		0x8000);
+
+	regmap_write(lcd->regmap, LOCOMO_HSD,
+			6 + 8 + 320 + 30 - 10 - 128 + 4);
+	regmap_update_bits(lcd->regmap, LOCOMO_HSD,
+		0x8000,
+		0x8000);
+
+	regmap_write(lcd->regmap, LOCOMO_HSC, 128 / 8);
+
+	/* XON */
+	regmap_write(lcd->regmap, LOCOMO_TADC, 0x80);
+	usleep_range(1000, 1100);
+
+	/* CLK9MEN */
+	regmap_update_bits(lcd->regmap, LOCOMO_TADC,
+		0x10,
+		0x10);
+	usleep_range(100, 200);
+}
+
+static void locomo_lcd_disable_adsync(struct locomo_lcd *lcd)
+{
+	/* ADSTART */
+	regmap_write(lcd->regmap, LOCOMO_ASD, 0x00);
+
+	/* 18MHz clock off*/
+	regmap_write(lcd->regmap, LOCOMO_TADC, 0x00);
+}
+
+int locomo_lcd_set_power(struct lcd_device *ldev, int power)
+{
+	struct locomo_lcd *lcd = lcd_get_data(ldev);
+
+	dev_dbg(&ldev->dev, "LCD power %d (is %d)\n", power, lcd->power);
+
+	if (!power && lcd->power)
+		locomo_lcd_on(lcd);
+
+	if (power && !lcd->power)
+		locomo_lcd_off(lcd);
+
+	lcd->power = power;
+
+	return 0;
+}
+
+static int locomo_lcd_get_power(struct lcd_device *ldev)
+{
+	struct locomo_lcd *lcd = lcd_get_data(ldev);
+
+	return lcd->power;
+}
+
+static struct lcd_ops locomo_lcd_ops = {
+	.set_power = locomo_lcd_set_power,
+	.get_power = locomo_lcd_get_power,
+};
+
+#ifdef CONFIG_PM_SLEEP
+static int locomo_lcd_suspend(struct device *dev)
+{
+	struct lcd_device *ldev = dev_get_drvdata(dev);
+	struct locomo_lcd *lcd = lcd_get_data(ldev);
+
+	locomo_lcd_off(lcd);
+
+	locomo_lcd_disable_adsync(lcd);
+
+	return 0;
+}
+
+static int locomo_lcd_resume(struct device *dev)
+{
+	struct lcd_device *ldev = dev_get_drvdata(dev);
+	struct locomo_lcd *lcd = lcd_get_data(ldev);
+
+	locomo_lcd_program_adsync(lcd);
+
+	if (!lcd->power)
+		locomo_lcd_on(lcd);
+
+	return 0;
+}
+
+static SIMPLE_DEV_PM_OPS(locomo_lcd_pm, locomo_lcd_suspend, locomo_lcd_resume);
+#define LOCOMOLCD_PM	(&locomo_lcd_pm)
+#else
+#define LOCOMOLCD_PM	NULL
+#endif
+
+static int locomo_lcd_probe(struct platform_device *dev)
+{
+	struct lcd_device *lcd_dev;
+	struct locomo_lcd *lcd;
+	int rc;
+
+	lcd = devm_kmalloc(&dev->dev, sizeof(struct locomo_lcd), GFP_KERNEL);
+	if (!lcd)
+		return -ENOMEM;
+
+	lcd->dev = dev;
+	lcd->power = FB_BLANK_NORMAL;
+
+	lcd->regmap = dev_get_regmap(dev->dev.parent, NULL);
+	if (!lcd->regmap)
+		return -ENODEV;
+
+	lcd->data = dev_get_platdata(&dev->dev);
+	if (!lcd->data)
+		return -EINVAL;
+
+	lcd->vsha = devm_gpiod_get(&dev->dev, "VSHA", GPIOD_OUT_LOW);
+	if (IS_ERR(lcd->vsha))
+		return PTR_ERR(lcd->vsha);
+
+	lcd->vshd = devm_gpiod_get(&dev->dev, "VSHD", GPIOD_OUT_LOW);
+	if (IS_ERR(lcd->vshd))
+		return PTR_ERR(lcd->vshd);
+
+	lcd->vee = devm_gpiod_get(&dev->dev, "Vee", GPIOD_OUT_LOW);
+	if (IS_ERR(lcd->vee))
+		return PTR_ERR(lcd->vee);
+
+	lcd->mod = devm_gpiod_get(&dev->dev, "MOD", GPIOD_OUT_LOW);
+	if (IS_ERR(lcd->mod))
+		return PTR_ERR(lcd->mod);
+
+	lcd->comadj = iio_channel_get(&dev->dev, "comadj");
+	if (IS_ERR(lcd->comadj)) {
+		rc = PTR_ERR(lcd->comadj);
+		if (rc = -ENODEV)
+			rc = -EPROBE_DEFER;
+
+		return rc;
+	}
+
+	locomo_lcd_program_adsync(lcd);
+
+	lcd_dev = devm_lcd_device_register(&dev->dev, "locomo", &dev->dev, lcd,
+			&locomo_lcd_ops);
+	if (IS_ERR(lcd_dev)) {
+		rc = PTR_ERR(lcd_dev);
+		goto err;
+	}
+
+	platform_set_drvdata(dev, lcd_dev);
+
+	lcd_set_power(lcd_dev, FB_BLANK_UNBLANK);
+
+	return 0;
+
+err:
+	locomo_lcd_disable_adsync(lcd);
+	iio_channel_release(lcd->comadj);
+
+	return rc;
+}
+
+static int locomo_lcd_remove(struct platform_device *dev)
+{
+	struct lcd_device *ldev = platform_get_drvdata(dev);
+	struct locomo_lcd *lcd = lcd_get_data(ldev);
+
+	locomo_lcd_off(lcd);
+
+	locomo_lcd_disable_adsync(lcd);
+
+	iio_channel_release(lcd->comadj);
+
+	return 0;
+}
+
+static void locomo_lcd_shutdown(struct platform_device *dev)
+{
+	struct lcd_device *ldev = platform_get_drvdata(dev);
+	struct locomo_lcd *lcd = lcd_get_data(ldev);
+
+	locomo_lcd_off(lcd);
+
+	locomo_lcd_disable_adsync(lcd);
+}
+
+static struct platform_driver locomo_lcd_driver = {
+	.driver = {
+		.name	= "locomo-lcd",
+		.pm	= LOCOMOLCD_PM,
+	},
+	.probe	= locomo_lcd_probe,
+	.remove	= locomo_lcd_remove,
+	.shutdown = locomo_lcd_shutdown,
+};
+
+module_platform_driver(locomo_lcd_driver);
+
+MODULE_AUTHOR("John Lenz <lenz@cs.wisc.edu>");
+MODULE_AUTHOR("Pavel Machek <pavel@ucw.cz>");
+MODULE_DESCRIPTION("LoCoMo LCD driver");
+MODULE_LICENSE("GPL v2");
+MODULE_ALIAS("platform:locomo-lcd");
-- 
2.1.4


WARNING: multiple messages have this Message-ID (diff)
From: dbaryshkov@gmail.com (Dmitry Eremin-Solenikov)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v2 06/17] video: lcd: add LoCoMo LCD driver
Date: Tue, 28 Apr 2015 02:55:43 +0300	[thread overview]
Message-ID: <1430178954-11138-7-git-send-email-dbaryshkov@gmail.com> (raw)
In-Reply-To: <1430178954-11138-1-git-send-email-dbaryshkov@gmail.com>

LoCoMo has some special handling for TFT screens attached to Collie and
Poodle. Implement that as a separate driver.

Signed-off-by: Dmitry Eremin-Solenikov <dbaryshkov@gmail.com>
---
 drivers/video/backlight/Kconfig      |  10 ++
 drivers/video/backlight/Makefile     |   1 +
 drivers/video/backlight/locomo_lcd.c | 285 +++++++++++++++++++++++++++++++++++
 3 files changed, 296 insertions(+)
 create mode 100644 drivers/video/backlight/locomo_lcd.c

diff --git a/drivers/video/backlight/Kconfig b/drivers/video/backlight/Kconfig
index 6c093e2..b2f995c 100644
--- a/drivers/video/backlight/Kconfig
+++ b/drivers/video/backlight/Kconfig
@@ -48,6 +48,16 @@ config LCD_LMS283GF05
 	  SPI driver for Samsung LMS283GF05. This provides basic support
 	  for powering the LCD up/down through a sysfs interface.
 
+config LCD_LOCOMO
+	tristate "Sharp LOCOMO LCD Driver"
+	depends on MFD_LOCOMO
+	select IIO
+	help
+	  If you have a Sharp Zaurus SL-5500 (Collie) or SL-5600 (Poodle) say y to
+	  enable the LCD driver.  The panel starts up in power
+	  off state, so you need this driver in order to see any
+	  output.
+
 config LCD_LTV350QV
 	tristate "Samsung LTV350QV LCD Panel"
 	depends on SPI_MASTER
diff --git a/drivers/video/backlight/Makefile b/drivers/video/backlight/Makefile
index 2de73d2..686cf1a 100644
--- a/drivers/video/backlight/Makefile
+++ b/drivers/video/backlight/Makefile
@@ -11,6 +11,7 @@ obj-$(CONFIG_LCD_L4F00242T03)		+= l4f00242t03.o
 obj-$(CONFIG_LCD_LD9040)		+= ld9040.o
 obj-$(CONFIG_LCD_LMS283GF05)		+= lms283gf05.o
 obj-$(CONFIG_LCD_LMS501KF03)		+= lms501kf03.o
+obj-$(CONFIG_LCD_LOCOMO)		+= locomo_lcd.o
 obj-$(CONFIG_LCD_LTV350QV)		+= ltv350qv.o
 obj-$(CONFIG_LCD_PLATFORM)		+= platform_lcd.o
 obj-$(CONFIG_LCD_S6E63M0)		+= s6e63m0.o
diff --git a/drivers/video/backlight/locomo_lcd.c b/drivers/video/backlight/locomo_lcd.c
new file mode 100644
index 0000000..dc316cb
--- /dev/null
+++ b/drivers/video/backlight/locomo_lcd.c
@@ -0,0 +1,285 @@
+/*
+ * Backlight control code for Sharp Zaurus SL-5500
+ *
+ * Copyright 2005 John Lenz <lenz@cs.wisc.edu>
+ * Maintainer: Pavel Machek <pavel@ucw.cz> (unless John wants to :-)
+ * GPL v2
+ *
+ * This driver assumes single CPU. That's okay, because collie is
+ * slightly old hardware, and no one is going to retrofit second CPU to
+ * old PDA.
+ */
+
+#include <linux/delay.h>
+#include <linux/fb.h>
+#include <linux/gpio/consumer.h>
+#include <linux/iio/consumer.h>
+#include <linux/lcd.h>
+#include <linux/mfd/locomo.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include <linux/regmap.h>
+
+struct locomo_lcd {
+	struct regmap *regmap;
+	struct platform_device *dev;
+	struct locomo_lcd_platform_data *data;
+	int power;
+	struct iio_channel *comadj;
+	struct gpio_desc *vsha, *vshd, *vee, *mod;
+};
+
+static void locomo_lcd_on(struct locomo_lcd *lcd)
+{
+	gpiod_set_value(lcd->vsha, 1);
+	usleep_range(2000, 3000);
+
+	gpiod_set_value(lcd->vshd, 1);
+	usleep_range(2000, 3000);
+
+	iio_write_channel_raw(lcd->comadj, lcd->data->comadj);
+	usleep_range(5000, 6000);
+
+	gpiod_set_value(lcd->vee, 1);
+	usleep_range(10000, 11000);
+
+	/* TFTCRST | CPSOUT=0 | CPSEN */
+	regmap_write(lcd->regmap, LOCOMO_TC, 0x01);
+
+	/* Set CPSD */
+	regmap_write(lcd->regmap, LOCOMO_CPSD, 6);
+
+	/* TFTCRST | CPSOUT=0 | CPSEN */
+	regmap_write(lcd->regmap, LOCOMO_TC, 0x04 | 0x01);
+	usleep_range(10000, 11000);
+
+	gpiod_set_value(lcd->mod, 1);
+}
+
+static void locomo_lcd_off(struct locomo_lcd *lcd)
+{
+	/* TFTCRST=1 | CPSOUT=1 | CPSEN = 0 */
+	regmap_write(lcd->regmap, LOCOMO_TC, 0x06);
+	usleep_range(1000, 2000);
+
+	gpiod_set_value(lcd->vsha, 0);
+	msleep(110);
+
+	gpiod_set_value(lcd->vee, 0);
+	msleep(700);
+
+	iio_write_channel_raw(lcd->comadj, 0);
+	usleep_range(5000, 6000);
+
+	/* TFTCRST=0 | CPSOUT=0 | CPSEN = 0 */
+	regmap_write(lcd->regmap, LOCOMO_TC, 0);
+	gpiod_set_value(lcd->mod, 0);
+	gpiod_set_value(lcd->vshd, 0);
+}
+
+static void locomo_lcd_program_adsync(struct locomo_lcd *lcd)
+{
+	regmap_write(lcd->regmap, LOCOMO_ASD,
+			6 + 8 + 320 + 30 - 10);
+	regmap_update_bits(lcd->regmap, LOCOMO_ASD,
+		0x8000,
+		0x8000);
+
+	regmap_write(lcd->regmap, LOCOMO_HSD,
+			6 + 8 + 320 + 30 - 10 - 128 + 4);
+	regmap_update_bits(lcd->regmap, LOCOMO_HSD,
+		0x8000,
+		0x8000);
+
+	regmap_write(lcd->regmap, LOCOMO_HSC, 128 / 8);
+
+	/* XON */
+	regmap_write(lcd->regmap, LOCOMO_TADC, 0x80);
+	usleep_range(1000, 1100);
+
+	/* CLK9MEN */
+	regmap_update_bits(lcd->regmap, LOCOMO_TADC,
+		0x10,
+		0x10);
+	usleep_range(100, 200);
+}
+
+static void locomo_lcd_disable_adsync(struct locomo_lcd *lcd)
+{
+	/* ADSTART */
+	regmap_write(lcd->regmap, LOCOMO_ASD, 0x00);
+
+	/* 18MHz clock off*/
+	regmap_write(lcd->regmap, LOCOMO_TADC, 0x00);
+}
+
+int locomo_lcd_set_power(struct lcd_device *ldev, int power)
+{
+	struct locomo_lcd *lcd = lcd_get_data(ldev);
+
+	dev_dbg(&ldev->dev, "LCD power %d (is %d)\n", power, lcd->power);
+
+	if (!power && lcd->power)
+		locomo_lcd_on(lcd);
+
+	if (power && !lcd->power)
+		locomo_lcd_off(lcd);
+
+	lcd->power = power;
+
+	return 0;
+}
+
+static int locomo_lcd_get_power(struct lcd_device *ldev)
+{
+	struct locomo_lcd *lcd = lcd_get_data(ldev);
+
+	return lcd->power;
+}
+
+static struct lcd_ops locomo_lcd_ops = {
+	.set_power = locomo_lcd_set_power,
+	.get_power = locomo_lcd_get_power,
+};
+
+#ifdef CONFIG_PM_SLEEP
+static int locomo_lcd_suspend(struct device *dev)
+{
+	struct lcd_device *ldev = dev_get_drvdata(dev);
+	struct locomo_lcd *lcd = lcd_get_data(ldev);
+
+	locomo_lcd_off(lcd);
+
+	locomo_lcd_disable_adsync(lcd);
+
+	return 0;
+}
+
+static int locomo_lcd_resume(struct device *dev)
+{
+	struct lcd_device *ldev = dev_get_drvdata(dev);
+	struct locomo_lcd *lcd = lcd_get_data(ldev);
+
+	locomo_lcd_program_adsync(lcd);
+
+	if (!lcd->power)
+		locomo_lcd_on(lcd);
+
+	return 0;
+}
+
+static SIMPLE_DEV_PM_OPS(locomo_lcd_pm, locomo_lcd_suspend, locomo_lcd_resume);
+#define LOCOMOLCD_PM	(&locomo_lcd_pm)
+#else
+#define LOCOMOLCD_PM	NULL
+#endif
+
+static int locomo_lcd_probe(struct platform_device *dev)
+{
+	struct lcd_device *lcd_dev;
+	struct locomo_lcd *lcd;
+	int rc;
+
+	lcd = devm_kmalloc(&dev->dev, sizeof(struct locomo_lcd), GFP_KERNEL);
+	if (!lcd)
+		return -ENOMEM;
+
+	lcd->dev = dev;
+	lcd->power = FB_BLANK_NORMAL;
+
+	lcd->regmap = dev_get_regmap(dev->dev.parent, NULL);
+	if (!lcd->regmap)
+		return -ENODEV;
+
+	lcd->data = dev_get_platdata(&dev->dev);
+	if (!lcd->data)
+		return -EINVAL;
+
+	lcd->vsha = devm_gpiod_get(&dev->dev, "VSHA", GPIOD_OUT_LOW);
+	if (IS_ERR(lcd->vsha))
+		return PTR_ERR(lcd->vsha);
+
+	lcd->vshd = devm_gpiod_get(&dev->dev, "VSHD", GPIOD_OUT_LOW);
+	if (IS_ERR(lcd->vshd))
+		return PTR_ERR(lcd->vshd);
+
+	lcd->vee = devm_gpiod_get(&dev->dev, "Vee", GPIOD_OUT_LOW);
+	if (IS_ERR(lcd->vee))
+		return PTR_ERR(lcd->vee);
+
+	lcd->mod = devm_gpiod_get(&dev->dev, "MOD", GPIOD_OUT_LOW);
+	if (IS_ERR(lcd->mod))
+		return PTR_ERR(lcd->mod);
+
+	lcd->comadj = iio_channel_get(&dev->dev, "comadj");
+	if (IS_ERR(lcd->comadj)) {
+		rc = PTR_ERR(lcd->comadj);
+		if (rc == -ENODEV)
+			rc = -EPROBE_DEFER;
+
+		return rc;
+	}
+
+	locomo_lcd_program_adsync(lcd);
+
+	lcd_dev = devm_lcd_device_register(&dev->dev, "locomo", &dev->dev, lcd,
+			&locomo_lcd_ops);
+	if (IS_ERR(lcd_dev)) {
+		rc = PTR_ERR(lcd_dev);
+		goto err;
+	}
+
+	platform_set_drvdata(dev, lcd_dev);
+
+	lcd_set_power(lcd_dev, FB_BLANK_UNBLANK);
+
+	return 0;
+
+err:
+	locomo_lcd_disable_adsync(lcd);
+	iio_channel_release(lcd->comadj);
+
+	return rc;
+}
+
+static int locomo_lcd_remove(struct platform_device *dev)
+{
+	struct lcd_device *ldev = platform_get_drvdata(dev);
+	struct locomo_lcd *lcd = lcd_get_data(ldev);
+
+	locomo_lcd_off(lcd);
+
+	locomo_lcd_disable_adsync(lcd);
+
+	iio_channel_release(lcd->comadj);
+
+	return 0;
+}
+
+static void locomo_lcd_shutdown(struct platform_device *dev)
+{
+	struct lcd_device *ldev = platform_get_drvdata(dev);
+	struct locomo_lcd *lcd = lcd_get_data(ldev);
+
+	locomo_lcd_off(lcd);
+
+	locomo_lcd_disable_adsync(lcd);
+}
+
+static struct platform_driver locomo_lcd_driver = {
+	.driver = {
+		.name	= "locomo-lcd",
+		.pm	= LOCOMOLCD_PM,
+	},
+	.probe	= locomo_lcd_probe,
+	.remove	= locomo_lcd_remove,
+	.shutdown = locomo_lcd_shutdown,
+};
+
+module_platform_driver(locomo_lcd_driver);
+
+MODULE_AUTHOR("John Lenz <lenz@cs.wisc.edu>");
+MODULE_AUTHOR("Pavel Machek <pavel@ucw.cz>");
+MODULE_DESCRIPTION("LoCoMo LCD driver");
+MODULE_LICENSE("GPL v2");
+MODULE_ALIAS("platform:locomo-lcd");
-- 
2.1.4

  parent reply	other threads:[~2015-04-27 23:55 UTC|newest]

Thread overview: 148+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-04-27 23:55 [PATCH v2 00/17] new locomo driver set Dmitry Eremin-Solenikov
2015-04-27 23:55 ` Dmitry Eremin-Solenikov
2015-04-27 23:55 ` Dmitry Eremin-Solenikov
2015-04-27 23:55 ` [PATCH v2 01/17] mfd: add new driver for Sharp LoCoMo Dmitry Eremin-Solenikov
2015-04-27 23:55   ` Dmitry Eremin-Solenikov
     [not found]   ` <1430178954-11138-2-git-send-email-dbaryshkov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2015-04-28 18:45     ` Lee Jones
2015-04-28 18:45       ` Lee Jones
2015-05-12 20:39       ` Dmitry Eremin-Solenikov
2015-05-12 20:39         ` Dmitry Eremin-Solenikov
2015-05-12 20:39         ` Dmitry Eremin-Solenikov
2015-05-12 20:39         ` Dmitry Eremin-Solenikov
2015-05-13  9:41         ` Lee Jones
2015-05-13  9:41           ` Lee Jones
2015-05-13  9:41           ` Lee Jones
2015-05-13  9:41           ` Lee Jones
2015-04-27 23:55 ` [PATCH v2 02/17] leds: port locomo leds driver to new locomo core Dmitry Eremin-Solenikov
2015-04-27 23:55   ` Dmitry Eremin-Solenikov
2015-04-27 23:55   ` Dmitry Eremin-Solenikov
2015-05-06 15:05   ` Jacek Anaszewski
2015-05-06 15:05     ` Jacek Anaszewski
2015-05-06 15:05     ` Jacek Anaszewski
2015-05-12 15:35     ` Dmitry Eremin-Solenikov
2015-05-12 15:35       ` Dmitry Eremin-Solenikov
2015-05-12 15:35       ` Dmitry Eremin-Solenikov
2015-05-12 15:35       ` Dmitry Eremin-Solenikov
     [not found]       ` <CALT56yNJWapNw1XLrzfbUDUz1LF_BB9DfF94H6GhbnBUEP80_w-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2015-05-13 10:31         ` Jacek Anaszewski
2015-05-13 10:31           ` Jacek Anaszewski
2015-05-13 10:31           ` Jacek Anaszewski
2015-05-13 10:31           ` Jacek Anaszewski
     [not found]           ` <555327EA.5060402-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org>
2015-05-13 14:14             ` Dmitry Eremin-Solenikov
2015-05-13 14:14               ` Dmitry Eremin-Solenikov
2015-05-13 14:14               ` Dmitry Eremin-Solenikov
2015-05-13 14:14               ` Dmitry Eremin-Solenikov
2015-05-13 14:53               ` Jacek Anaszewski
2015-05-13 14:53                 ` Jacek Anaszewski
2015-05-13 14:53                 ` Jacek Anaszewski
2015-05-13 14:53                 ` Jacek Anaszewski
     [not found]                 ` <5553654F.4010608-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org>
2015-05-13 16:42                   ` Dmitry Torokhov
2015-05-13 16:42                     ` Dmitry Torokhov
2015-05-13 16:42                     ` Dmitry Torokhov
2015-05-13 16:42                     ` Dmitry Torokhov
2015-05-14  6:35                     ` Jacek Anaszewski
2015-05-14  6:35                       ` Jacek Anaszewski
2015-05-14  6:35                       ` Jacek Anaszewski
2015-05-14  6:35                       ` Jacek Anaszewski
2015-04-27 23:55 ` [PATCH v2 05/17] video: backlight: add new locomo backlight driver Dmitry Eremin-Solenikov
2015-04-27 23:55   ` Dmitry Eremin-Solenikov
2015-04-27 23:55   ` Dmitry Eremin-Solenikov
     [not found] ` <1430178954-11138-1-git-send-email-dbaryshkov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2015-04-27 23:55   ` [PATCH v2 03/17] input: convert LoCoMo keyboard driver to use new locomo core Dmitry Eremin-Solenikov
2015-04-27 23:55     ` Dmitry Eremin-Solenikov
2015-04-27 23:55     ` Dmitry Eremin-Solenikov
2015-05-12 20:21     ` Dmitry Torokhov
2015-05-12 20:21       ` Dmitry Torokhov
2015-05-12 20:21       ` Dmitry Torokhov
2015-05-12 21:01       ` Dmitry Eremin-Solenikov
2015-05-12 21:01         ` Dmitry Eremin-Solenikov
2015-05-12 21:01         ` Dmitry Eremin-Solenikov
2015-05-12 21:01         ` Dmitry Eremin-Solenikov
2015-05-12 21:13         ` Dmitry Torokhov
2015-05-12 21:13           ` Dmitry Torokhov
2015-05-12 21:13           ` Dmitry Torokhov
2015-05-12 21:13           ` Dmitry Torokhov
2015-04-27 23:55   ` [PATCH v2 04/17] input: locomokbd: provide an Alt-SysRQ combination Dmitry Eremin-Solenikov
2015-04-27 23:55     ` Dmitry Eremin-Solenikov
2015-04-27 23:55     ` Dmitry Eremin-Solenikov
2015-05-12 20:12     ` Dmitry Torokhov
2015-05-12 20:12       ` Dmitry Torokhov
2015-05-12 20:12       ` Dmitry Torokhov
2015-05-12 20:40       ` Dmitry Eremin-Solenikov
2015-05-12 20:40         ` Dmitry Eremin-Solenikov
2015-05-12 20:40         ` Dmitry Eremin-Solenikov
2015-05-12 20:40         ` Dmitry Eremin-Solenikov
2015-04-27 23:55   ` Dmitry Eremin-Solenikov [this message]
2015-04-27 23:55     ` [PATCH v2 06/17] video: lcd: add LoCoMo LCD driver Dmitry Eremin-Solenikov
2015-04-27 23:55     ` Dmitry Eremin-Solenikov
2015-04-27 23:55   ` [PATCH v2 10/17] i2c: add locomo i2c driver Dmitry Eremin-Solenikov
2015-04-27 23:55     ` Dmitry Eremin-Solenikov
2015-04-27 23:55     ` Dmitry Eremin-Solenikov
2015-05-12 19:24     ` Wolfram Sang
2015-05-12 19:24       ` Wolfram Sang
2015-05-12 19:24       ` Wolfram Sang
2015-05-12 19:27       ` Dmitry Eremin-Solenikov
2015-05-12 19:27         ` Dmitry Eremin-Solenikov
2015-05-12 19:27         ` Dmitry Eremin-Solenikov
2015-05-12 19:27         ` Dmitry Eremin-Solenikov
2015-05-12 19:28         ` Wolfram Sang
2015-05-12 19:28           ` Wolfram Sang
2015-05-12 19:28           ` Wolfram Sang
2015-05-12 19:28           ` Wolfram Sang
2015-04-27 23:55 ` [PATCH v2 07/17] gpio: port LoCoMo gpio support from old driver Dmitry Eremin-Solenikov
2015-04-27 23:55   ` Dmitry Eremin-Solenikov
2015-04-27 23:55   ` Dmitry Eremin-Solenikov
2015-05-06 14:12   ` Linus Walleij
2015-05-06 14:12     ` Linus Walleij
2015-05-06 14:12     ` Linus Walleij
2015-04-27 23:55 ` [PATCH v2 08/17] gpio: locomo: implement per-pin irq handling Dmitry Eremin-Solenikov
2015-04-27 23:55   ` Dmitry Eremin-Solenikov
2015-04-27 23:55   ` Dmitry Eremin-Solenikov
2015-05-06 14:15   ` Linus Walleij
2015-05-06 14:15     ` Linus Walleij
2015-05-06 14:15     ` Linus Walleij
2015-05-06 16:42     ` Dmitry Eremin-Solenikov
2015-05-06 16:42       ` Dmitry Eremin-Solenikov
2015-05-06 16:42       ` Dmitry Eremin-Solenikov
2015-05-12 11:15       ` Linus Walleij
2015-05-12 11:15         ` Linus Walleij
2015-05-12 11:15         ` Linus Walleij
2015-04-27 23:55 ` [PATCH v2 09/17] spi: add locomo SPI driver Dmitry Eremin-Solenikov
2015-04-27 23:55   ` Dmitry Eremin-Solenikov
2015-04-27 23:55   ` Dmitry Eremin-Solenikov
2015-04-29 11:27   ` Mark Brown
2015-04-29 11:27     ` Mark Brown
2015-04-29 11:27     ` Mark Brown
2015-04-27 23:55 ` [PATCH v2 11/17] ARM: sa1100: make collie use new locomo drivers Dmitry Eremin-Solenikov
2015-04-27 23:55   ` Dmitry Eremin-Solenikov
2015-04-27 23:55   ` Dmitry Eremin-Solenikov
2015-04-27 23:55 ` [PATCH v2 12/17] ARM: sa1100: don't preallocate IRQ space for locomo Dmitry Eremin-Solenikov
2015-04-27 23:55   ` Dmitry Eremin-Solenikov
2015-04-27 23:55   ` Dmitry Eremin-Solenikov
2015-04-27 23:55 ` [PATCH v2 13/17] ASoC: pxa: poodle: make use of new locomo GPIO interface Dmitry Eremin-Solenikov
2015-04-27 23:55   ` Dmitry Eremin-Solenikov
2015-04-27 23:55   ` Dmitry Eremin-Solenikov
2015-05-06 14:19   ` Linus Walleij
2015-05-06 14:19     ` Linus Walleij
2015-05-06 14:19     ` Linus Walleij
2015-04-27 23:55 ` [PATCH v2 14/17] ARM: pxa: poodle: use new LoCoMo driver Dmitry Eremin-Solenikov
2015-04-27 23:55   ` Dmitry Eremin-Solenikov
2015-04-27 23:55   ` Dmitry Eremin-Solenikov
     [not found]   ` <1430178954-11138-15-git-send-email-dbaryshkov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2015-04-28 19:35     ` Robert Jarzmik
2015-04-28 19:35       ` Robert Jarzmik
2015-04-28 19:35       ` Robert Jarzmik
2015-05-06 14:20     ` Linus Walleij
2015-05-06 14:20       ` Linus Walleij
2015-05-06 14:20       ` Linus Walleij
2015-04-27 23:55 ` [PATCH v2 15/17] ARM: pxa: poodle: don't preallocate IRQ space for locomo Dmitry Eremin-Solenikov
2015-04-27 23:55   ` Dmitry Eremin-Solenikov
2015-04-27 23:55   ` Dmitry Eremin-Solenikov
2015-04-28 19:36   ` Robert Jarzmik
2015-04-28 19:36     ` Robert Jarzmik
2015-04-28 19:36     ` Robert Jarzmik
2015-04-27 23:55 ` [PATCH v2 16/17] video: backlight: drop old locomo bl/lcd driver Dmitry Eremin-Solenikov
2015-04-27 23:55   ` Dmitry Eremin-Solenikov
2015-04-27 23:55   ` Dmitry Eremin-Solenikov
2015-04-27 23:55 ` [PATCH v2 17/17] ARM: drop old LoCoMo driver Dmitry Eremin-Solenikov
2015-04-27 23:55   ` Dmitry Eremin-Solenikov
     [not found]   ` <1430178954-11138-18-git-send-email-dbaryshkov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2015-05-06 14:22     ` Linus Walleij
2015-05-06 14:22       ` Linus Walleij
2015-05-06 14:22       ` Linus Walleij

Reply instructions:

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

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

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

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

  git send-email \
    --in-reply-to=1430178954-11138-7-git-send-email-dbaryshkov@gmail.com \
    --to=dbaryshkov-re5jqeeqqe8avxtiumwx3w@public.gmane.org \
    --cc=alsa-devel-K7yf7f+aM1XWsZ/bQMPhNw@public.gmane.org \
    --cc=andrea.adami-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org \
    --cc=broonie-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org \
    --cc=cooloney-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org \
    --cc=daniel-cYrQPVfZoowdnm+yROfE0A@public.gmane.org \
    --cc=dmitry.torokhov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org \
    --cc=gnurou-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org \
    --cc=jg1.han-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org \
    --cc=lee.jones-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org \
    --cc=lgirdwood-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org \
    --cc=linus.walleij-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org \
    --cc=linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org \
    --cc=linux-fbdev-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    --cc=linux-gpio-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    --cc=linux-i2c-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    --cc=linux-input-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    --cc=linux-lFZ/pmaqli7XmaaqVzeoHQ@public.gmane.org \
    --cc=linux-leds-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    --cc=linux-spi-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    --cc=plagnioj-sclMFOaUSTBWk0Htik3J/w@public.gmane.org \
    --cc=robert.jarzmik-GANU6spQydw@public.gmane.org \
    --cc=rpurdie-Fm38FmjxZ/leoWH0uzbU5w@public.gmane.org \
    --cc=sameo-VuQAYsv1563Yd54FQh9/CA@public.gmane.org \
    --cc=tomi.valkeinen-l0cyMroinI0@public.gmane.org \
    --cc=wsa-z923LK4zBo2bacvFa/9K2g@public.gmane.org \
    /path/to/YOUR_REPLY

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

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