/*lint -save -e958*/ s32 bsp_i2c_word_data_receive(u8 device_id,u8 addr, u16 *data) /*lint -restore*/ { u32 value1 =0xff; u32 value2 =0xff; unsigned long flags = 0; unsigned long flag = 0; int ret = 0; struct balong_i2c_ctrl *i2c_master; /*find i2c master*/ i2c_master=find_i2c_ctrl(device_id); if(!i2c_master){ i2c_print_error("can find i2c master for device %0x\n",device_id); return I2C_ERROR; } /*lock i2c master*/ bsp_ipc_spin_lock_irqsave(IPC_SEM_I2C_SWITHC,flag); spin_lock_irqsave(&i2c_master->lock,flags); /*clock enable*/ ret = bsp_i2c_clk_enable(i2c_master); if(ret){ i2c_print_error( "i2c clk enable failed ! \n"); goto irq_error; } /*send the first message,include start command and write command */ balong_i2c_message_start(i2c_master,device_id); /*check bus is or not transfer over */ if(I2C_OK!= balong_i2c_status_check(i2c_master)){ i2c_print_error( "i2c status get error! \n"); goto clk_error; } /*send slave register addr into TX register*/ writel(addr,i2c_master->regs+HI_I2C_TXR_OFFSET); /*send write command*/ writel(HI_I2C_COM_WRITE,i2c_master->regs+HI_I2C_COM_OFFSET); /*check bus is or not transfer over */ if(I2C_OK!= balong_i2c_status_check(i2c_master)){ i2c_print_error( "i2c status get error! \n"); goto clk_error; } /*send slave addr*/ writel(device_id<<1|I2C_READ_FLAG,i2c_master->regs+HI_I2C_TXR_OFFSET); /*send start & write*/ writel(HI_I2C_COM_START|HI_I2C_COM_WRITE,i2c_master->regs+HI_I2C_COM_OFFSET); /*check bus is or not transfer over */ if(I2C_OK!= balong_i2c_status_check(i2c_master)){ i2c_print_error( "i2c status get error! \n"); goto clk_error; } /*send read command*/ writel(HI_I2C_COM_READ,i2c_master->regs+HI_I2C_COM_OFFSET); /*check bus is or not transfer over */ if(I2C_OK!= balong_i2c_status_check(i2c_master)){ i2c_print_error( "i2c status get error! \n"); goto clk_error; } /*read the first byte data*/ value1=readl(i2c_master->regs+HI_I2C_RXR_OFFSET); /*send read command*/ writel(HI_I2C_COM_READ|HI_I2C_COM_ACK,i2c_master->regs+HI_I2C_COM_OFFSET); /*check bus is or not transfer over */ if(I2C_OK!= balong_i2c_status_check(i2c_master)){ i2c_print_error( "i2c status get error! \n"); goto clk_error; } /*read the second byte data*/ value2=readl(i2c_master->regs+HI_I2C_RXR_OFFSET); /*send the stop flag*/ writel(HI_I2C_COM_STOP,i2c_master->regs+HI_I2C_COM_OFFSET); /*check bus is or not transfer over */ if(I2C_OK!= balong_i2c_status_check(i2c_master)){ i2c_print_error( "i2c status get error! \n"); goto clk_error; } bsp_i2c_clk_disable(i2c_master); spin_unlock_irqrestore(&i2c_master->lock,flags); bsp_ipc_spin_unlock_irqrestore(IPC_SEM_I2C_SWITHC,flag); *data=(u16)((value1<<8)|value2); return I2C_OK; clk_error: bsp_i2c_clk_disable(i2c_master); irq_error: spin_unlock_irqrestore(&i2c_master->lock,flags); bsp_ipc_spin_unlock_irqrestore(IPC_SEM_I2C_SWITHC,flag); return I2C_ERROR; }
s32 bsp_i2c_word_data_send(u8 device_id,u8 addr, u16 data) { /*lint -save -e958*/ struct balong_i2c_ctrl *i2c_master; unsigned long flags = 0; unsigned long flag = 0; int ret = 0; /*lint -restore*/ /*find i2c master*/ i2c_master=find_i2c_ctrl(device_id); if(!i2c_master){ i2c_print_error("can find i2c master for device %0x\n",device_id); return I2C_ERROR; } /*lock i2c master*/ bsp_ipc_spin_lock_irqsave(IPC_SEM_I2C_SWITHC,flag); spin_lock_irqsave(&i2c_master->lock,flags); /*clock enable*/ ret = bsp_i2c_clk_enable(i2c_master); if(ret){ i2c_print_error( "i2c clk enable failed ! \n"); goto irq_error; } /*send the first message,include start command and write command */ balong_i2c_message_start(i2c_master,device_id); /*check bus is or not transfer over */ if(I2C_OK!= balong_i2c_status_check(i2c_master)){ i2c_print_error( "i2c status get error! \n"); goto clk_error; } /*set addr in TX Regitster*/ writel(addr,i2c_master->regs + HI_I2C_TXR_OFFSET); /*send write command*/ writel(HI_I2C_COM_WRITE,i2c_master->regs+HI_I2C_COM_OFFSET); /*check bus is or not transfer over */ if(I2C_OK!= balong_i2c_status_check(i2c_master)){ i2c_print_error( "i2c status get error! \n"); goto clk_error; } /*set high 8bit data in TX register*/ writel(data>>8,i2c_master->regs+HI_I2C_TXR_OFFSET); /*send write command*/ writel(HI_I2C_COM_WRITE,i2c_master->regs+HI_I2C_COM_OFFSET); /*check bus is or not transfer over */ if(I2C_OK!= balong_i2c_status_check(i2c_master)){ i2c_print_error( "i2c status get error! \n"); goto clk_error; } /*set low 8bit data in TX register*/ writel(data&(0xff),i2c_master->regs+HI_I2C_TXR_OFFSET); /*send write command*/ writel(HI_I2C_COM_WRITE,i2c_master->regs+HI_I2C_COM_OFFSET); /*check bus is or not transfer over */ if(I2C_OK!= balong_i2c_status_check(i2c_master)){ i2c_print_error( "i2c status get error! \n"); goto clk_error; } /*send the stop flag ,erase bus*/ writel(HI_I2C_COM_STOP,i2c_master->regs+HI_I2C_COM_OFFSET); /*check bus is or not transfer over */ if(I2C_OK!= balong_i2c_status_check(i2c_master)){ i2c_print_error( "i2c status get error! \n"); goto clk_error; } bsp_i2c_clk_disable(i2c_master); spin_unlock_irqrestore(&i2c_master->lock,flags); bsp_ipc_spin_unlock_irqrestore(IPC_SEM_I2C_SWITHC,flag); return I2C_OK; clk_error: bsp_i2c_clk_disable(i2c_master); irq_error: spin_unlock_irqrestore(&i2c_master->lock,flags); bsp_ipc_spin_unlock_irqrestore(IPC_SEM_I2C_SWITHC,flag); return I2C_ERROR; }
/***************************************************************************** fun_name : bsp_i2c_byte_data_receive function : i2c read a byte data para_in : device_id:device id addr :slave addr offset data :back the read data para_out : no back_val : 0:success -1:fail modify log : date : 2013-4-16 Modification : create file *****************************************************************************/ s32 bsp_i2c_byte_data_receive(u8 device_id, u8 addr, u16 *data) { struct balong_i2c_ctrl *i2c_master; /*find i2c master*/ i2c_master=find_i2c_ctrl(device_id); if(!i2c_master){ cprintf("can find i2c master for device %0x\n",device_id); return I2C_ERROR; } /*send the first message,include start command and write command */ balong_i2c_message_start(device_id,i2c_master); /*check bus is or not transfer over */ if(I2C_OK!= balong_i2c_status_check(i2c_master)){ cprintf( "i2c status get error! \n"); goto error; } /*send slave register addr into TX register*/ writel(addr,i2c_master->regs+HI_I2C_TXR_OFFSET); /*send write command*/ writel(HI_I2C_COM_WRITE,i2c_master->regs+HI_I2C_COM_OFFSET); /*check bus is or not transfer over */ if(I2C_OK!= balong_i2c_status_check(i2c_master)){ cprintf( "i2c status get error! \n"); goto error; } /*the flag has changed ,so send restart*/ writel(device_id<<1|I2C_READ_FLAG,i2c_master->regs+HI_I2C_TXR_OFFSET); /*send start & write*/ writel(HI_I2C_COM_START|HI_I2C_COM_WRITE,i2c_master->regs+HI_I2C_COM_OFFSET); /*check bus is or not transfer over */ if(I2C_OK!= balong_i2c_status_check(i2c_master)){ cprintf( "i2c status get error! \n"); goto error; } /*send read command*/ writel(HI_I2C_COM_READ|HI_I2C_COM_ACK,i2c_master->regs+HI_I2C_COM_OFFSET); /*check bus is or not transfer over */ if(I2C_OK!= balong_i2c_status_check(i2c_master)){ cprintf( "i2c status get error! \n"); goto error; } /*read the first byte data*/ *data=readl(i2c_master->regs+HI_I2C_RXR_OFFSET); /*send the stop flag*/ writel(HI_I2C_COM_STOP,i2c_master->regs+HI_I2C_COM_OFFSET); /*check bus is or not transfer over */ if(I2C_OK!= balong_i2c_status_check(i2c_master)){ cprintf( "i2c status get error! \n"); goto error; } balong_i2c_disable(i2c_master); return I2C_OK; error: return I2C_ERROR; }
/***************************************************************************** fun_name : bsp_i2c_word_data_receive function : i2c read a word data para_in : device_id:device id addr :slave addr offset data :back the read data para_out : no back_val : 0:success -1:fail modify log : date : 2013-4-16 Modification : create file *****************************************************************************/ s32 bsp_i2c_word_data_receive(u8 device_id,u8 addr, u16 *data) { u32 value1; u32 value2; struct balong_i2c_ctrl *i2c_master; /*find i2c master*/ i2c_master=find_i2c_ctrl(device_id); if(!i2c_master){ cprintf("can find i2c master for device %0x\n",device_id); return I2C_ERROR; } /*send the first message,include start command and write command */ balong_i2c_message_start(device_id,i2c_master); /*check bus is or not transfer over */ if(I2C_OK!= balong_i2c_status_check(i2c_master)){ cprintf( "i2c status get error!after_message_start \n"); goto error; } /*send slave register addr into TX register*/ writel(addr,i2c_master->regs+HI_I2C_TXR_OFFSET); /*send write command*/ writel(HI_I2C_COM_WRITE,i2c_master->regs+HI_I2C_COM_OFFSET); /*check bus is or not transfer over */ if(I2C_OK!= balong_i2c_status_check(i2c_master)){ cprintf( "i2c status get error!after send slave register addr \n"); goto error; } /*send slave addr and read commond*/ writel(device_id<<1|I2C_READ_FLAG,i2c_master->regs+HI_I2C_TXR_OFFSET); /*send start & write*/ writel(HI_I2C_COM_START|HI_I2C_COM_WRITE,i2c_master->regs+HI_I2C_COM_OFFSET); /*check bus is or not transfer over */ if(I2C_OK!= balong_i2c_status_check(i2c_master)){ cprintf( "i2c status get error!after write slave addr and write commond \n"); goto error; } /*send read command*/ writel(HI_I2C_COM_READ,i2c_master->regs+HI_I2C_COM_OFFSET); /*check bus is or not transfer over */ if(I2C_OK!= balong_i2c_status_check(i2c_master)){ cprintf( "i2c status get error!after send read commond 1 \n"); goto error; } /*read the first byte data*/ value1=readl(i2c_master->regs+HI_I2C_RXR_OFFSET); /*send read command*/ writel(HI_I2C_COM_READ|HI_I2C_COM_ACK,i2c_master->regs+HI_I2C_COM_OFFSET); /*check bus is or not transfer over */ if(I2C_OK!= balong_i2c_status_check(i2c_master)){ cprintf( "i2c status get error!after send read commond 2 \n"); goto error; } /*read the second byte data*/ value2=readl(i2c_master->regs+HI_I2C_RXR_OFFSET); /*send the stop flag*/ writel(HI_I2C_COM_STOP,i2c_master->regs+HI_I2C_COM_OFFSET); /*check bus is or not transfer over */ if(I2C_OK!= balong_i2c_status_check(i2c_master)){ cprintf( "i2c status get error!after send stop \n"); goto error; } *data=(u16)((value1<<8)|value2); balong_i2c_disable(i2c_master); return I2C_OK; error: return I2C_ERROR; }
s32 bsp_i2c_word_data_send(u8 device_id,u8 addr, u16 data) { struct balong_i2c_ctrl *i2c_master; /*find i2c master*/ i2c_master=find_i2c_ctrl(device_id); if(!i2c_master){ cprintf("can find i2c master for device %0x\n",device_id); return I2C_ERROR; } /*send the first message,include start command and write command */ balong_i2c_message_start(device_id,i2c_master); /*check bus is or not transfer over */ if(I2C_OK!= balong_i2c_status_check(i2c_master)){ cprintf( "i2c status get error! \n"); goto error; } /*set addr in TX Regitster*/ writel(addr,i2c_master->regs + HI_I2C_TXR_OFFSET); /*send write command*/ writel(HI_I2C_COM_WRITE,i2c_master->regs+HI_I2C_COM_OFFSET); /*check bus is or not transfer over */ if(I2C_OK!= balong_i2c_status_check(i2c_master)){ cprintf( "i2c status get error! \n"); goto error; } /*set high 8bit data in TX register*/ writel(data>>8,i2c_master->regs+HI_I2C_TXR_OFFSET); /*send write command*/ writel(HI_I2C_COM_WRITE,i2c_master->regs+HI_I2C_COM_OFFSET); /*check bus is or not transfer over */ if(I2C_OK!= balong_i2c_status_check(i2c_master)){ cprintf( "i2c status get error! \n"); goto error; } /*set low 8bit data in TX register*/ writel(data&(0xff),i2c_master->regs+HI_I2C_TXR_OFFSET); /*send write command*/ writel(HI_I2C_COM_WRITE,i2c_master->regs+HI_I2C_COM_OFFSET); /*check bus is or not transfer over */ if(I2C_OK!= balong_i2c_status_check(i2c_master)){ cprintf( "i2c status get error! \n"); goto error; } /*send the stop flag ,erase bus*/ writel(HI_I2C_COM_STOP,i2c_master->regs+HI_I2C_COM_OFFSET); /*check bus is or not transfer over */ if(I2C_OK!= balong_i2c_status_check(i2c_master)){ cprintf( "i2c status get error! \n"); goto error; } balong_i2c_disable(i2c_master); return I2C_OK; error: return I2C_ERROR; }