SPMI: new format for device tree data
reduce memory by compressing two values into one 32 bit integer.
Change-Id: I7c0bf7007df082fac53c1138ba45f1ecf77b2f83
Signed-off-by: Gilad Avidov <gavidov@codeaurora.org>
diff --git a/Documentation/devicetree/bindings/spmi/spmi-pmic-arb.txt b/Documentation/devicetree/bindings/spmi/spmi-pmic-arb.txt
index 8cc3c54..b5ca08e 100644
--- a/Documentation/devicetree/bindings/spmi/spmi-pmic-arb.txt
+++ b/Documentation/devicetree/bindings/spmi/spmi-pmic-arb.txt
@@ -17,6 +17,13 @@
Up to a maximum of 256 peripherals are supported and the mapping is target
specific.
+Data format of pmic-arb-ppid-map:
+<0x13100001>
+value is 32 bit.
+MSB 12 bits are the PPID
+12 bits padding
+LSB 8 bit are the APID
+
Example:
qcom,spmi@fc4c0000 {
@@ -27,6 +34,8 @@
interrupts = <0>;
qcom,pmic-arb-ee = <0>;
qcom,pmic-arb-channel = <0>;
- qcom,pmic-arb-ppid-map = <0x130 0x00>, /* PPID 0x130, APID 0 */
- <0x131 0x01>; /* PPID 0x131, APID 1 */
+ qcom,pmic-arb-ppid-map = <0x13000000>, /* PPID 0x130, APID 0 */
+ <0x13100001>, /* PPID 0x131, APID 1 */
};
+
+
diff --git a/arch/arm/boot/dts/msmcopper.dts b/arch/arm/boot/dts/msmcopper.dts
index 725971d..74a3b3f 100644
--- a/arch/arm/boot/dts/msmcopper.dts
+++ b/arch/arm/boot/dts/msmcopper.dts
@@ -94,93 +94,96 @@
interrupts = <0 190 0 0 187 0>;
qcom,pmic-arb-ee = <0>;
qcom,pmic-arb-channel = <0>;
- qcom,pmic-arb-ppid-map = <0x130 0x00>, /* PM8941_LDO1 */
- <0x131 0x01>, /* PM8941_LDO2 */
- <0x132 0x02>, /* PM8941_LDO3 */
- <0x133 0x03>, /* PM8941_LDO4 */
- <0x134 0x04>, /* PM8941_LDO5 */
- <0x135 0x05>, /* PM8941_LDO6 */
- <0x136 0x06>, /* PM8941_LDO7 */
- <0x137 0x07>, /* PM8941_LDO8 */
- <0x138 0x08>, /* PM8941_LDO9 */
- <0x139 0x09>, /* PM8941_LDO10 */
- <0x13a 0x0a>, /* PM8941_LDO11 */
- <0x13b 0x0b>, /* PM8941_LDO12 */
- <0x13c 0x0c>, /* PM8941_LDO13 */
- <0x13d 0x0d>, /* PM8941_LDO14 */
- <0x13e 0x0e>, /* PM8941_LDO15 */
- <0x13f 0x0f>, /* PM8941_LDO16 */
- <0x140 0x10>, /* PM8941_LDO17 */
- <0x141 0x11>, /* PM8941_LDO18 */
- <0x142 0x12>, /* PM8941_LDO19 */
- <0x143 0x13>, /* PM8941_LDO20 */
- <0x144 0x14>, /* PM8941_LDO21 */
- <0x145 0x15>, /* PM8941_LDO22 */
- <0x146 0x16>, /* PM8941_LDO23 */
- <0x147 0x17>, /* PM8941_LDO24 */
- <0x148 0x18>, /* PM8941_LDO25 */
- <0x149 0x19>, /* PM8941_LDO26 */
- <0x0c0 0x1a>, /* PM8941_GPIO1 */
- <0x0c1 0x1b>, /* PM8941_GPIO2 */
- <0x0c2 0x1c>, /* PM8941_GPIO3 */
- <0x0c3 0x1d>, /* PM8941_GPIO4 */
- <0x0c4 0x1e>, /* PM8941_GPIO5 */
- <0x0c5 0x1f>, /* PM8941_GPIO6 */
- <0x0c6 0x20>, /* PM8941_GPIO7 */
- <0x0c7 0x21>, /* PM8941_GPIO8 */
- <0x0c8 0x22>, /* PM8941_GPIO9 */
- <0x0c9 0x23>, /* PM8941_GPIO10 */
- <0x0ca 0x24>, /* PM8941_GPIO11 */
- <0x0cb 0x25>, /* PM8941_GPIO12 */
- <0x0cc 0x26>, /* PM8941_GPIO13 */
- <0x0cd 0x27>, /* PM8941_GPIO14 */
- <0x0ce 0x28>, /* PM8941_GPIO15 */
- <0x0cf 0x29>, /* PM8941_GPIO16 */
- <0x0d0 0x2a>, /* PM8941_GPIO17 */
- <0x0d1 0x2b>, /* PM8941_GPIO18 */
- <0x0d2 0x2c>, /* PM8941_GPIO19 */
- <0x0d3 0x2d>, /* PM8941_GPIO20 */
- <0x0d4 0x2e>, /* PM8941_GPIO21 */
- <0x0d5 0x2f>, /* PM8941_GPIO22 */
- <0x0d6 0x30>, /* PM8941_GPIO23 */
- <0x0d7 0x31>, /* PM8941_GPIO24 */
- <0x0d8 0x32>, /* PM8941_GPIO25 */
- <0x0d9 0x33>, /* PM8941_GPIO26 */
- <0x0da 0x34>, /* PM8941_GPIO27 */
- <0x0db 0x35>, /* PM8941_GPIO28 */
- <0x0dc 0x36>, /* PM8941_GPIO29 */
- <0x0dd 0x37>, /* PM8941_GPIO30 */
- <0x0de 0x38>, /* PM8941_GPIO31 */
- <0x0df 0x39>, /* PM8941_GPIO32 */
- <0x0e0 0x3a>, /* PM8941_GPIO33 */
- <0x0e1 0x3b>, /* PM8941_GPIO34 */
- <0x0e2 0x3c>, /* PM8941_GPIO35 */
- <0x0e3 0x3d>, /* PM8941_GPIO36 */
- <0x028 0x3e>, /* COINCELL */
- <0x005 0x3f>, /* INTERRUPT */
- <0x001 0x40>, /* PM8941_0 */
- <0x201 0x41>, /* PM8841_0 */
- <0x101 0x42>, /* PM8941_1 */
- <0x301 0x43>, /* PM8841_1 */
- <0x008 0x44>, /* PON0 */
- <0x208 0x45>, /* PON1 */
- <0x110 0x46>, /* PM8941_SMPS1 */
- <0x111 0x47>, /* PM8941_SMPS2 */
- <0x112 0x48>, /* PM8941_SMPS3 */
- <0x310 0x49>, /* PM8841_SMPS1 */
- <0x311 0x4a>, /* PM8841_SMPS2 */
- <0x312 0x4b>, /* PM8841_SMPS3 */
- <0x313 0x4c>, /* PM8841_SMPS4 */
- <0x314 0x4d>, /* PM8841_SMPS5 */
- <0x315 0x4e>, /* PM8841_SMPS6 */
- <0x316 0x4f>, /* PM8841_SMPS7 */
- <0x317 0x50>, /* PM8841_SMPS8 */
- <0x050 0x51>, /* SHARED_XO */
- <0x051 0x52>, /* BB_CLK1 */
- <0x052 0x53>, /* BB_CLK2 */
- <0x059 0x54>, /* SLEEP_CLK */
- <0x010 0x55>, /* SMBC_OVP */
- <0x011 0x56>, /* SMBC_CHG */
- <0x012 0x57>; /* SMBC_BIF */
+ qcom,pmic-arb-ppid-map = <0x13000000>, /* PM8941_LDO1 */
+ <0x13100001>, /* PM8941_LDO2 */
+ <0x13200002>, /* PM8941_LDO3 */
+ <0x13300003>, /* PM8941_LDO4 */
+ <0x13400004>, /* PM8941_LDO5 */
+ <0x13500005>, /* PM8941_LDO6 */
+ <0x13600006>, /* PM8941_LDO7 */
+ <0x13700007>, /* PM8941_LDO8 */
+ <0x13800008>, /* PM8941_LDO9 */
+ <0x13900009>, /* PM8941_LDO10 */
+ <0x13a0000a>, /* PM8941_LDO11 */
+ <0x13b0000b>, /* PM8941_LDO12 */
+ <0x13c0000c>, /* PM8941_LDO13 */
+ <0x13d0000d>, /* PM8941_LDO14 */
+ <0x13e0000e>, /* PM8941_LDO15 */
+ <0x13f0000f>, /* PM8941_LDO16 */
+ <0x14000010>, /* PM8941_LDO17 */
+ <0x14100011>, /* PM8941_LDO18 */
+ <0x14200012>, /* PM8941_LDO19 */
+ <0x14300013>, /* PM8941_LDO20 */
+ <0x14400014>, /* PM8941_LDO21 */
+ <0x14500015>, /* PM8941_LDO22 */
+ <0x14600016>, /* PM8941_LDO23 */
+ <0x14700017>, /* PM8941_LDO24 */
+ <0x14800018>, /* PM8941_LDO25 */
+ <0x14900019>, /* PM8941_LDO26 */
+ <0x0c00001a>, /* PM8941_GPIO1 */
+ <0x0c10001b>, /* PM8941_GPIO2 */
+ <0x0c20001c>, /* PM8941_GPIO3 */
+ <0x0c30001d>, /* PM8941_GPIO4 */
+ <0x0c40001e>, /* PM8941_GPIO5 */
+ <0x0c50001f>, /* PM8941_GPIO6 */
+ <0x0c600020>, /* PM8941_GPIO7 */
+ <0x0c700021>, /* PM8941_GPIO8 */
+ <0x0c800022>, /* PM8941_GPIO9 */
+ <0x0c900023>, /* PM8941_GPIO10 */
+ <0x0ca00024>, /* PM8941_GPIO11 */
+ <0x0cb00025>, /* PM8941_GPIO12 */
+ <0x0cc00026>, /* PM8941_GPIO13 */
+ <0x0cd00027>, /* PM8941_GPIO14 */
+ <0x0ce00028>, /* PM8941_GPIO15 */
+ <0x0cf00029>, /* PM8941_GPIO16 */
+ <0x0d00002a>, /* PM8941_GPIO17 */
+ <0x0d10002b>, /* PM8941_GPIO18 */
+ <0x0d20002c>, /* PM8941_GPIO19 */
+ <0x0d30002d>, /* PM8941_GPIO20 */
+ <0x0d40002e>, /* PM8941_GPIO21 */
+ <0x0d50002f>, /* PM8941_GPIO22 */
+ <0x0d600030>, /* PM8941_GPIO23 */
+ <0x0d700031>, /* PM8941_GPIO24 */
+ <0x0d800032>, /* PM8941_GPIO25 */
+ <0x0d900033>, /* PM8941_GPIO26 */
+ <0x0da00034>, /* PM8941_GPIO27 */
+ <0x0db00035>, /* PM8941_GPIO28 */
+ <0x0dc00036>, /* PM8941_GPIO29 */
+ <0x0dd00037>, /* PM8941_GPIO30 */
+ <0x0de00038>, /* PM8941_GPIO31 */
+ <0x0df00039>, /* PM8941_GPIO32 */
+ <0x0e00003a>, /* PM8941_GPIO33 */
+ <0x0e10003b>, /* PM8941_GPIO34 */
+ <0x0e20003c>, /* PM8941_GPIO35 */
+ <0x0e30003d>, /* PM8941_GPIO36 */
+ <0x0280003e>, /* COINCELL */
+ <0x0100003f>, /* SMBC_OVP */
+ <0x01100040>, /* SMBC_CHG */
+ <0x01200041>, /* SMBC_BIF */
+ <0x00500042>, /* INTERRUPT */
+ <0x00100043>, /* PM8941_0 */
+ <0x20100044>, /* PM8841_0 */
+ <0x10100045>, /* PM8941_1 */
+ <0x30100046>, /* PM8841_1 */
+ <0x00800047>, /* PON0 */
+ <0x20800048>, /* PON1 */
+ <0x11000049>, /* PM8941_SMPS1 */
+ <0x1110004a>, /* PM8941_SMPS2 */
+ <0x1120004b>, /* PM8941_SMPS3 */
+ <0x3100004c>, /* PM8841_SMPS1 */
+ <0x3110004d>, /* PM8841_SMPS2 */
+ <0x3120004e>, /* PM8841_SMPS3 */
+ <0x3130004f>, /* PM8841_SMPS4 */
+ <0x31400050>, /* PM8841_SMPS5 */
+ <0x31500051>, /* PM8841_SMPS6 */
+ <0x31600052>, /* PM8841_SMPS7 */
+ <0x31700053>, /* PM8841_SMPS8 */
+ <0x05000054>, /* SHARED_XO */
+ <0x05100055>, /* BB_CLK1 */
+ <0x05200056>, /* BB_CLK2 */
+ <0x05900057>, /* SLEEP_CLK */
+ <0x07000058>, /* PBS_CORE */
+ <0x07100059>, /* PBS_CLIENT1 */
+ <0x0720005a>; /* PBS_CLIENT2 */
};
};
diff --git a/drivers/spmi/spmi-pmic-arb.c b/drivers/spmi/spmi-pmic-arb.c
index e5a9d40..632db71 100644
--- a/drivers/spmi/spmi-pmic-arb.c
+++ b/drivers/spmi/spmi-pmic-arb.c
@@ -78,8 +78,14 @@
#define PMIC_ARB_MAX_PERIPHS 256
#define PMIC_ARB_PERIPH_ID_VALID (1 << 15)
#define PMIC_ARB_TIMEOUT_US 100
-#define PMIC_ARB_APID_MASK 0xFF
-#define PMIC_ARB_PPID_MASK 0xFFF
+
+#define PMIC_ARB_APID_MASK 0xFF
+#define PMIC_ARB_PPID_MASK 0xFFF
+/* extract PPID and APID from interrupt map in .dts config file format */
+#define PMIC_ARB_DEV_TRE_2_PPID(MAP_COMPRS_VAL) \
+ ((MAP_COMPRS_VAL) >> (20))
+#define PMIC_ARB_DEV_TRE_2_APID(MAP_COMPRS_VAL) \
+ ((MAP_COMPRS_VAL) & PMIC_ARB_APID_MASK)
/**
* base - base address of the PMIC Arbiter core registers.
@@ -504,7 +510,7 @@
int ret;
int map_size;
u32 *map_data;
- const int map_width = 2 * sizeof(*map_data);
+ const int map_width = sizeof(*map_data);
const struct device_node *of_node = pdev->dev.of_node;
/* Get size of the mapping table (in bytes) */
@@ -514,8 +520,7 @@
}
/* Map size can't exceed the maximum number of peripherals */
- if (map_size == 0 || map_size % map_width ||
- map_size > map_width * PMIC_ARB_MAX_PERIPHS) {
+ if (map_size == 0 || map_size > map_width * PMIC_ARB_MAX_PERIPHS) {
dev_err(&pdev->dev, "map size of %d is not valid\n", map_size);
return -ENODEV;
}
@@ -538,20 +543,9 @@
/* Build the mapping table from the data */
for (i = 0; i < map_size/sizeof(u32);) {
- u32 ppid = map_data[i++];
- u32 apid = map_data[i++];
-
- if (apid > PMIC_ARB_APID_MASK) {
- ret = -ENODEV;
- dev_err(&pdev->dev, "invalid APID: 0x%x\n", apid);
- goto err;
- }
-
- if (ppid > PMIC_ARB_PPID_MASK) {
- ret = -ENODEV;
- dev_err(&pdev->dev, "invalid PPID: 0x%x\n", ppid);
- goto err;
- }
+ u32 map_compressed_val = map_data[i++];
+ u32 ppid = PMIC_ARB_DEV_TRE_2_PPID(map_compressed_val) ;
+ u32 apid = PMIC_ARB_DEV_TRE_2_APID(map_compressed_val) ;
if (pmic_arb->periph_id_map[apid] & PMIC_ARB_PERIPH_ID_VALID)
dev_warn(&pdev->dev, "duplicate APID 0x%x\n", apid);