void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data) { if (!data) return; /* input/irq */ if (data->det_pin) { at91_set_gpio_input(data->det_pin, 1); at91_set_deglitch(data->det_pin, 1); } if (data->wp_pin) at91_set_gpio_input(data->wp_pin, 1); if (data->vcc_pin) at91_set_gpio_output(data->vcc_pin, 0); /* CLK */ at91_set_A_periph(AT91_PIN_PA27, 0); if (data->slot_b) { /* CMD */ at91_set_B_periph(AT91_PIN_PA8, 1); /* DAT0, maybe DAT1..DAT3 */ at91_set_B_periph(AT91_PIN_PA9, 1); if (data->wire4) { at91_set_B_periph(AT91_PIN_PA10, 1); at91_set_B_periph(AT91_PIN_PA11, 1); at91_set_B_periph(AT91_PIN_PA12, 1); } } else { /* CMD */ at91_set_A_periph(AT91_PIN_PA28, 1); /* DAT0, maybe DAT1..DAT3 */ at91_set_A_periph(AT91_PIN_PA29, 1); if (data->wire4) { at91_set_B_periph(AT91_PIN_PB3, 1); at91_set_B_periph(AT91_PIN_PB4, 1); at91_set_B_periph(AT91_PIN_PB5, 1); } } mmc_data = *data; platform_device_register(&at91rm9200_mmc_device); }
void __init at91_add_device_eth(struct at91_eth_data *data) { if (!data) return; if (data->phy_irq_pin) { at91_set_gpio_direction(data->phy_irq_pin, 1, 0); at91_set_deglitch(data->phy_irq_pin, 1); } if (data->is_rmii) AT91_CfgPIO_EMAC_RMII(); else AT91_CfgPIO_EMAC_MII(); eth_data = *data; platform_device_register(&at91rm9200_eth_device); }
void __init at91_add_device_udc(struct at91_udc_data *data) { unsigned long x; if (!data) return; if (data->vbus_pin) { at91_set_gpio_input(data->vbus_pin, 0); at91_set_deglitch(data->vbus_pin, 1); } /* Pullup pin is handled internally */ x = at91_sys_read(AT91_MATRIX_USBPUCR); at91_sys_write(AT91_MATRIX_USBPUCR, x | AT91_MATRIX_USBPUCR_PUON); udc_data = *data; platform_device_register(&at91sam9261_udc_device); }
void __init at91_add_device_usba(struct usba_platform_data *data) { usba_udc_data.pdata.vbus_pin = -EINVAL; usba_udc_data.pdata.num_ep = ARRAY_SIZE(usba_udc_ep); memcpy(usba_udc_data.ep, usba_udc_ep, sizeof(usba_udc_ep));; if (data && data->vbus_pin > 0) { at91_set_gpio_input(data->vbus_pin, 0); at91_set_deglitch(data->vbus_pin, 1); usba_udc_data.pdata.vbus_pin = data->vbus_pin; } /* Pullup pin is handled internally by USB device peripheral */ /* Clocks */ at91_clock_associate("utmi_clk", &at91_usba_udc_device.dev, "hclk"); at91_clock_associate("udphs_clk", &at91_usba_udc_device.dev, "pclk"); platform_device_register(&at91_usba_udc_device); }
static void rdac_init_int(struct keypad_data_s *k) { struct rdac_ic *ic = k->private_data; unsigned long flags; u8 tmp; at91_set_B_periph(AT91_PIN_PC15, 0); at91_set_deglitch(AT91_PIN_PC15, 0); spin_lock_irqsave(&ic->lock, flags); ic->num_registered++; /* trigger on falling edge */ tmp = ioread8(ic->icr) | RDAC_IC_KEYPAD_TRIGGER_FALLING; iowrite8(tmp, ic->icr); iowrite8(RDAC_IC_KEYPAD, ic->isr); tmp = ioread8(ic->ier) | RDAC_IC_KEYPAD; iowrite8(tmp, ic->ier); spin_unlock_irqrestore(&ic->lock, flags); }
void __init at91_add_device_usba(struct usba_platform_data *data) { /* * Invalid pins are 0 on AT91, but the usba driver is shared * with AVR32, which use negative values instead. Once/if * gpio_is_valid() is ported to AT91, revisit this code. */ usba_udc_data.pdata.vbus_pin = -EINVAL; usba_udc_data.pdata.num_ep = ARRAY_SIZE(usba_udc_ep); memcpy(usba_udc_data.ep, usba_udc_ep, sizeof(usba_udc_ep)); if (data && gpio_is_valid(data->vbus_pin)) { at91_set_gpio_input(data->vbus_pin, 0); at91_set_deglitch(data->vbus_pin, 1); usba_udc_data.pdata.vbus_pin = data->vbus_pin; } /* Pullup pin is handled internally by USB device peripheral */ platform_device_register(&at91_usba_udc_device); }
void __init at91_add_device_usba(struct usba_platform_data *data) { /* */ usba_udc_data.pdata.vbus_pin = -EINVAL; usba_udc_data.pdata.num_ep = ARRAY_SIZE(usba_udc_ep); memcpy(usba_udc_data.ep, usba_udc_ep, sizeof(usba_udc_ep)); if (data && gpio_is_valid(data->vbus_pin)) { at91_set_gpio_input(data->vbus_pin, 0); at91_set_deglitch(data->vbus_pin, 1); usba_udc_data.pdata.vbus_pin = data->vbus_pin; } /* */ platform_device_register(&at91_usba_udc_device); }
void __init at91_add_device_mmc(struct at91_mmc_data *data) { /* input/irq */ if (data->det_pin) { at91_set_gpio_direction(data->det_pin, 1, 1); at91_set_deglitch(data->det_pin, 1); } if (data->wp_pin) at91_set_gpio_direction(data->wp_pin, 1, 1); /* CLK */ at91_set_A_periph(AT91_PIN_PA27, 0); if (data->is_b) { /* CMD */ at91_set_B_periph(AT91_PIN_PA8, 0); /* DAT0, maybe DAT1..DAT3 */ at91_set_B_periph(AT91_PIN_PA9, 0); if (data->wire4) { at91_set_B_periph(AT91_PIN_PA10, 0); at91_set_B_periph(AT91_PIN_PA11, 0); at91_set_B_periph(AT91_PIN_PA12, 0); } } else { /* CMD */ at91_set_A_periph(AT91_PIN_PA28, 0); /* DAT0, maybe DAT1..DAT3 */ at91_set_A_periph(AT91_PIN_PA29, 0); if (data->wire4) { at91_set_B_periph(AT91_PIN_PB3, 0); at91_set_B_periph(AT91_PIN_PB4, 0); at91_set_B_periph(AT91_PIN_PB5, 0); } } mmc_data = *data; platform_device_register(&at91rm9200_mmc_device); }
/* Consider only one slot : slot 0 */ void at91_add_device_mci(short mmc_id, struct atmel_mci_platform_data *data) { struct device_d *dev; if (!data) return; /* need bus_width */ if (!data->bus_width) return; /* input/irq */ if (gpio_is_valid(data->detect_pin)) { at91_set_gpio_input(data->detect_pin, 1); at91_set_deglitch(data->detect_pin, 1); } if (gpio_is_valid(data->wp_pin)) at91_set_gpio_input(data->wp_pin, 1); /* CLK */ at91_set_B_periph(AT91_PIN_PA2, 0); /* CMD */ at91_set_B_periph(AT91_PIN_PA1, 1); /* DAT0, maybe DAT1..DAT3 */ at91_set_B_periph(AT91_PIN_PA0, 1); if (data->bus_width == 4) { at91_set_B_periph(AT91_PIN_PA4, 1); at91_set_B_periph(AT91_PIN_PA5, 1); at91_set_B_periph(AT91_PIN_PA6, 1); } dev = add_generic_device("atmel_mci", 0, NULL, AT91SAM9261_BASE_MCI, SZ_16K, IORESOURCE_MEM, data); }
void __init at91_add_device_eth(struct macb_platform_data *data) { if (!data) return; if (gpio_is_valid(data->phy_irq_pin)) { at91_set_gpio_input(data->phy_irq_pin, 0); at91_set_deglitch(data->phy_irq_pin, 1); } /* */ at91_set_A_periph(AT91_PIN_PA19, 0); /* */ at91_set_A_periph(AT91_PIN_PA17, 0); /* */ at91_set_A_periph(AT91_PIN_PA14, 0); /* */ at91_set_A_periph(AT91_PIN_PA15, 0); /* */ at91_set_A_periph(AT91_PIN_PA18, 0); /* */ at91_set_A_periph(AT91_PIN_PA16, 0); /* */ at91_set_A_periph(AT91_PIN_PA12, 0); /* */ at91_set_A_periph(AT91_PIN_PA13, 0); /* */ at91_set_A_periph(AT91_PIN_PA21, 0); /* */ at91_set_A_periph(AT91_PIN_PA20, 0); /* */ if (!data->is_rmii) { at91_set_B_periph(AT91_PIN_PA28, 0); /* */ at91_set_B_periph(AT91_PIN_PA29, 0); /* */ at91_set_B_periph(AT91_PIN_PA25, 0); /* */ at91_set_B_periph(AT91_PIN_PA26, 0); /* */ at91_set_B_periph(AT91_PIN_PA27, 0); /* */ at91_set_B_periph(AT91_PIN_PA23, 0); /* */ at91_set_B_periph(AT91_PIN_PA24, 0); /* */ at91_set_B_periph(AT91_PIN_PA22, 0); /* */ } eth_data = *data; platform_device_register(&at91sam9260_eth_device); }
void __init at91_add_device_eth(struct macb_platform_data *data) { if (!data) return; if (gpio_is_valid(data->phy_irq_pin)) { at91_set_gpio_input(data->phy_irq_pin, 0); at91_set_deglitch(data->phy_irq_pin, 1); } /* Pins used for MII and RMII */ at91_set_A_periph(AT91_PIN_PE21, 0); /* ETXCK_EREFCK */ at91_set_B_periph(AT91_PIN_PC25, 0); /* ERXDV */ at91_set_A_periph(AT91_PIN_PE25, 0); /* ERX0 */ at91_set_A_periph(AT91_PIN_PE26, 0); /* ERX1 */ at91_set_A_periph(AT91_PIN_PE27, 0); /* ERXER */ at91_set_A_periph(AT91_PIN_PE28, 0); /* ETXEN */ at91_set_A_periph(AT91_PIN_PE23, 0); /* ETX0 */ at91_set_A_periph(AT91_PIN_PE24, 0); /* ETX1 */ at91_set_A_periph(AT91_PIN_PE30, 0); /* EMDIO */ at91_set_A_periph(AT91_PIN_PE29, 0); /* EMDC */ if (!data->is_rmii) { at91_set_A_periph(AT91_PIN_PE22, 0); /* ECRS */ at91_set_B_periph(AT91_PIN_PC26, 0); /* ECOL */ at91_set_B_periph(AT91_PIN_PC22, 0); /* ERX2 */ at91_set_B_periph(AT91_PIN_PC23, 0); /* ERX3 */ at91_set_B_periph(AT91_PIN_PC27, 0); /* ERXCK */ at91_set_B_periph(AT91_PIN_PC20, 0); /* ETX2 */ at91_set_B_periph(AT91_PIN_PC21, 0); /* ETX3 */ at91_set_B_periph(AT91_PIN_PC24, 0); /* ETXER */ } eth_data = *data; platform_device_register(&at91sam9263_eth_device); }
void __init at91_add_device_eth(struct macb_platform_data *data) { if (!data) return; if (gpio_is_valid(data->phy_irq_pin)) { at91_set_gpio_input(data->phy_irq_pin, 0); at91_set_deglitch(data->phy_irq_pin, 1); } /* Pins used for MII and RMII */ at91_set_A_periph(AT91_PIN_PA16, 0); /* EMDIO */ at91_set_A_periph(AT91_PIN_PA15, 0); /* EMDC */ at91_set_A_periph(AT91_PIN_PA14, 0); /* ERXER */ at91_set_A_periph(AT91_PIN_PA13, 0); /* ERX1 */ at91_set_A_periph(AT91_PIN_PA12, 0); /* ERX0 */ at91_set_A_periph(AT91_PIN_PA11, 0); /* ECRS_ECRSDV */ at91_set_A_periph(AT91_PIN_PA10, 0); /* ETX1 */ at91_set_A_periph(AT91_PIN_PA9, 0); /* ETX0 */ at91_set_A_periph(AT91_PIN_PA8, 0); /* ETXEN */ at91_set_A_periph(AT91_PIN_PA7, 0); /* ETXCK_EREFCK */ if (!data->is_rmii) { at91_set_B_periph(AT91_PIN_PB19, 0); /* ERXCK */ at91_set_B_periph(AT91_PIN_PB18, 0); /* ECOL */ at91_set_B_periph(AT91_PIN_PB17, 0); /* ERXDV */ at91_set_B_periph(AT91_PIN_PB16, 0); /* ERX3 */ at91_set_B_periph(AT91_PIN_PB15, 0); /* ERX2 */ at91_set_B_periph(AT91_PIN_PB14, 0); /* ETXER */ at91_set_B_periph(AT91_PIN_PB13, 0); /* ETX3 */ at91_set_B_periph(AT91_PIN_PB12, 0); /* ETX2 */ } eth_data = *data; platform_device_register(&at91rm9200_eth_device); }
void __init at91_add_device_eth(struct macb_platform_data *data) { if (!data) return; if (gpio_is_valid(data->phy_irq_pin)) { at91_set_gpio_input(data->phy_irq_pin, 0); at91_set_deglitch(data->phy_irq_pin, 1); } at91_set_A_periph(AT91_PIN_PE21, 0); at91_set_B_periph(AT91_PIN_PC25, 0); at91_set_A_periph(AT91_PIN_PE25, 0); at91_set_A_periph(AT91_PIN_PE26, 0); at91_set_A_periph(AT91_PIN_PE27, 0); at91_set_A_periph(AT91_PIN_PE28, 0); at91_set_A_periph(AT91_PIN_PE23, 0); at91_set_A_periph(AT91_PIN_PE24, 0); at91_set_A_periph(AT91_PIN_PE30, 0); at91_set_A_periph(AT91_PIN_PE29, 0); if (!data->is_rmii) { at91_set_A_periph(AT91_PIN_PE22, 0); at91_set_B_periph(AT91_PIN_PC26, 0); at91_set_B_periph(AT91_PIN_PC22, 0); at91_set_B_periph(AT91_PIN_PC23, 0); at91_set_B_periph(AT91_PIN_PC27, 0); at91_set_B_periph(AT91_PIN_PC20, 0); at91_set_B_periph(AT91_PIN_PC21, 0); at91_set_B_periph(AT91_PIN_PC24, 0); } eth_data = *data; platform_device_register(&at91sam9263_eth_device); }
void __init at91_add_device_eth(struct at91_eth_data *data) { if (!data) return; if (data->phy_irq_pin) { at91_set_gpio_input(data->phy_irq_pin, 0); at91_set_deglitch(data->phy_irq_pin, 1); } /* Pins used for MII and RMII */ at91_set_A_periph(AT91_PIN_PA19, 0); /* ETXCK_EREFCK */ at91_set_A_periph(AT91_PIN_PA17, 0); /* ERXDV */ at91_set_A_periph(AT91_PIN_PA14, 0); /* ERX0 */ at91_set_A_periph(AT91_PIN_PA15, 0); /* ERX1 */ at91_set_A_periph(AT91_PIN_PA18, 0); /* ERXER */ at91_set_A_periph(AT91_PIN_PA16, 0); /* ETXEN */ at91_set_A_periph(AT91_PIN_PA12, 0); /* ETX0 */ at91_set_A_periph(AT91_PIN_PA13, 0); /* ETX1 */ at91_set_A_periph(AT91_PIN_PA21, 0); /* EMDIO */ at91_set_A_periph(AT91_PIN_PA20, 0); /* EMDC */ if (!data->is_rmii) { at91_set_B_periph(AT91_PIN_PA28, 0); /* ECRS */ at91_set_B_periph(AT91_PIN_PA29, 0); /* ECOL */ at91_set_B_periph(AT91_PIN_PA25, 0); /* ERX2 */ at91_set_B_periph(AT91_PIN_PA26, 0); /* ERX3 */ at91_set_B_periph(AT91_PIN_PA27, 0); /* ERXCK */ at91_set_B_periph(AT91_PIN_PA23, 0); /* ETX2 */ at91_set_B_periph(AT91_PIN_PA24, 0); /* ETX3 */ at91_set_B_periph(AT91_PIN_PA22, 0); /* ETXER */ } eth_data = *data; platform_device_register(&at91sam9260_eth_device); }
/* Consider only one slot : slot 0 */ void __init at91_add_device_mci(short mmc_id, struct atmel_mci_platform_data *data) { resource_size_t start = ~0; if (!data) return; /* Must have at least one usable slot */ if (!data->bus_width) return; /* input/irq */ if (gpio_is_valid(data->detect_pin)) { at91_set_gpio_input(data->detect_pin, 1); at91_set_deglitch(data->detect_pin, 1); } if (gpio_is_valid(data->wp_pin)) at91_set_gpio_input(data->wp_pin, 1); switch (mmc_id) { case 0: /* MCI0 */ start = SAMA5D3_BASE_HSMCI0; /* CLK */ at91_set_A_periph(AT91_PIN_PD9, 0); /* CMD */ at91_set_A_periph(AT91_PIN_PD0, 1); /* DAT0, maybe DAT1..DAT3 */ at91_set_A_periph(AT91_PIN_PD1, 1); switch (data->bus_width) { case 8: at91_set_A_periph(AT91_PIN_PD5, 1); at91_set_A_periph(AT91_PIN_PD6, 1); at91_set_A_periph(AT91_PIN_PD7, 1); at91_set_A_periph(AT91_PIN_PD8, 1); case 4: at91_set_A_periph(AT91_PIN_PD2, 1); at91_set_A_periph(AT91_PIN_PD3, 1); at91_set_A_periph(AT91_PIN_PD4, 1); }; break; case 1: /* MCI1 */ start = SAMA5D3_BASE_HSMCI1; /* CLK */ at91_set_A_periph(AT91_PIN_PB24, 0); /* CMD */ at91_set_A_periph(AT91_PIN_PB19, 1); /* DAT0, maybe DAT1..DAT3 */ at91_set_A_periph(AT91_PIN_PB20, 1); if (data->bus_width == 4) { at91_set_A_periph(AT91_PIN_PB21, 1); at91_set_A_periph(AT91_PIN_PB22, 1); at91_set_A_periph(AT91_PIN_PB23, 1); } break; case 2: /* MCI2 */ start = SAMA5D3_BASE_HSMCI2; /* CLK */ at91_set_A_periph(AT91_PIN_PC15, 0); /* CMD */ at91_set_A_periph(AT91_PIN_PC10, 1); /* DAT0, maybe DAT1..DAT3 */ at91_set_A_periph(AT91_PIN_PC11, 1); if (data->bus_width == 4) { at91_set_A_periph(AT91_PIN_PC12, 1); at91_set_A_periph(AT91_PIN_PC13, 1); at91_set_A_periph(AT91_PIN_PC14, 1); } } add_generic_device("atmel_mci", mmc_id, NULL, start, SZ_16K, IORESOURCE_MEM, data); }
static void som150_init_int(struct keypad_data_s *k) { at91_set_B_periph(AT91_PIN_PC15, 0); at91_set_deglitch(AT91_PIN_PC15, 0); }
void __init at91_add_device_cf(struct at91_cf_data *data) { struct platform_device *pdev; unsigned long csa; if (!data) return; csa = at91_sys_read(AT91_MATRIX_EBICSA); switch (data->chipselect) { case 4: at91_set_multi_drive(AT91_PIN_PC8, 0); at91_set_A_periph(AT91_PIN_PC8, 0); csa |= AT91_MATRIX_CS4A_SMC_CF1; cf0_data = *data; pdev = &cf0_device; break; case 5: at91_set_multi_drive(AT91_PIN_PC9, 0); at91_set_A_periph(AT91_PIN_PC9, 0); csa |= AT91_MATRIX_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_sys_write(AT91_MATRIX_EBICSA, csa); if (data->rst_pin) { at91_set_multi_drive(data->rst_pin, 0); at91_set_gpio_output(data->rst_pin, 1); } if (data->irq_pin) { at91_set_gpio_input(data->irq_pin, 0); at91_set_deglitch(data->irq_pin, 1); } if (data->det_pin) { at91_set_gpio_input(data->det_pin, 0); at91_set_deglitch(data->det_pin, 1); } at91_set_B_periph(AT91_PIN_PC6, 0); /* CFCE1 */ at91_set_B_periph(AT91_PIN_PC7, 0); /* CFCE2 */ at91_set_A_periph(AT91_PIN_PC10, 0); /* CFRNW */ at91_set_A_periph(AT91_PIN_PC15, 1); /* NWAIT */ if (data->flags & AT91_CF_TRUE_IDE) #if defined(CONFIG_PATA_AT91) || defined(CONFIG_PATA_AT91_MODULE) pdev->name = "pata_at91"; #elif defined(CONFIG_BLK_DEV_IDE_AT91) || defined(CONFIG_BLK_DEV_IDE_AT91_MODULE) pdev->name = "at91_ide"; #else #warning "board requires AT91_CF_TRUE_IDE: enable either at91_ide or pata_at91" #endif else
static void ek_add_device_i2c(void) { at91_set_gpio_input(qt1070_pdata.irq_pin, 0); at91_set_deglitch(qt1070_pdata.irq_pin, 1); at91_add_device_i2c(0, i2c_devices, ARRAY_SIZE(i2c_devices)); }
void __init at91_add_device_mci(short mmc_id, struct atmel_mci_platform_data *data) { resource_size_t start = ~0; if (!data) return; /* Must have at least one usable slot */ if (!data->bus_width) return; /* input/irq */ if (gpio_is_valid(data->detect_pin)) { at91_set_gpio_input(data->detect_pin, 1); at91_set_deglitch(data->detect_pin, 1); } if (gpio_is_valid(data->wp_pin)) at91_set_gpio_input(data->wp_pin, 1); switch (mmc_id) { /* MCI0 */ case 0: start = SAMA5D4_BASE_HSMCI0; /* CLK */ at91_set_B_periph(AT91_PIN_PC4, 0); /* CMD */ at91_set_B_periph(AT91_PIN_PC5, 1); /* DAT0, maybe DAT1..DAT3 */ at91_set_B_periph(AT91_PIN_PC6, 1); switch (data->bus_width) { case 8: at91_set_B_periph(AT91_PIN_PC10, 1); at91_set_B_periph(AT91_PIN_PC11, 1); at91_set_B_periph(AT91_PIN_PC12, 1); at91_set_B_periph(AT91_PIN_PC13, 1); case 4: at91_set_B_periph(AT91_PIN_PC7, 1); at91_set_B_periph(AT91_PIN_PC8, 1); at91_set_B_periph(AT91_PIN_PC9, 1); }; break; /* MCI1 */ case 1: start = SAMA5D4_BASE_HSMCI1; /* * As the mci1 io internal pull down is to strong, * which cause external pull up doesn't work, so, * disable internal pull down. */ /* CLK */ at91_set_C_periph(AT91_PIN_PE18, 0); at91_set_pulldown(AT91_PIN_PE18, 0); /* CMD */ at91_set_C_periph(AT91_PIN_PE19, 1); at91_set_pulldown(AT91_PIN_PE19, 0); /* DAT0, maybe DAT1..DAT3 */ at91_set_C_periph(AT91_PIN_PE20, 1); at91_set_pulldown(AT91_PIN_PE20, 0); if (data->bus_width == 4) { at91_set_C_periph(AT91_PIN_PE21, 1); at91_set_pulldown(AT91_PIN_PE21, 0); at91_set_C_periph(AT91_PIN_PE22, 1); at91_set_pulldown(AT91_PIN_PE22, 0); at91_set_C_periph(AT91_PIN_PE23, 1); at91_set_pulldown(AT91_PIN_PE23, 0); } break; } add_generic_device("atmel_mci", mmc_id, NULL, start, SZ_16K, IORESOURCE_MEM, data); }
/* Consider only one slot : slot 0 */ void at91_add_device_mci(short mmc_id, struct atmel_mci_platform_data *data) { resource_size_t start; if (!data) return; /* need bus_width */ if (!data->bus_width) return; /* input/irq */ if (data->detect_pin) { at91_set_gpio_input(data->detect_pin, 1); at91_set_deglitch(data->detect_pin, 1); } if (data->wp_pin) at91_set_gpio_input(data->wp_pin, 1); if (mmc_id == 0) { /* MCI0 */ start = AT91SAM9G45_BASE_MCI0; /* CLK */ at91_set_A_periph(AT91_PIN_PA0, 0); /* CMD */ at91_set_A_periph(AT91_PIN_PA1, 1); /* DAT0, maybe DAT1..DAT3 and maybe DAT4..DAT7 */ at91_set_A_periph(AT91_PIN_PA2, 1); if (data->bus_width >= 4) { at91_set_A_periph(AT91_PIN_PA3, 1); at91_set_A_periph(AT91_PIN_PA4, 1); at91_set_A_periph(AT91_PIN_PA5, 1); if (data->bus_width == 8) { at91_set_A_periph(AT91_PIN_PA6, 1); at91_set_A_periph(AT91_PIN_PA7, 1); at91_set_A_periph(AT91_PIN_PA8, 1); at91_set_A_periph(AT91_PIN_PA9, 1); } } } else { /* MCI1 */ data->slot_b = 1; start = AT91SAM9G45_BASE_MCI1; /* CLK */ at91_set_A_periph(AT91_PIN_PA31, 0); /* CMD */ at91_set_A_periph(AT91_PIN_PA22, 1); /* DAT0, maybe DAT1..DAT3 and maybe DAT4..DAT7 */ at91_set_A_periph(AT91_PIN_PA23, 1); if (data->bus_width >= 4) { at91_set_A_periph(AT91_PIN_PA24, 1); at91_set_A_periph(AT91_PIN_PA25, 1); at91_set_A_periph(AT91_PIN_PA26, 1); if (data->bus_width == 8) { at91_set_A_periph(AT91_PIN_PA27, 1); at91_set_A_periph(AT91_PIN_PA28, 1); at91_set_A_periph(AT91_PIN_PA29, 1); at91_set_A_periph(AT91_PIN_PA30, 1); } } } add_generic_device("atmel_mci", mmc_id, NULL, start, 4096, IORESOURCE_MEM, data); }
void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data) { if (!data) return; /* input/irq */ if (data->det_pin) { at91_set_gpio_input(data->det_pin, 1); at91_set_deglitch(data->det_pin, 1); } if (data->wp_pin) at91_set_gpio_input(data->wp_pin, 1); if (data->vcc_pin) at91_set_gpio_output(data->vcc_pin, 0); if (mmc_id == 0) { /* MCI0 */ /* CLK */ at91_set_A_periph(AT91_PIN_PA12, 0); if (data->slot_b) { /* CMD */ at91_set_A_periph(AT91_PIN_PA16, 1); /* DAT0, maybe DAT1..DAT3 */ at91_set_A_periph(AT91_PIN_PA17, 1); if (data->wire4) { at91_set_A_periph(AT91_PIN_PA18, 1); at91_set_A_periph(AT91_PIN_PA19, 1); at91_set_A_periph(AT91_PIN_PA20, 1); } } else { /* CMD */ at91_set_A_periph(AT91_PIN_PA1, 1); /* DAT0, maybe DAT1..DAT3 */ at91_set_A_periph(AT91_PIN_PA0, 1); if (data->wire4) { at91_set_A_periph(AT91_PIN_PA3, 1); at91_set_A_periph(AT91_PIN_PA4, 1); at91_set_A_periph(AT91_PIN_PA5, 1); } } mmc0_data = *data; platform_device_register(&at91sam9263_mmc0_device); } else { /* MCI1 */ /* CLK */ at91_set_A_periph(AT91_PIN_PA6, 0); if (data->slot_b) { /* CMD */ at91_set_A_periph(AT91_PIN_PA21, 1); /* DAT0, maybe DAT1..DAT3 */ at91_set_A_periph(AT91_PIN_PA22, 1); if (data->wire4) { at91_set_A_periph(AT91_PIN_PA23, 1); at91_set_A_periph(AT91_PIN_PA24, 1); at91_set_A_periph(AT91_PIN_PA25, 1); } } else { /* CMD */ at91_set_A_periph(AT91_PIN_PA7, 1); /* DAT0, maybe DAT1..DAT3 */ at91_set_A_periph(AT91_PIN_PA8, 1); if (data->wire4) { at91_set_A_periph(AT91_PIN_PA9, 1); at91_set_A_periph(AT91_PIN_PA10, 1); at91_set_A_periph(AT91_PIN_PA11, 1); } } mmc1_data = *data; platform_device_register(&at91sam9263_mmc1_device); } }
static void __init ek_add_device_buttons(void) { at91_set_gpio_input(AT91_PIN_PB3, 1); at91_set_deglitch(AT91_PIN_PB3, 1); export_env_ull("dfu_button", AT91_PIN_PB3); }
static int __init keypad_init(void) { int result; dev_t devno; at91_set_gpio_input(RESTORE_KEY, 0); /*Remove the first interrupt when insmod*/ at91_set_deglitch(RESTORE_KEY, 1); if (request_irq (RESTORE_KEY, keypad_handler, 0, "Keypad", NULL)) { printk(KERN_WARNING "Request Restore Key IRQ failed\n" ); } /* Alloc for the device for driver */ if (0 != dev_major) { devno = MKDEV(dev_major, dev_minor); result = register_chrdev_region(devno, 1, DEV_NAME); } else { result = alloc_chrdev_region(&devno, dev_minor, 1, DEV_NAME); dev_major = MAJOR(devno); } /*Alloc for device major failure */ if (result < 0) { printk("%s driver can't get major %d\n", DEV_NAME, dev_major); return result; } /*Initialize cdev structure and register it*/ cdev_init (&dev_cdev, &keypad_fops); dev_cdev.owner = THIS_MODULE; result = cdev_add (&dev_cdev, devno , 1); if (result) { printk (KERN_NOTICE "error %d add GPIO device", result); goto ERROR; } dev_class = class_create(THIS_MODULE, DEV_NAME); if(IS_ERR(dev_class)) { printk("%s driver create class failture\n",DEV_NAME); result = -ENOMEM; goto ERROR; } #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24) device_create(dev_class, NULL, devno, NULL, DEV_NAME); #else device_create (dev_class, NULL, devno, DEV_NAME); #endif printk("%s driver version %d.%d.%d initiliazed\n", DEV_NAME, DRV_MAJOR_VER, DRV_MINOR_VER, DRV_REVER_VER); return 0; ERROR: cdev_del(&dev_cdev); unregister_chrdev_region(devno, 1); return result; }
/* Consider only one slot : slot 0 */ void __init at91_add_device_mci(short mmc_id, struct mci_platform_data *data) { if (!data) return; /* Must have at least one usable slot */ if (!data->slot[0].bus_width) return; #if defined(CONFIG_AT_HDMAC) || defined(CONFIG_AT_HDMAC_MODULE) { struct at_dma_slave *atslave; struct mci_dma_data *alt_atslave; alt_atslave = kzalloc(sizeof(struct mci_dma_data), GFP_KERNEL); atslave = &alt_atslave->sdata; /* DMA slave channel configuration */ atslave->dma_dev = &at_hdmac_device.dev; atslave->cfg = ATC_FIFOCFG_HALFFIFO | ATC_SRC_H2SEL_HW | ATC_DST_H2SEL_HW; if (mmc_id == 0) /* MCI0 */ atslave->cfg |= ATC_SRC_PER(AT_DMA_ID_MCI0) | ATC_DST_PER(AT_DMA_ID_MCI0); else /* MCI1 */ atslave->cfg |= ATC_SRC_PER(AT_DMA_ID_MCI1) | ATC_DST_PER(AT_DMA_ID_MCI1); data->dma_slave = alt_atslave; } #endif /* input/irq */ if (gpio_is_valid(data->slot[0].detect_pin)) { at91_set_gpio_input(data->slot[0].detect_pin, 1); at91_set_deglitch(data->slot[0].detect_pin, 1); } if (gpio_is_valid(data->slot[0].wp_pin)) at91_set_gpio_input(data->slot[0].wp_pin, 1); if (mmc_id == 0) { /* MCI0 */ /* CLK */ at91_set_A_periph(AT91_PIN_PA0, 0); /* CMD */ at91_set_A_periph(AT91_PIN_PA1, 1); /* DAT0, maybe DAT1..DAT3 and maybe DAT4..DAT7 */ at91_set_A_periph(AT91_PIN_PA2, 1); if (data->slot[0].bus_width == 4) { at91_set_A_periph(AT91_PIN_PA3, 1); at91_set_A_periph(AT91_PIN_PA4, 1); at91_set_A_periph(AT91_PIN_PA5, 1); if (data->slot[0].bus_width == 8) { at91_set_A_periph(AT91_PIN_PA6, 1); at91_set_A_periph(AT91_PIN_PA7, 1); at91_set_A_periph(AT91_PIN_PA8, 1); at91_set_A_periph(AT91_PIN_PA9, 1); } } mmc0_data = *data; platform_device_register(&at91sam9g45_mmc0_device); } else { /* MCI1 */ /* CLK */ at91_set_A_periph(AT91_PIN_PA31, 0); /* CMD */ at91_set_A_periph(AT91_PIN_PA22, 1); /* DAT0, maybe DAT1..DAT3 and maybe DAT4..DAT7 */ at91_set_A_periph(AT91_PIN_PA23, 1); if (data->slot[0].bus_width == 4) { at91_set_A_periph(AT91_PIN_PA24, 1); at91_set_A_periph(AT91_PIN_PA25, 1); at91_set_A_periph(AT91_PIN_PA26, 1); if (data->slot[0].bus_width == 8) { at91_set_A_periph(AT91_PIN_PA27, 1); at91_set_A_periph(AT91_PIN_PA28, 1); at91_set_A_periph(AT91_PIN_PA29, 1); at91_set_A_periph(AT91_PIN_PA30, 1); } } mmc1_data = *data; platform_device_register(&at91sam9g45_mmc1_device); } }
void __init at91_add_device_mci(short mmc_id, struct mci_platform_data *data) { unsigned int i; unsigned int slot_count = 0; if (!data) return; for (i = 0; i < ATMCI_MAX_NR_SLOTS; i++) { if (!data->slot[i].bus_width) continue; /* input/irq */ if (gpio_is_valid(data->slot[i].detect_pin)) { at91_set_gpio_input(data->slot[i].detect_pin, 1); at91_set_deglitch(data->slot[i].detect_pin, 1); } if (gpio_is_valid(data->slot[i].wp_pin)) at91_set_gpio_input(data->slot[i].wp_pin, 1); switch (i) { case 0: /* slot A */ /* CMD */ at91_set_A_periph(AT91_PIN_PA28, 1); /* DAT0, maybe DAT1..DAT3 */ at91_set_A_periph(AT91_PIN_PA29, 1); if (data->slot[i].bus_width == 4) { at91_set_B_periph(AT91_PIN_PB3, 1); at91_set_B_periph(AT91_PIN_PB4, 1); at91_set_B_periph(AT91_PIN_PB5, 1); } slot_count++; break; case 1: /* slot B */ /* CMD */ at91_set_B_periph(AT91_PIN_PA8, 1); /* DAT0, maybe DAT1..DAT3 */ at91_set_B_periph(AT91_PIN_PA9, 1); if (data->slot[i].bus_width == 4) { at91_set_B_periph(AT91_PIN_PA10, 1); at91_set_B_periph(AT91_PIN_PA11, 1); at91_set_B_periph(AT91_PIN_PA12, 1); } slot_count++; break; default: printk(KERN_ERR "AT91: SD/MMC slot %d not available\n", i); break; } if (slot_count) { /* CLK */ at91_set_A_periph(AT91_PIN_PA27, 0); mmc_data = *data; platform_device_register(&at91rm9200_mmc_device); } } }
void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data) { if (!data) return; 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->wp_pin)) at91_set_gpio_input(data->wp_pin, 1); if (gpio_is_valid(data->vcc_pin)) at91_set_gpio_output(data->vcc_pin, 0); if (mmc_id == 0) { at91_set_A_periph(AT91_PIN_PA12, 0); if (data->slot_b) { at91_set_A_periph(AT91_PIN_PA16, 1); at91_set_A_periph(AT91_PIN_PA17, 1); if (data->wire4) { at91_set_A_periph(AT91_PIN_PA18, 1); at91_set_A_periph(AT91_PIN_PA19, 1); at91_set_A_periph(AT91_PIN_PA20, 1); } } else { at91_set_A_periph(AT91_PIN_PA1, 1); at91_set_A_periph(AT91_PIN_PA0, 1); if (data->wire4) { at91_set_A_periph(AT91_PIN_PA3, 1); at91_set_A_periph(AT91_PIN_PA4, 1); at91_set_A_periph(AT91_PIN_PA5, 1); } } mmc0_data = *data; platform_device_register(&at91sam9263_mmc0_device); } else { at91_set_A_periph(AT91_PIN_PA6, 0); if (data->slot_b) { at91_set_A_periph(AT91_PIN_PA21, 1); at91_set_A_periph(AT91_PIN_PA22, 1); if (data->wire4) { at91_set_A_periph(AT91_PIN_PA23, 1); at91_set_A_periph(AT91_PIN_PA24, 1); at91_set_A_periph(AT91_PIN_PA25, 1); } } else { at91_set_A_periph(AT91_PIN_PA7, 1); at91_set_A_periph(AT91_PIN_PA8, 1); if (data->wire4) { at91_set_A_periph(AT91_PIN_PA9, 1); at91_set_A_periph(AT91_PIN_PA10, 1); at91_set_A_periph(AT91_PIN_PA11, 1); } } mmc1_data = *data; platform_device_register(&at91sam9263_mmc1_device); } }