1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * DaVinci Voice Codec Core Interface for TI platforms
5 * Copyright (C) 2010 Texas Instruments, Inc
7 * Author: Miguel Aguilar <miguel.aguilar@ridgerun.com>
10 #include <linux/init.h>
11 #include <linux/module.h>
12 #include <linux/device.h>
13 #include <linux/slab.h>
14 #include <linux/delay.h>
16 #include <linux/clk.h>
17 #include <linux/regmap.h>
19 #include <sound/pcm.h>
21 #include <linux/mfd/davinci_voicecodec.h>
23 static const struct regmap_config davinci_vc_regmap
= {
28 static int __init
davinci_vc_probe(struct platform_device
*pdev
)
30 struct davinci_vc
*davinci_vc
;
32 struct mfd_cell
*cell
= NULL
;
36 davinci_vc
= devm_kzalloc(&pdev
->dev
,
37 sizeof(struct davinci_vc
), GFP_KERNEL
);
41 davinci_vc
->clk
= devm_clk_get(&pdev
->dev
, NULL
);
42 if (IS_ERR(davinci_vc
->clk
)) {
44 "could not get the clock for voice codec\n");
47 clk_enable(davinci_vc
->clk
);
49 res
= platform_get_resource(pdev
, IORESOURCE_MEM
, 0);
51 fifo_base
= (dma_addr_t
)res
->start
;
52 davinci_vc
->base
= devm_ioremap_resource(&pdev
->dev
, res
);
53 if (IS_ERR(davinci_vc
->base
)) {
54 ret
= PTR_ERR(davinci_vc
->base
);
58 davinci_vc
->regmap
= devm_regmap_init_mmio(&pdev
->dev
,
61 if (IS_ERR(davinci_vc
->regmap
)) {
62 ret
= PTR_ERR(davinci_vc
->regmap
);
66 res
= platform_get_resource(pdev
, IORESOURCE_DMA
, 0);
68 dev_err(&pdev
->dev
, "no DMA resource\n");
73 davinci_vc
->davinci_vcif
.dma_tx_channel
= res
->start
;
74 davinci_vc
->davinci_vcif
.dma_tx_addr
= fifo_base
+ DAVINCI_VC_WFIFO
;
76 res
= platform_get_resource(pdev
, IORESOURCE_DMA
, 1);
78 dev_err(&pdev
->dev
, "no DMA resource\n");
83 davinci_vc
->davinci_vcif
.dma_rx_channel
= res
->start
;
84 davinci_vc
->davinci_vcif
.dma_rx_addr
= fifo_base
+ DAVINCI_VC_RFIFO
;
86 davinci_vc
->dev
= &pdev
->dev
;
87 davinci_vc
->pdev
= pdev
;
89 /* Voice codec interface client */
90 cell
= &davinci_vc
->cells
[DAVINCI_VC_VCIF_CELL
];
91 cell
->name
= "davinci-vcif";
92 cell
->platform_data
= davinci_vc
;
93 cell
->pdata_size
= sizeof(*davinci_vc
);
95 /* Voice codec CQ93VC client */
96 cell
= &davinci_vc
->cells
[DAVINCI_VC_CQ93VC_CELL
];
97 cell
->name
= "cq93vc-codec";
98 cell
->platform_data
= davinci_vc
;
99 cell
->pdata_size
= sizeof(*davinci_vc
);
101 ret
= mfd_add_devices(&pdev
->dev
, pdev
->id
, davinci_vc
->cells
,
102 DAVINCI_VC_CELLS
, NULL
, 0, NULL
);
104 dev_err(&pdev
->dev
, "fail to register client devices\n");
111 clk_disable(davinci_vc
->clk
);
116 static int davinci_vc_remove(struct platform_device
*pdev
)
118 struct davinci_vc
*davinci_vc
= platform_get_drvdata(pdev
);
120 mfd_remove_devices(&pdev
->dev
);
122 clk_disable(davinci_vc
->clk
);
127 static struct platform_driver davinci_vc_driver
= {
129 .name
= "davinci_voicecodec",
131 .remove
= davinci_vc_remove
,
134 module_platform_driver_probe(davinci_vc_driver
, davinci_vc_probe
);
136 MODULE_AUTHOR("Miguel Aguilar");
137 MODULE_DESCRIPTION("Texas Instruments DaVinci Voice Codec Core Interface");
138 MODULE_LICENSE("GPL");