コード例 #1
0
ファイル: gpio.c プロジェクト: gtvhacker/Logitech-Revue
void davinci_gpio_init(void)
{
	struct gpio_bank *gpio_bank;

#if defined(CONFIG_ARCH_DAVINCI644x) || defined(CONFIG_ARCH_DAVINCI_DM357)
	if (cpu_is_davinci_dm644x() || cpu_is_davinci_dm357())
		gpio_bank = &gpio_bank_dm6446;
#endif
#ifdef CONFIG_ARCH_DAVINCI_DM355
	if (cpu_is_davinci_dm355())
		gpio_bank = &gpio_bank_dm355;
#endif
#ifdef CONFIG_ARCH_DAVINCI_DM365
	if (cpu_is_davinci_dm365())
		gpio_bank = &gpio_bank_dm365;
#endif
#ifdef CONFIG_ARCH_DAVINCI_DM646x
	if (cpu_is_davinci_dm6467())
		gpio_bank = &gpio_bank_dm646x;
#endif
	if (!gpio_bank)
		BUG();

	davinci_gpio_irq_setup(gpio_bank);
}
コード例 #2
0
ファイル: mux_cfg.c プロジェクト: gtvhacker/Logitech-Revue
void __init davinci_mux_init(void)
{
	const struct pin_config *table;
	unsigned size;

	if (cpu_is_davinci_dm365()) {
		davinci_pins = dm365_pins;
		davinci_num_pins = ARRAY_SIZE(dm365_pins);
		table = davinci_dm365_pinmux;
		size  = ARRAY_SIZE(davinci_dm365_pinmux);
	} else if (cpu_is_davinci_dm355()) {
		davinci_pins = dm355_pins;
		davinci_num_pins = ARRAY_SIZE(dm355_pins);
		table = davinci_dm355_pinmux;
		size  = ARRAY_SIZE(davinci_dm355_pinmux);
	} else if (cpu_is_davinci_dm6467()) {
		davinci_pins = dm646x_pins;
		davinci_num_pins = ARRAY_SIZE(dm646x_pins);
		table = davinci_dm646x_pinmux;
		size  = ARRAY_SIZE(davinci_dm646x_pinmux);
	} else if (cpu_is_davinci_dm644x()) {
		davinci_pins = dm644x_pins;
		davinci_num_pins = ARRAY_SIZE(dm644x_pins);
		table = davinci_dm644x_pinmux;
		size  = ARRAY_SIZE(davinci_dm644x_pinmux);
	} else {
		if (!cpu_is_davinci_dm357())
			BUG();
		davinci_pins = dm357_pins;
		davinci_num_pins = ARRAY_SIZE(dm357_pins);
		table = davinci_dm357_pinmux;
		size  = ARRAY_SIZE(davinci_dm357_pinmux);
	}
	davinci_mux_register(table, size, davinci_get_pins, pinmux_in_use);
}
コード例 #3
0
ファイル: io.c プロジェクト: JacksonZhangkun/linux-2.6
void __init davinci_map_common_io(void)
{
	iotable_init(davinci_io_desc, ARRAY_SIZE(davinci_io_desc));

	/* We want to check CPU revision early for cpu_is_davinci_xxxx() macros.
	 * IO space mapping must be initialized before we can do that.
	 */
	davinci_check_revision();

	if (cpu_is_davinci_dm644x()) {
		iotable_init(dm644x_io_desc, ARRAY_SIZE(dm644x_io_desc));
	} else if (cpu_is_davinci_dm6467()) {
		davinci_cpu_index = DM6467_CPU_IDX;
		iotable_init(dm646x_io_desc, ARRAY_SIZE(dm646x_io_desc));
	} else if (cpu_is_davinci_dm355()) {
		davinci_cpu_index = DM355_CPU_IDX;
	}

	/* Normally devicemaps_init() would flush caches and tlb after
	 * mdesc->map_io(), but we must also do it here because of the CPU
	 * revision check below.
	 */
	flush_tlb_all();
	flush_cache_all();


	davinci_mux_init();
	davinci_clk_init();
}
コード例 #4
0
/* type = 0 for TVP5146 and 1 for Image sensor */
int tvp514x_set_input_mux(unsigned char channel)
{
	int err = 0;
	u8 val[2];
	u32 val1;
	val[0] = 8;
	val[1] = 0x0;

	if (cpu_is_davinci_dm644x())
		return err;

/* Logi	if (cpu_is_davinci_dm355())
		err = davinci_i2c_write(2, val, MSP430_I2C_ADDR);
	else */if (cpu_is_davinci_dm365()) {
		/* drive the sensor reset line low */
		image_sensor_hw_reset(0);
		/* set tvp5146 reset line high */
		tvp514x_hw_reset(1);
		/* Set Mux for TVP5146 */
		val1 = cpld_read(DM365_CPLD_REGISTER3);
		val1 &= ~DM365_VIDEO_MUX_MASK;
		val1 |= DM365_TVP5146_SEL;
		cpld_write(val1, DM365_CPLD_REGISTER3);
	}
	return err;
}
コード例 #5
0
int mt9xxx_set_input_mux(unsigned char channel)
{
	int err = 0;
	u8 val[2];
	u32 val1;
	val[0] = 8;

	if (cpu_is_davinci_dm644x())
		return err;

	val[1] = 0x80;

	if (cpu_is_davinci_dm355()) {
		//Logi err = davinci_i2c_write(2, val, MSP430_I2C_ADDR);
		if (err)
			return err;
	} else if (cpu_is_davinci_dm365()) {
		/* Drive TVP5146 Reset to low */
		tvp514x_hw_reset(0);
		/* drive the sensor reset line high */
		image_sensor_hw_reset(1);
		/* Set Mux for image sensor */
		val1 = cpld_read(DM365_CPLD_REGISTER3);
		val1 &= ~DM365_VIDEO_MUX_MASK;
		val1 |= DM365_SENSOR_SEL;
		cpld_write(val1, DM365_CPLD_REGISTER3);
	}
	/* For image sensor we need to program I2C switch
	 * PCA9543A
	 */
	//Logi val[0] = 0x01;
	//Logi davinci_i2c_write(1, val, PCA9543A_I2C_ADDR);
	return 0;
}
コード例 #6
0
ファイル: devices.c プロジェクト: cake654326/xpenology
void __init davinci_init_i2c(struct davinci_i2c_platform_data *pdata)
{
	if (cpu_is_davinci_dm644x())
		davinci_cfg_reg(DM644X_I2C);

	davinci_i2c_device.dev.platform_data = pdata;
	(void) platform_device_register(&davinci_i2c_device);
}
コード例 #7
0
ファイル: dm644x.c プロジェクト: 12thmantec/novena-linux
static int __init dm644x_init_devices(void)
{
	if (!cpu_is_davinci_dm644x())
		return 0;

	platform_device_register(&dm644x_edma_device);

	platform_device_register(&dm644x_mdio_device);
	platform_device_register(&dm644x_emac_device);

	return 0;
}
コード例 #8
0
ファイル: irq.c プロジェクト: Indigenous/linux-2.6
/* ARM Interrupt Controller Initialization */
void __init davinci_irq_init(void)
{
	unsigned i;

	if (cpu_is_davinci_dm644x())
		davinci_def_priorities = dm644x_default_priorities;
	else if (cpu_is_davinci_dm646x())
		davinci_def_priorities = dm646x_default_priorities;
	else if (cpu_is_davinci_dm355())
		davinci_def_priorities = dm355_default_priorities;

	/* Clear all interrupt requests */
	davinci_irq_writel(~0x0, FIQ_REG0_OFFSET);
	davinci_irq_writel(~0x0, FIQ_REG1_OFFSET);
	davinci_irq_writel(~0x0, IRQ_REG0_OFFSET);
	davinci_irq_writel(~0x0, IRQ_REG1_OFFSET);

	/* Disable all interrupts */
	davinci_irq_writel(0x0, IRQ_ENT_REG0_OFFSET);
	davinci_irq_writel(0x0, IRQ_ENT_REG1_OFFSET);

	/* Interrupts disabled immediately, IRQ entry reflects all */
	davinci_irq_writel(0x0, IRQ_INCTL_REG_OFFSET);

	/* we don't use the hardware vector table, just its entry addresses */
	davinci_irq_writel(0, IRQ_EABASE_REG_OFFSET);

	/* Clear all interrupt requests */
	davinci_irq_writel(~0x0, FIQ_REG0_OFFSET);
	davinci_irq_writel(~0x0, FIQ_REG1_OFFSET);
	davinci_irq_writel(~0x0, IRQ_REG0_OFFSET);
	davinci_irq_writel(~0x0, IRQ_REG1_OFFSET);

	for (i = IRQ_INTPRI0_REG_OFFSET; i <= IRQ_INTPRI7_REG_OFFSET; i += 4) {
		unsigned	j;
		u32		pri;

		for (j = 0, pri = 0; j < 32; j += 4, davinci_def_priorities++)
			pri |= (*davinci_def_priorities & 0x07) << j;
		davinci_irq_writel(pri, i);
	}

	/* set up genirq dispatch for ARM INTC */
	for (i = 0; i < DAVINCI_N_AINTC_IRQ; i++) {
		set_irq_chip(i, &davinci_irq_chip_0);
		set_irq_flags(i, IRQF_VALID | IRQF_PROBE);
		if (i != IRQ_TINT1_TINT34)
			set_irq_handler(i, handle_edge_irq);
		else
			set_irq_handler(i, handle_level_irq);
	}
}
コード例 #9
0
ファイル: dm644x.c プロジェクト: 22101959/linux-3.8.13
static int __init dm644x_init_devices(void)
{
	if (!cpu_is_davinci_dm644x())
		return 0;

	platform_device_register(&dm644x_edma_device);

	platform_device_register(&dm644x_mdio_device);
	platform_device_register(&dm644x_emac_device);
	clk_add_alias(NULL, dev_name(&dm644x_mdio_device.dev),
		      NULL, &dm644x_emac_device.dev);

	return 0;
}
コード例 #10
0
/* Connect the I2C pins to the I2C controller. */
static void enable_i2c_pins(void)
{
	unsigned long flags;

	local_irq_save(flags);

	if (cpu_is_davinci_dm644x())
		davinci_cfg_reg(DM644X_I2C);
	else if (cpu_is_davinci_dm355()) {
		davinci_cfg_reg(DM355_I2C_SDA);
		davinci_cfg_reg(DM355_I2C_SCL);
	}

	local_irq_restore(flags);
}
コード例 #11
0
ファイル: devices.c プロジェクト: cake654326/xpenology
void __init davinci_init_ide(void)
{
	if (cpu_is_davinci_dm644x()) {
		davinci_cfg_reg(DM644X_HPIEN_DISABLE);
		davinci_cfg_reg(DM644X_ATAEN);
		davinci_cfg_reg(DM644X_HDIREN);
	} else if (cpu_is_davinci_dm646x()) {
		/* IRQ_DM646X_IDE is the same as IRQ_IDE */
		davinci_cfg_reg(DM646X_ATAEN);
	} else {
		WARN_ON(1);
		return;
	}

	platform_device_register(&ide_device);
}
コード例 #12
0
/* Generate a pulse on the I2C clock pin. */
static void pulse_i2c_clock(void)
{
	if (cpu_is_davinci_dm644x()) {
		/* I2C clock on GPIO43 */
		gpio_set_value(43, 0);
		udelay(20);
		gpio_set_value(43, 1);
		udelay(20);
	} else if (cpu_is_davinci_dm355()) {
		/* I2C clock on GPIO14 */
		gpio_set_value(14, 0);
		udelay(20);
		gpio_set_value(14, 1);
		udelay(20);
	}
}
コード例 #13
0
ファイル: dm644x.c プロジェクト: AbheekG/XIA-for-Linux
static int __init dm644x_init_devices(void)
{
	if (!cpu_is_davinci_dm644x())
		return 0;

	/* Add ccdc clock aliases */
	clk_add_alias("master", dm644x_ccdc_dev.name, "vpss_master", NULL);
	clk_add_alias("slave", dm644x_ccdc_dev.name, "vpss_slave", NULL);
	platform_device_register(&dm644x_edma_device);

	platform_device_register(&dm644x_mdio_device);
	platform_device_register(&dm644x_emac_device);
	clk_add_alias(NULL, dev_name(&dm644x_mdio_device.dev),
		      NULL, &dm644x_emac_device.dev);

	platform_device_register(&dm644x_vpss_device);
	platform_device_register(&dm644x_ccdc_dev);
	platform_device_register(&vpfe_capture_dev);

	return 0;
}
コード例 #14
0
/*
 * Waiting on Bus Busy
 */
static int i2c_davinci_wait_for_bb(char allow_sleep, struct i2c_adapter *adap)
{
	unsigned long timeout;
	struct i2c_davinci_device *dev = i2c_get_adapdata(adap);
	int i;
	static	char to_cnt = 0;

	timeout = jiffies + DAVINCI_I2C_TIMEOUT;
	while ((i2c_davinci_dev.regs->icstr) & DAVINCI_I2C_ICSTR_BB_MASK) {
		if (to_cnt <= 2) {
			if (time_after(jiffies, timeout)) {
				i2c_warn("timeout waiting for bus ready");
				to_cnt ++;
				return -ETIMEDOUT;
			}
		} else if (cpu_is_davinci_dm644x() || cpu_is_davinci_dm355()) {

			to_cnt = 0;
			/* Send the NACK to the slave */
			dev->regs->icmdr |= DAVINCI_I2C_ICMDR_NACKMOD_MASK;
			/* Disable I2C */
			disable_i2c_pins();
			
			for (i = 0; i < 10; i++)
				pulse_i2c_clock();

			/* Re-enable I2C */
			enable_i2c_pins();
			i2c_davinci_reset(dev);
			dev->cmd_complete = 0;
			return -ETIMEDOUT;
		}
		if (allow_sleep)
			schedule_timeout(1);
	}

	return 0;
}
コード例 #15
0
static int __init dm644x_init_devices(void)
{
	struct platform_device *edma_pdev;
	int ret = 0;

	if (!cpu_is_davinci_dm644x())
		return 0;

	edma_pdev = platform_device_register_full(&dm644x_edma_device);
	if (IS_ERR(edma_pdev)) {
		pr_warn("%s: Failed to register eDMA\n", __func__);
		return PTR_ERR(edma_pdev);
	}

	platform_device_register(&dm644x_mdio_device);
	platform_device_register(&dm644x_emac_device);

	ret = davinci_init_wdt();
	if (ret)
		pr_warn("%s: watchdog init failed: %d\n", __func__, ret);

	return ret;
}
コード例 #16
0
/*
 * Configure the I2C data pin as a GPIO input and the I2C clock pin as a
 * high GPIO output.
 */
static void disable_i2c_pins(void)
{
	unsigned long flags;

	local_irq_save(flags);

	if (cpu_is_davinci_dm644x()) {
		/* I2C clock on GPIO43, I2C data on GPIO44 */
		gpio_direction_input(44);
		gpio_direction_output(43, 0);
		gpio_set_value(43, 1);
		davinci_cfg_reg(DM644X_GPIO43_44);
	} else if (cpu_is_davinci_dm355()) {
		/* I2C clock on GPIO14, I2C data on GPIO15 */
		gpio_direction_input(15);
		gpio_direction_output(14, 0);
		gpio_set_value(14, 1);
		davinci_cfg_reg(DM355_GPIO14);
		davinci_cfg_reg(DM355_GPIO15);
	}

	local_irq_restore(flags);
}
コード例 #17
0
/*
 * Low level master read/write transaction. This function is called
 * from i2c_davinci_xfer.
 */
static int
i2c_davinci_xfer_msg(struct i2c_adapter *adap, struct i2c_msg *msg, int stop)
{
	struct i2c_davinci_device *dev = i2c_get_adapdata(adap);
	u8 zero_byte = 0;
	u32 flag = 0, stat = 0;
	int i;

	DEB1("addr: 0x%04x, len: %d, flags: 0x%x, stop: %d",
	     msg->addr, msg->len, msg->flags, stop);

	/* Introduce a 100musec delay.  Required for Davinci EVM board only */
	if (cpu_is_davinci_dm644x())
		udelay(100);

	/* set the slave address */
	dev->regs->icsar = msg->addr;

	/* Sigh, seems we can't do zero length transactions. Thus, we
	 * can't probe for devices w/o actually sending/receiving at least
	 * a single byte. So we'll set count to 1 for the zero length
	 * transaction case and hope we don't cause grief for some
	 * arbitrary device due to random byte write/read during
	 * probes.
	 */
	if (msg->len == 0) {
		dev->buf = &zero_byte;
		dev->buf_len = 1;
	} else {
		dev->buf = msg->buf;
		dev->buf_len = msg->len;
	}

	dev->regs->iccnt = dev->buf_len;
	dev->cmd_complete = 0;
	dev->cmd_err = 0;

	/* Clear any pending interrupts by reading the IVR */
	stat = dev->regs->icivr;

	/* Take I2C out of reset, configure it as master and set the start bit */
	flag =
	    DAVINCI_I2C_ICMDR_IRS_MASK | DAVINCI_I2C_ICMDR_MST_MASK |
	    DAVINCI_I2C_ICMDR_STT_MASK;

	/* if the slave address is ten bit address, enable XA bit */
	if (msg->flags & I2C_M_TEN)
		flag |= DAVINCI_I2C_ICMDR_XA_MASK;
	if (!(msg->flags & I2C_M_RD))
		flag |= DAVINCI_I2C_ICMDR_TRX_MASK;
	if (stop)
		flag |= DAVINCI_I2C_ICMDR_STP_MASK;

	/* Enable receive and transmit interrupts */
	if (msg->flags & I2C_M_RD)
		dev->regs->icimr |= DAVINCI_I2C_ICIMR_ICRRDY_MASK;
	else
		dev->regs->icimr |= DAVINCI_I2C_ICIMR_ICXRDY_MASK;

	/* write the data into mode register */
	dev->regs->icmdr = flag;

	/* wait for the transaction to complete */
	wait_event_timeout (dev->cmd_wait, dev->cmd_complete, DAVINCI_I2C_TIMEOUT);

	dev->buf_len = 0;

	if (!dev->cmd_complete) {
		i2c_warn("i2c: cmd complete failed: complete = 0x%x, \
			  icstr = 0x%x\n", dev->cmd_complete,
			  dev->regs->icstr);

		if (cpu_is_davinci_dm644x() || cpu_is_davinci_dm355()) {
			/* Send the NACK to the slave */
			dev->regs->icmdr |= DAVINCI_I2C_ICMDR_NACKMOD_MASK;
			/* Disable I2C */
			disable_i2c_pins();

			/* Send high and low on the SCL line */
			for (i = 0; i < 10; i++)
				pulse_i2c_clock();

			/* Re-enable I2C */
			enable_i2c_pins();
		}


		i2c_davinci_reset(dev);
		dev->cmd_complete = 0;
		return -ETIMEDOUT;
	}
	dev->cmd_complete = 0;

	/* no error */
	if (!dev->cmd_err)
		return msg->len;

	/* We have an error */
	if (dev->cmd_err & DAVINCI_I2C_ICSTR_NACK_MASK) {
		if (msg->flags & I2C_M_IGNORE_NAK)
			return msg->len;
		if (stop)
			dev->regs->icmdr |= DAVINCI_I2C_ICMDR_STP_MASK;
		return -EREMOTEIO;
	}
	if (dev->cmd_err & DAVINCI_I2C_ICSTR_AL_MASK) {
		i2c_davinci_reset(dev);
		return -EIO;
	}
	return msg->len;
}
コード例 #18
0
ファイル: devices.c プロジェクト: cake654326/xpenology
void __init davinci_setup_mmc(int module, struct davinci_mmc_config *config)
{
	struct platform_device	*pdev = NULL;

	if (WARN_ON(cpu_is_davinci_dm646x()))
		return;

	/* REVISIT: update PINMUX, ARM_IRQMUX, and EDMA_EVTMUX here too;
	 * for example if MMCSD1 is used for SDIO, maybe DAT2 is unused.
	 *
	 * FIXME dm6441 (no MMC/SD), dm357 (one), and dm335 (two) are
	 * not handled right here ...
	 */
	switch (module) {
	case 1:
		if (cpu_is_davinci_dm355()) {
			/* REVISIT we may not need all these pins if e.g. this
			 * is a hard-wired SDIO device...
			 */
			davinci_cfg_reg(DM355_SD1_CMD);
			davinci_cfg_reg(DM355_SD1_CLK);
			davinci_cfg_reg(DM355_SD1_DATA0);
			davinci_cfg_reg(DM355_SD1_DATA1);
			davinci_cfg_reg(DM355_SD1_DATA2);
			davinci_cfg_reg(DM355_SD1_DATA3);
		} else if (cpu_is_davinci_dm365()) {
			/* Configure pull down control */
			unsigned v;

			v = __raw_readl(DAVINCI_SYSMOD_VIRT(SYSMOD_PUPDCTL1));
			__raw_writel(v & ~0xfc0,
					DAVINCI_SYSMOD_VIRT(SYSMOD_PUPDCTL1));

			mmcsd1_resources[0].start = DM365_MMCSD1_BASE;
			mmcsd1_resources[0].end = DM365_MMCSD1_BASE +
							SZ_4K - 1;
			mmcsd1_resources[2].start = IRQ_DM365_SDIOINT1;
			davinci_mmcsd1_device.name = "da830-mmc";
		} else
			break;

		pdev = &davinci_mmcsd1_device;
		break;
	case 0:
		if (cpu_is_davinci_dm355()) {
			mmcsd0_resources[0].start = DM355_MMCSD0_BASE;
			mmcsd0_resources[0].end = DM355_MMCSD0_BASE + SZ_4K - 1;
			mmcsd0_resources[2].start = IRQ_DM355_SDIOINT0;

			/* expose all 6 MMC0 signals:  CLK, CMD, DATA[0..3] */
			davinci_cfg_reg(DM355_MMCSD0);

			/* enable RX EDMA */
			davinci_cfg_reg(DM355_EVT26_MMC0_RX);
		} else if (cpu_is_davinci_dm365()) {
			mmcsd0_resources[0].start = DM365_MMCSD0_BASE;
			mmcsd0_resources[0].end = DM365_MMCSD0_BASE +
							SZ_4K - 1;
			mmcsd0_resources[2].start = IRQ_DM365_SDIOINT0;
			davinci_mmcsd0_device.name = "da830-mmc";
		} else if (cpu_is_davinci_dm644x()) {
			/* REVISIT: should this be in board-init code? */
			/* Power-on 3.3V IO cells */
			__raw_writel(0,
				DAVINCI_SYSMOD_VIRT(SYSMOD_VDD3P3VPWDN));
			/*Set up the pull regiter for MMC */
			davinci_cfg_reg(DM644X_MSTK);
		}

		pdev = &davinci_mmcsd0_device;
		break;
	}

	if (WARN_ON(!pdev))
		return;

	pdev->dev.platform_data = config;
	platform_device_register(pdev);
}
コード例 #19
0
ファイル: dma.c プロジェクト: gtvhacker/Logitech-Revue
int __init dma_init(void)
{
	struct dma_init_info info;

	info.edma_num_dmach = EDMA_DAVINCI_NUM_DMACH;
	info.edma_num_tcc = EDMA_DAVINCI_NUM_TCC;

	info.cc_reg0_int  = IRQ_CCINT0;
	info.cc_error_int = IRQ_CCERRINT;

	if (cpu_is_davinci_dm6467()) {
		info.edma_num_evtq = EDMA_DM646X_NUM_EVQUE;
		info.edma_num_tc = EDMA_DM646X_NUM_TC;
		info.edma_num_param = EDMA_DM646X_NUM_PARAMENTRY;

		info.edma_chmap_exist = EDMA_DM646X_CHMAP_EXIST;

		info.edmatc_base_addrs = dm646x_edmatc_base_addrs;

		info.edma2event_map = dm646x_dma_ch_hw_event_map;

		info.edma_channels_arm = dm646x_edma_channels_arm;
		info.qdma_channels_arm = dm646x_qdma_channels_arm;
		info.param_entry_arm = dm646x_param_entry_arm;
		info.tcc_arm = dm646x_tcc_arm;
		info.param_entry_reserved = dm646x_param_entry_reserved;

		info.q_pri = dm646x_queue_priority_mapping;
		info.q_tc  = dm646x_queue_tc_mapping;
		info.q_wm  = dm646x_queue_watermark_level;

		info.tc_error_int = dm646x_tc_error_int;
	} else if (cpu_is_davinci_dm355()) {
		info.edma_num_evtq = EDMA_DM355_NUM_EVQUE;
		info.edma_num_tc = EDMA_DM355_NUM_TC;
		info.edma_num_param = EDMA_DM355_NUM_PARAMENTRY;

		info.edma_chmap_exist = EDMA_DM355_CHMAP_EXIST;

		info.edmatc_base_addrs = dm355_edmatc_base_addrs;

		info.edma2event_map = dm355_dma_ch_hw_event_map;

		info.edma_channels_arm = dm355_edma_channels_arm;
		info.qdma_channels_arm = dm355_qdma_channels_arm;
		info.param_entry_arm = dm355_param_entry_arm;
		info.tcc_arm = dm355_tcc_arm;
		info.param_entry_reserved = dm355_param_entry_reserved;

		info.q_pri = dm355_queue_priority_mapping;
		info.q_tc  = dm355_queue_tc_mapping;
		info.q_wm  = dm355_queue_watermark_level;

		info.tc_error_int = dm355_tc_error_int;
	} else if (cpu_is_davinci_dm365()) {
		info.edma_num_evtq = EDMA_DM365_NUM_EVQUE;
		info.edma_num_tc = EDMA_DM365_NUM_TC;
		info.edma_num_param = EDMA_DM365_NUM_PARAMENTRY;

		info.edma_chmap_exist = EDMA_DM365_CHMAP_EXIST;

		info.edmatc_base_addrs = dm365_edmatc_base_addrs;

		info.edma2event_map = dm365_dma_ch_hw_event_map;

		info.edma_channels_arm = dm365_edma_channels_arm;
		info.qdma_channels_arm = dm365_qdma_channels_arm;
		info.param_entry_arm = dm365_param_entry_arm;
		info.tcc_arm = dm365_tcc_arm;
		info.param_entry_reserved = dm365_param_entry_reserved;

		info.q_pri = dm365_queue_priority_mapping;
		info.q_tc  = dm365_queue_tc_mapping;
		info.q_wm  = dm365_queue_watermark_level;

		info.tc_error_int = dm365_tc_error_int;
	} else { /* Must be dm6446 or dm357 */
		if (!cpu_is_davinci_dm644x() && !cpu_is_davinci_dm357())
			BUG();

		info.edma_num_evtq = EDMA_DM644X_NUM_EVQUE;
		info.edma_num_tc = EDMA_DM644X_NUM_TC;
		info.edma_num_param = EDMA_DM644X_NUM_PARAMENTRY;

		info.edma_chmap_exist = EDMA_DM644X_CHMAP_EXIST;

		info.edmatc_base_addrs = dm644x_edmatc_base_addrs;

		info.edma2event_map = dm644x_dma_ch_hw_event_map;

		info.edma_channels_arm = dm644x_edma_channels_arm;
		info.qdma_channels_arm = dm644x_qdma_channels_arm;
		info.param_entry_arm = dm644x_param_entry_arm;
		info.tcc_arm = dm644x_tcc_arm;
		info.param_entry_reserved = dm644x_param_entry_reserved;

		info.q_pri = dm644x_queue_priority_mapping;
		info.q_tc  = dm644x_queue_tc_mapping;
		info.q_wm  = dm644x_queue_watermark_level;

		info.tc_error_int = dm644x_tc_error_int;
	}

	return davinci_dma_init(&info);
}
コード例 #20
0
void __init davinci_setup_mmc(int module, struct davinci_mmc_config *config)
{
	struct platform_device	*pdev = NULL;

	if (WARN_ON(cpu_is_davinci_dm646x()))
		return;

	
	switch (module) {
	case 1:
		if (cpu_is_davinci_dm355()) {
			
			davinci_cfg_reg(DM355_SD1_CMD);
			davinci_cfg_reg(DM355_SD1_CLK);
			davinci_cfg_reg(DM355_SD1_DATA0);
			davinci_cfg_reg(DM355_SD1_DATA1);
			davinci_cfg_reg(DM355_SD1_DATA2);
			davinci_cfg_reg(DM355_SD1_DATA3);
		} else if (cpu_is_davinci_dm365()) {
			void __iomem *pupdctl1 =
				IO_ADDRESS(DAVINCI_SYSTEM_MODULE_BASE + 0x7c);

			
			__raw_writel((__raw_readl(pupdctl1) & ~0x400),
					pupdctl1);

			mmcsd1_resources[0].start = DM365_MMCSD1_BASE;
			mmcsd1_resources[0].end = DM365_MMCSD1_BASE +
							SZ_4K - 1;
			mmcsd0_resources[2].start = IRQ_DM365_SDIOINT1;
		} else
			break;

		pdev = &davinci_mmcsd1_device;
		break;
	case 0:
		if (cpu_is_davinci_dm355()) {
			mmcsd0_resources[0].start = DM355_MMCSD0_BASE;
			mmcsd0_resources[0].end = DM355_MMCSD0_BASE + SZ_4K - 1;
			mmcsd0_resources[2].start = IRQ_DM355_SDIOINT0;

			
			davinci_cfg_reg(DM355_MMCSD0);

			
			davinci_cfg_reg(DM355_EVT26_MMC0_RX);
		} else if (cpu_is_davinci_dm365()) {
			mmcsd0_resources[0].start = DM365_MMCSD0_BASE;
			mmcsd0_resources[0].end = DM365_MMCSD0_BASE +
							SZ_4K - 1;
			mmcsd0_resources[2].start = IRQ_DM365_SDIOINT0;
		} else if (cpu_is_davinci_dm644x()) {
			
			void __iomem *base =
				IO_ADDRESS(DAVINCI_SYSTEM_MODULE_BASE);

			
			__raw_writel(0, base + DM64XX_VDD3P3V_PWDN);
			
			davinci_cfg_reg(DM644X_MSTK);
		}

		pdev = &davinci_mmcsd0_device;
		break;
	}

	if (WARN_ON(!pdev))
		return;

	pdev->dev.platform_data = config;
	platform_device_register(pdev);
}