示例#1
0
static ssize_t arisc_rsb_write_block_data_store(struct device *dev,
		struct device_attribute *attr, const char *buf, size_t size)
{
	u32 ret = 0;

	sscanf(buf, "%x %x %x %x", &devaddr, (u32 *)&regaddr, (u32 *)&data, &datatype);
	if ((devaddr > 0xff) ||
	((datatype !=  RSB_DATA_TYPE_BYTE) && (datatype !=  RSB_DATA_TYPE_HWORD) && (datatype !=  RSB_DATA_TYPE_WORD))) {
		ARISC_WRN("invalid rsb paras, devaddr:0x%x, regaddr:0x%x, data:0x%x, datatype:0x%x\n", devaddr, regaddr, data, datatype);
		ARISC_WRN("pls echo like that: echo devaddr regaddr data datatype > rsb_write_block_data\n");
		return size;
	}

	block_cfg.msgattr = ARISC_MESSAGE_ATTR_SOFTSYN;
	block_cfg.datatype = datatype;
	block_cfg.len = 1;
	block_cfg.devaddr = devaddr;
	block_cfg.regaddr = &regaddr;
	block_cfg.data = &data;
	ret = arisc_rsb_write_block_data(&block_cfg);
	if (ret) {
		ARISC_ERR("rsb write data:0x%x to devaddr:0x%x regaddr:0x%x fail\n", *block_cfg.data, block_cfg.devaddr, *block_cfg.regaddr);
	} else {
		ARISC_LOG("rsb write data:0x%x to devaddr:0x%x regaddr:0x%x success\n", *block_cfg.data, block_cfg.devaddr, *block_cfg.regaddr);
	}

	return size;
}
示例#2
0
/**
 * acx00_rsb_reg_write: Write a single ACX00 register.
 *
 * @reg: Register to write to.
 * @val: Value to write.
 */
int acx00_rsb_reg_write(unsigned short reg, unsigned short value)
{
	int	ret;
	arisc_rsb_block_cfg_t rsb_data;
	unsigned char addr;
	unsigned int data;

	addr = (unsigned char)reg;
	data = value;
	rsb_data.len = 1;
	rsb_data.datatype = RSB_DATA_TYPE_HWORD;
	rsb_data.msgattr = ARISC_MESSAGE_ATTR_SOFTSYN;
	rsb_data.devaddr = RSB_RTSADDR_ACX00X00;
	rsb_data.regaddr = &addr;
	rsb_data.data = &data;

	/* read axp registers */
	ret = arisc_rsb_write_block_data(&rsb_data);
	if (ret != 0) {
		pr_err("failed reads to 0x%02x\n", reg);
		return ret;
	}

	return 0;
}
/* reg_val: raw value to be wrote to the reg, bcd convertion is done outside */
static inline void rtc_write_reg(struct ac100 *ac100, int reg, int value)
{
#if 0
	arisc_rsb_block_cfg_t rsb_data;
	unsigned char addr;
	unsigned int data;
	addr = (unsigned char)reg;

	data = value;
	rsb_data.len = 1;
	rsb_data.datatype = RSB_DATA_TYPE_HWORD;
	rsb_data.msgattr = ARISC_MESSAGE_ATTR_SOFTSYN;
	rsb_data.devaddr = RSB_RTSADDR_AC100;
	rsb_data.regaddr = &addr;
	rsb_data.data = &data;

	/* read axp registers */
	if (arisc_rsb_write_block_data(&rsb_data))
		pr_err("%s(%d) err: write reg-0x%x failed", __func__, __LINE__, reg);
#else
	ac100_reg_write(ac100, reg, value);
#endif
}
示例#4
0
static void ac100_writel(u32 val,void __iomem * reg)
{
    arisc_rsb_block_cfg_t rsb_data;
    u16 data = (u16)val;

    rsb_data.len = 1;
    rsb_data.datatype = RSB_DATA_TYPE_HWORD;
    rsb_data.msgattr = ARISC_MESSAGE_ATTR_SOFTSYN;
    rsb_data.devaddr = RSB_RTSADDR_AC100;
    rsb_data.regaddr = (unsigned char *)®
    rsb_data.data = (unsigned int *)&data;

#ifdef CONFIG_ARCH_SUN9IW1
    if(((unsigned int __force)reg == 0xc1) && (!(val&0x01)))
    {
        pr_err("Warning!!! %s skip write %x to reg %x\n", __func__,val,(unsigned int __force)reg);
        return;
    }
#endif
    /* write registers */
    if (arisc_rsb_write_block_data(&rsb_data))
        pr_err("%s(%d) err: write reg-0x%x failed", __func__, __LINE__, (unsigned int __force)reg);
    return;
}