Example #1
0
static void omap_pwm_led_set_pwm_cycle(struct omap_pwm_led *led, int cycle)
{
	int n;

	pr_debug("%s%s: \n", PASS1,__func__);
	
	if (cycle == 0)
		n = 0xff;
	else	n = cycle - 1;

	if (cycle == LED_FULL) {
		printk("!!!!!!!!!!cycle == LED_FULL \n");
		omap_dm_timer_start(led->intensity_timer);
		omap_dm_timer_set_pwm(led->intensity_timer, 1, 1,
				      OMAP_TIMER_TRIGGER_OVERFLOW_AND_COMPARE);
		omap_dm_timer_set_match(led->intensity_timer, 1,
					0xffffff00);
	} else {
		printk("!!!!!!!!!!cycle != LED_FULL, cycle=%i \n", cycle);
		omap_dm_timer_start(led->intensity_timer);
		omap_dm_timer_set_pwm(led->intensity_timer, 0, 1,
				      OMAP_TIMER_TRIGGER_OVERFLOW_AND_COMPARE);
		omap_dm_timer_set_match(led->intensity_timer, 1,
					(0xffffff00) | cycle);
	}
}
Example #2
0
static void omap_pwm_led_set_blink(struct omap_pwm_led *led)
{
	pr_debug("%s%s: \n", PASS1,__func__);
	if (!led->powered)
		return;

	if (led->on_period != 0 && led->off_period != 0) {
		unsigned long load_reg, cmp_reg;

		load_reg = 32768 * (led->on_period + led->off_period) / 1000;
		cmp_reg = 32768 * led->on_period / 1000;

		omap_dm_timer_stop(led->blink_timer);
		omap_dm_timer_set_load(led->blink_timer, 1, -load_reg);
		omap_dm_timer_set_match(led->blink_timer, 1, -cmp_reg);
		omap_dm_timer_set_pwm(led->blink_timer, 1, 1,
				      OMAP_TIMER_TRIGGER_OVERFLOW_AND_COMPARE);
		omap_dm_timer_write_counter(led->blink_timer, -2);
		omap_dm_timer_start(led->blink_timer);
	} else {
		omap_dm_timer_set_pwm(led->blink_timer, 1, 1,
				      OMAP_TIMER_TRIGGER_OVERFLOW_AND_COMPARE);
		omap_dm_timer_stop(led->blink_timer);
	}
}
Example #3
0
static void omap_pwm_led_set_pwm_cycle(struct omap_pwm_led *led, int cycle)
{
	int pwm_frequency = 10000;
	int def_on;
	
	pr_debug("%s: cycle: %i\n", 
			__func__, cycle);
	
	if (led->pdata->bkl_max)
		cycle = ( (cycle * led->pdata->bkl_max ) / 255);
	
	if (cycle < led->pdata->bkl_min)
		cycle = led->pdata->bkl_min;

	if (led->pdata->bkl_freq)
		pwm_frequency = led->pdata->bkl_freq;

	if (cycle != LED_FULL)
		def_on = led->pdata->invert ? 1:0;
	else
		def_on = led->pdata->invert ? 0:1;
	
	omap_dm_timer_set_pwm(led->intensity_timer, def_on, 1,
		      OMAP_TIMER_TRIGGER_OVERFLOW_AND_COMPARE);

	if (cycle != LED_FULL) {
		pwm_set_speed(led->intensity_timer, pwm_frequency, 256-cycle);
		omap_dm_timer_start(led->intensity_timer);
	} else
		omap_dm_timer_stop(led->intensity_timer);
}
Example #4
0
static PVRSRV_ERROR AcquireGPTimer(SYS_SPECIFIC_DATA *psSysSpecData)
{
	PVR_ASSERT(psSysSpecData->psGPTimer == NULL);

	/*
	 * This code could try requesting registers 9, 10, and 11,
	 * stopping at the first succesful request.  We'll stick with
	 * 11 for now, as it avoids having to hard code yet more
	 * physical addresses into the code.
	 */
	psSysSpecData->psGPTimer = omap_dm_timer_request_specific(GPTIMER_TO_USE);
	if (psSysSpecData->psGPTimer == NULL)
	{
	
		PVR_DPF((PVR_DBG_WARNING, "%s: omap_dm_timer_request_specific failed", __FUNCTION__));
		return PVRSRV_ERROR_CLOCK_REQUEST_FAILED;
	}

	/* Set timer source to system clock */
	omap_dm_timer_set_source(psSysSpecData->psGPTimer, OMAP_TIMER_SRC_SYS_CLK);
	omap_dm_timer_enable(psSysSpecData->psGPTimer);

	/* Set autoreload, and start value of 0 */
	omap_dm_timer_set_load_start(psSysSpecData->psGPTimer, 1, 0);

	omap_dm_timer_start(psSysSpecData->psGPTimer);

	/*
	 * The DM timer API doesn't have a mechansim for obtaining the
	 * physical address of the counter register.
	 */
	psSysSpecData->sTimerRegPhysBase.uiAddr = SYS_OMAP4430_GP11TIMER_REGS_SYS_PHYS_BASE;

	return PVRSRV_OK;
}
static PVRSRV_ERROR AcquireGPTimer(SYS_SPECIFIC_DATA *psSysSpecData)
{
	PVR_ASSERT(psSysSpecData->psGPTimer == NULL);

	
	psSysSpecData->psGPTimer = omap_dm_timer_request_specific(GPTIMER_TO_USE);
	if (psSysSpecData->psGPTimer == NULL)
	{
	
		PVR_DPF((PVR_DBG_WARNING, "%s: omap_dm_timer_request_specific failed", __FUNCTION__));
		return PVRSRV_ERROR_CLOCK_REQUEST_FAILED;
	}

	
	omap_dm_timer_set_source(psSysSpecData->psGPTimer, OMAP_TIMER_SRC_SYS_CLK);
	omap_dm_timer_enable(psSysSpecData->psGPTimer);

	
	omap_dm_timer_set_load_start(psSysSpecData->psGPTimer, 1, 0);

	omap_dm_timer_start(psSysSpecData->psGPTimer);

	
	psSysSpecData->sTimerRegPhysBase.uiAddr = SYS_OMAP3_GPTIMER_REGS_SYS_PHYS_BASE;

	return PVRSRV_OK;
}
Example #6
0
int omap_rproc_activate(struct omap_device *od)
{
	int i, ret = 0;
	struct rproc *rproc = platform_get_drvdata(&od->pdev);
	struct device *dev = rproc->dev;
	struct omap_rproc_pdata *pdata = dev->platform_data;
	struct omap_rproc_timers_info *timers = pdata->timers;
	struct omap_rproc_priv *rpp = rproc->priv;
#ifdef CONFIG_REMOTE_PROC_AUTOSUSPEND
	struct iommu *iommu;

	if (!rpp->iommu) {
		iommu = iommu_get(pdata->iommu_name);
		if (IS_ERR(iommu)) {
			dev_err(dev, "iommu_get error: %ld\n",
				PTR_ERR(iommu));
			return PTR_ERR(iommu);
		}
		rpp->iommu = iommu;
	}

	if (!rpp->mbox)
		rpp->mbox = omap_mbox_get(pdata->sus_mbox_name, NULL);
#endif
	/**
	 * explicitly configure a boot address from which remoteproc
	 * starts executing code when taken out of reset.
	 */
	_load_boot_addr(rproc, rpp->bootaddr);

	/**
	 * Domain is in HW SUP thus in hw_auto but
	 * since remoteproc will be enabled clkdm
	 * needs to be in sw_sup (Do not let it idle).
	 */
	if (pdata->clkdm)
		clkdm_wakeup(pdata->clkdm);

	for (i = 0; i < pdata->timers_cnt; i++)
		omap_dm_timer_start(timers[i].odt);

	for (i = 0; i < od->hwmods_cnt; i++) {
		ret = omap_hwmod_enable(od->hwmods[i]);
		if (ret) {
			for (i = 0; i < pdata->timers_cnt; i++)
				omap_dm_timer_stop(timers[i].odt);
			break;
		}
	}

	/**
	 * Domain is in force_wkup but since remoteproc
	 * was enabled it is safe now to switch clkdm
	 * to hw_auto (let it idle).
	 */
	if (pdata->clkdm)
		clkdm_allow_idle(pdata->clkdm);

	return ret;
}
static ssize_t store_irblaster_freq(struct device *dev, struct device_attribute *attr, 
		const char* buf, size_t len)
{
	frequency = simple_strtol(buf, NULL, 10);

	/* Disable pwm */
	if (frequency == 0) {
		omap_dm_timer_stop(irb_pwm_timer);
		omap_dm_timer_disable(irb_pwm_timer);
		irb_state = 0;
		return 0;
	}

	/* Enable pwm */
	if (irb_state == 0) {
		omap_dm_timer_enable(irb_pwm_timer);
		omap_dm_timer_set_pwm(irb_pwm_timer, 0, 1, 2);
		omap_dm_timer_start(irb_pwm_timer);
		irb_state = 1;
	}

	pwm_set_speed(irb_pwm_timer, frequency, duty_cycle);
	
	return len;
}
long hrt_ioctl(struct file* file,unsigned int cmd, unsigned long arg)
{
	switch(cmd)
	{
		case CMD_START_TIMER:
			if (!omap_dm_timer_start(timer))
			{
				return -EINVAL;
			}
			break;
		case CMD_STOP_TIMER:
			if (!omap_dm_timer_stop(timer))
			{
				return -EINVAL;
			}
			break;
		case CMD_SET_TIMER_COUNTER_VALUE:
			if(!omap_dm_timer_write_counter(timer,(int)arg))
			{
			    return -EINVAL;
			}
			break;
		default:
			return -ENOTTY;
			break;
	}
	return 0;
}
Example #9
0
static int init_timing_params(struct lirc_rx51 *lirc_rx51)
{
	u32 load, match;

	load = -(lirc_rx51->fclk_khz * 1000 / lirc_rx51->freq);
	match = -(lirc_rx51->duty_cycle * -load / 100);
	omap_dm_timer_set_load(lirc_rx51->pwm_timer, 1, load);
	omap_dm_timer_set_match(lirc_rx51->pwm_timer, 1, match);
	omap_dm_timer_write_counter(lirc_rx51->pwm_timer, TIMER_MAX_VALUE - 2);
	omap_dm_timer_start(lirc_rx51->pwm_timer);
	omap_dm_timer_set_int_enable(lirc_rx51->pulse_timer, 0);
	omap_dm_timer_start(lirc_rx51->pulse_timer);

	lirc_rx51->match = 0;

	return 0;
}
static void sholest_lvibrator_power_on(void)
{
#ifdef CONFIG_VIB_PWM
	gpio_set_value(SHOLEST_VIBRATOR_EN_GPIO, 1);
#endif
	if (vib_pwm_timer == NULL)
		sholest_lvibrator_initialization();
	omap_dm_timer_enable(vib_pwm_timer);
	omap_dm_timer_start(vib_pwm_timer);
}
static int __init gptimer_request_init(void)
{
	struct clk *gt_fclk;
	uint32_t gt_rate;

	/*Requesting for any available timer*/
	timer_ptr = omap_dm_timer_request();

	if (timer_ptr == NULL) {
		/*Timers are not available*/
		printk(KERN_ERR "GPtimers are not available\n");
		return -1;
	}

	switch (clock_type) {
	case 1:
		/*Set the clock source to 32Khz Clock*/
		printk(KERN_INFO "Using OMAP_TIMER_SRC_32_KHZ source\n");
		omap_dm_timer_set_source(timer_ptr,
			OMAP_TIMER_SRC_32_KHZ);
		break;
	case 2:
		/*Set the clock source to System Clock*/
		printk(KERN_INFO "Using OMAP_TIMER_SRC_SYS_CLK source\n");
		omap_dm_timer_set_source(timer_ptr,
			OMAP_TIMER_SRC_SYS_CLK);
		break;
	case 3:
		/*Set the clock source to System Clock*/
		printk(KERN_INFO "Using OMAP_TIMER_SRC_EXT_CLK source\n");
		omap_dm_timer_set_source(timer_ptr,
			OMAP_TIMER_SRC_EXT_CLK);
		break;
	default:
		printk(KERN_ERR "Invalid clock_type value. Use 1, 2 or 3\n");
		return -1;
	}

	/*Figure out what IRQ our timer triggers*/
	timer_irq = omap_dm_timer_get_irq(timer_ptr);

	/*Get clock rate in Hz*/
	gt_fclk = omap_dm_timer_get_fclk(timer_ptr);
	gt_rate = clk_get_rate(gt_fclk);

	/*Start the timer!*/
	omap_dm_timer_start(timer_ptr);

	printk(KERN_INFO "GP Timer initialized and started (%lu Hz, IRQ %d)\n",
		(long unsigned)gt_rate, timer_irq);

	return 0;
}
Example #12
0
// Initialize the kernel module
static int __init gptimer_test_init(void)
{
	int ret = 0;
  struct clk *gt_fclk;
	uint32_t gt_rate;


	printk("gptimer test: starting moudle init\n");

  // request a timer (we are asking for ANY open timer, see dmtimer.c for details on how this works)
	timer_ptr = omap_dm_timer_request();
	if(timer_ptr == NULL){
		// oops, no timers available
		printk("gptimer test: No more gp timers available, bailing out\n");
		return -1;
	}

   // set the clock source to system clock
	omap_dm_timer_set_source(timer_ptr, OMAP_TIMER_SRC_SYS_CLK);

   // set prescalar to 1:1
	omap_dm_timer_set_prescaler(timer_ptr, 32);		
	
  // figure out what IRQ our timer triggers
	timer_irq = omap_dm_timer_get_irq(timer_ptr);

  // install our IRQ handler for our timer
	ret = request_irq(timer_irq, timer_irq_handler, IRQF_DISABLED | IRQF_TIMER , "gptimer test", timer_irq_handler);
	if(ret){
		printk("gptimer test: request_irq failed (on irq %d), bailing out\n", timer_irq);
		return ret;
	}
	
	// get clock rate in Hz
	gt_fclk = omap_dm_timer_get_fclk(timer_ptr);
	gt_rate = clk_get_rate(gt_fclk);

	// set preload, and autoreload
	// we set it to the clock rate in order to get 1 overflow every second
	omap_dm_timer_set_load(timer_ptr, 1, 0xFFFFFFFF - gt_rate);
	
	// setup timer to trigger our IRQ on the overflow event
	omap_dm_timer_set_int_enable(timer_ptr, OMAP_TIMER_INT_OVERFLOW);
	
	// start the timer!
	omap_dm_timer_start(timer_ptr);

	// done!		
	printk("gptimer test: GP Timer initialized and started (%lu Hz, IRQ %d)\n", (long unsigned)gt_rate, timer_irq);

	// return sucsess
	return 0;
}
static int panel_set_backlight_level(
		struct omap_display *disp, int level)
{
	int hw_level;

	pr_debug("panel_set_backlight_level [%s] %d\n", 
		disp != NULL ? disp->panel->name: "cpt_wvga_48", level);

	/* skip if panel is not on */
	if (panel_state == 0) {
		saved_bkl_level = level;
		return 0;
	}
	
	/* clamp the level */
	if (level < 0)
		level = 0;
	if (level > 255)
		level = 255;

	/* nothing to do if levels are equal */
	if (bkl_level == level)
		return 0;

	/* stop backlight? */
	if (level == 0) {
		if (GPIO_EXISTS(display_gpio.bkl_pwon))
			omap_set_gpio_dataout(GPIO_PIN(display_gpio.bkl_pwon), 0);
		omap_dm_timer_stop(bkl_pwm);
		omap_dm_timer_disable(bkl_pwm);
		bkl_level = 0;
		return 0;
	}

	/* start backlight? */
	if (bkl_level == 0) {
		omap_dm_timer_enable(bkl_pwm);
		omap_dm_timer_set_pwm(bkl_pwm, 0, 1, 2);
		omap_dm_timer_start(bkl_pwm);
		if (GPIO_EXISTS(display_gpio.bkl_pwon))
			omap_set_gpio_dataout(GPIO_PIN(display_gpio.bkl_pwon), 1);
	}

	/* set new level, g7 machines have inverted level */
	hw_level = level;
	if (!machine_is_archos_g6h())
		hw_level = 255 - level;
	pwm_set_speed(bkl_pwm, 10000, hw_level);
	bkl_level = level;
	return 0;
}
Example #14
0
static void backlight_gptimer_update(struct omap_dss_device *dssdev)
{
	struct ltn101al03 *lcd = dev_get_drvdata(&dssdev->dev);

	omap_dm_timer_set_load(lcd->gptimer, 1, -PWM_DUTY_MAX);
	omap_dm_timer_set_match(lcd->gptimer, 1,	/* 0~25 */
				-PWM_DUTY_MAX + lcd->current_brightness);
	omap_dm_timer_set_pwm(lcd->gptimer, 0, 1,
			      OMAP_TIMER_TRIGGER_OVERFLOW_AND_COMPARE);
	omap_dm_timer_enable(lcd->gptimer);
	omap_dm_timer_write_counter(lcd->gptimer, -2);
	omap_dm_timer_disable(lcd->gptimer);

	omap_dm_timer_start(lcd->gptimer);
}
Example #15
0
void pwm_gpt_start(int id)
{
	if ( !_check_id(id) ) {
		return;
	}

	if ( !_check_timer(id) ) {
		return;
	}

	/* enable the timer, start the clock */
	omap_dm_timer_enable(gpt_pwm_list[id].timer);

/*	do not wait for ack, just set up the reg and leave */
/*	this is better if you setup 2 correlated timers */
	omap_dm_timer_start(gpt_pwm_list[id].timer);
}
/*!
******************************************************************************

 @Function  AcquireGPTimer

 @Description Acquire a GP timer

 @Return   PVRSRV_ERROR

******************************************************************************/
static PVRSRV_ERROR AcquireGPTimer(SYS_SPECIFIC_DATA *psSysSpecData)
{
	PVR_ASSERT(psSysSpecData->psGPTimer == NULL);

	/*
	 * This code has problems on module reload for OMAP5 running Linux
	 * 3.4.10, due to omap2_dm_timer_set_src (called by
	 * omap_dm_timer_request_specific), being unable to set the parent
	 * clock to OMAP_TIMER_SRC_32_KHZ.
	 * Not calling omap_dm_timer_set_source doesn't help.
	 */
#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,4,0)) || !defined(MODULE)
	/*
	 * This code could try requesting registers 9, 10, and 11,
	 * stopping at the first succesful request.  We'll stick with
	 * 11 for now, as it avoids having to hard code yet more
	 * physical addresses into the code.
	 */
	psSysSpecData->psGPTimer = omap_dm_timer_request_specific(GPTIMER_TO_USE);
	if (psSysSpecData->psGPTimer == NULL)
	{
	
		PVR_DPF((PVR_DBG_WARNING, "%s: omap_dm_timer_request_specific failed", __FUNCTION__));
		return PVRSRV_ERROR_CLOCK_REQUEST_FAILED;
	}

	omap_dm_timer_set_source(psSysSpecData->psGPTimer, OMAP_TIMER_SRC_SYS_CLK);
	omap_dm_timer_enable(psSysSpecData->psGPTimer);

	/* Set autoreload, and start value of 0 */
	omap_dm_timer_set_load_start(psSysSpecData->psGPTimer, 1, 0);

	omap_dm_timer_start(psSysSpecData->psGPTimer);

	/*
	 * The DM timer API doesn't have a mechanism for obtaining the
	 * physical address of the counter register.
	 */
	psSysSpecData->sTimerRegPhysBase.uiAddr = SYS_OMAP3430_GP11TIMER_REGS_SYS_PHYS_BASE;
#else	/* (LINUX_VERSION_CODE <= KERNEL_VERSION(3,4,0)) || !defined(MODULE) */
	(void)psSysSpecData;
#endif	/* (LINUX_VERSION_CODE <= KERNEL_VERSION(3,4,0)) || !defined(MODULE) */

	return PVRSRV_OK;
}
Example #17
0
/*
 * IOCTL commands
 * TESTED
 * PARAMETERS:
 * cmd - 0xffc1 start, 0xffc2 stop, 0xffc3 set
 * arg - value to write to timer
 */
ssize_t HRTDriver_dmtimer_ioctl(struct file *file, unsigned int cmd, unsigned int arg) {

	printk("IOCTL entered\n\n");

	switch(cmd) {
		case 0xffc1: 
			printk("\nStarting the timer.\n");
			omap_dm_timer_start(hrt_devp->gptimer);
			return 0;
		case 0xffc2:
			printk("\nStopping the timer.\n\n");
			omap_dm_timer_stop(hrt_devp->gptimer);
			return 0;
		case 0xffc3:
			printk("\nSetting the timer\n\n");
			omap_dm_timer_write_counter(hrt_devp->gptimer, arg);
			return 0;
		default:
			return -1;

	}
	/*
	//start command
	if (!strcmp(cmd, "0xffc1")) {
		printk("\nStarting the timer.\n");
		omap_dm_timer_start(hrt_devp->gptimer);
		return 0;
	}
	else if (!strcmp(cmd, "0xffc2")) {
		printk("\nStopping the timer.\n\n");
		omap_dm_timer_stop(hrt_devp->gptimer);
		return 0;
	}
	else if (!strcmp(cmd, "0xffc3")) {
		printk("\nSetting the timer\n\n");
		omap_dm_timer_write_counter(hrt_devp->gptimer, arg);
		return 0;
	}
	else return -1;
	*/

}
Example #18
0
static void omap_pwm_led_set_pwm_cycle(struct omap_pwm_led *led, int cycle)
{
	int n;

	if (cycle == 0)
		n = 0xff;
	else	n = cycle - 1;

	if (cycle == LED_FULL) {
		omap_dm_timer_set_pwm(led->intensity_timer, 0, 1,
				      OMAP_TIMER_TRIGGER_OVERFLOW_AND_COMPARE);
		omap_dm_timer_stop(led->intensity_timer);
	} else {
		omap_dm_timer_set_pwm(led->intensity_timer, 1, 1,
				      OMAP_TIMER_TRIGGER_OVERFLOW_AND_COMPARE);
		omap_dm_timer_set_match(led->intensity_timer, 1,
					(0xffffff00) | cycle);
		omap_dm_timer_start(led->intensity_timer);
	}
}
Example #19
0
static inline int proc44x_wakeup(struct device *dev)
{
	struct platform_device *pdev = to_platform_device(dev);
	struct omap_rproc *obj = (struct omap_rproc *)platform_get_drvdata(
						to_platform_device(dev));
	int ret = 0;

	if (obj->dmtimer)
		omap_dm_timer_start(obj->dmtimer);

	ret = omap_device_enable(pdev);
	if (ret)
		goto err_start;

	obj->state = OMAP_RPROC_RUNNING;
	return 0;

err_start:
	dev_err(dev, "%s error 0x%x\n", __func__, ret);
	return ret;
}
Example #20
0
/*
 * Request dmtimer
 * TESTED
 */
struct omap_dm_timer *HRTDriver_reserve_timer(void) {

	//Get device private data
	//struct HRT_dev *hrt_devp = file->private_data;
	struct omap_dm_timer *timer;
	
	timer = omap_dm_timer_request();

	omap_dm_timer_set_source(timer, OMAP_TIMER_SRC_SYS_CLK);
	omap_dm_timer_enable(timer);

	if (!timer) printk("\nTimer not reserved!\n");
	else printk("\nTimer succesfully reserved!\n");
	
	//setting the load enables the timer
	//omap_dm_timer_set_load_start(hrt_devp->gptimer, 0, 0);
	omap_dm_timer_start(timer);

	return timer;

}
Example #21
0
static int ltn101al03_power_on(struct omap_dss_device *dssdev)
{
	struct ltn101al03 *lcd = dev_get_drvdata(&dssdev->dev);
	int ret = 0;

	pr_info("(%s): called (@%d)\n", __func__, __LINE__);

	if (lcd->enabled != 1) {
		if (lcd->pdata->set_power)
			lcd->pdata->set_power(true);

		ret = omapdss_dpi_display_enable(dssdev);
		if (ret) {
			dev_err(&dssdev->dev, "failed to enable DPI\n");
			goto err;
		}

		/* reset ltn101al03 bridge */
		if (!dssdev->skip_init) {
			ltn101al03_hw_reset(dssdev);

			msleep(100);

			gpio_set_value(lcd->pdata->led_backlight_reset_gpio, 1);
			mdelay(10);
			omap_dm_timer_start(lcd->gptimer);

			usleep_range(2000, 2100);
			update_brightness(dssdev);
		}

		lcd->enabled = 1;
	}

	if (dssdev->skip_init)
		dssdev->skip_init = false;

err:
	return ret;
}
static int panel_set_vcom_level(
		struct omap_display *disp, int level)
{
	pr_debug("panel_set_vcom_level [%s] %i\n",
			disp->panel->name, level);

	/* clamp the level */
	if (level < 0)
		level = 0;
	if (level > 255)
		level = 255;

	/* nothing to do if levels are equal */
	if (vcom_level == level)
		return 0;

	/* stop vcom? */
	if (level == 0) {
		omap_dm_timer_stop(vcom_pwm);
		omap_dm_timer_disable(vcom_pwm);
		vcom_level = 0;
		return 0;
	}

	/* start vcom? */
	if (vcom_level == 0) {
		omap_dm_timer_enable(vcom_pwm);
		omap_dm_timer_set_pwm(vcom_pwm, 0, 1, 2);
		omap_dm_timer_start(vcom_pwm);
	}

	vcom_level = level;
	pwm_set_speed(vcom_pwm, 10000, vcom_level);
	vcom_level = level;
	return 0;
}
Example #23
0
static inline void omap2_gp_timer_start(unsigned long load_val)
{
	omap_dm_timer_set_load(gptimer, 1, 0xffffffff - load_val);
	omap_dm_timer_set_int_enable(gptimer, OMAP_TIMER_INT_OVERFLOW);
	omap_dm_timer_start(gptimer);
}
Example #24
0
static int __init pwm_start(void) {

	int ret = 0;
  	struct clk *timer_fclk;
	uint32_t gt_rate;


	printk(KERN_INFO "Loading PWM Module... \n");

	// request any timer
	timer_ptr = omap_dm_timer_request();
	if(timer_ptr == NULL){
		// no timers available
		printk("pwm module: No more gp timers available, bailing out\n");
		return -1;
	}

	// set the clock source to the system clock
	ret = omap_dm_timer_set_source(timer_ptr, OMAP_TIMER_SRC_SYS_CLK);
	if(ret) {
		printk("pwm module: could not set source\n");
		return -1;
	}

	// set prescalar to 1:1
	omap_dm_timer_set_prescaler(timer_ptr, 0);

	// figure out what IRQ our timer triggers
	timer_irq = omap_dm_timer_get_irq(timer_ptr);

	// install our IRQ handler for our timer
	ret = request_irq(timer_irq, timer_irq_handler, IRQF_DISABLED | IRQF_TIMER , "pwm", timer_irq_handler);
	if(ret){
		printk("pwm module: request_irq failed (on irq %d), bailing out\n", timer_irq);
		return ret;
	}

	// get clock rate in Hz and add it to struct
	timer_fclk = omap_dm_timer_get_fclk(timer_ptr);
	gt_rate = clk_get_rate(timer_fclk);
	pwm_data_ptr.timer_rate = gt_rate;

	// set preload, and autoreload
	// we set it to a default of 1kHz
	set_pwm_freq(1000);

	// setup timer to trigger IRQ on the overflow
	omap_dm_timer_set_int_enable(timer_ptr, OMAP_TIMER_INT_OVERFLOW);
	
	// start the timer
	omap_dm_timer_start(timer_ptr);

	// done!
	printk("pwm module: GP Timer initialized and started (%lu Hz, IRQ %d)\n", (long unsigned)gt_rate, timer_irq);


	
	// setup a GPIO
	pwm_setup_pin(38);
	
	pwm_data_ptr.pin = 38;

	set_pwm_dutycycle(1,150);
	

	// return success
	return 0;
}
Example #25
0
static void gp_irblaster_init(int carrier_frequency, int no_carrier, unsigned short *pt_cycles_list) 
{
	u32 val;
	u32 period;
	int min_cycle=0x70000000; /* this min cycle can be set to another minimum: but which value ? */
	unsigned short *pt = pt_cycles_list;

	irb_over = 0;

	//_select_irb_config();

	/* find min cycle */
	while ( *pt != 0) {
		if ( *pt < min_cycle )
			min_cycle = *pt;
		pt++;
	}

	/* enable timer clock */
	omap_dm_timer_enable(gpt_pwm_list[IRBLASTER_PWM].timer);
	omap_dm_timer_enable(gpt_pwm_list[IRBLASTER_TIMER_CTRL].timer);

	irq_irblaster_cycles = pt_cycles_list;

	if ( no_carrier ) {
		/* set the callback irq function */
		_callback_irblaster_timer_interrupt = omap2_irblaster_timer_interrupt_no_carrier;

		/* set IRBLASTER TIMER PWM */
		/* default output is 0 */
		/* toogle */
		/* trigger on overflow */
		omap_dm_timer_set_pwm(gpt_pwm_list[IRBLASTER_PWM].timer,0,1,1);
		/* set frequency */
		period = _get_innotech_period(gpt_pwm_list[IRBLASTER_PWM].rate,carrier_frequency);
		gpt_pwm_list[IRBLASTER_PWM].period = period;

		/* at init, nothing to do during few cycles */
		/* and let say, during min cycle */
		val = 0xFFFFFFFF+1-(period*min_cycle);
		omap_dm_timer_set_load(gpt_pwm_list[IRBLASTER_PWM].timer, 1, val);


		/* set IRBLASTER TIMER CTRL */
		/* timer freq is the same as the carrier */
		period = _get_innotech_period(gpt_pwm_list[IRBLASTER_TIMER_CTRL].rate,carrier_frequency);
		gpt_pwm_list[IRBLASTER_TIMER_CTRL].period = period;

		/* at init, nothing to do during few cycles */
		/* and let say, during min cycle */
		val = 0xFFFFFFFF+1-(period*min_cycle);
		omap_dm_timer_set_load(gpt_pwm_list[IRBLASTER_TIMER_CTRL].timer, 1, val);

		/* prepare the irblaster match condition */
		/* irblaster timer run twice time faster than the pwm */
		/* so this match is set on the middle of the min cycle time */
		val = 0xFFFFFFFF+1-(period*min_cycle/2);
		omap_dm_timer_set_match(gpt_pwm_list[IRBLASTER_TIMER_CTRL].timer, 1, val);

	} else {
		/* set the callback irq function */
		_callback_irblaster_timer_interrupt = omap2_irblaster_timer_interrupt_carrier;

		/* set IRBLASTER TIMER PWM */
		/* default output is 0 */
		/* toogle */
		/* trigger on match and overflow */
		omap_dm_timer_set_pwm(gpt_pwm_list[IRBLASTER_PWM].timer,0,1,2);
		/* set waveform frequency and duty cycle 1/2 = 128/256 */
		_set_innotech_speed(IRBLASTER_PWM,carrier_frequency,128);

		/* at init, no trigger = default output on pin */
	 	irq_irblaster_pwm_ctrl_reg = omap_dm_timer_read_reg(gpt_pwm_list[IRBLASTER_PWM].timer, OMAP_TIMER_CTRL_REG);
		irq_irblaster_pwm_ctrl_reg &= ~(3<<10);
		omap_dm_timer_write_reg(gpt_pwm_list[IRBLASTER_PWM].timer, OMAP_TIMER_CTRL_REG, irq_irblaster_pwm_ctrl_reg);

		/* make the start readuy */
		irq_irblaster_pwm_ctrl_reg |= OMAP_TIMER_CTRL_ST;

		/* set IRBLASTER TIMER CTRL */
		/* timer freq is the same as the carrier */
		period = _get_innotech_period(gpt_pwm_list[IRBLASTER_TIMER_CTRL].rate,carrier_frequency);
		gpt_pwm_list[IRBLASTER_TIMER_CTRL].period = period;
	
		/* at init, nothing to do during few cycles */
		/* and let say, during min cycle */
		val = 0xFFFFFFFF+1-(period*(*irq_irblaster_cycles));
		omap_dm_timer_set_load(gpt_pwm_list[IRBLASTER_TIMER_CTRL].timer, 1, val);
	
		/* set the irblaster ctrl timer match condition */
		/* to the middle of min cycle */
		/* from (end_of_cycle - min_cycle/2) to end_of_cycle, */
		/* the timer ctrl irq will pool ...*/
//		val = 0xFFFFFFFF+1-(period*min_cycle/2);
		val =  0xFFFFFFFF+1-_get_best_match_timing_int(min_cycle,gpt_pwm_list[IRBLASTER_TIMER_CTRL].period,gpt_pwm_list[IRBLASTER_TIMER_CTRL].rate);
		omap_dm_timer_set_match(gpt_pwm_list[IRBLASTER_TIMER_CTRL].timer, 1,val );

	}

	omap_dm_timer_start(gpt_pwm_list[ IRBLASTER_TIMER_CTRL].timer);
	omap_dm_timer_start(gpt_pwm_list[ IRBLASTER_PWM].timer);
}