u8                      asa[3];
        long                    raw_to_gauss[3];
        struct gpio_desc        *eoc_gpiod;
+       struct gpio_desc        *reset_gpiod;
        int                     eoc_irq;
        wait_queue_head_t       data_ready_queue;
        unsigned long           flags;
                         "Failed to enable specified Vid supply\n");
                return ret;
        }
+
+       gpiod_set_value_cansleep(data->reset_gpiod, 0);
+
        /*
         * According to the datasheet the power supply rise time is 200us
         * and the minimum wait time before mode setting is 100us, in
 /* Disable attached power regulator if any. */
 static void ak8975_power_off(const struct ak8975_data *data)
 {
+       gpiod_set_value_cansleep(data->reset_gpiod, 1);
+
        regulator_disable(data->vid);
        regulator_disable(data->vdd);
 }
        struct ak8975_data *data;
        struct iio_dev *indio_dev;
        struct gpio_desc *eoc_gpiod;
+       struct gpio_desc *reset_gpiod;
        const void *match;
        unsigned int i;
        int err;
        if (eoc_gpiod)
                gpiod_set_consumer_name(eoc_gpiod, "ak_8975");
 
+       /*
+        * According to AK09911 datasheet, if reset GPIO is provided then
+        * deassert reset on ak8975_power_on() and assert reset on
+        * ak8975_power_off().
+        */
+       reset_gpiod = devm_gpiod_get_optional(&client->dev,
+                                             "reset", GPIOD_OUT_HIGH);
+       if (IS_ERR(reset_gpiod))
+               return PTR_ERR(reset_gpiod);
+
        /* Register with IIO */
        indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data));
        if (indio_dev == NULL)
 
        data->client = client;
        data->eoc_gpiod = eoc_gpiod;
+       data->reset_gpiod = reset_gpiod;
        data->eoc_irq = 0;
 
        err = iio_read_mount_matrix(&client->dev, "mount-matrix", &data->orientation);