| /* Copyright (c) 2012, The Linux Foundation. All rights reserved. |
| * |
| * This program is free software; you can redistribute it and/or modify |
| * it under the terms of the GNU General Public License version 2 and |
| * only version 2 as published by the Free Software Foundation. |
| * |
| * This program is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| * GNU General Public License for more details. |
| */ |
| |
| #include "smd_private.h" |
| |
| void set_state(volatile void __iomem *half_channel, unsigned data) |
| { |
| ((struct smd_half_channel __force *)(half_channel))->state = data; |
| } |
| |
| unsigned get_state(volatile void __iomem *half_channel) |
| { |
| return ((struct smd_half_channel __force *)(half_channel))->state; |
| } |
| |
| void set_fDSR(volatile void __iomem *half_channel, unsigned char data) |
| { |
| ((struct smd_half_channel __force *)(half_channel))->fDSR = data; |
| } |
| |
| unsigned get_fDSR(volatile void __iomem *half_channel) |
| { |
| return ((struct smd_half_channel __force *)(half_channel))->fDSR; |
| } |
| |
| void set_fCTS(volatile void __iomem *half_channel, unsigned char data) |
| { |
| ((struct smd_half_channel __force *)(half_channel))->fCTS = data; |
| } |
| |
| unsigned get_fCTS(volatile void __iomem *half_channel) |
| { |
| return ((struct smd_half_channel __force *)(half_channel))->fCTS; |
| } |
| |
| void set_fCD(volatile void __iomem *half_channel, unsigned char data) |
| { |
| ((struct smd_half_channel __force *)(half_channel))->fCD = data; |
| } |
| |
| unsigned get_fCD(volatile void __iomem *half_channel) |
| { |
| return ((struct smd_half_channel __force *)(half_channel))->fCD; |
| } |
| |
| void set_fRI(volatile void __iomem *half_channel, unsigned char data) |
| { |
| ((struct smd_half_channel __force *)(half_channel))->fRI = data; |
| } |
| |
| unsigned get_fRI(volatile void __iomem *half_channel) |
| { |
| return ((struct smd_half_channel __force *)(half_channel))->fRI; |
| } |
| |
| void set_fHEAD(volatile void __iomem *half_channel, unsigned char data) |
| { |
| ((struct smd_half_channel __force *)(half_channel))->fHEAD = data; |
| } |
| |
| unsigned get_fHEAD(volatile void __iomem *half_channel) |
| { |
| return ((struct smd_half_channel __force *)(half_channel))->fHEAD; |
| } |
| |
| void set_fTAIL(volatile void __iomem *half_channel, unsigned char data) |
| { |
| ((struct smd_half_channel __force *)(half_channel))->fTAIL = data; |
| } |
| |
| unsigned get_fTAIL(volatile void __iomem *half_channel) |
| { |
| return ((struct smd_half_channel __force *)(half_channel))->fTAIL; |
| } |
| |
| void set_fSTATE(volatile void __iomem *half_channel, unsigned char data) |
| { |
| ((struct smd_half_channel __force *)(half_channel))->fSTATE = data; |
| } |
| |
| unsigned get_fSTATE(volatile void __iomem *half_channel) |
| { |
| return ((struct smd_half_channel __force *)(half_channel))->fSTATE; |
| } |
| |
| void set_fBLOCKREADINTR(volatile void __iomem *half_channel, unsigned char data) |
| { |
| ((struct smd_half_channel __force *) |
| (half_channel))->fBLOCKREADINTR = data; |
| } |
| |
| unsigned get_fBLOCKREADINTR(volatile void __iomem *half_channel) |
| { |
| return ((struct smd_half_channel __force *) |
| (half_channel))->fBLOCKREADINTR; |
| } |
| |
| void set_tail(volatile void __iomem *half_channel, unsigned data) |
| { |
| ((struct smd_half_channel __force *)(half_channel))->tail = data; |
| } |
| |
| unsigned get_tail(volatile void __iomem *half_channel) |
| { |
| return ((struct smd_half_channel __force *)(half_channel))->tail; |
| } |
| |
| void set_head(volatile void __iomem *half_channel, unsigned data) |
| { |
| ((struct smd_half_channel __force *)(half_channel))->head = data; |
| } |
| |
| unsigned get_head(volatile void __iomem *half_channel) |
| { |
| return ((struct smd_half_channel __force *)(half_channel))->head; |
| } |
| |
| void set_state_word_access(volatile void __iomem *half_channel, unsigned data) |
| { |
| ((struct smd_half_channel_word_access __force *) |
| (half_channel))->state = data; |
| } |
| |
| unsigned get_state_word_access(volatile void __iomem *half_channel) |
| { |
| return ((struct smd_half_channel_word_access __force *) |
| (half_channel))->state; |
| } |
| |
| void set_fDSR_word_access(volatile void __iomem *half_channel, |
| unsigned char data) |
| { |
| ((struct smd_half_channel_word_access __force *) |
| (half_channel))->fDSR = data; |
| } |
| |
| unsigned get_fDSR_word_access(volatile void __iomem *half_channel) |
| { |
| return ((struct smd_half_channel_word_access __force *) |
| (half_channel))->fDSR; |
| } |
| |
| void set_fCTS_word_access(volatile void __iomem *half_channel, |
| unsigned char data) |
| { |
| ((struct smd_half_channel_word_access __force *) |
| (half_channel))->fCTS = data; |
| } |
| |
| unsigned get_fCTS_word_access(volatile void __iomem *half_channel) |
| { |
| return ((struct smd_half_channel_word_access __force *) |
| (half_channel))->fCTS; |
| } |
| |
| void set_fCD_word_access(volatile void __iomem *half_channel, |
| unsigned char data) |
| { |
| ((struct smd_half_channel_word_access __force *) |
| (half_channel))->fCD = data; |
| } |
| |
| unsigned get_fCD_word_access(volatile void __iomem *half_channel) |
| { |
| return ((struct smd_half_channel_word_access __force *) |
| (half_channel))->fCD; |
| } |
| |
| void set_fRI_word_access(volatile void __iomem *half_channel, |
| unsigned char data) |
| { |
| ((struct smd_half_channel_word_access __force *) |
| (half_channel))->fRI = data; |
| } |
| |
| unsigned get_fRI_word_access(volatile void __iomem *half_channel) |
| { |
| return ((struct smd_half_channel_word_access __force *) |
| (half_channel))->fRI; |
| } |
| |
| void set_fHEAD_word_access(volatile void __iomem *half_channel, |
| unsigned char data) |
| { |
| ((struct smd_half_channel_word_access __force *) |
| (half_channel))->fHEAD = data; |
| } |
| |
| unsigned get_fHEAD_word_access(volatile void __iomem *half_channel) |
| { |
| return ((struct smd_half_channel_word_access __force *) |
| (half_channel))->fHEAD; |
| } |
| |
| void set_fTAIL_word_access(volatile void __iomem *half_channel, |
| unsigned char data) |
| { |
| ((struct smd_half_channel_word_access __force *) |
| (half_channel))->fTAIL = data; |
| } |
| |
| unsigned get_fTAIL_word_access(volatile void __iomem *half_channel) |
| { |
| return ((struct smd_half_channel_word_access __force *) |
| (half_channel))->fTAIL; |
| } |
| |
| void set_fSTATE_word_access(volatile void __iomem *half_channel, |
| unsigned char data) |
| { |
| ((struct smd_half_channel_word_access __force *) |
| (half_channel))->fSTATE = data; |
| } |
| |
| unsigned get_fSTATE_word_access(volatile void __iomem *half_channel) |
| { |
| return ((struct smd_half_channel_word_access __force *) |
| (half_channel))->fSTATE; |
| } |
| |
| void set_fBLOCKREADINTR_word_access(volatile void __iomem *half_channel, |
| unsigned char data) |
| { |
| ((struct smd_half_channel_word_access __force *) |
| (half_channel))->fBLOCKREADINTR = data; |
| } |
| |
| unsigned get_fBLOCKREADINTR_word_access(volatile void __iomem *half_channel) |
| { |
| return ((struct smd_half_channel_word_access __force *) |
| (half_channel))->fBLOCKREADINTR; |
| } |
| |
| void set_tail_word_access(volatile void __iomem *half_channel, unsigned data) |
| { |
| ((struct smd_half_channel_word_access __force *) |
| (half_channel))->tail = data; |
| } |
| |
| unsigned get_tail_word_access(volatile void __iomem *half_channel) |
| { |
| return ((struct smd_half_channel_word_access __force *) |
| (half_channel))->tail; |
| } |
| |
| void set_head_word_access(volatile void __iomem *half_channel, unsigned data) |
| { |
| ((struct smd_half_channel_word_access __force *) |
| (half_channel))->head = data; |
| } |
| |
| unsigned get_head_word_access(volatile void __iomem *half_channel) |
| { |
| return ((struct smd_half_channel_word_access __force *) |
| (half_channel))->head; |
| } |
| |
| int is_word_access_ch(unsigned ch_type) |
| { |
| if (ch_type == SMD_APPS_RPM || ch_type == SMD_MODEM_RPM || |
| ch_type == SMD_QDSP_RPM || ch_type == SMD_WCNSS_RPM || |
| ch_type == SMD_TZ_RPM) |
| return 1; |
| else |
| return 0; |
| } |
| |
| struct smd_half_channel_access *get_half_ch_funcs(unsigned ch_type) |
| { |
| static struct smd_half_channel_access byte_access = { |
| .set_state = set_state, |
| .get_state = get_state, |
| .set_fDSR = set_fDSR, |
| .get_fDSR = get_fDSR, |
| .set_fCTS = set_fCTS, |
| .get_fCTS = get_fCTS, |
| .set_fCD = set_fCD, |
| .get_fCD = get_fCD, |
| .set_fRI = set_fRI, |
| .get_fRI = get_fRI, |
| .set_fHEAD = set_fHEAD, |
| .get_fHEAD = get_fHEAD, |
| .set_fTAIL = set_fTAIL, |
| .get_fTAIL = get_fTAIL, |
| .set_fSTATE = set_fSTATE, |
| .get_fSTATE = get_fSTATE, |
| .set_fBLOCKREADINTR = set_fBLOCKREADINTR, |
| .get_fBLOCKREADINTR = get_fBLOCKREADINTR, |
| .set_tail = set_tail, |
| .get_tail = get_tail, |
| .set_head = set_head, |
| .get_head = get_head, |
| }; |
| static struct smd_half_channel_access word_access = { |
| .set_state = set_state_word_access, |
| .get_state = get_state_word_access, |
| .set_fDSR = set_fDSR_word_access, |
| .get_fDSR = get_fDSR_word_access, |
| .set_fCTS = set_fCTS_word_access, |
| .get_fCTS = get_fCTS_word_access, |
| .set_fCD = set_fCD_word_access, |
| .get_fCD = get_fCD_word_access, |
| .set_fRI = set_fRI_word_access, |
| .get_fRI = get_fRI_word_access, |
| .set_fHEAD = set_fHEAD_word_access, |
| .get_fHEAD = get_fHEAD_word_access, |
| .set_fTAIL = set_fTAIL_word_access, |
| .get_fTAIL = get_fTAIL_word_access, |
| .set_fSTATE = set_fSTATE_word_access, |
| .get_fSTATE = get_fSTATE_word_access, |
| .set_fBLOCKREADINTR = set_fBLOCKREADINTR_word_access, |
| .get_fBLOCKREADINTR = get_fBLOCKREADINTR_word_access, |
| .set_tail = set_tail_word_access, |
| .get_tail = get_tail_word_access, |
| .set_head = set_head_word_access, |
| .get_head = get_head_word_access, |
| }; |
| |
| if (is_word_access_ch(ch_type)) |
| return &word_access; |
| else |
| return &byte_access; |
| } |
| |