aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorMark Brown <broonie@linaro.org>2013-10-24 06:24:11 -0400
committerMark Brown <broonie@linaro.org>2013-10-24 06:24:11 -0400
commit5b2ad46d6eb69a7910a02ce32e977b48897b1ff4 (patch)
treedb1f83dd08c939398706639fd3767a3421100b2b /drivers
parentc0840b272839eabe7bf23b82d235cfd22d3417a9 (diff)
parent92eba04e4bcd469518cc759ac1bf1a49acaa5cc1 (diff)
Merge remote-tracking branch 'asoc/topic/rcar' into asoc-next
Diffstat (limited to 'drivers')
-rw-r--r--drivers/base/regmap/internal.h3
-rw-r--r--drivers/base/regmap/regmap.c103
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}
1421EXPORT_SYMBOL_GPL(regmap_field_write); 1423EXPORT_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 */
1436int 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}
1443EXPORT_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 */
1455int 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}
1465EXPORT_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 */
1479int 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}
1491EXPORT_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)
1731EXPORT_SYMBOL_GPL(regmap_field_read); 1801EXPORT_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 */
1813int 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 &reg_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}
1834EXPORT_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