struct platform_device *__init at32_add_device_cf(unsigned int id, unsigned int extint, struct cf_platform_data *data) { struct platform_device *pdev; pdev = platform_device_alloc("at32_cf", id); if (!pdev) goto fail; if (platform_device_add_data(pdev, data, sizeof(struct cf_platform_data))) goto fail; if (at32_init_ide_or_cf(pdev, data->cs, extint)) goto fail; if (data->detect_pin != GPIO_PIN_NONE) at32_select_gpio(data->detect_pin, AT32_GPIOF_DEGLITCH); if (data->reset_pin != GPIO_PIN_NONE) at32_select_gpio(data->reset_pin, 0); if (data->vcc_pin != GPIO_PIN_NONE) at32_select_gpio(data->vcc_pin, 0); /* READY is used as extint, so we can't select it as gpio */ platform_device_add(pdev); return pdev; fail: platform_device_put(pdev); return NULL; }
static int __init merisc_init(void) { detect_merisc_board_id(); printk(KERN_NOTICE "BOARD: Merisc %s revision %s\n", merisc_model(), merisc_revision()); /* Reserve pins for SDRAM */ at32_reserve_pin(GPIO_PIOE_BASE, ATMEL_EBI_PE_DATA_ALL | (1 << 26)); if (merisc_board_id >= 1) at32_map_usart(2, 2, 0); at32_add_device_usart(0); at32_add_device_usart(1); if (merisc_board_id >= 1) at32_add_device_usart(2); at32_add_device_usart(3); set_hw_addr(at32_add_device_eth(0, ð_data[0])); /* ADS7846 PENIRQ */ if (merisc_board_id == 0) { ads7846_data.get_pendown_state = ads7846_get_pendown_state_PB26; at32_select_periph(GPIO_PIOB_BASE, 1 << 26, GPIO_PERIPH_A, AT32_GPIOF_PULLUP); spi0_board_info[0].irq = AT32_EXTINT(1); } else { ads7846_data.get_pendown_state = ads7846_get_pendown_state_PB28; at32_select_periph(GPIO_PIOB_BASE, 1 << 28, GPIO_PERIPH_A, AT32_GPIOF_PULLUP); spi0_board_info[0].irq = AT32_EXTINT(3); } /* ADS7846 busy pin */ at32_select_gpio(GPIO_PIN_PA(4), AT32_GPIOF_PULLUP); at32_add_device_spi(0, spi0_board_info, ARRAY_SIZE(spi0_board_info)); at32_add_device_mci(0, &mci0_data); #ifdef CONFIG_LEDS_ATMEL_PWM at32_add_device_pwm((1 << 0) | (1 << 2)); platform_device_register(&stk_pwm_led_dev); #else at32_add_device_pwm((1 << 2)); #endif at32_select_gpio(i2c_gpio_data.sda_pin, AT32_GPIOF_MULTIDRV | AT32_GPIOF_OUTPUT | AT32_GPIOF_HIGH); at32_select_gpio(i2c_gpio_data.scl_pin, AT32_GPIOF_MULTIDRV | AT32_GPIOF_OUTPUT | AT32_GPIOF_HIGH); platform_device_register(&i2c_gpio_device); i2c_register_board_info(0, i2c_info, ARRAY_SIZE(i2c_info)); return 0; }
static int __init hammerhead_init(void) { /* * Hammerhead uses 32-bit SDRAM interface. Reserve the * SDRAM-specific pins so that nobody messes with them. */ at32_reserve_pin(GPIO_PIOE_BASE, ATMEL_EBI_PE_DATA_ALL); at32_add_device_usart(0); /* Reserve PB29 (GCLK3). This pin is used as clock source * for ETH PHY (25MHz). GCLK3 setup is done by U-Boot. */ at32_reserve_pin(GPIO_PIOB_BASE, (1<<29)); /* * Hammerhead uses only one ethernet port, so we don't set * address of second port */ set_hw_addr(at32_add_device_eth(0, ð_data[0])); #ifdef CONFIG_BOARD_HAMMERHEAD_FPGA at32_add_device_hh_fpga(); #endif at32_add_device_mci(0, &mci0_data); #ifdef CONFIG_BOARD_HAMMERHEAD_USB at32_add_device_usba(0, NULL); #endif #ifdef CONFIG_BOARD_HAMMERHEAD_LCD at32_add_device_lcdc(0, &hammerhead_lcdc_data, fbmem_start, fbmem_size, ATMEL_LCDC_PRI_24BIT); #endif at32_select_gpio(i2c_gpio_data.sda_pin, AT32_GPIOF_MULTIDRV | AT32_GPIOF_OUTPUT | AT32_GPIOF_HIGH); at32_select_gpio(i2c_gpio_data.scl_pin, AT32_GPIOF_MULTIDRV | AT32_GPIOF_OUTPUT | AT32_GPIOF_HIGH); platform_device_register(&i2c_gpio_device); i2c_register_board_info(0, i2c_info, ARRAY_SIZE(i2c_info)); #ifdef CONFIG_BOARD_HAMMERHEAD_SND at32_add_device_ac97c(0, &ac97c_data, AC97C_BOTH); #endif /* Select the Touchscreen interrupt pin mode */ at32_select_periph(GPIO_PIOB_BASE, 0x08000000, GPIO_PERIPH_A, 0); return 0; }
static void detect_merisc_board_id(void) { /* Board ID pins MUST be set as input or the board may be damaged */ at32_select_gpio(GPIO_PIN_PA(24), AT32_GPIOF_PULLUP); at32_select_gpio(GPIO_PIN_PA(25), AT32_GPIOF_PULLUP); at32_select_gpio(GPIO_PIN_PA(26), AT32_GPIOF_PULLUP); at32_select_gpio(GPIO_PIN_PA(27), AT32_GPIOF_PULLUP); merisc_board_id = !gpio_get_value(GPIO_PIN_PA(24)) + !gpio_get_value(GPIO_PIN_PA(25)) * 2 + !gpio_get_value(GPIO_PIN_PA(26)) * 4 + !gpio_get_value(GPIO_PIN_PA(27)) * 8; }
void __init at32_spi_setup_slaves(unsigned int bus_num, struct spi_board_info *b, unsigned int n) { /* * Manage the chipselects as GPIOs, normally using the same pins * the SPI controller expects; but boards can use other pins. */ static u8 __initdata spi_pins[][4] = { { GPIO_PIN_PA(3), GPIO_PIN_PA(4), GPIO_PIN_PA(5), GPIO_PIN_PA(20) }, { GPIO_PIN_PB(2), GPIO_PIN_PB(3), GPIO_PIN_PB(4), GPIO_PIN_PA(27) }, }; unsigned int pin, mode; /* There are only 2 SPI controllers */ if (bus_num > 1) return; for (; n; n--, b++) { b->bus_num = bus_num; if (b->chip_select >= 4) continue; pin = (unsigned)b->controller_data; if (!pin) { pin = spi_pins[bus_num][b->chip_select]; b->controller_data = (void *)pin; } mode = AT32_GPIOF_OUTPUT; if (!(b->mode & SPI_CS_HIGH)) mode |= AT32_GPIOF_HIGH; at32_select_gpio(pin, mode); } }
static int __init atevklcd10x_init(void) { /* */ at32_select_gpio(GPIO_PIN_PB(15), AT32_GPIOF_OUTPUT); gpio_request(GPIO_PIN_PB(15), "backlight"); gpio_direction_output(GPIO_PIN_PB(15), 0); atevklcd10x_lcdc_data.atmel_lcdfb_power_control = atevklcd10x_lcdc_power_control; at32_add_device_lcdc(0, &atevklcd10x_lcdc_data, fbmem_start, fbmem_size, #ifdef CONFIG_BOARD_ATNGW100_MKII ATMEL_LCDC_PRI_18BIT | ATMEL_LCDC_PC_DVAL #else ATMEL_LCDC_ALT_18BIT | ATMEL_LCDC_PE_DVAL #endif ); at32_add_device_ac97c(0, &ac97c0_data, AC97C_BOTH); return 0; }
struct platform_device *__init at32_add_device_usba(unsigned int id, struct usba_platform_data *data) { struct platform_device *pdev; if (id != 0) return NULL; pdev = platform_device_alloc("atmel_usba_udc", 0); if (!pdev) return NULL; if (platform_device_add_resources(pdev, usba0_resource, ARRAY_SIZE(usba0_resource))) goto out_free_pdev; if (data) { if (platform_device_add_data(pdev, data, sizeof(*data))) goto out_free_pdev; if (data->vbus_pin != GPIO_PIN_NONE) at32_select_gpio(data->vbus_pin, 0); } usba0_pclk.dev = &pdev->dev; usba0_hclk.dev = &pdev->dev; platform_device_add(pdev); return pdev; out_free_pdev: platform_device_put(pdev); return NULL; }
static int __init mrmt1_early_init(void) { /* To maintain power-on signal in case boot loader did not already */ at32_select_gpio( PIN_PWR_ON, AT32_GPIOF_OUTPUT ); gpio_request( PIN_PWR_ON, "PIN_PWR_ON" ); gpio_direction_output( PIN_PWR_ON, 1 ); return 0; }
void __init atstk1000_setup_j2_leds(void) { unsigned i; for (i = 0; i < ARRAY_SIZE(stk1000_j2_led); i++) at32_select_gpio(stk1000_j2_led[i].gpio, AT32_GPIOF_OUTPUT); printk("STK1000: " LEDSTRING "\n"); platform_device_register(&stk1000_j2_led_dev); }
struct platform_device *__init at32_add_device_hh_fpga(void) { /* Select peripheral functionallity for SPI SCK and MOSI */ at32_select_periph(GPIO_PIOB_BASE, HAMMERHEAD_FPGA_PERIPH_SCK, GPIO_PERIPH_B, 0); at32_select_periph(GPIO_PIOB_BASE, HAMMERHEAD_FPGA_PERIPH_MOSI, GPIO_PERIPH_B, 0); /* reserve all other needed gpio * We have on board pull ups, so there is no need * to enable gpio pull ups */ /* INIT_DONE (input) */ at32_select_gpio(GPIO_PIN_PB(0), 0); /* nSTATUS (input) */ at32_select_gpio(GPIO_PIN_PB(2), 0); /* nCONFIG (output, low) */ at32_select_gpio(GPIO_PIN_PB(3), AT32_GPIOF_OUTPUT); /* CONF_DONE (input) */ at32_select_gpio(GPIO_PIN_PB(4), 0); /* Select EXTINT3 for PB28 (Interrupt from FPGA) */ at32_select_periph(GPIO_PIOB_BASE, HAMMERHEAD_FPGA_PERIPH_EXTINT3, GPIO_PERIPH_A, 0); /* Get our parent clock */ hh_fpga0_spi_clk.parent = clk_get(NULL, "pba"); clk_put(hh_fpga0_spi_clk.parent); /* Register clock in at32 clock tree */ at32_clk_register(&hh_fpga0_spi_clk); platform_device_register(&hh_fpga0_device); return &hh_fpga0_device; }
static int __init atevklcd10x_init(void) { /* PB15 is connected to the enable line on the boost regulator * controlling the backlight for the LCD panel. */ at32_select_gpio(GPIO_PIN_PB(15), AT32_GPIOF_OUTPUT); gpio_request(GPIO_PIN_PB(15), "backlight"); gpio_direction_output(GPIO_PIN_PB(15), 0); atevklcd10x_lcdc_data.atmel_lcdfb_power_control = atevklcd10x_lcdc_power_control; at32_add_device_lcdc(0, &atevklcd10x_lcdc_data, fbmem_start, fbmem_size, ATMEL_LCDC_ALT_18BIT | ATMEL_LCDC_PE_DVAL); at32_add_device_ac97c(0, &ac97c0_data, AC97C_BOTH); return 0; }
static void __init at32_spi_setup_slaves(unsigned int bus_num, struct spi_board_info *b, unsigned int n, const u8 *pins) { unsigned int pin, mode; for (; n; n--, b++) { b->bus_num = bus_num; if (b->chip_select >= 4) continue; pin = (unsigned)b->controller_data; if (!pin) { pin = pins[b->chip_select]; b->controller_data = (void *)pin; } mode = AT32_GPIOF_OUTPUT; if (!(b->mode & SPI_CS_HIGH)) mode |= AT32_GPIOF_HIGH; at32_select_gpio(pin, mode); } }
struct platform_device *__init at32_add_device_mci(unsigned int id, struct mci_platform_data *data) { struct platform_device *pdev; struct mci_dma_data *slave; u32 pioa_mask; u32 piob_mask; if (id != 0 || !data) return NULL; /* Must have at least one usable slot */ if (!data->slot[0].bus_width && !data->slot[1].bus_width) return NULL; pdev = platform_device_alloc("atmel_mci", id); if (!pdev) goto fail; if (platform_device_add_resources(pdev, atmel_mci0_resource, ARRAY_SIZE(atmel_mci0_resource))) goto fail; slave = kzalloc(sizeof(struct mci_dma_data), GFP_KERNEL); if (!slave) goto fail; slave->sdata.dma_dev = &dw_dmac0_device.dev; slave->sdata.cfg_hi = (DWC_CFGH_SRC_PER(0) | DWC_CFGH_DST_PER(1)); slave->sdata.cfg_lo &= ~(DWC_CFGL_HS_DST_POL | DWC_CFGL_HS_SRC_POL); data->dma_slave = slave; if (platform_device_add_data(pdev, data, sizeof(struct mci_platform_data))) goto fail_free; /* CLK line is common to both slots */ pioa_mask = 1 << 10; switch (data->slot[0].bus_width) { case 4: pioa_mask |= 1 << 13; /* DATA1 */ pioa_mask |= 1 << 14; /* DATA2 */ pioa_mask |= 1 << 15; /* DATA3 */ /* fall through */ case 1: pioa_mask |= 1 << 11; /* CMD */ pioa_mask |= 1 << 12; /* DATA0 */ if (gpio_is_valid(data->slot[0].detect_pin)) at32_select_gpio(data->slot[0].detect_pin, 0); if (gpio_is_valid(data->slot[0].wp_pin)) at32_select_gpio(data->slot[0].wp_pin, 0); break; case 0: /* Slot is unused */ break; default: goto fail_free; } select_peripheral(PIOA, pioa_mask, PERIPH_A, 0); piob_mask = 0; switch (data->slot[1].bus_width) { case 4: piob_mask |= 1 << 8; /* DATA1 */ piob_mask |= 1 << 9; /* DATA2 */ piob_mask |= 1 << 10; /* DATA3 */ /* fall through */ case 1: piob_mask |= 1 << 6; /* CMD */ piob_mask |= 1 << 7; /* DATA0 */ select_peripheral(PIOB, piob_mask, PERIPH_B, 0); if (gpio_is_valid(data->slot[1].detect_pin)) at32_select_gpio(data->slot[1].detect_pin, 0); if (gpio_is_valid(data->slot[1].wp_pin)) at32_select_gpio(data->slot[1].wp_pin, 0); break; case 0: /* Slot is unused */ break; default: if (!data->slot[0].bus_width)
static int __init mrmt1_init(void) { gpio_set_value( PIN_PWR_ON, 1 ); /* Ensure PWR_ON is enabled */ pm_power_off = mrmt_power_off; /* Setup USARTS (other than console) */ at32_map_usart(2, 1, 0); /* USART 2: /dev/ttyS1, RMT1:DB9M */ at32_map_usart(3, 2, ATMEL_USART_RTS | ATMEL_USART_CTS); /* USART 3: /dev/ttyS2, RMT1:Wireless, w/ RTS/CTS */ at32_add_device_usart(1); at32_add_device_usart(2); /* Select GPIO Key pins */ at32_select_gpio( PIN_PWR_SW_N, AT32_GPIOF_DEGLITCH); at32_select_gpio( PIN_PB_LEFT, AT32_GPIOF_DEGLITCH); at32_select_gpio( PIN_PB_RIGHT, AT32_GPIOF_DEGLITCH); platform_device_register(&rmt_gpio_keys); #ifdef CONFIG_BOARD_MRMT_RTC_I2C i2c_register_board_info(0, &mrmt1_i2c_rtc, 1); #endif #ifndef CONFIG_BOARD_MRMT_LCD_DISABLE /* User "alternate" LCDC inferface on Port E & D */ /* NB: exclude LCDC_CC pin, as NGW100 reserves it for other use */ at32_add_device_lcdc(0, &rmt_lcdc_data, fbmem_start, fbmem_size, (ATMEL_LCDC_ALT_24BIT | ATMEL_LCDC_PE_DVAL ) ); #endif #ifdef CONFIG_BOARD_MRMT_AC97 at32_add_device_ac97c(0, &ac97c0_data, AC97C_BOTH); #endif #ifdef CONFIG_BOARD_MRMT_ADS7846_TS /* Select the Touchscreen interrupt pin mode */ at32_select_periph( GPIO_PIOB_BASE, 1 << (PB_EXTINT_BASE+TS_IRQ), GPIO_PERIPH_A, AT32_GPIOF_DEGLITCH); irq_set_irq_type(AT32_EXTINT(TS_IRQ), IRQ_TYPE_EDGE_FALLING); at32_spi_setup_slaves(0,spi01_board_info,ARRAY_SIZE(spi01_board_info)); spi_register_board_info(spi01_board_info,ARRAY_SIZE(spi01_board_info)); #endif #ifdef CONFIG_BOARD_MRMT_UCB1400_TS /* Select the Touchscreen interrupt pin mode */ at32_select_periph( GPIO_PIOB_BASE, 1 << (PB_EXTINT_BASE+TS_IRQ), GPIO_PERIPH_A, AT32_GPIOF_DEGLITCH); platform_device_register(&rmt_ts_device); #endif at32_select_gpio( PIN_LCD_DISP, AT32_GPIOF_OUTPUT ); gpio_request( PIN_LCD_DISP, "LCD_DISP" ); gpio_direction_output( PIN_LCD_DISP, 0 ); /* LCD DISP */ #ifdef CONFIG_BOARD_MRMT_LCD_DISABLE /* Keep Backlight and DISP off */ at32_select_gpio( PIN_LCD_BL, AT32_GPIOF_OUTPUT ); gpio_request( PIN_LCD_BL, "LCD_BL" ); gpio_direction_output( PIN_LCD_BL, 0 ); /* Backlight */ #else gpio_set_value( PIN_LCD_DISP, 1 ); /* DISP asserted first */ #ifdef CONFIG_BOARD_MRMT_BL_PWM /* Use PWM for Backlight controls */ at32_add_device_pwm(1 << PWM_CH_BL); platform_device_register(&rmt_pwm_led_dev); #else /* Backlight always on */ udelay( 1 ); at32_select_gpio( PIN_LCD_BL, AT32_GPIOF_OUTPUT ); gpio_request( PIN_LCD_BL, "LCD_BL" ); gpio_direction_output( PIN_LCD_BL, 1 ); #endif #endif /* Make sure BT and Zigbee modules in reset */ at32_select_gpio( PIN_BT_RST, AT32_GPIOF_OUTPUT ); gpio_request( PIN_BT_RST, "BT_RST" ); gpio_direction_output( PIN_BT_RST, 1 ); /* BT Module in Reset */ at32_select_gpio( PIN_ZB_RST_N, AT32_GPIOF_OUTPUT ); gpio_request( PIN_ZB_RST_N, "ZB_RST_N" ); gpio_direction_output( PIN_ZB_RST_N, 0 ); /* XBee Module in Reset */ #ifdef CONFIG_BOARD_MRMT_WIRELESS_ZB udelay( 1000 ); /* Unreset the XBee Module */ gpio_set_value( PIN_ZB_RST_N, 1 ); #endif #ifdef CONFIG_BOARD_MRMT_WIRELESS_BT udelay( 1000 ); /* Unreset the BT Module */ gpio_set_value( PIN_BT_RST, 0 ); #endif return 0; }
static int __init hammerhead_usbh_init(void) { struct clk *gclk; struct clk *osc; int ret; /* setup smc for usbh */ smc_set_timing(&isp1160_config, &isp1160_timing); ret = smc_set_configuration(2, &isp1160_config); if (ret < 0) { printk(KERN_ERR "hammerhead: failed to set ISP1160 USBH timing\n"); return ret; } /* setup gclk0 to run from osc1 */ gclk = clk_get(NULL, "gclk0"); if (IS_ERR(gclk)) { ret = PTR_ERR(gclk); goto err_gclk; } osc = clk_get(NULL, "osc1"); if (IS_ERR(osc)) { ret = PTR_ERR(osc); goto err_osc; } ret = clk_set_parent(gclk, osc); if (ret < 0) { pr_debug("hammerhead: failed to set osc1 for USBH clock\n"); goto err_set_clk; } /* set clock to 6MHz */ clk_set_rate(gclk, 6000000); /* and enable */ clk_enable(gclk); /* select GCLK0 peripheral function */ at32_select_periph(GPIO_PIOA_BASE, HAMMERHEAD_USB_PERIPH_GCLK0, GPIO_PERIPH_A, 0); /* enable CS2 peripheral function */ at32_select_periph(GPIO_PIOE_BASE, HAMMERHEAD_USB_PERIPH_CS2, GPIO_PERIPH_A, 0); /* H_WAKEUP must be driven low */ at32_select_gpio(GPIO_PIN_PA(8), AT32_GPIOF_OUTPUT); /* Select EXTINT0 for PB25 */ at32_select_periph(GPIO_PIOB_BASE, HAMMERHEAD_USB_PERIPH_EXTINT0, GPIO_PERIPH_A, 0); /* register usbh device driver */ platform_device_register(&isp1160_device); err_set_clk: clk_put(osc); err_osc: clk_put(gclk); err_gclk: return ret; }