2009-04-14 20:30:11 +04:00
/*
* TI DaVinci DM644x chip specific setup
*
* Author : Kevin Hilman , Deep Root Systems , LLC
*
* 2007 ( c ) Deep Root Systems , LLC . This file is licensed under
* the terms of the GNU General Public License version 2. This program
* is licensed " as is " without any warranty of any kind , whether express
* or implied .
*/
# include <linux/init.h>
# include <linux/clk.h>
2009-03-18 20:36:08 +03:00
# include <linux/serial_8250.h>
2009-04-14 20:30:11 +04:00
# include <linux/platform_device.h>
2013-03-06 20:15:31 +04:00
# include <linux/platform_data/edma.h>
2013-08-18 09:19:00 +04:00
# include <linux/platform_data/gpio-davinci.h>
2009-04-14 20:30:11 +04:00
2009-04-15 23:38:58 +04:00
# include <asm/mach/map.h>
2009-04-14 20:30:11 +04:00
# include <mach/cputype.h>
# include <mach/irqs.h>
# include <mach/psc.h>
# include <mach/mux.h>
2009-04-15 23:40:11 +04:00
# include <mach/time.h>
2009-03-18 20:36:08 +03:00
# include <mach/serial.h>
2009-04-15 23:38:58 +04:00
# include <mach/common.h>
2009-04-14 20:30:11 +04:00
2011-12-21 17:43:35 +04:00
# include "davinci.h"
2009-04-14 20:30:11 +04:00
# include "clock.h"
# include "mux.h"
2012-08-27 17:26:41 +04:00
# include "asp.h"
2009-04-14 20:30:11 +04:00
/*
* Device specific clocks
*/
# define DM644X_REF_FREQ 27000000
2011-12-15 16:11:51 +04:00
# define DM644X_EMAC_BASE 0x01c80000
# define DM644X_EMAC_MDIO_BASE (DM644X_EMAC_BASE + 0x4000)
# define DM644X_EMAC_CNTRL_OFFSET 0x0000
# define DM644X_EMAC_CNTRL_MOD_OFFSET 0x1000
# define DM644X_EMAC_CNTRL_RAM_OFFSET 0x2000
# define DM644X_EMAC_CNTRL_RAM_SIZE 0x2000
2009-04-14 20:30:11 +04:00
static struct pll_data pll1_data = {
. num = 1 ,
. phys_base = DAVINCI_PLL1_BASE ,
} ;
static struct pll_data pll2_data = {
. num = 2 ,
. phys_base = DAVINCI_PLL2_BASE ,
} ;
static struct clk ref_clk = {
. name = " ref_clk " ,
. rate = DM644X_REF_FREQ ,
} ;
static struct clk pll1_clk = {
. name = " pll1 " ,
. parent = & ref_clk ,
. pll_data = & pll1_data ,
. flags = CLK_PLL ,
} ;
static struct clk pll1_sysclk1 = {
. name = " pll1_sysclk1 " ,
. parent = & pll1_clk ,
. flags = CLK_PLL ,
. div_reg = PLLDIV1 ,
} ;
static struct clk pll1_sysclk2 = {
. name = " pll1_sysclk2 " ,
. parent = & pll1_clk ,
. flags = CLK_PLL ,
. div_reg = PLLDIV2 ,
} ;
static struct clk pll1_sysclk3 = {
. name = " pll1_sysclk3 " ,
. parent = & pll1_clk ,
. flags = CLK_PLL ,
. div_reg = PLLDIV3 ,
} ;
static struct clk pll1_sysclk5 = {
. name = " pll1_sysclk5 " ,
. parent = & pll1_clk ,
. flags = CLK_PLL ,
. div_reg = PLLDIV5 ,
} ;
static struct clk pll1_aux_clk = {
. name = " pll1_aux_clk " ,
. parent = & pll1_clk ,
. flags = CLK_PLL | PRE_PLL ,
} ;
static struct clk pll1_sysclkbp = {
. name = " pll1_sysclkbp " ,
. parent = & pll1_clk ,
. flags = CLK_PLL | PRE_PLL ,
. div_reg = BPDIV
} ;
static struct clk pll2_clk = {
. name = " pll2 " ,
. parent = & ref_clk ,
. pll_data = & pll2_data ,
. flags = CLK_PLL ,
} ;
static struct clk pll2_sysclk1 = {
. name = " pll2_sysclk1 " ,
. parent = & pll2_clk ,
. flags = CLK_PLL ,
. div_reg = PLLDIV1 ,
} ;
static struct clk pll2_sysclk2 = {
. name = " pll2_sysclk2 " ,
. parent = & pll2_clk ,
. flags = CLK_PLL ,
. div_reg = PLLDIV2 ,
} ;
static struct clk pll2_sysclkbp = {
. name = " pll2_sysclkbp " ,
. parent = & pll2_clk ,
. flags = CLK_PLL | PRE_PLL ,
. div_reg = BPDIV
} ;
static struct clk dsp_clk = {
. name = " dsp " ,
. parent = & pll1_sysclk1 ,
. lpsc = DAVINCI_LPSC_GEM ,
2011-11-15 00:12:09 +04:00
. domain = DAVINCI_GPSC_DSPDOMAIN ,
2009-04-14 20:30:11 +04:00
. usecount = 1 , /* REVISIT how to disable? */
} ;
static struct clk arm_clk = {
. name = " arm " ,
. parent = & pll1_sysclk2 ,
. lpsc = DAVINCI_LPSC_ARM ,
. flags = ALWAYS_ENABLED ,
} ;
static struct clk vicp_clk = {
. name = " vicp " ,
. parent = & pll1_sysclk2 ,
. lpsc = DAVINCI_LPSC_IMCOP ,
2011-11-15 00:12:09 +04:00
. domain = DAVINCI_GPSC_DSPDOMAIN ,
2009-04-14 20:30:11 +04:00
. usecount = 1 , /* REVISIT how to disable? */
} ;
static struct clk vpss_master_clk = {
. name = " vpss_master " ,
. parent = & pll1_sysclk3 ,
. lpsc = DAVINCI_LPSC_VPSSMSTR ,
. flags = CLK_PSC ,
} ;
static struct clk vpss_slave_clk = {
. name = " vpss_slave " ,
. parent = & pll1_sysclk3 ,
. lpsc = DAVINCI_LPSC_VPSSSLV ,
} ;
static struct clk uart0_clk = {
. name = " uart0 " ,
. parent = & pll1_aux_clk ,
. lpsc = DAVINCI_LPSC_UART0 ,
} ;
static struct clk uart1_clk = {
. name = " uart1 " ,
. parent = & pll1_aux_clk ,
. lpsc = DAVINCI_LPSC_UART1 ,
} ;
static struct clk uart2_clk = {
. name = " uart2 " ,
. parent = & pll1_aux_clk ,
. lpsc = DAVINCI_LPSC_UART2 ,
} ;
static struct clk emac_clk = {
. name = " emac " ,
. parent = & pll1_sysclk5 ,
. lpsc = DAVINCI_LPSC_EMAC_WRAPPER ,
} ;
static struct clk i2c_clk = {
. name = " i2c " ,
. parent = & pll1_aux_clk ,
. lpsc = DAVINCI_LPSC_I2C ,
} ;
static struct clk ide_clk = {
. name = " ide " ,
. parent = & pll1_sysclk5 ,
. lpsc = DAVINCI_LPSC_ATA ,
} ;
static struct clk asp_clk = {
. name = " asp0 " ,
. parent = & pll1_sysclk5 ,
. lpsc = DAVINCI_LPSC_McBSP ,
} ;
static struct clk mmcsd_clk = {
. name = " mmcsd " ,
. parent = & pll1_sysclk5 ,
. lpsc = DAVINCI_LPSC_MMC_SD ,
} ;
static struct clk spi_clk = {
. name = " spi " ,
. parent = & pll1_sysclk5 ,
. lpsc = DAVINCI_LPSC_SPI ,
} ;
static struct clk gpio_clk = {
. name = " gpio " ,
. parent = & pll1_sysclk5 ,
. lpsc = DAVINCI_LPSC_GPIO ,
} ;
static struct clk usb_clk = {
. name = " usb " ,
. parent = & pll1_sysclk5 ,
. lpsc = DAVINCI_LPSC_USB ,
} ;
static struct clk vlynq_clk = {
. name = " vlynq " ,
. parent = & pll1_sysclk5 ,
. lpsc = DAVINCI_LPSC_VLYNQ ,
} ;
static struct clk aemif_clk = {
. name = " aemif " ,
. parent = & pll1_sysclk5 ,
. lpsc = DAVINCI_LPSC_AEMIF ,
} ;
static struct clk pwm0_clk = {
. name = " pwm0 " ,
. parent = & pll1_aux_clk ,
. lpsc = DAVINCI_LPSC_PWM0 ,
} ;
static struct clk pwm1_clk = {
. name = " pwm1 " ,
. parent = & pll1_aux_clk ,
. lpsc = DAVINCI_LPSC_PWM1 ,
} ;
static struct clk pwm2_clk = {
. name = " pwm2 " ,
. parent = & pll1_aux_clk ,
. lpsc = DAVINCI_LPSC_PWM2 ,
} ;
static struct clk timer0_clk = {
. name = " timer0 " ,
. parent = & pll1_aux_clk ,
. lpsc = DAVINCI_LPSC_TIMER0 ,
} ;
static struct clk timer1_clk = {
. name = " timer1 " ,
. parent = & pll1_aux_clk ,
. lpsc = DAVINCI_LPSC_TIMER1 ,
} ;
static struct clk timer2_clk = {
. name = " timer2 " ,
. parent = & pll1_aux_clk ,
. lpsc = DAVINCI_LPSC_TIMER2 ,
2011-04-27 10:28:26 +04:00
. usecount = 1 , /* REVISIT: why can't this be disabled? */
2009-04-14 20:30:11 +04:00
} ;
2010-02-26 02:36:38 +03:00
static struct clk_lookup dm644x_clks [ ] = {
2009-04-14 20:30:11 +04:00
CLK ( NULL , " ref " , & ref_clk ) ,
CLK ( NULL , " pll1 " , & pll1_clk ) ,
CLK ( NULL , " pll1_sysclk1 " , & pll1_sysclk1 ) ,
CLK ( NULL , " pll1_sysclk2 " , & pll1_sysclk2 ) ,
CLK ( NULL , " pll1_sysclk3 " , & pll1_sysclk3 ) ,
CLK ( NULL , " pll1_sysclk5 " , & pll1_sysclk5 ) ,
CLK ( NULL , " pll1_aux " , & pll1_aux_clk ) ,
CLK ( NULL , " pll1_sysclkbp " , & pll1_sysclkbp ) ,
CLK ( NULL , " pll2 " , & pll2_clk ) ,
CLK ( NULL , " pll2_sysclk1 " , & pll2_sysclk1 ) ,
CLK ( NULL , " pll2_sysclk2 " , & pll2_sysclk2 ) ,
CLK ( NULL , " pll2_sysclkbp " , & pll2_sysclkbp ) ,
CLK ( NULL , " dsp " , & dsp_clk ) ,
CLK ( NULL , " arm " , & arm_clk ) ,
CLK ( NULL , " vicp " , & vicp_clk ) ,
2013-03-22 11:53:12 +04:00
CLK ( " vpss " , " master " , & vpss_master_clk ) ,
CLK ( " vpss " , " slave " , & vpss_slave_clk ) ,
2009-04-14 20:30:11 +04:00
CLK ( NULL , " arm " , & arm_clk ) ,
2013-06-19 13:15:38 +04:00
CLK ( " serial8250.0 " , NULL , & uart0_clk ) ,
CLK ( " serial8250.1 " , NULL , & uart1_clk ) ,
CLK ( " serial8250.2 " , NULL , & uart2_clk ) ,
2009-04-14 20:30:11 +04:00
CLK ( " davinci_emac.1 " , NULL , & emac_clk ) ,
2013-08-15 10:01:33 +04:00
CLK ( " davinci_mdio.0 " , " fck " , & emac_clk ) ,
2009-04-14 20:30:11 +04:00
CLK ( " i2c_davinci.1 " , NULL , & i2c_clk ) ,
CLK ( " palm_bk3710 " , NULL , & ide_clk ) ,
ASoC: davinci: fixes for multi-component
Multi-component commit f0fba2ad broke a few things which this patch should
fix. Tested on the DM355 EVM. I've been as careful as I can, but it would be
good if those with access to other Davinci boards could test.
--
The multi-component commit put the initialisation of
snd_soc_dai.[capture|playback]_dma_data into snd_soc_dai_ops.hw_params of the
McBSP, McASP & VCIF drivers (davinci-i2s.c, davinci-mcasp.c & davinci-vcif.c).
The initialisation had to be moved from the probe function in these drivers
because davinci_*_dai changed from snd_soc_dai to snd_soc_dai_driver.
Unfortunately, the DMA params pointer is needed by davinci_pcm_open (in
davinci-pcm.c) before hw_params is called. I have moved the initialisation to
a new snd_soc_dai_ops.startup function in each of these drivers. This fix
indicates that all platforms that use davinci-pcm must have been broken and
need to test with this fix.
--
The multi-component commit also changed the McBSP driver name from
"davinci-asp" to "davinci-i2s" in davinci-i2s.c without updating the board
level references to the driver name. This change is understandable, as there
is a similarly named "davinci-mcasp" driver in davinci-mcasp.c.
There is probably no 'correct' name for this driver. The DM6446 datasheet
calls it the "ASP" and describes it as a "specialised McBSP". The DM355
datasheet calls it the "ASP" and describes it as a "specialised ASP". The
DM365 datasheet calls it the "McBSP". Rather than fix this problem by
reverting to "davinci-asp", I've elected to avoid future confusion with the
"davinci-mcasp" driver by changing it to "davinci-mcbsp", which is also
consistent with the names of the functions in the driver. There are other
fixes required, so it was never going to be as simple as a revert anyway.
--
The DM365 only has one McBSP port (of the McBSP platforms, only the DM355 has
2 ports), so I've changed the the id of the platform_device from 0 to -1.
--
In davinci-evm.c, the DM6446 EVM can no longer share a snd_soc_dai_link
structure with the DM355 EVM as they use different cpu DAI names (the DM355
has 2 ports and the EVM uses the second port, but the DM6446 only has 1 port).
This also means that the 2 boards need different snd_soc_card structures.
--
The codec_name entries in davinci-evm.c didn't match the i2c ids in the board
files. I have only checked and fixed the details of the names used for the
McBSP based platforms. Someone with a McASP based platform (eg DA8xx) should
check the others.
Signed-off-by: Chris Paulson-Ellis <chris@edesix.com>
Acked-by: Liam Girdwood <lrg@slimlogic.co.uk>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
2010-11-16 15:27:09 +03:00
CLK ( " davinci-mcbsp " , NULL , & asp_clk ) ,
2013-03-28 17:11:59 +04:00
CLK ( " dm6441-mmc.0 " , NULL , & mmcsd_clk ) ,
2009-04-14 20:30:11 +04:00
CLK ( NULL , " spi " , & spi_clk ) ,
CLK ( NULL , " gpio " , & gpio_clk ) ,
CLK ( NULL , " usb " , & usb_clk ) ,
CLK ( NULL , " vlynq " , & vlynq_clk ) ,
CLK ( NULL , " aemif " , & aemif_clk ) ,
CLK ( NULL , " pwm0 " , & pwm0_clk ) ,
CLK ( NULL , " pwm1 " , & pwm1_clk ) ,
CLK ( NULL , " pwm2 " , & pwm2_clk ) ,
CLK ( NULL , " timer0 " , & timer0_clk ) ,
CLK ( NULL , " timer1 " , & timer1_clk ) ,
2013-11-27 17:31:53 +04:00
CLK ( " davinci-wdt " , NULL , & timer2_clk ) ,
2009-04-14 20:30:11 +04:00
CLK ( NULL , NULL , NULL ) ,
} ;
2009-04-15 23:40:56 +04:00
static struct emac_platform_data dm644x_emac_pdata = {
. ctrl_reg_offset = DM644X_EMAC_CNTRL_OFFSET ,
. ctrl_mod_reg_offset = DM644X_EMAC_CNTRL_MOD_OFFSET ,
. ctrl_ram_offset = DM644X_EMAC_CNTRL_RAM_OFFSET ,
. ctrl_ram_size = DM644X_EMAC_CNTRL_RAM_SIZE ,
. version = EMAC_VERSION_1 ,
} ;
2009-04-14 20:30:11 +04:00
static struct resource dm644x_emac_resources [ ] = {
{
. start = DM644X_EMAC_BASE ,
2010-09-15 18:11:22 +04:00
. end = DM644X_EMAC_BASE + SZ_16K - 1 ,
2009-04-14 20:30:11 +04:00
. flags = IORESOURCE_MEM ,
} ,
{
. start = IRQ_EMACINT ,
. end = IRQ_EMACINT ,
. flags = IORESOURCE_IRQ ,
} ,
} ;
static struct platform_device dm644x_emac_device = {
. name = " davinci_emac " ,
. id = 1 ,
2009-04-15 23:40:56 +04:00
. dev = {
. platform_data = & dm644x_emac_pdata ,
} ,
2009-04-14 20:30:11 +04:00
. num_resources = ARRAY_SIZE ( dm644x_emac_resources ) ,
. resource = dm644x_emac_resources ,
} ;
2010-09-15 18:11:22 +04:00
static struct resource dm644x_mdio_resources [ ] = {
{
. start = DM644X_EMAC_MDIO_BASE ,
. end = DM644X_EMAC_MDIO_BASE + SZ_4K - 1 ,
. flags = IORESOURCE_MEM ,
} ,
} ;
static struct platform_device dm644x_mdio_device = {
. name = " davinci_mdio " ,
. id = 0 ,
. num_resources = ARRAY_SIZE ( dm644x_mdio_resources ) ,
. resource = dm644x_mdio_resources ,
} ;
2009-04-14 20:30:11 +04:00
/*
* Device specific mux setup
*
* soc description mux mode mode mux dbg
* reg offset mask mode
*/
static const struct mux_config dm644x_pins [ ] = {
2009-04-15 23:39:48 +04:00
# ifdef CONFIG_DAVINCI_MUX
2009-04-14 20:30:11 +04:00
MUX_CFG ( DM644X , HDIREN , 0 , 16 , 1 , 1 , true )
MUX_CFG ( DM644X , ATAEN , 0 , 17 , 1 , 1 , true )
MUX_CFG ( DM644X , ATAEN_DISABLE , 0 , 17 , 1 , 0 , true )
MUX_CFG ( DM644X , HPIEN_DISABLE , 0 , 29 , 1 , 0 , true )
MUX_CFG ( DM644X , AEAW , 0 , 0 , 31 , 31 , true )
davinci: Initial support for Neuros OSD2 platform.
The Neuros OSD 2.0 is the hardware component of the Neuros Open
Internet Television Platform. Hardware is very close to Ti DM644X-EVM board.
It has: DM6446M02 module with 256MB NAND, 256MB RAM, TLV320AIC32 AIC,
USB, Ethernet, SD/MMC, UART, THS8200, TVP7000 for video.
Additionaly realtime clock, IR remote control receiver,
IR Blaster based on MSP430 (firmware although is different
from used in DM644X-EVM), internal ATA-6 3.5” HDD drive
with PATA interface, two muxed red-green leds.
For more information please refer to
http://wiki.neurostechnology.com/index.php/OSD_2.0_HD
Signed-off-by: Andrey Porodko <panda@chelcom.ru>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
2009-11-13 17:16:51 +03:00
MUX_CFG ( DM644X , AEAW0 , 0 , 0 , 1 , 0 , true )
MUX_CFG ( DM644X , AEAW1 , 0 , 1 , 1 , 0 , true )
MUX_CFG ( DM644X , AEAW2 , 0 , 2 , 1 , 0 , true )
MUX_CFG ( DM644X , AEAW3 , 0 , 3 , 1 , 0 , true )
MUX_CFG ( DM644X , AEAW4 , 0 , 4 , 1 , 0 , true )
2009-04-14 20:30:11 +04:00
MUX_CFG ( DM644X , MSTK , 1 , 9 , 1 , 0 , false )
MUX_CFG ( DM644X , I2C , 1 , 7 , 1 , 1 , false )
MUX_CFG ( DM644X , MCBSP , 1 , 10 , 1 , 1 , false )
MUX_CFG ( DM644X , UART1 , 1 , 1 , 1 , 1 , true )
MUX_CFG ( DM644X , UART2 , 1 , 2 , 1 , 1 , true )
MUX_CFG ( DM644X , PWM0 , 1 , 4 , 1 , 1 , false )
MUX_CFG ( DM644X , PWM1 , 1 , 5 , 1 , 1 , false )
MUX_CFG ( DM644X , PWM2 , 1 , 6 , 1 , 1 , false )
MUX_CFG ( DM644X , VLYNQEN , 0 , 15 , 1 , 1 , false )
MUX_CFG ( DM644X , VLSCREN , 0 , 14 , 1 , 1 , false )
MUX_CFG ( DM644X , VLYNQWD , 0 , 12 , 3 , 3 , false )
MUX_CFG ( DM644X , EMACEN , 0 , 31 , 1 , 1 , true )
MUX_CFG ( DM644X , GPIO3V , 0 , 31 , 1 , 0 , true )
MUX_CFG ( DM644X , GPIO0 , 0 , 24 , 1 , 0 , true )
MUX_CFG ( DM644X , GPIO3 , 0 , 25 , 1 , 0 , false )
MUX_CFG ( DM644X , GPIO43_44 , 1 , 7 , 1 , 0 , false )
MUX_CFG ( DM644X , GPIO46_47 , 0 , 22 , 1 , 0 , true )
MUX_CFG ( DM644X , RGB666 , 0 , 22 , 1 , 1 , true )
MUX_CFG ( DM644X , LOEEN , 0 , 24 , 1 , 1 , true )
MUX_CFG ( DM644X , LFLDEN , 0 , 25 , 1 , 1 , false )
2009-04-15 23:39:48 +04:00
# endif
2009-04-14 20:30:11 +04:00
} ;
2009-04-15 23:40:00 +04:00
/* FIQ are pri 0-1; otherwise 2-7, with 7 lowest priority */
static u8 dm644x_default_priorities [ DAVINCI_N_AINTC_IRQ ] = {
[ IRQ_VDINT0 ] = 2 ,
[ IRQ_VDINT1 ] = 6 ,
[ IRQ_VDINT2 ] = 6 ,
[ IRQ_HISTINT ] = 6 ,
[ IRQ_H3AINT ] = 6 ,
[ IRQ_PRVUINT ] = 6 ,
[ IRQ_RSZINT ] = 6 ,
[ 7 ] = 7 ,
[ IRQ_VENCINT ] = 6 ,
[ IRQ_ASQINT ] = 6 ,
[ IRQ_IMXINT ] = 6 ,
[ IRQ_VLCDINT ] = 6 ,
[ IRQ_USBINT ] = 4 ,
[ IRQ_EMACINT ] = 4 ,
[ 14 ] = 7 ,
[ 15 ] = 7 ,
[ IRQ_CCINT0 ] = 5 , /* dma */
[ IRQ_CCERRINT ] = 5 , /* dma */
[ IRQ_TCERRINT0 ] = 5 , /* dma */
[ IRQ_TCERRINT ] = 5 , /* dma */
[ IRQ_PSCIN ] = 7 ,
[ 21 ] = 7 ,
[ IRQ_IDE ] = 4 ,
[ 23 ] = 7 ,
[ IRQ_MBXINT ] = 7 ,
[ IRQ_MBRINT ] = 7 ,
[ IRQ_MMCINT ] = 7 ,
[ IRQ_SDIOINT ] = 7 ,
[ 28 ] = 7 ,
[ IRQ_DDRINT ] = 7 ,
[ IRQ_AEMIFINT ] = 7 ,
[ IRQ_VLQINT ] = 4 ,
[ IRQ_TINT0_TINT12 ] = 2 , /* clockevent */
[ IRQ_TINT0_TINT34 ] = 2 , /* clocksource */
[ IRQ_TINT1_TINT12 ] = 7 , /* DSP timer */
[ IRQ_TINT1_TINT34 ] = 7 , /* system tick */
[ IRQ_PWMINT0 ] = 7 ,
[ IRQ_PWMINT1 ] = 7 ,
[ IRQ_PWMINT2 ] = 7 ,
[ IRQ_I2C ] = 3 ,
[ IRQ_UARTINT0 ] = 3 ,
[ IRQ_UARTINT1 ] = 3 ,
[ IRQ_UARTINT2 ] = 3 ,
[ IRQ_SPINT0 ] = 3 ,
[ IRQ_SPINT1 ] = 3 ,
[ 45 ] = 7 ,
[ IRQ_DSP2ARM0 ] = 4 ,
[ IRQ_DSP2ARM1 ] = 4 ,
[ IRQ_GPIO0 ] = 7 ,
[ IRQ_GPIO1 ] = 7 ,
[ IRQ_GPIO2 ] = 7 ,
[ IRQ_GPIO3 ] = 7 ,
[ IRQ_GPIO4 ] = 7 ,
[ IRQ_GPIO5 ] = 7 ,
[ IRQ_GPIO6 ] = 7 ,
[ IRQ_GPIO7 ] = 7 ,
[ IRQ_GPIOBNK0 ] = 7 ,
[ IRQ_GPIOBNK1 ] = 7 ,
[ IRQ_GPIOBNK2 ] = 7 ,
[ IRQ_GPIOBNK3 ] = 7 ,
[ IRQ_GPIOBNK4 ] = 7 ,
[ IRQ_COMMTX ] = 7 ,
[ IRQ_COMMRX ] = 7 ,
[ IRQ_EMUINT ] = 7 ,
} ;
2009-04-14 20:30:11 +04:00
/*----------------------------------------------------------------------*/
2013-06-21 01:06:38 +04:00
static s8
2009-05-21 15:41:35 +04:00
queue_priority_mapping [ ] [ 2 ] = {
/* {event queue no, Priority} */
{ 0 , 3 } ,
{ 1 , 7 } ,
{ - 1 , - 1 } ,
} ;
2010-06-29 10:05:12 +04:00
static struct edma_soc_info edma_cc0_info = {
. queue_priority_mapping = queue_priority_mapping ,
2011-07-10 17:14:35 +04:00
. default_queue = EVENTQ_1 ,
2010-06-29 10:05:12 +04:00
} ;
static struct edma_soc_info * dm644x_edma_info [ EDMA_MAX_CC ] = {
& edma_cc0_info ,
2009-04-14 20:30:11 +04:00
} ;
static struct resource edma_resources [ ] = {
{
2009-05-21 15:41:35 +04:00
. name = " edma_cc0 " ,
2009-04-14 20:30:11 +04:00
. start = 0x01c00000 ,
. end = 0x01c00000 + SZ_64K - 1 ,
. flags = IORESOURCE_MEM ,
} ,
{
. name = " edma_tc0 " ,
. start = 0x01c10000 ,
. end = 0x01c10000 + SZ_1K - 1 ,
. flags = IORESOURCE_MEM ,
} ,
{
. name = " edma_tc1 " ,
. start = 0x01c10400 ,
. end = 0x01c10400 + SZ_1K - 1 ,
. flags = IORESOURCE_MEM ,
} ,
{
2009-05-21 15:41:35 +04:00
. name = " edma0 " ,
2009-04-14 20:30:11 +04:00
. start = IRQ_CCINT0 ,
. flags = IORESOURCE_IRQ ,
} ,
{
2009-05-21 15:41:35 +04:00
. name = " edma0_err " ,
2009-04-14 20:30:11 +04:00
. start = IRQ_CCERRINT ,
. flags = IORESOURCE_IRQ ,
} ,
/* not using TC*_ERR */
} ;
static struct platform_device dm644x_edma_device = {
. name = " edma " ,
2009-05-21 15:41:35 +04:00
. id = 0 ,
. dev . platform_data = dm644x_edma_info ,
2009-04-14 20:30:11 +04:00
. num_resources = ARRAY_SIZE ( edma_resources ) ,
. resource = edma_resources ,
} ;
2009-06-05 14:28:08 +04:00
/* DM6446 EVM uses ASP0; line-out is a pair of RCA jacks */
static struct resource dm644x_asp_resources [ ] = {
{
2013-11-13 18:48:17 +04:00
. name = " mpu " ,
2009-06-05 14:28:08 +04:00
. start = DAVINCI_ASP0_BASE ,
. end = DAVINCI_ASP0_BASE + SZ_8K - 1 ,
. flags = IORESOURCE_MEM ,
} ,
{
. start = DAVINCI_DMA_ASP0_TX ,
. end = DAVINCI_DMA_ASP0_TX ,
. flags = IORESOURCE_DMA ,
} ,
{
. start = DAVINCI_DMA_ASP0_RX ,
. end = DAVINCI_DMA_ASP0_RX ,
. flags = IORESOURCE_DMA ,
} ,
} ;
static struct platform_device dm644x_asp_device = {
ASoC: davinci: fixes for multi-component
Multi-component commit f0fba2ad broke a few things which this patch should
fix. Tested on the DM355 EVM. I've been as careful as I can, but it would be
good if those with access to other Davinci boards could test.
--
The multi-component commit put the initialisation of
snd_soc_dai.[capture|playback]_dma_data into snd_soc_dai_ops.hw_params of the
McBSP, McASP & VCIF drivers (davinci-i2s.c, davinci-mcasp.c & davinci-vcif.c).
The initialisation had to be moved from the probe function in these drivers
because davinci_*_dai changed from snd_soc_dai to snd_soc_dai_driver.
Unfortunately, the DMA params pointer is needed by davinci_pcm_open (in
davinci-pcm.c) before hw_params is called. I have moved the initialisation to
a new snd_soc_dai_ops.startup function in each of these drivers. This fix
indicates that all platforms that use davinci-pcm must have been broken and
need to test with this fix.
--
The multi-component commit also changed the McBSP driver name from
"davinci-asp" to "davinci-i2s" in davinci-i2s.c without updating the board
level references to the driver name. This change is understandable, as there
is a similarly named "davinci-mcasp" driver in davinci-mcasp.c.
There is probably no 'correct' name for this driver. The DM6446 datasheet
calls it the "ASP" and describes it as a "specialised McBSP". The DM355
datasheet calls it the "ASP" and describes it as a "specialised ASP". The
DM365 datasheet calls it the "McBSP". Rather than fix this problem by
reverting to "davinci-asp", I've elected to avoid future confusion with the
"davinci-mcasp" driver by changing it to "davinci-mcbsp", which is also
consistent with the names of the functions in the driver. There are other
fixes required, so it was never going to be as simple as a revert anyway.
--
The DM365 only has one McBSP port (of the McBSP platforms, only the DM355 has
2 ports), so I've changed the the id of the platform_device from 0 to -1.
--
In davinci-evm.c, the DM6446 EVM can no longer share a snd_soc_dai_link
structure with the DM355 EVM as they use different cpu DAI names (the DM355
has 2 ports and the EVM uses the second port, but the DM6446 only has 1 port).
This also means that the 2 boards need different snd_soc_card structures.
--
The codec_name entries in davinci-evm.c didn't match the i2c ids in the board
files. I have only checked and fixed the details of the names used for the
McBSP based platforms. Someone with a McASP based platform (eg DA8xx) should
check the others.
Signed-off-by: Chris Paulson-Ellis <chris@edesix.com>
Acked-by: Liam Girdwood <lrg@slimlogic.co.uk>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
2010-11-16 15:27:09 +03:00
. name = " davinci-mcbsp " ,
2009-06-05 14:28:08 +04:00
. id = - 1 ,
. num_resources = ARRAY_SIZE ( dm644x_asp_resources ) ,
. resource = dm644x_asp_resources ,
} ;
2011-12-21 17:43:37 +04:00
# define DM644X_VPSS_BASE 0x01c73400
2009-09-16 19:53:18 +04:00
static struct resource dm644x_vpss_resources [ ] = {
{
/* VPSS Base address */
. name = " vpss " ,
2011-12-21 17:43:37 +04:00
. start = DM644X_VPSS_BASE ,
. end = DM644X_VPSS_BASE + 0xff ,
. flags = IORESOURCE_MEM ,
2009-09-16 19:53:18 +04:00
} ,
} ;
static struct platform_device dm644x_vpss_device = {
. name = " vpss " ,
. id = - 1 ,
. dev . platform_data = " dm644x_vpss " ,
. num_resources = ARRAY_SIZE ( dm644x_vpss_resources ) ,
. resource = dm644x_vpss_resources ,
} ;
2011-12-21 17:43:38 +04:00
static struct resource dm644x_vpfe_resources [ ] = {
2009-09-16 19:53:18 +04:00
{
. start = IRQ_VDINT0 ,
. end = IRQ_VDINT0 ,
. flags = IORESOURCE_IRQ ,
} ,
{
. start = IRQ_VDINT1 ,
. end = IRQ_VDINT1 ,
. flags = IORESOURCE_IRQ ,
} ,
2010-01-14 02:27:08 +03:00
} ;
2012-02-23 13:47:45 +04:00
static u64 dm644x_video_dma_mask = DMA_BIT_MASK ( 32 ) ;
2010-01-14 02:27:08 +03:00
static struct resource dm644x_ccdc_resource [ ] = {
/* CCDC Base address */
2009-09-16 19:53:18 +04:00
{
. start = 0x01c70400 ,
. end = 0x01c70400 + 0xff ,
. flags = IORESOURCE_MEM ,
} ,
} ;
2010-01-14 02:27:08 +03:00
static struct platform_device dm644x_ccdc_dev = {
. name = " dm644x_ccdc " ,
. id = - 1 ,
. num_resources = ARRAY_SIZE ( dm644x_ccdc_resource ) ,
. resource = dm644x_ccdc_resource ,
. dev = {
2012-02-23 13:47:45 +04:00
. dma_mask = & dm644x_video_dma_mask ,
2010-01-14 02:27:08 +03:00
. coherent_dma_mask = DMA_BIT_MASK ( 32 ) ,
} ,
} ;
2011-12-21 17:43:38 +04:00
static struct platform_device dm644x_vpfe_dev = {
2009-09-16 19:53:18 +04:00
. name = CAPTURE_DRV_NAME ,
. id = - 1 ,
2011-12-21 17:43:38 +04:00
. num_resources = ARRAY_SIZE ( dm644x_vpfe_resources ) ,
. resource = dm644x_vpfe_resources ,
2009-09-16 19:53:18 +04:00
. dev = {
2012-02-23 13:47:45 +04:00
. dma_mask = & dm644x_video_dma_mask ,
. coherent_dma_mask = DMA_BIT_MASK ( 32 ) ,
} ,
} ;
# define DM644X_OSD_BASE 0x01c72600
static struct resource dm644x_osd_resources [ ] = {
{
. start = DM644X_OSD_BASE ,
. end = DM644X_OSD_BASE + 0x1ff ,
. flags = IORESOURCE_MEM ,
} ,
} ;
static struct platform_device dm644x_osd_dev = {
2012-11-20 14:30:36 +04:00
. name = DM644X_VPBE_OSD_SUBDEV_NAME ,
2012-02-23 13:47:45 +04:00
. id = - 1 ,
. num_resources = ARRAY_SIZE ( dm644x_osd_resources ) ,
. resource = dm644x_osd_resources ,
. dev = {
. dma_mask = & dm644x_video_dma_mask ,
. coherent_dma_mask = DMA_BIT_MASK ( 32 ) ,
} ,
} ;
# define DM644X_VENC_BASE 0x01c72400
static struct resource dm644x_venc_resources [ ] = {
{
. start = DM644X_VENC_BASE ,
. end = DM644X_VENC_BASE + 0x17f ,
. flags = IORESOURCE_MEM ,
} ,
} ;
# define DM644X_VPSS_MUXSEL_PLL2_MODE BIT(0)
# define DM644X_VPSS_MUXSEL_VPBECLK_MODE BIT(1)
# define DM644X_VPSS_VENCLKEN BIT(3)
# define DM644X_VPSS_DACCLKEN BIT(4)
static int dm644x_venc_setup_clock ( enum vpbe_enc_timings_type type ,
2012-10-01 18:39:46 +04:00
unsigned int pclock )
2012-02-23 13:47:45 +04:00
{
int ret = 0 ;
u32 v = DM644X_VPSS_VENCLKEN ;
switch ( type ) {
case VPBE_ENC_STD :
v | = DM644X_VPSS_DACCLKEN ;
writel ( v , DAVINCI_SYSMOD_VIRT ( SYSMOD_VPSS_CLKCTL ) ) ;
break ;
2013-02-15 22:06:28 +04:00
case VPBE_ENC_DV_TIMINGS :
2012-10-01 18:39:46 +04:00
if ( pclock < = 27000000 ) {
2012-10-03 10:35:00 +04:00
v | = DM644X_VPSS_DACCLKEN ;
2012-02-23 13:47:45 +04:00
writel ( v , DAVINCI_SYSMOD_VIRT ( SYSMOD_VPSS_CLKCTL ) ) ;
2012-10-01 18:39:46 +04:00
} else {
2012-02-23 13:47:45 +04:00
/*
* For HD , use external clock source since
* HD requires higher clock rate
*/
v | = DM644X_VPSS_MUXSEL_VPBECLK_MODE ;
writel ( v , DAVINCI_SYSMOD_VIRT ( SYSMOD_VPSS_CLKCTL ) ) ;
}
break ;
default :
ret = - EINVAL ;
}
return ret ;
}
static struct resource dm644x_v4l2_disp_resources [ ] = {
{
. start = IRQ_VENCINT ,
. end = IRQ_VENCINT ,
. flags = IORESOURCE_IRQ ,
} ,
} ;
static struct platform_device dm644x_vpbe_display = {
. name = " vpbe-v4l2 " ,
. id = - 1 ,
. num_resources = ARRAY_SIZE ( dm644x_v4l2_disp_resources ) ,
. resource = dm644x_v4l2_disp_resources ,
. dev = {
. dma_mask = & dm644x_video_dma_mask ,
. coherent_dma_mask = DMA_BIT_MASK ( 32 ) ,
} ,
} ;
static struct venc_platform_data dm644x_venc_pdata = {
. setup_clock = dm644x_venc_setup_clock ,
} ;
static struct platform_device dm644x_venc_dev = {
2012-11-20 14:30:36 +04:00
. name = DM644X_VPBE_VENC_SUBDEV_NAME ,
2012-02-23 13:47:45 +04:00
. id = - 1 ,
. num_resources = ARRAY_SIZE ( dm644x_venc_resources ) ,
. resource = dm644x_venc_resources ,
. dev = {
. dma_mask = & dm644x_video_dma_mask ,
. coherent_dma_mask = DMA_BIT_MASK ( 32 ) ,
. platform_data = & dm644x_venc_pdata ,
} ,
} ;
static struct platform_device dm644x_vpbe_dev = {
. name = " vpbe_controller " ,
. id = - 1 ,
. dev = {
. dma_mask = & dm644x_video_dma_mask ,
2009-09-16 19:53:18 +04:00
. coherent_dma_mask = DMA_BIT_MASK ( 32 ) ,
} ,
} ;
2013-08-18 09:19:00 +04:00
static struct resource dm644_gpio_resources [ ] = {
{ /* registers */
. start = DAVINCI_GPIO_BASE ,
. end = DAVINCI_GPIO_BASE + SZ_4K - 1 ,
. flags = IORESOURCE_MEM ,
} ,
{ /* interrupt */
. start = IRQ_GPIOBNK0 ,
. end = IRQ_GPIOBNK4 ,
. flags = IORESOURCE_IRQ ,
} ,
} ;
static struct davinci_gpio_platform_data dm644_gpio_platform_data = {
. ngpio = 71 ,
} ;
int __init dm644x_gpio_register ( void )
{
return davinci_gpio_register ( dm644_gpio_resources ,
2013-11-08 10:45:56 +04:00
ARRAY_SIZE ( dm644_gpio_resources ) ,
2013-08-18 09:19:00 +04:00
& dm644_gpio_platform_data ) ;
}
2009-04-14 20:30:11 +04:00
/*----------------------------------------------------------------------*/
2009-05-07 17:19:40 +04:00
2009-04-15 23:38:58 +04:00
static struct map_desc dm644x_io_desc [ ] = {
{
. virtual = IO_VIRT ,
. pfn = __phys_to_pfn ( IO_PHYS ) ,
. length = IO_SIZE ,
. type = MT_DEVICE
} ,
} ;
2009-04-15 23:39:09 +04:00
/* Contents of JTAG ID register used to identify exact cpu type */
static struct davinci_id dm644x_ids [ ] = {
{
. variant = 0x0 ,
. part_no = 0xb700 ,
. manufacturer = 0x017 ,
. cpu_id = DAVINCI_CPU_ID_DM6446 ,
. name = " dm6446 " ,
} ,
2009-06-02 14:48:43 +04:00
{
. variant = 0x1 ,
. part_no = 0xb700 ,
. manufacturer = 0x017 ,
. cpu_id = DAVINCI_CPU_ID_DM6446 ,
. name = " dm6446a " ,
} ,
2009-04-15 23:39:09 +04:00
} ;
2010-05-08 01:06:36 +04:00
static u32 dm644x_psc_bases [ ] = { DAVINCI_PWR_SLEEP_CNTRL_BASE } ;
2009-04-15 23:39:33 +04:00
2009-04-15 23:40:11 +04:00
/*
* T0_BOT : Timer 0 , bottom : clockevent source for hrtimers
* T0_TOP : Timer 0 , top : clocksource for generic timekeeping
* T1_BOT : Timer 1 , bottom : ( used by DSP in TI DSPLink code )
* T1_TOP : Timer 1 , top : < unused >
*/
2010-02-26 02:36:38 +03:00
static struct davinci_timer_info dm644x_timer_info = {
2009-04-15 23:40:11 +04:00
. timers = davinci_timer_instance ,
. clockevent_id = T0_BOT ,
. clocksource_id = T0_TOP ,
} ;
2013-06-19 13:15:38 +04:00
static struct plat_serial8250_port dm644x_serial0_platform_data [ ] = {
2009-03-18 20:36:08 +03:00
{
. mapbase = DAVINCI_UART0_BASE ,
. irq = IRQ_UARTINT0 ,
. flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST |
UPF_IOREMAP ,
. iotype = UPIO_MEM ,
. regshift = 2 ,
} ,
2013-06-19 13:15:38 +04:00
{
. flags = 0 ,
}
} ;
static struct plat_serial8250_port dm644x_serial1_platform_data [ ] = {
2009-03-18 20:36:08 +03:00
{
. mapbase = DAVINCI_UART1_BASE ,
. irq = IRQ_UARTINT1 ,
. flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST |
UPF_IOREMAP ,
. iotype = UPIO_MEM ,
. regshift = 2 ,
} ,
2013-06-19 13:15:38 +04:00
{
. flags = 0 ,
}
} ;
static struct plat_serial8250_port dm644x_serial2_platform_data [ ] = {
2009-03-18 20:36:08 +03:00
{
. mapbase = DAVINCI_UART2_BASE ,
. irq = IRQ_UARTINT2 ,
. flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST |
UPF_IOREMAP ,
. iotype = UPIO_MEM ,
. regshift = 2 ,
} ,
{
2013-06-19 13:15:38 +04:00
. flags = 0 ,
}
2009-03-18 20:36:08 +03:00
} ;
2013-06-19 13:15:42 +04:00
struct platform_device dm644x_serial_device [ ] = {
2013-06-19 13:15:38 +04:00
{
. name = " serial8250 " ,
. id = PLAT8250_DEV_PLATFORM ,
. dev = {
. platform_data = dm644x_serial0_platform_data ,
}
2009-03-18 20:36:08 +03:00
} ,
2013-06-19 13:15:38 +04:00
{
. name = " serial8250 " ,
. id = PLAT8250_DEV_PLATFORM1 ,
. dev = {
. platform_data = dm644x_serial1_platform_data ,
}
} ,
{
. name = " serial8250 " ,
. id = PLAT8250_DEV_PLATFORM2 ,
. dev = {
. platform_data = dm644x_serial2_platform_data ,
}
} ,
{
}
2009-03-18 20:36:08 +03:00
} ;
2009-04-15 23:38:58 +04:00
static struct davinci_soc_info davinci_soc_info_dm644x = {
. io_desc = dm644x_io_desc ,
. io_desc_num = ARRAY_SIZE ( dm644x_io_desc ) ,
2010-05-08 01:06:34 +04:00
. jtag_id_reg = 0x01c40028 ,
2009-04-15 23:39:09 +04:00
. ids = dm644x_ids ,
. ids_num = ARRAY_SIZE ( dm644x_ids ) ,
2009-04-15 23:39:23 +04:00
. cpu_clks = dm644x_clks ,
2009-04-15 23:39:33 +04:00
. psc_bases = dm644x_psc_bases ,
. psc_bases_num = ARRAY_SIZE ( dm644x_psc_bases ) ,
2010-05-08 01:06:38 +04:00
. pinmux_base = DAVINCI_SYSTEM_MODULE_BASE ,
2009-04-15 23:39:48 +04:00
. pinmux_pins = dm644x_pins ,
. pinmux_pins_num = ARRAY_SIZE ( dm644x_pins ) ,
2010-05-08 01:06:37 +04:00
. intc_base = DAVINCI_ARM_INTC_BASE ,
2009-04-15 23:40:00 +04:00
. intc_type = DAVINCI_INTC_TYPE_AINTC ,
. intc_irq_prios = dm644x_default_priorities ,
. intc_irq_num = DAVINCI_N_AINTC_IRQ ,
2009-04-15 23:40:11 +04:00
. timer_info = & dm644x_timer_info ,
2009-04-15 23:40:56 +04:00
. emac_pdata = & dm644x_emac_pdata ,
2009-05-01 04:35:48 +04:00
. sram_dma = 0x00008000 ,
. sram_len = SZ_16K ,
2009-04-15 23:38:58 +04:00
} ;
2009-06-05 14:28:08 +04:00
void __init dm644x_init_asp ( struct snd_platform_data * pdata )
{
davinci_cfg_reg ( DM644X_MCBSP ) ;
dm644x_asp_device . dev . platform_data = pdata ;
platform_device_register ( & dm644x_asp_device ) ;
}
2009-04-14 20:30:11 +04:00
void __init dm644x_init ( void )
{
2009-04-15 23:38:58 +04:00
davinci_common_init ( & davinci_soc_info_dm644x ) ;
2011-12-21 17:43:36 +04:00
davinci_map_sysmod ( ) ;
2009-04-14 20:30:11 +04:00
}
2012-02-23 13:47:45 +04:00
int __init dm644x_init_video ( struct vpfe_config * vpfe_cfg ,
struct vpbe_config * vpbe_cfg )
2009-04-14 20:30:11 +04:00
{
2012-02-23 13:47:45 +04:00
if ( vpfe_cfg | | vpbe_cfg )
platform_device_register ( & dm644x_vpss_device ) ;
if ( vpfe_cfg ) {
dm644x_vpfe_dev . dev . platform_data = vpfe_cfg ;
platform_device_register ( & dm644x_ccdc_dev ) ;
platform_device_register ( & dm644x_vpfe_dev ) ;
}
if ( vpbe_cfg ) {
dm644x_vpbe_dev . dev . platform_data = vpbe_cfg ;
platform_device_register ( & dm644x_osd_dev ) ;
platform_device_register ( & dm644x_venc_dev ) ;
platform_device_register ( & dm644x_vpbe_dev ) ;
platform_device_register ( & dm644x_vpbe_display ) ;
}
2011-12-21 17:43:39 +04:00
return 0 ;
}
static int __init dm644x_init_devices ( void )
{
2014-02-26 08:59:43 +04:00
int ret = 0 ;
2011-12-21 17:43:39 +04:00
if ( ! cpu_is_davinci_dm644x ( ) )
return 0 ;
2009-04-14 20:30:11 +04:00
platform_device_register ( & dm644x_edma_device ) ;
2010-09-15 18:11:22 +04:00
platform_device_register ( & dm644x_mdio_device ) ;
2009-04-15 23:40:56 +04:00
platform_device_register ( & dm644x_emac_device ) ;
2010-09-15 18:11:22 +04:00
2014-02-26 08:59:43 +04:00
ret = davinci_init_wdt ( ) ;
if ( ret )
pr_warn ( " %s: watchdog init failed: %d \n " , __func__ , ret ) ;
return ret ;
2009-04-14 20:30:11 +04:00
}
postcore_initcall ( dm644x_init_devices ) ;