Commit 8e005935 authored by Uwe Kleine-König's avatar Uwe Kleine-König Committed by Samuel Ortiz

mfd: Add mc13892 support to mc13xxx

mc13892 is the companion PMIC for Freescale's i.MX51.  It's similar enough
to mc13782 to support it in a single driver.

This patch introduces enough compatibility cruft to keep all users of the
superseded mc13783 driver unchanged.
Signed-off-by: default avatarUwe Kleine-König <u.kleine-koenig@pengutronix.de>
Signed-off-by: default avatarSamuel Ortiz <sameo@linux.intel.com>
parent b4e017e3
...@@ -409,11 +409,16 @@ config MFD_PCF50633 ...@@ -409,11 +409,16 @@ config MFD_PCF50633
so that function-specific drivers can bind to them. so that function-specific drivers can bind to them.
config MFD_MC13783 config MFD_MC13783
tristate "Support Freescale MC13783" tristate
config MFD_MC13XXX
tristate "Support Freescale MC13783 and MC13892"
depends on SPI_MASTER depends on SPI_MASTER
select MFD_CORE select MFD_CORE
select MFD_MC13783
help help
Support for the Freescale (Atlas) MC13783 PMIC and audio CODEC. Support for the Freescale (Atlas) PMIC and audio CODECs
MC13783 and MC13892.
This driver provides common support for accessing the device, This driver provides common support for accessing the device,
additional drivers must be enabled in order to use the additional drivers must be enabled in order to use the
functionality of the device. functionality of the device.
......
...@@ -39,7 +39,7 @@ obj-$(CONFIG_TWL4030_POWER) += twl4030-power.o ...@@ -39,7 +39,7 @@ obj-$(CONFIG_TWL4030_POWER) += twl4030-power.o
obj-$(CONFIG_TWL4030_CODEC) += twl4030-codec.o obj-$(CONFIG_TWL4030_CODEC) += twl4030-codec.o
obj-$(CONFIG_TWL6030_PWM) += twl6030-pwm.o obj-$(CONFIG_TWL6030_PWM) += twl6030-pwm.o
obj-$(CONFIG_MFD_MC13783) += mc13783-core.o obj-$(CONFIG_MFD_MC13XXX) += mc13xxx-core.o
obj-$(CONFIG_MFD_CORE) += mfd-core.o obj-$(CONFIG_MFD_CORE) += mfd-core.o
......
/* /*
* Copyright 2009 Pengutronix * Copyright 2009-2010 Pengutronix
* Uwe Kleine-Koenig <u.kleine-koenig@pengutronix.de> * Uwe Kleine-Koenig <u.kleine-koenig@pengutronix.de>
* *
* This program is free software; you can redistribute it and/or modify it under * This program is free software; you can redistribute it and/or modify it under
...@@ -9,31 +9,84 @@ ...@@ -9,31 +9,84 @@
#ifndef __LINUX_MFD_MC13783_H #ifndef __LINUX_MFD_MC13783_H
#define __LINUX_MFD_MC13783_H #define __LINUX_MFD_MC13783_H
#include <linux/interrupt.h> #include <linux/mfd/mc13xxx.h>
struct mc13783; struct mc13783;
void mc13783_lock(struct mc13783 *mc13783); struct mc13xxx *mc13783_to_mc13xxx(struct mc13783 *mc13783);
void mc13783_unlock(struct mc13783 *mc13783);
static inline void mc13783_lock(struct mc13783 *mc13783)
int mc13783_reg_read(struct mc13783 *mc13783, unsigned int offset, u32 *val); {
int mc13783_reg_write(struct mc13783 *mc13783, unsigned int offset, u32 val); mc13xxx_lock(mc13783_to_mc13xxx(mc13783));
int mc13783_reg_rmw(struct mc13783 *mc13783, unsigned int offset, }
u32 mask, u32 val);
static inline void mc13783_unlock(struct mc13783 *mc13783)
int mc13783_get_flags(struct mc13783 *mc13783); {
mc13xxx_unlock(mc13783_to_mc13xxx(mc13783));
int mc13783_irq_request(struct mc13783 *mc13783, int irq, }
irq_handler_t handler, const char *name, void *dev);
int mc13783_irq_request_nounmask(struct mc13783 *mc13783, int irq, static inline int mc13783_reg_read(struct mc13783 *mc13783,
irq_handler_t handler, const char *name, void *dev); unsigned int offset, u32 *val)
int mc13783_irq_free(struct mc13783 *mc13783, int irq, void *dev); {
return mc13xxx_reg_read(mc13783_to_mc13xxx(mc13783), offset, val);
int mc13783_irq_mask(struct mc13783 *mc13783, int irq); }
int mc13783_irq_unmask(struct mc13783 *mc13783, int irq);
int mc13783_irq_status(struct mc13783 *mc13783, int irq, static inline int mc13783_reg_write(struct mc13783 *mc13783,
int *enabled, int *pending); unsigned int offset, u32 val)
int mc13783_irq_ack(struct mc13783 *mc13783, int irq); {
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 43
#define MC13783_ADC0_ADREFEN (1 << 10) #define MC13783_ADC0_ADREFEN (1 << 10)
...@@ -48,96 +101,18 @@ int mc13783_irq_ack(struct mc13783 *mc13783, int irq); ...@@ -48,96 +101,18 @@ int mc13783_irq_ack(struct mc13783 *mc13783, int irq);
MC13783_ADC0_TSMOD1 | \ MC13783_ADC0_TSMOD1 | \
MC13783_ADC0_TSMOD2) MC13783_ADC0_TSMOD2)
struct mc13783_led_platform_data { #define mc13783_regulator_init_data mc13xxx_regulator_init_data
#define MC13783_LED_MD 0 #define mc13783_regulator_platform_data mc13xxx_regulator_platform_data
#define MC13783_LED_AD 1 #define mc13783_led_platform_data mc13xxx_led_platform_data
#define MC13783_LED_KP 2 #define mc13783_leds_platform_data mc13xxx_leds_platform_data
#define MC13783_LED_R1 3
#define MC13783_LED_G1 4 #define mc13783_platform_data mc13xxx_platform_data
#define MC13783_LED_B1 5 #define MC13783_USE_TOUCHSCREEN MC13XXX_USE_TOUCHSCREEN
#define MC13783_LED_R2 6 #define MC13783_USE_CODEC MC13XXX_USE_CODEC
#define MC13783_LED_G2 7 #define MC13783_USE_ADC MC13XXX_USE_ADC
#define MC13783_LED_B2 8 #define MC13783_USE_RTC MC13XXX_USE_RTC
#define MC13783_LED_R3 9 #define MC13783_USE_REGULATOR MC13XXX_USE_REGULATOR
#define MC13783_LED_G3 10 #define MC13783_USE_LED MC13XXX_USE_LED
#define MC13783_LED_B3 11
#define MC13783_LED_MAX MC13783_LED_B3
int id;
const char *name;
const char *default_trigger;
/* Three or two bits current selection depending on the led */
char max_current;
};
struct mc13783_leds_platform_data {
int num_leds;
struct mc13783_led_platform_data *led;
#define MC13783_LED_TRIODE_MD (1 << 0)
#define MC13783_LED_TRIODE_AD (1 << 1)
#define MC13783_LED_TRIODE_KP (1 << 2)
#define MC13783_LED_BOOST_EN (1 << 3)
#define MC13783_LED_TC1HALF (1 << 4)
#define MC13783_LED_SLEWLIMTC (1 << 5)
#define MC13783_LED_SLEWLIMBL (1 << 6)
#define MC13783_LED_TRIODE_TC1 (1 << 7)
#define MC13783_LED_TRIODE_TC2 (1 << 8)
#define MC13783_LED_TRIODE_TC3 (1 << 9)
int flags;
#define MC13783_LED_AB_DISABLED 0
#define MC13783_LED_AB_MD1 1
#define MC13783_LED_AB_MD12 2
#define MC13783_LED_AB_MD123 3
#define MC13783_LED_AB_MD1234 4
#define MC13783_LED_AB_MD1234_AD1 5
#define MC13783_LED_AB_MD1234_AD12 6
#define MC13783_LED_AB_MD1_AD 7
char abmode;
#define MC13783_LED_ABREF_200MV 0
#define MC13783_LED_ABREF_400MV 1
#define MC13783_LED_ABREF_600MV 2
#define MC13783_LED_ABREF_800MV 3
char abref;
#define MC13783_LED_PERIOD_10MS 0
#define MC13783_LED_PERIOD_100MS 1
#define MC13783_LED_PERIOD_500MS 2
#define MC13783_LED_PERIOD_2S 3
char bl_period;
char tc1_period;
char tc2_period;
char tc3_period;
};
/* to be cleaned up */
struct regulator_init_data;
struct mc13783_regulator_init_data {
int id;
struct regulator_init_data *init_data;
};
struct mc13783_regulator_platform_data {
int num_regulators;
struct mc13783_regulator_init_data *regulators;
};
struct mc13783_platform_data {
int num_regulators;
struct mc13783_regulator_init_data *regulators;
struct mc13783_leds_platform_data *leds;
#define MC13783_USE_TOUCHSCREEN (1 << 0)
#define MC13783_USE_CODEC (1 << 1)
#define MC13783_USE_ADC (1 << 2)
#define MC13783_USE_RTC (1 << 3)
#define MC13783_USE_REGULATOR (1 << 4)
#define MC13783_USE_LED (1 << 5)
unsigned int flags;
};
#define MC13783_ADC_MODE_TS 1 #define MC13783_ADC_MODE_TS 1
#define MC13783_ADC_MODE_SINGLE_CHAN 2 #define MC13783_ADC_MODE_SINGLE_CHAN 2
...@@ -181,46 +156,46 @@ int mc13783_adc_do_conversion(struct mc13783 *mc13783, unsigned int mode, ...@@ -181,46 +156,46 @@ int mc13783_adc_do_conversion(struct mc13783 *mc13783, unsigned int mode,
#define MC13783_REGU_PWGT1SPI 31 #define MC13783_REGU_PWGT1SPI 31
#define MC13783_REGU_PWGT2SPI 32 #define MC13783_REGU_PWGT2SPI 32
#define MC13783_IRQ_ADCDONE 0 #define MC13783_IRQ_ADCDONE MC13XXX_IRQ_ADCDONE
#define MC13783_IRQ_ADCBISDONE 1 #define MC13783_IRQ_ADCBISDONE MC13XXX_IRQ_ADCBISDONE
#define MC13783_IRQ_TS 2 #define MC13783_IRQ_TS MC13XXX_IRQ_TS
#define MC13783_IRQ_WHIGH 3 #define MC13783_IRQ_WHIGH 3
#define MC13783_IRQ_WLOW 4 #define MC13783_IRQ_WLOW 4
#define MC13783_IRQ_CHGDET 6 #define MC13783_IRQ_CHGDET MC13XXX_IRQ_CHGDET
#define MC13783_IRQ_CHGOV 7 #define MC13783_IRQ_CHGOV 7
#define MC13783_IRQ_CHGREV 8 #define MC13783_IRQ_CHGREV MC13XXX_IRQ_CHGREV
#define MC13783_IRQ_CHGSHORT 9 #define MC13783_IRQ_CHGSHORT MC13XXX_IRQ_CHGSHORT
#define MC13783_IRQ_CCCV 10 #define MC13783_IRQ_CCCV MC13XXX_IRQ_CCCV
#define MC13783_IRQ_CHGCURR 11 #define MC13783_IRQ_CHGCURR MC13XXX_IRQ_CHGCURR
#define MC13783_IRQ_BPON 12 #define MC13783_IRQ_BPON MC13XXX_IRQ_BPON
#define MC13783_IRQ_LOBATL 13 #define MC13783_IRQ_LOBATL MC13XXX_IRQ_LOBATL
#define MC13783_IRQ_LOBATH 14 #define MC13783_IRQ_LOBATH MC13XXX_IRQ_LOBATH
#define MC13783_IRQ_UDP 15 #define MC13783_IRQ_UDP 15
#define MC13783_IRQ_USB 16 #define MC13783_IRQ_USB 16
#define MC13783_IRQ_ID 19 #define MC13783_IRQ_ID 19
#define MC13783_IRQ_SE1 21 #define MC13783_IRQ_SE1 21
#define MC13783_IRQ_CKDET 22 #define MC13783_IRQ_CKDET 22
#define MC13783_IRQ_UDM 23 #define MC13783_IRQ_UDM 23
#define MC13783_IRQ_1HZ 24 #define MC13783_IRQ_1HZ MC13XXX_IRQ_1HZ
#define MC13783_IRQ_TODA 25 #define MC13783_IRQ_TODA MC13XXX_IRQ_TODA
#define MC13783_IRQ_ONOFD1 27 #define MC13783_IRQ_ONOFD1 27
#define MC13783_IRQ_ONOFD2 28 #define MC13783_IRQ_ONOFD2 28
#define MC13783_IRQ_ONOFD3 29 #define MC13783_IRQ_ONOFD3 29
#define MC13783_IRQ_SYSRST 30 #define MC13783_IRQ_SYSRST MC13XXX_IRQ_SYSRST
#define MC13783_IRQ_RTCRST 31 #define MC13783_IRQ_RTCRST MC13XXX_IRQ_RTCRST
#define MC13783_IRQ_PC 32 #define MC13783_IRQ_PC MC13XXX_IRQ_PC
#define MC13783_IRQ_WARM 33 #define MC13783_IRQ_WARM MC13XXX_IRQ_WARM
#define MC13783_IRQ_MEMHLD 34 #define MC13783_IRQ_MEMHLD MC13XXX_IRQ_MEMHLD
#define MC13783_IRQ_PWRRDY 35 #define MC13783_IRQ_PWRRDY 35
#define MC13783_IRQ_THWARNL 36 #define MC13783_IRQ_THWARNL MC13XXX_IRQ_THWARNL
#define MC13783_IRQ_THWARNH 37 #define MC13783_IRQ_THWARNH MC13XXX_IRQ_THWARNH
#define MC13783_IRQ_CLK 38 #define MC13783_IRQ_CLK MC13XXX_IRQ_CLK
#define MC13783_IRQ_SEMAF 39 #define MC13783_IRQ_SEMAF 39
#define MC13783_IRQ_MC2B 41 #define MC13783_IRQ_MC2B 41
#define MC13783_IRQ_HSDET 42 #define MC13783_IRQ_HSDET 42
#define MC13783_IRQ_HSL 43 #define MC13783_IRQ_HSL 43
#define MC13783_IRQ_ALSPTH 44 #define MC13783_IRQ_ALSPTH 44
#define MC13783_IRQ_AHSSHORT 45 #define MC13783_IRQ_AHSSHORT 45
#define MC13783_NUM_IRQ 46 #define MC13783_NUM_IRQ MC13XXX_NUM_IRQ
#endif /* __LINUX_MFD_MC13783_H */ #endif /* ifndef __LINUX_MFD_MC13783_H */
/*
* Copyright 2009-2010 Pengutronix
* Uwe Kleine-Koenig <u.kleine-koenig@pengutronix.de>
*
* 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.
*/
#ifndef __LINUX_MFD_MC13XXX_H
#define __LINUX_MFD_MC13XXX_H
#include <linux/interrupt.h>
struct mc13xxx;
void mc13xxx_lock(struct mc13xxx *mc13xxx);
void mc13xxx_unlock(struct mc13xxx *mc13xxx);
int mc13xxx_reg_read(struct mc13xxx *mc13xxx, unsigned int offset, u32 *val);
int mc13xxx_reg_write(struct mc13xxx *mc13xxx, unsigned int offset, u32 val);
int mc13xxx_reg_rmw(struct mc13xxx *mc13xxx, unsigned int offset,
u32 mask, u32 val);
int mc13xxx_get_flags(struct mc13xxx *mc13xxx);
int mc13xxx_irq_request(struct mc13xxx *mc13xxx, int irq,
irq_handler_t handler, const char *name, void *dev);
int mc13xxx_irq_request_nounmask(struct mc13xxx *mc13xxx, int irq,
irq_handler_t handler, const char *name, void *dev);
int mc13xxx_irq_free(struct mc13xxx *mc13xxx, int irq, void *dev);
int mc13xxx_irq_mask(struct mc13xxx *mc13xxx, int irq);
int mc13xxx_irq_unmask(struct mc13xxx *mc13xxx, int irq);
int mc13xxx_irq_status(struct mc13xxx *mc13xxx, int irq,
int *enabled, int *pending);
int mc13xxx_irq_ack(struct mc13xxx *mc13xxx, int irq);
int mc13xxx_get_flags(struct mc13xxx *mc13xxx);
#define MC13XXX_IRQ_ADCDONE 0
#define MC13XXX_IRQ_ADCBISDONE 1
#define MC13XXX_IRQ_TS 2
#define MC13XXX_IRQ_CHGDET 6
#define MC13XXX_IRQ_CHGREV 8
#define MC13XXX_IRQ_CHGSHORT 9
#define MC13XXX_IRQ_CCCV 10
#define MC13XXX_IRQ_CHGCURR 11
#define MC13XXX_IRQ_BPON 12
#define MC13XXX_IRQ_LOBATL 13
#define MC13XXX_IRQ_LOBATH 14
#define MC13XXX_IRQ_1HZ 24
#define MC13XXX_IRQ_TODA 25
#define MC13XXX_IRQ_SYSRST 30
#define MC13XXX_IRQ_RTCRST 31
#define MC13XXX_IRQ_PC 32
#define MC13XXX_IRQ_WARM 33
#define MC13XXX_IRQ_MEMHLD 34
#define MC13XXX_IRQ_THWARNL 36
#define MC13XXX_IRQ_THWARNH 37
#define MC13XXX_IRQ_CLK 38
#define MC13XXX_NUM_IRQ 46
struct regulator_init_data;
struct mc13xxx_regulator_init_data {
int id;
struct regulator_init_data *init_data;
};
struct mc13xxx_regulator_platform_data {
int num_regulators;
struct mc13xxx_regulator_init_data *regulators;
};
struct mc13xxx_led_platform_data {
#define MC13783_LED_MD 0
#define MC13783_LED_AD 1
#define MC13783_LED_KP 2
#define MC13783_LED_R1 3
#define MC13783_LED_G1 4
#define MC13783_LED_B1 5
#define MC13783_LED_R2 6
#define MC13783_LED_G2 7
#define MC13783_LED_B2 8
#define MC13783_LED_R3 9
#define MC13783_LED_G3 10
#define MC13783_LED_B3 11
#define MC13783_LED_MAX MC13783_LED_B3
int id;
const char *name;
const char *default_trigger;
/* Three or two bits current selection depending on the led */
char max_current;
};
struct mc13xxx_leds_platform_data {
int num_leds;
struct mc13xxx_led_platform_data *led;
#define MC13783_LED_TRIODE_MD (1 << 0)
#define MC13783_LED_TRIODE_AD (1 << 1)
#define MC13783_LED_TRIODE_KP (1 << 2)
#define MC13783_LED_BOOST_EN (1 << 3)
#define MC13783_LED_TC1HALF (1 << 4)
#define MC13783_LED_SLEWLIMTC (1 << 5)
#define MC13783_LED_SLEWLIMBL (1 << 6)
#define MC13783_LED_TRIODE_TC1 (1 << 7)
#define MC13783_LED_TRIODE_TC2 (1 << 8)
#define MC13783_LED_TRIODE_TC3 (1 << 9)
int flags;
#define MC13783_LED_AB_DISABLED 0
#define MC13783_LED_AB_MD1 1
#define MC13783_LED_AB_MD12 2
#define MC13783_LED_AB_MD123 3
#define MC13783_LED_AB_MD1234 4
#define MC13783_LED_AB_MD1234_AD1 5
#define MC13783_LED_AB_MD1234_AD12 6
#define MC13783_LED_AB_MD1_AD 7
char abmode;
#define MC13783_LED_ABREF_200MV 0
#define MC13783_LED_ABREF_400MV 1
#define MC13783_LED_ABREF_600MV 2
#define MC13783_LED_ABREF_800MV 3
char abref;
#define MC13783_LED_PERIOD_10MS 0
#define MC13783_LED_PERIOD_100MS 1
#define MC13783_LED_PERIOD_500MS 2
#define MC13783_LED_PERIOD_2S 3
char bl_period;
char tc1_period;
char tc2_period;
char tc3_period;
};
struct mc13xxx_platform_data {
#define MC13XXX_USE_TOUCHSCREEN (1 << 0)
#define MC13XXX_USE_CODEC (1 << 1)
#define MC13XXX_USE_ADC (1 << 2)
#define MC13XXX_USE_RTC (1 << 3)
#define MC13XXX_USE_REGULATOR (1 << 4)
#define MC13XXX_USE_LED (1 << 5)
unsigned int flags;
int num_regulators;
struct mc13xxx_regulator_init_data *regulators;
struct mc13xxx_leds_platform_data *leds;
};
#endif /* ifndef __LINUX_MFD_MC13XXX_H */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment