@@ -2475,10 +2475,10 @@ qcom_nandc_calc_ecc_bytes(int step_size, int strength)
2475
2475
NAND_ECC_CAPS_SINGLE (qcom_nandc_ecc_caps , qcom_nandc_calc_ecc_bytes ,
2476
2476
NANDC_STEP_SIZE , 4 , 8 );
2477
2477
2478
- static int qcom_nand_host_setup (struct qcom_nand_host * host )
2478
+ static int qcom_nand_attach_chip (struct nand_chip * chip )
2479
2479
{
2480
- struct nand_chip * chip = & host -> chip ;
2481
2480
struct mtd_info * mtd = nand_to_mtd (chip );
2481
+ struct qcom_nand_host * host = to_qcom_nand_host (chip );
2482
2482
struct nand_ecc_ctrl * ecc = & chip -> ecc ;
2483
2483
struct qcom_nand_controller * nandc = get_qcom_nand_controller (chip );
2484
2484
int cwperpage , bad_block_byte , ret ;
@@ -2640,6 +2640,10 @@ static int qcom_nand_host_setup(struct qcom_nand_host *host)
2640
2640
return 0 ;
2641
2641
}
2642
2642
2643
+ static const struct nand_controller_ops qcom_nandc_ops = {
2644
+ .attach_chip = qcom_nand_attach_chip ,
2645
+ };
2646
+
2643
2647
static int qcom_nandc_alloc (struct qcom_nand_controller * nandc )
2644
2648
{
2645
2649
int ret ;
@@ -2729,6 +2733,7 @@ static int qcom_nandc_alloc(struct qcom_nand_controller *nandc)
2729
2733
INIT_LIST_HEAD (& nandc -> host_list );
2730
2734
2731
2735
nand_controller_init (& nandc -> controller );
2736
+ nandc -> controller .ops = & qcom_nandc_ops ;
2732
2737
2733
2738
return 0 ;
2734
2739
}
@@ -2781,9 +2786,9 @@ static int qcom_nandc_setup(struct qcom_nand_controller *nandc)
2781
2786
return 0 ;
2782
2787
}
2783
2788
2784
- static int qcom_nand_host_init (struct qcom_nand_controller * nandc ,
2785
- struct qcom_nand_host * host ,
2786
- struct device_node * dn )
2789
+ static int qcom_nand_host_init_and_register (struct qcom_nand_controller * nandc ,
2790
+ struct qcom_nand_host * host ,
2791
+ struct device_node * dn )
2787
2792
{
2788
2793
struct nand_chip * chip = & host -> chip ;
2789
2794
struct mtd_info * mtd = nand_to_mtd (chip );
@@ -2830,30 +2835,13 @@ static int qcom_nand_host_init(struct qcom_nand_controller *nandc,
2830
2835
/* set up initial status value */
2831
2836
host -> status = NAND_STATUS_READY | NAND_STATUS_WP ;
2832
2837
2833
- ret = nand_scan_ident (mtd , 1 , NULL );
2834
- if (ret )
2835
- return ret ;
2836
-
2837
- ret = qcom_nand_host_setup (host );
2838
-
2839
- return ret ;
2840
- }
2841
-
2842
- static int qcom_nand_mtd_register (struct qcom_nand_controller * nandc ,
2843
- struct qcom_nand_host * host ,
2844
- struct device_node * dn )
2845
- {
2846
- struct nand_chip * chip = & host -> chip ;
2847
- struct mtd_info * mtd = nand_to_mtd (chip );
2848
- int ret ;
2849
-
2850
- ret = nand_scan_tail (mtd );
2838
+ ret = nand_scan (mtd , 1 );
2851
2839
if (ret )
2852
2840
return ret ;
2853
2841
2854
2842
ret = mtd_device_register (mtd , NULL , 0 );
2855
2843
if (ret )
2856
- nand_cleanup (mtd_to_nand ( mtd ) );
2844
+ nand_cleanup (chip );
2857
2845
2858
2846
return ret ;
2859
2847
}
@@ -2862,28 +2850,9 @@ static int qcom_probe_nand_devices(struct qcom_nand_controller *nandc)
2862
2850
{
2863
2851
struct device * dev = nandc -> dev ;
2864
2852
struct device_node * dn = dev -> of_node , * child ;
2865
- struct qcom_nand_host * host , * tmp ;
2853
+ struct qcom_nand_host * host ;
2866
2854
int ret ;
2867
2855
2868
- for_each_available_child_of_node (dn , child ) {
2869
- host = devm_kzalloc (dev , sizeof (* host ), GFP_KERNEL );
2870
- if (!host ) {
2871
- of_node_put (child );
2872
- return - ENOMEM ;
2873
- }
2874
-
2875
- ret = qcom_nand_host_init (nandc , host , child );
2876
- if (ret ) {
2877
- devm_kfree (dev , host );
2878
- continue ;
2879
- }
2880
-
2881
- list_add_tail (& host -> node , & nandc -> host_list );
2882
- }
2883
-
2884
- if (list_empty (& nandc -> host_list ))
2885
- return - ENODEV ;
2886
-
2887
2856
if (nandc -> props -> is_bam ) {
2888
2857
free_bam_transaction (nandc );
2889
2858
nandc -> bam_txn = alloc_bam_transaction (nandc );
@@ -2894,12 +2863,20 @@ static int qcom_probe_nand_devices(struct qcom_nand_controller *nandc)
2894
2863
}
2895
2864
}
2896
2865
2897
- list_for_each_entry_safe (host , tmp , & nandc -> host_list , node ) {
2898
- ret = qcom_nand_mtd_register (nandc , host , child );
2866
+ for_each_available_child_of_node (dn , child ) {
2867
+ host = devm_kzalloc (dev , sizeof (* host ), GFP_KERNEL );
2868
+ if (!host ) {
2869
+ of_node_put (child );
2870
+ return - ENOMEM ;
2871
+ }
2872
+
2873
+ ret = qcom_nand_host_init_and_register (nandc , host , child );
2899
2874
if (ret ) {
2900
- list_del (& host -> node );
2901
2875
devm_kfree (dev , host );
2876
+ continue ;
2902
2877
}
2878
+
2879
+ list_add_tail (& host -> node , & nandc -> host_list );
2903
2880
}
2904
2881
2905
2882
if (list_empty (& nandc -> host_list ))
0 commit comments