static int __init bus_init(void) { struct bit_data *bit = &bit_data; unsigned long flags; int ret; if (machine_is_assabet() || machine_is_pangolin()) { bit->sda = GPIO_GPIO15; bit->scl = GPIO_GPIO18; bit->l3_mode = GPIO_GPIO17; } if (machine_is_h3600() || machine_is_h3100()) { bit->sda = GPIO_GPIO14; bit->scl = GPIO_GPIO16; bit->l3_mode = GPIO_GPIO15; } if (machine_is_stork()) { bit->sda = GPIO_GPIO15; bit->scl = GPIO_GPIO18; bit->l3_mode = GPIO_GPIO17; } if (!bit->sda) return -ENODEV; /* * Default level for L3 mode is low. * We set SCL and SDA high (i2c idle state). */ local_irq_save(flags); GPDR &= ~(bit->scl | bit->sda); GPCR = bit->l3_mode | bit->scl | bit->sda; GPDR |= bit->l3_mode; local_irq_restore(flags); if (machine_is_assabet()) { /* * Release reset on UCB1300, ADI7171 and UDA1341. We * need to do this here so that we can communicate on * the I2C/L3 buses. */ ASSABET_BCR_set(ASSABET_BCR_CODEC_RST); mdelay(1); ASSABET_BCR_clear(ASSABET_BCR_CODEC_RST); mdelay(1); ASSABET_BCR_set(ASSABET_BCR_CODEC_RST); } ret = i2c_init(bit); if (ret == 0 && bit->l3_mode) { ret = l3_init(bit); if (ret) i2c_exit(); } return ret; }
static int __init sa1100_leds_init(void) { if (machine_is_assabet()) leds_event = assabet_leds_event; if (machine_is_consus()) leds_event = consus_leds_event; if (machine_is_badge4()) leds_event = badge4_leds_event; if (machine_is_brutus()) leds_event = brutus_leds_event; if (machine_is_cerf()) leds_event = cerf_leds_event; if (machine_is_flexanet()) leds_event = flexanet_leds_event; if (machine_is_graphicsclient()) leds_event = graphicsclient_leds_event; if (machine_is_hackkit()) leds_event = hackkit_leds_event; if (machine_is_lart()) leds_event = lart_leds_event; if (machine_is_pfs168()) leds_event = pfs168_leds_event; if (machine_is_graphicsmaster()) leds_event = graphicsmaster_leds_event; if (machine_is_adsbitsy()) leds_event = adsbitsy_leds_event; if (machine_is_pt_system3()) leds_event = system3_leds_event; leds_event(led_start); return 0; }
static int __init assabet_init(void) { if (!machine_is_assabet()) return -EINVAL; /* * Set the IRQ edges */ set_GPIO_IRQ_edge(GPIO_GPIO23, GPIO_RISING_EDGE); /* UCB1300 */ if (machine_has_neponset()) { /* * Angel sets this, but other bootloaders may not. * * This must precede any driver calls to BCR_set() * or BCR_clear(). */ ASSABET_BCR = BCR_value = ASSABET_BCR_DB1111; NCR_0 = 0; #ifndef CONFIG_ASSABET_NEPONSET printk( "Warning: Neponset detected but full support " "hasn't been configured in the kernel\n" ); #endif } return 0; }
static int __init assabet_uda1341_init(void) { int ret; if (!machine_is_assabet()) return -ENODEV; ret = l3_attach_client(&uda1341, "l3-bit-sa1100-gpio", "uda1341"); if (ret) goto out; /* register devices */ audio_dev_id = register_sound_dsp(&assabet_audio_fops, -1); mixer_dev_id = register_sound_mixer(&assabet_mixer_fops, -1); #ifdef FIX_POWER_DRAIN { unsigned long flags; local_irq_save(flags); ASSABET_BCR_set(ASSABET_BCR_CODEC_RST); GPSR = GPIO_SSP_SFRM; GPDR |= GPIO_SSP_SFRM; GPCR = GPIO_SSP_SFRM; local_irq_restore(flags); } #endif printk(KERN_INFO "Assabet UDA1341 audio driver initialized\n"); return 0; release_l3: l3_detach_client(&uda1341); out: return ret; }
static int __init neponset_init(void) { platform_driver_register(&neponset_device_driver); /* * The Neponset is only present on the Assabet machine type. */ if (!machine_is_assabet()) return -ENODEV; /* * Ensure that the memory bus request/grant signals are setup, * and the grant is held in its inactive state, whether or not * we actually have a Neponset attached. */ sa1110_mb_disable(); if (!machine_has_neponset()) { printk(KERN_DEBUG "Neponset expansion board not present\n"); return -ENODEV; } if (WHOAMI != 0x11) { printk(KERN_WARNING "Neponset board detected, but " "wrong ID: %02x\n", WHOAMI); return -ENODEV; } return platform_add_devices(devices, ARRAY_SIZE(devices)); }
static int __init sa1100_leds_init(void) { if (machine_is_assabet()) leds_event = assabet_leds_event; if (machine_is_consus()) leds_event = consus_leds_event; if (machine_is_badge4()) leds_event = badge4_leds_event; if (machine_is_brutus()) leds_event = brutus_leds_event; if (machine_is_cerf()) leds_event = cerf_leds_event; if (machine_is_flexanet()) leds_event = flexanet_leds_event; if (machine_is_graphicsclient()) leds_event = graphicsclient_leds_event; if (machine_is_hackkit()) leds_event = hackkit_leds_event; if (machine_is_lart()) leds_event = lart_leds_event; if (machine_is_pfs168()) leds_event = pfs168_leds_event; if (machine_is_graphicsmaster()) leds_event = graphicsmaster_leds_event; if (machine_is_adsbitsy()) leds_event = adsbitsy_leds_event; if (machine_is_pt_system3()) leds_event = system3_leds_event; if (machine_is_simpad()) leds_event = simpad_leds_event; /* what about machine registry? including led, apm... -zecke */ leds_event(led_start); return 0; }
static int mcp_sa11x0_probe(struct platform_device *pdev) { struct mcp_plat_data *data = pdev->dev.platform_data; struct mcp *mcp; int ret; if (!data) return -ENODEV; if (!request_mem_region(0x80060000, 0x60, "sa11x0-mcp")) return -EBUSY; mcp = mcp_host_alloc(&pdev->dev, sizeof(struct mcp_sa11x0)); if (!mcp) { ret = -ENOMEM; goto release; } mcp->owner = THIS_MODULE; mcp->ops = &mcp_sa11x0; mcp->sclk_rate = data->sclk_rate; mcp->dma_audio_rd = DMA_Ser4MCP0Rd; mcp->dma_audio_wr = DMA_Ser4MCP0Wr; mcp->dma_telco_rd = DMA_Ser4MCP1Rd; mcp->dma_telco_wr = DMA_Ser4MCP1Wr; platform_set_drvdata(pdev, mcp); if (machine_is_assabet()) { ASSABET_BCR_set(ASSABET_BCR_CODEC_RST); } PPDR &= ~PPC_RXD4; PPDR |= PPC_TXD4 | PPC_SCLK | PPC_SFRM; PSDR |= PPC_RXD4; PSDR &= ~(PPC_TXD4 | PPC_SCLK | PPC_SFRM); PPSR &= ~(PPC_TXD4 | PPC_SCLK | PPC_SFRM); Ser4MCSR = -1; Ser4MCCR1 = data->mccr1; Ser4MCCR0 = data->mccr0 | 0x7f7f; mcp->rw_timeout = (64 * 3 * 1000000 + mcp->sclk_rate - 1) / mcp->sclk_rate; ret = mcp_host_register(mcp); if (ret == 0) goto out; release: release_mem_region(0x80060000, 0x60); platform_set_drvdata(pdev, NULL); out: return ret; }
static struct sa1100fb_mach_info * __init sa1100fb_get_machine_info(struct sa1100fb_info *fbi) { struct sa1100fb_mach_info *inf = NULL; /* * R G B T * default {11,5}, { 5,6}, { 0,5}, { 0,0} * h3600 {12,4}, { 7,4}, { 1,4}, { 0,0} * freebird { 8,4}, { 4,4}, { 0,4}, {12,4} */ #ifdef CONFIG_SA1100_ASSABET if (machine_is_assabet()) { #ifndef ASSABET_PAL_VIDEO inf = &lq039q2ds54_info; #else inf = &pal_info; #endif } #endif #ifdef CONFIG_SA1100_H3100 if (machine_is_h3100()) { inf = &h3100_info; } #endif #ifdef CONFIG_SA1100_H3600 if (machine_is_h3600()) { inf = &h3600_info; fbi->rgb[RGB_16] = &h3600_rgb_16; } #endif #ifdef CONFIG_SA1100_COLLIE if (machine_is_collie()) { inf = &collie_info; } #endif #ifdef CONFIG_SA1100_LART if (machine_is_lart()) { #ifdef LART_GREY_LCD inf = &lart_grey_info; #endif #ifdef LART_COLOR_LCD inf = &lart_color_info; #endif #ifdef LART_VIDEO_OUT inf = &lart_video_info; #endif #ifdef LART_KIT01_LCD inf = &lart_kit01_info; #endif } #endif #ifdef CONFIG_SA1100_SHANNON if (machine_is_shannon()) { inf = &shannon_info; } #endif return inf; }
int __devinit pcmcia_assabet_init(struct device *dev) { int ret = -ENODEV; if (machine_is_assabet() && !machine_has_neponset()) ret = sa11xx_drv_pcmcia_probe(dev, &assabet_pcmcia_ops, 1, 1); return ret; }
/* According to the "Intel StrongARM SA-1111 Microprocessor Companion * Chip Specification Update" (June 2000), erratum #7, there is a * significant bug in Serial Audio Controller DMA. If the SAC is * accessing a region of memory above 1MB relative to the bank base, * it is important that address bit 10 _NOT_ be asserted. Depending * on the configuration of the RAM, bit 10 may correspond to one * of several different (processor-relative) address bits. * * This routine only identifies whether or not a given DMA address * is susceptible to the bug. */ int sa1111_check_dma_bug(dma_addr_t addr){ unsigned int physaddr=SA1111_DMA_ADDR((unsigned int)addr); /* Section 4.6 of the "Intel StrongARM SA-1111 Development Module * User's Guide" mentions that jumpers R51 and R52 control the * target of SA-1111 DMA (either SDRAM bank 0 on Assabet, or * SDRAM bank 1 on Neponset). The default configuration selects * Assabet, so any address in bank 1 is necessarily invalid. */ if((machine_is_assabet() || machine_is_pfs168() || machine_is_graphicsmaster() || machine_is_adsagc()) && addr >= 0xc8000000) return -1; /* The bug only applies to buffers located more than one megabyte * above the start of the target bank: */ if(physaddr<(1<<20)) return 0; switch(FExtr(SBI_SMCR, SMCR_DRAC)){ case 01: /* 10 row + bank address bits, A<20> must not be set */ if(physaddr & (1<<20)) return -1; break; case 02: /* 11 row + bank address bits, A<23> must not be set */ if(physaddr & (1<<23)) return -1; break; case 03: /* 12 row + bank address bits, A<24> must not be set */ if(physaddr & (1<<24)) return -1; break; case 04: /* 13 row + bank address bits, A<25> must not be set */ if(physaddr & (1<<25)) return -1; break; case 05: /* 14 row + bank address bits, A<20> must not be set */ if(physaddr & (1<<20)) return -1; break; case 06: /* 15 row + bank address bits, A<20> must not be set */ if(physaddr & (1<<20)) return -1; break; default: printk(KERN_ERR "%s(): invalid SMCR DRAC value 0%lo\n", __FUNCTION__, FExtr(SBI_SMCR, SMCR_DRAC)); return -1; } return 0; }
/* * Control the power state of the IrDA transmitter. * State: * 0 - off * 1 - short range, lowest power * 2 - medium range, medium power * 3 - maximum range, high power * * Currently, only assabet is known to support this. */ static int __sa1100_irda_set_power(struct sa1100_irda *si, unsigned int state) { int ret = 0; if (machine_is_assabet()) ret = sa1100_irda_set_power_assabet(si, state); if (machine_is_h3xxx()) ret = sa1100_irda_set_power_h3600(si, state); if (machine_is_yopy()) ret = sa1100_irda_set_power_yopy(si, state); return ret; }
static int pcmcia_probe(struct sa1111_dev *dev) { void __iomem *base; int ret; ret = sa1111_enable_device(dev); if (ret) return ret; dev_set_drvdata(&dev->dev, NULL); if (!request_mem_region(dev->res.start, 512, SA1111_DRIVER_NAME(dev))) { sa1111_disable_device(dev); return -EBUSY; } base = dev->mapbase; /* * Initialise the suspend state. */ writel_relaxed(PCSSR_S0_SLEEP | PCSSR_S1_SLEEP, base + PCSSR); writel_relaxed(PCCR_S0_FLT | PCCR_S1_FLT, base + PCCR); ret = -ENODEV; #ifdef CONFIG_SA1100_BADGE4 if (machine_is_badge4()) ret = pcmcia_badge4_init(dev); #endif #ifdef CONFIG_SA1100_JORNADA720 if (machine_is_jornada720()) ret = pcmcia_jornada720_init(dev); #endif #ifdef CONFIG_ARCH_LUBBOCK if (machine_is_lubbock()) ret = pcmcia_lubbock_init(dev); #endif #ifdef CONFIG_ASSABET_NEPONSET if (machine_is_assabet()) ret = pcmcia_neponset_init(dev); #endif if (ret) { release_mem_region(dev->res.start, 512); sa1111_disable_device(dev); } return ret; }
int __init pcmcia_neponset_init(struct sa1111_dev *sadev) { int ret = -ENODEV; if (machine_is_assabet()) { /* * Set GPIO_A<3:0> to be outputs for the MAX1600, * and switch to standby mode. */ sa1111_set_io_dir(sadev, GPIO_A0|GPIO_A1|GPIO_A2|GPIO_A3, 0, 0); sa1111_set_io(sadev, GPIO_A0|GPIO_A1|GPIO_A2|GPIO_A3, 0); sa1111_set_sleep_io(sadev, GPIO_A0|GPIO_A1|GPIO_A2|GPIO_A3, 0); ret = sa11xx_drv_pcmcia_probe(&sadev->dev, &neponset_pcmcia_ops, 0, 2); } return ret; }
int __init pcmcia_neponset_init(struct device *dev) { int ret = -ENODEV; if (machine_is_assabet()) { /* * Set GPIO_A<3:0> to be outputs for the MAX1600, * and switch to standby mode. */ PA_DDR = 0; PA_DWR = 0; PA_SDR = 0; PA_SSR = 0; ret = sa11xx_drv_pcmcia_probe(dev, &neponset_pcmcia_ops, 0, 2); } return ret; }
static void assabet_lcd_set_visual(u32 visual) { u_int is_true_color = visual == FB_VISUAL_TRUECOLOR; if (machine_is_assabet()) { #if 1 // phase 4 or newer Assabet's if (is_true_color) ASSABET_BCR_set(ASSABET_BCR_LCD_12RGB); else ASSABET_BCR_clear(ASSABET_BCR_LCD_12RGB); #else // older Assabet's if (is_true_color) ASSABET_BCR_clear(ASSABET_BCR_LCD_12RGB); else ASSABET_BCR_set(ASSABET_BCR_LCD_12RGB); #endif } }
static int __init sa1111_uda1341_init(void) { struct uda1341_cfg cfg; int ret; if ( !( (machine_is_assabet() && machine_has_neponset()) || machine_is_jornada720() )) return -ENODEV; ret = l3_attach_client(&uda1341, "l3-sa1111", "uda1341"); if (ret) goto out; /* Acquire and initialize DMA */ ret = sa1111_sac_request_dma(&output_stream.dma_ch, "SA1111 audio out", SA1111_SAC_XMT_CHANNEL); if (ret < 0) goto release_l3; ret = sa1111_sac_request_dma(&input_stream.dma_ch, "SA1111 audio in", SA1111_SAC_RCV_CHANNEL); if (ret < 0) goto release_dma; cfg.fs = 256; cfg.format = FMT_I2S; l3_command(&uda1341, L3_UDA1341_CONFIGURE, &cfg); /* register devices */ audio_dev_id = register_sound_dsp(&sa1111_audio_fops, -1); mixer_dev_id = register_sound_mixer(&uda1341_mixer_fops, -1); printk(KERN_INFO "SA1111 UDA1341 audio driver initialized\n"); return 0; release_dma: sa1100_free_dma(output_stream.dma_ch); release_l3: l3_detach_client(&uda1341); out: return ret; }
static void sa1111_audio_init(void *dummy) { #ifdef CONFIG_ASSABET_NEPONSET if (machine_is_assabet()) { /* Select I2S audio (instead of AC-Link) */ AUD_CTL = AUD_SEL_1341; } #endif #ifdef CONFIG_SA1100_JORNADA720 if (machine_is_jornada720()) { /* LDD4 is speaker, LDD3 is microphone */ PPSR &= ~(PPC_LDD3 | PPC_LDD4); PPDR |= PPC_LDD3 | PPC_LDD4; PPSR |= PPC_LDD4; /* enable speaker */ PPSR |= PPC_LDD3; /* enable microphone */ } #endif SBI_SKCR &= ~SKCR_SELAC; /* Enable the I2S clock and L3 bus clock: */ SKPCR |= (SKPCR_I2SCLKEN | SKPCR_L3CLKEN); /* Activate and reset the Serial Audio Controller */ SACR0 |= (SACR0_ENB | SACR0_RST); mdelay(5); SACR0 &= ~SACR0_RST; /* For I2S, BIT_CLK is supplied internally. The "SA-1111 * Specification Update" mentions that the BCKD bit should * be interpreted as "0 = output". Default clock divider * is 22.05kHz. * * Select I2S, L3 bus. "Recording" and "Replaying" * (receive and transmit) are enabled. */ SACR1 = SACR1_L3EN; SKAUD = audio_clk_div - 1; /* Initialize the UDA1341 internal state */ l3_open(&uda1341); }
/* * This needs re-working */ static int mcp_sa1100_init(void) { struct mcp *mcp = &mcp_sa1100; int ret = -ENODEV; if (machine_is_adsbitsy() || machine_is_assabet() || machine_is_cerf() || machine_is_flexanet() || machine_is_freebird() || machine_is_graphicsclient() || machine_is_graphicsmaster() || machine_is_lart() || machine_is_omnimeter() || machine_is_pfs168() || machine_is_shannon() || machine_is_simpad() || machine_is_yopy()) { /* * Setup the PPC unit correctly. */ PPDR &= ~PPC_RXD4; PPDR |= PPC_TXD4 | PPC_SCLK | PPC_SFRM; PSDR |= PPC_RXD4; PSDR &= ~(PPC_TXD4 | PPC_SCLK | PPC_SFRM); PPSR &= ~(PPC_TXD4 | PPC_SCLK | PPC_SFRM); Ser4MCSR = -1; Ser4MCCR1 = 0; Ser4MCCR0 = 0x00007f7f | MCCR0_ADM; /* * Calculate the read/write timeout (us) from the bit clock * rate. This is the period for 3 64-bit frames. Always * round this time up. */ mcp->rw_timeout = (64 * 3 * 1000000 + mcp->sclk_rate - 1) / mcp->sclk_rate; ret = mcp_register(mcp); } return ret; }
static int __init neponset_init(void) { platform_driver_register(&neponset_device_driver); if (!machine_is_assabet()) return -ENODEV; sa1110_mb_disable(); if (!machine_has_neponset()) { printk(KERN_DEBUG "Neponset expansion board not present\n"); return -ENODEV; } if (WHOAMI != 0x11) { printk(KERN_WARNING "Neponset board detected, but " "wrong ID: %02x\n", WHOAMI); return -ENODEV; } return platform_add_devices(devices, ARRAY_SIZE(devices)); }
static int mcp_sa11x0_probe(struct platform_device *pdev) { struct mcp_plat_data *data = pdev->dev.platform_data; struct mcp *mcp; int ret; if (!data) return -ENODEV; if (!request_mem_region(0x80060000, 0x60, "sa11x0-mcp")) return -EBUSY; mcp = mcp_host_alloc(&pdev->dev, sizeof(struct mcp_sa11x0)); if (!mcp) { ret = -ENOMEM; goto release; } mcp->owner = THIS_MODULE; mcp->ops = &mcp_sa11x0; mcp->sclk_rate = data->sclk_rate; mcp->dma_audio_rd = DMA_Ser4MCP0Rd; mcp->dma_audio_wr = DMA_Ser4MCP0Wr; mcp->dma_telco_rd = DMA_Ser4MCP1Rd; mcp->dma_telco_wr = DMA_Ser4MCP1Wr; mcp->gpio_base = data->gpio_base; platform_set_drvdata(pdev, mcp); if (machine_is_assabet()) { ASSABET_BCR_set(ASSABET_BCR_CODEC_RST); } /* * Setup the PPC unit correctly. */ PPDR &= ~PPC_RXD4; PPDR |= PPC_TXD4 | PPC_SCLK | PPC_SFRM; PSDR |= PPC_RXD4; PSDR &= ~(PPC_TXD4 | PPC_SCLK | PPC_SFRM); PPSR &= ~(PPC_TXD4 | PPC_SCLK | PPC_SFRM); /* * Initialise device. Note that we initially * set the sampling rate to minimum. */ Ser4MCSR = -1; Ser4MCCR1 = data->mccr1; Ser4MCCR0 = data->mccr0 | 0x7f7f; /* * Calculate the read/write timeout (us) from the bit clock * rate. This is the period for 3 64-bit frames. Always * round this time up. */ mcp->rw_timeout = (64 * 3 * 1000000 + mcp->sclk_rate - 1) / mcp->sclk_rate; ret = mcp_host_register(mcp); if (ret == 0) goto out; release: release_mem_region(0x80060000, 0x60); platform_set_drvdata(pdev, NULL); out: return ret; }
/* sa1100_pcmcia_driver_init() * ^^^^^^^^^^^^^^^^^^^^^^^^^^^ * * This routine performs a basic sanity check to ensure that this * kernel has been built with the appropriate board-specific low-level * PCMCIA support, performs low-level PCMCIA initialization, registers * this socket driver with Card Services, and then spawns the daemon * thread which is the real workhorse of the socket driver. * * Please see linux/Documentation/arm/SA1100/PCMCIA for more information * on the low-level kernel interface. * * Returns: 0 on success, -1 on error */ static int __init sa1100_pcmcia_driver_init(void){ servinfo_t info; struct pcmcia_init pcmcia_init; struct pcmcia_state state[SA1100_PCMCIA_MAX_SOCK]; struct pcmcia_state_array state_array; unsigned int i, clock; unsigned long mecr; printk(KERN_INFO "SA-1100 PCMCIA (CS release %s)\n", CS_RELEASE); CardServices(GetCardServicesInfo, &info); if(info.Revision!=CS_RELEASE_CODE){ printk(KERN_ERR "Card Services release codes do not match\n"); return -1; } if(machine_is_assabet()){ #ifdef CONFIG_SA1100_ASSABET if(machine_has_neponset()){ #ifdef CONFIG_ASSABET_NEPONSET pcmcia_low_level=&neponset_pcmcia_ops; #else printk(KERN_ERR "Card Services disabled: missing Neponset support\n"); return -1; #endif }else{ pcmcia_low_level=&assabet_pcmcia_ops; } #endif } else if (machine_is_freebird()) { #ifdef CONFIG_SA1100_FREEBIRD pcmcia_low_level = &freebird_pcmcia_ops; #endif } else if (machine_is_h3xxx()) { #ifdef CONFIG_SA1100_H3XXX pcmcia_low_level = &h3600_pcmcia_ops; #endif } else if (machine_is_cerf()) { #ifdef CONFIG_SA1100_CERF pcmcia_low_level = &cerf_pcmcia_ops; #endif } else if (machine_is_graphicsclient()) { #ifdef CONFIG_SA1100_GRAPHICSCLIENT pcmcia_low_level = &gcplus_pcmcia_ops; #endif } else if (machine_is_xp860()) { #ifdef CONFIG_SA1100_XP860 pcmcia_low_level = &xp860_pcmcia_ops; #endif } else if (machine_is_yopy()) { #ifdef CONFIG_SA1100_YOPY pcmcia_low_level = &yopy_pcmcia_ops; #endif } else if (machine_is_shannon()) { #ifdef CONFIG_SA1100_SHANNON pcmcia_low_level = &shannon_pcmcia_ops; #endif } else if (machine_is_pangolin()) { #ifdef CONFIG_SA1100_PANGOLIN pcmcia_low_level = &pangolin_pcmcia_ops; #endif } else if (machine_is_jornada720()) { #ifdef CONFIG_SA1100_JORNADA720 pcmcia_low_level = &jornada720_pcmcia_ops; #endif } else if(machine_is_pfs168()){ #ifdef CONFIG_SA1100_PFS168 pcmcia_low_level=&pfs168_pcmcia_ops; #endif } else if(machine_is_flexanet()){ #ifdef CONFIG_SA1100_FLEXANET pcmcia_low_level=&flexanet_pcmcia_ops; #endif } else if(machine_is_simpad()){ #ifdef CONFIG_SA1100_SIMPAD pcmcia_low_level=&simpad_pcmcia_ops; #endif } else if(machine_is_graphicsmaster()) { #ifdef CONFIG_SA1100_GRAPHICSMASTER pcmcia_low_level=&graphicsmaster_pcmcia_ops; #endif } else if(machine_is_adsbitsy()) { #ifdef CONFIG_SA1100_ADSBITSY pcmcia_low_level=&adsbitsy_pcmcia_ops; #endif } else if(machine_is_stork()) { #ifdef CONFIG_SA1100_STORK pcmcia_low_level=&stork_pcmcia_ops; #endif } if (!pcmcia_low_level) { printk(KERN_ERR "This hardware is not supported by the SA1100 Card Service driver\n"); return -ENODEV; } pcmcia_init.handler=sa1100_pcmcia_interrupt; if((sa1100_pcmcia_socket_count=pcmcia_low_level->init(&pcmcia_init))<0){ printk(KERN_ERR "Unable to initialize kernel PCMCIA service.\n"); return -EIO; } state_array.size=sa1100_pcmcia_socket_count; state_array.state=state; if(pcmcia_low_level->socket_state(&state_array)<0){ printk(KERN_ERR "Unable to get PCMCIA status from kernel.\n"); return -EIO; } /* We initialize the MECR to default values here, because we are * not guaranteed to see a SetIOMap operation at runtime. */ mecr=0; clock = cpufreq_get(0); for(i=0; i<sa1100_pcmcia_socket_count; ++i){ sa1100_pcmcia_socket[i].k_state=state[i]; /* This is an interim fix. Apparently, SetSocket is no longer * called to initialize each socket (prior to the first detect * event). For now, we'll just manually set up the mask. */ sa1100_pcmcia_socket[i].cs_state.csc_mask=SS_DETECT; sa1100_pcmcia_socket[i].virt_io=(i==0)?PCMCIA_IO_0_BASE:PCMCIA_IO_1_BASE; sa1100_pcmcia_socket[i].phys_attr=_PCMCIAAttr(i); sa1100_pcmcia_socket[i].phys_mem=_PCMCIAMem(i); MECR_FAST_SET(mecr, i, 0); MECR_BSIO_SET(mecr, i, sa1100_pcmcia_mecr_bs(SA1100_PCMCIA_IO_ACCESS, clock)); MECR_BSA_SET(mecr, i, sa1100_pcmcia_mecr_bs(SA1100_PCMCIA_5V_MEM_ACCESS, clock)); MECR_BSM_SET(mecr, i, sa1100_pcmcia_mecr_bs(SA1100_PCMCIA_5V_MEM_ACCESS, clock)); sa1100_pcmcia_socket[i].speed_io=SA1100_PCMCIA_IO_ACCESS; sa1100_pcmcia_socket[i].speed_attr=SA1100_PCMCIA_5V_MEM_ACCESS; sa1100_pcmcia_socket[i].speed_mem=SA1100_PCMCIA_5V_MEM_ACCESS; } MECR=mecr; #ifdef CONFIG_CPU_FREQ if(cpufreq_register_notifier(&sa1100_pcmcia_notifier_block) < 0){ printk(KERN_ERR "Unable to register CPU frequency change notifier\n"); return -ENXIO; } #endif /* Only advertise as many sockets as we can detect: */ if(register_ss_entry(sa1100_pcmcia_socket_count, &sa1100_pcmcia_operations)<0){ printk(KERN_ERR "Unable to register socket service routine\n"); return -ENXIO; } /* Start the event poll timer. It will reschedule by itself afterwards. */ sa1100_pcmcia_poll_event(0); DEBUG(1, "sa1100: initialization complete\n"); return 0; } /* sa1100_pcmcia_driver_init() */
static int __init sa1100_pcmcia_machine_init(void) { #ifdef CONFIG_SA1100_ASSABET if(machine_is_assabet()) { if(machine_has_neponset()) { #ifdef CONFIG_ASSABET_NEPONSET pcmcia_low_level = &neponset_pcmcia_ops; #else printk(KERN_ERR "Card Services disabled: missing Neponset support\n"); return -1; #endif } else pcmcia_low_level = &assabet_pcmcia_ops; } #endif #ifdef CONFIG_SA1100_BADGE4 if (machine_is_badge4()) pcmcia_low_level = &badge4_pcmcia_ops; #endif #ifdef CONFIG_SA1100_FREEBIRD if (machine_is_freebird()) pcmcia_low_level = &freebird_pcmcia_ops; #endif #ifdef CONFIG_SA1100_H3600 if (machine_is_h3600()) pcmcia_low_level = &h3600_pcmcia_ops; #endif #ifdef CONFIG_SA1100_CERF if (machine_is_cerf()) pcmcia_low_level = &cerf_pcmcia_ops; #endif #ifdef CONFIG_SA1100_GRAPHICSCLIENT if (machine_is_graphicsclient()) pcmcia_low_level = &gcplus_pcmcia_ops; #endif #ifdef CONFIG_SA1100_XP860 if (machine_is_xp860()) pcmcia_low_level = &xp860_pcmcia_ops; #endif #ifdef CONFIG_SA1100_YOPY if (machine_is_yopy()) pcmcia_low_level = &yopy_pcmcia_ops; #endif #ifdef CONFIG_SA1100_SHANNON if (machine_is_shannon()) pcmcia_low_level = &shannon_pcmcia_ops; #endif #ifdef CONFIG_SA1100_PANGOLIN if (machine_is_pangolin()) pcmcia_low_level = &pangolin_pcmcia_ops; #endif #ifdef CONFIG_SA1100_JORNADA720 if (machine_is_jornada720()) pcmcia_low_level = &jornada720_pcmcia_ops; #endif #ifdef CONFIG_SA1100_PFS168 if(machine_is_pfs168()) pcmcia_low_level = &pfs168_pcmcia_ops; #endif #ifdef CONFIG_SA1100_FLEXANET if(machine_is_flexanet()) pcmcia_low_level = &flexanet_pcmcia_ops; #endif #ifdef CONFIG_SA1100_SIMPAD if(machine_is_simpad()) pcmcia_low_level = &simpad_pcmcia_ops; #endif #ifdef CONFIG_SA1100_GRAPHICSMASTER if(machine_is_graphicsmaster()) pcmcia_low_level = &graphicsmaster_pcmcia_ops; #endif #ifdef CONFIG_SA1100_ADSAGC if(machine_is_adsagc()) pcmcia_low_level = &graphicsmaster_pcmcia_ops; #endif #ifdef CONFIG_SA1100_ADSBITSY if(machine_is_adsbitsy()) pcmcia_low_level = &adsbitsy_pcmcia_ops; #endif #ifdef CONFIG_SA1100_ADSBITSYPLUS if(machine_is_adsbitsyplus()) pcmcia_low_level = &adsbitsyplus_pcmcia_ops; #endif #ifdef CONFIG_SA1100_STORK if(machine_is_stork()) pcmcia_low_level = &stork_pcmcia_ops; #endif if (!pcmcia_low_level) { printk(KERN_ERR "This hardware is not supported by the SA1100 Card Service driver\n"); return -ENODEV; } return 0; }
/* * Set the IrDA communications speed. */ static int sa1100_irda_set_speed(struct sa1100_irda *si, int speed) { unsigned long flags; int brd, ret = -EINVAL; switch (speed) { case 9600: case 19200: case 38400: case 57600: case 115200: brd = 3686400 / (16 * speed) - 1; /* * Stop the receive DMA. */ if (IS_FIR(si)) sa1100_stop_dma(si->rxdma); local_irq_save(flags); Ser2UTCR3 = 0; Ser2HSCR0 = HSCR0_UART; Ser2UTCR1 = brd >> 8; Ser2UTCR2 = brd; /* * Clear status register */ Ser2UTSR0 = UTSR0_REB | UTSR0_RBB | UTSR0_RID; Ser2UTCR3 = UTCR3_RIE | UTCR3_RXE | UTCR3_TXE; if (machine_is_assabet()) ASSABET_BCR_clear(ASSABET_BCR_IRDA_FSEL); if (machine_is_h3xxx()) clr_h3600_egpio(IPAQ_EGPIO_IR_FSEL); if (machine_is_yopy()) PPSR &= ~GPIO_IRDA_FIR; si->speed = speed; local_irq_restore(flags); ret = 0; break; case 4000000: local_irq_save(flags); si->hscr0 = 0; Ser2HSSR0 = 0xff; Ser2HSCR0 = si->hscr0 | HSCR0_HSSP; Ser2UTCR3 = 0; si->speed = speed; if (machine_is_assabet()) ASSABET_BCR_set(ASSABET_BCR_IRDA_FSEL); if (machine_is_h3xxx()) set_h3600_egpio(IPAQ_EGPIO_IR_FSEL); if (machine_is_yopy()) PPSR |= GPIO_IRDA_FIR; sa1100_irda_rx_alloc(si); sa1100_irda_rx_dma_start(si); local_irq_restore(flags); break; default: break; } return ret; }
static int __init neponset_init(void) { int ret; /* * The Neponset is only present on the Assabet machine type. */ if (!machine_is_assabet()) return -ENODEV; /* * Ensure that the memory bus request/grant signals are setup, * and the grant is held in its inactive state, whether or not * we actually have a Neponset attached. */ sa1110_mb_disable(); if (!machine_has_neponset()) { printk(KERN_DEBUG "Neponset expansion board not present\n"); return -ENODEV; } if (WHOAMI != 0x11) { printk(KERN_WARNING "Neponset board detected, but " "wrong ID: %02x\n", WHOAMI); return -ENODEV; } /* * Disable GPIO 0/1 drivers so the buttons work on the module. */ NCR_0 |= NCR_GP01_OFF; /* * Neponset has SA1111 connected to CS4. We know that after * reset the chip will be configured for variable latency IO. */ /* FIXME: setup MSC2 */ /* * Probe for a SA1111. */ ret = sa1111_probe(NEPONSET_SA1111_BASE); if (ret < 0) return ret; /* * We found it. Wake the chip up. */ sa1111_wake(); /* * The SDRAM configuration of the SA1110 and the SA1111 must * match. This is very important to ensure that SA1111 accesses * don't corrupt the SDRAM. Note that this ungates the SA1111's * MBGNT signal, so we must have called sa1110_mb_disable() * beforehand. */ sa1111_configure_smc(1, FExtr(MDCNFG, MDCNFG_SA1110_DRAC0), FExtr(MDCNFG, MDCNFG_SA1110_TDL0)); /* * We only need to turn on DCLK whenever we want to use the * DMA. It can otherwise be held firmly in the off position. */ SKPCR |= SKPCR_DCLKEN; /* * Enable the SA1110 memory bus request and grant signals. */ sa1110_mb_enable(); neponset_init_irq(); return 0; }
static int __init sa1100_static_partitions(struct mtd_partition **parts) { int nb_parts = 0; #ifdef CONFIG_SA1100_ADSBITSY if (machine_is_adsbitsy()) { *parts = adsbitsy_partitions; nb_parts = ARRAY_SIZE(adsbitsy_partitions); } #endif #ifdef CONFIG_SA1100_ASSABET if (machine_is_assabet()) { *parts = assabet_partitions; nb_parts = ARRAY_SIZE(assabet_partitions); } #endif #ifdef CONFIG_SA1100_BADGE4 if (machine_is_badge4()) { *parts = badge4_partitions; nb_parts = ARRAY_SIZE(badge4_partitions); } #endif #ifdef CONFIG_SA1100_CERF if (machine_is_cerf()) { *parts = cerf_partitions; nb_parts = ARRAY_SIZE(cerf_partitions); } #endif #ifdef CONFIG_SA1100_CONSUS if (machine_is_consus()) { *parts = consus_partitions; nb_parts = ARRAY_SIZE(consus_partitions); } #endif #ifdef CONFIG_SA1100_FLEXANET if (machine_is_flexanet()) { *parts = flexanet_partitions; nb_parts = ARRAY_SIZE(flexanet_partitions); } #endif #ifdef CONFIG_SA1100_FREEBIRD if (machine_is_freebird()) { *parts = freebird_partitions; nb_parts = ARRAY_SIZE(freebird_partitions); } #endif #ifdef CONFIG_SA1100_FRODO if (machine_is_frodo()) { *parts = frodo_partitions; nb_parts = ARRAY_SIZE(frodo_partitions); } #endif #ifdef CONFIG_SA1100_GRAPHICSCLIENT if (machine_is_graphicsclient()) { *parts = graphicsclient_partitions; nb_parts = ARRAY_SIZE(graphicsclient_partitions); } #endif #ifdef CONFIG_SA1100_GRAPHICSMASTER if (machine_is_graphicsmaster()) { *parts = graphicsmaster_partitions; nb_parts = ARRAY_SIZE(graphicsmaster_partitions); } #endif #ifdef CONFIG_SA1100_H3XXX if (machine_is_h3xxx()) { *parts = h3xxx_partitions; nb_parts = ARRAY_SIZE(h3xxx_partitions); } #endif #ifdef CONFIG_SA1100_HACKKIT if (machine_is_hackkit()) { *parts = hackkit_partitions; nb_parts = ARRAY_SIZE(hackkit_partitions); } #endif #ifdef CONFIG_SA1100_HUW_WEBPANEL if (machine_is_huw_webpanel()) { *parts = huw_webpanel_partitions; nb_parts = ARRAY_SIZE(huw_webpanel_partitions); } #endif #ifdef CONFIG_SA1100_JORNADA720 if (machine_is_jornada720()) { *parts = jornada720_partitions; nb_parts = ARRAY_SIZE(jornada720_partitions); } #endif #ifdef CONFIG_SA1100_PANGOLIN if (machine_is_pangolin()) { *parts = pangolin_partitions; nb_parts = ARRAY_SIZE(pangolin_partitions); } #endif #ifdef CONFIG_SA1100_PT_SYSTEM3 if (machine_is_pt_system3()) { *parts = system3_partitions; nb_parts = ARRAY_SIZE(system3_partitions); } #endif #ifdef CONFIG_SA1100_SHANNON if (machine_is_shannon()) { *parts = shannon_partitions; nb_parts = ARRAY_SIZE(shannon_partitions); } #endif #ifdef CONFIG_SA1100_SHERMAN if (machine_is_sherman()) { *parts = sherman_partitions; nb_parts = ARRAY_SIZE(sherman_partitions); } #endif #ifdef CONFIG_SA1100_SIMPAD if (machine_is_simpad()) { *parts = simpad_partitions; nb_parts = ARRAY_SIZE(simpad_partitions); } #endif #ifdef CONFIG_SA1100_STORK if (machine_is_stork()) { *parts = stork_partitions; nb_parts = ARRAY_SIZE(stork_partitions); } #endif #ifdef CONFIG_SA1100_TRIZEPS if (machine_is_trizeps()) { *parts = trizeps_partitions; nb_parts = ARRAY_SIZE(trizeps_partitions); } #endif #ifdef CONFIG_SA1100_YOPY if (machine_is_yopy()) { *parts = yopy_partitions; nb_parts = ARRAY_SIZE(yopy_partitions); } #endif return nb_parts; }