diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2013-02-21 16:57:13 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2013-02-21 16:57:13 -0500 |
| commit | 7ed214ac2095f561a94335ca672b6c42a1ea40ff (patch) | |
| tree | da41901bff1d0d8d61170bf362384fdc61deb3ab /drivers/w1/masters | |
| parent | 21eaab6d19ed43e82ed39c8deb7f192134fb4a0e (diff) | |
| parent | 29e5507ae4ab34397f538f06b7070c81a4e4a2bf (diff) | |
Merge tag 'char-misc-3.9-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc
Pull char/misc driver patches from Greg Kroah-Hartman:
"Here's the big char/misc driver patches for 3.9-rc1.
Nothing major here, just lots of different driver updates (mei,
hyperv, ipack, extcon, vmci, etc.).
All of these have been in the linux-next tree for a while."
* tag 'char-misc-3.9-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc: (209 commits)
w1: w1_therm: Add force-pullup option for "broken" sensors
w1: ds2482: Added 1-Wire pull-up support to the driver
vme: add missing put_device() after device_register() fails
extcon: max8997: Use workqueue to check cable state after completing boot of platform
extcon: max8997: Set default UART/USB path on probe
extcon: max8997: Consolidate duplicate code for checking ADC/CHG cable type
extcon: max8997: Set default of ADC debounce time during initialization
extcon: max8997: Remove duplicate code related to set H/W line path
extcon: max8997: Move defined constant to header file
extcon: max77693: Make max77693_extcon_cable static
extcon: max8997: Remove unreachable code
extcon: max8997: Make max8997_extcon_cable static
extcon: max77693: Remove unnecessary goto statement to improve readability
extcon: max77693: Convert to devm_input_allocate_device()
extcon: gpio: Rename filename of extcon-gpio.c according to kernel naming style
CREDITS: update email and address of Harald Hoyer
extcon: arizona: Use MICDET for final microphone identification
extcon: arizona: Always take the first HPDET reading as the final one
extcon: arizona: Clear _trig_sts bits after jack detection
extcon: arizona: Don't HPDET magic when headphones are enabled
...
Diffstat (limited to 'drivers/w1/masters')
| -rw-r--r-- | drivers/w1/masters/ds1wm.c | 52 | ||||
| -rw-r--r-- | drivers/w1/masters/ds2482.c | 51 | ||||
| -rw-r--r-- | drivers/w1/masters/mxc_w1.c | 49 | ||||
| -rw-r--r-- | drivers/w1/masters/w1-gpio.c | 2 |
4 files changed, 74 insertions, 80 deletions
diff --git a/drivers/w1/masters/ds1wm.c b/drivers/w1/masters/ds1wm.c index 7c294f4dc0ed..96cab6ac2b4e 100644 --- a/drivers/w1/masters/ds1wm.c +++ b/drivers/w1/masters/ds1wm.c | |||
| @@ -13,6 +13,7 @@ | |||
| 13 | 13 | ||
| 14 | #include <linux/module.h> | 14 | #include <linux/module.h> |
| 15 | #include <linux/interrupt.h> | 15 | #include <linux/interrupt.h> |
| 16 | #include <linux/io.h> | ||
| 16 | #include <linux/irq.h> | 17 | #include <linux/irq.h> |
| 17 | #include <linux/pm.h> | 18 | #include <linux/pm.h> |
| 18 | #include <linux/platform_device.h> | 19 | #include <linux/platform_device.h> |
| @@ -459,43 +460,34 @@ static int ds1wm_probe(struct platform_device *pdev) | |||
| 459 | if (!pdev) | 460 | if (!pdev) |
| 460 | return -ENODEV; | 461 | return -ENODEV; |
| 461 | 462 | ||
| 462 | ds1wm_data = kzalloc(sizeof(*ds1wm_data), GFP_KERNEL); | 463 | ds1wm_data = devm_kzalloc(&pdev->dev, sizeof(*ds1wm_data), GFP_KERNEL); |
| 463 | if (!ds1wm_data) | 464 | if (!ds1wm_data) |
| 464 | return -ENOMEM; | 465 | return -ENOMEM; |
| 465 | 466 | ||
| 466 | platform_set_drvdata(pdev, ds1wm_data); | 467 | platform_set_drvdata(pdev, ds1wm_data); |
| 467 | 468 | ||
| 468 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 469 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
| 469 | if (!res) { | 470 | if (!res) |
| 470 | ret = -ENXIO; | 471 | return -ENXIO; |
| 471 | goto err0; | 472 | ds1wm_data->map = devm_ioremap(&pdev->dev, res->start, |
| 472 | } | 473 | resource_size(res)); |
| 473 | ds1wm_data->map = ioremap(res->start, resource_size(res)); | 474 | if (!ds1wm_data->map) |
| 474 | if (!ds1wm_data->map) { | 475 | return -ENOMEM; |
| 475 | ret = -ENOMEM; | ||
| 476 | goto err0; | ||
| 477 | } | ||
| 478 | 476 | ||
| 479 | /* calculate bus shift from mem resource */ | 477 | /* calculate bus shift from mem resource */ |
| 480 | ds1wm_data->bus_shift = resource_size(res) >> 3; | 478 | ds1wm_data->bus_shift = resource_size(res) >> 3; |
| 481 | 479 | ||
| 482 | ds1wm_data->pdev = pdev; | 480 | ds1wm_data->pdev = pdev; |
| 483 | ds1wm_data->cell = mfd_get_cell(pdev); | 481 | ds1wm_data->cell = mfd_get_cell(pdev); |
| 484 | if (!ds1wm_data->cell) { | 482 | if (!ds1wm_data->cell) |
| 485 | ret = -ENODEV; | 483 | return -ENODEV; |
| 486 | goto err1; | ||
| 487 | } | ||
| 488 | plat = pdev->dev.platform_data; | 484 | plat = pdev->dev.platform_data; |
| 489 | if (!plat) { | 485 | if (!plat) |
| 490 | ret = -ENODEV; | 486 | return -ENODEV; |
| 491 | goto err1; | ||
| 492 | } | ||
| 493 | 487 | ||
| 494 | res = platform_get_resource(pdev, IORESOURCE_IRQ, 0); | 488 | res = platform_get_resource(pdev, IORESOURCE_IRQ, 0); |
| 495 | if (!res) { | 489 | if (!res) |
| 496 | ret = -ENXIO; | 490 | return -ENXIO; |
| 497 | goto err1; | ||
| 498 | } | ||
| 499 | ds1wm_data->irq = res->start; | 491 | ds1wm_data->irq = res->start; |
| 500 | ds1wm_data->int_en_reg_none = (plat->active_high ? DS1WM_INTEN_IAS : 0); | 492 | ds1wm_data->int_en_reg_none = (plat->active_high ? DS1WM_INTEN_IAS : 0); |
| 501 | ds1wm_data->reset_recover_delay = plat->reset_recover_delay; | 493 | ds1wm_data->reset_recover_delay = plat->reset_recover_delay; |
| @@ -505,10 +497,10 @@ static int ds1wm_probe(struct platform_device *pdev) | |||
| 505 | if (res->flags & IORESOURCE_IRQ_LOWEDGE) | 497 | if (res->flags & IORESOURCE_IRQ_LOWEDGE) |
| 506 | irq_set_irq_type(ds1wm_data->irq, IRQ_TYPE_EDGE_FALLING); | 498 | irq_set_irq_type(ds1wm_data->irq, IRQ_TYPE_EDGE_FALLING); |
| 507 | 499 | ||
| 508 | ret = request_irq(ds1wm_data->irq, ds1wm_isr, | 500 | ret = devm_request_irq(&pdev->dev, ds1wm_data->irq, ds1wm_isr, |
| 509 | IRQF_DISABLED | IRQF_SHARED, "ds1wm", ds1wm_data); | 501 | IRQF_DISABLED | IRQF_SHARED, "ds1wm", ds1wm_data); |
| 510 | if (ret) | 502 | if (ret) |
| 511 | goto err1; | 503 | return ret; |
| 512 | 504 | ||
| 513 | ds1wm_up(ds1wm_data); | 505 | ds1wm_up(ds1wm_data); |
| 514 | 506 | ||
| @@ -516,17 +508,12 @@ static int ds1wm_probe(struct platform_device *pdev) | |||
| 516 | 508 | ||
| 517 | ret = w1_add_master_device(&ds1wm_master); | 509 | ret = w1_add_master_device(&ds1wm_master); |
| 518 | if (ret) | 510 | if (ret) |
| 519 | goto err2; | 511 | goto err; |
| 520 | 512 | ||
| 521 | return 0; | 513 | return 0; |
| 522 | 514 | ||
| 523 | err2: | 515 | err: |
| 524 | ds1wm_down(ds1wm_data); | 516 | ds1wm_down(ds1wm_data); |
| 525 | free_irq(ds1wm_data->irq, ds1wm_data); | ||
| 526 | err1: | ||
| 527 | iounmap(ds1wm_data->map); | ||
| 528 | err0: | ||
| 529 | kfree(ds1wm_data); | ||
| 530 | 517 | ||
| 531 | return ret; | 518 | return ret; |
| 532 | } | 519 | } |
| @@ -560,9 +547,6 @@ static int ds1wm_remove(struct platform_device *pdev) | |||
| 560 | 547 | ||
| 561 | w1_remove_master_device(&ds1wm_master); | 548 | w1_remove_master_device(&ds1wm_master); |
| 562 | ds1wm_down(ds1wm_data); | 549 | ds1wm_down(ds1wm_data); |
| 563 | free_irq(ds1wm_data->irq, ds1wm_data); | ||
| 564 | iounmap(ds1wm_data->map); | ||
| 565 | kfree(ds1wm_data); | ||
| 566 | 550 | ||
| 567 | return 0; | 551 | return 0; |
| 568 | } | 552 | } |
diff --git a/drivers/w1/masters/ds2482.c b/drivers/w1/masters/ds2482.c index 6429b9e9fb82..e033491fe308 100644 --- a/drivers/w1/masters/ds2482.c +++ b/drivers/w1/masters/ds2482.c | |||
| @@ -51,10 +51,10 @@ | |||
| 51 | * The top 4 bits always read 0. | 51 | * The top 4 bits always read 0. |
| 52 | * To write, the top nibble must be the 1's compl. of the low nibble. | 52 | * To write, the top nibble must be the 1's compl. of the low nibble. |
| 53 | */ | 53 | */ |
| 54 | #define DS2482_REG_CFG_1WS 0x08 | 54 | #define DS2482_REG_CFG_1WS 0x08 /* 1-wire speed */ |
| 55 | #define DS2482_REG_CFG_SPU 0x04 | 55 | #define DS2482_REG_CFG_SPU 0x04 /* strong pull-up */ |
| 56 | #define DS2482_REG_CFG_PPM 0x02 | 56 | #define DS2482_REG_CFG_PPM 0x02 /* presence pulse masking */ |
| 57 | #define DS2482_REG_CFG_APU 0x01 | 57 | #define DS2482_REG_CFG_APU 0x01 /* active pull-up */ |
| 58 | 58 | ||
| 59 | 59 | ||
| 60 | /** | 60 | /** |
| @@ -132,6 +132,17 @@ struct ds2482_data { | |||
| 132 | 132 | ||
| 133 | 133 | ||
| 134 | /** | 134 | /** |
| 135 | * Helper to calculate values for configuration register | ||
| 136 | * @param conf the raw config value | ||
| 137 | * @return the value w/ complements that can be written to register | ||
| 138 | */ | ||
| 139 | static inline u8 ds2482_calculate_config(u8 conf) | ||
| 140 | { | ||
| 141 | return conf | ((~conf & 0x0f) << 4); | ||
| 142 | } | ||
| 143 | |||
| 144 | |||
| 145 | /** | ||
| 135 | * Sets the read pointer. | 146 | * Sets the read pointer. |
| 136 | * @param pdev The ds2482 client pointer | 147 | * @param pdev The ds2482 client pointer |
| 137 | * @param read_ptr see DS2482_PTR_CODE_xxx above | 148 | * @param read_ptr see DS2482_PTR_CODE_xxx above |
| @@ -399,7 +410,7 @@ static u8 ds2482_w1_reset_bus(void *data) | |||
| 399 | /* If the chip did reset since detect, re-config it */ | 410 | /* If the chip did reset since detect, re-config it */ |
| 400 | if (err & DS2482_REG_STS_RST) | 411 | if (err & DS2482_REG_STS_RST) |
| 401 | ds2482_send_cmd_data(pdev, DS2482_CMD_WRITE_CONFIG, | 412 | ds2482_send_cmd_data(pdev, DS2482_CMD_WRITE_CONFIG, |
| 402 | 0xF0); | 413 | ds2482_calculate_config(0x00)); |
| 403 | } | 414 | } |
| 404 | 415 | ||
| 405 | mutex_unlock(&pdev->access_lock); | 416 | mutex_unlock(&pdev->access_lock); |
| @@ -407,6 +418,32 @@ static u8 ds2482_w1_reset_bus(void *data) | |||
| 407 | return retval; | 418 | return retval; |
| 408 | } | 419 | } |
| 409 | 420 | ||
| 421 | static u8 ds2482_w1_set_pullup(void *data, int delay) | ||
| 422 | { | ||
| 423 | struct ds2482_w1_chan *pchan = data; | ||
| 424 | struct ds2482_data *pdev = pchan->pdev; | ||
| 425 | u8 retval = 1; | ||
| 426 | |||
| 427 | /* if delay is non-zero activate the pullup, | ||
| 428 | * the strong pullup will be automatically deactivated | ||
| 429 | * by the master, so do not explicitly deactive it | ||
| 430 | */ | ||
| 431 | if (delay) { | ||
| 432 | /* both waits are crucial, otherwise devices might not be | ||
| 433 | * powered long enough, causing e.g. a w1_therm sensor to | ||
| 434 | * provide wrong conversion results | ||
| 435 | */ | ||
| 436 | ds2482_wait_1wire_idle(pdev); | ||
| 437 | /* note: it seems like both SPU and APU have to be set! */ | ||
| 438 | retval = ds2482_send_cmd_data(pdev, DS2482_CMD_WRITE_CONFIG, | ||
| 439 | ds2482_calculate_config(DS2482_REG_CFG_SPU | | ||
| 440 | DS2482_REG_CFG_APU)); | ||
| 441 | ds2482_wait_1wire_idle(pdev); | ||
| 442 | } | ||
| 443 | |||
| 444 | return retval; | ||
| 445 | } | ||
| 446 | |||
| 410 | 447 | ||
| 411 | static int ds2482_probe(struct i2c_client *client, | 448 | static int ds2482_probe(struct i2c_client *client, |
| 412 | const struct i2c_device_id *id) | 449 | const struct i2c_device_id *id) |
| @@ -452,7 +489,8 @@ static int ds2482_probe(struct i2c_client *client, | |||
| 452 | data->w1_count = 8; | 489 | data->w1_count = 8; |
| 453 | 490 | ||
| 454 | /* Set all config items to 0 (off) */ | 491 | /* Set all config items to 0 (off) */ |
| 455 | ds2482_send_cmd_data(data, DS2482_CMD_WRITE_CONFIG, 0xF0); | 492 | ds2482_send_cmd_data(data, DS2482_CMD_WRITE_CONFIG, |
| 493 | ds2482_calculate_config(0x00)); | ||
| 456 | 494 | ||
| 457 | mutex_init(&data->access_lock); | 495 | mutex_init(&data->access_lock); |
| 458 | 496 | ||
| @@ -468,6 +506,7 @@ static int ds2482_probe(struct i2c_client *client, | |||
| 468 | data->w1_ch[idx].w1_bm.touch_bit = ds2482_w1_touch_bit; | 506 | data->w1_ch[idx].w1_bm.touch_bit = ds2482_w1_touch_bit; |
| 469 | data->w1_ch[idx].w1_bm.triplet = ds2482_w1_triplet; | 507 | data->w1_ch[idx].w1_bm.triplet = ds2482_w1_triplet; |
| 470 | data->w1_ch[idx].w1_bm.reset_bus = ds2482_w1_reset_bus; | 508 | data->w1_ch[idx].w1_bm.reset_bus = ds2482_w1_reset_bus; |
| 509 | data->w1_ch[idx].w1_bm.set_pullup = ds2482_w1_set_pullup; | ||
| 471 | 510 | ||
| 472 | err = w1_add_master_device(&data->w1_ch[idx].w1_bm); | 511 | err = w1_add_master_device(&data->w1_ch[idx].w1_bm); |
| 473 | if (err) { | 512 | if (err) { |
diff --git a/drivers/w1/masters/mxc_w1.c b/drivers/w1/masters/mxc_w1.c index 708a25fc9961..372c8c0d54a0 100644 --- a/drivers/w1/masters/mxc_w1.c +++ b/drivers/w1/masters/mxc_w1.c | |||
| @@ -109,34 +109,21 @@ static int mxc_w1_probe(struct platform_device *pdev) | |||
| 109 | struct resource *res; | 109 | struct resource *res; |
| 110 | int err = 0; | 110 | int err = 0; |
| 111 | 111 | ||
| 112 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 112 | mdev = devm_kzalloc(&pdev->dev, sizeof(struct mxc_w1_device), |
| 113 | if (!res) | 113 | GFP_KERNEL); |
| 114 | return -ENODEV; | ||
| 115 | |||
| 116 | mdev = kzalloc(sizeof(struct mxc_w1_device), GFP_KERNEL); | ||
| 117 | if (!mdev) | 114 | if (!mdev) |
| 118 | return -ENOMEM; | 115 | return -ENOMEM; |
| 119 | 116 | ||
| 120 | mdev->clk = clk_get(&pdev->dev, NULL); | 117 | mdev->clk = devm_clk_get(&pdev->dev, NULL); |
| 121 | if (IS_ERR(mdev->clk)) { | 118 | if (IS_ERR(mdev->clk)) |
| 122 | err = PTR_ERR(mdev->clk); | 119 | return PTR_ERR(mdev->clk); |
| 123 | goto failed_clk; | ||
| 124 | } | ||
| 125 | 120 | ||
| 126 | mdev->clkdiv = (clk_get_rate(mdev->clk) / 1000000) - 1; | 121 | mdev->clkdiv = (clk_get_rate(mdev->clk) / 1000000) - 1; |
| 127 | 122 | ||
| 128 | res = request_mem_region(res->start, resource_size(res), | 123 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
| 129 | "mxc_w1"); | 124 | mdev->regs = devm_request_and_ioremap(&pdev->dev, res); |
| 130 | if (!res) { | 125 | if (!mdev->regs) |
| 131 | err = -EBUSY; | 126 | return -EBUSY; |
| 132 | goto failed_req; | ||
| 133 | } | ||
| 134 | |||
| 135 | mdev->regs = ioremap(res->start, resource_size(res)); | ||
| 136 | if (!mdev->regs) { | ||
| 137 | dev_err(&pdev->dev, "Cannot map mxc_w1 registers\n"); | ||
| 138 | goto failed_ioremap; | ||
| 139 | } | ||
| 140 | 127 | ||
| 141 | clk_prepare_enable(mdev->clk); | 128 | clk_prepare_enable(mdev->clk); |
| 142 | __raw_writeb(mdev->clkdiv, mdev->regs + MXC_W1_TIME_DIVIDER); | 129 | __raw_writeb(mdev->clkdiv, mdev->regs + MXC_W1_TIME_DIVIDER); |
| @@ -148,20 +135,10 @@ static int mxc_w1_probe(struct platform_device *pdev) | |||
| 148 | err = w1_add_master_device(&mdev->bus_master); | 135 | err = w1_add_master_device(&mdev->bus_master); |
| 149 | 136 | ||
| 150 | if (err) | 137 | if (err) |
| 151 | goto failed_add; | 138 | return err; |
| 152 | 139 | ||
| 153 | platform_set_drvdata(pdev, mdev); | 140 | platform_set_drvdata(pdev, mdev); |
| 154 | return 0; | 141 | return 0; |
| 155 | |||
| 156 | failed_add: | ||
| 157 | iounmap(mdev->regs); | ||
| 158 | failed_ioremap: | ||
| 159 | release_mem_region(res->start, resource_size(res)); | ||
| 160 | failed_req: | ||
| 161 | clk_put(mdev->clk); | ||
| 162 | failed_clk: | ||
| 163 | kfree(mdev); | ||
| 164 | return err; | ||
| 165 | } | 142 | } |
| 166 | 143 | ||
| 167 | /* | 144 | /* |
| @@ -170,16 +147,10 @@ failed_clk: | |||
| 170 | static int mxc_w1_remove(struct platform_device *pdev) | 147 | static int mxc_w1_remove(struct platform_device *pdev) |
| 171 | { | 148 | { |
| 172 | struct mxc_w1_device *mdev = platform_get_drvdata(pdev); | 149 | struct mxc_w1_device *mdev = platform_get_drvdata(pdev); |
| 173 | struct resource *res; | ||
| 174 | |||
| 175 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
| 176 | 150 | ||
| 177 | w1_remove_master_device(&mdev->bus_master); | 151 | w1_remove_master_device(&mdev->bus_master); |
| 178 | 152 | ||
| 179 | iounmap(mdev->regs); | ||
| 180 | release_mem_region(res->start, resource_size(res)); | ||
| 181 | clk_disable_unprepare(mdev->clk); | 153 | clk_disable_unprepare(mdev->clk); |
| 182 | clk_put(mdev->clk); | ||
| 183 | 154 | ||
| 184 | platform_set_drvdata(pdev, NULL); | 155 | platform_set_drvdata(pdev, NULL); |
| 185 | 156 | ||
diff --git a/drivers/w1/masters/w1-gpio.c b/drivers/w1/masters/w1-gpio.c index 85b363a5bd0f..d39dfa4cc235 100644 --- a/drivers/w1/masters/w1-gpio.c +++ b/drivers/w1/masters/w1-gpio.c | |||
| @@ -72,7 +72,7 @@ static int w1_gpio_probe_dt(struct platform_device *pdev) | |||
| 72 | return 0; | 72 | return 0; |
| 73 | } | 73 | } |
| 74 | 74 | ||
| 75 | static int __init w1_gpio_probe(struct platform_device *pdev) | 75 | static int w1_gpio_probe(struct platform_device *pdev) |
| 76 | { | 76 | { |
| 77 | struct w1_bus_master *master; | 77 | struct w1_bus_master *master; |
| 78 | struct w1_gpio_platform_data *pdata; | 78 | struct w1_gpio_platform_data *pdata; |
