Lines Matching refs:chip

51 static inline int xgpio_index(struct xgpio_instance *chip, int gpio)  in xgpio_index()  argument
53 if (gpio >= chip->gpio_width[0]) in xgpio_index()
59 static inline int xgpio_regoffset(struct xgpio_instance *chip, int gpio) in xgpio_regoffset() argument
61 if (xgpio_index(chip, gpio)) in xgpio_regoffset()
67 static inline int xgpio_offset(struct xgpio_instance *chip, int gpio) in xgpio_offset() argument
69 if (xgpio_index(chip, gpio)) in xgpio_offset()
70 return gpio - chip->gpio_width[0]; in xgpio_offset()
88 struct xgpio_instance *chip = gpiochip_get_data(gc); in xgpio_get() local
91 val = xgpio_readreg(chip->regs + XGPIO_DATA_OFFSET + in xgpio_get()
92 xgpio_regoffset(chip, gpio)); in xgpio_get()
94 return !!(val & BIT(xgpio_offset(chip, gpio))); in xgpio_get()
109 struct xgpio_instance *chip = gpiochip_get_data(gc); in xgpio_set() local
110 int index = xgpio_index(chip, gpio); in xgpio_set()
111 int offset = xgpio_offset(chip, gpio); in xgpio_set()
113 spin_lock_irqsave(&chip->gpio_lock[index], flags); in xgpio_set()
117 chip->gpio_state[index] |= BIT(offset); in xgpio_set()
119 chip->gpio_state[index] &= ~BIT(offset); in xgpio_set()
121 xgpio_writereg(chip->regs + XGPIO_DATA_OFFSET + in xgpio_set()
122 xgpio_regoffset(chip, gpio), chip->gpio_state[index]); in xgpio_set()
124 spin_unlock_irqrestore(&chip->gpio_lock[index], flags); in xgpio_set()
140 struct xgpio_instance *chip = gpiochip_get_data(gc); in xgpio_set_multiple() local
141 int index = xgpio_index(chip, 0); in xgpio_set_multiple()
144 spin_lock_irqsave(&chip->gpio_lock[index], flags); in xgpio_set_multiple()
150 if (index != xgpio_index(chip, i)) { in xgpio_set_multiple()
151 xgpio_writereg(chip->regs + XGPIO_DATA_OFFSET + in xgpio_set_multiple()
152 xgpio_regoffset(chip, i), in xgpio_set_multiple()
153 chip->gpio_state[index]); in xgpio_set_multiple()
154 spin_unlock_irqrestore(&chip->gpio_lock[index], flags); in xgpio_set_multiple()
155 index = xgpio_index(chip, i); in xgpio_set_multiple()
156 spin_lock_irqsave(&chip->gpio_lock[index], flags); in xgpio_set_multiple()
159 offset = xgpio_offset(chip, i); in xgpio_set_multiple()
161 chip->gpio_state[index] |= BIT(offset); in xgpio_set_multiple()
163 chip->gpio_state[index] &= ~BIT(offset); in xgpio_set_multiple()
167 xgpio_writereg(chip->regs + XGPIO_DATA_OFFSET + in xgpio_set_multiple()
168 xgpio_regoffset(chip, i), chip->gpio_state[index]); in xgpio_set_multiple()
170 spin_unlock_irqrestore(&chip->gpio_lock[index], flags); in xgpio_set_multiple()
185 struct xgpio_instance *chip = gpiochip_get_data(gc); in xgpio_dir_in() local
186 int index = xgpio_index(chip, gpio); in xgpio_dir_in()
187 int offset = xgpio_offset(chip, gpio); in xgpio_dir_in()
189 spin_lock_irqsave(&chip->gpio_lock[index], flags); in xgpio_dir_in()
192 chip->gpio_dir[index] |= BIT(offset); in xgpio_dir_in()
193 xgpio_writereg(chip->regs + XGPIO_TRI_OFFSET + in xgpio_dir_in()
194 xgpio_regoffset(chip, gpio), chip->gpio_dir[index]); in xgpio_dir_in()
196 spin_unlock_irqrestore(&chip->gpio_lock[index], flags); in xgpio_dir_in()
216 struct xgpio_instance *chip = gpiochip_get_data(gc); in xgpio_dir_out() local
217 int index = xgpio_index(chip, gpio); in xgpio_dir_out()
218 int offset = xgpio_offset(chip, gpio); in xgpio_dir_out()
220 spin_lock_irqsave(&chip->gpio_lock[index], flags); in xgpio_dir_out()
224 chip->gpio_state[index] |= BIT(offset); in xgpio_dir_out()
226 chip->gpio_state[index] &= ~BIT(offset); in xgpio_dir_out()
227 xgpio_writereg(chip->regs + XGPIO_DATA_OFFSET + in xgpio_dir_out()
228 xgpio_regoffset(chip, gpio), chip->gpio_state[index]); in xgpio_dir_out()
231 chip->gpio_dir[index] &= ~BIT(offset); in xgpio_dir_out()
232 xgpio_writereg(chip->regs + XGPIO_TRI_OFFSET + in xgpio_dir_out()
233 xgpio_regoffset(chip, gpio), chip->gpio_dir[index]); in xgpio_dir_out()
235 spin_unlock_irqrestore(&chip->gpio_lock[index], flags); in xgpio_dir_out()
244 static void xgpio_save_regs(struct xgpio_instance *chip) in xgpio_save_regs() argument
246 xgpio_writereg(chip->regs + XGPIO_DATA_OFFSET, chip->gpio_state[0]); in xgpio_save_regs()
247 xgpio_writereg(chip->regs + XGPIO_TRI_OFFSET, chip->gpio_dir[0]); in xgpio_save_regs()
249 if (!chip->gpio_width[1]) in xgpio_save_regs()
252 xgpio_writereg(chip->regs + XGPIO_DATA_OFFSET + XGPIO_CHANNEL_OFFSET, in xgpio_save_regs()
253 chip->gpio_state[1]); in xgpio_save_regs()
254 xgpio_writereg(chip->regs + XGPIO_TRI_OFFSET + XGPIO_CHANNEL_OFFSET, in xgpio_save_regs()
255 chip->gpio_dir[1]); in xgpio_save_regs()
268 struct xgpio_instance *chip; in xgpio_probe() local
273 chip = devm_kzalloc(&pdev->dev, sizeof(*chip), GFP_KERNEL); in xgpio_probe()
274 if (!chip) in xgpio_probe()
277 platform_set_drvdata(pdev, chip); in xgpio_probe()
280 of_property_read_u32(np, "xlnx,dout-default", &chip->gpio_state[0]); in xgpio_probe()
283 if (of_property_read_u32(np, "xlnx,tri-default", &chip->gpio_dir[0])) in xgpio_probe()
284 chip->gpio_dir[0] = 0xFFFFFFFF; in xgpio_probe()
290 if (of_property_read_u32(np, "xlnx,gpio-width", &chip->gpio_width[0])) in xgpio_probe()
291 chip->gpio_width[0] = 32; in xgpio_probe()
293 spin_lock_init(&chip->gpio_lock[0]); in xgpio_probe()
301 &chip->gpio_state[1]); in xgpio_probe()
305 &chip->gpio_dir[1])) in xgpio_probe()
306 chip->gpio_dir[1] = 0xFFFFFFFF; in xgpio_probe()
313 &chip->gpio_width[1])) in xgpio_probe()
314 chip->gpio_width[1] = 32; in xgpio_probe()
316 spin_lock_init(&chip->gpio_lock[1]); in xgpio_probe()
319 chip->gc.base = -1; in xgpio_probe()
320 chip->gc.ngpio = chip->gpio_width[0] + chip->gpio_width[1]; in xgpio_probe()
321 chip->gc.parent = &pdev->dev; in xgpio_probe()
322 chip->gc.direction_input = xgpio_dir_in; in xgpio_probe()
323 chip->gc.direction_output = xgpio_dir_out; in xgpio_probe()
324 chip->gc.get = xgpio_get; in xgpio_probe()
325 chip->gc.set = xgpio_set; in xgpio_probe()
326 chip->gc.set_multiple = xgpio_set_multiple; in xgpio_probe()
328 chip->gc.label = dev_name(&pdev->dev); in xgpio_probe()
330 chip->regs = devm_platform_ioremap_resource(pdev, 0); in xgpio_probe()
331 if (IS_ERR(chip->regs)) { in xgpio_probe()
333 return PTR_ERR(chip->regs); in xgpio_probe()
336 xgpio_save_regs(chip); in xgpio_probe()
338 status = devm_gpiochip_add_data(&pdev->dev, &chip->gc, chip); in xgpio_probe()