* [RFC v6 0/8] Crystalcove (CRC) PMIC based panel and pwm control
@ 2015-04-24 15:33 Shobhit Kumar
2015-04-24 15:33 ` [RFC v6 1/8] drivers/gpio/gpiolib: Add support for removing registered consumer lookup table Shobhit Kumar
` (7 more replies)
0 siblings, 8 replies; 15+ messages in thread
From: Shobhit Kumar @ 2015-04-24 15:33 UTC (permalink / raw)
To: intel-gfx; +Cc: Jani Nikula, Daniel Vetter, Shobhit Kumar
Hi All,
Finally I came back to this and tried to address the pending review comments.
Couple of the patches from the older series were merged in linux-next. This
series reworks on the remaining and rebases on linux-next. Basically following
are implemented -
1. GPIO control for panel enable/disable with GFX device as consumer
2. New PWM chip driver added for CRC PMIC based backlight control
3. i915 is modified to use the CRC gpio chip and the CRC PWM chip to do
backlight control. This is now added in intel_panel.c in the generic
panel backlight control infrastructure
All these patches have been tested on AsusT100 and working fine using
/sys/class/backlight/intel_backlight interface.
Recently I noticed another device Dell Venue 8 Pro (BYT-CR) which should be
using LPSS backlight control. There is already a LPSS PWM chip driver in
upstream kernel which should be used in this case. That patch is for another
day.
Regards
Shobhit
Shobhit Kumar (8):
drivers/gpio/gpiolib: Add support for removing registered consumer
lookup table
drivers/pwm/core: Add support to remove registered consumer lookup
tables
drivers/mfd: Add lookup table for Panel Control as GPIO signal
drivers/mfd: Add PWM cell device for Crystalcove PMIC
drivers/mfd: ADD PWM lookup table for CRC PMIC based PWM
drivers/pwm: Add Crystalcove (CRC) PWM driver
drm/i915: Use the CRC gpio for panel enable/disable
drm/i915: Backlight control using CRC PMIC based PWM driver
drivers/gpio/gpiolib.c | 13 +++
drivers/gpu/drm/i915/intel_drv.h | 5 ++
drivers/gpu/drm/i915/intel_dsi.c | 38 ++++++++-
drivers/gpu/drm/i915/intel_dsi.h | 6 ++
drivers/gpu/drm/i915/intel_panel.c | 92 ++++++++++++++++++--
drivers/mfd/intel_soc_pmic_core.c | 29 +++++++
drivers/mfd/intel_soc_pmic_crc.c | 3 +
drivers/pwm/Kconfig | 7 ++
drivers/pwm/Makefile | 1 +
drivers/pwm/core.c | 17 ++++
drivers/pwm/pwm-crc.c | 171 +++++++++++++++++++++++++++++++++++++
include/linux/gpio/machine.h | 1 +
include/linux/pwm.h | 5 ++
13 files changed, 381 insertions(+), 7 deletions(-)
create mode 100644 drivers/pwm/pwm-crc.c
--
2.1.0
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply [flat|nested] 15+ messages in thread
* [RFC v6 1/8] drivers/gpio/gpiolib: Add support for removing registered consumer lookup table
2015-04-24 15:33 [RFC v6 0/8] Crystalcove (CRC) PMIC based panel and pwm control Shobhit Kumar
@ 2015-04-24 15:33 ` Shobhit Kumar
2015-04-24 15:41 ` Shobhit Kumar
2015-04-24 15:33 ` [RFC v6 2/8] drivers/pwm/core: Add support to remove registered consumer lookup tables Shobhit Kumar
` (6 subsequent siblings)
7 siblings, 1 reply; 15+ messages in thread
From: Shobhit Kumar @ 2015-04-24 15:33 UTC (permalink / raw)
To: intel-gfx; +Cc: Jani Nikula, Daniel Vetter, Shobhit Kumar
In case we unload and load a driver module again that is registering a
lookup table, without this it will result in multiple entries. Provide
an option to remove the lookup table on driver unload
Signed-off-by: Shobhit Kumar <shobhit.kumar@intel.com>
---
drivers/gpio/gpiolib.c | 13 +++++++++++++
include/linux/gpio/machine.h | 1 +
2 files changed, 14 insertions(+)
diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c
index 59eaa23..2420af9 100644
--- a/drivers/gpio/gpiolib.c
+++ b/drivers/gpio/gpiolib.c
@@ -1658,6 +1658,19 @@ void gpiod_add_lookup_table(struct gpiod_lookup_table *table)
mutex_unlock(&gpio_lookup_lock);
}
+/**
+ * gpiod_remove_lookup_table() - unregister GPIO device consumers
+ * @table: table of consumers to unregister
+ */
+void gpiod_remove_lookup_table(struct gpiod_lookup_table *table)
+{
+ mutex_lock(&gpio_lookup_lock);
+
+ list_del(&table->list);
+
+ mutex_unlock(&gpio_lookup_lock);
+}
+
static struct gpio_desc *of_find_gpio(struct device *dev, const char *con_id,
unsigned int idx,
enum gpio_lookup_flags *flags)
diff --git a/include/linux/gpio/machine.h b/include/linux/gpio/machine.h
index e270614..c0d712d 100644
--- a/include/linux/gpio/machine.h
+++ b/include/linux/gpio/machine.h
@@ -57,5 +57,6 @@ struct gpiod_lookup_table {
}
void gpiod_add_lookup_table(struct gpiod_lookup_table *table);
+void gpiod_remove_lookup_table(struct gpiod_lookup_table *table);
#endif /* __LINUX_GPIO_MACHINE_H */
--
2.1.0
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [RFC v6 2/8] drivers/pwm/core: Add support to remove registered consumer lookup tables
2015-04-24 15:33 [RFC v6 0/8] Crystalcove (CRC) PMIC based panel and pwm control Shobhit Kumar
2015-04-24 15:33 ` [RFC v6 1/8] drivers/gpio/gpiolib: Add support for removing registered consumer lookup table Shobhit Kumar
@ 2015-04-24 15:33 ` Shobhit Kumar
2015-04-24 15:42 ` Shobhit Kumar
2015-04-24 15:33 ` [RFC v6 3/8] drivers/mfd: Add lookup table for Panel Control as GPIO signal Shobhit Kumar
` (5 subsequent siblings)
7 siblings, 1 reply; 15+ messages in thread
From: Shobhit Kumar @ 2015-04-24 15:33 UTC (permalink / raw)
To: intel-gfx; +Cc: Jani Nikula, Daniel Vetter, Shobhit Kumar
In case some drivers are unloading, they can remove lookup tables which
they would have registered during their load time to avoid redundant
entries if loaded again
Signed-off-by: Shobhit Kumar <shobhit.kumar@intel.com>
---
drivers/pwm/core.c | 17 +++++++++++++++++
include/linux/pwm.h | 5 +++++
2 files changed, 22 insertions(+)
diff --git a/drivers/pwm/core.c b/drivers/pwm/core.c
index ba34c7d..d2fe7c8d 100644
--- a/drivers/pwm/core.c
+++ b/drivers/pwm/core.c
@@ -586,6 +586,23 @@ void pwm_add_table(struct pwm_lookup *table, size_t num)
}
/**
+ * pwm_remove_table() - un-register PWM device consumers
+ * @table: array of consumers to un-register
+ * @num: number of consumers in table
+ */
+void pwm_remove_table(struct pwm_lookup *table, size_t num)
+{
+ mutex_lock(&pwm_lookup_lock);
+
+ while (num--) {
+ list_del(&table->list);
+ table++;
+ }
+
+ mutex_unlock(&pwm_lookup_lock);
+}
+
+/**
* pwm_get() - look up and request a PWM device
* @dev: device for PWM consumer
* @con_id: consumer name
diff --git a/include/linux/pwm.h b/include/linux/pwm.h
index e90628c..cfe2d8d 100644
--- a/include/linux/pwm.h
+++ b/include/linux/pwm.h
@@ -290,10 +290,15 @@ struct pwm_lookup {
#if IS_ENABLED(CONFIG_PWM)
void pwm_add_table(struct pwm_lookup *table, size_t num);
+void pwm_remove_table(struct pwm_lookup *table, size_t num);
#else
static inline void pwm_add_table(struct pwm_lookup *table, size_t num)
{
}
+
+static inline void pwm_remove_table(struct pwm_lookup *table, size_t num)
+{
+}
#endif
#ifdef CONFIG_PWM_SYSFS
--
2.1.0
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [RFC v6 3/8] drivers/mfd: Add lookup table for Panel Control as GPIO signal
2015-04-24 15:33 [RFC v6 0/8] Crystalcove (CRC) PMIC based panel and pwm control Shobhit Kumar
2015-04-24 15:33 ` [RFC v6 1/8] drivers/gpio/gpiolib: Add support for removing registered consumer lookup table Shobhit Kumar
2015-04-24 15:33 ` [RFC v6 2/8] drivers/pwm/core: Add support to remove registered consumer lookup tables Shobhit Kumar
@ 2015-04-24 15:33 ` Shobhit Kumar
2015-05-06 13:11 ` Linus Walleij
2015-04-24 15:33 ` [RFC v6 4/8] drivers/mfd: Add PWM cell device for Crystalcove PMIC Shobhit Kumar
` (4 subsequent siblings)
7 siblings, 1 reply; 15+ messages in thread
From: Shobhit Kumar @ 2015-04-24 15:33 UTC (permalink / raw)
To: intel-gfx
Cc: Alexandre Courbot, Samuel Ortiz, Jani Nikula, Shobhit Kumar,
Linus Walleij, Thierry Reding, Daniel Vetter
On some Intel SoC platforms, the panel enable/disable signals are
controlled by CRC PMIC. Add those control as a new GPIO in a lookup
table for gpio-crystalcove chip during CRC driver load
v2: Make the lookup table static (Thierry)
Remove the lookup table during driver remove (Thierry)
CC: Samuel Ortiz <sameo@linux.intel.com>
Cc: Linus Walleij <linus.walleij@linaro.org>
Cc: Alexandre Courbot <gnurou@gmail.com>
Cc: Thierry Reding <thierry.reding@gmail.com>
Signed-off-by: Shobhit Kumar <shobhit.kumar@intel.com>
---
drivers/mfd/intel_soc_pmic_core.c | 17 +++++++++++++++++
1 file changed, 17 insertions(+)
diff --git a/drivers/mfd/intel_soc_pmic_core.c b/drivers/mfd/intel_soc_pmic_core.c
index 7b50b6b..f3d918e 100644
--- a/drivers/mfd/intel_soc_pmic_core.c
+++ b/drivers/mfd/intel_soc_pmic_core.c
@@ -24,8 +24,19 @@
#include <linux/acpi.h>
#include <linux/regmap.h>
#include <linux/mfd/intel_soc_pmic.h>
+#include <linux/gpio/machine.h>
#include "intel_soc_pmic_core.h"
+/* Lookup table for the Panel Enable/Disable line as GPIO signals */
+static struct gpiod_lookup_table panel_gpio_table = {
+ /* Intel GFX is consumer */
+ .dev_id = "0000:00:02.0",
+ .table = {
+ /* Panel EN/DISABLE */
+ GPIO_LOOKUP("gpio_crystalcove", 94, "panel", GPIO_ACTIVE_HIGH),
+ },
+};
+
static int intel_soc_pmic_find_gpio_irq(struct device *dev)
{
struct gpio_desc *desc;
@@ -85,6 +96,9 @@ static int intel_soc_pmic_i2c_probe(struct i2c_client *i2c,
if (ret)
dev_warn(dev, "Can't enable IRQ as wake source: %d\n", ret);
+ /* Add lookup table binding for Panel Control to the GPIO Chip */
+ gpiod_add_lookup_table(&panel_gpio_table);
+
ret = mfd_add_devices(dev, -1, config->cell_dev,
config->n_cell_devs, NULL, 0,
regmap_irq_get_domain(pmic->irq_chip_data));
@@ -104,6 +118,9 @@ static int intel_soc_pmic_i2c_remove(struct i2c_client *i2c)
regmap_del_irq_chip(pmic->irq, pmic->irq_chip_data);
+ /* Remove lookup table for Panel Control from the GPIO Chip */
+ gpiod_remove_lookup_table(&panel_gpio_table);
+
mfd_remove_devices(&i2c->dev);
return 0;
--
2.1.0
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [RFC v6 4/8] drivers/mfd: Add PWM cell device for Crystalcove PMIC
2015-04-24 15:33 [RFC v6 0/8] Crystalcove (CRC) PMIC based panel and pwm control Shobhit Kumar
` (2 preceding siblings ...)
2015-04-24 15:33 ` [RFC v6 3/8] drivers/mfd: Add lookup table for Panel Control as GPIO signal Shobhit Kumar
@ 2015-04-24 15:33 ` Shobhit Kumar
2015-04-24 15:33 ` [RFC v6 5/8] drivers/mfd: ADD PWM lookup table for CRC PMIC based PWM Shobhit Kumar
` (3 subsequent siblings)
7 siblings, 0 replies; 15+ messages in thread
From: Shobhit Kumar @ 2015-04-24 15:33 UTC (permalink / raw)
To: intel-gfx
Cc: Alexandre Courbot, Samuel Ortiz, Jani Nikula, Shobhit Kumar,
Linus Walleij, Thierry Reding, Daniel Vetter
Needed for PWM control suuported by the PMIC
CC: Samuel Ortiz <sameo@linux.intel.com>
Cc: Linus Walleij <linus.walleij@linaro.org>
Cc: Alexandre Courbot <gnurou@gmail.com>
Cc: Thierry Reding <thierry.reding@gmail.com>
Signed-off-by: Shobhit Kumar <shobhit.kumar@intel.com>
---
drivers/mfd/intel_soc_pmic_crc.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/drivers/mfd/intel_soc_pmic_crc.c b/drivers/mfd/intel_soc_pmic_crc.c
index 4cc1b32..8839e25 100644
--- a/drivers/mfd/intel_soc_pmic_crc.c
+++ b/drivers/mfd/intel_soc_pmic_crc.c
@@ -109,6 +109,9 @@ static struct mfd_cell crystal_cove_dev[] = {
{
.name = "crystal_cove_pmic",
},
+ {
+ .name = "crystal_cove_pwm",
+ },
};
static const struct regmap_config crystal_cove_regmap_config = {
--
2.1.0
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [RFC v6 5/8] drivers/mfd: ADD PWM lookup table for CRC PMIC based PWM
2015-04-24 15:33 [RFC v6 0/8] Crystalcove (CRC) PMIC based panel and pwm control Shobhit Kumar
` (3 preceding siblings ...)
2015-04-24 15:33 ` [RFC v6 4/8] drivers/mfd: Add PWM cell device for Crystalcove PMIC Shobhit Kumar
@ 2015-04-24 15:33 ` Shobhit Kumar
2015-04-24 15:33 ` [RFC v6 6/8] drivers/pwm: Add Crystalcove (CRC) PWM driver Shobhit Kumar
` (2 subsequent siblings)
7 siblings, 0 replies; 15+ messages in thread
From: Shobhit Kumar @ 2015-04-24 15:33 UTC (permalink / raw)
To: intel-gfx
Cc: Alexandre Courbot, Samuel Ortiz, Jani Nikula, Shobhit Kumar,
Linus Walleij, Thierry Reding, Daniel Vetter
On some BYT PLatform the PWM is controlled using CRC PMIC. Add a lookup
entry for the same to be used by the consumer (Intel GFX)
v2: Remove the lookup table on driver unload (Thierry)
CC: Samuel Ortiz <sameo@linux.intel.com>
Cc: Linus Walleij <linus.walleij@linaro.org>
Cc: Alexandre Courbot <gnurou@gmail.com>
Cc: Thierry Reding <thierry.reding@gmail.com>
Signed-off-by: Shobhit Kumar <shobhit.kumar@intel.com>
---
drivers/mfd/intel_soc_pmic_core.c | 12 ++++++++++++
1 file changed, 12 insertions(+)
diff --git a/drivers/mfd/intel_soc_pmic_core.c b/drivers/mfd/intel_soc_pmic_core.c
index f3d918e..a00ddd9 100644
--- a/drivers/mfd/intel_soc_pmic_core.c
+++ b/drivers/mfd/intel_soc_pmic_core.c
@@ -25,6 +25,7 @@
#include <linux/regmap.h>
#include <linux/mfd/intel_soc_pmic.h>
#include <linux/gpio/machine.h>
+#include <linux/pwm.h>
#include "intel_soc_pmic_core.h"
/* Lookup table for the Panel Enable/Disable line as GPIO signals */
@@ -37,6 +38,11 @@ static struct gpiod_lookup_table panel_gpio_table = {
},
};
+/* PWM consumed by the Intel GFX */
+static struct pwm_lookup crc_pwm_lookup[] = {
+ PWM_LOOKUP("crystal_cove_pwm", 0, "0000:00:02.0", "pwm_backlight", 0, PWM_POLARITY_NORMAL),
+};
+
static int intel_soc_pmic_find_gpio_irq(struct device *dev)
{
struct gpio_desc *desc;
@@ -99,6 +105,9 @@ static int intel_soc_pmic_i2c_probe(struct i2c_client *i2c,
/* Add lookup table binding for Panel Control to the GPIO Chip */
gpiod_add_lookup_table(&panel_gpio_table);
+ /* Add lookup table for crc-pwm */
+ pwm_add_table(crc_pwm_lookup, ARRAY_SIZE(crc_pwm_lookup));
+
ret = mfd_add_devices(dev, -1, config->cell_dev,
config->n_cell_devs, NULL, 0,
regmap_irq_get_domain(pmic->irq_chip_data));
@@ -121,6 +130,9 @@ static int intel_soc_pmic_i2c_remove(struct i2c_client *i2c)
/* Remove lookup table for Panel Control from the GPIO Chip */
gpiod_remove_lookup_table(&panel_gpio_table);
+ /* remove crc-pwm lookup table */
+ pwm_remove_table(crc_pwm_lookup, ARRAY_SIZE(crc_pwm_lookup));
+
mfd_remove_devices(&i2c->dev);
return 0;
--
2.1.0
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [RFC v6 6/8] drivers/pwm: Add Crystalcove (CRC) PWM driver
2015-04-24 15:33 [RFC v6 0/8] Crystalcove (CRC) PMIC based panel and pwm control Shobhit Kumar
` (4 preceding siblings ...)
2015-04-24 15:33 ` [RFC v6 5/8] drivers/mfd: ADD PWM lookup table for CRC PMIC based PWM Shobhit Kumar
@ 2015-04-24 15:33 ` Shobhit Kumar
2015-04-24 15:33 ` [RFC v6 7/8] drm/i915: Use the CRC gpio for panel enable/disable Shobhit Kumar
2015-04-24 15:33 ` [RFC v6 8/8] drm/i915: Backlight control using CRC PMIC based PWM driver Shobhit Kumar
7 siblings, 0 replies; 15+ messages in thread
From: Shobhit Kumar @ 2015-04-24 15:33 UTC (permalink / raw)
To: intel-gfx
Cc: Alexandre Courbot, Samuel Ortiz, Jani Nikula, Shobhit Kumar,
Linus Walleij, Thierry Reding, Daniel Vetter
The Crystalcove PMIC controls PWM signals and this driver exports that
capability as a PWM chip driver. This is platform device implementtaion
of the drivers/mfd cell device for CRC PMIC
v2: Use the existing config callback with duty_ns and period_ns(Thierry)
CC: Samuel Ortiz <sameo@linux.intel.com>
Cc: Linus Walleij <linus.walleij@linaro.org>
Cc: Alexandre Courbot <gnurou@gmail.com>
Cc: Thierry Reding <thierry.reding@gmail.com>
Signed-off-by: Shobhit Kumar <shobhit.kumar@intel.com>
---
drivers/pwm/Kconfig | 7 +++
drivers/pwm/Makefile | 1 +
drivers/pwm/pwm-crc.c | 171 ++++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 179 insertions(+)
create mode 100644 drivers/pwm/pwm-crc.c
diff --git a/drivers/pwm/Kconfig b/drivers/pwm/Kconfig
index b1541f4..954da3e 100644
--- a/drivers/pwm/Kconfig
+++ b/drivers/pwm/Kconfig
@@ -183,6 +183,13 @@ config PWM_LPC32XX
To compile this driver as a module, choose M here: the module
will be called pwm-lpc32xx.
+config PWM_CRC
+ bool "Intel Crystalcove (CRC) PWM support"
+ depends on X86 && INTEL_SOC_PMIC
+ help
+ Generic PWM framework driver for Crystalcove (CRC) PMIC based PWM
+ control.
+
config PWM_LPSS
tristate "Intel LPSS PWM support"
depends on X86
diff --git a/drivers/pwm/Makefile b/drivers/pwm/Makefile
index ec50eb5..3d38fed 100644
--- a/drivers/pwm/Makefile
+++ b/drivers/pwm/Makefile
@@ -35,3 +35,4 @@ obj-$(CONFIG_PWM_TIPWMSS) += pwm-tipwmss.o
obj-$(CONFIG_PWM_TWL) += pwm-twl.o
obj-$(CONFIG_PWM_TWL_LED) += pwm-twl-led.o
obj-$(CONFIG_PWM_VT8500) += pwm-vt8500.o
+obj-$(CONFIG_PWM_CRC) += pwm-crc.o
diff --git a/drivers/pwm/pwm-crc.c b/drivers/pwm/pwm-crc.c
new file mode 100644
index 0000000..987f3b4
--- /dev/null
+++ b/drivers/pwm/pwm-crc.c
@@ -0,0 +1,171 @@
+/*
+ * pwm-crc.c - Intel Crystal Cove PWM Driver
+ *
+ * Copyright (C) 2015 Intel Corporation. All rights reserved.
+ *
+ * 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.
+ *
+ * Author: Shobhit Kumar <shobhit.kumar@intel.com>
+ */
+
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include <linux/regmap.h>
+#include <linux/mfd/intel_soc_pmic.h>
+#include <linux/pwm.h>
+
+#define PWM0_CLK_DIV 0x4B
+#define PWM_OUTPUT_ENABLE (1<<7)
+#define PWM_DIV_CLK_0 0x00 /* DIVIDECLK = BASECLK */
+#define PWM_DIV_CLK_100 0x63 /* DIVIDECLK = BASECLK/100 */
+#define PWM_DIV_CLK_128 0x7F /* DIVIDECLK = BASECLK/128 */
+
+#define PWM0_DUTY_CYCLE 0x4E
+#define BACKLIGHT_EN 0x51
+
+#define PWM_MAX_LEVEL 0xFF
+
+#define PWM_BASE_CLK 6000 /* 6 MHz */
+#define PWM_MAX_PERIOD_NS 21333 /* 46.875KHz */
+
+/**
+ * struct crystalcove_pwm - Crystal Cove PWM controller
+ * @chip: the abstract pwm_chip structure.
+ * @regmap: the regmap from the parent device.
+ */
+struct crystalcove_pwm {
+ struct pwm_chip chip;
+ struct platform_device *pdev;
+ struct regmap *regmap;
+};
+
+static inline struct crystalcove_pwm *to_crc_pwm(struct pwm_chip *pc)
+{
+ return container_of(pc, struct crystalcove_pwm, chip);
+}
+
+static int crc_pwm_enable(struct pwm_chip *c, struct pwm_device *pwm)
+{
+ struct crystalcove_pwm *crc_pwm = to_crc_pwm(c);
+
+ regmap_write(crc_pwm->regmap, BACKLIGHT_EN, 1);
+
+ return 0;
+}
+
+static void crc_pwm_disable(struct pwm_chip *c, struct pwm_device *pwm)
+{
+ struct crystalcove_pwm *crc_pwm = to_crc_pwm(c);
+
+ regmap_write(crc_pwm->regmap, BACKLIGHT_EN, 0);
+}
+
+static int crc_pwm_config(struct pwm_chip *c, struct pwm_device *pwm,
+ int duty_ns, int period_ns)
+{
+ struct crystalcove_pwm *crc_pwm = to_crc_pwm(c);
+ struct device *dev = &crc_pwm->pdev->dev;
+ int level, percent;
+
+ if (period_ns > PWM_MAX_PERIOD_NS) {
+ dev_err(dev, "un-supported period_ns\n");
+ return -1;
+ }
+
+ if (pwm->period != period_ns) {
+ int clk_div;
+
+ /* changing the clk divisor, need to disable fisrt */
+ crc_pwm_disable(c, pwm);
+ clk_div = PWM_BASE_CLK * period_ns / 1000000;
+
+ regmap_write(crc_pwm->regmap, PWM0_CLK_DIV,
+ clk_div | PWM_OUTPUT_ENABLE);
+
+ /* enable back */
+ crc_pwm_enable(c, pwm);
+ }
+
+ if (duty_ns > period_ns) {
+ dev_err(dev, "duty cycle cannot be greater than cycle period\n");
+ return -1;
+ }
+
+ /* change the pwm duty cycle */
+ percent = duty_ns * 100 / period_ns;
+ level = percent * PWM_MAX_LEVEL / 100;
+ regmap_write(crc_pwm->regmap, PWM0_DUTY_CYCLE, level);
+
+ return 0;
+}
+
+static const struct pwm_ops crc_pwm_ops = {
+ .config = crc_pwm_config,
+ .enable = crc_pwm_enable,
+ .disable = crc_pwm_disable,
+ .owner = THIS_MODULE,
+};
+
+static int crystalcove_pwm_probe(struct platform_device *pdev)
+{
+ struct crystalcove_pwm *pwm;
+ int retval;
+ struct device *dev = pdev->dev.parent;
+ struct intel_soc_pmic *pmic = dev_get_drvdata(dev);
+
+ pwm = devm_kzalloc(&pdev->dev, sizeof(*pwm), GFP_KERNEL);
+ if (!pwm)
+ return -ENOMEM;
+
+ pwm->chip.dev = &pdev->dev;
+ pwm->chip.ops = &crc_pwm_ops;
+ pwm->chip.base = -1;
+ pwm->chip.npwm = 1;
+
+ /* get the PMIC regmap */
+ pwm->regmap = pmic->regmap;
+
+ retval = pwmchip_add(&pwm->chip);
+ if (retval < 0)
+ return retval;
+
+ dev_dbg(&pdev->dev, "crc-pwm probe successful\n");
+ platform_set_drvdata(pdev, pwm);
+
+ return 0;
+}
+
+static int crystalcove_pwm_remove(struct platform_device *pdev)
+{
+ struct crystalcove_pwm *pwm = platform_get_drvdata(pdev);
+ int retval;
+
+ retval = pwmchip_remove(&pwm->chip);
+ if (retval < 0)
+ return retval;
+
+ dev_dbg(&pdev->dev, "crc-pwm driver removed\n");
+
+ return 0;
+}
+
+static struct platform_driver crystalcove_pwm_driver = {
+ .probe = crystalcove_pwm_probe,
+ .remove = crystalcove_pwm_remove,
+ .driver = {
+ .name = "crystal_cove_pwm",
+ },
+};
+
+module_platform_driver(crystalcove_pwm_driver);
+
+MODULE_AUTHOR("Shobhit Kumar <shobhit.kumar@intel.com>");
+MODULE_DESCRIPTION("Intel Crystal Cove PWM Driver");
+MODULE_LICENSE("GPL v2");
--
2.1.0
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [RFC v6 7/8] drm/i915: Use the CRC gpio for panel enable/disable
2015-04-24 15:33 [RFC v6 0/8] Crystalcove (CRC) PMIC based panel and pwm control Shobhit Kumar
` (5 preceding siblings ...)
2015-04-24 15:33 ` [RFC v6 6/8] drivers/pwm: Add Crystalcove (CRC) PWM driver Shobhit Kumar
@ 2015-04-24 15:33 ` Shobhit Kumar
2015-05-06 13:13 ` Linus Walleij
2015-04-24 15:33 ` [RFC v6 8/8] drm/i915: Backlight control using CRC PMIC based PWM driver Shobhit Kumar
7 siblings, 1 reply; 15+ messages in thread
From: Shobhit Kumar @ 2015-04-24 15:33 UTC (permalink / raw)
To: intel-gfx
Cc: Alexandre Courbot, Samuel Ortiz, Jani Nikula, Shobhit Kumar,
Linus Walleij, Thierry Reding, Daniel Vetter
The CRC (Crystal Cove) PMIC, controls the panel enable and disable
signals for BYT for dsi panels. This is indicated in the VBT fields. Use
that to initialize and use GPIO based control for these signals.
v2: Use the newer gpiod interface(Alexandre)
v3: Remove the redundant checks and unused code (Ville)
CC: Samuel Ortiz <sameo@linux.intel.com>
Cc: Linus Walleij <linus.walleij@linaro.org>
Cc: Alexandre Courbot <gnurou@gmail.com>
Cc: Thierry Reding <thierry.reding@gmail.com>
Signed-off-by: Shobhit Kumar <shobhit.kumar@intel.com>
---
drivers/gpu/drm/i915/intel_dsi.c | 32 ++++++++++++++++++++++++++++++--
drivers/gpu/drm/i915/intel_dsi.h | 6 ++++++
2 files changed, 36 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/i915/intel_dsi.c b/drivers/gpu/drm/i915/intel_dsi.c
index 5196642..be55ffa 100644
--- a/drivers/gpu/drm/i915/intel_dsi.c
+++ b/drivers/gpu/drm/i915/intel_dsi.c
@@ -31,6 +31,7 @@
#include <drm/drm_panel.h>
#include <drm/drm_mipi_dsi.h>
#include <linux/slab.h>
+#include <linux/gpio/consumer.h>
#include "i915_drv.h"
#include "intel_drv.h"
#include "intel_dsi.h"
@@ -415,6 +416,12 @@ static void intel_dsi_pre_enable(struct intel_encoder *encoder)
DRM_DEBUG_KMS("\n");
+ /* Panel Enable over CRC PMIC */
+ if (intel_dsi->gpio_panel)
+ gpiod_set_value_cansleep(intel_dsi->gpio_panel, 1);
+
+ msleep(intel_dsi->panel_on_delay);
+
/* Disable DPOunit clock gating, can stall pipe
* and we need DPLL REFA always enabled */
tmp = I915_READ(DPLL(pipe));
@@ -432,8 +439,6 @@ static void intel_dsi_pre_enable(struct intel_encoder *encoder)
/* put device in ready state */
intel_dsi_device_ready(encoder);
- msleep(intel_dsi->panel_on_delay);
-
drm_panel_prepare(intel_dsi->panel);
for_each_dsi_port(port, intel_dsi->ports)
@@ -576,6 +581,10 @@ static void intel_dsi_post_disable(struct intel_encoder *encoder)
msleep(intel_dsi->panel_off_delay);
msleep(intel_dsi->panel_pwr_cycle_delay);
+
+ /* Panel Disable over CRC PMIC */
+ if (intel_dsi->gpio_panel)
+ gpiod_set_value_cansleep(intel_dsi->gpio_panel, 0);
}
static bool intel_dsi_get_hw_state(struct intel_encoder *encoder,
@@ -955,6 +964,11 @@ static void intel_dsi_encoder_destroy(struct drm_encoder *encoder)
/* XXX: Logically this call belongs in the panel driver. */
drm_panel_remove(intel_dsi->panel);
}
+
+ /* dispose of the gpios */
+ if (intel_dsi->gpio_panel)
+ gpiod_put(intel_dsi->gpio_panel);
+
intel_encoder_destroy(encoder);
}
@@ -1071,6 +1085,20 @@ void intel_dsi_init(struct drm_device *dev)
goto err;
}
+ /*
+ * In case of BYT with CRC PMIC, we need to use GPIO for
+ * Panel control.
+ */
+ if (dev_priv->vbt.dsi.config->pwm_blc == PPS_BLC_PMIC) {
+ intel_dsi->gpio_panel =
+ gpiod_get(dev->dev, "panel", GPIOD_OUT_HIGH);
+
+ if (IS_ERR(intel_dsi->gpio_panel)) {
+ DRM_ERROR("Failed to own gpio for panel control\n");
+ intel_dsi->gpio_panel = NULL;
+ }
+ }
+
intel_encoder->type = INTEL_OUTPUT_DSI;
intel_encoder->cloneable = 0;
drm_connector_init(dev, connector, &intel_dsi_connector_funcs,
diff --git a/drivers/gpu/drm/i915/intel_dsi.h b/drivers/gpu/drm/i915/intel_dsi.h
index 2784ac4..bf1bade 100644
--- a/drivers/gpu/drm/i915/intel_dsi.h
+++ b/drivers/gpu/drm/i915/intel_dsi.h
@@ -29,6 +29,9 @@
#include <drm/drm_mipi_dsi.h>
#include "intel_drv.h"
+#define PPS_BLC_PMIC 0
+#define PPS_BLC_SOC 1
+
/* Dual Link support */
#define DSI_DUAL_LINK_NONE 0
#define DSI_DUAL_LINK_FRONT_BACK 1
@@ -42,6 +45,9 @@ struct intel_dsi {
struct drm_panel *panel;
struct intel_dsi_host *dsi_hosts[I915_MAX_PORTS];
+ /* GPIO Desc for CRC based Panel control */
+ struct gpio_desc *gpio_panel;
+
struct intel_connector *attached_connector;
/* bit mask of ports being driven */
--
2.1.0
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [RFC v6 8/8] drm/i915: Backlight control using CRC PMIC based PWM driver
2015-04-24 15:33 [RFC v6 0/8] Crystalcove (CRC) PMIC based panel and pwm control Shobhit Kumar
` (6 preceding siblings ...)
2015-04-24 15:33 ` [RFC v6 7/8] drm/i915: Use the CRC gpio for panel enable/disable Shobhit Kumar
@ 2015-04-24 15:33 ` Shobhit Kumar
7 siblings, 0 replies; 15+ messages in thread
From: Shobhit Kumar @ 2015-04-24 15:33 UTC (permalink / raw)
To: intel-gfx
Cc: Alexandre Courbot, Samuel Ortiz, Jani Nikula, Shobhit Kumar,
Linus Walleij, Thierry Reding, Daniel Vetter
Use the CRC PWM device in intel_panel.c and add new MIPI backlight
specififc callbacks
v2: Modify to use pwm_config callback
CC: Samuel Ortiz <sameo@linux.intel.com>
Cc: Linus Walleij <linus.walleij@linaro.org>
Cc: Alexandre Courbot <gnurou@gmail.com>
Cc: Thierry Reding <thierry.reding@gmail.com>
Signed-off-by: Shobhit Kumar <shobhit.kumar@intel.com>
---
drivers/gpu/drm/i915/intel_drv.h | 5 +++
drivers/gpu/drm/i915/intel_dsi.c | 6 +++
drivers/gpu/drm/i915/intel_panel.c | 92 +++++++++++++++++++++++++++++++++++---
3 files changed, 98 insertions(+), 5 deletions(-)
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
index 897f17d..b4ebe3b 100644
--- a/drivers/gpu/drm/i915/intel_drv.h
+++ b/drivers/gpu/drm/i915/intel_drv.h
@@ -182,7 +182,12 @@ struct intel_panel {
bool enabled;
bool combination_mode; /* gen 2/4 only */
bool active_low_pwm;
+
+ /* PWM chip */
+ struct pwm_device *pwm;
+
struct backlight_device *device;
+
} backlight;
void (*backlight_power)(struct intel_connector *, bool enable);
diff --git a/drivers/gpu/drm/i915/intel_dsi.c b/drivers/gpu/drm/i915/intel_dsi.c
index be55ffa..83c4540 100644
--- a/drivers/gpu/drm/i915/intel_dsi.c
+++ b/drivers/gpu/drm/i915/intel_dsi.c
@@ -402,6 +402,8 @@ static void intel_dsi_enable(struct intel_encoder *encoder)
intel_dsi_port_enable(encoder);
}
+
+ intel_panel_enable_backlight(intel_dsi->attached_connector);
}
static void intel_dsi_pre_enable(struct intel_encoder *encoder)
@@ -466,6 +468,8 @@ static void intel_dsi_pre_disable(struct intel_encoder *encoder)
DRM_DEBUG_KMS("\n");
+ intel_panel_disable_backlight(intel_dsi->attached_connector);
+
if (is_vid_mode(intel_dsi)) {
/* Send Shutdown command to the panel in LP mode */
for_each_dsi_port(port, intel_dsi->ports)
@@ -1132,6 +1136,8 @@ void intel_dsi_init(struct drm_device *dev)
}
intel_panel_init(&intel_connector->panel, fixed_mode, NULL);
+ intel_panel_setup_backlight(connector,
+ (intel_encoder->crtc_mask = (1 << PIPE_A)) ? PIPE_A: PIPE_B);
return;
diff --git a/drivers/gpu/drm/i915/intel_panel.c b/drivers/gpu/drm/i915/intel_panel.c
index 08532d4..5700f6f 100644
--- a/drivers/gpu/drm/i915/intel_panel.c
+++ b/drivers/gpu/drm/i915/intel_panel.c
@@ -32,8 +32,12 @@
#include <linux/kernel.h>
#include <linux/moduleparam.h>
+#include <linux/pwm.h>
#include "intel_drv.h"
+#define CRC_PMIC_PWM_PERIOD_NS 21333
+#define CRC_PMIC_PWM_STEPS 255
+
void
intel_fixed_panel_mode(const struct drm_display_mode *fixed_mode,
struct drm_display_mode *adjusted_mode)
@@ -536,6 +540,15 @@ static u32 vlv_get_backlight(struct intel_connector *connector)
return _vlv_get_backlight(dev, pipe);
}
+static u32 vlv_get_mipi_backlight(struct intel_connector *connector)
+{
+ struct intel_panel *panel = &connector->panel;
+ int duty_ns;
+
+ duty_ns = pwm_get_duty_cycle(panel->backlight.pwm);
+ return DIV_ROUND_UP(duty_ns * 100, CRC_PMIC_PWM_PERIOD_NS);
+}
+
static u32 intel_panel_get_backlight(struct intel_connector *connector)
{
struct drm_device *dev = connector->base.dev;
@@ -616,6 +629,14 @@ static void vlv_set_backlight(struct intel_connector *connector, u32 level)
I915_WRITE(VLV_BLC_PWM_CTL(pipe), tmp | level);
}
+static void vlv_set_mipi_backlight(struct intel_connector *connector, u32 level)
+{
+ struct intel_panel *panel = &connector->panel;
+ int duty_ns = DIV_ROUND_UP(level * CRC_PMIC_PWM_PERIOD_NS, 100);
+
+ pwm_config(panel->backlight.pwm, duty_ns, CRC_PMIC_PWM_PERIOD_NS);
+}
+
static void
intel_panel_actually_set_backlight(struct intel_connector *connector, u32 level)
{
@@ -741,6 +762,16 @@ static void vlv_disable_backlight(struct intel_connector *connector)
I915_WRITE(VLV_BLC_PWM_CTL2(pipe), tmp & ~BLM_PWM_ENABLE);
}
+static void vlv_disable_mipi_backlight(struct intel_connector *connector)
+{
+ struct intel_panel *panel = &connector->panel;
+
+ /* Disable the backlight */
+ pwm_config(panel->backlight.pwm, 0, CRC_PMIC_PWM_PERIOD_NS);
+ usleep_range(2000, 3000);
+ pwm_disable(panel->backlight.pwm);
+}
+
void intel_panel_disable_backlight(struct intel_connector *connector)
{
struct drm_device *dev = connector->base.dev;
@@ -947,6 +978,16 @@ static void vlv_enable_backlight(struct intel_connector *connector)
I915_WRITE(VLV_BLC_PWM_CTL2(pipe), ctl2 | BLM_PWM_ENABLE);
}
+static void vlv_enable_mipi_backlight(struct intel_connector *connector)
+{
+ struct intel_panel *panel = &connector->panel;
+ int duty_ns = DIV_ROUND_UP(
+ panel->backlight.level * CRC_PMIC_PWM_PERIOD_NS, 100);
+
+ pwm_enable(panel->backlight.pwm);
+ pwm_config(panel->backlight.pwm, duty_ns, CRC_PMIC_PWM_PERIOD_NS);
+}
+
void intel_panel_enable_backlight(struct intel_connector *connector)
{
struct drm_device *dev = connector->base.dev;
@@ -1299,6 +1340,34 @@ static int vlv_setup_backlight(struct intel_connector *connector, enum pipe pipe
return 0;
}
+static int vlv_setup_mipi_backlight(struct intel_connector *connector, enum pipe pipe)
+{
+ struct drm_device *dev = connector->base.dev;
+ struct intel_panel *panel = &connector->panel;
+
+ /* Get the PWM chip for backlight control */
+ panel->backlight.pwm = pwm_get(dev->dev, "pwm_backlight");
+ if (IS_ERR(panel->backlight.pwm)) {
+ DRM_ERROR("Faild to own the pwm chip\n");
+ panel->backlight.pwm = NULL;
+ } else if (pwm_config(panel->backlight.pwm, CRC_PMIC_PWM_PERIOD_NS,
+ CRC_PMIC_PWM_PERIOD_NS) < 0) {
+ DRM_ERROR("Failed to configure the pwm chip\n");
+ pwm_put(panel->backlight.pwm);
+ panel->backlight.pwm = NULL;
+ return -1;
+ }
+
+ panel->backlight.min = 0; /* 0% */
+ panel->backlight.max = 100; /* 100% */
+ panel->backlight.level = DIV_ROUND_UP(
+ pwm_get_duty_cycle(panel->backlight.pwm) * 100,
+ CRC_PMIC_PWM_PERIOD_NS);
+ panel->backlight.enabled = panel->backlight.level ? true : false;
+
+ return 0;
+}
+
int intel_panel_setup_backlight(struct drm_connector *connector, enum pipe pipe)
{
struct drm_device *dev = connector->dev;
@@ -1363,11 +1432,19 @@ void intel_panel_init_backlight_funcs(struct drm_device *dev)
dev_priv->display.set_backlight = pch_set_backlight;
dev_priv->display.get_backlight = pch_get_backlight;
} else if (IS_VALLEYVIEW(dev)) {
- dev_priv->display.setup_backlight = vlv_setup_backlight;
- dev_priv->display.enable_backlight = vlv_enable_backlight;
- dev_priv->display.disable_backlight = vlv_disable_backlight;
- dev_priv->display.set_backlight = vlv_set_backlight;
- dev_priv->display.get_backlight = vlv_get_backlight;
+ if (dev_priv->vbt.has_mipi) {
+ dev_priv->display.setup_backlight = vlv_setup_mipi_backlight;
+ dev_priv->display.enable_backlight = vlv_enable_mipi_backlight;
+ dev_priv->display.disable_backlight = vlv_disable_mipi_backlight;
+ dev_priv->display.set_backlight = vlv_set_mipi_backlight;
+ dev_priv->display.get_backlight = vlv_get_mipi_backlight;
+ } else {
+ dev_priv->display.setup_backlight = vlv_setup_backlight;
+ dev_priv->display.enable_backlight = vlv_enable_backlight;
+ dev_priv->display.disable_backlight = vlv_disable_backlight;
+ dev_priv->display.set_backlight = vlv_set_backlight;
+ dev_priv->display.get_backlight = vlv_get_backlight;
+ }
} else if (IS_GEN4(dev)) {
dev_priv->display.setup_backlight = i965_setup_backlight;
dev_priv->display.enable_backlight = i965_enable_backlight;
@@ -1404,6 +1481,11 @@ void intel_panel_fini(struct intel_panel *panel)
if (panel->downclock_mode)
drm_mode_destroy(intel_connector->base.dev,
panel->downclock_mode);
+
+ /* dispose of the pwm */
+ if (panel->backlight.pwm)
+ pwm_put(panel->backlight.pwm);
+
}
void intel_backlight_register(struct drm_device *dev)
--
2.1.0
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [RFC v6 1/8] drivers/gpio/gpiolib: Add support for removing registered consumer lookup table
2015-04-24 15:33 ` [RFC v6 1/8] drivers/gpio/gpiolib: Add support for removing registered consumer lookup table Shobhit Kumar
@ 2015-04-24 15:41 ` Shobhit Kumar
2015-04-27 4:03 ` Alexandre Courbot
2015-04-29 12:43 ` Jani Nikula
0 siblings, 2 replies; 15+ messages in thread
From: Shobhit Kumar @ 2015-04-24 15:41 UTC (permalink / raw)
To: intel-gfx
Cc: Alexandre Courbot, Samuel Ortiz, Jani Nikula, Shobhit Kumar,
Linus Walleij, Thierry Reding, Daniel Vetter
In case we unload and load a driver module again that is registering a
lookup table, without this it will result in multiple entries. Provide
an option to remove the lookup table on driver unload
v2: Ccing maintainers
Cc: Samuel Ortiz <sameo@linux.intel.com>
Cc: Linus Walleij <linus.walleij@linaro.org>
Cc: Alexandre Courbot <gnurou@gmail.com>
Cc: Thierry Reding <thierry.reding@gmail.com>
Signed-off-by: Shobhit Kumar <shobhit.kumar@intel.com>
---
drivers/gpio/gpiolib.c | 13 +++++++++++++
include/linux/gpio/machine.h | 1 +
2 files changed, 14 insertions(+)
diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c
index 59eaa23..2420af9 100644
--- a/drivers/gpio/gpiolib.c
+++ b/drivers/gpio/gpiolib.c
@@ -1658,6 +1658,19 @@ void gpiod_add_lookup_table(struct gpiod_lookup_table *table)
mutex_unlock(&gpio_lookup_lock);
}
+/**
+ * gpiod_remove_lookup_table() - unregister GPIO device consumers
+ * @table: table of consumers to unregister
+ */
+void gpiod_remove_lookup_table(struct gpiod_lookup_table *table)
+{
+ mutex_lock(&gpio_lookup_lock);
+
+ list_del(&table->list);
+
+ mutex_unlock(&gpio_lookup_lock);
+}
+
static struct gpio_desc *of_find_gpio(struct device *dev, const char *con_id,
unsigned int idx,
enum gpio_lookup_flags *flags)
diff --git a/include/linux/gpio/machine.h b/include/linux/gpio/machine.h
index e270614..c0d712d 100644
--- a/include/linux/gpio/machine.h
+++ b/include/linux/gpio/machine.h
@@ -57,5 +57,6 @@ struct gpiod_lookup_table {
}
void gpiod_add_lookup_table(struct gpiod_lookup_table *table);
+void gpiod_remove_lookup_table(struct gpiod_lookup_table *table);
#endif /* __LINUX_GPIO_MACHINE_H */
--
2.1.0
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [RFC v6 2/8] drivers/pwm/core: Add support to remove registered consumer lookup tables
2015-04-24 15:33 ` [RFC v6 2/8] drivers/pwm/core: Add support to remove registered consumer lookup tables Shobhit Kumar
@ 2015-04-24 15:42 ` Shobhit Kumar
0 siblings, 0 replies; 15+ messages in thread
From: Shobhit Kumar @ 2015-04-24 15:42 UTC (permalink / raw)
To: intel-gfx
Cc: Alexandre Courbot, Samuel Ortiz, Jani Nikula, Shobhit Kumar,
Linus Walleij, Thierry Reding, Daniel Vetter
In case some drivers are unloading, they can remove lookup tables which
they would have registered during their load time to avoid redundant
entries if loaded again
v2: Ccing maintainers
CC: Samuel Ortiz <sameo@linux.intel.com>
Cc: Linus Walleij <linus.walleij@linaro.org>
Cc: Alexandre Courbot <gnurou@gmail.com>
Cc: Thierry Reding <thierry.reding@gmail.com>
Signed-off-by: Shobhit Kumar <shobhit.kumar@intel.com>
---
drivers/pwm/core.c | 17 +++++++++++++++++
include/linux/pwm.h | 5 +++++
2 files changed, 22 insertions(+)
diff --git a/drivers/pwm/core.c b/drivers/pwm/core.c
index ba34c7d..d2fe7c8d 100644
--- a/drivers/pwm/core.c
+++ b/drivers/pwm/core.c
@@ -586,6 +586,23 @@ void pwm_add_table(struct pwm_lookup *table, size_t num)
}
/**
+ * pwm_remove_table() - un-register PWM device consumers
+ * @table: array of consumers to un-register
+ * @num: number of consumers in table
+ */
+void pwm_remove_table(struct pwm_lookup *table, size_t num)
+{
+ mutex_lock(&pwm_lookup_lock);
+
+ while (num--) {
+ list_del(&table->list);
+ table++;
+ }
+
+ mutex_unlock(&pwm_lookup_lock);
+}
+
+/**
* pwm_get() - look up and request a PWM device
* @dev: device for PWM consumer
* @con_id: consumer name
diff --git a/include/linux/pwm.h b/include/linux/pwm.h
index e90628c..cfe2d8d 100644
--- a/include/linux/pwm.h
+++ b/include/linux/pwm.h
@@ -290,10 +290,15 @@ struct pwm_lookup {
#if IS_ENABLED(CONFIG_PWM)
void pwm_add_table(struct pwm_lookup *table, size_t num);
+void pwm_remove_table(struct pwm_lookup *table, size_t num);
#else
static inline void pwm_add_table(struct pwm_lookup *table, size_t num)
{
}
+
+static inline void pwm_remove_table(struct pwm_lookup *table, size_t num)
+{
+}
#endif
#ifdef CONFIG_PWM_SYSFS
--
2.1.0
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply related [flat|nested] 15+ messages in thread
* Re: [RFC v6 1/8] drivers/gpio/gpiolib: Add support for removing registered consumer lookup table
2015-04-24 15:41 ` Shobhit Kumar
@ 2015-04-27 4:03 ` Alexandre Courbot
2015-04-29 12:43 ` Jani Nikula
1 sibling, 0 replies; 15+ messages in thread
From: Alexandre Courbot @ 2015-04-27 4:03 UTC (permalink / raw)
To: Shobhit Kumar
Cc: Samuel Ortiz, Jani Nikula, intel-gfx, Thierry Reding,
Daniel Vetter, Linus Walleij
On Sat, Apr 25, 2015 at 12:41 AM, Shobhit Kumar <shobhit.kumar@intel.com> wrote:
> In case we unload and load a driver module again that is registering a
> lookup table, without this it will result in multiple entries. Provide
> an option to remove the lookup table on driver unload
That's indeed desirable to have.
Reviewed-by: Alexandre Courbot <acourbot@nvidia.com>
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [RFC v6 1/8] drivers/gpio/gpiolib: Add support for removing registered consumer lookup table
2015-04-24 15:41 ` Shobhit Kumar
2015-04-27 4:03 ` Alexandre Courbot
@ 2015-04-29 12:43 ` Jani Nikula
1 sibling, 0 replies; 15+ messages in thread
From: Jani Nikula @ 2015-04-29 12:43 UTC (permalink / raw)
To: intel-gfx
Cc: Alexandre Courbot, Samuel Ortiz, Shobhit Kumar, Linus Walleij,
Thierry Reding, Daniel Vetter
On Fri, 24 Apr 2015, Shobhit Kumar <shobhit.kumar@intel.com> wrote:
> In case we unload and load a driver module again that is registering a
> lookup table, without this it will result in multiple entries. Provide
> an option to remove the lookup table on driver unload
>
> v2: Ccing maintainers
Shobhit, please resend to linux-gpio@vger.kernel.org and
linux-kernel@vger.kernel.org in addition to the maintainers, with
Alexandre's r-b added.
BR,
Jani.
>
> Cc: Samuel Ortiz <sameo@linux.intel.com>
> Cc: Linus Walleij <linus.walleij@linaro.org>
> Cc: Alexandre Courbot <gnurou@gmail.com>
> Cc: Thierry Reding <thierry.reding@gmail.com>
> Signed-off-by: Shobhit Kumar <shobhit.kumar@intel.com>
> ---
> drivers/gpio/gpiolib.c | 13 +++++++++++++
> include/linux/gpio/machine.h | 1 +
> 2 files changed, 14 insertions(+)
>
> diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c
> index 59eaa23..2420af9 100644
> --- a/drivers/gpio/gpiolib.c
> +++ b/drivers/gpio/gpiolib.c
> @@ -1658,6 +1658,19 @@ void gpiod_add_lookup_table(struct gpiod_lookup_table *table)
> mutex_unlock(&gpio_lookup_lock);
> }
>
> +/**
> + * gpiod_remove_lookup_table() - unregister GPIO device consumers
> + * @table: table of consumers to unregister
> + */
> +void gpiod_remove_lookup_table(struct gpiod_lookup_table *table)
> +{
> + mutex_lock(&gpio_lookup_lock);
> +
> + list_del(&table->list);
> +
> + mutex_unlock(&gpio_lookup_lock);
> +}
> +
> static struct gpio_desc *of_find_gpio(struct device *dev, const char *con_id,
> unsigned int idx,
> enum gpio_lookup_flags *flags)
> diff --git a/include/linux/gpio/machine.h b/include/linux/gpio/machine.h
> index e270614..c0d712d 100644
> --- a/include/linux/gpio/machine.h
> +++ b/include/linux/gpio/machine.h
> @@ -57,5 +57,6 @@ struct gpiod_lookup_table {
> }
>
> void gpiod_add_lookup_table(struct gpiod_lookup_table *table);
> +void gpiod_remove_lookup_table(struct gpiod_lookup_table *table);
>
> #endif /* __LINUX_GPIO_MACHINE_H */
> --
> 2.1.0
>
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx
--
Jani Nikula, Intel Open Source Technology Center
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [RFC v6 3/8] drivers/mfd: Add lookup table for Panel Control as GPIO signal
2015-04-24 15:33 ` [RFC v6 3/8] drivers/mfd: Add lookup table for Panel Control as GPIO signal Shobhit Kumar
@ 2015-05-06 13:11 ` Linus Walleij
0 siblings, 0 replies; 15+ messages in thread
From: Linus Walleij @ 2015-05-06 13:11 UTC (permalink / raw)
To: Shobhit Kumar
Cc: Alexandre Courbot, Samuel Ortiz, Jani Nikula, intel-gfx,
Thierry Reding, Daniel Vetter
On Fri, Apr 24, 2015 at 5:33 PM, Shobhit Kumar <shobhit.kumar@intel.com> wrote:
> On some Intel SoC platforms, the panel enable/disable signals are
> controlled by CRC PMIC. Add those control as a new GPIO in a lookup
> table for gpio-crystalcove chip during CRC driver load
>
> v2: Make the lookup table static (Thierry)
> Remove the lookup table during driver remove (Thierry)
>
> CC: Samuel Ortiz <sameo@linux.intel.com>
> Cc: Linus Walleij <linus.walleij@linaro.org>
> Cc: Alexandre Courbot <gnurou@gmail.com>
> Cc: Thierry Reding <thierry.reding@gmail.com>
> Signed-off-by: Shobhit Kumar <shobhit.kumar@intel.com>
Acked-by: Linus Walleij <linus.walleij@linaro.org>
Yours,
Linus Walleij
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [RFC v6 7/8] drm/i915: Use the CRC gpio for panel enable/disable
2015-04-24 15:33 ` [RFC v6 7/8] drm/i915: Use the CRC gpio for panel enable/disable Shobhit Kumar
@ 2015-05-06 13:13 ` Linus Walleij
0 siblings, 0 replies; 15+ messages in thread
From: Linus Walleij @ 2015-05-06 13:13 UTC (permalink / raw)
To: Shobhit Kumar
Cc: Alexandre Courbot, Samuel Ortiz, Jani Nikula, intel-gfx,
Thierry Reding, Daniel Vetter
On Fri, Apr 24, 2015 at 5:33 PM, Shobhit Kumar <shobhit.kumar@intel.com> wrote:
> The CRC (Crystal Cove) PMIC, controls the panel enable and disable
> signals for BYT for dsi panels. This is indicated in the VBT fields. Use
> that to initialize and use GPIO based control for these signals.
>
> v2: Use the newer gpiod interface(Alexandre)
> v3: Remove the redundant checks and unused code (Ville)
>
> CC: Samuel Ortiz <sameo@linux.intel.com>
> Cc: Linus Walleij <linus.walleij@linaro.org>
> Cc: Alexandre Courbot <gnurou@gmail.com>
> Cc: Thierry Reding <thierry.reding@gmail.com>
> Signed-off-by: Shobhit Kumar <shobhit.kumar@intel.com>
Acked-by: Linus Walleij <linus.walleij@linaro.org>
> + /* Panel Enable over CRC PMIC */
> + if (intel_dsi->gpio_panel)
> + gpiod_set_value_cansleep(intel_dsi->gpio_panel, 1);
> +
> + msleep(intel_dsi->panel_on_delay);
As I predicted, this reimplements .ramp_delay of the fixed
regulator.
No big disaster, just saying.
Yours,
Linus Walleij
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply [flat|nested] 15+ messages in thread
end of thread, other threads:[~2015-05-06 13:14 UTC | newest]
Thread overview: 15+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-04-24 15:33 [RFC v6 0/8] Crystalcove (CRC) PMIC based panel and pwm control Shobhit Kumar
2015-04-24 15:33 ` [RFC v6 1/8] drivers/gpio/gpiolib: Add support for removing registered consumer lookup table Shobhit Kumar
2015-04-24 15:41 ` Shobhit Kumar
2015-04-27 4:03 ` Alexandre Courbot
2015-04-29 12:43 ` Jani Nikula
2015-04-24 15:33 ` [RFC v6 2/8] drivers/pwm/core: Add support to remove registered consumer lookup tables Shobhit Kumar
2015-04-24 15:42 ` Shobhit Kumar
2015-04-24 15:33 ` [RFC v6 3/8] drivers/mfd: Add lookup table for Panel Control as GPIO signal Shobhit Kumar
2015-05-06 13:11 ` Linus Walleij
2015-04-24 15:33 ` [RFC v6 4/8] drivers/mfd: Add PWM cell device for Crystalcove PMIC Shobhit Kumar
2015-04-24 15:33 ` [RFC v6 5/8] drivers/mfd: ADD PWM lookup table for CRC PMIC based PWM Shobhit Kumar
2015-04-24 15:33 ` [RFC v6 6/8] drivers/pwm: Add Crystalcove (CRC) PWM driver Shobhit Kumar
2015-04-24 15:33 ` [RFC v6 7/8] drm/i915: Use the CRC gpio for panel enable/disable Shobhit Kumar
2015-05-06 13:13 ` Linus Walleij
2015-04-24 15:33 ` [RFC v6 8/8] drm/i915: Backlight control using CRC PMIC based PWM driver Shobhit Kumar
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox