[RESEND PATCH] ARM :OMAP2+: UART: Remove some of uart default pads
Russ Dill
russ.dill at gmail.com
Mon Apr 9 12:56:38 EDT 2012
> Thanks for the review and suggestions, here is the patch [1] to do the same.
>
> I tested this patch on beagle-xm where uart pin mux was causing clash
> with usb ehci hub gpio nrest pin, now with this patch smsc hub + ethernet
> get enumerated.
Morning. I tested this patch on both next and master on the xM and it
does work, however, I have some comments.
> From 37850b9e80fc4dac050bff5b6dbb67c245be43cc Mon Sep 17 00:00:00 2001
> From: "Govindraj.R" <govindraj.raja at ti.com>
> Date: Mon, 9 Apr 2012 15:16:52 +0530
> Subject: [PATCH] ARM: OMAP2+: UART: Fix usage of default uart pads.
>
> The following commit:
> (7496ba3 ARM: OMAP2+: UART: Add default mux for all uarts)
> added default pads for all uarts. But not all boards tend to
> use all uarts and most of unused uart pins are muxed for
> other purpose. This commit breaks the modules which where trying
> to use unused uart pins on their boards.
>
> So check for the availability of uart pins before filling the pads
> if both tx and rx are available as uart pins then use them for
> filling as default pads where rx pin is muxed dynamically for
> rx wakeup capability.
>
> However the board file owners can use omap_serial_init_port
> and pass mux data part of board data for board specific use cases.
>
> Cc: Felipe Balbi <balbi at ti.com>
> Cc: Kevin Hilman <khilman at ti.com>
> Reported-by: Tony Lindgren <tony at atomide.com>
> Signed-off-by: Govindraj.R <govindraj.raja at ti.com>
> ---
> arch/arm/mach-omap2/mux.c | 2 +-
> arch/arm/mach-omap2/mux.h | 10 +++
> arch/arm/mach-omap2/serial.c | 158 ++++++++++++------------------------------
> 3 files changed, 56 insertions(+), 114 deletions(-)
>
> diff --git a/arch/arm/mach-omap2/mux.c b/arch/arm/mach-omap2/mux.c
> index 65c3391..5334914 100644
> --- a/arch/arm/mach-omap2/mux.c
> +++ b/arch/arm/mach-omap2/mux.c
> @@ -217,7 +217,7 @@ static int __init _omap_mux_get_by_name(struct
> omap_mux_partition *partition,
It seems your mailer might be eating your patches....What mailer are you using?
> return -ENODEV;
> }
>
> -static int __init
> +int __init
> omap_mux_get_by_name(const char *muxname,
> struct omap_mux_partition **found_partition,
> struct omap_mux **found_mux)
> diff --git a/arch/arm/mach-omap2/mux.h b/arch/arm/mach-omap2/mux.h
> index 69fe060..461b90d 100644
> --- a/arch/arm/mach-omap2/mux.h
> +++ b/arch/arm/mach-omap2/mux.h
> @@ -225,8 +225,18 @@ omap_hwmod_mux_init(struct omap_device_pad
> *bpads, int nr_pads);
> */
> void omap_hwmod_mux(struct omap_hwmod_mux_info *hmux, u8 state);
>
> +int omap_mux_get_by_name(const char *muxname,
> + struct omap_mux_partition **found_partition,
> + struct omap_mux **found_mux);
> #else
>
> +static inline int omap_mux_get_by_name(const char *muxname,
> + struct omap_mux_partition **found_partition,
> + struct omap_mux **found_mux)
> +{
> + return 0;
> +}
> +
> static inline int omap_mux_init_gpio(int gpio, int val)
> {
> return 0;
> diff --git a/arch/arm/mach-omap2/serial.c b/arch/arm/mach-omap2/serial.c
> index 0cdd359..30a0f4e 100644
> --- a/arch/arm/mach-omap2/serial.c
> +++ b/arch/arm/mach-omap2/serial.c
> @@ -120,127 +120,59 @@ static void omap_uart_set_smartidle(struct
> platform_device *pdev) {}
> #endif /* CONFIG_PM */
>
> #ifdef CONFIG_OMAP_MUX
> -static struct omap_device_pad default_uart1_pads[] __initdata = {
> - {
> - .name = "uart1_cts.uart1_cts",
> - .enable = OMAP_PIN_INPUT_PULLUP | OMAP_MUX_MODE0,
> - },
> - {
> - .name = "uart1_rts.uart1_rts",
> - .enable = OMAP_PIN_OUTPUT | OMAP_MUX_MODE0,
> - },
> - {
> - .name = "uart1_tx.uart1_tx",
> - .enable = OMAP_PIN_OUTPUT | OMAP_MUX_MODE0,
> - },
> - {
> - .name = "uart1_rx.uart1_rx",
> - .flags = OMAP_DEVICE_PAD_REMUX | OMAP_DEVICE_PAD_WAKEUP,
> - .enable = OMAP_PIN_INPUT_PULLUP | OMAP_MUX_MODE0,
> - .idle = OMAP_PIN_INPUT_PULLUP | OMAP_MUX_MODE0,
> - },
> -};
>
> -static struct omap_device_pad default_uart2_pads[] __initdata = {
> - {
> - .name = "uart2_cts.uart2_cts",
> - .enable = OMAP_PIN_INPUT_PULLUP | OMAP_MUX_MODE0,
> - },
> - {
> - .name = "uart2_rts.uart2_rts",
> - .enable = OMAP_PIN_OUTPUT | OMAP_MUX_MODE0,
> - },
> - {
> - .name = "uart2_tx.uart2_tx",
> - .enable = OMAP_PIN_OUTPUT | OMAP_MUX_MODE0,
> - },
> - {
> - .name = "uart2_rx.uart2_rx",
> - .flags = OMAP_DEVICE_PAD_REMUX | OMAP_DEVICE_PAD_WAKEUP,
> - .enable = OMAP_PIN_INPUT_PULLUP | OMAP_MUX_MODE0,
> - .idle = OMAP_PIN_INPUT_PULLUP | OMAP_MUX_MODE0,
> - },
> -};
> -
> -static struct omap_device_pad default_uart3_pads[] __initdata = {
> - {
> - .name = "uart3_cts_rctx.uart3_cts_rctx",
> - .enable = OMAP_PIN_INPUT_PULLUP | OMAP_MUX_MODE0,
> - },
> - {
> - .name = "uart3_rts_sd.uart3_rts_sd",
> - .enable = OMAP_PIN_OUTPUT | OMAP_MUX_MODE0,
> - },
> - {
> - .name = "uart3_tx_irtx.uart3_tx_irtx",
> - .enable = OMAP_PIN_OUTPUT | OMAP_MUX_MODE0,
> - },
> - {
> - .name = "uart3_rx_irrx.uart3_rx_irrx",
> - .flags = OMAP_DEVICE_PAD_REMUX | OMAP_DEVICE_PAD_WAKEUP,
> - .enable = OMAP_PIN_INPUT | OMAP_MUX_MODE0,
> - .idle = OMAP_PIN_INPUT | OMAP_MUX_MODE0,
> - },
> -};
> +#define OMAP_UART_DEFAULT_PAD_NAME_LEN 28
> +static char __initdata rx_pad_name[OMAP_UART_DEFAULT_PAD_NAME_LEN],
> + tx_pad_name[OMAP_UART_DEFAULT_PAD_NAME_LEN];
>
> -static struct omap_device_pad default_omap36xx_uart4_pads[] __initdata = {
> - {
> - .name = "gpmc_wait2.uart4_tx",
> - .enable = OMAP_PIN_OUTPUT | OMAP_MUX_MODE0,
> - },
> - {
> - .name = "gpmc_wait3.uart4_rx",
> - .flags = OMAP_DEVICE_PAD_REMUX | OMAP_DEVICE_PAD_WAKEUP,
> - .enable = OMAP_PIN_INPUT | OMAP_MUX_MODE2,
> - .idle = OMAP_PIN_INPUT | OMAP_MUX_MODE2,
> - },
> -};
> +static void __init omap_serial_fill_default_pads(struct
> omap_board_data *bdata)
> +{
> + struct omap_mux_partition *tx_partition = NULL, *rx_partition = NULL;
> + struct omap_mux *rx_mux = NULL, *tx_mux = NULL;
> + struct omap_device_pad default_omap_uart_pads[2];
> +
> + if (bdata->id != 2) {
> + snprintf(rx_pad_name, OMAP_UART_DEFAULT_PAD_NAME_LEN,
> + "uart%d_rx.uart%d_rx", bdata->id + 1, bdata->id + 1);
> + snprintf(tx_pad_name, OMAP_UART_DEFAULT_PAD_NAME_LEN,
> + "uart%d_tx.uart%d_tx", bdata->id + 1, bdata->id + 1);
> + } else {
> + snprintf(rx_pad_name, OMAP_UART_DEFAULT_PAD_NAME_LEN,
> + "uart%d_rx_irrx.uart%d_rx_irrx", bdata->id + 1,
> + bdata->id + 1);
> + snprintf(tx_pad_name, OMAP_UART_DEFAULT_PAD_NAME_LEN,
> + "uart%d_tx_irtx.uart%d_tx_irtx", bdata->id + 1,
> + bdata->id + 1);
> + }
>
> -static struct omap_device_pad default_omap4_uart4_pads[] __initdata = {
> - {
> - .name = "uart4_tx.uart4_tx",
> - .enable = OMAP_PIN_OUTPUT | OMAP_MUX_MODE0,
> - },
> + if (omap_mux_get_by_name(rx_pad_name, &rx_partition, &rx_mux) >= 0 &&
> + omap_mux_get_by_name(tx_pad_name, &tx_partition, &tx_mux) >= 0)
> {
> - .name = "uart4_rx.uart4_rx",
> - .flags = OMAP_DEVICE_PAD_REMUX | OMAP_DEVICE_PAD_WAKEUP,
> - .enable = OMAP_PIN_INPUT | OMAP_MUX_MODE0,
> - .idle = OMAP_PIN_INPUT | OMAP_MUX_MODE0,
> - },
> -};
> -
> -static void omap_serial_fill_default_pads(struct omap_board_data *bdata)
> -{
> - switch (bdata->id) {
> - case 0:
> - bdata->pads = default_uart1_pads;
> - bdata->pads_cnt = ARRAY_SIZE(default_uart1_pads);
> - break;
> - case 1:
> - bdata->pads = default_uart2_pads;
> - bdata->pads_cnt = ARRAY_SIZE(default_uart2_pads);
> - break;
> - case 2:
> - bdata->pads = default_uart3_pads;
> - bdata->pads_cnt = ARRAY_SIZE(default_uart3_pads);
> - break;
> - case 3:
> - if (cpu_is_omap44xx()) {
> - bdata->pads = default_omap4_uart4_pads;
> - bdata->pads_cnt =
> - ARRAY_SIZE(default_omap4_uart4_pads);
> - } else if (cpu_is_omap3630()) {
> - bdata->pads = default_omap36xx_uart4_pads;
> - bdata->pads_cnt =
> - ARRAY_SIZE(default_omap36xx_uart4_pads);
> + u16 tx_mode, rx_mode;
> +
> + tx_mode = omap_mux_read(tx_partition, tx_mux->reg_offset);
> + rx_mode = omap_mux_read(rx_partition, rx_mux->reg_offset);
> +
> + if (!(rx_mode & 0x07) && !(tx_mode & 0x07)) {
> + default_omap_uart_pads[0].name = rx_pad_name;
> + default_omap_uart_pads[0].flags =
> + OMAP_DEVICE_PAD_REMUX | OMAP_DEVICE_PAD_WAKEUP;
> + default_omap_uart_pads[0].enable = OMAP_PIN_INPUT |
> + OMAP_MUX_MODE0;
> + default_omap_uart_pads[0].idle = OMAP_PIN_INPUT |
> + OMAP_MUX_MODE0;
> +
> + default_omap_uart_pads[1].name = tx_pad_name;
> + default_omap_uart_pads[1].enable = OMAP_PIN_OUTPUT |
> + OMAP_MUX_MODE0;
> + bdata->pads = default_omap_uart_pads;
You are assigning this variable to a structure on the stack.
> + bdata->pads_cnt = ARRAY_SIZE(default_omap_uart_pads);
> }
> - break;
> - default:
> - break;
> }
> }
> #else
> -static void omap_serial_fill_default_pads(struct omap_board_data *bdata) {}
> +static void __init omap_serial_fill_default_pads(struct omap_board_data *bdata)
> +{}
> #endif
>
> char *cmdline_find_option(char *str)
> --
> 1.7.9
> --
> To unsubscribe from this list: send the line "unsubscribe linux-omap" in
> the body of a message to majordomo at vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
More information about the linux-arm-kernel
mailing list