Rockbox open source high quality audio player as a Music Player Daemon
mpris rockbox mpd libadwaita audio rust zig deno
2
fork

Configure Feed

Select the types of activity you want to include in your feed.

imx233: fix drive strength for sd/mmc

At high speed, we need a drive strength of 8mA on the clock line
to get stable transfers.

Change-Id: Ida668db10cd3e10ad5740e35fd973f2fa394edb2

+47 -40
+13 -7
firmware/target/arm/imx233/sdmmc-imx233.c
··· 206 206 imx233_ssp_sdmmc_is_detect_inverted(ssp)); 207 207 } 208 208 209 + static void sdmmc_enable_pullups(int drive, bool pullup) 210 + { 211 + /* setup pins, never use alternatives pin on SSP1 because no device use it 212 + * but this could be made a flag */ 213 + int bus_width = SDMMC_MODE(drive) == MMC_MODE ? 8 : 4; 214 + if(SDMMC_SSP(drive) == 1) 215 + imx233_ssp_setup_ssp1_sd_mmc_pins(pullup, bus_width, false); 216 + else 217 + imx233_ssp_setup_ssp2_sd_mmc_pins(pullup, bus_width); 218 + } 219 + 209 220 static void sdmmc_power(int drive, bool on) 210 221 { 211 222 /* power chip if needed */ ··· 223 234 } 224 235 if(SDMMC_FLAGS(drive) & POWER_DELAY) 225 236 sleep(SDMMC_CONF(drive).power_delay); 226 - /* setup pins, never use alternatives pin on SSP1 because no device use it 227 - * but this could be made a flag */ 228 - int bus_width = SDMMC_MODE(drive) == MMC_MODE ? 8 : 4; 229 - if(SDMMC_SSP(drive) == 1) 230 - imx233_ssp_setup_ssp1_sd_mmc_pins(on, bus_width, PINCTRL_DRIVE_4mA, false); 231 - else 232 - imx233_ssp_setup_ssp2_sd_mmc_pins(on, bus_width, PINCTRL_DRIVE_4mA); 237 + /* enable pullups for identification */ 238 + sdmmc_enable_pullups(drive, true); 233 239 } 234 240 235 241 #define MCI_NO_RESP 0
+32 -29
firmware/target/arm/imx233/ssp-imx233.c
··· 168 168 void imx233_ssp_set_timings(int ssp, int divide, int rate, int timeout) 169 169 { 170 170 ASSERT_SSP(ssp) 171 + if(divide == 0 || (divide % 2) == 1) 172 + panicf("SSP timing divide must be event"); 171 173 SSP_REGn(SSP_TIMING, ssp) = BF_OR3(SSP_TIMING, CLOCK_DIVIDE(divide), 172 174 CLOCK_RATE(rate), TIMEOUT(timeout)); 173 175 } 174 176 175 - void imx233_ssp_setup_ssp1_sd_mmc_pins(bool enable_pullups, unsigned bus_width, 176 - unsigned drive_strength, bool use_alt) 177 + void imx233_ssp_setup_ssp1_sd_mmc_pins(bool enable_pullups, unsigned bus_width, bool use_alt) 177 178 { 178 179 (void) use_alt; 180 + unsigned clk_drive = PINCTRL_DRIVE_8mA; 181 + unsigned dat_drive = PINCTRL_DRIVE_4mA; 179 182 /* SSP_{CMD,SCK} */ 180 - imx233_pinctrl_setup_vpin(VPIN_SSP1_CMD, "ssp1_cmd", drive_strength, enable_pullups); 181 - imx233_pinctrl_setup_vpin(VPIN_SSP1_SCK, "ssp1_sck", drive_strength, false); 183 + imx233_pinctrl_setup_vpin(VPIN_SSP1_CMD, "ssp1_cmd", dat_drive, enable_pullups); 184 + imx233_pinctrl_setup_vpin(VPIN_SSP1_SCK, "ssp1_sck", clk_drive, false); 182 185 /* SSP_DATA{0-3} */ 183 - imx233_pinctrl_setup_vpin(VPIN_SSP1_D0, "ssp1_d0", drive_strength, enable_pullups); 186 + imx233_pinctrl_setup_vpin(VPIN_SSP1_D0, "ssp1_d0", dat_drive, enable_pullups); 184 187 if(bus_width >= 4) 185 188 { 186 - imx233_pinctrl_setup_vpin(VPIN_SSP1_D1, "ssp1_d1", drive_strength, enable_pullups); 187 - imx233_pinctrl_setup_vpin(VPIN_SSP1_D2, "ssp1_d2", drive_strength, enable_pullups); 188 - imx233_pinctrl_setup_vpin(VPIN_SSP1_D3, "ssp1_d3", drive_strength, enable_pullups); 189 + imx233_pinctrl_setup_vpin(VPIN_SSP1_D1, "ssp1_d1", dat_drive, enable_pullups); 190 + imx233_pinctrl_setup_vpin(VPIN_SSP1_D2, "ssp1_d2", dat_drive, enable_pullups); 191 + imx233_pinctrl_setup_vpin(VPIN_SSP1_D3, "ssp1_d3", dat_drive, enable_pullups); 189 192 } 190 193 if(bus_width >= 8) 191 194 { ··· 193 196 if(use_alt) 194 197 { 195 198 #ifdef VPIN_SSP1_D4_ALT 196 - imx233_pinctrl_setup_vpin(VPIN_SSP1_D4_ALT, "ssp1_d4", drive_strength, enable_pullups); 197 - imx233_pinctrl_setup_vpin(VPIN_SSP1_D5_ALT, "ssp1_d5", drive_strength, enable_pullups); 198 - imx233_pinctrl_setup_vpin(VPIN_SSP1_D6_ALT, "ssp1_d6", drive_strength, enable_pullups); 199 - imx233_pinctrl_setup_vpin(VPIN_SSP1_D7_ALT, "ssp1_d7", drive_strength, enable_pullups); 199 + imx233_pinctrl_setup_vpin(VPIN_SSP1_D4_ALT, "ssp1_d4", dat_drive, enable_pullups); 200 + imx233_pinctrl_setup_vpin(VPIN_SSP1_D5_ALT, "ssp1_d5", dat_drive, enable_pullups); 201 + imx233_pinctrl_setup_vpin(VPIN_SSP1_D6_ALT, "ssp1_d6", dat_drive, enable_pullups); 202 + imx233_pinctrl_setup_vpin(VPIN_SSP1_D7_ALT, "ssp1_d7", dat_drive, enable_pullups); 200 203 #else 201 204 panicf("there is ssp1 alt on this soc!"); 202 205 #endif 203 206 } 204 207 else 205 208 { 206 - imx233_pinctrl_setup_vpin(VPIN_SSP1_D4, "ssp1_d4", drive_strength, enable_pullups); 207 - imx233_pinctrl_setup_vpin(VPIN_SSP1_D5, "ssp1_d5", drive_strength, enable_pullups); 208 - imx233_pinctrl_setup_vpin(VPIN_SSP1_D6, "ssp1_d6", drive_strength, enable_pullups); 209 - imx233_pinctrl_setup_vpin(VPIN_SSP1_D7, "ssp1_d7", drive_strength, enable_pullups); 209 + imx233_pinctrl_setup_vpin(VPIN_SSP1_D4, "ssp1_d4", dat_drive, enable_pullups); 210 + imx233_pinctrl_setup_vpin(VPIN_SSP1_D5, "ssp1_d5", dat_drive, enable_pullups); 211 + imx233_pinctrl_setup_vpin(VPIN_SSP1_D6, "ssp1_d6", dat_drive, enable_pullups); 212 + imx233_pinctrl_setup_vpin(VPIN_SSP1_D7, "ssp1_d7", dat_drive, enable_pullups); 210 213 } 211 214 #else 212 215 panicf("ssp1 bus width is limited to 4 on this soc!"); ··· 214 217 } 215 218 } 216 219 217 - void imx233_ssp_setup_ssp2_sd_mmc_pins(bool enable_pullups, unsigned bus_width, 218 - unsigned drive_strength) 220 + void imx233_ssp_setup_ssp2_sd_mmc_pins(bool enable_pullups, unsigned bus_width) 219 221 { 220 222 (void) enable_pullups; 221 223 (void) bus_width; 222 - (void) drive_strength; 224 + unsigned clk_drive = PINCTRL_DRIVE_8mA; 225 + unsigned dat_drive = PINCTRL_DRIVE_4mA; 223 226 #ifdef VPIN_SSP2_CMD 224 227 /* SSP_{CMD,SCK} */ 225 - imx233_pinctrl_setup_vpin(VPIN_SSP2_CMD, "ssp2_cmd", drive_strength, enable_pullups); 226 - imx233_pinctrl_setup_vpin(VPIN_SSP2_SCK, "ssp2_sck", drive_strength, false); 228 + imx233_pinctrl_setup_vpin(VPIN_SSP2_CMD, "ssp2_cmd", dat_drive, enable_pullups); 229 + imx233_pinctrl_setup_vpin(VPIN_SSP2_SCK, "ssp2_sck", clk_drive, false); 227 230 /* SSP_DATA{0-3} */ 228 - imx233_pinctrl_setup_vpin(VPIN_SSP2_D0, "ssp2_d0", drive_strength, enable_pullups); 231 + imx233_pinctrl_setup_vpin(VPIN_SSP2_D0, "ssp2_d0", dat_drive, enable_pullups); 229 232 if(bus_width >= 4) 230 233 { 231 - imx233_pinctrl_setup_vpin(VPIN_SSP2_D1, "ssp2_d1", drive_strength, enable_pullups); 232 - imx233_pinctrl_setup_vpin(VPIN_SSP2_D2, "ssp2_d2", drive_strength, enable_pullups); 233 - imx233_pinctrl_setup_vpin(VPIN_SSP2_D3, "ssp2_d3", drive_strength, enable_pullups); 234 + imx233_pinctrl_setup_vpin(VPIN_SSP2_D1, "ssp2_d1", dat_drive, enable_pullups); 235 + imx233_pinctrl_setup_vpin(VPIN_SSP2_D2, "ssp2_d2", dat_drive, enable_pullups); 236 + imx233_pinctrl_setup_vpin(VPIN_SSP2_D3, "ssp2_d3", dat_drive, enable_pullups); 234 237 } 235 238 if(bus_width >= 8) 236 239 { 237 - imx233_pinctrl_setup_vpin(VPIN_SSP2_D4, "ssp2_d4", drive_strength, enable_pullups); 238 - imx233_pinctrl_setup_vpin(VPIN_SSP2_D5, "ssp2_d5", drive_strength, enable_pullups); 239 - imx233_pinctrl_setup_vpin(VPIN_SSP2_D6, "ssp2_d6", drive_strength, enable_pullups); 240 - imx233_pinctrl_setup_vpin(VPIN_SSP2_D7, "ssp2_d7", drive_strength, enable_pullups); 240 + imx233_pinctrl_setup_vpin(VPIN_SSP2_D4, "ssp2_d4", dat_drive, enable_pullups); 241 + imx233_pinctrl_setup_vpin(VPIN_SSP2_D5, "ssp2_d5", dat_drive, enable_pullups); 242 + imx233_pinctrl_setup_vpin(VPIN_SSP2_D6, "ssp2_d6", dat_drive, enable_pullups); 243 + imx233_pinctrl_setup_vpin(VPIN_SSP2_D7, "ssp2_d7", dat_drive, enable_pullups); 241 244 } 242 245 #else 243 246 panicf("there is no ssp2 on this soc!");
+2 -4
firmware/target/arm/imx233/ssp-imx233.h
··· 98 98 uint32_t cmd_arg, enum imx233_ssp_resp_t resp, void *buffer, unsigned block_count, 99 99 bool wait4irq, bool read, uint32_t *resp_ptr); 100 100 /* pullups/alternative are ignored on targets which don't support it */ 101 - void imx233_ssp_setup_ssp1_sd_mmc_pins(bool enable_pullups, unsigned bus_width, 102 - unsigned drive_strength, bool use_alt); 103 - void imx233_ssp_setup_ssp2_sd_mmc_pins(bool enable_pullups, unsigned bus_width, 104 - unsigned drive_strength); 101 + void imx233_ssp_setup_ssp1_sd_mmc_pins(bool enable_pullups, unsigned bus_width, bool use_alt); 102 + void imx233_ssp_setup_ssp2_sd_mmc_pins(bool enable_pullups, unsigned bus_width); 105 103 /* after callback is fired, imx233_ssp_sdmmc_setup_detect needs to be called 106 104 * to enable detection again. If first_time is true, the callback will 107 105 * be called if the sd card is inserted when the function is called, otherwise