Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 48021bd9 authored by Kristoffer Nyborg Gregertsen's avatar Kristoffer Nyborg Gregertsen Committed by Haavard Skinnemoen
Browse files

[AVR32] Platform code for pata_at32



This patch adds platform code for PATA devices on the AP7000.

[hskinnemoen@atmel.com: board code left out for now since stk1000
	doesn't support IDE out of the box]
Signed-off-by: default avatarKristoffer Nyborg Gregertsen <kngregertsen@norway.atmel.com>
Signed-off-by: default avatarHaavard Skinnemoen <hskinnemoen@atmel.com>
parent 55b70a03
Loading
Loading
Loading
Loading
+65 −0
Original line number Diff line number Diff line
@@ -1227,6 +1227,71 @@ at32_add_device_usba(unsigned int id, struct usba_platform_data *data)
	return NULL;
}

/* --------------------------------------------------------------------
 * IDE
 * -------------------------------------------------------------------- */
static struct ide_platform_data at32_ide0_data;
static struct resource at32_ide0_resource[] = {
	{
		.start	= 0x04000000,
		.end	= 0x07ffffff,
		.flags	= IORESOURCE_MEM,
	},
	IRQ(~0UL), /* Magic IRQ will be overridden */
};
DEFINE_DEV_DATA(at32_ide, 0);

struct platform_device *__init
at32_add_device_ide(unsigned int id, unsigned int extint,
		    struct ide_platform_data *data)
{
	struct platform_device *pdev;
	unsigned int extint_pin;

	switch (extint) {
	case 0:
		extint_pin = GPIO_PIN_PB(25);
		break;
	case 1:
		extint_pin = GPIO_PIN_PB(26);
		break;
	case 2:
		extint_pin = GPIO_PIN_PB(27);
		break;
	case 3:
		extint_pin = GPIO_PIN_PB(28);
		break;
	default:
		return NULL;
	}

	switch (id) {
	case 0:
		pdev = &at32_ide0_device;
		select_peripheral(PE(19), PERIPH_A, 0);	/* CFCE1  -> CS0_N */
		select_peripheral(PE(20), PERIPH_A, 0);	/* CFCE2  -> CS1_N */
		select_peripheral(PE(21), PERIPH_A, 0); /* NCS4   -> OE_N  */
		select_peripheral(PE(23), PERIPH_A, 0); /* CFRNW  -> DIR   */
		select_peripheral(PE(24), PERIPH_A, 0); /* NWAIT  <- IORDY */
		set_ebi_sfr_bits(HMATRIX_BIT(CS4A));
		data->cs = 4;
		break;
	default:
		return NULL;
	}

	at32_select_periph(extint_pin, GPIO_PERIPH_A, AT32_GPIOF_DEGLITCH);

	pdev->resource[1].start = EIM_IRQ_BASE + extint;
	pdev->resource[1].end = pdev->resource[1].start;

	memcpy(pdev->dev.platform_data, data, sizeof(struct ide_platform_data));

	platform_device_register(pdev);

	return pdev;
}

/* --------------------------------------------------------------------
 *  GCLK
 * -------------------------------------------------------------------- */
+7 −0
Original line number Diff line number Diff line
@@ -44,6 +44,13 @@ struct usba_platform_data {
struct platform_device *
at32_add_device_usba(unsigned int id, struct usba_platform_data *data);

struct ide_platform_data {
	u8      cs;
};
struct platform_device *
at32_add_device_ide(unsigned int id, unsigned int extint,
		    struct ide_platform_data *data);

/* depending on what's hooked up, not all SSC pins will be used */
#define	ATMEL_SSC_TK		0x01
#define	ATMEL_SSC_TF		0x02