|  | @@ -1537,3 +1537,195 @@ err_invalid_id:
 | 
	
		
			
				|  |  |  	kfree(modedb);
 | 
	
		
			
				|  |  |  err_dup_modedb:
 | 
	
		
			
				|  |  |  	kfree(monspecs);
 | 
	
		
			
				|  |  | +	return NULL;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +#endif
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +/* --------------------------------------------------------------------
 | 
	
		
			
				|  |  | + *  PWM
 | 
	
		
			
				|  |  | + * -------------------------------------------------------------------- */
 | 
	
		
			
				|  |  | +static struct resource atmel_pwm0_resource[] __initdata = {
 | 
	
		
			
				|  |  | +	PBMEM(0xfff01400),
 | 
	
		
			
				|  |  | +	IRQ(24),
 | 
	
		
			
				|  |  | +};
 | 
	
		
			
				|  |  | +static struct clk atmel_pwm0_mck = {
 | 
	
		
			
				|  |  | +	.name		= "pwm_clk",
 | 
	
		
			
				|  |  | +	.parent		= &pbb_clk,
 | 
	
		
			
				|  |  | +	.mode		= pbb_clk_mode,
 | 
	
		
			
				|  |  | +	.get_rate	= pbb_clk_get_rate,
 | 
	
		
			
				|  |  | +	.index		= 5,
 | 
	
		
			
				|  |  | +};
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +struct platform_device *__init at32_add_device_pwm(u32 mask)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +	struct platform_device *pdev;
 | 
	
		
			
				|  |  | +	u32 pin_mask;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	if (!mask)
 | 
	
		
			
				|  |  | +		return NULL;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	pdev = platform_device_alloc("atmel_pwm", 0);
 | 
	
		
			
				|  |  | +	if (!pdev)
 | 
	
		
			
				|  |  | +		return NULL;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	if (platform_device_add_resources(pdev, atmel_pwm0_resource,
 | 
	
		
			
				|  |  | +				ARRAY_SIZE(atmel_pwm0_resource)))
 | 
	
		
			
				|  |  | +		goto out_free_pdev;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	if (platform_device_add_data(pdev, &mask, sizeof(mask)))
 | 
	
		
			
				|  |  | +		goto out_free_pdev;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	pin_mask = 0;
 | 
	
		
			
				|  |  | +	if (mask & (1 << 0))
 | 
	
		
			
				|  |  | +		pin_mask |= (1 << 28);
 | 
	
		
			
				|  |  | +	if (mask & (1 << 1))
 | 
	
		
			
				|  |  | +		pin_mask |= (1 << 29);
 | 
	
		
			
				|  |  | +	if (pin_mask > 0)
 | 
	
		
			
				|  |  | +		select_peripheral(PIOA, pin_mask, PERIPH_A, 0);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	pin_mask = 0;
 | 
	
		
			
				|  |  | +	if (mask & (1 << 2))
 | 
	
		
			
				|  |  | +		pin_mask |= (1 << 21);
 | 
	
		
			
				|  |  | +	if (mask & (1 << 3))
 | 
	
		
			
				|  |  | +		pin_mask |= (1 << 22);
 | 
	
		
			
				|  |  | +	if (pin_mask > 0)
 | 
	
		
			
				|  |  | +		select_peripheral(PIOA, pin_mask, PERIPH_B, 0);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	atmel_pwm0_mck.dev = &pdev->dev;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	platform_device_add(pdev);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	return pdev;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +out_free_pdev:
 | 
	
		
			
				|  |  | +	platform_device_put(pdev);
 | 
	
		
			
				|  |  | +	return NULL;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +/* --------------------------------------------------------------------
 | 
	
		
			
				|  |  | + *  SSC
 | 
	
		
			
				|  |  | + * -------------------------------------------------------------------- */
 | 
	
		
			
				|  |  | +static struct resource ssc0_resource[] = {
 | 
	
		
			
				|  |  | +	PBMEM(0xffe01c00),
 | 
	
		
			
				|  |  | +	IRQ(10),
 | 
	
		
			
				|  |  | +};
 | 
	
		
			
				|  |  | +DEFINE_DEV(ssc, 0);
 | 
	
		
			
				|  |  | +DEV_CLK(pclk, ssc0, pba, 7);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +static struct resource ssc1_resource[] = {
 | 
	
		
			
				|  |  | +	PBMEM(0xffe02000),
 | 
	
		
			
				|  |  | +	IRQ(11),
 | 
	
		
			
				|  |  | +};
 | 
	
		
			
				|  |  | +DEFINE_DEV(ssc, 1);
 | 
	
		
			
				|  |  | +DEV_CLK(pclk, ssc1, pba, 8);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +static struct resource ssc2_resource[] = {
 | 
	
		
			
				|  |  | +	PBMEM(0xffe02400),
 | 
	
		
			
				|  |  | +	IRQ(12),
 | 
	
		
			
				|  |  | +};
 | 
	
		
			
				|  |  | +DEFINE_DEV(ssc, 2);
 | 
	
		
			
				|  |  | +DEV_CLK(pclk, ssc2, pba, 9);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +struct platform_device *__init
 | 
	
		
			
				|  |  | +at32_add_device_ssc(unsigned int id, unsigned int flags)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +	struct platform_device *pdev;
 | 
	
		
			
				|  |  | +	u32 pin_mask = 0;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	switch (id) {
 | 
	
		
			
				|  |  | +	case 0:
 | 
	
		
			
				|  |  | +		pdev = &ssc0_device;
 | 
	
		
			
				|  |  | +		if (flags & ATMEL_SSC_RF)
 | 
	
		
			
				|  |  | +			pin_mask |= (1 << 21);	/* RF */
 | 
	
		
			
				|  |  | +		if (flags & ATMEL_SSC_RK)
 | 
	
		
			
				|  |  | +			pin_mask |= (1 << 22);	/* RK */
 | 
	
		
			
				|  |  | +		if (flags & ATMEL_SSC_TK)
 | 
	
		
			
				|  |  | +			pin_mask |= (1 << 23);	/* TK */
 | 
	
		
			
				|  |  | +		if (flags & ATMEL_SSC_TF)
 | 
	
		
			
				|  |  | +			pin_mask |= (1 << 24);	/* TF */
 | 
	
		
			
				|  |  | +		if (flags & ATMEL_SSC_TD)
 | 
	
		
			
				|  |  | +			pin_mask |= (1 << 25);	/* TD */
 | 
	
		
			
				|  |  | +		if (flags & ATMEL_SSC_RD)
 | 
	
		
			
				|  |  | +			pin_mask |= (1 << 26);	/* RD */
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		if (pin_mask > 0)
 | 
	
		
			
				|  |  | +			select_peripheral(PIOA, pin_mask, PERIPH_A, 0);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		break;
 | 
	
		
			
				|  |  | +	case 1:
 | 
	
		
			
				|  |  | +		pdev = &ssc1_device;
 | 
	
		
			
				|  |  | +		if (flags & ATMEL_SSC_RF)
 | 
	
		
			
				|  |  | +			pin_mask |= (1 << 0);	/* RF */
 | 
	
		
			
				|  |  | +		if (flags & ATMEL_SSC_RK)
 | 
	
		
			
				|  |  | +			pin_mask |= (1 << 1);	/* RK */
 | 
	
		
			
				|  |  | +		if (flags & ATMEL_SSC_TK)
 | 
	
		
			
				|  |  | +			pin_mask |= (1 << 2);	/* TK */
 | 
	
		
			
				|  |  | +		if (flags & ATMEL_SSC_TF)
 | 
	
		
			
				|  |  | +			pin_mask |= (1 << 3);	/* TF */
 | 
	
		
			
				|  |  | +		if (flags & ATMEL_SSC_TD)
 | 
	
		
			
				|  |  | +			pin_mask |= (1 << 4);	/* TD */
 | 
	
		
			
				|  |  | +		if (flags & ATMEL_SSC_RD)
 | 
	
		
			
				|  |  | +			pin_mask |= (1 << 5);	/* RD */
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		if (pin_mask > 0)
 | 
	
		
			
				|  |  | +			select_peripheral(PIOA, pin_mask, PERIPH_B, 0);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		break;
 | 
	
		
			
				|  |  | +	case 2:
 | 
	
		
			
				|  |  | +		pdev = &ssc2_device;
 | 
	
		
			
				|  |  | +		if (flags & ATMEL_SSC_TD)
 | 
	
		
			
				|  |  | +			pin_mask |= (1 << 13);	/* TD */
 | 
	
		
			
				|  |  | +		if (flags & ATMEL_SSC_RD)
 | 
	
		
			
				|  |  | +			pin_mask |= (1 << 14);	/* RD */
 | 
	
		
			
				|  |  | +		if (flags & ATMEL_SSC_TK)
 | 
	
		
			
				|  |  | +			pin_mask |= (1 << 15);	/* TK */
 | 
	
		
			
				|  |  | +		if (flags & ATMEL_SSC_TF)
 | 
	
		
			
				|  |  | +			pin_mask |= (1 << 16);	/* TF */
 | 
	
		
			
				|  |  | +		if (flags & ATMEL_SSC_RF)
 | 
	
		
			
				|  |  | +			pin_mask |= (1 << 17);	/* RF */
 | 
	
		
			
				|  |  | +		if (flags & ATMEL_SSC_RK)
 | 
	
		
			
				|  |  | +			pin_mask |= (1 << 18);	/* RK */
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		if (pin_mask > 0)
 | 
	
		
			
				|  |  | +			select_peripheral(PIOB, pin_mask, PERIPH_A, 0);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		break;
 | 
	
		
			
				|  |  | +	default:
 | 
	
		
			
				|  |  | +		return NULL;
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	platform_device_register(pdev);
 | 
	
		
			
				|  |  | +	return pdev;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +/* --------------------------------------------------------------------
 | 
	
		
			
				|  |  | + *  USB Device Controller
 | 
	
		
			
				|  |  | + * -------------------------------------------------------------------- */
 | 
	
		
			
				|  |  | +static struct resource usba0_resource[] __initdata = {
 | 
	
		
			
				|  |  | +	{
 | 
	
		
			
				|  |  | +		.start		= 0xff300000,
 | 
	
		
			
				|  |  | +		.end		= 0xff3fffff,
 | 
	
		
			
				|  |  | +		.flags		= IORESOURCE_MEM,
 | 
	
		
			
				|  |  | +	}, {
 | 
	
		
			
				|  |  | +		.start		= 0xfff03000,
 | 
	
		
			
				|  |  | +		.end		= 0xfff033ff,
 | 
	
		
			
				|  |  | +		.flags		= IORESOURCE_MEM,
 | 
	
		
			
				|  |  | +	},
 | 
	
		
			
				|  |  | +	IRQ(31),
 | 
	
		
			
				|  |  | +};
 | 
	
		
			
				|  |  | +static struct clk usba0_pclk = {
 | 
	
		
			
				|  |  | +	.name		= "pclk",
 | 
	
		
			
				|  |  | +	.parent		= &pbb_clk,
 | 
	
		
			
				|  |  | +	.mode		= pbb_clk_mode,
 | 
	
		
			
				|  |  | +	.get_rate	= pbb_clk_get_rate,
 | 
	
		
			
				|  |  | +	.index		= 12,
 | 
	
		
			
				|  |  | +};
 | 
	
		
			
				|  |  | +static struct clk usba0_hclk = {
 | 
	
		
			
				|  |  | +	.name		= "hclk",
 | 
	
		
			
				|  |  | +	.parent		= &hsb_clk,
 | 
	
		
			
				|  |  | +	.mode		= hsb_clk_mode,
 | 
	
		
			
				|  |  | +	.get_rate	= hsb_clk_get_rate,
 | 
	
		
			
				|  |  | +	.index		= 6,
 | 
	
		
			
				|  |  | +};
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +#define EP(nam, idx, maxpkt, maxbk, dma, isoc)			\
 |