static void smb347_default_setback(void)
{
	struct i2c_client *client = charger->client;
	int err;

	if(grouper_query_pcba_revision() > 0x02) {
		/* Enable volatile writes to registers */
		err = smb347_volatile_writes(client, smb347_ENABLE_WRITE);
		if (err < 0) {
			dev_err(&client->dev, "%s() error in configuring charger..\n", __func__);
		}
		err = smb347_update_reg(client, smb347_PIN_CTRL, PIN_CTRL);
		if (err < 0) {
			dev_err(&client->dev, "%s: err %d\n", __func__, err);
		}
		err = smb347_update_reg(client, smb347_CHRG_CTRL, ENABLE_APSD);
		if (err < 0) {
			dev_err(&client->dev, "%s: err %d\n", __func__, err);
		}
		 /* Disable volatile writes to registers */
		err = smb347_volatile_writes(client, smb347_DISABLE_WRITE);
		if (err < 0) {
			dev_err(&client->dev, "%s() error in configuring charger..\n", __func__);
		}
		printk("grouper_query_pcba_revision=0x%02x\n",
			grouper_query_pcba_revision());
	}
}
/* workqueue function */
static int cable_type_detect(void)
{
	struct i2c_client *client = charger->client;
	u8 retval;
	int  success = 0;
	int gpio = TEGRA_GPIO_PV1;

	if(grouper_query_pcba_revision() <= 0x02)
		return 0;

	mutex_lock(&charger->cable_lock);

	if (gpio_get_value(gpio)) {
			printk("INOK=H\n");
			success = battery_callback(non_cable);
	} else {
			printk("INOK=L\n");

			/* cable type dection */
			retval = smb347_read(client, smb347_STS_REG_E);
			SMB_NOTICE("Reg3F : 0x%02x\n", retval);
			if(retval & USBIN) {	//USBIN
					retval = smb347_read(client, smb347_STS_REG_D);
					SMB_NOTICE("Reg3E : 0x%02x\n", retval);
				if(retval & APSD_OK) {	//APSD completed
						retval &= APSD_RESULT;
					if(retval == APSD_CDP) {	//APSD resulted
							printk("Cable: CDP\n");
							success = battery_callback(ac_cable);
					} else if(retval == APSD_DCP) {
							printk("Cable: DCP\n");
							success = battery_callback(ac_cable);
					} else if(retval == APSD_OTHER) {
							printk("Cable: OTHER\n");
					} else if(retval == APSD_SDP) {
							printk("Cable: SDP\n");
							success = battery_callback(usb_cable);
					} else
							printk("Unkown Plug In Cable type !\n");
				}else
					printk("APSD not completed\n");
			}
			else
			{
					printk("USBIN=0\n");
			}
	}

	mutex_unlock(&charger->cable_lock);

	return success;
}
Exemple #3
0
static int __init smb347_init(void)
{
	project_id = grouper_get_project_id();
	pcba_ver = grouper_query_pcba_revision();
	u32 project_info = grouper_get_project_id();

	if (project_info == GROUPER_PROJECT_NAKASI_3G)
		gpio_dock_in = TEGRA_GPIO_PO5;
	else
		gpio_dock_in = TEGRA_GPIO_PU4;

	SMB_NOTICE("project_id=%x, pcba_ver=%d, dock_in_gpio=%d\n",
		project_id, pcba_ver, gpio_dock_in);

	return i2c_add_driver(&smb347_i2c_driver);
}
static void grouper_usb_init(void)
{
	u32 project_info = grouper_get_project_id();
	unsigned int pcb_id_version = grouper_query_pcba_revision();

	tegra_usb_phy_init(tegra_usb_phy_pdata,
			ARRAY_SIZE(tegra_usb_phy_pdata));

	tegra_otg_device.dev.platform_data = &tegra_otg_pdata;
	platform_device_register(&tegra_otg_device);

	if (project_info == GROUPER_PROJECT_NAKASI_3G) {
		printk(KERN_INFO"%s : pcb_id_version = %d \n", __func__, pcb_id_version);
		/* for baseband devices do not switch off phy during suspend */
		tegra_ehci_uhsic_pdata.power_down_on_bus_suspend = 0;
		tegra_ehci_pdata[1].power_down_on_bus_suspend = 0;
		uhsic_phy_config.postsuspend = grouper_usb_hsic_postsupend;
		uhsic_phy_config.preresume = grouper_usb_hsic_preresume;
		uhsic_phy_config.usb_phy_ready = grouper_usb_hsic_phy_ready;
		uhsic_phy_config.post_phy_off = grouper_usb_hsic_phy_off;
		tegra_ehci2_device.dev.platform_data = &tegra_ehci_uhsic_pdata;
		/* baseband registration happens in baseband-xmm-power  */

		switch (pcb_id_version) {
			case TILAPIA_PCBA_SR1:
			case TILAPIA_PCBA_SR2:
			case TILAPIA_PCBA_SR3:
				uhsic_phy_config.enable_gpio = TEGRA_GPIO_PR7;
				break;
			default:
				uhsic_phy_config.enable_gpio = TEGRA_GPIO_PU4;
		}

	} else {
		tegra_ehci2_device.dev.platform_data = &tegra_ehci_pdata[1];
		platform_device_register(&tegra_ehci2_device);
	}
}