9
9
#include <linux/delay.h>
10
10
#include <linux/device.h>
11
11
#include <linux/platform_device.h>
12
+ #include <linux/platform_data/brcmnand.h>
12
13
#include <linux/err.h>
13
14
#include <linux/completion.h>
14
15
#include <linux/interrupt.h>
@@ -2768,7 +2769,8 @@ static const struct nand_controller_ops brcmnand_controller_ops = {
2768
2769
.attach_chip = brcmnand_attach_chip ,
2769
2770
};
2770
2771
2771
- static int brcmnand_init_cs (struct brcmnand_host * host )
2772
+ static int brcmnand_init_cs (struct brcmnand_host * host ,
2773
+ const char * const * part_probe_types )
2772
2774
{
2773
2775
struct brcmnand_controller * ctrl = host -> ctrl ;
2774
2776
struct device * dev = ctrl -> dev ;
@@ -2821,7 +2823,7 @@ static int brcmnand_init_cs(struct brcmnand_host *host)
2821
2823
if (ret )
2822
2824
return ret ;
2823
2825
2824
- ret = mtd_device_register (mtd , NULL , 0 );
2826
+ ret = mtd_device_parse_register (mtd , part_probe_types , NULL , NULL , 0 );
2825
2827
if (ret )
2826
2828
nand_cleanup (chip );
2827
2829
@@ -2990,17 +2992,15 @@ static int brcmnand_edu_setup(struct platform_device *pdev)
2990
2992
2991
2993
int brcmnand_probe (struct platform_device * pdev , struct brcmnand_soc * soc )
2992
2994
{
2995
+ struct brcmnand_platform_data * pd = dev_get_platdata (& pdev -> dev );
2993
2996
struct device * dev = & pdev -> dev ;
2994
2997
struct device_node * dn = dev -> of_node , * child ;
2995
2998
struct brcmnand_controller * ctrl ;
2999
+ struct brcmnand_host * host ;
2996
3000
struct resource * res ;
2997
3001
int ret ;
2998
3002
2999
- /* We only support device-tree instantiation */
3000
- if (!dn )
3001
- return - ENODEV ;
3002
-
3003
- if (!of_match_node (brcmnand_of_match , dn ))
3003
+ if (dn && !of_match_node (brcmnand_of_match , dn ))
3004
3004
return - ENODEV ;
3005
3005
3006
3006
ctrl = devm_kzalloc (dev , sizeof (* ctrl ), GFP_KERNEL );
@@ -3027,7 +3027,7 @@ int brcmnand_probe(struct platform_device *pdev, struct brcmnand_soc *soc)
3027
3027
/* NAND register range */
3028
3028
res = platform_get_resource (pdev , IORESOURCE_MEM , 0 );
3029
3029
ctrl -> nand_base = devm_ioremap_resource (dev , res );
3030
- if (IS_ERR (ctrl -> nand_base ))
3030
+ if (IS_ERR (ctrl -> nand_base ) && ! brcmnand_soc_has_ops ( soc ) )
3031
3031
return PTR_ERR (ctrl -> nand_base );
3032
3032
3033
3033
/* Enable clock before using NAND registers */
@@ -3171,7 +3171,6 @@ int brcmnand_probe(struct platform_device *pdev, struct brcmnand_soc *soc)
3171
3171
3172
3172
for_each_available_child_of_node (dn , child ) {
3173
3173
if (of_device_is_compatible (child , "brcm,nandcs" )) {
3174
- struct brcmnand_host * host ;
3175
3174
3176
3175
host = devm_kzalloc (dev , sizeof (* host ), GFP_KERNEL );
3177
3176
if (!host ) {
@@ -3191,7 +3190,7 @@ int brcmnand_probe(struct platform_device *pdev, struct brcmnand_soc *soc)
3191
3190
3192
3191
nand_set_flash_node (& host -> chip , child );
3193
3192
3194
- ret = brcmnand_init_cs (host );
3193
+ ret = brcmnand_init_cs (host , NULL );
3195
3194
if (ret ) {
3196
3195
devm_kfree (dev , host );
3197
3196
continue ; /* Try all chip-selects */
@@ -3201,6 +3200,32 @@ int brcmnand_probe(struct platform_device *pdev, struct brcmnand_soc *soc)
3201
3200
}
3202
3201
}
3203
3202
3203
+ if (!list_empty (& ctrl -> host_list ))
3204
+ return 0 ;
3205
+
3206
+ if (!pd ) {
3207
+ ret = - ENODEV ;
3208
+ goto err ;
3209
+ }
3210
+
3211
+ /* If we got there we must have been probing via platform data */
3212
+ host = devm_kzalloc (dev , sizeof (* host ), GFP_KERNEL );
3213
+ if (!host ) {
3214
+ ret = - ENOMEM ;
3215
+ goto err ;
3216
+ }
3217
+ host -> pdev = pdev ;
3218
+ host -> ctrl = ctrl ;
3219
+ host -> cs = pd -> chip_select ;
3220
+ host -> chip .ecc .size = pd -> ecc_stepsize ;
3221
+ host -> chip .ecc .strength = pd -> ecc_strength ;
3222
+
3223
+ ret = brcmnand_init_cs (host , pd -> part_probe_types );
3224
+ if (ret )
3225
+ goto err ;
3226
+
3227
+ list_add_tail (& host -> node , & ctrl -> host_list );
3228
+
3204
3229
/* No chip-selects could initialize properly */
3205
3230
if (list_empty (& ctrl -> host_list )) {
3206
3231
ret = - ENODEV ;
0 commit comments