tree: git://linuxtv.org/media_tree.git devel-3.17-rc6
head: 49310ed0ab8da344dece4a543bfcdd14490ccfa0
commit: a84fcdaa905862b09482544d190c94a8436e4334 [489/499] [media] rc:
Introduce hix5hd2 IR transmitter driver
reproduce:
# apt-get install sparse
git checkout a84fcdaa905862b09482544d190c94a8436e4334
make ARCH=x86_64 allmodconfig
make C=1 CF=-D__CHECK_ENDIAN__
sparse warnings: (new ones prefixed by >>)
>> drivers/media/rc/ir-hix5hd2.c:99:41: sparse: incorrect type in argument 2
>> (different address spaces)
drivers/media/rc/ir-hix5hd2.c:99:41: expected void volatile [noderef]
<asn:2>*addr
drivers/media/rc/ir-hix5hd2.c:99:41: got void *
>> drivers/media/rc/ir-hix5hd2.c:100:16: sparse: incorrect type in argument 1
>> (different address spaces)
drivers/media/rc/ir-hix5hd2.c:100:16: expected void const volatile
[noderef] <asn:2>*addr
drivers/media/rc/ir-hix5hd2.c:100:16: got void *
>> drivers/media/rc/ir-hix5hd2.c:117:40: sparse: incorrect type in argument 2
>> (different address spaces)
drivers/media/rc/ir-hix5hd2.c:117:40: expected void volatile [noderef]
<asn:2>*addr
drivers/media/rc/ir-hix5hd2.c:117:40: got void *
>> drivers/media/rc/ir-hix5hd2.c:119:41: sparse: incorrect type in argument 2
>> (different address spaces)
drivers/media/rc/ir-hix5hd2.c:119:41: expected void volatile [noderef]
<asn:2>*addr
drivers/media/rc/ir-hix5hd2.c:119:41: got void *
>> drivers/media/rc/ir-hix5hd2.c:121:41: sparse: incorrect type in argument 2
>> (different address spaces)
drivers/media/rc/ir-hix5hd2.c:121:41: expected void volatile [noderef]
<asn:2>*addr
drivers/media/rc/ir-hix5hd2.c:121:41: got void *
>> drivers/media/rc/ir-hix5hd2.c:147:18: sparse: incorrect type in argument 1
>> (different address spaces)
drivers/media/rc/ir-hix5hd2.c:147:18: expected void const volatile
[noderef] <asn:2>*addr
drivers/media/rc/ir-hix5hd2.c:147:18: got void *
>> drivers/media/rc/ir-hix5hd2.c:155:28: sparse: incorrect type in argument 1
>> (different address spaces)
drivers/media/rc/ir-hix5hd2.c:155:28: expected void const volatile
[noderef] <asn:2>*addr
drivers/media/rc/ir-hix5hd2.c:155:28: got void *
>> drivers/media/rc/ir-hix5hd2.c:157:25: sparse: incorrect type in argument 1
>> (different address spaces)
drivers/media/rc/ir-hix5hd2.c:157:25: expected void const volatile
[noderef] <asn:2>*addr
drivers/media/rc/ir-hix5hd2.c:157:25: got void *
>> drivers/media/rc/ir-hix5hd2.c:159:61: sparse: incorrect type in argument 2
>> (different address spaces)
drivers/media/rc/ir-hix5hd2.c:159:61: expected void volatile [noderef]
<asn:2>*addr
drivers/media/rc/ir-hix5hd2.c:159:61: got void *
>> drivers/media/rc/ir-hix5hd2.c:167:28: sparse: incorrect type in argument 1
>> (different address spaces)
drivers/media/rc/ir-hix5hd2.c:167:28: expected void const volatile
[noderef] <asn:2>*addr
drivers/media/rc/ir-hix5hd2.c:167:28: got void *
>> drivers/media/rc/ir-hix5hd2.c:169:36: sparse: incorrect type in argument 1
>> (different address spaces)
drivers/media/rc/ir-hix5hd2.c:169:36: expected void const volatile
[noderef] <asn:2>*addr
drivers/media/rc/ir-hix5hd2.c:169:36: got void *
>> drivers/media/rc/ir-hix5hd2.c:188:64: sparse: incorrect type in argument 2
>> (different address spaces)
drivers/media/rc/ir-hix5hd2.c:188:64: expected void volatile [noderef]
<asn:2>*addr
drivers/media/rc/ir-hix5hd2.c:188:64: got void *
>> drivers/media/rc/ir-hix5hd2.c:190:68: sparse: incorrect type in argument 2
>> (different address spaces)
drivers/media/rc/ir-hix5hd2.c:190:68: expected void volatile [noderef]
<asn:2>*addr
drivers/media/rc/ir-hix5hd2.c:190:68: got void *
>> drivers/media/rc/ir-hix5hd2.c:220:20: sparse: incorrect type in assignment
>> (different address spaces)
drivers/media/rc/ir-hix5hd2.c:220:20: expected void *base
drivers/media/rc/ir-hix5hd2.c:220:20: got void [noderef] <asn:2>*
>> drivers/media/rc/ir-hix5hd2.c:315:41: sparse: incorrect type in argument 2
>> (different address spaces)
drivers/media/rc/ir-hix5hd2.c:315:41: expected void volatile [noderef]
<asn:2>*addr
drivers/media/rc/ir-hix5hd2.c:315:41: got void *
>> drivers/media/rc/ir-hix5hd2.c:316:41: sparse: incorrect type in argument 2
>> (different address spaces)
drivers/media/rc/ir-hix5hd2.c:316:41: expected void volatile [noderef]
<asn:2>*addr
drivers/media/rc/ir-hix5hd2.c:316:41: got void *
>> drivers/media/rc/ir-hix5hd2.c:317:41: sparse: incorrect type in argument 2
>> (different address spaces)
drivers/media/rc/ir-hix5hd2.c:317:41: expected void volatile [noderef]
<asn:2>*addr
drivers/media/rc/ir-hix5hd2.c:317:41: got void *
>> drivers/media/rc/ir-hix5hd2.c:318:41: sparse: incorrect type in argument 2
>> (different address spaces)
drivers/media/rc/ir-hix5hd2.c:318:41: expected void volatile [noderef]
<asn:2>*addr
drivers/media/rc/ir-hix5hd2.c:318:41: got void *
vim +99 drivers/media/rc/ir-hix5hd2.c
93
94 static int hix5hd2_ir_config(struct hix5hd2_ir_priv *priv)
95 {
96 int timeout = 10000;
97 u32 val, rate;
98
99 writel_relaxed(0x01, priv->base + IR_ENABLE);
100 while (readl_relaxed(priv->base + IR_BUSY)) {
101 if (timeout--) {
102 udelay(1);
103 } else {
104 dev_err(priv->dev, "IR_BUSY timeout\n");
105 return -ETIMEDOUT;
106 }
107 }
108
109 /* Now only support raw mode, with symbol start from low to
high */
110 rate = DIV_ROUND_CLOSEST(priv->rate, 1000000);
111 val = IR_CFG_SYMBOL_MAXWIDTH & IR_CFG_WIDTH_MASK <<
IR_CFG_WIDTH_SHIFT;
112 val |= IR_CFG_SYMBOL_FMT & IR_CFG_FORMAT_MASK <<
IR_CFG_FORMAT_SHIFT;
113 val |= (IR_CFG_INT_THRESHOLD - 1) & IR_CFG_INT_LEVEL_MASK
114 << IR_CFG_INT_LEVEL_SHIFT;
115 val |= IR_CFG_MODE_RAW;
116 val |= (rate - 1) & IR_CFG_FREQ_MASK << IR_CFG_FREQ_SHIFT;
117 writel_relaxed(val, priv->base + IR_CONFIG);
118
119 writel_relaxed(0x00, priv->base + IR_INTM);
120 /* write arbitrary value to start */
121 writel_relaxed(0x01, priv->base + IR_START);
122 return 0;
123 }
124
125 static int hix5hd2_ir_open(struct rc_dev *rdev)
126 {
127 struct hix5hd2_ir_priv *priv = rdev->priv;
128
129 hix5hd2_ir_enable(priv, true);
130 return hix5hd2_ir_config(priv);
131 }
132
133 static void hix5hd2_ir_close(struct rc_dev *rdev)
134 {
135 struct hix5hd2_ir_priv *priv = rdev->priv;
136
137 hix5hd2_ir_enable(priv, false);
138 }
139
140 static irqreturn_t hix5hd2_ir_rx_interrupt(int irq, void *data)
141 {
142 u32 symb_num, symb_val, symb_time;
143 u32 data_l, data_h;
144 u32 irq_sr, i;
145 struct hix5hd2_ir_priv *priv = data;
146
147 irq_sr = readl_relaxed(priv->base + IR_INTS);
148 if (irq_sr & INTMS_OVERFLOW) {
149 /*
150 * we must read IR_DATAL first, then we can clean up
151 * IR_INTS availably since logic would not clear
152 * fifo when overflow, drv do the job
153 */
154 ir_raw_event_reset(priv->rdev);
155 symb_num = readl_relaxed(priv->base + IR_DATAH);
156 for (i = 0; i < symb_num; i++)
157 readl_relaxed(priv->base + IR_DATAL);
158
159 writel_relaxed(INT_CLR_OVERFLOW, priv->base + IR_INTC);
160 dev_info(priv->dev, "overflow, level=%d\n",
161 IR_CFG_INT_THRESHOLD);
162 }
163
164 if ((irq_sr & INTMS_SYMBRCV) || (irq_sr & INTMS_TIMEOUT)) {
165 DEFINE_IR_RAW_EVENT(ev);
166
167 symb_num = readl_relaxed(priv->base + IR_DATAH);
168 for (i = 0; i < symb_num; i++) {
169 symb_val = readl_relaxed(priv->base + IR_DATAL);
170 data_l = ((symb_val & 0xffff) * 10);
171 data_h = ((symb_val >> 16) & 0xffff) * 10;
172 symb_time = (data_l + data_h) / 10;
173
174 ev.duration = US_TO_NS(data_l);
175 ev.pulse = true;
176 ir_raw_event_store(priv->rdev, &ev);
177
178 if (symb_time < IR_CFG_SYMBOL_MAXWIDTH) {
179 ev.duration = US_TO_NS(data_h);
180 ev.pulse = false;
181 ir_raw_event_store(priv->rdev, &ev);
182 } else {
183 ir_raw_event_set_idle(priv->rdev, true);
184 }
185 }
186
187 if (irq_sr & INTMS_SYMBRCV)
188 writel_relaxed(INT_CLR_RCV, priv->base +
IR_INTC);
189 if (irq_sr & INTMS_TIMEOUT)
190 writel_relaxed(INT_CLR_TIMEOUT, priv->base +
IR_INTC);
191 }
192
193 /* Empty software fifo */
194 ir_raw_event_handle(priv->rdev);
195 return IRQ_HANDLED;
196 }
197
198 static int hix5hd2_ir_probe(struct platform_device *pdev)
199 {
200 struct rc_dev *rdev;
201 struct device *dev = &pdev->dev;
202 struct resource *res;
203 struct hix5hd2_ir_priv *priv;
204 struct device_node *node = pdev->dev.of_node;
205 const char *map_name;
206 int ret;
207
208 priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
209 if (!priv)
210 return -ENOMEM;
211
212 priv->regmap = syscon_regmap_lookup_by_phandle(node,
213
"hisilicon,power-syscon");
214 if (IS_ERR(priv->regmap)) {
215 dev_err(dev, "no power-reg\n");
216 return -EINVAL;
217 }
218
219 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
220 priv->base = devm_ioremap_resource(dev, res);
221 if (IS_ERR(priv->base))
222 return PTR_ERR(priv->base);
223
---
0-DAY kernel build testing backend Open Source Technology Center
http://lists.01.org/mailman/listinfo/kbuild Intel Corporation
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html