Example #1
0
int sanremo_tsi_enable_headset(int headset_en)
{
	u8 tmp;
	if (sanremo_version < 0x48) {
		if (headset_en) {
			sanremo_read(SANREMO_AUDIO_REG_BASE + SANREMO_AUDIO_HEADSET_DETECTION, &tmp);
			tmp |= 0x01;
			sanremo_write(SANREMO_AUDIO_REG_BASE + SANREMO_AUDIO_HEADSET_DETECTION, tmp);
		} else {
			sanremo_read(SANREMO_AUDIO_REG_BASE + SANREMO_AUDIO_HEADSET_DETECTION, &tmp);
			tmp &= ~0x01;
			sanremo_write(SANREMO_AUDIO_REG_BASE + SANREMO_AUDIO_HEADSET_DETECTION, tmp);
		}
	} else {
		if (headset_en) {
			sanremo_read(SANREMO_AUDIO_HEADSET_DETECTION_BO, &tmp);
			tmp |= 0x01;
			sanremo_write(SANREMO_AUDIO_HEADSET_DETECTION_BO, tmp);
		} else {
			sanremo_read(SANREMO_AUDIO_HEADSET_DETECTION_BO, &tmp);
			tmp &= ~0x01;
			sanremo_write(SANREMO_AUDIO_HEADSET_DETECTION_BO, tmp);
		}
	}
	return 0;
}
Example #2
0
int sanremo_tsi_enable_mic(int mic_en)
{
	u8 tmp;
	if (sanremo_version < 0x48) {
		if (mic_en) {
			sanremo_read(SANREMO_AUDIO_REG_BASE + SANREMO_AUDIO_MIC_BUTTON_DETECTION, &tmp);
			tmp |= 0x27;
			sanremo_write(SANREMO_AUDIO_REG_BASE + SANREMO_AUDIO_MIC_BUTTON_DETECTION, tmp);
		} else {
			sanremo_read(SANREMO_AUDIO_REG_BASE + SANREMO_AUDIO_MIC_BUTTON_DETECTION, &tmp);
			tmp &= ~0x27;
			sanremo_write(SANREMO_AUDIO_REG_BASE + SANREMO_AUDIO_MIC_BUTTON_DETECTION, tmp);
		}
	} else {
		if (mic_en) {
			sanremo_read(SANREMO_AUDIO_MIC_BUTTON_DETECTION_B0, &tmp);
			tmp |= 0x27;
			sanremo_write(SANREMO_AUDIO_MIC_BUTTON_DETECTION_B0, tmp);
		} else {
			sanremo_read(SANREMO_AUDIO_MIC_BUTTON_DETECTION_B0, &tmp);
			tmp &= ~0x27;
			sanremo_write(SANREMO_AUDIO_MIC_BUTTON_DETECTION_B0, tmp);
		}
	}
	return 0;
}
Example #3
0
int sanremo_get_headset_state(void)
{
	u8 tmp;

	if (sanremo_version < 0x48) {
		sanremo_read(SANREMO_STATUS, &tmp);
		return (tmp & SANREMO_MICIN_STATUS) ? 1 : 0;
	} else {
		sanremo_read(SANREMO_STATUS_B0, &tmp);
		return (tmp & SANREMO_HEADSET_STATUS) ? 0 : 1;
	}
}
Example #4
0
int sanremo_get_vbat(void)
{
	u8 tmp;
	unsigned int val;

	sanremo_read(SANREMO_VBAT_MEAS2, &tmp);
	val = tmp&0xf;
	sanremo_read(SANREMO_VBAT_MEAS1, &tmp);
	val += tmp<<4;

	return val*131836/100000;
}
Example #5
0
int sanremo_tsi_enable_tsi(int tsi_en)
{
	u8 tmp;
	if(tsi_en) {
		sanremo_read(SANREMO_MEAS_ENABLE3, &tmp); 
		tmp |= 0x30;
		sanremo_write(SANREMO_MEAS_ENABLE3, tmp); 
	} else {
		sanremo_read(SANREMO_MEAS_ENABLE3, &tmp); 
		tmp &= ~0x30;
		sanremo_write(SANREMO_MEAS_ENABLE3, tmp); 
	}
	return 0;
}
Example #6
0
int sanremo_tsi_enable_pen(int pen_en)
{
	u8 tmp;
	if(pen_en) {
		sanremo_read(SANREMO_MEAS_ENABLE3, &tmp); 
		tmp |= 0x08;
		sanremo_write(SANREMO_MEAS_ENABLE3, tmp); 
	} else {
		sanremo_read(SANREMO_MEAS_ENABLE3, &tmp); 
		tmp &= ~0x08;
		sanremo_write(SANREMO_MEAS_ENABLE3, tmp); 
	}
	return 0;
}
Example #7
0
int sanremo_tsi_readxy(u16 *x, u16 *y, int *pen_state)
{
	u8 meas1, meas2;

	sanremo_read(SANREMO_TSIX_MEAS1, &meas1); 
	sanremo_read(SANREMO_TSIX_MEAS2, &meas2); 
	*pen_state = (meas2 & (1<<6))? 1 : 0;
	if(*pen_state) {
		*x = (meas1 << 4) + (meas2 & 0xf);
		sanremo_read(SANREMO_TSIY_MEAS1, &meas1); 
		sanremo_read(SANREMO_TSIY_MEAS2, &meas2); 
		*y = (meas1 << 4) + (meas2 & 0xf);
	}
	return 0;
}
Example #8
0
int sanremo_enable_headset_irq(int enable)
{
	u8 tmp;
	if (enable) {
		sanremo_read(SANREMO_INTERRUPT_ENABLE3, &tmp);
		if (!(tmp & SANREMO_HEADSET_MASK)) {
			tmp |= SANREMO_HEADSET_MASK;
			sanremo_write(SANREMO_INTERRUPT_ENABLE3, tmp);
		}
	} else {
		sanremo_read(SANREMO_INTERRUPT_ENABLE3, &tmp);
		if (tmp & SANREMO_HEADSET_MASK) {
			tmp &= ~SANREMO_HEADSET_MASK;
			sanremo_write(SANREMO_INTERRUPT_ENABLE3, tmp);
		}
	}
	return 0;
}
Example #9
0
void sanremo_turn_off_power(void)
{
	u8 tmp;

	printk("turning off power....\n");
	sanremo_read(SANREMO_RESET_OUT, &tmp);
	sanremo_write(SANREMO_RESET_OUT, tmp | 0x80);

	return;
}
Example #10
0
static void sanremo_stop_charging(void)
{
	u8 tmp;
	
	printk("sanremo stop charging\n");
	/*disable TIT and IBAT measurement*/
	sanremo_read(SANREMO_MEAS_ENABLE1, &tmp);
	sanremo_write(SANREMO_MEAS_ENABLE1, tmp&(~SANREMO_MEAS_EN1_TINT));
	sanremo_read(SANREMO_MEAS_ENABLE3, &tmp);
	sanremo_write(SANREMO_MEAS_ENABLE3, tmp&(~SANREMO_MEAS_EN3_IBAT));
	/*disable GPADC FSM */
	sanremo_read(SANREMO_GPADC_MISC1, &tmp);
	sanremo_write(SANREMO_GPADC_MISC1, tmp&(~SANREMO_GPADC_MISC1_GPFSM_EN));
	/*enable interrupts*/
	sanremo_read(SANREMO_INTERRUPT_ENABLE3, &tmp);
	sanremo_write(SANREMO_INTERRUPT_ENABLE3, 
			tmp&(~(SANREMO_CHG_FAIL_MASK|SANREMO_CHG_DONE_MASK|
			SANREMO_CHG_IOVER_MASK)));
	charging_status = 0;
}
Example #11
0
static void sanremo_on_key_event(void)
{
	u8 tmp;
	unsigned int val;

	/*check for battery*/
	sanremo_read(SANREMO_STATUS, &tmp);
	if(tmp & SANREMO_ONKEY_STATUS) {
		printk(KERN_INFO "On key pressed\n");
		sanremo_turn_off_booster();
		sanremo_turn_off_power();
		return;
	}else {
		printk(KERN_INFO "On key released\n");
	}
}
Example #12
0
static void sanremo_charger_init(void)
{
	u8 tmp;
	int val;

	/*enable interrupt*/
	sanremo_read(SANREMO_INTERRUPT_ENABLE1, &tmp);
	sanremo_write(SANREMO_INTERRUPT_ENABLE1, 
			tmp|SANREMO_CHG_MASK);


	sanremo_read(SANREMO_INTERRUPT_ENABLE1, &tmp);

	/*detection*/
	sanremo_read(SANREMO_MEAS_OFF_TIME1, &tmp);
	sanremo_write(SANREMO_MEAS_OFF_TIME1, tmp|0x1);
	if (sanremo_version < 0x48) {
		sanremo_read(SANREMO_GPADC_MISC2, &tmp);
		sanremo_write(SANREMO_GPADC_MISC2, tmp|0x40);
	} else {
		sanremo_read(SANREMO_CHG_CTRL6, &tmp);
		sanremo_write(SANREMO_CHG_CTRL6, tmp|0x01);
	}

	sanremo_write(SANREMO_VBAT_LOW_TH, 0xaa);
	sanremo_read(SANREMO_MEAS_ENABLE1, &tmp);
	sanremo_write(SANREMO_MEAS_ENABLE1, tmp|SANREMO_MEAS_EN1_VBAT);
/*
	sanremo_read(SANREMO_INTERRUPT_ENABLE2, &tmp);
	sanremo_write(SANREMO_INTERRUPT_ENABLE2, 
			tmp|SANREMO_VBAT_MASK);
*/

	kthread_run(sanremo_charging_display,	NULL, "cdisplay");

//	sanremo_start_charging();
}
static int sanremo_ts_probe(struct platform_device *pdev)
{
	int ret;
	u8 tmp;

	if(sanremo_read(SANREMO_ID, &tmp) < 0)
		return -ENODEV;

	sanremo_td = kzalloc(sizeof(struct sanremo_ts_data), GFP_KERNEL);
	if (!sanremo_td) {
		ret = -ENOMEM;
		goto sanremo_ts_out;
	}
	sanremo_td->use_count = 0;
	sanremo_td->ts_timer = 
		(struct timer_list *)kmalloc(sizeof(struct timer_list), GFP_KERNEL);
	init_timer(sanremo_td->ts_timer);
	sanremo_td->ts_timer->function = sanremo_ts_timer_handler;
//	sanremo_td->ts_timer->data = sanremo_td;

	/* register input device */
	sanremo_ts_input_dev = input_allocate_device();
	if (sanremo_ts_input_dev == NULL) {
		printk(KERN_ERR "%s: failed to allocate input dev\n",
			__FUNCTION__);
		return -ENOMEM;
	}

	sanremo_ts_input_dev->name = "sanremo-ts";

	sanremo_ts_input_dev->phys = "sanremo-ts/input0";
	sanremo_ts_input_dev->dev.parent = &pdev->dev;

	sanremo_ts_input_dev->open = sanremo_ts_open;
	sanremo_ts_input_dev->close = sanremo_ts_close;

	__set_bit(EV_ABS, sanremo_ts_input_dev->evbit);
	__set_bit(ABS_X, sanremo_ts_input_dev->absbit);
	__set_bit(ABS_Y, sanremo_ts_input_dev->absbit);
	__set_bit(ABS_PRESSURE, sanremo_ts_input_dev->absbit);

	__set_bit(EV_SYN, sanremo_ts_input_dev->evbit);
	__set_bit(EV_KEY, sanremo_ts_input_dev->evbit);
	__set_bit(BTN_TOUCH, sanremo_ts_input_dev->keybit);

	input_set_abs_params(sanremo_ts_input_dev, ABS_X, 0, 3600, 0, 0);
	input_set_abs_params(sanremo_ts_input_dev, ABS_Y, 0, 3800, 0, 0);
	input_set_abs_params(sanremo_ts_input_dev, ABS_PRESSURE, 0, 255, 0, 0);
	input_set_abs_params(sanremo_ts_input_dev, ABS_TOOL_WIDTH, 0, 15, 0, 0);

	ret = input_register_device(sanremo_ts_input_dev);
	if (ret) {
		printk(KERN_ERR
			"%s: unabled to register input device, ret = %d\n",
			__FUNCTION__, ret);
		return ret;
	}

	/* The Littleton IRQ come from Sanremo. So we just implemate
	 * a callback IRQ function for Sanremo.
	 */
	ret = pmic_callback_register(PMIC_EVENT_TOUCH, sanremo_ts_interrupt);
	if (ret < 0)
		goto pmic_cb_out;

	return 0;

pmic_cb_out:
	input_unregister_device(sanremo_ts_input_dev);
sanremo_ts_out:
	kfree(sanremo_td);

	return ret;
}
Example #14
0
static int get_sanremo_voltage(int cmd, int *pmv)
{
	int power_module, status = 0, data;
	u8 val;

	*pmv = -1;

	power_module = get_power_supply_module(cmd);

	start_calc_time();
	switch (power_module) {
	case SAN_BUCK1:
	case SAN_BUCK1_SLEEP:
		status = sanremo_read(SANREMO_REG(power_module), &val);
		if (!status) {
			data = val & 0x3f;
			*pmv = SANREMO_VBUCK1_MV(data);
		}
		break;
	case SAN_BUCK2:
	case SAN_BUCK2_SLEEP:
		status = sanremo_read(SANREMO_REG(power_module), &val);
		if (!status) {
			data = val & 0x3f;
			*pmv = SANREMO_VBUCK2_MV(data);
		}
		break;
	case SAN_BUCK3:
	case SAN_BUCK3_SLEEP:
		status = sanremo_read(SANREMO_REG(power_module), &val);
		if (!status) {
			data = val & 0x3f;
			*pmv = SANREMO_VBUCK3_MV(data);
		}
		break;
	case SAN_LDO1:
		status = sanremo_read(SANREMO_LDO1, &val);
		if (!status) {
			data = val & 0x3f;
			*pmv = SANREMO_LDO1_MV(data);
		}
		break;
	case SAN_LDO1_SLEEP:
		status = sanremo_read(SANREMO_LDO1, &val);
		if (!status) {
			data = (val >> 2) & 0x03;
			*pmv = SANREMO_LDO1_SLEEP_MV(data);
		}
		break;
	case SAN_LDO2:
	case SAN_LDO3:
	case SAN_LDO4:
	case SAN_LDO7:
	case SAN_LDO8:
	case SAN_LDO9:
	case SAN_LDO14:
		status = sanremo_read(SANREMO_REG(power_module), &val);
		if (!status) {
			data = val & 0x07;
			*pmv = SANREMO_LDO2_MV(data);
		}
		break;
	case SAN_LDO2_SLEEP:
	case SAN_LDO3_SLEEP:
	case SAN_LDO4_SLEEP:
	case SAN_LDO7_SLEEP:
	case SAN_LDO8_SLEEP:
	case SAN_LDO9_SLEEP:
	case SAN_LDO14_SLEEP:
		status = sanremo_read(SANREMO_REG(power_module), &val);
		if (!status) {
			data = (val >> 3) & 0x07;
			*pmv = SANREMO_LDO2_MV(data);
		}
Example #15
0
static unsigned int sanremo_event_change(void)
{
	unsigned int ret = 0;
	u8 status1, status2, status3;
	u8 e1, e2, e3;
	u8 tmp;

	sanremo_read(SANREMO_INTERRUPT_STATUS1, &status1);
	sanremo_read(SANREMO_INTERRUPT_STATUS2, &status2);
	sanremo_read(SANREMO_INTERRUPT_STATUS3, &status3);
	sanremo_write(SANREMO_INTERRUPT_STATUS1, status1);
	sanremo_write(SANREMO_INTERRUPT_STATUS2, status2);
	sanremo_write(SANREMO_INTERRUPT_STATUS3, status3);
	sanremo_read(SANREMO_INTERRUPT_ENABLE1, &e1);
	sanremo_read(SANREMO_INTERRUPT_ENABLE2, &e2);
	sanremo_read(SANREMO_INTERRUPT_ENABLE3, &e3);

	if (status1 & SANREMO_EXTON_INT)
		ret |= PMIC_EVENT_EXTON;

	if (status1 & SANREMO_CHG_INT) {
		ret |= PMIC_EVENT_CHARGER | PMIC_EVENT_VBUS;
		sanremo_read(SANREMO_STATUS, &tmp);
		usb_connect = !!(tmp & SANREMO_CHG_STATUS);
		sanremo_start_charging();
	}

	if (status1 & SANREMO_ONKEY_INT) {
		ret |= PMIC_EVENT_ON_KEY;
		if (mod_timer(&on_key_timer, jiffies + ONKEY_TIMER_TIMEOUT)) {
			/* timer is active already */
		}
	}

	/*
	if (status2 & SANREMO_VBAT_MASK) {
		printk(KERN_INFO "Battery is low.\n");
		sanremo_start_charging();
	}
	*/

	if (status2 & SANREMO_VCHG_INT) {
		ret |= PMIC_EVENT_VBUS;
	}

	if (status2 & SANREMO_GPADC1_INT)
		ret |= PMIC_EVENT_TBAT;

	if(status3 & SANREMO_PEN_INT)
		ret |= PMIC_EVENT_TOUCH;

	if (status3 & SANREMO_HEADSET_INT)
		ret |= PMIC_EVENT_HSDETECT;

	if (status3 & SANREMO_MICIN_INT)
		ret |= PMIC_EVENT_MICDETECT;

	if (status3 & SANREMO_HOOK_INT)
		ret |= PMIC_EVENT_HOOKSWITCH;

	if (status3 & SANREMO_CHG_FAIL_INT) {
		ret |= PMIC_EVENT_CHARGER;
		if(charging_status) {
			printk("charging failed.\n");
			sanremo_stop_charging();
		}
	}
	if (status3 & SANREMO_CHG_DONE_INT) {
		ret |= PMIC_EVENT_CHARGER;
		if(charging_status) {
			printk("charging done\n");
			sanremo_stop_charging();
		}
	}
	if (status3 & SANREMO_CHG_IOVER_INT) {
		ret |= PMIC_EVENT_REV_IOVER;
		if(charging_status) {
			printk("over charging.\n");
			sanremo_stop_charging();
		}
	}

	return ret;
}
Example #16
0
static void sanremo_start_charging(void)
{
	u8 tmp;
	unsigned int val;

	/*check for battery*/
	sanremo_read(SANREMO_STATUS, &tmp);
	if(!(tmp & SANREMO_BAT_STATUS)) {
		printk(KERN_INFO "Battery is NOT detected, ignore charging\n");
		return;
	}else {
		printk(KERN_INFO "Battery is detected\n");
	}

	/*check charging*/
	sanremo_read(SANREMO_STATUS, &tmp);
	if(!(tmp & SANREMO_CHG_STATUS)) {
		printk(KERN_INFO "Charger cable is NOT detected\n");
		return;
	}else {

		printk(KERN_INFO "Charger cable is detected\n");
	}

	val = sanremo_get_vbat();

	if(val < 3850) {
		printk(KERN_INFO "Voltage is about %dmv, start charging\n", val);

		/*enable TIT and IBAT measurement*/
		sanremo_read(SANREMO_MEAS_ENABLE1, &tmp);
		sanremo_write(SANREMO_MEAS_ENABLE1, tmp|SANREMO_MEAS_EN1_TINT);
		sanremo_read(SANREMO_MEAS_ENABLE3, &tmp);
		sanremo_write(SANREMO_MEAS_ENABLE3, tmp|SANREMO_MEAS_EN3_IBAT);
		/*set a off time*/
		if (sanremo_version < 0x48) {
			sanremo_write(SANREMO_MEAS_OFF_TIME1, 0x41);
			sanremo_read(SANREMO_MEAS_OFF_TIME2, &tmp);
			sanremo_write(SANREMO_MEAS_OFF_TIME2, (tmp&0x3f)|0x6c);
		} else {
			sanremo_read(SANREMO_MEAS_ENABLE3, &tmp);
			sanremo_write(SANREMO_MEAS_ENABLE3, tmp|SANREMO_MEASOFFTIME1_BAT_DET_EN_B0);
			sanremo_write(SANREMO_MEAS_OFF_TIME1, 0x80);
			sanremo_write(SANREMO_MEAS_OFF_TIME2, (tmp&0x7f)|0xd8);
		}
		/* enable GPADC FSM */
		sanremo_read(SANREMO_GPADC_MISC1, &tmp);
		sanremo_write(SANREMO_GPADC_MISC1, tmp|SANREMO_GPADC_MISC1_GPFSM_EN);
		/*enable interrupts*/
		sanremo_read(SANREMO_INTERRUPT_ENABLE3, &tmp);
		sanremo_write(SANREMO_INTERRUPT_ENABLE3, 
				tmp|SANREMO_CHG_FAIL_MASK|SANREMO_CHG_DONE_MASK|
				SANREMO_CHG_IOVER_MASK);

		/* set pre-regulator to 1000mA & Vsys to 4.5v*/
		portofino_write(PORTOFINO_PREREG1,0x09);
		/*set the end of charge value and enable s ILIM FSM*/
		sanremo_write(SANREMO_CHG_CTRL1, 0x30); 
		/*set current limit at 550 mA*/
		sanremo_write(SANREMO_CHG_CTRL2, 0x2a); 
		/*set the max charging time to 90 min*/
		sanremo_write(SANREMO_CHG_CTRL3, 0x30); 
		/*enable monitoring*/
		sanremo_write(SANREMO_CHG_CTRL4, 0x40); 

		sanremo_write(SANREMO_GPADC0_MEAS1, 0x82); 

		charging_status = 1;
		wake_up(&charging_display_wait);

		/*enable fast charing*/
		sanremo_write(SANREMO_CHG_CTRL1, 0x32); 
		
		/*set the temperature threshold */
		sanremo_write(SANREMO_TINT_MEAS1, 0xc0); 
		sanremo_write(SANREMO_TINT_MEAS2, 0x82); 
		sanremo_write(SANREMO_GPADC0_MEAS1, 0x7d); 
	}
}