static int omap2_onenand_setup_async(void __iomem *onenand_base) { struct gpmc_timings t; int ret; if (gpmc_onenand_data->of_node) { gpmc_read_settings_dt(gpmc_onenand_data->of_node, &onenand_async); if (onenand_async.sync_read || onenand_async.sync_write) { if (onenand_async.sync_write) gpmc_onenand_data->flags |= ONENAND_SYNC_READWRITE; else gpmc_onenand_data->flags |= ONENAND_SYNC_READ; onenand_async.sync_read = false; onenand_async.sync_write = false; } } omap2_onenand_set_async_mode(onenand_base); omap2_onenand_calc_async_timings(&t); ret = gpmc_cs_program_settings(gpmc_onenand_data->cs, &onenand_async); if (ret < 0) return ret; ret = gpmc_cs_set_timings(gpmc_onenand_data->cs, &t, &onenand_async); if (ret < 0) return ret; omap2_onenand_set_async_mode(onenand_base); return 0; }
static int omap2_onenand_setup_sync(void __iomem *onenand_base, int *freq_ptr) { int ret, freq = *freq_ptr; struct gpmc_timings t; if (!freq) { /* Very first call freq is not known */ freq = omap2_onenand_get_freq(gpmc_onenand_data, onenand_base); if (!freq) return -ENODEV; set_onenand_cfg(onenand_base); } if (gpmc_onenand_data->of_node) { gpmc_read_settings_dt(gpmc_onenand_data->of_node, &onenand_sync); } else { /* * FIXME: Appears to be legacy code from initial ONENAND commit. * Unclear what boards this is for and if this can be removed. */ if (!cpu_is_omap34xx()) onenand_sync.wait_on_read = true; } omap2_onenand_calc_sync_timings(&t, gpmc_onenand_data->flags, freq); ret = gpmc_cs_program_settings(gpmc_onenand_data->cs, &onenand_sync); if (ret < 0) return ret; ret = gpmc_cs_set_timings(gpmc_onenand_data->cs, &t, &onenand_sync); if (ret < 0) return ret; set_onenand_cfg(onenand_base); *freq_ptr = freq; return 0; }
static int omap2_onenand_setup_async(void __iomem *onenand_base) { struct gpmc_timings t; int ret; /* * Note that we need to keep sync_write set for the call to * omap2_onenand_set_async_mode() to work to detect the onenand * supported clock rate for the sync timings. */ if (gpmc_onenand_data->of_node) { gpmc_read_settings_dt(gpmc_onenand_data->of_node, &onenand_async); if (onenand_async.sync_read || onenand_async.sync_write) { if (onenand_async.sync_write) gpmc_onenand_data->flags |= ONENAND_SYNC_READWRITE; else gpmc_onenand_data->flags |= ONENAND_SYNC_READ; onenand_async.sync_read = false; } } onenand_async.sync_write = true; omap2_onenand_calc_async_timings(&t); ret = gpmc_cs_program_settings(gpmc_onenand_data->cs, &onenand_async); if (ret < 0) return ret; ret = gpmc_cs_set_timings(gpmc_onenand_data->cs, &t, &onenand_async); if (ret < 0) return ret; omap2_onenand_set_async_mode(onenand_base); return 0; }
/* this may be called only from board-*.c setup code */ int __init tusb6010_setup_interface(struct musb_hdrc_platform_data *data, unsigned ps_refclk, unsigned waitpin, unsigned async, unsigned sync, unsigned irq, unsigned dmachan) { int status; static char error[] __initdata = KERN_ERR "tusb6010 init error %d, %d\n"; /* ASYNC region, primarily for PIO */ status = gpmc_cs_request(async, SZ_16M, (unsigned long *) &tusb_resources[0].start); if (status < 0) { printk(error, 1, status); return status; } tusb_resources[0].end = tusb_resources[0].start + 0x9ff; tusb_async.wait_pin = waitpin; async_cs = async; status = gpmc_cs_program_settings(async_cs, &tusb_async); if (status < 0) return status; /* SYNC region, primarily for DMA */ status = gpmc_cs_request(sync, SZ_16M, (unsigned long *) &tusb_resources[1].start); if (status < 0) { printk(error, 2, status); return status; } tusb_resources[1].end = tusb_resources[1].start + 0x9ff; tusb_sync.wait_pin = waitpin; sync_cs = sync; status = gpmc_cs_program_settings(sync_cs, &tusb_sync); if (status < 0) return status; /* IRQ */ status = gpio_request_one(irq, GPIOF_IN, "TUSB6010 irq"); if (status < 0) { printk(error, 3, status); return status; } tusb_resources[2].start = gpio_to_irq(irq); /* set up memory timings ... can speed them up later */ if (!ps_refclk) { printk(error, 4, status); return -ENODEV; } refclk_psec = ps_refclk; status = tusb6010_platform_retime(1); if (status < 0) { printk(error, 5, status); return status; } /* finish device setup ... */ if (!data) { printk(error, 6, status); return -ENODEV; } tusb_device.dev.platform_data = data; /* REVISIT let the driver know what DMA channels work */ if (!dmachan) tusb_device.dev.dma_mask = NULL; else { /* assume OMAP 2420 ES2.0 and later */ if (dmachan & (1 << 0)) omap_mux_init_signal("sys_ndmareq0", 0); if (dmachan & (1 << 1)) omap_mux_init_signal("sys_ndmareq1", 0); if (dmachan & (1 << 2)) omap_mux_init_signal("sys_ndmareq2", 0); if (dmachan & (1 << 3)) omap_mux_init_signal("sys_ndmareq3", 0); if (dmachan & (1 << 4)) omap_mux_init_signal("sys_ndmareq4", 0); if (dmachan & (1 << 5)) omap_mux_init_signal("sys_ndmareq5", 0); } /* so far so good ... register the device */ status = platform_device_register(&tusb_device); if (status < 0) { printk(error, 7, status); return status; } return 0; }
/* * Initialize smc91x device connected to the GPMC. Note that we * assume that pin multiplexing is done in the board-*.c file, * or in the bootloader. */ void __init gpmc_smc91x_init(struct omap_smc91x_platform_data *board_data) { unsigned long cs_mem_base; int ret; gpmc_cfg = board_data; if (gpmc_cfg->flags & GPMC_TIMINGS_SMC91C96) gpmc_cfg->retime = smc91c96_gpmc_retime; if (gpmc_cs_request(gpmc_cfg->cs, SZ_16M, &cs_mem_base) < 0) { printk(KERN_ERR "Failed to request GPMC mem for smc91x\n"); return; } gpmc_smc91x_resources[0].start = cs_mem_base + 0x300; gpmc_smc91x_resources[0].end = cs_mem_base + 0x30f; gpmc_smc91x_resources[1].flags |= (gpmc_cfg->flags & IRQF_TRIGGER_MASK); if (gpmc_cfg->flags & GPMC_MUX_ADD_DATA) smc91x_settings.mux_add_data = GPMC_MUX_AD; if (gpmc_cfg->flags & GPMC_READ_MON) smc91x_settings.wait_on_read = true; if (gpmc_cfg->flags & GPMC_WRITE_MON) smc91x_settings.wait_on_write = true; if (gpmc_cfg->wait_pin) smc91x_settings.wait_pin = gpmc_cfg->wait_pin; ret = gpmc_cs_program_settings(gpmc_cfg->cs, &smc91x_settings); if (ret < 0) goto free1; if (gpmc_cfg->retime) { ret = gpmc_cfg->retime(); if (ret != 0) goto free1; } if (gpio_request_one(gpmc_cfg->gpio_irq, GPIOF_IN, "SMC91X irq") < 0) goto free1; gpmc_smc91x_resources[1].start = gpio_to_irq(gpmc_cfg->gpio_irq); if (gpmc_cfg->gpio_pwrdwn) { ret = gpio_request_one(gpmc_cfg->gpio_pwrdwn, GPIOF_OUT_INIT_LOW, "SMC91X powerdown"); if (ret) goto free2; } if (gpmc_cfg->gpio_reset) { ret = gpio_request_one(gpmc_cfg->gpio_reset, GPIOF_OUT_INIT_LOW, "SMC91X reset"); if (ret) goto free3; gpio_set_value(gpmc_cfg->gpio_reset, 1); msleep(100); gpio_set_value(gpmc_cfg->gpio_reset, 0); } if (platform_device_register(&gpmc_smc91x_device) < 0) { printk(KERN_ERR "Unable to register smc91x device\n"); gpio_free(gpmc_cfg->gpio_reset); goto free3; } return; free3: if (gpmc_cfg->gpio_pwrdwn) gpio_free(gpmc_cfg->gpio_pwrdwn); free2: gpio_free(gpmc_cfg->gpio_irq); free1: gpmc_cs_free(gpmc_cfg->cs); printk(KERN_ERR "Could not initialize smc91x\n"); }