core.c 3.3 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
/*
 * linux/drivers/video/omap2/dss/core.c
 *
 * Copyright (C) 2009 Nokia Corporation
 * Author: Tomi Valkeinen <tomi.valkeinen@nokia.com>
 *
 * Some code and ideas taken from drivers/video/omap/ driver
 * by Imre Deak.
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 as published by
 * the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
 * more details.
 *
 * You should have received a copy of the GNU General Public License along with
 * this program.  If not, see <http://www.gnu.org/licenses/>.
 */

#define DSS_SUBSYS_NAME "CORE"

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/clk.h>
#include <linux/err.h>
#include <linux/platform_device.h>
#include <linux/io.h>
#include <linux/device.h>
32
#include <linux/regulator/consumer.h>
33
#include <linux/suspend.h>
34
#include <linux/slab.h>
35

36
#include "omapdss.h"
37 38 39 40 41 42
#include "dss.h"

static struct {
	struct platform_device *pdev;
} core;

43 44 45 46 47 48 49
enum omapdss_version omapdss_get_version(void)
{
	struct omap_dss_board_info *pdata = core.pdev->dev.platform_data;
	return pdata->version;
}
EXPORT_SYMBOL(omapdss_get_version);

50
/* PLATFORM DEVICE */
51

T
Tomi Valkeinen 已提交
52
static int __init omap_dss_probe(struct platform_device *pdev)
53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
{
	core.pdev = pdev;

	return 0;
}

static int omap_dss_remove(struct platform_device *pdev)
{
	return 0;
}

static struct platform_driver omap_dss_driver = {
	.remove         = omap_dss_remove,
	.driver         = {
		.name   = "omapdss",
	},
};

/* INIT */
72
static int (*dss_output_drv_reg_funcs[])(void) __initdata = {
73 74
	dss_init_platform_driver,
	dispc_init_platform_driver,
T
Tomi Valkeinen 已提交
75 76 77
#ifdef CONFIG_OMAP2_DSS_DSI
	dsi_init_platform_driver,
#endif
78 79 80 81
#ifdef CONFIG_OMAP2_DSS_VENC
	venc_init_platform_driver,
#endif
#ifdef CONFIG_OMAP4_DSS_HDMI
82
	hdmi4_init_platform_driver,
83
#endif
84 85 86
#ifdef CONFIG_OMAP5_DSS_HDMI
	hdmi5_init_platform_driver,
#endif
87 88
};

89
static void (*dss_output_drv_unreg_funcs[])(void) = {
T
Tomi Valkeinen 已提交
90 91
#ifdef CONFIG_OMAP5_DSS_HDMI
	hdmi5_uninit_platform_driver,
T
Tomi Valkeinen 已提交
92
#endif
T
Tomi Valkeinen 已提交
93 94
#ifdef CONFIG_OMAP4_DSS_HDMI
	hdmi4_uninit_platform_driver,
95
#endif
T
Tomi Valkeinen 已提交
96 97
#ifdef CONFIG_OMAP2_DSS_VENC
	venc_uninit_platform_driver,
98
#endif
T
Tomi Valkeinen 已提交
99 100
#ifdef CONFIG_OMAP2_DSS_DSI
	dsi_uninit_platform_driver,
101
#endif
102 103
	dispc_uninit_platform_driver,
	dss_uninit_platform_driver,
104 105
};

106
static int __init omap_dss_init(void)
107 108
{
	int r;
109
	int i;
110

111
	r = platform_driver_probe(&omap_dss_driver, omap_dss_probe);
112 113 114
	if (r)
		return r;

115 116
	for (i = 0; i < ARRAY_SIZE(dss_output_drv_reg_funcs); ++i) {
		r = dss_output_drv_reg_funcs[i]();
117 118
		if (r)
			goto err_reg;
119 120 121 122
	}

	return 0;

123 124 125 126 127 128
err_reg:
	for (i = ARRAY_SIZE(dss_output_drv_reg_funcs) - i;
			i < ARRAY_SIZE(dss_output_drv_reg_funcs);
			++i)
		dss_output_drv_unreg_funcs[i]();

129 130 131 132 133
	platform_driver_unregister(&omap_dss_driver);

	return r;
}

134
static void __exit omap_dss_exit(void)
135
{
136 137
	int i;

138 139
	for (i = 0; i < ARRAY_SIZE(dss_output_drv_unreg_funcs); ++i)
		dss_output_drv_unreg_funcs[i]();
140 141 142 143

	platform_driver_unregister(&omap_dss_driver);
}

144 145 146 147 148 149 150
module_init(omap_dss_init);
module_exit(omap_dss_exit);

MODULE_AUTHOR("Tomi Valkeinen <tomi.valkeinen@nokia.com>");
MODULE_DESCRIPTION("OMAP2/3 Display Subsystem");
MODULE_LICENSE("GPL v2");