18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Support for Compaq iPAQ H3100 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 h3100_lcd_gpio[] = { 288c2ecf20Sopenharmony_ci { H3100_GPIO_LCD_3V_ON, GPIOF_OUT_INIT_LOW, "LCD 3V" }, 298c2ecf20Sopenharmony_ci { H3XXX_EGPIO_LCD_ON, GPIOF_OUT_INIT_LOW, "LCD ON" }, 308c2ecf20Sopenharmony_ci}; 318c2ecf20Sopenharmony_ci 328c2ecf20Sopenharmony_cistatic bool h3100_lcd_request(void) 338c2ecf20Sopenharmony_ci{ 348c2ecf20Sopenharmony_ci static bool h3100_lcd_ok; 358c2ecf20Sopenharmony_ci int rc; 368c2ecf20Sopenharmony_ci 378c2ecf20Sopenharmony_ci if (h3100_lcd_ok) 388c2ecf20Sopenharmony_ci return true; 398c2ecf20Sopenharmony_ci 408c2ecf20Sopenharmony_ci rc = gpio_request_array(h3100_lcd_gpio, ARRAY_SIZE(h3100_lcd_gpio)); 418c2ecf20Sopenharmony_ci if (rc) 428c2ecf20Sopenharmony_ci pr_err("%s: can't request GPIOs\n", __func__); 438c2ecf20Sopenharmony_ci else 448c2ecf20Sopenharmony_ci h3100_lcd_ok = true; 458c2ecf20Sopenharmony_ci 468c2ecf20Sopenharmony_ci return h3100_lcd_ok; 478c2ecf20Sopenharmony_ci} 488c2ecf20Sopenharmony_ci 498c2ecf20Sopenharmony_cistatic void h3100_lcd_power(int enable) 508c2ecf20Sopenharmony_ci{ 518c2ecf20Sopenharmony_ci if (!h3100_lcd_request()) 528c2ecf20Sopenharmony_ci return; 538c2ecf20Sopenharmony_ci 548c2ecf20Sopenharmony_ci gpio_set_value(H3100_GPIO_LCD_3V_ON, enable); 558c2ecf20Sopenharmony_ci gpio_set_value(H3XXX_EGPIO_LCD_ON, enable); 568c2ecf20Sopenharmony_ci} 578c2ecf20Sopenharmony_ci 588c2ecf20Sopenharmony_cistatic struct sa1100fb_mach_info h3100_lcd_info = { 598c2ecf20Sopenharmony_ci .pixclock = 406977, .bpp = 4, 608c2ecf20Sopenharmony_ci .xres = 320, .yres = 240, 618c2ecf20Sopenharmony_ci 628c2ecf20Sopenharmony_ci .hsync_len = 26, .vsync_len = 41, 638c2ecf20Sopenharmony_ci .left_margin = 4, .upper_margin = 0, 648c2ecf20Sopenharmony_ci .right_margin = 4, .lower_margin = 0, 658c2ecf20Sopenharmony_ci 668c2ecf20Sopenharmony_ci .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 678c2ecf20Sopenharmony_ci .cmap_greyscale = 1, 688c2ecf20Sopenharmony_ci .cmap_inverse = 1, 698c2ecf20Sopenharmony_ci 708c2ecf20Sopenharmony_ci .lccr0 = LCCR0_Mono | LCCR0_4PixMono | LCCR0_Sngl | LCCR0_Pas, 718c2ecf20Sopenharmony_ci .lccr3 = LCCR3_OutEnH | LCCR3_PixRsEdg | LCCR3_ACBsDiv(2), 728c2ecf20Sopenharmony_ci 738c2ecf20Sopenharmony_ci .lcd_power = h3100_lcd_power, 748c2ecf20Sopenharmony_ci}; 758c2ecf20Sopenharmony_ci 768c2ecf20Sopenharmony_cistatic void __init h3100_map_io(void) 778c2ecf20Sopenharmony_ci{ 788c2ecf20Sopenharmony_ci h3xxx_map_io(); 798c2ecf20Sopenharmony_ci 808c2ecf20Sopenharmony_ci /* Older bootldrs put GPIO2-9 in alternate mode on the 818c2ecf20Sopenharmony_ci assumption that they are used for video */ 828c2ecf20Sopenharmony_ci GAFR &= ~0x000001fb; 838c2ecf20Sopenharmony_ci} 848c2ecf20Sopenharmony_ci 858c2ecf20Sopenharmony_ci/* 868c2ecf20Sopenharmony_ci * This turns the IRDA power on or off on the Compaq H3100 878c2ecf20Sopenharmony_ci */ 888c2ecf20Sopenharmony_cistatic struct gpio h3100_irda_gpio[] = { 898c2ecf20Sopenharmony_ci { H3100_GPIO_IR_ON, GPIOF_OUT_INIT_LOW, "IrDA power" }, 908c2ecf20Sopenharmony_ci { H3100_GPIO_IR_FSEL, GPIOF_OUT_INIT_LOW, "IrDA fsel" }, 918c2ecf20Sopenharmony_ci}; 928c2ecf20Sopenharmony_ci 938c2ecf20Sopenharmony_cistatic int h3100_irda_set_power(struct device *dev, unsigned int state) 948c2ecf20Sopenharmony_ci{ 958c2ecf20Sopenharmony_ci gpio_set_value(H3100_GPIO_IR_ON, state); 968c2ecf20Sopenharmony_ci return 0; 978c2ecf20Sopenharmony_ci} 988c2ecf20Sopenharmony_ci 998c2ecf20Sopenharmony_cistatic void h3100_irda_set_speed(struct device *dev, unsigned int speed) 1008c2ecf20Sopenharmony_ci{ 1018c2ecf20Sopenharmony_ci gpio_set_value(H3100_GPIO_IR_FSEL, !(speed < 4000000)); 1028c2ecf20Sopenharmony_ci} 1038c2ecf20Sopenharmony_ci 1048c2ecf20Sopenharmony_cistatic int h3100_irda_startup(struct device *dev) 1058c2ecf20Sopenharmony_ci{ 1068c2ecf20Sopenharmony_ci return gpio_request_array(h3100_irda_gpio, sizeof(h3100_irda_gpio)); 1078c2ecf20Sopenharmony_ci} 1088c2ecf20Sopenharmony_ci 1098c2ecf20Sopenharmony_cistatic void h3100_irda_shutdown(struct device *dev) 1108c2ecf20Sopenharmony_ci{ 1118c2ecf20Sopenharmony_ci return gpio_free_array(h3100_irda_gpio, sizeof(h3100_irda_gpio)); 1128c2ecf20Sopenharmony_ci} 1138c2ecf20Sopenharmony_ci 1148c2ecf20Sopenharmony_cistatic struct irda_platform_data h3100_irda_data = { 1158c2ecf20Sopenharmony_ci .set_power = h3100_irda_set_power, 1168c2ecf20Sopenharmony_ci .set_speed = h3100_irda_set_speed, 1178c2ecf20Sopenharmony_ci .startup = h3100_irda_startup, 1188c2ecf20Sopenharmony_ci .shutdown = h3100_irda_shutdown, 1198c2ecf20Sopenharmony_ci}; 1208c2ecf20Sopenharmony_ci 1218c2ecf20Sopenharmony_cistatic void __init h3100_mach_init(void) 1228c2ecf20Sopenharmony_ci{ 1238c2ecf20Sopenharmony_ci h3xxx_mach_init(); 1248c2ecf20Sopenharmony_ci 1258c2ecf20Sopenharmony_ci sa11x0_register_pcmcia(-1, NULL); 1268c2ecf20Sopenharmony_ci sa11x0_register_lcd(&h3100_lcd_info); 1278c2ecf20Sopenharmony_ci sa11x0_register_irda(&h3100_irda_data); 1288c2ecf20Sopenharmony_ci} 1298c2ecf20Sopenharmony_ci 1308c2ecf20Sopenharmony_ciMACHINE_START(H3100, "Compaq iPAQ H3100") 1318c2ecf20Sopenharmony_ci .atag_offset = 0x100, 1328c2ecf20Sopenharmony_ci .map_io = h3100_map_io, 1338c2ecf20Sopenharmony_ci .nr_irqs = SA1100_NR_IRQS, 1348c2ecf20Sopenharmony_ci .init_irq = sa1100_init_irq, 1358c2ecf20Sopenharmony_ci .init_time = sa1100_timer_init, 1368c2ecf20Sopenharmony_ci .init_machine = h3100_mach_init, 1378c2ecf20Sopenharmony_ci .init_late = sa11x0_init_late, 1388c2ecf20Sopenharmony_ci .restart = sa11x0_restart, 1398c2ecf20Sopenharmony_ciMACHINE_END 1408c2ecf20Sopenharmony_ci 141