Merge remote-tracking branches 'regmap/topic/bulk', 'regmap/topic/i2c', 'regmap/topic/iopoll', 'regmap/topic/irq' and 'regmap/topic/maintainers' into regmap-next
This commit is contained in:
@@ -259,7 +259,7 @@ static const struct regmap_bus *regmap_get_i2c_bus(struct i2c_client *i2c,
|
||||
{
|
||||
if (i2c_check_functionality(i2c->adapter, I2C_FUNC_I2C))
|
||||
return ®map_i2c;
|
||||
else if (config->reg_bits == 8 &&
|
||||
else if (config->val_bits == 8 && config->reg_bits == 8 &&
|
||||
i2c_check_functionality(i2c->adapter,
|
||||
I2C_FUNC_SMBUS_I2C_BLOCK))
|
||||
return ®map_i2c_smbus_i2c_block;
|
||||
|
@@ -268,13 +268,16 @@ static irqreturn_t regmap_irq_thread(int irq, void *d)
|
||||
bool handled = false;
|
||||
u32 reg;
|
||||
|
||||
if (chip->handle_pre_irq)
|
||||
chip->handle_pre_irq(chip->irq_drv_data);
|
||||
|
||||
if (chip->runtime_pm) {
|
||||
ret = pm_runtime_get_sync(map->dev);
|
||||
if (ret < 0) {
|
||||
dev_err(map->dev, "IRQ thread failed to resume: %d\n",
|
||||
ret);
|
||||
pm_runtime_put(map->dev);
|
||||
return IRQ_NONE;
|
||||
goto exit;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -296,7 +299,7 @@ static irqreturn_t regmap_irq_thread(int irq, void *d)
|
||||
if (ret != 0) {
|
||||
dev_err(map->dev, "Failed to read IRQ status: %d\n",
|
||||
ret);
|
||||
return IRQ_NONE;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
for (i = 0; i < data->chip->num_regs; i++) {
|
||||
@@ -312,7 +315,7 @@ static irqreturn_t regmap_irq_thread(int irq, void *d)
|
||||
break;
|
||||
default:
|
||||
BUG();
|
||||
return IRQ_NONE;
|
||||
goto exit;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -329,7 +332,7 @@ static irqreturn_t regmap_irq_thread(int irq, void *d)
|
||||
ret);
|
||||
if (chip->runtime_pm)
|
||||
pm_runtime_put(map->dev);
|
||||
return IRQ_NONE;
|
||||
goto exit;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -365,6 +368,10 @@ static irqreturn_t regmap_irq_thread(int irq, void *d)
|
||||
if (chip->runtime_pm)
|
||||
pm_runtime_put(map->dev);
|
||||
|
||||
exit:
|
||||
if (chip->handle_post_irq)
|
||||
chip->handle_post_irq(chip->irq_drv_data);
|
||||
|
||||
if (handled)
|
||||
return IRQ_HANDLED;
|
||||
else
|
||||
|
@@ -1777,8 +1777,6 @@ int regmap_bulk_write(struct regmap *map, unsigned int reg, const void *val,
|
||||
size_t val_bytes = map->format.val_bytes;
|
||||
size_t total_size = val_bytes * val_count;
|
||||
|
||||
if (map->bus && !map->format.parse_inplace)
|
||||
return -EINVAL;
|
||||
if (!IS_ALIGNED(reg, map->reg_stride))
|
||||
return -EINVAL;
|
||||
|
||||
@@ -1789,7 +1787,8 @@ int regmap_bulk_write(struct regmap *map, unsigned int reg, const void *val,
|
||||
*
|
||||
* The first if block is used for memory mapped io. It does not allow
|
||||
* val_bytes of 3 for example.
|
||||
* The second one is used for busses which do not have this limitation
|
||||
* The second one is for busses that do not provide raw I/O.
|
||||
* The third one is used for busses which do not have these limitations
|
||||
* and can write arbitrary value lengths.
|
||||
*/
|
||||
if (!map->bus) {
|
||||
@@ -1825,6 +1824,32 @@ int regmap_bulk_write(struct regmap *map, unsigned int reg, const void *val,
|
||||
}
|
||||
out:
|
||||
map->unlock(map->lock_arg);
|
||||
} else if (map->bus && !map->format.parse_inplace) {
|
||||
const u8 *u8 = val;
|
||||
const u16 *u16 = val;
|
||||
const u32 *u32 = val;
|
||||
unsigned int ival;
|
||||
|
||||
for (i = 0; i < val_count; i++) {
|
||||
switch (map->format.val_bytes) {
|
||||
case 4:
|
||||
ival = u32[i];
|
||||
break;
|
||||
case 2:
|
||||
ival = u16[i];
|
||||
break;
|
||||
case 1:
|
||||
ival = u8[i];
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
ret = regmap_write(map, reg + (i * map->reg_stride),
|
||||
ival);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
} else if (map->use_single_write ||
|
||||
(map->max_raw_write && map->max_raw_write < total_size)) {
|
||||
int chunk_stride = map->reg_stride;
|
||||
|
Reference in New Issue
Block a user