|
@@ -2020,3 +2020,139 @@ at32_add_device_ac97c(unsigned int id, struct ac97c_platform_data *data,
|
|
|
unsigned int flags)
|
|
|
{
|
|
|
struct platform_device *pdev;
|
|
|
+ struct dw_dma_slave *rx_dws;
|
|
|
+ struct dw_dma_slave *tx_dws;
|
|
|
+ struct ac97c_platform_data _data;
|
|
|
+ u32 pin_mask;
|
|
|
+
|
|
|
+ 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 out_free_resources;
|
|
|
+
|
|
|
+ if (!data) {
|
|
|
+ data = &_data;
|
|
|
+ memset(data, 0, sizeof(struct ac97c_platform_data));
|
|
|
+ data->reset_pin = -ENODEV;
|
|
|
+ }
|
|
|
+
|
|
|
+ rx_dws = &data->rx_dws;
|
|
|
+ tx_dws = &data->tx_dws;
|
|
|
+
|
|
|
+ /* Check if DMA slave interface for capture should be configured. */
|
|
|
+ if (flags & AC97C_CAPTURE) {
|
|
|
+ rx_dws->dma_dev = &dw_dmac0_device.dev;
|
|
|
+ rx_dws->cfg_hi = DWC_CFGH_SRC_PER(3);
|
|
|
+ rx_dws->cfg_lo &= ~(DWC_CFGL_HS_DST_POL | DWC_CFGL_HS_SRC_POL);
|
|
|
+ rx_dws->src_master = 0;
|
|
|
+ rx_dws->dst_master = 1;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* Check if DMA slave interface for playback should be configured. */
|
|
|
+ if (flags & AC97C_PLAYBACK) {
|
|
|
+ tx_dws->dma_dev = &dw_dmac0_device.dev;
|
|
|
+ tx_dws->cfg_hi = DWC_CFGH_DST_PER(4);
|
|
|
+ tx_dws->cfg_lo &= ~(DWC_CFGL_HS_DST_POL | DWC_CFGL_HS_SRC_POL);
|
|
|
+ tx_dws->src_master = 0;
|
|
|
+ tx_dws->dst_master = 1;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (platform_device_add_data(pdev, data,
|
|
|
+ sizeof(struct ac97c_platform_data)))
|
|
|
+ goto out_free_resources;
|
|
|
+
|
|
|
+ /* SDO | SYNC | SCLK | SDI */
|
|
|
+ pin_mask = (1 << 20) | (1 << 21) | (1 << 22) | (1 << 23);
|
|
|
+
|
|
|
+ select_peripheral(PIOB, pin_mask, PERIPH_B, 0);
|
|
|
+
|
|
|
+ if (gpio_is_valid(data->reset_pin))
|
|
|
+ at32_select_gpio(data->reset_pin, AT32_GPIOF_OUTPUT
|
|
|
+ | AT32_GPIOF_HIGH);
|
|
|
+
|
|
|
+ atmel_ac97c0_pclk.dev = &pdev->dev;
|
|
|
+
|
|
|
+ platform_device_add(pdev);
|
|
|
+ return pdev;
|
|
|
+
|
|
|
+out_free_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 atmel_abdac_pdata *data)
|
|
|
+{
|
|
|
+ struct platform_device *pdev;
|
|
|
+ struct dw_dma_slave *dws;
|
|
|
+ u32 pin_mask;
|
|
|
+
|
|
|
+ if (id != 0 || !data)
|
|
|
+ return NULL;
|
|
|
+
|
|
|
+ pdev = platform_device_alloc("atmel_abdac", id);
|
|
|
+ if (!pdev)
|
|
|
+ return NULL;
|
|
|
+
|
|
|
+ if (platform_device_add_resources(pdev, abdac0_resource,
|
|
|
+ ARRAY_SIZE(abdac0_resource)))
|
|
|
+ goto out_free_resources;
|
|
|
+
|
|
|
+ dws = &data->dws;
|
|
|
+
|
|
|
+ dws->dma_dev = &dw_dmac0_device.dev;
|
|
|
+ dws->cfg_hi = DWC_CFGH_DST_PER(2);
|
|
|
+ dws->cfg_lo &= ~(DWC_CFGL_HS_DST_POL | DWC_CFGL_HS_SRC_POL);
|
|
|
+ dws->src_master = 0;
|
|
|
+ dws->dst_master = 1;
|
|
|
+
|
|
|
+ if (platform_device_add_data(pdev, data,
|
|
|
+ sizeof(struct atmel_abdac_pdata)))
|
|
|
+ goto out_free_resources;
|
|
|
+
|
|
|
+ pin_mask = (1 << 20) | (1 << 22); /* DATA1 & DATAN1 */
|
|
|
+ pin_mask |= (1 << 21) | (1 << 23); /* DATA0 & DATAN0 */
|
|
|
+
|
|
|
+ select_peripheral(PIOB, pin_mask, PERIPH_A, 0);
|
|
|
+
|
|
|
+ abdac0_pclk.dev = &pdev->dev;
|
|
|
+ abdac0_sample_clk.dev = &pdev->dev;
|
|
|
+
|
|
|
+ platform_device_add(pdev);
|
|
|
+ return pdev;
|
|
|
+
|
|
|
+out_free_resources:
|
|
|
+ platform_device_put(pdev);
|
|
|
+ return NULL;
|
|
|
+}
|
|
|
+
|
|
|
+/* --------------------------------------------------------------------
|