[Armadeus-commitlog] armadeus branch, master, updated. armadeus-5.3-492-gee1ab92
Brought to you by:
sszy
|
From: Sébastien S. <ss...@us...> - 2014-12-04 13:43:13
|
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "armadeus".
The branch, master has been updated
via ee1ab920f42823e10a3595f1ec9deb1da2c40a12 (commit)
from 4422405411e7b20943d00db7d8a52e3164891285 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit ee1ab920f42823e10a3595f1ec9deb1da2c40a12
Author: Sébastien Szymanski <seb...@ar...>
Date: Thu Dec 4 14:45:22 2014 +0100
[LINUX] 2.6.38: apf51v2: move mc13892's gpo lines in a gpio driver
-----------------------------------------------------------------------
Summary of changes:
.../453-armadeus-add_pmic_mc13892_support.patch | 415 +++++++++++++++++++-
1 files changed, 413 insertions(+), 2 deletions(-)
diff --git a/patches/linux/2.6.38/453-armadeus-add_pmic_mc13892_support.patch b/patches/linux/2.6.38/453-armadeus-add_pmic_mc13892_support.patch
index 878307f..7d8f0c3 100644
--- a/patches/linux/2.6.38/453-armadeus-add_pmic_mc13892_support.patch
+++ b/patches/linux/2.6.38/453-armadeus-add_pmic_mc13892_support.patch
@@ -421,7 +421,13 @@ Index: linux-2.6.38.8/drivers/mfd/mc13xxx-core.c
kfree(mc13xxx);
return ret;
}
-@@ -787,51 +772,51 @@ err_revision:
+@@ -784,54 +769,57 @@ err_revision:
+ pdata->leds, sizeof(*pdata->leds));
+ }
+
++ if (pdata->flags & MC13XXX_USE_GPO)
++ mc13xxx_add_subdevice(mc13xxx, "%s-gpio");
++
return 0;
}
@@ -554,7 +560,7 @@ Index: linux-2.6.38.8/arch/arm/mach-mx5/board-apf51.c
+};
+
+static struct mc13xxx_platform_data apf51_mc13xxx_pdata = {
-+ .flags = MC13XXX_USE_RTC,
++ .flags = MC13XXX_USE_RTC | MC13XXX_USE_GPO,
+};
+
+static struct i2c_board_info apf51v2_i2c1_devices[] __initdata = {
@@ -592,3 +598,408 @@ Index: linux-2.6.38.8/arch/arm/mach-mx5/board-apf51.c
/* APF51 has an Ethernet PHY connected on internal FEC */
imx51_add_fec(NULL);
+Index: linux-2.6.38.8/drivers/gpio/mc13892-gpio.c
+===================================================================
+--- /dev/null
++++ linux-2.6.38.8/drivers/gpio/mc13892-gpio.c
+@@ -0,0 +1,147 @@
++/*
++ * mc13892-gpio.c -- gpiolib support for Freescale MC13892 PMIC
++ *
++ * Copyright 2014 Armadeus Systems
++ *
++ * Author: Sébastien Szymanski <seb...@ar...>
++ *
++ * 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 of the License, or (at your
++ * option) any later version.
++ *
++ */
++
++#include <linux/kernel.h>
++#include <linux/slab.h>
++#include <linux/module.h>
++#include <linux/gpio.h>
++#include <linux/mfd/core.h>
++#include <linux/mfd/mc13xxx.h>
++#include <linux/platform_device.h>
++#include <linux/seq_file.h>
++
++#define MC13892_POWERMISC 34
++#define MC13892_POWERMISC_GPO1EN (1 << 6)
++
++struct mc13892_gpio {
++ struct mc13xxx *mc13xxx;
++ struct gpio_chip gpio_chip;
++};
++
++static inline struct mc13892_gpio *to_mc13892_gpio(struct gpio_chip *chip)
++{
++ return container_of(chip, struct mc13892_gpio, gpio_chip);
++}
++
++static int mc13892_gpio_get(struct gpio_chip *chip, unsigned offset)
++{
++ struct mc13892_gpio *mc13892_gpio = to_mc13892_gpio(chip);
++ struct mc13xxx *mc13xxx = mc13892_gpio->mc13xxx;
++ u32 valread;
++ int ret;
++
++ mc13xxx_lock(mc13xxx);
++ ret = mc13xxx_reg_read(mc13xxx, MC13892_POWERMISC, &valread);
++ mc13xxx_unlock(mc13xxx);
++
++ if (ret < 0)
++ return ret;
++
++ if (valread & (MC13892_POWERMISC_GPO1EN << (offset << 1)))
++ return 1;
++
++ return 0;
++}
++
++static void mc13892_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
++{
++ struct mc13892_gpio *mc13892_gpio = to_mc13892_gpio(chip);
++ struct mc13xxx *mc13xxx = mc13892_gpio->mc13xxx;
++ u32 mask = (MC13892_POWERMISC_GPO1EN << (offset << 1));
++
++ mc13xxx_lock(mc13xxx);
++ mc13xxx_reg_rmw(mc13xxx, MC13892_POWERMISC, mask, value ? mask : 0);
++ mc13xxx_unlock(mc13xxx);
++}
++
++static int mc13892_gpio_direction_out(struct gpio_chip *chip,
++ unsigned offset, int value)
++{
++ return 0;
++}
++
++static struct gpio_chip template_chip = {
++ .label = "mc13892",
++ .owner = THIS_MODULE,
++ .direction_output = mc13892_gpio_direction_out,
++ .get = mc13892_gpio_get,
++ .set = mc13892_gpio_set,
++ .ngpio = 4,
++ .base = -1,
++};
++
++static int __devinit mc13892_gpio_probe(struct platform_device *pdev)
++{
++ struct mc13xxx *mc13xxx = dev_get_drvdata(pdev->dev.parent);
++ struct mc13892_gpio *mc13892_gpio;
++ int ret;
++
++ mc13892_gpio = kzalloc(sizeof(*mc13892_gpio), GFP_KERNEL);
++ if (mc13892_gpio == NULL)
++ return -ENOMEM;
++
++ mc13892_gpio->mc13xxx = mc13xxx;
++ mc13892_gpio->gpio_chip = template_chip;
++
++ ret = gpiochip_add(&mc13892_gpio->gpio_chip);
++ if (ret < 0) {
++ dev_err(&pdev->dev, "Could not register gpiochip, %d\n",
++ ret);
++ goto err;
++ }
++
++ platform_set_drvdata(pdev, mc13892_gpio);
++
++ return ret;
++
++err:
++ kfree(mc13892_gpio);
++ return ret;
++}
++
++static int __devexit mc13892_gpio_remove(struct platform_device *pdev)
++{
++ struct mc13892_gpio *mc13892_gpio = platform_get_drvdata(pdev);
++ int ret;
++
++ ret = gpiochip_remove(&mc13892_gpio->gpio_chip);
++ if (ret == 0)
++ kfree(mc13892_gpio);
++
++ return ret;
++}
++
++static struct platform_driver mc13892_gpio_driver = {
++ .driver.name = "mc13892-gpio",
++ .driver.owner = THIS_MODULE,
++ .probe = mc13892_gpio_probe,
++ .remove = __devexit_p(mc13892_gpio_remove),
++};
++
++static int __init mc13892_gpio_init(void)
++{
++ return platform_driver_register(&mc13892_gpio_driver);
++}
++subsys_initcall(mc13892_gpio_init);
++
++static void __exit mc13892_gpio_exit(void)
++{
++ platform_driver_unregister(&mc13892_gpio_driver);
++}
++module_exit(mc13892_gpio_exit);
++
++MODULE_AUTHOR("Sébastien Szymanski <seb...@ar...>");
++MODULE_DESCRIPTION("GPO interface for MC13892 PMIC");
++MODULE_LICENSE("GPL");
++MODULE_ALIAS("platform:mc13892-gpio");
+Index: linux-2.6.38.8/drivers/gpio/Kconfig
+===================================================================
+--- linux-2.6.38.8.orig/drivers/gpio/Kconfig
++++ linux-2.6.38.8/drivers/gpio/Kconfig
+@@ -163,6 +163,13 @@ config GPIO_MAX732X_IRQ
+ Say yes here to enable the max732x to be used as an interrupt
+ controller. It requires the driver to be built in the kernel.
+
++config GPIO_MC13892
++ tristate "MC13892 GPOs"
++ depends on MFD_MC13XXX
++ help
++ Say yes here to access the GPO signals of MC13892 power management
++ chip from Freescale.
++
+ config GPIO_PCA953X
+ tristate "PCA953x, PCA955x, TCA64xx, and MAX7310 I/O ports"
+ depends on I2C
+Index: linux-2.6.38.8/drivers/gpio/Makefile
+===================================================================
+--- linux-2.6.38.8.orig/drivers/gpio/Makefile
++++ linux-2.6.38.8/drivers/gpio/Makefile
+@@ -16,6 +16,7 @@ obj-$(CONFIG_GPIO_MAX730X) += max730x.o
+ obj-$(CONFIG_GPIO_MAX7300) += max7300.o
+ obj-$(CONFIG_GPIO_MAX7301) += max7301.o
+ obj-$(CONFIG_GPIO_MAX732X) += max732x.o
++obj-$(CONFIG_GPIO_MC13892) += mc13892-gpio.o
+ obj-$(CONFIG_GPIO_MC33880) += mc33880.o
+ obj-$(CONFIG_GPIO_MCP23S08) += mcp23s08.o
+ obj-$(CONFIG_GPIO_74X164) += 74x164.o
+Index: linux-2.6.38.8/include/linux/mfd/mc13xxx.h
+===================================================================
+--- linux-2.6.38.8.orig/include/linux/mfd/mc13xxx.h
++++ linux-2.6.38.8/include/linux/mfd/mc13xxx.h
+@@ -144,6 +144,7 @@ struct mc13xxx_platform_data {
+ #define MC13XXX_USE_RTC (1 << 3)
+ #define MC13XXX_USE_REGULATOR (1 << 4)
+ #define MC13XXX_USE_LED (1 << 5)
++#define MC13XXX_USE_GPO (1 << 6)
+ unsigned int flags;
+
+ int num_regulators;
+Index: linux-2.6.38.8/include/linux/mfd/mc13892.h
+===================================================================
+--- linux-2.6.38.8.orig/include/linux/mfd/mc13892.h
++++ linux-2.6.38.8/include/linux/mfd/mc13892.h
+@@ -15,25 +15,21 @@
+ #define MC13892_SW2 1
+ #define MC13892_SW3 2
+ #define MC13892_SW4 3
+-#define MC13892_SWBST 4
+-#define MC13892_VIOHI 5
+-#define MC13892_VPLL 6
+-#define MC13892_VDIG 7
+-#define MC13892_VSD 8
+-#define MC13892_VUSB2 9
+-#define MC13892_VVIDEO 10
+-#define MC13892_VAUDIO 11
+-#define MC13892_VCAM 12
+-#define MC13892_VGEN1 13
+-#define MC13892_VGEN2 14
+-#define MC13892_VGEN3 15
+-#define MC13892_VUSB 16
+-#define MC13892_GPO1 17
+-#define MC13892_GPO2 18
+-#define MC13892_GPO3 19
+-#define MC13892_GPO4 20
+-#define MC13892_PWGT1SPI 21
+-#define MC13892_PWGT2SPI 22
+-#define MC13892_VCOINCELL 23
++#define MC13892_SWBST 4
++#define MC13892_VIOHI 5
++#define MC13892_VPLL 6
++#define MC13892_VDIG 7
++#define MC13892_VSD 8
++#define MC13892_VUSB2 9
++#define MC13892_VVIDEO 10
++#define MC13892_VAUDIO 11
++#define MC13892_VCAM 12
++#define MC13892_VGEN1 13
++#define MC13892_VGEN2 14
++#define MC13892_VGEN3 15
++#define MC13892_VUSB 16
++#define MC13892_PWGT1SPI 17
++#define MC13892_PWGT2SPI 18
++#define MC13892_VCOINCELL 19
+
+ #endif
+Index: linux-2.6.38.8/drivers/regulator/mc13892-regulator.c
+===================================================================
+--- linux-2.6.38.8.orig/drivers/regulator/mc13892-regulator.c
++++ linux-2.6.38.8/drivers/regulator/mc13892-regulator.c
+@@ -135,17 +135,6 @@
+ #define MC13892_REGULATORMODE1_VSDSTDBY (1<<19)
+ #define MC13892_REGULATORMODE1_VSDMODE (1<<20)
+
+-#define MC13892_POWERMISC 34
+-#define MC13892_POWERMISC_GPO1EN (1<<6)
+-#define MC13892_POWERMISC_GPO2EN (1<<8)
+-#define MC13892_POWERMISC_GPO3EN (1<<10)
+-#define MC13892_POWERMISC_GPO4EN (1<<12)
+-#define MC13892_POWERMISC_PWGT1SPIEN (1<<15)
+-#define MC13892_POWERMISC_PWGT2SPIEN (1<<16)
+-#define MC13892_POWERMISC_GPO4ADINEN (1<<21)
+-
+-#define MC13892_POWERMISC_PWGTSPI_M (3 << 15)
+-
+ #define MC13892_USB1 50
+ #define MC13892_USB1_VUSBEN (1<<3)
+
+@@ -229,15 +218,10 @@ static const int mc13892_vusb[] = {
+ 3300000,
+ };
+
+-static const int mc13892_gpo[] = {
+- 2750000,
+-};
+-
+ static const int mc13892_pwgtdrv[] = {
+ 5000000,
+ };
+
+-static struct regulator_ops mc13892_gpo_regulator_ops;
+ /* sw regulators need special care due to the "hi bit" */
+ static struct regulator_ops mc13892_sw_regulator_ops;
+
+@@ -246,10 +230,6 @@ static struct regulator_ops mc13892_sw_r
+ MC13xxx_FIXED_DEFINE(MC13892_, name, reg, voltages, \
+ mc13xxx_fixed_regulator_ops)
+
+-#define MC13892_GPO_DEFINE(name, reg, voltages) \
+- MC13xxx_GPO_DEFINE(MC13892_, name, reg, voltages, \
+- mc13892_gpo_regulator_ops)
+-
+ #define MC13892_SW_DEFINE(name, reg, vsel_reg, voltages) \
+ MC13xxx_DEFINE(MC13892_, name, reg, vsel_reg, voltages, \
+ mc13892_sw_regulator_ops)
+@@ -287,115 +267,6 @@ static struct mc13xxx_regulator mc13892_
+ MC13892_DEFINE_REGU(VGEN3, REGULATORMODE1, REGULATORSETTING0, \
+ mc13892_vgen3),
+ MC13892_FIXED_DEFINE(VUSB, USB1, mc13892_vusb),
+- MC13892_GPO_DEFINE(GPO1, POWERMISC, mc13892_gpo),
+- MC13892_GPO_DEFINE(GPO2, POWERMISC, mc13892_gpo),
+- MC13892_GPO_DEFINE(GPO3, POWERMISC, mc13892_gpo),
+- MC13892_GPO_DEFINE(GPO4, POWERMISC, mc13892_gpo),
+- MC13892_GPO_DEFINE(PWGT1SPI, POWERMISC, mc13892_pwgtdrv),
+- MC13892_GPO_DEFINE(PWGT2SPI, POWERMISC, mc13892_pwgtdrv),
+-};
+-
+-static int mc13892_powermisc_rmw(struct mc13xxx_regulator_priv *priv, u32 mask,
+- u32 val)
+-{
+- struct mc13xxx *mc13892 = priv->mc13xxx;
+- int ret;
+- u32 valread;
+-
+- BUG_ON(val & ~mask);
+-
+- ret = mc13xxx_reg_read(mc13892, MC13892_POWERMISC, &valread);
+- if (ret)
+- return ret;
+-
+- /* Update the stored state for Power Gates. */
+- priv->powermisc_pwgt_state =
+- (priv->powermisc_pwgt_state & ~mask) | val;
+- priv->powermisc_pwgt_state &= MC13892_POWERMISC_PWGTSPI_M;
+-
+- /* Construct the new register value */
+- valread = (valread & ~mask) | val;
+- /* Overwrite the PWGTxEN with the stored version */
+- valread = (valread & ~MC13892_POWERMISC_PWGTSPI_M) |
+- priv->powermisc_pwgt_state;
+-
+- return mc13xxx_reg_write(mc13892, MC13892_POWERMISC, valread);
+-}
+-
+-static int mc13892_gpo_regulator_enable(struct regulator_dev *rdev)
+-{
+- struct mc13xxx_regulator_priv *priv = rdev_get_drvdata(rdev);
+- int id = rdev_get_id(rdev);
+- int ret;
+- u32 en_val = mc13892_regulators[id].enable_bit;
+- u32 mask = mc13892_regulators[id].enable_bit;
+-
+- dev_dbg(rdev_get_dev(rdev), "%s id: %d\n", __func__, id);
+-
+- /* Power Gate enable value is 0 */
+- if (id == MC13892_PWGT1SPI || id == MC13892_PWGT2SPI)
+- en_val = 0;
+-
+- if (id == MC13892_GPO4)
+- mask |= MC13892_POWERMISC_GPO4ADINEN;
+-
+- mc13xxx_lock(priv->mc13xxx);
+- ret = mc13892_powermisc_rmw(priv, mask, en_val);
+- mc13xxx_unlock(priv->mc13xxx);
+-
+- return ret;
+-}
+-
+-static int mc13892_gpo_regulator_disable(struct regulator_dev *rdev)
+-{
+- struct mc13xxx_regulator_priv *priv = rdev_get_drvdata(rdev);
+- int id = rdev_get_id(rdev);
+- int ret;
+- u32 dis_val = 0;
+-
+- dev_dbg(rdev_get_dev(rdev), "%s id: %d\n", __func__, id);
+-
+- /* Power Gate disable value is 1 */
+- if (id == MC13892_PWGT1SPI || id == MC13892_PWGT2SPI)
+- dis_val = mc13892_regulators[id].enable_bit;
+-
+- mc13xxx_lock(priv->mc13xxx);
+- ret = mc13892_powermisc_rmw(priv, mc13892_regulators[id].enable_bit,
+- dis_val);
+- mc13xxx_unlock(priv->mc13xxx);
+-
+- return ret;
+-}
+-
+-static int mc13892_gpo_regulator_is_enabled(struct regulator_dev *rdev)
+-{
+- struct mc13xxx_regulator_priv *priv = rdev_get_drvdata(rdev);
+- int ret, id = rdev_get_id(rdev);
+- unsigned int val;
+-
+- mc13xxx_lock(priv->mc13xxx);
+- ret = mc13xxx_reg_read(priv->mc13xxx, mc13892_regulators[id].reg, &val);
+- mc13xxx_unlock(priv->mc13xxx);
+-
+- if (ret)
+- return ret;
+-
+- /* Power Gates state is stored in powermisc_pwgt_state
+- * where the meaning of bits is negated */
+- val = (val & ~MC13892_POWERMISC_PWGTSPI_M) |
+- (priv->powermisc_pwgt_state ^ MC13892_POWERMISC_PWGTSPI_M);
+-
+- return (val & mc13892_regulators[id].enable_bit) != 0;
+-}
+-
+-
+-static struct regulator_ops mc13892_gpo_regulator_ops = {
+- .enable = mc13892_gpo_regulator_enable,
+- .disable = mc13892_gpo_regulator_disable,
+- .is_enabled = mc13892_gpo_regulator_is_enabled,
+- .list_voltage = mc13xxx_regulator_list_voltage,
+- .set_voltage = mc13xxx_fixed_regulator_set_voltage,
+- .get_voltage = mc13xxx_fixed_regulator_get_voltage,
+ };
+
+ static int mc13892_sw_regulator_get_voltage(struct regulator_dev *rdev)
hooks/post-receive
--
armadeus
|