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); }
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; } }
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; }
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); }
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); }