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