summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--firmware/target/arm/imx233/debug-imx233.c29
-rw-r--r--firmware/target/arm/imx233/i2c-imx233.c2
-rw-r--r--firmware/target/arm/imx233/mmc-imx233.c1
-rw-r--r--firmware/target/arm/imx233/pinctrl-imx233.c39
-rw-r--r--firmware/target/arm/imx233/pinctrl-imx233.h19
-rw-r--r--firmware/target/arm/imx233/power-imx233.c1
-rw-r--r--firmware/target/arm/imx233/sansa-fuzeplus/backlight-fuzeplus.c1
-rw-r--r--firmware/target/arm/imx233/sansa-fuzeplus/button-fuzeplus.c9
-rw-r--r--firmware/target/arm/imx233/sansa-fuzeplus/fmradio-i2c-fuzeplus.c2
-rw-r--r--firmware/target/arm/imx233/sansa-fuzeplus/lcd-fuzeplus.c9
-rw-r--r--firmware/target/arm/imx233/sansa-fuzeplus/power-fuzeplus.c1
-rw-r--r--firmware/target/arm/imx233/sd-imx233.c1
-rw-r--r--firmware/target/arm/imx233/ssp-imx233.c14
13 files changed, 122 insertions, 6 deletions
diff --git a/firmware/target/arm/imx233/debug-imx233.c b/firmware/target/arm/imx233/debug-imx233.c
index fd510b77c1..59792c17a8 100644
--- a/firmware/target/arm/imx233/debug-imx233.c
+++ b/firmware/target/arm/imx233/debug-imx233.c
@@ -399,13 +399,25 @@ bool dbg_hw_info_pinctrl(void)
399{ 399{
400 lcd_setfont(FONT_SYSFIXED); 400 lcd_setfont(FONT_SYSFIXED);
401 401
402#ifdef IMX233_PINCTRL_DEBUG
403 unsigned top_user = 0;
404#endif
402 while(1) 405 while(1)
403 { 406 {
404 int button = get_action(CONTEXT_STD, HZ / 10); 407 int button = get_action(CONTEXT_STD, HZ / 10);
405 switch(button) 408 switch(button)
406 { 409 {
407 case ACTION_STD_NEXT: 410 case ACTION_STD_NEXT:
411#ifdef IMX233_PINCTRL_DEBUG
412 top_user++;
413 break;
414#endif
408 case ACTION_STD_PREV: 415 case ACTION_STD_PREV:
416#ifdef IMX233_PINCTRL_DEBUG
417 if(top_user > 0)
418 top_user--;
419 break;
420#endif
409 case ACTION_STD_OK: 421 case ACTION_STD_OK:
410 case ACTION_STD_MENU: 422 case ACTION_STD_MENU:
411 lcd_setfont(FONT_UI); 423 lcd_setfont(FONT_UI);
@@ -418,6 +430,23 @@ bool dbg_hw_info_pinctrl(void)
418 lcd_clear_display(); 430 lcd_clear_display();
419 for(int i = 0; i < 4; i++) 431 for(int i = 0; i < 4; i++)
420 lcd_putsf(0, i, "DIN%d = 0x%08x", i, imx233_get_gpio_input_mask(i, 0xffffffff)); 432 lcd_putsf(0, i, "DIN%d = 0x%08x", i, imx233_get_gpio_input_mask(i, 0xffffffff));
433#ifdef IMX233_PINCTRL_DEBUG
434 unsigned cur_line = 6;
435 unsigned last_line = lcd_getheight() / font_get(lcd_getfont())->height;
436 unsigned cur_idx = 0;
437
438 for(int bank = 0; bank < 4; bank++)
439 for(int pin = 0; pin < 32; pin++)
440 {
441 const char *owner = imx233_pinctrl_get_pin_use(bank, pin);
442 if(owner == NULL)
443 continue;
444 if(cur_idx++ >= top_user && cur_line < last_line)
445 lcd_putsf(0, cur_line++, "B%dP%02d %s", bank, pin, owner);
446 }
447 if(cur_idx < top_user)
448 top_user = cur_idx - 1;
449#endif
421 lcd_update(); 450 lcd_update();
422 yield(); 451 yield();
423 } 452 }
diff --git a/firmware/target/arm/imx233/i2c-imx233.c b/firmware/target/arm/imx233/i2c-imx233.c
index 21b66bcde8..199ad181ba 100644
--- a/firmware/target/arm/imx233/i2c-imx233.c
+++ b/firmware/target/arm/imx233/i2c-imx233.c
@@ -57,6 +57,8 @@ void imx233_i2c_init(void)
57{ 57{
58 imx233_reset_block(&HW_I2C_CTRL0); 58 imx233_reset_block(&HW_I2C_CTRL0);
59 /* setup pins (must be done when shutdown) */ 59 /* setup pins (must be done when shutdown) */
60 imx233_pinctrl_acquire_pin(0, 30, "i2c");
61 imx233_pinctrl_acquire_pin(0, 31, "i2c");
60 imx233_set_pin_function(0, 30, PINCTRL_FUNCTION_MAIN); 62 imx233_set_pin_function(0, 30, PINCTRL_FUNCTION_MAIN);
61 imx233_set_pin_function(0, 31, PINCTRL_FUNCTION_MAIN); 63 imx233_set_pin_function(0, 31, PINCTRL_FUNCTION_MAIN);
62 /* clear softreset */ 64 /* clear softreset */
diff --git a/firmware/target/arm/imx233/mmc-imx233.c b/firmware/target/arm/imx233/mmc-imx233.c
index 8782e8e8af..f4dab30bcc 100644
--- a/firmware/target/arm/imx233/mmc-imx233.c
+++ b/firmware/target/arm/imx233/mmc-imx233.c
@@ -63,6 +63,7 @@ int mmc_init(void)
63 #ifdef SANSA_FUZEPLUS 63 #ifdef SANSA_FUZEPLUS
64 /** Sansa Fuze+ has an internal eMMC 8-bit wide flash, power gate is pin PWM3 64 /** Sansa Fuze+ has an internal eMMC 8-bit wide flash, power gate is pin PWM3
65 * and power up time is 20ms */ 65 * and power up time is 20ms */
66 imx233_pinctrl_acquire_pin(1, 29, "emmc power");
66 imx233_set_pin_function(1, 29, PINCTRL_FUNCTION_GPIO); 67 imx233_set_pin_function(1, 29, PINCTRL_FUNCTION_GPIO);
67 imx233_enable_gpio_output(1, 29, true); 68 imx233_enable_gpio_output(1, 29, true);
68 imx233_set_gpio_output(1, 29, false); 69 imx233_set_gpio_output(1, 29, false);
diff --git a/firmware/target/arm/imx233/pinctrl-imx233.c b/firmware/target/arm/imx233/pinctrl-imx233.c
index 7997292fcb..be2d8b2262 100644
--- a/firmware/target/arm/imx233/pinctrl-imx233.c
+++ b/firmware/target/arm/imx233/pinctrl-imx233.c
@@ -21,8 +21,47 @@
21#include "system.h" 21#include "system.h"
22#include "system-target.h" 22#include "system-target.h"
23#include "cpu.h" 23#include "cpu.h"
24#include "string.h"
24#include "pinctrl-imx233.h" 25#include "pinctrl-imx233.h"
25 26
27#ifdef IMX233_PINCTRL_DEBUG
28// 4 banks of 32 pins
29static const char *pin_use[4][32];
30
31void imx233_pinctrl_acquire_pin(unsigned bank, unsigned pin, const char *name)
32{
33 if(pin_use[bank][pin] != NULL && pin_use[bank][pin] != name)
34 panicf("acquire B%dP%02d for %s, was %s!", bank, pin, name, pin_use[bank][pin]);
35 pin_use[bank][pin] = name;
36}
37
38void imx233_pinctrl_acquire_pin_mask(unsigned bank, uint32_t mask, const char *name)
39{
40 for(unsigned pin = 0; pin < 32; pin++)
41 if(mask & (1 << pin))
42 imx233_pinctrl_acquire_pin(bank, pin, name);
43}
44
45void imx233_pinctrl_release_pin(unsigned bank, unsigned pin, const char *name)
46{
47 if(pin_use[bank][pin] != NULL && pin_use[bank][pin] != name)
48 panicf("release B%dP%02d for %s: was %s!", bank, pin, name, pin_use[bank][pin]);
49 pin_use[bank][pin] = NULL;
50}
51
52void imx233_pinctrl_release_pin_mask(unsigned bank, uint32_t mask, const char *name)
53{
54 for(unsigned pin = 0; pin < 32; pin++)
55 if(mask & (1 << pin))
56 imx233_pinctrl_release_pin(bank, pin, name);
57}
58
59const char *imx233_pinctrl_get_pin_use(unsigned bank, unsigned pin)
60{
61 return pin_use[bank][pin];
62}
63#endif
64
26static pin_irq_cb_t pin_cb[3][32]; /* 3 banks, 32 pins/bank */ 65static pin_irq_cb_t pin_cb[3][32]; /* 3 banks, 32 pins/bank */
27 66
28static void INT_GPIO(int bank) 67static void INT_GPIO(int bank)
diff --git a/firmware/target/arm/imx233/pinctrl-imx233.h b/firmware/target/arm/imx233/pinctrl-imx233.h
index ec23410442..5b4b9c4cd5 100644
--- a/firmware/target/arm/imx233/pinctrl-imx233.h
+++ b/firmware/target/arm/imx233/pinctrl-imx233.h
@@ -23,7 +23,10 @@
23#ifndef __PINCTRL_IMX233_H__ 23#ifndef __PINCTRL_IMX233_H__
24#define __PINCTRL_IMX233_H__ 24#define __PINCTRL_IMX233_H__
25 25
26#include "cpu.h" 26#include "config.h"
27
28// set to debug pinctrl use
29#define IMX233_PINCTRL_DEBUG
27 30
28#define HW_PINCTRL_BASE 0x80018000 31#define HW_PINCTRL_BASE 0x80018000
29 32
@@ -51,6 +54,20 @@
51#define PINCTRL_DRIVE_12mA 2 54#define PINCTRL_DRIVE_12mA 2
52#define PINCTRL_DRIVE_16mA 3 /* not available on all pins */ 55#define PINCTRL_DRIVE_16mA 3 /* not available on all pins */
53 56
57#ifdef IMX233_PINCTRL_DEBUG
58void imx233_pinctrl_acquire_pin(unsigned bank, unsigned pin, const char *name);
59void imx233_pinctrl_acquire_pin_mask(unsigned bank, uint32_t mask, const char *name);
60void imx233_pinctrl_release_pin(unsigned bank, unsigned pin, const char *name);
61void imx233_pinctrl_release_pin_mask(unsigned bank, uint32_t mask, const char *name);
62const char *imx233_pinctrl_get_pin_use(unsigned bank, unsigned pin);
63#else
64#define imx233_pinctrl_acquire_pin(...)
65#define imx233_pinctrl_acquire_pin_mask(...)
66#define imx233_pinctrl_release_pin(...)
67#define imx233_pinctrl_release_pin_mask(...)
68#define imx233_pinctrl_get_pin_use(...) NULL
69#endif
70
54typedef void (*pin_irq_cb_t)(int bank, int pin); 71typedef void (*pin_irq_cb_t)(int bank, int pin);
55 72
56static inline void imx233_pinctrl_init(void) 73static inline void imx233_pinctrl_init(void)
diff --git a/firmware/target/arm/imx233/power-imx233.c b/firmware/target/arm/imx233/power-imx233.c
index 2ae7ff653c..be12207793 100644
--- a/firmware/target/arm/imx233/power-imx233.c
+++ b/firmware/target/arm/imx233/power-imx233.c
@@ -114,6 +114,7 @@ void power_off(void)
114 sleep(HZ / 2); 114 sleep(HZ / 2);
115#ifdef SANSA_FUZEPLUS 115#ifdef SANSA_FUZEPLUS
116 /* This pin seems to be important to shutdown the hardware properly */ 116 /* This pin seems to be important to shutdown the hardware properly */
117 imx233_pinctrl_acquire_pin(0, 9, "power off");
117 imx233_set_pin_function(0, 9, PINCTRL_FUNCTION_GPIO); 118 imx233_set_pin_function(0, 9, PINCTRL_FUNCTION_GPIO);
118 imx233_enable_gpio_output(0, 9, true); 119 imx233_enable_gpio_output(0, 9, true);
119 imx233_set_gpio_output(0, 9, true); 120 imx233_set_gpio_output(0, 9, true);
diff --git a/firmware/target/arm/imx233/sansa-fuzeplus/backlight-fuzeplus.c b/firmware/target/arm/imx233/sansa-fuzeplus/backlight-fuzeplus.c
index 6e13c0419c..7f181a9672 100644
--- a/firmware/target/arm/imx233/sansa-fuzeplus/backlight-fuzeplus.c
+++ b/firmware/target/arm/imx233/sansa-fuzeplus/backlight-fuzeplus.c
@@ -41,6 +41,7 @@ void _backlight_set_brightness(int brightness)
41 41
42bool _backlight_init(void) 42bool _backlight_init(void)
43{ 43{
44 imx233_pinctrl_acquire_pin(1, 28, "backlight");
44 imx233_set_pin_function(1, 28, PINCTRL_FUNCTION_GPIO); 45 imx233_set_pin_function(1, 28, PINCTRL_FUNCTION_GPIO);
45 imx233_set_pin_drive_strength(1, 28, PINCTRL_DRIVE_8mA); 46 imx233_set_pin_drive_strength(1, 28, PINCTRL_DRIVE_8mA);
46 imx233_enable_gpio_output(1, 28, true); 47 imx233_enable_gpio_output(1, 28, true);
diff --git a/firmware/target/arm/imx233/sansa-fuzeplus/button-fuzeplus.c b/firmware/target/arm/imx233/sansa-fuzeplus/button-fuzeplus.c
index 26e5a0a102..86bb00f4a5 100644
--- a/firmware/target/arm/imx233/sansa-fuzeplus/button-fuzeplus.c
+++ b/firmware/target/arm/imx233/sansa-fuzeplus/button-fuzeplus.c
@@ -301,7 +301,8 @@ void button_init_device(void)
301 * The B0P26 line seems to be related to the touchpad 301 * The B0P26 line seems to be related to the touchpad
302 */ 302 */
303 303
304 /* touchpad CE ? */ 304 /* touchpad power */
305 imx233_pinctrl_acquire_pin(0, 26, "touchpad power");
305 imx233_set_pin_function(0, 26, PINCTRL_FUNCTION_GPIO); 306 imx233_set_pin_function(0, 26, PINCTRL_FUNCTION_GPIO);
306 imx233_enable_gpio_output(0, 26, false); 307 imx233_enable_gpio_output(0, 26, false);
307 imx233_set_pin_drive_strength(0, 26, PINCTRL_DRIVE_8mA); 308 imx233_set_pin_drive_strength(0, 26, PINCTRL_DRIVE_8mA);
@@ -324,10 +325,12 @@ void button_init_device(void)
324 create_thread(rmi_thread, rmi_stack, sizeof(rmi_stack), 0, 325 create_thread(rmi_thread, rmi_stack, sizeof(rmi_stack), 0,
325 rmi_thread_name IF_PRIO(, PRIORITY_USER_INTERFACE) IF_COP(, CPU)); 326 rmi_thread_name IF_PRIO(, PRIORITY_USER_INTERFACE) IF_COP(, CPU));
326 /* enable interrupt */ 327 /* enable interrupt */
328 imx233_pinctrl_acquire_pin(0, 27, "touchpad int");
327 imx233_set_pin_function(0, 27, PINCTRL_FUNCTION_GPIO); 329 imx233_set_pin_function(0, 27, PINCTRL_FUNCTION_GPIO);
328 imx233_enable_gpio_output(0, 27, false); 330 imx233_enable_gpio_output(0, 27, false);
329 imx233_setup_pin_irq(0, 27, true, true, false, &rmi_attn_cb); 331 imx233_setup_pin_irq(0, 27, true, true, false, &rmi_attn_cb);
330 /* Volume down */ 332 /* Volume down */
333 imx233_pinctrl_acquire_pin(1, 30, "volume down");
331 imx233_set_pin_function(1, 30, PINCTRL_FUNCTION_GPIO); 334 imx233_set_pin_function(1, 30, PINCTRL_FUNCTION_GPIO);
332 imx233_enable_gpio_output(1, 30, false); 335 imx233_enable_gpio_output(1, 30, false);
333} 336}
@@ -336,6 +339,10 @@ void button_init_device(void)
336 339
337void button_init_device(void) 340void button_init_device(void)
338{ 341{
342 /* Volume down */
343 imx233_pinctrl_acquire_pin(1, 30, "volume down");
344 imx233_set_pin_function(1, 30, PINCTRL_FUNCTION_GPIO);
345 imx233_enable_gpio_output(1, 30, false);
339} 346}
340 347
341int touchpad_read_device(void) 348int touchpad_read_device(void)
diff --git a/firmware/target/arm/imx233/sansa-fuzeplus/fmradio-i2c-fuzeplus.c b/firmware/target/arm/imx233/sansa-fuzeplus/fmradio-i2c-fuzeplus.c
index 417f70e406..ee63cd35f6 100644
--- a/firmware/target/arm/imx233/sansa-fuzeplus/fmradio-i2c-fuzeplus.c
+++ b/firmware/target/arm/imx233/sansa-fuzeplus/fmradio-i2c-fuzeplus.c
@@ -87,6 +87,8 @@ struct i2c_interface fmradio_i2c =
87 87
88void fmradio_i2c_init(void) 88void fmradio_i2c_init(void)
89{ 89{
90 imx233_pinctrl_acquire_pin(1, 24, "fmradio i2c");
91 imx233_pinctrl_acquire_pin(1, 22, "fmradio i2c");
90 imx233_set_pin_function(1, 24, PINCTRL_FUNCTION_GPIO); 92 imx233_set_pin_function(1, 24, PINCTRL_FUNCTION_GPIO);
91 imx233_set_pin_function(1, 22, PINCTRL_FUNCTION_GPIO); 93 imx233_set_pin_function(1, 22, PINCTRL_FUNCTION_GPIO);
92 fmradio_i2c_bus = i2c_add_node(&fmradio_i2c); 94 fmradio_i2c_bus = i2c_add_node(&fmradio_i2c);
diff --git a/firmware/target/arm/imx233/sansa-fuzeplus/lcd-fuzeplus.c b/firmware/target/arm/imx233/sansa-fuzeplus/lcd-fuzeplus.c
index b83c49d092..20b46fdc63 100644
--- a/firmware/target/arm/imx233/sansa-fuzeplus/lcd-fuzeplus.c
+++ b/firmware/target/arm/imx233/sansa-fuzeplus/lcd-fuzeplus.c
@@ -56,6 +56,13 @@ static void setup_lcd_pins(bool use_lcdif)
56 /* WARNING 56 /* WARNING
57 * the B1P22 and B1P24 pins are used by the tuner i2c! Do NOT drive 57 * the B1P22 and B1P24 pins are used by the tuner i2c! Do NOT drive
58 * them as lcd_dotclk and lcd_hsync or it will break the tuner! */ 58 * them as lcd_dotclk and lcd_hsync or it will break the tuner! */
59 imx233_pinctrl_acquire_pin(1, 18, "lcd reset");
60 imx233_pinctrl_acquire_pin(1, 19, "lcd rs");
61 imx233_pinctrl_acquire_pin(1, 20, "lcd wr");
62 imx233_pinctrl_acquire_pin(1, 21, "lcd cs");
63 imx233_pinctrl_acquire_pin(1, 23, "lcd enable");
64 imx233_pinctrl_acquire_pin(1, 25, "lcd vsync");
65 imx233_pinctrl_acquire_pin_mask(1, 0x3ffff, "lcd data");
59 if(use_lcdif) 66 if(use_lcdif)
60 { 67 {
61 imx233_set_pin_function(1, 25, PINCTRL_FUNCTION_GPIO); /* lcd_vsync */ 68 imx233_set_pin_function(1, 25, PINCTRL_FUNCTION_GPIO); /* lcd_vsync */
@@ -71,7 +78,7 @@ static void setup_lcd_pins(bool use_lcdif)
71 else 78 else
72 { 79 {
73 __REG_SET(HW_PINCTRL_MUXSEL(2)) = 0xffffffff; /* lcd_d{0-15} */ 80 __REG_SET(HW_PINCTRL_MUXSEL(2)) = 0xffffffff; /* lcd_d{0-15} */
74 imx233_enable_gpio_output_mask(1, 0x3ffffff, false); /* lcd_{d{0-17},reset,rs,wr,cs,dotclk,enable,hsync,vsync} */ 81 imx233_enable_gpio_output_mask(1, 0x2bfffff, false); /* lcd_{d{0-17},reset,rs,wr,cs,enable,vsync} */
75 imx233_set_pin_function(1, 16, PINCTRL_FUNCTION_GPIO); /* lcd_d16 */ 82 imx233_set_pin_function(1, 16, PINCTRL_FUNCTION_GPIO); /* lcd_d16 */
76 imx233_set_pin_function(1, 17, PINCTRL_FUNCTION_GPIO); /* lcd_d17 */ 83 imx233_set_pin_function(1, 17, PINCTRL_FUNCTION_GPIO); /* lcd_d17 */
77 imx233_set_pin_function(1, 19, PINCTRL_FUNCTION_GPIO); /* lcd_rs */ 84 imx233_set_pin_function(1, 19, PINCTRL_FUNCTION_GPIO); /* lcd_rs */
diff --git a/firmware/target/arm/imx233/sansa-fuzeplus/power-fuzeplus.c b/firmware/target/arm/imx233/sansa-fuzeplus/power-fuzeplus.c
index 71c45b0676..89dbfd3cb7 100644
--- a/firmware/target/arm/imx233/sansa-fuzeplus/power-fuzeplus.c
+++ b/firmware/target/arm/imx233/sansa-fuzeplus/power-fuzeplus.c
@@ -33,6 +33,7 @@ bool tuner_power(bool enable)
33 if(enable != tuner_enable) 33 if(enable != tuner_enable)
34 { 34 {
35 /* CE is B029 (active high) */ 35 /* CE is B029 (active high) */
36 imx233_pinctrl_acquire_pin(0, 29, "tuner power");
36 imx233_set_pin_function(0, 29, PINCTRL_FUNCTION_GPIO); 37 imx233_set_pin_function(0, 29, PINCTRL_FUNCTION_GPIO);
37 imx233_set_pin_drive_strength(0, 29, PINCTRL_DRIVE_4mA); 38 imx233_set_pin_drive_strength(0, 29, PINCTRL_DRIVE_4mA);
38 imx233_enable_gpio_output(0, 29, enable); 39 imx233_enable_gpio_output(0, 29, enable);
diff --git a/firmware/target/arm/imx233/sd-imx233.c b/firmware/target/arm/imx233/sd-imx233.c
index b68950b9e8..1e9d001bbd 100644
--- a/firmware/target/arm/imx233/sd-imx233.c
+++ b/firmware/target/arm/imx233/sd-imx233.c
@@ -64,6 +64,7 @@ void sd_power(bool on)
64{ 64{
65 #ifdef SANSA_FUZEPLUS 65 #ifdef SANSA_FUZEPLUS
66 /* The Fuze+ uses pin B0P8 for whatever reason, power ? */ 66 /* The Fuze+ uses pin B0P8 for whatever reason, power ? */
67 imx233_pinctrl_acquire_pin(0, 8, "sd power");
67 imx233_set_pin_function(0, 8, PINCTRL_FUNCTION_GPIO); 68 imx233_set_pin_function(0, 8, PINCTRL_FUNCTION_GPIO);
68 imx233_enable_gpio_output(0, 8, true); 69 imx233_enable_gpio_output(0, 8, true);
69 imx233_set_gpio_output(0, 8, !on); 70 imx233_set_gpio_output(0, 8, !on);
diff --git a/firmware/target/arm/imx233/ssp-imx233.c b/firmware/target/arm/imx233/ssp-imx233.c
index eb7a3a2ad4..cbf537dd07 100644
--- a/firmware/target/arm/imx233/ssp-imx233.c
+++ b/firmware/target/arm/imx233/ssp-imx233.c
@@ -150,12 +150,15 @@ void imx233_ssp_setup_ssp1_sd_mmc_pins(bool enable_pullups, unsigned bus_width,
150 /* SSP_{CMD,SCK} */ 150 /* SSP_{CMD,SCK} */
151 imx233_set_pin_drive_strength(2, 0, drive_strength); 151 imx233_set_pin_drive_strength(2, 0, drive_strength);
152 imx233_set_pin_drive_strength(2, 6, drive_strength); 152 imx233_set_pin_drive_strength(2, 6, drive_strength);
153 imx233_pinctrl_acquire_pin(2, 0, "ssp1 cmd");
154 imx233_pinctrl_acquire_pin(2, 6, "ssp1 sck");
153 imx233_set_pin_function(2, 0, PINCTRL_FUNCTION_MAIN); 155 imx233_set_pin_function(2, 0, PINCTRL_FUNCTION_MAIN);
154 imx233_set_pin_function(2, 6, PINCTRL_FUNCTION_MAIN); 156 imx233_set_pin_function(2, 6, PINCTRL_FUNCTION_MAIN);
155 imx233_enable_pin_pullup(2, 0, enable_pullups); 157 imx233_enable_pin_pullup(2, 0, enable_pullups);
156 /* SSP_DATA{0-3} */ 158 /* SSP_DATA{0-3} */
157 for(unsigned i = 0; i < MIN(bus_width, 4); i++) 159 for(unsigned i = 0; i < MIN(bus_width, 4); i++)
158 { 160 {
161 imx233_pinctrl_acquire_pin(2, 2 + i, "ssp1 data");
159 imx233_set_pin_drive_strength(2, 2 + i, drive_strength); 162 imx233_set_pin_drive_strength(2, 2 + i, drive_strength);
160 imx233_set_pin_function(2, 2 + i, PINCTRL_FUNCTION_MAIN); 163 imx233_set_pin_function(2, 2 + i, PINCTRL_FUNCTION_MAIN);
161 imx233_enable_pin_pullup(2, 2 + i, enable_pullups); 164 imx233_enable_pin_pullup(2, 2 + i, enable_pullups);
@@ -166,12 +169,14 @@ void imx233_ssp_setup_ssp1_sd_mmc_pins(bool enable_pullups, unsigned bus_width,
166 { 169 {
167 if(use_alt) 170 if(use_alt)
168 { 171 {
172 imx233_pinctrl_acquire_pin(0, 22 + i, "ssp1 data");
169 imx233_set_pin_drive_strength(0, 22 + i, drive_strength); 173 imx233_set_pin_drive_strength(0, 22 + i, drive_strength);
170 imx233_set_pin_function(0, 22 + i, PINCTRL_FUNCTION_ALT2); 174 imx233_set_pin_function(0, 22 + i, PINCTRL_FUNCTION_ALT2);
171 imx233_enable_pin_pullup(0, 22 + i, enable_pullups); 175 imx233_enable_pin_pullup(0, 22 + i, enable_pullups);
172 } 176 }
173 else 177 else
174 { 178 {
179 imx233_pinctrl_acquire_pin(0, 4 + i, "ssp1 data");
175 imx233_set_pin_drive_strength(0, 4 + i, drive_strength); 180 imx233_set_pin_drive_strength(0, 4 + i, drive_strength);
176 imx233_set_pin_function(0, 4 + i, PINCTRL_FUNCTION_ALT2); 181 imx233_set_pin_function(0, 4 + i, PINCTRL_FUNCTION_ALT2);
177 imx233_enable_pin_pullup(0, 4 + i, enable_pullups); 182 imx233_enable_pin_pullup(0, 4 + i, enable_pullups);
@@ -183,6 +188,8 @@ void imx233_ssp_setup_ssp2_sd_mmc_pins(bool enable_pullups, unsigned bus_width,
183 unsigned drive_strength) 188 unsigned drive_strength)
184{ 189{
185 /* SSP_{CMD,SCK} */ 190 /* SSP_{CMD,SCK} */
191 imx233_pinctrl_acquire_pin(0, 20, "ssp2 cmd");
192 imx233_pinctrl_acquire_pin(0, 24, "ssp2 sck");
186 imx233_set_pin_drive_strength(0, 20, drive_strength); 193 imx233_set_pin_drive_strength(0, 20, drive_strength);
187 imx233_set_pin_drive_strength(0, 24, drive_strength); 194 imx233_set_pin_drive_strength(0, 24, drive_strength);
188 imx233_set_pin_function(0, 20, PINCTRL_FUNCTION_ALT2); 195 imx233_set_pin_function(0, 20, PINCTRL_FUNCTION_ALT2);
@@ -191,13 +198,13 @@ void imx233_ssp_setup_ssp2_sd_mmc_pins(bool enable_pullups, unsigned bus_width,
191 /* SSP_DATA{0-7}*/ 198 /* SSP_DATA{0-7}*/
192 for(unsigned i = 0; i < bus_width; i++) 199 for(unsigned i = 0; i < bus_width; i++)
193 { 200 {
201 imx233_pinctrl_acquire_pin(0, i, "ssp2 data");
194 imx233_set_pin_drive_strength(0, i, drive_strength); 202 imx233_set_pin_drive_strength(0, i, drive_strength);
195 imx233_set_pin_function(0, i, PINCTRL_FUNCTION_ALT2); 203 imx233_set_pin_function(0, i, PINCTRL_FUNCTION_ALT2);
196 imx233_enable_pin_pullup(0, i, enable_pullups); 204 imx233_enable_pin_pullup(0, i, enable_pullups);
205 imx233_enable_gpio_output(0, i, false);
206 imx233_set_gpio_output(0, i, false);
197 } 207 }
198
199 imx233_enable_gpio_output_mask(0, 0x11000ff, false);
200 imx233_set_gpio_output_mask(0, 0x11000ff, false);
201} 208}
202 209
203void imx233_ssp_set_mode(int ssp, unsigned mode) 210void imx233_ssp_set_mode(int ssp, unsigned mode)
@@ -348,6 +355,7 @@ void imx233_ssp_sdmmc_setup_detect(int ssp, bool enable, ssp_detect_cb_t fn, boo
348 ssp_detect_cb[ssp - 1] = fn; 355 ssp_detect_cb[ssp - 1] = fn;
349 if(enable) 356 if(enable)
350 { 357 {
358 imx233_pinctrl_acquire_pin(bank, pin, ssp == 1 ? "ssp1 detect" : "ssp2 detect");
351 imx233_set_pin_function(bank, pin, PINCTRL_FUNCTION_GPIO); 359 imx233_set_pin_function(bank, pin, PINCTRL_FUNCTION_GPIO);
352 imx233_enable_gpio_output(bank, pin, false); 360 imx233_enable_gpio_output(bank, pin, false);
353 } 361 }