Commit 5198a483 authored by Sebastian Reichel's avatar Sebastian Reichel

Merge branch 'psy-fixes' into psy-next

Signed-off-by: default avatarSebastian Reichel <sre@kernel.org>
parents 3d779180 cc44ba91
...@@ -130,7 +130,17 @@ static int gemini_poweroff_probe(struct platform_device *pdev) ...@@ -130,7 +130,17 @@ static int gemini_poweroff_probe(struct platform_device *pdev)
val |= GEMINI_CTRL_ENABLE; val |= GEMINI_CTRL_ENABLE;
writel(val, gpw->base + GEMINI_PWC_CTRLREG); writel(val, gpw->base + GEMINI_PWC_CTRLREG);
/* Now that the state machine is active, clear the IRQ */ /* Clear the IRQ */
val = readl(gpw->base + GEMINI_PWC_CTRLREG);
val |= GEMINI_CTRL_IRQ_CLR;
writel(val, gpw->base + GEMINI_PWC_CTRLREG);
/* Wait for this to clear */
val = readl(gpw->base + GEMINI_PWC_STATREG);
while (val & 0x70U)
val = readl(gpw->base + GEMINI_PWC_STATREG);
/* Clear the IRQ again */
val = readl(gpw->base + GEMINI_PWC_CTRLREG); val = readl(gpw->base + GEMINI_PWC_CTRLREG);
val |= GEMINI_CTRL_IRQ_CLR; val |= GEMINI_CTRL_IRQ_CLR;
writel(val, gpw->base + GEMINI_PWC_CTRLREG); writel(val, gpw->base + GEMINI_PWC_CTRLREG);
......
...@@ -35,6 +35,7 @@ static void vexpress_reset_do(struct device *dev, const char *what) ...@@ -35,6 +35,7 @@ static void vexpress_reset_do(struct device *dev, const char *what)
} }
static struct device *vexpress_power_off_device; static struct device *vexpress_power_off_device;
static atomic_t vexpress_restart_nb_refcnt = ATOMIC_INIT(0);
static void vexpress_power_off(void) static void vexpress_power_off(void)
{ {
...@@ -99,11 +100,14 @@ static int _vexpress_register_restart_handler(struct device *dev) ...@@ -99,11 +100,14 @@ static int _vexpress_register_restart_handler(struct device *dev)
int err; int err;
vexpress_restart_device = dev; vexpress_restart_device = dev;
if (atomic_inc_return(&vexpress_restart_nb_refcnt) == 1) {
err = register_restart_handler(&vexpress_restart_nb); err = register_restart_handler(&vexpress_restart_nb);
if (err) { if (err) {
dev_err(dev, "cannot register restart handler (err=%d)\n", err); dev_err(dev, "cannot register restart handler (err=%d)\n", err);
atomic_dec(&vexpress_restart_nb_refcnt);
return err; return err;
} }
}
device_create_file(dev, &dev_attr_active); device_create_file(dev, &dev_attr_active);
return 0; return 0;
......
...@@ -718,7 +718,7 @@ static int charger_init_hw_regs(struct axp288_chrg_info *info) ...@@ -718,7 +718,7 @@ static int charger_init_hw_regs(struct axp288_chrg_info *info)
} }
/* Determine charge current limit */ /* Determine charge current limit */
cc = (ret & CHRG_CCCV_CC_MASK) >> CHRG_CCCV_CC_BIT_POS; cc = (val & CHRG_CCCV_CC_MASK) >> CHRG_CCCV_CC_BIT_POS;
cc = (cc * CHRG_CCCV_CC_LSB_RES) + CHRG_CCCV_CC_OFFSET; cc = (cc * CHRG_CCCV_CC_LSB_RES) + CHRG_CCCV_CC_OFFSET;
info->cc = cc; info->cc = cc;
......
...@@ -241,10 +241,10 @@ static int gab_probe(struct platform_device *pdev) ...@@ -241,10 +241,10 @@ static int gab_probe(struct platform_device *pdev)
struct power_supply_desc *psy_desc; struct power_supply_desc *psy_desc;
struct power_supply_config psy_cfg = {}; struct power_supply_config psy_cfg = {};
struct gab_platform_data *pdata = pdev->dev.platform_data; struct gab_platform_data *pdata = pdev->dev.platform_data;
enum power_supply_property *properties;
int ret = 0; int ret = 0;
int chan; int chan;
int index = 0; int index = ARRAY_SIZE(gab_props);
bool any = false;
adc_bat = devm_kzalloc(&pdev->dev, sizeof(*adc_bat), GFP_KERNEL); adc_bat = devm_kzalloc(&pdev->dev, sizeof(*adc_bat), GFP_KERNEL);
if (!adc_bat) { if (!adc_bat) {
...@@ -278,8 +278,6 @@ static int gab_probe(struct platform_device *pdev) ...@@ -278,8 +278,6 @@ static int gab_probe(struct platform_device *pdev)
} }
memcpy(psy_desc->properties, gab_props, sizeof(gab_props)); memcpy(psy_desc->properties, gab_props, sizeof(gab_props));
properties = (enum power_supply_property *)
((char *)psy_desc->properties + sizeof(gab_props));
/* /*
* getting channel from iio and copying the battery properties * getting channel from iio and copying the battery properties
...@@ -293,15 +291,22 @@ static int gab_probe(struct platform_device *pdev) ...@@ -293,15 +291,22 @@ static int gab_probe(struct platform_device *pdev)
adc_bat->channel[chan] = NULL; adc_bat->channel[chan] = NULL;
} else { } else {
/* copying properties for supported channels only */ /* copying properties for supported channels only */
memcpy(properties + sizeof(*(psy_desc->properties)) * index, int index2;
&gab_dyn_props[chan],
sizeof(gab_dyn_props[chan])); for (index2 = 0; index2 < index; index2++) {
index++; if (psy_desc->properties[index2] ==
gab_dyn_props[chan])
break; /* already known */
}
if (index2 == index) /* really new */
psy_desc->properties[index++] =
gab_dyn_props[chan];
any = true;
} }
} }
/* none of the channels are supported so let's bail out */ /* none of the channels are supported so let's bail out */
if (index == 0) { if (!any) {
ret = -ENODEV; ret = -ENODEV;
goto second_mem_fail; goto second_mem_fail;
} }
...@@ -312,7 +317,7 @@ static int gab_probe(struct platform_device *pdev) ...@@ -312,7 +317,7 @@ static int gab_probe(struct platform_device *pdev)
* as come channels may be not be supported by the device.So * as come channels may be not be supported by the device.So
* we need to take care of that. * we need to take care of that.
*/ */
psy_desc->num_properties = ARRAY_SIZE(gab_props) + index; psy_desc->num_properties = index;
adc_bat->psy = power_supply_register(&pdev->dev, psy_desc, &psy_cfg); adc_bat->psy = power_supply_register(&pdev->dev, psy_desc, &psy_cfg);
if (IS_ERR(adc_bat->psy)) { if (IS_ERR(adc_bat->psy)) {
......
...@@ -567,6 +567,7 @@ static int max77693_set_charge_input_threshold_volt(struct max77693_charger *chg ...@@ -567,6 +567,7 @@ static int max77693_set_charge_input_threshold_volt(struct max77693_charger *chg
case 4800000: case 4800000:
case 4900000: case 4900000:
data = (uvolt - 4700000) / 100000; data = (uvolt - 4700000) / 100000;
break;
default: default:
dev_err(chg->dev, "Wrong value for charge input voltage regulation threshold\n"); dev_err(chg->dev, "Wrong value for charge input voltage regulation threshold\n");
return -EINVAL; return -EINVAL;
......
...@@ -14,6 +14,7 @@ ...@@ -14,6 +14,7 @@
#include <linux/types.h> #include <linux/types.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/delay.h>
#include <linux/device.h> #include <linux/device.h>
#include <linux/notifier.h> #include <linux/notifier.h>
#include <linux/err.h> #include <linux/err.h>
...@@ -140,8 +141,13 @@ static void power_supply_deferred_register_work(struct work_struct *work) ...@@ -140,8 +141,13 @@ static void power_supply_deferred_register_work(struct work_struct *work)
struct power_supply *psy = container_of(work, struct power_supply, struct power_supply *psy = container_of(work, struct power_supply,
deferred_register_work.work); deferred_register_work.work);
if (psy->dev.parent) if (psy->dev.parent) {
mutex_lock(&psy->dev.parent->mutex); while (!mutex_trylock(&psy->dev.parent->mutex)) {
if (psy->removing)
return;
msleep(10);
}
}
power_supply_changed(psy); power_supply_changed(psy);
...@@ -1082,6 +1088,7 @@ EXPORT_SYMBOL_GPL(devm_power_supply_register_no_ws); ...@@ -1082,6 +1088,7 @@ EXPORT_SYMBOL_GPL(devm_power_supply_register_no_ws);
void power_supply_unregister(struct power_supply *psy) void power_supply_unregister(struct power_supply *psy)
{ {
WARN_ON(atomic_dec_return(&psy->use_cnt)); WARN_ON(atomic_dec_return(&psy->use_cnt));
psy->removing = true;
cancel_work_sync(&psy->changed_work); cancel_work_sync(&psy->changed_work);
cancel_delayed_work_sync(&psy->deferred_register_work); cancel_delayed_work_sync(&psy->deferred_register_work);
sysfs_remove_link(&psy->dev.kobj, "powers"); sysfs_remove_link(&psy->dev.kobj, "powers");
......
...@@ -269,6 +269,7 @@ struct power_supply { ...@@ -269,6 +269,7 @@ struct power_supply {
spinlock_t changed_lock; spinlock_t changed_lock;
bool changed; bool changed;
bool initialized; bool initialized;
bool removing;
atomic_t use_cnt; atomic_t use_cnt;
#ifdef CONFIG_THERMAL #ifdef CONFIG_THERMAL
struct thermal_zone_device *tzd; struct thermal_zone_device *tzd;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment