13
13
#include <linux/kernel.h>
14
14
#include <linux/module.h>
15
15
#include <linux/of.h>
16
+ #include <linux/of_address.h>
16
17
#include <linux/of_irq.h>
17
18
#include <linux/platform_device.h>
18
19
#include <linux/slab.h>
@@ -95,6 +96,8 @@ enum pmic_arb_channel {
95
96
PMIC_ARB_CHANNEL_OBS ,
96
97
};
97
98
99
+ #define PMIC_ARB_MAX_BUSES 2
100
+
98
101
/* Maximum number of support PMIC peripherals */
99
102
#define PMIC_ARB_MAX_PERIPHS 512
100
103
#define PMIC_ARB_MAX_PERIPHS_V7 1024
@@ -149,6 +152,7 @@ struct spmi_pmic_arb;
149
152
* @min_apid: minimum APID (used for bounding IRQ search)
150
153
* @max_apid: maximum APID
151
154
* @irq: PMIC ARB interrupt.
155
+ * @id: unique ID of the bus
152
156
*/
153
157
struct spmi_pmic_arb_bus {
154
158
struct spmi_pmic_arb * pmic_arb ;
@@ -167,6 +171,7 @@ struct spmi_pmic_arb_bus {
167
171
u16 min_apid ;
168
172
u16 max_apid ;
169
173
int irq ;
174
+ u8 id ;
170
175
};
171
176
172
177
/**
@@ -180,7 +185,8 @@ struct spmi_pmic_arb_bus {
180
185
* @ee: the current Execution Environment
181
186
* @ver_ops: version dependent operations.
182
187
* @max_periphs: Number of elements in apid_data[]
183
- * @bus: per arbiter bus instance
188
+ * @buses: per arbiter buses instances
189
+ * @buses_available: number of buses registered
184
190
*/
185
191
struct spmi_pmic_arb {
186
192
void __iomem * rd_base ;
@@ -191,7 +197,8 @@ struct spmi_pmic_arb {
191
197
u8 ee ;
192
198
const struct pmic_arb_ver_ops * ver_ops ;
193
199
int max_periphs ;
194
- struct spmi_pmic_arb_bus * bus ;
200
+ struct spmi_pmic_arb_bus * buses [PMIC_ARB_MAX_BUSES ];
201
+ int buses_available ;
195
202
};
196
203
197
204
/**
@@ -220,7 +227,7 @@ struct spmi_pmic_arb {
220
227
struct pmic_arb_ver_ops {
221
228
const char * ver_str ;
222
229
int (* get_core_resources )(struct platform_device * pdev , void __iomem * core );
223
- int (* init_apid )(struct spmi_pmic_arb_bus * bus );
230
+ int (* init_apid )(struct spmi_pmic_arb_bus * bus , int index );
224
231
int (* ppid_to_apid )(struct spmi_pmic_arb_bus * bus , u16 ppid );
225
232
/* spmi commands (read_cmd, write_cmd, cmd) functionality */
226
233
int (* offset )(struct spmi_pmic_arb_bus * bus , u8 sid , u16 addr ,
@@ -309,8 +316,8 @@ static int pmic_arb_wait_for_done(struct spmi_controller *ctrl,
309
316
}
310
317
311
318
if (status & PMIC_ARB_STATUS_FAILURE ) {
312
- dev_err (& ctrl -> dev , "%s: %#x %#x: transaction failed (%#x)\n" ,
313
- __func__ , sid , addr , status );
319
+ dev_err (& ctrl -> dev , "%s: %#x %#x: transaction failed (%#x) reg: 0x%x \n" ,
320
+ __func__ , sid , addr , status , offset );
314
321
WARN_ON (1 );
315
322
return - EIO ;
316
323
}
@@ -326,8 +333,8 @@ static int pmic_arb_wait_for_done(struct spmi_controller *ctrl,
326
333
udelay (1 );
327
334
}
328
335
329
- dev_err (& ctrl -> dev , "%s: %#x %#x: timeout, status %#x\n" ,
330
- __func__ , sid , addr , status );
336
+ dev_err (& ctrl -> dev , "%s: %#x %#x %#x : timeout, status %#x\n" ,
337
+ __func__ , bus -> id , sid , addr , status );
331
338
return - ETIMEDOUT ;
332
339
}
333
340
@@ -1003,11 +1010,17 @@ static int pmic_arb_get_core_resources_v1(struct platform_device *pdev,
1003
1010
return 0 ;
1004
1011
}
1005
1012
1006
- static int pmic_arb_init_apid_v1 (struct spmi_pmic_arb_bus * bus )
1013
+ static int pmic_arb_init_apid_v1 (struct spmi_pmic_arb_bus * bus , int index )
1007
1014
{
1008
1015
struct spmi_pmic_arb * pmic_arb = bus -> pmic_arb ;
1009
1016
u32 * mapping_table ;
1010
1017
1018
+ if (index ) {
1019
+ dev_err (& bus -> spmic -> dev , "Unsupported buses count %d detected\n" ,
1020
+ index );
1021
+ return - EINVAL ;
1022
+ }
1023
+
1011
1024
mapping_table = devm_kcalloc (& bus -> spmic -> dev , pmic_arb -> max_periphs ,
1012
1025
sizeof (* mapping_table ), GFP_KERNEL );
1013
1026
if (!mapping_table )
@@ -1250,11 +1263,17 @@ static int pmic_arb_offset_v2(struct spmi_pmic_arb_bus *bus, u8 sid, u16 addr,
1250
1263
return 0x1000 * pmic_arb -> ee + 0x8000 * apid ;
1251
1264
}
1252
1265
1253
- static int pmic_arb_init_apid_v5 (struct spmi_pmic_arb_bus * bus )
1266
+ static int pmic_arb_init_apid_v5 (struct spmi_pmic_arb_bus * bus , int index )
1254
1267
{
1255
1268
struct spmi_pmic_arb * pmic_arb = bus -> pmic_arb ;
1256
1269
int ret ;
1257
1270
1271
+ if (index ) {
1272
+ dev_err (& bus -> spmic -> dev , "Unsupported buses count %d detected\n" ,
1273
+ index );
1274
+ return - EINVAL ;
1275
+ }
1276
+
1258
1277
bus -> base_apid = 0 ;
1259
1278
bus -> apid_count = readl_relaxed (pmic_arb -> core + PMIC_ARB_FEATURES ) &
1260
1279
PMIC_ARB_FEATURES_PERIPH_MASK ;
@@ -1326,6 +1345,50 @@ static int pmic_arb_get_core_resources_v7(struct platform_device *pdev,
1326
1345
return pmic_arb_get_obsrvr_chnls_v2 (pdev );
1327
1346
}
1328
1347
1348
+ /*
1349
+ * Only v7 supports 2 buses. Each bus will get a different apid count, read
1350
+ * from different registers.
1351
+ */
1352
+ static int pmic_arb_init_apid_v7 (struct spmi_pmic_arb_bus * bus , int index )
1353
+ {
1354
+ struct spmi_pmic_arb * pmic_arb = bus -> pmic_arb ;
1355
+ int ret ;
1356
+
1357
+ if (index == 0 ) {
1358
+ bus -> base_apid = 0 ;
1359
+ bus -> apid_count = readl_relaxed (pmic_arb -> core + PMIC_ARB_FEATURES ) &
1360
+ PMIC_ARB_FEATURES_PERIPH_MASK ;
1361
+ } else if (index == 1 ) {
1362
+ bus -> base_apid = readl_relaxed (pmic_arb -> core + PMIC_ARB_FEATURES ) &
1363
+ PMIC_ARB_FEATURES_PERIPH_MASK ;
1364
+ bus -> apid_count = readl_relaxed (pmic_arb -> core + PMIC_ARB_FEATURES1 ) &
1365
+ PMIC_ARB_FEATURES_PERIPH_MASK ;
1366
+ } else {
1367
+ dev_err (& bus -> spmic -> dev , "Unsupported buses count %d detected\n" ,
1368
+ bus -> id );
1369
+ return - EINVAL ;
1370
+ }
1371
+
1372
+ if (bus -> base_apid + bus -> apid_count > pmic_arb -> max_periphs ) {
1373
+ dev_err (& bus -> spmic -> dev , "Unsupported APID count %d detected\n" ,
1374
+ bus -> base_apid + bus -> apid_count );
1375
+ return - EINVAL ;
1376
+ }
1377
+
1378
+ ret = pmic_arb_init_apid_min_max (bus );
1379
+ if (ret )
1380
+ return ret ;
1381
+
1382
+ ret = pmic_arb_read_apid_map_v5 (bus );
1383
+ if (ret ) {
1384
+ dev_err (& bus -> spmic -> dev , "could not read APID->PPID mapping table, rc= %d\n" ,
1385
+ ret );
1386
+ return ret ;
1387
+ }
1388
+
1389
+ return 0 ;
1390
+ }
1391
+
1329
1392
/*
1330
1393
* v7 offset per ee and per apid for observer channels and per apid for
1331
1394
* read/write channels.
@@ -1578,7 +1641,7 @@ static const struct pmic_arb_ver_ops pmic_arb_v5 = {
1578
1641
static const struct pmic_arb_ver_ops pmic_arb_v7 = {
1579
1642
.ver_str = "v7" ,
1580
1643
.get_core_resources = pmic_arb_get_core_resources_v7 ,
1581
- .init_apid = pmic_arb_init_apid_v5 ,
1644
+ .init_apid = pmic_arb_init_apid_v7 ,
1582
1645
.ppid_to_apid = pmic_arb_ppid_to_apid_v5 ,
1583
1646
.non_data_cmd = pmic_arb_non_data_cmd_v2 ,
1584
1647
.offset = pmic_arb_offset_v7 ,
@@ -1602,6 +1665,7 @@ static int spmi_pmic_arb_bus_init(struct platform_device *pdev,
1602
1665
struct device_node * node ,
1603
1666
struct spmi_pmic_arb * pmic_arb )
1604
1667
{
1668
+ int bus_index = pmic_arb -> buses_available ;
1605
1669
struct spmi_pmic_arb_bus * bus ;
1606
1670
struct device * dev = & pdev -> dev ;
1607
1671
struct spmi_controller * ctrl ;
@@ -1620,7 +1684,7 @@ static int spmi_pmic_arb_bus_init(struct platform_device *pdev,
1620
1684
1621
1685
bus = spmi_controller_get_drvdata (ctrl );
1622
1686
1623
- pmic_arb -> bus = bus ;
1687
+ pmic_arb -> buses [ bus_index ] = bus ;
1624
1688
1625
1689
raw_spin_lock_init (& bus -> lock );
1626
1690
@@ -1665,12 +1729,13 @@ static int spmi_pmic_arb_bus_init(struct platform_device *pdev,
1665
1729
bus -> cnfg = cnfg ;
1666
1730
bus -> irq = irq ;
1667
1731
bus -> spmic = ctrl ;
1732
+ bus -> id = bus_index ;
1668
1733
1669
- ret = pmic_arb -> ver_ops -> init_apid (bus );
1734
+ ret = pmic_arb -> ver_ops -> init_apid (bus , bus_index );
1670
1735
if (ret )
1671
1736
return ret ;
1672
1737
1673
- dev_dbg (& pdev -> dev , "adding irq domain\n" );
1738
+ dev_dbg (& pdev -> dev , "adding irq domain for bus %d \n" , bus_index );
1674
1739
1675
1740
bus -> domain = irq_domain_add_tree (dev -> of_node ,
1676
1741
& pmic_arb_irq_domain_ops , bus );
@@ -1683,14 +1748,53 @@ static int spmi_pmic_arb_bus_init(struct platform_device *pdev,
1683
1748
pmic_arb_chained_irq , bus );
1684
1749
1685
1750
ctrl -> dev .of_node = node ;
1751
+ dev_set_name (& ctrl -> dev , "spmi-%d" , bus_index );
1686
1752
1687
1753
ret = devm_spmi_controller_add (dev , ctrl );
1688
1754
if (ret )
1689
1755
return ret ;
1690
1756
1757
+ pmic_arb -> buses_available ++ ;
1758
+
1691
1759
return 0 ;
1692
1760
}
1693
1761
1762
+ static int spmi_pmic_arb_register_buses (struct spmi_pmic_arb * pmic_arb ,
1763
+ struct platform_device * pdev )
1764
+ {
1765
+ struct device * dev = & pdev -> dev ;
1766
+ struct device_node * node = dev -> of_node ;
1767
+ struct device_node * child ;
1768
+ int ret ;
1769
+
1770
+ /* legacy mode doesn't provide child node for the bus */
1771
+ if (of_device_is_compatible (node , "qcom,spmi-pmic-arb" ))
1772
+ return spmi_pmic_arb_bus_init (pdev , node , pmic_arb );
1773
+
1774
+ for_each_available_child_of_node (node , child ) {
1775
+ if (of_node_name_eq (child , "spmi" )) {
1776
+ ret = spmi_pmic_arb_bus_init (pdev , child , pmic_arb );
1777
+ if (ret )
1778
+ return ret ;
1779
+ }
1780
+ }
1781
+
1782
+ return ret ;
1783
+ }
1784
+
1785
+ static void spmi_pmic_arb_deregister_buses (struct spmi_pmic_arb * pmic_arb )
1786
+ {
1787
+ int i ;
1788
+
1789
+ for (i = 0 ; i < pmic_arb -> buses_available ; i ++ ) {
1790
+ struct spmi_pmic_arb_bus * bus = pmic_arb -> buses [i ];
1791
+
1792
+ irq_set_chained_handler_and_data (bus -> irq ,
1793
+ NULL , NULL );
1794
+ irq_domain_remove (bus -> domain );
1795
+ }
1796
+ }
1797
+
1694
1798
static int spmi_pmic_arb_probe (struct platform_device * pdev )
1695
1799
{
1696
1800
struct spmi_pmic_arb * pmic_arb ;
@@ -1760,21 +1864,19 @@ static int spmi_pmic_arb_probe(struct platform_device *pdev)
1760
1864
1761
1865
pmic_arb -> ee = ee ;
1762
1866
1763
- return spmi_pmic_arb_bus_init ( pdev , dev -> of_node , pmic_arb );
1867
+ return spmi_pmic_arb_register_buses ( pmic_arb , pdev );
1764
1868
}
1765
1869
1766
1870
static void spmi_pmic_arb_remove (struct platform_device * pdev )
1767
1871
{
1768
1872
struct spmi_pmic_arb * pmic_arb = platform_get_drvdata (pdev );
1769
- struct spmi_pmic_arb_bus * bus = pmic_arb -> bus ;
1770
1873
1771
- irq_set_chained_handler_and_data (bus -> irq ,
1772
- NULL , NULL );
1773
- irq_domain_remove (bus -> domain );
1874
+ spmi_pmic_arb_deregister_buses (pmic_arb );
1774
1875
}
1775
1876
1776
1877
static const struct of_device_id spmi_pmic_arb_match_table [] = {
1777
1878
{ .compatible = "qcom,spmi-pmic-arb" , },
1879
+ { .compatible = "qcom,x1e80100-spmi-pmic-arb" , },
1778
1880
{},
1779
1881
};
1780
1882
MODULE_DEVICE_TABLE (of , spmi_pmic_arb_match_table );
0 commit comments