Lines Matching defs:p50

27 #define DRIVER_NAME		"barco-p50-gpio"
122 static int p50_wait_ec(struct p50_gpio *p50, int mask, int expected)
127 val = inb(p50->base + P50_PORT_CMD) & mask;
133 dev_err(p50->gc.parent, "Timed out waiting for EC (0x%x)\n", val);
138 static int p50_read_mbox_reg(struct p50_gpio *p50, int reg)
142 ret = p50_wait_ec(p50, P50_STATUS_IBF, 0);
147 inb(p50->base + P50_PORT_DATA);
150 outb(P50_CMD_READ | reg, p50->base + P50_PORT_CMD);
152 ret = p50_wait_ec(p50, P50_STATUS_OBF, P50_STATUS_OBF);
156 return inb(p50->base + P50_PORT_DATA);
159 static int p50_write_mbox_reg(struct p50_gpio *p50, int reg, int val)
163 ret = p50_wait_ec(p50, P50_STATUS_IBF, 0);
168 outb(P50_CMD_WRITE | reg, p50->base + P50_PORT_CMD);
170 ret = p50_wait_ec(p50, P50_STATUS_IBF, 0);
175 outb(val, p50->base + P50_PORT_DATA);
183 static int p50_wait_mbox_idle(struct p50_gpio *p50)
188 val = p50_read_mbox_reg(p50, P50_MBOX_REG_CMD);
196 dev_err(p50->gc.parent, "Timed out waiting for EC mbox idle (CMD: 0x%x)\n", val);
201 static int p50_send_mbox_cmd(struct p50_gpio *p50, int cmd, int param, int data)
205 ret = p50_wait_mbox_idle(p50);
209 ret = p50_write_mbox_reg(p50, P50_MBOX_REG_DATA, data);
213 ret = p50_write_mbox_reg(p50, P50_MBOX_REG_PARAM, param);
217 ret = p50_write_mbox_reg(p50, P50_MBOX_REG_CMD, cmd);
221 ret = p50_wait_mbox_idle(p50);
225 ret = p50_read_mbox_reg(p50, P50_MBOX_REG_STATUS);
232 dev_err(p50->gc.parent, "Mbox command failed (CMD=0x%x STAT=0x%x PARAM=0x%x DATA=0x%x)\n",
257 struct p50_gpio *p50 = gpiochip_get_data(gc);
260 mutex_lock(&p50->lock);
262 ret = p50_send_mbox_cmd(p50, P50_MBOX_CMD_READ_GPIO, gpio_params[offset], 0);
264 ret = p50_read_mbox_reg(p50, P50_MBOX_REG_DATA);
266 mutex_unlock(&p50->lock);
273 struct p50_gpio *p50 = gpiochip_get_data(gc);
275 mutex_lock(&p50->lock);
277 p50_send_mbox_cmd(p50, P50_MBOX_CMD_WRITE_GPIO, gpio_params[offset], value);
279 mutex_unlock(&p50->lock);
284 struct p50_gpio *p50;
299 p50 = devm_kzalloc(&pdev->dev, sizeof(*p50), GFP_KERNEL);
300 if (!p50)
303 platform_set_drvdata(pdev, p50);
304 mutex_init(&p50->lock);
305 p50->base = res->start;
306 p50->gc.owner = THIS_MODULE;
307 p50->gc.parent = &pdev->dev;
308 p50->gc.label = dev_name(&pdev->dev);
309 p50->gc.ngpio = ARRAY_SIZE(gpio_names);
310 p50->gc.names = gpio_names;
311 p50->gc.can_sleep = true;
312 p50->gc.base = -1;
313 p50->gc.get_direction = p50_gpio_get_direction;
314 p50->gc.get = p50_gpio_get;
315 p50->gc.set = p50_gpio_set;
319 ret = p50_wait_mbox_idle(p50);
323 ret = p50_write_mbox_reg(p50, P50_MBOX_REG_CMD, P50_MBOX_CMD_CLEAR);
327 ret = p50_wait_mbox_idle(p50);
332 ret = devm_gpiochip_add_data(&pdev->dev, &p50->gc, p50);
340 p50->leds_pdev = platform_device_register_data(&pdev->dev,
343 if (IS_ERR(p50->leds_pdev)) {
344 ret = PTR_ERR(p50->leds_pdev);
350 buttons[0].gpio += p50->gc.base;
352 p50->keys_pdev =
357 if (IS_ERR(p50->keys_pdev)) {
358 ret = PTR_ERR(p50->keys_pdev);
366 platform_device_unregister(p50->leds_pdev);
375 struct p50_gpio *p50 = platform_get_drvdata(pdev);
377 platform_device_unregister(p50->keys_pdev);
378 platform_device_unregister(p50->leds_pdev);