^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * linux/arch/sh/boards/hp6xx/setup.c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Copyright (C) 2002 Andriy Skulysh
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * Copyright (C) 2007 Kristoffer Ericson <Kristoffer_e1@hotmail.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) * Setup code for HP620/HP660/HP680/HP690 (internal peripherials only)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include <linux/types.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include <linux/init.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include <linux/platform_device.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include <linux/irq.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #include <linux/sh_intc.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #include <sound/sh_dac_audio.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #include <asm/hd64461.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #include <asm/io.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #include <mach/hp6xx.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #include <cpu/dac.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #define SCPCR 0xa4000116
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #define SCPDR 0xa4000136
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) /* CF Slot */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) static struct resource cf_ide_resources[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) [0] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) .start = 0x15000000 + 0x1f0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) .end = 0x15000000 + 0x1f0 + 0x08 - 0x01,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) .flags = IORESOURCE_MEM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) [1] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) .start = 0x15000000 + 0x1fe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) .end = 0x15000000 + 0x1fe + 0x01,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) .flags = IORESOURCE_MEM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) [2] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) .start = evt2irq(0xba0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) .flags = IORESOURCE_IRQ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) static struct platform_device cf_ide_device = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) .name = "pata_platform",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) .id = -1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) .num_resources = ARRAY_SIZE(cf_ide_resources),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) .resource = cf_ide_resources,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) static struct platform_device jornadakbd_device = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) .name = "jornada680_kbd",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) .id = -1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) static void dac_audio_start(struct dac_audio_pdata *pdata)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) u16 v;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) u8 v8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) /* HP Jornada 680/690 speaker on */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) v = inw(HD64461_GPADR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) v &= ~HD64461_GPADR_SPEAKER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) outw(v, HD64461_GPADR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) /* HP Palmtop 620lx/660lx speaker on */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) v8 = inb(PKDR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) v8 &= ~PKDR_SPEAKER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) outb(v8, PKDR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) sh_dac_enable(pdata->channel);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) static void dac_audio_stop(struct dac_audio_pdata *pdata)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) u16 v;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) u8 v8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) /* HP Jornada 680/690 speaker off */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) v = inw(HD64461_GPADR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) v |= HD64461_GPADR_SPEAKER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) outw(v, HD64461_GPADR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) /* HP Palmtop 620lx/660lx speaker off */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) v8 = inb(PKDR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) v8 |= PKDR_SPEAKER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) outb(v8, PKDR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) sh_dac_output(0, pdata->channel);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) sh_dac_disable(pdata->channel);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) static struct dac_audio_pdata dac_audio_platform_data = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) .buffer_size = 64000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) .channel = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) .start = dac_audio_start,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) .stop = dac_audio_stop,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) static struct platform_device dac_audio_device = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) .name = "dac_audio",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) .id = -1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) .dev = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) .platform_data = &dac_audio_platform_data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) static struct platform_device *hp6xx_devices[] __initdata = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) &cf_ide_device,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) &jornadakbd_device,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) &dac_audio_device,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) static void __init hp6xx_init_irq(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) /* Gets touchscreen and powerbutton IRQ working */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) plat_irq_setup_pins(IRQ_MODE_IRQ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) static int __init hp6xx_devices_setup(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) return platform_add_devices(hp6xx_devices, ARRAY_SIZE(hp6xx_devices));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) static void __init hp6xx_setup(char **cmdline_p)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) u8 v8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) u16 v;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) v = inw(HD64461_STBCR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) v |= HD64461_STBCR_SURTST | HD64461_STBCR_SIRST |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) HD64461_STBCR_STM1ST | HD64461_STBCR_STM0ST |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) HD64461_STBCR_SAFEST | HD64461_STBCR_SPC0ST |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) HD64461_STBCR_SMIAST | HD64461_STBCR_SAFECKE_OST|
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) HD64461_STBCR_SAFECKE_IST;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) #ifndef CONFIG_HD64461_ENABLER
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) v |= HD64461_STBCR_SPC1ST;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) outw(v, HD64461_STBCR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) v = inw(HD64461_GPADR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) v |= HD64461_GPADR_SPEAKER | HD64461_GPADR_PCMCIA0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) outw(v, HD64461_GPADR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) outw(HD64461_PCCGCR_VCC0 | HD64461_PCCSCR_VCC1, HD64461_PCC0GCR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) #ifndef CONFIG_HD64461_ENABLER
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) outw(HD64461_PCCGCR_VCC0 | HD64461_PCCSCR_VCC1, HD64461_PCC1GCR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) sh_dac_output(0, DAC_SPEAKER_VOLUME);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) sh_dac_disable(DAC_SPEAKER_VOLUME);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) v8 = __raw_readb(DACR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) v8 &= ~DACR_DAE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) __raw_writeb(v8,DACR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) v8 = __raw_readb(SCPDR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) v8 |= SCPDR_TS_SCAN_X | SCPDR_TS_SCAN_Y;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) v8 &= ~SCPDR_TS_SCAN_ENABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) __raw_writeb(v8, SCPDR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) v = __raw_readw(SCPCR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) v &= ~SCPCR_TS_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) v |= SCPCR_TS_ENABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) __raw_writew(v, SCPCR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) device_initcall(hp6xx_devices_setup);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) static struct sh_machine_vector mv_hp6xx __initmv = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) .mv_name = "hp6xx",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) .mv_setup = hp6xx_setup,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) /* Enable IRQ0 -> IRQ3 in IRQ_MODE */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) .mv_init_irq = hp6xx_init_irq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) };