/*
 * linux/arch/arm/mach-exynos4/dev-dwmci.c
 *
 * Copyright (c) 2011 Samsung Electronics Co., Ltd.
 *		http://www.samsung.com
 *
 * Platform device for Synopsys DesignWare Mobile Storage IP
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 */

#include <linux/kernel.h>
#include <linux/dma-mapping.h>
#include <linux/platform_device.h>
#include <linux/interrupt.h>
#include <linux/ioport.h>
#include <linux/mmc/dw_mmc.h>

#include <plat/devs.h>

#include <mach/map.h>

static int exynos4_dwmci_get_bus_wd(u32 slot_id)
{
	return 4;
}

static int exynos4_dwmci_init(u32 slot_id, irq_handler_t handler, void *data)
{
	return 0;
}

static struct resource exynos4_dwmci_resource[] = {
	[0] = DEFINE_RES_MEM(EXYNOS4_PA_DWMCI, SZ_4K),
	[1] = DEFINE_RES_IRQ(EXYNOS4_IRQ_DWMCI),
};

static struct dw_mci_board exynos4_dwci_pdata = {
	.num_slots			= 1,
	.quirks				= DW_MCI_QUIRK_BROKEN_CARD_DETECTION,
	.bus_hz				= 80 * 1000 * 1000,
	.detect_delay_ms	= 200,
	.init				= exynos4_dwmci_init,
	.get_bus_wd			= exynos4_dwmci_get_bus_wd,
};

static u64 exynos4_dwmci_dmamask = DMA_BIT_MASK(32);

struct platform_device exynos4_device_dwmci = {
	.name		= "dw_mmc",
	.id		= -1,
	.num_resources	= ARRAY_SIZE(exynos4_dwmci_resource),
	.resource	= exynos4_dwmci_resource,
	.dev		= {
		.dma_mask		= &exynos4_dwmci_dmamask,
		.coherent_dma_mask	= DMA_BIT_MASK(32),
		.platform_data	= &exynos4_dwci_pdata,
	},
};

void __init exynos4_dwmci_set_platdata(struct dw_mci_board *pd)
{
	struct dw_mci_board *npd;

	npd = s3c_set_platdata(pd, sizeof(struct dw_mci_board),
			&exynos4_device_dwmci);

	if (!npd->init)
		npd->init = exynos4_dwmci_init;
	if (!npd->get_bus_wd)
		npd->get_bus_wd = exynos4_dwmci_get_bus_wd;
}
