Linux Audio

Check our new training course

Loading...
v4.6
 
  1/*
  2 * Support for Compaq iPAQ H3600 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 h3600_lcd_gpio[] = {
 32	{ H3XXX_EGPIO_LCD_ON,	GPIOF_OUT_INIT_LOW,	"LCD power" },
 33	{ H3600_EGPIO_LCD_PCI,	GPIOF_OUT_INIT_LOW,	"LCD control" },
 34	{ H3600_EGPIO_LCD_5V_ON, GPIOF_OUT_INIT_LOW,	"LCD 5v" },
 35	{ H3600_EGPIO_LVDD_ON,	GPIOF_OUT_INIT_LOW,	"LCD 9v/-6.5v" },
 36};
 37
 38static bool h3600_lcd_request(void)
 39{
 40	static bool h3600_lcd_ok;
 41	int rc;
 42
 43	if (h3600_lcd_ok)
 44		return true;
 45
 46	rc = gpio_request_array(h3600_lcd_gpio, ARRAY_SIZE(h3600_lcd_gpio));
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 47	if (rc)
 48		pr_err("%s: can't request GPIOs\n", __func__);
 49	else
 50		h3600_lcd_ok = true;
 51
 52	return h3600_lcd_ok;
 53}
 54
 55static void h3600_lcd_power(int enable)
 56{
 57	if (!h3600_lcd_request())
 58		return;
 59
 60	gpio_direction_output(H3XXX_EGPIO_LCD_ON, enable);
 61	gpio_direction_output(H3600_EGPIO_LCD_PCI, enable);
 62	gpio_direction_output(H3600_EGPIO_LCD_5V_ON, enable);
 63	gpio_direction_output(H3600_EGPIO_LVDD_ON, enable);
 64}
 65
 66static const struct sa1100fb_rgb h3600_rgb_16 = {
 67	.red	= { .offset = 12, .length = 4, },
 68	.green	= { .offset = 7,  .length = 4, },
 69	.blue	= { .offset = 1,  .length = 4, },
 70	.transp	= { .offset = 0,  .length = 0, },
 71};
 72
 73static struct sa1100fb_mach_info h3600_lcd_info = {
 74	.pixclock	= 174757, 	.bpp		= 16,
 75	.xres		= 320,		.yres		= 240,
 76
 77	.hsync_len	= 3,		.vsync_len	= 3,
 78	.left_margin	= 12,		.upper_margin	= 10,
 79	.right_margin	= 17,		.lower_margin	= 1,
 80
 81	.cmap_static	= 1,
 82
 83	.lccr0		= LCCR0_Color | LCCR0_Sngl | LCCR0_Act,
 84	.lccr3		= LCCR3_OutEnH | LCCR3_PixRsEdg | LCCR3_ACBsDiv(2),
 85
 86	.rgb[RGB_16] = &h3600_rgb_16,
 87
 88	.lcd_power = h3600_lcd_power,
 89};
 90
 91
 92static void __init h3600_map_io(void)
 93{
 94	h3xxx_map_io();
 95}
 96
 97/*
 98 * This turns the IRDA power on or off on the Compaq H3600
 99 */
100static struct gpio h3600_irda_gpio[] = {
101	{ H3600_EGPIO_IR_ON,	GPIOF_OUT_INIT_LOW, "IrDA power" },
102	{ H3600_EGPIO_IR_FSEL,	GPIOF_OUT_INIT_LOW, "IrDA fsel" },
103};
104
105static int h3600_irda_set_power(struct device *dev, unsigned int state)
106{
107	gpio_set_value(H3600_EGPIO_IR_ON, state);
108	return 0;
109}
110
111static void h3600_irda_set_speed(struct device *dev, unsigned int speed)
112{
113	gpio_set_value(H3600_EGPIO_IR_FSEL, !(speed < 4000000));
114}
115
116static int h3600_irda_startup(struct device *dev)
117{
118	return gpio_request_array(h3600_irda_gpio, sizeof(h3600_irda_gpio));
119}
120
121static void h3600_irda_shutdown(struct device *dev)
122{
123	return gpio_free_array(h3600_irda_gpio, sizeof(h3600_irda_gpio));
124}
125
126static struct irda_platform_data h3600_irda_data = {
127	.set_power	= h3600_irda_set_power,
128	.set_speed	= h3600_irda_set_speed,
129	.startup	= h3600_irda_startup,
130	.shutdown	= h3600_irda_shutdown,
131};
132
133static void __init h3600_mach_init(void)
134{
135	h3xxx_mach_init();
136
137	sa11x0_register_lcd(&h3600_lcd_info);
138	sa11x0_register_irda(&h3600_irda_data);
139}
140
141MACHINE_START(H3600, "Compaq iPAQ H3600")
142	.atag_offset	= 0x100,
143	.map_io		= h3600_map_io,
144	.nr_irqs	= SA1100_NR_IRQS,
145	.init_irq	= sa1100_init_irq,
146	.init_time	= sa1100_timer_init,
147	.init_machine	= h3600_mach_init,
148	.init_late	= sa11x0_init_late,
149	.restart	= sa11x0_restart,
150MACHINE_END
151
v6.13.7
  1// SPDX-License-Identifier: GPL-2.0-only
  2/*
  3 * Support for Compaq iPAQ H3600 handheld computer
  4 *
  5 * Copyright (c) 2000,1 Compaq Computer Corporation. (Author: Jamey Hicks)
  6 * Copyright (c) 2009 Dmitry Artamonow <mad_soft@inbox.ru>
 
 
 
 
 
  7 */
  8
  9#include <linux/init.h>
 10#include <linux/kernel.h>
 11#include <linux/gpio.h>
 12
 13#include <video/sa1100fb.h>
 14
 15#include <asm/mach-types.h>
 16#include <asm/mach/arch.h>
 
 17
 18#include <mach/h3xxx.h>
 19#include <mach/irqs.h>
 20
 21#include "generic.h"
 22
 
 
 
 
 
 
 
 
 
 
 23static bool h3600_lcd_request(void)
 24{
 25	static bool h3600_lcd_ok;
 26	int rc;
 27
 28	if (h3600_lcd_ok)
 29		return true;
 30
 31	rc = gpio_request(H3XXX_EGPIO_LCD_ON, "LCD power");
 32	if (rc)
 33		goto out;
 34	rc = gpio_direction_output(H3XXX_EGPIO_LCD_ON, 0);
 35	if (rc)
 36		goto out_free_on;
 37	rc = gpio_request(H3600_EGPIO_LCD_PCI, "LCD control");
 38	if (rc)
 39		goto out_free_on;
 40	rc = gpio_direction_output(H3600_EGPIO_LCD_PCI, 0);
 41	if (rc)
 42		goto out_free_pci;
 43	rc = gpio_request(H3600_EGPIO_LCD_5V_ON, "LCD 5v");
 44	if (rc)
 45		goto out_free_pci;
 46	rc = gpio_direction_output(H3600_EGPIO_LCD_5V_ON, 0);
 47	if (rc)
 48		goto out_free_5v_on;
 49	rc = gpio_request(H3600_EGPIO_LVDD_ON, "LCD 9v/-6.5v");
 50	if (rc)
 51		goto out_free_5v_on;
 52	rc = gpio_direction_output(H3600_EGPIO_LVDD_ON, 0);
 53	if (rc)
 54		goto out_free_lvdd_on;
 55
 56	goto out;
 57
 58out_free_lvdd_on:
 59	gpio_free(H3600_EGPIO_LVDD_ON);
 60out_free_5v_on:
 61	gpio_free(H3600_EGPIO_LCD_5V_ON);
 62out_free_pci:
 63	gpio_free(H3600_EGPIO_LCD_PCI);
 64out_free_on:
 65	gpio_free(H3XXX_EGPIO_LCD_ON);
 66out:
 67	if (rc)
 68		pr_err("%s: can't request GPIOs\n", __func__);
 69	else
 70		h3600_lcd_ok = true;
 71
 72	return h3600_lcd_ok;
 73}
 74
 75static void h3600_lcd_power(int enable)
 76{
 77	if (!h3600_lcd_request())
 78		return;
 79
 80	gpio_direction_output(H3XXX_EGPIO_LCD_ON, enable);
 81	gpio_direction_output(H3600_EGPIO_LCD_PCI, enable);
 82	gpio_direction_output(H3600_EGPIO_LCD_5V_ON, enable);
 83	gpio_direction_output(H3600_EGPIO_LVDD_ON, enable);
 84}
 85
 86static const struct sa1100fb_rgb h3600_rgb_16 = {
 87	.red	= { .offset = 12, .length = 4, },
 88	.green	= { .offset = 7,  .length = 4, },
 89	.blue	= { .offset = 1,  .length = 4, },
 90	.transp	= { .offset = 0,  .length = 0, },
 91};
 92
 93static struct sa1100fb_mach_info h3600_lcd_info = {
 94	.pixclock	= 174757, 	.bpp		= 16,
 95	.xres		= 320,		.yres		= 240,
 96
 97	.hsync_len	= 3,		.vsync_len	= 3,
 98	.left_margin	= 12,		.upper_margin	= 10,
 99	.right_margin	= 17,		.lower_margin	= 1,
100
101	.cmap_static	= 1,
102
103	.lccr0		= LCCR0_Color | LCCR0_Sngl | LCCR0_Act,
104	.lccr3		= LCCR3_OutEnH | LCCR3_PixRsEdg | LCCR3_ACBsDiv(2),
105
106	.rgb[RGB_16] = &h3600_rgb_16,
107
108	.lcd_power = h3600_lcd_power,
109};
110
111
112static void __init h3600_map_io(void)
113{
114	h3xxx_map_io();
115}
116
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
117static void __init h3600_mach_init(void)
118{
119	h3xxx_mach_init();
120
121	sa11x0_register_lcd(&h3600_lcd_info);
 
122}
123
124MACHINE_START(H3600, "Compaq iPAQ H3600")
125	.atag_offset	= 0x100,
126	.map_io		= h3600_map_io,
127	.nr_irqs	= SA1100_NR_IRQS,
128	.init_irq	= sa1100_init_irq,
129	.init_time	= sa1100_timer_init,
130	.init_machine	= h3600_mach_init,
131	.init_late	= sa11x0_init_late,
132	.restart	= sa11x0_restart,
133MACHINE_END
134