31 #include <linux/device.h>
33 #include <linux/module.h>
34 #include <linux/slab.h>
41 #define SMIAPP_ALIGN_DIM(dim, flags) \
42 ((flags) & V4L2_SEL_FLAG_GE \
69 static int smiapp_read_frame_fmt(
struct smiapp_sensor *sensor)
72 u32 fmt_model_type, fmt_model_subtype, ncol_desc, nrow_desc;
76 int embedded_start = -1, embedded_end = -1;
89 ncol_desc = (fmt_model_subtype
92 nrow_desc = fmt_model_subtype
95 dev_dbg(&client->
dev,
"format_model_type %s\n",
99 ?
"4 byte" :
"is simply bad");
101 for (i = 0; i < ncol_desc + nrow_desc; i++) {
121 }
else if (fmt_model_type
137 "invalid frame format model type %d\n",
165 dev_dbg(&client->
dev,
"pixelcode %d\n", pixelcode);
170 what, pixels, which);
178 embedded_start = line_count;
182 image_start = line_count;
183 if (embedded_start != -1 && embedded_end == -1)
184 embedded_end = line_count;
186 line_count += pixels;
189 if (embedded_start == -1 || embedded_end == -1) {
194 dev_dbg(&client->
dev,
"embedded data from lines %d to %d\n",
195 embedded_start, embedded_end);
196 dev_dbg(&client->
dev,
"image data starts at line %d\n", image_start);
201 static int smiapp_pll_configure(
struct smiapp_sensor *sensor)
244 struct i2c_client *client = v4l2_get_subdevdata(&sensor->
src->sd);
332 static void __smiapp_update_exposure_limits(
struct smiapp_sensor *sensor)
379 #define to_csi_format_idx(fmt) (((unsigned long)(fmt) \
380 - (unsigned long)smiapp_csi_data_formats) \
381 / sizeof(*smiapp_csi_data_formats))
385 struct i2c_client *client = v4l2_get_subdevdata(&sensor->
src->sd);
389 if (sensor->
hflip->val)
392 if (sensor->
vflip->val)
402 static void smiapp_update_mbus_formats(
struct smiapp_sensor *sensor)
404 struct i2c_client *client = v4l2_get_subdevdata(&sensor->
src->sd);
405 unsigned int csi_format_idx =
407 unsigned int internal_csi_format_idx =
409 unsigned int pixel_order = smiapp_pixel_order(sensor);
414 &smiapp_csi_data_formats[csi_format_idx + pixel_order];
416 &smiapp_csi_data_formats[internal_csi_format_idx
419 BUG_ON(
max(internal_csi_format_idx, csi_format_idx) + pixel_order
421 BUG_ON(
min(internal_csi_format_idx, csi_format_idx) < 0);
424 pixel_order_str[pixel_order]);
427 static int smiapp_set_ctrl(
struct v4l2_ctrl *ctrl)
452 if (sensor->
hflip->val)
455 if (sensor->
vflip->val)
465 smiapp_update_mbus_formats(sensor);
472 __smiapp_update_exposure_limits(sensor);
474 if (exposure > sensor->
exposure->maximum) {
477 rval = smiapp_set_ctrl(
498 return smiapp_pll_update(sensor);
506 .s_ctrl = smiapp_set_ctrl,
509 static int smiapp_init_controls(
struct smiapp_sensor *sensor)
511 struct i2c_client *client = v4l2_get_subdevdata(&sensor->
src->sd);
521 &sensor->
pixel_array->ctrl_handler, &smiapp_ctrl_ops,
530 &sensor->
pixel_array->ctrl_handler, &smiapp_ctrl_ops,
534 &sensor->
pixel_array->ctrl_handler, &smiapp_ctrl_ops,
537 &sensor->
pixel_array->ctrl_handler, &smiapp_ctrl_ops,
541 &sensor->
pixel_array->ctrl_handler, &smiapp_ctrl_ops,
548 &sensor->
pixel_array->ctrl_handler, &smiapp_ctrl_ops,
555 &sensor->
pixel_array->ctrl_handler, &smiapp_ctrl_ops,
560 "pixel array controls initialization failed (%d)\n",
574 sensor->
src->ctrl_handler.lock = &sensor->
mutex;
576 for (max = 0; sensor->
platform_data->op_sys_clock[max + 1]; max++);
579 &sensor->
src->ctrl_handler, &smiapp_ctrl_ops,
584 &sensor->
src->ctrl_handler, &smiapp_ctrl_ops,
587 if (sensor->
src->ctrl_handler.error) {
589 "src controls initialization failed (%d)\n",
590 sensor->
src->ctrl_handler.error);
591 rval = sensor->
src->ctrl_handler.error;
595 sensor->
src->sd.ctrl_handler =
596 &sensor->
src->ctrl_handler;
607 static void smiapp_free_controls(
struct smiapp_sensor *sensor)
618 struct i2c_client *client = v4l2_get_subdevdata(&sensor->
src->sd);
623 for (i = 0; i <
n; i++) {
629 dev_dbg(&client->
dev,
"0x%8.8x \"%s\" = %d, 0x%x\n",
637 static int smiapp_get_all_limits(
struct smiapp_sensor *sensor)
643 rval = smiapp_get_limits(sensor, &i, 1);
654 static int smiapp_get_limits_binning(
struct smiapp_sensor *sensor)
656 struct i2c_client *client = v4l2_get_subdevdata(&sensor->
src->sd);
657 static u32 const limits[] = {
666 static u32 const limits_replace[] = {
681 sensor->
limits[limits[i]] =
682 sensor->
limits[limits_replace[i]];
687 rval = smiapp_get_limits(sensor, limits,
ARRAY_SIZE(limits));
702 "replace limit 0x%8.8x \"%s\" = %d, 0x%x\n",
705 sensor->
limits[limits_replace[i]],
706 sensor->
limits[limits_replace[i]]);
708 sensor->
limits[limits_replace[
i]];
714 static int smiapp_get_mbus_formats(
struct smiapp_sensor *sensor)
716 struct i2c_client *client = v4l2_get_subdevdata(&sensor->
src->sd);
717 unsigned int type,
n;
718 unsigned int i, pixel_order;
726 dev_dbg(&client->
dev,
"data_format_model_type %d\n", type);
733 if (pixel_order >=
ARRAY_SIZE(pixel_order_str)) {
734 dev_dbg(&client->
dev,
"bad pixel order %d\n", pixel_order);
738 dev_dbg(&client->
dev,
"pixel order %d (%s)\n", pixel_order,
739 pixel_order_str[pixel_order]);
755 for (i = 0; i <
n; i++) {
764 dev_dbg(&client->
dev,
"bpp %d, compressed %d\n",
767 for (j = 0; j <
ARRAY_SIZE(smiapp_csi_data_formats); j++) {
769 &smiapp_csi_data_formats[
j];
792 dev_err(&client->
dev,
"no supported mbus code found\n");
796 smiapp_update_mbus_formats(sensor);
801 static void smiapp_update_blanking(
struct smiapp_sensor *sensor)
818 vblank->
val = vblank->
val;
833 hblank->
val = hblank->
val;
836 __smiapp_update_exposure_limits(sensor);
841 struct i2c_client *client = v4l2_get_subdevdata(&sensor->
src->sd);
842 unsigned int binning_mode;
848 dev_dbg(&client->
dev,
"csi format width: %d\n",
872 rval = smiapp_get_limits_binning(sensor);
876 rval = smiapp_pll_update(sensor);
881 smiapp_update_blanking(sensor);
886 dev_dbg(&client->
dev,
"real timeperframe\t100/%d\n",
887 sensor->
pll.vt_pix_clk_freq_hz /
891 + sensor->
vblank->val) / 100));
908 for (p = 0; p < np; p++) {
922 for (i = 0; i < 1000; i++) {
965 static int smiapp_change_cci_addr(
struct smiapp_sensor *sensor)
967 struct i2c_client *client = v4l2_get_subdevdata(&sensor->
src->sd);
997 static int smiapp_setup_flash_strobe(
struct smiapp_sensor *sensor)
1002 u32 strobe_adjustment;
1003 u32 strobe_width_high_rs;
1077 tmp = div_u64(1000000ULL * ((1 << 16) - 1) * ((1 << 8) - 1) -
1078 1000000 + 1, ext_freq);
1083 1000000 - 1), 1000000ULL);
1084 strobe_adjustment = (tmp + (1 << 16) - 1 - 1) / ((1 << 16) - 1);
1085 strobe_width_high_rs = (tmp + strobe_adjustment - 1) /
1089 strobe_setup->
mode);
1100 strobe_width_high_rs);
1129 struct i2c_client *client = v4l2_get_subdevdata(&sensor->
src->sd);
1135 dev_err(&client->
dev,
"failed to enable vana regulator\n");
1146 dev_dbg(&client->
dev,
"failed to set xclk\n");
1169 rval = smiapp_change_cci_addr(sensor);
1171 dev_err(&client->
dev,
"cci address change error\n");
1172 goto out_cci_addr_fail;
1179 dev_err(&client->
dev,
"software reset failed\n");
1180 goto out_cci_addr_fail;
1184 rval = smiapp_change_cci_addr(sensor);
1186 dev_err(&client->
dev,
"cci address change error\n");
1187 goto out_cci_addr_fail;
1194 dev_err(&client->
dev,
"compression mode set failed\n");
1195 goto out_cci_addr_fail;
1202 dev_err(&client->
dev,
"extclk frequency set failed\n");
1203 goto out_cci_addr_fail;
1209 dev_err(&client->
dev,
"csi lane mode set failed\n");
1210 goto out_cci_addr_fail;
1216 dev_err(&client->
dev,
"fast standby set failed\n");
1217 goto out_cci_addr_fail;
1223 dev_err(&client->
dev,
"csi signalling mode set failed\n");
1224 goto out_cci_addr_fail;
1235 dev_err(&client->
dev,
"post_poweron quirks failed\n");
1236 goto out_cci_addr_fail;
1246 goto out_cci_addr_fail;
1250 goto out_cci_addr_fail;
1253 rval = smiapp_update_mode(sensor);
1256 goto out_cci_addr_fail;
1314 ret = smiapp_power_on(sensor);
1318 smiapp_power_off(sensor);
1334 static int smiapp_start_streaming(
struct smiapp_sensor *sensor)
1336 struct i2c_client *client = v4l2_get_subdevdata(&sensor->
src->sd);
1347 rval = smiapp_pll_configure(sensor);
1439 rval = smiapp_setup_flash_strobe(sensor);
1446 dev_err(&client->
dev,
"pre_streamon quirks failed\n");
1459 static int smiapp_stop_streaming(
struct smiapp_sensor *sensor)
1461 struct i2c_client *client = v4l2_get_subdevdata(&sensor->
src->sd);
1472 dev_err(&client->
dev,
"post_streamoff quirks failed\n");
1493 rval = smiapp_start_streaming(sensor);
1497 rval = smiapp_stop_streaming(sensor);
1504 static int smiapp_enum_mbus_code(
struct v4l2_subdev *subdev,
1506 struct v4l2_subdev_mbus_code_enum *
code)
1508 struct i2c_client *client = v4l2_get_subdevdata(subdev);
1516 dev_err(&client->
dev,
"subdev %s, pad %d, index %d\n",
1517 subdev->
name, code->pad, code->index);
1528 for (i = 0; i <
ARRAY_SIZE(smiapp_csi_data_formats); i++) {
1532 if (idx == code->index) {
1533 code->code = smiapp_csi_data_formats[
i].
code;
1534 dev_err(&client->
dev,
"found index %d, i %d, code %x\n",
1535 code->index, i, code->code);
1558 static int __smiapp_get_format(
struct v4l2_subdev *subdev,
1565 fmt->
format = *v4l2_subdev_get_try_format(fh, fmt->
pad);
1574 fmt->
format.code = __smiapp_get_mbus_code(subdev, fmt->
pad);
1582 static int smiapp_get_format(
struct v4l2_subdev *subdev,
1590 rval = __smiapp_get_format(subdev, fh, fmt);
1596 static void smiapp_get_crop_compose(
struct v4l2_subdev *subdev,
1606 for (i = 0; i < subdev->entity.num_pads; i++)
1607 crops[i] = &ssd->
crop[i];
1612 for (i = 0; i < subdev->entity.num_pads; i++) {
1613 crops[
i] = v4l2_subdev_get_try_crop(fh, i);
1618 *comps = v4l2_subdev_get_try_compose(fh,
1626 static void smiapp_propagate(
struct v4l2_subdev *subdev,
1634 smiapp_get_crop_compose(subdev, fh, crops, &comp, which);
1641 if (ssd == sensor->
scaler) {
1647 }
else if (ssd == sensor->
binner) {
1667 for (i = 0; i <
ARRAY_SIZE(smiapp_csi_data_formats); i++) {
1669 && smiapp_csi_data_formats[
i].
code ==
code)
1670 return &smiapp_csi_data_formats[i];
1676 static int smiapp_set_format(
struct v4l2_subdev *subdev,
1692 int rval = __smiapp_get_format(subdev, fh, fmt);
1694 if (!rval && subdev == &sensor->
src->sd) {
1696 smiapp_validate_csi_data_format(sensor, code);
1707 fmt->
format.code = __smiapp_get_mbus_code(subdev, fmt->
pad);
1709 fmt->
format.height &= ~1;
1720 smiapp_get_crop_compose(subdev, fh, crops,
NULL, fmt->
which);
1728 smiapp_propagate(subdev, fh, fmt->
which,
1740 #define SCALING_GOODNESS 100000
1741 #define SCALING_GOODNESS_EXTREME 100000000
1742 static int scaling_goodness(
struct v4l2_subdev *subdev,
int w,
int ask_w,
1746 struct i2c_client *client = v4l2_get_subdevdata(subdev);
1768 val -=
abs(w - ask_w);
1769 val -=
abs(h - ask_h);
1774 dev_dbg(&client->
dev,
"w %d ask_w %d h %d ask_h %d goodness %d\n",
1775 w, ask_h, h, ask_h, val);
1780 static void smiapp_set_compose_binner(
struct v4l2_subdev *subdev,
1782 struct v4l2_subdev_selection *
sel,
1788 unsigned int binh = 1, binv = 1;
1789 unsigned int best = scaling_goodness(
1795 int this = scaling_goodness(
1802 sel->r.height, sel->flags);
1828 static void smiapp_set_compose_scaler(
struct v4l2_subdev *subdev,
1830 struct v4l2_subdev_selection *sel,
1834 struct i2c_client *client = v4l2_get_subdevdata(subdev);
1844 sel->r.width =
min_t(
unsigned int, sel->r.width,
1846 sel->r.height =
min_t(
unsigned int, sel->r.height,
1864 dev_dbg(&client->
dev,
"scaling: a %d b %d max_m %d\n", a, b, max_m);
1866 min =
min(max_m,
min(a, b));
1867 max =
min(max_m,
max(a, b));
1876 try[ntry] = min + 1;
1879 try[ntry] = max + 1;
1884 for (i = 0; i < ntry; i++) {
1885 int this = scaling_goodness(
1895 dev_dbg(&client->
dev,
"trying factor %d (%d)\n",
try[i], i);
1907 this = scaling_goodness(
1914 * sensor->
limits[SMIAPP_LIMIT_SCALER_N_MIN],
1944 static int smiapp_set_compose(
struct v4l2_subdev *subdev,
1946 struct v4l2_subdev_selection *sel)
1952 smiapp_get_crop_compose(subdev, fh, crops, &comp, sel->which);
1957 if (ssd == sensor->
binner)
1958 smiapp_set_compose_binner(subdev, fh, sel, crops, comp);
1960 smiapp_set_compose_scaler(subdev, fh, sel, crops, comp);
1963 smiapp_propagate(subdev, fh, sel->which,
1967 return smiapp_update_mode(sensor);
1972 static int __smiapp_sel_supported(
struct v4l2_subdev *subdev,
1973 struct v4l2_subdev_selection *sel)
1979 switch (sel->target) {
1985 if (ssd == sensor->
src
1988 if (ssd == sensor->
scaler
1998 if (ssd == sensor->
binner)
2000 if (ssd == sensor->
scaler
2010 static int smiapp_set_crop(
struct v4l2_subdev *subdev,
2012 struct v4l2_subdev_selection *sel)
2019 smiapp_get_crop_compose(subdev, fh, crops,
NULL, sel->which);
2030 _r.width = v4l2_subdev_get_try_format(fh, sel->pad)
2032 _r.height = v4l2_subdev_get_try_format(fh, sel->pad)
2037 v4l2_subdev_get_try_compose(
2047 sel->r.width =
min(sel->r.width, src_size->
width);
2048 sel->r.height =
min(sel->r.height, src_size->
height);
2050 sel->r.left =
min(sel->r.left, src_size->
width - sel->r.width);
2051 sel->r.top =
min(sel->r.top, src_size->
height - sel->r.height);
2053 *crops[sel->pad] = sel->r;
2056 smiapp_propagate(subdev, fh, sel->which,
2062 static int __smiapp_get_selection(
struct v4l2_subdev *subdev,
2064 struct v4l2_subdev_selection *sel)
2072 ret = __smiapp_sel_supported(subdev, sel);
2076 smiapp_get_crop_compose(subdev, fh, crops, &comp, sel->which);
2081 struct v4l2_mbus_framefmt *fmt =
2082 v4l2_subdev_get_try_format(fh, ssd->
sink_pad);
2086 sink_fmt.width = fmt->width;
2087 sink_fmt.height = fmt->height;
2090 switch (sel->target) {
2097 }
else if (sel->pad == ssd->
sink_pad) {
2105 sel->r = *crops[sel->pad];
2115 static int smiapp_get_selection(
struct v4l2_subdev *subdev,
2117 struct v4l2_subdev_selection *sel)
2123 rval = __smiapp_get_selection(subdev, fh, sel);
2128 static int smiapp_set_selection(
struct v4l2_subdev *subdev,
2130 struct v4l2_subdev_selection *sel)
2135 ret = __smiapp_sel_supported(subdev, sel);
2141 sel->r.left =
max(0, sel->r.left & ~1);
2142 sel->r.top =
max(0, sel->r.top & ~1);
2146 sel->r.width =
max_t(
unsigned int,
2149 sel->r.height =
max_t(
unsigned int,
2153 switch (sel->target) {
2155 ret = smiapp_set_crop(subdev, fh, sel);
2158 ret = smiapp_set_compose(subdev, fh, sel);
2168 static int smiapp_get_skip_frames(
struct v4l2_subdev *subdev,
u32 *frames)
2185 struct i2c_client *client = v4l2_get_subdevdata(subdev);
2195 if (smiapp_set_power(subdev, 1) < 0)
2197 if (smiapp_read_nvm(sensor, sensor->
nvm)) {
2201 smiapp_set_power(subdev, 0);
2233 static int smiapp_identify_module(
struct v4l2_subdev *subdev)
2236 struct i2c_client *client = v4l2_get_subdevdata(subdev);
2296 dev_err(&client->
dev,
"sensor detection failed\n");
2300 dev_dbg(&client->
dev,
"module 0x%2.2x-0x%4.4x\n",
2304 "module revision 0x%2.2x-0x%2.2x date %2.2d-%2.2d-%2.2d\n",
2308 dev_dbg(&client->
dev,
"sensor 0x%2.2x-0x%4.4x\n",
2312 "sensor revision 0x%2.2x firmware version 0x%2.2x\n",
2315 dev_dbg(&client->
dev,
"smia version %2.2d smiapp version %2.2d\n",
2329 for (i = 0; i <
ARRAY_SIZE(smiapp_module_idents); i++) {
2335 if (smiapp_module_idents[i].
flags
2346 minfo->
name = smiapp_module_idents[
i].
name;
2353 "no quirks for this module; let's hope it's fully compliant\n");
2355 dev_dbg(&client->
dev,
"the sensor is called %s, ident %2.2x%4.4x%2.2x\n",
2368 static int smiapp_registered(
struct v4l2_subdev *subdev)
2371 struct i2c_client *client = v4l2_get_subdevdata(subdev);
2378 if (IS_ERR(sensor->
vana)) {
2379 dev_err(&client->
dev,
"could not get regulator for vana\n");
2386 if (IS_ERR(sensor->
ext_clk)) {
2387 dev_err(&client->
dev,
"could not get clock %s\n",
2396 "unable to set clock %s freq to %u\n",
2405 "SMIA++ xshutdown") != 0) {
2407 "unable to acquire reset gpio %d\n",
2413 rval = smiapp_power_on(sensor);
2416 goto out_smiapp_power_on;
2419 rval = smiapp_identify_module(subdev);
2425 rval = smiapp_get_all_limits(sensor);
2449 rval = smiapp_get_mbus_formats(sensor);
2486 dev_err(&client->
dev,
"sysfs ident entry creation failed\n");
2497 dev_err(&client->
dev,
"nvm buf allocation failed\n");
2499 goto out_ident_release;
2503 dev_err(&client->
dev,
"sysfs nvm entry failed\n");
2505 goto out_ident_release;
2511 dev_err(&client->
dev,
"limits quirks failed\n");
2512 goto out_nvm_release;
2546 }
const __this[] = {
2547 { sensor->
scaler,
"scaler", },
2548 { sensor->
binner,
"binner", },
2550 }, *_this = &__this[
i];
2556 if (
this != sensor->
src)
2569 sizeof(this->sd.name),
"%s %s",
2570 sensor->
minfo.name, _this->name);
2585 this->
sd.entity.ops = &smiapp_entity_ops;
2593 this->
sd.internal_ops = &smiapp_internal_ops;
2595 v4l2_set_subdevdata(&this->
sd, client);
2598 this->npads, this->pads, 0);
2601 "media_entity_init failed\n");
2602 goto out_nvm_release;
2613 "media_entity_create_link failed\n");
2614 goto out_nvm_release;
2621 "v4l2_device_register_subdev failed\n");
2622 goto out_nvm_release;
2633 smiapp_read_frame_fmt(sensor);
2634 rval = smiapp_init_controls(sensor);
2636 goto out_nvm_release;
2638 rval = smiapp_update_mode(sensor);
2640 dev_err(&client->
dev,
"update mode failed\n");
2641 goto out_nvm_release;
2651 goto out_nvm_release;
2653 smiapp_power_off(sensor);
2664 smiapp_power_off(sensor);
2666 out_smiapp_power_on:
2678 smiapp_csi_data_formats[smiapp_pixel_order(sensor)].
code;
2683 for (i = 0; i < ssd->
npads; i++) {
2684 struct v4l2_mbus_framefmt *try_fmt =
2685 v4l2_subdev_get_try_format(fh, i);
2686 struct v4l2_rect *try_crop = v4l2_subdev_get_try_crop(fh, i);
2691 try_fmt->code = mbus_code;
2695 try_crop->
width = try_fmt->width;
2696 try_crop->
height = try_fmt->height;
2701 try_comp = v4l2_subdev_get_try_compose(fh, i);
2702 *try_comp = *try_crop;
2707 return smiapp_set_power(sd, 1);
2712 return smiapp_set_power(sd, 0);
2716 .s_stream = smiapp_set_stream,
2720 .s_power = smiapp_set_power,
2724 .enum_mbus_code = smiapp_enum_mbus_code,
2725 .get_fmt = smiapp_get_format,
2726 .set_fmt = smiapp_set_format,
2727 .get_selection = smiapp_get_selection,
2728 .set_selection = smiapp_set_selection,
2732 .g_skip_frames = smiapp_get_skip_frames,
2736 .core = &smiapp_core_ops,
2737 .video = &smiapp_video_ops,
2738 .pad = &smiapp_pad_ops,
2739 .sensor = &smiapp_sensor_ops,
2743 .link_validate = v4l2_subdev_link_validate,
2747 .registered = smiapp_registered,
2748 .open = smiapp_open,
2749 .close = smiapp_close,
2753 .open = smiapp_open,
2754 .close = smiapp_close,
2766 struct v4l2_subdev *subdev = i2c_get_clientdata(client);
2776 smiapp_stop_streaming(sensor);
2780 smiapp_power_off(sensor);
2791 struct v4l2_subdev *subdev = i2c_get_clientdata(client);
2798 rval = smiapp_power_on(sensor);
2803 rval = smiapp_start_streaming(sensor);
2810 #define smiapp_suspend NULL
2811 #define smiapp_resume NULL
2815 static int smiapp_probe(
struct i2c_client *client,
2820 if (client->
dev.platform_data ==
NULL)
2833 sensor->
src->sd.internal_ops = &smiapp_internal_src_ops;
2835 sensor->
src->sensor = sensor;
2839 sensor->
src->pads, 0);
2844 struct v4l2_subdev *subdev = i2c_get_clientdata(client);
2862 for (i = 0; i < sensor->
ssds_used; i++) {
2866 smiapp_free_controls(sensor);
2879 static const struct dev_pm_ops smiapp_pm_ops = {
2884 static struct i2c_driver smiapp_i2c_driver = {
2887 .pm = &smiapp_pm_ops,
2889 .probe = smiapp_probe,
2891 .id_table = smiapp_id_table,