Loading drivers/mfd/ab8500-core.c +59 −15 Original line number Diff line number Diff line Loading @@ -658,6 +658,15 @@ static struct resource ab8500_gpadc_resources[] = { }, }; static struct resource ab8540_gpadc_resources[] = { { .name = "SW_CONV_END", .start = AB8500_INT_GP_SW_ADC_CONV_END, .end = AB8500_INT_GP_SW_ADC_CONV_END, .flags = IORESOURCE_IRQ, }, }; static struct resource ab8500_rtc_resources[] = { { .name = "60S", Loading Loading @@ -1013,12 +1022,6 @@ static struct mfd_cell abx500_common_devs[] = { .name = "abx500-clk", .of_compatible = "stericsson,abx500-clk", }, { .name = "ab8500-gpadc", .of_compatible = "stericsson,ab8500-gpadc", .num_resources = ARRAY_SIZE(ab8500_gpadc_resources), .resources = ab8500_gpadc_resources, }, { .name = "ab8500-rtc", .of_compatible = "stericsson,ab8500-rtc", Loading Loading @@ -1118,6 +1121,12 @@ static struct mfd_cell ab8500_devs[] = { .name = "ab8500-codec", .of_compatible = "stericsson,ab8500-codec", }, { .name = "ab8500-gpadc", .of_compatible = "stericsson,ab8500-gpadc", .num_resources = ARRAY_SIZE(ab8500_gpadc_resources), .resources = ab8500_gpadc_resources, }, }; static struct mfd_cell ab9540_devs[] = { Loading @@ -1133,10 +1142,44 @@ static struct mfd_cell ab9540_devs[] = { { .name = "ab9540-codec", }, { .name = "ab8500-gpadc", .num_resources = ARRAY_SIZE(ab8500_gpadc_resources), .resources = ab8500_gpadc_resources, }, { .name = "ab-iddet", .num_resources = ARRAY_SIZE(ab8505_iddet_resources), .resources = ab8505_iddet_resources, }, }; /* Device list common to ab9540 and ab8505 */ static struct mfd_cell ab9540_ab8505_devs[] = { /* Device list for ab8505 */ static struct mfd_cell ab8505_devs[] = { { .name = "ab-iddet", .num_resources = ARRAY_SIZE(ab8505_iddet_resources), .resources = ab8505_iddet_resources, }, }; static struct mfd_cell ab8540_devs[] = { { .name = "ab8500-gpio", }, { .name = "ab8540-usb", .num_resources = ARRAY_SIZE(ab8500_usb_resources), .resources = ab8500_usb_resources, }, { .name = "ab8540-codec", }, { .name = "ab8500-gpadc", .num_resources = ARRAY_SIZE(ab8540_gpadc_resources), .resources = ab8540_gpadc_resources, }, { .name = "ab-iddet", .num_resources = ARRAY_SIZE(ab8505_iddet_resources), Loading Loading @@ -1495,6 +1538,14 @@ static int ab8500_probe(struct platform_device *pdev) ret = mfd_add_devices(ab8500->dev, 0, ab9540_devs, ARRAY_SIZE(ab9540_devs), NULL, ab8500->irq_base, ab8500->domain); else if (is_ab8540(ab8500)) ret = mfd_add_devices(ab8500->dev, 0, ab8540_devs, ARRAY_SIZE(ab8540_devs), NULL, ab8500->irq_base, ab8500->domain); else if (is_ab8505(ab8500)) ret = mfd_add_devices(ab8500->dev, 0, ab8505_devs, ARRAY_SIZE(ab8505_devs), NULL, ab8500->irq_base, ab8500->domain); else ret = mfd_add_devices(ab8500->dev, 0, ab8500_devs, ARRAY_SIZE(ab8500_devs), NULL, Loading @@ -1502,13 +1553,6 @@ static int ab8500_probe(struct platform_device *pdev) if (ret) return ret; if (is_ab9540(ab8500) || is_ab8505(ab8500)) ret = mfd_add_devices(ab8500->dev, 0, ab9540_ab8505_devs, ARRAY_SIZE(ab9540_ab8505_devs), NULL, ab8500->irq_base, ab8500->domain); if (ret) return ret; if (!no_bm) { /* Add battery management devices */ ret = mfd_add_devices(ab8500->dev, 0, ab8500_bm_devs, Loading drivers/mfd/ab8500-gpadc.c +39 −28 Original line number Diff line number Diff line Loading @@ -311,6 +311,12 @@ int ab8500_gpadc_read_raw(struct ab8500_gpadc *gpadc, u8 channel, if (!gpadc) return -ENODEV; /* check if convertion is supported */ if ((gpadc->irq_sw < 0) && (conv_type == ADC_SW)) return -ENOTSUPP; if ((gpadc->irq_hw < 0) && (conv_type == ADC_HW)) return -ENOTSUPP; mutex_lock(&gpadc->ab8500_gpadc_lock); /* Enable VTVout LDO this is required for GPADC */ pm_runtime_get_sync(gpadc->dev); Loading Loading @@ -761,20 +767,12 @@ static int ab8500_gpadc_probe(struct platform_device *pdev) } gpadc->irq_sw = platform_get_irq_byname(pdev, "SW_CONV_END"); if (gpadc->irq_sw < 0) { dev_err(gpadc->dev, "failed to get platform irq-%d\n", gpadc->irq_sw); ret = gpadc->irq_sw; goto fail; } if (gpadc->irq_sw < 0) dev_err(gpadc->dev, "failed to get platform sw_conv_end irq\n"); gpadc->irq_hw = platform_get_irq_byname(pdev, "HW_CONV_END"); if (gpadc->irq_hw < 0) { dev_err(gpadc->dev, "failed to get platform irq-%d\n", gpadc->irq_hw); ret = gpadc->irq_hw; goto fail; } if (gpadc->irq_hw < 0) dev_err(gpadc->dev, "failed to get platform hw_conv_end irq\n"); gpadc->dev = &pdev->dev; gpadc->parent = dev_get_drvdata(pdev->dev.parent); Loading @@ -784,21 +782,30 @@ static int ab8500_gpadc_probe(struct platform_device *pdev) init_completion(&gpadc->ab8500_gpadc_complete); /* Register interrupts */ if (gpadc->irq_sw >= 0) { ret = request_threaded_irq(gpadc->irq_sw, NULL, ab8500_bm_gpadcconvend_handler, IRQF_NO_SUSPEND | IRQF_SHARED, "ab8500-gpadc-sw", gpadc); IRQF_NO_SUSPEND | IRQF_SHARED, "ab8500-gpadc-sw", gpadc); if (ret < 0) { dev_err(gpadc->dev, "Failed to register interrupt, irq: %d\n", dev_err(gpadc->dev, "Failed to register interrupt irq: %d\n", gpadc->irq_sw); goto fail; } } if (gpadc->irq_hw >= 0) { ret = request_threaded_irq(gpadc->irq_hw, NULL, ab8500_bm_gpadcconvend_handler, IRQF_NO_SUSPEND | IRQF_SHARED, "ab8500-gpadc-hw", gpadc); IRQF_NO_SUSPEND | IRQF_SHARED, "ab8500-gpadc-hw", gpadc); if (ret < 0) { dev_err(gpadc->dev, "Failed to register interrupt, irq: %d\n", dev_err(gpadc->dev, "Failed to register interrupt irq: %d\n", gpadc->irq_hw); goto fail; goto fail_irq; } } /* VTVout LDO used to power up ab8500-GPADC */ Loading @@ -821,7 +828,9 @@ static int ab8500_gpadc_probe(struct platform_device *pdev) ab8500_gpadc_read_calibration_data(gpadc); list_add_tail(&gpadc->node, &ab8500_gpadc_list); dev_dbg(gpadc->dev, "probe success\n"); return 0; fail_irq: free_irq(gpadc->irq_sw, gpadc); free_irq(gpadc->irq_hw, gpadc); Loading @@ -838,7 +847,9 @@ static int ab8500_gpadc_remove(struct platform_device *pdev) /* remove this gpadc entry from the list */ list_del(&gpadc->node); /* remove interrupt - completion of Sw ADC conversion */ if (gpadc->irq_sw >= 0) free_irq(gpadc->irq_sw, gpadc); if (gpadc->irq_hw >= 0) free_irq(gpadc->irq_hw, gpadc); pm_runtime_get_sync(gpadc->dev); Loading Loading
drivers/mfd/ab8500-core.c +59 −15 Original line number Diff line number Diff line Loading @@ -658,6 +658,15 @@ static struct resource ab8500_gpadc_resources[] = { }, }; static struct resource ab8540_gpadc_resources[] = { { .name = "SW_CONV_END", .start = AB8500_INT_GP_SW_ADC_CONV_END, .end = AB8500_INT_GP_SW_ADC_CONV_END, .flags = IORESOURCE_IRQ, }, }; static struct resource ab8500_rtc_resources[] = { { .name = "60S", Loading Loading @@ -1013,12 +1022,6 @@ static struct mfd_cell abx500_common_devs[] = { .name = "abx500-clk", .of_compatible = "stericsson,abx500-clk", }, { .name = "ab8500-gpadc", .of_compatible = "stericsson,ab8500-gpadc", .num_resources = ARRAY_SIZE(ab8500_gpadc_resources), .resources = ab8500_gpadc_resources, }, { .name = "ab8500-rtc", .of_compatible = "stericsson,ab8500-rtc", Loading Loading @@ -1118,6 +1121,12 @@ static struct mfd_cell ab8500_devs[] = { .name = "ab8500-codec", .of_compatible = "stericsson,ab8500-codec", }, { .name = "ab8500-gpadc", .of_compatible = "stericsson,ab8500-gpadc", .num_resources = ARRAY_SIZE(ab8500_gpadc_resources), .resources = ab8500_gpadc_resources, }, }; static struct mfd_cell ab9540_devs[] = { Loading @@ -1133,10 +1142,44 @@ static struct mfd_cell ab9540_devs[] = { { .name = "ab9540-codec", }, { .name = "ab8500-gpadc", .num_resources = ARRAY_SIZE(ab8500_gpadc_resources), .resources = ab8500_gpadc_resources, }, { .name = "ab-iddet", .num_resources = ARRAY_SIZE(ab8505_iddet_resources), .resources = ab8505_iddet_resources, }, }; /* Device list common to ab9540 and ab8505 */ static struct mfd_cell ab9540_ab8505_devs[] = { /* Device list for ab8505 */ static struct mfd_cell ab8505_devs[] = { { .name = "ab-iddet", .num_resources = ARRAY_SIZE(ab8505_iddet_resources), .resources = ab8505_iddet_resources, }, }; static struct mfd_cell ab8540_devs[] = { { .name = "ab8500-gpio", }, { .name = "ab8540-usb", .num_resources = ARRAY_SIZE(ab8500_usb_resources), .resources = ab8500_usb_resources, }, { .name = "ab8540-codec", }, { .name = "ab8500-gpadc", .num_resources = ARRAY_SIZE(ab8540_gpadc_resources), .resources = ab8540_gpadc_resources, }, { .name = "ab-iddet", .num_resources = ARRAY_SIZE(ab8505_iddet_resources), Loading Loading @@ -1495,6 +1538,14 @@ static int ab8500_probe(struct platform_device *pdev) ret = mfd_add_devices(ab8500->dev, 0, ab9540_devs, ARRAY_SIZE(ab9540_devs), NULL, ab8500->irq_base, ab8500->domain); else if (is_ab8540(ab8500)) ret = mfd_add_devices(ab8500->dev, 0, ab8540_devs, ARRAY_SIZE(ab8540_devs), NULL, ab8500->irq_base, ab8500->domain); else if (is_ab8505(ab8500)) ret = mfd_add_devices(ab8500->dev, 0, ab8505_devs, ARRAY_SIZE(ab8505_devs), NULL, ab8500->irq_base, ab8500->domain); else ret = mfd_add_devices(ab8500->dev, 0, ab8500_devs, ARRAY_SIZE(ab8500_devs), NULL, Loading @@ -1502,13 +1553,6 @@ static int ab8500_probe(struct platform_device *pdev) if (ret) return ret; if (is_ab9540(ab8500) || is_ab8505(ab8500)) ret = mfd_add_devices(ab8500->dev, 0, ab9540_ab8505_devs, ARRAY_SIZE(ab9540_ab8505_devs), NULL, ab8500->irq_base, ab8500->domain); if (ret) return ret; if (!no_bm) { /* Add battery management devices */ ret = mfd_add_devices(ab8500->dev, 0, ab8500_bm_devs, Loading
drivers/mfd/ab8500-gpadc.c +39 −28 Original line number Diff line number Diff line Loading @@ -311,6 +311,12 @@ int ab8500_gpadc_read_raw(struct ab8500_gpadc *gpadc, u8 channel, if (!gpadc) return -ENODEV; /* check if convertion is supported */ if ((gpadc->irq_sw < 0) && (conv_type == ADC_SW)) return -ENOTSUPP; if ((gpadc->irq_hw < 0) && (conv_type == ADC_HW)) return -ENOTSUPP; mutex_lock(&gpadc->ab8500_gpadc_lock); /* Enable VTVout LDO this is required for GPADC */ pm_runtime_get_sync(gpadc->dev); Loading Loading @@ -761,20 +767,12 @@ static int ab8500_gpadc_probe(struct platform_device *pdev) } gpadc->irq_sw = platform_get_irq_byname(pdev, "SW_CONV_END"); if (gpadc->irq_sw < 0) { dev_err(gpadc->dev, "failed to get platform irq-%d\n", gpadc->irq_sw); ret = gpadc->irq_sw; goto fail; } if (gpadc->irq_sw < 0) dev_err(gpadc->dev, "failed to get platform sw_conv_end irq\n"); gpadc->irq_hw = platform_get_irq_byname(pdev, "HW_CONV_END"); if (gpadc->irq_hw < 0) { dev_err(gpadc->dev, "failed to get platform irq-%d\n", gpadc->irq_hw); ret = gpadc->irq_hw; goto fail; } if (gpadc->irq_hw < 0) dev_err(gpadc->dev, "failed to get platform hw_conv_end irq\n"); gpadc->dev = &pdev->dev; gpadc->parent = dev_get_drvdata(pdev->dev.parent); Loading @@ -784,21 +782,30 @@ static int ab8500_gpadc_probe(struct platform_device *pdev) init_completion(&gpadc->ab8500_gpadc_complete); /* Register interrupts */ if (gpadc->irq_sw >= 0) { ret = request_threaded_irq(gpadc->irq_sw, NULL, ab8500_bm_gpadcconvend_handler, IRQF_NO_SUSPEND | IRQF_SHARED, "ab8500-gpadc-sw", gpadc); IRQF_NO_SUSPEND | IRQF_SHARED, "ab8500-gpadc-sw", gpadc); if (ret < 0) { dev_err(gpadc->dev, "Failed to register interrupt, irq: %d\n", dev_err(gpadc->dev, "Failed to register interrupt irq: %d\n", gpadc->irq_sw); goto fail; } } if (gpadc->irq_hw >= 0) { ret = request_threaded_irq(gpadc->irq_hw, NULL, ab8500_bm_gpadcconvend_handler, IRQF_NO_SUSPEND | IRQF_SHARED, "ab8500-gpadc-hw", gpadc); IRQF_NO_SUSPEND | IRQF_SHARED, "ab8500-gpadc-hw", gpadc); if (ret < 0) { dev_err(gpadc->dev, "Failed to register interrupt, irq: %d\n", dev_err(gpadc->dev, "Failed to register interrupt irq: %d\n", gpadc->irq_hw); goto fail; goto fail_irq; } } /* VTVout LDO used to power up ab8500-GPADC */ Loading @@ -821,7 +828,9 @@ static int ab8500_gpadc_probe(struct platform_device *pdev) ab8500_gpadc_read_calibration_data(gpadc); list_add_tail(&gpadc->node, &ab8500_gpadc_list); dev_dbg(gpadc->dev, "probe success\n"); return 0; fail_irq: free_irq(gpadc->irq_sw, gpadc); free_irq(gpadc->irq_hw, gpadc); Loading @@ -838,7 +847,9 @@ static int ab8500_gpadc_remove(struct platform_device *pdev) /* remove this gpadc entry from the list */ list_del(&gpadc->node); /* remove interrupt - completion of Sw ADC conversion */ if (gpadc->irq_sw >= 0) free_irq(gpadc->irq_sw, gpadc); if (gpadc->irq_hw >= 0) free_irq(gpadc->irq_hw, gpadc); pm_runtime_get_sync(gpadc->dev); Loading