You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge tag 'v4.8-rc6' into devel
Linux 4.8-rc6
This commit is contained in:
@@ -301,7 +301,7 @@ static int rpm_idle(struct device *dev, int rpmflags)
|
||||
int (*callback)(struct device *);
|
||||
int retval;
|
||||
|
||||
trace_rpm_idle(dev, rpmflags);
|
||||
trace_rpm_idle_rcuidle(dev, rpmflags);
|
||||
retval = rpm_check_suspend_allowed(dev);
|
||||
if (retval < 0)
|
||||
; /* Conditions are wrong. */
|
||||
@@ -337,7 +337,7 @@ static int rpm_idle(struct device *dev, int rpmflags)
|
||||
dev->power.request_pending = true;
|
||||
queue_work(pm_wq, &dev->power.work);
|
||||
}
|
||||
trace_rpm_return_int(dev, _THIS_IP_, 0);
|
||||
trace_rpm_return_int_rcuidle(dev, _THIS_IP_, 0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -352,7 +352,7 @@ static int rpm_idle(struct device *dev, int rpmflags)
|
||||
wake_up_all(&dev->power.wait_queue);
|
||||
|
||||
out:
|
||||
trace_rpm_return_int(dev, _THIS_IP_, retval);
|
||||
trace_rpm_return_int_rcuidle(dev, _THIS_IP_, retval);
|
||||
return retval ? retval : rpm_suspend(dev, rpmflags | RPM_AUTO);
|
||||
}
|
||||
|
||||
@@ -601,7 +601,7 @@ static int rpm_resume(struct device *dev, int rpmflags)
|
||||
struct device *parent = NULL;
|
||||
int retval = 0;
|
||||
|
||||
trace_rpm_resume(dev, rpmflags);
|
||||
trace_rpm_resume_rcuidle(dev, rpmflags);
|
||||
|
||||
repeat:
|
||||
if (dev->power.runtime_error)
|
||||
@@ -764,7 +764,7 @@ static int rpm_resume(struct device *dev, int rpmflags)
|
||||
spin_lock_irq(&dev->power.lock);
|
||||
}
|
||||
|
||||
trace_rpm_return_int(dev, _THIS_IP_, retval);
|
||||
trace_rpm_return_int_rcuidle(dev, _THIS_IP_, retval);
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
@@ -404,6 +404,7 @@ static int regcache_rbtree_write(struct regmap *map, unsigned int reg,
|
||||
unsigned int new_base_reg, new_top_reg;
|
||||
unsigned int min, max;
|
||||
unsigned int max_dist;
|
||||
unsigned int dist, best_dist = UINT_MAX;
|
||||
|
||||
max_dist = map->reg_stride * sizeof(*rbnode_tmp) /
|
||||
map->cache_word_size;
|
||||
@@ -423,24 +424,41 @@ static int regcache_rbtree_write(struct regmap *map, unsigned int reg,
|
||||
&base_reg, &top_reg);
|
||||
|
||||
if (base_reg <= max && top_reg >= min) {
|
||||
new_base_reg = min(reg, base_reg);
|
||||
new_top_reg = max(reg, top_reg);
|
||||
} else {
|
||||
if (max < base_reg)
|
||||
node = node->rb_left;
|
||||
if (reg < base_reg)
|
||||
dist = base_reg - reg;
|
||||
else if (reg > top_reg)
|
||||
dist = reg - top_reg;
|
||||
else
|
||||
node = node->rb_right;
|
||||
|
||||
continue;
|
||||
dist = 0;
|
||||
if (dist < best_dist) {
|
||||
rbnode = rbnode_tmp;
|
||||
best_dist = dist;
|
||||
new_base_reg = min(reg, base_reg);
|
||||
new_top_reg = max(reg, top_reg);
|
||||
}
|
||||
}
|
||||
|
||||
ret = regcache_rbtree_insert_to_block(map, rbnode_tmp,
|
||||
/*
|
||||
* Keep looking, we want to choose the closest block,
|
||||
* otherwise we might end up creating overlapping
|
||||
* blocks, which breaks the rbtree.
|
||||
*/
|
||||
if (reg < base_reg)
|
||||
node = node->rb_left;
|
||||
else if (reg > top_reg)
|
||||
node = node->rb_right;
|
||||
else
|
||||
break;
|
||||
}
|
||||
|
||||
if (rbnode) {
|
||||
ret = regcache_rbtree_insert_to_block(map, rbnode,
|
||||
new_base_reg,
|
||||
new_top_reg, reg,
|
||||
value);
|
||||
if (ret)
|
||||
return ret;
|
||||
rbtree_ctx->cached_rbnode = rbnode_tmp;
|
||||
rbtree_ctx->cached_rbnode = rbnode;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -38,10 +38,11 @@ static int regcache_hw_init(struct regmap *map)
|
||||
|
||||
/* calculate the size of reg_defaults */
|
||||
for (count = 0, i = 0; i < map->num_reg_defaults_raw; i++)
|
||||
if (!regmap_volatile(map, i * map->reg_stride))
|
||||
if (regmap_readable(map, i * map->reg_stride) &&
|
||||
!regmap_volatile(map, i * map->reg_stride))
|
||||
count++;
|
||||
|
||||
/* all registers are volatile, so just bypass */
|
||||
/* all registers are unreadable or volatile, so just bypass */
|
||||
if (!count) {
|
||||
map->cache_bypass = true;
|
||||
return 0;
|
||||
|
||||
@@ -1474,6 +1474,8 @@ int _regmap_raw_write(struct regmap *map, unsigned int reg,
|
||||
ret = map->bus->write(map->bus_context, buf, len);
|
||||
|
||||
kfree(buf);
|
||||
} else if (ret != 0 && !map->cache_bypass && map->format.parse_val) {
|
||||
regcache_drop_region(map, reg, reg + 1);
|
||||
}
|
||||
|
||||
trace_regmap_hw_write_done(map, reg, val_len / map->format.val_bytes);
|
||||
|
||||
Reference in New Issue
Block a user