|
@@ -414,3 +414,54 @@ static struct resource cf1_resources[] = {
|
|
}
|
|
}
|
|
};
|
|
};
|
|
|
|
|
|
|
|
+static struct platform_device cf1_device = {
|
|
|
|
+ .id = 1,
|
|
|
|
+ .dev = {
|
|
|
|
+ .platform_data = &cf1_data,
|
|
|
|
+ },
|
|
|
|
+ .resource = cf1_resources,
|
|
|
|
+ .num_resources = ARRAY_SIZE(cf1_resources),
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+void __init at91_add_device_cf(struct at91_cf_data *data)
|
|
|
|
+{
|
|
|
|
+ unsigned long ebi0_csa;
|
|
|
|
+ struct platform_device *pdev;
|
|
|
|
+
|
|
|
|
+ if (!data)
|
|
|
|
+ return;
|
|
|
|
+
|
|
|
|
+ /*
|
|
|
|
+ * assign CS4 or CS5 to SMC with Compact Flash logic support,
|
|
|
|
+ * we assume SMC timings are configured by board code,
|
|
|
|
+ * except True IDE where timings are controlled by driver
|
|
|
|
+ */
|
|
|
|
+ ebi0_csa = at91_matrix_read(AT91_MATRIX_EBI0CSA);
|
|
|
|
+ switch (data->chipselect) {
|
|
|
|
+ case 4:
|
|
|
|
+ at91_set_A_periph(AT91_PIN_PD6, 0); /* EBI0_NCS4/CFCS0 */
|
|
|
|
+ ebi0_csa |= AT91_MATRIX_EBI0_CS4A_SMC_CF1;
|
|
|
|
+ cf0_data = *data;
|
|
|
|
+ pdev = &cf0_device;
|
|
|
|
+ break;
|
|
|
|
+ case 5:
|
|
|
|
+ at91_set_A_periph(AT91_PIN_PD7, 0); /* EBI0_NCS5/CFCS1 */
|
|
|
|
+ ebi0_csa |= AT91_MATRIX_EBI0_CS5A_SMC_CF2;
|
|
|
|
+ cf1_data = *data;
|
|
|
|
+ pdev = &cf1_device;
|
|
|
|
+ break;
|
|
|
|
+ default:
|
|
|
|
+ printk(KERN_ERR "AT91 CF: bad chip-select requested (%u)\n",
|
|
|
|
+ data->chipselect);
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ at91_matrix_write(AT91_MATRIX_EBI0CSA, ebi0_csa);
|
|
|
|
+
|
|
|
|
+ if (gpio_is_valid(data->det_pin)) {
|
|
|
|
+ at91_set_gpio_input(data->det_pin, 1);
|
|
|
|
+ at91_set_deglitch(data->det_pin, 1);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (gpio_is_valid(data->irq_pin)) {
|
|
|
|
+ at91_set_gpio_input(data->irq_pin, 1);
|
|
|
|
+ at91_set_deglitch(data->irq_pin, 1);
|