18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Support for Compaq iPAQ H3600 handheld computer 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Copyright (c) 2000,1 Compaq Computer Corporation. (Author: Jamey Hicks) 68c2ecf20Sopenharmony_ci * Copyright (c) 2009 Dmitry Artamonow <mad_soft@inbox.ru> 78c2ecf20Sopenharmony_ci */ 88c2ecf20Sopenharmony_ci 98c2ecf20Sopenharmony_ci#include <linux/init.h> 108c2ecf20Sopenharmony_ci#include <linux/kernel.h> 118c2ecf20Sopenharmony_ci#include <linux/gpio.h> 128c2ecf20Sopenharmony_ci 138c2ecf20Sopenharmony_ci#include <video/sa1100fb.h> 148c2ecf20Sopenharmony_ci 158c2ecf20Sopenharmony_ci#include <asm/mach-types.h> 168c2ecf20Sopenharmony_ci#include <asm/mach/arch.h> 178c2ecf20Sopenharmony_ci#include <linux/platform_data/irda-sa11x0.h> 188c2ecf20Sopenharmony_ci 198c2ecf20Sopenharmony_ci#include <mach/h3xxx.h> 208c2ecf20Sopenharmony_ci#include <mach/irqs.h> 218c2ecf20Sopenharmony_ci 228c2ecf20Sopenharmony_ci#include "generic.h" 238c2ecf20Sopenharmony_ci 248c2ecf20Sopenharmony_ci/* 258c2ecf20Sopenharmony_ci * helper for sa1100fb 268c2ecf20Sopenharmony_ci */ 278c2ecf20Sopenharmony_cistatic struct gpio h3600_lcd_gpio[] = { 288c2ecf20Sopenharmony_ci { H3XXX_EGPIO_LCD_ON, GPIOF_OUT_INIT_LOW, "LCD power" }, 298c2ecf20Sopenharmony_ci { H3600_EGPIO_LCD_PCI, GPIOF_OUT_INIT_LOW, "LCD control" }, 308c2ecf20Sopenharmony_ci { H3600_EGPIO_LCD_5V_ON, GPIOF_OUT_INIT_LOW, "LCD 5v" }, 318c2ecf20Sopenharmony_ci { H3600_EGPIO_LVDD_ON, GPIOF_OUT_INIT_LOW, "LCD 9v/-6.5v" }, 328c2ecf20Sopenharmony_ci}; 338c2ecf20Sopenharmony_ci 348c2ecf20Sopenharmony_cistatic bool h3600_lcd_request(void) 358c2ecf20Sopenharmony_ci{ 368c2ecf20Sopenharmony_ci static bool h3600_lcd_ok; 378c2ecf20Sopenharmony_ci int rc; 388c2ecf20Sopenharmony_ci 398c2ecf20Sopenharmony_ci if (h3600_lcd_ok) 408c2ecf20Sopenharmony_ci return true; 418c2ecf20Sopenharmony_ci 428c2ecf20Sopenharmony_ci rc = gpio_request_array(h3600_lcd_gpio, ARRAY_SIZE(h3600_lcd_gpio)); 438c2ecf20Sopenharmony_ci if (rc) 448c2ecf20Sopenharmony_ci pr_err("%s: can't request GPIOs\n", __func__); 458c2ecf20Sopenharmony_ci else 468c2ecf20Sopenharmony_ci h3600_lcd_ok = true; 478c2ecf20Sopenharmony_ci 488c2ecf20Sopenharmony_ci return h3600_lcd_ok; 498c2ecf20Sopenharmony_ci} 508c2ecf20Sopenharmony_ci 518c2ecf20Sopenharmony_cistatic void h3600_lcd_power(int enable) 528c2ecf20Sopenharmony_ci{ 538c2ecf20Sopenharmony_ci if (!h3600_lcd_request()) 548c2ecf20Sopenharmony_ci return; 558c2ecf20Sopenharmony_ci 568c2ecf20Sopenharmony_ci gpio_direction_output(H3XXX_EGPIO_LCD_ON, enable); 578c2ecf20Sopenharmony_ci gpio_direction_output(H3600_EGPIO_LCD_PCI, enable); 588c2ecf20Sopenharmony_ci gpio_direction_output(H3600_EGPIO_LCD_5V_ON, enable); 598c2ecf20Sopenharmony_ci gpio_direction_output(H3600_EGPIO_LVDD_ON, enable); 608c2ecf20Sopenharmony_ci} 618c2ecf20Sopenharmony_ci 628c2ecf20Sopenharmony_cistatic const struct sa1100fb_rgb h3600_rgb_16 = { 638c2ecf20Sopenharmony_ci .red = { .offset = 12, .length = 4, }, 648c2ecf20Sopenharmony_ci .green = { .offset = 7, .length = 4, }, 658c2ecf20Sopenharmony_ci .blue = { .offset = 1, .length = 4, }, 668c2ecf20Sopenharmony_ci .transp = { .offset = 0, .length = 0, }, 678c2ecf20Sopenharmony_ci}; 688c2ecf20Sopenharmony_ci 698c2ecf20Sopenharmony_cistatic struct sa1100fb_mach_info h3600_lcd_info = { 708c2ecf20Sopenharmony_ci .pixclock = 174757, .bpp = 16, 718c2ecf20Sopenharmony_ci .xres = 320, .yres = 240, 728c2ecf20Sopenharmony_ci 738c2ecf20Sopenharmony_ci .hsync_len = 3, .vsync_len = 3, 748c2ecf20Sopenharmony_ci .left_margin = 12, .upper_margin = 10, 758c2ecf20Sopenharmony_ci .right_margin = 17, .lower_margin = 1, 768c2ecf20Sopenharmony_ci 778c2ecf20Sopenharmony_ci .cmap_static = 1, 788c2ecf20Sopenharmony_ci 798c2ecf20Sopenharmony_ci .lccr0 = LCCR0_Color | LCCR0_Sngl | LCCR0_Act, 808c2ecf20Sopenharmony_ci .lccr3 = LCCR3_OutEnH | LCCR3_PixRsEdg | LCCR3_ACBsDiv(2), 818c2ecf20Sopenharmony_ci 828c2ecf20Sopenharmony_ci .rgb[RGB_16] = &h3600_rgb_16, 838c2ecf20Sopenharmony_ci 848c2ecf20Sopenharmony_ci .lcd_power = h3600_lcd_power, 858c2ecf20Sopenharmony_ci}; 868c2ecf20Sopenharmony_ci 878c2ecf20Sopenharmony_ci 888c2ecf20Sopenharmony_cistatic void __init h3600_map_io(void) 898c2ecf20Sopenharmony_ci{ 908c2ecf20Sopenharmony_ci h3xxx_map_io(); 918c2ecf20Sopenharmony_ci} 928c2ecf20Sopenharmony_ci 938c2ecf20Sopenharmony_ci/* 948c2ecf20Sopenharmony_ci * This turns the IRDA power on or off on the Compaq H3600 958c2ecf20Sopenharmony_ci */ 968c2ecf20Sopenharmony_cistatic struct gpio h3600_irda_gpio[] = { 978c2ecf20Sopenharmony_ci { H3600_EGPIO_IR_ON, GPIOF_OUT_INIT_LOW, "IrDA power" }, 988c2ecf20Sopenharmony_ci { H3600_EGPIO_IR_FSEL, GPIOF_OUT_INIT_LOW, "IrDA fsel" }, 998c2ecf20Sopenharmony_ci}; 1008c2ecf20Sopenharmony_ci 1018c2ecf20Sopenharmony_cistatic int h3600_irda_set_power(struct device *dev, unsigned int state) 1028c2ecf20Sopenharmony_ci{ 1038c2ecf20Sopenharmony_ci gpio_set_value(H3600_EGPIO_IR_ON, state); 1048c2ecf20Sopenharmony_ci return 0; 1058c2ecf20Sopenharmony_ci} 1068c2ecf20Sopenharmony_ci 1078c2ecf20Sopenharmony_cistatic void h3600_irda_set_speed(struct device *dev, unsigned int speed) 1088c2ecf20Sopenharmony_ci{ 1098c2ecf20Sopenharmony_ci gpio_set_value(H3600_EGPIO_IR_FSEL, !(speed < 4000000)); 1108c2ecf20Sopenharmony_ci} 1118c2ecf20Sopenharmony_ci 1128c2ecf20Sopenharmony_cistatic int h3600_irda_startup(struct device *dev) 1138c2ecf20Sopenharmony_ci{ 1148c2ecf20Sopenharmony_ci return gpio_request_array(h3600_irda_gpio, sizeof(h3600_irda_gpio)); 1158c2ecf20Sopenharmony_ci} 1168c2ecf20Sopenharmony_ci 1178c2ecf20Sopenharmony_cistatic void h3600_irda_shutdown(struct device *dev) 1188c2ecf20Sopenharmony_ci{ 1198c2ecf20Sopenharmony_ci return gpio_free_array(h3600_irda_gpio, sizeof(h3600_irda_gpio)); 1208c2ecf20Sopenharmony_ci} 1218c2ecf20Sopenharmony_ci 1228c2ecf20Sopenharmony_cistatic struct irda_platform_data h3600_irda_data = { 1238c2ecf20Sopenharmony_ci .set_power = h3600_irda_set_power, 1248c2ecf20Sopenharmony_ci .set_speed = h3600_irda_set_speed, 1258c2ecf20Sopenharmony_ci .startup = h3600_irda_startup, 1268c2ecf20Sopenharmony_ci .shutdown = h3600_irda_shutdown, 1278c2ecf20Sopenharmony_ci}; 1288c2ecf20Sopenharmony_ci 1298c2ecf20Sopenharmony_cistatic void __init h3600_mach_init(void) 1308c2ecf20Sopenharmony_ci{ 1318c2ecf20Sopenharmony_ci h3xxx_mach_init(); 1328c2ecf20Sopenharmony_ci 1338c2ecf20Sopenharmony_ci sa11x0_register_lcd(&h3600_lcd_info); 1348c2ecf20Sopenharmony_ci sa11x0_register_irda(&h3600_irda_data); 1358c2ecf20Sopenharmony_ci} 1368c2ecf20Sopenharmony_ci 1378c2ecf20Sopenharmony_ciMACHINE_START(H3600, "Compaq iPAQ H3600") 1388c2ecf20Sopenharmony_ci .atag_offset = 0x100, 1398c2ecf20Sopenharmony_ci .map_io = h3600_map_io, 1408c2ecf20Sopenharmony_ci .nr_irqs = SA1100_NR_IRQS, 1418c2ecf20Sopenharmony_ci .init_irq = sa1100_init_irq, 1428c2ecf20Sopenharmony_ci .init_time = sa1100_timer_init, 1438c2ecf20Sopenharmony_ci .init_machine = h3600_mach_init, 1448c2ecf20Sopenharmony_ci .init_late = sa11x0_init_late, 1458c2ecf20Sopenharmony_ci .restart = sa11x0_restart, 1468c2ecf20Sopenharmony_ciMACHINE_END 1478c2ecf20Sopenharmony_ci 148