• Home
  • Raw
  • Download

Lines Matching +full:data +full:- +full:addr

2  *   Copyright (C) 2010-2012 Hans de Goede <hdegoede@redhat.com>           *
17 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
33 #include "sch56xx-common.h"
42 #define SIO_UNLOCK_KEY 0x55 /* Key to enable Super-I/O */
43 #define SIO_LOCK_KEY 0xAA /* Key to disable Super-I/O */
66 u16 addr; member
89 return -EBUSY; in superio_enter()
109 static int sch56xx_send_cmd(u16 addr, u8 cmd, u16 reg, u8 v) in sch56xx_send_cmd() argument
116 * responds within 15-32 reads, so we first busy poll, and if in sch56xx_send_cmd()
123 /* (Optional) Write-Clear the EC to Host Mailbox Register */ in sch56xx_send_cmd()
124 val = inb(addr + 1); in sch56xx_send_cmd()
125 outb(val, addr + 1); in sch56xx_send_cmd()
128 outb(0x00, addr + 2); in sch56xx_send_cmd()
129 outb(0x80, addr + 3); in sch56xx_send_cmd()
132 outb(cmd, addr + 4); /* VREG Access Type read:0x02 write:0x03 */ in sch56xx_send_cmd()
133 outb(0x01, addr + 5); /* # of Entries: 1 Byte (8-bit) */ in sch56xx_send_cmd()
134 outb(0x04, addr + 2); /* Mailbox AP to first data entry loc. */ in sch56xx_send_cmd()
138 outb(v, addr + 4); in sch56xx_send_cmd()
141 outb(reg & 0xff, addr + 6); in sch56xx_send_cmd()
142 outb(reg >> 8, addr + 7); in sch56xx_send_cmd()
145 outb(0x01, addr); /* Write 01h to the Host-to-EC register */ in sch56xx_send_cmd()
152 val = inb(addr + 8); in sch56xx_send_cmd()
155 outb(val, addr + 8); in sch56xx_send_cmd()
163 return -EIO; in sch56xx_send_cmd()
171 /* Read EC-to-Host Register */ in sch56xx_send_cmd()
172 val = inb(addr + 1); in sch56xx_send_cmd()
184 return -EIO; in sch56xx_send_cmd()
191 * outb(0x00, addr + 2); in sch56xx_send_cmd()
192 * outb(0x80, addr + 3); in sch56xx_send_cmd()
199 return inb(addr + 4); in sch56xx_send_cmd()
204 int sch56xx_read_virtual_reg(u16 addr, u16 reg) in sch56xx_read_virtual_reg() argument
206 return sch56xx_send_cmd(addr, SCH56XX_CMD_READ, reg, 0); in sch56xx_read_virtual_reg()
210 int sch56xx_write_virtual_reg(u16 addr, u16 reg, u8 val) in sch56xx_write_virtual_reg() argument
212 return sch56xx_send_cmd(addr, SCH56XX_CMD_WRITE, reg, val); in sch56xx_write_virtual_reg()
216 int sch56xx_read_virtual_reg16(u16 addr, u16 reg) in sch56xx_read_virtual_reg16() argument
221 lsb = sch56xx_read_virtual_reg(addr, reg); in sch56xx_read_virtual_reg16()
225 msb = sch56xx_read_virtual_reg(addr, reg + 1); in sch56xx_read_virtual_reg16()
233 int sch56xx_read_virtual_reg12(u16 addr, u16 msb_reg, u16 lsn_reg, in sch56xx_read_virtual_reg12() argument
239 msb = sch56xx_read_virtual_reg(addr, msb_reg); in sch56xx_read_virtual_reg12()
243 lsn = sch56xx_read_virtual_reg(addr, lsn_reg); in sch56xx_read_virtual_reg12()
261 struct sch56xx_watchdog_data *data = watchdog_get_drvdata(wddev); in watchdog_set_timeout() local
273 return -EINVAL; in watchdog_set_timeout()
276 control = data->watchdog_control | SCH56XX_WDOG_TIME_BASE_SEC; in watchdog_set_timeout()
278 control = data->watchdog_control & ~SCH56XX_WDOG_TIME_BASE_SEC; in watchdog_set_timeout()
280 if (data->watchdog_control != control) { in watchdog_set_timeout()
281 mutex_lock(data->io_lock); in watchdog_set_timeout()
282 ret = sch56xx_write_virtual_reg(data->addr, in watchdog_set_timeout()
285 mutex_unlock(data->io_lock); in watchdog_set_timeout()
289 data->watchdog_control = control; in watchdog_set_timeout()
296 data->watchdog_preset = DIV_ROUND_UP(timeout, resolution); in watchdog_set_timeout()
297 wddev->timeout = data->watchdog_preset * resolution; in watchdog_set_timeout()
304 struct sch56xx_watchdog_data *data = watchdog_get_drvdata(wddev); in watchdog_start() local
314 * of the second interrupt source register (at base-address + 9), in watchdog_start()
317 * This will only cause a system reset if the 0-1 flank happens when in watchdog_start()
327 mutex_lock(data->io_lock); in watchdog_start()
330 ret = sch56xx_write_virtual_reg(data->addr, SCH56XX_REG_WDOG_PRESET, in watchdog_start()
331 data->watchdog_preset); in watchdog_start()
336 val = data->watchdog_output_enable | SCH56XX_WDOG_OUTPUT_ENABLE; in watchdog_start()
337 ret = sch56xx_write_virtual_reg(data->addr, in watchdog_start()
342 data->watchdog_output_enable = val; in watchdog_start()
345 val = inb(data->addr + 9); in watchdog_start()
347 outb(0x01, data->addr + 9); in watchdog_start()
350 mutex_unlock(data->io_lock); in watchdog_start()
356 struct sch56xx_watchdog_data *data = watchdog_get_drvdata(wddev); in watchdog_trigger() local
360 mutex_lock(data->io_lock); in watchdog_trigger()
361 ret = sch56xx_write_virtual_reg(data->addr, SCH56XX_REG_WDOG_PRESET, in watchdog_trigger()
362 data->watchdog_preset); in watchdog_trigger()
363 mutex_unlock(data->io_lock); in watchdog_trigger()
370 struct sch56xx_watchdog_data *data = watchdog_get_drvdata(wddev); in watchdog_stop() local
374 val = data->watchdog_output_enable & ~SCH56XX_WDOG_OUTPUT_ENABLE; in watchdog_stop()
375 mutex_lock(data->io_lock); in watchdog_stop()
376 ret = sch56xx_write_virtual_reg(data->addr, in watchdog_stop()
378 mutex_unlock(data->io_lock); in watchdog_stop()
382 data->watchdog_output_enable = val; in watchdog_stop()
395 u16 addr, u32 revision, struct mutex *io_lock, int check_enabled) in sch56xx_watchdog_register() argument
397 struct sch56xx_watchdog_data *data; in sch56xx_watchdog_register() local
403 sch56xx_read_virtual_reg(addr, SCH56XX_REG_WDOG_CONTROL); in sch56xx_watchdog_register()
405 sch56xx_read_virtual_reg(addr, SCH56XX_REG_WDOG_OUTPUT_ENABLE); in sch56xx_watchdog_register()
417 data = kzalloc(sizeof(struct sch56xx_watchdog_data), GFP_KERNEL); in sch56xx_watchdog_register()
418 if (!data) in sch56xx_watchdog_register()
421 data->addr = addr; in sch56xx_watchdog_register()
422 data->io_lock = io_lock; in sch56xx_watchdog_register()
424 strlcpy(data->wdinfo.identity, "sch56xx watchdog", in sch56xx_watchdog_register()
425 sizeof(data->wdinfo.identity)); in sch56xx_watchdog_register()
426 data->wdinfo.firmware_version = revision; in sch56xx_watchdog_register()
427 data->wdinfo.options = WDIOF_KEEPALIVEPING | WDIOF_SETTIMEOUT; in sch56xx_watchdog_register()
429 data->wdinfo.options |= WDIOF_MAGICCLOSE; in sch56xx_watchdog_register()
431 data->wddev.info = &data->wdinfo; in sch56xx_watchdog_register()
432 data->wddev.ops = &watchdog_ops; in sch56xx_watchdog_register()
433 data->wddev.parent = parent; in sch56xx_watchdog_register()
434 data->wddev.timeout = 60; in sch56xx_watchdog_register()
435 data->wddev.min_timeout = 1; in sch56xx_watchdog_register()
436 data->wddev.max_timeout = 255 * 60; in sch56xx_watchdog_register()
438 set_bit(WDOG_NO_WAY_OUT, &data->wddev.status); in sch56xx_watchdog_register()
440 set_bit(WDOG_ACTIVE, &data->wddev.status); in sch56xx_watchdog_register()
443 the BIOS set timeout from (if any was set at all) -> in sch56xx_watchdog_register()
446 data->watchdog_preset = 60; /* seconds */ in sch56xx_watchdog_register()
448 data->watchdog_preset = 1; /* minute */ in sch56xx_watchdog_register()
450 data->watchdog_control = control; in sch56xx_watchdog_register()
451 data->watchdog_output_enable = output_enable; in sch56xx_watchdog_register()
453 watchdog_set_drvdata(&data->wddev, data); in sch56xx_watchdog_register()
454 err = watchdog_register_device(&data->wddev); in sch56xx_watchdog_register()
457 kfree(data); in sch56xx_watchdog_register()
461 return data; in sch56xx_watchdog_register()
465 void sch56xx_watchdog_unregister(struct sch56xx_watchdog_data *data) in sch56xx_watchdog_unregister() argument
467 watchdog_unregister_device(&data->wddev); in sch56xx_watchdog_unregister()
468 kfree(data); in sch56xx_watchdog_unregister()
497 err = -ENODEV; in sch56xx_find()
505 err = -ENODEV; in sch56xx_find()
517 err = -ENODEV; in sch56xx_find()
531 .end = address + REGION_LENGTH - 1, in sch56xx_device_add()
538 return -ENOMEM; in sch56xx_device_add()
540 res.name = sch56xx_pdev->name; in sch56xx_device_add()