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 *)®addr, (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 = ®addr; 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; }
/** * 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 }
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; }