diff options
-rw-r--r-- | board/st/u8500/Makefile | 2 | ||||
-rw-r--r-- | board/st/u8500/ab8500vibra.c | 86 | ||||
-rw-r--r-- | include/asm-arm/arch-stw8500/ab8500.h | 10 |
3 files changed, 96 insertions, 2 deletions
diff --git a/board/st/u8500/Makefile b/board/st/u8500/Makefile index 254da4eae..ccaae6aa5 100644 --- a/board/st/u8500/Makefile +++ b/board/st/u8500/Makefile @@ -25,7 +25,7 @@ include $(TOPDIR)/config.mk CFLAGS += -D__RELEASE -D__STN_8500 LIB = $(obj)lib$(BOARD).a -COBJS := u8500.o flash.o gpio.o u8500_i2c.o mmc.o mmc_utils.o init_mmc.o emmc.o clock.o prcmu.o mcde_display.o mcde_hw.o +COBJS := u8500.o flash.o gpio.o u8500_i2c.o mmc.o mmc_utils.o init_mmc.o emmc.o clock.o prcmu.o mcde_display.o mcde_hw.o ab8500vibra.o SRCS := $(SOBJS:.o=.S) $(COBJS:.o=.c) OBJS := $(addprefix $(obj),$(COBJS)) diff --git a/board/st/u8500/ab8500vibra.c b/board/st/u8500/ab8500vibra.c new file mode 100644 index 000000000..da08a8e64 --- /dev/null +++ b/board/st/u8500/ab8500vibra.c @@ -0,0 +1,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" +); diff --git a/include/asm-arm/arch-stw8500/ab8500.h b/include/asm-arm/arch-stw8500/ab8500.h index ec468edea..5db047979 100644 --- a/include/asm-arm/arch-stw8500/ab8500.h +++ b/include/asm-arm/arch-stw8500/ab8500.h @@ -313,8 +313,16 @@ /* * Audio * Bank : 0x0D - * Not a part of this file. Should be part of Audio codec driver + * Should be part of Audio codec driver */ +#define AB8500_AUDIO_POWER_UP 0x0D00 +#define AB8500_AUDIO_ANA_CONF4 0x0D08 +#define AB8500_AUDIO_DA_PATH_CONF 0x0D09 +#define AB8500_AUDIO_PWM_GEN_CONF1 0x0D0F +#define AB8500_AUDIO_PWM_GEN_CONF2 0x0D10 +#define AB8500_AUDIO_PWM_GEN_CONF3 0x0D11 +#define AB8500_AUDIO_PWM_GEN_CONF4 0x0D12 +#define AB8500_AUDIO_PWM_GEN_CONF5 0x0D13 /* * Interrupt register offsets |