cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

extcon-max77693.c (37269B)


      1// SPDX-License-Identifier: GPL-2.0+
      2//
      3// extcon-max77693.c - MAX77693 extcon driver to support MAX77693 MUIC
      4//
      5// Copyright (C) 2012 Samsung Electrnoics
      6// Chanwoo Choi <cw00.choi@samsung.com>
      7
      8#include <linux/devm-helpers.h>
      9#include <linux/kernel.h>
     10#include <linux/module.h>
     11#include <linux/i2c.h>
     12#include <linux/slab.h>
     13#include <linux/input.h>
     14#include <linux/interrupt.h>
     15#include <linux/err.h>
     16#include <linux/platform_device.h>
     17#include <linux/mfd/max77693.h>
     18#include <linux/mfd/max77693-common.h>
     19#include <linux/mfd/max77693-private.h>
     20#include <linux/extcon-provider.h>
     21#include <linux/regmap.h>
     22#include <linux/irqdomain.h>
     23
     24#define	DEV_NAME			"max77693-muic"
     25#define	DELAY_MS_DEFAULT		20000		/* unit: millisecond */
     26
     27/*
     28 * Default value of MAX77693 register to bring up MUIC device.
     29 * If user don't set some initial value for MUIC device through platform data,
     30 * extcon-max77693 driver use 'default_init_data' to bring up base operation
     31 * of MAX77693 MUIC device.
     32 */
     33static struct max77693_reg_data default_init_data[] = {
     34	{
     35		/* STATUS2 - [3]ChgDetRun */
     36		.addr = MAX77693_MUIC_REG_STATUS2,
     37		.data = MAX77693_STATUS2_CHGDETRUN_MASK,
     38	}, {
     39		/* INTMASK1 - Unmask [3]ADC1KM,[0]ADCM */
     40		.addr = MAX77693_MUIC_REG_INTMASK1,
     41		.data = INTMASK1_ADC1K_MASK
     42			| INTMASK1_ADC_MASK,
     43	}, {
     44		/* INTMASK2 - Unmask [0]ChgTypM */
     45		.addr = MAX77693_MUIC_REG_INTMASK2,
     46		.data = INTMASK2_CHGTYP_MASK,
     47	}, {
     48		/* INTMASK3 - Mask all of interrupts */
     49		.addr = MAX77693_MUIC_REG_INTMASK3,
     50		.data = 0x0,
     51	}, {
     52		/* CDETCTRL2 */
     53		.addr = MAX77693_MUIC_REG_CDETCTRL2,
     54		.data = CDETCTRL2_VIDRMEN_MASK
     55			| CDETCTRL2_DXOVPEN_MASK,
     56	},
     57};
     58
     59enum max77693_muic_adc_debounce_time {
     60	ADC_DEBOUNCE_TIME_5MS = 0,
     61	ADC_DEBOUNCE_TIME_10MS,
     62	ADC_DEBOUNCE_TIME_25MS,
     63	ADC_DEBOUNCE_TIME_38_62MS,
     64};
     65
     66struct max77693_muic_info {
     67	struct device *dev;
     68	struct max77693_dev *max77693;
     69	struct extcon_dev *edev;
     70	int prev_cable_type;
     71	int prev_cable_type_gnd;
     72	int prev_chg_type;
     73	int prev_button_type;
     74	u8 status[2];
     75
     76	int irq;
     77	struct work_struct irq_work;
     78	struct mutex mutex;
     79
     80	/*
     81	 * Use delayed workqueue to detect cable state and then
     82	 * notify cable state to notifiee/platform through uevent.
     83	 * After completing the booting of platform, the extcon provider
     84	 * driver should notify cable state to upper layer.
     85	 */
     86	struct delayed_work wq_detcable;
     87
     88	/* Button of dock device */
     89	struct input_dev *dock;
     90
     91	/*
     92	 * Default usb/uart path whether UART/USB or AUX_UART/AUX_USB
     93	 * h/w path of COMP2/COMN1 on CONTROL1 register.
     94	 */
     95	int path_usb;
     96	int path_uart;
     97};
     98
     99enum max77693_muic_cable_group {
    100	MAX77693_CABLE_GROUP_ADC = 0,
    101	MAX77693_CABLE_GROUP_ADC_GND,
    102	MAX77693_CABLE_GROUP_CHG,
    103	MAX77693_CABLE_GROUP_VBVOLT,
    104};
    105
    106enum max77693_muic_charger_type {
    107	MAX77693_CHARGER_TYPE_NONE = 0,
    108	MAX77693_CHARGER_TYPE_USB,
    109	MAX77693_CHARGER_TYPE_DOWNSTREAM_PORT,
    110	MAX77693_CHARGER_TYPE_DEDICATED_CHG,
    111	MAX77693_CHARGER_TYPE_APPLE_500MA,
    112	MAX77693_CHARGER_TYPE_APPLE_1A_2A,
    113	MAX77693_CHARGER_TYPE_DEAD_BATTERY = 7,
    114};
    115
    116/**
    117 * struct max77693_muic_irq
    118 * @irq: the index of irq list of MUIC device.
    119 * @name: the name of irq.
    120 * @virq: the virtual irq to use irq domain
    121 */
    122struct max77693_muic_irq {
    123	unsigned int irq;
    124	const char *name;
    125	unsigned int virq;
    126};
    127
    128static struct max77693_muic_irq muic_irqs[] = {
    129	{ MAX77693_MUIC_IRQ_INT1_ADC,		"muic-ADC" },
    130	{ MAX77693_MUIC_IRQ_INT1_ADC_LOW,	"muic-ADCLOW" },
    131	{ MAX77693_MUIC_IRQ_INT1_ADC_ERR,	"muic-ADCError" },
    132	{ MAX77693_MUIC_IRQ_INT1_ADC1K,		"muic-ADC1K" },
    133	{ MAX77693_MUIC_IRQ_INT2_CHGTYP,	"muic-CHGTYP" },
    134	{ MAX77693_MUIC_IRQ_INT2_CHGDETREUN,	"muic-CHGDETREUN" },
    135	{ MAX77693_MUIC_IRQ_INT2_DCDTMR,	"muic-DCDTMR" },
    136	{ MAX77693_MUIC_IRQ_INT2_DXOVP,		"muic-DXOVP" },
    137	{ MAX77693_MUIC_IRQ_INT2_VBVOLT,	"muic-VBVOLT" },
    138	{ MAX77693_MUIC_IRQ_INT2_VIDRM,		"muic-VIDRM" },
    139	{ MAX77693_MUIC_IRQ_INT3_EOC,		"muic-EOC" },
    140	{ MAX77693_MUIC_IRQ_INT3_CGMBC,		"muic-CGMBC" },
    141	{ MAX77693_MUIC_IRQ_INT3_OVP,		"muic-OVP" },
    142	{ MAX77693_MUIC_IRQ_INT3_MBCCHG_ERR,	"muic-MBCCHG_ERR" },
    143	{ MAX77693_MUIC_IRQ_INT3_CHG_ENABLED,	"muic-CHG_ENABLED" },
    144	{ MAX77693_MUIC_IRQ_INT3_BAT_DET,	"muic-BAT_DET" },
    145};
    146
    147/* Define supported accessory type */
    148enum max77693_muic_acc_type {
    149	MAX77693_MUIC_ADC_GROUND = 0x0,
    150	MAX77693_MUIC_ADC_SEND_END_BUTTON,
    151	MAX77693_MUIC_ADC_REMOTE_S1_BUTTON,
    152	MAX77693_MUIC_ADC_REMOTE_S2_BUTTON,
    153	MAX77693_MUIC_ADC_REMOTE_S3_BUTTON,
    154	MAX77693_MUIC_ADC_REMOTE_S4_BUTTON,
    155	MAX77693_MUIC_ADC_REMOTE_S5_BUTTON,
    156	MAX77693_MUIC_ADC_REMOTE_S6_BUTTON,
    157	MAX77693_MUIC_ADC_REMOTE_S7_BUTTON,
    158	MAX77693_MUIC_ADC_REMOTE_S8_BUTTON,
    159	MAX77693_MUIC_ADC_REMOTE_S9_BUTTON,
    160	MAX77693_MUIC_ADC_REMOTE_S10_BUTTON,
    161	MAX77693_MUIC_ADC_REMOTE_S11_BUTTON,
    162	MAX77693_MUIC_ADC_REMOTE_S12_BUTTON,
    163	MAX77693_MUIC_ADC_RESERVED_ACC_1,
    164	MAX77693_MUIC_ADC_RESERVED_ACC_2,
    165	MAX77693_MUIC_ADC_RESERVED_ACC_3,
    166	MAX77693_MUIC_ADC_RESERVED_ACC_4,
    167	MAX77693_MUIC_ADC_RESERVED_ACC_5,
    168	MAX77693_MUIC_ADC_CEA936_AUDIO,
    169	MAX77693_MUIC_ADC_PHONE_POWERED_DEV,
    170	MAX77693_MUIC_ADC_TTY_CONVERTER,
    171	MAX77693_MUIC_ADC_UART_CABLE,
    172	MAX77693_MUIC_ADC_CEA936A_TYPE1_CHG,
    173	MAX77693_MUIC_ADC_FACTORY_MODE_USB_OFF,
    174	MAX77693_MUIC_ADC_FACTORY_MODE_USB_ON,
    175	MAX77693_MUIC_ADC_AV_CABLE_NOLOAD,
    176	MAX77693_MUIC_ADC_CEA936A_TYPE2_CHG,
    177	MAX77693_MUIC_ADC_FACTORY_MODE_UART_OFF,
    178	MAX77693_MUIC_ADC_FACTORY_MODE_UART_ON,
    179	MAX77693_MUIC_ADC_AUDIO_MODE_REMOTE,
    180	MAX77693_MUIC_ADC_OPEN,
    181
    182	/*
    183	 * The below accessories have same ADC value so ADCLow and
    184	 * ADC1K bit is used to separate specific accessory.
    185	 */
    186						/* ADC|VBVolot|ADCLow|ADC1K| */
    187	MAX77693_MUIC_GND_USB_HOST = 0x100,	/* 0x0|      0|     0|    0| */
    188	MAX77693_MUIC_GND_USB_HOST_VB = 0x104,	/* 0x0|      1|     0|    0| */
    189	MAX77693_MUIC_GND_AV_CABLE_LOAD = 0x102,/* 0x0|      0|     1|    0| */
    190	MAX77693_MUIC_GND_MHL = 0x103,		/* 0x0|      0|     1|    1| */
    191	MAX77693_MUIC_GND_MHL_VB = 0x107,	/* 0x0|      1|     1|    1| */
    192};
    193
    194/*
    195 * MAX77693 MUIC device support below list of accessories(external connector)
    196 */
    197static const unsigned int max77693_extcon_cable[] = {
    198	EXTCON_USB,
    199	EXTCON_USB_HOST,
    200	EXTCON_CHG_USB_SDP,
    201	EXTCON_CHG_USB_DCP,
    202	EXTCON_CHG_USB_FAST,
    203	EXTCON_CHG_USB_SLOW,
    204	EXTCON_CHG_USB_CDP,
    205	EXTCON_DISP_MHL,
    206	EXTCON_JIG,
    207	EXTCON_DOCK,
    208	EXTCON_NONE,
    209};
    210
    211/*
    212 * max77693_muic_set_debounce_time - Set the debounce time of ADC
    213 * @info: the instance including private data of max77693 MUIC
    214 * @time: the debounce time of ADC
    215 */
    216static int max77693_muic_set_debounce_time(struct max77693_muic_info *info,
    217		enum max77693_muic_adc_debounce_time time)
    218{
    219	int ret;
    220
    221	switch (time) {
    222	case ADC_DEBOUNCE_TIME_5MS:
    223	case ADC_DEBOUNCE_TIME_10MS:
    224	case ADC_DEBOUNCE_TIME_25MS:
    225	case ADC_DEBOUNCE_TIME_38_62MS:
    226		/*
    227		 * Don't touch BTLDset, JIGset when you want to change adc
    228		 * debounce time. If it writes other than 0 to BTLDset, JIGset
    229		 * muic device will be reset and loose current state.
    230		 */
    231		ret = regmap_write(info->max77693->regmap_muic,
    232				  MAX77693_MUIC_REG_CTRL3,
    233				  time << MAX77693_CONTROL3_ADCDBSET_SHIFT);
    234		if (ret) {
    235			dev_err(info->dev, "failed to set ADC debounce time\n");
    236			return ret;
    237		}
    238		break;
    239	default:
    240		dev_err(info->dev, "invalid ADC debounce time\n");
    241		return -EINVAL;
    242	}
    243
    244	return 0;
    245};
    246
    247/*
    248 * max77693_muic_set_path - Set hardware line according to attached cable
    249 * @info: the instance including private data of max77693 MUIC
    250 * @value: the path according to attached cable
    251 * @attached: the state of cable (true:attached, false:detached)
    252 *
    253 * The max77693 MUIC device share outside H/W line among a varity of cables
    254 * so, this function set internal path of H/W line according to the type of
    255 * attached cable.
    256 */
    257static int max77693_muic_set_path(struct max77693_muic_info *info,
    258		u8 val, bool attached)
    259{
    260	int ret;
    261	unsigned int ctrl1, ctrl2 = 0;
    262
    263	if (attached)
    264		ctrl1 = val;
    265	else
    266		ctrl1 = MAX77693_CONTROL1_SW_OPEN;
    267
    268	ret = regmap_update_bits(info->max77693->regmap_muic,
    269			MAX77693_MUIC_REG_CTRL1, COMP_SW_MASK, ctrl1);
    270	if (ret < 0) {
    271		dev_err(info->dev, "failed to update MUIC register\n");
    272		return ret;
    273	}
    274
    275	if (attached)
    276		ctrl2 |= MAX77693_CONTROL2_CPEN_MASK;	/* LowPwr=0, CPEn=1 */
    277	else
    278		ctrl2 |= MAX77693_CONTROL2_LOWPWR_MASK;	/* LowPwr=1, CPEn=0 */
    279
    280	ret = regmap_update_bits(info->max77693->regmap_muic,
    281			MAX77693_MUIC_REG_CTRL2,
    282			MAX77693_CONTROL2_LOWPWR_MASK | MAX77693_CONTROL2_CPEN_MASK,
    283			ctrl2);
    284	if (ret < 0) {
    285		dev_err(info->dev, "failed to update MUIC register\n");
    286		return ret;
    287	}
    288
    289	dev_info(info->dev,
    290		"CONTROL1 : 0x%02x, CONTROL2 : 0x%02x, state : %s\n",
    291		ctrl1, ctrl2, attached ? "attached" : "detached");
    292
    293	return 0;
    294}
    295
    296/*
    297 * max77693_muic_get_cable_type - Return cable type and check cable state
    298 * @info: the instance including private data of max77693 MUIC
    299 * @group: the path according to attached cable
    300 * @attached: store cable state and return
    301 *
    302 * This function check the cable state either attached or detached,
    303 * and then divide precise type of cable according to cable group.
    304 *	- MAX77693_CABLE_GROUP_ADC
    305 *	- MAX77693_CABLE_GROUP_ADC_GND
    306 *	- MAX77693_CABLE_GROUP_CHG
    307 *	- MAX77693_CABLE_GROUP_VBVOLT
    308 */
    309static int max77693_muic_get_cable_type(struct max77693_muic_info *info,
    310		enum max77693_muic_cable_group group, bool *attached)
    311{
    312	int cable_type = 0;
    313	int adc;
    314	int adc1k;
    315	int adclow;
    316	int vbvolt;
    317	int chg_type;
    318
    319	switch (group) {
    320	case MAX77693_CABLE_GROUP_ADC:
    321		/*
    322		 * Read ADC value to check cable type and decide cable state
    323		 * according to cable type
    324		 */
    325		adc = info->status[0] & MAX77693_STATUS1_ADC_MASK;
    326		adc >>= MAX77693_STATUS1_ADC_SHIFT;
    327
    328		/*
    329		 * Check current cable state/cable type and store cable type
    330		 * (info->prev_cable_type) for handling cable when cable is
    331		 * detached.
    332		 */
    333		if (adc == MAX77693_MUIC_ADC_OPEN) {
    334			*attached = false;
    335
    336			cable_type = info->prev_cable_type;
    337			info->prev_cable_type = MAX77693_MUIC_ADC_OPEN;
    338		} else {
    339			*attached = true;
    340
    341			cable_type = info->prev_cable_type = adc;
    342		}
    343		break;
    344	case MAX77693_CABLE_GROUP_ADC_GND:
    345		/*
    346		 * Read ADC value to check cable type and decide cable state
    347		 * according to cable type
    348		 */
    349		adc = info->status[0] & MAX77693_STATUS1_ADC_MASK;
    350		adc >>= MAX77693_STATUS1_ADC_SHIFT;
    351
    352		/*
    353		 * Check current cable state/cable type and store cable type
    354		 * (info->prev_cable_type/_gnd) for handling cable when cable
    355		 * is detached.
    356		 */
    357		if (adc == MAX77693_MUIC_ADC_OPEN) {
    358			*attached = false;
    359
    360			cable_type = info->prev_cable_type_gnd;
    361			info->prev_cable_type_gnd = MAX77693_MUIC_ADC_OPEN;
    362		} else {
    363			*attached = true;
    364
    365			adclow = info->status[0] & MAX77693_STATUS1_ADCLOW_MASK;
    366			adclow >>= MAX77693_STATUS1_ADCLOW_SHIFT;
    367			adc1k = info->status[0] & MAX77693_STATUS1_ADC1K_MASK;
    368			adc1k >>= MAX77693_STATUS1_ADC1K_SHIFT;
    369
    370			vbvolt = info->status[1] & MAX77693_STATUS2_VBVOLT_MASK;
    371			vbvolt >>= MAX77693_STATUS2_VBVOLT_SHIFT;
    372
    373			/**
    374			 * [0x1|VBVolt|ADCLow|ADC1K]
    375			 * [0x1|     0|     0|    0] USB_HOST
    376			 * [0x1|     1|     0|    0] USB_HSOT_VB
    377			 * [0x1|     0|     1|    0] Audio Video cable with load
    378			 * [0x1|     0|     1|    1] MHL without charging cable
    379			 * [0x1|     1|     1|    1] MHL with charging cable
    380			 */
    381			cable_type = ((0x1 << 8)
    382					| (vbvolt << 2)
    383					| (adclow << 1)
    384					| adc1k);
    385
    386			info->prev_cable_type = adc;
    387			info->prev_cable_type_gnd = cable_type;
    388		}
    389
    390		break;
    391	case MAX77693_CABLE_GROUP_CHG:
    392		/*
    393		 * Read charger type to check cable type and decide cable state
    394		 * according to type of charger cable.
    395		 */
    396		chg_type = info->status[1] & MAX77693_STATUS2_CHGTYP_MASK;
    397		chg_type >>= MAX77693_STATUS2_CHGTYP_SHIFT;
    398
    399		if (chg_type == MAX77693_CHARGER_TYPE_NONE) {
    400			*attached = false;
    401
    402			cable_type = info->prev_chg_type;
    403			info->prev_chg_type = MAX77693_CHARGER_TYPE_NONE;
    404		} else {
    405			*attached = true;
    406
    407			/*
    408			 * Check current cable state/cable type and store cable
    409			 * type(info->prev_chg_type) for handling cable when
    410			 * charger cable is detached.
    411			 */
    412			cable_type = info->prev_chg_type = chg_type;
    413		}
    414
    415		break;
    416	case MAX77693_CABLE_GROUP_VBVOLT:
    417		/*
    418		 * Read ADC value to check cable type and decide cable state
    419		 * according to cable type
    420		 */
    421		adc = info->status[0] & MAX77693_STATUS1_ADC_MASK;
    422		adc >>= MAX77693_STATUS1_ADC_SHIFT;
    423		chg_type = info->status[1] & MAX77693_STATUS2_CHGTYP_MASK;
    424		chg_type >>= MAX77693_STATUS2_CHGTYP_SHIFT;
    425
    426		if (adc == MAX77693_MUIC_ADC_OPEN
    427				&& chg_type == MAX77693_CHARGER_TYPE_NONE)
    428			*attached = false;
    429		else
    430			*attached = true;
    431
    432		/*
    433		 * Read vbvolt field, if vbvolt is 1,
    434		 * this cable is used for charging.
    435		 */
    436		vbvolt = info->status[1] & MAX77693_STATUS2_VBVOLT_MASK;
    437		vbvolt >>= MAX77693_STATUS2_VBVOLT_SHIFT;
    438
    439		cable_type = vbvolt;
    440		break;
    441	default:
    442		dev_err(info->dev, "Unknown cable group (%d)\n", group);
    443		cable_type = -EINVAL;
    444		break;
    445	}
    446
    447	return cable_type;
    448}
    449
    450static int max77693_muic_dock_handler(struct max77693_muic_info *info,
    451		int cable_type, bool attached)
    452{
    453	int ret = 0;
    454	int vbvolt;
    455	bool cable_attached;
    456	unsigned int dock_id;
    457
    458	dev_info(info->dev,
    459		"external connector is %s (adc:0x%02x)\n",
    460		attached ? "attached" : "detached", cable_type);
    461
    462	switch (cable_type) {
    463	case MAX77693_MUIC_ADC_RESERVED_ACC_3:		/* Dock-Smart */
    464		/*
    465		 * Check power cable whether attached or detached state.
    466		 * The Dock-Smart device need surely external power supply.
    467		 * If power cable(USB/TA) isn't connected to Dock device,
    468		 * user can't use Dock-Smart for desktop mode.
    469		 */
    470		vbvolt = max77693_muic_get_cable_type(info,
    471				MAX77693_CABLE_GROUP_VBVOLT, &cable_attached);
    472		if (attached && !vbvolt) {
    473			dev_warn(info->dev,
    474				"Cannot detect external power supply\n");
    475			return 0;
    476		}
    477
    478		/*
    479		 * Notify Dock/MHL state.
    480		 * - Dock device include three type of cable which
    481		 * are HDMI, USB for mouse/keyboard and micro-usb port
    482		 * for USB/TA cable. Dock device need always exteranl
    483		 * power supply(USB/TA cable through micro-usb cable). Dock
    484		 * device support screen output of target to separate
    485		 * monitor and mouse/keyboard for desktop mode.
    486		 *
    487		 * Features of 'USB/TA cable with Dock device'
    488		 * - Support MHL
    489		 * - Support external output feature of audio
    490		 * - Support charging through micro-usb port without data
    491		 *	     connection if TA cable is connected to target.
    492		 * - Support charging and data connection through micro-usb port
    493		 *           if USB cable is connected between target and host
    494		 *	     device.
    495		 * - Support OTG(On-The-Go) device (Ex: Mouse/Keyboard)
    496		 */
    497		ret = max77693_muic_set_path(info, info->path_usb, attached);
    498		if (ret < 0)
    499			return ret;
    500
    501		extcon_set_state_sync(info->edev, EXTCON_DOCK, attached);
    502		extcon_set_state_sync(info->edev, EXTCON_DISP_MHL, attached);
    503		goto out;
    504	case MAX77693_MUIC_ADC_AUDIO_MODE_REMOTE:	/* Dock-Desk */
    505		dock_id = EXTCON_DOCK;
    506		break;
    507	case MAX77693_MUIC_ADC_AV_CABLE_NOLOAD:		/* Dock-Audio */
    508		dock_id = EXTCON_DOCK;
    509		if (!attached) {
    510			extcon_set_state_sync(info->edev, EXTCON_USB, false);
    511			extcon_set_state_sync(info->edev, EXTCON_CHG_USB_SDP,
    512						false);
    513		}
    514		break;
    515	default:
    516		dev_err(info->dev, "failed to detect %s dock device\n",
    517			attached ? "attached" : "detached");
    518		return -EINVAL;
    519	}
    520
    521	/* Dock-Car/Desk/Audio, PATH:AUDIO */
    522	ret = max77693_muic_set_path(info, MAX77693_CONTROL1_SW_AUDIO,
    523					attached);
    524	if (ret < 0)
    525		return ret;
    526	extcon_set_state_sync(info->edev, dock_id, attached);
    527
    528out:
    529	return 0;
    530}
    531
    532static int max77693_muic_dock_button_handler(struct max77693_muic_info *info,
    533		int button_type, bool attached)
    534{
    535	struct input_dev *dock = info->dock;
    536	unsigned int code;
    537
    538	switch (button_type) {
    539	case MAX77693_MUIC_ADC_REMOTE_S3_BUTTON-1
    540		... MAX77693_MUIC_ADC_REMOTE_S3_BUTTON+1:
    541		/* DOCK_KEY_PREV */
    542		code = KEY_PREVIOUSSONG;
    543		break;
    544	case MAX77693_MUIC_ADC_REMOTE_S7_BUTTON-1
    545		... MAX77693_MUIC_ADC_REMOTE_S7_BUTTON+1:
    546		/* DOCK_KEY_NEXT */
    547		code = KEY_NEXTSONG;
    548		break;
    549	case MAX77693_MUIC_ADC_REMOTE_S9_BUTTON:
    550		/* DOCK_VOL_DOWN */
    551		code = KEY_VOLUMEDOWN;
    552		break;
    553	case MAX77693_MUIC_ADC_REMOTE_S10_BUTTON:
    554		/* DOCK_VOL_UP */
    555		code = KEY_VOLUMEUP;
    556		break;
    557	case MAX77693_MUIC_ADC_REMOTE_S12_BUTTON-1
    558		... MAX77693_MUIC_ADC_REMOTE_S12_BUTTON+1:
    559		/* DOCK_KEY_PLAY_PAUSE */
    560		code = KEY_PLAYPAUSE;
    561		break;
    562	default:
    563		dev_err(info->dev,
    564			"failed to detect %s key (adc:0x%x)\n",
    565			attached ? "pressed" : "released", button_type);
    566		return -EINVAL;
    567	}
    568
    569	input_event(dock, EV_KEY, code, attached);
    570	input_sync(dock);
    571
    572	return 0;
    573}
    574
    575static int max77693_muic_adc_ground_handler(struct max77693_muic_info *info)
    576{
    577	int cable_type_gnd;
    578	int ret = 0;
    579	bool attached;
    580
    581	cable_type_gnd = max77693_muic_get_cable_type(info,
    582				MAX77693_CABLE_GROUP_ADC_GND, &attached);
    583
    584	switch (cable_type_gnd) {
    585	case MAX77693_MUIC_GND_USB_HOST:
    586	case MAX77693_MUIC_GND_USB_HOST_VB:
    587		/* USB_HOST, PATH: AP_USB */
    588		ret = max77693_muic_set_path(info, MAX77693_CONTROL1_SW_USB,
    589						attached);
    590		if (ret < 0)
    591			return ret;
    592		extcon_set_state_sync(info->edev, EXTCON_USB_HOST, attached);
    593		break;
    594	case MAX77693_MUIC_GND_AV_CABLE_LOAD:
    595		/* Audio Video Cable with load, PATH:AUDIO */
    596		ret = max77693_muic_set_path(info, MAX77693_CONTROL1_SW_AUDIO,
    597						attached);
    598		if (ret < 0)
    599			return ret;
    600		extcon_set_state_sync(info->edev, EXTCON_USB, attached);
    601		extcon_set_state_sync(info->edev, EXTCON_CHG_USB_SDP,
    602					attached);
    603		break;
    604	case MAX77693_MUIC_GND_MHL:
    605	case MAX77693_MUIC_GND_MHL_VB:
    606		/* MHL or MHL with USB/TA cable */
    607		extcon_set_state_sync(info->edev, EXTCON_DISP_MHL, attached);
    608		break;
    609	default:
    610		dev_err(info->dev, "failed to detect %s cable of gnd type\n",
    611			attached ? "attached" : "detached");
    612		return -EINVAL;
    613	}
    614
    615	return 0;
    616}
    617
    618static int max77693_muic_jig_handler(struct max77693_muic_info *info,
    619		int cable_type, bool attached)
    620{
    621	int ret = 0;
    622	u8 path = MAX77693_CONTROL1_SW_OPEN;
    623
    624	dev_info(info->dev,
    625		"external connector is %s (adc:0x%02x)\n",
    626		attached ? "attached" : "detached", cable_type);
    627
    628	switch (cable_type) {
    629	case MAX77693_MUIC_ADC_FACTORY_MODE_USB_OFF:	/* ADC_JIG_USB_OFF */
    630	case MAX77693_MUIC_ADC_FACTORY_MODE_USB_ON:	/* ADC_JIG_USB_ON */
    631		/* PATH:AP_USB */
    632		path = MAX77693_CONTROL1_SW_USB;
    633		break;
    634	case MAX77693_MUIC_ADC_FACTORY_MODE_UART_OFF:	/* ADC_JIG_UART_OFF */
    635	case MAX77693_MUIC_ADC_FACTORY_MODE_UART_ON:	/* ADC_JIG_UART_ON */
    636		/* PATH:AP_UART */
    637		path = MAX77693_CONTROL1_SW_UART;
    638		break;
    639	default:
    640		dev_err(info->dev, "failed to detect %s jig cable\n",
    641			attached ? "attached" : "detached");
    642		return -EINVAL;
    643	}
    644
    645	ret = max77693_muic_set_path(info, path, attached);
    646	if (ret < 0)
    647		return ret;
    648
    649	extcon_set_state_sync(info->edev, EXTCON_JIG, attached);
    650
    651	return 0;
    652}
    653
    654static int max77693_muic_adc_handler(struct max77693_muic_info *info)
    655{
    656	int cable_type;
    657	int button_type;
    658	bool attached;
    659	int ret = 0;
    660
    661	/* Check accessory state which is either detached or attached */
    662	cable_type = max77693_muic_get_cable_type(info,
    663				MAX77693_CABLE_GROUP_ADC, &attached);
    664
    665	dev_info(info->dev,
    666		"external connector is %s (adc:0x%02x, prev_adc:0x%x)\n",
    667		attached ? "attached" : "detached", cable_type,
    668		info->prev_cable_type);
    669
    670	switch (cable_type) {
    671	case MAX77693_MUIC_ADC_GROUND:
    672		/* USB_HOST/MHL/Audio */
    673		max77693_muic_adc_ground_handler(info);
    674		break;
    675	case MAX77693_MUIC_ADC_FACTORY_MODE_USB_OFF:
    676	case MAX77693_MUIC_ADC_FACTORY_MODE_USB_ON:
    677	case MAX77693_MUIC_ADC_FACTORY_MODE_UART_OFF:
    678	case MAX77693_MUIC_ADC_FACTORY_MODE_UART_ON:
    679		/* JIG */
    680		ret = max77693_muic_jig_handler(info, cable_type, attached);
    681		if (ret < 0)
    682			return ret;
    683		break;
    684	case MAX77693_MUIC_ADC_RESERVED_ACC_3:		/* Dock-Smart */
    685	case MAX77693_MUIC_ADC_AUDIO_MODE_REMOTE:	/* Dock-Desk */
    686	case MAX77693_MUIC_ADC_AV_CABLE_NOLOAD:		/* Dock-Audio */
    687		/*
    688		 * DOCK device
    689		 *
    690		 * The MAX77693 MUIC device can detect total 34 cable type
    691		 * except of charger cable and MUIC device didn't define
    692		 * specfic role of cable in the range of from 0x01 to 0x12
    693		 * of ADC value. So, can use/define cable with no role according
    694		 * to schema of hardware board.
    695		 */
    696		ret = max77693_muic_dock_handler(info, cable_type, attached);
    697		if (ret < 0)
    698			return ret;
    699		break;
    700	case MAX77693_MUIC_ADC_REMOTE_S3_BUTTON:      /* DOCK_KEY_PREV */
    701	case MAX77693_MUIC_ADC_REMOTE_S7_BUTTON:      /* DOCK_KEY_NEXT */
    702	case MAX77693_MUIC_ADC_REMOTE_S9_BUTTON:      /* DOCK_VOL_DOWN */
    703	case MAX77693_MUIC_ADC_REMOTE_S10_BUTTON:     /* DOCK_VOL_UP */
    704	case MAX77693_MUIC_ADC_REMOTE_S12_BUTTON:     /* DOCK_KEY_PLAY_PAUSE */
    705		/*
    706		 * Button of DOCK device
    707		 * - the Prev/Next/Volume Up/Volume Down/Play-Pause button
    708		 *
    709		 * The MAX77693 MUIC device can detect total 34 cable type
    710		 * except of charger cable and MUIC device didn't define
    711		 * specfic role of cable in the range of from 0x01 to 0x12
    712		 * of ADC value. So, can use/define cable with no role according
    713		 * to schema of hardware board.
    714		 */
    715		if (attached)
    716			button_type = info->prev_button_type = cable_type;
    717		else
    718			button_type = info->prev_button_type;
    719
    720		ret = max77693_muic_dock_button_handler(info, button_type,
    721							attached);
    722		if (ret < 0)
    723			return ret;
    724		break;
    725	case MAX77693_MUIC_ADC_SEND_END_BUTTON:
    726	case MAX77693_MUIC_ADC_REMOTE_S1_BUTTON:
    727	case MAX77693_MUIC_ADC_REMOTE_S2_BUTTON:
    728	case MAX77693_MUIC_ADC_REMOTE_S4_BUTTON:
    729	case MAX77693_MUIC_ADC_REMOTE_S5_BUTTON:
    730	case MAX77693_MUIC_ADC_REMOTE_S6_BUTTON:
    731	case MAX77693_MUIC_ADC_REMOTE_S8_BUTTON:
    732	case MAX77693_MUIC_ADC_REMOTE_S11_BUTTON:
    733	case MAX77693_MUIC_ADC_RESERVED_ACC_1:
    734	case MAX77693_MUIC_ADC_RESERVED_ACC_2:
    735	case MAX77693_MUIC_ADC_RESERVED_ACC_4:
    736	case MAX77693_MUIC_ADC_RESERVED_ACC_5:
    737	case MAX77693_MUIC_ADC_CEA936_AUDIO:
    738	case MAX77693_MUIC_ADC_PHONE_POWERED_DEV:
    739	case MAX77693_MUIC_ADC_TTY_CONVERTER:
    740	case MAX77693_MUIC_ADC_UART_CABLE:
    741	case MAX77693_MUIC_ADC_CEA936A_TYPE1_CHG:
    742	case MAX77693_MUIC_ADC_CEA936A_TYPE2_CHG:
    743		/*
    744		 * This accessory isn't used in general case if it is specially
    745		 * needed to detect additional accessory, should implement
    746		 * proper operation when this accessory is attached/detached.
    747		 */
    748		dev_info(info->dev,
    749			"accessory is %s but it isn't used (adc:0x%x)\n",
    750			attached ? "attached" : "detached", cable_type);
    751		return -EAGAIN;
    752	default:
    753		dev_err(info->dev,
    754			"failed to detect %s accessory (adc:0x%x)\n",
    755			attached ? "attached" : "detached", cable_type);
    756		return -EINVAL;
    757	}
    758
    759	return 0;
    760}
    761
    762static int max77693_muic_chg_handler(struct max77693_muic_info *info)
    763{
    764	int chg_type;
    765	int cable_type_gnd;
    766	int cable_type;
    767	bool attached;
    768	bool cable_attached;
    769	int ret = 0;
    770
    771	chg_type = max77693_muic_get_cable_type(info,
    772				MAX77693_CABLE_GROUP_CHG, &attached);
    773
    774	dev_info(info->dev,
    775		"external connector is %s(chg_type:0x%x, prev_chg_type:0x%x)\n",
    776			attached ? "attached" : "detached",
    777			chg_type, info->prev_chg_type);
    778
    779	switch (chg_type) {
    780	case MAX77693_CHARGER_TYPE_USB:
    781	case MAX77693_CHARGER_TYPE_DEDICATED_CHG:
    782	case MAX77693_CHARGER_TYPE_NONE:
    783		/* Check MAX77693_CABLE_GROUP_ADC_GND type */
    784		cable_type_gnd = max77693_muic_get_cable_type(info,
    785					MAX77693_CABLE_GROUP_ADC_GND,
    786					&cable_attached);
    787		switch (cable_type_gnd) {
    788		case MAX77693_MUIC_GND_MHL:
    789		case MAX77693_MUIC_GND_MHL_VB:
    790			/*
    791			 * MHL cable with USB/TA cable
    792			 * - MHL cable include two port(HDMI line and separate
    793			 * micro-usb port. When the target connect MHL cable,
    794			 * extcon driver check whether USB/TA cable is
    795			 * connected. If USB/TA cable is connected, extcon
    796			 * driver notify state to notifiee for charging battery.
    797			 *
    798			 * Features of 'USB/TA with MHL cable'
    799			 * - Support MHL
    800			 * - Support charging through micro-usb port without
    801			 *   data connection
    802			 */
    803			extcon_set_state_sync(info->edev, EXTCON_CHG_USB_DCP,
    804						attached);
    805			extcon_set_state_sync(info->edev, EXTCON_DISP_MHL,
    806						cable_attached);
    807			break;
    808		}
    809
    810		/* Check MAX77693_CABLE_GROUP_ADC type */
    811		cable_type = max77693_muic_get_cable_type(info,
    812					MAX77693_CABLE_GROUP_ADC,
    813					&cable_attached);
    814		switch (cable_type) {
    815		case MAX77693_MUIC_ADC_AV_CABLE_NOLOAD:		/* Dock-Audio */
    816			/*
    817			 * Dock-Audio device with USB/TA cable
    818			 * - Dock device include two port(Dock-Audio and micro-
    819			 * usb port). When the target connect Dock-Audio device,
    820			 * extcon driver check whether USB/TA cable is connected
    821			 * or not. If USB/TA cable is connected, extcon driver
    822			 * notify state to notifiee for charging battery.
    823			 *
    824			 * Features of 'USB/TA cable with Dock-Audio device'
    825			 * - Support external output feature of audio.
    826			 * - Support charging through micro-usb port without
    827			 *   data connection.
    828			 */
    829			extcon_set_state_sync(info->edev, EXTCON_USB,
    830						attached);
    831			extcon_set_state_sync(info->edev, EXTCON_CHG_USB_SDP,
    832						attached);
    833
    834			if (!cable_attached)
    835				extcon_set_state_sync(info->edev, EXTCON_DOCK,
    836							cable_attached);
    837			break;
    838		case MAX77693_MUIC_ADC_RESERVED_ACC_3:		/* Dock-Smart */
    839			/*
    840			 * Dock-Smart device with USB/TA cable
    841			 * - Dock-Desk device include three type of cable which
    842			 * are HDMI, USB for mouse/keyboard and micro-usb port
    843			 * for USB/TA cable. Dock-Smart device need always
    844			 * exteranl power supply(USB/TA cable through micro-usb
    845			 * cable). Dock-Smart device support screen output of
    846			 * target to separate monitor and mouse/keyboard for
    847			 * desktop mode.
    848			 *
    849			 * Features of 'USB/TA cable with Dock-Smart device'
    850			 * - Support MHL
    851			 * - Support external output feature of audio
    852			 * - Support charging through micro-usb port without
    853			 *   data connection if TA cable is connected to target.
    854			 * - Support charging and data connection through micro-
    855			 *   usb port if USB cable is connected between target
    856			 *   and host device
    857			 * - Support OTG(On-The-Go) device (Ex: Mouse/Keyboard)
    858			 */
    859			ret = max77693_muic_set_path(info, info->path_usb,
    860						    attached);
    861			if (ret < 0)
    862				return ret;
    863
    864			extcon_set_state_sync(info->edev, EXTCON_DOCK,
    865						attached);
    866			extcon_set_state_sync(info->edev, EXTCON_DISP_MHL,
    867						attached);
    868			break;
    869		}
    870
    871		/* Check MAX77693_CABLE_GROUP_CHG type */
    872		switch (chg_type) {
    873		case MAX77693_CHARGER_TYPE_NONE:
    874			/*
    875			 * When MHL(with USB/TA cable) or Dock-Audio with USB/TA
    876			 * cable is attached, muic device happen below two irq.
    877			 * - 'MAX77693_MUIC_IRQ_INT1_ADC' for detecting
    878			 *    MHL/Dock-Audio.
    879			 * - 'MAX77693_MUIC_IRQ_INT2_CHGTYP' for detecting
    880			 *    USB/TA cable connected to MHL or Dock-Audio.
    881			 * Always, happen eariler MAX77693_MUIC_IRQ_INT1_ADC
    882			 * irq than MAX77693_MUIC_IRQ_INT2_CHGTYP irq.
    883			 *
    884			 * If user attach MHL (with USB/TA cable and immediately
    885			 * detach MHL with USB/TA cable before MAX77693_MUIC_IRQ
    886			 * _INT2_CHGTYP irq is happened, USB/TA cable remain
    887			 * connected state to target. But USB/TA cable isn't
    888			 * connected to target. The user be face with unusual
    889			 * action. So, driver should check this situation in
    890			 * spite of, that previous charger type is N/A.
    891			 */
    892			break;
    893		case MAX77693_CHARGER_TYPE_USB:
    894			/* Only USB cable, PATH:AP_USB */
    895			ret = max77693_muic_set_path(info, info->path_usb,
    896						    attached);
    897			if (ret < 0)
    898				return ret;
    899
    900			extcon_set_state_sync(info->edev, EXTCON_USB,
    901						attached);
    902			extcon_set_state_sync(info->edev, EXTCON_CHG_USB_SDP,
    903						attached);
    904			break;
    905		case MAX77693_CHARGER_TYPE_DEDICATED_CHG:
    906			/* Only TA cable */
    907			extcon_set_state_sync(info->edev, EXTCON_CHG_USB_DCP,
    908						attached);
    909			break;
    910		}
    911		break;
    912	case MAX77693_CHARGER_TYPE_DOWNSTREAM_PORT:
    913		extcon_set_state_sync(info->edev, EXTCON_CHG_USB_CDP,
    914					attached);
    915		break;
    916	case MAX77693_CHARGER_TYPE_APPLE_500MA:
    917		extcon_set_state_sync(info->edev, EXTCON_CHG_USB_SLOW,
    918					attached);
    919		break;
    920	case MAX77693_CHARGER_TYPE_APPLE_1A_2A:
    921		extcon_set_state_sync(info->edev, EXTCON_CHG_USB_FAST,
    922					attached);
    923		break;
    924	case MAX77693_CHARGER_TYPE_DEAD_BATTERY:
    925		break;
    926	default:
    927		dev_err(info->dev,
    928			"failed to detect %s accessory (chg_type:0x%x)\n",
    929			attached ? "attached" : "detached", chg_type);
    930		return -EINVAL;
    931	}
    932
    933	return 0;
    934}
    935
    936static void max77693_muic_irq_work(struct work_struct *work)
    937{
    938	struct max77693_muic_info *info = container_of(work,
    939			struct max77693_muic_info, irq_work);
    940	int irq_type = -1;
    941	int i, ret = 0;
    942
    943	if (!info->edev)
    944		return;
    945
    946	mutex_lock(&info->mutex);
    947
    948	for (i = 0; i < ARRAY_SIZE(muic_irqs); i++)
    949		if (info->irq == muic_irqs[i].virq)
    950			irq_type = muic_irqs[i].irq;
    951
    952	ret = regmap_bulk_read(info->max77693->regmap_muic,
    953			MAX77693_MUIC_REG_STATUS1, info->status, 2);
    954	if (ret) {
    955		dev_err(info->dev, "failed to read MUIC register\n");
    956		mutex_unlock(&info->mutex);
    957		return;
    958	}
    959
    960	switch (irq_type) {
    961	case MAX77693_MUIC_IRQ_INT1_ADC:
    962	case MAX77693_MUIC_IRQ_INT1_ADC_LOW:
    963	case MAX77693_MUIC_IRQ_INT1_ADC_ERR:
    964	case MAX77693_MUIC_IRQ_INT1_ADC1K:
    965		/*
    966		 * Handle all of accessory except for
    967		 * type of charger accessory.
    968		 */
    969		ret = max77693_muic_adc_handler(info);
    970		break;
    971	case MAX77693_MUIC_IRQ_INT2_CHGTYP:
    972	case MAX77693_MUIC_IRQ_INT2_CHGDETREUN:
    973	case MAX77693_MUIC_IRQ_INT2_DCDTMR:
    974	case MAX77693_MUIC_IRQ_INT2_DXOVP:
    975	case MAX77693_MUIC_IRQ_INT2_VBVOLT:
    976	case MAX77693_MUIC_IRQ_INT2_VIDRM:
    977		/* Handle charger accessory */
    978		ret = max77693_muic_chg_handler(info);
    979		break;
    980	case MAX77693_MUIC_IRQ_INT3_EOC:
    981	case MAX77693_MUIC_IRQ_INT3_CGMBC:
    982	case MAX77693_MUIC_IRQ_INT3_OVP:
    983	case MAX77693_MUIC_IRQ_INT3_MBCCHG_ERR:
    984	case MAX77693_MUIC_IRQ_INT3_CHG_ENABLED:
    985	case MAX77693_MUIC_IRQ_INT3_BAT_DET:
    986		break;
    987	default:
    988		dev_err(info->dev, "muic interrupt: irq %d occurred\n",
    989				irq_type);
    990		mutex_unlock(&info->mutex);
    991		return;
    992	}
    993
    994	if (ret < 0)
    995		dev_err(info->dev, "failed to handle MUIC interrupt\n");
    996
    997	mutex_unlock(&info->mutex);
    998}
    999
   1000static irqreturn_t max77693_muic_irq_handler(int irq, void *data)
   1001{
   1002	struct max77693_muic_info *info = data;
   1003
   1004	info->irq = irq;
   1005	schedule_work(&info->irq_work);
   1006
   1007	return IRQ_HANDLED;
   1008}
   1009
   1010static const struct regmap_config max77693_muic_regmap_config = {
   1011	.reg_bits = 8,
   1012	.val_bits = 8,
   1013};
   1014
   1015static int max77693_muic_detect_accessory(struct max77693_muic_info *info)
   1016{
   1017	int ret = 0;
   1018	int adc;
   1019	int chg_type;
   1020	bool attached;
   1021
   1022	mutex_lock(&info->mutex);
   1023
   1024	/* Read STATUSx register to detect accessory */
   1025	ret = regmap_bulk_read(info->max77693->regmap_muic,
   1026			MAX77693_MUIC_REG_STATUS1, info->status, 2);
   1027	if (ret) {
   1028		dev_err(info->dev, "failed to read MUIC register\n");
   1029		mutex_unlock(&info->mutex);
   1030		return ret;
   1031	}
   1032
   1033	adc = max77693_muic_get_cable_type(info, MAX77693_CABLE_GROUP_ADC,
   1034					&attached);
   1035	if (attached && adc != MAX77693_MUIC_ADC_OPEN) {
   1036		ret = max77693_muic_adc_handler(info);
   1037		if (ret < 0) {
   1038			dev_err(info->dev, "Cannot detect accessory\n");
   1039			mutex_unlock(&info->mutex);
   1040			return ret;
   1041		}
   1042	}
   1043
   1044	chg_type = max77693_muic_get_cable_type(info, MAX77693_CABLE_GROUP_CHG,
   1045					&attached);
   1046	if (attached && chg_type != MAX77693_CHARGER_TYPE_NONE) {
   1047		ret = max77693_muic_chg_handler(info);
   1048		if (ret < 0) {
   1049			dev_err(info->dev, "Cannot detect charger accessory\n");
   1050			mutex_unlock(&info->mutex);
   1051			return ret;
   1052		}
   1053	}
   1054
   1055	mutex_unlock(&info->mutex);
   1056
   1057	return 0;
   1058}
   1059
   1060static void max77693_muic_detect_cable_wq(struct work_struct *work)
   1061{
   1062	struct max77693_muic_info *info = container_of(to_delayed_work(work),
   1063				struct max77693_muic_info, wq_detcable);
   1064
   1065	max77693_muic_detect_accessory(info);
   1066}
   1067
   1068static int max77693_muic_probe(struct platform_device *pdev)
   1069{
   1070	struct max77693_dev *max77693 = dev_get_drvdata(pdev->dev.parent);
   1071	struct max77693_platform_data *pdata = dev_get_platdata(max77693->dev);
   1072	struct max77693_muic_info *info;
   1073	struct max77693_reg_data *init_data;
   1074	int num_init_data;
   1075	int delay_jiffies;
   1076	int cable_type;
   1077	bool attached;
   1078	int ret;
   1079	int i;
   1080	unsigned int id;
   1081
   1082	info = devm_kzalloc(&pdev->dev, sizeof(struct max77693_muic_info),
   1083				   GFP_KERNEL);
   1084	if (!info)
   1085		return -ENOMEM;
   1086
   1087	info->dev = &pdev->dev;
   1088	info->max77693 = max77693;
   1089	if (info->max77693->regmap_muic) {
   1090		dev_dbg(&pdev->dev, "allocate register map\n");
   1091	} else {
   1092		info->max77693->regmap_muic = devm_regmap_init_i2c(
   1093						info->max77693->i2c_muic,
   1094						&max77693_muic_regmap_config);
   1095		if (IS_ERR(info->max77693->regmap_muic)) {
   1096			ret = PTR_ERR(info->max77693->regmap_muic);
   1097			dev_err(max77693->dev,
   1098				"failed to allocate register map: %d\n", ret);
   1099			return ret;
   1100		}
   1101	}
   1102
   1103	/* Register input device for button of dock device */
   1104	info->dock = devm_input_allocate_device(&pdev->dev);
   1105	if (!info->dock) {
   1106		dev_err(&pdev->dev, "%s: failed to allocate input\n", __func__);
   1107		return -ENOMEM;
   1108	}
   1109	info->dock->name = "max77693-muic/dock";
   1110	info->dock->phys = "max77693-muic/extcon";
   1111	info->dock->dev.parent = &pdev->dev;
   1112
   1113	__set_bit(EV_REP, info->dock->evbit);
   1114
   1115	input_set_capability(info->dock, EV_KEY, KEY_VOLUMEUP);
   1116	input_set_capability(info->dock, EV_KEY, KEY_VOLUMEDOWN);
   1117	input_set_capability(info->dock, EV_KEY, KEY_PLAYPAUSE);
   1118	input_set_capability(info->dock, EV_KEY, KEY_PREVIOUSSONG);
   1119	input_set_capability(info->dock, EV_KEY, KEY_NEXTSONG);
   1120
   1121	ret = input_register_device(info->dock);
   1122	if (ret < 0) {
   1123		dev_err(&pdev->dev, "Cannot register input device error(%d)\n",
   1124				ret);
   1125		return ret;
   1126	}
   1127
   1128	platform_set_drvdata(pdev, info);
   1129	mutex_init(&info->mutex);
   1130
   1131	ret = devm_work_autocancel(&pdev->dev, &info->irq_work,
   1132				   max77693_muic_irq_work);
   1133	if (ret)
   1134		return ret;
   1135
   1136	/* Support irq domain for MAX77693 MUIC device */
   1137	for (i = 0; i < ARRAY_SIZE(muic_irqs); i++) {
   1138		struct max77693_muic_irq *muic_irq = &muic_irqs[i];
   1139		int virq;
   1140
   1141		virq = regmap_irq_get_virq(max77693->irq_data_muic,
   1142					muic_irq->irq);
   1143		if (virq <= 0)
   1144			return -EINVAL;
   1145		muic_irq->virq = virq;
   1146
   1147		ret = devm_request_threaded_irq(&pdev->dev, virq, NULL,
   1148				max77693_muic_irq_handler,
   1149				IRQF_NO_SUSPEND,
   1150				muic_irq->name, info);
   1151		if (ret) {
   1152			dev_err(&pdev->dev,
   1153				"failed: irq request (IRQ: %d, error :%d)\n",
   1154				muic_irq->irq, ret);
   1155			return ret;
   1156		}
   1157	}
   1158
   1159	/* Initialize extcon device */
   1160	info->edev = devm_extcon_dev_allocate(&pdev->dev,
   1161					      max77693_extcon_cable);
   1162	if (IS_ERR(info->edev)) {
   1163		dev_err(&pdev->dev, "failed to allocate memory for extcon\n");
   1164		return PTR_ERR(info->edev);
   1165	}
   1166
   1167	ret = devm_extcon_dev_register(&pdev->dev, info->edev);
   1168	if (ret) {
   1169		dev_err(&pdev->dev, "failed to register extcon device\n");
   1170		return ret;
   1171	}
   1172
   1173	/* Initialize MUIC register by using platform data or default data */
   1174	if (pdata && pdata->muic_data) {
   1175		init_data = pdata->muic_data->init_data;
   1176		num_init_data = pdata->muic_data->num_init_data;
   1177	} else {
   1178		init_data = default_init_data;
   1179		num_init_data = ARRAY_SIZE(default_init_data);
   1180	}
   1181
   1182	for (i = 0; i < num_init_data; i++) {
   1183		regmap_write(info->max77693->regmap_muic,
   1184				init_data[i].addr,
   1185				init_data[i].data);
   1186	}
   1187
   1188	if (pdata && pdata->muic_data) {
   1189		struct max77693_muic_platform_data *muic_pdata
   1190						   = pdata->muic_data;
   1191
   1192		/*
   1193		 * Default usb/uart path whether UART/USB or AUX_UART/AUX_USB
   1194		 * h/w path of COMP2/COMN1 on CONTROL1 register.
   1195		 */
   1196		if (muic_pdata->path_uart)
   1197			info->path_uart = muic_pdata->path_uart;
   1198		else
   1199			info->path_uart = MAX77693_CONTROL1_SW_UART;
   1200
   1201		if (muic_pdata->path_usb)
   1202			info->path_usb = muic_pdata->path_usb;
   1203		else
   1204			info->path_usb = MAX77693_CONTROL1_SW_USB;
   1205
   1206		/*
   1207		 * Default delay time for detecting cable state
   1208		 * after certain time.
   1209		 */
   1210		if (muic_pdata->detcable_delay_ms)
   1211			delay_jiffies =
   1212				msecs_to_jiffies(muic_pdata->detcable_delay_ms);
   1213		else
   1214			delay_jiffies = msecs_to_jiffies(DELAY_MS_DEFAULT);
   1215	} else {
   1216		info->path_usb = MAX77693_CONTROL1_SW_USB;
   1217		info->path_uart = MAX77693_CONTROL1_SW_UART;
   1218		delay_jiffies = msecs_to_jiffies(DELAY_MS_DEFAULT);
   1219	}
   1220
   1221	/* Set initial path for UART when JIG is connected to get serial logs */
   1222	ret = regmap_bulk_read(info->max77693->regmap_muic,
   1223			MAX77693_MUIC_REG_STATUS1, info->status, 2);
   1224	if (ret) {
   1225		dev_err(info->dev, "failed to read MUIC register\n");
   1226		return ret;
   1227	}
   1228	cable_type = max77693_muic_get_cable_type(info,
   1229					   MAX77693_CABLE_GROUP_ADC, &attached);
   1230	if (attached && (cable_type == MAX77693_MUIC_ADC_FACTORY_MODE_UART_ON ||
   1231			 cable_type == MAX77693_MUIC_ADC_FACTORY_MODE_UART_OFF))
   1232		max77693_muic_set_path(info, info->path_uart, true);
   1233
   1234	/* Check revision number of MUIC device*/
   1235	ret = regmap_read(info->max77693->regmap_muic,
   1236			MAX77693_MUIC_REG_ID, &id);
   1237	if (ret < 0) {
   1238		dev_err(&pdev->dev, "failed to read revision number\n");
   1239		return ret;
   1240	}
   1241	dev_info(info->dev, "device ID : 0x%x\n", id);
   1242
   1243	/* Set ADC debounce time */
   1244	max77693_muic_set_debounce_time(info, ADC_DEBOUNCE_TIME_25MS);
   1245
   1246	/*
   1247	 * Detect accessory after completing the initialization of platform
   1248	 *
   1249	 * - Use delayed workqueue to detect cable state and then
   1250	 * notify cable state to notifiee/platform through uevent.
   1251	 * After completing the booting of platform, the extcon provider
   1252	 * driver should notify cable state to upper layer.
   1253	 */
   1254	INIT_DELAYED_WORK(&info->wq_detcable, max77693_muic_detect_cable_wq);
   1255	queue_delayed_work(system_power_efficient_wq, &info->wq_detcable,
   1256			delay_jiffies);
   1257
   1258	return ret;
   1259}
   1260
   1261static struct platform_driver max77693_muic_driver = {
   1262	.driver		= {
   1263		.name	= DEV_NAME,
   1264	},
   1265	.probe		= max77693_muic_probe,
   1266};
   1267
   1268module_platform_driver(max77693_muic_driver);
   1269
   1270MODULE_DESCRIPTION("Maxim MAX77693 Extcon driver");
   1271MODULE_AUTHOR("Chanwoo Choi <cw00.choi@samsung.com>");
   1272MODULE_LICENSE("GPL");
   1273MODULE_ALIAS("platform:max77693-muic");