/* DLH  timings */
 #define DLH_SINGLE_DUT_MS   5
 
-enum dhl_ids {
-       dlhl60d,
-       dlhl60g,
-};
-
 struct dlh_info {
+       const char *name;   /* chip name */
        u8 osdig;           /* digital offset factor */
        unsigned int fss;   /* full scale span (inch H2O) */
 };
 
 struct dlh_state {
        struct i2c_client *client;
-       struct dlh_info info;
+       const struct dlh_info *info;
        bool use_interrupt;
        struct completion completion;
        u8 rx_buf[DLH_NUM_READ_BYTES];
 };
 
-static struct dlh_info dlh_info_tbl[] = {
-       [dlhl60d] = {
-               .osdig = 2,
-               .fss = 120,
-       },
-       [dlhl60g] = {
-               .osdig = 10,
-               .fss = 60,
-       },
+static const struct dlh_info dlhl60d_info = {
+       .name = "dlhl60d",
+       .osdig = 2,
+       .fss = 120,
 };
 
+static const struct dlh_info dlhl60g_info = {
+       .name = "dlhl60g",
+       .osdig = 10,
+       .fss = 60,
+};
 
 static int dlh_cmd_start_single(struct dlh_state *st)
 {
        case IIO_CHAN_INFO_SCALE:
                switch (channel->type) {
                case IIO_PRESSURE:
-                       tmp = div_s64(125LL * st->info.fss * 24909 * 100,
+                       tmp = div_s64(125LL * st->info->fss * 24909 * 100,
                                1 << DLH_NUM_PR_BITS);
                        tmp = div_s64_rem(tmp, 1000000000LL, &rem);
                        *value = tmp;
        case IIO_CHAN_INFO_OFFSET:
                switch (channel->type) {
                case IIO_PRESSURE:
-                       *value = -125 * st->info.fss * 24909;
-                       *value2 = 100 * st->info.osdig * 100000;
+                       *value = -125 * st->info->fss * 24909;
+                       *value2 = 100 * st->info->osdig * 100000;
                        return IIO_VAL_FRACTIONAL;
 
                case IIO_TEMP:
 
 static int dlh_probe(struct i2c_client *client)
 {
-       const struct i2c_device_id *id = i2c_client_get_device_id(client);
        struct dlh_state *st;
        struct iio_dev *indio_dev;
        int ret;
        i2c_set_clientdata(client, indio_dev);
 
        st = iio_priv(indio_dev);
-       st->info = dlh_info_tbl[id->driver_data];
+       st->info = i2c_get_match_data(client);
        st->client = client;
        st->use_interrupt = false;
 
-       indio_dev->name = id->name;
+       indio_dev->name = st->info->name;
        indio_dev->info = &dlh_info;
        indio_dev->modes = INDIO_DIRECT_MODE;
        indio_dev->channels =  dlh_channels;
                ret = devm_request_threaded_irq(&client->dev, client->irq,
                        dlh_interrupt, NULL,
                        IRQF_TRIGGER_RISING | IRQF_ONESHOT,
-                       id->name, indio_dev);
+                       st->info->name, indio_dev);
                if (ret) {
                        dev_err(&client->dev, "failed to allocate threaded irq");
                        return ret;
 }
 
 static const struct of_device_id dlh_of_match[] = {
-       { .compatible = "asc,dlhl60d" },
-       { .compatible = "asc,dlhl60g" },
+       { .compatible = "asc,dlhl60d", .data = &dlhl60d_info },
+       { .compatible = "asc,dlhl60g", .data = &dlhl60g_info },
        { }
 };
 MODULE_DEVICE_TABLE(of, dlh_of_match);
 
 static const struct i2c_device_id dlh_id[] = {
-       { "dlhl60d",    dlhl60d },
-       { "dlhl60g",    dlhl60g },
+       { "dlhl60d", (kernel_ulong_t)&dlhl60d_info },
+       { "dlhl60g", (kernel_ulong_t)&dlhl60g_info },
        { }
 };
 MODULE_DEVICE_TABLE(i2c, dlh_id);