rendered paste body+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));