| OLD | NEW |
| 1 /* | 1 /* |
| 2 Copyright (c) 2010, Code Aurora Forum. All rights reserved. | 2 Copyright (c) 2010, Code Aurora Forum. All rights reserved. |
| 3 | 3 |
| 4 This program is free software; you can redistribute it and/or modify | 4 This program is free software; you can redistribute it and/or modify |
| 5 it under the terms of the GNU General Public License version 2 and | 5 it under the terms of the GNU General Public License version 2 and |
| 6 only version 2 as published by the Free Software Foundation. | 6 only version 2 as published by the Free Software Foundation. |
| 7 | 7 |
| 8 This program is distributed in the hope that it will be useful, | 8 This program is distributed in the hope that it will be useful, |
| 9 but WITHOUT ANY WARRANTY; without even the implied warranty of | 9 but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| (...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 148 } | 148 } |
| 149 | 149 |
| 150 #ifdef CONFIG_DCACHE | 150 #ifdef CONFIG_DCACHE |
| 151 /* Invalidate cache so buffer ADM updated can be seen. */ | 151 /* Invalidate cache so buffer ADM updated can be seen. */ |
| 152 invalidate_dcache_range((uint32_t)data->dest, | 152 invalidate_dcache_range((uint32_t)data->dest, |
| 153 (uint32_t)data->dest + (data->blocks * data->blo
cksize)); | 153 (uint32_t)data->dest + (data->blocks * data->blo
cksize)); |
| 154 #endif | 154 #endif |
| 155 } | 155 } |
| 156 else | 156 else |
| 157 { | 157 { |
| 158 int read_len = ( (data->blocks) * data->blocksize); |
| 159 |
| 158 while( (status = IO_READ32(base + MCI_STATUS)) & MCI_STATUS_READ_DATA_MA
SK) | 160 while( (status = IO_READ32(base + MCI_STATUS)) & MCI_STATUS_READ_DATA_MA
SK) |
| 159 { | 161 { |
| 160 if(status & MCI_STATUS__RXDATA_AVLBL___M) | 162 if(byte_count < read_len) |
| 161 { | 163 { |
| 162 *dest_ptr = IO_READ32(base + MCI_FIFO); | 164 if(status & MCI_STATUS__RXDATA_AVLBL___M) |
| 163 dest_ptr++; | 165 { |
| 164 byte_count += 4; | 166 *dest_ptr = IO_READ32(base + MCI_FIFO); |
| 167 dest_ptr++; |
| 168 byte_count += 4; |
| 169 } |
| 165 } | 170 } |
| 166 } | 171 } |
| 167 } | 172 } |
| 168 return sdcc_read_data_cleanup(mmc); | 173 return sdcc_read_data_cleanup(mmc); |
| 169 } | 174 } |
| 170 | 175 |
| 171 /* Set SD MCLK speed */ | 176 /* Set SD MCLK speed */ |
| 172 static int sdcc_mclk_set(int instance, enum SD_MCLK_speed speed) | 177 static int sdcc_mclk_set(int instance, enum SD_MCLK_speed speed) |
| 173 { | 178 { |
| 174 #ifndef USE_PROC_COMM | 179 #ifndef USE_PROC_COMM |
| 175 #error "use proc_comm" | 180 #error "use proc_comm" |
| 176 #else | 181 #else |
| 177 /* SDCn_NS_REG clk enable bits are turned on automatically as part of */ | |
| 178 /* setting clk speed. No need to enable sdcard clk explicitely */ | |
| 179 proc_comm_set_sdcard_clk(instance, speed); | 182 proc_comm_set_sdcard_clk(instance, speed); |
| 183 proc_comm_enable_sdcard_clk(instance); |
| 180 #endif /*USE_PROC_COMM*/ | 184 #endif /*USE_PROC_COMM*/ |
| 181 | 185 |
| 182 return 0; | 186 return 0; |
| 183 } | 187 } |
| 184 | 188 |
| 185 /* Set bus width and bus clock speed */ | 189 /* Set bus width and bus clock speed */ |
| 186 void sdcc_set_ios(struct mmc *mmc) | 190 void sdcc_set_ios(struct mmc *mmc) |
| 187 { | 191 { |
| 188 uint32_t clk_reg; | 192 uint32_t clk_reg; |
| 189 uint32_t base = ((sdcc_params_t*)(mmc->priv))->base; | 193 uint32_t base = ((sdcc_params_t*)(mmc->priv))->base; |
| (...skipping 291 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 481 { | 485 { |
| 482 /* error */ | 486 /* error */ |
| 483 return -1; | 487 return -1; |
| 484 } | 488 } |
| 485 | 489 |
| 486 /* Enable clock */ | 490 /* Enable clock */ |
| 487 proc_comm_enable_sdcard_pclk(sd->instance); | 491 proc_comm_enable_sdcard_pclk(sd->instance); |
| 488 | 492 |
| 489 /* Set the interface clock */ | 493 /* Set the interface clock */ |
| 490 proc_comm_set_sdcard_clk(sd->instance, MCLK_400KHz); | 494 proc_comm_set_sdcard_clk(sd->instance, MCLK_400KHz); |
| 495 proc_comm_enable_sdcard_clk(sd->instance); |
| 496 |
| 491 | 497 |
| 492 /* Initialize controller */ | 498 /* Initialize controller */ |
| 493 sdcc_controller_init(sd); | 499 sdcc_controller_init(sd); |
| 494 | 500 |
| 495 return 0; | 501 return 0; |
| 496 } | 502 } |
| OLD | NEW |