示例#1
0
static int bq51221_chg_set_property(struct power_supply *psy,
		enum power_supply_property psp,
		const union power_supply_propval *val)
{
	struct bq51221_charger_data *charger =
		container_of(psy, struct bq51221_charger_data, psy_chg);

	switch (psp) {
		case POWER_SUPPLY_PROP_STATUS:
			if(val->intval == POWER_SUPPLY_STATUS_FULL) {
				charger->pdata->cs100_status = bq51221_set_full_charge_info(charger->client);
				pr_info("%s charger->pdata->cs100_status %d \n",__func__,charger->pdata->cs100_status);
			}
			break;
		case POWER_SUPPLY_PROP_CHARGE_TYPE:
		break;
		case POWER_SUPPLY_PROP_HEALTH:
			if(val->intval == POWER_SUPPLY_HEALTH_OVERHEAT || POWER_SUPPLY_HEALTH_OVERHEATLIMIT) {
				bq51221_set_over_temperuture_info(charger->client);
			}
		break;
		case POWER_SUPPLY_PROP_ONLINE:
			if(val->intval == POWER_SUPPLY_TYPE_WIRELESS) {
				charger->pdata->pad_mode = BQ51221_PAD_MODE_WPC;
				queue_delayed_work(charger->wqueue, &charger->wpc_work,
					msecs_to_jiffies(5000));
				wake_lock_timeout(&charger->wpc_wake_lock, HZ * 6);
			} else if(val->intval == POWER_SUPPLY_TYPE_BATTERY) {
				charger->pdata->pad_mode = BQ51221_PAD_MODE_NONE;
				cancel_delayed_work(&charger->wpc_work);
			}
			break;
		default:
			return -EINVAL;
	}

	return 0;
}
static int bq51221_chg_set_property(struct power_supply *psy,
		enum power_supply_property psp,
		const union power_supply_propval *val)
{
	struct bq51221_charger_data *charger =
		container_of(psy, struct bq51221_charger_data, psy_chg);
	union power_supply_propval value;

	switch (psp) {
		case POWER_SUPPLY_PROP_STATUS:
			if(val->intval == POWER_SUPPLY_STATUS_FULL) {
				charger->pdata->cs100_status = bq51221_set_full_charge_info(charger->client);
				pr_info("%s charger->pdata->cs100_status %d \n",__func__,charger->pdata->cs100_status);
			}
			break;
		case POWER_SUPPLY_PROP_CHARGE_TYPE:
			if (!charger->pdata->default_voreg &&
				!delayed_work_pending(&charger->wpc_work))
				bq51221_set_voreg(charger->client, val->intval);
			break;
		case POWER_SUPPLY_PROP_HEALTH:
			if(val->intval == POWER_SUPPLY_HEALTH_OVERHEAT ||
				val->intval == POWER_SUPPLY_HEALTH_OVERHEATLIMIT ||
				val->intval == POWER_SUPPLY_HEALTH_COLD)
				bq51221_set_end_power_transfer(charger->client, END_POWER_TRANSFER_CODE_OVER_TEMPERATURE);
			else if(val->intval == POWER_SUPPLY_HEALTH_UNDERVOLTAGE)
				bq51221_set_end_power_transfer(charger->client, END_POWER_TRANSFER_CODE_RECONFIGURE);
			break;
		case POWER_SUPPLY_PROP_ONLINE:
			if(val->intval == POWER_SUPPLY_TYPE_WIRELESS) {
				charger->pdata->pad_mode = BQ51221_PAD_MODE_WPC;
				queue_delayed_work(charger->wqueue, &charger->wpc_work,
					msecs_to_jiffies(5000));
				wake_lock_timeout(&charger->wpc_wake_lock, HZ * 6);
			} else if(val->intval == POWER_SUPPLY_TYPE_BATTERY) {
				bq51221_set_voreg(charger->client, 1);
				charger->pdata->pad_mode = BQ51221_PAD_MODE_NONE;
				cancel_delayed_work(&charger->wpc_work);
			}
			break;
		case POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN:
			charger->pdata->siop_level = val->intval;
			pr_info("%s siop = %d \n",__func__, charger->pdata->siop_level);
			break;
		case POWER_SUPPLY_PROP_CHARGE_OTG_CONTROL:
			if (val->intval) {
				charger->pdata->default_voreg = true;
				bq51221_set_voreg(charger->client, val->intval);
			} else {
				charger->pdata->default_voreg = false;
				psy_do_property("battery", get,
						POWER_SUPPLY_PROP_STATUS, value);
				if ((value.intval == POWER_SUPPLY_STATUS_CHARGING) &&
					(charger->pdata->pad_mode == BQ51221_PAD_MODE_WPC)) {
					queue_delayed_work(charger->wqueue, &charger->wpc_work,
						msecs_to_jiffies(5000));
					wake_lock_timeout(&charger->wpc_wake_lock, HZ * 6);
				}
			}
			break;
		default:
			return -EINVAL;
	}

	return 0;
}