Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

iio: adc: sc27xx: add support for PMIC sc2730

sc2730 is the product of sc27xx series.

Co-developed-by: Yuming Zhu <yuming.zhu1@unisoc.com>
Signed-off-by: Yuming Zhu <yuming.zhu1@unisoc.com>
Signed-off-by: Cixi Geng <cixi.geng1@unisoc.com>
Link: https://lore.kernel.org/r/20220419142458.884933-8-gengcixi@gmail.com
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>

authored by

Cixi Geng and committed by
Jonathan Cameron
0ac507bb fff4a7a8

+116
+116
drivers/iio/adc/sc27xx_adc.c
··· 13 13 #include <linux/slab.h> 14 14 15 15 /* PMIC global registers definition */ 16 + #define SC2730_MODULE_EN 0x1808 16 17 #define SC2731_MODULE_EN 0xc08 17 18 #define SC27XX_MODULE_ADC_EN BIT(5) 18 19 #define SC2721_ARM_CLK_EN 0xc0c 20 + #define SC2730_ARM_CLK_EN 0x180c 19 21 #define SC2731_ARM_CLK_EN 0xc10 20 22 #define SC27XX_CLK_ADC_EN BIT(5) 21 23 #define SC27XX_CLK_ADC_CLK_EN BIT(6) ··· 303 301 return SC27XX_VOLT_RATIO(1, 1); 304 302 } 305 303 304 + static int sc2730_adc_get_ratio(int channel, int scale) 305 + { 306 + switch (channel) { 307 + case 14: 308 + switch (scale) { 309 + case 0: 310 + return SC27XX_VOLT_RATIO(68, 900); 311 + case 1: 312 + return SC27XX_VOLT_RATIO(68, 1760); 313 + case 2: 314 + return SC27XX_VOLT_RATIO(68, 2327); 315 + case 3: 316 + return SC27XX_VOLT_RATIO(68, 3654); 317 + default: 318 + return SC27XX_VOLT_RATIO(1, 1); 319 + } 320 + case 15: 321 + switch (scale) { 322 + case 0: 323 + return SC27XX_VOLT_RATIO(1, 3); 324 + case 1: 325 + return SC27XX_VOLT_RATIO(1000, 5865); 326 + case 2: 327 + return SC27XX_VOLT_RATIO(500, 3879); 328 + case 3: 329 + return SC27XX_VOLT_RATIO(500, 6090); 330 + default: 331 + return SC27XX_VOLT_RATIO(1, 1); 332 + } 333 + case 16: 334 + switch (scale) { 335 + case 0: 336 + return SC27XX_VOLT_RATIO(48, 100); 337 + case 1: 338 + return SC27XX_VOLT_RATIO(480, 1955); 339 + case 2: 340 + return SC27XX_VOLT_RATIO(480, 2586); 341 + case 3: 342 + return SC27XX_VOLT_RATIO(48, 406); 343 + default: 344 + return SC27XX_VOLT_RATIO(1, 1); 345 + } 346 + case 21: 347 + case 22: 348 + case 23: 349 + switch (scale) { 350 + case 0: 351 + return SC27XX_VOLT_RATIO(3, 8); 352 + case 1: 353 + return SC27XX_VOLT_RATIO(375, 1955); 354 + case 2: 355 + return SC27XX_VOLT_RATIO(375, 2586); 356 + case 3: 357 + return SC27XX_VOLT_RATIO(300, 3248); 358 + default: 359 + return SC27XX_VOLT_RATIO(1, 1); 360 + } 361 + default: 362 + switch (scale) { 363 + case 0: 364 + return SC27XX_VOLT_RATIO(1, 1); 365 + case 1: 366 + return SC27XX_VOLT_RATIO(1000, 1955); 367 + case 2: 368 + return SC27XX_VOLT_RATIO(1000, 2586); 369 + case 3: 370 + return SC27XX_VOLT_RATIO(1000, 4060); 371 + default: 372 + return SC27XX_VOLT_RATIO(1, 1); 373 + } 374 + } 375 + return SC27XX_VOLT_RATIO(1, 1); 376 + } 377 + 306 378 static int sc2731_adc_get_ratio(int channel, int scale) 307 379 { 308 380 switch (channel) { ··· 425 349 case 30: 426 350 case 31: 427 351 data->channel_scale[i] = 3; 352 + break; 353 + default: 354 + data->channel_scale[i] = 0; 355 + break; 356 + } 357 + } 358 + } 359 + 360 + static void sc2730_adc_scale_init(struct sc27xx_adc_data *data) 361 + { 362 + int i; 363 + 364 + for (i = 0; i < SC27XX_ADC_CHANNEL_MAX; i++) { 365 + switch (i) { 366 + case 5: 367 + case 10: 368 + case 19: 369 + case 30: 370 + case 31: 371 + data->channel_scale[i] = 3; 372 + break; 373 + case 7: 374 + case 9: 375 + data->channel_scale[i] = 2; 376 + break; 377 + case 13: 378 + data->channel_scale[i] = 1; 428 379 break; 429 380 default: 430 381 data->channel_scale[i] = 0; ··· 821 718 .set_volref = false, 822 719 }; 823 720 721 + static const struct sc27xx_adc_variant_data sc2730_data = { 722 + .module_en = SC2730_MODULE_EN, 723 + .clk_en = SC2730_ARM_CLK_EN, 724 + .scale_shift = SC27XX_ADC_SCALE_SHIFT, 725 + .scale_mask = SC27XX_ADC_SCALE_MASK, 726 + .bscale_cal = &big_scale_graph_calib, 727 + .sscale_cal = &small_scale_graph_calib, 728 + .init_scale = sc2730_adc_scale_init, 729 + .get_ratio = sc2730_adc_get_ratio, 730 + .set_volref = false, 731 + }; 732 + 824 733 static const struct sc27xx_adc_variant_data sc2721_data = { 825 734 .module_en = SC2731_MODULE_EN, 826 735 .clk_en = SC2721_ARM_CLK_EN, ··· 944 829 945 830 static const struct of_device_id sc27xx_adc_of_match[] = { 946 831 { .compatible = "sprd,sc2731-adc", .data = &sc2731_data}, 832 + { .compatible = "sprd,sc2730-adc", .data = &sc2730_data}, 947 833 { .compatible = "sprd,sc2721-adc", .data = &sc2721_data}, 948 834 { .compatible = "sprd,sc2720-adc", .data = &sc2720_data}, 949 835 { }