1/* 2 * Support for Compaq iPAQ H3100 handheld computer 3 * 4 * Copyright (c) 2000,1 Compaq Computer Corporation. (Author: Jamey Hicks) 5 * Copyright (c) 2009 Dmitry Artamonow <mad_soft@inbox.ru> 6 * 7 * This program is free software; you can redistribute it and/or modify 8 * it under the terms of the GNU General Public License version 2 as 9 * published by the Free Software Foundation. 10 * 11 */ 12 13#include <linux/init.h> 14#include <linux/kernel.h> 15#include <linux/gpio.h> 16 17#include <video/sa1100fb.h> 18 19#include <asm/mach-types.h> 20#include <asm/mach/arch.h> 21#include <linux/platform_data/irda-sa11x0.h> 22 23#include <mach/h3xxx.h> 24#include <mach/irqs.h> 25 26#include "generic.h" 27 28/* 29 * helper for sa1100fb 30 */ 31static struct gpio h3100_lcd_gpio[] = { 32 { H3100_GPIO_LCD_3V_ON, GPIOF_OUT_INIT_LOW, "LCD 3V" }, 33 { H3XXX_EGPIO_LCD_ON, GPIOF_OUT_INIT_LOW, "LCD ON" }, 34}; 35 36static bool h3100_lcd_request(void) 37{ 38 static bool h3100_lcd_ok; 39 int rc; 40 41 if (h3100_lcd_ok) 42 return true; 43 44 rc = gpio_request_array(h3100_lcd_gpio, ARRAY_SIZE(h3100_lcd_gpio)); 45 if (rc) 46 pr_err("%s: can't request GPIOs\n", __func__); 47 else 48 h3100_lcd_ok = true; 49 50 return h3100_lcd_ok; 51} 52 53static void h3100_lcd_power(int enable) 54{ 55 if (!h3100_lcd_request()) 56 return; 57 58 gpio_set_value(H3100_GPIO_LCD_3V_ON, enable); 59 gpio_set_value(H3XXX_EGPIO_LCD_ON, enable); 60} 61 62static struct sa1100fb_mach_info h3100_lcd_info = { 63 .pixclock = 406977, .bpp = 4, 64 .xres = 320, .yres = 240, 65 66 .hsync_len = 26, .vsync_len = 41, 67 .left_margin = 4, .upper_margin = 0, 68 .right_margin = 4, .lower_margin = 0, 69 70 .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 71 .cmap_greyscale = 1, 72 .cmap_inverse = 1, 73 74 .lccr0 = LCCR0_Mono | LCCR0_4PixMono | LCCR0_Sngl | LCCR0_Pas, 75 .lccr3 = LCCR3_OutEnH | LCCR3_PixRsEdg | LCCR3_ACBsDiv(2), 76 77 .lcd_power = h3100_lcd_power, 78}; 79 80static void __init h3100_map_io(void) 81{ 82 h3xxx_map_io(); 83 84 /* Older bootldrs put GPIO2-9 in alternate mode on the 85 assumption that they are used for video */ 86 GAFR &= ~0x000001fb; 87} 88 89/* 90 * This turns the IRDA power on or off on the Compaq H3100 91 */ 92static struct gpio h3100_irda_gpio[] = { 93 { H3100_GPIO_IR_ON, GPIOF_OUT_INIT_LOW, "IrDA power" }, 94 { H3100_GPIO_IR_FSEL, GPIOF_OUT_INIT_LOW, "IrDA fsel" }, 95}; 96 97static int h3100_irda_set_power(struct device *dev, unsigned int state) 98{ 99 gpio_set_value(H3100_GPIO_IR_ON, state); 100 return 0; 101} 102 103static void h3100_irda_set_speed(struct device *dev, unsigned int speed) 104{ 105 gpio_set_value(H3100_GPIO_IR_FSEL, !(speed < 4000000)); 106} 107 108static int h3100_irda_startup(struct device *dev) 109{ 110 return gpio_request_array(h3100_irda_gpio, sizeof(h3100_irda_gpio)); 111} 112 113static void h3100_irda_shutdown(struct device *dev) 114{ 115 return gpio_free_array(h3100_irda_gpio, sizeof(h3100_irda_gpio)); 116} 117 118static struct irda_platform_data h3100_irda_data = { 119 .set_power = h3100_irda_set_power, 120 .set_speed = h3100_irda_set_speed, 121 .startup = h3100_irda_startup, 122 .shutdown = h3100_irda_shutdown, 123}; 124 125static void __init h3100_mach_init(void) 126{ 127 h3xxx_mach_init(); 128 129 sa11x0_register_lcd(&h3100_lcd_info); 130 sa11x0_register_irda(&h3100_irda_data); 131} 132 133MACHINE_START(H3100, "Compaq iPAQ H3100") 134 .atag_offset = 0x100, 135 .map_io = h3100_map_io, 136 .nr_irqs = SA1100_NR_IRQS, 137 .init_irq = sa1100_init_irq, 138 .init_time = sa1100_timer_init, 139 .init_machine = h3100_mach_init, 140 .init_late = sa11x0_init_late, 141 .restart = sa11x0_restart, 142MACHINE_END 143 144