Skip to content

Commit

Permalink
Basic PWM driver for AVR32 and AT91
Browse files Browse the repository at this point in the history
PWM device setup, and a simple PWM driver exposing a programming interface
giving access to each channel's full capabilities.  Note that this doesn't
support starting several channels in synch.

[hskinnemoen@atmel.com: allocate platform device dynamically]
[hskinnemoen@atmel.com: Kconfig fix]
Signed-off-by: David Brownell <dbrownell@users.sourceforge.net>
Signed-off-by: Haavard Skinnemoen <hskinnemoen@atmel.com>
Cc: Andrew Victor <linux@maxim.org.za>
Cc: Nicolas Ferre <nicolas.ferre@atmel.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
  • Loading branch information
David Brownell authored and Linus Torvalds committed Feb 8, 2008
1 parent c8cece8 commit 9a1e8eb
Show file tree
Hide file tree
Showing 6 changed files with 546 additions and 0 deletions.
54 changes: 54 additions & 0 deletions arch/avr32/mach-at32ap/at32ap700x.c
Original file line number Diff line number Diff line change
Expand Up @@ -1185,6 +1185,59 @@ at32_add_device_lcdc(unsigned int id, struct atmel_lcdfb_info *data,
}
#endif

/* --------------------------------------------------------------------
* PWM
* -------------------------------------------------------------------- */
static struct resource atmel_pwm0_resource[] __initdata = {
PBMEM(0xfff01400),
IRQ(24),
};
static struct clk atmel_pwm0_mck = {
.name = "mck",
.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;

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;

if (mask & (1 << 0))
select_peripheral(PA(28), PERIPH_A, 0);
if (mask & (1 << 1))
select_peripheral(PA(29), PERIPH_A, 0);
if (mask & (1 << 2))
select_peripheral(PA(21), PERIPH_B, 0);
if (mask & (1 << 3))
select_peripheral(PA(22), 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
* -------------------------------------------------------------------- */
Expand Down Expand Up @@ -1646,6 +1699,7 @@ struct clk *at32_clock_list[] = {
&atmel_usart1_usart,
&atmel_usart2_usart,
&atmel_usart3_usart,
&atmel_pwm0_mck,
#if defined(CONFIG_CPU_AT32AP7000)
&macb0_hclk,
&macb0_pclk,
Expand Down
9 changes: 9 additions & 0 deletions drivers/misc/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,15 @@ menuconfig MISC_DEVICES

if MISC_DEVICES

config ATMEL_PWM
tristate "Atmel AT32/AT91 PWM support"
depends on AVR32 || ARCH_AT91
help
This option enables device driver support for the PWM channels
on certain Atmel prcoessors. Pulse Width Modulation is used for
purposes including software controlled power-efficent backlights
on LCD displays, motor control, and waveform generation.

config IBM_ASM
tristate "Device driver for IBM RSA service processor"
depends on X86 && PCI && INPUT && EXPERIMENTAL
Expand Down
1 change: 1 addition & 0 deletions drivers/misc/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ obj-$(CONFIG_HDPU_FEATURES) += hdpuftrs/
obj-$(CONFIG_MSI_LAPTOP) += msi-laptop.o
obj-$(CONFIG_ACER_WMI) += acer-wmi.o
obj-$(CONFIG_ASUS_LAPTOP) += asus-laptop.o
obj-$(CONFIG_ATMEL_PWM) += atmel_pwm.o
obj-$(CONFIG_ATMEL_SSC) += atmel-ssc.o
obj-$(CONFIG_TC1100_WMI) += tc1100-wmi.o
obj-$(CONFIG_LKDTM) += lkdtm.o
Expand Down
Loading

0 comments on commit 9a1e8eb

Please sign in to comment.