|
@@ -1892,3 +1892,131 @@ static int __init at32_init_ide_or_cf(struct platform_device *pdev,
|
|
|
struct platform_device *__init
|
|
|
at32_add_device_ide(unsigned int id, unsigned int extint,
|
|
|
struct ide_platform_data *data)
|
|
|
+{
|
|
|
+ struct platform_device *pdev;
|
|
|
+
|
|
|
+ pdev = platform_device_alloc("at32_ide", id);
|
|
|
+ if (!pdev)
|
|
|
+ goto fail;
|
|
|
+
|
|
|
+ if (platform_device_add_data(pdev, data,
|
|
|
+ sizeof(struct ide_platform_data)))
|
|
|
+ goto fail;
|
|
|
+
|
|
|
+ if (at32_init_ide_or_cf(pdev, data->cs, extint))
|
|
|
+ goto fail;
|
|
|
+
|
|
|
+ platform_device_add(pdev);
|
|
|
+ return pdev;
|
|
|
+
|
|
|
+fail:
|
|
|
+ platform_device_put(pdev);
|
|
|
+ return NULL;
|
|
|
+}
|
|
|
+
|
|
|
+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 (gpio_is_valid(data->detect_pin))
|
|
|
+ at32_select_gpio(data->detect_pin, AT32_GPIOF_DEGLITCH);
|
|
|
+ if (gpio_is_valid(data->reset_pin))
|
|
|
+ at32_select_gpio(data->reset_pin, 0);
|
|
|
+ if (gpio_is_valid(data->vcc_pin))
|
|
|
+ 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;
|
|
|
+}
|
|
|
+#endif
|
|
|
+
|
|
|
+/* --------------------------------------------------------------------
|
|
|
+ * NAND Flash / SmartMedia
|
|
|
+ * -------------------------------------------------------------------- */
|
|
|
+static struct resource smc_cs3_resource[] __initdata = {
|
|
|
+ {
|
|
|
+ .start = 0x0c000000,
|
|
|
+ .end = 0x0fffffff,
|
|
|
+ .flags = IORESOURCE_MEM,
|
|
|
+ }, {
|
|
|
+ .start = 0xfff03c00,
|
|
|
+ .end = 0xfff03fff,
|
|
|
+ .flags = IORESOURCE_MEM,
|
|
|
+ },
|
|
|
+};
|
|
|
+
|
|
|
+struct platform_device *__init
|
|
|
+at32_add_device_nand(unsigned int id, struct atmel_nand_data *data)
|
|
|
+{
|
|
|
+ struct platform_device *pdev;
|
|
|
+
|
|
|
+ if (id != 0 || !data)
|
|
|
+ return NULL;
|
|
|
+
|
|
|
+ pdev = platform_device_alloc("atmel_nand", id);
|
|
|
+ if (!pdev)
|
|
|
+ goto fail;
|
|
|
+
|
|
|
+ if (platform_device_add_resources(pdev, smc_cs3_resource,
|
|
|
+ ARRAY_SIZE(smc_cs3_resource)))
|
|
|
+ goto fail;
|
|
|
+
|
|
|
+ if (platform_device_add_data(pdev, data,
|
|
|
+ sizeof(struct atmel_nand_data)))
|
|
|
+ goto fail;
|
|
|
+
|
|
|
+ hmatrix_sfr_set_bits(HMATRIX_SLAVE_EBI, HMATRIX_EBI_NAND_ENABLE);
|
|
|
+ if (data->enable_pin)
|
|
|
+ at32_select_gpio(data->enable_pin,
|
|
|
+ AT32_GPIOF_OUTPUT | AT32_GPIOF_HIGH);
|
|
|
+ if (data->rdy_pin)
|
|
|
+ at32_select_gpio(data->rdy_pin, 0);
|
|
|
+ if (data->det_pin)
|
|
|
+ at32_select_gpio(data->det_pin, 0);
|
|
|
+
|
|
|
+ platform_device_add(pdev);
|
|
|
+ return pdev;
|
|
|
+
|
|
|
+fail:
|
|
|
+ platform_device_put(pdev);
|
|
|
+ return NULL;
|
|
|
+}
|
|
|
+
|
|
|
+/* --------------------------------------------------------------------
|
|
|
+ * AC97C
|
|
|
+ * -------------------------------------------------------------------- */
|
|
|
+static struct resource atmel_ac97c0_resource[] __initdata = {
|
|
|
+ PBMEM(0xfff02800),
|
|
|
+ IRQ(29),
|
|
|
+};
|
|
|
+static struct clk atmel_ac97c0_pclk = {
|
|
|
+ .name = "pclk",
|
|
|
+ .parent = &pbb_clk,
|
|
|
+ .mode = pbb_clk_mode,
|
|
|
+ .get_rate = pbb_clk_get_rate,
|
|
|
+ .index = 10,
|
|
|
+};
|
|
|
+
|
|
|
+struct platform_device *__init
|
|
|
+at32_add_device_ac97c(unsigned int id, struct ac97c_platform_data *data,
|
|
|
+ unsigned int flags)
|
|
|
+{
|
|
|
+ struct platform_device *pdev;
|