[Armadeus-commitlog] armadeus branch, master, updated. armadeus-5.3-549-ge2858fa
Brought to you by:
sszy
|
From: Sébastien S. <ss...@us...> - 2015-01-15 09:13:02
|
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 e2858fae2090650fee618d52317c492482ec79dd (commit)
from e47b8b607e18a32400d8745a7fd70d1251bcc294 (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 e2858fae2090650fee618d52317c492482ec79dd
Author: Sébastien Szymanski <seb...@ar...>
Date: Thu Jan 15 10:16:18 2015 +0100
[LINUX] 2.6.38: apf51v2: add ADC of MC13892 PMIC support
-----------------------------------------------------------------------
Summary of changes:
.../armadeus/apf51/apf51-linux-2.6.38.config | 1 +
.../454-armadeus-add-mc13892_adc_support.patch | 987 ++++++++++++++++++++
2 files changed, 988 insertions(+), 0 deletions(-)
create mode 100644 patches/linux/2.6.38/454-armadeus-add-mc13892_adc_support.patch
diff --git a/buildroot/target/device/armadeus/apf51/apf51-linux-2.6.38.config b/buildroot/target/device/armadeus/apf51/apf51-linux-2.6.38.config
index 08f87b7..7155247 100644
--- a/buildroot/target/device/armadeus/apf51/apf51-linux-2.6.38.config
+++ b/buildroot/target/device/armadeus/apf51/apf51-linux-2.6.38.config
@@ -145,6 +145,7 @@ CONFIG_WM831X_POWER=m
CONFIG_HWMON=m
CONFIG_SENSORS_AS1531=m
CONFIG_SENSORS_WM831X=m
+CONFIG_SENSORS_MC13783_ADC=m
CONFIG_WATCHDOG=y
CONFIG_WATCHDOG_NOWAYOUT=y
CONFIG_WM831X_WATCHDOG=m
diff --git a/patches/linux/2.6.38/454-armadeus-add-mc13892_adc_support.patch b/patches/linux/2.6.38/454-armadeus-add-mc13892_adc_support.patch
new file mode 100644
index 0000000..d8f56ec
--- /dev/null
+++ b/patches/linux/2.6.38/454-armadeus-add-mc13892_adc_support.patch
@@ -0,0 +1,987 @@
+Index: linux-2.6.38.8/drivers/mfd/mc13xxx-core.c
+===================================================================
+--- linux-2.6.38.8.orig/drivers/mfd/mc13xxx-core.c
++++ linux-2.6.38.8/drivers/mfd/mc13xxx-core.c
+@@ -33,20 +33,10 @@ struct mc13xxx {
+
+ irq_handler_t irqhandler[MC13XXX_NUM_IRQ];
+ void *irqdata[MC13XXX_NUM_IRQ];
+-};
+-
+-struct mc13783 {
+- struct mc13xxx mc13xxx;
+
+ int adcflags;
+ };
+
+-struct mc13xxx *mc13783_to_mc13xxx(struct mc13783 *mc13783)
+-{
+- return &mc13783->mc13xxx;
+-}
+-EXPORT_SYMBOL(mc13783_to_mc13xxx);
+-
+ #define MC13XXX_IRQSTAT0 0
+ #define MC13XXX_IRQSTAT0_ADCDONEI (1 << 0)
+ #define MC13XXX_IRQSTAT0_ADCBISDONEI (1 << 1)
+@@ -146,14 +136,14 @@ EXPORT_SYMBOL(mc13783_to_mc13xxx);
+ #define MC13XXX_PWRCTRL2 15
+ #define MC13XXX_PWRCTRL2_PWRON3RSTEN (1 << 3)
+
+-#define MC13783_ADC1 44
+-#define MC13783_ADC1_ADEN (1 << 0)
+-#define MC13783_ADC1_RAND (1 << 1)
+-#define MC13783_ADC1_ADSEL (1 << 3)
+-#define MC13783_ADC1_ASC (1 << 20)
+-#define MC13783_ADC1_ADTRIGIGN (1 << 21)
++#define MC13XXX_ADC1 44
++#define MC13XXX_ADC1_ADEN (1 << 0)
++#define MC13XXX_ADC1_RAND (1 << 1)
++#define MC13XXX_ADC1_ADSEL (1 << 3)
++#define MC13XXX_ADC1_ASC (1 << 20)
++#define MC13XXX_ADC1_ADTRIGIGN (1 << 21)
+
+-#define MC13783_ADC2 45
++#define MC13XXX_ADC2 45
+
+ #define MC13XXX_ADC3 46
+
+@@ -468,7 +458,7 @@ static irqreturn_t mc13xxx_irq_thread(in
+ return IRQ_RETVAL(handled);
+ }
+
+-const char *mc13xxx_chipname[] = {
++static const char *mc13xxx_chipname[] = {
+ [MC13XXX_ID_MC13783] = "mc13783",
+ [MC13XXX_ID_MC13892] = "mc13892",
+ };
+@@ -533,8 +523,6 @@ static const char *mc13xxx_get_chipname(
+ return mc13xxx_chipname[devid];
+ }
+
+-#include <linux/mfd/mc13783.h>
+-
+ int mc13xxx_get_flags(struct mc13xxx *mc13xxx)
+ {
+ struct mc13xxx_platform_data *pdata =
+@@ -544,15 +532,17 @@ int mc13xxx_get_flags(struct mc13xxx *mc
+ }
+ EXPORT_SYMBOL(mc13xxx_get_flags);
+
+-#define MC13783_ADC1_CHAN0_SHIFT 5
+-#define MC13783_ADC1_CHAN1_SHIFT 8
++#define MC13XXX_ADC1_CHAN0_SHIFT 5
++#define MC13XXX_ADC1_CHAN1_SHIFT 8
++#define MC13783_ADC1_ATO_SHIFT 11
++#define MC13783_ADC1_ATOX (1 << 19)
+
+ struct mc13xxx_adcdone_data {
+ struct mc13xxx *mc13xxx;
+ struct completion done;
+ };
+
+-static irqreturn_t mc13783_handler_adcdone(int irq, void *data)
++static irqreturn_t mc13xxx_handler_adcdone(int irq, void *data)
+ {
+ struct mc13xxx_adcdone_data *adcdone_data = data;
+
+@@ -563,12 +553,12 @@ static irqreturn_t mc13783_handler_adcdo
+ return IRQ_HANDLED;
+ }
+
+-#define MC13783_ADC_WORKING (1 << 0)
++#define MC13XXX_ADC_WORKING (1 << 0)
+
+-int mc13783_adc_do_conversion(struct mc13783 *mc13783, unsigned int mode,
+- unsigned int channel, unsigned int *sample)
++int mc13xxx_adc_do_conversion(struct mc13xxx *mc13xxx, unsigned int mode,
++ unsigned int channel, u8 ato, bool atox,
++ unsigned int *sample)
+ {
+- struct mc13xxx *mc13xxx = &mc13783->mc13xxx;
+ u32 adc0, adc1, old_adc0;
+ int i, ret;
+ struct mc13xxx_adcdone_data adcdone_data = {
+@@ -580,51 +570,55 @@ int mc13783_adc_do_conversion(struct mc1
+
+ mc13xxx_lock(mc13xxx);
+
+- if (mc13783->adcflags & MC13783_ADC_WORKING) {
++ if (mc13xxx->adcflags & MC13XXX_ADC_WORKING) {
+ ret = -EBUSY;
+ goto out;
+ }
+
+- mc13783->adcflags |= MC13783_ADC_WORKING;
++ mc13xxx->adcflags |= MC13XXX_ADC_WORKING;
+
+- mc13xxx_reg_read(mc13xxx, MC13783_ADC0, &old_adc0);
++ mc13xxx_reg_read(mc13xxx, MC13XXX_ADC0, &old_adc0);
+
+- adc0 = MC13783_ADC0_ADINC1 | MC13783_ADC0_ADINC2;
+- adc1 = MC13783_ADC1_ADEN | MC13783_ADC1_ADTRIGIGN | MC13783_ADC1_ASC;
++ adc0 = MC13XXX_ADC0_ADINC1 | MC13XXX_ADC0_ADINC2;
++ adc1 = MC13XXX_ADC1_ADEN | MC13XXX_ADC1_ADTRIGIGN | MC13XXX_ADC1_ASC;
+
+ if (channel > 7)
+- adc1 |= MC13783_ADC1_ADSEL;
++ adc1 |= MC13XXX_ADC1_ADSEL;
+
+ switch (mode) {
+- case MC13783_ADC_MODE_TS:
+- adc0 |= MC13783_ADC0_ADREFEN | MC13783_ADC0_TSMOD0 |
+- MC13783_ADC0_TSMOD1;
+- adc1 |= 4 << MC13783_ADC1_CHAN1_SHIFT;
++ case MC13XXX_ADC_MODE_TS:
++ adc0 |= MC13XXX_ADC0_ADREFEN | MC13XXX_ADC0_TSMOD0 |
++ MC13XXX_ADC0_TSMOD1;
++ adc1 |= 4 << MC13XXX_ADC1_CHAN1_SHIFT;
+ break;
+
+- case MC13783_ADC_MODE_SINGLE_CHAN:
+- adc0 |= old_adc0 & MC13783_ADC0_TSMOD_MASK;
+- adc1 |= (channel & 0x7) << MC13783_ADC1_CHAN0_SHIFT;
+- adc1 |= MC13783_ADC1_RAND;
++ case MC13XXX_ADC_MODE_SINGLE_CHAN:
++ adc0 |= old_adc0 & MC13XXX_ADC0_CONFIG_MASK;
++ adc1 |= (channel & 0x7) << MC13XXX_ADC1_CHAN0_SHIFT;
++ adc1 |= MC13XXX_ADC1_RAND;
+ break;
+
+- case MC13783_ADC_MODE_MULT_CHAN:
+- adc0 |= old_adc0 & MC13783_ADC0_TSMOD_MASK;
+- adc1 |= 4 << MC13783_ADC1_CHAN1_SHIFT;
++ case MC13XXX_ADC_MODE_MULT_CHAN:
++ adc0 |= old_adc0 & MC13XXX_ADC0_CONFIG_MASK;
++ adc1 |= 4 << MC13XXX_ADC1_CHAN1_SHIFT;
+ break;
+
+ default:
+- mc13783_unlock(mc13783);
++ mc13xxx_unlock(mc13xxx);
+ return -EINVAL;
+ }
+
+- dev_dbg(&mc13783->mc13xxx.client->dev, "%s: request irq\n", __func__);
+- mc13xxx_irq_request(mc13xxx, MC13783_IRQ_ADCDONE,
+- mc13783_handler_adcdone, __func__, &adcdone_data);
+- mc13xxx_irq_ack(mc13xxx, MC13783_IRQ_ADCDONE);
++ adc1 |= ato << MC13783_ADC1_ATO_SHIFT;
++ if (atox)
++ adc1 |= MC13783_ADC1_ATOX;
++
++ dev_dbg(&mc13xxx->client->dev, "%s: request irq\n", __func__);
++ mc13xxx_irq_request(mc13xxx, MC13XXX_IRQ_ADCDONE,
++ mc13xxx_handler_adcdone, __func__, &adcdone_data);
++ mc13xxx_irq_ack(mc13xxx, MC13XXX_IRQ_ADCDONE);
+
+- mc13xxx_reg_write(mc13xxx, MC13783_ADC0, adc0);
+- mc13xxx_reg_write(mc13xxx, MC13783_ADC1, adc1);
++ mc13xxx_reg_write(mc13xxx, MC13XXX_ADC0, adc0);
++ mc13xxx_reg_write(mc13xxx, MC13XXX_ADC1, adc1);
+
+ mc13xxx_unlock(mc13xxx);
+
+@@ -635,27 +629,35 @@ int mc13783_adc_do_conversion(struct mc1
+
+ mc13xxx_lock(mc13xxx);
+
+- mc13xxx_irq_free(mc13xxx, MC13783_IRQ_ADCDONE, &adcdone_data);
++ mc13xxx_irq_free(mc13xxx, MC13XXX_IRQ_ADCDONE, &adcdone_data);
++
++ if (ret > 0) {
++ if (mode == MC13XXX_ADC_MODE_SINGLE_CHAN) {
++ mc13xxx_reg_read(mc13xxx, MC13XXX_ADC1, &adc1);
++ adc1 &= 0xFFFF1F;
++ adc1 |= (4 << MC13XXX_ADC1_CHAN1_SHIFT);
++ mc13xxx_reg_write(mc13xxx, MC13XXX_ADC1, adc1);
++ }
+
+- if (ret > 0)
+ for (i = 0; i < 4; ++i) {
+ ret = mc13xxx_reg_read(mc13xxx,
+- MC13783_ADC2, &sample[i]);
++ MC13XXX_ADC2, &sample[i]);
+ if (ret)
+ break;
+ }
++ }
+
+- if (mode == MC13783_ADC_MODE_TS)
++ if (mode == MC13XXX_ADC_MODE_TS)
+ /* restore TSMOD */
+- mc13xxx_reg_write(mc13xxx, MC13783_ADC0, old_adc0);
++ mc13xxx_reg_write(mc13xxx, MC13XXX_ADC0, old_adc0);
+
+- mc13783->adcflags &= ~MC13783_ADC_WORKING;
++ mc13xxx->adcflags &= ~MC13XXX_ADC_WORKING;
+ out:
+ mc13xxx_unlock(mc13xxx);
+
+ return ret;
+ }
+-EXPORT_SYMBOL_GPL(mc13783_adc_do_conversion);
++EXPORT_SYMBOL_GPL(mc13xxx_adc_do_conversion);
+
+ static int mc13xxx_add_subdevice_pdata(struct mc13xxx *mc13xxx,
+ const char *format, void *pdata, size_t pdata_size)
+@@ -762,7 +764,8 @@ err_revision:
+ mc13xxx_add_subdevice(mc13xxx, "%s-rtc");
+
+ if (pdata->flags & MC13XXX_USE_TOUCHSCREEN)
+- mc13xxx_add_subdevice(mc13xxx, "%s-ts");
++ mc13xxx_add_subdevice_pdata(mc13xxx, "%s-ts",
++ &pdata->touch, sizeof(pdata->touch));
+
+ if (pdata->flags & MC13XXX_USE_LED) {
+ mc13xxx_add_subdevice_pdata(mc13xxx, "%s-led",
+Index: linux-2.6.38.8/include/linux/mfd/mc13783.h
+===================================================================
+--- linux-2.6.38.8.orig/include/linux/mfd/mc13783.h
++++ linux-2.6.38.8/include/linux/mfd/mc13783.h
+@@ -12,117 +12,6 @@
+
+ #include <linux/mfd/mc13xxx.h>
+
+-struct mc13783;
+-
+-struct mc13xxx *mc13783_to_mc13xxx(struct mc13783 *mc13783);
+-
+-static inline void mc13783_lock(struct mc13783 *mc13783)
+-{
+- mc13xxx_lock(mc13783_to_mc13xxx(mc13783));
+-}
+-
+-static inline void mc13783_unlock(struct mc13783 *mc13783)
+-{
+- mc13xxx_unlock(mc13783_to_mc13xxx(mc13783));
+-}
+-
+-static inline int mc13783_reg_read(struct mc13783 *mc13783,
+- unsigned int offset, u32 *val)
+-{
+- return mc13xxx_reg_read(mc13783_to_mc13xxx(mc13783), offset, val);
+-}
+-
+-static inline int mc13783_reg_write(struct mc13783 *mc13783,
+- unsigned int offset, u32 val)
+-{
+- return mc13xxx_reg_write(mc13783_to_mc13xxx(mc13783), offset, val);
+-}
+-
+-static inline int mc13783_reg_rmw(struct mc13783 *mc13783,
+- unsigned int offset, u32 mask, u32 val)
+-{
+- return mc13xxx_reg_rmw(mc13783_to_mc13xxx(mc13783), offset, mask, val);
+-}
+-
+-static inline int mc13783_get_flags(struct mc13783 *mc13783)
+-{
+- return mc13xxx_get_flags(mc13783_to_mc13xxx(mc13783));
+-}
+-
+-static inline int mc13783_irq_request(struct mc13783 *mc13783, int irq,
+- irq_handler_t handler, const char *name, void *dev)
+-{
+- return mc13xxx_irq_request(mc13783_to_mc13xxx(mc13783), irq,
+- handler, name, dev);
+-}
+-
+-static inline int mc13783_irq_request_nounmask(struct mc13783 *mc13783, int irq,
+- irq_handler_t handler, const char *name, void *dev)
+-{
+- return mc13xxx_irq_request_nounmask(mc13783_to_mc13xxx(mc13783), irq,
+- handler, name, dev);
+-}
+-
+-static inline int mc13783_irq_free(struct mc13783 *mc13783, int irq, void *dev)
+-{
+- return mc13xxx_irq_free(mc13783_to_mc13xxx(mc13783), irq, dev);
+-}
+-
+-static inline int mc13783_irq_mask(struct mc13783 *mc13783, int irq)
+-{
+- return mc13xxx_irq_mask(mc13783_to_mc13xxx(mc13783), irq);
+-}
+-
+-static inline int mc13783_irq_unmask(struct mc13783 *mc13783, int irq)
+-{
+- return mc13xxx_irq_unmask(mc13783_to_mc13xxx(mc13783), irq);
+-}
+-static inline int mc13783_irq_status(struct mc13783 *mc13783, int irq,
+- int *enabled, int *pending)
+-{
+- return mc13xxx_irq_status(mc13783_to_mc13xxx(mc13783),
+- irq, enabled, pending);
+-}
+-
+-static inline int mc13783_irq_ack(struct mc13783 *mc13783, int irq)
+-{
+- return mc13xxx_irq_ack(mc13783_to_mc13xxx(mc13783), irq);
+-}
+-
+-#define MC13783_ADC0 43
+-#define MC13783_ADC0_ADREFEN (1 << 10)
+-#define MC13783_ADC0_ADREFMODE (1 << 11)
+-#define MC13783_ADC0_TSMOD0 (1 << 12)
+-#define MC13783_ADC0_TSMOD1 (1 << 13)
+-#define MC13783_ADC0_TSMOD2 (1 << 14)
+-#define MC13783_ADC0_ADINC1 (1 << 16)
+-#define MC13783_ADC0_ADINC2 (1 << 17)
+-
+-#define MC13783_ADC0_TSMOD_MASK (MC13783_ADC0_TSMOD0 | \
+- MC13783_ADC0_TSMOD1 | \
+- MC13783_ADC0_TSMOD2)
+-
+-#define mc13783_regulator_init_data mc13xxx_regulator_init_data
+-#define mc13783_regulator_platform_data mc13xxx_regulator_platform_data
+-#define mc13783_led_platform_data mc13xxx_led_platform_data
+-#define mc13783_leds_platform_data mc13xxx_leds_platform_data
+-
+-#define mc13783_platform_data mc13xxx_platform_data
+-#define MC13783_USE_TOUCHSCREEN MC13XXX_USE_TOUCHSCREEN
+-#define MC13783_USE_CODEC MC13XXX_USE_CODEC
+-#define MC13783_USE_ADC MC13XXX_USE_ADC
+-#define MC13783_USE_RTC MC13XXX_USE_RTC
+-#define MC13783_USE_REGULATOR MC13XXX_USE_REGULATOR
+-#define MC13783_USE_LED MC13XXX_USE_LED
+-
+-#define MC13783_ADC_MODE_TS 1
+-#define MC13783_ADC_MODE_SINGLE_CHAN 2
+-#define MC13783_ADC_MODE_MULT_CHAN 3
+-
+-int mc13783_adc_do_conversion(struct mc13783 *mc13783, unsigned int mode,
+- unsigned int channel, unsigned int *sample);
+-
+-
+ #define MC13783_REG_SW1A 0
+ #define MC13783_REG_SW1B 1
+ #define MC13783_REG_SW2A 2
+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
+@@ -37,6 +37,10 @@ int mc13xxx_irq_ack(struct mc13xxx *mc13
+
+ int mc13xxx_get_flags(struct mc13xxx *mc13xxx);
+
++int mc13xxx_adc_do_conversion(struct mc13xxx *mc13xxx,
++ unsigned int mode, unsigned int channel,
++ u8 ato, bool atox, unsigned int *sample);
++
+ #define MC13XXX_IRQ_ADCDONE 0
+ #define MC13XXX_IRQ_ADCBISDONE 1
+ #define MC13XXX_IRQ_TS 2
+@@ -137,6 +141,18 @@ struct mc13xxx_leds_platform_data {
+ char tc3_period;
+ };
+
++struct mc13xxx_ts_platform_data {
++ /* Delay between Touchscreen polarization and ADC Conversion.
++ * Given in clock ticks of a 32 kHz clock which gives a granularity of
++ * about 30.5ms */
++ u8 ato;
++
++#define MC13783_TS_ATO_FIRST false
++#define MC13783_TS_ATO_EACH true
++ /* Use the ATO delay only for the first conversion or for each one */
++ bool atox;
++};
++
+ struct mc13xxx_platform_data {
+ #define MC13XXX_USE_TOUCHSCREEN (1 << 0)
+ #define MC13XXX_USE_CODEC (1 << 1)
+@@ -150,6 +166,31 @@ struct mc13xxx_platform_data {
+ int num_regulators;
+ struct mc13xxx_regulator_init_data *regulators;
+ struct mc13xxx_leds_platform_data *leds;
++ struct mc13xxx_ts_platform_data touch;
+ };
+
++#define MC13XXX_ADC_MODE_TS 1
++#define MC13XXX_ADC_MODE_SINGLE_CHAN 2
++#define MC13XXX_ADC_MODE_MULT_CHAN 3
++
++#define MC13XXX_ADC0 43
++#define MC13XXX_ADC0_LICELLCON (1 << 0)
++#define MC13XXX_ADC0_CHRGICON (1 << 1)
++#define MC13XXX_ADC0_BATICON (1 << 2)
++#define MC13XXX_ADC0_ADREFEN (1 << 10)
++#define MC13XXX_ADC0_TSMOD0 (1 << 12)
++#define MC13XXX_ADC0_TSMOD1 (1 << 13)
++#define MC13XXX_ADC0_TSMOD2 (1 << 14)
++#define MC13XXX_ADC0_ADINC1 (1 << 16)
++#define MC13XXX_ADC0_ADINC2 (1 << 17)
++
++#define MC13XXX_ADC0_TSMOD_MASK (MC13XXX_ADC0_TSMOD0 | \
++ MC13XXX_ADC0_TSMOD1 | \
++ MC13XXX_ADC0_TSMOD2)
++
++#define MC13XXX_ADC0_CONFIG_MASK (MC13XXX_ADC0_TSMOD_MASK | \
++ MC13XXX_ADC0_LICELLCON | \
++ MC13XXX_ADC0_CHRGICON | \
++ MC13XXX_ADC0_BATICON)
++
+ #endif /* ifndef __LINUX_MFD_MC13XXX_H */
+Index: linux-2.6.38.8/drivers/input/touchscreen/mc13783_ts.c
+===================================================================
+--- linux-2.6.38.8.orig/drivers/input/touchscreen/mc13783_ts.c
++++ linux-2.6.38.8/drivers/input/touchscreen/mc13783_ts.c
+@@ -35,17 +35,18 @@ MODULE_PARM_DESC(sample_tolerance,
+
+ struct mc13783_ts_priv {
+ struct input_dev *idev;
+- struct mc13783 *mc13783;
++ struct mc13xxx *mc13xxx;
+ struct delayed_work work;
+ struct workqueue_struct *workq;
+ unsigned int sample[4];
++ struct mc13xxx_ts_platform_data *touch;
+ };
+
+ static irqreturn_t mc13783_ts_handler(int irq, void *data)
+ {
+ struct mc13783_ts_priv *priv = data;
+
+- mc13783_irq_ack(priv->mc13783, irq);
++ mc13xxx_irq_ack(priv->mc13xxx, irq);
+
+ /*
+ * Kick off reading coordinates. Note that if work happens already
+@@ -121,11 +122,13 @@ static void mc13783_ts_work(struct work_
+ {
+ struct mc13783_ts_priv *priv =
+ container_of(work, struct mc13783_ts_priv, work.work);
+- unsigned int mode = MC13783_ADC_MODE_TS;
++ unsigned int mode = MC13XXX_ADC_MODE_TS;
+ unsigned int channel = 12;
+
+- if (mc13783_adc_do_conversion(priv->mc13783,
+- mode, channel, priv->sample) == 0)
++ if (mc13xxx_adc_do_conversion(priv->mc13xxx,
++ mode, channel,
++ priv->touch->ato, priv->touch->atox,
++ priv->sample) == 0)
+ mc13783_ts_report_sample(priv);
+ }
+
+@@ -134,21 +137,21 @@ static int mc13783_ts_open(struct input_
+ struct mc13783_ts_priv *priv = input_get_drvdata(dev);
+ int ret;
+
+- mc13783_lock(priv->mc13783);
++ mc13xxx_lock(priv->mc13xxx);
+
+- mc13783_irq_ack(priv->mc13783, MC13783_IRQ_TS);
++ mc13xxx_irq_ack(priv->mc13xxx, MC13XXX_IRQ_TS);
+
+- ret = mc13783_irq_request(priv->mc13783, MC13783_IRQ_TS,
++ ret = mc13xxx_irq_request(priv->mc13xxx, MC13XXX_IRQ_TS,
+ mc13783_ts_handler, MC13783_TS_NAME, priv);
+ if (ret)
+ goto out;
+
+- ret = mc13783_reg_rmw(priv->mc13783, MC13783_ADC0,
+- MC13783_ADC0_TSMOD_MASK, MC13783_ADC0_TSMOD0);
++ ret = mc13xxx_reg_rmw(priv->mc13xxx, MC13XXX_ADC0,
++ MC13XXX_ADC0_TSMOD_MASK, MC13XXX_ADC0_TSMOD0);
+ if (ret)
+- mc13783_irq_free(priv->mc13783, MC13783_IRQ_TS, priv);
++ mc13xxx_irq_free(priv->mc13xxx, MC13XXX_IRQ_TS, priv);
+ out:
+- mc13783_unlock(priv->mc13783);
++ mc13xxx_unlock(priv->mc13xxx);
+ return ret;
+ }
+
+@@ -156,11 +159,11 @@ static void mc13783_ts_close(struct inpu
+ {
+ struct mc13783_ts_priv *priv = input_get_drvdata(dev);
+
+- mc13783_lock(priv->mc13783);
+- mc13783_reg_rmw(priv->mc13783, MC13783_ADC0,
+- MC13783_ADC0_TSMOD_MASK, 0);
+- mc13783_irq_free(priv->mc13783, MC13783_IRQ_TS, priv);
+- mc13783_unlock(priv->mc13783);
++ mc13xxx_lock(priv->mc13xxx);
++ mc13xxx_reg_rmw(priv->mc13xxx, MC13XXX_ADC0,
++ MC13XXX_ADC0_TSMOD_MASK, 0);
++ mc13xxx_irq_free(priv->mc13xxx, MC13XXX_IRQ_TS, priv);
++ mc13xxx_unlock(priv->mc13xxx);
+
+ cancel_delayed_work_sync(&priv->work);
+ }
+@@ -177,8 +180,14 @@ static int __init mc13783_ts_probe(struc
+ goto err_free_mem;
+
+ INIT_DELAYED_WORK(&priv->work, mc13783_ts_work);
+- priv->mc13783 = dev_get_drvdata(pdev->dev.parent);
++ priv->mc13xxx = dev_get_drvdata(pdev->dev.parent);
+ priv->idev = idev;
++ priv->touch = dev_get_platdata(&pdev->dev);
++ if (!priv->touch) {
++ dev_err(&pdev->dev, "missing platform data\n");
++ ret = -ENODEV;
++ goto err_free_mem;
++ }
+
+ /*
+ * We need separate workqueue because mc13783_adc_do_conversion
+Index: linux-2.6.38.8/drivers/hwmon/mc13783-adc.c
+===================================================================
+--- linux-2.6.38.8.orig/drivers/hwmon/mc13783-adc.c
++++ linux-2.6.38.8/drivers/hwmon/mc13783-adc.c
+@@ -1,5 +1,5 @@
+ /*
+- * Driver for the Freescale Semiconductor MC13783 adc.
++ * Driver for the ADC on Freescale Semiconductor MC13783 and MC13892 PMICs.
+ *
+ * Copyright 2004-2007 Freescale Semiconductor, Inc. All Rights Reserved.
+ * Copyright (C) 2009 Sascha Hauer, Pengutronix
+@@ -18,7 +18,7 @@
+ * Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+-#include <linux/mfd/mc13783.h>
++#include <linux/mfd/mc13xxx.h>
+ #include <linux/platform_device.h>
+ #include <linux/hwmon-sysfs.h>
+ #include <linux/kernel.h>
+@@ -28,38 +28,48 @@
+ #include <linux/init.h>
+ #include <linux/err.h>
+
+-#define MC13783_ADC_NAME "mc13783-adc"
++#define DRIVER_NAME "mc13783-adc"
++
++/* platform device id driver data */
++#define MC13783_ADC_16CHANS 1
++#define MC13783_ADC_BPDIV2 2
+
+ struct mc13783_adc_priv {
+- struct mc13783 *mc13783;
++ struct mc13xxx *mc13xxx;
+ struct device *hwmon_dev;
++ char name[10];
+ };
+
+ static ssize_t mc13783_adc_show_name(struct device *dev, struct device_attribute
+ *devattr, char *buf)
+ {
+- return sprintf(buf, "mc13783_adc\n");
++ struct mc13783_adc_priv *priv = dev_get_drvdata(dev);
++
++ return sprintf(buf, "%s\n", priv->name);
+ }
+
+ static int mc13783_adc_read(struct device *dev,
+ struct device_attribute *devattr, unsigned int *val)
+ {
+- struct platform_device *pdev = to_platform_device(dev);
+- struct mc13783_adc_priv *priv = platform_get_drvdata(pdev);
++ struct mc13783_adc_priv *priv = dev_get_drvdata(dev);
+ struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
+ unsigned int channel = attr->index;
+ unsigned int sample[4];
+- int ret;
++ unsigned int sum;
++ int ret, i;
+
+- ret = mc13783_adc_do_conversion(priv->mc13783,
+- MC13783_ADC_MODE_MULT_CHAN,
+- channel, sample);
++ ret = mc13xxx_adc_do_conversion(priv->mc13xxx,
++ MC13XXX_ADC_MODE_SINGLE_CHAN,
++ channel, 0, 0, sample);
+ if (ret)
+ return ret;
++ sum = 0;
++ for (i = 0; i<4; ++i) {
++ sum += ((sample[i] >> 2) & 0x3ff);
++ sum += ((sample[i] >> 14) & 0x3ff);
++ }
+
+- channel &= 0x7;
+-
+- *val = (sample[channel % 4] >> (channel > 3 ? 14 : 2)) & 0x3ff;
++ *val = DIV_ROUND_CLOSEST(sum, 8);
+
+ return 0;
+ }
+@@ -68,16 +78,21 @@ static ssize_t mc13783_adc_read_bp(struc
+ struct device_attribute *devattr, char *buf)
+ {
+ unsigned val;
++ struct platform_device *pdev = to_platform_device(dev);
++ kernel_ulong_t driver_data = platform_get_device_id(pdev)->driver_data;
+ int ret = mc13783_adc_read(dev, devattr, &val);
+
+ if (ret)
+ return ret;
+
+- /*
+- * BP (channel 2) reports with offset 2.4V to the actual value to fit
+- * the input range of the ADC. unit = 2.25mV = 9/4 mV.
+- */
+- val = DIV_ROUND_CLOSEST(val * 9, 4) + 2400;
++ if (driver_data & MC13783_ADC_BPDIV2)
++ val = DIV_ROUND_CLOSEST(val * 9, 2);
++ else
++ /*
++ * BP (channel 2) reports with offset 2.4V to the actual value
++ * to fit the input range of the ADC. unit = 2.25mV = 9/4 mV.
++ */
++ val = DIV_ROUND_CLOSEST(val * 9, 4) + 2400;
+
+ return sprintf(buf, "%u\n", val);
+ }
+@@ -114,12 +129,21 @@ static SENSOR_DEVICE_ATTR(in13_input, S_
+ static SENSOR_DEVICE_ATTR(in14_input, S_IRUGO, mc13783_adc_read_gp, NULL, 14);
+ static SENSOR_DEVICE_ATTR(in15_input, S_IRUGO, mc13783_adc_read_gp, NULL, 15);
+
+-static struct attribute *mc13783_attr[] = {
++static struct attribute *mc13783_attr_base[] = {
+ &dev_attr_name.attr,
+ &sensor_dev_attr_in2_input.dev_attr.attr,
+ &sensor_dev_attr_in5_input.dev_attr.attr,
+ &sensor_dev_attr_in6_input.dev_attr.attr,
+ &sensor_dev_attr_in7_input.dev_attr.attr,
++ NULL
++};
++
++static const struct attribute_group mc13783_group_base = {
++ .attrs = mc13783_attr_base,
++};
++
++/* these are only used if MC13783_ADC_16CHANS is provided in driver data */
++static struct attribute *mc13783_attr_16chans[] = {
+ &sensor_dev_attr_in8_input.dev_attr.attr,
+ &sensor_dev_attr_in9_input.dev_attr.attr,
+ &sensor_dev_attr_in10_input.dev_attr.attr,
+@@ -127,8 +151,8 @@ static struct attribute *mc13783_attr[]
+ NULL
+ };
+
+-static const struct attribute_group mc13783_group = {
+- .attrs = mc13783_attr,
++static const struct attribute_group mc13783_group_16chans = {
++ .attrs = mc13783_attr_16chans,
+ };
+
+ /* last four channels may be occupied by the touchscreen */
+@@ -147,33 +171,46 @@ static const struct attribute_group mc13
+ static int mc13783_adc_use_touchscreen(struct platform_device *pdev)
+ {
+ struct mc13783_adc_priv *priv = platform_get_drvdata(pdev);
+- unsigned flags = mc13783_get_flags(priv->mc13783);
++ unsigned flags = mc13xxx_get_flags(priv->mc13xxx);
+
+- return flags & MC13783_USE_TOUCHSCREEN;
++ return flags & MC13XXX_USE_TOUCHSCREEN;
+ }
+
+ static int __init mc13783_adc_probe(struct platform_device *pdev)
+ {
+ struct mc13783_adc_priv *priv;
+ int ret;
++ const struct platform_device_id *id = platform_get_device_id(pdev);
++ char *dash;
+
+ priv = kzalloc(sizeof(*priv), GFP_KERNEL);
+ if (!priv)
+ return -ENOMEM;
+
+- priv->mc13783 = dev_get_drvdata(pdev->dev.parent);
++ priv->mc13xxx = dev_get_drvdata(pdev->dev.parent);
++ snprintf(priv->name, ARRAY_SIZE(priv->name), "%s", id->name);
++ dash = strchr(priv->name, '-');
++ if (dash)
++ *dash = '\0';
+
+ platform_set_drvdata(pdev, priv);
+
+ /* Register sysfs hooks */
+- ret = sysfs_create_group(&pdev->dev.kobj, &mc13783_group);
++ ret = sysfs_create_group(&pdev->dev.kobj, &mc13783_group_base);
+ if (ret)
+- goto out_err_create1;
++ goto out_err_create_base;
++
++ if (id->driver_data & MC13783_ADC_16CHANS) {
++ ret = sysfs_create_group(&pdev->dev.kobj,
++ &mc13783_group_16chans);
++ if (ret)
++ goto out_err_create_16chans;
++ }
+
+ if (!mc13783_adc_use_touchscreen(pdev)) {
+ ret = sysfs_create_group(&pdev->dev.kobj, &mc13783_group_ts);
+ if (ret)
+- goto out_err_create2;
++ goto out_err_create_ts;
+ }
+
+ priv->hwmon_dev = hwmon_device_register(&pdev->dev);
+@@ -184,17 +221,20 @@ static int __init mc13783_adc_probe(stru
+ goto out_err_register;
+ }
+
+-
+ return 0;
+
+ out_err_register:
+
+ if (!mc13783_adc_use_touchscreen(pdev))
+ sysfs_remove_group(&pdev->dev.kobj, &mc13783_group_ts);
+-out_err_create2:
++out_err_create_ts:
++
++ if (id->driver_data & MC13783_ADC_16CHANS)
++ sysfs_remove_group(&pdev->dev.kobj, &mc13783_group_16chans);
++out_err_create_16chans:
+
+- sysfs_remove_group(&pdev->dev.kobj, &mc13783_group);
+-out_err_create1:
++ sysfs_remove_group(&pdev->dev.kobj, &mc13783_group_base);
++out_err_create_base:
+
+ platform_set_drvdata(pdev, NULL);
+ kfree(priv);
+@@ -205,13 +245,17 @@ out_err_create1:
+ static int __devexit mc13783_adc_remove(struct platform_device *pdev)
+ {
+ struct mc13783_adc_priv *priv = platform_get_drvdata(pdev);
++ kernel_ulong_t driver_data = platform_get_device_id(pdev)->driver_data;
+
+ hwmon_device_unregister(priv->hwmon_dev);
+
+ if (!mc13783_adc_use_touchscreen(pdev))
+ sysfs_remove_group(&pdev->dev.kobj, &mc13783_group_ts);
+
+- sysfs_remove_group(&pdev->dev.kobj, &mc13783_group);
++ if (driver_data & MC13783_ADC_16CHANS)
++ sysfs_remove_group(&pdev->dev.kobj, &mc13783_group_16chans);
++
++ sysfs_remove_group(&pdev->dev.kobj, &mc13783_group_base);
+
+ platform_set_drvdata(pdev, NULL);
+ kfree(priv);
+@@ -219,12 +263,26 @@ static int __devexit mc13783_adc_remove(
+ return 0;
+ }
+
++static const struct platform_device_id mc13783_adc_idtable[] = {
++ {
++ .name = "mc13783-adc",
++ .driver_data = MC13783_ADC_16CHANS,
++ }, {
++ .name = "mc13892-adc",
++ .driver_data = MC13783_ADC_BPDIV2,
++ }, {
++ /* sentinel */
++ }
++};
++MODULE_DEVICE_TABLE(platform, mc13783_adc_idtable);
++
+ static struct platform_driver mc13783_adc_driver = {
+ .remove = __devexit_p(mc13783_adc_remove),
+ .driver = {
+ .owner = THIS_MODULE,
+- .name = MC13783_ADC_NAME,
++ .name = DRIVER_NAME,
+ },
++ .id_table = mc13783_adc_idtable,
+ };
+
+ static int __init mc13783_adc_init(void)
+@@ -243,4 +301,3 @@ module_exit(mc13783_adc_exit);
+ MODULE_DESCRIPTION("MC13783 ADC driver");
+ MODULE_AUTHOR("Luotao Fu <l....@pe...>");
+ MODULE_LICENSE("GPL");
+-MODULE_ALIAS("platform:" MC13783_ADC_NAME);
+Index: linux-2.6.38.8/drivers/leds/leds-mc13783.c
+===================================================================
+--- linux-2.6.38.8.orig/drivers/leds/leds-mc13783.c
++++ linux-2.6.38.8/drivers/leds/leds-mc13783.c
+@@ -21,13 +21,13 @@
+ #include <linux/platform_device.h>
+ #include <linux/leds.h>
+ #include <linux/workqueue.h>
+-#include <linux/mfd/mc13783.h>
++#include <linux/mfd/mc13xxx.h>
+ #include <linux/slab.h>
+
+ struct mc13783_led {
+ struct led_classdev cdev;
+ struct work_struct work;
+- struct mc13783 *master;
++ struct mc13xxx *master;
+ enum led_brightness new_brightness;
+ int id;
+ };
+@@ -111,11 +111,11 @@ static void mc13783_led_work(struct work
+ break;
+ }
+
+- mc13783_lock(led->master);
++ mc13xxx_lock(led->master);
+
+- mc13783_reg_rmw(led->master, reg, mask, value);
++ mc13xxx_reg_rmw(led->master, reg, mask, value);
+
+- mc13783_unlock(led->master);
++ mc13xxx_unlock(led->master);
+ }
+
+ static void mc13783_led_set(struct led_classdev *led_cdev,
+@@ -172,23 +172,23 @@ static int __devinit mc13783_led_setup(s
+ break;
+ }
+
+- mc13783_lock(led->master);
++ mc13xxx_lock(led->master);
+
+- ret = mc13783_reg_rmw(led->master, reg, mask << shift,
++ ret = mc13xxx_reg_rmw(led->master, reg, mask << shift,
+ value << shift);
+
+- mc13783_unlock(led->master);
++ mc13xxx_unlock(led->master);
+ return ret;
+ }
+
+ static int __devinit mc13783_leds_prepare(struct platform_device *pdev)
+ {
+ struct mc13783_leds_platform_data *pdata = dev_get_platdata(&pdev->dev);
+- struct mc13783 *dev = dev_get_drvdata(pdev->dev.parent);
++ struct mc13xxx *dev = dev_get_drvdata(pdev->dev.parent);
+ int ret = 0;
+ int reg = 0;
+
+- mc13783_lock(dev);
++ mc13xxx_lock(dev);
+
+ if (pdata->flags & MC13783_LED_TC1HALF)
+ reg |= MC13783_LED_C1_TC1HALF_BIT;
+@@ -196,7 +196,7 @@ static int __devinit mc13783_leds_prepar
+ if (pdata->flags & MC13783_LED_SLEWLIMTC)
+ reg |= MC13783_LED_Cx_SLEWLIM_BIT;
+
+- ret = mc13783_reg_write(dev, MC13783_REG_LED_CONTROL_1, reg);
++ ret = mc13xxx_reg_write(dev, MC13783_REG_LED_CONTROL_1, reg);
+ if (ret)
+ goto out;
+
+@@ -206,7 +206,7 @@ static int __devinit mc13783_leds_prepar
+ if (pdata->flags & MC13783_LED_SLEWLIMBL)
+ reg |= MC13783_LED_Cx_SLEWLIM_BIT;
+
+- ret = mc13783_reg_write(dev, MC13783_REG_LED_CONTROL_2, reg);
++ ret = mc13xxx_reg_write(dev, MC13783_REG_LED_CONTROL_2, reg);
+ if (ret)
+ goto out;
+
+@@ -216,7 +216,7 @@ static int __devinit mc13783_leds_prepar
+ if (pdata->flags & MC13783_LED_TRIODE_TC1)
+ reg |= MC13783_LED_Cx_TRIODE_TC_BIT;
+
+- ret = mc13783_reg_write(dev, MC13783_REG_LED_CONTROL_3, reg);
++ ret = mc13xxx_reg_write(dev, MC13783_REG_LED_CONTROL_3, reg);
+ if (ret)
+ goto out;
+
+@@ -226,7 +226,7 @@ static int __devinit mc13783_leds_prepar
+ if (pdata->flags & MC13783_LED_TRIODE_TC2)
+ reg |= MC13783_LED_Cx_TRIODE_TC_BIT;
+
+- ret = mc13783_reg_write(dev, MC13783_REG_LED_CONTROL_4, reg);
++ ret = mc13xxx_reg_write(dev, MC13783_REG_LED_CONTROL_4, reg);
+ if (ret)
+ goto out;
+
+@@ -236,7 +236,7 @@ static int __devinit mc13783_leds_prepar
+ if (pdata->flags & MC13783_LED_TRIODE_TC3)
+ reg |= MC13783_LED_Cx_TRIODE_TC_BIT;;
+
+- ret = mc13783_reg_write(dev, MC13783_REG_LED_CONTROL_5, reg);
++ ret = mc13xxx_reg_write(dev, MC13783_REG_LED_CONTROL_5, reg);
+ if (ret)
+ goto out;
+
+@@ -255,10 +255,10 @@ static int __devinit mc13783_leds_prepar
+ reg |= (pdata->abref & MC13783_LED_C0_ABREF_MASK) <<
+ MC13783_LED_C0_ABREF;
+
+- ret = mc13783_reg_write(dev, MC13783_REG_LED_CONTROL_0, reg);
++ ret = mc13xxx_reg_write(dev, MC13783_REG_LED_CONTROL_0, reg);
+
+ out:
+- mc13783_unlock(dev);
++ mc13xxx_unlock(dev);
+ return ret;
+ }
+
+@@ -353,7 +353,7 @@ static int __devexit mc13783_led_remove(
+ {
+ struct mc13783_leds_platform_data *pdata = dev_get_platdata(&pdev->dev);
+ struct mc13783_led *led = platform_get_drvdata(pdev);
+- struct mc13783 *dev = dev_get_drvdata(pdev->dev.parent);
++ struct mc13xxx *dev = dev_get_drvdata(pdev->dev.parent);
+ int i;
+
+ for (i = 0; i < pdata->num_leds; i++) {
+@@ -361,16 +361,16 @@ static int __devexit mc13783_led_remove(
+ cancel_work_sync(&led[i].work);
+ }
+
+- mc13783_lock(dev);
++ mc13xxx_lock(dev);
+
+- mc13783_reg_write(dev, MC13783_REG_LED_CONTROL_0, 0);
+- mc13783_reg_write(dev, MC13783_REG_LED_CONTROL_1, 0);
+- mc13783_reg_write(dev, MC13783_REG_LED_CONTROL_2, 0);
+- mc13783_reg_write(dev, MC13783_REG_LED_CONTROL_3, 0);
+- mc13783_reg_write(dev, MC13783_REG_LED_CONTROL_4, 0);
+- mc13783_reg_write(dev, MC13783_REG_LED_CONTROL_5, 0);
++ mc13xxx_reg_write(dev, MC13783_REG_LED_CONTROL_0, 0);
++ mc13xxx_reg_write(dev, MC13783_REG_LED_CONTROL_1, 0);
++ mc13xxx_reg_write(dev, MC13783_REG_LED_CONTROL_2, 0);
++ mc13xxx_reg_write(dev, MC13783_REG_LED_CONTROL_3, 0);
++ mc13xxx_reg_write(dev, MC13783_REG_LED_CONTROL_4, 0);
++ mc13xxx_reg_write(dev, MC13783_REG_LED_CONTROL_5, 0);
+
+- mc13783_unlock(dev);
++ mc13xxx_unlock(dev);
+
+ kfree(led);
+ return 0;
+Index: linux-2.6.38.8/drivers/hwmon/Kconfig
+===================================================================
+--- linux-2.6.38.8.orig/drivers/hwmon/Kconfig
++++ linux-2.6.38.8/drivers/hwmon/Kconfig
+@@ -1195,10 +1195,10 @@ config SENSORS_APPLESMC
+ the awesome power of applesmc.
+
+ config SENSORS_MC13783_ADC
+- tristate "Freescale MC13783 ADC"
+- depends on MFD_MC13783
++ tristate "Freescale MC13783/MC13892 ADC"
++ depends on MFD_MC13XXX
+ help
+- Support for the A/D converter on MC13783 PMIC.
++ Support for the A/D converter on MC13783 and MC13892 PMIC.
+
+ if ACPI
+
+Index: linux-2.6.38.8/arch/arm/mach-mx5/board-apf51.c
+===================================================================
+--- linux-2.6.38.8.orig/arch/arm/mach-mx5/board-apf51.c
++++ linux-2.6.38.8/arch/arm/mach-mx5/board-apf51.c
+@@ -401,7 +401,7 @@ static struct i2c_board_info apf51_i2c1_
+ };
+
+ static struct mc13xxx_platform_data apf51_mc13xxx_pdata = {
+- .flags = MC13XXX_USE_RTC | MC13XXX_USE_GPO,
++ .flags = MC13XXX_USE_RTC | MC13XXX_USE_GPO | MC13XXX_USE_ADC,
+ };
+
+ static struct i2c_board_info apf51v2_i2c1_devices[] __initdata = {
hooks/post-receive
--
armadeus
|