[PATCH 7/9] extcon: max8997: Consolidate duplicate code for checking ADC/CHG cable type

2013-02-13 Thread Chanwoo Choi
This patch make max8997_muic_get_cable_type() function to remove
duplicate code for checking ADC/Charger cable type because almost
internal function need to read adc/chg_type value of MUIC register.

Also, remove *_detach() function, extcon-max8997 driver treat
attach/detach operation of cable in max8997_*_handler() function.
Lastly, this patch move defined constant in header file(include/
linux/mfd/max8997.h, max8997-private.h) because defined constant
is only used in the 'extcon-max8997.c'.

Signed-off-by: Chanwoo Choi 
Signed-off-by: Myungjoo Ham 
---
 drivers/extcon/extcon-max8997.c | 492 +++-
 include/linux/mfd/max8997-private.h |   9 -
 include/linux/mfd/max8997.h |  15 --
 3 files changed, 323 insertions(+), 193 deletions(-)

diff --git a/drivers/extcon/extcon-max8997.c b/drivers/extcon/extcon-max8997.c
index 3206daa..35338a0 100644
--- a/drivers/extcon/extcon-max8997.c
+++ b/drivers/extcon/extcon-max8997.c
@@ -44,31 +44,89 @@ struct max8997_muic_irq {
 };
 
 static struct max8997_muic_irq muic_irqs[] = {
-   { MAX8997_MUICIRQ_ADCError, "muic-ADC_error" },
-   { MAX8997_MUICIRQ_ADCLow, "muic-ADC_low" },
-   { MAX8997_MUICIRQ_ADC, "muic-ADC" },
-   { MAX8997_MUICIRQ_VBVolt, "muic-VB_voltage" },
-   { MAX8997_MUICIRQ_DBChg, "muic-DB_charger" },
-   { MAX8997_MUICIRQ_DCDTmr, "muic-DCD_timer" },
-   { MAX8997_MUICIRQ_ChgDetRun, "muic-CDR_status" },
-   { MAX8997_MUICIRQ_ChgTyp, "muic-charger_type" },
-   { MAX8997_MUICIRQ_OVP, "muic-over_voltage" },
+   { MAX8997_MUICIRQ_ADCError, "muic-ADCERROR" },
+   { MAX8997_MUICIRQ_ADCLow,   "muic-ADCLOW" },
+   { MAX8997_MUICIRQ_ADC,  "muic-ADC" },
+   { MAX8997_MUICIRQ_VBVolt,   "muic-VBVOLT" },
+   { MAX8997_MUICIRQ_DBChg,"muic-DBCHG" },
+   { MAX8997_MUICIRQ_DCDTmr,   "muic-DCDTMR" },
+   { MAX8997_MUICIRQ_ChgDetRun,"muic-CHGDETRUN" },
+   { MAX8997_MUICIRQ_ChgTyp,   "muic-CHGTYP" },
+   { MAX8997_MUICIRQ_OVP,  "muic-OVP" },
+};
+
+/* Define supported cable type */
+enum max8997_muic_acc_type {
+   MAX8997_MUIC_ADC_GROUND = 0x0,
+   MAX8997_MUIC_ADC_MHL,   /* MHL*/
+   MAX8997_MUIC_ADC_REMOTE_S1_BUTTON,
+   MAX8997_MUIC_ADC_REMOTE_S2_BUTTON,
+   MAX8997_MUIC_ADC_REMOTE_S3_BUTTON,
+   MAX8997_MUIC_ADC_REMOTE_S4_BUTTON,
+   MAX8997_MUIC_ADC_REMOTE_S5_BUTTON,
+   MAX8997_MUIC_ADC_REMOTE_S6_BUTTON,
+   MAX8997_MUIC_ADC_REMOTE_S7_BUTTON,
+   MAX8997_MUIC_ADC_REMOTE_S8_BUTTON,
+   MAX8997_MUIC_ADC_REMOTE_S9_BUTTON,
+   MAX8997_MUIC_ADC_REMOTE_S10_BUTTON,
+   MAX8997_MUIC_ADC_REMOTE_S11_BUTTON,
+   MAX8997_MUIC_ADC_REMOTE_S12_BUTTON,
+   MAX8997_MUIC_ADC_RESERVED_ACC_1,
+   MAX8997_MUIC_ADC_RESERVED_ACC_2,
+   MAX8997_MUIC_ADC_RESERVED_ACC_3,
+   MAX8997_MUIC_ADC_RESERVED_ACC_4,
+   MAX8997_MUIC_ADC_RESERVED_ACC_5,
+   MAX8997_MUIC_ADC_CEA936_AUDIO,
+   MAX8997_MUIC_ADC_PHONE_POWERED_DEV,
+   MAX8997_MUIC_ADC_TTY_CONVERTER,
+   MAX8997_MUIC_ADC_UART_CABLE,
+   MAX8997_MUIC_ADC_CEA936A_TYPE1_CHG,
+   MAX8997_MUIC_ADC_FACTORY_MODE_USB_OFF,  /* JIG-USB-OFF */
+   MAX8997_MUIC_ADC_FACTORY_MODE_USB_ON,   /* JIG-USB-ON */
+   MAX8997_MUIC_ADC_AV_CABLE_NOLOAD,   /* DESKDOCK */
+   MAX8997_MUIC_ADC_CEA936A_TYPE2_CHG,
+   MAX8997_MUIC_ADC_FACTORY_MODE_UART_OFF, /* JIG-UART */
+   MAX8997_MUIC_ADC_FACTORY_MODE_UART_ON,  /* CARDOCK */
+   MAX8997_MUIC_ADC_AUDIO_MODE_REMOTE,
+   MAX8997_MUIC_ADC_OPEN,  /* OPEN */
+};
+
+enum max8997_muic_cable_group {
+   MAX8997_CABLE_GROUP_ADC = 0,
+   MAX8997_CABLE_GROUP_ADC_GND,
+   MAX8997_CABLE_GROUP_CHG,
+   MAX8997_CABLE_GROUP_VBVOLT,
+};
+
+enum max8997_muic_usb_type {
+   MAX8997_USB_HOST,
+   MAX8997_USB_DEVICE,
+};
+
+enum max8997_muic_charger_type {
+   MAX8997_CHARGER_TYPE_NONE = 0,
+   MAX8997_CHARGER_TYPE_USB,
+   MAX8997_CHARGER_TYPE_DOWNSTREAM_PORT,
+   MAX8997_CHARGER_TYPE_DEDICATED_CHG,
+   MAX8997_CHARGER_TYPE_500MA,
+   MAX8997_CHARGER_TYPE_1A,
+   MAX8997_CHARGER_TYPE_DEAD_BATTERY = 7,
 };
 
 struct max8997_muic_info {
struct device *dev;
struct i2c_client *muic;
-   struct max8997_muic_platform_data *muic_pdata;
+   struct extcon_dev *edev;
+   int prev_cable_type;
+   int prev_chg_type;
+   u8 status[2];
 
int irq;
struct work_struct irq_work;
-
-   enum max8997_muic_charger_type pre_charger_type;
-   int pre_adc;
-
struct mutex mutex;
 
-   struct extcon_dev   *edev;
+   struct max8997_muic_platform_data *muic_pdata;
+   enum max8997_muic_charger_type pre_charger_type;
 };
 
 enum {
@@ -181,6 +239,83 @@ static int max8997_muic_set_path(struct max8997_muic_info 
*info,
return 0;
 }
 
+/*
+ * max8997_muic_get_cable_type - Return cable type and check cable 

[PATCH 7/9] extcon: max8997: Consolidate duplicate code for checking ADC/CHG cable type

2013-02-13 Thread Chanwoo Choi
This patch make max8997_muic_get_cable_type() function to remove
duplicate code for checking ADC/Charger cable type because almost
internal function need to read adc/chg_type value of MUIC register.

Also, remove *_detach() function, extcon-max8997 driver treat
attach/detach operation of cable in max8997_*_handler() function.
Lastly, this patch move defined constant in header file(include/
linux/mfd/max8997.h, max8997-private.h) because defined constant
is only used in the 'extcon-max8997.c'.

Signed-off-by: Chanwoo Choi cw00.c...@samsung.com
Signed-off-by: Myungjoo Ham myungjoo@samsung.com
---
 drivers/extcon/extcon-max8997.c | 492 +++-
 include/linux/mfd/max8997-private.h |   9 -
 include/linux/mfd/max8997.h |  15 --
 3 files changed, 323 insertions(+), 193 deletions(-)

diff --git a/drivers/extcon/extcon-max8997.c b/drivers/extcon/extcon-max8997.c
index 3206daa..35338a0 100644
--- a/drivers/extcon/extcon-max8997.c
+++ b/drivers/extcon/extcon-max8997.c
@@ -44,31 +44,89 @@ struct max8997_muic_irq {
 };
 
 static struct max8997_muic_irq muic_irqs[] = {
-   { MAX8997_MUICIRQ_ADCError, muic-ADC_error },
-   { MAX8997_MUICIRQ_ADCLow, muic-ADC_low },
-   { MAX8997_MUICIRQ_ADC, muic-ADC },
-   { MAX8997_MUICIRQ_VBVolt, muic-VB_voltage },
-   { MAX8997_MUICIRQ_DBChg, muic-DB_charger },
-   { MAX8997_MUICIRQ_DCDTmr, muic-DCD_timer },
-   { MAX8997_MUICIRQ_ChgDetRun, muic-CDR_status },
-   { MAX8997_MUICIRQ_ChgTyp, muic-charger_type },
-   { MAX8997_MUICIRQ_OVP, muic-over_voltage },
+   { MAX8997_MUICIRQ_ADCError, muic-ADCERROR },
+   { MAX8997_MUICIRQ_ADCLow,   muic-ADCLOW },
+   { MAX8997_MUICIRQ_ADC,  muic-ADC },
+   { MAX8997_MUICIRQ_VBVolt,   muic-VBVOLT },
+   { MAX8997_MUICIRQ_DBChg,muic-DBCHG },
+   { MAX8997_MUICIRQ_DCDTmr,   muic-DCDTMR },
+   { MAX8997_MUICIRQ_ChgDetRun,muic-CHGDETRUN },
+   { MAX8997_MUICIRQ_ChgTyp,   muic-CHGTYP },
+   { MAX8997_MUICIRQ_OVP,  muic-OVP },
+};
+
+/* Define supported cable type */
+enum max8997_muic_acc_type {
+   MAX8997_MUIC_ADC_GROUND = 0x0,
+   MAX8997_MUIC_ADC_MHL,   /* MHL*/
+   MAX8997_MUIC_ADC_REMOTE_S1_BUTTON,
+   MAX8997_MUIC_ADC_REMOTE_S2_BUTTON,
+   MAX8997_MUIC_ADC_REMOTE_S3_BUTTON,
+   MAX8997_MUIC_ADC_REMOTE_S4_BUTTON,
+   MAX8997_MUIC_ADC_REMOTE_S5_BUTTON,
+   MAX8997_MUIC_ADC_REMOTE_S6_BUTTON,
+   MAX8997_MUIC_ADC_REMOTE_S7_BUTTON,
+   MAX8997_MUIC_ADC_REMOTE_S8_BUTTON,
+   MAX8997_MUIC_ADC_REMOTE_S9_BUTTON,
+   MAX8997_MUIC_ADC_REMOTE_S10_BUTTON,
+   MAX8997_MUIC_ADC_REMOTE_S11_BUTTON,
+   MAX8997_MUIC_ADC_REMOTE_S12_BUTTON,
+   MAX8997_MUIC_ADC_RESERVED_ACC_1,
+   MAX8997_MUIC_ADC_RESERVED_ACC_2,
+   MAX8997_MUIC_ADC_RESERVED_ACC_3,
+   MAX8997_MUIC_ADC_RESERVED_ACC_4,
+   MAX8997_MUIC_ADC_RESERVED_ACC_5,
+   MAX8997_MUIC_ADC_CEA936_AUDIO,
+   MAX8997_MUIC_ADC_PHONE_POWERED_DEV,
+   MAX8997_MUIC_ADC_TTY_CONVERTER,
+   MAX8997_MUIC_ADC_UART_CABLE,
+   MAX8997_MUIC_ADC_CEA936A_TYPE1_CHG,
+   MAX8997_MUIC_ADC_FACTORY_MODE_USB_OFF,  /* JIG-USB-OFF */
+   MAX8997_MUIC_ADC_FACTORY_MODE_USB_ON,   /* JIG-USB-ON */
+   MAX8997_MUIC_ADC_AV_CABLE_NOLOAD,   /* DESKDOCK */
+   MAX8997_MUIC_ADC_CEA936A_TYPE2_CHG,
+   MAX8997_MUIC_ADC_FACTORY_MODE_UART_OFF, /* JIG-UART */
+   MAX8997_MUIC_ADC_FACTORY_MODE_UART_ON,  /* CARDOCK */
+   MAX8997_MUIC_ADC_AUDIO_MODE_REMOTE,
+   MAX8997_MUIC_ADC_OPEN,  /* OPEN */
+};
+
+enum max8997_muic_cable_group {
+   MAX8997_CABLE_GROUP_ADC = 0,
+   MAX8997_CABLE_GROUP_ADC_GND,
+   MAX8997_CABLE_GROUP_CHG,
+   MAX8997_CABLE_GROUP_VBVOLT,
+};
+
+enum max8997_muic_usb_type {
+   MAX8997_USB_HOST,
+   MAX8997_USB_DEVICE,
+};
+
+enum max8997_muic_charger_type {
+   MAX8997_CHARGER_TYPE_NONE = 0,
+   MAX8997_CHARGER_TYPE_USB,
+   MAX8997_CHARGER_TYPE_DOWNSTREAM_PORT,
+   MAX8997_CHARGER_TYPE_DEDICATED_CHG,
+   MAX8997_CHARGER_TYPE_500MA,
+   MAX8997_CHARGER_TYPE_1A,
+   MAX8997_CHARGER_TYPE_DEAD_BATTERY = 7,
 };
 
 struct max8997_muic_info {
struct device *dev;
struct i2c_client *muic;
-   struct max8997_muic_platform_data *muic_pdata;
+   struct extcon_dev *edev;
+   int prev_cable_type;
+   int prev_chg_type;
+   u8 status[2];
 
int irq;
struct work_struct irq_work;
-
-   enum max8997_muic_charger_type pre_charger_type;
-   int pre_adc;
-
struct mutex mutex;
 
-   struct extcon_dev   *edev;
+   struct max8997_muic_platform_data *muic_pdata;
+   enum max8997_muic_charger_type pre_charger_type;
 };
 
 enum {
@@ -181,6 +239,83 @@ static int max8997_muic_set_path(struct max8997_muic_info 
*info,
return 0;
 }
 
+/*
+ * max8997_muic_get_cable_type - Return cable type and check