|
@@ -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) \
|