[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:
Родитель
86298962c0
Коммит
2042c1c4e7
|
@ -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
|
||||
|
|
|
@ -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 */
|
||||
|
|
Загрузка…
Ссылка в новой задаче