linux-omap.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: kishon <a0393678@ti.com>
To: "ABRAHAM, KISHON VIJAY" <kishon@ti.com>
Cc: "Cousson, Benoit" <b-cousson@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: Thu, 07 Oct 2010 22:23:58 +0530	[thread overview]
Message-ID: <4CADFB26.1010404@ti.com> (raw)
In-Reply-To: <4CAC51D5.8070101@ti.com>

On Wednesday 06 October 2010 04:09 PM, ABRAHAM, KISHON VIJAY wrote:
> 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.

    Ahh... there's a problem with that approach. Using a device attribute
will help to get rid of only
	 +       sprintf(dev_name, "mcbsp%d_sidetone", id);
    We'll still need to have  omap_mcbsp_st() and the following code
snippet

	+       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++;
  	+               }
  	+       }
     using a dev_attr to get the name of sidetone will be helpful only
when we can use omap_hwmod_lookup() to get the oh address in
omap_init_mcbsp(). But omap_init_mcbsp() is called as a callback to
omap_hwmod_for_each_by_class() holding 'omap_hwmod_mutex' which
disallows call to any other hwmod functions.
     I feel adding a dev_attr to get rid of two sprintf instructions
which involve modifying hwmod database file, adding a new structure
is not a better option.
     Please give your take on this.

-Kishon

> -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
>>
>


  reply	other threads:[~2010-10-07 16:56 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
2010-10-07 16:53       ` kishon [this message]
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=4CADFB26.1010404@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).