| 
					
				 | 
			
			
				@@ -879,3 +879,169 @@ struct resource isi_resources[] = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	[0] = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		.start	= AT91SAM9G45_BASE_ISI, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		.end	= AT91SAM9G45_BASE_ISI + SZ_16K - 1, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		.flags	= IORESOURCE_MEM, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	[1] = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		.start	= NR_IRQS_LEGACY + AT91SAM9G45_ID_ISI, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		.end	= NR_IRQS_LEGACY + AT91SAM9G45_ID_ISI, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		.flags	= IORESOURCE_IRQ, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+static struct platform_device at91sam9g45_isi_device = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	.name		= "atmel_isi", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	.id		= 0, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	.dev		= { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			.dma_mask		= &isi_dmamask, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			.coherent_dma_mask	= DMA_BIT_MASK(32), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			.platform_data		= &isi_data, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	.resource	= isi_resources, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	.num_resources	= ARRAY_SIZE(isi_resources), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+static struct clk_lookup isi_mck_lookups[] = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	CLKDEV_CON_DEV_ID("isi_mck", "atmel_isi.0", NULL), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+void __init at91_add_device_isi(struct isi_platform_data *data, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		bool use_pck_as_mck) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	struct clk *pck; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	struct clk *parent; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if (!data) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	isi_data = *data; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	at91_set_A_periph(AT91_PIN_PB20, 0);	/* ISI_D0 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	at91_set_A_periph(AT91_PIN_PB21, 0);	/* ISI_D1 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	at91_set_A_periph(AT91_PIN_PB22, 0);	/* ISI_D2 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	at91_set_A_periph(AT91_PIN_PB23, 0);	/* ISI_D3 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	at91_set_A_periph(AT91_PIN_PB24, 0);	/* ISI_D4 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	at91_set_A_periph(AT91_PIN_PB25, 0);	/* ISI_D5 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	at91_set_A_periph(AT91_PIN_PB26, 0);	/* ISI_D6 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	at91_set_A_periph(AT91_PIN_PB27, 0);	/* ISI_D7 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	at91_set_A_periph(AT91_PIN_PB28, 0);	/* ISI_PCK */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	at91_set_A_periph(AT91_PIN_PB30, 0);	/* ISI_HSYNC */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	at91_set_A_periph(AT91_PIN_PB29, 0);	/* ISI_VSYNC */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	at91_set_B_periph(AT91_PIN_PB8, 0);	/* ISI_PD8 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	at91_set_B_periph(AT91_PIN_PB9, 0);	/* ISI_PD9 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	at91_set_B_periph(AT91_PIN_PB10, 0);	/* ISI_PD10 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	at91_set_B_periph(AT91_PIN_PB11, 0);	/* ISI_PD11 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	platform_device_register(&at91sam9g45_isi_device); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if (use_pck_as_mck) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		at91_set_B_periph(AT91_PIN_PB31, 0);	/* ISI_MCK (PCK1) */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		pck = clk_get(NULL, "pck1"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		parent = clk_get(NULL, "plla"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		BUG_ON(IS_ERR(pck) || IS_ERR(parent)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if (clk_set_parent(pck, parent)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			pr_err("Failed to set PCK's parent\n"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			/* Register PCK as ISI_MCK */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			isi_mck_lookups[0].clk = pck; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			clkdev_add_table(isi_mck_lookups, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					ARRAY_SIZE(isi_mck_lookups)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		clk_put(pck); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		clk_put(parent); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#else 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+void __init at91_add_device_isi(struct isi_platform_data *data, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		bool use_pck_as_mck) {} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#endif 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/* -------------------------------------------------------------------- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ *  LCD Controller 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * -------------------------------------------------------------------- */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#if defined(CONFIG_FB_ATMEL) || defined(CONFIG_FB_ATMEL_MODULE) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+static u64 lcdc_dmamask = DMA_BIT_MASK(32); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+static struct atmel_lcdfb_info lcdc_data; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+static struct resource lcdc_resources[] = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	[0] = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		.start	= AT91SAM9G45_LCDC_BASE, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		.end	= AT91SAM9G45_LCDC_BASE + SZ_4K - 1, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		.flags	= IORESOURCE_MEM, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	[1] = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		.start	= NR_IRQS_LEGACY + AT91SAM9G45_ID_LCDC, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		.end	= NR_IRQS_LEGACY + AT91SAM9G45_ID_LCDC, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		.flags	= IORESOURCE_IRQ, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+static struct platform_device at91_lcdc_device = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	.name		= "atmel_lcdfb", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	.id		= 0, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	.dev		= { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				.dma_mask		= &lcdc_dmamask, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				.coherent_dma_mask	= DMA_BIT_MASK(32), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				.platform_data		= &lcdc_data, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	.resource	= lcdc_resources, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	.num_resources	= ARRAY_SIZE(lcdc_resources), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+void __init at91_add_device_lcdc(struct atmel_lcdfb_info *data) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if (!data) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	at91_set_A_periph(AT91_PIN_PE0, 0);	/* LCDDPWR */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	at91_set_A_periph(AT91_PIN_PE2, 0);	/* LCDCC */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	at91_set_A_periph(AT91_PIN_PE3, 0);	/* LCDVSYNC */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	at91_set_A_periph(AT91_PIN_PE4, 0);	/* LCDHSYNC */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	at91_set_A_periph(AT91_PIN_PE5, 0);	/* LCDDOTCK */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	at91_set_A_periph(AT91_PIN_PE6, 0);	/* LCDDEN */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	at91_set_A_periph(AT91_PIN_PE7, 0);	/* LCDD0 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	at91_set_A_periph(AT91_PIN_PE8, 0);	/* LCDD1 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	at91_set_A_periph(AT91_PIN_PE9, 0);	/* LCDD2 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	at91_set_A_periph(AT91_PIN_PE10, 0);	/* LCDD3 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	at91_set_A_periph(AT91_PIN_PE11, 0);	/* LCDD4 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	at91_set_A_periph(AT91_PIN_PE12, 0);	/* LCDD5 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	at91_set_A_periph(AT91_PIN_PE13, 0);	/* LCDD6 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	at91_set_A_periph(AT91_PIN_PE14, 0);	/* LCDD7 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	at91_set_A_periph(AT91_PIN_PE15, 0);	/* LCDD8 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	at91_set_A_periph(AT91_PIN_PE16, 0);	/* LCDD9 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	at91_set_A_periph(AT91_PIN_PE17, 0);	/* LCDD10 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	at91_set_A_periph(AT91_PIN_PE18, 0);	/* LCDD11 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	at91_set_A_periph(AT91_PIN_PE19, 0);	/* LCDD12 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	at91_set_A_periph(AT91_PIN_PE20, 0);	/* LCDD13 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	at91_set_A_periph(AT91_PIN_PE21, 0);	/* LCDD14 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	at91_set_A_periph(AT91_PIN_PE22, 0);	/* LCDD15 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	at91_set_A_periph(AT91_PIN_PE23, 0);	/* LCDD16 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	at91_set_A_periph(AT91_PIN_PE24, 0);	/* LCDD17 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	at91_set_A_periph(AT91_PIN_PE25, 0);	/* LCDD18 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	at91_set_A_periph(AT91_PIN_PE26, 0);	/* LCDD19 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	at91_set_A_periph(AT91_PIN_PE27, 0);	/* LCDD20 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	at91_set_A_periph(AT91_PIN_PE28, 0);	/* LCDD21 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	at91_set_A_periph(AT91_PIN_PE29, 0);	/* LCDD22 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	at91_set_A_periph(AT91_PIN_PE30, 0);	/* LCDD23 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	lcdc_data = *data; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	platform_device_register(&at91_lcdc_device); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#else 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+void __init at91_add_device_lcdc(struct atmel_lcdfb_info *data) {} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#endif 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/* -------------------------------------------------------------------- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ *  Timer/Counter block 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * -------------------------------------------------------------------- */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#ifdef CONFIG_ATMEL_TCLIB 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+static struct resource tcb0_resources[] = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	[0] = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		.start	= AT91SAM9G45_BASE_TCB0, 
			 |