omap_hdq.c (17670B)
1/* 2 * drivers/w1/masters/omap_hdq.c 3 * 4 * Copyright (C) 2007,2012 Texas Instruments, Inc. 5 * 6 * This file is licensed under the terms of the GNU General Public License 7 * version 2. This program is licensed "as is" without any warranty of any 8 * kind, whether express or implied. 9 * 10 */ 11#include <linux/kernel.h> 12#include <linux/module.h> 13#include <linux/platform_device.h> 14#include <linux/interrupt.h> 15#include <linux/slab.h> 16#include <linux/err.h> 17#include <linux/io.h> 18#include <linux/sched.h> 19#include <linux/pm_runtime.h> 20#include <linux/of.h> 21 22#include <linux/w1.h> 23 24#define MOD_NAME "OMAP_HDQ:" 25 26#define OMAP_HDQ_REVISION 0x00 27#define OMAP_HDQ_TX_DATA 0x04 28#define OMAP_HDQ_RX_DATA 0x08 29#define OMAP_HDQ_CTRL_STATUS 0x0c 30#define OMAP_HDQ_CTRL_STATUS_SINGLE BIT(7) 31#define OMAP_HDQ_CTRL_STATUS_INTERRUPTMASK BIT(6) 32#define OMAP_HDQ_CTRL_STATUS_CLOCKENABLE BIT(5) 33#define OMAP_HDQ_CTRL_STATUS_GO BIT(4) 34#define OMAP_HDQ_CTRL_STATUS_PRESENCE BIT(3) 35#define OMAP_HDQ_CTRL_STATUS_INITIALIZATION BIT(2) 36#define OMAP_HDQ_CTRL_STATUS_DIR BIT(1) 37#define OMAP_HDQ_INT_STATUS 0x10 38#define OMAP_HDQ_INT_STATUS_TXCOMPLETE BIT(2) 39#define OMAP_HDQ_INT_STATUS_RXCOMPLETE BIT(1) 40#define OMAP_HDQ_INT_STATUS_TIMEOUT BIT(0) 41 42#define OMAP_HDQ_FLAG_CLEAR 0 43#define OMAP_HDQ_FLAG_SET 1 44#define OMAP_HDQ_TIMEOUT (HZ/5) 45 46#define OMAP_HDQ_MAX_USER 4 47 48static DECLARE_WAIT_QUEUE_HEAD(hdq_wait_queue); 49 50static int w1_id; 51module_param(w1_id, int, S_IRUSR); 52MODULE_PARM_DESC(w1_id, "1-wire id for the slave detection in HDQ mode"); 53 54struct hdq_data { 55 struct device *dev; 56 void __iomem *hdq_base; 57 /* lock read/write/break operations */ 58 struct mutex hdq_mutex; 59 /* interrupt status and a lock for it */ 60 u8 hdq_irqstatus; 61 spinlock_t hdq_spinlock; 62 /* mode: 0-HDQ 1-W1 */ 63 int mode; 64 65}; 66 67/* HDQ register I/O routines */ 68static inline u8 hdq_reg_in(struct hdq_data *hdq_data, u32 offset) 69{ 70 return __raw_readl(hdq_data->hdq_base + offset); 71} 72 73static inline void hdq_reg_out(struct hdq_data *hdq_data, u32 offset, u8 val) 74{ 75 __raw_writel(val, hdq_data->hdq_base + offset); 76} 77 78static inline u8 hdq_reg_merge(struct hdq_data *hdq_data, u32 offset, 79 u8 val, u8 mask) 80{ 81 u8 new_val = (__raw_readl(hdq_data->hdq_base + offset) & ~mask) 82 | (val & mask); 83 __raw_writel(new_val, hdq_data->hdq_base + offset); 84 85 return new_val; 86} 87 88/* 89 * Wait for one or more bits in flag change. 90 * HDQ_FLAG_SET: wait until any bit in the flag is set. 91 * HDQ_FLAG_CLEAR: wait until all bits in the flag are cleared. 92 * return 0 on success and -ETIMEDOUT in the case of timeout. 93 */ 94static int hdq_wait_for_flag(struct hdq_data *hdq_data, u32 offset, 95 u8 flag, u8 flag_set, u8 *status) 96{ 97 int ret = 0; 98 unsigned long timeout = jiffies + OMAP_HDQ_TIMEOUT; 99 100 if (flag_set == OMAP_HDQ_FLAG_CLEAR) { 101 /* wait for the flag clear */ 102 while (((*status = hdq_reg_in(hdq_data, offset)) & flag) 103 && time_before(jiffies, timeout)) { 104 schedule_timeout_uninterruptible(1); 105 } 106 if (*status & flag) 107 ret = -ETIMEDOUT; 108 } else if (flag_set == OMAP_HDQ_FLAG_SET) { 109 /* wait for the flag set */ 110 while (!((*status = hdq_reg_in(hdq_data, offset)) & flag) 111 && time_before(jiffies, timeout)) { 112 schedule_timeout_uninterruptible(1); 113 } 114 if (!(*status & flag)) 115 ret = -ETIMEDOUT; 116 } else 117 return -EINVAL; 118 119 return ret; 120} 121 122/* Clear saved irqstatus after using an interrupt */ 123static u8 hdq_reset_irqstatus(struct hdq_data *hdq_data, u8 bits) 124{ 125 unsigned long irqflags; 126 u8 status; 127 128 spin_lock_irqsave(&hdq_data->hdq_spinlock, irqflags); 129 status = hdq_data->hdq_irqstatus; 130 /* this is a read-modify-write */ 131 hdq_data->hdq_irqstatus &= ~bits; 132 spin_unlock_irqrestore(&hdq_data->hdq_spinlock, irqflags); 133 134 return status; 135} 136 137/* write out a byte and fill *status with HDQ_INT_STATUS */ 138static int hdq_write_byte(struct hdq_data *hdq_data, u8 val, u8 *status) 139{ 140 int ret; 141 u8 tmp_status; 142 143 ret = mutex_lock_interruptible(&hdq_data->hdq_mutex); 144 if (ret < 0) { 145 ret = -EINTR; 146 goto rtn; 147 } 148 149 if (hdq_data->hdq_irqstatus) 150 dev_err(hdq_data->dev, "TX irqstatus not cleared (%02x)\n", 151 hdq_data->hdq_irqstatus); 152 153 *status = 0; 154 155 hdq_reg_out(hdq_data, OMAP_HDQ_TX_DATA, val); 156 157 /* set the GO bit */ 158 hdq_reg_merge(hdq_data, OMAP_HDQ_CTRL_STATUS, OMAP_HDQ_CTRL_STATUS_GO, 159 OMAP_HDQ_CTRL_STATUS_DIR | OMAP_HDQ_CTRL_STATUS_GO); 160 /* wait for the TXCOMPLETE bit */ 161 ret = wait_event_timeout(hdq_wait_queue, 162 (hdq_data->hdq_irqstatus & OMAP_HDQ_INT_STATUS_TXCOMPLETE), 163 OMAP_HDQ_TIMEOUT); 164 *status = hdq_reset_irqstatus(hdq_data, OMAP_HDQ_INT_STATUS_TXCOMPLETE); 165 if (ret == 0) { 166 dev_dbg(hdq_data->dev, "TX wait elapsed\n"); 167 ret = -ETIMEDOUT; 168 goto out; 169 } 170 171 /* check irqstatus */ 172 if (!(*status & OMAP_HDQ_INT_STATUS_TXCOMPLETE)) { 173 dev_dbg(hdq_data->dev, "timeout waiting for" 174 " TXCOMPLETE/RXCOMPLETE, %x\n", *status); 175 ret = -ETIMEDOUT; 176 goto out; 177 } 178 179 /* wait for the GO bit return to zero */ 180 ret = hdq_wait_for_flag(hdq_data, OMAP_HDQ_CTRL_STATUS, 181 OMAP_HDQ_CTRL_STATUS_GO, 182 OMAP_HDQ_FLAG_CLEAR, &tmp_status); 183 if (ret) { 184 dev_dbg(hdq_data->dev, "timeout waiting GO bit" 185 " return to zero, %x\n", tmp_status); 186 } 187 188out: 189 mutex_unlock(&hdq_data->hdq_mutex); 190rtn: 191 return ret; 192} 193 194/* HDQ Interrupt service routine */ 195static irqreturn_t hdq_isr(int irq, void *_hdq) 196{ 197 struct hdq_data *hdq_data = _hdq; 198 unsigned long irqflags; 199 200 spin_lock_irqsave(&hdq_data->hdq_spinlock, irqflags); 201 hdq_data->hdq_irqstatus |= hdq_reg_in(hdq_data, OMAP_HDQ_INT_STATUS); 202 spin_unlock_irqrestore(&hdq_data->hdq_spinlock, irqflags); 203 dev_dbg(hdq_data->dev, "hdq_isr: %x\n", hdq_data->hdq_irqstatus); 204 205 if (hdq_data->hdq_irqstatus & 206 (OMAP_HDQ_INT_STATUS_TXCOMPLETE | OMAP_HDQ_INT_STATUS_RXCOMPLETE 207 | OMAP_HDQ_INT_STATUS_TIMEOUT)) { 208 /* wake up sleeping process */ 209 wake_up(&hdq_wait_queue); 210 } 211 212 return IRQ_HANDLED; 213} 214 215/* W1 search callback function in HDQ mode */ 216static void omap_w1_search_bus(void *_hdq, struct w1_master *master_dev, 217 u8 search_type, w1_slave_found_callback slave_found) 218{ 219 u64 module_id, rn_le, cs, id; 220 221 if (w1_id) 222 module_id = w1_id; 223 else 224 module_id = 0x1; 225 226 rn_le = cpu_to_le64(module_id); 227 /* 228 * HDQ might not obey truly the 1-wire spec. 229 * So calculate CRC based on module parameter. 230 */ 231 cs = w1_calc_crc8((u8 *)&rn_le, 7); 232 id = (cs << 56) | module_id; 233 234 slave_found(master_dev, id); 235} 236 237/* Issue break pulse to the device */ 238static int omap_hdq_break(struct hdq_data *hdq_data) 239{ 240 int ret = 0; 241 u8 tmp_status; 242 243 ret = mutex_lock_interruptible(&hdq_data->hdq_mutex); 244 if (ret < 0) { 245 dev_dbg(hdq_data->dev, "Could not acquire mutex\n"); 246 ret = -EINTR; 247 goto rtn; 248 } 249 250 if (hdq_data->hdq_irqstatus) 251 dev_err(hdq_data->dev, "break irqstatus not cleared (%02x)\n", 252 hdq_data->hdq_irqstatus); 253 254 /* set the INIT and GO bit */ 255 hdq_reg_merge(hdq_data, OMAP_HDQ_CTRL_STATUS, 256 OMAP_HDQ_CTRL_STATUS_INITIALIZATION | OMAP_HDQ_CTRL_STATUS_GO, 257 OMAP_HDQ_CTRL_STATUS_DIR | OMAP_HDQ_CTRL_STATUS_INITIALIZATION | 258 OMAP_HDQ_CTRL_STATUS_GO); 259 260 /* wait for the TIMEOUT bit */ 261 ret = wait_event_timeout(hdq_wait_queue, 262 (hdq_data->hdq_irqstatus & OMAP_HDQ_INT_STATUS_TIMEOUT), 263 OMAP_HDQ_TIMEOUT); 264 tmp_status = hdq_reset_irqstatus(hdq_data, OMAP_HDQ_INT_STATUS_TIMEOUT); 265 if (ret == 0) { 266 dev_dbg(hdq_data->dev, "break wait elapsed\n"); 267 ret = -EINTR; 268 goto out; 269 } 270 271 /* check irqstatus */ 272 if (!(tmp_status & OMAP_HDQ_INT_STATUS_TIMEOUT)) { 273 dev_dbg(hdq_data->dev, "timeout waiting for TIMEOUT, %x\n", 274 tmp_status); 275 ret = -ETIMEDOUT; 276 goto out; 277 } 278 279 /* 280 * check for the presence detect bit to get 281 * set to show that the slave is responding 282 */ 283 if (!(hdq_reg_in(hdq_data, OMAP_HDQ_CTRL_STATUS) & 284 OMAP_HDQ_CTRL_STATUS_PRESENCE)) { 285 dev_dbg(hdq_data->dev, "Presence bit not set\n"); 286 ret = -ETIMEDOUT; 287 goto out; 288 } 289 290 /* 291 * wait for both INIT and GO bits rerurn to zero. 292 * zero wait time expected for interrupt mode. 293 */ 294 ret = hdq_wait_for_flag(hdq_data, OMAP_HDQ_CTRL_STATUS, 295 OMAP_HDQ_CTRL_STATUS_INITIALIZATION | 296 OMAP_HDQ_CTRL_STATUS_GO, OMAP_HDQ_FLAG_CLEAR, 297 &tmp_status); 298 if (ret) 299 dev_dbg(hdq_data->dev, "timeout waiting INIT&GO bits" 300 " return to zero, %x\n", tmp_status); 301 302out: 303 mutex_unlock(&hdq_data->hdq_mutex); 304rtn: 305 return ret; 306} 307 308static int hdq_read_byte(struct hdq_data *hdq_data, u8 *val) 309{ 310 int ret = 0; 311 u8 status; 312 313 ret = mutex_lock_interruptible(&hdq_data->hdq_mutex); 314 if (ret < 0) { 315 ret = -EINTR; 316 goto rtn; 317 } 318 319 if (pm_runtime_suspended(hdq_data->dev)) { 320 ret = -EINVAL; 321 goto out; 322 } 323 324 if (!(hdq_data->hdq_irqstatus & OMAP_HDQ_INT_STATUS_RXCOMPLETE)) { 325 hdq_reg_merge(hdq_data, OMAP_HDQ_CTRL_STATUS, 326 OMAP_HDQ_CTRL_STATUS_DIR | OMAP_HDQ_CTRL_STATUS_GO, 327 OMAP_HDQ_CTRL_STATUS_DIR | OMAP_HDQ_CTRL_STATUS_GO); 328 /* 329 * The RX comes immediately after TX. 330 */ 331 wait_event_timeout(hdq_wait_queue, 332 (hdq_data->hdq_irqstatus 333 & (OMAP_HDQ_INT_STATUS_RXCOMPLETE | 334 OMAP_HDQ_INT_STATUS_TIMEOUT)), 335 OMAP_HDQ_TIMEOUT); 336 status = hdq_reset_irqstatus(hdq_data, 337 OMAP_HDQ_INT_STATUS_RXCOMPLETE | 338 OMAP_HDQ_INT_STATUS_TIMEOUT); 339 hdq_reg_merge(hdq_data, OMAP_HDQ_CTRL_STATUS, 0, 340 OMAP_HDQ_CTRL_STATUS_DIR); 341 342 /* check irqstatus */ 343 if (!(status & OMAP_HDQ_INT_STATUS_RXCOMPLETE)) { 344 dev_dbg(hdq_data->dev, "timeout waiting for" 345 " RXCOMPLETE, %x", status); 346 ret = -ETIMEDOUT; 347 goto out; 348 } 349 } else { /* interrupt had occurred before hdq_read_byte was called */ 350 hdq_reset_irqstatus(hdq_data, OMAP_HDQ_INT_STATUS_RXCOMPLETE); 351 } 352 /* the data is ready. Read it in! */ 353 *val = hdq_reg_in(hdq_data, OMAP_HDQ_RX_DATA); 354out: 355 mutex_unlock(&hdq_data->hdq_mutex); 356rtn: 357 return ret; 358 359} 360 361/* 362 * W1 triplet callback function - used for searching ROM addresses. 363 * Registered only when controller is in 1-wire mode. 364 */ 365static u8 omap_w1_triplet(void *_hdq, u8 bdir) 366{ 367 u8 id_bit, comp_bit; 368 int err; 369 u8 ret = 0x3; /* no slaves responded */ 370 struct hdq_data *hdq_data = _hdq; 371 u8 ctrl = OMAP_HDQ_CTRL_STATUS_SINGLE | OMAP_HDQ_CTRL_STATUS_GO | 372 OMAP_HDQ_CTRL_STATUS_INTERRUPTMASK; 373 u8 mask = ctrl | OMAP_HDQ_CTRL_STATUS_DIR; 374 375 err = pm_runtime_get_sync(hdq_data->dev); 376 if (err < 0) { 377 pm_runtime_put_noidle(hdq_data->dev); 378 379 return err; 380 } 381 382 err = mutex_lock_interruptible(&hdq_data->hdq_mutex); 383 if (err < 0) { 384 dev_dbg(hdq_data->dev, "Could not acquire mutex\n"); 385 goto rtn; 386 } 387 388 /* read id_bit */ 389 hdq_reg_merge(_hdq, OMAP_HDQ_CTRL_STATUS, 390 ctrl | OMAP_HDQ_CTRL_STATUS_DIR, mask); 391 err = wait_event_timeout(hdq_wait_queue, 392 (hdq_data->hdq_irqstatus 393 & OMAP_HDQ_INT_STATUS_RXCOMPLETE), 394 OMAP_HDQ_TIMEOUT); 395 /* Must clear irqstatus for another RXCOMPLETE interrupt */ 396 hdq_reset_irqstatus(hdq_data, OMAP_HDQ_INT_STATUS_RXCOMPLETE); 397 398 if (err == 0) { 399 dev_dbg(hdq_data->dev, "RX wait elapsed\n"); 400 goto out; 401 } 402 id_bit = (hdq_reg_in(_hdq, OMAP_HDQ_RX_DATA) & 0x01); 403 404 /* read comp_bit */ 405 hdq_reg_merge(_hdq, OMAP_HDQ_CTRL_STATUS, 406 ctrl | OMAP_HDQ_CTRL_STATUS_DIR, mask); 407 err = wait_event_timeout(hdq_wait_queue, 408 (hdq_data->hdq_irqstatus 409 & OMAP_HDQ_INT_STATUS_RXCOMPLETE), 410 OMAP_HDQ_TIMEOUT); 411 /* Must clear irqstatus for another RXCOMPLETE interrupt */ 412 hdq_reset_irqstatus(hdq_data, OMAP_HDQ_INT_STATUS_RXCOMPLETE); 413 414 if (err == 0) { 415 dev_dbg(hdq_data->dev, "RX wait elapsed\n"); 416 goto out; 417 } 418 comp_bit = (hdq_reg_in(_hdq, OMAP_HDQ_RX_DATA) & 0x01); 419 420 if (id_bit && comp_bit) { 421 ret = 0x03; /* no slaves responded */ 422 goto out; 423 } 424 if (!id_bit && !comp_bit) { 425 /* Both bits are valid, take the direction given */ 426 ret = bdir ? 0x04 : 0; 427 } else { 428 /* Only one bit is valid, take that direction */ 429 bdir = id_bit; 430 ret = id_bit ? 0x05 : 0x02; 431 } 432 433 /* write bdir bit */ 434 hdq_reg_out(_hdq, OMAP_HDQ_TX_DATA, bdir); 435 hdq_reg_merge(_hdq, OMAP_HDQ_CTRL_STATUS, ctrl, mask); 436 err = wait_event_timeout(hdq_wait_queue, 437 (hdq_data->hdq_irqstatus 438 & OMAP_HDQ_INT_STATUS_TXCOMPLETE), 439 OMAP_HDQ_TIMEOUT); 440 /* Must clear irqstatus for another TXCOMPLETE interrupt */ 441 hdq_reset_irqstatus(hdq_data, OMAP_HDQ_INT_STATUS_TXCOMPLETE); 442 443 if (err == 0) { 444 dev_dbg(hdq_data->dev, "TX wait elapsed\n"); 445 goto out; 446 } 447 448 hdq_reg_merge(_hdq, OMAP_HDQ_CTRL_STATUS, 0, 449 OMAP_HDQ_CTRL_STATUS_SINGLE); 450 451out: 452 mutex_unlock(&hdq_data->hdq_mutex); 453rtn: 454 pm_runtime_mark_last_busy(hdq_data->dev); 455 pm_runtime_put_autosuspend(hdq_data->dev); 456 457 return ret; 458} 459 460/* reset callback */ 461static u8 omap_w1_reset_bus(void *_hdq) 462{ 463 struct hdq_data *hdq_data = _hdq; 464 int err; 465 466 err = pm_runtime_get_sync(hdq_data->dev); 467 if (err < 0) { 468 pm_runtime_put_noidle(hdq_data->dev); 469 470 return err; 471 } 472 473 omap_hdq_break(hdq_data); 474 475 pm_runtime_mark_last_busy(hdq_data->dev); 476 pm_runtime_put_autosuspend(hdq_data->dev); 477 478 return 0; 479} 480 481/* Read a byte of data from the device */ 482static u8 omap_w1_read_byte(void *_hdq) 483{ 484 struct hdq_data *hdq_data = _hdq; 485 u8 val = 0; 486 int ret; 487 488 ret = pm_runtime_get_sync(hdq_data->dev); 489 if (ret < 0) { 490 pm_runtime_put_noidle(hdq_data->dev); 491 492 return -1; 493 } 494 495 ret = hdq_read_byte(hdq_data, &val); 496 if (ret) 497 val = -1; 498 499 pm_runtime_mark_last_busy(hdq_data->dev); 500 pm_runtime_put_autosuspend(hdq_data->dev); 501 502 return val; 503} 504 505/* Write a byte of data to the device */ 506static void omap_w1_write_byte(void *_hdq, u8 byte) 507{ 508 struct hdq_data *hdq_data = _hdq; 509 int ret; 510 u8 status; 511 512 ret = pm_runtime_get_sync(hdq_data->dev); 513 if (ret < 0) { 514 pm_runtime_put_noidle(hdq_data->dev); 515 516 return; 517 } 518 519 /* 520 * We need to reset the slave before 521 * issuing the SKIP ROM command, else 522 * the slave will not work. 523 */ 524 if (byte == W1_SKIP_ROM) 525 omap_hdq_break(hdq_data); 526 527 ret = hdq_write_byte(hdq_data, byte, &status); 528 if (ret < 0) { 529 dev_dbg(hdq_data->dev, "TX failure:Ctrl status %x\n", status); 530 goto out_err; 531 } 532 533out_err: 534 pm_runtime_mark_last_busy(hdq_data->dev); 535 pm_runtime_put_autosuspend(hdq_data->dev); 536} 537 538static struct w1_bus_master omap_w1_master = { 539 .read_byte = omap_w1_read_byte, 540 .write_byte = omap_w1_write_byte, 541 .reset_bus = omap_w1_reset_bus, 542}; 543 544static int __maybe_unused omap_hdq_runtime_suspend(struct device *dev) 545{ 546 struct hdq_data *hdq_data = dev_get_drvdata(dev); 547 548 hdq_reg_out(hdq_data, 0, hdq_data->mode); 549 hdq_reg_in(hdq_data, OMAP_HDQ_INT_STATUS); 550 551 return 0; 552} 553 554static int __maybe_unused omap_hdq_runtime_resume(struct device *dev) 555{ 556 struct hdq_data *hdq_data = dev_get_drvdata(dev); 557 558 /* select HDQ/1W mode & enable clocks */ 559 hdq_reg_out(hdq_data, OMAP_HDQ_CTRL_STATUS, 560 OMAP_HDQ_CTRL_STATUS_CLOCKENABLE | 561 OMAP_HDQ_CTRL_STATUS_INTERRUPTMASK | 562 hdq_data->mode); 563 hdq_reg_in(hdq_data, OMAP_HDQ_INT_STATUS); 564 565 return 0; 566} 567 568static const struct dev_pm_ops omap_hdq_pm_ops = { 569 SET_RUNTIME_PM_OPS(omap_hdq_runtime_suspend, 570 omap_hdq_runtime_resume, NULL) 571}; 572 573static int omap_hdq_probe(struct platform_device *pdev) 574{ 575 struct device *dev = &pdev->dev; 576 struct hdq_data *hdq_data; 577 int ret, irq; 578 u8 rev; 579 const char *mode; 580 581 hdq_data = devm_kzalloc(dev, sizeof(*hdq_data), GFP_KERNEL); 582 if (!hdq_data) { 583 dev_dbg(&pdev->dev, "unable to allocate memory\n"); 584 return -ENOMEM; 585 } 586 587 hdq_data->dev = dev; 588 platform_set_drvdata(pdev, hdq_data); 589 590 hdq_data->hdq_base = devm_platform_ioremap_resource(pdev, 0); 591 if (IS_ERR(hdq_data->hdq_base)) 592 return PTR_ERR(hdq_data->hdq_base); 593 594 mutex_init(&hdq_data->hdq_mutex); 595 596 ret = of_property_read_string(pdev->dev.of_node, "ti,mode", &mode); 597 if (ret < 0 || !strcmp(mode, "hdq")) { 598 hdq_data->mode = 0; 599 omap_w1_master.search = omap_w1_search_bus; 600 } else { 601 hdq_data->mode = 1; 602 omap_w1_master.triplet = omap_w1_triplet; 603 } 604 605 pm_runtime_enable(&pdev->dev); 606 pm_runtime_use_autosuspend(&pdev->dev); 607 pm_runtime_set_autosuspend_delay(&pdev->dev, 300); 608 ret = pm_runtime_get_sync(&pdev->dev); 609 if (ret < 0) { 610 pm_runtime_put_noidle(&pdev->dev); 611 dev_dbg(&pdev->dev, "pm_runtime_get_sync failed\n"); 612 goto err_w1; 613 } 614 615 rev = hdq_reg_in(hdq_data, OMAP_HDQ_REVISION); 616 dev_info(&pdev->dev, "OMAP HDQ Hardware Rev %c.%c. Driver in %s mode\n", 617 (rev >> 4) + '0', (rev & 0x0f) + '0', "Interrupt"); 618 619 spin_lock_init(&hdq_data->hdq_spinlock); 620 621 irq = platform_get_irq(pdev, 0); 622 if (irq < 0) { 623 dev_dbg(&pdev->dev, "Failed to get IRQ: %d\n", irq); 624 ret = irq; 625 goto err_irq; 626 } 627 628 ret = devm_request_irq(dev, irq, hdq_isr, 0, "omap_hdq", hdq_data); 629 if (ret < 0) { 630 dev_dbg(&pdev->dev, "could not request irq\n"); 631 goto err_irq; 632 } 633 634 omap_hdq_break(hdq_data); 635 636 pm_runtime_mark_last_busy(&pdev->dev); 637 pm_runtime_put_autosuspend(&pdev->dev); 638 639 omap_w1_master.data = hdq_data; 640 641 ret = w1_add_master_device(&omap_w1_master); 642 if (ret) { 643 dev_dbg(&pdev->dev, "Failure in registering w1 master\n"); 644 goto err_w1; 645 } 646 647 return 0; 648 649err_irq: 650 pm_runtime_put_sync(&pdev->dev); 651err_w1: 652 pm_runtime_dont_use_autosuspend(&pdev->dev); 653 pm_runtime_disable(&pdev->dev); 654 655 return ret; 656} 657 658static int omap_hdq_remove(struct platform_device *pdev) 659{ 660 int active; 661 662 active = pm_runtime_get_sync(&pdev->dev); 663 if (active < 0) 664 pm_runtime_put_noidle(&pdev->dev); 665 666 w1_remove_master_device(&omap_w1_master); 667 668 pm_runtime_dont_use_autosuspend(&pdev->dev); 669 if (active >= 0) 670 pm_runtime_put_sync(&pdev->dev); 671 pm_runtime_disable(&pdev->dev); 672 673 return 0; 674} 675 676static const struct of_device_id omap_hdq_dt_ids[] = { 677 { .compatible = "ti,omap3-1w" }, 678 { .compatible = "ti,am4372-hdq" }, 679 {} 680}; 681MODULE_DEVICE_TABLE(of, omap_hdq_dt_ids); 682 683static struct platform_driver omap_hdq_driver = { 684 .probe = omap_hdq_probe, 685 .remove = omap_hdq_remove, 686 .driver = { 687 .name = "omap_hdq", 688 .of_match_table = omap_hdq_dt_ids, 689 .pm = &omap_hdq_pm_ops, 690 }, 691}; 692module_platform_driver(omap_hdq_driver); 693 694MODULE_AUTHOR("Texas Instruments"); 695MODULE_DESCRIPTION("HDQ-1W driver Library"); 696MODULE_LICENSE("GPL");