+static int mmc_slot_init(struct device *dev, + irqreturn_t (*handler)(int, void *), + void *data) +{ + struct spi_device *spi = to_spi_device(dev); + return request_irq(spi->irq, handler, + IRQF_TRIGGER_RISING + | IRQF_TRIGGER_FALLING + | IRQF_SAMPLE_RANDOM, + spi->dev.bus_id, data); +} + +static void mmc_slot_exit(struct device *dev, void *data) +{ + struct spi_device *spi = to_spi_device(dev); + + free_irq(spi->irq, data); +} + +static const struct mmc_spi_platform_data mmc_spi_data = { + .init = mmc_slot_init, + .exit = mmc_slot_exit, + .detect_delay = 700, /* msecs */ + //.get_ro = ..., + .ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34, +}; + + +static struct spi_board_info spi1_board_info[] __initdata = { + { + .modalias = "mmc_spi", + .max_speed_hz = 18000000, +// .max_speed_hz = MCK, + .platform_data = &mmc_spi_data, + /* .irq = ... set later (PB7) */ + .chip_select = 0, + }, +}; + @@ -163,9 +210,14 @@ static int __init atngw100_init(void) set_hw_addr(at32_add_device_eth(0, ð_data[0])); set_hw_addr(at32_add_device_eth(1, ð_data[1])); + at32_select_gpio(GPIO_PIN_PA(23), + AT32_GPIOF_DEGLITCH | AT32_GPIOF_PULLUP); + spi1_board_info[0].irq = gpio_to_irq(GPIO_PIN_PA(23)); + at32_add_device_spi(0, spi0_board_info, ARRAY_SIZE(spi0_board_info)); at32_add_device_mci(0, &mci0_data); at32_add_device_usba(0, NULL); + at32_add_device_spi(1, spi1_board_info, ARRAY_SIZE(spi1_board_info));