~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/arch/arm/mach-omap2/mcbsp.c

Version: ~ [ linux-5.6-rc1 ] ~ [ linux-5.5.2 ] ~ [ linux-5.4.17 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.102 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.170 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.213 ] ~ [ linux-4.8.17 ] ~ [ linux-4.7.10 ] ~ [ linux-4.6.7 ] ~ [ linux-4.5.7 ] ~ [ linux-4.4.213 ] ~ [ linux-4.3.6 ] ~ [ linux-4.2.8 ] ~ [ linux-4.1.52 ] ~ [ linux-4.0.9 ] ~ [ linux-3.19.8 ] ~ [ linux-3.18.140 ] ~ [ linux-3.17.8 ] ~ [ linux-3.16.81 ] ~ [ linux-3.15.10 ] ~ [ linux-3.14.79 ] ~ [ linux-3.13.11 ] ~ [ linux-3.12.74 ] ~ [ linux-3.11.10 ] ~ [ linux-3.10.108 ] ~ [ linux-3.9.11 ] ~ [ linux-3.8.13 ] ~ [ linux-3.7.10 ] ~ [ linux-3.6.11 ] ~ [ linux-3.5.7 ] ~ [ linux-3.4.113 ] ~ [ linux-3.3.8 ] ~ [ linux-3.2.102 ] ~ [ linux-3.1.10 ] ~ [ linux-3.0.101 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.5 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 /*
  2  * linux/arch/arm/mach-omap2/mcbsp.c
  3  *
  4  * Copyright (C) 2008 Instituto Nokia de Tecnologia
  5  * Contact: Eduardo Valentin <eduardo.valentin@indt.org.br>
  6  *
  7  * This program is free software; you can redistribute it and/or modify
  8  * it under the terms of the GNU General Public License version 2 as
  9  * published by the Free Software Foundation.
 10  *
 11  * Multichannel mode not supported.
 12  */
 13 #include <linux/module.h>
 14 #include <linux/init.h>
 15 #include <linux/clk.h>
 16 #include <linux/err.h>
 17 #include <linux/io.h>
 18 #include <linux/of.h>
 19 #include <linux/platform_device.h>
 20 #include <linux/slab.h>
 21 #include <linux/platform_data/asoc-ti-mcbsp.h>
 22 #include <linux/pm_runtime.h>
 23 
 24 #include <linux/omap-dma.h>
 25 
 26 #include "soc.h"
 27 #include "omap_device.h"
 28 
 29 /*
 30  * FIXME: Find a mechanism to enable/disable runtime the McBSP ICLK autoidle.
 31  * Sidetone needs non-gated ICLK and sidetone autoidle is broken.
 32  */
 33 #include "cm3xxx.h"
 34 #include "cm-regbits-34xx.h"
 35 
 36 static int omap3_enable_st_clock(unsigned int id, bool enable)
 37 {
 38         unsigned int w;
 39 
 40         /*
 41          * Sidetone uses McBSP ICLK - which must not idle when sidetones
 42          * are enabled or sidetones start sounding ugly.
 43          */
 44         w = omap2_cm_read_mod_reg(OMAP3430_PER_MOD, CM_AUTOIDLE);
 45         if (enable)
 46                 w &= ~(1 << (id - 2));
 47         else
 48                 w |= 1 << (id - 2);
 49         omap2_cm_write_mod_reg(w, OMAP3430_PER_MOD, CM_AUTOIDLE);
 50 
 51         return 0;
 52 }
 53 
 54 static int __init omap_init_mcbsp(struct omap_hwmod *oh, void *unused)
 55 {
 56         int id, count = 1;
 57         char *name = "omap-mcbsp";
 58         struct omap_hwmod *oh_device[2];
 59         struct omap_mcbsp_platform_data *pdata = NULL;
 60         struct platform_device *pdev;
 61 
 62         sscanf(oh->name, "mcbsp%d", &id);
 63 
 64         pdata = kzalloc(sizeof(struct omap_mcbsp_platform_data), GFP_KERNEL);
 65         if (!pdata) {
 66                 pr_err("%s: No memory for mcbsp\n", __func__);
 67                 return -ENOMEM;
 68         }
 69 
 70         pdata->reg_step = 4;
 71         if (oh->class->rev < MCBSP_CONFIG_TYPE2) {
 72                 pdata->reg_size = 2;
 73         } else {
 74                 pdata->reg_size = 4;
 75                 pdata->has_ccr = true;
 76         }
 77 
 78         if (oh->class->rev == MCBSP_CONFIG_TYPE2) {
 79                 /* The FIFO has 128 locations */
 80                 pdata->buffer_size = 0x80;
 81         } else if (oh->class->rev == MCBSP_CONFIG_TYPE3) {
 82                 if (id == 2)
 83                         /* The FIFO has 1024 + 256 locations */
 84                         pdata->buffer_size = 0x500;
 85                 else
 86                         /* The FIFO has 128 locations */
 87                         pdata->buffer_size = 0x80;
 88         } else if (oh->class->rev == MCBSP_CONFIG_TYPE4) {
 89                 /* The FIFO has 128 locations for all instances */
 90                 pdata->buffer_size = 0x80;
 91         }
 92 
 93         if (oh->class->rev >= MCBSP_CONFIG_TYPE3)
 94                 pdata->has_wakeup = true;
 95 
 96         oh_device[0] = oh;
 97 
 98         if (oh->dev_attr) {
 99                 oh_device[1] = omap_hwmod_lookup((
100                 (struct omap_mcbsp_dev_attr *)(oh->dev_attr))->sidetone);
101                 pdata->enable_st_clock = omap3_enable_st_clock;
102                 count++;
103         }
104         pdev = omap_device_build_ss(name, id, oh_device, count, pdata,
105                                     sizeof(*pdata));
106         kfree(pdata);
107         if (IS_ERR(pdev))  {
108                 pr_err("%s: Can't build omap_device for %s:%s.\n", __func__,
109                                         name, oh->name);
110                 return PTR_ERR(pdev);
111         }
112         return 0;
113 }
114 
115 static int __init omap2_mcbsp_init(void)
116 {
117         if (!of_have_populated_dt())
118                 omap_hwmod_for_each_by_class("mcbsp", omap_init_mcbsp, NULL);
119 
120         return 0;
121 }
122 omap_arch_initcall(omap2_mcbsp_init);
123 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | Wiki (Japanese) | Wiki (English) | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

osdn.jp