11
11
#include <linux/errno.h>
12
12
#include <linux/interrupt.h>
13
13
#include <linux/iopoll.h>
14
+ #include <linux/mfd/syscon.h>
14
15
#include <linux/module.h>
15
16
#include <linux/mtd/rawnand.h>
17
+ #include <linux/of_address.h>
16
18
#include <linux/pinctrl/consumer.h>
17
19
#include <linux/platform_device.h>
18
20
#include <linux/regmap.h>
204
206
#define FMC2_BCHDSR4_EBP7 GENMASK(12, 0)
205
207
#define FMC2_BCHDSR4_EBP8 GENMASK(28, 16)
206
208
207
- /* Regmap registers configuration */
208
- #define FMC2_MAX_REGISTER 0x3fc
209
-
210
- static const struct regmap_config stm32_fmc2_regmap_cfg = {
211
- .reg_bits = 32 ,
212
- .val_bits = 32 ,
213
- .reg_stride = sizeof (u32 ),
214
- .max_register = FMC2_MAX_REGISTER ,
215
- };
216
-
217
209
enum stm32_fmc2_ecc {
218
210
FMC2_ECC_HAM = 1 ,
219
211
FMC2_ECC_BCH4 = 4 ,
@@ -253,6 +245,7 @@ struct stm32_fmc2_nfc {
253
245
struct nand_controller base ;
254
246
struct stm32_fmc2_nand nand ;
255
247
struct device * dev ;
248
+ struct device * cdev ;
256
249
struct regmap * regmap ;
257
250
void __iomem * data_base [FMC2_MAX_CE ];
258
251
void __iomem * cmd_base [FMC2_MAX_CE ];
@@ -1384,8 +1377,9 @@ static void stm32_fmc2_nfc_init(struct stm32_fmc2_nfc *nfc)
1384
1377
pcr |= FIELD_PREP (FMC2_PCR_TAR , FMC2_PCR_TAR_DEFAULT );
1385
1378
1386
1379
/* Enable FMC2 controller */
1387
- regmap_update_bits (nfc -> regmap , FMC2_BCR1 ,
1388
- FMC2_BCR1_FMC2EN , FMC2_BCR1_FMC2EN );
1380
+ if (nfc -> dev == nfc -> cdev )
1381
+ regmap_update_bits (nfc -> regmap , FMC2_BCR1 ,
1382
+ FMC2_BCR1_FMC2EN , FMC2_BCR1_FMC2EN );
1389
1383
1390
1384
regmap_write (nfc -> regmap , FMC2_PCR , pcr );
1391
1385
regmap_write (nfc -> regmap , FMC2_PMEM , FMC2_PMEM_DEFAULT );
@@ -1815,6 +1809,33 @@ static int stm32_fmc2_nfc_parse_dt(struct stm32_fmc2_nfc *nfc)
1815
1809
return ret ;
1816
1810
}
1817
1811
1812
+ static int stm32_fmc2_nfc_set_cdev (struct stm32_fmc2_nfc * nfc )
1813
+ {
1814
+ struct device * dev = nfc -> dev ;
1815
+ bool ebi_found = false;
1816
+
1817
+ if (dev -> parent && of_device_is_compatible (dev -> parent -> of_node ,
1818
+ "st,stm32mp1-fmc2-ebi" ))
1819
+ ebi_found = true;
1820
+
1821
+ if (of_device_is_compatible (dev -> of_node , "st,stm32mp1-fmc2-nfc" )) {
1822
+ if (ebi_found ) {
1823
+ nfc -> cdev = dev -> parent ;
1824
+
1825
+ return 0 ;
1826
+ }
1827
+
1828
+ return - EINVAL ;
1829
+ }
1830
+
1831
+ if (ebi_found )
1832
+ return - EINVAL ;
1833
+
1834
+ nfc -> cdev = dev ;
1835
+
1836
+ return 0 ;
1837
+ }
1838
+
1818
1839
static int stm32_fmc2_nfc_probe (struct platform_device * pdev )
1819
1840
{
1820
1841
struct device * dev = & pdev -> dev ;
@@ -1824,8 +1845,9 @@ static int stm32_fmc2_nfc_probe(struct platform_device *pdev)
1824
1845
struct resource * res ;
1825
1846
struct mtd_info * mtd ;
1826
1847
struct nand_chip * chip ;
1827
- void __iomem * mmio ;
1848
+ struct resource cres ;
1828
1849
int chip_cs , mem_region , ret , irq ;
1850
+ int start_region = 0 ;
1829
1851
1830
1852
nfc = devm_kzalloc (dev , sizeof (* nfc ), GFP_KERNEL );
1831
1853
if (!nfc )
@@ -1835,22 +1857,28 @@ static int stm32_fmc2_nfc_probe(struct platform_device *pdev)
1835
1857
nand_controller_init (& nfc -> base );
1836
1858
nfc -> base .ops = & stm32_fmc2_nfc_controller_ops ;
1837
1859
1860
+ ret = stm32_fmc2_nfc_set_cdev (nfc );
1861
+ if (ret )
1862
+ return ret ;
1863
+
1838
1864
ret = stm32_fmc2_nfc_parse_dt (nfc );
1839
1865
if (ret )
1840
1866
return ret ;
1841
1867
1842
- res = platform_get_resource (pdev , IORESOURCE_MEM , 0 );
1843
- mmio = devm_ioremap_resource (dev , res );
1844
- if (IS_ERR (mmio ))
1845
- return PTR_ERR (mmio );
1868
+ ret = of_address_to_resource (nfc -> cdev -> of_node , 0 , & cres );
1869
+ if (ret )
1870
+ return ret ;
1871
+
1872
+ nfc -> io_phys_addr = cres .start ;
1846
1873
1847
- nfc -> regmap = devm_regmap_init_mmio ( dev , mmio , & stm32_fmc2_regmap_cfg );
1874
+ nfc -> regmap = device_node_to_regmap ( nfc -> cdev -> of_node );
1848
1875
if (IS_ERR (nfc -> regmap ))
1849
1876
return PTR_ERR (nfc -> regmap );
1850
1877
1851
- nfc -> io_phys_addr = res -> start ;
1878
+ if (nfc -> dev == nfc -> cdev )
1879
+ start_region = 1 ;
1852
1880
1853
- for (chip_cs = 0 , mem_region = 1 ; chip_cs < FMC2_MAX_CE ;
1881
+ for (chip_cs = 0 , mem_region = start_region ; chip_cs < FMC2_MAX_CE ;
1854
1882
chip_cs ++ , mem_region += 3 ) {
1855
1883
if (!(nfc -> cs_assigned & BIT (chip_cs )))
1856
1884
continue ;
@@ -1888,7 +1916,7 @@ static int stm32_fmc2_nfc_probe(struct platform_device *pdev)
1888
1916
1889
1917
init_completion (& nfc -> complete );
1890
1918
1891
- nfc -> clk = devm_clk_get (dev , NULL );
1919
+ nfc -> clk = devm_clk_get (nfc -> cdev , NULL );
1892
1920
if (IS_ERR (nfc -> clk ))
1893
1921
return PTR_ERR (nfc -> clk );
1894
1922
@@ -2029,6 +2057,7 @@ static SIMPLE_DEV_PM_OPS(stm32_fmc2_nfc_pm_ops, stm32_fmc2_nfc_suspend,
2029
2057
2030
2058
static const struct of_device_id stm32_fmc2_nfc_match [] = {
2031
2059
{.compatible = "st,stm32mp15-fmc2" },
2060
+ {.compatible = "st,stm32mp1-fmc2-nfc" },
2032
2061
{}
2033
2062
};
2034
2063
MODULE_DEVICE_TABLE (of , stm32_fmc2_nfc_match );
0 commit comments