static int raise_ab8500_gpio26(void)
{
	int ret;

	/* selection */
	ret = ab8500_read(AB8500_MISC, AB8500_GPIO_DIR4_REG);
	if (ret < 0)
		goto out;

	ret |= 0x2;
	ret = ab8500_write(AB8500_MISC, AB8500_GPIO_DIR4_REG, ret);
	if (ret < 0)
		goto out;

	/* out */
	ret = ab8500_read(AB8500_MISC, AB8500_GPIO_OUT4_REG);
	if (ret < 0)
		goto out;

	ret |= 0x2;
	ret = ab8500_write(AB8500_MISC, AB8500_GPIO_OUT4_REG, ret);

out:
	return ret;
}
Example #2
0
static int itp_load_ipl(block_dev_desc_t *block_dev)
{
	u32 offset;
	u32 size;
	u32 loadaddr;
	u32 returnvalue;
	int ab8500_cutid;

	debug("itp_load_ipl\n");

	/* Check if IPL partition is present */
	if (get_entry_info_toc(block_dev, ITP_TOC_IPL_NAME, &offset,
			       &size, &loadaddr)) {
		printf("itp_load_ipl: ipl toc entry not present\n");
		return 1;
	}

	/* Get CutID */
	ab8500_cutid = ab8500_read(AB8500_MISC, AB8500_REV_REG);

	returnvalue = sec_bridge_call_secure_service((u32)ISSWAPI_SECURE_LOAD,
						SEC_ROM_FORCE_CLEAN_MASK,
						IPL_ITEM_ID,
						ab8500_cutid);
	if (returnvalue != SEC_ROM_RET_OK) {
		printf("itp_load_ipl: ISSWAPI_SECURE_LOAD: %d\n",
			returnvalue);
		return 1;
	}

	return 0;
}
static int do_ab8500_read(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
	ulong bankaddress;
	ulong offset;
	int ret;

	if (argc != 3) {
		cmd_usage(cmdtp);
		return 1;
	}

	/* Get bank and offset */
	bankaddress = simple_strtoul(argv[1], NULL, 16);
	offset = simple_strtoul(argv[2], NULL, 16);

	ret = ab8500_read(bankaddress, offset);
	if (ret < 0) {
		printf("ab8500 read failed at address 0x%lx,0x%lx\n",
		       bankaddress, offset);
		return 1;
	}

	/* Print the result */
	printf("ab8500_read(0x%lx,0x%lx) = 0x%x\n", bankaddress, offset, ret);

	return 0;
}
Example #4
0
static int ab8500_regulator_get_voltage(struct regulator_dev *rdev)
{
	int regulator_id, ret, val;
	struct ab8500_regulator_info *info = rdev_get_drvdata(rdev);

	regulator_id = rdev_get_id(rdev);
	if (regulator_id >= AB8500_NUM_REGULATORS)
		return -EINVAL;

	ret = ab8500_read(info->ab8500, info->voltage_reg);
	if (ret < 0) {
		dev_err(rdev_get_dev(rdev),
			"couldn't read voltage reg for regulator\n");
		return ret;
	}

	/* vintcore has a different layout */
	val = ret & info->voltage_mask;
	if (regulator_id == AB8500_LDO_INTCORE)
		ret = info->supported_voltages[val >> 0x3];
	else
Example #5
0
static int ab8500_regulator_is_enabled(struct regulator_dev *rdev)
{
	int regulator_id, ret;
	struct ab8500_regulator_info *info = rdev_get_drvdata(rdev);

	regulator_id = rdev_get_id(rdev);
	if (regulator_id >= AB8500_NUM_REGULATORS)
		return -EINVAL;

	ret = ab8500_read(info->ab8500, info->update_reg);
	if (ret < 0) {
		dev_err(rdev_get_dev(rdev),
			"couldn't read 0x%x register\n", info->update_reg);
		return ret;
	}

	if (ret & info->mask)
		return true;
	else
		return false;
}
/* 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;
}