Lines Matching refs:p50

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