Skip to content

Commit

Permalink
[media] davinci: vpbe: pass different platform names to handle differ…
Browse files Browse the repository at this point in the history
…ent ip's

The vpbe driver can handle different platforms DM644X, DM36X and
DM355. To differentiate between this platforms venc_type/vpbe_type
was passed as part of platform data which was incorrect. The correct
way to differentiate to handle this case is by passing different
platform names.
This patch creates platform_device_id[] array supporting different
platforms and assigns id_table to the platform driver, and finally
in the probe gets the actual device by using platform_get_device_id()
and gets the appropriate driver data for that platform.
Taking this approach will also make the DT transition easier.

Signed-off-by: Lad, Prabhakar <prabhakar.lad@ti.com>
Signed-off-by: Manjunath Hadli <manjunath.hadli@ti.com>
Acked-by: Sekhar Nori <nsekhar@ti.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
  • Loading branch information
Lad, Prabhakar authored and Mauro Carvalho Chehab committed Dec 21, 2012
1 parent 5a89fac commit caff80c
Show file tree
Hide file tree
Showing 8 changed files with 84 additions and 50 deletions.
8 changes: 4 additions & 4 deletions arch/arm/mach-davinci/board-dm644x-evm.c
Original file line number Diff line number Diff line change
Expand Up @@ -689,7 +689,7 @@ static struct vpbe_output dm644xevm_vpbe_outputs[] = {
.std = VENC_STD_ALL,
.capabilities = V4L2_OUT_CAP_STD,
},
.subdev_name = VPBE_VENC_SUBDEV_NAME,
.subdev_name = DM644X_VPBE_VENC_SUBDEV_NAME,
.default_mode = "ntsc",
.num_modes = ARRAY_SIZE(dm644xevm_enc_std_timing),
.modes = dm644xevm_enc_std_timing,
Expand All @@ -701,7 +701,7 @@ static struct vpbe_output dm644xevm_vpbe_outputs[] = {
.type = V4L2_OUTPUT_TYPE_ANALOG,
.capabilities = V4L2_OUT_CAP_DV_TIMINGS,
},
.subdev_name = VPBE_VENC_SUBDEV_NAME,
.subdev_name = DM644X_VPBE_VENC_SUBDEV_NAME,
.default_mode = "480p59_94",
.num_modes = ARRAY_SIZE(dm644xevm_enc_preset_timing),
.modes = dm644xevm_enc_preset_timing,
Expand All @@ -712,10 +712,10 @@ static struct vpbe_config dm644xevm_display_cfg = {
.module_name = "dm644x-vpbe-display",
.i2c_adapter_id = 1,
.osd = {
.module_name = VPBE_OSD_SUBDEV_NAME,
.module_name = DM644X_VPBE_OSD_SUBDEV_NAME,
},
.venc = {
.module_name = VPBE_VENC_SUBDEV_NAME,
.module_name = DM644X_VPBE_VENC_SUBDEV_NAME,
},
.num_outputs = ARRAY_SIZE(dm644xevm_vpbe_outputs),
.outputs = dm644xevm_vpbe_outputs,
Expand Down
10 changes: 2 additions & 8 deletions arch/arm/mach-davinci/dm644x.c
Original file line number Diff line number Diff line change
Expand Up @@ -669,19 +669,14 @@ static struct resource dm644x_osd_resources[] = {
},
};

static struct osd_platform_data dm644x_osd_data = {
.vpbe_type = VPBE_VERSION_1,
};

static struct platform_device dm644x_osd_dev = {
.name = VPBE_OSD_SUBDEV_NAME,
.name = DM644X_VPBE_OSD_SUBDEV_NAME,
.id = -1,
.num_resources = ARRAY_SIZE(dm644x_osd_resources),
.resource = dm644x_osd_resources,
.dev = {
.dma_mask = &dm644x_video_dma_mask,
.coherent_dma_mask = DMA_BIT_MASK(32),
.platform_data = &dm644x_osd_data,
},
};

Expand Down Expand Up @@ -751,12 +746,11 @@ static struct platform_device dm644x_vpbe_display = {
};

static struct venc_platform_data dm644x_venc_pdata = {
.venc_type = VPBE_VERSION_1,
.setup_clock = dm644x_venc_setup_clock,
};

static struct platform_device dm644x_venc_dev = {
.name = VPBE_VENC_SUBDEV_NAME,
.name = DM644X_VPBE_VENC_SUBDEV_NAME,
.id = -1,
.num_resources = ARRAY_SIZE(dm644x_venc_resources),
.resource = dm644x_venc_resources,
Expand Down
4 changes: 2 additions & 2 deletions drivers/media/platform/davinci/vpbe.c
Original file line number Diff line number Diff line change
Expand Up @@ -558,9 +558,9 @@ static int platform_device_get(struct device *dev, void *data)
struct platform_device *pdev = to_platform_device(dev);
struct vpbe_device *vpbe_dev = data;

if (strcmp("vpbe-osd", pdev->name) == 0)
if (strstr(pdev->name, "vpbe-osd") != NULL)
vpbe_dev->osd_device = platform_get_drvdata(pdev);
if (strcmp("vpbe-venc", pdev->name) == 0)
if (strstr(pdev->name, "vpbe-venc") != NULL)
vpbe_dev->venc_device = dev_get_platdata(&pdev->dev);

return 0;
Expand Down
2 changes: 1 addition & 1 deletion drivers/media/platform/davinci/vpbe_display.c
Original file line number Diff line number Diff line change
Expand Up @@ -1656,7 +1656,7 @@ static int vpbe_device_get(struct device *dev, void *data)
if (strcmp("vpbe_controller", pdev->name) == 0)
vpbe_disp->vpbe_dev = platform_get_drvdata(pdev);

if (strcmp("vpbe-osd", pdev->name) == 0)
if (strstr(pdev->name, "vpbe-osd") != NULL)
vpbe_disp->osd_device = platform_get_drvdata(pdev);

return 0;
Expand Down
35 changes: 25 additions & 10 deletions drivers/media/platform/davinci/vpbe_osd.c
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,22 @@
#include <linux/io.h>
#include "vpbe_osd_regs.h"

#define MODULE_NAME VPBE_OSD_SUBDEV_NAME
#define MODULE_NAME "davinci-vpbe-osd"

static struct platform_device_id vpbe_osd_devtype[] = {
{
.name = DM644X_VPBE_OSD_SUBDEV_NAME,
.driver_data = VPBE_VERSION_1,
}, {
.name = DM365_VPBE_OSD_SUBDEV_NAME,
.driver_data = VPBE_VERSION_2,
}, {
.name = DM355_VPBE_OSD_SUBDEV_NAME,
.driver_data = VPBE_VERSION_3,
},
};

MODULE_DEVICE_TABLE(platform, vpbe_osd_devtype);

/* register access routines */
static inline u32 osd_read(struct osd_state *sd, u32 offset)
Expand Down Expand Up @@ -129,7 +144,7 @@ static int _osd_dm6446_vid0_pingpong(struct osd_state *sd,
struct osd_platform_data *pdata;

pdata = (struct osd_platform_data *)sd->dev->platform_data;
if (pdata->field_inv_wa_enable) {
if (pdata != NULL && pdata->field_inv_wa_enable) {

if (!field_inversion || !lconfig->interlaced) {
osd_write(sd, fb_base_phys & ~0x1F, OSD_VIDWIN0ADR);
Expand Down Expand Up @@ -1526,7 +1541,7 @@ static const struct vpbe_osd_ops osd_ops = {

static int osd_probe(struct platform_device *pdev)
{
struct osd_platform_data *pdata;
const struct platform_device_id *pdev_id;
struct osd_state *osd;
struct resource *res;
int ret = 0;
Expand All @@ -1535,16 +1550,15 @@ static int osd_probe(struct platform_device *pdev)
if (osd == NULL)
return -ENOMEM;

osd->dev = &pdev->dev;
pdata = (struct osd_platform_data *)pdev->dev.platform_data;
osd->vpbe_type = (enum vpbe_version)pdata->vpbe_type;
if (NULL == pdev->dev.platform_data) {
dev_err(osd->dev, "No platform data defined for OSD"
" sub device\n");
ret = -ENOENT;
pdev_id = platform_get_device_id(pdev);
if (!pdev_id) {
ret = -EINVAL;
goto free_mem;
}

osd->dev = &pdev->dev;
osd->vpbe_type = pdev_id->driver_data;

res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
if (!res) {
dev_err(osd->dev, "Unable to get OSD register address map\n");
Expand Down Expand Up @@ -1595,6 +1609,7 @@ static struct platform_driver osd_driver = {
.name = MODULE_NAME,
.owner = THIS_MODULE,
},
.id_table = vpbe_osd_devtype
};

module_platform_driver(osd_driver);
Expand Down
65 changes: 44 additions & 21 deletions drivers/media/platform/davinci/vpbe_venc.c
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,22 @@

#include "vpbe_venc_regs.h"

#define MODULE_NAME VPBE_VENC_SUBDEV_NAME
#define MODULE_NAME "davinci-vpbe-venc"

static struct platform_device_id vpbe_venc_devtype[] = {
{
.name = DM644X_VPBE_VENC_SUBDEV_NAME,
.driver_data = VPBE_VERSION_1,
}, {
.name = DM365_VPBE_VENC_SUBDEV_NAME,
.driver_data = VPBE_VERSION_2,
}, {
.name = DM355_VPBE_VENC_SUBDEV_NAME,
.driver_data = VPBE_VERSION_3,
},
};

MODULE_DEVICE_TABLE(platform, vpbe_venc_devtype);

static int debug = 2;
module_param(debug, int, 0644);
Expand All @@ -54,6 +69,7 @@ struct venc_state {
spinlock_t lock;
void __iomem *venc_base;
void __iomem *vdaccfg_reg;
enum vpbe_version venc_type;
};

static inline struct venc_state *to_state(struct v4l2_subdev *sd)
Expand Down Expand Up @@ -127,7 +143,7 @@ static int venc_set_dac(struct v4l2_subdev *sd, u32 out_index)
static void venc_enabledigitaloutput(struct v4l2_subdev *sd, int benable)
{
struct venc_state *venc = to_state(sd);
struct venc_platform_data *pdata = venc->pdata;

v4l2_dbg(debug, 2, sd, "venc_enabledigitaloutput\n");

if (benable) {
Expand Down Expand Up @@ -159,7 +175,7 @@ static void venc_enabledigitaloutput(struct v4l2_subdev *sd, int benable)

/* Disable LCD output control (accepting default polarity) */
venc_write(sd, VENC_LCDOUT, 0);
if (pdata->venc_type != VPBE_VERSION_3)
if (venc->venc_type != VPBE_VERSION_3)
venc_write(sd, VENC_CMPNT, 0x100);
venc_write(sd, VENC_HSPLS, 0);
venc_write(sd, VENC_HINT, 0);
Expand Down Expand Up @@ -203,11 +219,11 @@ static int venc_set_ntsc(struct v4l2_subdev *sd)

venc_enabledigitaloutput(sd, 0);

if (pdata->venc_type == VPBE_VERSION_3) {
if (venc->venc_type == VPBE_VERSION_3) {
venc_write(sd, VENC_CLKCTL, 0x01);
venc_write(sd, VENC_VIDCTL, 0);
val = vdaccfg_write(sd, VDAC_CONFIG_SD_V3);
} else if (pdata->venc_type == VPBE_VERSION_2) {
} else if (venc->venc_type == VPBE_VERSION_2) {
venc_write(sd, VENC_CLKCTL, 0x01);
venc_write(sd, VENC_VIDCTL, 0);
vdaccfg_write(sd, VDAC_CONFIG_SD_V2);
Expand Down Expand Up @@ -238,7 +254,6 @@ static int venc_set_ntsc(struct v4l2_subdev *sd)
static int venc_set_pal(struct v4l2_subdev *sd)
{
struct venc_state *venc = to_state(sd);
struct venc_platform_data *pdata = venc->pdata;

v4l2_dbg(debug, 2, sd, "venc_set_pal\n");

Expand All @@ -249,11 +264,11 @@ static int venc_set_pal(struct v4l2_subdev *sd)

venc_enabledigitaloutput(sd, 0);

if (pdata->venc_type == VPBE_VERSION_3) {
if (venc->venc_type == VPBE_VERSION_3) {
venc_write(sd, VENC_CLKCTL, 0x1);
venc_write(sd, VENC_VIDCTL, 0);
vdaccfg_write(sd, VDAC_CONFIG_SD_V3);
} else if (pdata->venc_type == VPBE_VERSION_2) {
} else if (venc->venc_type == VPBE_VERSION_2) {
venc_write(sd, VENC_CLKCTL, 0x1);
venc_write(sd, VENC_VIDCTL, 0);
vdaccfg_write(sd, VDAC_CONFIG_SD_V2);
Expand Down Expand Up @@ -293,8 +308,8 @@ static int venc_set_480p59_94(struct v4l2_subdev *sd)
struct venc_platform_data *pdata = venc->pdata;

v4l2_dbg(debug, 2, sd, "venc_set_480p59_94\n");
if ((pdata->venc_type != VPBE_VERSION_1) &&
(pdata->venc_type != VPBE_VERSION_2))
if (venc->venc_type != VPBE_VERSION_1 &&
venc->venc_type != VPBE_VERSION_2)
return -EINVAL;

/* Setup clock at VPSS & VENC for SD */
Expand All @@ -303,12 +318,12 @@ static int venc_set_480p59_94(struct v4l2_subdev *sd)

venc_enabledigitaloutput(sd, 0);

if (pdata->venc_type == VPBE_VERSION_2)
if (venc->venc_type == VPBE_VERSION_2)
vdaccfg_write(sd, VDAC_CONFIG_HD_V2);
venc_write(sd, VENC_OSDCLK0, 0);
venc_write(sd, VENC_OSDCLK1, 1);

if (pdata->venc_type == VPBE_VERSION_1) {
if (venc->venc_type == VPBE_VERSION_1) {
venc_modify(sd, VENC_VDPRO, VENC_VDPRO_DAFRQ,
VENC_VDPRO_DAFRQ);
venc_modify(sd, VENC_VDPRO, VENC_VDPRO_DAUPS,
Expand Down Expand Up @@ -341,22 +356,22 @@ static int venc_set_576p50(struct v4l2_subdev *sd)

v4l2_dbg(debug, 2, sd, "venc_set_576p50\n");

if ((pdata->venc_type != VPBE_VERSION_1) &&
(pdata->venc_type != VPBE_VERSION_2))
if (venc->venc_type != VPBE_VERSION_1 &&
venc->venc_type != VPBE_VERSION_2)
return -EINVAL;
/* Setup clock at VPSS & VENC for SD */
if (pdata->setup_clock(VPBE_ENC_CUSTOM_TIMINGS, 27000000) < 0)
return -EINVAL;

venc_enabledigitaloutput(sd, 0);

if (pdata->venc_type == VPBE_VERSION_2)
if (venc->venc_type == VPBE_VERSION_2)
vdaccfg_write(sd, VDAC_CONFIG_HD_V2);

venc_write(sd, VENC_OSDCLK0, 0);
venc_write(sd, VENC_OSDCLK1, 1);

if (pdata->venc_type == VPBE_VERSION_1) {
if (venc->venc_type == VPBE_VERSION_1) {
venc_modify(sd, VENC_VDPRO, VENC_VDPRO_DAFRQ,
VENC_VDPRO_DAFRQ);
venc_modify(sd, VENC_VDPRO, VENC_VDPRO_DAUPS,
Expand Down Expand Up @@ -460,14 +475,14 @@ static int venc_s_dv_timings(struct v4l2_subdev *sd,
else if (height == 480)
return venc_set_480p59_94(sd);
else if ((height == 720) &&
(venc->pdata->venc_type == VPBE_VERSION_2)) {
(venc->venc_type == VPBE_VERSION_2)) {
/* TBD setup internal 720p mode here */
ret = venc_set_720p60_internal(sd);
/* for DM365 VPBE, there is DAC inside */
vdaccfg_write(sd, VDAC_CONFIG_HD_V2);
return ret;
} else if ((height == 1080) &&
(venc->pdata->venc_type == VPBE_VERSION_2)) {
(venc->venc_type == VPBE_VERSION_2)) {
/* TBD setup internal 1080i mode here */
ret = venc_set_1080i30_internal(sd);
/* for DM365 VPBE, there is DAC inside */
Expand Down Expand Up @@ -556,7 +571,7 @@ static int venc_device_get(struct device *dev, void *data)
struct platform_device *pdev = to_platform_device(dev);
struct venc_state **venc = data;

if (strcmp(MODULE_NAME, pdev->name) == 0)
if (strstr(pdev->name, "vpbe-venc") != NULL)
*venc = platform_get_drvdata(pdev);

return 0;
Expand Down Expand Up @@ -593,6 +608,7 @@ EXPORT_SYMBOL(venc_sub_dev_init);

static int venc_probe(struct platform_device *pdev)
{
const struct platform_device_id *pdev_id;
struct venc_state *venc;
struct resource *res;
int ret;
Expand All @@ -601,6 +617,12 @@ static int venc_probe(struct platform_device *pdev)
if (venc == NULL)
return -ENOMEM;

pdev_id = platform_get_device_id(pdev);
if (!pdev_id) {
ret = -EINVAL;
goto free_mem;
}
venc->venc_type = pdev_id->driver_data;
venc->pdev = &pdev->dev;
venc->pdata = pdev->dev.platform_data;
if (NULL == venc->pdata) {
Expand Down Expand Up @@ -630,7 +652,7 @@ static int venc_probe(struct platform_device *pdev)
goto release_venc_mem_region;
}

if (venc->pdata->venc_type != VPBE_VERSION_1) {
if (venc->venc_type != VPBE_VERSION_1) {
res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
if (!res) {
dev_err(venc->pdev,
Expand Down Expand Up @@ -681,7 +703,7 @@ static int venc_remove(struct platform_device *pdev)
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
iounmap((void *)venc->venc_base);
release_mem_region(res->start, resource_size(res));
if (venc->pdata->venc_type != VPBE_VERSION_1) {
if (venc->venc_type != VPBE_VERSION_1) {
res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
iounmap((void *)venc->vdaccfg_reg);
release_mem_region(res->start, resource_size(res));
Expand All @@ -698,6 +720,7 @@ static struct platform_driver venc_driver = {
.name = MODULE_NAME,
.owner = THIS_MODULE,
},
.id_table = vpbe_venc_devtype
};

module_platform_driver(venc_driver);
Expand Down
5 changes: 3 additions & 2 deletions include/media/davinci/vpbe_osd.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,9 @@

#include <media/davinci/vpbe_types.h>

#define VPBE_OSD_SUBDEV_NAME "vpbe-osd"
#define DM644X_VPBE_OSD_SUBDEV_NAME "dm644x,vpbe-osd"
#define DM365_VPBE_OSD_SUBDEV_NAME "dm365,vpbe-osd"
#define DM355_VPBE_OSD_SUBDEV_NAME "dm355,vpbe-osd"

/**
* enum osd_layer
Expand Down Expand Up @@ -387,7 +389,6 @@ struct osd_state {
};

struct osd_platform_data {
enum vpbe_version vpbe_type;
int field_inv_wa_enable;
};

Expand Down
Loading

0 comments on commit caff80c

Please sign in to comment.