static int smb347_mains_set_property(struct power_supply *psy, enum power_supply_property prop, const union power_supply_propval *val) { struct smb347_charger *smb = container_of(psy, struct smb347_charger, mains); int ret; bool oldval; switch (prop) { case POWER_SUPPLY_PROP_ONLINE: oldval = smb->mains_online; smb->mains_online = val->intval; smb347_set_writable(smb, true); ret = smb347_read(smb, CMD_A); if (ret < 0) return -EINVAL; ret &= ~CMD_A_SUSPEND_ENABLED; if (val->intval) ret |= CMD_A_SUSPEND_ENABLED; ret = smb347_write(smb, CMD_A, ret); smb347_hw_init(smb); smb347_set_writable(smb, false); if (smb->mains_online != oldval) power_supply_changed(psy); return 0; case POWER_SUPPLY_PROP_CURRENT_MAX: smb->mains_current_limit = val->intval; smb347_hw_init(smb); return 0; default: return -EINVAL; } return -EINVAL; }
static int smb347_mains_set_property(struct power_supply *psy, enum power_supply_property prop, const union power_supply_propval *val) { struct smb347_charger *smb = container_of(psy, struct smb347_charger, mains); switch (prop) { case POWER_SUPPLY_PROP_CURRENT_MAX: smb->mains_current_limit = val->intval; smb347_hw_init(smb); return 0; default: return -EINVAL; } return -EINVAL; }
static int smb347_probe(struct i2c_client *client, const struct i2c_device_id *id) { static char *battery[] = { "smb347-battery" }; const struct smb347_charger_platform_data *pdata; struct device *dev = &client->dev; struct smb347_charger *smb; int ret; pdata = dev->platform_data; if (!pdata) return -EINVAL; if (!pdata->use_mains && !pdata->use_usb) return -EINVAL; smb = devm_kzalloc(dev, sizeof(*smb), GFP_KERNEL); if (!smb) return -ENOMEM; i2c_set_clientdata(client, smb); mutex_init(&smb->lock); smb->client = client; smb->pdata = pdata; smb->mains_current_limit = smb->pdata->mains_current_limit; ret = smb347_hw_init(smb); if (ret < 0) return ret; smb->mains.name = "smb347-mains"; smb->mains.type = POWER_SUPPLY_TYPE_MAINS; smb->mains.get_property = smb347_mains_get_property; smb->mains.set_property = smb347_mains_set_property; smb->mains.property_is_writeable = smb347_mains_property_is_writeable; smb->mains.properties = smb347_mains_properties; smb->mains.num_properties = ARRAY_SIZE(smb347_mains_properties); smb->mains.supplied_to = battery; smb->mains.num_supplicants = ARRAY_SIZE(battery); smb->usb.name = "smb347-usb"; smb->usb.type = POWER_SUPPLY_TYPE_USB; smb->usb.get_property = smb347_usb_get_property; smb->usb.set_property = smb347_usb_set_property; smb->usb.property_is_writeable = smb347_usb_property_is_writeable; smb->usb.properties = smb347_usb_properties; smb->usb.num_properties = ARRAY_SIZE(smb347_usb_properties); smb->usb.supplied_to = battery; smb->usb.num_supplicants = ARRAY_SIZE(battery); smb->battery.name = "smb347-battery"; smb->battery.type = POWER_SUPPLY_TYPE_BATTERY; smb->battery.get_property = smb347_battery_get_property; smb->battery.properties = smb347_battery_properties; smb->battery.num_properties = ARRAY_SIZE(smb347_battery_properties); if (smb->pdata->supplied_to) { smb->battery.supplied_to = smb->pdata->supplied_to; smb->battery.num_supplicants = smb->pdata->num_supplicants; smb->battery.external_power_changed = power_supply_changed; } ret = power_supply_register(dev, &smb->mains); if (ret < 0) return ret; ret = power_supply_register(dev, &smb->usb); if (ret < 0) { power_supply_unregister(&smb->mains); return ret; } ret = power_supply_register(dev, &smb->battery); if (ret < 0) { power_supply_unregister(&smb->usb); power_supply_unregister(&smb->mains); return ret; } /* * Interrupt pin is optional. If it is connected, we setup the * interrupt support here. */ if (pdata->irq_gpio >= 0) { ret = smb347_irq_init(smb); if (ret < 0) { dev_warn(dev, "failed to initialize IRQ: %d\n", ret); dev_warn(dev, "disabling IRQ support\n"); } } smb->dentry = debugfs_create_file("smb347-regs", S_IRUSR, NULL, smb, &smb347_debugfs_fops); return 0; }