u8 bcm3450_read_byte(u8 offset) { struct i2c_msg msg[2]; u8 off, buf[4]; struct i2c_client *client = &pclient_data->client; BCM_LOG_DEBUG(BCM_LOG_ID_I2C, "Entering the function %s \n", __FUNCTION__); if (offset > MAX_REG_OFFSET) { BCM_LOG_ERROR(BCM_LOG_ID_I2C, "Invalid offset. It should be less than " "%X \n", MAX_REG_OFFSET); return -1; } /* BCM3450 requires the offset to be the register number */ off = offset/4; msg[0].addr = msg[1].addr = client->addr; msg[0].flags = msg[1].flags = client->flags & I2C_M_TEN; msg[0].len = 1; msg[0].buf = (char *)&off; msg[1].flags |= I2C_M_RD; msg[1].len = 4; msg[1].buf = buf; if(i2c_transfer(client->adapter, msg, 2) == 2) { return buf[offset % 4]; } return -1; }
static ssize_t log_proc_write(struct file *f, const char *buf, size_t cnt, loff_t *pos) { int i; #define MAX_ARGS 5 #define MAX_ARG_SIZE 32 typedef char arg_t[MAX_ARG_SIZE]; arg_t arg[MAX_ARGS]; int argc; char cmd; bcmLogModuleInfo_t *pModInfo; #define LOG_WR_KBUF_SIZE 128 char kbuf[LOG_WR_KBUF_SIZE]; if ((cnt > LOG_WR_KBUF_SIZE-1) || (copy_from_user(kbuf, buf, cnt) != 0)) return -EFAULT; kbuf[cnt]=0; argc = sscanf(kbuf, "%c %s %s %s %s %s", &cmd, arg[0], arg[1], arg[2], arg[3], arg[4]); for (i=0; i<MAX_ARGS; ++i) { arg[i][MAX_ARG_SIZE-1] = '\0'; } BCM_LOG_INFO(BCM_LOG_ID_LOG, "WRITE: cmd: %c, argc: %d", cmd, argc); for (i=0; i<argc-1; ++i) { BCM_LOG_INFO(BCM_LOG_ID_LOG, "arg[%d]: %s ", i, arg[i]); } switch ( cmd ) { BCM_LOGCODE( case 'g': { bcmLogLevel_t logLevel = str2val(arg[0]); if(argc == 2 && logLevel >= 0 && logLevel < BCM_LOG_LEVEL_MAX) globalLogLevel = logLevel; else BCM_LOG_ERROR(BCM_LOG_ID_LOG, "Invalid Parameter '%s'\n", arg[0]); break; } ) BCM_LOGCODE( case 'r': { bcmPrint ("Global Log Level : %d\n", globalLogLevel); break; } )
/* This function is called by i2c_probe */ static int bcm3450_detect(struct i2c_adapter *adapter, int address, int kind) { struct i2c_client *client; int err = 0; #ifdef PROCFS_HOOKS struct proc_dir_entry *p; #endif BCM_LOG_DEBUG(BCM_LOG_ID_I2C, "Entering the function %s \n", __FUNCTION__); if (!i2c_check_functionality(adapter, I2C_FUNC_I2C)) goto exit; if (!(pclient_data = kzalloc(sizeof(struct bcm3450_data), GFP_KERNEL))) { err = -ENOMEM; goto exit; } /* Setup the i2c client data */ client = &pclient_data->client; i2c_set_clientdata(client, pclient_data); client->addr = address; client->adapter = adapter; client->driver = &bcm3450_driver; client->flags = 0; strlcpy(client->name, "bcm3450", I2C_NAME_SIZE); /* Tell the I2C layer a new client has arrived */ if ((err = i2c_attach_client(client))) goto exit_kfree; #ifdef SYSFS_HOOKS /* Register sysfs hooks */ err = sysfs_create_group(&client->dev.kobj, &bcm3450_attr_group); if (err) goto exit_detach; #endif #ifdef PROCFS_HOOKS p = create_proc_entry(PROC_ENTRY_NAME1, 0, 0); if (!p) { BCM_LOG_ERROR(BCM_LOG_ID_I2C, "bcmlog: unable to create /proc/%s!\n", PROC_ENTRY_NAME1); err = -EIO; #ifdef SYSFS_HOOKS sysfs_remove_group(&client->dev.kobj, &bcm3450_attr_group); #endif goto exit_detach; } p->read_proc = b3450_proc_read; p->write_proc = b3450_proc_write; p->data = (void *)pclient_data; #ifdef MOCA_I2C_TEST p = create_proc_entry(PROC_ENTRY_NAME2, 0, 0); if (p) { p->proc_fops = &b3450Test_fops; } #endif #endif return 0; #if defined(SYSFS_HOOKS) || defined(PROCFS_HOOKS) exit_detach: i2c_detach_client(client); #endif exit_kfree: kfree(pclient_data); exit: return err; }