* Högander Jouni <[EMAIL PROTECTED]> [080820 08:50]:
> "ext Russell King - ARM Linux" <[EMAIL PROTECTED]> writes:
> 
> > On Fri, Jun 06, 2008 at 06:47:42PM -0700, Tony Lindgren wrote:
> >> This patch adds common function to enable/disable omap2/3 uart
> >> clocks. Enabled uarts are passed by bootloader in atags and clocks for
> >> these enabled uarts are touched.
> >
> > In some ways, this patch is a good thing, in others it's outrageous.
> >
> >> -static struct clk * uart1_ick = NULL;
> >> -static struct clk * uart1_fck = NULL;
> >> -static struct clk * uart2_ick = NULL;
> >> -static struct clk * uart2_fck = NULL;
> >> -static struct clk * uart3_ick = NULL;
> >> -static struct clk * uart3_fck = NULL;
> >> +static struct clk *uart_ick[OMAP_MAX_NR_PORTS];
> >> +static struct clk *uart_fck[OMAP_MAX_NR_PORTS];
> >>  
> >>  static struct plat_serial8250_port serial_platform_data[] = {
> >>    {
> >> -          .membase        = (char *)IO_ADDRESS(OMAP_UART1_BASE),
> >> +          .membase        = (__force void __iomem 
> >> *)IO_ADDRESS(OMAP_UART1_BASE),
> >
> > __force in drivers is a big no no, immediate patch rejection.  Drivers
> > do not use __force.
> >
> > The reason for adding __iomem is to pick up where people are doing
> > stupid things with pointers, and __force is added in _private_ code
> > (eg, functions supporting IO, mapping functions, etc) to provide a
> > way of saying "this is part of the infrastructure and its permitted
> > to do this conversion."
> >
> > The correct place for that cast, in its entirety, is inside the
> > IO_ADDRESS macro.
> >
> >> @@ -71,7 +67,7 @@ static inline void serial_write_reg(struct 
> >> plat_serial8250_port *p, int offset,
> >>                                int value)
> >>  {
> >>    offset <<= p->regshift;
> >> -  __raw_writeb(value, (unsigned long)(p->membase + offset));
> >> +  __raw_writeb(value, p->membase + offset);
> >
> > Good.
> >
> >> @@ -87,10 +83,27 @@ static inline void __init omap_serial_reset(struct 
> >> plat_serial8250_port *p)
> >>    serial_write_reg(p, UART_OMAP_SYSC, (0x02 << 3) | (1 << 2) | (1 << 0));
> >>  }
> >>  
> >> -void __init omap_serial_init()
> >> +void omap_serial_enable_clocks(int enable)
> >> +{
> >> +  int i;
> >> +  for (i = 0; i < OMAP_MAX_NR_PORTS; i++) {
> >> +          if (uart_ick[i] && uart_fck[i]) {
> >> +                  if (enable) {
> >> +                          clk_enable(uart_ick[i]);
> >> +                          clk_enable(uart_fck[i]);
> >> +                  } else {
> >> +                          clk_disable(uart_ick[i]);
> >> +                          clk_disable(uart_fck[i]);
> >> +                  }
> >> +          }
> >> +  }
> >> +}
> >
> > Urgh.  Why enable all clocks?  I thought OMAP was about being as lean
> > and mean as possible as far as power management goes, so why enable
> > everything and disable everything?
> 
> Not everything, just those that are marked as a enabled by a
> bootloader. This mean basically serial-console uart. If all three omap
> uarts are used as a serial console, then this function will
> disable/enable clocks for all of them.

Or marked as enabled in board-*.c file. The omap ATAGs are not going
to mainline tree as discussed earlier and will get removed from l-o
tree eventually also. Any bootloader tags must be generic, such as
ATAG_UART or something similar.

> > Looking at the omapzoom tree, this function isn't even referenced by
> > another part of the kernel, so maybe this function is just cruft?
> 
> This function is added for dynamic PM to have a mean to enable/disable
> serial console clocks. My intention is to be able to have PM when
> serial console is used without need to reboot the device and changing
> atags from the bootloader. There are patches on linux-omap list which are
> using this. They are not pushed yet.

The long term solution is to switch to omap-uart instead of 8250.c so we
can support DMA and dynamic power and clocking.

> 
> >
> >> +          sprintf(name, "uart%d_ick", i+1);
> >> +          uart_ick[i] = clk_get(NULL, name);
> >> +          if (IS_ERR(uart_ick[i])) {
> >> +                  printk(KERN_ERR "Could not get uart%d_ick\n", i+1);
> >> +                  uart_ick[i] = NULL;
> >> +          } else
> >> +                  clk_enable(uart_ick[i]);
> >> +
> >> +          sprintf(name, "uart%d_fck", i+1);
> >> +          uart_fck[i] = clk_get(NULL, name);
> >> +          if (IS_ERR(uart_fck[i])) {
> >> +                  printk(KERN_ERR "Could not get uart%d_fck\n", i+1);
> >> +                  uart_fck[i] = NULL;
> >> +          } else
> >> +                  clk_enable(uart_fck[i]);
> >
> > Definitely an improvement, but still some way to go yet... but not a
> > reason not to get this in (once the above issues have been resolved.)
> >
> >
> 
> -- 
> Jouni Högander
> 
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to