1a3c950f2SKarol Herbst /* 2a3c950f2SKarol Herbst * Copyright 2016 Karol Herbst 3a3c950f2SKarol Herbst * 4a3c950f2SKarol Herbst * Permission is hereby granted, free of charge, to any person obtaining a 5a3c950f2SKarol Herbst * copy of this software and associated documentation files (the "Software"), 6a3c950f2SKarol Herbst * to deal in the Software without restriction, including without limitation 7a3c950f2SKarol Herbst * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8a3c950f2SKarol Herbst * and/or sell copies of the Software, and to permit persons to whom the 9a3c950f2SKarol Herbst * Software is furnished to do so, subject to the following conditions: 10a3c950f2SKarol Herbst * 11a3c950f2SKarol Herbst * The above copyright notice and this permission notice shall be included in 12a3c950f2SKarol Herbst * all copies or substantial portions of the Software. 13a3c950f2SKarol Herbst * 14a3c950f2SKarol Herbst * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15a3c950f2SKarol Herbst * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16a3c950f2SKarol Herbst * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17a3c950f2SKarol Herbst * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 18a3c950f2SKarol Herbst * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 19a3c950f2SKarol Herbst * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 20a3c950f2SKarol Herbst * OTHER DEALINGS IN THE SOFTWARE. 21a3c950f2SKarol Herbst * 22a3c950f2SKarol Herbst * Authors: Karol Herbst 23a3c950f2SKarol Herbst */ 24a3c950f2SKarol Herbst #include "priv.h" 25a3c950f2SKarol Herbst 2608de5743SKarol Herbst #include <subdev/fuse.h> 2708de5743SKarol Herbst 2808de5743SKarol Herbst static int 2908de5743SKarol Herbst gf100_volt_speedo_read(struct nvkm_volt *volt) 3008de5743SKarol Herbst { 3108de5743SKarol Herbst struct nvkm_device *device = volt->subdev.device; 3208de5743SKarol Herbst struct nvkm_fuse *fuse = device->fuse; 3308de5743SKarol Herbst 3408de5743SKarol Herbst if (!fuse) 3508de5743SKarol Herbst return -EINVAL; 3608de5743SKarol Herbst 3708de5743SKarol Herbst return nvkm_fuse_read(fuse, 0x1cc); 3808de5743SKarol Herbst } 3908de5743SKarol Herbst 4008de5743SKarol Herbst int 4108de5743SKarol Herbst gf100_volt_oneinit(struct nvkm_volt *volt) 4208de5743SKarol Herbst { 4308de5743SKarol Herbst struct nvkm_subdev *subdev = &volt->subdev; 4408de5743SKarol Herbst if (volt->speedo <= 0) 4508de5743SKarol Herbst nvkm_error(subdev, "couldn't find speedo value, volting not " 4608de5743SKarol Herbst "possible\n"); 4708de5743SKarol Herbst return 0; 4808de5743SKarol Herbst } 4908de5743SKarol Herbst 50a3c950f2SKarol Herbst static const struct nvkm_volt_func 51a3c950f2SKarol Herbst gf100_volt = { 5208de5743SKarol Herbst .oneinit = gf100_volt_oneinit, 53a3c950f2SKarol Herbst .vid_get = nvkm_voltgpio_get, 54a3c950f2SKarol Herbst .vid_set = nvkm_voltgpio_set, 5508de5743SKarol Herbst .speedo_read = gf100_volt_speedo_read, 56a3c950f2SKarol Herbst }; 57a3c950f2SKarol Herbst 58a3c950f2SKarol Herbst int 59a3c950f2SKarol Herbst gf100_volt_new(struct nvkm_device *device, int index, struct nvkm_volt **pvolt) 60a3c950f2SKarol Herbst { 61a3c950f2SKarol Herbst struct nvkm_volt *volt; 62a3c950f2SKarol Herbst int ret; 63a3c950f2SKarol Herbst 64a3c950f2SKarol Herbst ret = nvkm_volt_new_(&gf100_volt, device, index, &volt); 65a3c950f2SKarol Herbst *pvolt = volt; 66a3c950f2SKarol Herbst if (ret) 67a3c950f2SKarol Herbst return ret; 68a3c950f2SKarol Herbst 69a3c950f2SKarol Herbst return nvkm_voltgpio_init(volt); 70a3c950f2SKarol Herbst } 71