summaryrefslogtreecommitdiff
path: root/board/st/u8500/ab8500vibra.c
blob: da08a8e64c89b3d845142513bbd93a60d6b56379 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
/*
 * Copyright (C) ST-Ericsson SA 2010
 * Author: Grzegorz Sygieda <grzegorz.sygieda@tieto.com> for ST-Ericsson.
 *
 * License terms: GNU General Public License (GPL), version 2.
 */

#include <common.h>
#include <command.h>
#include <asm/arch/ab8500.h>

/* Control vibrator */
int do_vibrate(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
	int time_ms = 100;  /* 100 ms */
	int intensity = 50;  /* 50 % */
	int reg;

	/*
	 * We use the last specified parameters, unless new ones are
	 * entered.
	 */
	if (!(flag & CMD_FLAG_REPEAT)) {
		/* Parse vibration time if given */
		if (argc >= 2)
			time_ms = simple_strtoul(argv[1], NULL, 10);

		/* Parse vibration intensity if given */
		if (argc >= 3)
			intensity = simple_strtoul(argv[2], NULL, 10);
	}

	/* disable audio registers reset */
	reg = ab8500_read(AB8500_SYS_CTRL2_BLOCK, AB8500_CTRL3_REG);
	ab8500_write(AB8500_SYS_CTRL2_BLOCK, AB8500_CTRL3_REG, reg | 0x02);
	/* audio clock enable */
	reg = ab8500_read(AB8500_SYS_CTRL2_BLOCK, AB8500_SYSULPCLK_CTRL1_REG);
	ab8500_write(AB8500_SYS_CTRL2_BLOCK,
			AB8500_SYSULPCLK_CTRL1_REG, reg | 0x10);
	/* enable audio supply */
	ab8500_write(AB8500_REGU_CTRL1, AB8500_REGU_VAUDIO_SUPPLY_REG, 0x02);

	/*
	 *  Audio related registers - Vibrator is controled using PWM
	 */
	/* power up audio feature */
	ab8500_write(AB8500_AUDIO, AB8500_AUDIO_POWER_UP, 0x88);
	/* enable vibra class-D */
	ab8500_write(AB8500_AUDIO, AB8500_AUDIO_ANA_CONF4, 0x03);
	/* general vibra control */
	ab8500_write(AB8500_AUDIO, AB8500_AUDIO_PWM_GEN_CONF1, 0xFF);

	/*
	 *  control register ...  Set PWM intensity 0..100%
	 */
	ab8500_write(AB8500_AUDIO, AB8500_AUDIO_PWM_GEN_CONF2, 0);
	ab8500_write(AB8500_AUDIO, AB8500_AUDIO_PWM_GEN_CONF3, intensity);
	ab8500_write(AB8500_AUDIO, AB8500_AUDIO_PWM_GEN_CONF4, 0);
	ab8500_write(AB8500_AUDIO, AB8500_AUDIO_PWM_GEN_CONF5, intensity);

	/* Sleep for time specified */
	udelay(1000 * time_ms);

	/* Set PWM RMS power to zero */
	ab8500_write(AB8500_AUDIO, AB8500_AUDIO_PWM_GEN_CONF3, 0);
	ab8500_write(AB8500_AUDIO, AB8500_AUDIO_PWM_GEN_CONF5, 0);

	/* audio clock disable */
	reg = ab8500_read(AB8500_SYS_CTRL2_BLOCK, AB8500_SYSULPCLK_CTRL1_REG);
	ab8500_write(AB8500_SYS_CTRL2_BLOCK,
			AB8500_SYSULPCLK_CTRL1_REG, reg & ~0x10);
	/* power down audio feature */
	ab8500_write(AB8500_AUDIO, AB8500_AUDIO_POWER_UP, 0);
	/* disable audio supply */
	ab8500_write(AB8500_REGU_CTRL1, AB8500_REGU_VAUDIO_SUPPLY_REG, 0);

	return 0;
}

U_BOOT_CMD(
	vibrate,    3,    1,    do_vibrate,
	"vibrator control utility\n",
	"<time> <intensity> - vibrate for time, intensity specified\n"
	"<time> - vibration time (default 100 ms)\n"
	"<intensity> - vibration intensity (default 50 %)\n"
);