Пример #1
0
static void
pcf50633_mbc_irq_handler(int irq, void *data)
{
	struct pcf50633_mbc *mbc = data;

	/* USB */
	if (irq == PCF50633_IRQ_USBINS) {
		mbc->usb_online = 1;
	} else if (irq == PCF50633_IRQ_USBREM) {
		mbc->usb_online = 0;
		pcf50633_mbc_usb_curlim_set(mbc->pcf, 0);
	}

	/* Adapter */
	if (irq == PCF50633_IRQ_ADPINS)
		mbc->adapter_online = 1;
	else if (irq == PCF50633_IRQ_ADPREM)
		mbc->adapter_online = 0;

	power_supply_changed(mbc->ac);
	power_supply_changed(mbc->usb);
	power_supply_changed(mbc->adapter);

	if (mbc->pcf->pdata->mbc_event_callback)
		mbc->pcf->pdata->mbc_event_callback(mbc->pcf, irq);
}
Пример #2
0
static void gta02_charger_worker(struct work_struct *work)
{
	struct pcf50633 *pcf = gta02_pcf;

	if (gta02_usb_vbus_draw) {
		pcf50633_mbc_usb_curlim_set(pcf, gta02_usb_vbus_draw);
		return;
	} else {
#ifdef CONFIG_PCF50633_ADC
		pcf50633_adc_async_read(pcf,
			PCF50633_ADCC1_MUX_ADCIN1,
			PCF50633_ADCC1_AVERAGE_16,
			gta02_configure_pmu_for_charger, NULL);
#else
		/* If the PCF50633 ADC is disabled we fallback to a 100mA limit for safety. */
		pcf50633_mbc_usb_curlim_set(pcf, 100);
#endif
		return;
	}
}
Пример #3
0
static ssize_t set_usblim(struct device *dev,
		struct device_attribute *attr, const char *buf, size_t count)
{
	struct pcf50633_mbc *mbc = dev_get_drvdata(dev);
	unsigned long ma;
	int ret;

	ret = strict_strtoul(buf, 10, &ma);
	if (ret)
		return -EINVAL;

	pcf50633_mbc_usb_curlim_set(mbc->pcf, ma);

	return count;
}
Пример #4
0
static void
gta02_configure_pmu_for_charger(struct pcf50633 *pcf, void *unused, int res)
{
	int  ma;

	/* Interpret charger type */
	if (res < ((ADC_NOM_CHG_DETECT_USB + ADC_NOM_CHG_DETECT_1A) / 2)) {

		/* Stop GPO driving out now that we have a IA charger */
		pcf50633_gpio_set(pcf, PCF50633_GPO, 0);

		ma = 1000;
	} else
		ma = 100;

	pcf50633_mbc_usb_curlim_set(pcf, ma);
}
Пример #5
0
static void
pcf50633_mbc_irq_handler(int irq, void *data)
{
	struct pcf50633_mbc *mbc = data;
	int chg_restart_interval =
			mbc->pcf->pdata->charging_restart_interval;

	
	if (irq == PCF50633_IRQ_USBINS) {
		mbc->usb_online = 1;
	} else if (irq == PCF50633_IRQ_USBREM) {
		mbc->usb_online = 0;
		mbc->usb_active = 0;
		pcf50633_mbc_usb_curlim_set(mbc->pcf, 0);
		cancel_delayed_work_sync(&mbc->charging_restart_work);
	}

	
	if (irq == PCF50633_IRQ_ADPINS) {
		mbc->adapter_online = 1;
		mbc->adapter_active = 1;
	} else if (irq == PCF50633_IRQ_ADPREM) {
		mbc->adapter_online = 0;
		mbc->adapter_active = 0;
	}

	if (irq == PCF50633_IRQ_BATFULL) {
		mbc->usb_active = 0;
		mbc->adapter_active = 0;

		if (chg_restart_interval > 0)
			schedule_delayed_work(&mbc->charging_restart_work,
							chg_restart_interval);
	} else if (irq == PCF50633_IRQ_USBLIMON)
		mbc->usb_active = 0;
	else if (irq == PCF50633_IRQ_USBLIMOFF)
		mbc->usb_active = 1;

	power_supply_changed(&mbc->usb);
	power_supply_changed(&mbc->adapter);

	if (mbc->pcf->pdata->mbc_event_callback)
		mbc->pcf->pdata->mbc_event_callback(mbc->pcf, irq);
}