Skip to content

Commit

Permalink
omap2+: Add struct omap_board_data and use it for platform level seri…
Browse files Browse the repository at this point in the history
…al init

This is needed to pass board specific data such as pads used to the
platform level driver init code.

Signed-off-by: Tony Lindgren <tony@atomide.com>
  • Loading branch information
Tony Lindgren committed Dec 23, 2010
1 parent 8d9af88 commit 40e4439
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 9 deletions.
14 changes: 14 additions & 0 deletions arch/arm/mach-omap2/mux.h
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,20 @@
#define OMAP_MUX_REG_8BIT (1 << 0)
#define OMAP_MUX_GPIO_IN_MODE3 (1 << 1)

/**
* struct omap_board_data - board specific device data
* @id: instance id
* @flags: additional flags for platform init code
* @pads: array of device specific pads
* @pads_cnt: ARRAY_SIZE() of pads
*/
struct omap_board_data {
int id;
u32 flags;
struct omap_device_pad *pads;
int pads_cnt;
};

/**
* struct mux_partition - contain partition related information
* @name: name of the current partition
Expand Down
28 changes: 20 additions & 8 deletions arch/arm/mach-omap2/serial.c
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@
#include "cm2xxx_3xxx.h"
#include "prm-regbits-34xx.h"
#include "control.h"
#include "mux.h"

#define UART_OMAP_NO_EMPTY_FIFO_READ_IP_REV 0x52
#define UART_OMAP_WER 0x17 /* Wake-up enable register */
Expand Down Expand Up @@ -694,16 +695,16 @@ void __init omap_serial_early_init(void)

/**
* omap_serial_init_port() - initialize single serial port
* @port: serial port number (0-3)
* @bdata: port specific board data pointer
*
* This function initialies serial driver for given @port only.
* This function initialies serial driver for given port only.
* Platforms can call this function instead of omap_serial_init()
* if they don't plan to use all available UARTs as serial ports.
*
* Don't mix calls to omap_serial_init_port() and omap_serial_init(),
* use only one of the two.
*/
void __init omap_serial_init_port(int port)
void __init omap_serial_init_port(struct omap_board_data *bdata)
{
struct omap_uart_state *uart;
struct omap_hwmod *oh;
Expand All @@ -721,13 +722,15 @@ void __init omap_serial_init_port(int port)
struct omap_uart_port_info omap_up;
#endif

if (WARN_ON(port < 0))
if (WARN_ON(!bdata))
return;
if (WARN_ON(port >= num_uarts))
if (WARN_ON(bdata->id < 0))
return;
if (WARN_ON(bdata->id >= num_uarts))
return;

list_for_each_entry(uart, &uart_list, node)
if (port == uart->num)
if (bdata->id == uart->num)
break;

oh = uart->oh;
Expand Down Expand Up @@ -799,6 +802,8 @@ void __init omap_serial_init_port(int port)
WARN(IS_ERR(od), "Could not build omap_device for %s: %s.\n",
name, oh->name);

oh->mux = omap_hwmod_mux_init(bdata->pads, bdata->pads_cnt);

uart->irq = oh->mpu_irqs[0].irq;
uart->regshift = 2;
uart->mapbase = oh->slaves[0]->addr->pa_start;
Expand Down Expand Up @@ -856,7 +861,14 @@ void __init omap_serial_init_port(int port)
void __init omap_serial_init(void)
{
struct omap_uart_state *uart;
struct omap_board_data bdata;

list_for_each_entry(uart, &uart_list, node)
omap_serial_init_port(uart->num);
list_for_each_entry(uart, &uart_list, node) {
bdata.id = uart->num;
bdata.flags = 0;
bdata.pads = NULL;
bdata.pads_cnt = 0;
omap_serial_init_port(&bdata);

}
}
5 changes: 4 additions & 1 deletion arch/arm/plat-omap/include/plat/serial.h
Original file line number Diff line number Diff line change
Expand Up @@ -93,9 +93,12 @@
})

#ifndef __ASSEMBLER__

struct omap_board_data;

extern void __init omap_serial_early_init(void);
extern void omap_serial_init(void);
extern void omap_serial_init_port(int port);
extern void omap_serial_init_port(struct omap_board_data *bdata);
extern int omap_uart_can_sleep(void);
extern void omap_uart_check_wakeup(void);
extern void omap_uart_prepare_suspend(void);
Expand Down

0 comments on commit 40e4439

Please sign in to comment.