Example #1
0
static int ov9640_sensor_power_set(int power)
{
	unsigned char expa;
	int err;

	/* read current state of GPIO EXPA outputs */
	if ((err = read_gpio_expa(&expa, 0x20))) {
		printk(KERN_ERR "Error reading GPIO EXPA 0x20\n");
		return err;
	}

	expa = power ? expa | 0x80 : expa & ~0x08;

	/* Set GPIO EXPA P3 (CAMERA_MODULE_EN) to power-up sensor */
	if ((err = write_gpio_expa(expa, 0x20))) {
		printk(KERN_ERR "Error writing to GPIO EXPA 0x20\n");
		return err;
	}

	if (power) {
		/* read current state of GPIO EXPA outputs */
		if ((err = read_gpio_expa(&expa, 0x22))) {
			printk(KERN_ERR "Error reading GPIO EXPA\n");
			return err;
		}
		/* Clear GPIO EXPA P7 (CAM_RST) */
		if ((err = write_gpio_expa(expa & ~0x80, 0x22))) {
			printk(KERN_ERR "Error writing to GPIO EXPA\n");
			return err;
		}
	}

	return err;
}
Example #2
0
/* Select between the IrDA and aGPS module
 */
static int h3_select_irda(struct device *dev, int state)
{
	unsigned char expa;
	int err = 0;

	if ((err = read_gpio_expa(&expa, 0x26))) {
		printk(KERN_ERR "Error reading from I/O EXPANDER \n");
		return err;
	}

	/* 'P6' enable/disable IRDA_TX and IRDA_RX */
	if (state & IR_SEL) { /* IrDA */
		if ((err = write_gpio_expa(expa | 0x40, 0x26))) {
			printk(KERN_ERR "Error writing to I/O EXPANDER \n");
			return err;
		}
	} else {
		if ((err = write_gpio_expa(expa & ~0x40, 0x26))) {
			printk(KERN_ERR "Error writing to I/O EXPANDER \n");
			return err;
		}
	}
	return err;
}
Example #3
0
int
h3_sensor_powerdown(void)
{
	unsigned char expa;
	int err;

	/* read the current state of GPIO EXPA output */
	if (( err = read_gpio_expa(&expa, 0x27))) {
		printk(KERN_ERR "Error reading GPIO EXPA \n");
		return err;
	}
	/* clear GPIO EXPA P7 CAMERA_MOD_EN to power-up sensor */
	if ((err = write_gpio_expa(expa & ~0x80, 0x27))) {
		printk(KERN_ERR "Error writing to GPIO EXPA \n");
		return err;
	}
	return 0;
}
Example #4
0
static void set_h3_gpio_expa(u8 FIR_SEL, u8 IrDA_INVSEL)
{
	u8 ioExpanderVal = 0;

	if (read_gpio_expa(&ioExpanderVal, 0x27) != 0) {
		printk(KERN_ERR "Error reading from I/O EXPANDER \n");
		return;
	}

	ioExpanderVal &= ~0x03;
	ioExpanderVal |= FIR_SEL << 1;
	ioExpanderVal |= IrDA_INVSEL << 0;

	if (write_gpio_expa(ioExpanderVal, 0x27) != 0) {
		printk(KERN_ERR "Error writing to I/O EXPANDER \n");
		return;
	}
	if (read_gpio_expa(&ioExpanderVal, 0x27) != 0) {
		printk(KERN_ERR "Error reading from I/O EXPANDER \n");
		return;
	}
}
Example #5
0
static void set_trans_mode(struct work_struct *work)
{
	struct omap_irda_config *irda_config =
		container_of(work, struct omap_irda_config, gpio_expa.work);
	int mode = irda_config->mode;
	unsigned char expa;
	int err = 0;

	if ((err = read_gpio_expa(&expa, 0x20)) != 0) {
		printk(KERN_ERR "Error reading from I/O expander\n");
	}

	expa &= ~0x01;

	if (!(mode & IR_SIRMODE)) { /* MIR/FIR */
		expa |= 0x01;
	}

	if ((err = write_gpio_expa(expa, 0x20)) != 0) {
		printk(KERN_ERR "Error writing to I/O expander\n");
	}
}
Example #6
0
/* FIXME: adapt clock divisors for uwire to current ARM xor clock rate */
static int omap_tsc2101_configure(void)
{
	unsigned long uwire_flags = 0;

#ifdef CONFIG_MACH_OMAP_H3
	int err = 0;
	u8 ioExpanderVal = 0;

	if ((err = read_gpio_expa(&ioExpanderVal, 0x24))) {
		printk(" Error reading from I/O EXPANDER \n");
		return err;
	}
	ioExpanderVal |= 0x8;

	if ((err = write_gpio_expa(ioExpanderVal, 0x24))) {
		printk(KERN_ERR ": Error writing to I/O EXPANDER \n");
		return err;
	}
#endif

	if (machine_is_omap_h2()) {
		uwire_flags = UWIRE_READ_RISING_EDGE | UWIRE_WRITE_RISING_EDGE;
		omap_cfg_reg(N15_1610_UWIRE_CS1);
		omap_uwire_configure_mode(1, uwire_flags);
	}
	if (machine_is_omap_h3()) {
		uwire_flags = UWIRE_READ_RISING_EDGE | UWIRE_WRITE_RISING_EDGE;
		omap_cfg_reg(N14_1610_UWIRE_CS0);
		omap_uwire_configure_mode(0, uwire_flags);
	}

	/* Configure MCLK enable */
	omap_writel(omap_readl(PU_PD_SEL_2) | (1 << 22), PU_PD_SEL_2);	

	return 0;
}
Example #7
0
static int omap1610_irda_start(struct net_device *dev)
{
	struct omap1610_irda *si = dev->priv;
	int err;
	unsigned long flags = 0;

#ifdef CONFIG_MACH_OMAP_H3
	u8 ioExpanderVal = 0;
#endif

	__ECHO_IN;
	si->speed = 9600;

	err = request_irq(dev->irq, omap1610_irda_irq, 0, dev->name, dev);
	if (err)
		goto err_irq;

	/*
	 * The interrupt must remain disabled for now.
	 */

	disable_irq(dev->irq);

	/*  Request DMA channels for IrDA hardware */

	if (omap_request_dma(OMAP_DMA_UART3_RX, "IrDA Rx DMA",
			     (void *)omap1610_irda_rx_dma_callback,
			     dev, &(si->rx_dma_channel))) {
		printk(KERN_ERR "Failed to request IrDA Rx DMA \n");
		goto err_irq;
	}

	if (omap_request_dma(OMAP_DMA_UART3_TX, "IrDA Tx DMA",
			     (void *)omap1610_irda_tx_dma_callback,
			     dev, &(si->tx_dma_channel))) {
		printk(KERN_ERR "Failed to request IrDA Tx DMA \n");
		goto err_irq;
	}

	/* Allocate TX and RX buffers for DMA channels */

	si->rx_buf_dma_virt =
	    dma_alloc_coherent(NULL, 4096, &(si->rx_buf_dma_phys), flags);

	si->tx_buf_dma_virt =
	    dma_alloc_coherent(NULL, 4096, &(si->tx_buf_dma_phys), flags);

	/*
	 * Setup the serial port for the specified config.
	 */

#if CONFIG_MACH_OMAP_H3

	if ((err = read_gpio_expa(&ioExpanderVal, 0x26))) {
		printk(KERN_ERR "Error reading from I/O EXPANDER \n");
		return err;
	}

	ioExpanderVal |= 0x40;	/* 'P6' Enable IRDA_TX and IRDA_RX */

	if ((err = write_gpio_expa(ioExpanderVal, 0x26))) {
		printk(KERN_ERR "Error writing to I/O EXPANDER \n");
		return err;
	}
#endif
	err = omap1610_irda_startup(dev);

	if (err)
		goto err_startup;

	omap1610_irda_set_speed(dev, si->speed = 9600);

	/*
	 * Open a new IrLAP layer instance.
	 */

	si->irlap = irlap_open(dev, &si->qos, "omap_sir");

	err = -ENOMEM;
	if (!si->irlap)
		goto err_irlap;

	/* Now enable the interrupt and start the queue  */
	si->open = 1;

	/* Start RX DMA */

	omap1610_irda_start_rx_dma(si);

	enable_irq(dev->irq);
	netif_start_queue(dev);

	__ECHO_OUT;

	return 0;

      err_irlap:
	si->open = 0;
	omap1610_irda_shutdown(si);
      err_startup:
      err_irq:
	free_irq(dev->irq, dev);
	return err;
}