mirror of https://gitee.com/openkylin/linux.git
OMAP2, 3: DSS2: DSI: 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 DSI 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, vdds_dsi regulator handling is copied to dsi.c, since vdds_dsi regulator is needed by dpi_init() too. Board files are updated accordingly to add 2 instances of vdds_dsi regulator. DSI platform driver is registered from inside omap_dss_probe, in the order desired. Signed-off-by: Senthilvadivu Guruswamy <svadivu@ti.com> Signed-off-by: Sumit Semwal <sumit.semwal@ti.com> Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
This commit is contained in:
parent
30ea50c9f5
commit
c8aac01b7b
|
@ -401,6 +401,7 @@ static struct regulator_consumer_supply sdp3430_vdda_dac_supplies[] = {
|
||||||
/* VPLL2 for digital video outputs */
|
/* VPLL2 for digital video outputs */
|
||||||
static struct regulator_consumer_supply sdp3430_vpll2_supplies[] = {
|
static struct regulator_consumer_supply sdp3430_vpll2_supplies[] = {
|
||||||
REGULATOR_SUPPLY("vdds_dsi", "omapdss"),
|
REGULATOR_SUPPLY("vdds_dsi", "omapdss"),
|
||||||
|
REGULATOR_SUPPLY("vdds_dsi", "omapdss_dsi1"),
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct regulator_consumer_supply sdp3430_vmmc1_supplies[] = {
|
static struct regulator_consumer_supply sdp3430_vmmc1_supplies[] = {
|
||||||
|
|
|
@ -277,8 +277,10 @@ static struct twl4030_gpio_platform_data devkit8000_gpio_data = {
|
||||||
.setup = devkit8000_twl_gpio_setup,
|
.setup = devkit8000_twl_gpio_setup,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct regulator_consumer_supply devkit8000_vpll1_supply =
|
static struct regulator_consumer_supply devkit8000_vpll1_supplies[] = {
|
||||||
REGULATOR_SUPPLY("vdds_dsi", "omapdss");
|
REGULATOR_SUPPLY("vdds_dsi", "omapdss"),
|
||||||
|
REGULATOR_SUPPLY("vdds_dsi", "omapdss_dsi1"),
|
||||||
|
};
|
||||||
|
|
||||||
/* VMMC1 for MMC1 pins CMD, CLK, DAT0..DAT3 (20 mA, plus card == max 220 mA) */
|
/* VMMC1 for MMC1 pins CMD, CLK, DAT0..DAT3 (20 mA, plus card == max 220 mA) */
|
||||||
static struct regulator_init_data devkit8000_vmmc1 = {
|
static struct regulator_init_data devkit8000_vmmc1 = {
|
||||||
|
@ -319,8 +321,8 @@ static struct regulator_init_data devkit8000_vpll1 = {
|
||||||
.valid_ops_mask = REGULATOR_CHANGE_MODE
|
.valid_ops_mask = REGULATOR_CHANGE_MODE
|
||||||
| REGULATOR_CHANGE_STATUS,
|
| REGULATOR_CHANGE_STATUS,
|
||||||
},
|
},
|
||||||
.num_consumer_supplies = 1,
|
.num_consumer_supplies = ARRAY_SIZE(devkit8000_vpll1_supplies),
|
||||||
.consumer_supplies = &devkit8000_vpll1_supply,
|
.consumer_supplies = devkit8000_vpll1_supplies,
|
||||||
};
|
};
|
||||||
|
|
||||||
/* VAUX4 for ads7846 and nubs */
|
/* VAUX4 for ads7846 and nubs */
|
||||||
|
|
|
@ -485,8 +485,10 @@ static struct omap_dss_board_info igep2_dss_data = {
|
||||||
.default_device = &igep2_dvi_device,
|
.default_device = &igep2_dvi_device,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct regulator_consumer_supply igep2_vpll2_supply =
|
static struct regulator_consumer_supply igep2_vpll2_supplies[] = {
|
||||||
REGULATOR_SUPPLY("vdds_dsi", "omapdss");
|
REGULATOR_SUPPLY("vdds_dsi", "omapdss"),
|
||||||
|
REGULATOR_SUPPLY("vdds_dsi", "omapdss_dsi1"),
|
||||||
|
};
|
||||||
|
|
||||||
static struct regulator_init_data igep2_vpll2 = {
|
static struct regulator_init_data igep2_vpll2 = {
|
||||||
.constraints = {
|
.constraints = {
|
||||||
|
@ -499,8 +501,8 @@ static struct regulator_init_data igep2_vpll2 = {
|
||||||
.valid_ops_mask = REGULATOR_CHANGE_MODE
|
.valid_ops_mask = REGULATOR_CHANGE_MODE
|
||||||
| REGULATOR_CHANGE_STATUS,
|
| REGULATOR_CHANGE_STATUS,
|
||||||
},
|
},
|
||||||
.num_consumer_supplies = 1,
|
.num_consumer_supplies = ARRAY_SIZE(igep2_vpll2_supplies),
|
||||||
.consumer_supplies = &igep2_vpll2_supply,
|
.consumer_supplies = igep2_vpll2_supplies,
|
||||||
};
|
};
|
||||||
|
|
||||||
static void __init igep2_display_init(void)
|
static void __init igep2_display_init(void)
|
||||||
|
|
|
@ -234,8 +234,10 @@ 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_venc");
|
REGULATOR_SUPPLY("vdda_dac", "omapdss_venc");
|
||||||
|
|
||||||
static struct regulator_consumer_supply beagle_vdvi_supply =
|
static struct regulator_consumer_supply beagle_vdvi_supplies[] = {
|
||||||
REGULATOR_SUPPLY("vdds_dsi", "omapdss");
|
REGULATOR_SUPPLY("vdds_dsi", "omapdss"),
|
||||||
|
REGULATOR_SUPPLY("vdds_dsi", "omapdss_dsi1"),
|
||||||
|
};
|
||||||
|
|
||||||
static void __init beagle_display_init(void)
|
static void __init beagle_display_init(void)
|
||||||
{
|
{
|
||||||
|
@ -422,8 +424,8 @@ static struct regulator_init_data beagle_vpll2 = {
|
||||||
.valid_ops_mask = REGULATOR_CHANGE_MODE
|
.valid_ops_mask = REGULATOR_CHANGE_MODE
|
||||||
| REGULATOR_CHANGE_STATUS,
|
| REGULATOR_CHANGE_STATUS,
|
||||||
},
|
},
|
||||||
.num_consumer_supplies = 1,
|
.num_consumer_supplies = ARRAY_SIZE(beagle_vdvi_supplies),
|
||||||
.consumer_supplies = &beagle_vdvi_supply,
|
.consumer_supplies = beagle_vdvi_supplies,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct twl4030_usb_data beagle_usb_data = {
|
static struct twl4030_usb_data beagle_usb_data = {
|
||||||
|
|
|
@ -560,8 +560,10 @@ static struct regulator_init_data omap3_evm_vdac = {
|
||||||
};
|
};
|
||||||
|
|
||||||
/* VPLL2 for digital video outputs */
|
/* VPLL2 for digital video outputs */
|
||||||
static struct regulator_consumer_supply omap3_evm_vpll2_supply =
|
static struct regulator_consumer_supply omap3_evm_vpll2_supplies[] = {
|
||||||
REGULATOR_SUPPLY("vdds_dsi", "omapdss");
|
REGULATOR_SUPPLY("vdds_dsi", "omapdss"),
|
||||||
|
REGULATOR_SUPPLY("vdds_dsi", "omapdss_dsi1"),
|
||||||
|
};
|
||||||
|
|
||||||
static struct regulator_init_data omap3_evm_vpll2 = {
|
static struct regulator_init_data omap3_evm_vpll2 = {
|
||||||
.constraints = {
|
.constraints = {
|
||||||
|
@ -573,8 +575,8 @@ static struct regulator_init_data omap3_evm_vpll2 = {
|
||||||
.valid_ops_mask = REGULATOR_CHANGE_MODE
|
.valid_ops_mask = REGULATOR_CHANGE_MODE
|
||||||
| REGULATOR_CHANGE_STATUS,
|
| REGULATOR_CHANGE_STATUS,
|
||||||
},
|
},
|
||||||
.num_consumer_supplies = 1,
|
.num_consumer_supplies = ARRAY_SIZE(omap3_evm_vpll2_supplies),
|
||||||
.consumer_supplies = &omap3_evm_vpll2_supply,
|
.consumer_supplies = omap3_evm_vpll2_supplies,
|
||||||
};
|
};
|
||||||
|
|
||||||
/* ads7846 on SPI */
|
/* ads7846 on SPI */
|
||||||
|
|
|
@ -347,6 +347,7 @@ static struct regulator_consumer_supply pandora_vdda_dac_supply =
|
||||||
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"),
|
||||||
REGULATOR_SUPPLY("vdds_dsi", "omapdss"),
|
REGULATOR_SUPPLY("vdds_dsi", "omapdss"),
|
||||||
|
REGULATOR_SUPPLY("vdds_dsi", "omapdss_dsi1"),
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct regulator_consumer_supply pandora_vcc_lcd_supply =
|
static struct regulator_consumer_supply pandora_vcc_lcd_supply =
|
||||||
|
|
|
@ -457,8 +457,10 @@ static struct regulator_init_data omap3_stalker_vdac = {
|
||||||
};
|
};
|
||||||
|
|
||||||
/* VPLL2 for digital video outputs */
|
/* VPLL2 for digital video outputs */
|
||||||
static struct regulator_consumer_supply omap3_stalker_vpll2_supply =
|
static struct regulator_consumer_supply omap3_stalker_vpll2_supplies[] = {
|
||||||
REGULATOR_SUPPLY("vdds_dsi", "omapdss");
|
REGULATOR_SUPPLY("vdds_dsi", "omapdss"),
|
||||||
|
REGULATOR_SUPPLY("vdds_dsi", "omapdss_dsi1"),
|
||||||
|
};
|
||||||
|
|
||||||
static struct regulator_init_data omap3_stalker_vpll2 = {
|
static struct regulator_init_data omap3_stalker_vpll2 = {
|
||||||
.constraints = {
|
.constraints = {
|
||||||
|
@ -471,8 +473,8 @@ static struct regulator_init_data omap3_stalker_vpll2 = {
|
||||||
.valid_ops_mask = REGULATOR_CHANGE_MODE
|
.valid_ops_mask = REGULATOR_CHANGE_MODE
|
||||||
| REGULATOR_CHANGE_STATUS,
|
| REGULATOR_CHANGE_STATUS,
|
||||||
},
|
},
|
||||||
.num_consumer_supplies = 1,
|
.num_consumer_supplies = ARRAY_SIZE(omap3_stalker_vpll2_supplies),
|
||||||
.consumer_supplies = &omap3_stalker_vpll2_supply,
|
.consumer_supplies = omap3_stalker_vpll2_supplies,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct twl4030_platform_data omap3stalker_twldata = {
|
static struct twl4030_platform_data omap3stalker_twldata = {
|
||||||
|
|
|
@ -226,8 +226,10 @@ static struct omap2_hsmmc_info mmc[] = {
|
||||||
{} /* Terminator */
|
{} /* Terminator */
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct regulator_consumer_supply zoom_vpll2_supply =
|
static struct regulator_consumer_supply zoom_vpll2_supplies[] = {
|
||||||
REGULATOR_SUPPLY("vdds_dsi", "omapdss");
|
REGULATOR_SUPPLY("vdds_dsi", "omapdss"),
|
||||||
|
REGULATOR_SUPPLY("vdds_dsi", "omapdss_dsi1"),
|
||||||
|
};
|
||||||
|
|
||||||
static struct regulator_consumer_supply zoom_vdda_dac_supply =
|
static struct regulator_consumer_supply zoom_vdda_dac_supply =
|
||||||
REGULATOR_SUPPLY("vdda_dac", "omapdss_venc");
|
REGULATOR_SUPPLY("vdda_dac", "omapdss_venc");
|
||||||
|
@ -241,8 +243,8 @@ static struct regulator_init_data zoom_vpll2 = {
|
||||||
.valid_ops_mask = REGULATOR_CHANGE_MODE
|
.valid_ops_mask = REGULATOR_CHANGE_MODE
|
||||||
| REGULATOR_CHANGE_STATUS,
|
| REGULATOR_CHANGE_STATUS,
|
||||||
},
|
},
|
||||||
.num_consumer_supplies = 1,
|
.num_consumer_supplies = ARRAY_SIZE(zoom_vpll2_supplies),
|
||||||
.consumer_supplies = &zoom_vpll2_supply,
|
.consumer_supplies = zoom_vpll2_supplies,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct regulator_init_data zoom_vdac = {
|
static struct regulator_init_data zoom_vdac = {
|
||||||
|
|
|
@ -222,9 +222,9 @@ static int omap_dss_probe(struct platform_device *pdev)
|
||||||
goto err_sdi;
|
goto err_sdi;
|
||||||
}
|
}
|
||||||
|
|
||||||
r = dsi_init(pdev);
|
r = dsi_init_platform_driver();
|
||||||
if (r) {
|
if (r) {
|
||||||
DSSERR("Failed to initialize DSI\n");
|
DSSERR("Failed to initialize DSI platform driver\n");
|
||||||
goto err_dsi;
|
goto err_dsi;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -259,7 +259,7 @@ static int omap_dss_probe(struct platform_device *pdev)
|
||||||
dss_uninitialize_debugfs();
|
dss_uninitialize_debugfs();
|
||||||
err_debugfs:
|
err_debugfs:
|
||||||
if (cpu_is_omap34xx())
|
if (cpu_is_omap34xx())
|
||||||
dsi_exit();
|
dsi_uninit_platform_driver();
|
||||||
err_dsi:
|
err_dsi:
|
||||||
if (cpu_is_omap34xx())
|
if (cpu_is_omap34xx())
|
||||||
sdi_exit();
|
sdi_exit();
|
||||||
|
@ -290,7 +290,7 @@ static int omap_dss_remove(struct platform_device *pdev)
|
||||||
dpi_exit();
|
dpi_exit();
|
||||||
rfbi_uninit_platform_driver();
|
rfbi_uninit_platform_driver();
|
||||||
if (cpu_is_omap34xx()) {
|
if (cpu_is_omap34xx()) {
|
||||||
dsi_exit();
|
dsi_uninit_platform_driver();
|
||||||
sdi_exit();
|
sdi_exit();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -222,6 +222,7 @@ struct dsi_irq_stats {
|
||||||
|
|
||||||
static struct
|
static struct
|
||||||
{
|
{
|
||||||
|
struct platform_device *pdev;
|
||||||
void __iomem *base;
|
void __iomem *base;
|
||||||
|
|
||||||
struct dsi_clock_info current_cinfo;
|
struct dsi_clock_info current_cinfo;
|
||||||
|
@ -292,6 +293,20 @@ static inline u32 dsi_read_reg(const struct dsi_reg idx)
|
||||||
return __raw_readl(dsi.base + idx.idx);
|
return __raw_readl(dsi.base + idx.idx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static struct regulator *dsi_get_vdds_dsi(void)
|
||||||
|
{
|
||||||
|
struct regulator *reg;
|
||||||
|
|
||||||
|
if (dsi.vdds_dsi_reg != NULL)
|
||||||
|
return dsi.vdds_dsi_reg;
|
||||||
|
|
||||||
|
reg = regulator_get(&dsi.pdev->dev, "vdds_dsi");
|
||||||
|
if (!IS_ERR(reg))
|
||||||
|
dsi.vdds_dsi_reg = reg;
|
||||||
|
|
||||||
|
return reg;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void dsi_save_context(void)
|
void dsi_save_context(void)
|
||||||
{
|
{
|
||||||
|
@ -3238,7 +3253,7 @@ void dsi_wait_dsi2_pll_active(void)
|
||||||
DSSERR("DSI2 PLL clock not active\n");
|
DSSERR("DSI2 PLL clock not active\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
int dsi_init(struct platform_device *pdev)
|
static int dsi_init(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
u32 rev;
|
u32 rev;
|
||||||
int r;
|
int r;
|
||||||
|
@ -3275,7 +3290,7 @@ int dsi_init(struct platform_device *pdev)
|
||||||
goto err1;
|
goto err1;
|
||||||
}
|
}
|
||||||
|
|
||||||
dsi.vdds_dsi_reg = dss_get_vdds_dsi();
|
dsi.vdds_dsi_reg = dsi_get_vdds_dsi();
|
||||||
if (IS_ERR(dsi.vdds_dsi_reg)) {
|
if (IS_ERR(dsi.vdds_dsi_reg)) {
|
||||||
DSSERR("can't get VDDS_DSI regulator\n");
|
DSSERR("can't get VDDS_DSI regulator\n");
|
||||||
r = PTR_ERR(dsi.vdds_dsi_reg);
|
r = PTR_ERR(dsi.vdds_dsi_reg);
|
||||||
|
@ -3298,8 +3313,13 @@ int dsi_init(struct platform_device *pdev)
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
void dsi_exit(void)
|
static void dsi_exit(void)
|
||||||
{
|
{
|
||||||
|
if (dsi.vdds_dsi_reg != NULL) {
|
||||||
|
regulator_put(dsi.vdds_dsi_reg);
|
||||||
|
dsi.vdds_dsi_reg = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
iounmap(dsi.base);
|
iounmap(dsi.base);
|
||||||
|
|
||||||
destroy_workqueue(dsi.workqueue);
|
destroy_workqueue(dsi.workqueue);
|
||||||
|
@ -3307,3 +3327,41 @@ void dsi_exit(void)
|
||||||
DSSDBG("omap_dsi_exit\n");
|
DSSDBG("omap_dsi_exit\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* DSI1 HW IP initialisation */
|
||||||
|
static int omap_dsi1hw_probe(struct platform_device *pdev)
|
||||||
|
{
|
||||||
|
int r;
|
||||||
|
dsi.pdev = pdev;
|
||||||
|
r = dsi_init(pdev);
|
||||||
|
if (r) {
|
||||||
|
DSSERR("Failed to initialize DSI\n");
|
||||||
|
goto err_dsi;
|
||||||
|
}
|
||||||
|
err_dsi:
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int omap_dsi1hw_remove(struct platform_device *pdev)
|
||||||
|
{
|
||||||
|
dsi_exit();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct platform_driver omap_dsi1hw_driver = {
|
||||||
|
.probe = omap_dsi1hw_probe,
|
||||||
|
.remove = omap_dsi1hw_remove,
|
||||||
|
.driver = {
|
||||||
|
.name = "omapdss_dsi1",
|
||||||
|
.owner = THIS_MODULE,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
int dsi_init_platform_driver(void)
|
||||||
|
{
|
||||||
|
return platform_driver_register(&omap_dsi1hw_driver);
|
||||||
|
}
|
||||||
|
|
||||||
|
void dsi_uninit_platform_driver(void)
|
||||||
|
{
|
||||||
|
return platform_driver_unregister(&omap_dsi1hw_driver);
|
||||||
|
}
|
||||||
|
|
|
@ -261,8 +261,8 @@ static inline void sdi_exit(void)
|
||||||
|
|
||||||
/* DSI */
|
/* DSI */
|
||||||
#ifdef CONFIG_OMAP2_DSS_DSI
|
#ifdef CONFIG_OMAP2_DSS_DSI
|
||||||
int dsi_init(struct platform_device *pdev);
|
int dsi_init_platform_driver(void);
|
||||||
void dsi_exit(void);
|
void dsi_uninit_platform_driver(void);
|
||||||
|
|
||||||
void dsi_dump_clocks(struct seq_file *s);
|
void dsi_dump_clocks(struct seq_file *s);
|
||||||
void dsi_dump_irqs(struct seq_file *s);
|
void dsi_dump_irqs(struct seq_file *s);
|
||||||
|
@ -287,11 +287,11 @@ void dsi_get_overlay_fifo_thresholds(enum omap_plane plane,
|
||||||
void dsi_wait_dsi1_pll_active(void);
|
void dsi_wait_dsi1_pll_active(void);
|
||||||
void dsi_wait_dsi2_pll_active(void);
|
void dsi_wait_dsi2_pll_active(void);
|
||||||
#else
|
#else
|
||||||
static inline int dsi_init(struct platform_device *pdev)
|
static inline int dsi_init_platform_driver(void)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static inline void dsi_exit(void)
|
static inline void dsi_uninit_platform_driver(void)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
static inline void dsi_wait_dsi1_pll_active(void)
|
static inline void dsi_wait_dsi1_pll_active(void)
|
||||||
|
|
Loading…
Reference in New Issue