diff options
Diffstat (limited to 'drivers/video/omap2/dss/rfbi.c')
| -rw-r--r-- | drivers/video/omap2/dss/rfbi.c | 86 | 
1 files changed, 62 insertions, 24 deletions
diff --git a/drivers/video/omap2/dss/rfbi.c b/drivers/video/omap2/dss/rfbi.c index 788a0ef6323..7985fa12b9b 100644 --- a/drivers/video/omap2/dss/rfbi.c +++ b/drivers/video/omap2/dss/rfbi.c @@ -141,7 +141,7 @@ static void rfbi_runtime_put(void)  	DSSDBG("rfbi_runtime_put\n");  	r = pm_runtime_put_sync(&rfbi.pdev->dev); -	WARN_ON(r < 0); +	WARN_ON(r < 0 && r != -ENOSYS);  }  void rfbi_bus_lock(void) @@ -304,13 +304,23 @@ static void rfbi_transfer_area(struct omap_dss_device *dssdev, u16 width,  		u16 height, void (*callback)(void *data), void *data)  {  	u32 l; +	struct omap_video_timings timings = { +		.hsw		= 1, +		.hfp		= 1, +		.hbp		= 1, +		.vsw		= 1, +		.vfp		= 0, +		.vbp		= 0, +		.x_res		= width, +		.y_res		= height, +	};  	/*BUG_ON(callback == 0);*/  	BUG_ON(rfbi.framedone_callback != NULL);  	DSSDBG("rfbi_transfer_area %dx%d\n", width, height); -	dispc_mgr_set_lcd_size(dssdev->manager->id, width, height); +	dss_mgr_set_timings(dssdev->manager, &timings);  	dispc_mgr_enable(dssdev->manager->id, true); @@ -766,6 +776,16 @@ int omap_rfbi_prepare_update(struct omap_dss_device *dssdev,  		u16 *x, u16 *y, u16 *w, u16 *h)  {  	u16 dw, dh; +	struct omap_video_timings timings = { +		.hsw		= 1, +		.hfp		= 1, +		.hbp		= 1, +		.vsw		= 1, +		.vfp		= 0, +		.vbp		= 0, +		.x_res		= *w, +		.y_res		= *h, +	};  	dssdev->driver->get_resolution(dssdev, &dw, &dh); @@ -784,7 +804,7 @@ int omap_rfbi_prepare_update(struct omap_dss_device *dssdev,  	if (*w == 0 || *h == 0)  		return -EINVAL; -	dispc_mgr_set_lcd_size(dssdev->manager->id, *w, *h); +	dss_mgr_set_timings(dssdev->manager, &timings);  	return 0;  } @@ -799,7 +819,7 @@ int omap_rfbi_update(struct omap_dss_device *dssdev,  }  EXPORT_SYMBOL(omap_rfbi_update); -void rfbi_dump_regs(struct seq_file *s) +static void rfbi_dump_regs(struct seq_file *s)  {  #define DUMPREG(r) seq_printf(s, "%-35s %08x\n", #r, rfbi_read_reg(r)) @@ -900,15 +920,39 @@ void omapdss_rfbi_display_disable(struct omap_dss_device *dssdev)  }  EXPORT_SYMBOL(omapdss_rfbi_display_disable); -int rfbi_init_display(struct omap_dss_device *dssdev) +static int __init rfbi_init_display(struct omap_dss_device *dssdev)  {  	rfbi.dssdev[dssdev->phy.rfbi.channel] = dssdev;  	dssdev->caps = OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE;  	return 0;  } +static void __init rfbi_probe_pdata(struct platform_device *pdev) +{ +	struct omap_dss_board_info *pdata = pdev->dev.platform_data; +	int i, r; + +	for (i = 0; i < pdata->num_devices; ++i) { +		struct omap_dss_device *dssdev = pdata->devices[i]; + +		if (dssdev->type != OMAP_DISPLAY_TYPE_DBI) +			continue; + +		r = rfbi_init_display(dssdev); +		if (r) { +			DSSERR("device %s init failed: %d\n", dssdev->name, r); +			continue; +		} + +		r = omap_dss_register_device(dssdev, &pdev->dev, i); +		if (r) +			DSSERR("device %s register failed: %d\n", +				dssdev->name, r); +	} +} +  /* RFBI HW IP initialisation */ -static int omap_rfbihw_probe(struct platform_device *pdev) +static int __init omap_rfbihw_probe(struct platform_device *pdev)  {  	u32 rev;  	struct resource *rfbi_mem; @@ -956,6 +1000,10 @@ static int omap_rfbihw_probe(struct platform_device *pdev)  	rfbi_runtime_put(); +	dss_debugfs_create_file("rfbi", rfbi_dump_regs); + +	rfbi_probe_pdata(pdev); +  	return 0;  err_runtime_get: @@ -963,8 +1011,9 @@ err_runtime_get:  	return r;  } -static int omap_rfbihw_remove(struct platform_device *pdev) +static int __exit omap_rfbihw_remove(struct platform_device *pdev)  { +	omap_dss_unregister_child_devices(&pdev->dev);  	pm_runtime_disable(&pdev->dev);  	return 0;  } @@ -972,7 +1021,6 @@ static int omap_rfbihw_remove(struct platform_device *pdev)  static int rfbi_runtime_suspend(struct device *dev)  {  	dispc_runtime_put(); -	dss_runtime_put();  	return 0;  } @@ -981,20 +1029,11 @@ static int rfbi_runtime_resume(struct device *dev)  {  	int r; -	r = dss_runtime_get(); -	if (r < 0) -		goto err_get_dss; -  	r = dispc_runtime_get();  	if (r < 0) -		goto err_get_dispc; +		return r;  	return 0; - -err_get_dispc: -	dss_runtime_put(); -err_get_dss: -	return r;  }  static const struct dev_pm_ops rfbi_pm_ops = { @@ -1003,8 +1042,7 @@ static const struct dev_pm_ops rfbi_pm_ops = {  };  static struct platform_driver omap_rfbihw_driver = { -	.probe          = omap_rfbihw_probe, -	.remove         = omap_rfbihw_remove, +	.remove         = __exit_p(omap_rfbihw_remove),  	.driver         = {  		.name   = "omapdss_rfbi",  		.owner  = THIS_MODULE, @@ -1012,12 +1050,12 @@ static struct platform_driver omap_rfbihw_driver = {  	},  }; -int rfbi_init_platform_driver(void) +int __init rfbi_init_platform_driver(void)  { -	return platform_driver_register(&omap_rfbihw_driver); +	return platform_driver_probe(&omap_rfbihw_driver, omap_rfbihw_probe);  } -void rfbi_uninit_platform_driver(void) +void __exit rfbi_uninit_platform_driver(void)  { -	return platform_driver_unregister(&omap_rfbihw_driver); +	platform_driver_unregister(&omap_rfbihw_driver);  }  |