Re: isif - debugging on dm365

2010-04-12 Thread Raffaele Recalcati
Hi Jean-Philippe,

I finally create my patch against f5cef8f45739db4c0c1c346296922cac274c87eb
in attachment, but the problem is that isif_set_hw_if_params is not called
by gstreamer.

If I set in drivers/media/video/davinci/isif.c (and not in
drivers/media/video/davinci/dm365_ccdc.c as I don't have it !!)
   'ycswap=YCIN_NOT_SWP'
it works !!

The board file has no effect on my gstreamer command:
   gst-launch v4l2src ! video/x-raw-yuv ! filesink location=video_new3.raw
see below for my complete logs.

Here you are the board declaration:
static struct vpfe_subdev_info vpfe_sub_devs[] = {
{
.name = adv7180,
.grp_id = 0,
.num_inputs = ARRAY_SIZE(adv7180_inputs),
.inputs = adv7180_inputs,
.routes = adv7180_routes,
.can_route = 1,
.ccdc_if_params = {
.if_type = VPFE_BT656,
.hdpol = VPFE_PINPOL_POSITIVE,
.vdpol = VPFE_PINPOL_POSITIVE,
.ycswap = YCIN_NOT_SWP,
},
.board_info = {
I2C_BOARD_INFO(adv7180, 0x20),
.platform_data = adv7180_pdata,
},
},
};

The patch is very similar to yours, I change only the name of defines
because they seem more clear to me.

The complete log (setting ycswap=YCIN_SWP inside isif.c file in order to try
to get the correct parameter from my board file) follows:
(isif_set_hw_if_params is not called)

r...@dm365-evm:~# gst-launch v4l2src ! video/x-raw-yuv ! filesink
location=video
_new3.raw
Setting pipeline to PAUSED ...
vpfe-capture vpfe-capture: vpfe_open
vpfe-capture vpfe-capture: vpfe_querycap
vpfe-capture vpfe-capture: vpfe_enum_input
vpfe-capture vpfe-capture: vpfe_enum_input
vpfe-capture vpfe-capture: input information not found for the subdev
vpfe-capture vpfe-capture: vpfe_g_std
vpfe-capture vpfe-capture: vpfe_g_input
vpfe-capture vpfe-capture: vpfe_enum_fmt_vid_cap
vpfe-capture vpfe-capture: vpfe_enum_fmt_vid_cap
vpfe-capture vpfe-capture: vpfe_enum_fmt_vid_cap
vpfe-capture vpfe-capture: vpfe_try_fmt_vid_cap
vpfe-capture vpfe-capture: width = 1, height = 1, bpp = 2
vpfe-capture vpfe-capture: adjusted width = 16, height = 2, bpp = 2,
bytesperline = 32, sizeimage = 64
vpfe-capture vpfe-capture: vpfe_try_fmt_vid_cap
vpfe-capture vpfe-capture: width = 32768, height = 32768, bpp = 2
vpfe-capture vpfe-capture: adjusted width = 720, height = 480, bpp = 2,
bytesperline = 1440, sizeimage = 691200
vpfe-capture vpfe-capture: vpfe_try_fmt_vid_cap
vpfe-capture vpfe-capture: width = 1, height = 1, bpp = 2
vpfe-capture vpfe-capture: adjusted width = 16, height = 2, bpp = 2,
bytesperline = 32, sizeimage = 64
vpfe-capture vpfe-capture: vpfe_try_fmt_vid_cap
vpfe-capture vpfe-capture: width = 32768, height = 32768, bpp = 2
vpfe-capture vpfe-capture: adjusted width = 720, height = 480, bpp = 2,
bytesperline = 1440, sizeimage = 691200
vpfe-capture vpfe-capture: vpfe_g_fmt_vid_cap
vpfe-capture vpfe-capture: vpfe_s_fmt_vid_cap
vpfe-capture vpfe-capture: width = 720, height = 480, bpp = 2
vpfe-capture vpfe-capture: adjusted width = 720, height = 480, bpp = 2,
bytesperline = 1440, sizeimage = 691200
vpfe-capture vpfe-capture: vpfe_g_std
vpfe-capture vpfe-capture: vpfe_reqbufs
vpfe-capture vpfe-capture: vpfe_buffer_setup
vpfe-capture vpfe-capture: count=3, size=1147200
vpfe-capture vpfe-capture: vpfe_querybuf
vpfe-capture vpfe-capture: vpfe_mmap
vpfe-capture vpfe-capture: vpfe_querybuf
vpfe-capture vpfe-capture: vpfe_mmap
vpfe-capture vpfe-capture: vpfe_querybuf
vpfe-capture vpfe-capture: vpfe_mmap
vpfe-capture vpfe-capture: vpfe_qbuf
vpfe-capture vpfe-capture: vpfe_buffer_prepare
vpfe-capture vpfe-capture: vpfe_qbuf
vpfe-capture vpfe-capture: vpfe_buffer_prepare
vpfe-capture vpfe-capture: vpfe_qbuf
vpfe-capture vpfe-capture: vpfe_buffer_prepare
vpfe-capture vpfe-capture: vpfe_streamon
vpfe-capture vpfe-capture: vpfe_buffer_queue
vpfe-capture vpfe-capture: vpfe_buffer_queue
vpfe-capture vpfe-capture: vpfe_buffer_queue
vpfe-capture vpfe-capture: vpfe_calculate_offsets
isif_config_ycbcr - if_type = 0
isif_config_ycbcr - ycswap = 1
isif_config_ycbcr -924
isif_config_ycbcr -927
Pipeline is live and does not need PREROLL ...
Setting pipeline to PLAYING ...
vpfe-capture vpfe-capture: vpfe_poll
New clock: GstSystemClock




2010/4/7 Jean-Philippe François jp.franc...@cynove.com

 Raffaele Recalcati a écrit :

  I was adding isif_cfg.y_c_swap variable, but it need a modification inside
 arch/arm/mach-davinci/dm365.c that I think is not the right direction.
 I mean, the isif platform data is not board related, but it is cpu
 related.


 sensor or decoder connection to the isif is definitely board related.

 the ccdc_if_params field of the vpfe_subdev_info struct is used by
 the ccdc code in the ccdc_set_hw_if_params function.

 Here is a patch that implement an ycswap field.
 It is set in the board 

Re: isif - debugging on dm365

2010-04-12 Thread Jean-Philippe François

I suppose it does not work, because isif_set_hw_if params is only called
if the user applications is doing a VIDIOC_S_INPUT.

based on your log, it seems gstreamer does not do that.

I don't know if the driver or the application should be corrected.
May be there is a command switch to gstreamer that allows to specify an input ?
Raffaele Recalcati a écrit :

Hi Jean-Philippe,

I finally create my patch against 
f5cef8f45739db4c0c1c346296922cac274c87eb in attachment, but the problem 
is that isif_set_hw_if_params is not called by gstreamer.


If I set in drivers/media/video/davinci/isif.c (and not in 
drivers/media/video/davinci/dm365_ccdc.c as I don't have it !!)  
   'ycswap=YCIN_NOT_SWP'  
it works !!


The board file has no effect on my gstreamer command:
   gst-launch v4l2src ! video/x-raw-yuv ! filesink location=video_new3.raw
see below for my complete logs.

Here you are the board declaration:
static struct vpfe_subdev_info vpfe_sub_devs[] = {
{
.name = adv7180,
.grp_id = 0,
.num_inputs = ARRAY_SIZE(adv7180_inputs),
.inputs = adv7180_inputs,
.routes = adv7180_routes,
.can_route = 1,
.ccdc_if_params = {
.if_type = VPFE_BT656,
.hdpol = VPFE_PINPOL_POSITIVE,
.vdpol = VPFE_PINPOL_POSITIVE,
.ycswap = YCIN_NOT_SWP,
},
.board_info = {
I2C_BOARD_INFO(adv7180, 0x20),
.platform_data = adv7180_pdata,
},
},
};

The patch is very similar to yours, I change only the name of defines 
because they seem more clear to me.


The complete log (setting ycswap=YCIN_SWP inside isif.c file in order to 
try to get the correct parameter from my board file) follows:

(isif_set_hw_if_params is not called)

r...@dm365-evm:~# gst-launch v4l2src ! video/x-raw-yuv ! filesink 
location=video

_new3.raw
Setting pipeline to PAUSED ...
vpfe-capture vpfe-capture: vpfe_open
vpfe-capture vpfe-capture: vpfe_querycap
vpfe-capture vpfe-capture: vpfe_enum_input
vpfe-capture vpfe-capture: vpfe_enum_input
vpfe-capture vpfe-capture: input information not found for the subdev
vpfe-capture vpfe-capture: vpfe_g_std
vpfe-capture vpfe-capture: vpfe_g_input
vpfe-capture vpfe-capture: vpfe_enum_fmt_vid_cap
vpfe-capture vpfe-capture: vpfe_enum_fmt_vid_cap
vpfe-capture vpfe-capture: vpfe_enum_fmt_vid_cap
vpfe-capture vpfe-capture: vpfe_try_fmt_vid_cap
vpfe-capture vpfe-capture: width = 1, height = 1, bpp = 2
vpfe-capture vpfe-capture: adjusted width = 16, height = 2, bpp = 2, 
bytesperline = 32, sizeimage = 64

vpfe-capture vpfe-capture: vpfe_try_fmt_vid_cap
vpfe-capture vpfe-capture: width = 32768, height = 32768, bpp = 2
vpfe-capture vpfe-capture: adjusted width = 720, height = 480, bpp = 2, 
bytesperline = 1440, sizeimage = 691200

vpfe-capture vpfe-capture: vpfe_try_fmt_vid_cap
vpfe-capture vpfe-capture: width = 1, height = 1, bpp = 2
vpfe-capture vpfe-capture: adjusted width = 16, height = 2, bpp = 2, 
bytesperline = 32, sizeimage = 64

vpfe-capture vpfe-capture: vpfe_try_fmt_vid_cap
vpfe-capture vpfe-capture: width = 32768, height = 32768, bpp = 2
vpfe-capture vpfe-capture: adjusted width = 720, height = 480, bpp = 2, 
bytesperline = 1440, sizeimage = 691200

vpfe-capture vpfe-capture: vpfe_g_fmt_vid_cap
vpfe-capture vpfe-capture: vpfe_s_fmt_vid_cap
vpfe-capture vpfe-capture: width = 720, height = 480, bpp = 2
vpfe-capture vpfe-capture: adjusted width = 720, height = 480, bpp = 2, 
bytesperline = 1440, sizeimage = 691200

vpfe-capture vpfe-capture: vpfe_g_std
vpfe-capture vpfe-capture: vpfe_reqbufs
vpfe-capture vpfe-capture: vpfe_buffer_setup
vpfe-capture vpfe-capture: count=3, size=1147200
vpfe-capture vpfe-capture: vpfe_querybuf
vpfe-capture vpfe-capture: vpfe_mmap
vpfe-capture vpfe-capture: vpfe_querybuf
vpfe-capture vpfe-capture: vpfe_mmap
vpfe-capture vpfe-capture: vpfe_querybuf
vpfe-capture vpfe-capture: vpfe_mmap
vpfe-capture vpfe-capture: vpfe_qbuf
vpfe-capture vpfe-capture: vpfe_buffer_prepare
vpfe-capture vpfe-capture: vpfe_qbuf
vpfe-capture vpfe-capture: vpfe_buffer_prepare
vpfe-capture vpfe-capture: vpfe_qbuf
vpfe-capture vpfe-capture: vpfe_buffer_prepare
vpfe-capture vpfe-capture: vpfe_streamon
vpfe-capture vpfe-capture: vpfe_buffer_queue
vpfe-capture vpfe-capture: vpfe_buffer_queue
vpfe-capture vpfe-capture: vpfe_buffer_queue
vpfe-capture vpfe-capture: vpfe_calculate_offsets
isif_config_ycbcr - if_type = 0
isif_config_ycbcr - ycswap = 1
isif_config_ycbcr -924
isif_config_ycbcr -927
Pipeline is live and does not need PREROLL ...
Setting pipeline to PLAYING ...
vpfe-capture vpfe-capture: vpfe_poll
New clock: GstSystemClock




2010/4/7 Jean-Philippe François jp.franc...@cynove.com 
mailto:jp.franc...@cynove.com


Raffaele Recalcati a écrit :

I was adding isif_cfg.y_c_swap variable, but it need a

Re: dm365 - voice codec

2010-04-12 Thread Raffaele Recalcati
Hello everybody.
If I'm not wrong it doesn't yet exist the voice codec for dm365.
Is there any roadmap to support this peripheral?
Thank in advance.


2010/4/1 Raffaele Recalcati lamiapost...@gmail.com

 It seems that in git kernel this peripheral is not yet supported.
 I search everywere:

 ./arch/arm/mach-davinci/dm365.c:CLK(davinci_voicecodec,
 NULL, voicecodec_clk),
 ./arch/arm/mach-davinci/dm365.c:.name   =
 davinci_voicecodec,

 This means that davinci_voicecodec is not really configured.
 Anybody can please confirm this point and tell me the development roadmap?

 Thx,
 Raffaele




-- 
www.opensurf.it
___
Davinci-linux-open-source mailing list
Davinci-linux-open-source@linux.davincidsp.com
http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source


RE: SPI Support for DA850 (OMAPL-138).

2010-04-12 Thread Brian Niebuhr
Mike - 

I do plan on resubmitting the driver as a replacement driver (remove the old 
and add the updated version) as suggested by TI.  I am just trying to get some 
other work finished up first.  If you want to try the version I submitted, the 
patch was actually against the arago kernel.  You can try patching that version 
and pulling it into your kernel to see if that fixes your issues. Hopefully 
I'll get around to resubmitting the driver for consideration some time this 
week.

Brian

 -Original Message-
 From: davinci-linux-open-source-boun...@linux.davincidsp.com 
 [mailto:davinci-linux-open-source-boun...@linux.davincidsp.com
 ] On Behalf Of Mike Williamson
 Sent: Sunday, April 11, 2010 9:56 AM
 To: davinci-linux-open-source@linux.davincidsp.com
 Subject: SPI Support for DA850 (OMAPL-138).
 
 Hi,
 
 I've been working with Kevin's tree and have been having some problems
 with the SPI interface for the DA850 (OMAP-L138), SPI version 2.
 
 I am getting a lot of failures in the davinci_spi_check_error routine
 that I'm not sure are real errors.  I was googling around and found
 this thread:
 
 http://linux.omap.com/pipermail/davinci-linux-open-source/2009
 -July/015025.html
 
 The thread raises the same issue that I have found in that the routine
 is declaring an error if the status of the SPI engine is claiming that
 the Tx buffer is empty (SPIFLG_TX_INTR_MASK) and there is also a check
 on a bit  (SPIFLG_BUF_INIT_ACTIVE_MASK, bit 24) that is undocumented
 in the SPI user guide.  I found that I had to turn off both of these
 checks in order for the SPI to work with our device in polled mode
 with no DMAs.The device is an m25p64 EEPROM, same configuration as
 on the 850 / OMAPL138 evm.
 
 Can anyone confirm if the spi implementation in Kevin's tree is
 working for VERSION_2 SPI devices (850 specifically), and what SPI
 configuration you're using?
 
 I am also wondering if the SPI patches from Brian Niebuhr have died on
 the wire 
 (http://linux.davincidsp.com/pipermail/davinci-linux-open-sour
 ce/2010-March/018077.html).
  It seemed like he had identified several issues with the driver and
 had taken a crack at sorting them out.
 
 -Mike
 
 
 
 
 --
 Michael Williamson
 315-425-4045x230
 www.criticallink.com
 ___
 Davinci-linux-open-source mailing list
 Davinci-linux-open-source@linux.davincidsp.com
 http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source
 
 

___
Davinci-linux-open-source mailing list
Davinci-linux-open-source@linux.davincidsp.com
http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source


Re: [PATCH v2 14/16] Davinci: tnetv107x gpio implementation

2010-04-12 Thread Cyril Chemparathy

Hi Kevin,


Both the existing functions and the new functions all do basically the same 
thing:
- read base + offset
- set/clear bit(s) based on GPIO#
- write base + offset


Davinci doesn't really do a read-modify-write.  Instead, it sets bits 
into set_data/clr_data registers to indirectly manipulate out_data 
contents.  On the other hand, the tnetv107x controller follows a 
read-modify-write as you've outlined.


This poses a bit of a problem is structuring a common table containing 
register offsets and bitmasks.  Is there a problem with writing to the 
out_data register instead of set/clr_data?


Regards
Cyril.
___
Davinci-linux-open-source mailing list
Davinci-linux-open-source@linux.davincidsp.com
http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source


[PATCH 0/8] davinci common code changes for tnetv107x

2010-04-12 Thread Cyril Chemparathy
This patch series contains a bundle of common code changes that are needed as
a precursor to adding tnetv107x soc support.

Some of these patches were sent out separately earlier, but have also been
included here.

This patch series has been boot-up tested on dm365, thanks to Sandeep.

Cyril Chemparathy (8):
  Davinci: iotable based ioremap() interception
  Davinci: generalized debug macros
  Davinci: configurable pll divider mask
  Davinci: gpio - minor cleanup
  Davinci: gpio - struct renames
  Davinci: gpio - register layout invariant inlines
  Davinci: gpio - controller type support
  Davinci: gpio - fine grained locking

 arch/arm/mach-davinci/clock.c|9 +-
 arch/arm/mach-davinci/clock.h|1 +
 arch/arm/mach-davinci/da830.c|8 +-
 arch/arm/mach-davinci/da850.c|   10 ++-
 arch/arm/mach-davinci/dm355.c|1 +
 arch/arm/mach-davinci/dm365.c|1 +
 arch/arm/mach-davinci/dm644x.c   |1 +
 arch/arm/mach-davinci/dm646x.c   |1 +
 arch/arm/mach-davinci/gpio.c |  133 ++
 arch/arm/mach-davinci/include/mach/common.h  |5 +
 arch/arm/mach-davinci/include/mach/debug-macro.S |   51 +++--
 arch/arm/mach-davinci/include/mach/gpio.h|   72 ++---
 arch/arm/mach-davinci/include/mach/io.h  |4 +
 arch/arm/mach-davinci/include/mach/serial.h  |   13 ++
 arch/arm/mach-davinci/include/mach/uncompress.h  |   80 ++
 arch/arm/mach-davinci/io.c   |   33 +-
 16 files changed, 293 insertions(+), 130 deletions(-)

___
Davinci-linux-open-source mailing list
Davinci-linux-open-source@linux.davincidsp.com
http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source


[PATCH 3/8] Davinci: configurable pll divider mask

2010-04-12 Thread Cyril Chemparathy
This patch allows socs to override the divider ratio mask by setting an
optional field (div_ratio_mask) in the pll_data structure.

Signed-off-by: Cyril Chemparathy cy...@ti.com
Tested-by: Sandeep Paulraj s-paul...@ti.com
---
 arch/arm/mach-davinci/clock.c |9 ++---
 arch/arm/mach-davinci/clock.h |1 +
 2 files changed, 7 insertions(+), 3 deletions(-)

diff --git a/arch/arm/mach-davinci/clock.c b/arch/arm/mach-davinci/clock.c
index 5de60ae..828f434 100644
--- a/arch/arm/mach-davinci/clock.c
+++ b/arch/arm/mach-davinci/clock.c
@@ -279,7 +279,7 @@ static unsigned long clk_sysclk_recalc(struct clk *clk)
 
v = __raw_readl(pll-base + clk-div_reg);
if (v  PLLDIV_EN) {
-   plldiv = (v  PLLDIV_RATIO_MASK) + 1;
+   plldiv = (v  pll-div_ratio_mask) + 1;
if (plldiv)
rate /= plldiv;
}
@@ -319,7 +319,7 @@ static unsigned long clk_pllclk_recalc(struct clk *clk)
if (pll-flags  PLL_HAS_PREDIV) {
prediv = __raw_readl(pll-base + PREDIV);
if (prediv  PLLDIV_EN)
-   prediv = (prediv  PLLDIV_RATIO_MASK) + 1;
+   prediv = (prediv  pll-div_ratio_mask) + 1;
else
prediv = 1;
}
@@ -331,7 +331,7 @@ static unsigned long clk_pllclk_recalc(struct clk *clk)
if (pll-flags  PLL_HAS_POSTDIV) {
postdiv = __raw_readl(pll-base + POSTDIV);
if (postdiv  PLLDIV_EN)
-   postdiv = (postdiv  PLLDIV_RATIO_MASK) + 1;
+   postdiv = (postdiv  pll-div_ratio_mask) + 1;
else
postdiv = 1;
}
@@ -464,6 +464,9 @@ int __init davinci_clk_init(struct clk_lookup *clocks)
if (clk-lpsc)
clk-flags |= CLK_PSC;
 
+   if (clk-pll_data  !clk-pll_data-div_ratio_mask)
+   clk-pll_data-div_ratio_mask = PLLDIV_RATIO_MASK;
+
clk_register(clk);
num_clocks++;
 
diff --git a/arch/arm/mach-davinci/clock.h b/arch/arm/mach-davinci/clock.h
index 53a0f7b..ce26015 100644
--- a/arch/arm/mach-davinci/clock.h
+++ b/arch/arm/mach-davinci/clock.h
@@ -76,6 +76,7 @@ struct pll_data {
u32 num;
u32 flags;
u32 input_rate;
+   u32 div_ratio_mask;
 };
 #define PLL_HAS_PREDIV  0x01
 #define PLL_HAS_POSTDIV 0x02
-- 
1.6.3.3

___
Davinci-linux-open-source mailing list
Davinci-linux-open-source@linux.davincidsp.com
http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source


[PATCH 7/8] Davinci: gpio - controller type support

2010-04-12 Thread Cyril Chemparathy
This patch allows for gpio controllers that deviate from those found on
traditional davinci socs.  davinci_soc_info has an added field to indicate the
soc-specific gpio controller type.  The gpio initialization code then bails
out of necessary.

More elements (tnetv107x) to be added later into enum davinci_gpio_type.

Signed-off-by: Cyril Chemparathy cy...@ti.com
Tested-by: Sandeep Paulraj s-paul...@ti.com
---
 arch/arm/mach-davinci/da830.c   |1 +
 arch/arm/mach-davinci/da850.c   |1 +
 arch/arm/mach-davinci/dm355.c   |1 +
 arch/arm/mach-davinci/dm365.c   |1 +
 arch/arm/mach-davinci/dm644x.c  |1 +
 arch/arm/mach-davinci/dm646x.c  |1 +
 arch/arm/mach-davinci/gpio.c|3 +++
 arch/arm/mach-davinci/include/mach/common.h |1 +
 arch/arm/mach-davinci/include/mach/gpio.h   |4 
 9 files changed, 14 insertions(+), 0 deletions(-)

diff --git a/arch/arm/mach-davinci/da830.c b/arch/arm/mach-davinci/da830.c
index 168f277..c4b30c4 100644
--- a/arch/arm/mach-davinci/da830.c
+++ b/arch/arm/mach-davinci/da830.c
@@ -1199,6 +1199,7 @@ static struct davinci_soc_info davinci_soc_info_da830 = {
.intc_irq_prios = da830_default_priorities,
.intc_irq_num   = DA830_N_CP_INTC_IRQ,
.timer_info = da830_timer_info,
+   .gpio_type  = GPIO_TYPE_DAVINCI,
.gpio_base  = IO_ADDRESS(DA8XX_GPIO_BASE),
.gpio_num   = 128,
.gpio_irq   = IRQ_DA8XX_GPIO0,
diff --git a/arch/arm/mach-davinci/da850.c b/arch/arm/mach-davinci/da850.c
index 27eb32e..2aa9748 100644
--- a/arch/arm/mach-davinci/da850.c
+++ b/arch/arm/mach-davinci/da850.c
@@ -1084,6 +1084,7 @@ static struct davinci_soc_info davinci_soc_info_da850 = {
.intc_irq_prios = da850_default_priorities,
.intc_irq_num   = DA850_N_CP_INTC_IRQ,
.timer_info = da850_timer_info,
+   .gpio_type  = GPIO_TYPE_DAVINCI,
.gpio_base  = IO_ADDRESS(DA8XX_GPIO_BASE),
.gpio_num   = 144,
.gpio_irq   = IRQ_DA8XX_GPIO0,
diff --git a/arch/arm/mach-davinci/dm355.c b/arch/arm/mach-davinci/dm355.c
index 5efce70..f9a54ff 100644
--- a/arch/arm/mach-davinci/dm355.c
+++ b/arch/arm/mach-davinci/dm355.c
@@ -859,6 +859,7 @@ static struct davinci_soc_info davinci_soc_info_dm355 = {
.intc_irq_prios = dm355_default_priorities,
.intc_irq_num   = DAVINCI_N_AINTC_IRQ,
.timer_info = dm355_timer_info,
+   .gpio_type  = GPIO_TYPE_DAVINCI,
.gpio_base  = IO_ADDRESS(DAVINCI_GPIO_BASE),
.gpio_num   = 104,
.gpio_irq   = IRQ_DM355_GPIOBNK0,
diff --git a/arch/arm/mach-davinci/dm365.c b/arch/arm/mach-davinci/dm365.c
index 871be5a..d81c440 100644
--- a/arch/arm/mach-davinci/dm365.c
+++ b/arch/arm/mach-davinci/dm365.c
@@ -1063,6 +1063,7 @@ static struct davinci_soc_info davinci_soc_info_dm365 = {
.intc_irq_prios = dm365_default_priorities,
.intc_irq_num   = DAVINCI_N_AINTC_IRQ,
.timer_info = dm365_timer_info,
+   .gpio_type  = GPIO_TYPE_DAVINCI,
.gpio_base  = IO_ADDRESS(DAVINCI_GPIO_BASE),
.gpio_num   = 104,
.gpio_irq   = IRQ_DM365_GPIO0,
diff --git a/arch/arm/mach-davinci/dm644x.c b/arch/arm/mach-davinci/dm644x.c
index 23cbe9d..4af349e 100644
--- a/arch/arm/mach-davinci/dm644x.c
+++ b/arch/arm/mach-davinci/dm644x.c
@@ -748,6 +748,7 @@ static struct davinci_soc_info davinci_soc_info_dm644x = {
.intc_irq_prios = dm644x_default_priorities,
.intc_irq_num   = DAVINCI_N_AINTC_IRQ,
.timer_info = dm644x_timer_info,
+   .gpio_type  = GPIO_TYPE_DAVINCI,
.gpio_base  = IO_ADDRESS(DAVINCI_GPIO_BASE),
.gpio_num   = 71,
.gpio_irq   = IRQ_GPIOBNK0,
diff --git a/arch/arm/mach-davinci/dm646x.c b/arch/arm/mach-davinci/dm646x.c
index b67b997..899859c 100644
--- a/arch/arm/mach-davinci/dm646x.c
+++ b/arch/arm/mach-davinci/dm646x.c
@@ -858,6 +858,7 @@ static struct davinci_soc_info davinci_soc_info_dm646x = {
.intc_irq_prios = dm646x_default_priorities,
.intc_irq_num   = DAVINCI_N_AINTC_IRQ,
.timer_info = dm646x_timer_info,
+   .gpio_type  = GPIO_TYPE_DAVINCI,
.gpio_base  = IO_ADDRESS(DAVINCI_GPIO_BASE),
.gpio_num   = 43, /* Only 33 usable */
.gpio_irq   = IRQ_DM646X_GPIOBNK0,
diff --git a/arch/arm/mach-davinci/gpio.c b/arch/arm/mach-davinci/gpio.c
index 082a098..3a78897 100644
--- a/arch/arm/mach-davinci/gpio.c
+++ b/arch/arm/mach-davinci/gpio.c
@@ -143,6 +143,9 @@ static int __init 

[PATCH 2/8] Davinci: generalized debug macros

2010-04-12 Thread Cyril Chemparathy
This patch adopts a debug uart selection similar to the OMAP model.  During
the boot process, the uncompress code determines the physical and virtual base
addresses of the board-specific debug uart.  These addresses are then passed
on to the in-kernel debug macros through a small chunk of memory placed just
below the page tables (@0x80003ff8).

Signed-off-by: Cyril Chemparathy cy...@ti.com
Tested-by: Sandeep Paulraj s-paul...@ti.com
---
 arch/arm/mach-davinci/include/mach/debug-macro.S |   51 +++---
 arch/arm/mach-davinci/include/mach/serial.h  |   13 
 arch/arm/mach-davinci/include/mach/uncompress.h  |   80 --
 3 files changed, 112 insertions(+), 32 deletions(-)

diff --git a/arch/arm/mach-davinci/include/mach/debug-macro.S 
b/arch/arm/mach-davinci/include/mach/debug-macro.S
index 3cd93a8..ac0fa02 100644
--- a/arch/arm/mach-davinci/include/mach/debug-macro.S
+++ b/arch/arm/mach-davinci/include/mach/debug-macro.S
@@ -17,22 +17,51 @@
  */
 
 #include linux/serial_reg.h
+
+#include asm/memory.h
+
+#include mach/serial.h
+
 #define UART_SHIFT 2
 
+   .pushsection .data
+davinci_uart_phys: .word   0
+davinci_uart_virt: .word   0
+   .popsection
+
.macro addruart, rx, tmp
+
+   /* Use davinci_uart_phys/virt if already configured */
+10:mrc p15, 0, \rx, c1, c0
+   tst \rx, #1 @ MMU enabled?
+   ldreq   \rx, =__virt_to_phys(davinci_uart_phys)
+   ldrne   \rx, =davinci_uart_virt
+   ldr \rx, [\rx]
+   cmp \rx, #0 @ is port configured?
+   bne 99f @ already configured
+
+   /* Copy uart phys address from decompressor uart info */
mrc p15, 0, \rx, c1, c0
tst \rx, #1 @ MMU enabled?
-   moveq   \rx, #0x0100@ physical base address
-   movne   \rx, #0xfe00@ virtual base
-#if defined(CONFIG_ARCH_DAVINCI_DA8XX)  defined(CONFIG_ARCH_DAVINCI_DMx)
-#error Cannot enable DaVinci and DA8XX platforms concurrently
-#elif defined(CONFIG_MACH_DAVINCI_DA830_EVM) || \
-   defined(CONFIG_MACH_DAVINCI_DA850_EVM)
-   orr \rx, \rx, #0x00d0   @ physical base address
-   orr \rx, \rx, #0xd000   @ of UART 2
-#else
-   orr \rx, \rx, #0x00c2   @ UART 0
-#endif
+   ldreq   \tmp, =__virt_to_phys(davinci_uart_phys)
+   ldrne   \tmp, =davinci_uart_phys
+   ldreq   \rx, =DAVINCI_UART_INFO
+   ldrne   \rx, =__phys_to_virt(DAVINCI_UART_INFO)
+   ldr \rx, [\rx, #0]
+   str \rx, [\tmp]
+
+   /* Copy uart virt address from decompressor uart info */
+   mrc p15, 0, \rx, c1, c0
+   tst \rx, #1 @ MMU enabled?
+   ldreq   \tmp, =__virt_to_phys(davinci_uart_virt)
+   ldrne   \tmp, =davinci_uart_virt
+   ldreq   \rx, =DAVINCI_UART_INFO
+   ldrne   \rx, =__phys_to_virt(DAVINCI_UART_INFO)
+   ldr \rx, [\rx, #4]
+   str \rx, [\tmp]
+
+   b   10b
+99:
.endm
 
.macro  senduart,rd,rx
diff --git a/arch/arm/mach-davinci/include/mach/serial.h 
b/arch/arm/mach-davinci/include/mach/serial.h
index a584697..8829dde 100644
--- a/arch/arm/mach-davinci/include/mach/serial.h
+++ b/arch/arm/mach-davinci/include/mach/serial.h
@@ -11,8 +11,19 @@
 #ifndef __ASM_ARCH_SERIAL_H
 #define __ASM_ARCH_SERIAL_H
 
+#include asm/memory.h
+
 #include mach/hardware.h
 
+/*
+ * Stolen area that contains debug uart physical and virtual addresses.  These
+ * addresses are filled in by the uncompress.h code, and are used by the debug
+ * macros in debug-macro.S.
+ *
+ * This area sits just below the page tables (see arch/arm/kernel/head.S).
+ */
+#define DAVINCI_UART_INFO  (PHYS_OFFSET + 0x3ff8)
+
 #define DAVINCI_MAX_NR_UARTS   3
 #define DAVINCI_UART0_BASE (IO_PHYS + 0x2)
 #define DAVINCI_UART1_BASE (IO_PHYS + 0x20400)
@@ -27,11 +38,13 @@
 #define UART_DM646X_SCR0x10
 #define UART_DM646X_SCR_TX_WATERMARK   0x08
 
+#ifndef __ASSEMBLY__
 struct davinci_uart_config {
/* Bit field of UARTs present; bit 0 -- UART1 */
unsigned int enabled_uarts;
 };
 
 extern int davinci_serial_init(struct davinci_uart_config *);
+#endif
 
 #endif /* __ASM_ARCH_SERIAL_H */
diff --git a/arch/arm/mach-davinci/include/mach/uncompress.h 
b/arch/arm/mach-davinci/include/mach/uncompress.h
index 33796b4..20c23a3 100644
--- a/arch/arm/mach-davinci/include/mach/uncompress.h
+++ b/arch/arm/mach-davinci/include/mach/uncompress.h
@@ -1,8 +1,17 @@
 /*
  * Serial port stubs for kernel decompress status messages
  *
- *  Author: Anant Gole
- * (C) Copyright (C) 2006, Texas 

[PATCH 4/8] Davinci: gpio - minor cleanup

2010-04-12 Thread Cyril Chemparathy
macroized repeated container_of()s to improve readability.
unified direction in/out functions.

Signed-off-by: Cyril Chemparathy cy...@ti.com
Tested-by: Sandeep Paulraj s-paul...@ti.com
---
 arch/arm/mach-davinci/gpio.c |   47 +
 1 files changed, 24 insertions(+), 23 deletions(-)

diff --git a/arch/arm/mach-davinci/gpio.c b/arch/arm/mach-davinci/gpio.c
index 5476ad1..bb55f41 100644
--- a/arch/arm/mach-davinci/gpio.c
+++ b/arch/arm/mach-davinci/gpio.c
@@ -28,6 +28,9 @@ struct davinci_gpio {
int irq_base;
 };
 
+#define chip2controller(chip)  \
+   container_of(chip, struct davinci_gpio, chip)
+
 static struct davinci_gpio chips[DIV_ROUND_UP(DAVINCI_N_GPIO, 32)];
 
 /* create a non-inlined version */
@@ -54,21 +57,36 @@ static int __init davinci_gpio_irq_setup(void);
  * needed, and enable the GPIO clock.
  */
 
-static int davinci_direction_in(struct gpio_chip *chip, unsigned offset)
+static inline int __davinci_direction(struct gpio_chip *chip,
+   unsigned offset, bool out)
 {
-   struct davinci_gpio *d = container_of(chip, struct davinci_gpio, chip);
+   struct davinci_gpio *d = chip2controller(chip);
struct gpio_controller __iomem *g = d-regs;
u32 temp;
 
spin_lock(gpio_lock);
temp = __raw_readl(g-dir);
-   temp |= (1  offset);
+   if (out)
+   temp = ~(1  offset);
+   else
+   temp |= (1  offset);
__raw_writel(temp, g-dir);
spin_unlock(gpio_lock);
 
return 0;
 }
 
+static int davinci_direction_in(struct gpio_chip *chip, unsigned offset)
+{
+   return __davinci_direction(chip, offset, false);
+}
+
+static int
+davinci_direction_out(struct gpio_chip *chip, unsigned offset, int value)
+{
+   return __davinci_direction(chip, offset, true);
+}
+
 /*
  * Read the pin's value (works even if it's set up as output);
  * returns zero/nonzero.
@@ -78,36 +96,19 @@ static int davinci_direction_in(struct gpio_chip *chip, 
unsigned offset)
  */
 static int davinci_gpio_get(struct gpio_chip *chip, unsigned offset)
 {
-   struct davinci_gpio *d = container_of(chip, struct davinci_gpio, chip);
+   struct davinci_gpio *d = chip2controller(chip);
struct gpio_controller __iomem *g = d-regs;
 
return (1  offset)  __raw_readl(g-in_data);
 }
 
-static int
-davinci_direction_out(struct gpio_chip *chip, unsigned offset, int value)
-{
-   struct davinci_gpio *d = container_of(chip, struct davinci_gpio, chip);
-   struct gpio_controller __iomem *g = d-regs;
-   u32 temp;
-   u32 mask = 1  offset;
-
-   spin_lock(gpio_lock);
-   temp = __raw_readl(g-dir);
-   temp = ~mask;
-   __raw_writel(mask, value ? g-set_data : g-clr_data);
-   __raw_writel(temp, g-dir);
-   spin_unlock(gpio_lock);
-   return 0;
-}
-
 /*
  * Assuming the pin is muxed as a gpio output, set its output value.
  */
 static void
 davinci_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
 {
-   struct davinci_gpio *d = container_of(chip, struct davinci_gpio, chip);
+   struct davinci_gpio *d = chip2controller(chip);
struct gpio_controller __iomem *g = d-regs;
 
__raw_writel((1  offset), value ? g-set_data : g-clr_data);
@@ -262,7 +263,7 @@ gpio_irq_handler(unsigned irq, struct irq_desc *desc)
 
 static int gpio_to_irq_banked(struct gpio_chip *chip, unsigned offset)
 {
-   struct davinci_gpio *d = container_of(chip, struct davinci_gpio, chip);
+   struct davinci_gpio *d = chip2controller(chip);
 
if (d-irq_base = 0)
return d-irq_base + offset;
-- 
1.6.3.3

___
Davinci-linux-open-source mailing list
Davinci-linux-open-source@linux.davincidsp.com
http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source


[PATCH 1/8] Davinci: iotable based ioremap() interception

2010-04-12 Thread Cyril Chemparathy
This patch allows for a more flexible ioremap() interception.  The mechanism
works by translating physical addresses based on soc-specific iotable
contents (davinci_soc_info.io_desc), once davinci_soc_info is populated by
davinci_common_init().

Signed-off-by: Cyril Chemparathy cy...@ti.com
Tested-by: Sandeep Paulraj s-paul...@ti.com
---
 arch/arm/mach-davinci/da830.c   |7 +-
 arch/arm/mach-davinci/da850.c   |9 ++-
 arch/arm/mach-davinci/include/mach/io.h |4 +++
 arch/arm/mach-davinci/io.c  |   33 +++---
 4 files changed, 46 insertions(+), 7 deletions(-)

diff --git a/arch/arm/mach-davinci/da830.c b/arch/arm/mach-davinci/da830.c
index 122e61a..168f277 100644
--- a/arch/arm/mach-davinci/da830.c
+++ b/arch/arm/mach-davinci/da830.c
@@ -1206,9 +1206,14 @@ static struct davinci_soc_info davinci_soc_info_da830 = {
.emac_pdata = da8xx_emac_pdata,
 };
 
+#define da830_early_ioremap(p, s)  \
+   __davinci_ioremap(p, s, \
+   davinci_soc_info_da830.io_desc, \
+   davinci_soc_info_da830.io_desc_num)
+
 void __init da830_init(void)
 {
-   da8xx_syscfg0_base = ioremap(DA8XX_SYSCFG0_BASE, SZ_4K);
+   da8xx_syscfg0_base = da830_early_ioremap(DA8XX_SYSCFG0_BASE, SZ_4K);
if (WARN(!da8xx_syscfg0_base, Unable to map syscfg0 module))
return;
 
diff --git a/arch/arm/mach-davinci/da850.c b/arch/arm/mach-davinci/da850.c
index d0fd756..27eb32e 100644
--- a/arch/arm/mach-davinci/da850.c
+++ b/arch/arm/mach-davinci/da850.c
@@ -1093,15 +1093,20 @@ static struct davinci_soc_info davinci_soc_info_da850 = 
{
.sram_len   = SZ_8K,
 };
 
+#define da850_early_ioremap(p, s)  \
+   __davinci_ioremap(p, s, \
+   davinci_soc_info_da850.io_desc, \
+   davinci_soc_info_da850.io_desc_num)
+
 void __init da850_init(void)
 {
unsigned int v;
 
-   da8xx_syscfg0_base = ioremap(DA8XX_SYSCFG0_BASE, SZ_4K);
+   da8xx_syscfg0_base = da850_early_ioremap(DA8XX_SYSCFG0_BASE, SZ_4K);
if (WARN(!da8xx_syscfg0_base, Unable to map syscfg0 module))
return;
 
-   da8xx_syscfg1_base = ioremap(DA8XX_SYSCFG1_BASE, SZ_4K);
+   da8xx_syscfg1_base = da850_early_ioremap(DA8XX_SYSCFG1_BASE, SZ_4K);
if (WARN(!da8xx_syscfg1_base, Unable to map syscfg1 module))
return;
 
diff --git a/arch/arm/mach-davinci/include/mach/io.h 
b/arch/arm/mach-davinci/include/mach/io.h
index 62b0a90..4aa301c 100644
--- a/arch/arm/mach-davinci/include/mach/io.h
+++ b/arch/arm/mach-davinci/include/mach/io.h
@@ -25,6 +25,10 @@
 #define __arch_ioremap(p, s, t)davinci_ioremap(p, s, t)
 #define __arch_iounmap(v)  davinci_iounmap(v)
 
+struct map_desc;
+
+void __iomem *__davinci_ioremap(unsigned long p, size_t size,
+   struct map_desc *io_desc, int io_desc_num);
 void __iomem *davinci_ioremap(unsigned long phys, size_t size,
  unsigned int type);
 void davinci_iounmap(volatile void __iomem *addr);
diff --git a/arch/arm/mach-davinci/io.c b/arch/arm/mach-davinci/io.c
index a1c0b6b..3a62f14 100644
--- a/arch/arm/mach-davinci/io.c
+++ b/arch/arm/mach-davinci/io.c
@@ -12,17 +12,42 @@
 #include linux/io.h
 
 #include asm/tlb.h
+#include asm/mach/map.h
 
-#define BETWEEN(p, st, sz) ((p) = (st)  (p)  ((st) + (sz)))
-#define XLATE(p, pst, vst) ((void __iomem *)((p) - (pst) + (vst)))
+#include mach/common.h
+
+/*
+ * Remap io addresses based on a soc-specific io-descriptor table. This is
+ * useful in early arch init code before davinci_common_init().  After
+ * davinci_common_init(), regular ioremap() calls should be used.
+ */
+void __iomem *__davinci_ioremap(unsigned long p, size_t size,
+   struct map_desc *io_desc, int io_desc_num)
+{
+   int i;
+
+   for (i = 0; i  io_desc_num; i++, io_desc++) {
+   unsigned long iophys = __pfn_to_phys(io_desc-pfn);
+   unsigned long iosize = io_desc-length;
+
+   if (p = iophys  (p + size) = (iophys + iosize))
+   return __io(io_desc-virtual + p - iophys);
+   }
+
+   return NULL;
+}
 
 /*
  * Intercept ioremap() requests for addresses in our fixed mapping regions.
  */
 void __iomem *davinci_ioremap(unsigned long p, size_t size, unsigned int type)
 {
-   if (BETWEEN(p, IO_PHYS, IO_SIZE))
-   return XLATE(p, IO_PHYS, IO_VIRT);
+   void __iomem *ret;
+
+   ret = __davinci_ioremap(p, size, davinci_soc_info.io_desc,
+   davinci_soc_info.io_desc_num);
+   if (ret)
+   return ret;
 
return __arm_ioremap_caller(p, size, type, __builtin_return_address(0));
 }
-- 
1.6.3.3

___

[PATCH 5/8] Davinci: gpio - struct renames

2010-04-12 Thread Cyril Chemparathy
Renamed gpio structures to something more sensible:
struct gpio_controller  -- struct davinci_gpio_regs
struct davinci_gpio -- struct davinci_gpio_controller

This change also moves davinci_gpio_controller definition to gpio.h.
Eventually, the gpio registers structure will be moved to gpio.c and no longer
a common cross-soc definition.

Signed-off-by: Cyril Chemparathy cy...@ti.com
Tested-by: Sandeep Paulraj s-paul...@ti.com
---
 arch/arm/mach-davinci/gpio.c  |   44 
 arch/arm/mach-davinci/include/mach/gpio.h |   14 ++--
 2 files changed, 29 insertions(+), 29 deletions(-)

diff --git a/arch/arm/mach-davinci/gpio.c b/arch/arm/mach-davinci/gpio.c
index bb55f41..58a6fd5 100644
--- a/arch/arm/mach-davinci/gpio.c
+++ b/arch/arm/mach-davinci/gpio.c
@@ -22,28 +22,22 @@
 
 static DEFINE_SPINLOCK(gpio_lock);
 
-struct davinci_gpio {
-   struct gpio_chipchip;
-   struct gpio_controller  __iomem *regs;
-   int irq_base;
-};
-
 #define chip2controller(chip)  \
-   container_of(chip, struct davinci_gpio, chip)
+   container_of(chip, struct davinci_gpio_controller, chip)
 
-static struct davinci_gpio chips[DIV_ROUND_UP(DAVINCI_N_GPIO, 32)];
+static struct davinci_gpio_controller chips[DIV_ROUND_UP(DAVINCI_N_GPIO, 32)];
 
 /* create a non-inlined version */
-static struct gpio_controller __iomem __init *gpio2controller(unsigned gpio)
+static struct davinci_gpio_regs __iomem __init *gpio2controller(unsigned gpio)
 {
return __gpio_to_controller(gpio);
 }
 
-static inline struct gpio_controller __iomem *irq2controller(int irq)
+static inline struct davinci_gpio_regs __iomem *irq2controller(int irq)
 {
-   struct gpio_controller __iomem *g;
+   struct davinci_gpio_regs __iomem *g;
 
-   g = (__force struct gpio_controller __iomem *)get_irq_chip_data(irq);
+   g = (__force struct davinci_gpio_regs __iomem *)get_irq_chip_data(irq);
 
return g;
 }
@@ -60,8 +54,8 @@ static int __init davinci_gpio_irq_setup(void);
 static inline int __davinci_direction(struct gpio_chip *chip,
unsigned offset, bool out)
 {
-   struct davinci_gpio *d = chip2controller(chip);
-   struct gpio_controller __iomem *g = d-regs;
+   struct davinci_gpio_controller *d = chip2controller(chip);
+   struct davinci_gpio_regs __iomem *g = d-regs;
u32 temp;
 
spin_lock(gpio_lock);
@@ -96,8 +90,8 @@ davinci_direction_out(struct gpio_chip *chip, unsigned 
offset, int value)
  */
 static int davinci_gpio_get(struct gpio_chip *chip, unsigned offset)
 {
-   struct davinci_gpio *d = chip2controller(chip);
-   struct gpio_controller __iomem *g = d-regs;
+   struct davinci_gpio_controller *d = chip2controller(chip);
+   struct davinci_gpio_regs __iomem *g = d-regs;
 
return (1  offset)  __raw_readl(g-in_data);
 }
@@ -108,8 +102,8 @@ static int davinci_gpio_get(struct gpio_chip *chip, 
unsigned offset)
 static void
 davinci_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
 {
-   struct davinci_gpio *d = chip2controller(chip);
-   struct gpio_controller __iomem *g = d-regs;
+   struct davinci_gpio_controller *d = chip2controller(chip);
+   struct davinci_gpio_regs __iomem *g = d-regs;
 
__raw_writel((1  offset), value ? g-set_data : g-clr_data);
 }
@@ -171,7 +165,7 @@ pure_initcall(davinci_gpio_setup);
 
 static void gpio_irq_disable(unsigned irq)
 {
-   struct gpio_controller __iomem *g = irq2controller(irq);
+   struct davinci_gpio_regs __iomem *g = irq2controller(irq);
u32 mask = (u32) get_irq_data(irq);
 
__raw_writel(mask, g-clr_falling);
@@ -180,7 +174,7 @@ static void gpio_irq_disable(unsigned irq)
 
 static void gpio_irq_enable(unsigned irq)
 {
-   struct gpio_controller __iomem *g = irq2controller(irq);
+   struct davinci_gpio_regs __iomem *g = irq2controller(irq);
u32 mask = (u32) get_irq_data(irq);
unsigned status = irq_desc[irq].status;
 
@@ -196,7 +190,7 @@ static void gpio_irq_enable(unsigned irq)
 
 static int gpio_irq_type(unsigned irq, unsigned trigger)
 {
-   struct gpio_controller __iomem *g = irq2controller(irq);
+   struct davinci_gpio_regs __iomem *g = irq2controller(irq);
u32 mask = (u32) get_irq_data(irq);
 
if (trigger  ~(IRQ_TYPE_EDGE_FALLING | IRQ_TYPE_EDGE_RISING))
@@ -225,7 +219,7 @@ static struct irq_chip gpio_irqchip = {
 static void
 gpio_irq_handler(unsigned irq, struct irq_desc *desc)
 {
-   struct gpio_controller __iomem *g = irq2controller(irq);
+   struct davinci_gpio_regs __iomem *g = irq2controller(irq);
u32 mask = 0x;
 
/* we only care about one bank */
@@ -263,7 +257,7 @@ gpio_irq_handler(unsigned irq, struct irq_desc *desc)
 
 static int gpio_to_irq_banked(struct gpio_chip *chip, unsigned offset)
 {
-   struct davinci_gpio *d = chip2controller(chip);
+   struct 

[PATCH 8/8] Davinci: gpio - fine grained locking

2010-04-12 Thread Cyril Chemparathy
This patch eliminates the global gpio_lock, and implements a per-controller
lock instead.  This also switches to irqsave/irqrestore locks in case gpios
are manipulated in isr.

Signed-off-by: Cyril Chemparathy cy...@ti.com
Tested-by: Sandeep Paulraj s-paul...@ti.com
---
 arch/arm/mach-davinci/gpio.c  |9 +
 arch/arm/mach-davinci/include/mach/gpio.h |3 +++
 2 files changed, 8 insertions(+), 4 deletions(-)

diff --git a/arch/arm/mach-davinci/gpio.c b/arch/arm/mach-davinci/gpio.c
index 3a78897..1486c63 100644
--- a/arch/arm/mach-davinci/gpio.c
+++ b/arch/arm/mach-davinci/gpio.c
@@ -33,8 +33,6 @@ struct davinci_gpio_regs {
u32 intstat;
 };
 
-static DEFINE_SPINLOCK(gpio_lock);
-
 #define chip2controller(chip)  \
container_of(chip, struct davinci_gpio_controller, chip)
 
@@ -84,16 +82,17 @@ static inline int __davinci_direction(struct gpio_chip 
*chip,
 {
struct davinci_gpio_controller *d = chip2controller(chip);
struct davinci_gpio_regs __iomem *g = d-regs;
+   unsigned long flags;
u32 temp;
 
-   spin_lock(gpio_lock);
+   spin_lock_irqsave(d-lock, flags);
temp = __raw_readl(g-dir);
if (out)
temp = ~(1  offset);
else
temp |= (1  offset);
__raw_writel(temp, g-dir);
-   spin_unlock(gpio_lock);
+   spin_unlock_irqrestore(d-lock, flags);
 
return 0;
 }
@@ -173,6 +172,8 @@ static int __init davinci_gpio_setup(void)
if (chips[i].chip.ngpio  32)
chips[i].chip.ngpio = 32;
 
+   spin_lock_init(chips[i].lock);
+
regs = gpio2regs(base);
chips[i].regs = regs;
chips[i].set_data = regs-set_data;
diff --git a/arch/arm/mach-davinci/include/mach/gpio.h 
b/arch/arm/mach-davinci/include/mach/gpio.h
index 33962c3..2384cd1 100644
--- a/arch/arm/mach-davinci/include/mach/gpio.h
+++ b/arch/arm/mach-davinci/include/mach/gpio.h
@@ -14,6 +14,8 @@
 #define__DAVINCI_GPIO_H
 
 #include linux/io.h
+#include linux/spinlock.h
+
 #include asm-generic/gpio.h
 
 #include mach/irqs.h
@@ -51,6 +53,7 @@ enum davinci_gpio_type {
 
 struct davinci_gpio_controller {
struct davinci_gpio_regs __iomem *regs;
+   spinlock_t  lock;
struct gpio_chipchip;
int irq_base;
void __iomem*set_data;
-- 
1.6.3.3

___
Davinci-linux-open-source mailing list
Davinci-linux-open-source@linux.davincidsp.com
http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source


[PATCH 6/8] Davinci: gpio - register layout invariant inlines

2010-04-12 Thread Cyril Chemparathy
This patch renders the inlined gpio accessors in gpio.h independent of the
underlying controller's register layout.  This is done by including three new
fields in davinci_gpio_controller to hold the addresses of the set, clear, and
in data registers.

Other changes:

1. davinci_gpio_regs structure definition moved to gpio.c.  This structure is
no longer common across all davinci socs (davinci_gpio_controller is).

2. controller base address calculation code (gpio2controller()) moved to
gpio.c as this was no longer necessary for the inline implementation.

3. modified inline range checks to use davinci_soc_info.gpio_num instead of
DAVINCI_N_GPIO.

Signed-off-by: Cyril Chemparathy cy...@ti.com
Tested-by: Sandeep Paulraj s-paul...@ti.com
---
 arch/arm/mach-davinci/gpio.c|   46 +--
 arch/arm/mach-davinci/include/mach/common.h |4 ++
 arch/arm/mach-davinci/include/mach/gpio.h   |   63 +-
 3 files changed, 67 insertions(+), 46 deletions(-)

diff --git a/arch/arm/mach-davinci/gpio.c b/arch/arm/mach-davinci/gpio.c
index 58a6fd5..082a098 100644
--- a/arch/arm/mach-davinci/gpio.c
+++ b/arch/arm/mach-davinci/gpio.c
@@ -20,6 +20,19 @@
 
 #include asm/mach/irq.h
 
+struct davinci_gpio_regs {
+   u32 dir;
+   u32 out_data;
+   u32 set_data;
+   u32 clr_data;
+   u32 in_data;
+   u32 set_rising;
+   u32 clr_rising;
+   u32 set_falling;
+   u32 clr_falling;
+   u32 intstat;
+};
+
 static DEFINE_SPINLOCK(gpio_lock);
 
 #define chip2controller(chip)  \
@@ -28,9 +41,24 @@ static DEFINE_SPINLOCK(gpio_lock);
 static struct davinci_gpio_controller chips[DIV_ROUND_UP(DAVINCI_N_GPIO, 32)];
 
 /* create a non-inlined version */
-static struct davinci_gpio_regs __iomem __init *gpio2controller(unsigned gpio)
+static struct davinci_gpio_regs __iomem __init *gpio2regs(unsigned gpio)
 {
-   return __gpio_to_controller(gpio);
+   void __iomem *ptr;
+   void __iomem *base = davinci_soc_info.gpio_base;
+
+   if (gpio  32 * 1)
+   ptr = base + 0x10;
+   else if (gpio  32 * 2)
+   ptr = base + 0x38;
+   else if (gpio  32 * 3)
+   ptr = base + 0x60;
+   else if (gpio  32 * 4)
+   ptr = base + 0x88;
+   else if (gpio  32 * 5)
+   ptr = base + 0xb0;
+   else
+   ptr = NULL;
+   return ptr;
 }
 
 static inline struct davinci_gpio_regs __iomem *irq2controller(int irq)
@@ -113,6 +141,7 @@ static int __init davinci_gpio_setup(void)
int i, base;
unsigned ngpio;
struct davinci_soc_info *soc_info = davinci_soc_info;
+   struct davinci_gpio_regs *regs;
 
/*
 * The gpio banks conceptually expose a segmented bitmap,
@@ -141,11 +170,18 @@ static int __init davinci_gpio_setup(void)
if (chips[i].chip.ngpio  32)
chips[i].chip.ngpio = 32;
 
-   chips[i].regs = gpio2controller(base);
+   regs = gpio2regs(base);
+   chips[i].regs = regs;
+   chips[i].set_data = regs-set_data;
+   chips[i].clr_data = regs-clr_data;
+   chips[i].in_data = regs-in_data;
 
gpiochip_add(chips[i].chip);
}
 
+   soc_info-gpio_ctlrs = chips;
+   soc_info-gpio_ctlrs_num = DIV_ROUND_UP(ngpio, 32);
+
davinci_gpio_irq_setup();
return 0;
 }
@@ -358,7 +394,7 @@ static int __init davinci_gpio_irq_setup(void)
gpio_irqchip_unbanked.set_type = gpio_irq_type_unbanked;
 
/* default trigger: both edges */
-   g = gpio2controller(0);
+   g = gpio2regs(0);
__raw_writel(~0, g-set_falling);
__raw_writel(~0, g-set_rising);
 
@@ -383,7 +419,7 @@ static int __init davinci_gpio_irq_setup(void)
unsignedi;
 
/* disabled by default, enabled only as needed */
-   g = gpio2controller(gpio);
+   g = gpio2regs(gpio);
__raw_writel(~0, g-clr_falling);
__raw_writel(~0, g-clr_rising);
 
diff --git a/arch/arm/mach-davinci/include/mach/common.h 
b/arch/arm/mach-davinci/include/mach/common.h
index 50a955f..c85c795 100644
--- a/arch/arm/mach-davinci/include/mach/common.h
+++ b/arch/arm/mach-davinci/include/mach/common.h
@@ -34,6 +34,8 @@ struct davinci_timer_info {
unsigned intclocksource_id;
 };
 
+struct davinci_gpio_controller;
+
 /* SoC specific init support */
 struct davinci_soc_info {
struct map_desc *io_desc;
@@ -58,6 +60,8 @@ struct davinci_soc_info {
unsignedgpio_num;
unsignedgpio_irq;
unsignedgpio_unbanked;
+   struct davinci_gpio_controller  *gpio_ctlrs;
+   int gpio_ctlrs_num;
struct 

Removing excessive printing of NAND bad eraseblocks in nand/nand_bbt.c

2010-04-12 Thread Doug Rogers
Howdy,

 

I don't know if this is the proper place for this, so please direct me
elsewhere if it is not.

 

I get a LOT of NAND bad eraseblocks when booting my dm6467t DVEVM. I've
never dealt with NAND ROM before so I was surprised by how many bad
eraseblocks are generated. I've seen elsewhere that this is to be
expected. So I'm curious - does it need to be so excessively printed if
it is relatively normal?

 

I've made a patch to drivers/mtd/nand/nand_bbt.c to remove printing of
each individual block. Instead, a warning message is generated that
displays the number of blocks and the location of the first bad
eraseblock.

 

Do you think this is something worth doing permanently?

 

Doug

 

___
Davinci-linux-open-source mailing list
Davinci-linux-open-source@linux.davincidsp.com
http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source