1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129
| #include <linux/module.h> #include <linux/kernel.h> #include <linux/init.h> #include <linux/platform_device.h> #include <linux/of.h> #include <linux/mod_devicetable.h>
static const struct of_device_id my_of_match[] = { { .compatible = "jvle,my-test-device" }, { } };
MODULE_DEVICE_TABLE(of, my_of_match);
static int my_probe(struct platform_device *pdev) { struct device_node *np = pdev->dev.of_node; const char *str_val; u32 int_val; u32 array_val[4]; u8 byte_arr[6]; struct resource *res; int ret; int irq;
printk(KERN_INFO "PLATFORM-TEST: Probe triggered!\n");
ret = of_property_read_u32(np, "my-custom-int", &int_val); if (!ret) { printk(KERN_INFO "PLATFORM-TEST: my-custom-int = %d\n", int_val); }
ret = of_property_read_string(np, "my-custom-str", &str_val); if (!ret) { printk(KERN_INFO "PLATFORM-TEST: my-custom-str = %s\n", str_val); }
ret = of_property_read_u32_array(np, "my-int-array", array_val, 4); if (!ret) { printk(KERN_INFO "PLATFORM-TEST: my-int-array = [%d, %d, %d, %d]\n", array_val[0], array_val[1], array_val[2], array_val[3]); } else { printk(KERN_INFO "PLATFORM-TEST: my-int-array not found\n"); }
if (of_property_read_bool(np, "my-feature-enable")) { printk(KERN_INFO "PLATFORM-TEST: my-feature-enable is SET\n"); } else { printk(KERN_INFO "PLATFORM-TEST: my-feature-enable is UNSET\n"); }
ret = of_property_read_u8_array(np, "my-byte-array", byte_arr, 6); if (!ret) { printk(KERN_INFO "PLATFORM-TEST: my-byte-array = %02x:%02x:%02x:%02x:%02x:%02x\n", byte_arr[0], byte_arr[1], byte_arr[2], byte_arr[3], byte_arr[4], byte_arr[5]); }
irq = platform_get_irq(pdev, 0); if (irq >= 0) { printk(KERN_INFO "PLATFORM-TEST: IRQ number = %d\n", irq); }
res = platform_get_resource(pdev, IORESOURCE_MEM, 0); if (res) { printk(KERN_INFO "PLATFORM-TEST: reg start = 0x%llx, size = 0x%llx\n", (unsigned long long)res->start, (unsigned long long)resource_size(res)); }
return 0; }
static void my_remove(struct platform_device *pdev) { printk(KERN_INFO "PLATFORM-TEST: Device removed\n"); }
static struct platform_driver my_driver = { .probe = my_probe, .remove = my_remove, .driver = { .name = "my_dt_test_driver", .of_match_table = my_of_match, .owner = THIS_MODULE, }, };
module_platform_driver(my_driver); MODULE_LICENSE("GPL");
|