From: kishon <a0393678@ti.com>
To: "Cousson, Benoit" <b-cousson@ti.com>
Cc: "ABRAHAM, KISHON VIJAY" <kishon@ti.com>,
"linux-omap@vger.kernel.org" <linux-omap@vger.kernel.org>,
"Kamat, Nishant" <nskamat@ti.com>,
"Varadarajan, Charulatha" <charu@ti.com>,
"Datta, Shubhrajyoti" <shubhrajyoti@ti.com>,
"Basak, Partha" <p-basak2@ti.com>
Subject: Re: [PATCH 4/7] [RFC] OMAP: hwmod implementation for MCBSP
Date: Wed, 06 Oct 2010 16:09:17 +0530 [thread overview]
Message-ID: <4CAC51D5.8070101@ti.com> (raw)
In-Reply-To: <4CAC42AF.2040405@ti.com>
On Wednesday 06 October 2010 03:04 PM, Cousson, Benoit wrote:
> On 10/5/2010 6:37 PM, Kishon Vijay Abraham I wrote:
>> Signed-off-by: Kishon Vijay Abraham I<kishon@ti.com>
>> Signed-off-by: Charulatha V<charu@ti.com>
>> Signed-off-by: Shubhrajyoti D<shubhrajyoti@ti.com>
>> Cc: Partha Basak<p-basak2@ti.com>
>> ---
>> arch/arm/mach-omap2/mcbsp.c | 251 +++++++++----------------------
>> arch/arm/plat-omap/include/plat/mcbsp.h | 6 +-
>> arch/arm/plat-omap/mcbsp.c | 189 +++++++++++-------------
>> 3 files changed, 159 insertions(+), 287 deletions(-)
>>
>> diff --git a/arch/arm/mach-omap2/mcbsp.c b/arch/arm/mach-omap2/mcbsp.c
>> index eba9fa1..25c6703 100644
>> --- a/arch/arm/mach-omap2/mcbsp.c
>> +++ b/arch/arm/mach-omap2/mcbsp.c
>> @@ -22,9 +22,13 @@
>> #include<plat/dma.h>
>> #include<plat/cpu.h>
>> #include<plat/mcbsp.h>
>> +#include<plat/omap_hwmod.h>
>> +#include<plat/omap_device.h>
>>
>> #include "control.h"
>>
>> +static struct omap_hwmod *oh_st_device[] = {NULL, NULL};
>> +static int no_of_st;
>>
>> /* McBSP internal signal muxing functions */
>>
>> @@ -101,199 +105,90 @@ int omap2_mcbsp_set_clks_src(u8 id, u8 fck_src_id)
>> }
>> EXPORT_SYMBOL(omap2_mcbsp_set_clks_src);
>>
>> -
>> -/* Platform data */
>> -
>> -#ifdef CONFIG_ARCH_OMAP2420
>> -static struct omap_mcbsp_platform_data omap2420_mcbsp_pdata[] = {
>> - {
>> - .phys_base = OMAP24XX_MCBSP1_BASE,
>> - .dma_rx_sync = OMAP24XX_DMA_MCBSP1_RX,
>> - .dma_tx_sync = OMAP24XX_DMA_MCBSP1_TX,
>> - .rx_irq = INT_24XX_MCBSP1_IRQ_RX,
>> - .tx_irq = INT_24XX_MCBSP1_IRQ_TX,
>> - },
>> +struct omap_device_pm_latency omap2_mcbsp_latency[] = {
>> {
>> - .phys_base = OMAP24XX_MCBSP2_BASE,
>> - .dma_rx_sync = OMAP24XX_DMA_MCBSP2_RX,
>> - .dma_tx_sync = OMAP24XX_DMA_MCBSP2_TX,
>> - .rx_irq = INT_24XX_MCBSP2_IRQ_RX,
>> - .tx_irq = INT_24XX_MCBSP2_IRQ_TX,
>> + .deactivate_func = omap_device_idle_hwmods,
>> + .activate_func = omap_device_enable_hwmods,
>> + .flags = OMAP_DEVICE_LATENCY_AUTO_ADJUST,
>> },
>> };
>> -#define OMAP2420_MCBSP_PDATA_SZ ARRAY_SIZE(omap2420_mcbsp_pdata)
>> -#define OMAP2420_MCBSP_REG_NUM (OMAP_MCBSP_REG_RCCR / sizeof(u32) + 1)
>> -#else
>> -#define omap2420_mcbsp_pdata NULL
>> -#define OMAP2420_MCBSP_PDATA_SZ 0
>> -#define OMAP2420_MCBSP_REG_NUM 0
>> -#endif
>>
>> -#ifdef CONFIG_ARCH_OMAP2430
>> -static struct omap_mcbsp_platform_data omap2430_mcbsp_pdata[] = {
>> - {
>> - .phys_base = OMAP24XX_MCBSP1_BASE,
>> - .dma_rx_sync = OMAP24XX_DMA_MCBSP1_RX,
>> - .dma_tx_sync = OMAP24XX_DMA_MCBSP1_TX,
>> - .rx_irq = INT_24XX_MCBSP1_IRQ_RX,
>> - .tx_irq = INT_24XX_MCBSP1_IRQ_TX,
>> - },
>> - {
>> - .phys_base = OMAP24XX_MCBSP2_BASE,
>> - .dma_rx_sync = OMAP24XX_DMA_MCBSP2_RX,
>> - .dma_tx_sync = OMAP24XX_DMA_MCBSP2_TX,
>> - .rx_irq = INT_24XX_MCBSP2_IRQ_RX,
>> - .tx_irq = INT_24XX_MCBSP2_IRQ_TX,
>> - },
>> - {
>> - .phys_base = OMAP2430_MCBSP3_BASE,
>> - .dma_rx_sync = OMAP24XX_DMA_MCBSP3_RX,
>> - .dma_tx_sync = OMAP24XX_DMA_MCBSP3_TX,
>> - .rx_irq = INT_24XX_MCBSP3_IRQ_RX,
>> - .tx_irq = INT_24XX_MCBSP3_IRQ_TX,
>> - },
>> - {
>> - .phys_base = OMAP2430_MCBSP4_BASE,
>> - .dma_rx_sync = OMAP24XX_DMA_MCBSP4_RX,
>> - .dma_tx_sync = OMAP24XX_DMA_MCBSP4_TX,
>> - .rx_irq = INT_24XX_MCBSP4_IRQ_RX,
>> - .tx_irq = INT_24XX_MCBSP4_IRQ_TX,
>> - },
>> - {
>> - .phys_base = OMAP2430_MCBSP5_BASE,
>> - .dma_rx_sync = OMAP24XX_DMA_MCBSP5_RX,
>> - .dma_tx_sync = OMAP24XX_DMA_MCBSP5_TX,
>> - .rx_irq = INT_24XX_MCBSP5_IRQ_RX,
>> - .tx_irq = INT_24XX_MCBSP5_IRQ_TX,
>> - },
>> -};
>> -#define OMAP2430_MCBSP_PDATA_SZ ARRAY_SIZE(omap2430_mcbsp_pdata)
>> -#define OMAP2430_MCBSP_REG_NUM (OMAP_MCBSP_REG_RCCR / sizeof(u32) + 1)
>> -#else
>> -#define omap2430_mcbsp_pdata NULL
>> -#define OMAP2430_MCBSP_PDATA_SZ 0
>> -#define OMAP2430_MCBSP_REG_NUM 0
>> -#endif
>> +static int omap_init_mcbsp(struct omap_hwmod *oh, void *user)
>> +{
>> + int id, count = 1, i;
>> + char *name = "omap-mcbsp";
>> + char dev_name[16];
>> + struct omap_hwmod *oh_device[2];
>> + struct omap_mcbsp_platform_data *pdata;
>> + struct omap_device *od;
>> +
>> + if (!oh) {
>> + pr_err("%s:NULL hwmod pointer (oh)\n", __func__);
>> + return -EINVAL;
>> + }
>>
>> -#ifdef CONFIG_ARCH_OMAP3
>> -static struct omap_mcbsp_platform_data omap34xx_mcbsp_pdata[] = {
>> - {
>> - .phys_base = OMAP34XX_MCBSP1_BASE,
>> - .dma_rx_sync = OMAP24XX_DMA_MCBSP1_RX,
>> - .dma_tx_sync = OMAP24XX_DMA_MCBSP1_TX,
>> - .rx_irq = INT_24XX_MCBSP1_IRQ_RX,
>> - .tx_irq = INT_24XX_MCBSP1_IRQ_TX,
>> - .buffer_size = 0x80, /* The FIFO has 128 locations */
>> - },
>> - {
>> - .phys_base = OMAP34XX_MCBSP2_BASE,
>> - .phys_base_st = OMAP34XX_MCBSP2_ST_BASE,
>> - .dma_rx_sync = OMAP24XX_DMA_MCBSP2_RX,
>> - .dma_tx_sync = OMAP24XX_DMA_MCBSP2_TX,
>> - .rx_irq = INT_24XX_MCBSP2_IRQ_RX,
>> - .tx_irq = INT_24XX_MCBSP2_IRQ_TX,
>> - .buffer_size = 0x500, /* The FIFO has 1024 + 256 locations */
>> - },
>> - {
>> - .phys_base = OMAP34XX_MCBSP3_BASE,
>> - .phys_base_st = OMAP34XX_MCBSP3_ST_BASE,
>> - .dma_rx_sync = OMAP24XX_DMA_MCBSP3_RX,
>> - .dma_tx_sync = OMAP24XX_DMA_MCBSP3_TX,
>> - .rx_irq = INT_24XX_MCBSP3_IRQ_RX,
>> - .tx_irq = INT_24XX_MCBSP3_IRQ_TX,
>> - .buffer_size = 0x80, /* The FIFO has 128 locations */
>> - },
>> - {
>> - .phys_base = OMAP34XX_MCBSP4_BASE,
>> - .dma_rx_sync = OMAP24XX_DMA_MCBSP4_RX,
>> - .dma_tx_sync = OMAP24XX_DMA_MCBSP4_TX,
>> - .rx_irq = INT_24XX_MCBSP4_IRQ_RX,
>> - .tx_irq = INT_24XX_MCBSP4_IRQ_TX,
>> - .buffer_size = 0x80, /* The FIFO has 128 locations */
>> - },
>> - {
>> - .phys_base = OMAP34XX_MCBSP5_BASE,
>> - .dma_rx_sync = OMAP24XX_DMA_MCBSP5_RX,
>> - .dma_tx_sync = OMAP24XX_DMA_MCBSP5_TX,
>> - .rx_irq = INT_24XX_MCBSP5_IRQ_RX,
>> - .tx_irq = INT_24XX_MCBSP5_IRQ_TX,
>> - .buffer_size = 0x80, /* The FIFO has 128 locations */
>> - },
>> -};
>> -#define OMAP34XX_MCBSP_PDATA_SZ ARRAY_SIZE(omap34xx_mcbsp_pdata)
>> -#define OMAP34XX_MCBSP_REG_NUM (OMAP_MCBSP_REG_RCCR / sizeof(u32) + 1)
>> -#else
>> -#define omap34xx_mcbsp_pdata NULL
>> -#define OMAP34XX_MCBSP_PDATA_SZ 0
>> -#define OMAP34XX_MCBSP_REG_NUM 0
>> -#endif
>> + pdata = kzalloc(sizeof(struct omap_mcbsp_platform_data), GFP_KERNEL);
>> + if (!pdata) {
>> + pr_err("%s: No memory for mcbsp\n", __func__);
>> + return -ENOMEM;
>> + }
>>
>> -static struct omap_mcbsp_platform_data omap44xx_mcbsp_pdata[] = {
>> - {
>> - .phys_base = OMAP44XX_MCBSP1_BASE,
>> - .dma_rx_sync = OMAP44XX_DMA_MCBSP1_RX,
>> - .dma_tx_sync = OMAP44XX_DMA_MCBSP1_TX,
>> - .tx_irq = OMAP44XX_IRQ_MCBSP1,
>> - },
>> - {
>> - .phys_base = OMAP44XX_MCBSP2_BASE,
>> - .dma_rx_sync = OMAP44XX_DMA_MCBSP2_RX,
>> - .dma_tx_sync = OMAP44XX_DMA_MCBSP2_TX,
>> - .tx_irq = OMAP44XX_IRQ_MCBSP2,
>> - /* XXX .ops ? */
>> - },
>> - {
>> - .phys_base = OMAP44XX_MCBSP3_BASE,
>> - .dma_rx_sync = OMAP44XX_DMA_MCBSP3_RX,
>> - .dma_tx_sync = OMAP44XX_DMA_MCBSP3_TX,
>> - .tx_irq = OMAP44XX_IRQ_MCBSP3,
>> - /* XXX .ops ? */
>> - },
>> - {
>> - .phys_base = OMAP44XX_MCBSP4_BASE,
>> - .dma_rx_sync = OMAP44XX_DMA_MCBSP4_RX,
>> - .dma_tx_sync = OMAP44XX_DMA_MCBSP4_TX,
>> - .tx_irq = OMAP44XX_IRQ_MCBSP4,
>> - /* XXX .ops ? */
>> - },
>> -};
>> -#define OMAP44XX_MCBSP_PDATA_SZ ARRAY_SIZE(omap44xx_mcbsp_pdata)
>> -#define OMAP44XX_MCBSP_REG_NUM (OMAP_MCBSP_REG_RCCR / sizeof(u32) + 1)
>> + if (cpu_is_omap34xx()) {
>> + pdata->dma_op_mode = MCBSP_DMA_MODE_ELEMENT;
>> + if (id == 2)
>> + pdata->buffer_size = 0x500;
>> + else
>> + pdata->buffer_size = 0x80;
>> + } else {
>> + pdata->dma_op_mode = -EINVAL;
>> + pdata->buffer_size = 0;
>> + }
>>
>> -static int __init omap2_mcbsp_init(void)
>> + sscanf(oh->name, "mcbsp%d",&id);
>> + sprintf(dev_name, "mcbsp%d_sidetone", id);
>> + oh_device[0] = oh;
>> +
>> + for (i = 0; i< no_of_st ; i++) {
>> + if (!strcmp(dev_name, oh_st_device[i]->name)) {
>> + oh_device[1] = oh_st_device[i];
>> + count++;
>> + }
>> + }
>
> Pfuu, it took me a while to follow how all that stuff was working :-)
sorry for that :-)
>
> Since the sidetone block is tightly coupled to the mcbsp, you should
> simply add this information directly as a attribute of the mcbsp2& 3
> hwmod dev_attr.
>
> You will then easily detect which one does have a sidetone connected to
> it and avoid all this code.
>
> +static struct omap_mcbsp_dev_attr omap34xx_mcbsp2_dev_attr = {
> + .sidetone = "mcbsp2_sidetone",
> +};
>
> +static struct omap_hwmod omap34xx_mcbsp2_hwmod = {
> ...
> + .dev_attr =&omap34xx_mcbsp2_dev_attr,
> ...
Thats a good suggestion. Thanks.
-Kishon
>
>
> Regards,
> Benoit
>
>
>> +
>> + od = omap_device_build_ss(name, id, oh_device, count, pdata,
>> + sizeof(*pdata), omap2_mcbsp_latency,
>> + ARRAY_SIZE(omap2_mcbsp_latency), false);
>> + if (IS_ERR(od)) {
>> + pr_err("%s: Cant build omap_device for %s:%s.\n", __func__,
>> + name, oh->name);
>> + kfree(pdata);
>> + return PTR_ERR(od);
>> + }
>> + omap_mcbsp_count++;
>> + return 0;
>> +}
>> +
>> +static int omap_mcbsp_st(struct omap_hwmod *oh, void *user)
>> {
>> - if (cpu_is_omap2420()) {
>> - omap_mcbsp_count = OMAP2420_MCBSP_PDATA_SZ;
>> - omap_mcbsp_cache_size = OMAP2420_MCBSP_REG_NUM * sizeof(u16);
>> - } else if (cpu_is_omap2430()) {
>> - omap_mcbsp_count = OMAP2430_MCBSP_PDATA_SZ;
>> - omap_mcbsp_cache_size = OMAP2430_MCBSP_REG_NUM * sizeof(u32);
>> - } else if (cpu_is_omap34xx()) {
>> - omap_mcbsp_count = OMAP34XX_MCBSP_PDATA_SZ;
>> - omap_mcbsp_cache_size = OMAP34XX_MCBSP_REG_NUM * sizeof(u32);
>> - } else if (cpu_is_omap44xx()) {
>> - omap_mcbsp_count = OMAP44XX_MCBSP_PDATA_SZ;
>> - omap_mcbsp_cache_size = OMAP44XX_MCBSP_REG_NUM * sizeof(u32);
>> + if (!oh) {
>> + pr_err("%s:NULL hwmod pointer (oh)\n", __func__);
>> + return -EINVAL;
>> }
>> + oh_st_device[no_of_st++] = oh;
>> + return 0;
>> +}
>> +
>> +static int __init omap2_mcbsp_init(void)
>> +{
>> + omap_hwmod_for_each_by_class("mcbsp_sidetone", omap_mcbsp_st,
>> + NULL);
>> + omap_hwmod_for_each_by_class("mcbsp", omap_init_mcbsp, NULL);
>>
>> mcbsp_ptr = kzalloc(omap_mcbsp_count * sizeof(struct omap_mcbsp *),
>> GFP_KERNEL);
>> if (!mcbsp_ptr)
>> return -ENOMEM;
>>
>> - if (cpu_is_omap2420())
>> - omap_mcbsp_register_board_cfg(omap2420_mcbsp_pdata,
>> - OMAP2420_MCBSP_PDATA_SZ);
>> - if (cpu_is_omap2430())
>> - omap_mcbsp_register_board_cfg(omap2430_mcbsp_pdata,
>> - OMAP2430_MCBSP_PDATA_SZ);
>> - if (cpu_is_omap34xx())
>> - omap_mcbsp_register_board_cfg(omap34xx_mcbsp_pdata,
>> - OMAP34XX_MCBSP_PDATA_SZ);
>> - if (cpu_is_omap44xx())
>> - omap_mcbsp_register_board_cfg(omap44xx_mcbsp_pdata,
>> - OMAP44XX_MCBSP_PDATA_SZ);
>> -
>> return omap_mcbsp_init();
>> }
>> arch_initcall(omap2_mcbsp_init);
>> diff --git a/arch/arm/plat-omap/include/plat/mcbsp.h b/arch/arm/plat-omap/include/plat/mcbsp.h
>> index 4da6f94..1ff283c 100644
>> --- a/arch/arm/plat-omap/include/plat/mcbsp.h
>> +++ b/arch/arm/plat-omap/include/plat/mcbsp.h
>> @@ -418,11 +418,9 @@ struct omap_mcbsp_platform_data {
>> u8 dma_rx_sync, dma_tx_sync;
>> u16 rx_irq, tx_irq;
>> struct omap_mcbsp_ops *ops;
>> -#ifdef CONFIG_ARCH_OMAP3
>> - /* Sidetone block for McBSP 2 and 3 */
>> unsigned long phys_base_st;
>> u16 buffer_size;
>> -#endif
>> + int dma_op_mode;
>> };
>>
>> struct omap_mcbsp_st_data {
>> @@ -466,12 +464,10 @@ struct omap_mcbsp {
>> struct omap_mcbsp_platform_data *pdata;
>> struct clk *iclk;
>> struct clk *fclk;
>> -#ifdef CONFIG_ARCH_OMAP3
>> struct omap_mcbsp_st_data *st_data;
>> int dma_op_mode;
>> u16 max_tx_thres;
>> u16 max_rx_thres;
>> -#endif
>> void *reg_cache;
>> };
>> extern struct omap_mcbsp **mcbsp_ptr;
>> diff --git a/arch/arm/plat-omap/mcbsp.c b/arch/arm/plat-omap/mcbsp.c
>> index eac4b97..c7c6a83 100644
>> --- a/arch/arm/plat-omap/mcbsp.c
>> +++ b/arch/arm/plat-omap/mcbsp.c
>> @@ -27,6 +27,8 @@
>>
>> #include<plat/dma.h>
>> #include<plat/mcbsp.h>
>> +#include<plat/omap_hwmod.h>
>> +#include<plat/omap_device.h>
>>
>> #include "../mach-omap2/cm-regbits-34xx.h"
>>
>> @@ -1466,7 +1468,6 @@ void omap_mcbsp_set_spi_mode(unsigned int id,
>> }
>> EXPORT_SYMBOL(omap_mcbsp_set_spi_mode);
>>
>> -#ifdef CONFIG_ARCH_OMAP3
>> #define max_thres(m) (mcbsp->pdata->buffer_size)
>> #define valid_threshold(m, val) ((val)<= max_thres(m))
>> #define THRESHOLD_PROP_BUILDER(prop) \
>> @@ -1645,98 +1646,6 @@ static const struct attribute_group sidetone_attr_group = {
>> .attrs = (struct attribute **)sidetone_attrs,
>> };
>>
>> -static int __devinit omap_st_add(struct omap_mcbsp *mcbsp)
>> -{
>> - struct omap_mcbsp_platform_data *pdata = mcbsp->pdata;
>> - struct omap_mcbsp_st_data *st_data;
>> - int err;
>> -
>> - st_data = kzalloc(sizeof(*mcbsp->st_data), GFP_KERNEL);
>> - if (!st_data) {
>> - err = -ENOMEM;
>> - goto err1;
>> - }
>> -
>> - st_data->io_base_st = ioremap(pdata->phys_base_st, SZ_4K);
>> - if (!st_data->io_base_st) {
>> - err = -ENOMEM;
>> - goto err2;
>> - }
>> -
>> - err = sysfs_create_group(&mcbsp->dev->kobj,&sidetone_attr_group);
>> - if (err)
>> - goto err3;
>> -
>> - mcbsp->st_data = st_data;
>> - return 0;
>> -
>> -err3:
>> - iounmap(st_data->io_base_st);
>> -err2:
>> - kfree(st_data);
>> -err1:
>> - return err;
>> -
>> -}
>> -
>> -static void __devexit omap_st_remove(struct omap_mcbsp *mcbsp)
>> -{
>> - struct omap_mcbsp_st_data *st_data = mcbsp->st_data;
>> -
>> - if (st_data) {
>> - sysfs_remove_group(&mcbsp->dev->kobj,&sidetone_attr_group);
>> - iounmap(st_data->io_base_st);
>> - kfree(st_data);
>> - }
>> -}
>> -
>> -static inline void __devinit omap34xx_device_init(struct omap_mcbsp *mcbsp)
>> -{
>> - mcbsp->dma_op_mode = MCBSP_DMA_MODE_ELEMENT;
>> - if (cpu_is_omap34xx()) {
>> - /*
>> - * Initially configure the maximum thresholds to a safe value.
>> - * The McBSP FIFO usage with these values should not go under
>> - * 16 locations.
>> - * If the whole FIFO without safety buffer is used, than there
>> - * is a possibility that the DMA will be not able to push the
>> - * new data on time, causing channel shifts in runtime.
>> - */
>> - mcbsp->max_tx_thres = max_thres(mcbsp) - 0x10;
>> - mcbsp->max_rx_thres = max_thres(mcbsp) - 0x10;
>> - /*
>> - * REVISIT: Set dmap_op_mode to THRESHOLD as default
>> - * for mcbsp2 instances.
>> - */
>> - if (omap_additional_add(mcbsp->dev))
>> - dev_warn(mcbsp->dev,
>> - "Unable to create additional controls\n");
>> -
>> - if (mcbsp->id == 2 || mcbsp->id == 3)
>> - if (omap_st_add(mcbsp))
>> - dev_warn(mcbsp->dev,
>> - "Unable to create sidetone controls\n");
>> -
>> - } else {
>> - mcbsp->max_tx_thres = -EINVAL;
>> - mcbsp->max_rx_thres = -EINVAL;
>> - }
>> -}
>> -
>> -static inline void __devexit omap34xx_device_exit(struct omap_mcbsp *mcbsp)
>> -{
>> - if (cpu_is_omap34xx()) {
>> - omap_additional_remove(mcbsp->dev);
>> -
>> - if (mcbsp->id == 2 || mcbsp->id == 3)
>> - omap_st_remove(mcbsp);
>> - }
>> -}
>> -#else
>> -static inline void __devinit omap34xx_device_init(struct omap_mcbsp *mcbsp) {}
>> -static inline void __devexit omap34xx_device_exit(struct omap_mcbsp *mcbsp) {}
>> -#endif /* CONFIG_ARCH_OMAP3 */
>> -
>> /*
>> * McBSP1 and McBSP3 are directly mapped on 1610 and 1510.
>> * 730 has only 2 McBSP, and both of them are MPU peripherals.
>> @@ -1746,6 +1655,7 @@ static int __devinit omap_mcbsp_probe(struct platform_device *pdev)
>> struct omap_mcbsp_platform_data *pdata = pdev->dev.platform_data;
>> struct omap_mcbsp *mcbsp;
>> int id = pdev->id - 1;
>> + struct resource *res;
>> int ret = 0;
>>
>> if (!pdata) {
>> @@ -1775,25 +1685,50 @@ static int __devinit omap_mcbsp_probe(struct platform_device *pdev)
>> mcbsp->dma_tx_lch = -1;
>> mcbsp->dma_rx_lch = -1;
>>
>> - mcbsp->phys_base = pdata->phys_base;
>> - mcbsp->io_base = ioremap(pdata->phys_base, SZ_4K);
>> + res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
>> + if (!res) {
>> + dev_err(&pdev->dev, "%s:mcbsp%d has invalid memory resource\n",
>> + __func__, pdev->id);
>> + ret = -ENOMEM;
>> + goto exit;
>> + }
>> + mcbsp->phys_base = res->start;
>> + mcbsp->io_base = ioremap(res->start, resource_size(res));
>> if (!mcbsp->io_base) {
>> ret = -ENOMEM;
>> goto err_ioremap;
>> }
>>
>> + omap_mcbsp_cache_size = resource_size(res);
>> +
>> /* Default I/O is IRQ based */
>> mcbsp->io_type = OMAP_MCBSP_IRQ_IO;
>> - mcbsp->tx_irq = pdata->tx_irq;
>> - mcbsp->rx_irq = pdata->rx_irq;
>> - mcbsp->dma_rx_sync = pdata->dma_rx_sync;
>> - mcbsp->dma_tx_sync = pdata->dma_tx_sync;
>> + mcbsp->tx_irq = platform_get_irq_byname(pdev, "tx");
>> + mcbsp->rx_irq = platform_get_irq_byname(pdev, "rx");
>> +
>> + res = platform_get_resource_byname(pdev, IORESOURCE_DMA, "rx");
>> + if (!res) {
>> + dev_err(&pdev->dev, "%s:mcbsp%d has invalid DMA channel\n",
>> + __func__, pdev->id);
>> + ret = -ENODEV;
>> + goto err_res;
>> + }
>> + mcbsp->dma_rx_sync = res->start;
>> +
>> + res = platform_get_resource_byname(pdev, IORESOURCE_DMA, "tx");
>> + if (!res) {
>> + dev_err(&pdev->dev, "%s:mcbsp%d has invalid DMA channel\n",
>> + __func__, pdev->id);
>> + ret = -ENODEV;
>> + goto err_res;
>> + }
>> + mcbsp->dma_tx_sync = res->start;
>>
>> mcbsp->iclk = clk_get(&pdev->dev, "ick");
>> if (IS_ERR(mcbsp->iclk)) {
>> ret = PTR_ERR(mcbsp->iclk);
>> dev_err(&pdev->dev, "unable to get ick: %d\n", ret);
>> - goto err_iclk;
>> + goto err_res;
>> }
>>
>> mcbsp->fclk = clk_get(&pdev->dev, "fck");
>> @@ -1808,14 +1743,53 @@ static int __devinit omap_mcbsp_probe(struct platform_device *pdev)
>> mcbsp_ptr[id] = mcbsp;
>> platform_set_drvdata(pdev, mcbsp);
>>
>> - /* Initialize mcbsp properties for OMAP34XX if needed / applicable */
>> - omap34xx_device_init(mcbsp);
>> + omap_additional_add(mcbsp->dev);
>> + if (pdata->dma_op_mode != -EINVAL) {
>> + /*
>> + * Initially configure the maximum thresholds to a safe value.
>> + * The McBSP FIFO usage with these values should not go under
>> + * 16 locations.
>> + * If the whole FIFO without safety buffer is used, than there
>> + * is a possibility that the DMA will be not able to push the
>> + * new data on time, causing channel shifts in runtime.
>> + */
>> + mcbsp->max_tx_thres = max_thres(mcbsp) - 0x10 ;
>> + mcbsp->max_rx_thres = max_thres(mcbsp) - 0x10 ;
>> + }
>> +
>> + if (cpu_is_omap34xx()) {
>> + res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
>> + if (res) {
>> + mcbsp->st_data = kzalloc(sizeof(*mcbsp->st_data),
>> + GFP_KERNEL);
>> + if (!mcbsp->st_data) {
>> + ret = -ENOMEM;
>> + goto err_st_data;
>> + }
>> + mcbsp->st_data->io_base_st = ioremap(res->start,
>> + resource_size(res));
>> + if (!mcbsp->st_data->io_base_st) {
>> + ret = -ENOMEM;
>> + goto err_io_st;
>> + }
>> + ret = sysfs_create_group(&mcbsp->dev->kobj,
>> +&sidetone_attr_group);
>> + if (ret)
>> + goto err_sysfs;
>> + }
>> + }
>>
>> return 0;
>>
>> +err_sysfs:
>> + iounmap(mcbsp->st_data->io_base_st);
>> +err_io_st:
>> + kfree(mcbsp->st_data);
>> +err_st_data:
>> + clk_put(mcbsp->fclk);
>> err_fclk:
>> clk_put(mcbsp->iclk);
>> -err_iclk:
>> +err_res:
>> iounmap(mcbsp->io_base);
>> err_ioremap:
>> kfree(mcbsp);
>> @@ -1834,7 +1808,14 @@ static int __devexit omap_mcbsp_remove(struct platform_device *pdev)
>> mcbsp->pdata->ops->free)
>> mcbsp->pdata->ops->free(mcbsp->id);
>>
>> - omap34xx_device_exit(mcbsp);
>> + omap_additional_remove(mcbsp->dev);
>> +
>> + if (mcbsp->st_data) {
>> + sysfs_remove_group(&mcbsp->dev->kobj,
>> +&sidetone_attr_group);
>> + iounmap(mcbsp->st_data->io_base_st);
>> + kfree(mcbsp->st_data);
>> + }
>>
>> clk_disable(mcbsp->fclk);
>> clk_disable(mcbsp->iclk);
>> --
>> 1.7.0.4
>>
>> --
>> To unsubscribe from this list: send the line "unsubscribe linux-omap" in
>> the body of a message to majordomo@vger.kernel.org
>> More majordomo info at http://vger.kernel.org/majordomo-info.html
>
next prev parent reply other threads:[~2010-10-06 10:41 UTC|newest]
Thread overview: 36+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-10-05 16:37 [PATCH 1/7] [RFC] OMAP: MCBSP: hwmod database for 2xxx devices Kishon Vijay Abraham I
2010-10-05 16:37 ` [PATCH 2/7] [RFC] OMAP: MCBSP: hwmod database for 3xxx devices Kishon Vijay Abraham I
2010-10-05 16:37 ` [PATCH 3/7] [RFC] OMAP: MCBSP: hwmod database for 4xxx devices Kishon Vijay Abraham I
2010-10-06 9:20 ` Cousson, Benoit
2010-10-06 9:51 ` kishon
2010-10-05 16:37 ` [PATCH 4/7] [RFC] OMAP: hwmod implementation for MCBSP Kishon Vijay Abraham I
2010-10-06 6:01 ` Peter Ujfalusi
2010-10-06 6:12 ` Varadarajan, Charulatha
2010-10-06 6:58 ` Peter Ujfalusi
2010-10-06 7:06 ` Varadarajan, Charulatha
2010-10-06 9:34 ` Cousson, Benoit
2010-10-06 10:39 ` kishon [this message]
2010-10-07 16:53 ` kishon
2010-10-05 16:37 ` [PATCH 5/7] [RFC] OMAP: hwmod: New API to modify the autoidle bit of sysconfig register Kishon Vijay Abraham I
2010-10-05 16:37 ` [PATCH 6/7] [RFC] OMAP: hwmod: SYSCONFIG register modification for MCBSP Kishon Vijay Abraham I
2010-10-08 7:42 ` Cousson, Benoit
2010-10-11 6:18 ` kishon
[not found] ` <AANLkTi=a80MLvj5YuC==evfGqY6xUToHcBU3TyWEBHAo@mail.gmail.com>
2010-11-22 15:59 ` ABRAHAM, KISHON VIJAY
2010-11-30 16:03 ` Cousson, Benoit
2010-12-01 7:14 ` Basak, Partha
2010-12-01 11:15 ` Cousson, Benoit
2010-12-01 12:05 ` Govindraj
2010-12-02 10:54 ` Kevin Hilman
2010-12-07 13:15 ` Basak, Partha
2010-10-05 16:37 ` [PATCH 7/7] [RFC] OMAP: pm_runtime support " Kishon Vijay Abraham I
2010-10-06 7:01 ` [PATCH 1/7] [RFC] OMAP: MCBSP: hwmod database for 2xxx devices Varadarajan, Charulatha
2010-10-06 7:17 ` Peter Ujfalusi
2010-10-08 6:20 ` Varadarajan, Charulatha
2010-10-08 7:22 ` Cousson, Benoit
2010-10-12 9:33 ` kishon
2010-10-13 8:31 ` Peter Ujfalusi
2010-10-14 14:51 ` Varadarajan, Charulatha
2010-10-15 6:51 ` Jarkko Nikula
2010-10-15 14:24 ` Mark Brown
2010-10-15 7:13 ` Peter Ujfalusi
2010-10-06 10:32 ` kishon
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4CAC51D5.8070101@ti.com \
--to=a0393678@ti.com \
--cc=b-cousson@ti.com \
--cc=charu@ti.com \
--cc=kishon@ti.com \
--cc=linux-omap@vger.kernel.org \
--cc=nskamat@ti.com \
--cc=p-basak2@ti.com \
--cc=shubhrajyoti@ti.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.