示例#1
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);
	}
}
示例#2
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);
	}
}
示例#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);
}
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;
}
示例#5
0
static irqreturn_t omap2_irblaster_timer_interrupt_no_carrier(void)
{
	int next_cycle;
	struct omap_dm_timer *timer_ctrl = gpt_pwm_list[ IRBLASTER_TIMER_CTRL].timer;
	struct omap_dm_timer *timer_pwm = gpt_pwm_list[ IRBLASTER_PWM ].timer;
	unsigned int timer_ctrl_period = gpt_pwm_list[ IRBLASTER_TIMER_CTRL].period;
	unsigned int timer_pwm_period = gpt_pwm_list[ IRBLASTER_PWM].period;

	omap_dm_timer_write_status(timer_ctrl, OMAP_TIMER_INT_MATCH);
	_gio_debug_clear();
	next_cycle = *irq_irblaster_cycles;
	if ( next_cycle ) {
		irq_irblaster_cycles++;
		gpt_set_new_cycle(timer_ctrl,timer_ctrl_period, next_cycle);
		gpt_set_new_cycle(timer_pwm,timer_pwm_period, next_cycle);
	}
	else {
		/* no trigger */
		omap_dm_timer_set_pwm(timer_pwm,0,1,0);
		/* stop timers */
		omap_dm_timer_stop(timer_pwm);
		omap_dm_timer_stop(timer_ctrl);
		irb_over = 1;
		wake_up_interruptible(&irb_wait);
	}

	_gio_debug_set();
	return IRQ_HANDLED;

}
示例#6
0
static void set_gptimer_pwm_vibrator(int on)
{
    unsigned long	flags;

    if (pwm_timer == NULL) {
        pr_err(KERN_ERR "vibrator pwm timer is NULL\n");
        return;
    }

    spin_lock_irqsave(&vibe__timer_lock, flags);
    if (on) {
        if(!vibe_timer_state) {
            gpio_set_value(GPIO_VIB_EN, 1);
            omap_dm_timer_enable(pwm_timer);
            omap_dm_timer_set_match(pwm_timer, 1, 0xFFFFFFFE);
            omap_dm_timer_set_pwm(pwm_timer, 0, 1, OMAP_TIMER_TRIGGER_OVERFLOW_AND_COMPARE);
            omap_dm_timer_set_load_start(pwm_timer, 1, MOTOR_RESONANCE_COUTER_VALUE);
            vibe_timer_state = 1;
        }
    } else {
        if(vibe_timer_state) {
            omap_dm_timer_stop(pwm_timer);
            omap_dm_timer_disable(pwm_timer);
            gpio_set_value(GPIO_VIB_EN, 0);
            vibe_timer_state = 0;
        }
    }
    spin_unlock_irqrestore(&vibe__timer_lock, flags);
}
示例#7
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);
	}
}
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;
}
示例#9
0
/*
 * For setting the values in registers for varying the duty cycle and time period
 */
static void vibtonz_GPTimerSetValue(unsigned long load,unsigned long cmp)
{
	unsigned long load_reg, cmp_reg;
//	printk("[VIBRATOR] %s \n",__func__);

	load_reg =  load;	/* For setting the frequency=22.2Khz */
	cmp_reg =  cmp;		/* For varying the duty cycle */

	omap_dm_timer_enable(gptimer);
	omap_dm_timer_set_load(gptimer, 1, -load_reg);
	omap_dm_timer_set_match(gptimer, 1, -cmp_reg);
	omap_dm_timer_set_pwm(gptimer, 0, 1,OMAP_TIMER_TRIGGER_OVERFLOW_AND_COMPARE);
	omap_dm_timer_write_counter(gptimer, -2);
	omap_dm_timer_save_context(gptimer);
}
示例#10
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);
}
static int sholest_lvibrator_initialization(void)
{
	unsigned long load_reg, cmp_reg;
	uint32_t timer_rate = 0;
	int ret = 0;
	vib_pwm_timer = omap_dm_timer_request_specific(11);
	if (vib_pwm_timer == NULL)
		ret = -ENODEV;
	timer_rate = clk_get_rate(omap_dm_timer_get_fclk(vib_pwm_timer));
	load_reg = timer_rate * SHOLEST_LVIBRATOR_PERIOD / 1000000;
	cmp_reg = timer_rate * (SHOLEST_LVIBRATOR_PERIOD -
				SHOLEST_LVIBRATOR_DUTY) / 1000000;
	omap_dm_timer_set_source(vib_pwm_timer, OMAP_TIMER_SRC_32_KHZ);
	omap_dm_timer_set_load(vib_pwm_timer, 1, -load_reg);
	omap_dm_timer_set_match(vib_pwm_timer, 1, -cmp_reg);
	omap_dm_timer_set_pwm(vib_pwm_timer, 0, 1,
			      OMAP_TIMER_TRIGGER_OVERFLOW_AND_COMPARE);
	omap_dm_timer_write_counter(vib_pwm_timer, -2);
	return 0;
}
示例#12
0
static void omap_pwm_led_power_off(struct omap_pwm_led *led)
{
	pr_debug("%s%s: \n", PASS1,__func__);
	printk("!!!!!!!!!!%s the brightness is %d \n",__func__, led->brightness);
	if (!led->powered)
		return;
	led->powered = 0;

	/* Everything off */
	omap_dm_timer_set_pwm(led->intensity_timer, 0, 1,
			      OMAP_TIMER_TRIGGER_OVERFLOW_AND_COMPARE);
	omap_dm_timer_stop(led->intensity_timer);
	omap_dm_timer_disable(led->intensity_timer);

	if (led->blink_timer != NULL) {
		omap_dm_timer_stop(led->blink_timer);
		omap_dm_timer_disable(led->blink_timer);
	}

	if (led->pdata->set_power != NULL)
		led->pdata->set_power(led->pdata, 0);
}
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;
}
示例#14
0
文件: ir-rx51.c 项目: 03199618/linux
static void lirc_rx51_off(struct lirc_rx51 *lirc_rx51)
{
	omap_dm_timer_set_pwm(lirc_rx51->pwm_timer, 0, 1,
			      OMAP_TIMER_TRIGGER_NONE);
}
示例#15
0
文件: ir-rx51.c 项目: 03199618/linux
static void lirc_rx51_on(struct lirc_rx51 *lirc_rx51)
{
	omap_dm_timer_set_pwm(lirc_rx51->pwm_timer, 0, 1,
			      OMAP_TIMER_TRIGGER_OVERFLOW_AND_COMPARE);
}
示例#16
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);
}
示例#17
0
static int _init_gpt(void) 
{
	int irqno;
	int ret = 0;

	if ((gpt_pwm_list[IRBLASTER_PWM].timer = omap_dm_timer_request_specific(gpt_pwm_list[IRBLASTER_PWM].no)) == NULL) {
		printk(KERN_ERR "%s: failed to request dm-timer (%d)\n", gpt_pwm_list[IRBLASTER_PWM].name, gpt_pwm_list[IRBLASTER_PWM].no);
		return -ENODEV;
	}

	omap_dm_timer_set_source(gpt_pwm_list[IRBLASTER_PWM].timer, gpt_pwm_list[IRBLASTER_PWM].source);
	gpt_pwm_list[IRBLASTER_PWM].rate = clk_get_rate(omap_dm_timer_get_fclk(gpt_pwm_list[IRBLASTER_PWM].timer));
	printk(KERN_DEBUG "%s (%d) timer rate is: %d\n", gpt_pwm_list[IRBLASTER_PWM].name, gpt_pwm_list[IRBLASTER_PWM].no, gpt_pwm_list[IRBLASTER_PWM].rate);
	
	if ((gpt_pwm_list[IRBLASTER_TIMER_CTRL].timer = omap_dm_timer_request_specific(gpt_pwm_list[IRBLASTER_TIMER_CTRL].no)) == NULL) {
		printk(KERN_ERR "%s: failed to request dm-timer (%d)\n", gpt_pwm_list[IRBLASTER_TIMER_CTRL].name, gpt_pwm_list[IRBLASTER_TIMER_CTRL].no);
		omap_dm_timer_free(gpt_pwm_list[IRBLASTER_PWM].timer);
		return -ENODEV;
	}

	omap_dm_timer_set_source(gpt_pwm_list[IRBLASTER_TIMER_CTRL].timer, gpt_pwm_list[IRBLASTER_TIMER_CTRL].source);
	gpt_pwm_list[IRBLASTER_TIMER_CTRL].rate = clk_get_rate(omap_dm_timer_get_fclk(gpt_pwm_list[IRBLASTER_TIMER_CTRL].timer));
	printk(KERN_DEBUG "%s (%d) timer rate is: %d\n", gpt_pwm_list[IRBLASTER_TIMER_CTRL].name, gpt_pwm_list[IRBLASTER_TIMER_CTRL].no, gpt_pwm_list[IRBLASTER_TIMER_CTRL].rate);

	/* select irblaster configuration */
	_select_irb_config();

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

	/* set modulation mod */
	/* trigger on overflow and match */
	omap_dm_timer_set_pwm(gpt_pwm_list[IRBLASTER_PWM].timer,0,1,2);
	omap_dm_timer_set_pwm(gpt_pwm_list[IRBLASTER_TIMER_CTRL].timer, 0, 1, 2);

	//if ( gpt_pwm_list[IRBLASTER_TIMER_CTRL].mux_config )
	//	omap_cfg_reg(gpt_pwm_list[IRBLASTER_TIMER_CTRL].mux_config);

	irqno = omap_dm_timer_get_irq(gpt_pwm_list[IRBLASTER_TIMER_CTRL].timer);
	if (request_irq(irqno, omap2_irblaster_timer_interrupt, 
			IRQF_DISABLED, "gp timer", NULL)) {
		ret = -EBUSY;
		goto failed_request_irq;
	}
	omap_dm_timer_set_int_enable(gpt_pwm_list[IRBLASTER_TIMER_CTRL].timer, IRBLASTER_TIMER_CTRL_IT_TYPE);

	/* disable timer clocks after init */
	omap_dm_timer_disable(gpt_pwm_list[IRBLASTER_TIMER_CTRL].timer);
	omap_dm_timer_disable(gpt_pwm_list[IRBLASTER_PWM].timer);

	init_waitqueue_head(&irb_wait);

	_gio_debug_init();

	return 0;

failed_request_irq:
	omap_dm_timer_free(gpt_pwm_list[IRBLASTER_PWM].timer);
	omap_dm_timer_free(gpt_pwm_list[IRBLASTER_TIMER_CTRL].timer);
	return ret;
}
示例#18
0
static int omap_pwm_led_probe(struct platform_device *pdev)
{
	struct omap_pwm_led_platform_data *pdata = pdev->dev.platform_data;
	struct omap_pwm_led *led;
	int ret;

	if (pdata->intensity_timer < 1 || pdata->intensity_timer > MAX_GPTIMER_ID)
		return -EINVAL;

	if (pdata->blink_timer != 0 || pdata->blink_timer > MAX_GPTIMER_ID)
		return -EINVAL;

	led = kzalloc(sizeof(struct omap_pwm_led), GFP_KERNEL);
	if (led == NULL) {
		dev_err(&pdev->dev, "No memory for device\n");
		return -ENOMEM;
	}

	platform_set_drvdata(pdev, led);
	led->cdev.brightness_set = omap_pwm_led_set;
	led->cdev.default_trigger = pdata->default_trigger;
	led->cdev.name = pdata->name;
	led->pdata = pdata;
	led->brightness = LED_OFF;

	dev_info(&pdev->dev, "OMAP PWM LED (%s) at GP timer %d/%d\n",
		 pdata->name, pdata->intensity_timer, pdata->blink_timer);

	/* register our new led device */
	ret = led_classdev_register(&pdev->dev, &led->cdev);
	if (ret < 0) {
		dev_err(&pdev->dev, "led_classdev_register failed\n");
		goto error_classdev;
	}

	/* get related dm timers */
	led->intensity_timer = omap_dm_timer_request_specific(pdata->intensity_timer);
	if (led->intensity_timer == NULL) {
		dev_err(&pdev->dev, "failed to request intensity pwm timer\n");
		ret = -ENODEV;
		goto error_intensity;
	}

	if (led->pdata->invert)
		omap_dm_timer_set_pwm(led->intensity_timer, 1, 1,
				      OMAP_TIMER_TRIGGER_OVERFLOW_AND_COMPARE);

	if (pdata->blink_timer != 0) {
		led->blink_timer = omap_dm_timer_request_specific(pdata->blink_timer);
		if (led->blink_timer == NULL) {
			dev_err(&pdev->dev, "failed to request blinking pwm timer\n");
			ret = -ENODEV;
			goto error_blink1;
		}
		ret = device_create_file(led->cdev.dev,
					       &dev_attr_on_period);
		if(ret)
			goto error_blink2;

		ret = device_create_file(led->cdev.dev,
					&dev_attr_off_period);
		if(ret)
			goto error_blink3;

	}

	return 0;

error_blink3:
	device_remove_file(led->cdev.dev,
				 &dev_attr_on_period);
error_blink2:
	dev_err(&pdev->dev, "failed to create device file(s)\n");
error_blink1:
	omap_dm_timer_free(led->intensity_timer);
error_intensity:
	led_classdev_unregister(&led->cdev);
error_classdev:
	kfree(led);
	return ret;
}