diff options
author | Mark Brown <broonie@linaro.org> | 2013-10-24 06:24:11 -0400 |
---|---|---|
committer | Mark Brown <broonie@linaro.org> | 2013-10-24 06:24:11 -0400 |
commit | 5b2ad46d6eb69a7910a02ce32e977b48897b1ff4 (patch) | |
tree | db1f83dd08c939398706639fd3767a3421100b2b /drivers | |
parent | c0840b272839eabe7bf23b82d235cfd22d3417a9 (diff) | |
parent | 92eba04e4bcd469518cc759ac1bf1a49acaa5cc1 (diff) |
Merge remote-tracking branch 'asoc/topic/rcar' into asoc-next
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/base/regmap/internal.h | 3 | ||||
-rw-r--r-- | drivers/base/regmap/regmap.c | 103 |
2 files changed, 106 insertions, 0 deletions
diff --git a/drivers/base/regmap/internal.h b/drivers/base/regmap/internal.h index 6873b4ce03f9..33414b1de201 100644 --- a/drivers/base/regmap/internal.h +++ b/drivers/base/regmap/internal.h | |||
@@ -180,6 +180,9 @@ struct regmap_field { | |||
180 | /* lsb */ | 180 | /* lsb */ |
181 | unsigned int shift; | 181 | unsigned int shift; |
182 | unsigned int reg; | 182 | unsigned int reg; |
183 | |||
184 | unsigned int id_size; | ||
185 | unsigned int id_offset; | ||
183 | }; | 186 | }; |
184 | 187 | ||
185 | #ifdef CONFIG_DEBUG_FS | 188 | #ifdef CONFIG_DEBUG_FS |
diff --git a/drivers/base/regmap/regmap.c b/drivers/base/regmap/regmap.c index 0503d868ff8c..ccdac61ac5e2 100644 --- a/drivers/base/regmap/regmap.c +++ b/drivers/base/regmap/regmap.c | |||
@@ -813,6 +813,8 @@ static void regmap_field_init(struct regmap_field *rm_field, | |||
813 | rm_field->reg = reg_field.reg; | 813 | rm_field->reg = reg_field.reg; |
814 | rm_field->shift = reg_field.lsb; | 814 | rm_field->shift = reg_field.lsb; |
815 | rm_field->mask = ((BIT(field_bits) - 1) << reg_field.lsb); | 815 | rm_field->mask = ((BIT(field_bits) - 1) << reg_field.lsb); |
816 | rm_field->id_size = reg_field.id_size; | ||
817 | rm_field->id_offset = reg_field.id_offset; | ||
816 | } | 818 | } |
817 | 819 | ||
818 | /** | 820 | /** |
@@ -1420,6 +1422,74 @@ int regmap_field_write(struct regmap_field *field, unsigned int val) | |||
1420 | } | 1422 | } |
1421 | EXPORT_SYMBOL_GPL(regmap_field_write); | 1423 | EXPORT_SYMBOL_GPL(regmap_field_write); |
1422 | 1424 | ||
1425 | /** | ||
1426 | * regmap_field_update_bits(): Perform a read/modify/write cycle | ||
1427 | * on the register field | ||
1428 | * | ||
1429 | * @field: Register field to write to | ||
1430 | * @mask: Bitmask to change | ||
1431 | * @val: Value to be written | ||
1432 | * | ||
1433 | * A value of zero will be returned on success, a negative errno will | ||
1434 | * be returned in error cases. | ||
1435 | */ | ||
1436 | int regmap_field_update_bits(struct regmap_field *field, unsigned int mask, unsigned int val) | ||
1437 | { | ||
1438 | mask = (mask << field->shift) & field->mask; | ||
1439 | |||
1440 | return regmap_update_bits(field->regmap, field->reg, | ||
1441 | mask, val << field->shift); | ||
1442 | } | ||
1443 | EXPORT_SYMBOL_GPL(regmap_field_update_bits); | ||
1444 | |||
1445 | /** | ||
1446 | * regmap_fields_write(): Write a value to a single register field with port ID | ||
1447 | * | ||
1448 | * @field: Register field to write to | ||
1449 | * @id: port ID | ||
1450 | * @val: Value to be written | ||
1451 | * | ||
1452 | * A value of zero will be returned on success, a negative errno will | ||
1453 | * be returned in error cases. | ||
1454 | */ | ||
1455 | int regmap_fields_write(struct regmap_field *field, unsigned int id, | ||
1456 | unsigned int val) | ||
1457 | { | ||
1458 | if (id >= field->id_size) | ||
1459 | return -EINVAL; | ||
1460 | |||
1461 | return regmap_update_bits(field->regmap, | ||
1462 | field->reg + (field->id_offset * id), | ||
1463 | field->mask, val << field->shift); | ||
1464 | } | ||
1465 | EXPORT_SYMBOL_GPL(regmap_fields_write); | ||
1466 | |||
1467 | /** | ||
1468 | * regmap_fields_update_bits(): Perform a read/modify/write cycle | ||
1469 | * on the register field | ||
1470 | * | ||
1471 | * @field: Register field to write to | ||
1472 | * @id: port ID | ||
1473 | * @mask: Bitmask to change | ||
1474 | * @val: Value to be written | ||
1475 | * | ||
1476 | * A value of zero will be returned on success, a negative errno will | ||
1477 | * be returned in error cases. | ||
1478 | */ | ||
1479 | int regmap_fields_update_bits(struct regmap_field *field, unsigned int id, | ||
1480 | unsigned int mask, unsigned int val) | ||
1481 | { | ||
1482 | if (id >= field->id_size) | ||
1483 | return -EINVAL; | ||
1484 | |||
1485 | mask = (mask << field->shift) & field->mask; | ||
1486 | |||
1487 | return regmap_update_bits(field->regmap, | ||
1488 | field->reg + (field->id_offset * id), | ||
1489 | mask, val << field->shift); | ||
1490 | } | ||
1491 | EXPORT_SYMBOL_GPL(regmap_fields_update_bits); | ||
1492 | |||
1423 | /* | 1493 | /* |
1424 | * regmap_bulk_write(): Write multiple registers to the device | 1494 | * regmap_bulk_write(): Write multiple registers to the device |
1425 | * | 1495 | * |
@@ -1731,6 +1801,39 @@ int regmap_field_read(struct regmap_field *field, unsigned int *val) | |||
1731 | EXPORT_SYMBOL_GPL(regmap_field_read); | 1801 | EXPORT_SYMBOL_GPL(regmap_field_read); |
1732 | 1802 | ||
1733 | /** | 1803 | /** |
1804 | * regmap_fields_read(): Read a value to a single register field with port ID | ||
1805 | * | ||
1806 | * @field: Register field to read from | ||
1807 | * @id: port ID | ||
1808 | * @val: Pointer to store read value | ||
1809 | * | ||
1810 | * A value of zero will be returned on success, a negative errno will | ||
1811 | * be returned in error cases. | ||
1812 | */ | ||
1813 | int regmap_fields_read(struct regmap_field *field, unsigned int id, | ||
1814 | unsigned int *val) | ||
1815 | { | ||
1816 | int ret; | ||
1817 | unsigned int reg_val; | ||
1818 | |||
1819 | if (id >= field->id_size) | ||
1820 | return -EINVAL; | ||
1821 | |||
1822 | ret = regmap_read(field->regmap, | ||
1823 | field->reg + (field->id_offset * id), | ||
1824 | ®_val); | ||
1825 | if (ret != 0) | ||
1826 | return ret; | ||
1827 | |||
1828 | reg_val &= field->mask; | ||
1829 | reg_val >>= field->shift; | ||
1830 | *val = reg_val; | ||
1831 | |||
1832 | return ret; | ||
1833 | } | ||
1834 | EXPORT_SYMBOL_GPL(regmap_fields_read); | ||
1835 | |||
1836 | /** | ||
1734 | * regmap_bulk_read(): Read multiple registers from the device | 1837 | * regmap_bulk_read(): Read multiple registers from the device |
1735 | * | 1838 | * |
1736 | * @map: Register map to write to | 1839 | * @map: Register map to write to |