165316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak/*
265316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak * LCD panel support for the TI OMAP H3 board
365316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak *
465316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak * Copyright (C) 2004 Nokia Corporation
565316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak * Author: Imre Deak <imre.deak@nokia.com>
665316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak *
765316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak * This program is free software; you can redistribute it and/or modify it
865316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak * under the terms of the GNU General Public License as published by the
965316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak * Free Software Foundation; either version 2 of the License, or (at your
1065316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak * option) any later version.
1165316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak *
1265316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak * This program is distributed in the hope that it will be useful, but
1365316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak * WITHOUT ANY WARRANTY; without even the implied warranty of
1465316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
1565316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak * General Public License for more details.
1665316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak *
1765316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak * You should have received a copy of the GNU General Public License along
1865316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak * with this program; if not, write to the Free Software Foundation, Inc.,
1965316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak * 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
2065316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak */
2165316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak
2265316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak#include <linux/module.h>
2365316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak#include <linux/platform_device.h>
246d16bfb5e81d3925a7efb38b5cc3e0021b57d03aDavid Brownell#include <linux/i2c/tps65010.h>
2565316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak
261bc857f700fb14bbcb990a81b1255f39807ae59eRussell King#include <asm/gpio.h>
2791773a00f8235e4b697217867529f73e298298dfTomi Valkeinen#include "omapfb.h"
2865316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak
2965316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak#define MODULE_NAME	"omapfb-lcd_h3"
3065316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak
3165316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deakstatic int h3_panel_init(struct lcd_panel *panel, struct omapfb_device *fbdev)
3265316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak{
3365316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak	return 0;
3465316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak}
3565316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak
3665316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deakstatic void h3_panel_cleanup(struct lcd_panel *panel)
3765316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak{
3865316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak}
3965316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak
4065316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deakstatic int h3_panel_enable(struct lcd_panel *panel)
4165316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak{
4265316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak	int r = 0;
4365316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak
4465316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak	/* GPIO1 and GPIO2 of TPS65010 send LCD_ENBKL and LCD_ENVDD signals */
4565316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak	r = tps65010_set_gpio_out_value(GPIO1, HIGH);
4665316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak	if (!r)
4765316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak		r = tps65010_set_gpio_out_value(GPIO2, HIGH);
4865316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak	if (r)
491f7c8234c7a68c2ccc2a33f3b7d48057980e7c35Emil Medve		pr_err(MODULE_NAME ": Unable to turn on LCD panel\n");
5065316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak
5165316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak	return r;
5265316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak}
5365316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak
5465316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deakstatic void h3_panel_disable(struct lcd_panel *panel)
5565316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak{
5665316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak	int r = 0;
5765316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak
5865316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak	/* GPIO1 and GPIO2 of TPS65010 send LCD_ENBKL and LCD_ENVDD signals */
5965316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak	r = tps65010_set_gpio_out_value(GPIO1, LOW);
6065316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak	if (!r)
6165316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak		tps65010_set_gpio_out_value(GPIO2, LOW);
6265316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak	if (r)
631f7c8234c7a68c2ccc2a33f3b7d48057980e7c35Emil Medve		pr_err(MODULE_NAME ": Unable to turn off LCD panel\n");
6465316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak}
6565316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak
6665316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deakstatic unsigned long h3_panel_get_caps(struct lcd_panel *panel)
6765316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak{
6865316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak	return 0;
6965316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak}
7065316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak
7165316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deakstruct lcd_panel h3_panel = {
7265316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak	.name		= "h3",
7365316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak	.config		= OMAP_LCDC_PANEL_TFT,
7465316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak
7565316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak	.data_lines	= 16,
7665316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak	.bpp		= 16,
7765316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak	.x_res		= 240,
7865316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak	.y_res		= 320,
7965316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak	.pixel_clock	= 12000,
8065316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak	.hsw		= 12,
8165316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak	.hfp		= 14,
8265316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak	.hbp		= 72 - 12,
8365316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak	.vsw		= 1,
8465316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak	.vfp		= 1,
8565316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak	.vbp		= 0,
8665316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak	.pcd		= 0,
8765316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak
8865316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak	.init		= h3_panel_init,
8965316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak	.cleanup	= h3_panel_cleanup,
9065316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak	.enable		= h3_panel_enable,
9165316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak	.disable	= h3_panel_disable,
9265316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak	.get_caps	= h3_panel_get_caps,
9365316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak};
9465316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak
9565316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deakstatic int h3_panel_probe(struct platform_device *pdev)
9665316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak{
9765316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak	omapfb_register_panel(&h3_panel);
9865316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak	return 0;
9965316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak}
10065316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak
10165316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deakstatic int h3_panel_remove(struct platform_device *pdev)
10265316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak{
10365316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak	return 0;
10465316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak}
10565316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak
10665316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deakstatic int h3_panel_suspend(struct platform_device *pdev, pm_message_t mesg)
10765316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak{
10865316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak	return 0;
10965316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak}
11065316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak
11165316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deakstatic int h3_panel_resume(struct platform_device *pdev)
11265316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak{
11365316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak	return 0;
11465316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak}
11565316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak
116f990544125b7599e537dbb17c511e68f2dbdb910Axel Linstatic struct platform_driver h3_panel_driver = {
11765316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak	.probe		= h3_panel_probe,
11865316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak	.remove		= h3_panel_remove,
11965316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak	.suspend	= h3_panel_suspend,
12065316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak	.resume		= h3_panel_resume,
12165316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak	.driver		= {
12265316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak		.name	= "lcd_h3",
12365316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak		.owner	= THIS_MODULE,
12465316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak	},
12565316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak};
12665316c91eff2c9b8dd8e16cc83fb84f49a64813bImre Deak
127f806f9b6b8ec2c8b6a3297e684bcb80f54e3dc98Axel Linmodule_platform_driver(h3_panel_driver);
128