示例#1
0
/**
 * regmap_bulk_read(): Read multiple registers from the device
 *
 * @map: Register map to write to
 * @reg: First register to be read from
 * @val: Pointer to store read value, in native register size for device
 * @val_count: Number of registers to read
 *
 * A value of zero will be returned on success, a negative errno will
 * be returned in error cases.
 */
int regmap_bulk_read(struct regmap *map, unsigned int reg, void *val,
		     size_t val_count)
{
	int ret, i;
	size_t val_bytes = map->format.val_bytes;
	bool vol = true;

	if (!map->format.parse_val)
		return -EINVAL;

	/* Is this a block of volatile registers? */
	for (i = 0; i < val_count; i++)
		if (!regmap_volatile(map, reg + i))
			vol = false;

	if (vol || map->cache_type == REGCACHE_NONE) {
		ret = regmap_raw_read(map, reg, val, val_bytes * val_count);
		if (ret != 0)
			return ret;

		for (i = 0; i < val_count * val_bytes; i += val_bytes)
			map->format.parse_val(val + i);
	} else {
		for (i = 0; i < val_count; i++) {
			ret = regmap_read(map, reg + i, val + (i * val_bytes));
			if (ret != 0)
				return ret;
		}
	}

	return 0;
}
示例#2
0
int pm860x_bulk_read(struct i2c_client *i2c, int reg,
		     int count, unsigned char *buf)
{
	struct pm860x_chip *chip = i2c_get_clientdata(i2c);
	struct regmap *map = (i2c == chip->client) ? chip->regmap
				: chip->regmap_companion;
	int ret;

	ret = regmap_raw_read(map, reg, buf, count);
	return ret;
}
int pcf50633_read_block(struct pcf50633 *pcf, u8 reg,
                        int nr_regs, u8 *data)
{
    int ret;

    ret = regmap_raw_read(pcf->regmap, reg, data, nr_regs);
    if (ret != 0)
        return ret;

    return nr_regs;
}
示例#4
0
static int ___get_ibuf(struct mcuio_i2c_dev *i2cd, int count)
{
	int togo, l, stat;

	togo = i2cd->ilen - i2cd->received;
	l = min(count, togo);
	pr_debug("%s: count = %d, togo = %d, l = %d, received = %d\n",
		 __func__, count, togo, l, i2cd->received);
	stat = regmap_raw_read(i2cd->map_b, I2C_MCUIO_IBUF,
			       &i2cd->buf[i2cd->received], l);
	if (stat < 0) {
		dev_err(&i2cd->mdev->dev, "error reading input buffer\n");
		return stat;
	}
	i2cd->received += l;
	return stat;
}
示例#5
0
static int gpadc4_measure_voltage(struct pm800_headset_info *info )
{
	unsigned char buf[2];
	int sum = 0, ret = -1;

  ret = regmap_raw_read(info->map_gpadc, PM800_GPADC4_AVG1, buf, 2); //KSND fixed
	if (ret < 0){
    pr_debug("%s: Fail to get the voltage!! \n", __func__);
    return 0;
  }

	/* GPADC4_dir = 1, measure(mv) = value *1.4 *1000/(2^12) */
	sum = ((buf[0] & 0xFF) << 4) | (buf[1] & 0x0F);
	sum = ((sum & 0xFFF) * 1400) >> 12;
	//pr_debug("%s: the voltage is %d mv\n", __func__,sum);
	return sum;
}
示例#6
0
static int wm8400_register_codec(struct wm8400 *wm8400)
{
    struct mfd_cell cell = {
        .name = "wm8400-codec",
        .platform_data = wm8400,
        .pdata_size = sizeof(*wm8400),
    };

    return mfd_add_devices(wm8400->dev, -1, &cell, 1, NULL, 0);
}

/*
 * wm8400_init - Generic initialisation
 *
 * The WM8400 can be configured as either an I2C or SPI device.  Probe
 * functions for each bus set up the accessors then call into this to
 * set up the device itself.
 */
static int wm8400_init(struct wm8400 *wm8400,
                       struct wm8400_platform_data *pdata)
{
    u16 reg;
    int ret, i;

    mutex_init(&wm8400->io_lock);

    dev_set_drvdata(wm8400->dev, wm8400);

    /* Check that this is actually a WM8400 */
    ret = regmap_read(wm8400->regmap, WM8400_RESET_ID, &i);
    if (ret != 0) {
        dev_err(wm8400->dev, "Chip ID register read failed\n");
        return -EIO;
    }
    if (i != reg_data[WM8400_RESET_ID].default_val) {
        dev_err(wm8400->dev, "Device is not a WM8400, ID is %x\n",
                reg);
        return -ENODEV;
    }

    /* We don't know what state the hardware is in and since this
     * is a PMIC we can't reset it safely so initialise the register
     * cache from the hardware.
     */
    ret = regmap_raw_read(wm8400->regmap, 0, wm8400->reg_cache,
                          ARRAY_SIZE(wm8400->reg_cache));
    if (ret != 0) {
        dev_err(wm8400->dev, "Register cache read failed\n");
        return -EIO;
    }
    for (i = 0; i < ARRAY_SIZE(wm8400->reg_cache); i++)
        wm8400->reg_cache[i] = be16_to_cpu(wm8400->reg_cache[i]);

    /* If the codec is in reset use hard coded values */
    if (!(wm8400->reg_cache[WM8400_POWER_MANAGEMENT_1] & WM8400_CODEC_ENA))
        for (i = 0; i < ARRAY_SIZE(wm8400->reg_cache); i++)
            if (reg_data[i].is_codec)
                wm8400->reg_cache[i] = reg_data[i].default_val;

    ret = wm8400_read(wm8400, WM8400_ID, 1, &reg);
    if (ret != 0) {
        dev_err(wm8400->dev, "ID register read failed: %d\n", ret);
        return ret;
    }
    reg = (reg & WM8400_CHIP_REV_MASK) >> WM8400_CHIP_REV_SHIFT;
    dev_info(wm8400->dev, "WM8400 revision %x\n", reg);

    ret = wm8400_register_codec(wm8400);
    if (ret != 0) {
        dev_err(wm8400->dev, "Failed to register codec\n");
        goto err_children;
    }

    if (pdata && pdata->platform_init) {
        ret = pdata->platform_init(wm8400->dev);
        if (ret != 0) {
            dev_err(wm8400->dev, "Platform init failed: %d\n",
                    ret);
            goto err_children;
        }
    } else
        dev_warn(wm8400->dev, "No platform initialisation supplied\n");

    return 0;

err_children:
    mfd_remove_devices(wm8400->dev);
    return ret;
}
示例#7
0
static int rt1711h_read8(struct rt1711h_chip *chip, unsigned int reg, u8 *val)
{
	return regmap_raw_read(chip->data.regmap, reg, val, sizeof(u8));
}
示例#8
0
static int regcache_hw_init(struct regmap *map)
{
	int i, j;
	int ret;
	int count;
	unsigned int reg, val;
	void *tmp_buf;

	if (!map->num_reg_defaults_raw)
		return -EINVAL;

	/* calculate the size of reg_defaults */
	for (count = 0, i = 0; i < map->num_reg_defaults_raw; i++)
		if (regmap_readable(map, i * map->reg_stride) &&
		    !regmap_volatile(map, i * map->reg_stride))
			count++;

	/* all registers are unreadable or volatile, so just bypass */
	if (!count) {
		map->cache_bypass = true;
		return 0;
	}

	map->num_reg_defaults = count;
	map->reg_defaults = kmalloc_array(count, sizeof(struct reg_default),
					  GFP_KERNEL);
	if (!map->reg_defaults)
		return -ENOMEM;

	if (!map->reg_defaults_raw) {
		bool cache_bypass = map->cache_bypass;
		dev_warn(map->dev, "No cache defaults, reading back from HW\n");

		/* Bypass the cache access till data read from HW */
		map->cache_bypass = true;
		tmp_buf = kmalloc(map->cache_size_raw, GFP_KERNEL);
		if (!tmp_buf) {
			ret = -ENOMEM;
			goto err_free;
		}
		ret = regmap_raw_read(map, 0, tmp_buf,
				      map->cache_size_raw);
		map->cache_bypass = cache_bypass;
		if (ret == 0) {
			map->reg_defaults_raw = tmp_buf;
			map->cache_free = 1;
		} else {
			kfree(tmp_buf);
		}
	}

	/* fill the reg_defaults */
	for (i = 0, j = 0; i < map->num_reg_defaults_raw; i++) {
		reg = i * map->reg_stride;

		if (!regmap_readable(map, reg))
			continue;

		if (regmap_volatile(map, reg))
			continue;

		if (map->reg_defaults_raw) {
			val = regcache_get_val(map, map->reg_defaults_raw, i);
		} else {
			bool cache_bypass = map->cache_bypass;

			map->cache_bypass = true;
			ret = regmap_read(map, reg, &val);
			map->cache_bypass = cache_bypass;
			if (ret != 0) {
				dev_err(map->dev, "Failed to read %d: %d\n",
					reg, ret);
				goto err_free;
			}
		}

		map->reg_defaults[j].reg = reg;
		map->reg_defaults[j].def = val;
		j++;
	}

	return 0;

err_free:
	kfree(map->reg_defaults);

	return ret;
}
示例#9
0
static int regcache_hw_init(struct regmap *map)
{
	int i, j;
	int ret;
	int count;
	unsigned int val;
	void *tmp_buf;

	if (!map->num_reg_defaults_raw)
		return -EINVAL;

	if (!map->reg_defaults_raw) {
		u32 cache_bypass = map->cache_bypass;
		dev_warn(map->dev, "No cache defaults, reading back from HW\n");

		/* Bypass the cache access till data read from HW*/
		map->cache_bypass = 1;
		tmp_buf = kmalloc(map->cache_size_raw, GFP_KERNEL);
		if (!tmp_buf)
			return -EINVAL;
		ret = regmap_raw_read(map, 0, tmp_buf,
				      map->num_reg_defaults_raw);
		map->cache_bypass = cache_bypass;
		if (ret < 0) {
			kfree(tmp_buf);
			return ret;
		}
		map->reg_defaults_raw = tmp_buf;
		map->cache_free = 1;
	}

	/* calculate the size of reg_defaults */
	for (count = 0, i = 0; i < map->num_reg_defaults_raw; i++) {
		val = regcache_get_val(map, map->reg_defaults_raw, i);
		if (regmap_volatile(map, i * map->reg_stride))
			continue;
		count++;
	}

	map->reg_defaults = kmalloc(count * sizeof(struct reg_default),
				      GFP_KERNEL);
	if (!map->reg_defaults) {
		ret = -ENOMEM;
		goto err_free;
	}

	/* fill the reg_defaults */
	map->num_reg_defaults = count;
	for (i = 0, j = 0; i < map->num_reg_defaults_raw; i++) {
		val = regcache_get_val(map, map->reg_defaults_raw, i);
		if (regmap_volatile(map, i * map->reg_stride))
			continue;
		map->reg_defaults[j].reg = i * map->reg_stride;
		map->reg_defaults[j].def = val;
		j++;
	}

	return 0;

err_free:
	if (map->cache_free)
		kfree(map->reg_defaults_raw);

	return ret;
}
示例#10
0
文件: sc16is7xx.c 项目: 3null/linux
static void sc16is7xx_handle_rx(struct uart_port *port, unsigned int rxlen,
				unsigned int iir)
{
	struct sc16is7xx_port *s = dev_get_drvdata(port->dev);
	unsigned int lsr = 0, ch, flag, bytes_read, i;
	bool read_lsr = (iir == SC16IS7XX_IIR_RLSE_SRC) ? true : false;

	if (unlikely(rxlen >= sizeof(s->buf))) {
		dev_warn_ratelimited(port->dev,
				     "Port %i: Possible RX FIFO overrun: %d\n",
				     port->line, rxlen);
		port->icount.buf_overrun++;
		/* Ensure sanity of RX level */
		rxlen = sizeof(s->buf);
	}

	while (rxlen) {
		/* Only read lsr if there are possible errors in FIFO */
		if (read_lsr) {
			lsr = sc16is7xx_port_read(port, SC16IS7XX_LSR_REG);
			if (!(lsr & SC16IS7XX_LSR_FIFOE_BIT))
				read_lsr = false; /* No errors left in FIFO */
		} else
			lsr = 0;

		if (read_lsr) {
			s->buf[0] = sc16is7xx_port_read(port, SC16IS7XX_RHR_REG);
			bytes_read = 1;
		} else {
			regcache_cache_bypass(s->regmap, true);
			regmap_raw_read(s->regmap, SC16IS7XX_RHR_REG,
					s->buf, rxlen);
			regcache_cache_bypass(s->regmap, false);
			bytes_read = rxlen;
		}

		lsr &= SC16IS7XX_LSR_BRK_ERROR_MASK;

		port->icount.rx++;
		flag = TTY_NORMAL;

		if (unlikely(lsr)) {
			if (lsr & SC16IS7XX_LSR_BI_BIT) {
				port->icount.brk++;
				if (uart_handle_break(port))
					continue;
			} else if (lsr & SC16IS7XX_LSR_PE_BIT)
				port->icount.parity++;
			else if (lsr & SC16IS7XX_LSR_FE_BIT)
				port->icount.frame++;
			else if (lsr & SC16IS7XX_LSR_OE_BIT)
				port->icount.overrun++;

			lsr &= port->read_status_mask;
			if (lsr & SC16IS7XX_LSR_BI_BIT)
				flag = TTY_BREAK;
			else if (lsr & SC16IS7XX_LSR_PE_BIT)
				flag = TTY_PARITY;
			else if (lsr & SC16IS7XX_LSR_FE_BIT)
				flag = TTY_FRAME;
			else if (lsr & SC16IS7XX_LSR_OE_BIT)
				flag = TTY_OVERRUN;
		}

		for (i = 0; i < bytes_read; ++i) {
			ch = s->buf[i];
			if (uart_handle_sysrq_char(port, ch))
				continue;

			if (lsr & port->ignore_status_mask)
				continue;

			uart_insert_char(port, lsr, SC16IS7XX_LSR_OE_BIT, ch,
					 flag);
		}
		rxlen -= bytes_read;
	}

	tty_flip_buffer_push(&port->state->port);
}
示例#11
0
static int wm8994_read(struct wm8994 *wm8994, unsigned short reg,
		       int bytes, void *dest)
{
	return regmap_raw_read(wm8994->regmap, reg, dest, bytes);
}