diff options
| -rw-r--r-- | drivers/extcon/extcon-max77693.c | 2 | ||||
| -rw-r--r-- | drivers/extcon/extcon-max8997.c | 728 | ||||
| -rw-r--r-- | include/linux/mfd/max8997-private.h | 64 | ||||
| -rw-r--r-- | include/linux/mfd/max8997.h | 25 |
4 files changed, 567 insertions, 252 deletions
diff --git a/drivers/extcon/extcon-max77693.c b/drivers/extcon/extcon-max77693.c index ad6e9a466855..b70e3815c459 100644 --- a/drivers/extcon/extcon-max77693.c +++ b/drivers/extcon/extcon-max77693.c | |||
| @@ -185,7 +185,7 @@ enum { | |||
| 185 | _EXTCON_CABLE_NUM, | 185 | _EXTCON_CABLE_NUM, |
| 186 | }; | 186 | }; |
| 187 | 187 | ||
| 188 | const char *max77693_extcon_cable[] = { | 188 | static const char *max77693_extcon_cable[] = { |
| 189 | [EXTCON_CABLE_USB] = "USB", | 189 | [EXTCON_CABLE_USB] = "USB", |
| 190 | [EXTCON_CABLE_USB_HOST] = "USB-Host", | 190 | [EXTCON_CABLE_USB_HOST] = "USB-Host", |
| 191 | [EXTCON_CABLE_TA] = "TA", | 191 | [EXTCON_CABLE_TA] = "TA", |
diff --git a/drivers/extcon/extcon-max8997.c b/drivers/extcon/extcon-max8997.c index df9358e30814..e636d950ad6c 100644 --- a/drivers/extcon/extcon-max8997.c +++ b/drivers/extcon/extcon-max8997.c | |||
| @@ -29,51 +29,14 @@ | |||
| 29 | #include <linux/irqdomain.h> | 29 | #include <linux/irqdomain.h> |
| 30 | 30 | ||
| 31 | #define DEV_NAME "max8997-muic" | 31 | #define DEV_NAME "max8997-muic" |
| 32 | #define DELAY_MS_DEFAULT 20000 /* unit: millisecond */ | ||
| 32 | 33 | ||
| 33 | /* MAX8997-MUIC STATUS1 register */ | 34 | enum max8997_muic_adc_debounce_time { |
| 34 | #define STATUS1_ADC_SHIFT 0 | 35 | ADC_DEBOUNCE_TIME_0_5MS = 0, /* 0.5ms */ |
| 35 | #define STATUS1_ADCLOW_SHIFT 5 | 36 | ADC_DEBOUNCE_TIME_10MS, /* 10ms */ |
| 36 | #define STATUS1_ADCERR_SHIFT 6 | 37 | ADC_DEBOUNCE_TIME_25MS, /* 25ms */ |
| 37 | #define STATUS1_ADC_MASK (0x1f << STATUS1_ADC_SHIFT) | 38 | ADC_DEBOUNCE_TIME_38_62MS, /* 38.62ms */ |
| 38 | #define STATUS1_ADCLOW_MASK (0x1 << STATUS1_ADCLOW_SHIFT) | 39 | }; |
| 39 | #define STATUS1_ADCERR_MASK (0x1 << STATUS1_ADCERR_SHIFT) | ||
| 40 | |||
| 41 | /* MAX8997-MUIC STATUS2 register */ | ||
| 42 | #define STATUS2_CHGTYP_SHIFT 0 | ||
| 43 | #define STATUS2_CHGDETRUN_SHIFT 3 | ||
| 44 | #define STATUS2_DCDTMR_SHIFT 4 | ||
| 45 | #define STATUS2_DBCHG_SHIFT 5 | ||
| 46 | #define STATUS2_VBVOLT_SHIFT 6 | ||
| 47 | #define STATUS2_CHGTYP_MASK (0x7 << STATUS2_CHGTYP_SHIFT) | ||
| 48 | #define STATUS2_CHGDETRUN_MASK (0x1 << STATUS2_CHGDETRUN_SHIFT) | ||
| 49 | #define STATUS2_DCDTMR_MASK (0x1 << STATUS2_DCDTMR_SHIFT) | ||
| 50 | #define STATUS2_DBCHG_MASK (0x1 << STATUS2_DBCHG_SHIFT) | ||
| 51 | #define STATUS2_VBVOLT_MASK (0x1 << STATUS2_VBVOLT_SHIFT) | ||
| 52 | |||
| 53 | /* MAX8997-MUIC STATUS3 register */ | ||
| 54 | #define STATUS3_OVP_SHIFT 2 | ||
| 55 | #define STATUS3_OVP_MASK (0x1 << STATUS3_OVP_SHIFT) | ||
| 56 | |||
| 57 | /* MAX8997-MUIC CONTROL1 register */ | ||
| 58 | #define COMN1SW_SHIFT 0 | ||
| 59 | #define COMP2SW_SHIFT 3 | ||
| 60 | #define COMN1SW_MASK (0x7 << COMN1SW_SHIFT) | ||
| 61 | #define COMP2SW_MASK (0x7 << COMP2SW_SHIFT) | ||
| 62 | #define SW_MASK (COMP2SW_MASK | COMN1SW_MASK) | ||
| 63 | |||
| 64 | #define MAX8997_SW_USB ((1 << COMP2SW_SHIFT) | (1 << COMN1SW_SHIFT)) | ||
| 65 | #define MAX8997_SW_AUDIO ((2 << COMP2SW_SHIFT) | (2 << COMN1SW_SHIFT)) | ||
| 66 | #define MAX8997_SW_UART ((3 << COMP2SW_SHIFT) | (3 << COMN1SW_SHIFT)) | ||
| 67 | #define MAX8997_SW_OPEN ((0 << COMP2SW_SHIFT) | (0 << COMN1SW_SHIFT)) | ||
| 68 | |||
| 69 | #define MAX8997_ADC_GROUND 0x00 | ||
| 70 | #define MAX8997_ADC_MHL 0x01 | ||
| 71 | #define MAX8997_ADC_JIG_USB_1 0x18 | ||
| 72 | #define MAX8997_ADC_JIG_USB_2 0x19 | ||
| 73 | #define MAX8997_ADC_DESKDOCK 0x1a | ||
| 74 | #define MAX8997_ADC_JIG_UART 0x1c | ||
| 75 | #define MAX8997_ADC_CARDOCK 0x1d | ||
| 76 | #define MAX8997_ADC_OPEN 0x1f | ||
| 77 | 40 | ||
| 78 | struct max8997_muic_irq { | 41 | struct max8997_muic_irq { |
| 79 | unsigned int irq; | 42 | unsigned int irq; |
| @@ -82,61 +45,303 @@ struct max8997_muic_irq { | |||
| 82 | }; | 45 | }; |
| 83 | 46 | ||
| 84 | static struct max8997_muic_irq muic_irqs[] = { | 47 | static struct max8997_muic_irq muic_irqs[] = { |
| 85 | { MAX8997_MUICIRQ_ADCError, "muic-ADC_error" }, | 48 | { MAX8997_MUICIRQ_ADCError, "muic-ADCERROR" }, |
| 86 | { MAX8997_MUICIRQ_ADCLow, "muic-ADC_low" }, | 49 | { MAX8997_MUICIRQ_ADCLow, "muic-ADCLOW" }, |
| 87 | { MAX8997_MUICIRQ_ADC, "muic-ADC" }, | 50 | { MAX8997_MUICIRQ_ADC, "muic-ADC" }, |
| 88 | { MAX8997_MUICIRQ_VBVolt, "muic-VB_voltage" }, | 51 | { MAX8997_MUICIRQ_VBVolt, "muic-VBVOLT" }, |
| 89 | { MAX8997_MUICIRQ_DBChg, "muic-DB_charger" }, | 52 | { MAX8997_MUICIRQ_DBChg, "muic-DBCHG" }, |
| 90 | { MAX8997_MUICIRQ_DCDTmr, "muic-DCD_timer" }, | 53 | { MAX8997_MUICIRQ_DCDTmr, "muic-DCDTMR" }, |
| 91 | { MAX8997_MUICIRQ_ChgDetRun, "muic-CDR_status" }, | 54 | { MAX8997_MUICIRQ_ChgDetRun, "muic-CHGDETRUN" }, |
| 92 | { MAX8997_MUICIRQ_ChgTyp, "muic-charger_type" }, | 55 | { MAX8997_MUICIRQ_ChgTyp, "muic-CHGTYP" }, |
| 93 | { MAX8997_MUICIRQ_OVP, "muic-over_voltage" }, | 56 | { MAX8997_MUICIRQ_OVP, "muic-OVP" }, |
| 57 | }; | ||
| 58 | |||
| 59 | /* Define supported cable type */ | ||
| 60 | enum max8997_muic_acc_type { | ||
| 61 | MAX8997_MUIC_ADC_GROUND = 0x0, | ||
| 62 | MAX8997_MUIC_ADC_MHL, /* MHL*/ | ||
| 63 | MAX8997_MUIC_ADC_REMOTE_S1_BUTTON, | ||
| 64 | MAX8997_MUIC_ADC_REMOTE_S2_BUTTON, | ||
| 65 | MAX8997_MUIC_ADC_REMOTE_S3_BUTTON, | ||
| 66 | MAX8997_MUIC_ADC_REMOTE_S4_BUTTON, | ||
| 67 | MAX8997_MUIC_ADC_REMOTE_S5_BUTTON, | ||
| 68 | MAX8997_MUIC_ADC_REMOTE_S6_BUTTON, | ||
| 69 | MAX8997_MUIC_ADC_REMOTE_S7_BUTTON, | ||
| 70 | MAX8997_MUIC_ADC_REMOTE_S8_BUTTON, | ||
| 71 | MAX8997_MUIC_ADC_REMOTE_S9_BUTTON, | ||
| 72 | MAX8997_MUIC_ADC_REMOTE_S10_BUTTON, | ||
| 73 | MAX8997_MUIC_ADC_REMOTE_S11_BUTTON, | ||
| 74 | MAX8997_MUIC_ADC_REMOTE_S12_BUTTON, | ||
| 75 | MAX8997_MUIC_ADC_RESERVED_ACC_1, | ||
| 76 | MAX8997_MUIC_ADC_RESERVED_ACC_2, | ||
| 77 | MAX8997_MUIC_ADC_RESERVED_ACC_3, | ||
| 78 | MAX8997_MUIC_ADC_RESERVED_ACC_4, | ||
| 79 | MAX8997_MUIC_ADC_RESERVED_ACC_5, | ||
| 80 | MAX8997_MUIC_ADC_CEA936_AUDIO, | ||
| 81 | MAX8997_MUIC_ADC_PHONE_POWERED_DEV, | ||
| 82 | MAX8997_MUIC_ADC_TTY_CONVERTER, | ||
| 83 | MAX8997_MUIC_ADC_UART_CABLE, | ||
| 84 | MAX8997_MUIC_ADC_CEA936A_TYPE1_CHG, | ||
| 85 | MAX8997_MUIC_ADC_FACTORY_MODE_USB_OFF, /* JIG-USB-OFF */ | ||
| 86 | MAX8997_MUIC_ADC_FACTORY_MODE_USB_ON, /* JIG-USB-ON */ | ||
| 87 | MAX8997_MUIC_ADC_AV_CABLE_NOLOAD, /* DESKDOCK */ | ||
| 88 | MAX8997_MUIC_ADC_CEA936A_TYPE2_CHG, | ||
| 89 | MAX8997_MUIC_ADC_FACTORY_MODE_UART_OFF, /* JIG-UART */ | ||
| 90 | MAX8997_MUIC_ADC_FACTORY_MODE_UART_ON, /* CARDOCK */ | ||
| 91 | MAX8997_MUIC_ADC_AUDIO_MODE_REMOTE, | ||
| 92 | MAX8997_MUIC_ADC_OPEN, /* OPEN */ | ||
| 93 | }; | ||
| 94 | |||
| 95 | enum max8997_muic_cable_group { | ||
| 96 | MAX8997_CABLE_GROUP_ADC = 0, | ||
| 97 | MAX8997_CABLE_GROUP_ADC_GND, | ||
| 98 | MAX8997_CABLE_GROUP_CHG, | ||
| 99 | MAX8997_CABLE_GROUP_VBVOLT, | ||
| 100 | }; | ||
| 101 | |||
| 102 | enum max8997_muic_usb_type { | ||
| 103 | MAX8997_USB_HOST, | ||
| 104 | MAX8997_USB_DEVICE, | ||
| 105 | }; | ||
| 106 | |||
| 107 | enum max8997_muic_charger_type { | ||
| 108 | MAX8997_CHARGER_TYPE_NONE = 0, | ||
| 109 | MAX8997_CHARGER_TYPE_USB, | ||
| 110 | MAX8997_CHARGER_TYPE_DOWNSTREAM_PORT, | ||
| 111 | MAX8997_CHARGER_TYPE_DEDICATED_CHG, | ||
| 112 | MAX8997_CHARGER_TYPE_500MA, | ||
| 113 | MAX8997_CHARGER_TYPE_1A, | ||
| 114 | MAX8997_CHARGER_TYPE_DEAD_BATTERY = 7, | ||
| 94 | }; | 115 | }; |
| 95 | 116 | ||
| 96 | struct max8997_muic_info { | 117 | struct max8997_muic_info { |
| 97 | struct device *dev; | 118 | struct device *dev; |
| 98 | struct i2c_client *muic; | 119 | struct i2c_client *muic; |
| 99 | struct max8997_muic_platform_data *muic_pdata; | 120 | struct extcon_dev *edev; |
| 121 | int prev_cable_type; | ||
| 122 | int prev_chg_type; | ||
| 123 | u8 status[2]; | ||
| 100 | 124 | ||
| 101 | int irq; | 125 | int irq; |
| 102 | struct work_struct irq_work; | 126 | struct work_struct irq_work; |
| 127 | struct mutex mutex; | ||
| 103 | 128 | ||
| 129 | struct max8997_muic_platform_data *muic_pdata; | ||
| 104 | enum max8997_muic_charger_type pre_charger_type; | 130 | enum max8997_muic_charger_type pre_charger_type; |
| 105 | int pre_adc; | ||
| 106 | 131 | ||
| 107 | struct mutex mutex; | 132 | /* |
| 133 | * Use delayed workqueue to detect cable state and then | ||
| 134 | * notify cable state to notifiee/platform through uevent. | ||
| 135 | * After completing the booting of platform, the extcon provider | ||
| 136 | * driver should notify cable state to upper layer. | ||
| 137 | */ | ||
| 138 | struct delayed_work wq_detcable; | ||
| 139 | |||
| 140 | /* | ||
| 141 | * Default usb/uart path whether UART/USB or AUX_UART/AUX_USB | ||
| 142 | * h/w path of COMP2/COMN1 on CONTROL1 register. | ||
