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