提交 d90f351a 编写于 作者: L Linus Torvalds

Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/egtvedt/linux-avr32

Pull AVR32 updates from Hans-Christian Noren Egtvedt.

* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/egtvedt/linux-avr32:
  mmc: atmel: get rid of struct mci_dma_data
  mmc: atmel-mci: restore dma on AVR32
  avr32: wire up missing syscalls
  avr32: wire up accept4 syscall
...@@ -333,5 +333,9 @@ ...@@ -333,5 +333,9 @@
#define __NR_memfd_create 318 #define __NR_memfd_create 318
#define __NR_bpf 319 #define __NR_bpf 319
#define __NR_execveat 320 #define __NR_execveat 320
#define __NR_accept4 321
#define __NR_userfaultfd 322
#define __NR_membarrier 323
#define __NR_mlock2 324
#endif /* _UAPI__ASM_AVR32_UNISTD_H */ #endif /* _UAPI__ASM_AVR32_UNISTD_H */
...@@ -334,4 +334,8 @@ sys_call_table: ...@@ -334,4 +334,8 @@ sys_call_table:
.long sys_memfd_create .long sys_memfd_create
.long sys_bpf .long sys_bpf
.long sys_execveat /* 320 */ .long sys_execveat /* 320 */
.long sys_accept4
.long sys_userfaultfd
.long sys_membarrier
.long sys_mlock2
.long sys_ni_syscall /* r8 is saturated at nr_syscalls */ .long sys_ni_syscall /* r8 is saturated at nr_syscalls */
...@@ -17,7 +17,6 @@ ...@@ -17,7 +17,6 @@
#include <linux/spi/spi.h> #include <linux/spi/spi.h>
#include <linux/usb/atmel_usba_udc.h> #include <linux/usb/atmel_usba_udc.h>
#include <linux/platform_data/mmc-atmel-mci.h>
#include <linux/atmel-mci.h> #include <linux/atmel-mci.h>
#include <asm/io.h> #include <asm/io.h>
...@@ -1321,11 +1320,26 @@ static struct clk atmel_mci0_pclk = { ...@@ -1321,11 +1320,26 @@ static struct clk atmel_mci0_pclk = {
.index = 9, .index = 9,
}; };
static bool at32_mci_dma_filter(struct dma_chan *chan, void *pdata)
{
struct dw_dma_slave *sl = pdata;
if (!sl)
return false;
if (sl->dma_dev == chan->device->dev) {
chan->private = sl;
return true;
}
return false;
}
struct platform_device *__init struct platform_device *__init
at32_add_device_mci(unsigned int id, struct mci_platform_data *data) at32_add_device_mci(unsigned int id, struct mci_platform_data *data)
{ {
struct platform_device *pdev; struct platform_device *pdev;
struct mci_dma_data *slave; struct dw_dma_slave *slave;
u32 pioa_mask; u32 pioa_mask;
u32 piob_mask; u32 piob_mask;
...@@ -1344,17 +1358,18 @@ at32_add_device_mci(unsigned int id, struct mci_platform_data *data) ...@@ -1344,17 +1358,18 @@ at32_add_device_mci(unsigned int id, struct mci_platform_data *data)
ARRAY_SIZE(atmel_mci0_resource))) ARRAY_SIZE(atmel_mci0_resource)))
goto fail; goto fail;
slave = kzalloc(sizeof(struct mci_dma_data), GFP_KERNEL); slave = kzalloc(sizeof(*slave), GFP_KERNEL);
if (!slave) if (!slave)
goto fail; goto fail;
slave->sdata.dma_dev = &dw_dmac0_device.dev; slave->dma_dev = &dw_dmac0_device.dev;
slave->sdata.src_id = 0; slave->src_id = 0;
slave->sdata.dst_id = 1; slave->dst_id = 1;
slave->sdata.src_master = 1; slave->src_master = 1;
slave->sdata.dst_master = 0; slave->dst_master = 0;
data->dma_slave = slave; data->dma_slave = slave;
data->dma_filter = at32_mci_dma_filter;
if (platform_device_add_data(pdev, data, if (platform_device_add_data(pdev, data,
sizeof(struct mci_platform_data))) sizeof(struct mci_platform_data)))
......
...@@ -29,7 +29,6 @@ ...@@ -29,7 +29,6 @@
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/stat.h> #include <linux/stat.h>
#include <linux/types.h> #include <linux/types.h>
#include <linux/platform_data/mmc-atmel-mci.h>
#include <linux/mmc/host.h> #include <linux/mmc/host.h>
#include <linux/mmc/sdio.h> #include <linux/mmc/sdio.h>
...@@ -2439,6 +2438,23 @@ static int atmci_configure_dma(struct atmel_mci *host) ...@@ -2439,6 +2438,23 @@ static int atmci_configure_dma(struct atmel_mci *host)
{ {
host->dma.chan = dma_request_slave_channel_reason(&host->pdev->dev, host->dma.chan = dma_request_slave_channel_reason(&host->pdev->dev,
"rxtx"); "rxtx");
if (PTR_ERR(host->dma.chan) == -ENODEV) {
struct mci_platform_data *pdata = host->pdev->dev.platform_data;
dma_cap_mask_t mask;
if (!pdata->dma_filter)
return -ENODEV;
dma_cap_zero(mask);
dma_cap_set(DMA_SLAVE, mask);
host->dma.chan = dma_request_channel(mask, pdata->dma_filter,
pdata->dma_slave);
if (!host->dma.chan)
host->dma.chan = ERR_PTR(-ENODEV);
}
if (IS_ERR(host->dma.chan)) if (IS_ERR(host->dma.chan))
return PTR_ERR(host->dma.chan); return PTR_ERR(host->dma.chan);
......
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
#define __LINUX_ATMEL_MCI_H #define __LINUX_ATMEL_MCI_H
#include <linux/types.h> #include <linux/types.h>
#include <linux/dmaengine.h>
#define ATMCI_MAX_NR_SLOTS 2 #define ATMCI_MAX_NR_SLOTS 2
...@@ -36,7 +37,8 @@ struct mci_slot_pdata { ...@@ -36,7 +37,8 @@ struct mci_slot_pdata {
* @slot: Per-slot configuration data. * @slot: Per-slot configuration data.
*/ */
struct mci_platform_data { struct mci_platform_data {
struct mci_dma_data *dma_slave; void *dma_slave;
dma_filter_fn dma_filter;
struct mci_slot_pdata slot[ATMCI_MAX_NR_SLOTS]; struct mci_slot_pdata slot[ATMCI_MAX_NR_SLOTS];
}; };
......
#ifndef __MMC_ATMEL_MCI_H
#define __MMC_ATMEL_MCI_H
#include <linux/platform_data/dma-atmel.h>
#include <linux/platform_data/dma-dw.h>
/**
* struct mci_dma_data - DMA data for MCI interface
*/
struct mci_dma_data {
#ifdef CONFIG_ARM
struct at_dma_slave sdata;
#else
struct dw_dma_slave sdata;
#endif
};
/* accessor macros */
#define slave_data_ptr(s) (&(s)->sdata)
#define find_slave_dev(s) ((s)->sdata.dma_dev)
#endif /* __MMC_ATMEL_MCI_H */
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册