提交 30ea50c9 编写于 作者: S Senthilvadivu Guruswamy 提交者: Tomi Valkeinen

OMAP2, 3: DSS2: VENC: create platform_driver, move init, exit to driver

Hwmod adaptation design requires each of the DSS HW IP to be a platform driver.
So a platform_driver for VENC is created and init exit methods are moved from core.c
to its driver probe,remove. pdev member has to be maintained by its own drivers.

Also, venc_vdda_dac reading is moved to venc.c.

VENC platform driver is registered from inside omap_dss_probe, in the order desired.
Signed-off-by: NSenthilvadivu Guruswamy <svadivu@ti.com>
Signed-off-by: NSumit Semwal <sumit.semwal@ti.com>
Signed-off-by: NTomi Valkeinen <tomi.valkeinen@ti.com>
上级 060b6d9c
...@@ -395,7 +395,7 @@ static struct regulator_consumer_supply sdp3430_vaux3_supplies[] = { ...@@ -395,7 +395,7 @@ static struct regulator_consumer_supply sdp3430_vaux3_supplies[] = {
}; };
static struct regulator_consumer_supply sdp3430_vdda_dac_supplies[] = { static struct regulator_consumer_supply sdp3430_vdda_dac_supplies[] = {
REGULATOR_SUPPLY("vdda_dac", "omapdss"), REGULATOR_SUPPLY("vdda_dac", "omapdss_venc"),
}; };
/* VPLL2 for digital video outputs */ /* VPLL2 for digital video outputs */
......
...@@ -488,7 +488,7 @@ static struct regulator_consumer_supply cm_t35_vsim_supply = { ...@@ -488,7 +488,7 @@ static struct regulator_consumer_supply cm_t35_vsim_supply = {
}; };
static struct regulator_consumer_supply cm_t35_vdac_supply = static struct regulator_consumer_supply cm_t35_vdac_supply =
REGULATOR_SUPPLY("vdda_dac", "omapdss"); REGULATOR_SUPPLY("vdda_dac", "omapdss_venc");
static struct regulator_consumer_supply cm_t35_vdvi_supply = static struct regulator_consumer_supply cm_t35_vdvi_supply =
REGULATOR_SUPPLY("vdvi", "omapdss"); REGULATOR_SUPPLY("vdvi", "omapdss");
......
...@@ -196,7 +196,7 @@ static struct omap_dss_board_info devkit8000_dss_data = { ...@@ -196,7 +196,7 @@ static struct omap_dss_board_info devkit8000_dss_data = {
}; };
static struct regulator_consumer_supply devkit8000_vdda_dac_supply = static struct regulator_consumer_supply devkit8000_vdda_dac_supply =
REGULATOR_SUPPLY("vdda_dac", "omapdss"); REGULATOR_SUPPLY("vdda_dac", "omapdss_venc");
static uint32_t board_keymap[] = { static uint32_t board_keymap[] = {
KEY(0, 0, KEY_1), KEY(0, 0, KEY_1),
......
...@@ -232,7 +232,7 @@ static struct omap_dss_board_info beagle_dss_data = { ...@@ -232,7 +232,7 @@ static struct omap_dss_board_info beagle_dss_data = {
}; };
static struct regulator_consumer_supply beagle_vdac_supply = static struct regulator_consumer_supply beagle_vdac_supply =
REGULATOR_SUPPLY("vdda_dac", "omapdss"); REGULATOR_SUPPLY("vdda_dac", "omapdss_venc");
static struct regulator_consumer_supply beagle_vdvi_supply = static struct regulator_consumer_supply beagle_vdvi_supply =
REGULATOR_SUPPLY("vdds_dsi", "omapdss"); REGULATOR_SUPPLY("vdds_dsi", "omapdss");
......
...@@ -542,7 +542,7 @@ static struct twl4030_codec_data omap3evm_codec_data = { ...@@ -542,7 +542,7 @@ static struct twl4030_codec_data omap3evm_codec_data = {
}; };
static struct regulator_consumer_supply omap3_evm_vdda_dac_supply = static struct regulator_consumer_supply omap3_evm_vdda_dac_supply =
REGULATOR_SUPPLY("vdda_dac", "omapdss"); REGULATOR_SUPPLY("vdda_dac", "omapdss_venc");
/* VDAC for DSS driving S-Video */ /* VDAC for DSS driving S-Video */
static struct regulator_init_data omap3_evm_vdac = { static struct regulator_init_data omap3_evm_vdac = {
......
...@@ -342,7 +342,7 @@ static struct regulator_consumer_supply pandora_vmmc3_supply = ...@@ -342,7 +342,7 @@ static struct regulator_consumer_supply pandora_vmmc3_supply =
REGULATOR_SUPPLY("vmmc", "omap_hsmmc.2"); REGULATOR_SUPPLY("vmmc", "omap_hsmmc.2");
static struct regulator_consumer_supply pandora_vdda_dac_supply = static struct regulator_consumer_supply pandora_vdda_dac_supply =
REGULATOR_SUPPLY("vdda_dac", "omapdss"); REGULATOR_SUPPLY("vdda_dac", "omapdss_venc");
static struct regulator_consumer_supply pandora_vdds_supplies[] = { static struct regulator_consumer_supply pandora_vdds_supplies[] = {
REGULATOR_SUPPLY("vdds_sdi", "omapdss"), REGULATOR_SUPPLY("vdds_sdi", "omapdss"),
......
...@@ -439,7 +439,7 @@ static struct twl4030_codec_data omap3stalker_codec_data = { ...@@ -439,7 +439,7 @@ static struct twl4030_codec_data omap3stalker_codec_data = {
}; };
static struct regulator_consumer_supply omap3_stalker_vdda_dac_supply = static struct regulator_consumer_supply omap3_stalker_vdda_dac_supply =
REGULATOR_SUPPLY("vdda_dac", "omapdss"); REGULATOR_SUPPLY("vdda_dac", "omapdss_venc");
/* VDAC for DSS driving S-Video */ /* VDAC for DSS driving S-Video */
static struct regulator_init_data omap3_stalker_vdac = { static struct regulator_init_data omap3_stalker_vdac = {
......
...@@ -372,7 +372,7 @@ static struct regulator_consumer_supply rx51_vaux1_consumers[] = { ...@@ -372,7 +372,7 @@ static struct regulator_consumer_supply rx51_vaux1_consumers[] = {
}; };
static struct regulator_consumer_supply rx51_vdac_supply[] = { static struct regulator_consumer_supply rx51_vdac_supply[] = {
REGULATOR_SUPPLY("vdda_dac", "omapdss"), REGULATOR_SUPPLY("vdda_dac", "omapdss_venc"),
}; };
static struct regulator_init_data rx51_vaux1 = { static struct regulator_init_data rx51_vaux1 = {
......
...@@ -230,7 +230,7 @@ static struct regulator_consumer_supply zoom_vpll2_supply = ...@@ -230,7 +230,7 @@ static struct regulator_consumer_supply zoom_vpll2_supply =
REGULATOR_SUPPLY("vdds_dsi", "omapdss"); REGULATOR_SUPPLY("vdds_dsi", "omapdss");
static struct regulator_consumer_supply zoom_vdda_dac_supply = static struct regulator_consumer_supply zoom_vdda_dac_supply =
REGULATOR_SUPPLY("vdda_dac", "omapdss"); REGULATOR_SUPPLY("vdda_dac", "omapdss_venc");
static struct regulator_init_data zoom_vpll2 = { static struct regulator_init_data zoom_vpll2 = {
.constraints = { .constraints = {
......
...@@ -43,7 +43,6 @@ static struct { ...@@ -43,7 +43,6 @@ static struct {
struct regulator *vdds_dsi_reg; struct regulator *vdds_dsi_reg;
struct regulator *vdds_sdi_reg; struct regulator *vdds_sdi_reg;
struct regulator *vdda_dac_reg;
} core; } core;
static char *def_disp_name; static char *def_disp_name;
...@@ -85,20 +84,6 @@ struct regulator *dss_get_vdds_sdi(void) ...@@ -85,20 +84,6 @@ struct regulator *dss_get_vdds_sdi(void)
return reg; return reg;
} }
struct regulator *dss_get_vdda_dac(void)
{
struct regulator *reg;
if (core.vdda_dac_reg != NULL)
return core.vdda_dac_reg;
reg = regulator_get(&core.pdev->dev, "vdda_dac");
if (!IS_ERR(reg))
core.vdda_dac_reg = reg;
return reg;
}
#if defined(CONFIG_DEBUG_FS) && defined(CONFIG_OMAP2_DSS_DEBUG_SUPPORT) #if defined(CONFIG_DEBUG_FS) && defined(CONFIG_OMAP2_DSS_DEBUG_SUPPORT)
static int dss_debug_show(struct seq_file *s, void *unused) static int dss_debug_show(struct seq_file *s, void *unused)
{ {
...@@ -219,9 +204,9 @@ static int omap_dss_probe(struct platform_device *pdev) ...@@ -219,9 +204,9 @@ static int omap_dss_probe(struct platform_device *pdev)
goto err_dispc; goto err_dispc;
} }
r = venc_init(pdev); r = venc_init_platform_driver();
if (r) { if (r) {
DSSERR("Failed to initialize venc\n"); DSSERR("Failed to initialize venc platform driver\n");
goto err_venc; goto err_venc;
} }
...@@ -279,7 +264,7 @@ static int omap_dss_probe(struct platform_device *pdev) ...@@ -279,7 +264,7 @@ static int omap_dss_probe(struct platform_device *pdev)
if (cpu_is_omap34xx()) if (cpu_is_omap34xx())
sdi_exit(); sdi_exit();
err_sdi: err_sdi:
venc_exit(); venc_uninit_platform_driver();
err_venc: err_venc:
dispc_uninit_platform_driver(); dispc_uninit_platform_driver();
err_dispc: err_dispc:
...@@ -300,7 +285,7 @@ static int omap_dss_remove(struct platform_device *pdev) ...@@ -300,7 +285,7 @@ static int omap_dss_remove(struct platform_device *pdev)
dss_uninitialize_debugfs(); dss_uninitialize_debugfs();
venc_exit(); venc_uninit_platform_driver();
dispc_uninit_platform_driver(); dispc_uninit_platform_driver();
dpi_exit(); dpi_exit();
rfbi_uninit_platform_driver(); rfbi_uninit_platform_driver();
...@@ -597,11 +582,6 @@ static void __exit omap_dss_exit(void) ...@@ -597,11 +582,6 @@ static void __exit omap_dss_exit(void)
core.vdds_sdi_reg = NULL; core.vdds_sdi_reg = NULL;
} }
if (core.vdda_dac_reg != NULL) {
regulator_put(core.vdda_dac_reg);
core.vdda_dac_reg = NULL;
}
platform_driver_unregister(&omap_dss_driver); platform_driver_unregister(&omap_dss_driver);
omap_dss_bus_unregister(); omap_dss_bus_unregister();
......
...@@ -172,7 +172,6 @@ struct platform_device; ...@@ -172,7 +172,6 @@ struct platform_device;
struct bus_type *dss_get_bus(void); struct bus_type *dss_get_bus(void);
struct regulator *dss_get_vdds_dsi(void); struct regulator *dss_get_vdds_dsi(void);
struct regulator *dss_get_vdds_sdi(void); struct regulator *dss_get_vdds_sdi(void);
struct regulator *dss_get_vdda_dac(void);
/* display */ /* display */
int dss_suspend_all_devices(void); int dss_suspend_all_devices(void);
...@@ -412,16 +411,16 @@ int dispc_get_clock_div(enum omap_channel channel, ...@@ -412,16 +411,16 @@ int dispc_get_clock_div(enum omap_channel channel,
/* VENC */ /* VENC */
#ifdef CONFIG_OMAP2_DSS_VENC #ifdef CONFIG_OMAP2_DSS_VENC
int venc_init(struct platform_device *pdev); int venc_init_platform_driver(void);
void venc_exit(void); void venc_uninit_platform_driver(void);
void venc_dump_regs(struct seq_file *s); void venc_dump_regs(struct seq_file *s);
int venc_init_display(struct omap_dss_device *display); int venc_init_display(struct omap_dss_device *display);
#else #else
static inline int venc_init(struct platform_device *pdev) static inline int venc_init_platform_driver(void)
{ {
return 0; return 0;
} }
static inline void venc_exit(void) static inline void venc_uninit_platform_driver(void)
{ {
} }
#endif #endif
......
...@@ -289,6 +289,7 @@ const struct omap_video_timings omap_dss_ntsc_timings = { ...@@ -289,6 +289,7 @@ const struct omap_video_timings omap_dss_ntsc_timings = {
EXPORT_SYMBOL(omap_dss_ntsc_timings); EXPORT_SYMBOL(omap_dss_ntsc_timings);
static struct { static struct {
struct platform_device *pdev;
void __iomem *base; void __iomem *base;
struct mutex venc_lock; struct mutex venc_lock;
u32 wss_data; u32 wss_data;
...@@ -306,6 +307,17 @@ static inline u32 venc_read_reg(int idx) ...@@ -306,6 +307,17 @@ static inline u32 venc_read_reg(int idx)
return l; return l;
} }
static struct regulator *venc_get_vdda_dac(void)
{
struct regulator *reg;
reg = regulator_get(&venc.pdev->dev, "vdda_dac");
if (!IS_ERR(reg))
venc.vdda_dac_reg = reg;
return reg;
}
static void venc_write_config(const struct venc_config *config) static void venc_write_config(const struct venc_config *config)
{ {
DSSDBG("write venc conf\n"); DSSDBG("write venc conf\n");
...@@ -641,46 +653,6 @@ static struct omap_dss_driver venc_driver = { ...@@ -641,46 +653,6 @@ static struct omap_dss_driver venc_driver = {
}; };
/* driver end */ /* driver end */
int venc_init(struct platform_device *pdev)
{
u8 rev_id;
mutex_init(&venc.venc_lock);
venc.wss_data = 0;
venc.base = ioremap(VENC_BASE, SZ_1K);
if (!venc.base) {
DSSERR("can't ioremap VENC\n");
return -ENOMEM;
}
venc.vdda_dac_reg = dss_get_vdda_dac();
if (IS_ERR(venc.vdda_dac_reg)) {
iounmap(venc.base);
DSSERR("can't get VDDA_DAC regulator\n");
return PTR_ERR(venc.vdda_dac_reg);
}
venc_enable_clocks(1);
rev_id = (u8)(venc_read_reg(VENC_REV_ID) & 0xff);
printk(KERN_INFO "OMAP VENC rev %d\n", rev_id);
venc_enable_clocks(0);
return omap_dss_register_driver(&venc_driver);
}
void venc_exit(void)
{
omap_dss_unregister_driver(&venc_driver);
iounmap(venc.base);
}
int venc_init_display(struct omap_dss_device *dssdev) int venc_init_display(struct omap_dss_device *dssdev)
{ {
DSSDBG("init_display\n"); DSSDBG("init_display\n");
...@@ -740,3 +712,67 @@ void venc_dump_regs(struct seq_file *s) ...@@ -740,3 +712,67 @@ void venc_dump_regs(struct seq_file *s)
#undef DUMPREG #undef DUMPREG
} }
/* VENC HW IP initialisation */
static int omap_venchw_probe(struct platform_device *pdev)
{
u8 rev_id;
venc.pdev = pdev;
mutex_init(&venc.venc_lock);
venc.wss_data = 0;
venc.base = ioremap(VENC_BASE, SZ_1K);
if (!venc.base) {
DSSERR("can't ioremap VENC\n");
return -ENOMEM;
}
venc.vdda_dac_reg = venc_get_vdda_dac();
if (IS_ERR(venc.vdda_dac_reg)) {
iounmap(venc.base);
DSSERR("can't get VDDA_DAC regulator\n");
return PTR_ERR(venc.vdda_dac_reg);
}
venc_enable_clocks(1);
rev_id = (u8)(venc_read_reg(VENC_REV_ID) & 0xff);
printk(KERN_INFO "OMAP VENC rev %d\n", rev_id);
venc_enable_clocks(0);
return omap_dss_register_driver(&venc_driver);
}
static int omap_venchw_remove(struct platform_device *pdev)
{
if (venc.vdda_dac_reg != NULL) {
regulator_put(venc.vdda_dac_reg);
venc.vdda_dac_reg = NULL;
}
omap_dss_unregister_driver(&venc_driver);
iounmap(venc.base);
return 0;
}
static struct platform_driver omap_venchw_driver = {
.probe = omap_venchw_probe,
.remove = omap_venchw_remove,
.driver = {
.name = "omapdss_venc",
.owner = THIS_MODULE,
},
};
int venc_init_platform_driver(void)
{
return platform_driver_register(&omap_venchw_driver);
}
void venc_uninit_platform_driver(void)
{
return platform_driver_unregister(&omap_venchw_driver);
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册