From: nsekhar@ti.com (Sekhar Nori)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v6 1/2] ARM: davinci: dm365: add support for v4l2 video display
Date: Mon, 18 Mar 2013 13:48:13 +0530 [thread overview]
Message-ID: <5146CDC5.9000702@ti.com> (raw)
In-Reply-To: <1363360303-15521-2-git-send-email-prabhakar.csengg@gmail.com>
On 3/15/2013 8:41 PM, Prabhakar lad wrote:
> From: Lad, Prabhakar <prabhakar.csengg@gmail.com>
>
> Create platform devices for various video modules like venc,osd,
> vpbe and v4l2 driver for dm365.
>
> Signed-off-by: Lad, Prabhakar <prabhakar.csengg@gmail.com>
> ---
> arch/arm/mach-davinci/board-dm365-evm.c | 4 +-
> arch/arm/mach-davinci/davinci.h | 2 +-
> arch/arm/mach-davinci/dm365.c | 203 +++++++++++++++++++++++++++++--
> 3 files changed, 195 insertions(+), 14 deletions(-)
> diff --git a/arch/arm/mach-davinci/dm365.c b/arch/arm/mach-davinci/dm365.c
> index 6c39805..ec8b06e 100644
> --- a/arch/arm/mach-davinci/dm365.c
> +++ b/arch/arm/mach-davinci/dm365.c
> @@ -40,10 +40,16 @@
>
> #define DM365_REF_FREQ 24000000 /* 24 MHz on the DM365 EVM */
>
> +#define DM3XX_VDAC_CONFIG 0x01c4002c
DM365_VDAC_CONFIG since this is a DM365 specific file and to be
consistent with rest of the names?
> +
> +#define DM365_RTC_BASE 0x01c69000
> +
> /* Base of key scan register bank */
> #define DM365_KEYSCAN_BASE 0x01c69400
>
> -#define DM365_RTC_BASE 0x01c69000
> +#define DM365_OSD_BASE 0x01c71c00
> +
> +#define DM365_VENC_REG_BASE 0x01c71e00
>
> #define DAVINCI_DM365_VC_BASE 0x01d0c000
> #define DAVINCI_DMA_VC_TX 2
> @@ -56,6 +62,11 @@
> #define DM365_EMAC_CNTRL_RAM_OFFSET 0x1000
> #define DM365_EMAC_CNTRL_RAM_SIZE 0x2000
>
> +#define DM365_VPSS_CLK_CTRL_ADDR 0x44
> +#define DM365_VPSS_VENCCLKEN_ENABLE BIT(3)
> +#define DM365_VPSS_DACCLKEN_ENABLE BIT(4)
> +#define DM365_VPSS_PLLC2SYSCLK5_ENABLE BIT(5)
> +
> static struct pll_data pll1_data = {
> .num = 1,
> .phys_base = DAVINCI_PLL1_BASE,
> @@ -1226,6 +1237,186 @@ static struct platform_device dm365_isif_dev = {
> },
> };
>
> +static struct resource dm365_osd_resources[] = {
> + {
> + .start = DM365_OSD_BASE,
> + .end = DM365_OSD_BASE + 0x100,
> + .flags = IORESOURCE_MEM,
> + },
> +};
> +
> +static u64 dm365_video_dma_mask = DMA_BIT_MASK(32);
> +
> +static struct platform_device dm365_osd_dev = {
> + .name = DM365_VPBE_OSD_SUBDEV_NAME,
> + .id = -1,
> + .num_resources = ARRAY_SIZE(dm365_osd_resources),
> + .resource = dm365_osd_resources,
> + .dev = {
> + .dma_mask = &dm365_video_dma_mask,
> + .coherent_dma_mask = DMA_BIT_MASK(32),
> + },
> +};
> +
> +static struct resource dm365_venc_resources[] = {
> + {
> + .start = IRQ_VENCINT,
> + .end = IRQ_VENCINT,
> + .flags = IORESOURCE_IRQ,
> + },
> + /* venc registers io space */
> + {
> + .start = DM365_VENC_REG_BASE,
> + .end = DM365_VENC_REG_BASE + 0x180,
> + .flags = IORESOURCE_MEM,
> + },
> + /* vdaccfg registers io space */
> + {
> + .start = DM3XX_VDAC_CONFIG,
> + .end = DM3XX_VDAC_CONFIG + 4,
DM3XX_VDAC_CONFIG + 3. Check for similar errors in rest of the patch.
> + .flags = IORESOURCE_MEM,
> + },
> +};
> +
> +static struct resource dm365_v4l2_disp_resources[] = {
> + {
> + .start = IRQ_VENCINT,
> + .end = IRQ_VENCINT,
> + .flags = IORESOURCE_IRQ,
> + },
> + /* venc registers io space */
> + {
> + .start = DM365_VENC_REG_BASE,
> + .end = DM365_VENC_REG_BASE + 0x180,
> + .flags = IORESOURCE_MEM,
> + },
> +};
> +
[...]
> +static int dm365_venc_setup_clock(enum vpbe_enc_timings_type type,
> + unsigned int pclock)
> +{
> + void __iomem *vpss_clkctl_reg;
> + u32 val;
> +
> + vpss_clkctl_reg = DAVINCI_SYSMOD_VIRT(DM365_VPSS_CLK_CTRL_ADDR);
> +
> + switch (type) {
> + case VPBE_ENC_STD:
> + vpss_enable_clock(VPSS_VENC_CLOCK_SEL, 1);
So as you found out, it is not correct to call driver functions from
platform code. I suggesting moving this function to driver altogether.
You just need access to DM365_VPSS_CLK_CTRL_ADDR which you can pass
using resource structures.
> + vpss_enable_clock(VPSS_VPBE_CLOCK, 1);
> + val = DM365_VPSS_VENCCLKEN_ENABLE | DM365_VPSS_DACCLKEN_ENABLE;
> + break;
> +
> + case VPBE_ENC_DV_TIMINGS:
> + if (pclock <= 27000000) {
> + vpss_enable_clock(VPSS_VENC_CLOCK_SEL, 1);
> + vpss_enable_clock(VPSS_VPBE_CLOCK, 1);
> + val = DM365_VPSS_VENCCLKEN_ENABLE |
> + DM365_VPSS_DACCLKEN_ENABLE;
> + } else {
> + /* set sysclk4 to output 74.25 MHz from pll1 */
> + val = DM365_VPSS_PLLC2SYSCLK5_ENABLE |
> + DM365_VPSS_DACCLKEN_ENABLE |
> + DM365_VPSS_VENCCLKEN_ENABLE;
> + }
> + break;
> +
> + default:
> + return -EINVAL;
> + }
> + writel(val, vpss_clkctl_reg);
> +
> + return 0;
> +}
[...]
> +int __init dm365_init_video(struct vpfe_config *vpfe_cfg,
> + struct vpbe_config *vpbe_cfg)
> +{
> + if (vpfe_cfg || vpbe_cfg)
> + platform_device_register(&dm365_vpss_device);
> +
> + if (vpfe_cfg) {
> + vpfe_capture_dev.dev.platform_data = vpfe_cfg;
> + /* Add isif clock alias */
This comment is useless. Instead please document why the aliases are
needed. I know you are just moving code here, but lets do a clean-up job
while at it.
> + clk_add_alias("master", dm365_isif_dev.name,
> + "vpss_master", NULL);
> + platform_device_register(&dm365_isif_dev);
> + platform_device_register(&vpfe_capture_dev);
> + }
> + if (vpbe_cfg) {
> + dm365_vpbe_dev.dev.platform_data = vpbe_cfg;
> + platform_device_register(&dm365_osd_dev);
> + platform_device_register(&dm365_venc_dev);
> + platform_device_register(&dm365_vpbe_dev);
> + platform_device_register(&dm365_vpbe_display);
> + }
> +
> + return 0;
> +}
Thanks,
Sekhar
WARNING: multiple messages have this Message-ID (diff)
From: Sekhar Nori <nsekhar@ti.com>
To: Prabhakar lad <prabhakar.csengg@gmail.com>
Cc: LAK <linux-arm-kernel@lists.infradead.org>,
DLOS <davinci-linux-open-source@linux.davincidsp.com>,
LKML <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH v6 1/2] ARM: davinci: dm365: add support for v4l2 video display
Date: Mon, 18 Mar 2013 13:48:13 +0530 [thread overview]
Message-ID: <5146CDC5.9000702@ti.com> (raw)
In-Reply-To: <1363360303-15521-2-git-send-email-prabhakar.csengg@gmail.com>
On 3/15/2013 8:41 PM, Prabhakar lad wrote:
> From: Lad, Prabhakar <prabhakar.csengg@gmail.com>
>
> Create platform devices for various video modules like venc,osd,
> vpbe and v4l2 driver for dm365.
>
> Signed-off-by: Lad, Prabhakar <prabhakar.csengg@gmail.com>
> ---
> arch/arm/mach-davinci/board-dm365-evm.c | 4 +-
> arch/arm/mach-davinci/davinci.h | 2 +-
> arch/arm/mach-davinci/dm365.c | 203 +++++++++++++++++++++++++++++--
> 3 files changed, 195 insertions(+), 14 deletions(-)
> diff --git a/arch/arm/mach-davinci/dm365.c b/arch/arm/mach-davinci/dm365.c
> index 6c39805..ec8b06e 100644
> --- a/arch/arm/mach-davinci/dm365.c
> +++ b/arch/arm/mach-davinci/dm365.c
> @@ -40,10 +40,16 @@
>
> #define DM365_REF_FREQ 24000000 /* 24 MHz on the DM365 EVM */
>
> +#define DM3XX_VDAC_CONFIG 0x01c4002c
DM365_VDAC_CONFIG since this is a DM365 specific file and to be
consistent with rest of the names?
> +
> +#define DM365_RTC_BASE 0x01c69000
> +
> /* Base of key scan register bank */
> #define DM365_KEYSCAN_BASE 0x01c69400
>
> -#define DM365_RTC_BASE 0x01c69000
> +#define DM365_OSD_BASE 0x01c71c00
> +
> +#define DM365_VENC_REG_BASE 0x01c71e00
>
> #define DAVINCI_DM365_VC_BASE 0x01d0c000
> #define DAVINCI_DMA_VC_TX 2
> @@ -56,6 +62,11 @@
> #define DM365_EMAC_CNTRL_RAM_OFFSET 0x1000
> #define DM365_EMAC_CNTRL_RAM_SIZE 0x2000
>
> +#define DM365_VPSS_CLK_CTRL_ADDR 0x44
> +#define DM365_VPSS_VENCCLKEN_ENABLE BIT(3)
> +#define DM365_VPSS_DACCLKEN_ENABLE BIT(4)
> +#define DM365_VPSS_PLLC2SYSCLK5_ENABLE BIT(5)
> +
> static struct pll_data pll1_data = {
> .num = 1,
> .phys_base = DAVINCI_PLL1_BASE,
> @@ -1226,6 +1237,186 @@ static struct platform_device dm365_isif_dev = {
> },
> };
>
> +static struct resource dm365_osd_resources[] = {
> + {
> + .start = DM365_OSD_BASE,
> + .end = DM365_OSD_BASE + 0x100,
> + .flags = IORESOURCE_MEM,
> + },
> +};
> +
> +static u64 dm365_video_dma_mask = DMA_BIT_MASK(32);
> +
> +static struct platform_device dm365_osd_dev = {
> + .name = DM365_VPBE_OSD_SUBDEV_NAME,
> + .id = -1,
> + .num_resources = ARRAY_SIZE(dm365_osd_resources),
> + .resource = dm365_osd_resources,
> + .dev = {
> + .dma_mask = &dm365_video_dma_mask,
> + .coherent_dma_mask = DMA_BIT_MASK(32),
> + },
> +};
> +
> +static struct resource dm365_venc_resources[] = {
> + {
> + .start = IRQ_VENCINT,
> + .end = IRQ_VENCINT,
> + .flags = IORESOURCE_IRQ,
> + },
> + /* venc registers io space */
> + {
> + .start = DM365_VENC_REG_BASE,
> + .end = DM365_VENC_REG_BASE + 0x180,
> + .flags = IORESOURCE_MEM,
> + },
> + /* vdaccfg registers io space */
> + {
> + .start = DM3XX_VDAC_CONFIG,
> + .end = DM3XX_VDAC_CONFIG + 4,
DM3XX_VDAC_CONFIG + 3. Check for similar errors in rest of the patch.
> + .flags = IORESOURCE_MEM,
> + },
> +};
> +
> +static struct resource dm365_v4l2_disp_resources[] = {
> + {
> + .start = IRQ_VENCINT,
> + .end = IRQ_VENCINT,
> + .flags = IORESOURCE_IRQ,
> + },
> + /* venc registers io space */
> + {
> + .start = DM365_VENC_REG_BASE,
> + .end = DM365_VENC_REG_BASE + 0x180,
> + .flags = IORESOURCE_MEM,
> + },
> +};
> +
[...]
> +static int dm365_venc_setup_clock(enum vpbe_enc_timings_type type,
> + unsigned int pclock)
> +{
> + void __iomem *vpss_clkctl_reg;
> + u32 val;
> +
> + vpss_clkctl_reg = DAVINCI_SYSMOD_VIRT(DM365_VPSS_CLK_CTRL_ADDR);
> +
> + switch (type) {
> + case VPBE_ENC_STD:
> + vpss_enable_clock(VPSS_VENC_CLOCK_SEL, 1);
So as you found out, it is not correct to call driver functions from
platform code. I suggesting moving this function to driver altogether.
You just need access to DM365_VPSS_CLK_CTRL_ADDR which you can pass
using resource structures.
> + vpss_enable_clock(VPSS_VPBE_CLOCK, 1);
> + val = DM365_VPSS_VENCCLKEN_ENABLE | DM365_VPSS_DACCLKEN_ENABLE;
> + break;
> +
> + case VPBE_ENC_DV_TIMINGS:
> + if (pclock <= 27000000) {
> + vpss_enable_clock(VPSS_VENC_CLOCK_SEL, 1);
> + vpss_enable_clock(VPSS_VPBE_CLOCK, 1);
> + val = DM365_VPSS_VENCCLKEN_ENABLE |
> + DM365_VPSS_DACCLKEN_ENABLE;
> + } else {
> + /* set sysclk4 to output 74.25 MHz from pll1 */
> + val = DM365_VPSS_PLLC2SYSCLK5_ENABLE |
> + DM365_VPSS_DACCLKEN_ENABLE |
> + DM365_VPSS_VENCCLKEN_ENABLE;
> + }
> + break;
> +
> + default:
> + return -EINVAL;
> + }
> + writel(val, vpss_clkctl_reg);
> +
> + return 0;
> +}
[...]
> +int __init dm365_init_video(struct vpfe_config *vpfe_cfg,
> + struct vpbe_config *vpbe_cfg)
> +{
> + if (vpfe_cfg || vpbe_cfg)
> + platform_device_register(&dm365_vpss_device);
> +
> + if (vpfe_cfg) {
> + vpfe_capture_dev.dev.platform_data = vpfe_cfg;
> + /* Add isif clock alias */
This comment is useless. Instead please document why the aliases are
needed. I know you are just moving code here, but lets do a clean-up job
while at it.
> + clk_add_alias("master", dm365_isif_dev.name,
> + "vpss_master", NULL);
> + platform_device_register(&dm365_isif_dev);
> + platform_device_register(&vpfe_capture_dev);
> + }
> + if (vpbe_cfg) {
> + dm365_vpbe_dev.dev.platform_data = vpbe_cfg;
> + platform_device_register(&dm365_osd_dev);
> + platform_device_register(&dm365_venc_dev);
> + platform_device_register(&dm365_vpbe_dev);
> + platform_device_register(&dm365_vpbe_display);
> + }
> +
> + return 0;
> +}
Thanks,
Sekhar
next prev parent reply other threads:[~2013-03-18 8:18 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-03-15 15:11 [PATCH v6 0/2] ARM: davinci: add support for dm365 vpbe display Prabhakar lad
2013-03-15 15:11 ` Prabhakar lad
2013-03-15 15:11 ` [PATCH v6 1/2] ARM: davinci: dm365: add support for v4l2 video display Prabhakar lad
2013-03-15 15:11 ` Prabhakar lad
2013-03-18 8:18 ` Sekhar Nori [this message]
2013-03-18 8:18 ` Sekhar Nori
2013-03-18 9:16 ` Prabhakar Lad
2013-03-18 9:16 ` Prabhakar Lad
2013-03-18 9:47 ` Sekhar Nori
2013-03-18 9:47 ` Sekhar Nori
2013-03-15 15:11 ` [PATCH v6 2/2] ARM: davinci: dm365 EVM: add support for VPBE display Prabhakar lad
2013-03-15 15:11 ` Prabhakar lad
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=5146CDC5.9000702@ti.com \
--to=nsekhar@ti.com \
--cc=linux-arm-kernel@lists.infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.