|
@@ -12,6 +12,7 @@
|
|
#include <linux/init.h>
|
|
#include <linux/init.h>
|
|
#include <linux/platform_device.h>
|
|
#include <linux/platform_device.h>
|
|
#include <linux/dma-mapping.h>
|
|
#include <linux/dma-mapping.h>
|
|
|
|
+#include <linux/gpio.h>
|
|
#include <linux/spi/spi.h>
|
|
#include <linux/spi/spi.h>
|
|
#include <linux/usb/atmel_usba_udc.h>
|
|
#include <linux/usb/atmel_usba_udc.h>
|
|
|
|
|
|
@@ -1285,7 +1286,6 @@ at32_add_device_mci(unsigned int id, struct mci_platform_data *data)
|
|
{
|
|
{
|
|
struct mci_platform_data _data;
|
|
struct mci_platform_data _data;
|
|
struct platform_device *pdev;
|
|
struct platform_device *pdev;
|
|
- struct dw_dma_slave *dws;
|
|
|
|
|
|
|
|
if (id != 0)
|
|
if (id != 0)
|
|
return NULL;
|
|
return NULL;
|
|
@@ -1300,7 +1300,9 @@ at32_add_device_mci(unsigned int id, struct mci_platform_data *data)
|
|
|
|
|
|
if (!data) {
|
|
if (!data) {
|
|
data = &_data;
|
|
data = &_data;
|
|
- memset(data, 0, sizeof(struct mci_platform_data));
|
|
|
|
|
|
+ memset(data, -1, sizeof(struct mci_platform_data));
|
|
|
|
+ data->detect_pin = GPIO_PIN_NONE;
|
|
|
|
+ data->wp_pin = GPIO_PIN_NONE;
|
|
}
|
|
}
|
|
|
|
|
|
if (platform_device_add_data(pdev, data,
|
|
if (platform_device_add_data(pdev, data,
|
|
@@ -1314,12 +1316,10 @@ at32_add_device_mci(unsigned int id, struct mci_platform_data *data)
|
|
select_peripheral(PA(14), PERIPH_A, 0); /* DATA2 */
|
|
select_peripheral(PA(14), PERIPH_A, 0); /* DATA2 */
|
|
select_peripheral(PA(15), PERIPH_A, 0); /* DATA3 */
|
|
select_peripheral(PA(15), PERIPH_A, 0); /* DATA3 */
|
|
|
|
|
|
- if (data) {
|
|
|
|
- if (data->detect_pin != GPIO_PIN_NONE)
|
|
|
|
- at32_select_gpio(data->detect_pin, 0);
|
|
|
|
- if (data->wp_pin != GPIO_PIN_NONE)
|
|
|
|
- at32_select_gpio(data->wp_pin, 0);
|
|
|
|
- }
|
|
|
|
|
|
+ if (gpio_is_valid(data->detect_pin))
|
|
|
|
+ at32_select_gpio(data->detect_pin, 0);
|
|
|
|
+ if (gpio_is_valid(data->wp_pin))
|
|
|
|
+ at32_select_gpio(data->wp_pin, 0);
|
|
|
|
|
|
atmel_mci0_pclk.dev = &pdev->dev;
|
|
atmel_mci0_pclk.dev = &pdev->dev;
|
|
|
|
|
|
@@ -1853,11 +1853,11 @@ at32_add_device_cf(unsigned int id, unsigned int extint,
|
|
if (at32_init_ide_or_cf(pdev, data->cs, extint))
|
|
if (at32_init_ide_or_cf(pdev, data->cs, extint))
|
|
goto fail;
|
|
goto fail;
|
|
|
|
|
|
- if (data->detect_pin != GPIO_PIN_NONE)
|
|
|
|
|
|
+ if (gpio_is_valid(data->detect_pin))
|
|
at32_select_gpio(data->detect_pin, AT32_GPIOF_DEGLITCH);
|
|
at32_select_gpio(data->detect_pin, AT32_GPIOF_DEGLITCH);
|
|
- if (data->reset_pin != GPIO_PIN_NONE)
|
|
|
|
|
|
+ if (gpio_is_valid(data->reset_pin))
|
|
at32_select_gpio(data->reset_pin, 0);
|
|
at32_select_gpio(data->reset_pin, 0);
|
|
- if (data->vcc_pin != GPIO_PIN_NONE)
|
|
|
|
|
|
+ if (gpio_is_valid(data->vcc_pin))
|
|
at32_select_gpio(data->vcc_pin, 0);
|
|
at32_select_gpio(data->vcc_pin, 0);
|
|
/* READY is used as extint, so we can't select it as gpio */
|
|
/* READY is used as extint, so we can't select it as gpio */
|
|
|
|
|
|
@@ -1937,9 +1937,11 @@ static struct clk atmel_ac97c0_pclk = {
|
|
.index = 10,
|
|
.index = 10,
|
|
};
|
|
};
|
|
|
|
|
|
-struct platform_device *__init at32_add_device_ac97c(unsigned int id)
|
|
|
|
|
|
+struct platform_device *__init
|
|
|
|
+at32_add_device_ac97c(unsigned int id, struct ac97c_platform_data *data)
|
|
{
|
|
{
|
|
struct platform_device *pdev;
|
|
struct platform_device *pdev;
|
|
|
|
+ struct ac97c_platform_data _data;
|
|
|
|
|
|
if (id != 0)
|
|
if (id != 0)
|
|
return NULL;
|
|
return NULL;
|
|
@@ -1950,19 +1952,37 @@ struct platform_device *__init at32_add_device_ac97c(unsigned int id)
|
|
|
|
|
|
if (platform_device_add_resources(pdev, atmel_ac97c0_resource,
|
|
if (platform_device_add_resources(pdev, atmel_ac97c0_resource,
|
|
ARRAY_SIZE(atmel_ac97c0_resource)))
|
|
ARRAY_SIZE(atmel_ac97c0_resource)))
|
|
- goto err_add_resources;
|
|
|
|
|
|
+ goto fail;
|
|
|
|
+
|
|
|
|
+ if (!data) {
|
|
|
|
+ data = &_data;
|
|
|
|
+ memset(data, 0, sizeof(struct ac97c_platform_data));
|
|
|
|
+ data->reset_pin = GPIO_PIN_NONE;
|
|
|
|
+ }
|
|
|
|
|
|
- select_peripheral(PB(20), PERIPH_B, 0); /* SYNC */
|
|
|
|
- select_peripheral(PB(21), PERIPH_B, 0); /* SDO */
|
|
|
|
- select_peripheral(PB(22), PERIPH_B, 0); /* SDI */
|
|
|
|
- select_peripheral(PB(23), PERIPH_B, 0); /* SCLK */
|
|
|
|
|
|
+ data->dma_rx_periph_id = 3;
|
|
|
|
+ data->dma_tx_periph_id = 4;
|
|
|
|
+ data->dma_controller_id = 0;
|
|
|
|
+
|
|
|
|
+ if (platform_device_add_data(pdev, data,
|
|
|
|
+ sizeof(struct ac97c_platform_data)))
|
|
|
|
+ goto fail;
|
|
|
|
+
|
|
|
|
+ select_peripheral(PB(20), PERIPH_B, 0); /* SDO */
|
|
|
|
+ select_peripheral(PB(21), PERIPH_B, 0); /* SYNC */
|
|
|
|
+ select_peripheral(PB(22), PERIPH_B, 0); /* SCLK */
|
|
|
|
+ select_peripheral(PB(23), PERIPH_B, 0); /* SDI */
|
|
|
|
+
|
|
|
|
+ /* TODO: gpio_is_valid(data->reset_pin) with kernel 2.6.26. */
|
|
|
|
+ if (data->reset_pin != GPIO_PIN_NONE)
|
|
|
|
+ at32_select_gpio(data->reset_pin, 0);
|
|
|
|
|
|
atmel_ac97c0_pclk.dev = &pdev->dev;
|
|
atmel_ac97c0_pclk.dev = &pdev->dev;
|
|
|
|
|
|
platform_device_add(pdev);
|
|
platform_device_add(pdev);
|
|
return pdev;
|
|
return pdev;
|
|
|
|
|
|
-err_add_resources:
|
|
|
|
|
|
+fail:
|
|
platform_device_put(pdev);
|
|
platform_device_put(pdev);
|
|
return NULL;
|
|
return NULL;
|
|
}
|
|
}
|