Esempio n. 1
0
static int sm5502_attach_dev(struct sm5502_usbsw *usbsw)
{
	int adc;
	int val1, val2, val3 , vbus;
	struct sm5502_platform_data *pdata = usbsw->pdata;
	struct i2c_client *client = usbsw->client;
#if defined(CONFIG_VIDEO_MHL_V2)
	/*u8 mhl_ret = 0;*/
#endif
	val1 = i2c_smbus_read_byte_data(client, REG_DEVICE_TYPE1);
	if (val1 < 0) {
		dev_err(&client->dev, "%s: err %d\n", __func__, val1);
		return val1;
	}

	val2 = i2c_smbus_read_byte_data(client, REG_DEVICE_TYPE2);
	if (val2 < 0) {
		dev_err(&client->dev, "%s: err %d\n", __func__, val2);
		return val2;
	}
	jig_state =  (val2 & DEV_T2_JIG_ALL_MASK) ? 1 : 0;

	val3 = i2c_smbus_read_byte_data(client, REG_DEVICE_TYPE3);
	if (val3 < 0) {
		dev_err(&client->dev, "%s: err %d\n", __func__, val3);
		return val3;
	}

    // add start
	vbus = i2c_smbus_read_byte_data(client, REG_VBUSINVALID);
	if (vbus < 0) {
		dev_err(&client->dev, "%s: err %d\n", __func__, vbus);
		return vbus;
	}    
    // add end

    
	adc = i2c_smbus_read_byte_data(client, REG_ADC);

	if (adc == ADC_SMART_DOCK) {
		val2 = DEV_SMARTDOCK;
		val1 = 0;
	}
#if defined(CONFIG_USB_HOST_NOTIFY)
	if (adc == 0x11 || adc == ADC_AUDIO_DOCK) {
		val2 = DEV_AUDIO_DOCK;
		val1 = 0;
	}
#endif
	dev_err(&client->dev,
			"dev1: 0x%x, dev2: 0x%x, dev3: 0x%x, ADC: 0x%x Jig:%s\n",
			val1, val2, val3, adc,
			(check_sm5502_jig_state() ? "ON" : "OFF"));

	/* USB */
	if (val1 & DEV_USB || val2 & DEV_T2_USB_MASK) {
		pr_info("[MUIC] USB Connected\n");
		pdata->callback(CABLE_TYPE_USB, SM5502_ATTACHED);
	/* USB_CDP */
	} else if (val1 & DEV_USB_CHG) {
		pr_info("[MUIC] CDP Connected\n");
		pdata->callback(CABLE_TYPE_CDP, SM5502_ATTACHED);
	/* UART */
	} else if (val1 & DEV_T1_UART_MASK || val2 & DEV_T2_UART_MASK) {
		uart_sm5502_connecting = 1;
		pr_info("[MUIC] UART Connected\n");
		pdata->callback(CABLE_TYPE_UARTOFF, SM5502_ATTACHED);
#if (!defined(CONFIG_MACH_CT01) && !defined(CONFIG_MACH_CT01_CHN_CU))
		flash_control(true);
#endif
	/* CHARGER */
	} else if ((val1 & DEV_T1_CHARGER_MASK) ||
			(val3 & DEV_T3_CHARGER_MASK)) {
		pr_info("[MUIC] Charger Connected\n");
		pdata->callback(CABLE_TYPE_AC, SM5502_ATTACHED);
#if defined(CONFIG_USB_HOST_NOTIFY)
	/* for SAMSUNG OTG */
	} else if (val1 & DEV_USB_OTG) {
		pr_info("[MUIC] OTG Connected\n");
		sm5502_set_otg(usbsw, SM5502_ATTACHED);
#endif
	/* JIG */
	} else if (val2 & DEV_T2_JIG_MASK) {
		pr_info("[MUIC] JIG Connected\n");
		pdata->callback(CABLE_TYPE_JIG, SM5502_ATTACHED);
#if (!defined(CONFIG_MACH_CT01) && !defined(CONFIG_MACH_CT01_CHN_CU))
		flash_control(true);
#endif
	/* Desk Dock */
	} else if ((val2 & DEV_AV) || (val3 & DEV_AV_VBUS)) {
		pr_info("[MUIC] Deskdock Connected\n");
		local_usbsw->dock_attached = SM5502_ATTACHED;
		sm5502_dock_control(usbsw, CABLE_TYPE_DESK_DOCK,
			SM5502_ATTACHED, SW_AUDIO);
#if defined(CONFIG_VIDEO_MHL_V2)
	/* MHL */
	} else if (val3 & DEV_MHL) {
		pr_info("[MUIC] MHL Connected\n");
		sm5502_disable_interrupt();
		if (!poweroff_charging)
			/*mhl_ret = mhl_onoff_ex(1); support from sii8240*/
		else
			pr_info("LPM mode, skip MHL sequence\n");
		sm5502_enable_interrupt();
#endif
	/* Car Dock */
	} else if (val2 & DEV_JIG_UART_ON) {
static int sm5502_detect_lanhub(struct sm5502_usbsw *usbsw) {
	unsigned int dev1, dev2, adc;
	struct sm5502_platform_data *pdata = usbsw->pdata;
	struct i2c_client *client = usbsw->client;
	pr_info("%s called\n",__func__);

	dev1 = i2c_smbus_read_byte_data(client, REG_DEVICE_TYPE1);
        if (dev1 < 0) {
		dev_err(&client->dev, "%s: err %d\n", __func__, dev1);
		return dev1;
	}

	dev2 = i2c_smbus_read_byte_data(client, REG_DEVICE_TYPE2);
        if (dev2 < 0) {
		dev_err(&client->dev, "%s: err %d\n", __func__, dev2);
                return dev2;
	}

	adc = i2c_smbus_read_byte_data(client, REG_ADC);


	dev_info(&client->dev, "dev1: 0x%02x, dev2: 0x%02x, adc: 0x%02x\n",
			dev1, dev2, adc);

	/* Attached + Detached*/
	switch(adc){
	case ADC_OTG:
		lanhub_ta_case = false;
		usbsw->adc = adc;
		sm5502_set_otg(usbsw, SM5502_ATTACHED);
		if(usbsw->previous_dock == SM5502_NONE) {
			dev_info(&client->dev, "%s:LANHUB Connected\n", __func__);
			pdata->callback(CABLE_TYPE_OTG, SM5502_ATTACHED);
			sm5502_set_otg(usbsw,SM5502_ATTACHED);
		}
		else if(usbsw->previous_dock == ADC_LANHUB) {
			dev_info(&client->dev, "%s:Switch LANHUB+TA to LANHUB\n", __func__);
			usbsw->lanhub_ta_status=0;
			pdata->lanhub_cb(CABLE_TYPE_LANHUB, SM5502_DETACHED, LANHUB_TA);
		}
		sm5502_mask_vbus_detect(usbsw,SM5502_DETACHED);
		usbsw->dock_attached = SM5502_ATTACHED;
		usbsw->previous_dock = ADC_OTG;
		break;
	case ADC_LANHUB:
		usbsw->adc = adc;
		lanhub_ta_case = true;
		usbsw->lanhub_ta_status = 1;
		sm5502_mask_vbus_detect(usbsw,SM5502_ATTACHED);
		usbsw->dock_attached = SM5502_ATTACHED;
		usbsw->mansw = SW_DHOST;
		if(usbsw->previous_dock == SM5502_NONE) {
			dev_info(&client->dev, "%s:LANHUB+TA Connected\n", __func__);
			pdata->lanhub_cb(CABLE_TYPE_LANHUB, SM5502_ATTACHED, LANHUB);
			sm5502_set_lanhub(usbsw,SM5502_ATTACHED);
		} else if (usbsw->previous_dock == ADC_OTG) {
			dev_info(&client->dev, "%s:Switch LANHUB to LANHUB+TA\n", __func__);
			pdata->lanhub_cb(CABLE_TYPE_LANHUB, SM5502_ATTACHED, LANHUB_TA);
		}
		usbsw->previous_dock = ADC_LANHUB;
		break;
	case ADC_OPEN:
		usbsw->adc = adc;
		dev_info(&client->dev, "%s:LANHUB + TA -> ADC_OPEN case\n", __func__);
		if (pdata->lanhub_cb && usbsw->lanhub_ta_status == 1) {
			if (usbsw->previous_dock == ADC_LANHUB)
				pdata->lanhub_cb(CABLE_TYPE_LANHUB,SM5502_DETACHED, LANHUB);
			sm5502_disable_rawdataInterrupts(usbsw);
			usbsw->lanhub_ta_status=0;
			sm5502_mask_vbus_detect(usbsw,SM5502_DETACHED);
			pdata->callback(CABLE_TYPE_OTG,SM5502_DETACHED);
			sm5502_set_otg(usbsw, SM5502_DETACHED);
			}
		else if (usbsw->previous_dock == ADC_OTG) {
			sm5502_disable_rawdataInterrupts(usbsw);
			pdata->callback(CABLE_TYPE_OTG,SM5502_DETACHED);
			sm5502_set_otg(usbsw, SM5502_DETACHED);
		}else {
			dev_info(&client->dev, "%s:ignore ADC_OPEN case\n", __func__);
				sm5502_mask_vbus_detect(usbsw,SM5502_DETACHED);
			}

		usbsw->previous_dock = SM5502_NONE;
		lanhub_ta_case = false;
		break;
	default:
		dev_info(&client->dev, "%s:Not reaching here(adc:0x%02x)\n",
			__func__, adc);
		lanhub_ta_case = false;
		break;
	}

	usbsw->dev1=dev1;
	usbsw->dev2=dev2;
	return adc;
}