From: Kevin Hilman <khilman@deeprootsystems.com>
To: m-karicheri2@ti.com
Cc: linux-media@vger.kernel.org,
davinci-linux-open-source@linux.davincidsp.com,
hverkuil@xs4all.nl
Subject: Re: [PATCH v0 1/5] DaVinci - re-structuring code to support vpif capture driver
Date: Mon, 10 Aug 2009 16:52:02 -0700 [thread overview]
Message-ID: <87bpmn9qhp.fsf@deeprootsystems.com> (raw)
In-Reply-To: <1249599808-21673-1-git-send-email-m-karicheri2@ti.com> (m-karicheri2@ti.com's message of "Thu\, 6 Aug 2009 19\:03\:27 -0400")
m-karicheri2@ti.com writes:
> From: Muralidharan Karicheri <m-karicheri2@ti.com>
>
> This patch makes the following changes:-
> 1) Modify vpif_subdev_info to add board_info, routing information
> and vpif interface configuration. Remove addr since it is
> part of board_info
>
> 2) Add code to setup channel mode and input decoder path for
> vpif capture driver
>
> NOTE: This patch is dependent on the patch from Chaithrika for vpif
> display. Also the arch sepcific files are manually merged to
> linux-davinci tree before creating this patch. So this is only for
> review. Final patch to be merged will be created later
>
> Mandatory reviewers : Hans Verkuil <hverkuil@xs4all.nl>
> Kevin Hilman <khilman@deeprootsystems.com>
>
> Signed-off-by: Muralidharan Karicheri <m-karicheri2@ti.com>
Looks mostly OK, some minor nits...
> ---
> arch/arm/mach-davinci/board-dm646x-evm.c | 179 +++++++++++++++++++++++++-
> arch/arm/mach-davinci/dm646x.c | 54 +++++++-
> arch/arm/mach-davinci/include/mach/dm646x.h | 50 +++++++-
> 3 files changed, 263 insertions(+), 20 deletions(-)
>
> diff --git a/arch/arm/mach-davinci/board-dm646x-evm.c b/arch/arm/mach-davinci/board-dm646x-evm.c
> index 38a1022..cb4246b 100644
> --- a/arch/arm/mach-davinci/board-dm646x-evm.c
> +++ b/arch/arm/mach-davinci/board-dm646x-evm.c
> @@ -33,7 +33,7 @@
> #include <linux/i2c/at24.h>
> #include <linux/i2c/pcf857x.h>
> #include <linux/etherdevice.h>
> -
> +#include <media/tvp514x.h>
> #include <asm/setup.h>
> #include <asm/mach-types.h>
> #include <asm/mach/arch.h>
> @@ -75,6 +75,14 @@
>
> #define VIDCH2CLK (BIT(10))
> #define VIDCH3CLK (BIT(11))
> +#define VIDCH1CLK (BIT(4))
> +#define TVP7002_INPUT (BIT(4))
> +#define TVP5147_INPUT (~BIT(4))
> +#define VPIF_INPUT_ONE_CHANNEL (BIT(5))
> +#define VPIF_INPUT_TWO_CHANNEL (~BIT(5))
Hmm, I think the usage of the ~BIT(x) definitions are not exactly
clear.
I'd rather just see the single BIT(x) definition, and code the
use of them differently...
> +#define TVP5147_CH0 "tvp514x-0"
> +#define TVP5147_CH1 "tvp514x-1"
> +
>
> static struct davinci_uart_config uart_config __initdata = {
> .enabled_uarts = (1 << 0),
> @@ -348,7 +356,7 @@ static struct i2c_board_info __initdata i2c_info[] = {
> I2C_BOARD_INFO("cpld_reg0", 0x3a),
> },
> {
> - I2C_BOARD_INFO("cpld_video", 0x3B),
> + I2C_BOARD_INFO("cpld_video", 0x3b),
> },
> };
>
> @@ -400,14 +408,18 @@ static int set_vpif_clock(int mux_mode, int hd)
> return 0;
> }
>
> -static const struct vpif_subdev_info dm646x_vpif_subdev[] = {
> +static struct vpif_subdev_info dm646x_vpif_subdev[] = {
> {
> - .addr = 0x2A,
> .name = "adv7343",
> + .board_info = {
> + I2C_BOARD_INFO("adv7343", 0x2a),
> + },
> },
> {
> - .addr = 0x2C,
> .name = "ths7303",
> + .board_info = {
> + I2C_BOARD_INFO("ths7303", 0x2c),
> + },
> },
> };
>
> @@ -417,7 +429,7 @@ static const char *output[] = {
> "S-Video",
> };
>
> -static struct vpif_config dm646x_vpif_config = {
> +static struct vpif_display_config dm646x_vpif_display_config = {
> .set_clock = set_vpif_clock,
> .subdevinfo = dm646x_vpif_subdev,
> .subdev_count = ARRAY_SIZE(dm646x_vpif_subdev),
> @@ -426,6 +438,158 @@ static struct vpif_config dm646x_vpif_config = {
> .card_name = "DM646x EVM",
> };
>
> +/**
> + * setup_vpif_input_path()
> + * @channel: channel id (0 - CH0, 1 - CH1)
> + * @sub_dev_name: ptr sub device name
> + *
> + * This will set vpif input to capture data from tvp514x or
> + * tvp7002.
> + */
> +static int setup_vpif_input_path(int channel, const char *sub_dev_name)
> +{
> + int err = 0;
> + int val;
> +
> + /* for channel 1, we don't do anything */
> + if (channel != 0)
> + return 0;
> +
> + if (NULL == cpld_client)
> + return -EFAULT;
> +
> + val = i2c_smbus_read_byte(cpld_client);
> + if (val < 0)
> + return val;
> +
> + if (!strcmp(sub_dev_name, TVP5147_CH0) ||
> + !strcmp(sub_dev_name, TVP5147_CH1))
Hmm, shouldn't this be '&&' instead of '||'.
> + val &= TVP5147_INPUT;
rather:
val &= ~TVP7002_INPUT; /* tvp5147 input */
> + else
> + val |= TVP7002_INPUT;
> +
> + err = i2c_smbus_write_byte(cpld_client, val);
> + if (err)
> + return err;
> + return 0;
> +}
> +
> +/**
> + * setup_vpif_input_channel_mode()
> + * @mux_mode: mux mode. 0 - 1 channel or (1) - 2 channel
> + *
> + * This will setup input mode to one channel (TVP7002) or 2 channel (TVP5147)
> + */
> +static int setup_vpif_input_channel_mode(int mux_mode)
> +{
> + int err = 0;
> + int val;
> + u32 value;
> + void __iomem *base = IO_ADDRESS(DAVINCI_SYSTEM_MODULE_BASE);
Use ioremap() + readl/writel instead of IO_ADDRESS() + __raw_read/__raw_write.
> + val = i2c_smbus_read_byte(cpld_client);
> + if (val < 0)
> + return val;
> +
> + value = __raw_readl(base + VSCLKDIS_OFFSET);
> + if (mux_mode) {
> + val &= VPIF_INPUT_TWO_CHANNEL;
> + value |= VIDCH1CLK;
> + } else {
> + val |= VPIF_INPUT_ONE_CHANNEL;
> + value &= ~VIDCH1CLK;
> + }
> + __raw_writel(value, base + VSCLKDIS_OFFSET);
> +
> + err = i2c_smbus_write_byte(cpld_client, val);
> + if (err)
> + return err;
> +
> + return 0;
> +}
> +
> +static struct tvp514x_platform_data tvp5146_pdata = {
> + .clk_polarity = 0,
> + .hs_polarity = 1,
> + .vs_polarity = 1
> +};
> +
> +#define TVP514X_STD_ALL (V4L2_STD_NTSC | V4L2_STD_PAL)
> +
> +static struct vpif_subdev_info vpif_capture_sdev_info[] = {
> + {
> + .name = TVP5147_CH0,
> + .board_info = {
> + I2C_BOARD_INFO("tvp5146", 0x5d),
> + .platform_data = &tvp5146_pdata,
> + },
> + .input = INPUT_CVBS_VI2B,
> + .output = OUTPUT_10BIT_422_EMBEDDED_SYNC,
> + .can_route = 1,
> + .vpif_if = {
> + .if_type = VPIF_IF_BT656,
> + .hd_pol = 1,
> + .vd_pol = 1,
> + .fid_pol = 0,
> + },
> + },
> + {
> + .name = TVP5147_CH1,
> + .board_info = {
> + I2C_BOARD_INFO("tvp5146", 0x5c),
> + .platform_data = &tvp5146_pdata,
> + },
> + .input = INPUT_SVIDEO_VI2C_VI1C,
> + .output = OUTPUT_10BIT_422_EMBEDDED_SYNC,
> + .can_route = 1,
> + .vpif_if = {
> + .if_type = VPIF_IF_BT656,
> + .hd_pol = 1,
> + .vd_pol = 1,
> + .fid_pol = 0,
> + },
> + },
> +};
> +
> +static const struct vpif_input dm6467_ch0_inputs[] = {
> + {
> + .input = {
> + .index = 0,
> + .name = "Composite",
> + .type = V4L2_INPUT_TYPE_CAMERA,
> + .std = TVP514X_STD_ALL,
> + },
> + .subdev_name = TVP5147_CH0,
> + },
> +};
> +
> +static const struct vpif_input dm6467_ch1_inputs[] = {
> + {
> + .input = {
> + .index = 0,
> + .name = "S-Video",
> + .type = V4L2_INPUT_TYPE_CAMERA,
> + .std = TVP514X_STD_ALL,
> + },
> + .subdev_name = TVP5147_CH1,
> + },
> +};
> +
> +static struct vpif_capture_config dm646x_vpif_capture_cfg = {
> + .setup_input_path = setup_vpif_input_path,
> + .setup_input_channel_mode = setup_vpif_input_channel_mode,
> + .subdev_info = vpif_capture_sdev_info,
> + .subdev_count = ARRAY_SIZE(vpif_capture_sdev_info),
> + .chan_config[0] = {
> + .inputs = dm6467_ch0_inputs,
> + .input_count = ARRAY_SIZE(dm6467_ch0_inputs),
> + },
> + .chan_config[1] = {
> + .inputs = dm6467_ch1_inputs,
> + .input_count = ARRAY_SIZE(dm6467_ch1_inputs),
> + },
> +};
> +
> static void __init evm_init_i2c(void)
> {
> davinci_init_i2c(&i2c_pdata);
> @@ -453,7 +617,8 @@ static __init void evm_init(void)
>
> soc_info->emac_pdata->phy_mask = DM646X_EVM_PHY_MASK;
> soc_info->emac_pdata->mdio_max_freq = DM646X_EVM_MDIO_FREQUENCY;
> - dm646x_setup_vpif(&dm646x_vpif_config);
> + dm646x_setup_vpif(&dm646x_vpif_display_config,
> + &dm646x_vpif_capture_cfg);
> }
>
> static __init void davinci_dm646x_evm_irq_init(void)
> diff --git a/arch/arm/mach-davinci/dm646x.c b/arch/arm/mach-davinci/dm646x.c
> index fc02f22..4ee3b6f 100644
> --- a/arch/arm/mach-davinci/dm646x.c
> +++ b/arch/arm/mach-davinci/dm646x.c
> @@ -613,9 +613,23 @@ static u64 vpif_dma_mask = DMA_BIT_MASK(32);
> static struct resource vpif_resource[] = {
> {
> .start = DAVINCI_VPIF_BASE,
> - .end = DAVINCI_VPIF_BASE + 0x03fff,
> + .end = DAVINCI_VPIF_BASE + 0x03ff,
> .flags = IORESOURCE_MEM,
> + }
> +};
> +
> +static struct platform_device vpif_dev = {
> + .name = "vpif",
> + .id = -1,
> + .dev = {
> + .dma_mask = &vpif_dma_mask,
> + .coherent_dma_mask = DMA_BIT_MASK(32),
> },
> + .resource = vpif_resource,
> + .num_resources = ARRAY_SIZE(vpif_resource),
> +};
> +
> +static struct resource vpif_display_resource[] = {
> {
> .start = IRQ_DM646X_VP_VERTINT2,
> .end = IRQ_DM646X_VP_VERTINT2,
> @@ -633,10 +647,34 @@ static struct platform_device vpif_display_dev = {
> .id = -1,
> .dev = {
> .dma_mask = &vpif_dma_mask,
> - .coherent_dma_mask = DMA_32BIT_MASK,
> + .coherent_dma_mask = DMA_BIT_MASK(32),
> },
> - .resource = vpif_resource,
> - .num_resources = ARRAY_SIZE(vpif_resource),
> + .resource = vpif_display_resource,
> + .num_resources = ARRAY_SIZE(vpif_display_resource),
> +};
> +
> +static struct resource vpif_capture_resource[] = {
> + {
> + .start = IRQ_DM646X_VP_VERTINT0,
> + .end = IRQ_DM646X_VP_VERTINT0,
> + .flags = IORESOURCE_IRQ,
> + },
> + {
> + .start = IRQ_DM646X_VP_VERTINT1,
> + .end = IRQ_DM646X_VP_VERTINT1,
> + .flags = IORESOURCE_IRQ,
> + },
> +};
> +
> +static struct platform_device vpif_capture_dev = {
> + .name = "vpif_capture",
> + .id = -1,
> + .dev = {
> + .dma_mask = &vpif_dma_mask,
> + .coherent_dma_mask = DMA_BIT_MASK(32),
> + },
> + .resource = vpif_capture_resource,
> + .num_resources = ARRAY_SIZE(vpif_capture_resource),
> };
>
> static struct resource ide_resources[] = {
> @@ -853,7 +891,8 @@ void __init dm646x_init_mcasp1(struct snd_platform_data *pdata)
> platform_device_register(&dm646x_dit_device);
> }
>
> -void dm646x_setup_vpif(struct vpif_config *config)
> +void dm646x_setup_vpif(struct vpif_display_config *display_config,
> + struct vpif_capture_config *capture_config)
> {
> unsigned int value;
> void __iomem *base = IO_ADDRESS(DAVINCI_SYSTEM_MODULE_BASE);
> @@ -871,8 +910,11 @@ void dm646x_setup_vpif(struct vpif_config *config)
> davinci_cfg_reg(DM646X_PTSOMUX_DISABLE);
> davinci_cfg_reg(DM646X_PTSIMUX_DISABLE);
>
> - vpif_display_dev.dev.platform_data = config;
> + vpif_display_dev.dev.platform_data = display_config;
> + vpif_capture_dev.dev.platform_data = capture_config;
> + platform_device_register(&vpif_dev);
> platform_device_register(&vpif_display_dev);
> + platform_device_register(&vpif_capture_dev);
> }
>
> void __init dm646x_init(void)
> diff --git a/arch/arm/mach-davinci/include/mach/dm646x.h b/arch/arm/mach-davinci/include/mach/dm646x.h
> index 737b549..b639142 100644
> --- a/arch/arm/mach-davinci/include/mach/dm646x.h
> +++ b/arch/arm/mach-davinci/include/mach/dm646x.h
> @@ -14,6 +14,8 @@
> #include <mach/hardware.h>
> #include <mach/emac.h>
> #include <mach/asp.h>
> +#include <linux/i2c.h>
> +#include <linux/videodev2.h>
>
> #define DM646X_EMAC_BASE (0x01C80000)
> #define DM646X_EMAC_CNTRL_OFFSET (0x0000)
> @@ -24,30 +26,64 @@
>
> #define DM646X_ATA_REG_BASE (0x01C66000)
>
> -struct vpif_output {
> - u16 id;
> - const char *name;
> +enum vpif_if_type {
> + VPIF_IF_BT656,
> + VPIF_IF_BT1120,
> + VPIF_IF_RAW_BAYER
> +};
> +
> +struct vpif_interface {
> + enum vpif_if_type if_type;
> + unsigned hd_pol:1;
> + unsigned vd_pol:1;
> + unsigned fid_pol:1;
> };
>
> struct vpif_subdev_info {
> - unsigned short addr;
> const char *name;
> + struct i2c_board_info board_info;
> + u32 input;
> + u32 output;
> + unsigned can_route:1;
> + struct vpif_interface vpif_if;
> };
>
> -struct vpif_config {
> +struct vpif_display_config {
> int (*set_clock)(int, int);
> - const struct vpif_subdev_info *subdevinfo;
> + struct vpif_subdev_info *subdevinfo;
> int subdev_count;
> const char **output;
> int output_count;
> const char *card_name;
> };
>
> +struct vpif_input {
> + struct v4l2_input input;
> + const char *subdev_name;
> +};
> +
> +#define VPIF_CAPTURE_MAX_CHANNELS 2
> +
> +struct vpif_capture_chan_config {
> + const struct vpif_input *inputs;
> + int input_count;
> +};
> +
> +struct vpif_capture_config {
> + int (*setup_input_channel_mode)(int);
> + int (*setup_input_path)(int, const char *);
> + struct vpif_capture_chan_config chan_config[VPIF_CAPTURE_MAX_CHANNELS];
> + struct vpif_subdev_info *subdev_info;
> + int subdev_count;
> + const char *card_name;
> +};
> +
> void __init dm646x_init(void);
> void __init dm646x_init_ide(void);
> void __init dm646x_init_mcasp0(struct snd_platform_data *pdata);
> void __init dm646x_init_mcasp1(struct snd_platform_data *pdata);
> void dm646x_video_init(void);
> -void dm646x_setup_vpif(struct vpif_config *config);
> +void dm646x_setup_vpif(struct vpif_display_config *,
> + struct vpif_capture_config *);
>
> #endif /* __ASM_ARCH_DM646X_H */
> --
> 1.6.0.4
next prev parent reply other threads:[~2009-08-10 23:52 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-08-06 23:03 [PATCH v0 1/5] DaVinci - re-structuring code to support vpif capture driver m-karicheri2
2009-08-10 23:52 ` Kevin Hilman [this message]
2009-08-12 20:13 ` Karicheri, Muralidharan
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=87bpmn9qhp.fsf@deeprootsystems.com \
--to=khilman@deeprootsystems.com \
--cc=davinci-linux-open-source@linux.davincidsp.com \
--cc=hverkuil@xs4all.nl \
--cc=linux-media@vger.kernel.org \
--cc=m-karicheri2@ti.com \
/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.