mirror of
https://github.com/Rockbox/rockbox.git
synced 2025-11-09 21:22:39 -05:00
imx233: introduce virtual pins to simplify pin setup
A number of pins on the imx233 are standard and manually calling functions to acquire, set function/drive/output is painful. This will become unmanageable when we will add support for the other stmp chips. Introduce the concept of virtual pin which is a way to completely describe a virtual pin (virtual because pins are muxed). Change-Id: I01b6e040945648e58e1d1abab06529c9571c5f10
This commit is contained in:
parent
8f351d6e21
commit
84fc327aeb
6 changed files with 156 additions and 52 deletions
|
|
@ -84,10 +84,8 @@ void imx233_i2c_init(void)
|
||||||
{
|
{
|
||||||
BF_SET(I2C_CTRL0, SFTRST);
|
BF_SET(I2C_CTRL0, SFTRST);
|
||||||
/* setup pins (must be done when shutdown) */
|
/* setup pins (must be done when shutdown) */
|
||||||
imx233_pinctrl_acquire(0, 30, "i2c");
|
imx233_pinctrl_setup_vpin(VPIN_I2C_SCL, "i2c scl", PINCTRL_DRIVE_4mA, true);
|
||||||
imx233_pinctrl_acquire(0, 31, "i2c");
|
imx233_pinctrl_setup_vpin(VPIN_I2C_SDA, "i2c sda", PINCTRL_DRIVE_4mA, true);
|
||||||
imx233_pinctrl_set_function(0, 30, PINCTRL_FUNCTION_MAIN);
|
|
||||||
imx233_pinctrl_set_function(0, 31, PINCTRL_FUNCTION_MAIN);
|
|
||||||
/* clear softreset */
|
/* clear softreset */
|
||||||
imx233_reset_block(&HW_I2C_CTRL0);
|
imx233_reset_block(&HW_I2C_CTRL0);
|
||||||
/* Errata:
|
/* Errata:
|
||||||
|
|
|
||||||
|
|
@ -131,4 +131,33 @@ static inline void imx233_pinctrl_enable_pullup_mask(unsigned bank, uint32_t pin
|
||||||
void imx233_pinctrl_setup_irq(unsigned bank, unsigned pin, bool enable_int,
|
void imx233_pinctrl_setup_irq(unsigned bank, unsigned pin, bool enable_int,
|
||||||
bool level, bool polarity, pin_irq_cb_t cb, intptr_t user);
|
bool level, bool polarity, pin_irq_cb_t cb, intptr_t user);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Virtual pin interface
|
||||||
|
*
|
||||||
|
* This interface provides an easy way to configure standard pins for
|
||||||
|
* devices like SSP, LCD, etc
|
||||||
|
* The point here is that these pins can or cannot exist depending on the
|
||||||
|
* chip and the package and the drivers don't want to mess with that.
|
||||||
|
*
|
||||||
|
* A virtual pin is described by a bank, a pin and the function.
|
||||||
|
*/
|
||||||
|
typedef unsigned vpin_t;
|
||||||
|
#define VPIN_PACK(bank, pin, mux) \
|
||||||
|
((vpin_t)((bank) << 5 | (pin) | PINCTRL_FUNCTION_##mux << 7))
|
||||||
|
#define VPIN_UNPACK_BANK(vpin) (((vpin) >> 5) & 3)
|
||||||
|
#define VPIN_UNPACK_PIN(vpin) (((vpin) >> 0) & 0x1f)
|
||||||
|
#define VPIN_UNPACK_MUX(vpin) (((vpin) >> 7) & 3)
|
||||||
|
|
||||||
|
static inline void imx233_pinctrl_setup_vpin(vpin_t vpin, const char *name,
|
||||||
|
unsigned drive, bool pullup)
|
||||||
|
{
|
||||||
|
unsigned bank = VPIN_UNPACK_BANK(vpin), pin = VPIN_UNPACK_PIN(vpin);
|
||||||
|
imx233_pinctrl_acquire(bank, pin, name);
|
||||||
|
imx233_pinctrl_set_function(bank, pin, VPIN_UNPACK_MUX(vpin));
|
||||||
|
imx233_pinctrl_set_drive(bank, pin, drive);
|
||||||
|
imx233_pinctrl_enable_pullup(bank, pin, pullup);
|
||||||
|
}
|
||||||
|
|
||||||
|
#include "pins/pins-imx233.h"
|
||||||
|
|
||||||
#endif /* __PINCTRL_IMX233_H__ */
|
#endif /* __PINCTRL_IMX233_H__ */
|
||||||
|
|
|
||||||
83
firmware/target/arm/imx233/pins/pins-imx233.h
Normal file
83
firmware/target/arm/imx233/pins/pins-imx233.h
Normal file
|
|
@ -0,0 +1,83 @@
|
||||||
|
/***************************************************************************
|
||||||
|
* __________ __ ___.
|
||||||
|
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
||||||
|
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
||||||
|
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
||||||
|
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
||||||
|
* \/ \/ \/ \/ \/
|
||||||
|
* $Id$
|
||||||
|
*
|
||||||
|
* Copyright © 2013 by Amaury Pouly
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 2
|
||||||
|
* of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||||
|
* KIND, either express or implied.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
#ifndef __PINS_IMX233__
|
||||||
|
#define __PINS_IMX233__
|
||||||
|
|
||||||
|
#define VPIN_PWM(channel) VPIN_PACK(1, 26 + (channel), MAIN)
|
||||||
|
|
||||||
|
#define VPIN_I2C_SCL VPIN_PACK(0, 30, MAIN)
|
||||||
|
#define VPIN_I2C_SDA VPIN_PACK(0, 31, MAIN)
|
||||||
|
|
||||||
|
#define VPIN_SSP1_DET VPIN_PACK(2, 1, MAIN)
|
||||||
|
#define VPIN_SSP1_CMD VPIN_PACK(2, 0, MAIN)
|
||||||
|
#define VPIN_SSP1_SCK VPIN_PACK(2, 6, MAIN)
|
||||||
|
#define VPIN_SSP1_D0 VPIN_PACK(2, 2, MAIN)
|
||||||
|
#define VPIN_SSP1_D1 VPIN_PACK(2, 3, MAIN)
|
||||||
|
#define VPIN_SSP1_D2 VPIN_PACK(2, 4, MAIN)
|
||||||
|
#define VPIN_SSP1_D3 VPIN_PACK(2, 5, MAIN)
|
||||||
|
#define VPIN_SSP1_D4 VPIN_PACK(0, 8, ALT2)
|
||||||
|
#define VPIN_SSP1_D5 VPIN_PACK(0, 9, ALT2)
|
||||||
|
#define VPIN_SSP1_D6 VPIN_PACK(0, 10, ALT2)
|
||||||
|
#define VPIN_SSP1_D7 VPIN_PACK(0, 11, ALT2)
|
||||||
|
#define VPIN_SSP1_D4_ALT VPIN_PACK(0, 26, ALT2)
|
||||||
|
#define VPIN_SSP1_D5_ALT VPIN_PACK(0, 27, ALT2)
|
||||||
|
#define VPIN_SSP1_D6_ALT VPIN_PACK(0, 28, ALT2)
|
||||||
|
#define VPIN_SSP1_D7_ALT VPIN_PACK(0, 29, ALT2)
|
||||||
|
|
||||||
|
#define VPIN_SSP2_DET VPIN_PACK(0, 19, ALT2)
|
||||||
|
#define VPIN_SSP2_CMD VPIN_PACK(0, 20, ALT2)
|
||||||
|
#define VPIN_SSP2_SCK VPIN_PACK(0, 24, ALT2)
|
||||||
|
#define VPIN_SSP2_D0 VPIN_PACK(0, 0, ALT2)
|
||||||
|
#define VPIN_SSP2_D1 VPIN_PACK(0, 1, ALT2)
|
||||||
|
#define VPIN_SSP2_D2 VPIN_PACK(0, 2, ALT2)
|
||||||
|
#define VPIN_SSP2_D3 VPIN_PACK(0, 3, ALT2)
|
||||||
|
#define VPIN_SSP2_D4 VPIN_PACK(0, 4, ALT2)
|
||||||
|
#define VPIN_SSP2_D5 VPIN_PACK(0, 5, ALT2)
|
||||||
|
#define VPIN_SSP2_D6 VPIN_PACK(0, 6, ALT2)
|
||||||
|
#define VPIN_SSP2_D7 VPIN_PACK(0, 7, ALT2)
|
||||||
|
|
||||||
|
#define VPIN_UARTDBG_TX VPIN_PACK(1, 27, ALT2)
|
||||||
|
#define VPIN_UARTDBG_RX VPIN_PACK(1, 26, ALT2)
|
||||||
|
|
||||||
|
#define VPIN_LCD_D0 VPIN_PACK(1, 0, MAIN)
|
||||||
|
#define VPIN_LCD_D1 VPIN_PACK(1, 1, MAIN)
|
||||||
|
#define VPIN_LCD_D2 VPIN_PACK(1, 2, MAIN)
|
||||||
|
#define VPIN_LCD_D3 VPIN_PACK(1, 3, MAIN)
|
||||||
|
#define VPIN_LCD_D4 VPIN_PACK(1, 4, MAIN)
|
||||||
|
#define VPIN_LCD_D5 VPIN_PACK(1, 5, MAIN)
|
||||||
|
#define VPIN_LCD_D6 VPIN_PACK(1, 6, MAIN)
|
||||||
|
#define VPIN_LCD_D7 VPIN_PACK(1, 7, MAIN)
|
||||||
|
#define VPIN_LCD_D8 VPIN_PACK(1, 8, MAIN)
|
||||||
|
#define VPIN_LCD_D9 VPIN_PACK(1, 9, MAIN)
|
||||||
|
#define VPIN_LCD_D10 VPIN_PACK(1, 10, MAIN)
|
||||||
|
#define VPIN_LCD_D11 VPIN_PACK(1, 11, MAIN)
|
||||||
|
#define VPIN_LCD_D12 VPIN_PACK(1, 12, MAIN)
|
||||||
|
#define VPIN_LCD_D13 VPIN_PACK(1, 13, MAIN)
|
||||||
|
#define VPIN_LCD_D14 VPIN_PACK(1, 14, MAIN)
|
||||||
|
#define VPIN_LCD_D15 VPIN_PACK(1, 15, MAIN)
|
||||||
|
#define VPIN_LCD_D16 VPIN_PACK(1, 16, MAIN)
|
||||||
|
#define VPIN_LCD_D17 VPIN_PACK(1, 17, MAIN)
|
||||||
|
#define VPIN_LCD_RESET VPIN_PACK(1, 18, MAIN)
|
||||||
|
#define VPIN_LCD_RS VPIN_PACK(1, 19, MAIN)
|
||||||
|
#define VPIN_LCD_WR VPIN_PACK(1, 20, MAIN)
|
||||||
|
#define VPIN_LCD_CS VPIN_PACK(1, 21, MAIN)
|
||||||
|
|
||||||
|
#endif /* __PINS_IMX233__ */
|
||||||
|
|
@ -49,12 +49,7 @@ void imx233_pwm_setup_channel(int channel, int period, int cdiv, int active,
|
||||||
if(enable)
|
if(enable)
|
||||||
imx233_pwm_enable_channel(channel, false);
|
imx233_pwm_enable_channel(channel, false);
|
||||||
/* setup pin */
|
/* setup pin */
|
||||||
imx233_pinctrl_acquire(IMX233_PWM_PIN_BANK(channel),
|
imx233_pinctrl_setup_vpin(VPIN_PWM(channel), "pwm", PINCTRL_DRIVE_4mA, false);
|
||||||
IMX233_PWM_PIN(channel), "pwm");
|
|
||||||
imx233_pinctrl_set_function(IMX233_PWM_PIN_BANK(channel), IMX233_PWM_PIN(channel),
|
|
||||||
PINCTRL_FUNCTION_MAIN);
|
|
||||||
imx233_pinctrl_set_drive(IMX233_PWM_PIN_BANK(channel), IMX233_PWM_PIN(channel),
|
|
||||||
PINCTRL_DRIVE_4mA);
|
|
||||||
/* watch the order ! active THEN period */
|
/* watch the order ! active THEN period */
|
||||||
HW_PWM_ACTIVEn(channel) = BF_OR2(PWM_ACTIVEn, ACTIVE(active), INACTIVE(inactive));
|
HW_PWM_ACTIVEn(channel) = BF_OR2(PWM_ACTIVEn, ACTIVE(active), INACTIVE(inactive));
|
||||||
HW_PWM_PERIODn(channel) = BF_OR4(PWM_PERIODn, PERIOD(period - 1),
|
HW_PWM_PERIODn(channel) = BF_OR4(PWM_PERIODn, PERIOD(period - 1),
|
||||||
|
|
|
||||||
|
|
@ -200,7 +200,7 @@ static void sdmmc_power(int drive, bool on)
|
||||||
{
|
{
|
||||||
int bank = PIN2BANK(SDMMC_CONF(drive).power_pin);
|
int bank = PIN2BANK(SDMMC_CONF(drive).power_pin);
|
||||||
int pin = PIN2PIN(SDMMC_CONF(drive).power_pin);
|
int pin = PIN2PIN(SDMMC_CONF(drive).power_pin);
|
||||||
imx233_pinctrl_acquire(bank, pin, "sd/mmc power");
|
imx233_pinctrl_acquire(bank, pin, "sdmmc_power");
|
||||||
imx233_pinctrl_set_function(bank, pin, PINCTRL_FUNCTION_GPIO);
|
imx233_pinctrl_set_function(bank, pin, PINCTRL_FUNCTION_GPIO);
|
||||||
imx233_pinctrl_enable_gpio(bank, pin, true);
|
imx233_pinctrl_enable_gpio(bank, pin, true);
|
||||||
if(SDMMC_FLAGS(drive) & POWER_INVERTED)
|
if(SDMMC_FLAGS(drive) & POWER_INVERTED)
|
||||||
|
|
|
||||||
|
|
@ -167,39 +167,33 @@ void imx233_ssp_set_timings(int ssp, int divide, int rate, int timeout)
|
||||||
void imx233_ssp_setup_ssp1_sd_mmc_pins(bool enable_pullups, unsigned bus_width,
|
void imx233_ssp_setup_ssp1_sd_mmc_pins(bool enable_pullups, unsigned bus_width,
|
||||||
unsigned drive_strength, bool use_alt)
|
unsigned drive_strength, bool use_alt)
|
||||||
{
|
{
|
||||||
|
(void) use_alt;
|
||||||
/* SSP_{CMD,SCK} */
|
/* SSP_{CMD,SCK} */
|
||||||
imx233_pinctrl_set_drive(2, 0, drive_strength);
|
imx233_pinctrl_setup_vpin(VPIN_SSP1_CMD, "ssp1_cmd", drive_strength, enable_pullups);
|
||||||
imx233_pinctrl_set_drive(2, 6, drive_strength);
|
imx233_pinctrl_setup_vpin(VPIN_SSP1_SCK, "ssp1_sck", drive_strength, false);
|
||||||
imx233_pinctrl_acquire(2, 0, "ssp1 cmd");
|
|
||||||
imx233_pinctrl_acquire(2, 6, "ssp1 sck");
|
|
||||||
imx233_pinctrl_set_function(2, 0, PINCTRL_FUNCTION_MAIN);
|
|
||||||
imx233_pinctrl_set_function(2, 6, PINCTRL_FUNCTION_MAIN);
|
|
||||||
imx233_pinctrl_enable_pullup(2, 0, enable_pullups);
|
|
||||||
/* SSP_DATA{0-3} */
|
/* SSP_DATA{0-3} */
|
||||||
for(unsigned i = 0; i < MIN(bus_width, 4); i++)
|
imx233_pinctrl_setup_vpin(VPIN_SSP1_D0, "ssp1_d0", drive_strength, enable_pullups);
|
||||||
|
if(bus_width >= 4)
|
||||||
{
|
{
|
||||||
imx233_pinctrl_acquire(2, 2 + i, "ssp1 data");
|
imx233_pinctrl_setup_vpin(VPIN_SSP1_D1, "ssp1_d1", drive_strength, enable_pullups);
|
||||||
imx233_pinctrl_set_drive(2, 2 + i, drive_strength);
|
imx233_pinctrl_setup_vpin(VPIN_SSP1_D2, "ssp1_d2", drive_strength, enable_pullups);
|
||||||
imx233_pinctrl_set_function(2, 2 + i, PINCTRL_FUNCTION_MAIN);
|
imx233_pinctrl_setup_vpin(VPIN_SSP1_D3, "ssp1_d3", drive_strength, enable_pullups);
|
||||||
imx233_pinctrl_enable_pullup(2, 2 + i, enable_pullups);
|
|
||||||
}
|
}
|
||||||
|
if(bus_width >= 8)
|
||||||
/* SSP_DATA{4-7} */
|
|
||||||
for(unsigned i = 4; i < bus_width; i++)
|
|
||||||
{
|
{
|
||||||
if(use_alt)
|
if(use_alt)
|
||||||
{
|
{
|
||||||
imx233_pinctrl_acquire(0, 22 + i, "ssp1 data");
|
imx233_pinctrl_setup_vpin(VPIN_SSP1_D4_ALT, "ssp1_d4", drive_strength, enable_pullups);
|
||||||
imx233_pinctrl_set_drive(0, 22 + i, drive_strength);
|
imx233_pinctrl_setup_vpin(VPIN_SSP1_D5_ALT, "ssp1_d5", drive_strength, enable_pullups);
|
||||||
imx233_pinctrl_set_function(0, 22 + i, PINCTRL_FUNCTION_ALT2);
|
imx233_pinctrl_setup_vpin(VPIN_SSP1_D6_ALT, "ssp1_d6", drive_strength, enable_pullups);
|
||||||
imx233_pinctrl_enable_pullup(0, 22 + i, enable_pullups);
|
imx233_pinctrl_setup_vpin(VPIN_SSP1_D7_ALT, "ssp1_d7", drive_strength, enable_pullups);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
imx233_pinctrl_acquire(0, 4 + i, "ssp1 data");
|
imx233_pinctrl_setup_vpin(VPIN_SSP1_D4, "ssp1_d4", drive_strength, enable_pullups);
|
||||||
imx233_pinctrl_set_drive(0, 4 + i, drive_strength);
|
imx233_pinctrl_setup_vpin(VPIN_SSP1_D5, "ssp1_d5", drive_strength, enable_pullups);
|
||||||
imx233_pinctrl_set_function(0, 4 + i, PINCTRL_FUNCTION_ALT2);
|
imx233_pinctrl_setup_vpin(VPIN_SSP1_D6, "ssp1_d6", drive_strength, enable_pullups);
|
||||||
imx233_pinctrl_enable_pullup(0, 4 + i, enable_pullups);
|
imx233_pinctrl_setup_vpin(VPIN_SSP1_D7, "ssp1_d7", drive_strength, enable_pullups);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -207,23 +201,26 @@ void imx233_ssp_setup_ssp1_sd_mmc_pins(bool enable_pullups, unsigned bus_width,
|
||||||
void imx233_ssp_setup_ssp2_sd_mmc_pins(bool enable_pullups, unsigned bus_width,
|
void imx233_ssp_setup_ssp2_sd_mmc_pins(bool enable_pullups, unsigned bus_width,
|
||||||
unsigned drive_strength)
|
unsigned drive_strength)
|
||||||
{
|
{
|
||||||
|
(void) enable_pullups;
|
||||||
|
(void) bus_width;
|
||||||
|
(void) drive_strength;
|
||||||
/* SSP_{CMD,SCK} */
|
/* SSP_{CMD,SCK} */
|
||||||
imx233_pinctrl_acquire(0, 20, "ssp2 cmd");
|
imx233_pinctrl_setup_vpin(VPIN_SSP2_CMD, "ssp2_cmd", drive_strength, enable_pullups);
|
||||||
imx233_pinctrl_acquire(0, 24, "ssp2 sck");
|
imx233_pinctrl_setup_vpin(VPIN_SSP2_SCK, "ssp2_sck", drive_strength, false);
|
||||||
imx233_pinctrl_set_drive(0, 20, drive_strength);
|
/* SSP_DATA{0-3} */
|
||||||
imx233_pinctrl_set_drive(0, 24, drive_strength);
|
imx233_pinctrl_setup_vpin(VPIN_SSP2_D0, "ssp2_d0", drive_strength, enable_pullups);
|
||||||
imx233_pinctrl_set_function(0, 20, PINCTRL_FUNCTION_ALT2);
|
if(bus_width >= 4)
|
||||||
imx233_pinctrl_set_function(0, 24, PINCTRL_FUNCTION_ALT2);
|
|
||||||
imx233_pinctrl_enable_pullup(0, 20, enable_pullups);
|
|
||||||
/* SSP_DATA{0-7}*/
|
|
||||||
for(unsigned i = 0; i < bus_width; i++)
|
|
||||||
{
|
{
|
||||||
imx233_pinctrl_acquire(0, i, "ssp2 data");
|
imx233_pinctrl_setup_vpin(VPIN_SSP2_D1, "ssp2_d1", drive_strength, enable_pullups);
|
||||||
imx233_pinctrl_set_drive(0, i, drive_strength);
|
imx233_pinctrl_setup_vpin(VPIN_SSP2_D2, "ssp2_d2", drive_strength, enable_pullups);
|
||||||
imx233_pinctrl_set_function(0, i, PINCTRL_FUNCTION_ALT2);
|
imx233_pinctrl_setup_vpin(VPIN_SSP2_D3, "ssp2_d3", drive_strength, enable_pullups);
|
||||||
imx233_pinctrl_enable_pullup(0, i, enable_pullups);
|
}
|
||||||
imx233_pinctrl_enable_gpio(0, i, false);
|
if(bus_width >= 8)
|
||||||
imx233_pinctrl_set_gpio(0, i, false);
|
{
|
||||||
|
imx233_pinctrl_setup_vpin(VPIN_SSP2_D4, "ssp2_d4", drive_strength, enable_pullups);
|
||||||
|
imx233_pinctrl_setup_vpin(VPIN_SSP2_D5, "ssp2_d5", drive_strength, enable_pullups);
|
||||||
|
imx233_pinctrl_setup_vpin(VPIN_SSP2_D6, "ssp2_d6", drive_strength, enable_pullups);
|
||||||
|
imx233_pinctrl_setup_vpin(VPIN_SSP2_D7, "ssp2_d7", drive_strength, enable_pullups);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -358,13 +355,15 @@ void imx233_ssp_sdmmc_setup_detect(int ssp, bool enable, ssp_detect_cb_t fn,
|
||||||
bool first_time, bool invert)
|
bool first_time, bool invert)
|
||||||
{
|
{
|
||||||
ASSERT_SSP(ssp)
|
ASSERT_SSP(ssp)
|
||||||
int bank = ssp == 1 ? 2 : 0;
|
vpin_t vpin = VPIN_SSP1_DET;
|
||||||
int pin = ssp == 1 ? 1 : 19;
|
if(ssp == 2)
|
||||||
|
vpin = VPIN_SSP2_DET;
|
||||||
|
unsigned bank = VPIN_UNPACK_BANK(vpin), pin = VPIN_UNPACK_PIN(vpin);
|
||||||
ssp_detect_cb[ssp - 1] = fn;
|
ssp_detect_cb[ssp - 1] = fn;
|
||||||
ssp_detect_invert[ssp - 1] = invert;
|
ssp_detect_invert[ssp - 1] = invert;
|
||||||
if(enable)
|
if(enable)
|
||||||
{
|
{
|
||||||
imx233_pinctrl_acquire(bank, pin, ssp == 1 ? "ssp1 detect" : "ssp2 detect");
|
imx233_pinctrl_acquire(bank, pin, ssp == 1 ? "ssp1_det" : "ssp2_det");
|
||||||
imx233_pinctrl_set_function(bank, pin, PINCTRL_FUNCTION_GPIO);
|
imx233_pinctrl_set_function(bank, pin, PINCTRL_FUNCTION_GPIO);
|
||||||
imx233_pinctrl_enable_gpio(bank, pin, false);
|
imx233_pinctrl_enable_gpio(bank, pin, false);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue