1da2014a2SPaul Mundt /* 2da2014a2SPaul Mundt * linux/arch/sh/boards/hp6xx/setup.c 3da2014a2SPaul Mundt * 4da2014a2SPaul Mundt * Copyright (C) 2002 Andriy Skulysh 5da2014a2SPaul Mundt * Copyright (C) 2007 Kristoffer Ericson <Kristoffer_e1@hotmail.com> 6da2014a2SPaul Mundt * 7da2014a2SPaul Mundt * May be copied or modified under the terms of the GNU General Public 8da2014a2SPaul Mundt * License. See linux/COPYING for more information. 9da2014a2SPaul Mundt * 10da2014a2SPaul Mundt * Setup code for HP620/HP660/HP680/HP690 (internal peripherials only) 11da2014a2SPaul Mundt */ 12da2014a2SPaul Mundt #include <linux/types.h> 13da2014a2SPaul Mundt #include <linux/init.h> 14da2014a2SPaul Mundt #include <linux/platform_device.h> 15604437f0SPaul Mundt #include <linux/irq.h> 16da2014a2SPaul Mundt #include <asm/hd64461.h> 17da2014a2SPaul Mundt #include <asm/io.h> 187639a454SPaul Mundt #include <mach/hp6xx.h> 19da2014a2SPaul Mundt #include <cpu/dac.h> 20da2014a2SPaul Mundt 21da2014a2SPaul Mundt #define SCPCR 0xa4000116 22da2014a2SPaul Mundt #define SCPDR 0xa4000136 23da2014a2SPaul Mundt 24da2014a2SPaul Mundt /* CF Slot */ 25da2014a2SPaul Mundt static struct resource cf_ide_resources[] = { 26da2014a2SPaul Mundt [0] = { 27da2014a2SPaul Mundt .start = 0x15000000 + 0x1f0, 28da2014a2SPaul Mundt .end = 0x15000000 + 0x1f0 + 0x08 - 0x01, 29da2014a2SPaul Mundt .flags = IORESOURCE_MEM, 30da2014a2SPaul Mundt }, 31da2014a2SPaul Mundt [1] = { 32da2014a2SPaul Mundt .start = 0x15000000 + 0x1fe, 33da2014a2SPaul Mundt .end = 0x15000000 + 0x1fe + 0x01, 34da2014a2SPaul Mundt .flags = IORESOURCE_MEM, 35da2014a2SPaul Mundt }, 36da2014a2SPaul Mundt [2] = { 37da2014a2SPaul Mundt .start = 77, 38da2014a2SPaul Mundt .flags = IORESOURCE_IRQ, 39da2014a2SPaul Mundt }, 40da2014a2SPaul Mundt }; 41da2014a2SPaul Mundt 42da2014a2SPaul Mundt static struct platform_device cf_ide_device = { 43da2014a2SPaul Mundt .name = "pata_platform", 44da2014a2SPaul Mundt .id = -1, 45da2014a2SPaul Mundt .num_resources = ARRAY_SIZE(cf_ide_resources), 46da2014a2SPaul Mundt .resource = cf_ide_resources, 47da2014a2SPaul Mundt }; 48da2014a2SPaul Mundt 49da2014a2SPaul Mundt static struct platform_device jornadakbd_device = { 50da2014a2SPaul Mundt .name = "jornada680_kbd", 51da2014a2SPaul Mundt .id = -1, 52da2014a2SPaul Mundt }; 53da2014a2SPaul Mundt 54da2014a2SPaul Mundt static struct platform_device *hp6xx_devices[] __initdata = { 55da2014a2SPaul Mundt &cf_ide_device, 56da2014a2SPaul Mundt &jornadakbd_device, 57da2014a2SPaul Mundt }; 58da2014a2SPaul Mundt 59da2014a2SPaul Mundt static void __init hp6xx_init_irq(void) 60da2014a2SPaul Mundt { 61da2014a2SPaul Mundt /* Gets touchscreen and powerbutton IRQ working */ 62da2014a2SPaul Mundt plat_irq_setup_pins(IRQ_MODE_IRQ); 63da2014a2SPaul Mundt } 64da2014a2SPaul Mundt 65da2014a2SPaul Mundt static int __init hp6xx_devices_setup(void) 66da2014a2SPaul Mundt { 67da2014a2SPaul Mundt return platform_add_devices(hp6xx_devices, ARRAY_SIZE(hp6xx_devices)); 68da2014a2SPaul Mundt } 69da2014a2SPaul Mundt 70da2014a2SPaul Mundt static void __init hp6xx_setup(char **cmdline_p) 71da2014a2SPaul Mundt { 72da2014a2SPaul Mundt u8 v8; 73da2014a2SPaul Mundt u16 v; 74da2014a2SPaul Mundt 75da2014a2SPaul Mundt v = inw(HD64461_STBCR); 76da2014a2SPaul Mundt v |= HD64461_STBCR_SURTST | HD64461_STBCR_SIRST | 77da2014a2SPaul Mundt HD64461_STBCR_STM1ST | HD64461_STBCR_STM0ST | 78da2014a2SPaul Mundt HD64461_STBCR_SAFEST | HD64461_STBCR_SPC0ST | 79da2014a2SPaul Mundt HD64461_STBCR_SMIAST | HD64461_STBCR_SAFECKE_OST| 80da2014a2SPaul Mundt HD64461_STBCR_SAFECKE_IST; 81da2014a2SPaul Mundt #ifndef CONFIG_HD64461_ENABLER 82da2014a2SPaul Mundt v |= HD64461_STBCR_SPC1ST; 83da2014a2SPaul Mundt #endif 84da2014a2SPaul Mundt outw(v, HD64461_STBCR); 85da2014a2SPaul Mundt v = inw(HD64461_GPADR); 86da2014a2SPaul Mundt v |= HD64461_GPADR_SPEAKER | HD64461_GPADR_PCMCIA0; 87da2014a2SPaul Mundt outw(v, HD64461_GPADR); 88da2014a2SPaul Mundt 89da2014a2SPaul Mundt outw(HD64461_PCCGCR_VCC0 | HD64461_PCCSCR_VCC1, HD64461_PCC0GCR); 90da2014a2SPaul Mundt 91da2014a2SPaul Mundt #ifndef CONFIG_HD64461_ENABLER 92da2014a2SPaul Mundt outw(HD64461_PCCGCR_VCC0 | HD64461_PCCSCR_VCC1, HD64461_PCC1GCR); 93da2014a2SPaul Mundt #endif 94da2014a2SPaul Mundt 95da2014a2SPaul Mundt sh_dac_output(0, DAC_SPEAKER_VOLUME); 96da2014a2SPaul Mundt sh_dac_disable(DAC_SPEAKER_VOLUME); 97da2014a2SPaul Mundt v8 = ctrl_inb(DACR); 98da2014a2SPaul Mundt v8 &= ~DACR_DAE; 99da2014a2SPaul Mundt ctrl_outb(v8,DACR); 100da2014a2SPaul Mundt 101da2014a2SPaul Mundt v8 = ctrl_inb(SCPDR); 102da2014a2SPaul Mundt v8 |= SCPDR_TS_SCAN_X | SCPDR_TS_SCAN_Y; 103da2014a2SPaul Mundt v8 &= ~SCPDR_TS_SCAN_ENABLE; 104da2014a2SPaul Mundt ctrl_outb(v8, SCPDR); 105da2014a2SPaul Mundt 106da2014a2SPaul Mundt v = ctrl_inw(SCPCR); 107da2014a2SPaul Mundt v &= ~SCPCR_TS_MASK; 108da2014a2SPaul Mundt v |= SCPCR_TS_ENABLE; 109da2014a2SPaul Mundt ctrl_outw(v, SCPCR); 110da2014a2SPaul Mundt } 111da2014a2SPaul Mundt device_initcall(hp6xx_devices_setup); 112da2014a2SPaul Mundt 113da2014a2SPaul Mundt static struct sh_machine_vector mv_hp6xx __initmv = { 114da2014a2SPaul Mundt .mv_name = "hp6xx", 115da2014a2SPaul Mundt .mv_setup = hp6xx_setup, 116da2014a2SPaul Mundt /* IRQ's : CPU(64) + CCHIP(16) + FREE_TO_USE(6) */ 117da2014a2SPaul Mundt .mv_nr_irqs = HD64461_IRQBASE + HD64461_IRQ_NUM + 6, 118da2014a2SPaul Mundt .mv_irq_demux = hd64461_irq_demux, 119da2014a2SPaul Mundt /* Enable IRQ0 -> IRQ3 in IRQ_MODE */ 120da2014a2SPaul Mundt .mv_init_irq = hp6xx_init_irq, 121da2014a2SPaul Mundt }; 122