[AVR32] Implement more at32_add_device_foo() functions

Implement functions for adding platform devices for TWI, MCI, AC97C
and ABDAC. They may need to be modified to cope with platform data,
etc. when the corresponding drivers are ready to be merged, but such
changes are much less likely to conflict than adding support for a
whole new type of device.

Signed-off-by: Haavard Skinnemoen <hskinnemoen@atmel.com>
This commit is contained in:
Haavard Skinnemoen 2007-10-22 17:42:35 +02:00
parent 86298962c0
commit 2042c1c4e7
2 changed files with 213 additions and 0 deletions

View File

@ -556,6 +556,17 @@ static struct clk pico_clk = {
.users = 1,
};
static struct resource dmaca0_resource[] = {
{
.start = 0xff200000,
.end = 0xff20ffff,
.flags = IORESOURCE_MEM,
},
IRQ(2),
};
DEFINE_DEV(dmaca, 0);
DEV_CLK(hclk, dmaca0, hsb, 10);
/* --------------------------------------------------------------------
* HMATRIX
* -------------------------------------------------------------------- */
@ -655,6 +666,7 @@ void __init at32_add_system_devices(void)
platform_device_register(&at32_eic0_device);
platform_device_register(&smc0_device);
platform_device_register(&pdc_device);
platform_device_register(&dmaca0_device);
platform_device_register(&at32_systc0_device);
@ -959,6 +971,96 @@ at32_add_device_spi(unsigned int id, struct spi_board_info *b, unsigned int n)
return pdev;
}
/* --------------------------------------------------------------------
* TWI
* -------------------------------------------------------------------- */
static struct resource atmel_twi0_resource[] __initdata = {
PBMEM(0xffe00800),
IRQ(5),
};
static struct clk atmel_twi0_pclk = {
.name = "twi_pclk",
.parent = &pba_clk,
.mode = pba_clk_mode,
.get_rate = pba_clk_get_rate,
.index = 2,
};
struct platform_device *__init at32_add_device_twi(unsigned int id)
{
struct platform_device *pdev;
if (id != 0)
return NULL;
pdev = platform_device_alloc("atmel_twi", id);
if (!pdev)
return NULL;
if (platform_device_add_resources(pdev, atmel_twi0_resource,
ARRAY_SIZE(atmel_twi0_resource)))
goto err_add_resources;
select_peripheral(PA(6), PERIPH_A, 0); /* SDA */
select_peripheral(PA(7), PERIPH_A, 0); /* SDL */
atmel_twi0_pclk.dev = &pdev->dev;
platform_device_add(pdev);
return pdev;
err_add_resources:
platform_device_put(pdev);
return NULL;
}
/* --------------------------------------------------------------------
* MMC
* -------------------------------------------------------------------- */
static struct resource atmel_mci0_resource[] __initdata = {
PBMEM(0xfff02400),
IRQ(28),
};
static struct clk atmel_mci0_pclk = {
.name = "mci_clk",
.parent = &pbb_clk,
.mode = pbb_clk_mode,
.get_rate = pbb_clk_get_rate,
.index = 9,
};
struct platform_device *__init at32_add_device_mci(unsigned int id)
{
struct platform_device *pdev;
if (id != 0)
return NULL;
pdev = platform_device_alloc("atmel_mci", id);
if (!pdev)
return NULL;
if (platform_device_add_resources(pdev, atmel_mci0_resource,
ARRAY_SIZE(atmel_mci0_resource)))
goto err_add_resources;
select_peripheral(PA(10), PERIPH_A, 0); /* CLK */
select_peripheral(PA(11), PERIPH_A, 0); /* CMD */
select_peripheral(PA(12), PERIPH_A, 0); /* DATA0 */
select_peripheral(PA(13), PERIPH_A, 0); /* DATA1 */
select_peripheral(PA(14), PERIPH_A, 0); /* DATA2 */
select_peripheral(PA(15), PERIPH_A, 0); /* DATA3 */
atmel_mci0_pclk.dev = &pdev->dev;
platform_device_add(pdev);
return pdev;
err_add_resources:
platform_device_put(pdev);
return NULL;
}
/* --------------------------------------------------------------------
* LCDC
* -------------------------------------------------------------------- */
@ -1292,6 +1394,105 @@ at32_add_device_ide(unsigned int id, unsigned int extint,
return pdev;
}
/* --------------------------------------------------------------------
* AC97C
* -------------------------------------------------------------------- */
static struct resource atmel_ac97c0_resource[] __initdata = {
PBMEM(0xfff02800),
IRQ(29),
};
static struct clk atmel_ac97c0_pclk = {
.name = "pclk",
.parent = &pbb_clk,
.mode = pbb_clk_mode,
.get_rate = pbb_clk_get_rate,
.index = 10,
};
struct platform_device *__init at32_add_device_ac97c(unsigned int id)
{
struct platform_device *pdev;
if (id != 0)
return NULL;
pdev = platform_device_alloc("atmel_ac97c", id);
if (!pdev)
return NULL;
if (platform_device_add_resources(pdev, atmel_ac97c0_resource,
ARRAY_SIZE(atmel_ac97c0_resource)))
goto err_add_resources;
select_peripheral(PB(20), PERIPH_B, 0); /* SYNC */
select_peripheral(PB(21), PERIPH_B, 0); /* SDO */
select_peripheral(PB(22), PERIPH_B, 0); /* SDI */
select_peripheral(PB(23), PERIPH_B, 0); /* SCLK */
atmel_ac97c0_pclk.dev = &pdev->dev;
platform_device_add(pdev);
return pdev;
err_add_resources:
platform_device_put(pdev);
return NULL;
}
/* --------------------------------------------------------------------
* ABDAC
* -------------------------------------------------------------------- */
static struct resource abdac0_resource[] __initdata = {
PBMEM(0xfff02000),
IRQ(27),
};
static struct clk abdac0_pclk = {
.name = "pclk",
.parent = &pbb_clk,
.mode = pbb_clk_mode,
.get_rate = pbb_clk_get_rate,
.index = 8,
};
static struct clk abdac0_sample_clk = {
.name = "sample_clk",
.mode = genclk_mode,
.get_rate = genclk_get_rate,
.set_rate = genclk_set_rate,
.set_parent = genclk_set_parent,
.index = 6,
};
struct platform_device *__init at32_add_device_abdac(unsigned int id)
{
struct platform_device *pdev;
if (id != 0)
return NULL;
pdev = platform_device_alloc("abdac", id);
if (!pdev)
return NULL;
if (platform_device_add_resources(pdev, abdac0_resource,
ARRAY_SIZE(abdac0_resource)))
goto err_add_resources;
select_peripheral(PB(20), PERIPH_A, 0); /* DATA1 */
select_peripheral(PB(21), PERIPH_A, 0); /* DATA0 */
select_peripheral(PB(22), PERIPH_A, 0); /* DATAN1 */
select_peripheral(PB(23), PERIPH_A, 0); /* DATAN0 */
abdac0_pclk.dev = &pdev->dev;
abdac0_sample_clk.dev = &pdev->dev;
platform_device_add(pdev);
return pdev;
err_add_resources:
platform_device_put(pdev);
return NULL;
}
/* --------------------------------------------------------------------
* GCLK
* -------------------------------------------------------------------- */
@ -1355,6 +1556,7 @@ struct clk *at32_clock_list[] = {
&smc0_mck,
&pdc_hclk,
&pdc_pclk,
&dmaca0_hclk,
&pico_clk,
&pio0_mck,
&pio1_mck,
@ -1372,6 +1574,8 @@ struct clk *at32_clock_list[] = {
&macb1_pclk,
&atmel_spi0_spi_clk,
&atmel_spi1_spi_clk,
&atmel_twi0_pclk,
&atmel_mci0_pclk,
&atmel_lcdfb0_hck1,
&atmel_lcdfb0_pixclk,
&ssc0_pclk,
@ -1379,6 +1583,9 @@ struct clk *at32_clock_list[] = {
&ssc2_pclk,
&usba0_hclk,
&usba0_pclk,
&atmel_ac97c0_pclk,
&abdac0_pclk,
&abdac0_sample_clk,
&gclk0,
&gclk1,
&gclk2,
@ -1420,6 +1627,7 @@ void __init at32_clock_init(void)
genclk_init_parent(&gclk3);
genclk_init_parent(&gclk4);
genclk_init_parent(&atmel_lcdfb0_pixclk);
genclk_init_parent(&abdac0_sample_clk);
/*
* Turn on all clocks that have at least one user already, and

View File

@ -65,4 +65,9 @@ at32_add_device_ide(unsigned int id, unsigned int extint,
struct platform_device *
at32_add_device_ssc(unsigned int id, unsigned int flags);
struct platform_device *at32_add_device_twi(unsigned int id);
struct platform_device *at32_add_device_mci(unsigned int id);
struct platform_device *at32_add_device_ac97c(unsigned int id);
struct platform_device *at32_add_device_abdac(unsigned int id);
#endif /* __ASM_ARCH_BOARD_H */